From 29af1f925846a3e7741f3ea574ef5d1b7918f976 Mon Sep 17 00:00:00 2001 From: Jonathan Naylor Date: Thu, 27 Mar 2025 18:27:48 +0000 Subject: [PATCH 1/3] Revert some D-Star slow data changes. --- DStarControl.cpp | 30 +++++++++++++++------------ DStarSlowData.cpp | 52 +++++++++++++++++++++++++++++------------------ DStarSlowData.h | 14 +++++++++---- Version.h | 2 +- 4 files changed, 60 insertions(+), 38 deletions(-) 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 From 8e010d87492f7c25275ca852b2dded74a9c2c812 Mon Sep 17 00:00:00 2001 From: Daniel Caujolle-Bert Date: Sun, 30 Mar 2025 06:15:25 +0200 Subject: [PATCH 2/3] Keep disabled mode (using RemoteCommand) disabled, until it gets explicilty reactivated. --- MMDVMHost.cpp | 172 +++++++++++++++++++++++++++----------------------- 1 file changed, 93 insertions(+), 79 deletions(-) diff --git a/MMDVMHost.cpp b/MMDVMHost.cpp index fc12585..f907ed5 100644 --- a/MMDVMHost.cpp +++ b/MMDVMHost.cpp @@ -1991,7 +1991,7 @@ void CMMDVMHost::setMode(unsigned char mode) switch (mode) { case MODE_DSTAR: - if (m_dstarNetwork != nullptr) + if (m_dstarNetwork != nullptr && m_dstarEnabled) m_dstarNetwork->enable(true); if (m_dmrNetwork != nullptr) m_dmrNetwork->enable(false); @@ -2009,7 +2009,7 @@ void CMMDVMHost::setMode(unsigned char mode) m_fmNetwork->enable(false); if (m_ax25Network != nullptr) m_ax25Network->enable(false); - if (m_dstar != nullptr) + if (m_dstar != nullptr && m_dstarEnabled) m_dstar->enable(true); if (m_dmr != nullptr) m_dmr->enable(false); @@ -2027,18 +2027,20 @@ void CMMDVMHost::setMode(unsigned char mode) m_fm->enable(false); if (m_ax25 != nullptr) m_ax25->enable(false); - m_modem->setMode(MODE_DSTAR); - m_mode = MODE_DSTAR; - m_modeTimer.start(); - m_cwIdTimer.stop(); - createLockFile("D-Star"); - LogMessage("Mode set to D-Star"); + if (m_dstarEnabled) { + m_modem->setMode(MODE_DSTAR); + m_mode = MODE_DSTAR; + m_modeTimer.start(); + m_cwIdTimer.stop(); + createLockFile("D-Star"); + LogMessage("Mode set to D-Star"); + } break; case MODE_DMR: if (m_dstarNetwork != nullptr) m_dstarNetwork->enable(false); - if (m_dmrNetwork != nullptr) + if (m_dmrNetwork != nullptr && m_dmrEnabled) m_dmrNetwork->enable(true); if (m_ysfNetwork != nullptr) m_ysfNetwork->enable(false); @@ -2056,7 +2058,7 @@ void CMMDVMHost::setMode(unsigned char mode) m_ax25Network->enable(false); if (m_dstar != nullptr) m_dstar->enable(false); - if (m_dmr != nullptr) + if (m_dmr != nullptr && m_dmrEnabled) m_dmr->enable(true); if (m_ysf != nullptr) m_ysf->enable(false); @@ -2072,16 +2074,18 @@ void CMMDVMHost::setMode(unsigned char mode) m_fm->enable(false); if (m_ax25 != nullptr) m_ax25->enable(false); - m_modem->setMode(MODE_DMR); - if (m_duplex) { - m_modem->writeDMRStart(true); - m_dmrTXTimer.start(); + if (m_dmrEnabled) { + m_modem->setMode(MODE_DMR); + if (m_duplex) { + m_modem->writeDMRStart(true); + m_dmrTXTimer.start(); + } + m_mode = MODE_DMR; + m_modeTimer.start(); + m_cwIdTimer.stop(); + createLockFile("DMR"); + LogMessage("Mode set to DMR"); } - m_mode = MODE_DMR; - m_modeTimer.start(); - m_cwIdTimer.stop(); - createLockFile("DMR"); - LogMessage("Mode set to DMR"); break; case MODE_YSF: @@ -2089,7 +2093,7 @@ void CMMDVMHost::setMode(unsigned char mode) m_dstarNetwork->enable(false); if (m_dmrNetwork != nullptr) m_dmrNetwork->enable(false); - if (m_ysfNetwork != nullptr) + if (m_ysfNetwork != nullptr && m_ysfEnabled) m_ysfNetwork->enable(true); if (m_p25Network != nullptr) m_p25Network->enable(false); @@ -2107,7 +2111,7 @@ void CMMDVMHost::setMode(unsigned char mode) m_dstar->enable(false); if (m_dmr != nullptr) m_dmr->enable(false); - if (m_ysf != nullptr) + if (m_ysf != nullptr && m_ysfEnabled) m_ysf->enable(true); if (m_p25 != nullptr) m_p25->enable(false); @@ -2121,12 +2125,14 @@ void CMMDVMHost::setMode(unsigned char mode) m_fm->enable(false); if (m_ax25 != nullptr) m_ax25->enable(false); - m_modem->setMode(MODE_YSF); - m_mode = MODE_YSF; - m_modeTimer.start(); - m_cwIdTimer.stop(); - createLockFile("System Fusion"); - LogMessage("Mode set to System Fusion"); + if (m_ysfEnabled) { + m_modem->setMode(MODE_YSF); + m_mode = MODE_YSF; + m_modeTimer.start(); + m_cwIdTimer.stop(); + createLockFile("System Fusion"); + LogMessage("Mode set to System Fusion"); + } break; case MODE_P25: @@ -2136,7 +2142,7 @@ void CMMDVMHost::setMode(unsigned char mode) m_dmrNetwork->enable(false); if (m_ysfNetwork != nullptr) m_ysfNetwork->enable(false); - if (m_p25Network != nullptr) + if (m_p25Network != nullptr && m_p25Enabled) m_p25Network->enable(true); if (m_nxdnNetwork != nullptr) m_nxdnNetwork->enable(false); @@ -2154,7 +2160,7 @@ void CMMDVMHost::setMode(unsigned char mode) m_dmr->enable(false); if (m_ysf != nullptr) m_ysf->enable(false); - if (m_p25 != nullptr) + if (m_p25 != nullptr && m_p25Enabled) m_p25->enable(true); if (m_nxdn != nullptr) m_nxdn->enable(false); @@ -2166,12 +2172,14 @@ void CMMDVMHost::setMode(unsigned char mode) m_fm->enable(false); if (m_ax25 != nullptr) m_ax25->enable(false); - m_modem->setMode(MODE_P25); - m_mode = MODE_P25; - m_modeTimer.start(); - m_cwIdTimer.stop(); - createLockFile("P25"); - LogMessage("Mode set to P25"); + if (m_p25Enabled) { + m_modem->setMode(MODE_P25); + m_mode = MODE_P25; + m_modeTimer.start(); + m_cwIdTimer.stop(); + createLockFile("P25"); + LogMessage("Mode set to P25"); + } break; case MODE_NXDN: @@ -2183,7 +2191,7 @@ void CMMDVMHost::setMode(unsigned char mode) m_ysfNetwork->enable(false); if (m_p25Network != nullptr) m_p25Network->enable(false); - if (m_nxdnNetwork != nullptr) + if (m_nxdnNetwork != nullptr && m_nxdnEnabled) m_nxdnNetwork->enable(true); if (m_m17Network != nullptr) m_m17Network->enable(false); @@ -2201,7 +2209,7 @@ void CMMDVMHost::setMode(unsigned char mode) m_ysf->enable(false); if (m_p25 != nullptr) m_p25->enable(false); - if (m_nxdn != nullptr) + if (m_nxdn != nullptr && m_nxdnEnabled) m_nxdn->enable(true); if (m_m17 != nullptr) m_m17->enable(false); @@ -2211,12 +2219,14 @@ void CMMDVMHost::setMode(unsigned char mode) m_fm->enable(false); if (m_ax25 != nullptr) m_ax25->enable(false); - m_modem->setMode(MODE_NXDN); - m_mode = MODE_NXDN; - m_modeTimer.start(); - m_cwIdTimer.stop(); - createLockFile("NXDN"); - LogMessage("Mode set to NXDN"); + if (m_nxdnEnabled) { + m_modem->setMode(MODE_NXDN); + m_mode = MODE_NXDN; + m_modeTimer.start(); + m_cwIdTimer.stop(); + createLockFile("NXDN"); + LogMessage("Mode set to NXDN"); + } break; case MODE_M17: @@ -2230,7 +2240,7 @@ void CMMDVMHost::setMode(unsigned char mode) m_p25Network->enable(false); if (m_nxdnNetwork != nullptr) m_nxdnNetwork->enable(false); - if (m_m17Network != nullptr) + if (m_m17Network != nullptr && m_m17Enabled) m_m17Network->enable(true); if (m_pocsagNetwork != nullptr) m_pocsagNetwork->enable(false); @@ -2248,7 +2258,7 @@ void CMMDVMHost::setMode(unsigned char mode) m_p25->enable(false); if (m_nxdn != nullptr) m_nxdn->enable(false); - if (m_m17 != nullptr) + if (m_m17 != nullptr && m_m17Enabled) m_m17->enable(true); if (m_pocsag != nullptr) m_pocsag->enable(false); @@ -2256,12 +2266,14 @@ void CMMDVMHost::setMode(unsigned char mode) m_fm->enable(false); if (m_ax25 != nullptr) m_ax25->enable(false); - m_modem->setMode(MODE_M17); - m_mode = MODE_M17; - m_modeTimer.start(); - m_cwIdTimer.stop(); - createLockFile("M17"); - LogMessage("Mode set to M17"); + if (m_m17Enabled) { + m_modem->setMode(MODE_M17); + m_mode = MODE_M17; + m_modeTimer.start(); + m_cwIdTimer.stop(); + createLockFile("M17"); + LogMessage("Mode set to M17"); + } break; case MODE_POCSAG: @@ -2324,9 +2336,9 @@ void CMMDVMHost::setMode(unsigned char mode) m_m17Network->enable(false); if (m_pocsagNetwork != nullptr) m_pocsagNetwork->enable(false); - if (m_fmNetwork != nullptr) + if (m_fmNetwork != nullptr && m_fmEnabled) m_fmNetwork->enable(true); - if (m_ax25Network != nullptr) + if (m_ax25Network != nullptr && m_fmEnabled) m_ax25Network->enable(true); if (m_dstar != nullptr) m_dstar->enable(false); @@ -2342,21 +2354,23 @@ void CMMDVMHost::setMode(unsigned char mode) m_m17->enable(false); if (m_pocsag != nullptr) m_pocsag->enable(false); - if (m_fm != nullptr) + if (m_fm != nullptr && m_fmEnabled) m_fm->enable(true); - if (m_ax25 != nullptr) + if (m_ax25 != nullptr && m_fmEnabled) m_ax25->enable(true); if (m_mode == MODE_DMR && m_duplex && m_modem->hasTX()) { m_modem->writeDMRStart(false); m_dmrTXTimer.stop(); } - m_modem->setMode(MODE_FM); - m_display->setFM(); - m_mode = MODE_FM; - m_modeTimer.start(); - m_cwIdTimer.stop(); - createLockFile("FM"); - LogMessage("Mode set to FM"); + if (m_fmEnabled) { + m_modem->setMode(MODE_FM); + m_display->setFM(); + m_mode = MODE_FM; + m_modeTimer.start(); + m_cwIdTimer.stop(); + createLockFile("FM"); + LogMessage("Mode set to FM"); + } break; case MODE_LOCKOUT: @@ -2460,43 +2474,43 @@ void CMMDVMHost::setMode(unsigned char mode) break; default: - if (m_dstarNetwork != nullptr) + if (m_dstarNetwork != nullptr && m_dstarEnabled) m_dstarNetwork->enable(true); - if (m_dmrNetwork != nullptr) + if (m_dmrNetwork != nullptr && m_dmrEnabled) m_dmrNetwork->enable(true); - if (m_ysfNetwork != nullptr) + if (m_ysfNetwork != nullptr && m_ysfEnabled) m_ysfNetwork->enable(true); - if (m_p25Network != nullptr) + if (m_p25Network != nullptr && m_p25Enabled) m_p25Network->enable(true); - if (m_nxdnNetwork != nullptr) + if (m_nxdnNetwork != nullptr && m_nxdnEnabled) m_nxdnNetwork->enable(true); - if (m_m17Network != nullptr) + if (m_m17Network != nullptr && m_m17Enabled) m_m17Network->enable(true); if (m_pocsagNetwork != nullptr) m_pocsagNetwork->enable(true); - if (m_fmNetwork != nullptr) + if (m_fmNetwork != nullptr && m_fmEnabled) m_fmNetwork->enable(true); - if (m_ax25Network != nullptr) + if (m_ax25Network != nullptr && m_fmEnabled) m_ax25Network->enable(true); - if (m_dstar != nullptr) + if (m_dstar != nullptr && m_dstarEnabled) m_dstar->enable(true); - if (m_dmr != nullptr) + if (m_dmr != nullptr && m_dmrEnabled) m_dmr->enable(true); - if (m_ysf != nullptr) + if (m_ysf != nullptr && m_ysfEnabled) m_ysf->enable(true); - if (m_p25 != nullptr) + if (m_p25 != nullptr && m_p25Enabled) m_p25->enable(true); - if (m_nxdn != nullptr) + if (m_nxdn != nullptr && m_nxdnEnabled) m_nxdn->enable(true); - if (m_m17 != nullptr) + if (m_m17 != nullptr && m_m17Enabled) m_m17->enable(true); if (m_pocsag != nullptr) m_pocsag->enable(true); - if (m_fm != nullptr) + if (m_fm != nullptr && m_fmEnabled) m_fm->enable(true); - if (m_ax25 != nullptr) + if (m_ax25 != nullptr && m_fmEnabled) m_ax25->enable(true); - if (m_mode == MODE_DMR && m_duplex && m_modem->hasTX()) { + if (m_mode == MODE_DMR && m_duplex && m_modem->hasTX() && m_dmrEnabled) { m_modem->writeDMRStart(false); m_dmrTXTimer.stop(); } From 05b9c4d79baa2404a8e37466eb90d94f9620349f Mon Sep 17 00:00:00 2001 From: Jonathan Naylor Date: Thu, 17 Apr 2025 12:32:54 +0100 Subject: [PATCH 3/3] 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