diff --git a/src/common/p25/NID.cpp b/src/common/p25/NID.cpp
index 4090c57f..82a7c65b 100644
--- a/src/common/p25/NID.cpp
+++ b/src/common/p25/NID.cpp
@@ -13,6 +13,7 @@
*
*/
#include "Defines.h"
+#include "common/Utils.h"
#include "p25/P25Defines.h"
#include "p25/NID.h"
#include "p25/P25Utils.h"
@@ -86,6 +87,12 @@ bool NID::decode(const uint8_t* data)
uint8_t nid[P25_NID_LENGTH_BYTES];
P25Utils::decode(data, nid, 48U, 114U);
+ // handle digital "squelch" NAC
+ if ((m_nac == P25_NAC_DIGITAL_SQ) || (m_nac == P25_NAC_REUSE_RX_NAC)) {
+ uint32_t nac = ((nid[0U] << 4) + (nid[1U] >> 4)) & 0xFFFU;
+ createRxTxNID(nac); // bryanb: I hate this and it'll be slow
+ }
+
uint32_t errs = P25Utils::compare(nid, m_rxTx[P25_DUID_LDU1], P25_NID_LENGTH_BYTES);
if (errs < MAX_NID_ERRS) {
m_duid = P25_DUID_LDU1;
@@ -136,7 +143,7 @@ bool NID::decode(const uint8_t* data)
///
///
///
-void NID::encode(uint8_t* data, uint8_t duid) const
+void NID::encode(uint8_t* data, uint8_t duid)
{
assert(data != nullptr);
@@ -156,6 +163,11 @@ void NID::encode(uint8_t* data, uint8_t duid) const
}
}
else {
+ // handle digital "squelch" NAC
+ if (m_nac == P25_NAC_DIGITAL_SQ) {
+ createRxTxNID(P25_DEFAULT_NAC);
+ }
+
switch (duid) {
case P25_DUID_HDU:
case P25_DUID_TDU:
diff --git a/src/common/p25/NID.h b/src/common/p25/NID.h
index 6beda39f..6c1fd335 100644
--- a/src/common/p25/NID.h
+++ b/src/common/p25/NID.h
@@ -34,7 +34,7 @@ namespace p25
/// Decodes P25 network identifier data.
bool decode(const uint8_t* data);
/// Encodes P25 network identifier data.
- void encode(uint8_t* data, uint8_t duid) const;
+ void encode(uint8_t* data, uint8_t duid);
/// Helper to configure a separate Tx NAC.
void setTxNAC(uint32_t nac);
diff --git a/src/common/p25/P25Defines.h b/src/common/p25/P25Defines.h
index a7ba827f..b2aec8ad 100644
--- a/src/common/p25/P25Defines.h
+++ b/src/common/p25/P25Defines.h
@@ -186,6 +186,10 @@ namespace p25
const uint32_t P25_SID_STD_DEFAULT = 0x001U;
+ const uint32_t P25_NAC_DIGITAL_SQ = 0xF7EU;
+ const uint32_t P25_NAC_REUSE_RX_NAC = 0xF7FU;
+ const uint32_t P25_DEFAULT_NAC = 0x293U;
+
const uint32_t P25_WUID_FNE = 0xFFFFFCU;
const uint32_t P25_WUID_REG = 0xFFFFFEU;
const uint32_t P25_WUID_ALL = 0xFFFFFFU;
diff --git a/src/common/p25/P25Utils.h b/src/common/p25/P25Utils.h
index 7e574f51..11a906cb 100644
--- a/src/common/p25/P25Utils.h
+++ b/src/common/p25/P25Utils.h
@@ -33,8 +33,8 @@ namespace p25
if (nac < 0U) { // clamp to $000
nac = 0U;
}
- if (nac > 0xF7DU) { // clamp to $F7D
- nac = 0xF7DU;
+ if (nac > 0xF7FU) { // clamp to $F7F
+ nac = 0xF7FU;
}
return nac;
diff --git a/src/host/Host.Config.cpp b/src/host/Host.Config.cpp
index b0755227..aaae172f 100644
--- a/src/host/Host.Config.cpp
+++ b/src/host/Host.Config.cpp
@@ -273,10 +273,10 @@ bool Host::readParams()
m_dmrNetId = (uint32_t)::strtoul(rfssConfig["dmrNetId"].as("1").c_str(), NULL, 16);
m_dmrNetId = dmr::DMRUtils::netId(m_dmrNetId, dmr::SITE_MODEL_SMALL);
- m_p25NAC = (uint32_t)::strtoul(rfssConfig["nac"].as("293").c_str(), NULL, 16);
+ m_p25NAC = (uint32_t)::strtoul(rfssConfig["nac"].as("F7E").c_str(), NULL, 16);
m_p25NAC = p25::P25Utils::nac(m_p25NAC);
- uint32_t p25TxNAC = (uint32_t)::strtoul(rfssConfig["txNAC"].as("F7E").c_str(), NULL, 16);
+ uint32_t p25TxNAC = (uint32_t)::strtoul(rfssConfig["txNAC"].as("293").c_str(), NULL, 16);
if (p25TxNAC == m_p25NAC) {
LogWarning(LOG_HOST, "Only use txNAC when split NAC operations are needed. nac and txNAC should not be the same!");
}
@@ -318,7 +318,7 @@ bool Host::readParams()
LogInfo(" DMR Network Id: $%05X", m_dmrNetId);
LogInfo(" P25 NAC: $%03X", m_p25NAC);
- if (p25TxNAC != 0xF7EU && p25TxNAC != m_p25NAC) {
+ if (p25TxNAC != p25::P25_NAC_DIGITAL_SQ && p25TxNAC != m_p25NAC) {
LogInfo(" P25 Tx NAC: $%03X", p25TxNAC);
}
@@ -630,7 +630,10 @@ bool Host::createModem()
p25PostBWAdj, nxdnPostBWAdj, adfGainMode, afcEnable, afcKI, afcKP, afcRange);
m_modem->setSoftPot(rxCoarse, rxFine, txCoarse, txFine, rssiCoarse, rssiFine);
m_modem->setDMRColorCode(m_dmrColorCode);
- m_modem->setP25NAC(m_p25NAC);
+ if (m_p25NAC == p25::P25_NAC_REUSE_RX_NAC)
+ m_modem->setP25NAC(p25::P25_NAC_DIGITAL_SQ);
+ else
+ m_modem->setP25NAC(m_p25NAC);
}
if (m_modemRemote) {