From f47744e97a8c62e7173bece1451f959126e4b3ee Mon Sep 17 00:00:00 2001 From: Bryan Biedenkapp Date: Sun, 30 Oct 2022 01:23:03 -0400 Subject: [PATCH] [EXPERIMENTAL] remove buffering in Modem class, this has the effect of moving data buffering from a triple-buffering mechanism to a double-buffering mechanism, resulting in *much* faster response times for packets; --- host/Host.cpp | 110 +++++++++--------- host/calibrate/HostCal.cpp | 3 +- modem/Modem.cpp | 222 ++++++++----------------------------- modem/Modem.h | 17 +-- p25/Control.cpp | 19 +++- p25/Control.h | 2 + 6 files changed, 127 insertions(+), 246 deletions(-) diff --git a/host/Host.cpp b/host/Host.cpp index 5afdbef3..e5a52cbb 100644 --- a/host/Host.cpp +++ b/host/Host.cpp @@ -1001,68 +1001,71 @@ int Host::run() // if there is read frames from the P25 controller and write it // to the modem if (p25 != nullptr) { - ret = m_modem->hasP25Space(); - if (ret) { - len = p25->getFrame(data); - if (len > 0U) { - // if the state is idle; set to P25 and start mode timer - if (m_state == STATE_IDLE) { - m_modeTimer.setTimeout(m_netModeHang); - setState(STATE_P25); - } + uint8_t nextLen = p25->peekFrameLength(); + if (nextLen > 0U) { + ret = m_modem->hasP25Space(nextLen); + if (ret) { + len = p25->getFrame(data); + if (len > 0U) { + // if the state is idle; set to P25 and start mode timer + if (m_state == STATE_IDLE) { + m_modeTimer.setTimeout(m_netModeHang); + setState(STATE_P25); + } - // if the state is P25; write P25 data - if (m_state == STATE_P25) { - m_modem->writeP25Data(data, len); - - INTERRUPT_DMR_BEACON; + // if the state is P25; write P25 data + if (m_state == STATE_P25) { + m_modem->writeP25Data(data, len); + + INTERRUPT_DMR_BEACON; - // if there is a NXDN CC running; halt the CC - if (nxdn != nullptr) { - if (nxdn->getCCRunning() && !nxdn->getCCHalted()) { - nxdn->setCCHalted(true); - INTERRUPT_NXDN_CONTROL; + // if there is a NXDN CC running; halt the CC + if (nxdn != nullptr) { + if (nxdn->getCCRunning() && !nxdn->getCCHalted()) { + nxdn->setCCHalted(true); + INTERRUPT_NXDN_CONTROL; + } } + + m_modeTimer.start(); } - - m_modeTimer.start(); } - } - else { - // if we have no P25 data, and we're either idle or P25 state, check if we - // need to be starting the CC running flag or writing end of voice call data - if (m_state == STATE_IDLE || m_state == STATE_P25) { - if (p25->getCCHalted()) { - p25->setCCHalted(false); - } - - // write end of voice if necessary - ret = p25->writeRF_VoiceEnd(); - if (ret) { - if (m_state == STATE_IDLE) { - m_modeTimer.setTimeout(m_netModeHang); - setState(STATE_P25); + else { + // if we have no P25 data, and we're either idle or P25 state, check if we + // need to be starting the CC running flag or writing end of voice call data + if (m_state == STATE_IDLE || m_state == STATE_P25) { + if (p25->getCCHalted()) { + p25->setCCHalted(false); } - if (m_state == STATE_P25) { - m_modeTimer.start(); + // write end of voice if necessary + ret = p25->writeRF_VoiceEnd(); + if (ret) { + if (m_state == STATE_IDLE) { + m_modeTimer.setTimeout(m_netModeHang); + setState(STATE_P25); + } + + if (m_state == STATE_P25) { + m_modeTimer.start(); + } } } } - } - // if the modem is in duplex -- handle P25 CC burst control - if (m_duplex) { - if (p25BcastDurationTimer.isPaused() && !p25->getCCHalted()) { - p25BcastDurationTimer.resume(); - } + // if the modem is in duplex -- handle P25 CC burst control + if (m_duplex) { + if (p25BcastDurationTimer.isPaused() && !p25->getCCHalted()) { + p25BcastDurationTimer.resume(); + } - if (p25->getCCHalted()) { - p25->setCCHalted(false); - } + if (p25->getCCHalted()) { + p25->setCCHalted(false); + } - if (g_fireP25Control) { - m_modeTimer.stop(); + if (g_fireP25Control) { + m_modeTimer.stop(); + } } } } @@ -2398,13 +2401,6 @@ bool Host::rmtPortModemHandler(Modem* modem, uint32_t ms, modem::RESP_TYPE_DVM r // send entire modem packet over the remote port m_modemRemotePort->write(buffer, len); - - // Only feed data to the modem if the playout timer has expired - modem->getPlayoutTimer().clock(ms); - if (!modem->getPlayoutTimer().hasExpired()) { - // handled modem response - return true; - } } // read any data from the remote port for the air interface @@ -2430,8 +2426,6 @@ bool Host::rmtPortModemHandler(Modem* modem, uint32_t ms, modem::RESP_TYPE_DVM r LogError(LOG_MODEM, "Error writing remote data"); } - modem->getPlayoutTimer().start(); - // handled modem response return true; } diff --git a/host/calibrate/HostCal.cpp b/host/calibrate/HostCal.cpp index 34a1ae67..2369c87d 100644 --- a/host/calibrate/HostCal.cpp +++ b/host/calibrate/HostCal.cpp @@ -1322,7 +1322,7 @@ bool HostCal::portModemHandler(Modem* modem, uint32_t ms, RESP_TYPE_DVM rspType, uint8_t dataLen = 0U; m_queue.peek(&dataLen, 1U); - if (!m_queue.isEmpty() && m_modem->m_p25Space > len) { + if (!m_queue.isEmpty() && m_modem->m_p25Space >= dataLen) { uint8_t data[p25::P25_LDU_FRAME_LENGTH_BYTES + 2U]; dataLen = 0U; @@ -1443,6 +1443,7 @@ bool HostCal::portModemHandler(Modem* modem, uint32_t ms, RESP_TYPE_DVM rspType, bool txOverflow = (buffer[5U] & 0x08U) == 0x08U; bool dacOverflow = (buffer[5U] & 0x20U) == 0x20U; + // spaces from the modem are returned in "logical" frame count, not raw byte size m_modem->m_dmrSpace1 = buffer[7U] * (dmr::DMR_FRAME_LENGTH_BYTES + 2U); m_modem->m_dmrSpace2 = buffer[8U] * (dmr::DMR_FRAME_LENGTH_BYTES + 2U); m_modem->m_p25Space = buffer[10U] * (p25::P25_LDU_FRAME_LENGTH_BYTES); diff --git a/modem/Modem.cpp b/modem/Modem.cpp index 8d52ae80..e2c43aae 100644 --- a/modem/Modem.cpp +++ b/modem/Modem.cpp @@ -181,12 +181,8 @@ Modem::Modem(port::IModemPort* port, bool duplex, bool rxInvert, bool txInvert, m_rspHandler(nullptr), m_rxDMRData1(1000U, "Modem RX DMR1"), m_rxDMRData2(1000U, "Modem RX DMR2"), - m_txDMRData1(1000U, "Modem TX DMR1"), - m_txDMRData2(1000U, "Modem TX DMR2"), m_rxP25Data(1000U, "Modem RX P25"), - m_txP25Data(1000U, "Modem TX P25"), m_rxNXDNData(1000U, "Modem RX NXDN"), - m_txNXDNData(1000U, "Modem TX NXDN"), m_useDFSI(false), m_statusTimer(1000U, 0U, 250U), m_inactivityTimer(1000U, 4U), @@ -202,8 +198,7 @@ Modem::Modem(port::IModemPort* port, bool duplex, bool rxInvert, bool txInvert, m_flashDisabled(false), m_dumpModemStatus(dumpModemStatus), m_trace(trace), - m_debug(debug), - m_playoutTimer(1000U, 0U, packetPlayoutTime) + m_debug(debug) { assert(port != nullptr); @@ -526,8 +521,6 @@ bool Modem::open() return false; m_error = false; - m_playoutTimer.start(); - return true; } @@ -856,10 +849,11 @@ void Modem::clock(uint32_t ms) m_cd = (m_buffer[5U] & 0x40U) == 0x40U; - m_dmrSpace1 = m_buffer[7U]; - m_dmrSpace2 = m_buffer[8U]; - m_p25Space = m_buffer[10U]; - m_nxdnSpace = m_buffer[11U]; + // spaces from the modem are returned in "logical" frame count, not raw byte size + m_dmrSpace1 = m_buffer[7U] * (dmr::DMR_FRAME_LENGTH_BYTES + 2U); + m_dmrSpace2 = m_buffer[8U] * (dmr::DMR_FRAME_LENGTH_BYTES + 2U); + m_p25Space = m_buffer[10U] * (p25::P25_LDU_FRAME_LENGTH_BYTES); + m_nxdnSpace = m_buffer[11U] * (nxdn::NXDN_FRAME_LENGTH_BYTES); if (m_dumpModemStatus) { LogDebug(LOG_MODEM, "Modem::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", @@ -867,9 +861,6 @@ void Modem::clock(uint32_t ms) LogDebug(LOG_MODEM, "Modem::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_rxDMRData1.length(), m_rxDMRData1.dataSize(), m_rxDMRData1.freeSpace(), m_rxDMRData2.length(), m_rxDMRData2.dataSize(), m_rxDMRData2.freeSpace(), m_rxP25Data.length(), m_rxP25Data.dataSize(), m_rxP25Data.freeSpace(), m_rxNXDNData.length(), m_rxNXDNData.dataSize(), m_rxNXDNData.freeSpace()); - LogDebug(LOG_MODEM, "Modem::clock(), CMD_GET_STATUS, txDMRData1 size = %u, len = %u, free = %u; txDMRData2 size = %u, len = %u, free = %u, txP25Data size = %u, len = %u, free = %u, txNXDNData size = %u, len = %u, free = %u", - m_txDMRData1.length(), m_txDMRData1.dataSize(), m_txDMRData1.freeSpace(), m_txDMRData2.length(), m_txDMRData2.dataSize(), m_txDMRData2.freeSpace(), - m_txP25Data.length(), m_txP25Data.dataSize(), m_txP25Data.freeSpace(), m_txNXDNData.length(), m_txNXDNData.dataSize(), m_txNXDNData.freeSpace()); } m_inactivityTimer.start(); @@ -905,92 +896,6 @@ void Modem::clock(uint32_t ms) forceModemReset = false; reset(); } - - // Only feed data to the modem if the playout timer has expired - m_playoutTimer.clock(ms); - if (!m_playoutTimer.hasExpired()) - return; - - /** Digital Mobile Radio */ -#if defined(ENABLE_DMR) - // write DMR slot 1 data to air interface - if (m_dmrSpace1 > 1U && !m_txDMRData1.isEmpty()) { - uint8_t len = 0U; - m_txDMRData1.getData(&len, 1U); - m_txDMRData1.getData(m_buffer, len); - - //if (m_trace) - // Utils::dump(1U, "Buffered TX DMR Data 1", m_buffer, len); - - int ret = write(m_buffer, len); - if (ret != int(len)) - LogError(LOG_MODEM, "Error writing DMR slot 1 data"); - - m_playoutTimer.start(); - - m_dmrSpace1--; - } - - // write DMR slot 2 data to air interface - if (m_dmrSpace2 > 1U && !m_txDMRData2.isEmpty()) { - uint8_t len = 0U; - m_txDMRData2.getData(&len, 1U); - m_txDMRData2.getData(m_buffer, len); - - //if (m_trace) - // Utils::dump(1U, "Buffered TX DMR Data 2", m_buffer, len); - - int ret = write(m_buffer, len); - if (ret != int(len)) - LogError(LOG_MODEM, "Error writing DMR slot 2 data"); - - m_playoutTimer.start(); - - m_dmrSpace2--; - } -#endif // defined(ENABLE_DMR) - - /** Project 25 */ -#if defined(ENABLE_P25) - // write P25 data to air interface - if (m_p25Space > 1U && !m_txP25Data.isEmpty()) { - uint8_t len = 0U; - m_txP25Data.getData(&len, 1U); - m_txP25Data.getData(m_buffer, len); - - //if (m_trace) - // Utils::dump(1U, "Buffered TX P25 Data", m_buffer, len); - - int ret = write(m_buffer, len); - if (ret != int(len)) - LogError(LOG_MODEM, "Error writing P25 data"); - - m_playoutTimer.start(); - - m_p25Space--; - } -#endif // defined(ENABLE_P25) - - /** Next Generation Digital Narrowband */ -#if defined(ENABLE_NXDN) - // write NXDN data to air interface - if (m_nxdnSpace > 1U && !m_txNXDNData.isEmpty()) { - uint8_t len = 0U; - m_txNXDNData.getData(&len, 1U); - m_txNXDNData.getData(m_buffer, len); - - //if (m_trace) - // Utils::dump(1U, "Buffered TX NXDN Data", m_buffer, len); - - int ret = write(m_buffer, len); - if (ret != int(len)) - LogError(LOG_MODEM, "Error writing NXDN data"); - - m_playoutTimer.start(); - - m_nxdnSpace--; - } -#endif // defined(ENABLE_NXDN) } /// @@ -1089,8 +994,7 @@ uint32_t Modem::readNXDNData(uint8_t* data) /// True, if the DMR Slot 1 ring buffer has free space, otherwise false. bool Modem::hasDMRSpace1() const { - uint32_t space = m_txDMRData1.freeSpace() / (dmr::DMR_FRAME_LENGTH_BYTES + 4U); - return space > 1U; + return m_dmrSpace1 >= (dmr::DMR_FRAME_LENGTH_BYTES + 2U); } /// @@ -1099,18 +1003,17 @@ bool Modem::hasDMRSpace1() const /// True, if the DMR Slot 2 ring buffer has free space, otherwise false. bool Modem::hasDMRSpace2() const { - uint32_t space = m_txDMRData2.freeSpace() / (dmr::DMR_FRAME_LENGTH_BYTES + 4U); - return space > 1U; + return m_dmrSpace2 >= (dmr::DMR_FRAME_LENGTH_BYTES + 2U); } /// /// Helper to test if the P25 ring buffer has free space. /// +/// /// True, if the P25 ring buffer has free space, otherwise false. -bool Modem::hasP25Space() const +bool Modem::hasP25Space(uint32_t length) const { - uint32_t space = m_txP25Data.freeSpace() / (p25::P25_LDU_FRAME_LENGTH_BYTES + 4U); - return space > 1U; + return m_p25Space >= length; } /// @@ -1119,8 +1022,7 @@ bool Modem::hasP25Space() const /// True, if the NXDN ring buffer has free space, otherwise false. bool Modem::hasNXDNSpace() const { - uint32_t space = m_txNXDNData.freeSpace() / (nxdn::NXDN_FRAME_LENGTH_BYTES + 4U); - return space > 1U; + return m_nxdnSpace >= nxdn::NXDN_FRAME_LENGTH_BYTES; } /// @@ -1182,9 +1084,7 @@ bool Modem::hasError() const /// void Modem::clearDMRData1() { - if (!m_txDMRData1.isEmpty()) { - m_txDMRData1.clear(); - } + // TODO -- implement modem side buffer clear } /// @@ -1192,9 +1092,7 @@ void Modem::clearDMRData1() /// void Modem::clearDMRData2() { - if (!m_txDMRData2.isEmpty()) { - m_txDMRData2.clear(); - } + // TODO -- implement modem side buffer clear } /// @@ -1202,19 +1100,15 @@ void Modem::clearDMRData2() /// void Modem::clearP25Data() { - if (!m_txP25Data.isEmpty()) { - m_txP25Data.clear(); - - uint8_t buffer[3U]; + uint8_t buffer[3U]; - buffer[0U] = DVM_FRAME_START; - buffer[1U] = 3U; - buffer[2U] = CMD_P25_CLEAR; + buffer[0U] = DVM_FRAME_START; + buffer[1U] = 3U; + buffer[2U] = CMD_P25_CLEAR; #if DEBUG_MODEM - Utils::dump(1U, "Modem::clearP25Data(), Written", buffer, 3U); + Utils::dump(1U, "Modem::clearP25Data(), Written", buffer, 3U); #endif - write(buffer, 3U); - } + write(buffer, 3U); } /// @@ -1222,9 +1116,7 @@ void Modem::clearP25Data() /// void Modem::clearNXDNData() { - if (!m_txNXDNData.isEmpty()) { - m_txNXDNData.clear(); - } + // TODO -- implement modem side buffer clear } /// @@ -1347,7 +1239,7 @@ void Modem::injectNXDNData(const uint8_t* data, uint32_t length) /// Data to write to ring buffer. /// Length of data to write. /// True, if data is written, otherwise false. -bool Modem::writeDMRData1(const uint8_t* data, uint32_t length, bool immediate) +bool Modem::writeDMRData1(const uint8_t* data, uint32_t length) { #if defined(ENABLE_DMR) assert(data != nullptr); @@ -1374,23 +1266,22 @@ bool Modem::writeDMRData1(const uint8_t* data, uint32_t length, bool immediate) uint8_t len = length + 2U; // write or buffer DMR slot 1 data to air interface - if (immediate && m_dmrSpace1 > 1U) { + if (m_dmrSpace1 >= length) { if (m_debug) LogDebug(LOG_MODEM, "Modem::writeDMRData1(); immediate write (len %u)", length); //if (m_trace) // Utils::dump(1U, "Immediate TX DMR Data 1", m_buffer, len); int ret = write(buffer, len); - if (ret != int(len)) + if (ret != int(len)) { LogError(LOG_MODEM, "Error writing DMR slot 1 data"); + return false; + } - m_playoutTimer.start(); - - m_dmrSpace1--; + m_dmrSpace1 -= length; } else { - m_txDMRData1.addData(&len, 1U); - m_txDMRData1.addData(buffer, len); + return false; } return true; @@ -1404,9 +1295,8 @@ bool Modem::writeDMRData1(const uint8_t* data, uint32_t length, bool immediate) /// /// Data to write to ring buffer. /// Length of data to write. -/// Flag indicating data should be immediately written. /// True, if data is written, otherwise false. -bool Modem::writeDMRData2(const uint8_t* data, uint32_t length, bool immediate) +bool Modem::writeDMRData2(const uint8_t* data, uint32_t length) { #if defined(ENABLE_DMR) assert(data != nullptr); @@ -1433,23 +1323,22 @@ bool Modem::writeDMRData2(const uint8_t* data, uint32_t length, bool immediate) uint8_t len = length + 2U; // write or buffer DMR slot 2 data to air interface - if (immediate && m_dmrSpace2 > 1U) { + if (m_dmrSpace2 >= length) { if (m_debug) LogDebug(LOG_MODEM, "Modem::writeDMRData2(); immediate write (len %u)", length); //if (m_trace) // Utils::dump(1U, "Immediate TX DMR Data 2", m_buffer, len); int ret = write(buffer, len); - if (ret != int(len)) + if (ret != int(len)) { LogError(LOG_MODEM, "Error writing DMR slot 2 data"); + return false; + } - m_playoutTimer.start(); - - m_dmrSpace2--; + m_dmrSpace2 -= length; } else { - m_txDMRData2.addData(&len, 1U); - m_txDMRData2.addData(buffer, len); + return false; } return true; @@ -1463,9 +1352,8 @@ bool Modem::writeDMRData2(const uint8_t* data, uint32_t length, bool immediate) /// /// Data to write to ring buffer. /// Length of data to write. -/// Flag indicating data should be immediately written. /// True, if data is written, otherwise false. -bool Modem::writeP25Data(const uint8_t* data, uint32_t length, bool immediate) +bool Modem::writeP25Data(const uint8_t* data, uint32_t length) { #if defined(ENABLE_P25) assert(data != nullptr); @@ -1492,23 +1380,22 @@ bool Modem::writeP25Data(const uint8_t* data, uint32_t length, bool immediate) uint8_t len = length + 2U; // write or buffer P25 data to air interface - if (immediate && m_p25Space > 1U) { + if (m_p25Space >= length) { if (m_debug) LogDebug(LOG_MODEM, "Modem::writeP25Data(); immediate write (len %u)", length); //if (m_trace) // Utils::dump(1U, "Immediate TX P25 Data", m_buffer, len); int ret = write(buffer, len); - if (ret != int(len)) + if (ret != int(len)) { LogError(LOG_MODEM, "Error writing P25 data"); + return false; + } - m_playoutTimer.start(); - - m_p25Space--; + m_p25Space -= length; } else { - m_txP25Data.addData(&len, 1U); - m_txP25Data.addData(buffer, len); + return false; } return true; @@ -1522,9 +1409,8 @@ bool Modem::writeP25Data(const uint8_t* data, uint32_t length, bool immediate) /// /// Data to write to ring buffer. /// Length of data to write. -/// Flag indicating data should be immediately written. /// True, if data is written, otherwise false. -bool Modem::writeNXDNData(const uint8_t* data, uint32_t length, bool immediate) +bool Modem::writeNXDNData(const uint8_t* data, uint32_t length) { #if defined(ENABLE_NXDN) assert(data != nullptr); @@ -1551,23 +1437,22 @@ bool Modem::writeNXDNData(const uint8_t* data, uint32_t length, bool immediate) uint8_t len = length + 2U; // write or buffer NXDN data to air interface - if (immediate && m_nxdnSpace > 1U) { + if (m_nxdnSpace >= length) { if (m_debug) LogDebug(LOG_MODEM, "Modem::writeNXDNData(); immediate write (len %u)", length); //if (m_trace) // Utils::dump(1U, "Immediate TX NXDN Data", m_buffer, len); int ret = write(buffer, len); - if (ret != int(len)) + if (ret != int(len)) { LogError(LOG_MODEM, "Error writing NXDN data"); + return false; + } - m_playoutTimer.start(); - - m_nxdnSpace--; + m_nxdnSpace -= length; } else { - m_txNXDNData.addData(&len, 1U); - m_txNXDNData.addData(buffer, len); + return false; } return true; @@ -1645,11 +1530,6 @@ bool Modem::writeDMRShortLC(const uint8_t* lc) bool Modem::writeDMRAbort(uint32_t slotNo) { #if defined(ENABLE_DMR) - if (slotNo == 1U) - m_txDMRData1.clear(); - else - m_txDMRData2.clear(); - uint8_t buffer[4U]; buffer[0U] = DVM_FRAME_START; @@ -2029,8 +1909,6 @@ bool Modem::writeConfig() return false; } - m_playoutTimer.start(); - return true; } @@ -2096,8 +1974,6 @@ bool Modem::writeSymbolAdjust() return false; } - m_playoutTimer.start(); - return true; } diff --git a/modem/Modem.h b/modem/Modem.h index 7d9924b9..d00b561e 100644 --- a/modem/Modem.h +++ b/modem/Modem.h @@ -277,7 +277,7 @@ namespace modem /// Helper to test if the DMR Slot 2 ring buffer has free space. bool hasDMRSpace2() const; /// Helper to test if the P25 ring buffer has free space. - bool hasP25Space() const; + bool hasP25Space(uint32_t length) const; /// Helper to test if the NXDN ring buffer has free space. bool hasNXDNSpace() const; @@ -316,13 +316,13 @@ namespace modem void injectNXDNData(const uint8_t* data, uint32_t length); /// Writes DMR Slot 1 frame data to the DMR Slot 1 ring buffer. - bool writeDMRData1(const uint8_t* data, uint32_t length, bool immediate = false); + bool writeDMRData1(const uint8_t* data, uint32_t length); /// Writes DMR Slot 2 frame data to the DMR Slot 2 ring buffer. - bool writeDMRData2(const uint8_t* data, uint32_t length, bool immediate = false); + bool writeDMRData2(const uint8_t* data, uint32_t length); /// Writes P25 frame data to the P25 ring buffer. - bool writeP25Data(const uint8_t* data, uint32_t length, bool immediate = false); + bool writeP25Data(const uint8_t* data, uint32_t length); /// Writes NXDN frame data to the NXDN ring buffer. - bool writeNXDNData(const uint8_t* data, uint32_t length, bool immediate = false); + bool writeNXDNData(const uint8_t* data, uint32_t length); /// Triggers the start of DMR transmit. bool writeDMRStart(bool tx); @@ -439,12 +439,8 @@ namespace modem RingBuffer m_rxDMRData1; RingBuffer m_rxDMRData2; - RingBuffer m_txDMRData1; - RingBuffer m_txDMRData2; RingBuffer m_rxP25Data; - RingBuffer m_txP25Data; RingBuffer m_rxNXDNData; - RingBuffer m_txNXDNData; bool m_useDFSI; @@ -496,9 +492,6 @@ namespace modem __READONLY_PROPERTY(bool, trace, Trace); /// Flag indicating if modem debugging is enabled. __READONLY_PROPERTY(bool, debug, Debug); - - /// Modem packet playout timer. - __READONLY_PROPERTY(Timer, playoutTimer, PlayoutTimer); }; } // namespace modem diff --git a/p25/Control.cpp b/p25/Control.cpp index 0a6b0d18..083d483b 100644 --- a/p25/Control.cpp +++ b/p25/Control.cpp @@ -549,6 +549,21 @@ bool Control::processFrame(uint8_t* data, uint32_t len) return ret; } +/// +/// Get the frame data length for the next frame in the data ring buffer. +/// +/// Length of frame data retreived. +uint32_t Control::peekFrameLength() +{ + if (m_queue.isEmpty()) + return 0U; + + uint8_t len = 0U; + m_queue.peek(&len, 1U); + + return len; +} + /// /// Get frame data from data ring buffer. /// @@ -786,9 +801,9 @@ void Control::addFrame(const uint8_t* data, uint32_t length, bool net) return; } - if (m_writeImmediate && m_modem->hasP25Space() && m_modem->getState() == modem::STATE_P25) { + if (m_writeImmediate && m_modem->hasP25Space(length) && m_modem->getState() == modem::STATE_P25) { m_writeImmediate = false; - m_modem->writeP25Data(data, length, true); + m_modem->writeP25Data(data, length); } else { uint32_t space = m_queue.freeSpace(); diff --git a/p25/Control.h b/p25/Control.h index b891b514..7328c4aa 100644 --- a/p25/Control.h +++ b/p25/Control.h @@ -98,6 +98,8 @@ namespace p25 /// Process a data frame from the RF interface. bool processFrame(uint8_t* data, uint32_t len); + /// Get the frame data length for the next frame in the data ring buffer. + uint32_t peekFrameLength(); /// Get frame data from data ring buffer. uint32_t getFrame(uint8_t* data);