From f5cb11b467e23ef5bc5953c2a0393ba4c971cef9 Mon Sep 17 00:00:00 2001 From: Bryan Biedenkapp Date: Sat, 12 Mar 2022 14:35:51 -0500 Subject: [PATCH] correct issue where TDULC for Call Termination was incorrectly being sent while in simplex mode (should fix issue #3); add configuration option called "simplexSameFrequency" to control whether simplex operation takes place on a split frequency pair or a single frequency; fix issue where P25 nulls may be incorrectly transmitted in simplex mode; --- config.example.yml | 1 + host/Host.cpp | 25 +++++++++++++------------ p25/Control.cpp | 2 +- p25/TrunkPacket.cpp | 4 ++++ 4 files changed, 19 insertions(+), 13 deletions(-) diff --git a/config.example.yml b/config.example.yml index e369733d..db039eae 100644 --- a/config.example.yml +++ b/config.example.yml @@ -78,6 +78,7 @@ system: identity: ABCD123 timeout: 180 duplex: true + simplexSameFrequency: false modeHang: 10 # rfModeHang: 10 # netModeHang: 10 diff --git a/host/Host.cpp b/host/Host.cpp index c072f424..ba5f01c5 100644 --- a/host/Host.cpp +++ b/host/Host.cpp @@ -1306,6 +1306,7 @@ bool Host::readParams() yaml::Node systemConf = m_conf["system"]; m_duplex = systemConf["duplex"].as(true); + bool simplexSameFreq = systemConf["simplexSameFrequency"].as(false); m_timeout = systemConf["timeout"].as(120U); m_rfModeHang = systemConf["rfModeHang"].as(10U); @@ -1332,6 +1333,9 @@ bool Host::readParams() LogInfo(" P25: %s", m_p25Enabled ? "enabled" : "disabled"); LogInfo(" Duplex: %s", m_duplex ? "yes" : "no"); if (!udpMasterMode) { + if (!m_duplex) { + LogInfo(" Simplex Same Frequency: %s", simplexSameFreq ? "yes" : "no"); + } LogInfo(" Timeout: %us", m_timeout); LogInfo(" RF Mode Hang: %us", m_rfModeHang); LogInfo(" RF Talkgroup Hang: %us", m_rfTalkgroupHang); @@ -1391,21 +1395,18 @@ bool Host::readParams() m_channelNo = 4095U; } - if (m_duplex) { - if (entry.txOffsetMhz() == 0U) { - ::LogError(LOG_HOST, "Channel Id %u has an invalid Tx offset.", m_channelId); - return false; - } + if (entry.txOffsetMhz() == 0U) { + ::LogError(LOG_HOST, "Channel Id %u has an invalid Tx offset.", m_channelId); + return false; + } - uint32_t calcSpace = (uint32_t)(entry.chSpaceKhz() / 0.125); - float calcTxOffset = entry.txOffsetMhz() * 1000000; + uint32_t calcSpace = (uint32_t)(entry.chSpaceKhz() / 0.125); + float calcTxOffset = entry.txOffsetMhz() * 1000000; - m_rxFrequency = (uint32_t)((entry.baseFrequency() + ((calcSpace * 125) * m_channelNo)) + calcTxOffset); - m_txFrequency = (uint32_t)((entry.baseFrequency() + ((calcSpace * 125) * m_channelNo))); - } - else { - uint32_t calcSpace = (uint32_t)(entry.chSpaceKhz() / 0.125); + m_rxFrequency = (uint32_t)((entry.baseFrequency() + ((calcSpace * 125) * m_channelNo)) + calcTxOffset); + m_txFrequency = (uint32_t)((entry.baseFrequency() + ((calcSpace * 125) * m_channelNo))); + if (!m_duplex && simplexSameFreq) { m_rxFrequency = (uint32_t)((entry.baseFrequency() + ((calcSpace * 125) * m_channelNo))); m_txFrequency = m_rxFrequency; } diff --git a/p25/Control.cpp b/p25/Control.cpp index e74065bb..ce6eca39 100644 --- a/p25/Control.cpp +++ b/p25/Control.cpp @@ -573,7 +573,7 @@ bool Control::writeEndRF() if (m_netState == RS_NET_IDLE && m_rfState == RS_RF_LISTENING) { if (m_tailOnIdle) { bool ret = m_voice->writeEndRF(); - if (!m_control) { + if (!m_control && m_duplex) { writeRF_Nulls(); } diff --git a/p25/TrunkPacket.cpp b/p25/TrunkPacket.cpp index d41cd572..6d998a33 100644 --- a/p25/TrunkPacket.cpp +++ b/p25/TrunkPacket.cpp @@ -1496,6 +1496,10 @@ void TrunkPacket::writeRF_TDULC(lc::TDULC lc, bool noNetwork) /// void TrunkPacket::writeRF_TDULC_ChanRelease(bool grp, uint32_t srcId, uint32_t dstId) { + if (!m_p25->m_duplex) { + return; + } + uint32_t count = m_p25->m_hangCount / 2; lc::TDULC lc = lc::TDULC(m_p25->m_siteData, m_p25->m_idenEntry, m_dumpTSBK);