expose configuring the FSC heartbeat interval; expose enabling TIA mode DFSI frames; correct FullRateVoice memory copy for additional data;

82-dvmbridge---implement-notch-filter-for-2175hz-trc-guard-tone
Bryan Biedenkapp 1 year ago
parent 2d450f64b0
commit 0e5d075c62

@ -592,8 +592,12 @@ system:
callTimeout: 200 callTimeout: 200
# Flag indicating when operating in V.24 UDP mode, the FSC protocol should be used to negotiate connection. # Flag indicating when operating in V.24 UDP mode, the FSC protocol should be used to negotiate connection.
fsc: false 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. # Flag indicating when operating in V.24 UDP mode, this instance should initiate the FSC protocol handshake.
initiator: false 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. # Sets received the signal offset from DC.
rxDCOffset: 0 # Valid values between -128 and 128 rxDCOffset: 0 # Valid values between -128 and 128

@ -145,7 +145,7 @@ void FullRateVoice::encode(uint8_t* data)
buffer[i] = Utils::bin2Hex(additionalData, offset); buffer[i] = Utils::bin2Hex(additionalData, offset);
} }
::memcpy(data + 14U, buffer, ADDITIONAL_LENGTH); ::memcpy(data + 14U, buffer, ADDITIONAL_LENGTH - 1U);
} }
} }
} }

@ -463,7 +463,9 @@ bool Host::createModem()
uint16_t jitter = dfsiParams["jitter"].as<uint16_t>(200U); uint16_t jitter = dfsiParams["jitter"].as<uint16_t>(200U);
uint16_t dfsiCallTimeout = dfsiParams["callTimeout"].as<uint16_t>(200U); uint16_t dfsiCallTimeout = dfsiParams["callTimeout"].as<uint16_t>(200U);
bool useFSCForUDP = dfsiParams["fsc"].as<bool>(false); bool useFSCForUDP = dfsiParams["fsc"].as<bool>(false);
uint32_t fscHeartbeat = dfsiParams["fscHeartbeat"].as<uint32_t>(5U);
bool fscInitiator = dfsiParams["initiator"].as<bool>(false); bool fscInitiator = dfsiParams["initiator"].as<bool>(false);
bool dfsiTIAMode = dfsiParams["dfsiTIAMode"].as<bool>(false);
// clamp fifo sizes // clamp fifo sizes
if (dmrFifoLength < DMR_TX_BUFFER_LEN) { if (dmrFifoLength < DMR_TX_BUFFER_LEN) {
@ -581,7 +583,9 @@ bool Host::createModem()
LogInfo(" DFSI Jitter Size: %u ms", jitter); LogInfo(" DFSI Jitter Size: %u ms", jitter);
if (g_remoteModemMode) { if (g_remoteModemMode) {
LogInfo(" DFSI Use FSC: %s", useFSCForUDP ? "yes" : "no"); 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 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<uint32_t>(1000U); uint32_t id = networkConf["id"].as<uint32_t>(1000U);
if (useFSCForUDP) { if (useFSCForUDP) {
modemPort = new port::specialized::V24UDPPort(id, g_remoteAddress, g_remotePort + 1U, g_remotePort, true, fscInitiator, debug); 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); modemPort = new port::specialized::V24UDPPort(id, g_remoteAddress, g_remotePort, 0U, false, false, debug);
} }
m_udpDFSIRemotePort = modemPort; m_udpDFSIRemotePort = modemPort;
@ -662,6 +667,7 @@ bool Host::createModem()
m_modem = new ModemV24(modemPort, m_duplex, m_p25QueueSizeBytes, m_p25QueueSizeBytes, rtrt, diu, jitter, m_modem = new ModemV24(modemPort, m_duplex, m_p25QueueSizeBytes, m_p25QueueSizeBytes, rtrt, diu, jitter,
dumpModemStatus, trace, debug); dumpModemStatus, trace, debug);
((ModemV24*)m_modem)->setCallTimeout(dfsiCallTimeout); ((ModemV24*)m_modem)->setCallTimeout(dfsiCallTimeout);
((ModemV24*)m_modem)->setTIAFormat(dfsiTIAMode);
} else { } else {
m_modem = new Modem(modemPort, m_duplex, rxInvert, txInvert, pttInvert, dcBlocker, cosLockout, fdmaPreamble, dmrRxDelay, p25CorrCount, 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); m_dmrQueueSizeBytes, m_p25QueueSizeBytes, m_nxdnQueueSizeBytes, disableOFlowReset, ignoreModemConfigArea, dumpModemStatus, trace, debug);

@ -64,6 +64,7 @@ V24UDPPort::V24UDPPort(uint32_t peerId, const std::string& address, uint16_t mod
m_fscInitiator(fscInitiator), m_fscInitiator(fscInitiator),
m_timeoutTimer(1000U, 30U), m_timeoutTimer(1000U, 30U),
m_reqConnectionTimer(1000U, 30U), m_reqConnectionTimer(1000U, 30U),
m_heartbeatInterval(5U),
m_heartbeatTimer(1000U, 5U), m_heartbeatTimer(1000U, 5U),
m_random(), m_random(),
m_peerId(peerId), m_peerId(peerId),
@ -115,6 +116,19 @@ V24UDPPort::~V24UDPPort()
delete m_socket; 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. */ /* Updates the timer by the passed number of milliseconds. */
void V24UDPPort::clock(uint32_t ms) void V24UDPPort::clock(uint32_t ms)
@ -461,6 +475,7 @@ void* V24UDPPort::threadedCtrlNetworkRx(void* arg)
} }
uint16_t vcPort = connMessage->getVCBasePort(); uint16_t vcPort = connMessage->getVCBasePort();
network->m_heartbeatInterval = connMessage->getFSHeartbeatPeriod();
network->m_localPort = vcPort; network->m_localPort = vcPort;
network->createVCPort(network->m_localPort); network->createVCPort(network->m_localPort);
@ -468,10 +483,11 @@ void* V24UDPPort::threadedCtrlNetworkRx(void* arg)
network->m_fscState = CS_CONNECTED; network->m_fscState = CS_CONNECTED;
network->m_reqConnectionTimer.stop(); network->m_reqConnectionTimer.stop();
network->m_heartbeatTimer = Timer(1000U, network->m_heartbeatInterval);
network->m_heartbeatTimer.start(); network->m_heartbeatTimer.start();
network->m_timeoutTimer.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 // construct connect ACK response data
uint8_t respData[3U]; 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); LogMessage(LOG_MODEM, "V.24 UDP, Attempting DFSI FSC Connection, peerId = %u, vcBasePort = %u", m_peerId, m_localPort);
FSCConnect connect = FSCConnect(); FSCConnect connect = FSCConnect();
connect.setFSHeartbeatPeriod(5U); // hardcoded? connect.setFSHeartbeatPeriod(m_heartbeatInterval);
connect.setHostHeartbeatPeriod(5U); // hardcoded? connect.setHostHeartbeatPeriod(m_heartbeatInterval);
connect.setVCBasePort(m_localPort); connect.setVCBasePort(m_localPort);
connect.setVCSSRC(m_peerId); connect.setVCSSRC(m_peerId);

@ -81,6 +81,11 @@ namespace modem
*/ */
~V24UDPPort() override; ~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. * @brief Updates the timer by the passed number of milliseconds.
* @param ms Number of milliseconds. * @param ms Number of milliseconds.
@ -147,6 +152,7 @@ namespace modem
Timer m_timeoutTimer; Timer m_timeoutTimer;
Timer m_reqConnectionTimer; Timer m_reqConnectionTimer;
uint32_t m_heartbeatInterval;
Timer m_heartbeatTimer; Timer m_heartbeatTimer;
std::mt19937 m_random; std::mt19937 m_random;

Loading…
Cancel
Save

Powered by TurnKey Linux.