add support for V.24 modem connection state reporting;

pull/72/head
Bryan Biedenkapp 1 year ago
parent c7ff885c72
commit 7dc9522d7f

@ -1470,6 +1470,8 @@ json::object Host::getStatus()
uint32_t txFreqEffective = m_modem->m_txFrequency + m_modem->m_txTuning; uint32_t txFreqEffective = m_modem->m_txFrequency + m_modem->m_txTuning;
modemInfo["txFrequencyEffective"].set<uint32_t>(txFreqEffective); modemInfo["txFrequencyEffective"].set<uint32_t>(txFreqEffective);
modemInfo["v24Connected"].set<bool>(m_modem->m_v24Connected);
uint8_t protoVer = m_modem->getVersion(); uint8_t protoVer = m_modem->getVersion();
modemInfo["protoVer"].set<uint8_t>(protoVer); modemInfo["protoVer"].set<uint8_t>(protoVer);

@ -125,6 +125,7 @@ Modem::Modem(port::IModemPort* port, bool duplex, bool rxInvert, bool txInvert,
m_nxdnFifoLength(NXDN_TX_BUFFER_LEN), m_nxdnFifoLength(NXDN_TX_BUFFER_LEN),
m_adcOverFlowCount(0U), m_adcOverFlowCount(0U),
m_dacOverFlowCount(0U), m_dacOverFlowCount(0U),
m_v24Connected(true),
m_modemState(STATE_IDLE), m_modemState(STATE_IDLE),
m_buffer(nullptr), m_buffer(nullptr),
m_length(0U), m_length(0U),
@ -741,8 +742,9 @@ void Modem::clock(uint32_t ms)
bool nxdnEnable = (m_buffer[3U] & 0x10U) == 0x10U; bool nxdnEnable = (m_buffer[3U] & 0x10U) == 0x10U;
// flag indicating if free space is being reported in 16-byte blocks instead of LDUs // 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_modemState = (DVM_STATE)m_buffer[4U];
m_tx = (m_buffer[5U] & 0x01U) == 0x01U; 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); 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. */ /* Gets the current operating state for the air interface modem. */
DVM_STATE Modem::getState() const DVM_STATE Modem::getState() const

@ -659,6 +659,11 @@ namespace modem
*/ */
virtual int write(const uint8_t* data, uint32_t length); 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. * @brief Gets the current operating state for the air interface modem.
* @returns DVM_STATE Current operating state of 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_adcOverFlowCount; // dedicated modem - ADC overflow count
uint32_t m_dacOverFlowCount; // dedicated modem - DAC overflow count uint32_t m_dacOverFlowCount; // dedicated modem - DAC overflow count
bool m_v24Connected;
DVM_STATE m_modemState; DVM_STATE m_modemState;
uint8_t* m_buffer; uint8_t* m_buffer;

@ -58,6 +58,8 @@ ModemV24::ModemV24(port::IModemPort* port, bool duplex, uint32_t p25QueueSize, u
m_lastP25Tx(0U), m_lastP25Tx(0U),
m_rs() m_rs()
{ {
m_v24Connected = false; // defaulted to false for V.24 modems
// Init m_call // Init m_call
m_txCall = new DFSICallData(); m_txCall = new DFSICallData();
m_rxCall = new DFSICallData(); m_rxCall = new DFSICallData();
@ -219,8 +221,9 @@ void ModemV24::clock(uint32_t ms)
bool nxdnEnable = (m_buffer[3U] & 0x10U) == 0x10U; bool nxdnEnable = (m_buffer[3U] & 0x10U) == 0x10U;
// flag indicating if free space is being reported in 16-byte blocks instead of LDUs // 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_modemState = (DVM_STATE)m_buffer[4U];
m_tx = (m_buffer[5U] & 0x01U) == 0x01U; 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); m_p25Space = m_buffer[10U] * (P25DEF::P25_LDU_FRAME_LENGTH_BYTES);
if (m_dumpModemStatus) { 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", 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, 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); 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", 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_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()); m_rxP25Queue.length(), m_rxP25Queue.dataSize(), m_rxP25Queue.freeSpace(), m_rxNXDNQueue.length(), m_rxNXDNQueue.dataSize(), m_rxNXDNQueue.freeSpace());

@ -181,6 +181,19 @@ public:
} }
} }
} }
if (peerStatus["modem"].is<json::object>()) {
json::object modemInfo = peerStatus["modem"].get<json::object>();
bool v24Connected = modemInfo["v24Connected"].getDefault<bool>(true);
if (!v24Connected) {
m_tx = false;
m_failed = true;
} else {
if (m_failed)
m_failed = false;
}
}
} }
private: private:

Loading…
Cancel
Save

Powered by TurnKey Linux.