From 36e2f202c39eb1ac62d82e068ab7e7cf2c370519 Mon Sep 17 00:00:00 2001 From: Jonathan Naylor Date: Tue, 12 Jul 2016 19:02:36 +0100 Subject: [PATCH] Simplify the frame numbering logic. --- YSFControl.cpp | 28 +++++++++++++--------------- YSFControl.h | 1 - 2 files changed, 13 insertions(+), 16 deletions(-) diff --git a/YSFControl.cpp b/YSFControl.cpp index 43ddf1a..dfb8f7f 100644 --- a/YSFControl.cpp +++ b/YSFControl.cpp @@ -52,7 +52,6 @@ m_lastMode(YSF_DT_VOICE_FR_MODE), m_netN(0U), m_rfPayload(), m_netPayload(), -m_netSeqNo(0U), m_fp(NULL) { assert(display != NULL); @@ -354,6 +353,7 @@ void CYSFControl::writeEndNet() m_netTimeoutTimer.stop(); m_networkWatchdog.stop(); + m_packetTimer.stop(); m_netPayload.reset(); @@ -377,7 +377,13 @@ void CYSFControl::writeNetwork() bool gateway = ::memcmp(data + 4U, "GATEWAY ", YSF_CALLSIGN_LENGTH) == 0; + unsigned char n = (data[34U] & 0xFEU) >> 1; + bool end = (data[34U] & 0x01U) == 0x01U; + if (!m_netTimeoutTimer.isRunning()) { + if (end) + return; + if (::memcmp(data + 14U, " ", YSF_CALLSIGN_LENGTH) != 0) ::memcpy(m_netSource, data + 14U, YSF_CALLSIGN_LENGTH); else @@ -400,14 +406,11 @@ void CYSFControl::writeNetwork() m_netLost = 0U; m_netErrs = 0U; m_netBits = 1U; - m_netSeqNo = 0U; m_netN = 0U; } else { // Check for duplicate frames, if we can - if (m_netSeqNo == data[34U]) { - LogDebug("YSF, removing network duplicate, seq %u", data[34U] >> 1); + if (m_netN == n) return; - } bool changed = false; @@ -427,12 +430,6 @@ void CYSFControl::writeNetwork() } } - m_netFrames++; - m_netSeqNo = data[34U]; - - unsigned char n = (data[34U] & 0xFEU) >> 1; - bool end = (data[34U] & 0x01U) == 0x01U; - data[33U] = end ? TAG_EOT : TAG_DATA; data[34U] = 0x00U; @@ -448,6 +445,10 @@ void CYSFControl::writeNetwork() unsigned char ft = fich.getFT(); unsigned char fi = fich.getFI(); + fich.setVoIP(true); + fich.setMR(YSF_MR_BUSY); + fich.encode(data + 35U); + m_lastMode = dt; // Set the downlink callsign @@ -509,10 +510,6 @@ void CYSFControl::writeNetwork() default: break; } - - fich.setVoIP(true); - fich.setMR(YSF_MR_BUSY); - fich.encode(data + 35U); } else { send = insertSilence(data + 33U, n); } @@ -520,6 +517,7 @@ void CYSFControl::writeNetwork() if (send) { writeQueueNet(data + 33U); m_packetTimer.start(); + m_netFrames++; m_netN = n; } diff --git a/YSFControl.h b/YSFControl.h index 4b7bce2..caf3e69 100644 --- a/YSFControl.h +++ b/YSFControl.h @@ -70,7 +70,6 @@ private: unsigned char m_netN; CYSFPayload m_rfPayload; CYSFPayload m_netPayload; - unsigned char m_netSeqNo; FILE* m_fp; void writeQueueRF(const unsigned char* data);