From 0e5d075c62e61abfbdec8d126e6065d334f395b2 Mon Sep 17 00:00:00 2001 From: Bryan Biedenkapp Date: Thu, 9 Jan 2025 13:17:48 -0500 Subject: [PATCH] expose configuring the FSC heartbeat interval; expose enabling TIA mode DFSI frames; correct FullRateVoice memory copy for additional data; --- configs/config.example.yml | 4 ++++ src/common/p25/dfsi/frames/FullRateVoice.cpp | 2 +- src/host/Host.Config.cpp | 8 ++++++- .../modem/port/specialized/V24UDPPort.cpp | 22 ++++++++++++++++--- src/host/modem/port/specialized/V24UDPPort.h | 6 +++++ 5 files changed, 37 insertions(+), 5 deletions(-) diff --git a/configs/config.example.yml b/configs/config.example.yml index ebb3b421..a7495665 100644 --- a/configs/config.example.yml +++ b/configs/config.example.yml @@ -592,8 +592,12 @@ system: callTimeout: 200 # Flag indicating when operating in V.24 UDP mode, the FSC protocol should be used to negotiate connection. fsc: false + # Sets the heartbeat interval for the FSC connection. + fscHeartbeat: 5 # Flag indicating when operating in V.24 UDP mode, this instance should initiate the FSC protocol handshake. initiator: false + # Flag indicating DFSI frames should be formatted in TIA-102 standard instead of serial standard format. + dfsiTIAMode: false # Sets received the signal offset from DC. rxDCOffset: 0 # Valid values between -128 and 128 diff --git a/src/common/p25/dfsi/frames/FullRateVoice.cpp b/src/common/p25/dfsi/frames/FullRateVoice.cpp index 8ea60eab..c3b50a63 100644 --- a/src/common/p25/dfsi/frames/FullRateVoice.cpp +++ b/src/common/p25/dfsi/frames/FullRateVoice.cpp @@ -145,7 +145,7 @@ void FullRateVoice::encode(uint8_t* data) buffer[i] = Utils::bin2Hex(additionalData, offset); } - ::memcpy(data + 14U, buffer, ADDITIONAL_LENGTH); + ::memcpy(data + 14U, buffer, ADDITIONAL_LENGTH - 1U); } } } diff --git a/src/host/Host.Config.cpp b/src/host/Host.Config.cpp index 007103f2..73141abe 100644 --- a/src/host/Host.Config.cpp +++ b/src/host/Host.Config.cpp @@ -463,7 +463,9 @@ bool Host::createModem() uint16_t jitter = dfsiParams["jitter"].as(200U); uint16_t dfsiCallTimeout = dfsiParams["callTimeout"].as(200U); bool useFSCForUDP = dfsiParams["fsc"].as(false); + uint32_t fscHeartbeat = dfsiParams["fscHeartbeat"].as(5U); bool fscInitiator = dfsiParams["initiator"].as(false); + bool dfsiTIAMode = dfsiParams["dfsiTIAMode"].as(false); // clamp fifo sizes if (dmrFifoLength < DMR_TX_BUFFER_LEN) { @@ -581,7 +583,9 @@ bool Host::createModem() LogInfo(" DFSI Jitter Size: %u ms", jitter); if (g_remoteModemMode) { LogInfo(" DFSI Use FSC: %s", useFSCForUDP ? "yes" : "no"); + LogInfo(" DFSI FSC Heartbeat: %us", fscHeartbeat); LogInfo(" DFSI FSC Initiator: %s", fscInitiator ? "yes" : "no"); + LogInfo(" DFSI FSC TIA Frames: %s", dfsiTIAMode ? "yes" : "no"); } } @@ -598,7 +602,8 @@ bool Host::createModem() uint32_t id = networkConf["id"].as(1000U); if (useFSCForUDP) { modemPort = new port::specialized::V24UDPPort(id, g_remoteAddress, g_remotePort + 1U, g_remotePort, true, fscInitiator, debug); - } else { + ((modem::port::specialized::V24UDPPort*)modemPort)->setHeartbeatInterval(fscHeartbeat); + } else { modemPort = new port::specialized::V24UDPPort(id, g_remoteAddress, g_remotePort, 0U, false, false, debug); } m_udpDFSIRemotePort = modemPort; @@ -662,6 +667,7 @@ bool Host::createModem() m_modem = new ModemV24(modemPort, m_duplex, m_p25QueueSizeBytes, m_p25QueueSizeBytes, rtrt, diu, jitter, dumpModemStatus, trace, debug); ((ModemV24*)m_modem)->setCallTimeout(dfsiCallTimeout); + ((ModemV24*)m_modem)->setTIAFormat(dfsiTIAMode); } else { m_modem = new Modem(modemPort, m_duplex, rxInvert, txInvert, pttInvert, dcBlocker, cosLockout, fdmaPreamble, dmrRxDelay, p25CorrCount, m_dmrQueueSizeBytes, m_p25QueueSizeBytes, m_nxdnQueueSizeBytes, disableOFlowReset, ignoreModemConfigArea, dumpModemStatus, trace, debug); diff --git a/src/host/modem/port/specialized/V24UDPPort.cpp b/src/host/modem/port/specialized/V24UDPPort.cpp index fe24b974..948b82e5 100644 --- a/src/host/modem/port/specialized/V24UDPPort.cpp +++ b/src/host/modem/port/specialized/V24UDPPort.cpp @@ -64,6 +64,7 @@ V24UDPPort::V24UDPPort(uint32_t peerId, const std::string& address, uint16_t mod m_fscInitiator(fscInitiator), m_timeoutTimer(1000U, 30U), m_reqConnectionTimer(1000U, 30U), + m_heartbeatInterval(5U), m_heartbeatTimer(1000U, 5U), m_random(), m_peerId(peerId), @@ -115,6 +116,19 @@ V24UDPPort::~V24UDPPort() delete m_socket; } +/* Helper to set and configure the heartbeat interval for FSC connections. */ + +void V24UDPPort::setHeartbeatInterval(uint32_t interval) +{ + if (interval < 5U) + interval = 5U; + if (interval > 30U) + interval = 30U; + + m_heartbeatInterval = interval; + m_heartbeatTimer = Timer(1000U, interval); +} + /* Updates the timer by the passed number of milliseconds. */ void V24UDPPort::clock(uint32_t ms) @@ -461,6 +475,7 @@ void* V24UDPPort::threadedCtrlNetworkRx(void* arg) } uint16_t vcPort = connMessage->getVCBasePort(); + network->m_heartbeatInterval = connMessage->getFSHeartbeatPeriod(); network->m_localPort = vcPort; network->createVCPort(network->m_localPort); @@ -468,10 +483,11 @@ void* V24UDPPort::threadedCtrlNetworkRx(void* arg) network->m_fscState = CS_CONNECTED; network->m_reqConnectionTimer.stop(); + network->m_heartbeatTimer = Timer(1000U, network->m_heartbeatInterval); network->m_heartbeatTimer.start(); network->m_timeoutTimer.start(); - LogMessage(LOG_MODEM, "V.24 UDP, Incoming DFSI FSC Connection, vcBasePort = %u", network->m_localPort); + LogMessage(LOG_MODEM, "V.24 UDP, Incoming DFSI FSC Connection, vcBasePort = %u, fsHBInterval = %u, hostHBInterval = %u", network->m_localPort, network->m_heartbeatInterval, connMessage->getHostHeartbeatPeriod()); // construct connect ACK response data uint8_t respData[3U]; @@ -681,8 +697,8 @@ void V24UDPPort::writeConnect() LogMessage(LOG_MODEM, "V.24 UDP, Attempting DFSI FSC Connection, peerId = %u, vcBasePort = %u", m_peerId, m_localPort); FSCConnect connect = FSCConnect(); - connect.setFSHeartbeatPeriod(5U); // hardcoded? - connect.setHostHeartbeatPeriod(5U); // hardcoded? + connect.setFSHeartbeatPeriod(m_heartbeatInterval); + connect.setHostHeartbeatPeriod(m_heartbeatInterval); connect.setVCBasePort(m_localPort); connect.setVCSSRC(m_peerId); diff --git a/src/host/modem/port/specialized/V24UDPPort.h b/src/host/modem/port/specialized/V24UDPPort.h index 750f54cf..ac1f7b84 100644 --- a/src/host/modem/port/specialized/V24UDPPort.h +++ b/src/host/modem/port/specialized/V24UDPPort.h @@ -81,6 +81,11 @@ namespace modem */ ~V24UDPPort() override; + /** + * @brief Helper to set and configure the heartbeat interval for FSC connections. + */ + void setHeartbeatInterval(uint32_t interval); + /** * @brief Updates the timer by the passed number of milliseconds. * @param ms Number of milliseconds. @@ -147,6 +152,7 @@ namespace modem Timer m_timeoutTimer; Timer m_reqConnectionTimer; + uint32_t m_heartbeatInterval; Timer m_heartbeatTimer; std::mt19937 m_random;