From bfb74d3155dbdf503a88923048fc6765e5e32789 Mon Sep 17 00:00:00 2001 From: Jonathan Naylor Date: Mon, 7 Mar 2016 18:08:50 +0000 Subject: [PATCH] Add extra debughing of the output queues. --- DMRSlot.cpp | 34 +++++++++++++++------- DMRSlot.h | 2 +- DStarControl.cpp | 74 +++++++++++++++++++++++++++++++++++++----------- DStarControl.h | 2 +- YSFControl.cpp | 7 +++++ 5 files changed, 91 insertions(+), 28 deletions(-) diff --git a/DMRSlot.cpp b/DMRSlot.cpp index c288241..b3b4e58 100644 --- a/DMRSlot.cpp +++ b/DMRSlot.cpp @@ -44,7 +44,7 @@ bool CDMRSlot::m_voice2 = true; CDMRSlot::CDMRSlot(unsigned int slotNo, unsigned int timeout) : m_slotNo(slotNo), -m_rfQueue(1000U, "DMR Slot"), +m_queue(1000U, "DMR Slot"), m_rfState(RS_RF_LISTENING), m_netState(RS_NET_IDLE), m_rfEmbeddedLC(), @@ -502,13 +502,13 @@ void CDMRSlot::writeModem(unsigned char *data) unsigned int CDMRSlot::readModem(unsigned char* data) { - if (m_rfQueue.isEmpty()) + if (m_queue.isEmpty()) return 0U; unsigned char len = 0U; - m_rfQueue.getData(&len, 1U); + m_queue.getData(&len, 1U); - m_rfQueue.getData(data, len); + m_queue.getData(data, len); return len; } @@ -1059,13 +1059,20 @@ void CDMRSlot::writeQueueRF(const unsigned char *data) return; unsigned char len = DMR_FRAME_LENGTH_BYTES + 2U; - m_rfQueue.addData(&len, 1U); + + unsigned int space = m_queue.freeSpace(); + if (space < (len + 1U)) { + LogError("DMR Slot %u, overflow in the DMR slot RF queue", m_slotNo); + return; + } + + m_queue.addData(&len, 1U); // If the timeout has expired, replace the audio with idles to keep the slot busy if (m_rfTimeoutTimer.isRunning() && m_rfTimeoutTimer.hasExpired()) - m_rfQueue.addData(m_idle, len); + m_queue.addData(m_idle, len); else - m_rfQueue.addData(data, len); + m_queue.addData(data, len); } void CDMRSlot::writeNetworkRF(const unsigned char* data, unsigned char dataType, FLCO flco, unsigned int srcId, unsigned int dstId) @@ -1109,13 +1116,20 @@ void CDMRSlot::writeNetworkRF(const unsigned char* data, unsigned char dataType) void CDMRSlot::writeQueueNet(const unsigned char *data) { unsigned char len = DMR_FRAME_LENGTH_BYTES + 2U; - m_rfQueue.addData(&len, 1U); + + unsigned int space = m_queue.freeSpace(); + if (space < (len + 1U)) { + LogError("DMR Slot %u, overflow in the DMR slot RF queue", m_slotNo); + return; + } + + m_queue.addData(&len, 1U); // If the timeout has expired, replace the audio with idles to keep the slot busy if (m_netTimeoutTimer.isRunning() && m_netTimeoutTimer.hasExpired()) - m_rfQueue.addData(m_idle, len); + m_queue.addData(m_idle, len); else - m_rfQueue.addData(data, len); + m_queue.addData(data, len); } void CDMRSlot::init(unsigned int colorCode, CModem* modem, CDMRIPSC* network, IDisplay* display, bool duplex) diff --git a/DMRSlot.h b/DMRSlot.h index 5649d6b..3edd084 100644 --- a/DMRSlot.h +++ b/DMRSlot.h @@ -51,7 +51,7 @@ public: private: unsigned int m_slotNo; - CRingBuffer m_rfQueue; + CRingBuffer m_queue; RPT_RF_STATE m_rfState; RPT_NET_STATE m_netState; CDMREmbeddedLC m_rfEmbeddedLC; diff --git a/DStarControl.cpp b/DStarControl.cpp index d763251..b7af2b5 100644 --- a/DStarControl.cpp +++ b/DStarControl.cpp @@ -29,7 +29,7 @@ m_gateway(NULL), m_network(network), m_display(display), m_duplex(duplex), -m_rfQueue(1000U, "D-Star Control"), +m_queue(1000U, "D-Star Control"), m_rfHeader(), m_netHeader(), m_rfState(RS_RF_LISTENING), @@ -343,7 +343,7 @@ bool CDStarControl::writeModem(unsigned char *data) unsigned int CDStarControl::readModem(unsigned char* data) { - if (m_rfQueue.isEmpty()) + if (m_queue.isEmpty()) return 0U; // Don't relay data until the timer has stopped. @@ -351,9 +351,9 @@ unsigned int CDStarControl::readModem(unsigned char* data) return 0U; unsigned char len = 0U; - m_rfQueue.getData(&len, 1U); + m_queue.getData(&len, 1U); - m_rfQueue.getData(data, len); + m_queue.getData(data, len); return len; } @@ -565,9 +565,16 @@ void CDStarControl::writeQueueHeaderRF(const unsigned char *data) return; unsigned char len = DSTAR_HEADER_LENGTH_BYTES + 1U; - m_rfQueue.addData(&len, 1U); - m_rfQueue.addData(data, len); + unsigned int space = m_queue.freeSpace(); + if (space < (len + 1U)) { + LogError("D-Star, overflow in the D-Star RF queue"); + return; + } + + m_queue.addData(&len, 1U); + + m_queue.addData(data, len); } void CDStarControl::writeQueueDataRF(const unsigned char *data) @@ -581,9 +588,16 @@ void CDStarControl::writeQueueDataRF(const unsigned char *data) return; unsigned char len = DSTAR_FRAME_LENGTH_BYTES + 1U; - m_rfQueue.addData(&len, 1U); - m_rfQueue.addData(data, len); + unsigned int space = m_queue.freeSpace(); + if (space < (len + 1U)) { + LogError("D-Star, overflow in the D-Star RF queue"); + return; + } + + m_queue.addData(&len, 1U); + + m_queue.addData(data, len); } void CDStarControl::writeQueueEOTRF() @@ -595,10 +609,17 @@ void CDStarControl::writeQueueEOTRF() return; unsigned char len = 1U; - m_rfQueue.addData(&len, 1U); + + unsigned int space = m_queue.freeSpace(); + if (space < (len + 1U)) { + LogError("D-Star, overflow in the D-Star RF queue"); + return; + } + + m_queue.addData(&len, 1U); unsigned char data = TAG_EOT; - m_rfQueue.addData(&data, len); + m_queue.addData(&data, len); } void CDStarControl::writeQueueHeaderNet(const unsigned char *data) @@ -609,9 +630,16 @@ void CDStarControl::writeQueueHeaderNet(const unsigned char *data) return; unsigned char len = DSTAR_HEADER_LENGTH_BYTES + 1U; - m_rfQueue.addData(&len, 1U); - m_rfQueue.addData(data, len); + unsigned int space = m_queue.freeSpace(); + if (space < (len + 1U)) { + LogError("D-Star, overflow in the D-Star RF queue"); + return; + } + + m_queue.addData(&len, 1U); + + m_queue.addData(data, len); } void CDStarControl::writeQueueDataNet(const unsigned char *data) @@ -622,9 +650,16 @@ void CDStarControl::writeQueueDataNet(const unsigned char *data) return; unsigned char len = DSTAR_FRAME_LENGTH_BYTES + 1U; - m_rfQueue.addData(&len, 1U); - m_rfQueue.addData(data, len); + unsigned int space = m_queue.freeSpace(); + if (space < (len + 1U)) { + LogError("D-Star, overflow in the D-Star RF queue"); + return; + } + + m_queue.addData(&len, 1U); + + m_queue.addData(data, len); } void CDStarControl::writeQueueEOTNet() @@ -633,10 +668,17 @@ void CDStarControl::writeQueueEOTNet() return; unsigned char len = 1U; - m_rfQueue.addData(&len, 1U); + + unsigned int space = m_queue.freeSpace(); + if (space < (len + 1U)) { + LogError("D-Star, overflow in the D-Star RF queue"); + return; + } + + m_queue.addData(&len, 1U); unsigned char data = TAG_EOT; - m_rfQueue.addData(&data, len); + m_queue.addData(&data, len); } void CDStarControl::writeNetworkHeaderRF(const unsigned char* data) diff --git a/DStarControl.h b/DStarControl.h index 9dcdbf0..8e5ee93 100644 --- a/DStarControl.h +++ b/DStarControl.h @@ -50,7 +50,7 @@ private: CDStarNetwork* m_network; IDisplay* m_display; bool m_duplex; - CRingBuffer m_rfQueue; + CRingBuffer m_queue; CDStarHeader m_rfHeader; CDStarHeader m_netHeader; RPT_RF_STATE m_rfState; diff --git a/YSFControl.cpp b/YSFControl.cpp index 44175a1..61522aa 100644 --- a/YSFControl.cpp +++ b/YSFControl.cpp @@ -271,6 +271,13 @@ void CYSFControl::writeQueue(const unsigned char *data) return; unsigned char len = YSF_FRAME_LENGTH_BYTES + 2U; + + unsigned int space = m_queue.freeSpace(); + if (space < (len + 1U)) { + LogError("YSF, overflow in the System Fusion RF queue"); + return; + } + m_queue.addData(&len, 1U); m_queue.addData(data, len);