From 05b9c4d79baa2404a8e37466eb90d94f9620349f Mon Sep 17 00:00:00 2001 From: Jonathan Naylor Date: Thu, 17 Apr 2025 12:32:54 +0100 Subject: [PATCH] Clean up the slow data handling. --- DStarControl.cpp | 58 ++++++------------ DStarSlowData.cpp | 147 ++++++++++++++++++++-------------------------- DStarSlowData.h | 14 +++-- Version.h | 2 +- 4 files changed, 91 insertions(+), 130 deletions(-) diff --git a/DStarControl.cpp b/DStarControl.cpp index 38a37cd..d2a3d37 100644 --- a/DStarControl.cpp +++ b/DStarControl.cpp @@ -360,16 +360,15 @@ bool CDStarControl::writeModem(unsigned char *data, unsigned int len) return false; } - if ((m_rfState == RPT_RF_STATE::AUDIO) || (m_rfState == RPT_RF_STATE::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_rfSlowData.start(); - m_rfN = 0U; - } + // 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; + } else { + m_rfSlowData.add(data + 1U); } if (m_rfState == RPT_RF_STATE::AUDIO) { - m_rfSlowData.peakSlowData(data + 1U); unsigned char type = m_rfSlowData.getType(); if (type == DSTAR_SLOW_DATA_TYPE_FASTDATA_BEGIN) { @@ -380,10 +379,8 @@ 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); + if (m_rfN == 0U) m_display->writeDStarRSSI(m_rssi); - } LogDebug("D-Star, fast data sequence no. %u", m_rfN); @@ -396,9 +393,7 @@ bool CDStarControl::writeModem(unsigned char *data, unsigned int len) if (m_duplex) writeQueueDataRF(data); - m_rfSlowData.peakSlowData(data + 1U); bool complete = m_rfSlowData.isComplete(); - if (complete) { unsigned char type = m_rfSlowData.getType(); if (type == DSTAR_SLOW_DATA_TYPE_FASTDATA_END) { @@ -410,10 +405,8 @@ 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) { - CSync::addDStarSync(data + 1U); + if (m_rfN == 0U) 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) { @@ -429,7 +422,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); + const unsigned char* text = m_rfSlowData.getText(); if (text != nullptr) LogMessage("D-Star, RF slow data text = \"%s\"", text); } @@ -451,7 +444,7 @@ bool CDStarControl::writeModem(unsigned char *data, unsigned int len) m_rfSlowData.reset(); return false; } else { - CDStarHeader* header = m_rfSlowData.addHeader(data + 1U); + CDStarHeader* header = m_rfSlowData.getHeader(); if (header == nullptr) return false; @@ -742,13 +735,13 @@ void CDStarControl::writeNetwork() writeEndNet(); } else if (type == TAG_DATA) { if ((m_netState == RPT_NET_STATE::AUDIO) || (m_netState == RPT_NET_STATE::DATA)) { - unsigned char n = data[1U]; + m_netN = data[1U]; - // 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) { + if (m_netN == 0U) { + CSync::addDStarSync(data + 2U); m_netSlowData.start(); } else { - m_netSlowData.peakSlowData(data + 1U); + m_netSlowData.add(data + 2U); if (m_netState == RPT_NET_STATE::AUDIO) { unsigned char type = m_netSlowData.getType(); @@ -761,8 +754,6 @@ void CDStarControl::writeNetwork() } if (m_netState == RPT_NET_STATE::AUDIO) { - unsigned char n = data[1U]; - unsigned int errors = 0U; if (::memcmp(data + 2U, DSTAR_nullptr_AMBE_DATA_BYTES_SCRAMBLED, DSTAR_VOICE_FRAME_LENGTH_BYTES) != 0) { errors = m_fec.regenerateDStar(data + 2U); @@ -772,21 +763,15 @@ void CDStarControl::writeNetwork() data[1U] = TAG_DATA; // Insert silence and reject if in the past - bool ret = insertSilence(data + 1U, n); + bool ret = insertSilence(data + 1U, m_netN); if (!ret) return; m_netErrs += errors; m_netBits += 48U; - m_netN = n; - - // Regenerate the sync - if (m_netN == 0U) { - CSync::addDStarSync(data + 2U); - m_netSlowData.start(); - } else { - const unsigned char* text = m_netSlowData.addText(data + 2U); + if (m_netN != 0U) { + const unsigned char* text = m_netSlowData.getText(); if (text != nullptr) LogMessage("D-Star, network slow data text = \"%s\"", text); } @@ -801,18 +786,11 @@ void CDStarControl::writeNetwork() } if (m_netState == RPT_NET_STATE::DATA) { - m_netN = data[1U]; - data[1U] = TAG_DATA; m_netBits += 48U; - // Regenerate the sync - if (m_netN == 0U) { - CSync::addDStarSync(data + 2U); - m_netSlowData.start(); - } else { - m_netSlowData.peakSlowData(data + 2U); + if (m_netN != 0U) { bool complete = m_netSlowData.isComplete(); if (complete) { unsigned char type = m_netSlowData.getType(); diff --git a/DStarSlowData.cpp b/DStarSlowData.cpp index 3ada8b8..2727e5b 100644 --- a/DStarSlowData.cpp +++ b/DStarSlowData.cpp @@ -34,7 +34,7 @@ m_text(nullptr), m_textPtr(0U), m_textBits(0x00U), m_state(SDD_STATE::FIRST), -m_type(0x00U) +m_complete(false) { m_header = new unsigned char[50U]; // DSTAR_HEADER_LENGTH_BYTES m_buffer = new unsigned char[DSTAR_DATA_FRAME_LENGTH_BYTES * 2U]; @@ -48,52 +48,45 @@ CDStarSlowData::~CDStarSlowData() delete[] m_text; } -void CDStarSlowData::peakSlowData(const unsigned char* data) +void CDStarSlowData::add(const unsigned char* data) { assert(data != nullptr); switch (m_state) { case SDD_STATE::FIRST: - m_type = data[9U] ^ DSTAR_SCRAMBLER_BYTES[0U]; - m_state = SDD_STATE::SECOND; - break; - - case SDD_STATE::SECOND: - m_state = SDD_STATE::FIRST; - break; - } -} - -CDStarHeader* CDStarSlowData::addHeader(const unsigned char* data) -{ - assert(data != nullptr); - - 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_state = SDD_STATE::SECOND; - return nullptr; + m_complete = false; + return; 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_state = SDD_STATE::FIRST; + m_complete = true; + loadHeader(); + loadText(); break; } +} +void CDStarSlowData::loadHeader() +{ if ((m_buffer[0U] & DSTAR_SLOW_DATA_TYPE_MASK) != DSTAR_SLOW_DATA_TYPE_HEADER) - return nullptr; + return; if (m_ptr >= 45U) - return nullptr; + return; ::memcpy(m_header + m_ptr, m_buffer + 1U, 5U); m_ptr += 5U; +} +CDStarHeader* CDStarSlowData::getHeader() +{ // Clean up the data m_header[0U] &= (DSTAR_INTERRUPTED_MASK | DSTAR_URGENT_MASK | DSTAR_REPEATER_MASK); m_header[1U] = 0x00U; @@ -113,69 +106,57 @@ CDStarHeader* CDStarSlowData::addHeader(const unsigned char* data) return new CDStarHeader(m_header); } -const unsigned char* CDStarSlowData::addText(const unsigned char* data) +void CDStarSlowData::loadText() { - assert(data != nullptr); + switch (m_buffer[0U]) { + case DSTAR_SLOW_DATA_TYPE_TEXT | 0U: + CUtils::dump(1U, "D-Star slow data text fragment 0", m_buffer, 6U); + m_text[0U] = m_buffer[1U] & 0x7FU; + m_text[1U] = m_buffer[2U] & 0x7FU; + m_text[2U] = m_buffer[3U] & 0x7FU; + m_text[3U] = m_buffer[4U] & 0x7FU; + m_text[4U] = m_buffer[5U] & 0x7FU; + m_textBits |= 0x01U; + break; - 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_state = SDD_STATE::SECOND; - return nullptr; + case DSTAR_SLOW_DATA_TYPE_TEXT | 1U: + CUtils::dump(1U, "D-Star slow data text fragment 1", m_buffer, 6U); + m_text[5U] = m_buffer[1U] & 0x7FU; + m_text[6U] = m_buffer[2U] & 0x7FU; + m_text[7U] = m_buffer[3U] & 0x7FU; + m_text[8U] = m_buffer[4U] & 0x7FU; + m_text[9U] = m_buffer[5U] & 0x7FU; + m_textBits |= 0x02U; + break; - 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_state = SDD_STATE::FIRST; + case DSTAR_SLOW_DATA_TYPE_TEXT | 2U: + CUtils::dump(1U, "D-Star slow data text fragment 2", m_buffer, 6U); + m_text[10U] = m_buffer[1U] & 0x7FU; + m_text[11U] = m_buffer[2U] & 0x7FU; + m_text[12U] = m_buffer[3U] & 0x7FU; + m_text[13U] = m_buffer[4U] & 0x7FU; + m_text[14U] = m_buffer[5U] & 0x7FU; + m_textBits |= 0x04U; + break; + + case DSTAR_SLOW_DATA_TYPE_TEXT | 3U: + CUtils::dump(1U, "D-Star slow data text fragment 3", m_buffer, 6U); + m_text[15U] = m_buffer[1U] & 0x7FU; + m_text[16U] = m_buffer[2U] & 0x7FU; + m_text[17U] = m_buffer[3U] & 0x7FU; + m_text[18U] = m_buffer[4U] & 0x7FU; + m_text[19U] = m_buffer[5U] & 0x7FU; + m_text[20U] = 0x00U; + m_textBits |= 0x08U; + break; + + default: break; } +} - switch (m_buffer[0U]) { - case DSTAR_SLOW_DATA_TYPE_TEXT | 0U: - CUtils::dump(1U, "D-Star slow data text fragment", m_buffer, 6U); - m_text[0U] = m_buffer[1U] & 0x7FU; - m_text[1U] = m_buffer[2U] & 0x7FU; - m_text[2U] = m_buffer[3U] & 0x7FU; - m_text[3U] = m_buffer[4U] & 0x7FU; - m_text[4U] = m_buffer[5U] & 0x7FU; - m_textBits |= 0x01U; - break; - case DSTAR_SLOW_DATA_TYPE_TEXT | 1U: - CUtils::dump(1U, "D-Star slow data text fragment", m_buffer, 6U); - m_text[5U] = m_buffer[1U] & 0x7FU; - m_text[6U] = m_buffer[2U] & 0x7FU; - m_text[7U] = m_buffer[3U] & 0x7FU; - m_text[8U] = m_buffer[4U] & 0x7FU; - m_text[9U] = m_buffer[5U] & 0x7FU; - m_textBits |= 0x02U; - break; - case DSTAR_SLOW_DATA_TYPE_TEXT | 2U: - CUtils::dump(1U, "D-Star slow data text fragment", m_buffer, 6U); - m_text[10U] = m_buffer[1U] & 0x7FU; - m_text[11U] = m_buffer[2U] & 0x7FU; - m_text[12U] = m_buffer[3U] & 0x7FU; - m_text[13U] = m_buffer[4U] & 0x7FU; - m_text[14U] = m_buffer[5U] & 0x7FU; - m_textBits |= 0x04U; - break; - case DSTAR_SLOW_DATA_TYPE_TEXT | 3U: - CUtils::dump(1U, "D-Star slow data text fragment", m_buffer, 6U); - m_text[15U] = m_buffer[1U] & 0x7FU; - m_text[16U] = m_buffer[2U] & 0x7FU; - m_text[17U] = m_buffer[3U] & 0x7FU; - m_text[18U] = m_buffer[4U] & 0x7FU; - m_text[19U] = m_buffer[5U] & 0x7FU; - m_text[20U] = 0x00U; - m_textBits |= 0x08U; - break; - default: - return nullptr; - } - +const unsigned char* CDStarSlowData::getText() +{ if (m_textBits != 0x0FU) return nullptr; @@ -192,16 +173,16 @@ void CDStarSlowData::start() m_ptr = 0U; m_state = SDD_STATE::FIRST; - m_type = 0x00U; m_textBits = 0x00U; + m_complete = false; } void CDStarSlowData::reset() { m_ptr = 0U; m_state = SDD_STATE::FIRST; - m_type = 0x00U; m_textBits = 0x00U; + m_complete = false; } void CDStarSlowData::setText(const char* text) @@ -257,10 +238,10 @@ void CDStarSlowData::getSlowData(unsigned char* data) unsigned char CDStarSlowData::getType() const { - return m_type & DSTAR_SLOW_DATA_TYPE_MASK; + return m_buffer[0U] & DSTAR_SLOW_DATA_TYPE_MASK; } bool CDStarSlowData::isComplete() const { - return m_state == SDD_STATE::FIRST; + return m_complete; } diff --git a/DStarSlowData.h b/DStarSlowData.h index 60493cd..5b8b737 100644 --- a/DStarSlowData.h +++ b/DStarSlowData.h @@ -26,13 +26,12 @@ public: CDStarSlowData(); ~CDStarSlowData(); - void peakSlowData(const unsigned char* data); + void add(const unsigned char* data); - CDStarHeader* addHeader(const unsigned char* data); + CDStarHeader* getHeader(); + const unsigned char* getText(); + unsigned char getType() const; - const unsigned char* addText(const unsigned char* data); - - unsigned char getType() const; bool isComplete() const; void start(); @@ -55,7 +54,10 @@ private: }; SDD_STATE m_state; - unsigned char m_type; + bool m_complete; + + void loadHeader(); + void loadText(); }; #endif diff --git a/Version.h b/Version.h index 4fbb622..b3f7c59 100644 --- a/Version.h +++ b/Version.h @@ -19,6 +19,6 @@ #if !defined(VERSION_H) #define VERSION_H -const char* VERSION = "20250327"; +const char* VERSION = "20250417"; #endif