fix issue handling $F7E NAC; implement $F7F NAC support;

pull/55/head
Bryan Biedenkapp 2 years ago
parent ae3a03b521
commit a7f9cb93be

@ -13,6 +13,7 @@
* *
*/ */
#include "Defines.h" #include "Defines.h"
#include "common/Utils.h"
#include "p25/P25Defines.h" #include "p25/P25Defines.h"
#include "p25/NID.h" #include "p25/NID.h"
#include "p25/P25Utils.h" #include "p25/P25Utils.h"
@ -86,6 +87,12 @@ bool NID::decode(const uint8_t* data)
uint8_t nid[P25_NID_LENGTH_BYTES]; uint8_t nid[P25_NID_LENGTH_BYTES];
P25Utils::decode(data, nid, 48U, 114U); 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); uint32_t errs = P25Utils::compare(nid, m_rxTx[P25_DUID_LDU1], P25_NID_LENGTH_BYTES);
if (errs < MAX_NID_ERRS) { if (errs < MAX_NID_ERRS) {
m_duid = P25_DUID_LDU1; m_duid = P25_DUID_LDU1;
@ -136,7 +143,7 @@ bool NID::decode(const uint8_t* data)
/// </summary> /// </summary>
/// <param name="data"></param> /// <param name="data"></param>
/// <param name="duid"></param> /// <param name="duid"></param>
void NID::encode(uint8_t* data, uint8_t duid) const void NID::encode(uint8_t* data, uint8_t duid)
{ {
assert(data != nullptr); assert(data != nullptr);
@ -156,6 +163,11 @@ void NID::encode(uint8_t* data, uint8_t duid) const
} }
} }
else { else {
// handle digital "squelch" NAC
if (m_nac == P25_NAC_DIGITAL_SQ) {
createRxTxNID(P25_DEFAULT_NAC);
}
switch (duid) { switch (duid) {
case P25_DUID_HDU: case P25_DUID_HDU:
case P25_DUID_TDU: case P25_DUID_TDU:

@ -34,7 +34,7 @@ namespace p25
/// <summary>Decodes P25 network identifier data.</summary> /// <summary>Decodes P25 network identifier data.</summary>
bool decode(const uint8_t* data); bool decode(const uint8_t* data);
/// <summary>Encodes P25 network identifier data.</summary> /// <summary>Encodes P25 network identifier data.</summary>
void encode(uint8_t* data, uint8_t duid) const; void encode(uint8_t* data, uint8_t duid);
/// <summary>Helper to configure a separate Tx NAC.</summary> /// <summary>Helper to configure a separate Tx NAC.</summary>
void setTxNAC(uint32_t nac); void setTxNAC(uint32_t nac);

@ -186,6 +186,10 @@ namespace p25
const uint32_t P25_SID_STD_DEFAULT = 0x001U; 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_FNE = 0xFFFFFCU;
const uint32_t P25_WUID_REG = 0xFFFFFEU; const uint32_t P25_WUID_REG = 0xFFFFFEU;
const uint32_t P25_WUID_ALL = 0xFFFFFFU; const uint32_t P25_WUID_ALL = 0xFFFFFFU;

@ -33,8 +33,8 @@ namespace p25
if (nac < 0U) { // clamp to $000 if (nac < 0U) { // clamp to $000
nac = 0U; nac = 0U;
} }
if (nac > 0xF7DU) { // clamp to $F7D if (nac > 0xF7FU) { // clamp to $F7F
nac = 0xF7DU; nac = 0xF7FU;
} }
return nac; return nac;

@ -273,10 +273,10 @@ bool Host::readParams()
m_dmrNetId = (uint32_t)::strtoul(rfssConfig["dmrNetId"].as<std::string>("1").c_str(), NULL, 16); m_dmrNetId = (uint32_t)::strtoul(rfssConfig["dmrNetId"].as<std::string>("1").c_str(), NULL, 16);
m_dmrNetId = dmr::DMRUtils::netId(m_dmrNetId, dmr::SITE_MODEL_SMALL); m_dmrNetId = dmr::DMRUtils::netId(m_dmrNetId, dmr::SITE_MODEL_SMALL);
m_p25NAC = (uint32_t)::strtoul(rfssConfig["nac"].as<std::string>("293").c_str(), NULL, 16); m_p25NAC = (uint32_t)::strtoul(rfssConfig["nac"].as<std::string>("F7E").c_str(), NULL, 16);
m_p25NAC = p25::P25Utils::nac(m_p25NAC); m_p25NAC = p25::P25Utils::nac(m_p25NAC);
uint32_t p25TxNAC = (uint32_t)::strtoul(rfssConfig["txNAC"].as<std::string>("F7E").c_str(), NULL, 16); uint32_t p25TxNAC = (uint32_t)::strtoul(rfssConfig["txNAC"].as<std::string>("293").c_str(), NULL, 16);
if (p25TxNAC == m_p25NAC) { if (p25TxNAC == m_p25NAC) {
LogWarning(LOG_HOST, "Only use txNAC when split NAC operations are needed. nac and txNAC should not be the same!"); 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(" DMR Network Id: $%05X", m_dmrNetId);
LogInfo(" P25 NAC: $%03X", m_p25NAC); 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); LogInfo(" P25 Tx NAC: $%03X", p25TxNAC);
} }
@ -630,6 +630,9 @@ bool Host::createModem()
p25PostBWAdj, nxdnPostBWAdj, adfGainMode, afcEnable, afcKI, afcKP, afcRange); p25PostBWAdj, nxdnPostBWAdj, adfGainMode, afcEnable, afcKI, afcKP, afcRange);
m_modem->setSoftPot(rxCoarse, rxFine, txCoarse, txFine, rssiCoarse, rssiFine); m_modem->setSoftPot(rxCoarse, rxFine, txCoarse, txFine, rssiCoarse, rssiFine);
m_modem->setDMRColorCode(m_dmrColorCode); m_modem->setDMRColorCode(m_dmrColorCode);
if (m_p25NAC == p25::P25_NAC_REUSE_RX_NAC)
m_modem->setP25NAC(p25::P25_NAC_DIGITAL_SQ);
else
m_modem->setP25NAC(m_p25NAC); m_modem->setP25NAC(m_p25NAC);
} }

Loading…
Cancel
Save

Powered by TurnKey Linux.