diff --git a/DStarControl.cpp b/DStarControl.cpp index 2406500..38a37cd 100644 --- a/DStarControl.cpp +++ b/DStarControl.cpp @@ -354,7 +354,6 @@ bool CDStarControl::writeModem(unsigned char *data, unsigned int len) // 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_rfSlowData.start(); - m_rfN = 0U; m_rfState = RPT_RF_STATE::LATE_ENTRY; } @@ -370,7 +369,7 @@ bool CDStarControl::writeModem(unsigned char *data, unsigned int len) } if (m_rfState == RPT_RF_STATE::AUDIO) { - m_rfSlowData.peakSlowData(data + 1U, m_rfN); + m_rfSlowData.peakSlowData(data + 1U); unsigned char type = m_rfSlowData.getType(); if (type == DSTAR_SLOW_DATA_TYPE_FASTDATA_BEGIN) { @@ -380,6 +379,12 @@ bool CDStarControl::writeModem(unsigned char *data, unsigned int len) } if (m_rfState == RPT_RF_STATE::DATA) { + // Send the RSSI data to the display + if (m_rfN == 0U) { + CSync::addDStarSync(data + 1U); + m_display->writeDStarRSSI(m_rssi); + } + LogDebug("D-Star, fast data sequence no. %u", m_rfN); m_rfBits += 48U; @@ -391,7 +396,7 @@ bool CDStarControl::writeModem(unsigned char *data, unsigned int len) if (m_duplex) writeQueueDataRF(data); - m_rfSlowData.peakSlowData(data + 1U, m_rfN); + m_rfSlowData.peakSlowData(data + 1U); bool complete = m_rfSlowData.isComplete(); if (complete) { @@ -405,8 +410,10 @@ bool CDStarControl::writeModem(unsigned char *data, unsigned int len) m_rfN = (m_rfN + 1U) % 21U; } else if (m_rfState == RPT_RF_STATE::AUDIO) { // Send the RSSI data to the display - if (m_rfN == 0U) + if (m_rfN == 0U) { + CSync::addDStarSync(data + 1U); m_display->writeDStarRSSI(m_rssi); + } unsigned int errors = 0U; if (::memcmp(data + 1U, DSTAR_nullptr_AMBE_DATA_BYTES_SCRAMBLED, DSTAR_VOICE_FRAME_LENGTH_BYTES) == 0) { @@ -422,7 +429,7 @@ bool CDStarControl::writeModem(unsigned char *data, unsigned int len) m_rfFrames++; if (m_rfN != 0U) { - const unsigned char* text = m_rfSlowData.addText(data + 1U, m_rfN); + const unsigned char* text = m_rfSlowData.addText(data + 1U); if (text != nullptr) LogMessage("D-Star, RF slow data text = \"%s\"", text); } @@ -442,14 +449,11 @@ bool CDStarControl::writeModem(unsigned char *data, unsigned int len) // 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_rfSlowData.reset(); - m_rfN = 0U; return false; } else { - CDStarHeader* header = m_rfSlowData.addHeader(data + 1U, m_rfN); - if (header == nullptr) { - m_rfN = (m_rfN + 1U) % 21U; + CDStarHeader* header = m_rfSlowData.addHeader(data + 1U); + if (header == nullptr) return false; - } m_rfHeader = *header; delete header; @@ -744,7 +748,7 @@ void CDStarControl::writeNetwork() if (::memcmp(data + 1U + DSTAR_VOICE_FRAME_LENGTH_BYTES, DSTAR_SYNC_BYTES, DSTAR_DATA_FRAME_LENGTH_BYTES) == 0) { m_netSlowData.start(); } else { - m_netSlowData.peakSlowData(data + 1U, n); + m_netSlowData.peakSlowData(data + 1U); if (m_netState == RPT_NET_STATE::AUDIO) { unsigned char type = m_netSlowData.getType(); @@ -782,7 +786,7 @@ void CDStarControl::writeNetwork() CSync::addDStarSync(data + 2U); m_netSlowData.start(); } else { - const unsigned char* text = m_netSlowData.addText(data + 2U, m_netN); + const unsigned char* text = m_netSlowData.addText(data + 2U); if (text != nullptr) LogMessage("D-Star, network slow data text = \"%s\"", text); } @@ -808,7 +812,7 @@ void CDStarControl::writeNetwork() CSync::addDStarSync(data + 2U); m_netSlowData.start(); } else { - m_netSlowData.peakSlowData(data + 2U, m_netN); + m_netSlowData.peakSlowData(data + 2U); bool complete = m_netSlowData.isComplete(); if (complete) { unsigned char type = m_netSlowData.getType(); diff --git a/DStarSlowData.cpp b/DStarSlowData.cpp index 686dc76..3ada8b8 100644 --- a/DStarSlowData.cpp +++ b/DStarSlowData.cpp @@ -33,8 +33,8 @@ m_buffer(nullptr), m_text(nullptr), m_textPtr(0U), m_textBits(0x00U), -m_type(0x00U), -m_complete(false) +m_state(SDD_STATE::FIRST), +m_type(0x00U) { m_header = new unsigned char[50U]; // DSTAR_HEADER_LENGTH_BYTES m_buffer = new unsigned char[DSTAR_DATA_FRAME_LENGTH_BYTES * 2U]; @@ -48,33 +48,41 @@ CDStarSlowData::~CDStarSlowData() delete[] m_text; } -void CDStarSlowData::peakSlowData(const unsigned char* data, unsigned int n) +void CDStarSlowData::peakSlowData(const unsigned char* data) { assert(data != nullptr); - if ((n % 2U) == 0U) { + switch (m_state) { + case SDD_STATE::FIRST: m_type = data[9U] ^ DSTAR_SCRAMBLER_BYTES[0U]; - m_complete = false; - } else { - m_complete = true; + m_state = SDD_STATE::SECOND; + break; + + case SDD_STATE::SECOND: + m_state = SDD_STATE::FIRST; + break; } } -CDStarHeader* CDStarSlowData::addHeader(const unsigned char* data, unsigned int n) +CDStarHeader* CDStarSlowData::addHeader(const unsigned char* data) { assert(data != nullptr); - if ((n % 2U) == 0U) { + switch (m_state) { + case SDD_STATE::FIRST: m_type = data[9U] ^ DSTAR_SCRAMBLER_BYTES[0U]; m_buffer[0U] = data[9U] ^ DSTAR_SCRAMBLER_BYTES[0U]; m_buffer[1U] = data[10U] ^ DSTAR_SCRAMBLER_BYTES[1U]; m_buffer[2U] = data[11U] ^ DSTAR_SCRAMBLER_BYTES[2U]; - m_complete = false; - } else { + m_state = SDD_STATE::SECOND; + return nullptr; + + case SDD_STATE::SECOND: m_buffer[3U] = data[9U] ^ DSTAR_SCRAMBLER_BYTES[0U]; m_buffer[4U] = data[10U] ^ DSTAR_SCRAMBLER_BYTES[1U]; m_buffer[5U] = data[11U] ^ DSTAR_SCRAMBLER_BYTES[2U]; - m_complete = true; + m_state = SDD_STATE::FIRST; + break; } if ((m_buffer[0U] & DSTAR_SLOW_DATA_TYPE_MASK) != DSTAR_SLOW_DATA_TYPE_HEADER) @@ -105,21 +113,25 @@ CDStarHeader* CDStarSlowData::addHeader(const unsigned char* data, unsigned int return new CDStarHeader(m_header); } -const unsigned char* CDStarSlowData::addText(const unsigned char* data, unsigned int n) +const unsigned char* CDStarSlowData::addText(const unsigned char* data) { assert(data != nullptr); - if ((n % 2U) == 0U) { + switch (m_state) { + case SDD_STATE::FIRST: m_type = data[9U] ^ DSTAR_SCRAMBLER_BYTES[0U]; m_buffer[0U] = data[9U] ^ DSTAR_SCRAMBLER_BYTES[0U]; m_buffer[1U] = data[10U] ^ DSTAR_SCRAMBLER_BYTES[1U]; m_buffer[2U] = data[11U] ^ DSTAR_SCRAMBLER_BYTES[2U]; - m_complete = false; - } else { + m_state = SDD_STATE::SECOND; + return nullptr; + + case SDD_STATE::SECOND: m_buffer[3U] = data[9U] ^ DSTAR_SCRAMBLER_BYTES[0U]; m_buffer[4U] = data[10U] ^ DSTAR_SCRAMBLER_BYTES[1U]; m_buffer[5U] = data[11U] ^ DSTAR_SCRAMBLER_BYTES[2U]; - m_complete = true; + m_state = SDD_STATE::FIRST; + break; } switch (m_buffer[0U]) { @@ -179,16 +191,16 @@ void CDStarSlowData::start() ::memset(m_header, 0x00U, DSTAR_HEADER_LENGTH_BYTES); m_ptr = 0U; + m_state = SDD_STATE::FIRST; m_type = 0x00U; - m_complete = false; m_textBits = 0x00U; } void CDStarSlowData::reset() { m_ptr = 0U; + m_state = SDD_STATE::FIRST; m_type = 0x00U; - m_complete = false; m_textBits = 0x00U; } @@ -250,5 +262,5 @@ unsigned char CDStarSlowData::getType() const bool CDStarSlowData::isComplete() const { - return m_complete; + return m_state == SDD_STATE::FIRST; } diff --git a/DStarSlowData.h b/DStarSlowData.h index ee529d5..60493cd 100644 --- a/DStarSlowData.h +++ b/DStarSlowData.h @@ -26,11 +26,11 @@ public: CDStarSlowData(); ~CDStarSlowData(); - void peakSlowData(const unsigned char* data, unsigned int n); + void peakSlowData(const unsigned char* data); - CDStarHeader* addHeader(const unsigned char* data, unsigned int n); + CDStarHeader* addHeader(const unsigned char* data); - const unsigned char* addText(const unsigned char* data, unsigned int n); + const unsigned char* addText(const unsigned char* data); unsigned char getType() const; bool isComplete() const; @@ -48,8 +48,14 @@ private: unsigned char* m_text; unsigned int m_textPtr; unsigned char m_textBits; + + enum class SDD_STATE { + FIRST, + SECOND + }; + + SDD_STATE m_state; unsigned char m_type; - bool m_complete; }; #endif diff --git a/Version.h b/Version.h index 40c3f4e..4fbb622 100644 --- a/Version.h +++ b/Version.h @@ -19,6 +19,6 @@ #if !defined(VERSION_H) #define VERSION_H -const char* VERSION = "20250314"; +const char* VERSION = "20250327"; #endif