diff --git a/src/host/Host.cpp b/src/host/Host.cpp index e3ffe48b..0e621559 100644 --- a/src/host/Host.cpp +++ b/src/host/Host.cpp @@ -1470,6 +1470,8 @@ json::object Host::getStatus() uint32_t txFreqEffective = m_modem->m_txFrequency + m_modem->m_txTuning; modemInfo["txFrequencyEffective"].set(txFreqEffective); + modemInfo["v24Connected"].set(m_modem->m_v24Connected); + uint8_t protoVer = m_modem->getVersion(); modemInfo["protoVer"].set(protoVer); diff --git a/src/host/modem/Modem.cpp b/src/host/modem/Modem.cpp index 50e38994..c3fc90e4 100644 --- a/src/host/modem/Modem.cpp +++ b/src/host/modem/Modem.cpp @@ -125,6 +125,7 @@ Modem::Modem(port::IModemPort* port, bool duplex, bool rxInvert, bool txInvert, m_nxdnFifoLength(NXDN_TX_BUFFER_LEN), m_adcOverFlowCount(0U), m_dacOverFlowCount(0U), + m_v24Connected(true), m_modemState(STATE_IDLE), m_buffer(nullptr), m_length(0U), @@ -741,8 +742,9 @@ void Modem::clock(uint32_t ms) bool nxdnEnable = (m_buffer[3U] & 0x10U) == 0x10U; // flag indicating if free space is being reported in 16-byte blocks instead of LDUs - bool spaceInBlocks = (m_buffer[3U] & 0x80) == 0x80; + bool spaceInBlocks = (m_buffer[3U] & 0x80U) == 0x80U; + m_v24Connected = true; m_modemState = (DVM_STATE)m_buffer[4U]; m_tx = (m_buffer[5U] & 0x01U) == 0x01U; @@ -1698,6 +1700,13 @@ int Modem::write(const uint8_t* data, uint32_t length) return m_port->write(data, length); } +/* Gets the flag for the V.24 connection state. */ + +bool Modem::isV24Connected() const +{ + return m_v24Connected; +} + /* Gets the current operating state for the air interface modem. */ DVM_STATE Modem::getState() const diff --git a/src/host/modem/Modem.h b/src/host/modem/Modem.h index 179773db..fb1728dd 100644 --- a/src/host/modem/Modem.h +++ b/src/host/modem/Modem.h @@ -659,6 +659,11 @@ namespace modem */ virtual int write(const uint8_t* data, uint32_t length); + /** + * @brief Gets the flag for the V.24 connection state. + * @returns bool True, if V.24 device is connected, otherwise false. (This is always true for air interfaces.) + */ + bool isV24Connected() const; /** * @brief Gets the current operating state for the air interface modem. * @returns DVM_STATE Current operating state of modem. @@ -779,6 +784,7 @@ namespace modem uint32_t m_adcOverFlowCount; // dedicated modem - ADC overflow count uint32_t m_dacOverFlowCount; // dedicated modem - DAC overflow count + bool m_v24Connected; DVM_STATE m_modemState; uint8_t* m_buffer; diff --git a/src/host/modem/ModemV24.cpp b/src/host/modem/ModemV24.cpp index 3898c5b1..a96a6cad 100644 --- a/src/host/modem/ModemV24.cpp +++ b/src/host/modem/ModemV24.cpp @@ -58,6 +58,8 @@ ModemV24::ModemV24(port::IModemPort* port, bool duplex, uint32_t p25QueueSize, u m_lastP25Tx(0U), m_rs() { + m_v24Connected = false; // defaulted to false for V.24 modems + // Init m_call m_txCall = new DFSICallData(); m_rxCall = new DFSICallData(); @@ -219,8 +221,9 @@ void ModemV24::clock(uint32_t ms) bool nxdnEnable = (m_buffer[3U] & 0x10U) == 0x10U; // flag indicating if free space is being reported in 16-byte blocks instead of LDUs - bool spaceInBlocks = (m_buffer[3U] & 0x80) == 0x80; + bool spaceInBlocks = (m_buffer[3U] & 0x80U) == 0x80U; + m_v24Connected = (m_buffer[3U] & 0x40U) == 0x40U; m_modemState = (DVM_STATE)m_buffer[4U]; m_tx = (m_buffer[5U] & 0x01U) == 0x01U; @@ -300,8 +303,8 @@ void ModemV24::clock(uint32_t ms) m_p25Space = m_buffer[10U] * (P25DEF::P25_LDU_FRAME_LENGTH_BYTES); if (m_dumpModemStatus) { - LogDebug(LOG_MODEM, "ModemV24::clock(), CMD_GET_STATUS, isHotspot = %u, dmr = %u / %u, p25 = %u / %u, nxdn = %u / %u, modemState = %u, tx = %u, adcOverflow = %u, rxOverflow = %u, txOverflow = %u, dacOverflow = %u, dmrSpace1 = %u, dmrSpace2 = %u, p25Space = %u, nxdnSpace = %u", - m_isHotspot, dmrEnable, m_dmrEnabled, p25Enable, m_p25Enabled, nxdnEnable, m_nxdnEnabled, m_modemState, m_tx, adcOverflow, rxOverflow, txOverflow, dacOverflow, m_dmrSpace1, m_dmrSpace2, m_p25Space, m_nxdnSpace); + LogDebug(LOG_MODEM, "ModemV24::clock(), CMD_GET_STATUS, isHotspot = %u, v24Connected = %u, dmr = %u / %u, p25 = %u / %u, nxdn = %u / %u, modemState = %u, tx = %u, adcOverflow = %u, rxOverflow = %u, txOverflow = %u, dacOverflow = %u, dmrSpace1 = %u, dmrSpace2 = %u, p25Space = %u, nxdnSpace = %u", + m_isHotspot, m_v24Connected, dmrEnable, m_dmrEnabled, p25Enable, m_p25Enabled, nxdnEnable, m_nxdnEnabled, m_modemState, m_tx, adcOverflow, rxOverflow, txOverflow, dacOverflow, m_dmrSpace1, m_dmrSpace2, m_p25Space, m_nxdnSpace); LogDebug(LOG_MODEM, "ModemV24::clock(), CMD_GET_STATUS, rxDMRData1 size = %u, len = %u, free = %u; rxDMRData2 size = %u, len = %u, free = %u, rxP25Data size = %u, len = %u, free = %u, rxNXDNData size = %u, len = %u, free = %u", m_rxDMRQueue1.length(), m_rxDMRQueue1.dataSize(), m_rxDMRQueue1.freeSpace(), m_rxDMRQueue2.length(), m_rxDMRQueue2.dataSize(), m_rxDMRQueue2.freeSpace(), m_rxP25Queue.length(), m_rxP25Queue.dataSize(), m_rxP25Queue.freeSpace(), m_rxNXDNQueue.length(), m_rxNXDNQueue.dataSize(), m_rxNXDNQueue.freeSpace()); diff --git a/src/sysview/NodeStatusWnd.h b/src/sysview/NodeStatusWnd.h index e68ab651..2db81920 100644 --- a/src/sysview/NodeStatusWnd.h +++ b/src/sysview/NodeStatusWnd.h @@ -181,6 +181,19 @@ public: } } } + + if (peerStatus["modem"].is()) { + json::object modemInfo = peerStatus["modem"].get(); + + bool v24Connected = modemInfo["v24Connected"].getDefault(true); + if (!v24Connected) { + m_tx = false; + m_failed = true; + } else { + if (m_failed) + m_failed = false; + } + } } private: