From a7f9cb93be4fdf5ef39de0c8860d5da05529da8a Mon Sep 17 00:00:00 2001 From: Bryan Biedenkapp Date: Mon, 3 Jun 2024 11:36:22 -0400 Subject: [PATCH] fix issue handling $F7E NAC; implement $F7F NAC support; --- src/common/p25/NID.cpp | 14 +++++++++++++- src/common/p25/NID.h | 2 +- src/common/p25/P25Defines.h | 4 ++++ src/common/p25/P25Utils.h | 4 ++-- src/host/Host.Config.cpp | 11 +++++++---- 5 files changed, 27 insertions(+), 8 deletions(-) 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) {