diff --git a/YSFControl.cpp b/YSFControl.cpp index b556c54..b1e4df4 100644 --- a/YSFControl.cpp +++ b/YSFControl.cpp @@ -47,6 +47,8 @@ m_netSource(NULL), m_netDest(NULL), m_rfPayload(), m_netPayload(), +m_netSeqNo(0U), +m_netCsum(0U), m_fp(NULL) { assert(display != NULL); @@ -379,11 +381,17 @@ void CYSFControl::writeNetwork() m_netTimeoutTimer.start(); m_netPayload.reset(); - m_netState = RS_NET_AUDIO; + m_netState = RS_NET_AUDIO; m_netFrames = 0U; - m_netErrs = 0U; - m_netBits = 1U; + m_netErrs = 0U; + m_netBits = 1U; + m_netSeqNo = 0U; + m_netCsum = 0U; } else { + // Check for duplicate frames, if we can + if (m_netSeqNo == data[34U] && m_netSeqNo != 0U) + return; + bool changed = false; if (::memcmp(data + 14U, " ", YSF_CALLSIGN_LENGTH) != 0 && ::memcmp(m_netSource, "??????????", YSF_CALLSIGN_LENGTH) == 0) { @@ -403,6 +411,7 @@ void CYSFControl::writeNetwork() } m_netFrames++; + m_netSeqNo = data[34U]; unsigned char n = (data[34U] & 0xFEU) >> 1; bool end = (data[34U] & 0x01U) == 0x01U; @@ -418,6 +427,17 @@ void CYSFControl::writeNetwork() unsigned char fi = fich.getFI(); unsigned char ft = fich.getFT(); + // XXX temporary duplicate removal, remove when everyone has upgraded their MMDVM Host + unsigned int csum = 0U; + for (unsigned int i = 0U; i < YSF_FRAME_LENGTH_BYTES; i++) + csum += data[i + 35U]; + + if (csum == m_netCsum) + return; + + m_netCsum = csum; + // XXX temporary duplicate removal, remove when everyone has upgraded their MMDVM Host + // Set the downlink callsign switch (fi) { case YSF_FI_HEADER: diff --git a/YSFControl.h b/YSFControl.h index 5acfe4b..6d3664c 100644 --- a/YSFControl.h +++ b/YSFControl.h @@ -64,6 +64,8 @@ private: unsigned char* m_netDest; CYSFPayload m_rfPayload; CYSFPayload m_netPayload; + unsigned char m_netSeqNo; + unsigned int m_netCsum; FILE* m_fp; void writeQueueRF(const unsigned char* data);