reorganize configuration file slightly (nothing to panic about!); rename p25SysId to sysId (it is used by P25 & NXDN); add constants for NXDN location categories; properly calculate the NXDN location ID from the site ID and system ID (category is fixed to Local); fix issue where RCCH was not properly populating the message type opcode value [this fixes an outstanding issue where DVM was not presenting a valid NXDN CC stream];

3.0-rcon_maint
Bryan Biedenkapp 3 years ago
parent cb259cdc73
commit 1b6ba3e3aa

@ -315,8 +315,6 @@ system:
channelId: 2
# Channel Number (used to calculate actual host frequency based on the identity table).
channelNo: 1
# DMR network ID.
dmrNetId: 1
#
# Voice Channels
@ -339,15 +337,19 @@ system:
# txNAC: 293
# NXDN Random Access Number.
ran: 1
# P25 Patch Super Group.
pSuperGroup: FFFF
# DMR network ID.
dmrNetId: 1
# P25 Network ID (WACN).
netId: BB800
# P25 System ID.
# P25/NXDN System ID.
sysId: 001
# P25 RFSS (RF Sub-System) ID.
rfssId: 1
# P25 Site ID.
# DMR/P25/NXDN Site ID.
siteId: 1
#

@ -171,7 +171,7 @@ void Control::setOptions(yaml::Node& conf, bool controlPermitTG, const std::vect
// either MAX_DMR_VOICE_ERRORS or 0 will disable the threshold logic
if (silenceThreshold == 0) {
LogWarning(LOG_P25, "Silence threshold set to zero, defaulting to %u", dmr::MAX_DMR_VOICE_ERRORS);
LogWarning(LOG_DMR, "Silence threshold set to zero, defaulting to %u", dmr::MAX_DMR_VOICE_ERRORS);
silenceThreshold = dmr::MAX_DMR_VOICE_ERRORS;
}

@ -128,12 +128,12 @@ Host::Host(const std::string& confFile) :
m_nxdnCtrlChannel(false),
m_nxdnCtrlBroadcast(false),
m_siteId(1U),
m_sysId(1U),
m_dmrNetId(1U),
m_dmrColorCode(1U),
m_p25NAC(0x293U),
m_p25PatchSuperGroup(0xFFFFU),
m_p25NetId(0xBB800U),
m_p25SysId(1U),
m_p25RfssId(1U),
m_nxdnRAN(1U),
m_dmrQueueSizeBytes(3960U), // 24 frames
@ -507,7 +507,7 @@ int Host::run()
p25 = std::unique_ptr<p25::Control>(new p25::Control(m_authoritative, m_p25NAC, callHang, m_p25QueueSizeBytes, m_modem, m_network, m_timeout, m_rfTalkgroupHang,
m_duplex, m_ridLookup, m_tidLookup, m_idenTable, rssi, p25DumpDataPacket, p25RepeatDataPacket,
p25DumpTsbkData, p25Debug, p25Verbose));
p25->setOptions(m_conf, m_controlPermitTG, m_cwCallsign, m_voiceChNo, m_voiceChData, m_p25PatchSuperGroup, m_p25NetId, m_p25SysId, m_p25RfssId,
p25->setOptions(m_conf, m_controlPermitTG, m_cwCallsign, m_voiceChNo, m_voiceChData, m_p25PatchSuperGroup, m_p25NetId, m_sysId, m_p25RfssId,
m_siteId, m_channelId, m_channelNo, true);
if (p25CtrlChannel) {
@ -572,7 +572,7 @@ int Host::run()
nxdn = std::unique_ptr<nxdn::Control>(new nxdn::Control(m_authoritative, m_nxdnRAN, callHang, m_nxdnQueueSizeBytes, m_timeout, m_rfTalkgroupHang,
m_modem, m_network, m_duplex, m_ridLookup, m_tidLookup, m_idenTable, rssi,
nxdnDumpRcchData, nxdnDebug, nxdnVerbose));
nxdn->setOptions(m_conf, m_controlPermitTG, m_cwCallsign, m_voiceChNo, m_voiceChData, m_siteId, m_channelId, m_channelNo, true);
nxdn->setOptions(m_conf, m_controlPermitTG, m_cwCallsign, m_voiceChNo, m_voiceChData, m_siteId, m_sysId, m_channelId, m_channelNo, true);
if (nxdnCtrlChannel) {
nxdn->setCCRunning(true);
@ -1888,8 +1888,8 @@ bool Host::readParams()
m_p25NetId = (uint32_t)::strtoul(rfssConfig["netId"].as<std::string>("BB800").c_str(), NULL, 16);
m_p25NetId = p25::P25Utils::netId(m_p25NetId);
m_p25SysId = (uint32_t)::strtoul(rfssConfig["sysId"].as<std::string>("001").c_str(), NULL, 16);
m_p25SysId = p25::P25Utils::sysId(m_p25SysId);
m_sysId = (uint32_t)::strtoul(rfssConfig["sysId"].as<std::string>("001").c_str(), NULL, 16);
m_sysId = p25::P25Utils::sysId(m_sysId);
m_p25RfssId = (uint8_t)::strtoul(rfssConfig["rfssId"].as<std::string>("1").c_str(), NULL, 16);
m_p25RfssId = p25::P25Utils::rfssId(m_p25RfssId);
@ -1910,6 +1910,7 @@ bool Host::readParams()
LogInfo(" Channel No.: $%04X", m_channelNo);
LogInfo(" Voice Channel No(s).: %s", strVoiceChNo.c_str());
LogInfo(" Site Id: $%02X", m_siteId);
LogInfo(" System Id: $%03X", m_sysId);
LogInfo(" DMR Color Code: %u", m_dmrColorCode);
LogInfo(" DMR Network Id: $%05X", m_dmrNetId);
LogInfo(" P25 NAC: $%03X", m_p25NAC);
@ -1918,12 +1919,10 @@ bool Host::readParams()
LogInfo(" P25 Tx NAC: $%03X", p25TxNAC);
}
LogInfo(" NXDN RAN: %u", m_nxdnRAN);
LogInfo(" P25 Patch Super Group: $%04X", m_p25PatchSuperGroup);
LogInfo(" P25 Network Id: $%05X", m_p25NetId);
LogInfo(" P25 System Id: $%03X", m_p25SysId);
LogInfo(" P25 RFSS Id: $%02X", m_p25RfssId);
LogInfo(" NXDN RAN: %u", m_nxdnRAN);
if (!m_authoritative) {
m_controlPermitTG = false;

@ -133,12 +133,12 @@ private:
bool m_nxdnCtrlBroadcast;
uint8_t m_siteId;
uint32_t m_sysId;
uint32_t m_dmrNetId;
uint32_t m_dmrColorCode;
uint32_t m_p25NAC;
uint32_t m_p25PatchSuperGroup;
uint32_t m_p25NetId;
uint32_t m_p25SysId;
uint8_t m_p25RfssId;
uint32_t m_nxdnRAN;

@ -208,12 +208,13 @@ void Control::reset()
/// <param name="cwCallsign"></param>
/// <param name="voiceChNo">Voice Channel Number list.</param>
/// <param name="voiceChData">Voice Channel data map.</param>
/// <param name="locId">NXDN Location ID.</param>
/// <param name="siteId">NXDN Site Code.</param>
/// <param name="sysId">NXDN System Code.</param>
/// <param name="channelId">Channel ID.</param>
/// <param name="channelNo">Channel Number.</param>
/// <param name="printOptions"></param>
void Control::setOptions(yaml::Node& conf, bool controlPermitTG, const std::string cwCallsign, const std::vector<uint32_t> voiceChNo,
const std::unordered_map<uint32_t, lookups::VoiceChData> voiceChData, uint16_t locId,
const std::unordered_map<uint32_t, lookups::VoiceChData> voiceChData, uint16_t siteId, uint32_t sysId,
uint8_t channelId, uint32_t channelNo, bool printOptions)
{
yaml::Node systemConf = conf["system"];
@ -243,7 +244,7 @@ void Control::setOptions(yaml::Node& conf, bool controlPermitTG, const std::stri
// either MAX_NXDN_VOICE_ERRORS or 0 will disable the threshold logic
if (m_voice->m_silenceThreshold == 0) {
LogWarning(LOG_P25, "Silence threshold set to zero, defaulting to %u", nxdn::MAX_NXDN_VOICE_ERRORS);
LogWarning(LOG_NXDN, "Silence threshold set to zero, defaulting to %u", nxdn::MAX_NXDN_VOICE_ERRORS);
m_voice->m_silenceThreshold = nxdn::MAX_NXDN_VOICE_ERRORS;
}
@ -259,6 +260,11 @@ void Control::setOptions(yaml::Node& conf, bool controlPermitTG, const std::stri
}
}
// calculate the NXDN location ID
uint32_t locId = NXDN_LOC_CAT_LOCAL; // DVM is currently fixed to "local" category
locId = (locId << 17) + sysId;
locId = (locId << 5) + (siteId & 0x1FU);
m_siteData = SiteData(locId, channelId, channelNo, serviceClass, false);
m_siteData.setCallsign(cwCallsign);

@ -84,7 +84,7 @@ namespace nxdn
/// <summary>Helper to set NXDN configuration options.</summary>
void setOptions(yaml::Node& conf, bool controlPermitTG, const std::string cwCallsign, const std::vector<uint32_t> voiceChNo,
const std::unordered_map<uint32_t, lookups::VoiceChData> voiceChData, uint16_t locId,
const std::unordered_map<uint32_t, lookups::VoiceChData> voiceChData, uint16_t siteId, uint32_t sysId,
uint8_t channelId, uint32_t channelNo, bool printOptions);
/// <summary>Gets a flag indicating whether the NXDN control channel is running.</summary>

@ -188,6 +188,10 @@ namespace nxdn
const uint8_t DATA_RSP_CLASS_ACK_S = 0x01U;
const uint8_t DATA_RSP_CLASS_NACK = 0x03U;
const uint8_t NXDN_LOC_CAT_GLOBAL = 0x00U;
const uint8_t NXDN_LOC_CAT_LOCAL = 0x01U;
const uint8_t NXDN_LOC_CAT_REGIONAL = 0x02U;
const uint8_t NXDN_CAUSE_RSRC_NOT_AVAIL_NETWORK = 0x51U;
const uint8_t NXDN_CAUSE_RSRC_NOT_AVAIL_TEMP = 0x52U;
const uint8_t NXDN_CAUSE_RSRC_NOT_AVAIL_QUEUED = 0x53U;

@ -71,8 +71,8 @@ namespace nxdn
m_requireReg(requireReq),
m_netActive(false)
{
if (m_locId > 0xFFFFFU)
m_locId = 0xFFFFFU;
if (m_locId > 0xFFFFFFU)
m_locId = 0xFFFFFFU;
// channel id clamping
if (channelId > 15U)
@ -110,8 +110,8 @@ namespace nxdn
/// <param name="serviceClass">Service class.</param>
void setAdjSite(uint32_t locId, uint8_t rfssId, uint8_t siteId, uint8_t channelId, uint32_t channelNo, uint8_t serviceClass)
{
if (m_locId > 0xFFFFFU)
m_locId = 0xFFFFFU;
if (m_locId > 0xFFFFFFU)
m_locId = 0xFFFFFFU;
// channel id clamping
if (channelId > 15U)

@ -159,13 +159,15 @@ void RCCH::encode(uint8_t* data, const uint8_t* rcch, uint32_t length, uint32_t
assert(data != nullptr);
assert(rcch != nullptr);
data[0U] = m_messageType & 0x3FU; // Message Type
for (uint32_t i = 0U; i < length; i++, offset++) {
bool b = READ_BIT(rcch, i);
WRITE_BIT(data, offset, b);
}
if (data[0U] == 0x00U) {
data[0U] = m_messageType & 0x3FU; // Message Type
}
if (m_verbose) {
Utils::dump(2U, "Encoded RCCH Data", data, NXDN_RCCH_LC_LENGTH_BYTES);
}

Loading…
Cancel
Save

Powered by TurnKey Linux.