diff --git a/DMRSlot.cpp b/DMRSlot.cpp index c63b8bb..547fdbf 100644 --- a/DMRSlot.cpp +++ b/DMRSlot.cpp @@ -45,14 +45,15 @@ bool CDMRSlot::m_voice2 = true; CDMRSlot::CDMRSlot(unsigned int slotNo, unsigned int timeout) : m_slotNo(slotNo), -m_queue(1000U, "DMR Slot"), +m_rfQueue(1000U, "DMR Slot"), m_rfState(RS_RF_LISTENING), m_netState(RS_NET_IDLE), -m_embeddedLC(), +m_rfEmbeddedLC(), m_rfLC(NULL), m_netLC(NULL), -m_seqNo(0U), -m_n(0U), +m_netSeqNo(0U), +m_rfN(0U), +m_netN(0U), m_networkWatchdog(1000U, 0U, 1500U), m_rfTimeoutTimer(1000U, timeout), m_netTimeoutTimer(1000U, timeout), @@ -425,7 +426,7 @@ void CDMRSlot::writeModem(unsigned char *data) if (colorCode != m_colorCode) return; - m_rfLC = m_embeddedLC.addData(data + 2U, emb.getLCSS()); + m_rfLC = m_rfEmbeddedLC.addData(data + 2U, emb.getLCSS()); if (m_rfLC != NULL) { // Create a dummy start frame to replace the received frame unsigned char start[DMR_FRAME_LENGTH_BYTES + 2U]; @@ -494,13 +495,13 @@ void CDMRSlot::writeModem(unsigned char *data) unsigned int CDMRSlot::readModem(unsigned char* data) { - if (m_queue.isEmpty()) + if (m_rfQueue.isEmpty()) return 0U; unsigned char len = 0U; - m_queue.getData(&len, 1U); + m_rfQueue.getData(&len, 1U); - m_queue.getData(data, len); + m_rfQueue.getData(data, len); return len; } @@ -812,8 +813,8 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData) // Initialise the lost packet data if (m_netFrames == 0U) { ::memcpy(m_lastFrame, data, DMR_FRAME_LENGTH_BYTES + 2U); - m_seqNo = dmrData.getSeqNo(); - m_n = dmrData.getN(); + m_netSeqNo = dmrData.getSeqNo(); + m_netN = dmrData.getN(); m_elapsed.start(); m_netLost = 0U; } else { @@ -829,8 +830,8 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData) m_netFrames++; // Save details in case we need to infill data - m_seqNo = dmrData.getSeqNo(); - m_n = dmrData.getN(); + m_netSeqNo = dmrData.getSeqNo(); + m_netN = dmrData.getN(); #if defined(DUMP_DMR) writeFile(data); @@ -860,8 +861,8 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData) // Initialise the lost packet data if (m_netFrames == 0U) { ::memcpy(m_lastFrame, data, DMR_FRAME_LENGTH_BYTES + 2U); - m_seqNo = dmrData.getSeqNo(); - m_n = dmrData.getN(); + m_netSeqNo = dmrData.getSeqNo(); + m_netN = dmrData.getN(); m_elapsed.start(); m_netLost = 0U; } else { @@ -874,8 +875,8 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData) m_netFrames++; // Save details in case we need to infill data - m_seqNo = dmrData.getSeqNo(); - m_n = dmrData.getN(); + m_netSeqNo = dmrData.getSeqNo(); + m_netN = dmrData.getN(); #if defined(DUMP_DMR) writeFile(data); @@ -1022,13 +1023,13 @@ void CDMRSlot::writeQueueRF(const unsigned char *data) return; unsigned char len = DMR_FRAME_LENGTH_BYTES + 2U; - m_queue.addData(&len, 1U); + m_rfQueue.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_queue.addData(m_idle, len); + m_rfQueue.addData(m_idle, len); else - m_queue.addData(data, len); + m_rfQueue.addData(data, len); } void CDMRSlot::writeNetworkRF(const unsigned char* data, unsigned char dataType, FLCO flco, unsigned int srcId, unsigned int dstId) @@ -1051,10 +1052,10 @@ void CDMRSlot::writeNetworkRF(const unsigned char* data, unsigned char dataType, dmrData.setSrcId(srcId); dmrData.setDstId(dstId); dmrData.setFLCO(flco); - dmrData.setN(m_n); - dmrData.setSeqNo(m_seqNo); + dmrData.setN(m_netN); + dmrData.setSeqNo(m_netSeqNo); - m_seqNo++; + m_netSeqNo++; dmrData.setData(data + 2U); @@ -1072,13 +1073,13 @@ 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_queue.addData(&len, 1U); + m_rfQueue.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_queue.addData(m_idle, len); + m_rfQueue.addData(m_idle, len); else - m_queue.addData(data, len); + m_rfQueue.addData(data, len); } void CDMRSlot::init(unsigned int colorCode, CModem* modem, CDMRIPSC* network, IDisplay* display, bool duplex) @@ -1228,14 +1229,14 @@ void CDMRSlot::insertSilence(const unsigned char* data, unsigned char seqNo) assert(data != NULL); // Check to see if we have any spaces to fill? - unsigned char seq = m_seqNo + 1U; + unsigned char seq = m_netSeqNo + 1U; if (seq == seqNo) { // Just copy the data, nothing else to do here ::memcpy(m_lastFrame, data, DMR_FRAME_LENGTH_BYTES + 2U); return; } - unsigned int oldSeqNo = m_seqNo + 1U; + unsigned int oldSeqNo = m_netSeqNo + 1U; unsigned int newSeqNo = seqNo; unsigned int count; @@ -1260,8 +1261,8 @@ void CDMRSlot::insertSilence(unsigned int count) ::memcpy(data + 9U + 2U, data + 2U, 5U); // Copy the last audio block to the middle (1/2) ::memcpy(data + 19U + 2U, data + 4U + 2U, 5U); // Copy the last audio block to the middle (2/2) - unsigned char n = (m_n + 1U) % 6U; - unsigned char seqNo = m_seqNo + 1U; + unsigned char n = (m_netN + 1U) % 6U; + unsigned char seqNo = m_netSeqNo + 1U; for (unsigned int i = 0U; i < count; i++) { if (i > 0U) @@ -1280,8 +1281,8 @@ void CDMRSlot::insertSilence(unsigned int count) writeQueueNet(data); - m_seqNo = seqNo; - m_n = n; + m_netSeqNo = seqNo; + m_netN = n; m_netFrames++; m_netLost++; diff --git a/DMRSlot.h b/DMRSlot.h index 149c155..a6d0ffc 100644 --- a/DMRSlot.h +++ b/DMRSlot.h @@ -50,14 +50,15 @@ public: private: unsigned int m_slotNo; - CRingBuffer m_queue; + CRingBuffer m_rfQueue; RPT_RF_STATE m_rfState; RPT_NET_STATE m_netState; - CDMREmbeddedLC m_embeddedLC; + CDMREmbeddedLC m_rfEmbeddedLC; CDMRLC* m_rfLC; CDMRLC* m_netLC; - unsigned char m_seqNo; - unsigned char m_n; + unsigned char m_netSeqNo; + unsigned char m_netN; + unsigned char m_rfN; CTimer m_networkWatchdog; CTimer m_rfTimeoutTimer; CTimer m_netTimeoutTimer; diff --git a/DStarControl.cpp b/DStarControl.cpp index 2793c02..e3f210b 100644 --- a/DStarControl.cpp +++ b/DStarControl.cpp @@ -29,14 +29,15 @@ m_gateway(NULL), m_network(network), m_display(display), m_duplex(duplex), -m_queue(1000U, "D-Star Control"), +m_rfQueue(1000U, "D-Star Control"), m_rfHeader(), m_netHeader(), m_rfState(RS_RF_LISTENING), m_netState(RS_NET_IDLE), m_net(false), m_slowData(), -m_n(0U), +m_rfN(0U), +m_netN(0U), m_networkWatchdog(1000U, 0U, 1500U), m_holdoffTimer(1000U, 0U, 500U), m_rfTimeoutTimer(1000U, timeout), @@ -147,6 +148,7 @@ bool CDStarControl::writeModem(unsigned char *data) m_ackTimer.stop(); m_rfFrames = 1U; + m_rfN = 0U; if (m_duplex) { // Modify the header @@ -201,7 +203,6 @@ bool CDStarControl::writeModem(unsigned char *data) return false; } else if (m_rfState == RS_RF_AUDIO) { unsigned int errors = m_fec.regenerateDStar(data + 1U); - LogDebug("D-Star, audio sequence no. %u, errs: %u/48", m_n, errors); m_rfErrs += errors; m_rfBits += 48U; @@ -210,13 +211,15 @@ bool CDStarControl::writeModem(unsigned char *data) // The sync is regenerated by the modem so can do exact match if (::memcmp(data + 1U + DSTAR_VOICE_FRAME_LENGTH_BYTES, DSTAR_SYNC_BYTES, DSTAR_DATA_FRAME_LENGTH_BYTES) == 0) - m_n = 0U; + m_rfN = 0U; // Regenerate the sync - if (m_n == 0U) + if (m_rfN == 0U) CSync::addDStarSync(data + 1U); - m_n = (m_n + 1U) % 21U; + m_rfN = (m_rfN + 1U) % 21U; + + LogDebug("D-Star, audio sequence no. %u, errs: %u/48", m_rfN, errors); if (m_net) writeNetworkDataRF(data, errors, false); @@ -277,6 +280,7 @@ bool CDStarControl::writeModem(unsigned char *data) m_rfHeader = *header; + m_rfN = 0U; m_rfFrames = 1U; if (m_duplex) { @@ -309,11 +313,14 @@ bool CDStarControl::writeModem(unsigned char *data) delete header; unsigned int errors = m_fec.regenerateDStar(data + 1U); - LogDebug("D-Star, audio sequence no. %u, errs: %u/48", m_n, errors); m_rfErrs += errors; m_rfBits += 48U; + m_rfN = (m_rfN + 1U) % 21U; + + LogDebug("D-Star, audio sequence no. %u, errs: %u/48", m_rfN, errors); + if (m_net) writeNetworkDataRF(data, errors, false); @@ -338,7 +345,7 @@ bool CDStarControl::writeModem(unsigned char *data) unsigned int CDStarControl::readModem(unsigned char* data) { - if (m_queue.isEmpty()) + if (m_rfQueue.isEmpty()) return 0U; // Don't relay data until the timer has stopped. @@ -346,9 +353,9 @@ unsigned int CDStarControl::readModem(unsigned char* data) return 0U; unsigned char len = 0U; - m_queue.getData(&len, 1U); + m_rfQueue.getData(&len, 1U); - m_queue.getData(data, len); + m_rfQueue.getData(data, len); return len; } @@ -427,7 +434,7 @@ void CDStarControl::writeNetwork() m_netFrames = 0U; m_netLost = 0U; - m_n = 0U; + m_netN = 0U; m_netBits = 1U; m_netErrs = 0U; @@ -482,7 +489,7 @@ void CDStarControl::writeNetwork() if (n == 0U) CSync::addDStarSync(data + 2U); - m_n = n; + m_netN = n; m_packetTimer.start(); m_netFrames++; @@ -563,9 +570,9 @@ void CDStarControl::writeQueueHeaderRF(const unsigned char *data) return; unsigned char len = DSTAR_HEADER_LENGTH_BYTES + 1U; - m_queue.addData(&len, 1U); + m_rfQueue.addData(&len, 1U); - m_queue.addData(data, len); + m_rfQueue.addData(data, len); } void CDStarControl::writeQueueDataRF(const unsigned char *data) @@ -579,9 +586,9 @@ void CDStarControl::writeQueueDataRF(const unsigned char *data) return; unsigned char len = DSTAR_FRAME_LENGTH_BYTES + 1U; - m_queue.addData(&len, 1U); + m_rfQueue.addData(&len, 1U); - m_queue.addData(data, len); + m_rfQueue.addData(data, len); } void CDStarControl::writeQueueEOTRF() @@ -593,10 +600,10 @@ void CDStarControl::writeQueueEOTRF() return; unsigned char len = 1U; - m_queue.addData(&len, 1U); + m_rfQueue.addData(&len, 1U); unsigned char data = TAG_EOT; - m_queue.addData(&data, len); + m_rfQueue.addData(&data, len); } void CDStarControl::writeQueueHeaderNet(const unsigned char *data) @@ -607,9 +614,9 @@ void CDStarControl::writeQueueHeaderNet(const unsigned char *data) return; unsigned char len = DSTAR_HEADER_LENGTH_BYTES + 1U; - m_queue.addData(&len, 1U); + m_rfQueue.addData(&len, 1U); - m_queue.addData(data, len); + m_rfQueue.addData(data, len); } void CDStarControl::writeQueueDataNet(const unsigned char *data) @@ -620,9 +627,9 @@ void CDStarControl::writeQueueDataNet(const unsigned char *data) return; unsigned char len = DSTAR_FRAME_LENGTH_BYTES + 1U; - m_queue.addData(&len, 1U); + m_rfQueue.addData(&len, 1U); - m_queue.addData(data, len); + m_rfQueue.addData(data, len); } void CDStarControl::writeQueueEOTNet() @@ -631,10 +638,10 @@ void CDStarControl::writeQueueEOTNet() return; unsigned char len = 1U; - m_queue.addData(&len, 1U); + m_rfQueue.addData(&len, 1U); unsigned char data = TAG_EOT; - m_queue.addData(&data, len); + m_rfQueue.addData(&data, len); } void CDStarControl::writeNetworkHeaderRF(const unsigned char* data) @@ -710,14 +717,14 @@ void CDStarControl::insertSilence(const unsigned char* data, unsigned char seqNo assert(data != NULL); // Check to see if we have any spaces to fill? - unsigned char seq = (m_n + 1U) % 21U; + unsigned char seq = (m_netN + 1U) % 21U; if (seq == seqNo) { // Just copy the data, nothing else to do here ::memcpy(m_lastFrame, data, DSTAR_FRAME_LENGTH_BYTES + 1U); return; } - unsigned int oldSeqNo = (m_n + 1U) % 21U; + unsigned int oldSeqNo = (m_netN + 1U) % 21U; unsigned int newSeqNo = seqNo; unsigned int count; @@ -734,7 +741,7 @@ void CDStarControl::insertSilence(const unsigned char* data, unsigned char seqNo void CDStarControl::insertSilence(unsigned int count) { - unsigned char n = (m_n + 1U) % 21U; + unsigned char n = (m_netN + 1U) % 21U; for (unsigned int i = 0U; i < count; i++) { if (i < 3U) { @@ -746,7 +753,7 @@ void CDStarControl::insertSilence(unsigned int count) writeQueueDataNet(DSTAR_NULL_FRAME_DATA_BYTES); } - m_n = n; + m_netN = n; m_netFrames++; m_netLost++; diff --git a/DStarControl.h b/DStarControl.h index ac16768..9dcdbf0 100644 --- a/DStarControl.h +++ b/DStarControl.h @@ -50,14 +50,15 @@ private: CDStarNetwork* m_network; IDisplay* m_display; bool m_duplex; - CRingBuffer m_queue; + CRingBuffer m_rfQueue; CDStarHeader m_rfHeader; CDStarHeader m_netHeader; RPT_RF_STATE m_rfState; RPT_NET_STATE m_netState; bool m_net; CDStarSlowData m_slowData; - unsigned char m_n; + unsigned char m_rfN; + unsigned char m_netN; CTimer m_networkWatchdog; CTimer m_holdoffTimer; CTimer m_rfTimeoutTimer;