diff --git a/DStarControl.cpp b/DStarControl.cpp index c17df2a..e03a936 100644 --- a/DStarControl.cpp +++ b/DStarControl.cpp @@ -368,23 +368,21 @@ 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; } 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, m_rfN); unsigned char type = m_rfSlowData.getType(); if (type == DSTAR_SLOW_DATA_TYPE_FASTDATA_BEGIN) { @@ -409,9 +407,7 @@ bool CDStarControl::writeModem(unsigned char *data, unsigned int len) if (m_duplex) writeQueueDataRF(data); - m_rfSlowData.peakSlowData(data + 1U, m_rfN); bool complete = m_rfSlowData.isComplete(); - if (complete) { unsigned char type = m_rfSlowData.getType(); if (type == DSTAR_SLOW_DATA_TYPE_FASTDATA_END) { @@ -440,7 +436,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.getText(); if (text != nullptr) LogMessage("D-Star, RF slow data text = \"%s\"", text); } @@ -460,14 +456,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.getHeader(); + if (header == nullptr) return false; - } m_rfHeader = *header; delete header; @@ -746,13 +739,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, n); + m_netSlowData.add(data + 2U); if (m_netState == RPT_NET_STATE::AUDIO) { unsigned char type = m_netSlowData.getType(); @@ -782,12 +775,8 @@ void CDStarControl::writeNetwork() m_netBits += 48U; - // Regenerate the sync - if (m_netN == 0U) { - CSync::addDStarSync(data + 2U); - m_netSlowData.start(); - } else { - const unsigned char* text = m_netSlowData.addText(data + 2U, m_netN); + if (m_netN != 0U) { + const unsigned char* text = m_netSlowData.getText(); if (text != nullptr) LogMessage("D-Star, network slow data text = \"%s\"", text); } @@ -799,18 +788,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, m_netN); + 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 5a64ee5..1e58af7 100644 --- a/DStarSlowData.cpp +++ b/DStarSlowData.cpp @@ -35,7 +35,7 @@ m_buffer(nullptr), m_text(nullptr), m_textPtr(0U), m_textBits(0x00U), -m_type(0x00U), +m_state(SDD_STATE::FIRST), m_complete(false) { m_header = new unsigned char[50U]; // DSTAR_HEADER_LENGTH_BYTES @@ -50,44 +50,45 @@ CDStarSlowData::~CDStarSlowData() delete[] m_text; } -void CDStarSlowData::peakSlowData(const unsigned char* data, unsigned int n) +void CDStarSlowData::add(const unsigned char* data) { assert(data != nullptr); - if ((n % 2U) == 0U) { - m_type = data[9U] ^ DSTAR_SCRAMBLER_BYTES[0U]; - m_complete = false; - } else { - m_complete = true; - } -} - -CDStarHeader* CDStarSlowData::addHeader(const unsigned char* data, unsigned int n) -{ - assert(data != nullptr); - - if ((n % 2U) == 0U) { - m_type = data[9U] ^ DSTAR_SCRAMBLER_BYTES[0U]; + switch (m_state) { + case SDD_STATE::FIRST: 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; m_complete = false; - } else { + 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; @@ -107,65 +108,57 @@ 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) +void CDStarSlowData::loadText() { - assert(data != nullptr); - - if ((n % 2U) == 0U) { - 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_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; - } - 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; - } + 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; + 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 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; + } +} + +const unsigned char* CDStarSlowData::getText() +{ if (m_textBits != 0x0FU) return nullptr; @@ -181,17 +174,17 @@ void CDStarSlowData::start() ::memset(m_header, 0x00U, DSTAR_HEADER_LENGTH_BYTES); m_ptr = 0U; - m_type = 0x00U; - m_complete = false; + m_state = SDD_STATE::FIRST; m_textBits = 0x00U; + m_complete = false; } void CDStarSlowData::reset() { m_ptr = 0U; - m_type = 0x00U; - m_complete = false; + m_state = SDD_STATE::FIRST; m_textBits = 0x00U; + m_complete = false; } void CDStarSlowData::setText(const char* text) @@ -247,7 +240,7 @@ 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 diff --git a/DStarSlowData.h b/DStarSlowData.h index 666aeb1..e18bfc5 100644 --- a/DStarSlowData.h +++ b/DStarSlowData.h @@ -29,13 +29,12 @@ public: CDStarSlowData(); ~CDStarSlowData(); - void peakSlowData(const unsigned char* data, unsigned int n); + void add(const unsigned char* data); - CDStarHeader* addHeader(const unsigned char* data, unsigned int n); + CDStarHeader* getHeader(); + const unsigned char* getText(); + unsigned char getType() const; - const unsigned char* addText(const unsigned char* data, unsigned int n); - - unsigned char getType() const; bool isComplete() const; void start(); @@ -51,8 +50,17 @@ private: unsigned char* m_text; unsigned int m_textPtr; unsigned char m_textBits; - unsigned char m_type; + + enum class SDD_STATE { + FIRST, + SECOND + }; + + SDD_STATE m_state; bool m_complete; + + void loadHeader(); + void loadText(); }; #endif diff --git a/MMDVMHost.cpp b/MMDVMHost.cpp index d94ad3e..d6a4e2f 100644 --- a/MMDVMHost.cpp +++ b/MMDVMHost.cpp @@ -2363,7 +2363,7 @@ void CMMDVMHost::setMode(unsigned char mode) switch (mode) { #if defined(USE_DSTAR) case MODE_DSTAR: - if (m_dstarNetwork != nullptr) + if (m_dstarNetwork != nullptr && m_dstarEnabled) m_dstarNetwork->enable(true); #if defined(USE_DMR) if (m_dmrNetwork != nullptr) @@ -2397,7 +2397,7 @@ void CMMDVMHost::setMode(unsigned char mode) if (m_ax25Network != nullptr) m_ax25Network->enable(false); #endif - if (m_dstar != nullptr) + if (m_dstar != nullptr && m_dstarEnabled) m_dstar->enable(true); #if defined(USE_DMR) if (m_dmr != nullptr) @@ -2431,12 +2431,14 @@ void CMMDVMHost::setMode(unsigned char mode) if (m_ax25 != nullptr) m_ax25->enable(false); #endif - m_modem->setMode(MODE_DSTAR); - m_mode = MODE_DSTAR; - m_modeTimer.start(); - m_cwIdTimer.stop(); - createLockFile("D-Star"); - writeJSONMode("D-Star"); + if (m_dstarEnabled) { + m_modem->setMode(MODE_DSTAR); + m_mode = MODE_DSTAR; + m_modeTimer.start(); + m_cwIdTimer.stop(); + createLockFile("D-Star"); + writeJSONMode("D-Star"); + } break; #endif #if defined(USE_DMR) @@ -2445,7 +2447,7 @@ void CMMDVMHost::setMode(unsigned char mode) if (m_dstarNetwork != nullptr) m_dstarNetwork->enable(false); #endif - if (m_dmrNetwork != nullptr) + if (m_dmrNetwork != nullptr && m_dmrEnabled) m_dmrNetwork->enable(true); #if defined(USE_YSF) if (m_ysfNetwork != nullptr) @@ -2479,7 +2481,7 @@ void CMMDVMHost::setMode(unsigned char mode) if (m_dstar != nullptr) m_dstar->enable(false); #endif - if (m_dmr != nullptr) + if (m_dmr != nullptr && m_dmrEnabled) m_dmr->enable(true); #if defined(USE_YSF) if (m_ysf != nullptr) @@ -2509,16 +2511,18 @@ void CMMDVMHost::setMode(unsigned char mode) if (m_ax25 != nullptr) m_ax25->enable(false); #endif - 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"); + writeJSONMode("DMR"); } - m_mode = MODE_DMR; - m_modeTimer.start(); - m_cwIdTimer.stop(); - createLockFile("DMR"); - writeJSONMode("DMR"); break; #endif #if defined(USE_YSF) @@ -2531,7 +2535,7 @@ void CMMDVMHost::setMode(unsigned char mode) if (m_dmrNetwork != nullptr) m_dmrNetwork->enable(false); #endif - if (m_ysfNetwork != nullptr) + if (m_ysfNetwork != nullptr && m_ysfEnabled) m_ysfNetwork->enable(true); #if defined(USE_P25) if (m_p25Network != nullptr) @@ -2565,7 +2569,7 @@ void CMMDVMHost::setMode(unsigned char mode) if (m_dmr != nullptr) m_dmr->enable(false); #endif - if (m_ysf != nullptr) + if (m_ysf != nullptr && m_ysfEnabled) m_ysf->enable(true); #if defined(USE_P25) if (m_p25 != nullptr) @@ -2591,12 +2595,14 @@ void CMMDVMHost::setMode(unsigned char mode) if (m_ax25 != nullptr) m_ax25->enable(false); #endif - m_modem->setMode(MODE_YSF); - m_mode = MODE_YSF; - m_modeTimer.start(); - m_cwIdTimer.stop(); - createLockFile("System Fusion"); - writeJSONMode("YSF"); + if (m_ysfEnabled) { + m_modem->setMode(MODE_YSF); + m_mode = MODE_YSF; + m_modeTimer.start(); + m_cwIdTimer.stop(); + createLockFile("System Fusion"); + writeJSONMode("YSF"); + } break; #endif #if defined(USE_P25) @@ -2613,7 +2619,7 @@ void CMMDVMHost::setMode(unsigned char mode) if (m_ysfNetwork != nullptr) m_ysfNetwork->enable(false); #endif - if (m_p25Network != nullptr) + if (m_p25Network != nullptr && m_p25Enabled) m_p25Network->enable(true); #if defined(USE_NXDN) if (m_nxdnNetwork != nullptr) @@ -2647,7 +2653,7 @@ void CMMDVMHost::setMode(unsigned char mode) if (m_ysf != nullptr) m_ysf->enable(false); #endif - if (m_p25 != nullptr) + if (m_p25 != nullptr && m_p25Enabled) m_p25->enable(true); #if defined(USE_NXDN) if (m_nxdn != nullptr) @@ -2669,12 +2675,14 @@ void CMMDVMHost::setMode(unsigned char mode) if (m_ax25 != nullptr) m_ax25->enable(false); #endif - m_modem->setMode(MODE_P25); - m_mode = MODE_P25; - m_modeTimer.start(); - m_cwIdTimer.stop(); - createLockFile("P25"); - writeJSONMode("P25"); + if (m_p25Enabled) { + m_modem->setMode(MODE_P25); + m_mode = MODE_P25; + m_modeTimer.start(); + m_cwIdTimer.stop(); + createLockFile("P25"); + writeJSONMode("P25"); + } break; #endif #if defined(USE_NXDN) @@ -2695,7 +2703,7 @@ void CMMDVMHost::setMode(unsigned char mode) if (m_p25Network != nullptr) m_p25Network->enable(false); #endif - if (m_nxdnNetwork != nullptr) + if (m_nxdnNetwork != nullptr && m_nxdnEnabled) m_nxdnNetwork->enable(true); #if defined(USE_M17) if (m_m17Network != nullptr) @@ -2729,7 +2737,7 @@ void CMMDVMHost::setMode(unsigned char mode) if (m_p25 != nullptr) m_p25->enable(false); #endif - if (m_nxdn != nullptr) + if (m_nxdn != nullptr && m_nxdnEnabled) m_nxdn->enable(true); #if defined(USE_M17) if (m_m17 != nullptr) @@ -2747,12 +2755,14 @@ void CMMDVMHost::setMode(unsigned char mode) if (m_ax25 != nullptr) m_ax25->enable(false); #endif - m_modem->setMode(MODE_NXDN); - m_mode = MODE_NXDN; - m_modeTimer.start(); - m_cwIdTimer.stop(); - createLockFile("NXDN"); - writeJSONMode("NXDN"); + if (m_nxdnEnabled) { + m_modem->setMode(MODE_NXDN); + m_mode = MODE_NXDN; + m_modeTimer.start(); + m_cwIdTimer.stop(); + createLockFile("NXDN"); + writeJSONMode("NXDN"); + } break; #endif #if defined(USE_M17) @@ -2777,7 +2787,7 @@ void CMMDVMHost::setMode(unsigned char mode) if (m_nxdnNetwork != nullptr) m_nxdnNetwork->enable(false); #endif - if (m_m17Network != nullptr) + if (m_m17Network != nullptr && m_m17Enabled) m_m17Network->enable(true); #if defined(USE_POCSAG) if (m_pocsagNetwork != nullptr) @@ -2811,7 +2821,7 @@ void CMMDVMHost::setMode(unsigned char mode) if (m_nxdn != nullptr) m_nxdn->enable(false); #endif - if (m_m17 != nullptr) + if (m_m17 != nullptr && m_m17Enabled) m_m17->enable(true); #if defined(USE_POCSAG) if (m_pocsag != nullptr) @@ -2825,12 +2835,14 @@ void CMMDVMHost::setMode(unsigned char mode) if (m_ax25 != nullptr) m_ax25->enable(false); #endif - m_modem->setMode(MODE_M17); - m_mode = MODE_M17; - m_modeTimer.start(); - m_cwIdTimer.stop(); - createLockFile("M17"); - writeJSONMode("M17"); + if (m_m17Enabled) { + m_modem->setMode(MODE_M17); + m_mode = MODE_M17; + m_modeTimer.start(); + m_cwIdTimer.stop(); + createLockFile("M17"); + writeJSONMode("M17"); + } break; #endif #if defined(USE_POCSAG) @@ -2941,10 +2953,10 @@ void CMMDVMHost::setMode(unsigned char mode) if (m_pocsagNetwork != nullptr) m_pocsagNetwork->enable(false); #endif - if (m_fmNetwork != nullptr) + if (m_fmNetwork != nullptr && m_fmEnabled) m_fmNetwork->enable(true); #if defined(USE_AX25) - if (m_ax25Network != nullptr) + if (m_ax25Network != nullptr && m_fmEnabled) m_ax25Network->enable(true); #endif #if defined(USE_DSTAR) @@ -2974,11 +2986,11 @@ void CMMDVMHost::setMode(unsigned char mode) #if defined(USE_POCSAG) if (m_pocsag != nullptr) m_pocsag->enable(false); -#endif - if (m_fm != nullptr) + if (m_fm != nullptr && m_fmEnabled) m_fm->enable(true); +#endif #if defined(USE_AX25) - if (m_ax25 != nullptr) + if (m_ax25 != nullptr && m_ax25Enabled) m_ax25->enable(true); #endif #if defined(USE_DMR) @@ -2987,12 +2999,14 @@ void CMMDVMHost::setMode(unsigned char mode) m_dmrTXTimer.stop(); } #endif - m_modem->setMode(MODE_FM); - m_mode = MODE_FM; - m_modeTimer.start(); - m_cwIdTimer.stop(); - createLockFile("FM"); - writeJSONMode("FM"); + if (m_fmEnabled) { + m_modem->setMode(MODE_FM); + m_mode = MODE_FM; + m_modeTimer.start(); + m_cwIdTimer.stop(); + createLockFile("FM"); + writeJSONMode("FM"); + } break; #endif @@ -3172,27 +3186,27 @@ void CMMDVMHost::setMode(unsigned char mode) default: #if defined(USE_DSTAR) - if (m_dstarNetwork != nullptr) + if (m_dstarNetwork != nullptr && m_dstarEnabled) m_dstarNetwork->enable(true); #endif #if defined(USE_DMR) - if (m_dmrNetwork != nullptr) + if (m_dmrNetwork != nullptr && m_dmrEnabled) m_dmrNetwork->enable(true); #endif #if defined(USE_YSF) - if (m_ysfNetwork != nullptr) + if (m_ysfNetwork != nullptr && m_ysfEnabled) m_ysfNetwork->enable(true); #endif #if defined(USE_P25) - if (m_p25Network != nullptr) + if (m_p25Network != nullptr && m_p25Enabled) m_p25Network->enable(true); #endif #if defined(USE_NXDN) - if (m_nxdnNetwork != nullptr) + if (m_nxdnNetwork != nullptr && m_nxdnEnabled) m_nxdnNetwork->enable(true); #endif #if defined(USE_M17) - if (m_m17Network != nullptr) + if (m_m17Network != nullptr && m_m17Enabled) m_m17Network->enable(true); #endif #if defined(USE_POCSAG) @@ -3200,35 +3214,35 @@ void CMMDVMHost::setMode(unsigned char mode) m_pocsagNetwork->enable(true); #endif #if defined(USE_FM) - if (m_fmNetwork != nullptr) + if (m_fmNetwork != nullptr && m_fmEnabled) m_fmNetwork->enable(true); #endif #if defined(USE_AX25) - if (m_ax25Network != nullptr) + if (m_ax25Network != nullptr && m_fmEnabled) m_ax25Network->enable(true); #endif #if defined(USE_DSTAR) - if (m_dstar != nullptr) + if (m_dstar != nullptr && m_dstarEnabled) m_dstar->enable(true); #endif #if defined(USE_DMR) - if (m_dmr != nullptr) + if (m_dmr != nullptr && m_dmrEnabled) m_dmr->enable(true); #endif #if defined(USE_YSF) - if (m_ysf != nullptr) + if (m_ysf != nullptr && m_ysfEnabled) m_ysf->enable(true); #endif #if defined(USE_P25) - if (m_p25 != nullptr) + if (m_p25 != nullptr && m_p25Enabled) m_p25->enable(true); #endif #if defined(USE_NXDN) - if (m_nxdn != nullptr) + if (m_nxdn != nullptr && m_nxdnEnabled) m_nxdn->enable(true); #endif #if defined(USE_M17) - if (m_m17 != nullptr) + if (m_m17 != nullptr && m_m17Enabled) m_m17->enable(true); #endif #if defined(USE_POCSAG) @@ -3236,15 +3250,15 @@ void CMMDVMHost::setMode(unsigned char mode) m_pocsag->enable(true); #endif #if defined(USE_FM) - if (m_fm != nullptr) + if (m_fm != nullptr && m_fmEnabled) m_fm->enable(true); #endif #if defined(USE_AX25) - if (m_ax25 != nullptr) + if (m_ax25 != nullptr && m_fmEnabled) m_ax25->enable(true); #endif #if defined(USE_DMR) - 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(); } diff --git a/Version.h b/Version.h index 40c3f4e..b3f7c59 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 = "20250417"; #endif