From 217872dc9a1a0102f14078da7bdb2c20a7197fb8 Mon Sep 17 00:00:00 2001 From: Bryan Biedenkapp Date: Tue, 13 Jan 2026 11:08:19 -0500 Subject: [PATCH] convert direct MMDVM TDU to a timed TDU; correct some handling of LDU1 srcId and dstId; --- src/patch/HostPatch.cpp | 70 ++++++++++++++++++++++++++--------------- src/patch/HostPatch.h | 1 + 2 files changed, 45 insertions(+), 26 deletions(-) diff --git a/src/patch/HostPatch.cpp b/src/patch/HostPatch.cpp index b86c5306..75afbccd 100644 --- a/src/patch/HostPatch.cpp +++ b/src/patch/HostPatch.cpp @@ -77,6 +77,7 @@ HostPatch::HostPatch(const std::string& confFile) : m_twoWayPatch(false), m_mmdvmP25Reflector(false), m_mmdvmP25Net(nullptr), + m_mmdvmCallEndTimer(1000U, 0U, 500U), m_dropTimeMS(1U), m_callDropTime(1000U, 0U, 1000U), m_netState(RS_NET_IDLE), @@ -1949,6 +1950,9 @@ void HostPatch::writeNet_LDU1(bool toFNE) using namespace p25::dfsi::defines; if (toFNE) { + uint32_t dstId = GET_UINT24(m_netLDU1, 76U); + uint32_t srcId = GET_UINT24(m_netLDU1, 101U); + if (m_netState == RS_NET_IDLE) { m_callInProgress = true; @@ -1957,8 +1961,6 @@ void HostPatch::writeNet_LDU1(bool toFNE) uint8_t lco = m_netLDU1[51U]; uint8_t mfId = m_netLDU1[52U]; - uint32_t dstId = GET_UINT24(m_netLDU1, 76U); - uint32_t srcId = GET_UINT24(m_netLDU1, 101U); LogInfoEx(LOG_HOST, "MMDVM P25, call start, srcId = %u, dstId = %u", srcId, dstId); @@ -1982,6 +1984,11 @@ void HostPatch::writeNet_LDU1(bool toFNE) } } + if (dstId != 0U) + m_netLC.setDstId(dstId); + if (srcId != 0U) + m_netLC.setSrcId(srcId); + p25::data::LowSpeedData lsd = p25::data::LowSpeedData(); lsd.setLSD1(m_netLDU1[201U]); lsd.setLSD2(m_netLDU1[202U]); @@ -2200,6 +2207,34 @@ void* HostPatch::threadMMDVMProcess(void* arg) ms = stopWatch.elapsed(); stopWatch.start(); + if (patch->m_mmdvmCallEndTimer.isRunning()) + patch->m_mmdvmCallEndTimer.clock(ms); + if (patch->m_mmdvmCallEndTimer.isRunning() && patch->m_mmdvmCallEndTimer.hasExpired()) { + patch->m_mmdvmCallEndTimer.stop(); + patch->m_netState = RS_NET_IDLE; + + p25::data::LowSpeedData lsd = p25::data::LowSpeedData(); + + LogInfoEx(LOG_HOST, "MMDVM " P25_TDU_STR); + + uint8_t controlByte = 0x00U; + patch->m_network->writeP25TDU(patch->m_netLC, lsd, controlByte); + + if (patch->m_rxStartTime > 0U) { + uint64_t now = std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count(); + uint64_t diff = now - patch->m_rxStartTime; + + LogInfoEx(LOG_HOST, "MMDVM P25, call end, srcId = %u, dstId = %u, dur = %us", patch->m_netLC.getSrcId(), patch->m_netLC.getDstId(), diff / 1000U); + } + + patch->m_rxStartTime = 0U; + patch->m_rxStreamId = 0U; + + patch->m_callInProgress = false; + patch->m_rxStartTime = 0U; + patch->m_rxStreamId = 0U; + } + if (patch->m_digiMode == TX_MODE_P25) { std::lock_guard lock(HostPatch::s_networkMutex); @@ -2239,6 +2274,9 @@ void* HostPatch::threadMMDVMProcess(void* arg) if (patch->m_netState != RS_NET_IDLE) { patch->m_gotNetLDU1 = true; patch->writeNet_LDU1(true); + + if (patch->m_mmdvmCallEndTimer.isRunning()) + patch->m_mmdvmCallEndTimer.start(); } break; @@ -2277,34 +2315,14 @@ void* HostPatch::threadMMDVMProcess(void* arg) if (patch->m_netState != RS_NET_IDLE) { patch->writeNet_LDU2(true); + + if (patch->m_mmdvmCallEndTimer.isRunning()) + patch->m_mmdvmCallEndTimer.start(); } break; case 0x80U: - { - patch->m_netState = RS_NET_IDLE; - - p25::data::LowSpeedData lsd = p25::data::LowSpeedData(); - - LogInfoEx(LOG_HOST, "MMDVM " P25_TDU_STR); - - uint8_t controlByte = 0x00U; - patch->m_network->writeP25TDU(patch->m_netLC, lsd, controlByte); - - if (patch->m_rxStartTime > 0U) { - uint64_t now = std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count(); - uint64_t diff = now - patch->m_rxStartTime; - - LogInfoEx(LOG_HOST, "MMDVM P25, call end, srcId = %u, dstId = %u, dur = %us", patch->m_netLC.getSrcId(), patch->m_netLC.getDstId(), diff / 1000U); - } - - patch->m_rxStartTime = 0U; - patch->m_rxStreamId = 0U; - - patch->m_callInProgress = false; - patch->m_rxStartTime = 0U; - patch->m_rxStreamId = 0U; - } + patch->m_mmdvmCallEndTimer.start(); break; case 0xF0U: diff --git a/src/patch/HostPatch.h b/src/patch/HostPatch.h index 78f83eb0..53dce5d3 100644 --- a/src/patch/HostPatch.h +++ b/src/patch/HostPatch.h @@ -78,6 +78,7 @@ private: bool m_mmdvmP25Reflector; mmdvm::P25Network* m_mmdvmP25Net; + Timer m_mmdvmCallEndTimer; uint16_t m_dropTimeMS; Timer m_callDropTime;