diff --git a/DStarControl.cpp b/DStarControl.cpp index e31586e..495d9bc 100644 --- a/DStarControl.cpp +++ b/DStarControl.cpp @@ -515,15 +515,18 @@ void CDStarControl::writeNetwork() unsigned char n = data[1U]; - insertSilence(data + 1U, n); - unsigned int errors = m_fec.regenerateDStar(data + 2U); + blankDTMF(data + 2U); + + // Insert silence and reject if in the past + bool ret = insertSilence(data + 2U, n); + if (!ret) + return; + m_netErrs += errors; m_netBits += 48U; - blankDTMF(data + 2U); - // Regenerate the sync if (n == 0U) CSync::addDStarSync(data + 2U); @@ -791,7 +794,7 @@ void CDStarControl::closeFile() } } -void CDStarControl::insertSilence(const unsigned char* data, unsigned char seqNo) +bool CDStarControl::insertSilence(const unsigned char* data, unsigned char seqNo) { assert(data != NULL); @@ -799,8 +802,8 @@ void CDStarControl::insertSilence(const unsigned char* data, unsigned char seqNo unsigned int oldSeqNo = (m_netN + 1U) % 21U; if (oldSeqNo == seqNo) { // Just copy the data, nothing else to do here - ::memcpy(m_lastFrame, data, DSTAR_FRAME_LENGTH_BYTES + 1U); - return; + ::memcpy(m_lastFrame, data + 1U, DSTAR_FRAME_LENGTH_BYTES + 1U); + return true; } LogDebug("D-Star, current=%u last=%u", seqNo, m_netN); @@ -811,10 +814,14 @@ void CDStarControl::insertSilence(const unsigned char* data, unsigned char seqNo else count = (21U + seqNo) - oldSeqNo; - if (count < 10U) - insertSilence(count); + if (count >= 10U) + return false; - ::memcpy(m_lastFrame, data, DSTAR_FRAME_LENGTH_BYTES + 1U); + insertSilence(count); + + ::memcpy(m_lastFrame, data + 1U, DSTAR_FRAME_LENGTH_BYTES + 1U); + + return true; } void CDStarControl::insertSilence(unsigned int count) diff --git a/DStarControl.h b/DStarControl.h index 192f1b2..18e5e1a 100644 --- a/DStarControl.h +++ b/DStarControl.h @@ -98,7 +98,7 @@ private: bool writeFile(const unsigned char* data, unsigned int length); void closeFile(); - void insertSilence(const unsigned char* data, unsigned char seqNo); + bool insertSilence(const unsigned char* data, unsigned char seqNo); void insertSilence(unsigned int count); void blankDTMF(unsigned char* data) const;