From 7462c143af323a59f58bb42592536581e1e2c2fb Mon Sep 17 00:00:00 2001 From: Daniel Caujolle-Bert Date: Mon, 28 Apr 2025 07:08:12 +0200 Subject: [PATCH 01/11] Set mode to IDLE when disabling a mode currently in use. --- MMDVMHost.cpp | 40 ++++++++++++++++++++++++++++++++-------- 1 file changed, 32 insertions(+), 8 deletions(-) diff --git a/MMDVMHost.cpp b/MMDVMHost.cpp index f907ed5..daa17ba 100644 --- a/MMDVMHost.cpp +++ b/MMDVMHost.cpp @@ -2639,48 +2639,72 @@ void CMMDVMHost::remoteControl() processEnableCommand(m_ax25Enabled, true); break; case REMOTE_COMMAND::DISABLE_DSTAR: - if (m_dstar != nullptr && m_dstarEnabled) + if (m_dstar != nullptr && m_dstarEnabled) { + if (m_mode == MODE_DSTAR) + setMode(MODE_IDLE); processEnableCommand(m_dstarEnabled, false); + } if (m_dstarNetwork != nullptr) m_dstarNetwork->enable(false); break; case REMOTE_COMMAND::DISABLE_DMR: - if (m_dmr != nullptr && m_dmrEnabled) + if (m_dmr != nullptr && m_dmrEnabled) { + if (m_mode == MODE_DMR) + setMode(MODE_IDLE); processEnableCommand(m_dmrEnabled, false); + } if (m_dmrNetwork != nullptr) m_dmrNetwork->enable(false); break; case REMOTE_COMMAND::DISABLE_YSF: - if (m_ysf != nullptr && m_ysfEnabled) + if (m_ysf != nullptr && m_ysfEnabled) { + if (m_mode == MODE_YSF) + setMode(MODE_IDLE); processEnableCommand(m_ysfEnabled, false); + } if (m_ysfNetwork != nullptr) m_ysfNetwork->enable(false); break; case REMOTE_COMMAND::DISABLE_P25: - if (m_p25 != nullptr && m_p25Enabled) + if (m_p25 != nullptr && m_p25Enabled) { + if (m_mode == MODE_P25) + setMode(MODE_IDLE); processEnableCommand(m_p25Enabled, false); + } if (m_p25Network != nullptr) m_p25Network->enable(false); break; case REMOTE_COMMAND::DISABLE_NXDN: - if (m_nxdn != nullptr && m_nxdnEnabled) + if (m_nxdn != nullptr && m_nxdnEnabled) { + if (m_mode == MODE_NXDN) + setMode(MODE_IDLE); processEnableCommand(m_nxdnEnabled, false); + } if (m_nxdnNetwork != nullptr) m_nxdnNetwork->enable(false); break; case REMOTE_COMMAND::DISABLE_M17: - if (m_m17 != nullptr && m_m17Enabled) + if (m_m17 != nullptr && m_m17Enabled) { + if (m_mode == MODE_M17) + setMode(MODE_IDLE); processEnableCommand(m_m17Enabled, false); + } if (m_m17Network != nullptr) m_m17Network->enable(false); break; case REMOTE_COMMAND::DISABLE_FM: - if (m_fmEnabled) + if (m_fmEnabled) { + if (m_mode == MODE_FM) + setMode(MODE_IDLE); processEnableCommand(m_fmEnabled, false); + } break; case REMOTE_COMMAND::DISABLE_AX25: - if (m_ax25Enabled == true) + if (m_ax25Enabled == true) { + if (m_mode == MODE_FM) + setMode(MODE_IDLE); processEnableCommand(m_ax25Enabled, false); + } break; case REMOTE_COMMAND::PAGE: if (m_pocsag != nullptr) { From 7d2da549c2010e3597f7a59d9c354ba6ccc02eb2 Mon Sep 17 00:00:00 2001 From: Daniel Caujolle-Bert Date: Thu, 29 May 2025 18:29:42 +0200 Subject: [PATCH 02/11] CDMRSlot::clock(), CDStarControl::clock(), CM17Control::clock(), CNXDNControl::clock(), CP25Control::clock(), CYSFControl::clock(): - Leave ASAP when it's disabled. CDMRSlot::enable(), CDStarControl::enable(), CM17Control::enable(), CNXDNControl::enable(), CP25Control::enable(), CYSFControl::enable(): - Log a message when Controller get disabled while running, ", RF user has timed out" or ", network user has timed out", depending of the RF/Net state. CMMDVMHost::run(): - After getting the modem data, don't handle it (read/write, etc) if the given mode is not enabled. MMDVMHost: - Rename CMMDVMHost::processEnableCommand() to CMMDVMHost::enableModemMode(). - Add CMMDVMHost::enableMode() and CMMDVMHost::disableMode(), called now from CMMDVMHost::remoteControl(), which clarify the code. - CMMDVMHost::remoteControl(): * Fix indentation, * Simplify ENABLE_x/DISABLE_x cases code. - CMMDVMHost::setMode(): * Enable pocsag network only if m_pocsagEnabled is true, * Enable ax25 network only if m_ax25Enabled is true (not m_fmEnabled). --- DMRSlot.cpp | 27 +++ DStarControl.cpp | 25 ++ M17Control.cpp | 25 ++ MMDVMHost.cpp | 582 ++++++++++++++++++++++++++++------------------- MMDVMHost.h | 4 +- NXDNControl.cpp | 25 ++ P25Control.cpp | 25 ++ Version.h | 2 +- YSFControl.cpp | 25 ++ 9 files changed, 498 insertions(+), 242 deletions(-) diff --git a/DMRSlot.cpp b/DMRSlot.cpp index e34ab95..ac20000 100644 --- a/DMRSlot.cpp +++ b/DMRSlot.cpp @@ -1870,6 +1870,9 @@ void CDMRSlot::clock() } } + if (!m_enabled) + return; + if ((m_netState == RPT_NET_STATE::AUDIO) || (m_netState == RPT_NET_STATE::DATA)) { m_networkWatchdog.clock(ms); @@ -2238,6 +2241,19 @@ void CDMRSlot::enable(bool enabled) m_queue.clear(); // Reset the RF section + switch (m_rfState) { + case RPT_RF_STATE::LISTENING: + case RPT_RF_STATE::REJECTED: + case RPT_RF_STATE::INVALID: + break; + + default: + if (m_rfTimeoutTimer.isRunning()) { + if (!m_rfTimeout) + LogMessage("DMR Slot %u, RF user has timed out", m_slotNo); + } + break; + } m_rfState = RPT_RF_STATE::LISTENING; m_rfTimeoutTimer.stop(); @@ -2254,6 +2270,17 @@ void CDMRSlot::enable(bool enabled) m_rfLC = nullptr; // Reset the networking section + switch(m_netState) { + case RPT_NET_STATE::IDLE: + break; + + default: + if (m_netTimeoutTimer.isRunning()) { + if (!m_netTimeout) + LogMessage("DMR Slot %u, network user has timed out", m_slotNo); + } + break; + } m_netState = RPT_NET_STATE::IDLE; m_lastFrameValid = false; diff --git a/DStarControl.cpp b/DStarControl.cpp index 93cc77b..488ba0d 100644 --- a/DStarControl.cpp +++ b/DStarControl.cpp @@ -834,6 +834,9 @@ void CDStarControl::clock() if (m_network != nullptr) writeNetwork(); + if (!m_enabled) + return; + m_ackTimer.clock(ms); if (m_ackTimer.isRunning() && m_ackTimer.hasExpired()) { sendAck(); @@ -1299,11 +1302,33 @@ void CDStarControl::enable(bool enabled) m_queue.clear(); // Reset the RF section + switch (m_rfState) { + case RPT_RF_STATE::LISTENING: + case RPT_RF_STATE::REJECTED: + case RPT_RF_STATE::INVALID: + break; + + default: + if (m_rfTimeoutTimer.isRunning()) { + LogMessage("D-Star, RF user has timed out"); + } + break; + } m_rfState = RPT_RF_STATE::LISTENING; m_rfTimeoutTimer.stop(); // Reset the networking section + switch(m_netState) { + case RPT_NET_STATE::IDLE: + break; + + default: + if (m_netTimeoutTimer.isRunning()) { + LogMessage("D-Star, network user has timed out"); + } + break; + } m_netState = RPT_NET_STATE::IDLE; m_lastFrameValid = false; diff --git a/M17Control.cpp b/M17Control.cpp index e6d7ea2..e0323b3 100644 --- a/M17Control.cpp +++ b/M17Control.cpp @@ -838,6 +838,9 @@ void CM17Control::clock(unsigned int ms) if (m_network != nullptr) writeNetwork(); + if (!m_enabled) + return; + m_rfTimeoutTimer.clock(ms); m_netTimeoutTimer.clock(ms); @@ -975,11 +978,33 @@ void CM17Control::enable(bool enabled) m_queue.clear(); // Reset the RF section + switch (m_rfState) { + case RPT_RF_STATE::LISTENING: + case RPT_RF_STATE::REJECTED: + case RPT_RF_STATE::INVALID: + break; + + default: + if (m_rfTimeoutTimer.isRunning()) { + LogMessage("M17, RF user has timed out"); + } + break; + } m_rfState = RPT_RF_STATE::LISTENING; m_rfTimeoutTimer.stop(); // Reset the networking section + switch(m_netState) { + case RPT_NET_STATE::IDLE: + break; + + default: + if (m_netTimeoutTimer.isRunning()) { + LogMessage("M17, network user has timed out"); + } + break; + } m_netState = RPT_NET_STATE::IDLE; m_netTimeoutTimer.stop(); diff --git a/MMDVMHost.cpp b/MMDVMHost.cpp index daa17ba..4ed6761 100644 --- a/MMDVMHost.cpp +++ b/MMDVMHost.cpp @@ -789,7 +789,7 @@ int CMMDVMHost::run() bool ret; len = m_modem->readDStarData(data); - if (m_dstar != nullptr && len > 0U) { + if (m_dstar != nullptr && m_dstarEnabled && len > 0U) { if (m_mode == MODE_IDLE) { bool ret = m_dstar->writeModem(data, len); if (ret) { @@ -806,7 +806,7 @@ int CMMDVMHost::run() } len = m_modem->readDMRData1(data); - if (m_dmr != nullptr && len > 0U) { + if (m_dmr != nullptr && m_dmrEnabled && len > 0U) { if (m_mode == MODE_IDLE) { if (m_duplex) { bool ret = m_dmr->processWakeup(data); @@ -843,7 +843,7 @@ int CMMDVMHost::run() } len = m_modem->readDMRData2(data); - if (m_dmr != nullptr && len > 0U) { + if (m_dmr != nullptr && m_dmrEnabled && len > 0U) { if (m_mode == MODE_IDLE) { if (m_duplex) { bool ret = m_dmr->processWakeup(data); @@ -880,7 +880,7 @@ int CMMDVMHost::run() } len = m_modem->readYSFData(data); - if (m_ysf != nullptr && len > 0U) { + if (m_ysf != nullptr && m_ysfEnabled && len > 0U) { if (m_mode == MODE_IDLE) { bool ret = m_ysf->writeModem(data, len); if (ret) { @@ -897,7 +897,7 @@ int CMMDVMHost::run() } len = m_modem->readP25Data(data); - if (m_p25 != nullptr && len > 0U) { + if (m_p25 != nullptr && m_p25Enabled && len > 0U) { if (m_mode == MODE_IDLE) { bool ret = m_p25->writeModem(data, len); if (ret) { @@ -914,7 +914,7 @@ int CMMDVMHost::run() } len = m_modem->readNXDNData(data); - if (m_nxdn != nullptr && len > 0U) { + if (m_nxdn != nullptr && m_nxdnEnabled && len > 0U) { if (m_mode == MODE_IDLE) { bool ret = m_nxdn->writeModem(data, len); if (ret) { @@ -931,7 +931,7 @@ int CMMDVMHost::run() } len = m_modem->readM17Data(data); - if (m_m17 != nullptr && len > 0U) { + if (m_m17 != nullptr && m_m17Enabled && len > 0U) { if (m_mode == MODE_IDLE) { bool ret = m_m17->writeModem(data, len); if (ret) { @@ -948,7 +948,7 @@ int CMMDVMHost::run() } len = m_modem->readFMData(data); - if (m_fm != nullptr && len > 0U) { + if (m_fm != nullptr && m_fmEnabled && len > 0U) { if (m_mode == MODE_IDLE) { bool ret = m_fm->writeModem(data, len); if (ret) { @@ -965,7 +965,7 @@ int CMMDVMHost::run() } len = m_modem->readAX25Data(data); - if (m_ax25 != nullptr && len > 0U) { + if (m_ax25 != nullptr && m_ax25Enabled && len > 0U) { if (m_mode == MODE_IDLE || m_mode == MODE_FM) { m_ax25->writeModem(data, len); } else if (m_mode != MODE_LOCKOUT) { @@ -982,7 +982,7 @@ int CMMDVMHost::run() setMode(MODE_IDLE); } - if (m_dstar != nullptr) { + if (m_dstar != nullptr && m_dstarEnabled) { ret = m_modem->hasDStarSpace(); if (ret) { len = m_dstar->readModem(data); @@ -1001,7 +1001,7 @@ int CMMDVMHost::run() } } - if (m_dmr != nullptr) { + if (m_dmr != nullptr && m_dmrEnabled) { ret = m_modem->hasDMRSpace1(); if (ret) { len = m_dmr->readModemSlot1(data); @@ -1047,7 +1047,7 @@ int CMMDVMHost::run() } } - if (m_ysf != nullptr) { + if (m_ysf != nullptr && m_ysfEnabled) { ret = m_modem->hasYSFSpace(); if (ret) { len = m_ysf->readModem(data); @@ -1066,7 +1066,7 @@ int CMMDVMHost::run() } } - if (m_p25 != nullptr) { + if (m_p25 != nullptr && m_p25Enabled) { ret = m_modem->hasP25Space(); if (ret) { len = m_p25->readModem(data); @@ -1085,7 +1085,7 @@ int CMMDVMHost::run() } } - if (m_nxdn != nullptr) { + if (m_nxdn != nullptr && m_nxdnEnabled) { ret = m_modem->hasNXDNSpace(); if (ret) { len = m_nxdn->readModem(data); @@ -1104,7 +1104,7 @@ int CMMDVMHost::run() } } - if (m_m17 != nullptr) { + if (m_m17 != nullptr && m_m17Enabled) { ret = m_modem->hasM17Space(); if (ret) { len = m_m17->readModem(data); @@ -1123,7 +1123,7 @@ int CMMDVMHost::run() } } - if (m_pocsag != nullptr) { + if (m_pocsag != nullptr && m_pocsagEnabled) { ret = m_modem->hasPOCSAGSpace(); if (ret) { len = m_pocsag->readModem(data); @@ -1142,7 +1142,7 @@ int CMMDVMHost::run() } } - if (m_fm != nullptr) { + if (m_fm != nullptr && m_fmEnabled) { unsigned int space = m_modem->getFMSpace(); if (space > 0U) { len = m_fm->readModem(data, space); @@ -1161,7 +1161,7 @@ int CMMDVMHost::run() } } - if (m_ax25 != nullptr) { + if (m_ax25 != nullptr && m_ax25Enabled) { ret = m_modem->hasAX25Space(); if (ret) { len = m_ax25->readModem(data); @@ -1267,7 +1267,7 @@ int CMMDVMHost::run() } break; case DMR_BEACONS::NETWORK: - if (m_dmrNetwork != nullptr) { + if (m_dmrNetwork != nullptr && m_dmrEnabled) { bool beacon = m_dmrNetwork->wantsBeacon(); if (beacon) { if ((m_mode == MODE_IDLE || m_mode == MODE_DMR) && !m_modem->hasTX()) { @@ -1300,7 +1300,7 @@ int CMMDVMHost::run() pocsagTimer.clock(ms); if (pocsagTimer.isRunning() && pocsagTimer.hasExpired()) { assert(m_pocsagNetwork != nullptr); - m_pocsagNetwork->enable(m_mode == MODE_IDLE || m_mode == MODE_POCSAG); + m_pocsagNetwork->enable((m_mode == MODE_IDLE || m_mode == MODE_POCSAG) && m_pocsagEnabled); pocsagTimer.start(); } @@ -1984,6 +1984,183 @@ void CMMDVMHost::readParams() LogInfo(" AX.25: %s", m_ax25Enabled ? "enabled" : "disabled"); } +void CMMDVMHost::enableModemMode(bool& mode, bool enabled) +{ + LogDebug("Setting mode current=%s new=%s", mode ? "true" : "false", enabled ? "true" : "false"); + + mode = enabled; + + m_modem->setModeParams(m_dstarEnabled, m_dmrEnabled, m_ysfEnabled, m_p25Enabled, m_nxdnEnabled, m_m17Enabled, m_pocsagEnabled, m_fmEnabled, m_ax25Enabled); + if (!m_modem->writeConfig()) + LogError("Cannot write Config to MMDVM"); +} + +void CMMDVMHost::enableMode(unsigned char mode, bool hasController, bool& modeEnabled, bool isAX25) +{ + if (hasController && !modeEnabled) { + unsigned char data[500U]; + + // Try to recover ASAP when mode is currently set to IDLE, + // as Controller and Network will ::clock() immediatly after. + if (m_mode == MODE_IDLE) { + switch (mode) { + case MODE_DSTAR: + if (m_dstarNetwork != nullptr) + m_dstarNetwork->enable(true); + m_dstar->enable(true); + break; + case MODE_DMR: + if (m_dmrNetwork != nullptr) + m_dmrNetwork->enable(true); + m_dmr->enable(true); + break; + case MODE_YSF: + if (m_ysfNetwork != nullptr) + m_ysfNetwork->enable(true); + m_ysf->enable(true); + break; + case MODE_P25: + if (m_p25Network != nullptr) + m_p25Network->enable(true); + m_p25->enable(true); + break; + case MODE_NXDN: + if (m_nxdnNetwork != nullptr) + m_nxdnNetwork->enable(true); + m_nxdn->enable(true); + break; + case MODE_M17: + if (m_m17Network != nullptr) + m_m17Network->enable(true); + m_m17->enable(true); + break; + case MODE_FM: + if (isAX25) + m_ax25->enable(true); + else + m_fm->enable(true); + break; + default: + break; + } + } + + // Flush modem data for the given mode + switch (mode) { + case MODE_DSTAR: + while (m_modem->readDStarData(data) > 0U); + break; + case MODE_DMR: + while (m_modem->readDMRData1(data) > 0U || m_modem->readDMRData2(data) > 0U); + break; + case MODE_YSF: + while (m_modem->readYSFData(data) > 0U); + break; + case MODE_P25: + while (m_modem->readP25Data(data) > 0U); + break; + case MODE_NXDN: + while (m_modem->readNXDNData(data) > 0U); + break; + case MODE_M17: + while (m_modem->readM17Data(data) > 0U); + break; + case MODE_FM: + while ((isAX25 ? m_modem->readAX25Data(data) : m_modem->readFMData(data)) > 0U); + break; + default: + break; + } + + enableModemMode(modeEnabled, true); + } +} + +void CMMDVMHost::disableMode(unsigned char mode, bool hasController, bool& modeEnabled, bool isAX25) +{ + if (hasController && modeEnabled) { + unsigned char data[500U]; + bool switchToIDLE = (m_mode == mode); + + // Disable Network and Controller + if (switchToIDLE) { + switch (mode) { + case MODE_DSTAR: + if (m_dstarNetwork != nullptr) + m_dstarNetwork->enable(false); + m_dstar->enable(false); + break; + case MODE_DMR: + if (m_dmrNetwork != nullptr) + m_dmrNetwork->enable(false); + m_dmr->enable(false); + break; + case MODE_YSF: + if (m_ysfNetwork != nullptr) + m_ysfNetwork->enable(false); + m_ysf->enable(false); + break; + case MODE_P25: + if (m_p25Network != nullptr) + m_p25Network->enable(false); + m_p25->enable(false); + break; + case MODE_NXDN: + if (m_nxdnNetwork != nullptr) + m_nxdnNetwork->enable(false); + m_nxdn->enable(false); + break; + case MODE_M17: + if (m_m17Network != nullptr) + m_m17Network->enable(false); + m_m17->enable(false); + break; + case MODE_FM: + if (isAX25) { + m_ax25->enable(false); + } + else { + m_fm->enable(false); + } + break; + default: + break; + } + } + + // Flush modem data for the given mode + switch (mode) { + case MODE_DSTAR: + while (m_modem->readDStarData(data) > 0U); + break; + case MODE_DMR: + while (m_modem->readDMRData1(data) > 0U || m_modem->readDMRData2(data) > 0U); + break; + case MODE_YSF: + while (m_modem->readYSFData(data) > 0U); + break; + case MODE_P25: + while (m_modem->readP25Data(data) > 0U); + break; + case MODE_NXDN: + while (m_modem->readNXDNData(data) > 0U); + break; + case MODE_M17: + while (m_modem->readM17Data(data) > 0U); + break; + case MODE_FM: + while ((isAX25 ? m_modem->readAX25Data(data) : m_modem->readFMData(data)) > 0U); + break; + default: + break; + } + + enableModemMode(modeEnabled, false); + + if (switchToIDLE) + setMode(MODE_IDLE); + } +} void CMMDVMHost::setMode(unsigned char mode) { assert(m_modem != nullptr); @@ -2289,7 +2466,7 @@ void CMMDVMHost::setMode(unsigned char mode) m_nxdnNetwork->enable(false); if (m_m17Network != nullptr) m_m17Network->enable(false); - if (m_pocsagNetwork != nullptr) + if (m_pocsagNetwork != nullptr && m_pocsagEnabled) m_pocsagNetwork->enable(true); if (m_fmNetwork != nullptr) m_fmNetwork->enable(false); @@ -2307,7 +2484,7 @@ void CMMDVMHost::setMode(unsigned char mode) m_nxdn->enable(false); if (m_m17 != nullptr) m_m17->enable(false); - if (m_pocsag != nullptr) + if (m_pocsag != nullptr && m_pocsagEnabled) m_pocsag->enable(true); if (m_fm != nullptr) m_fm->enable(false); @@ -2338,7 +2515,7 @@ void CMMDVMHost::setMode(unsigned char mode) m_pocsagNetwork->enable(false); if (m_fmNetwork != nullptr && m_fmEnabled) m_fmNetwork->enable(true); - if (m_ax25Network != nullptr && m_fmEnabled) + if (m_ax25Network != nullptr && m_ax25Enabled) m_ax25Network->enable(true); if (m_dstar != nullptr) m_dstar->enable(false); @@ -2356,7 +2533,7 @@ void CMMDVMHost::setMode(unsigned char mode) m_pocsag->enable(false); if (m_fm != nullptr && m_fmEnabled) m_fm->enable(true); - if (m_ax25 != nullptr && m_fmEnabled) + if (m_ax25 != nullptr && m_ax25Enabled) m_ax25->enable(true); if (m_mode == MODE_DMR && m_duplex && m_modem->hasTX()) { m_modem->writeDMRStart(false); @@ -2486,7 +2663,7 @@ void CMMDVMHost::setMode(unsigned char mode) m_nxdnNetwork->enable(true); if (m_m17Network != nullptr && m_m17Enabled) m_m17Network->enable(true); - if (m_pocsagNetwork != nullptr) + if (m_pocsagNetwork != nullptr && m_pocsagEnabled) m_pocsagNetwork->enable(true); if (m_fmNetwork != nullptr && m_fmEnabled) m_fmNetwork->enable(true); @@ -2504,7 +2681,7 @@ void CMMDVMHost::setMode(unsigned char mode) m_nxdn->enable(true); if (m_m17 != nullptr && m_m17Enabled) m_m17->enable(true); - if (m_pocsag != nullptr) + if (m_pocsag != nullptr && m_pocsagEnabled) m_pocsag->enable(true); if (m_fm != nullptr && m_fmEnabled) m_fm->enable(true); @@ -2559,213 +2736,149 @@ void CMMDVMHost::remoteControl() REMOTE_COMMAND command = m_remoteControl->getCommand(); switch (command) { case REMOTE_COMMAND::MODE_IDLE: - m_fixedMode = false; - setMode(MODE_IDLE); - break; - case REMOTE_COMMAND::MODE_LOCKOUT: - m_fixedMode = false; - setMode(MODE_LOCKOUT); - break; - case REMOTE_COMMAND::MODE_DSTAR: - if (m_dstar != nullptr) - processModeCommand(MODE_DSTAR, m_dstarRFModeHang); - break; - case REMOTE_COMMAND::MODE_DMR: - if (m_dmr != nullptr) - processModeCommand(MODE_DMR, m_dmrRFModeHang); - break; - case REMOTE_COMMAND::MODE_YSF: - if (m_ysf != nullptr) - processModeCommand(MODE_YSF, m_ysfRFModeHang); - break; - case REMOTE_COMMAND::MODE_P25: - if (m_p25 != nullptr) - processModeCommand(MODE_P25, m_p25RFModeHang); - break; - case REMOTE_COMMAND::MODE_NXDN: - if (m_nxdn != nullptr) - processModeCommand(MODE_NXDN, m_nxdnRFModeHang); - break; - case REMOTE_COMMAND::MODE_M17: - if (m_m17 != nullptr) - processModeCommand(MODE_M17, m_m17RFModeHang); - break; - case REMOTE_COMMAND::MODE_FM: - if (m_fmEnabled) - processModeCommand(MODE_FM, 0); - break; - case REMOTE_COMMAND::ENABLE_DSTAR: - if (m_dstar != nullptr && !m_dstarEnabled) - processEnableCommand(m_dstarEnabled, true); - if (m_dstarNetwork != nullptr) - m_dstarNetwork->enable(true); - break; - case REMOTE_COMMAND::ENABLE_DMR: - if (m_dmr != nullptr && !m_dmrEnabled) - processEnableCommand(m_dmrEnabled, true); - if (m_dmrNetwork != nullptr) - m_dmrNetwork->enable(true); - break; - case REMOTE_COMMAND::ENABLE_YSF: - if (m_ysf != nullptr && !m_ysfEnabled) - processEnableCommand(m_ysfEnabled, true); - if (m_ysfNetwork != nullptr) - m_ysfNetwork->enable(true); - break; - case REMOTE_COMMAND::ENABLE_P25: - if (m_p25 != nullptr && !m_p25Enabled) - processEnableCommand(m_p25Enabled, true); - if (m_p25Network != nullptr) - m_p25Network->enable(true); - break; - case REMOTE_COMMAND::ENABLE_NXDN: - if (m_nxdn != nullptr && !m_nxdnEnabled) - processEnableCommand(m_nxdnEnabled, true); - if (m_nxdnNetwork != nullptr) - m_nxdnNetwork->enable(true); - break; - case REMOTE_COMMAND::ENABLE_M17: - if (m_m17 != nullptr && !m_m17Enabled) - processEnableCommand(m_m17Enabled, true); - if (m_m17Network != nullptr) - m_m17Network->enable(true); - break; - case REMOTE_COMMAND::ENABLE_FM: - if (!m_fmEnabled) - processEnableCommand(m_fmEnabled, true); - break; - case REMOTE_COMMAND::ENABLE_AX25: - if (!m_ax25Enabled) - processEnableCommand(m_ax25Enabled, true); - break; - case REMOTE_COMMAND::DISABLE_DSTAR: - if (m_dstar != nullptr && m_dstarEnabled) { - if (m_mode == MODE_DSTAR) - setMode(MODE_IDLE); - processEnableCommand(m_dstarEnabled, false); + m_fixedMode = false; + setMode(MODE_IDLE); + break; + case REMOTE_COMMAND::MODE_LOCKOUT: + m_fixedMode = false; + setMode(MODE_LOCKOUT); + break; + case REMOTE_COMMAND::MODE_DSTAR: + if (m_dstar != nullptr) + processModeCommand(MODE_DSTAR, m_dstarRFModeHang); + break; + case REMOTE_COMMAND::MODE_DMR: + if (m_dmr != nullptr) + processModeCommand(MODE_DMR, m_dmrRFModeHang); + break; + case REMOTE_COMMAND::MODE_YSF: + if (m_ysf != nullptr) + processModeCommand(MODE_YSF, m_ysfRFModeHang); + break; + case REMOTE_COMMAND::MODE_P25: + if (m_p25 != nullptr) + processModeCommand(MODE_P25, m_p25RFModeHang); + break; + case REMOTE_COMMAND::MODE_NXDN: + if (m_nxdn != nullptr) + processModeCommand(MODE_NXDN, m_nxdnRFModeHang); + break; + case REMOTE_COMMAND::MODE_M17: + if (m_m17 != nullptr) + processModeCommand(MODE_M17, m_m17RFModeHang); + break; + case REMOTE_COMMAND::MODE_FM: + if (m_fmEnabled) + processModeCommand(MODE_FM, 0); + break; + case REMOTE_COMMAND::ENABLE_DSTAR: + enableMode(MODE_DSTAR, (m_dstar != nullptr), m_dstarEnabled); + break; + case REMOTE_COMMAND::ENABLE_DMR: + enableMode(MODE_DMR, (m_dmr != nullptr), m_dmrEnabled); + break; + case REMOTE_COMMAND::ENABLE_YSF: + enableMode(MODE_YSF, (m_ysf != nullptr), m_ysfEnabled); + break; + case REMOTE_COMMAND::ENABLE_P25: + enableMode(MODE_P25, (m_p25 != nullptr), m_p25Enabled); + break; + case REMOTE_COMMAND::ENABLE_NXDN: + enableMode(MODE_NXDN, (m_nxdn != nullptr), m_nxdnEnabled); + break; + case REMOTE_COMMAND::ENABLE_M17: + enableMode(MODE_M17, (m_m17 != nullptr), m_m17Enabled); + break; + case REMOTE_COMMAND::ENABLE_FM: + enableMode(MODE_FM, (m_fm != nullptr), m_fmEnabled); + break; + case REMOTE_COMMAND::ENABLE_AX25: + enableMode(MODE_FM, (m_ax25 != nullptr), m_ax25Enabled, true); + break; + case REMOTE_COMMAND::DISABLE_DSTAR: + disableMode(MODE_DSTAR, (m_dstar != nullptr), m_dstarEnabled); + break; + case REMOTE_COMMAND::DISABLE_DMR: + disableMode(MODE_DMR, (m_dmr != nullptr), m_dmrEnabled); + break; + case REMOTE_COMMAND::DISABLE_YSF: + disableMode(MODE_YSF, (m_ysf != nullptr), m_ysfEnabled); + break; + case REMOTE_COMMAND::DISABLE_P25: + disableMode(MODE_P25, (m_p25), m_p25Enabled); + break; + case REMOTE_COMMAND::DISABLE_NXDN: + disableMode(MODE_NXDN, (m_nxdn != nullptr), m_nxdnEnabled); + break; + case REMOTE_COMMAND::DISABLE_M17: + disableMode(MODE_M17, (m_m17 != nullptr), m_m17Enabled); + break; + case REMOTE_COMMAND::DISABLE_FM: + disableMode(MODE_FM, (m_fm != nullptr), m_fmEnabled); + break; + case REMOTE_COMMAND::DISABLE_AX25: + disableMode(MODE_FM, (m_ax25 != nullptr), m_ax25Enabled, true); + break; + case REMOTE_COMMAND::PAGE: + if (m_pocsag != nullptr) { + unsigned int ric = m_remoteControl->getArgUInt(0U); + std::string text; + for (unsigned int i = 1U; i < m_remoteControl->getArgCount(); i++) { + if (i > 1U) + text += " "; + text += m_remoteControl->getArgString(i); } - if (m_dstarNetwork != nullptr) - m_dstarNetwork->enable(false); - break; - case REMOTE_COMMAND::DISABLE_DMR: - if (m_dmr != nullptr && m_dmrEnabled) { - if (m_mode == MODE_DMR) - setMode(MODE_IDLE); - processEnableCommand(m_dmrEnabled, false); + m_pocsag->sendPage(ric, text); + } + break; + case REMOTE_COMMAND::PAGE_BCD: + if (m_pocsag != nullptr) { + unsigned int ric = m_remoteControl->getArgUInt(0U); + std::string text; + for (unsigned int i = 1U; i < m_remoteControl->getArgCount(); i++) { + if (i > 1U) + text += " "; + text += m_remoteControl->getArgString(i); } - if (m_dmrNetwork != nullptr) - m_dmrNetwork->enable(false); - break; - case REMOTE_COMMAND::DISABLE_YSF: - if (m_ysf != nullptr && m_ysfEnabled) { - if (m_mode == MODE_YSF) - setMode(MODE_IDLE); - processEnableCommand(m_ysfEnabled, false); + m_pocsag->sendPageBCD(ric, text); + } + break; + case REMOTE_COMMAND::PAGE_A1: + if (m_pocsag != nullptr) { + unsigned int ric = m_remoteControl->getArgUInt(0U); + m_pocsag->sendPageAlert1(ric); + } + break; + case REMOTE_COMMAND::PAGE_A2: + if (m_pocsag != nullptr) { + unsigned int ric = m_remoteControl->getArgUInt(0U); + std::string text; + for (unsigned int i = 1U; i < m_remoteControl->getArgCount(); i++) { + if (i > 1U) + text += " "; + text += m_remoteControl->getArgString(i); } - if (m_ysfNetwork != nullptr) - m_ysfNetwork->enable(false); - break; - case REMOTE_COMMAND::DISABLE_P25: - if (m_p25 != nullptr && m_p25Enabled) { - if (m_mode == MODE_P25) - setMode(MODE_IDLE); - processEnableCommand(m_p25Enabled, false); + m_pocsag->sendPageAlert2(ric, text); + } + break; + case REMOTE_COMMAND::CW: + setMode(MODE_IDLE); // Force the modem to go idle so that we can send the CW text. + if (!m_modem->hasTX()) { + std::string cwtext; + for (unsigned int i = 0U; i < m_remoteControl->getArgCount(); i++) { + if (i > 0U) + cwtext += " "; + cwtext += m_remoteControl->getArgString(i); } - if (m_p25Network != nullptr) - m_p25Network->enable(false); - break; - case REMOTE_COMMAND::DISABLE_NXDN: - if (m_nxdn != nullptr && m_nxdnEnabled) { - if (m_mode == MODE_NXDN) - setMode(MODE_IDLE); - processEnableCommand(m_nxdnEnabled, false); - } - if (m_nxdnNetwork != nullptr) - m_nxdnNetwork->enable(false); - break; - case REMOTE_COMMAND::DISABLE_M17: - if (m_m17 != nullptr && m_m17Enabled) { - if (m_mode == MODE_M17) - setMode(MODE_IDLE); - processEnableCommand(m_m17Enabled, false); - } - if (m_m17Network != nullptr) - m_m17Network->enable(false); - break; - case REMOTE_COMMAND::DISABLE_FM: - if (m_fmEnabled) { - if (m_mode == MODE_FM) - setMode(MODE_IDLE); - processEnableCommand(m_fmEnabled, false); - } - break; - case REMOTE_COMMAND::DISABLE_AX25: - if (m_ax25Enabled == true) { - if (m_mode == MODE_FM) - setMode(MODE_IDLE); - processEnableCommand(m_ax25Enabled, false); - } - break; - case REMOTE_COMMAND::PAGE: - if (m_pocsag != nullptr) { - unsigned int ric = m_remoteControl->getArgUInt(0U); - std::string text; - for (unsigned int i = 1U; i < m_remoteControl->getArgCount(); i++) { - if (i > 1U) - text += " "; - text += m_remoteControl->getArgString(i); - } - m_pocsag->sendPage(ric, text); - } - break; - case REMOTE_COMMAND::PAGE_BCD: - if (m_pocsag != nullptr) { - unsigned int ric = m_remoteControl->getArgUInt(0U); - std::string text; - for (unsigned int i = 1U; i < m_remoteControl->getArgCount(); i++) { - if (i > 1U) - text += " "; - text += m_remoteControl->getArgString(i); - } - m_pocsag->sendPageBCD(ric, text); - } - break; - case REMOTE_COMMAND::PAGE_A1: - if (m_pocsag != nullptr) { - unsigned int ric = m_remoteControl->getArgUInt(0U); - m_pocsag->sendPageAlert1(ric); - } - break; - case REMOTE_COMMAND::PAGE_A2: - if (m_pocsag != nullptr) { - unsigned int ric = m_remoteControl->getArgUInt(0U); - std::string text; - for (unsigned int i = 1U; i < m_remoteControl->getArgCount(); i++) { - if (i > 1U) - text += " "; - text += m_remoteControl->getArgString(i); - } - m_pocsag->sendPageAlert2(ric, text); - } - break; - case REMOTE_COMMAND::CW: - setMode(MODE_IDLE); // Force the modem to go idle so that we can send the CW text. - if (!m_modem->hasTX()) { - std::string cwtext; - for (unsigned int i = 0U; i < m_remoteControl->getArgCount(); i++) { - if (i > 0U) - cwtext += " "; - cwtext += m_remoteControl->getArgString(i); - } - m_display->writeCW(); - m_modem->sendCWId(cwtext); - } - break; - case REMOTE_COMMAND::RELOAD: - m_reload = true; - break; - default: - break; + m_display->writeCW(); + m_modem->sendCWId(cwtext); + } + break; + case REMOTE_COMMAND::RELOAD: + m_reload = true; + break; + default: + break; } } @@ -2787,17 +2900,6 @@ void CMMDVMHost::processModeCommand(unsigned char mode, unsigned int timeout) setMode(mode); } -void CMMDVMHost::processEnableCommand(bool& mode, bool enabled) -{ - LogDebug("Setting mode current=%s new=%s",mode ? "true" : "false",enabled ? "true" : "false"); - - mode = enabled; - - m_modem->setModeParams(m_dstarEnabled, m_dmrEnabled, m_ysfEnabled, m_p25Enabled, m_nxdnEnabled, m_m17Enabled, m_pocsagEnabled, m_fmEnabled, m_ax25Enabled); - if (!m_modem->writeConfig()) - LogError("Cannot write Config to MMDVM"); -} - void CMMDVMHost::buildNetworkStatusString(std::string &str) { str = ""; diff --git a/MMDVMHost.h b/MMDVMHost.h index a97f72e..73b70df 100644 --- a/MMDVMHost.h +++ b/MMDVMHost.h @@ -136,9 +136,11 @@ private: void remoteControl(); void processModeCommand(unsigned char mode, unsigned int timeout); - void processEnableCommand(bool& mode, bool enabled); void setMode(unsigned char mode); + void enableModemMode(bool& mode, bool enabled); + void enableMode(unsigned char mode, bool hasController, bool& modeEnabled, bool isAX25 = false); + void disableMode(unsigned char mode, bool hasController, bool& modeEnabled, bool isAX25 = false); void createLockFile(const char* mode) const; void removeLockFile() const; diff --git a/NXDNControl.cpp b/NXDNControl.cpp index b909d43..6015ca7 100644 --- a/NXDNControl.cpp +++ b/NXDNControl.cpp @@ -989,6 +989,9 @@ void CNXDNControl::clock(unsigned int ms) if (m_network != nullptr) writeNetwork(); + if (!m_enabled) + return; + m_rfTimeoutTimer.clock(ms); m_netTimeoutTimer.clock(ms); @@ -1117,6 +1120,18 @@ void CNXDNControl::enable(bool enabled) m_queue.clear(); // Reset the RF section + switch (m_rfState) { + case RPT_RF_STATE::LISTENING: + case RPT_RF_STATE::REJECTED: + case RPT_RF_STATE::INVALID: + break; + + default: + if (m_rfTimeoutTimer.isRunning()) { + LogMessage("NXDN, RF user has timed out"); + } + break; + } m_rfState = RPT_RF_STATE::LISTENING; m_rfMask = 0x00U; @@ -1125,6 +1140,16 @@ void CNXDNControl::enable(bool enabled) m_rfTimeoutTimer.stop(); // Reset the networking section + switch(m_netState) { + case RPT_NET_STATE::IDLE: + break; + + default: + if (m_netTimeoutTimer.isRunning()) { + LogMessage("NXDN, network user has timed out"); + } + break; + } m_netState = RPT_NET_STATE::IDLE; m_netMask = 0x00U; diff --git a/P25Control.cpp b/P25Control.cpp index a65ba70..138db0b 100644 --- a/P25Control.cpp +++ b/P25Control.cpp @@ -759,6 +759,9 @@ void CP25Control::clock(unsigned int ms) if (m_network != nullptr) writeNetwork(); + if (!m_enabled) + return; + m_rfTimeout.clock(ms); m_netTimeout.clock(ms); @@ -1249,11 +1252,33 @@ void CP25Control::enable(bool enabled) m_queue.clear(); // Reset the RF section + switch (m_rfState) { + case RPT_RF_STATE::LISTENING: + case RPT_RF_STATE::REJECTED: + case RPT_RF_STATE::INVALID: + break; + + default: + if (m_rfTimeout.isRunning()) { + LogMessage("P25, RF user has timed out"); + } + break; + } m_rfState = RPT_RF_STATE::LISTENING; m_rfTimeout.stop(); m_rfData.reset(); // Reset the networking section + switch(m_netState) { + case RPT_NET_STATE::IDLE: + break; + + default: + if (m_netTimeout.isRunning()) { + LogMessage("P25, network user has timed out"); + } + break; + } m_netTimeout.stop(); m_networkWatchdog.stop(); m_netData.reset(); diff --git a/Version.h b/Version.h index 5481626..b168423 100644 --- a/Version.h +++ b/Version.h @@ -19,6 +19,6 @@ #if !defined(VERSION_H) #define VERSION_H -const char* VERSION = "20250424"; +const char* VERSION = "20250529"; #endif diff --git a/YSFControl.cpp b/YSFControl.cpp index c233487..8d95031 100644 --- a/YSFControl.cpp +++ b/YSFControl.cpp @@ -1057,6 +1057,9 @@ void CYSFControl::clock(unsigned int ms) if (m_network != nullptr) writeNetwork(); + if (!m_enabled) + return; + m_rfTimeoutTimer.clock(ms); m_netTimeoutTimer.clock(ms); @@ -1206,6 +1209,18 @@ void CYSFControl::enable(bool enabled) m_queue.clear(); // Reset the RF section + switch (m_rfState) { + case RPT_RF_STATE::LISTENING: + case RPT_RF_STATE::REJECTED: + case RPT_RF_STATE::INVALID: + break; + + default: + if (m_rfTimeoutTimer.isRunning()) { + LogMessage("YSF, RF user has timed out"); + } + break; + } m_rfState = RPT_RF_STATE::LISTENING; m_rfTimeoutTimer.stop(); @@ -1216,6 +1231,16 @@ void CYSFControl::enable(bool enabled) m_rfDest = nullptr; // Reset the networking section + switch(m_netState) { + case RPT_NET_STATE::IDLE: + break; + + default: + if (m_netTimeoutTimer.isRunning()) { + LogMessage("YSF, network user has timed out"); + } + break; + } m_netState = RPT_NET_STATE::IDLE; m_netTimeoutTimer.stop(); From 065dd7aab116f54310727055a8576453430ce059 Mon Sep 17 00:00:00 2001 From: Daniel Caujolle-Bert Date: Fri, 30 May 2025 09:22:48 +0200 Subject: [PATCH 03/11] Merge enableMode()/disableMode() to processEnableModeCommand(). --- MMDVMHost.cpp | 158 +++++++++++++------------------------------------- MMDVMHost.h | 3 +- 2 files changed, 40 insertions(+), 121 deletions(-) diff --git a/MMDVMHost.cpp b/MMDVMHost.cpp index 4ed6761..d9c95cf 100644 --- a/MMDVMHost.cpp +++ b/MMDVMHost.cpp @@ -1995,50 +1995,52 @@ void CMMDVMHost::enableModemMode(bool& mode, bool enabled) LogError("Cannot write Config to MMDVM"); } -void CMMDVMHost::enableMode(unsigned char mode, bool hasController, bool& modeEnabled, bool isAX25) +void CMMDVMHost::processEnableModeCommand(unsigned char mode, bool hasController, bool& modeEnabled, bool enableMode, bool isAX25) { - if (hasController && !modeEnabled) { + if (hasController && (modeEnabled != enableMode)) { unsigned char data[500U]; + bool switchToOrInIDLE = (enableMode ? (m_mode == MODE_IDLE) : (m_mode == mode)); - // Try to recover ASAP when mode is currently set to IDLE, + // Enable or disable Controller and Network. + // When re-enabling, it tries to recover ASAP when mode is currently set to IDLE, // as Controller and Network will ::clock() immediatly after. - if (m_mode == MODE_IDLE) { + if (switchToOrInIDLE) { switch (mode) { case MODE_DSTAR: if (m_dstarNetwork != nullptr) - m_dstarNetwork->enable(true); - m_dstar->enable(true); + m_dstarNetwork->enable(enableMode); + m_dstar->enable(enableMode); break; case MODE_DMR: if (m_dmrNetwork != nullptr) - m_dmrNetwork->enable(true); - m_dmr->enable(true); + m_dmrNetwork->enable(enableMode); + m_dmr->enable(enableMode); break; case MODE_YSF: if (m_ysfNetwork != nullptr) - m_ysfNetwork->enable(true); - m_ysf->enable(true); + m_ysfNetwork->enable(enableMode); + m_ysf->enable(enableMode); break; case MODE_P25: if (m_p25Network != nullptr) - m_p25Network->enable(true); - m_p25->enable(true); + m_p25Network->enable(enableMode); + m_p25->enable(enableMode); break; case MODE_NXDN: if (m_nxdnNetwork != nullptr) - m_nxdnNetwork->enable(true); - m_nxdn->enable(true); + m_nxdnNetwork->enable(enableMode); + m_nxdn->enable(enableMode); break; case MODE_M17: if (m_m17Network != nullptr) - m_m17Network->enable(true); - m_m17->enable(true); + m_m17Network->enable(enableMode); + m_m17->enable(enableMode); break; case MODE_FM: if (isAX25) - m_ax25->enable(true); + m_ax25->enable(enableMode); else - m_fm->enable(true); + m_fm->enable(enableMode); break; default: break; @@ -2072,95 +2074,13 @@ void CMMDVMHost::enableMode(unsigned char mode, bool hasController, bool& modeEn break; } - enableModemMode(modeEnabled, true); - } -} + enableModemMode(modeEnabled, enableMode); -void CMMDVMHost::disableMode(unsigned char mode, bool hasController, bool& modeEnabled, bool isAX25) -{ - if (hasController && modeEnabled) { - unsigned char data[500U]; - bool switchToIDLE = (m_mode == mode); - - // Disable Network and Controller - if (switchToIDLE) { - switch (mode) { - case MODE_DSTAR: - if (m_dstarNetwork != nullptr) - m_dstarNetwork->enable(false); - m_dstar->enable(false); - break; - case MODE_DMR: - if (m_dmrNetwork != nullptr) - m_dmrNetwork->enable(false); - m_dmr->enable(false); - break; - case MODE_YSF: - if (m_ysfNetwork != nullptr) - m_ysfNetwork->enable(false); - m_ysf->enable(false); - break; - case MODE_P25: - if (m_p25Network != nullptr) - m_p25Network->enable(false); - m_p25->enable(false); - break; - case MODE_NXDN: - if (m_nxdnNetwork != nullptr) - m_nxdnNetwork->enable(false); - m_nxdn->enable(false); - break; - case MODE_M17: - if (m_m17Network != nullptr) - m_m17Network->enable(false); - m_m17->enable(false); - break; - case MODE_FM: - if (isAX25) { - m_ax25->enable(false); - } - else { - m_fm->enable(false); - } - break; - default: - break; - } - } - - // Flush modem data for the given mode - switch (mode) { - case MODE_DSTAR: - while (m_modem->readDStarData(data) > 0U); - break; - case MODE_DMR: - while (m_modem->readDMRData1(data) > 0U || m_modem->readDMRData2(data) > 0U); - break; - case MODE_YSF: - while (m_modem->readYSFData(data) > 0U); - break; - case MODE_P25: - while (m_modem->readP25Data(data) > 0U); - break; - case MODE_NXDN: - while (m_modem->readNXDNData(data) > 0U); - break; - case MODE_M17: - while (m_modem->readM17Data(data) > 0U); - break; - case MODE_FM: - while ((isAX25 ? m_modem->readAX25Data(data) : m_modem->readFMData(data)) > 0U); - break; - default: - break; - } - - enableModemMode(modeEnabled, false); - - if (switchToIDLE) + if (!enableMode && switchToOrInIDLE) setMode(MODE_IDLE); } } + void CMMDVMHost::setMode(unsigned char mode) { assert(m_modem != nullptr); @@ -2772,52 +2692,52 @@ void CMMDVMHost::remoteControl() processModeCommand(MODE_FM, 0); break; case REMOTE_COMMAND::ENABLE_DSTAR: - enableMode(MODE_DSTAR, (m_dstar != nullptr), m_dstarEnabled); + processEnableModeCommand(MODE_DSTAR, (m_dstar != nullptr), m_dstarEnabled, true); break; case REMOTE_COMMAND::ENABLE_DMR: - enableMode(MODE_DMR, (m_dmr != nullptr), m_dmrEnabled); + processEnableModeCommand(MODE_DMR, (m_dmr != nullptr), m_dmrEnabled, true); break; case REMOTE_COMMAND::ENABLE_YSF: - enableMode(MODE_YSF, (m_ysf != nullptr), m_ysfEnabled); + processEnableModeCommand(MODE_YSF, (m_ysf != nullptr), m_ysfEnabled, true); break; case REMOTE_COMMAND::ENABLE_P25: - enableMode(MODE_P25, (m_p25 != nullptr), m_p25Enabled); + processEnableModeCommand(MODE_P25, (m_p25 != nullptr), m_p25Enabled, true); break; case REMOTE_COMMAND::ENABLE_NXDN: - enableMode(MODE_NXDN, (m_nxdn != nullptr), m_nxdnEnabled); + processEnableModeCommand(MODE_NXDN, (m_nxdn != nullptr), m_nxdnEnabled, true); break; case REMOTE_COMMAND::ENABLE_M17: - enableMode(MODE_M17, (m_m17 != nullptr), m_m17Enabled); + processEnableModeCommand(MODE_M17, (m_m17 != nullptr), m_m17Enabled, true); break; case REMOTE_COMMAND::ENABLE_FM: - enableMode(MODE_FM, (m_fm != nullptr), m_fmEnabled); + processEnableModeCommand(MODE_FM, (m_fm != nullptr), m_fmEnabled, true); break; case REMOTE_COMMAND::ENABLE_AX25: - enableMode(MODE_FM, (m_ax25 != nullptr), m_ax25Enabled, true); + processEnableModeCommand(MODE_FM, (m_ax25 != nullptr), m_ax25Enabled, true, true); break; case REMOTE_COMMAND::DISABLE_DSTAR: - disableMode(MODE_DSTAR, (m_dstar != nullptr), m_dstarEnabled); + processEnableModeCommand(MODE_DSTAR, (m_dstar != nullptr), m_dstarEnabled, false); break; case REMOTE_COMMAND::DISABLE_DMR: - disableMode(MODE_DMR, (m_dmr != nullptr), m_dmrEnabled); + processEnableModeCommand(MODE_DMR, (m_dmr != nullptr), m_dmrEnabled, false); break; case REMOTE_COMMAND::DISABLE_YSF: - disableMode(MODE_YSF, (m_ysf != nullptr), m_ysfEnabled); + processEnableModeCommand(MODE_YSF, (m_ysf != nullptr), m_ysfEnabled, false); break; case REMOTE_COMMAND::DISABLE_P25: - disableMode(MODE_P25, (m_p25), m_p25Enabled); + processEnableModeCommand(MODE_P25, (m_p25), m_p25Enabled, false); break; case REMOTE_COMMAND::DISABLE_NXDN: - disableMode(MODE_NXDN, (m_nxdn != nullptr), m_nxdnEnabled); + processEnableModeCommand(MODE_NXDN, (m_nxdn != nullptr), m_nxdnEnabled, false); break; case REMOTE_COMMAND::DISABLE_M17: - disableMode(MODE_M17, (m_m17 != nullptr), m_m17Enabled); + processEnableModeCommand(MODE_M17, (m_m17 != nullptr), m_m17Enabled, false); break; case REMOTE_COMMAND::DISABLE_FM: - disableMode(MODE_FM, (m_fm != nullptr), m_fmEnabled); + processEnableModeCommand(MODE_FM, (m_fm != nullptr), m_fmEnabled, false); break; case REMOTE_COMMAND::DISABLE_AX25: - disableMode(MODE_FM, (m_ax25 != nullptr), m_ax25Enabled, true); + processEnableModeCommand(MODE_FM, (m_ax25 != nullptr), m_ax25Enabled, false, true); break; case REMOTE_COMMAND::PAGE: if (m_pocsag != nullptr) { diff --git a/MMDVMHost.h b/MMDVMHost.h index 73b70df..678e3ef 100644 --- a/MMDVMHost.h +++ b/MMDVMHost.h @@ -139,8 +139,7 @@ private: void setMode(unsigned char mode); void enableModemMode(bool& mode, bool enabled); - void enableMode(unsigned char mode, bool hasController, bool& modeEnabled, bool isAX25 = false); - void disableMode(unsigned char mode, bool hasController, bool& modeEnabled, bool isAX25 = false); + void processEnableModeCommand(unsigned char mode, bool hasController, bool& modeEnabled, bool enableMode, bool isAX25 = false); void createLockFile(const char* mode) const; void removeLockFile() const; From 14ee06fed011b9b279002dd477a42a41003d0458 Mon Sep 17 00:00:00 2001 From: Daniel Caujolle-Bert Date: Mon, 2 Jun 2025 17:06:12 +0200 Subject: [PATCH 04/11] Fix Windows build (few warnings and a wrong file descriptor comparison). --- LCDproc.cpp | 4 ++++ MMDVMHost.cpp | 2 ++ 2 files changed, 6 insertions(+) diff --git a/LCDproc.cpp b/LCDproc.cpp index 1b112c5..eb99d35 100644 --- a/LCDproc.cpp +++ b/LCDproc.cpp @@ -161,7 +161,11 @@ bool CLCDproc::open() /* Create TCP socket */ m_socketfd = socket(clientAddress.ss_family, SOCK_STREAM, 0); +#if defined(_WIN32) || defined(_WIN64) + if (m_socketfd == INVALID_SOCKET) { +#else if (m_socketfd == -1) { +#endif LogError("LCDproc, failed to create socket"); return false; } diff --git a/MMDVMHost.cpp b/MMDVMHost.cpp index daa17ba..6d8a95c 100644 --- a/MMDVMHost.cpp +++ b/MMDVMHost.cpp @@ -1402,7 +1402,9 @@ bool CMMDVMHost::createModem() std::string uartPort = m_conf.getModemUARTPort(); unsigned int uartSpeed = m_conf.getModemUARTSpeed(); std::string i2cPort = m_conf.getModemI2CPort(); +#if defined(__linux__) unsigned int i2cAddress = m_conf.getModemI2CAddress(); +#endif std::string modemAddress = m_conf.getModemModemAddress(); unsigned short modemPort = m_conf.getModemModemPort(); std::string localAddress = m_conf.getModemLocalAddress(); From 2e24ba1f4143cb6ba21ff55566da7eaaeda82c39 Mon Sep 17 00:00:00 2001 From: Daniel Caujolle-Bert Date: Sat, 7 Jun 2025 17:31:46 +0200 Subject: [PATCH 05/11] Reintroduce [NXDN Network]::Protocol config item, as it got deleted at some point. Fix nullptr instead of NULL argument usage in getaddrinfo(). Bump version. --- Conf.cpp | 2 ++ UDPSocket.cpp | 2 +- Version.h | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/Conf.cpp b/Conf.cpp index 8517b35..d8f9bf8 100644 --- a/Conf.cpp +++ b/Conf.cpp @@ -993,6 +993,8 @@ bool CConf::read() } else if (section == SECTION::NXDN_NETWORK) { if (::strcmp(key, "Enable") == 0) m_nxdnNetworkEnabled = ::atoi(value) == 1; + else if (::strcmp(key, "Protocol") == 0) + m_nxdnNetworkProtocol = value; else if (::strcmp(key, "LocalAddress") == 0) m_nxdnLocalAddress = value; else if (::strcmp(key, "LocalPort") == 0) diff --git a/UDPSocket.cpp b/UDPSocket.cpp index 27101fa..47a0774 100644 --- a/UDPSocket.cpp +++ b/UDPSocket.cpp @@ -94,7 +94,7 @@ int CUDPSocket::lookup(const std::string& hostname, unsigned short port, sockadd /* Port is always digits, no needs to lookup service */ hints.ai_flags |= AI_NUMERICSERV; - int err = ::getaddrinfo(hostname.empty() ? nullptr : hostname.c_str(), portstr.c_str(), &hints, &res); + int err = ::getaddrinfo(hostname.empty() ? NULL : hostname.c_str(), portstr.c_str(), &hints, &res); if (err != 0) { sockaddr_in* paddr = (sockaddr_in*)&addr; ::memset(paddr, 0x00U, address_length = sizeof(sockaddr_in)); diff --git a/Version.h b/Version.h index b168423..adfcc95 100644 --- a/Version.h +++ b/Version.h @@ -19,6 +19,6 @@ #if !defined(VERSION_H) #define VERSION_H -const char* VERSION = "20250529"; +const char* VERSION = "20250607"; #endif From 92215d0dc24e2139f6635641cdb834d6361c2e81 Mon Sep 17 00:00:00 2001 From: Chipster Date: Sun, 8 Jun 2025 04:03:10 -0500 Subject: [PATCH 06/11] Fix up OLED formating by leveraging more cursor pos. calls --- OLED.cpp | 50 +++++++++++++++++++++++++------------------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/OLED.cpp b/OLED.cpp index da7d91d..5731b7c 100644 --- a/OLED.cpp +++ b/OLED.cpp @@ -239,9 +239,9 @@ bool COLED::open() OLED_statusbar(); - m_display.setCursor(0, OLED_LINE4); + m_display.setCursor(22, OLED_LINE4); m_display.setTextSize(1); - m_display.print(" -Initializing-"); + m_display.print("-Initializing-"); m_display.display(); return true; @@ -333,9 +333,9 @@ void COLED::setIdleInt() } } else { // Connected to network - no Auto-AP mode; normal display layout... if (m_displayLogoScreensaver) { - m_display.setCursor(0, OLED_LINE2); + m_display.setCursor(42, OLED_LINE2); m_display.setTextSize(1); - m_display.print(" -IDLE-"); + m_display.print("-IDLE-"); m_display.setCursor(0, OLED_LINE4); m_display.printf("%s", m_ipaddress.c_str()); @@ -391,9 +391,9 @@ void COLED::setQuitInt() m_display.clearDisplay(); OLED_statusbar(); - m_display.setCursor(0, 30); - m_display.setTextSize(2); - m_display.print(" Stopping"); + m_display.setCursor(28, 30); + m_display.setTextSize(1); + m_display.print("Stopping..."); m_display.setTextSize(1); m_display.display(); @@ -443,7 +443,7 @@ void COLED::clearDStarInt() { m_display.fillRect(0, OLED_LINE3, m_display.width(),m_display.height(), BLACK); //clear everything beneath the logo - m_display.setCursor(40, OLED_LINE3); + m_display.setCursor(37, OLED_LINE3); m_display.print("Standby"); m_display.setCursor(0, OLED_LINE5); @@ -562,7 +562,7 @@ void COLED::clearFusionInt() { m_display.fillRect(0, OLED_LINE2, m_display.width(), m_display.height(), BLACK); - m_display.setCursor(40, OLED_LINE4); + m_display.setCursor(37, OLED_LINE4); m_display.print("Standby"); m_display.setCursor(0, OLED_LINE6); @@ -593,7 +593,7 @@ void COLED::clearP25Int() { m_display.fillRect(0, OLED_LINE2, m_display.width(), m_display.height(), BLACK); - m_display.setCursor(40, OLED_LINE4); + m_display.setCursor(37, OLED_LINE4); m_display.print("Standby"); m_display.setCursor(0, OLED_LINE6); @@ -645,7 +645,7 @@ void COLED::clearNXDNInt() { m_display.fillRect(0, OLED_LINE2, m_display.width(), m_display.height(), BLACK); - m_display.setCursor(40, OLED_LINE3); + m_display.setCursor(37, OLED_LINE3); m_display.print("Standby"); m_display.setCursor(0, OLED_LINE6); @@ -679,7 +679,7 @@ void COLED::clearM17Int() { m_display.fillRect(0, OLED_LINE2, m_display.width(), m_display.height(), BLACK); - m_display.setCursor(40, OLED_LINE4); + m_display.setCursor(37, OLED_LINE4); m_display.print("Standby"); m_display.setCursor(0, OLED_LINE6); @@ -754,7 +754,7 @@ void COLED::clearPOCSAGInt() { m_display.fillRect(0, OLED_LINE2, m_display.width(), m_display.height(), BLACK); - m_display.setCursor(40, OLED_LINE3); + m_display.setCursor(37, OLED_LINE3); m_display.print("Standby"); m_display.setCursor(0, OLED_LINE6); @@ -767,7 +767,7 @@ void COLED::writeCWInt() { m_display.clearDisplay(); - m_display.setCursor(0, 30); + m_display.setCursor(15, 30); m_display.setTextSize(2); m_display.print("CW ID TX"); @@ -782,12 +782,11 @@ void COLED::clearCWInt() { m_display.clearDisplay(); - m_display.setCursor(0, OLED_LINE1); - m_display.setTextSize(2); + m_display.setCursor(17,OLED_LINE1); m_display.setTextSize(1); - m_display.print(" -IDLE-"); - m_display.setCursor(0, OLED_LINE3); - m_display.printf("%s", m_ipaddress.c_str()); + m_display.print("-IDLE-"); + m_display.setCursor(0,OLED_LINE3); + m_display.printf("%s",m_ipaddress.c_str()); // Display temperature float tempCelsius = readTemperature("/sys/class/thermal/thermal_zone0/temp"); @@ -796,13 +795,14 @@ void COLED::clearCWInt() float tempFahrenheit = (tempCelsius * 9.0F / 5.0F) + 32.0F; m_display.setCursor(0, OLED_LINE5); m_display.setTextSize(1); - m_display.printf("Temp: %.0fF / %.0fC ", tempFahrenheit, tempCelsius); + m_display.printf("CPU Temp: %.0fF/%.0fC ", tempFahrenheit, tempCelsius); } - if (m_displayScroll) - m_display.startscrolldiagleft(0x00, 0x0f); - + m_display.setTextSize(1); m_display.display(); + + if (m_displayScroll) + m_display.startscrolldiagleft(0x00,0x0f); } void COLED::close() @@ -813,9 +813,9 @@ void COLED::close() if (m_displayScroll) m_display.startscrollleft(0x00, 0x01); - m_display.setCursor(0, OLED_LINE3); + m_display.setCursor(11, OLED_LINE3); m_display.setTextSize(2); - m_display.print(" -OFFLINE-"); + m_display.print("-OFFLINE-"); m_display.display(); m_display.close(); From 9720c7a40d376acdb43bb95488d83ea335174cbe Mon Sep 17 00:00:00 2001 From: Jonathan Naylor Date: Wed, 9 Jul 2025 13:38:55 +0100 Subject: [PATCH 07/11] Make space for dPMR. --- CASTInfo.cpp | 10 - CASTInfo.h | 5 +- Conf.cpp | 130 +---- Conf.h | 34 -- Defines.h | 1 - Display.cpp | 47 -- Display.h | 12 +- HD44780.cpp | 102 +--- HD44780.h | 6 +- Images/M17.bmp | Bin 58014 -> 0 bytes LCDproc.cpp | 68 --- LCDproc.h | 4 - M17CRC.cpp | 84 --- M17CRC.h | 34 -- M17Control.cpp | 1015 ------------------------------------- M17Control.h | 115 ----- M17Convolution.cpp | 283 ----------- M17Convolution.h | 51 -- M17Defines.h | 80 --- M17LSF.cpp | 220 -------- M17LSF.h | 73 --- M17Network.cpp | 217 -------- M17Network.h | 66 --- M17Utils.cpp | 236 --------- M17Utils.h | 41 -- MMDVM.ini | 17 - MMDVMHost.cpp | 227 +-------- MMDVMHost.h | 10 +- MMDVMHost.vcxproj | 13 - MMDVMHost.vcxproj.filters | 39 -- Makefile | 2 +- Makefile.Pi.Adafruit | 2 +- Makefile.Pi.HD44780 | 2 +- Makefile.Pi.I2C | 2 +- Makefile.Pi.OLED | 2 +- Makefile.Pi.PCF8574 | 2 +- Modem.cpp | 212 +------- Modem.h | 16 +- Nextion.cpp | 75 --- Nextion.h | 7 +- NullDisplay.cpp | 16 +- NullDisplay.h | 3 - OLED.cpp | 60 +-- OLED.h | 5 +- README.md | 5 +- RemoteControl.cpp | 8 - RemoteControl.h | 3 - Sync.cpp | 23 - Sync.h | 6 +- TFTSurenoo.cpp | 24 - TFTSurenoo.h | 5 +- Version.h | 2 +- 52 files changed, 38 insertions(+), 3684 deletions(-) delete mode 100644 Images/M17.bmp delete mode 100644 M17CRC.cpp delete mode 100644 M17CRC.h delete mode 100644 M17Control.cpp delete mode 100644 M17Control.h delete mode 100644 M17Convolution.cpp delete mode 100644 M17Convolution.h delete mode 100644 M17Defines.h delete mode 100644 M17LSF.cpp delete mode 100644 M17LSF.h delete mode 100644 M17Network.cpp delete mode 100644 M17Network.h delete mode 100644 M17Utils.cpp delete mode 100644 M17Utils.h diff --git a/CASTInfo.cpp b/CASTInfo.cpp index a0bc82b..fcc98f8 100644 --- a/CASTInfo.cpp +++ b/CASTInfo.cpp @@ -128,16 +128,6 @@ void CCASTInfo::clearNXDNInt() { } -void CCASTInfo::writeM17Int(const char* source, const char* dest, const char* type) -{ - if (m_modem != nullptr) - m_modem->writeM17Info(source, dest, type); -} - -void CCASTInfo::clearM17Int() -{ -} - void CCASTInfo::writePOCSAGInt(uint32_t ric, const std::string& message) { if (m_modem != nullptr) diff --git a/CASTInfo.h b/CASTInfo.h index 0740197..5609852 100644 --- a/CASTInfo.h +++ b/CASTInfo.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2016,2018,2020,2021 by Jonathan Naylor G4KLX + * Copyright (C) 2016,2018,2020,2021,2025 by Jonathan Naylor G4KLX * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -58,9 +58,6 @@ protected: virtual void writeNXDNInt(const char* source, bool group, unsigned int dest, const char* type); virtual void clearNXDNInt(); - virtual void writeM17Int(const char* source, const char* dest, const char* type); - virtual void clearM17Int(); - virtual void writePOCSAGInt(uint32_t ric, const std::string& message); virtual void clearPOCSAGInt(); diff --git a/Conf.cpp b/Conf.cpp index d8f9bf8..409ec1c 100644 --- a/Conf.cpp +++ b/Conf.cpp @@ -42,7 +42,6 @@ enum class SECTION { FUSION, P25, NXDN, - M17, POCSAG, FM, AX25, @@ -51,7 +50,6 @@ enum class SECTION { FUSION_NETWORK, P25_NETWORK, NXDN_NETWORK, - M17_NETWORK, POCSAG_NETWORK, FM_NETWORK, AX25_NETWORK, @@ -119,7 +117,6 @@ m_modemDMRTXLevel(50.0F), m_modemYSFTXLevel(50.0F), m_modemP25TXLevel(50.0F), m_modemNXDNTXLevel(50.0F), -m_modemM17TXLevel(50.0F), m_modemPOCSAGTXLevel(50.0F), m_modemFMTXLevel(50.0F), m_modemAX25TXLevel(50.0F), @@ -183,12 +180,6 @@ m_nxdnSelfOnly(false), m_nxdnRemoteGateway(false), m_nxdnTXHang(5U), m_nxdnModeHang(10U), -m_m17Enabled(false), -m_m17CAN(0U), -m_m17SelfOnly(false), -m_m17AllowEncryption(false), -m_m17TXHang(5U), -m_m17ModeHang(10U), m_pocsagEnabled(false), m_pocsagFrequency(0U), m_fmEnabled(false), @@ -275,13 +266,6 @@ m_nxdnLocalAddress(), m_nxdnLocalPort(0U), m_nxdnNetworkModeHang(3U), m_nxdnNetworkDebug(false), -m_m17NetworkEnabled(false), -m_m17GatewayAddress(), -m_m17GatewayPort(0U), -m_m17LocalAddress(), -m_m17LocalPort(0U), -m_m17NetworkModeHang(3U), -m_m17NetworkDebug(false), m_pocsagNetworkEnabled(false), m_pocsagGatewayAddress(), m_pocsagGatewayPort(0U), @@ -395,8 +379,6 @@ bool CConf::read() section = SECTION::P25; else if (::strncmp(buffer, "[NXDN]", 6U) == 0) section = SECTION::NXDN; - else if (::strncmp(buffer, "[M17]", 5U) == 0) - section = SECTION::M17; else if (::strncmp(buffer, "[POCSAG]", 8U) == 0) section = SECTION::POCSAG; else if (::strncmp(buffer, "[FM]", 4U) == 0) @@ -413,8 +395,6 @@ bool CConf::read() section = SECTION::P25_NETWORK; else if (::strncmp(buffer, "[NXDN Network]", 14U) == 0) section = SECTION::NXDN_NETWORK; - else if (::strncmp(buffer, "[M17 Network]", 13U) == 0) - section = SECTION::M17_NETWORK; else if (::strncmp(buffer, "[POCSAG Network]", 16U) == 0) section = SECTION::POCSAG_NETWORK; else if (::strncmp(buffer, "[FM Network]", 12U) == 0) @@ -479,12 +459,12 @@ bool CConf::read() else if (::strcmp(key, "Duplex") == 0) m_duplex = ::atoi(value) == 1; else if (::strcmp(key, "ModeHang") == 0) - m_dstarNetworkModeHang = m_dmrNetworkModeHang = m_fusionNetworkModeHang = m_p25NetworkModeHang = m_nxdnNetworkModeHang = m_m17NetworkModeHang = m_fmNetworkModeHang = - m_dstarModeHang = m_dmrModeHang = m_fusionModeHang = m_p25ModeHang = m_nxdnModeHang = m_m17ModeHang = m_fmModeHang = (unsigned int)::atoi(value); + m_dstarNetworkModeHang = m_dmrNetworkModeHang = m_fusionNetworkModeHang = m_p25NetworkModeHang = m_nxdnNetworkModeHang = m_fmNetworkModeHang = + m_dstarModeHang = m_dmrModeHang = m_fusionModeHang = m_p25ModeHang = m_nxdnModeHang = m_fmModeHang = (unsigned int)::atoi(value); else if (::strcmp(key, "RFModeHang") == 0) - m_dstarModeHang = m_dmrModeHang = m_fusionModeHang = m_p25ModeHang = m_nxdnModeHang = m_m17ModeHang = m_fmModeHang = (unsigned int)::atoi(value); + m_dstarModeHang = m_dmrModeHang = m_fusionModeHang = m_p25ModeHang = m_nxdnModeHang = m_fmModeHang = (unsigned int)::atoi(value); else if (::strcmp(key, "NetModeHang") == 0) - m_dstarNetworkModeHang = m_dmrNetworkModeHang = m_fusionNetworkModeHang = m_p25NetworkModeHang = m_nxdnNetworkModeHang = m_m17NetworkModeHang = m_fmNetworkModeHang = (unsigned int)::atoi(value); + m_dstarNetworkModeHang = m_dmrNetworkModeHang = m_fusionNetworkModeHang = m_p25NetworkModeHang = m_nxdnNetworkModeHang = m_fmNetworkModeHang = (unsigned int)::atoi(value); else if (::strcmp(key, "Display") == 0) m_display = value; else if (::strcmp(key, "Daemon") == 0) @@ -582,7 +562,7 @@ bool CConf::read() else if (::strcmp(key, "RXLevel") == 0) m_modemRXLevel = float(::atof(value)); else if (::strcmp(key, "TXLevel") == 0) - m_modemAX25TXLevel = m_modemFMTXLevel = m_modemCWIdTXLevel = m_modemDStarTXLevel = m_modemDMRTXLevel = m_modemYSFTXLevel = m_modemP25TXLevel = m_modemNXDNTXLevel = m_modemM17TXLevel = m_modemPOCSAGTXLevel = float(::atof(value)); + m_modemAX25TXLevel = m_modemFMTXLevel = m_modemCWIdTXLevel = m_modemDStarTXLevel = m_modemDMRTXLevel = m_modemYSFTXLevel = m_modemP25TXLevel = m_modemNXDNTXLevel = m_modemPOCSAGTXLevel = float(::atof(value)); else if (::strcmp(key, "CWIdTXLevel") == 0) m_modemCWIdTXLevel = float(::atof(value)); else if (::strcmp(key, "D-StarTXLevel") == 0) @@ -595,8 +575,6 @@ bool CConf::read() m_modemP25TXLevel = float(::atof(value)); else if (::strcmp(key, "NXDNTXLevel") == 0) m_modemNXDNTXLevel = float(::atof(value)); - else if (::strcmp(key, "M17TXLevel") == 0) - m_modemM17TXLevel = float(::atof(value)); else if (::strcmp(key, "POCSAGTXLevel") == 0) m_modemPOCSAGTXLevel = float(::atof(value)); else if (::strcmp(key, "FMTXLevel") == 0) @@ -801,19 +779,6 @@ bool CConf::read() m_nxdnTXHang = (unsigned int)::atoi(value); else if (::strcmp(key, "ModeHang") == 0) m_nxdnModeHang = (unsigned int)::atoi(value); - } else if (section == SECTION::M17) { - if (::strcmp(key, "Enable") == 0) - m_m17Enabled = ::atoi(value) == 1; - else if (::strcmp(key, "CAN") == 0) - m_m17CAN = (unsigned int)::atoi(value); - else if (::strcmp(key, "SelfOnly") == 0) - m_m17SelfOnly = ::atoi(value) == 1; - else if (::strcmp(key, "AllowEncryption") == 0) - m_m17AllowEncryption = ::atoi(value) == 1; - else if (::strcmp(key, "TXHang") == 0) - m_m17TXHang = (unsigned int)::atoi(value); - else if (::strcmp(key, "ModeHang") == 0) - m_m17ModeHang = (unsigned int)::atoi(value); } else if (section == SECTION::POCSAG) { if (::strcmp(key, "Enable") == 0) m_pocsagEnabled = ::atoi(value) == 1; @@ -1007,21 +972,6 @@ bool CConf::read() m_nxdnNetworkModeHang = (unsigned int)::atoi(value); else if (::strcmp(key, "Debug") == 0) m_nxdnNetworkDebug = ::atoi(value) == 1; - } else if (section == SECTION::M17_NETWORK) { - if (::strcmp(key, "Enable") == 0) - m_m17NetworkEnabled = ::atoi(value) == 1; - else if (::strcmp(key, "LocalAddress") == 0) - m_m17LocalAddress = value; - else if (::strcmp(key, "LocalPort") == 0) - m_m17LocalPort = (unsigned short)::atoi(value); - else if (::strcmp(key, "GatewayAddress") == 0) - m_m17GatewayAddress = value; - else if (::strcmp(key, "GatewayPort") == 0) - m_m17GatewayPort = (unsigned short)::atoi(value); - else if (::strcmp(key, "ModeHang") == 0) - m_m17NetworkModeHang = (unsigned int)::atoi(value); - else if (::strcmp(key, "Debug") == 0) - m_m17NetworkDebug = ::atoi(value) == 1; } else if (section == SECTION::POCSAG_NETWORK) { if (::strcmp(key, "Enable") == 0) m_pocsagNetworkEnabled = ::atoi(value) == 1; @@ -1437,11 +1387,6 @@ float CConf::getModemNXDNTXLevel() const return m_modemNXDNTXLevel; } -float CConf::getModemM17TXLevel() const -{ - return m_modemM17TXLevel; -} - float CConf::getModemPOCSAGTXLevel() const { return m_modemPOCSAGTXLevel; @@ -1757,36 +1702,6 @@ unsigned int CConf::getNXDNModeHang() const return m_nxdnModeHang; } -bool CConf::getM17Enabled() const -{ - return m_m17Enabled; -} - -unsigned int CConf::getM17CAN() const -{ - return m_m17CAN; -} - -bool CConf::getM17SelfOnly() const -{ - return m_m17SelfOnly; -} - -bool CConf::getM17AllowEncryption() const -{ - return m_m17AllowEncryption; -} - -unsigned int CConf::getM17TXHang() const -{ - return m_m17TXHang; -} - -unsigned int CConf::getM17ModeHang() const -{ - return m_m17ModeHang; -} - bool CConf::getPOCSAGEnabled() const { return m_pocsagEnabled; @@ -2217,41 +2132,6 @@ bool CConf::getNXDNNetworkDebug() const return m_nxdnNetworkDebug; } -bool CConf::getM17NetworkEnabled() const -{ - return m_m17NetworkEnabled; -} - -std::string CConf::getM17GatewayAddress() const -{ - return m_m17GatewayAddress; -} - -unsigned short CConf::getM17GatewayPort() const -{ - return m_m17GatewayPort; -} - -std::string CConf::getM17LocalAddress() const -{ - return m_m17LocalAddress; -} - -unsigned short CConf::getM17LocalPort() const -{ - return m_m17LocalPort; -} - -unsigned int CConf::getM17NetworkModeHang() const -{ - return m_m17NetworkModeHang; -} - -bool CConf::getM17NetworkDebug() const -{ - return m_m17NetworkDebug; -} - bool CConf::getPOCSAGNetworkEnabled() const { return m_pocsagNetworkEnabled; diff --git a/Conf.h b/Conf.h index d2689fd..30ea50c 100644 --- a/Conf.h +++ b/Conf.h @@ -96,7 +96,6 @@ public: float getModemYSFTXLevel() const; float getModemP25TXLevel() const; float getModemNXDNTXLevel() const; - float getModemM17TXLevel() const; float getModemPOCSAGTXLevel() const; float getModemFMTXLevel() const; float getModemAX25TXLevel() const; @@ -173,14 +172,6 @@ public: unsigned int getNXDNTXHang() const; unsigned int getNXDNModeHang() const; - // The M17 section - bool getM17Enabled() const; - unsigned int getM17CAN() const; - bool getM17SelfOnly() const; - bool getM17AllowEncryption() const; - unsigned int getM17TXHang() const; - unsigned int getM17ModeHang() const; - // The POCSAG section bool getPOCSAGEnabled() const; unsigned int getPOCSAGFrequency() const; @@ -283,15 +274,6 @@ public: unsigned int getNXDNNetworkModeHang() const; bool getNXDNNetworkDebug() const; - // The M17 Network section - bool getM17NetworkEnabled() const; - std::string getM17GatewayAddress() const; - unsigned short getM17GatewayPort() const; - std::string getM17LocalAddress() const; - unsigned short getM17LocalPort() const; - unsigned int getM17NetworkModeHang() const; - bool getM17NetworkDebug() const; - // The POCSAG Network section bool getPOCSAGNetworkEnabled() const; std::string getPOCSAGGatewayAddress() const; @@ -437,7 +419,6 @@ private: float m_modemYSFTXLevel; float m_modemP25TXLevel; float m_modemNXDNTXLevel; - float m_modemM17TXLevel; float m_modemPOCSAGTXLevel; float m_modemFMTXLevel; float m_modemAX25TXLevel; @@ -508,13 +489,6 @@ private: unsigned int m_nxdnTXHang; unsigned int m_nxdnModeHang; - bool m_m17Enabled; - unsigned int m_m17CAN; - bool m_m17SelfOnly; - bool m_m17AllowEncryption; - unsigned int m_m17TXHang; - unsigned int m_m17ModeHang; - bool m_pocsagEnabled; unsigned int m_pocsagFrequency; @@ -609,14 +583,6 @@ private: unsigned int m_nxdnNetworkModeHang; bool m_nxdnNetworkDebug; - bool m_m17NetworkEnabled; - std::string m_m17GatewayAddress; - unsigned short m_m17GatewayPort; - std::string m_m17LocalAddress; - unsigned short m_m17LocalPort; - unsigned int m_m17NetworkModeHang; - bool m_m17NetworkDebug; - bool m_pocsagNetworkEnabled; std::string m_pocsagGatewayAddress; unsigned short m_pocsagGatewayPort; diff --git a/Defines.h b/Defines.h index ebd2f2b..8f436b9 100644 --- a/Defines.h +++ b/Defines.h @@ -26,7 +26,6 @@ const unsigned char MODE_YSF = 3U; const unsigned char MODE_P25 = 4U; const unsigned char MODE_NXDN = 5U; const unsigned char MODE_POCSAG = 6U; -const unsigned char MODE_M17 = 7U; const unsigned char MODE_FM = 10U; diff --git a/Display.cpp b/Display.cpp index 112b8d0..978968f 100644 --- a/Display.cpp +++ b/Display.cpp @@ -339,40 +339,6 @@ void CDisplay::clearNXDN() } } -void CDisplay::writeM17(const char* source, const char* dest, const char* type) -{ - assert(source != nullptr); - assert(dest != nullptr); - assert(type != nullptr); - - m_timer1.start(); - m_mode1 = MODE_IDLE; - - writeM17Int(source, dest, type); -} - -void CDisplay::writeM17RSSI(unsigned char rssi) -{ - if (rssi != 0U) - writeM17RSSIInt(rssi); -} - -void CDisplay::writeM17BER(float ber) -{ - writeM17BERInt(ber); -} - -void CDisplay::clearM17() -{ - if (m_timer1.hasExpired()) { - clearM17Int(); - m_timer1.stop(); - m_mode1 = MODE_IDLE; - } else { - m_mode1 = MODE_M17; - } -} - void CDisplay::writePOCSAG(uint32_t ric, const std::string& message) { m_timer1.start(); @@ -430,11 +396,6 @@ void CDisplay::clock(unsigned int ms) m_mode1 = MODE_IDLE; m_timer1.stop(); break; - case MODE_M17: - clearM17Int(); - m_mode1 = MODE_IDLE; - m_timer1.stop(); - break; case MODE_POCSAG: clearPOCSAGInt(); m_mode1 = MODE_IDLE; @@ -525,14 +486,6 @@ void CDisplay::writeNXDNBERInt(float ber) { } -void CDisplay::writeM17RSSIInt(unsigned char rssi) -{ -} - -void CDisplay::writeM17BERInt(float ber) -{ -} - int CDisplay::writeNXDNIntEx(const class CUserDBentry& source, bool group, unsigned int dest, const char* type) { /* return value definition is same as writeDMRIntEx() */ diff --git a/Display.h b/Display.h index 314c9db..8d55de9 100644 --- a/Display.h +++ b/Display.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2016,2017,2018,2020,2021,2023 by Jonathan Naylor G4KLX + * Copyright (C) 2016,2017,2018,2020,2021,2023,2025 by Jonathan Naylor G4KLX * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -72,11 +72,6 @@ public: void writeNXDNBER(float ber); void clearNXDN(); - void writeM17(const char* source, const char* dest, const char* type); - void writeM17RSSI(unsigned char rssi); - void writeM17BER(float ber); - void clearM17(); - void writePOCSAG(uint32_t ric, const std::string& message); void clearPOCSAG(); @@ -123,11 +118,6 @@ protected: virtual void writeNXDNBERInt(float ber); virtual void clearNXDNInt() = 0; - virtual void writeM17Int(const char* source, const char* dest, const char* type) = 0; - virtual void writeM17RSSIInt(unsigned char rssi); - virtual void writeM17BERInt(float ber); - virtual void clearM17Int() = 0; - virtual void writePOCSAGInt(uint32_t ric, const std::string& message) = 0; virtual void clearPOCSAGInt() = 0; diff --git a/HD44780.cpp b/HD44780.cpp index f91c0de..7a98a2b 100644 --- a/HD44780.cpp +++ b/HD44780.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2016,2017,2018,2020,2021 by Jonathan Naylor G4KLX & Tony Corbett G0WFV + * Copyright (C) 2016,2017,2018,2020,2021,2025 by Jonathan Naylor G4KLX & Tony Corbett G0WFV * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -41,7 +41,6 @@ const unsigned int DMR_RSSI_COUNT = 4U; // 4 * 360ms = 1440ms const unsigned int YSF_RSSI_COUNT = 13U; // 13 * 100ms = 1300ms const unsigned int P25_RSSI_COUNT = 7U; // 7 * 180ms = 1260ms const unsigned int NXDN_RSSI_COUNT = 28U; // 28 * 40ms = 1120ms -const unsigned int M17_RSSI_COUNT = 28U; // 28 * 40ms = 1120ms CHD44780::CHD44780(unsigned int rows, unsigned int cols, const std::string& callsign, unsigned int dmrid, const std::vector& pins, unsigned int i2cAddress, bool pwm, unsigned int pwmPin, unsigned int pwmBright, unsigned int pwmDim, bool displayClock, bool utc, bool duplex) : CDisplay(), @@ -1032,105 +1031,6 @@ void CHD44780::clearNXDNInt() } } -void CHD44780::writeM17Int(const char* source, const char* dest, const char* type) -{ - assert(source != NULL); - assert(dest != NULL); - assert(type != NULL); - -#ifdef ADAFRUIT_DISPLAY - adafruitLCDColour(AC_RED); -#endif - - m_clockDisplayTimer.stop(); // Stop the clock display - ::lcdClear(m_fd); - - if (m_pwm) { - if (m_pwmPin != 1U) - ::softPwmWrite(m_pwmPin, m_pwmBright); - else - ::pwmWrite(m_pwmPin, (m_pwmBright / 100) * 1024); - } - - ::lcdPosition(m_fd, 0, 0); - ::lcdPuts(m_fd, "M17"); - - ::sprintf(m_buffer1, "%.9s", source); - ::sprintf(m_buffer2, "%.9s", dest); - - if (m_rows == 2U && m_cols == 16U) { - ::lcdPosition(m_fd, 5, 0); - ::lcdPrintf(m_fd, "%.*s", m_cols - 5, m_buffer1); - ::lcdPosition(m_fd, 5, 1); - ::lcdPrintf(m_fd, "%.*s", m_cols - 5, m_buffer2); - } else if (m_rows == 4U && m_cols == 16U) { - ::lcdPosition(m_fd, 0, 1); - ::lcdPrintf(m_fd, "%.*s", m_cols, m_buffer1); - ::lcdPosition(m_fd, 0, 2); - ::lcdPrintf(m_fd, "%.*s", m_cols, m_buffer2); - } else if (m_rows == 4U && m_cols == 20U) { - ::lcdPosition(m_fd, 0, 1); - ::lcdPrintf(m_fd, "%.*s", m_cols, m_buffer1); - ::lcdPosition(m_fd, 0, 2); - ::lcdPrintf(m_fd, "%.*s", m_cols, m_buffer1); - } else if (m_rows == 2 && m_cols == 40U) { - ::sprintf(m_buffer1, "%.9s > %.9s", source, dest); - ::lcdPosition(m_fd, 0, 1); - ::lcdPrintf(m_fd, "%.*s", m_cols, m_buffer1); - } - - m_dmr = false; - m_rssiCount1 = 0U; -} - -void CHD44780::writeM17RSSIInt(unsigned char rssi) -{ - if (m_rssiCount1 == 0U && m_rows > 2) { - ::lcdPosition(m_fd, 0, 3); - ::lcdPrintf(m_fd, "-%3udBm", rssi); - } - - m_rssiCount1++; - if (m_rssiCount1 >= M17_RSSI_COUNT) - m_rssiCount1 = 0U; -} - -void CHD44780::clearM17Int() -{ -#ifdef ADAFRUIT_DISPLAY - adafruitLCDColour(AC_PURPLE); -#endif - m_clockDisplayTimer.stop(); // Stop the clock display - - if (m_rows == 2U && m_cols == 16U) { - ::lcdPosition(m_fd, 5, 0); - ::lcdPrintf(m_fd, "%.*s", m_cols - 5, LISTENING); - ::lcdPosition(m_fd, 5, 1); - ::lcdPrintf(m_fd, "%.*s", m_cols - 5, " "); - } else if (m_rows == 4U && m_cols == 16U) { - ::lcdPosition(m_fd, 0, 1); - ::lcdPrintf(m_fd, "%.*s", m_cols, LISTENING); - - ::lcdPosition(m_fd, 0, 2); - ::lcdPrintf(m_fd, "%.*s", m_cols, " "); - - ::lcdPosition(m_fd, 0, 3); - ::lcdPrintf(m_fd, "%.*s", m_cols, " "); - } else if (m_rows == 4U && m_cols == 20U) { - ::lcdPosition(m_fd, 0, 1); - ::lcdPrintf(m_fd, "%.*s", m_cols, LISTENING); - - ::lcdPosition(m_fd, 0, 2); - ::lcdPrintf(m_fd, "%.*s", m_cols, " "); - - ::lcdPosition(m_fd, 0, 3); - ::lcdPrintf(m_fd, "%.*s", m_cols, " "); - } else if (m_rows == 2 && m_cols == 40U) { - ::lcdPosition(m_fd, 0, 1); - ::lcdPrintf(m_fd, "%.*s", m_cols, LISTENING); - } -} - void CHD44780::writePOCSAGInt(uint32_t ric, const std::string& message) { ::lcdPosition(m_fd, m_cols - 5, m_rows - 1); diff --git a/HD44780.h b/HD44780.h index 308f50d..7eef5be 100644 --- a/HD44780.h +++ b/HD44780.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2016,2017,2018,2020,2021 by Jonathan Naylor G4KLX & Tony Corbett G0WFV + * Copyright (C) 2016,2017,2018,2020,2021,2025 by Jonathan Naylor G4KLX & Tony Corbett G0WFV * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -123,10 +123,6 @@ protected: virtual void writeNXDNRSSIInt(unsigned char rssi); virtual void clearNXDNInt(); - virtual void writeM17Int(const char* source, const char* dest, const char* type); - virtual void writeM17RSSIInt(unsigned char rssi); - virtual void clearM17Int(); - virtual void writePOCSAGInt(uint32_t ric, const std::string& message); virtual void clearPOCSAGInt(); diff --git a/Images/M17.bmp b/Images/M17.bmp deleted file mode 100644 index 8d88e8e0f05499dbd1193a3a0b6f7d471dbc18e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 58014 zcmeI5d2kg)9>>`~R4QdaaG}I1C=alp)Re`gE*5HlP(>ihVS*?^f+Qh$;DJU6$1b}C z#%xF+XhkLAk{}2{3*^Yf6(rn<5abXAk$@n#3cBllq1|z6-t=#J`pwMiSp6z_HPbWm zo8R%7e%<|>o{8;Kbfm$xPiK6$#s3QYkHG(58r*{K1`X1G-+pc7_pjgdM|;4@17O8z z7rkA3;5W^QhCsvvniCN(>3uXOngJ0HXih}Dr1#OBXa+<)paLfs&Yu@iRqqo)52(P& z_HEnF{BSygPSB@z^gv`e*;u{d*tbWwY~H+T)k;TI^$rpAKx8?oC@)J%Nd_l{g@s3s zd=o)G=u^`kh&U%uVBWlW;AFvq1+=PqYXm)@0w?#}a}PMdXZP;UBj^f!YQh65Z~`5M z4<8Orii?XbUA#bOt2af;1B!6cxN+laHA><7_3I+#3VmL}1B!40HTv}F!%#VW>U%NGH?3v(#6d+HAzWHH{5W;HAb#}wQk*-nYm}r7v`M>mkCZF z{H2#(f^cM$1*KVbn^jyiE-Nb`A)$B3XWF!B;c#-~o6A{Qzoexd@7;T={YE=orKqoze$ryaLD4tA6fKQY8BxS)aTRX%Wk=a%__V~i1A5HO@*1WXU&pG z;nAElZ{8e|@xcu$f=Zfqi;L@FC}~;9$;kgX?uRY= zV>Kq`>uXjP*6!VF)?cY*IM7iaG`9v09B6U1vD&0blY)W*Sh``udPh-~9V#oz4LP<8 zsJ@sFC0cq)aWZ?>FO3@gQHNM)dHLmKFmukFIjFQPE>dI_(Gk(4OP4OTab$(kDLlG9 zf$)Y68|LQb!iTF@uM*MIypL*}SlBSHHgA58T@Igpw$W^YI?IBb?Ao=H-~^lGQh1J> zKyufvU6~J$9dp;KQi>Bqyi=$DnAxx_Kk>vyW~Q3AlnZhKGe?X_Cs2_~;fZj9lV)XQ z!H0_$Epl~zsm2M>ssS?%8(zuDnGG{ntXSd7%wTpF=L8)$G(`whUU}senCU8oC&TTdnv(phr5Z7>vNkX*#Q&q(zGsESi{)BdCBN zCpf9Zjgbm+a_rdU=xARJ{{Ekb4Qqw_4aT?+?Bwp$_gGND36MYVkx}JiV6|2 z;+#Nue0)6fq2P^?YH|X%+;PW$%|ADm7z0y`)V&+er_zQlP7-wAF7k|k>doYpm#%{l97=CGaUz_B{(s9 zRok|1r7tCwIf3S*NB?4B!@PRmeTUh#7G}Dfc9Hm2X-?*UFpuD*Y15|6%#9nX31uWW z!AS=V8U*1pXU?Q=j8vSHvuA#8_E)MwJ9_lTBG($>UJo}(a{?Xcq)*?zeHki0oIb@< zSdJ6)s#wwoH-qscqg-)LpkZ+_Ri(6OafUf?)27b|GlSU_4kuf;Y$mFd>#njfv!bI3E)2yNG{d)c*i^ym@WYb}_L%_TbK2! zmM>p!@mT%hq^e3N>9cn2T8o*%ta?(PKvl=2kL|oI5l$fdxsf9Y2s?M~%pkP%s=VR^ zQ%*{kEHQ_JxHFBo-`*_2c6q=6>enYeej79M`;#YZ5BIguD^8%~*fC>>Xx@A8z06GW zK(rtya=ohXIYAn3%$N;KZF4((a}D>}@6v@kFT*j8hYnJGWQ^*wq|egQQb$pq@8BUP zXV3gVCw*Rg@kRI?Ngu-sK~Av$jDi9JLZerOIeLcha5zCTVD8*acir_JqBC^p8mMh< zhx=5YK=TRXsVb#?`>zptYGz@7@ zHdgP7i~GXJ%0);2l%HRO0IglKhN?R6_=%f$k zZDGzPe9j(d?}`)Hn3$MIK-j%|cNR_7t8&W;hS1x$=iWZVW&yLdfv=pv%r1Z9ssU~X z4*b2zBr!))9ZsOh@ZrxA(ZqNNizXgu@0JrxSRf>0let&rmXlGVs0-Pc1&p?V-<*8D zi)zqDMg7c@J`!^zmEr`IGsf14fUIVu3Cx@@VLTzZUAuM+!hN;1ZaF!9%Hf8P zQKObaINAn&a{@C*jG!8{4?nzznHgBp2R@f(j5shi_uoV`jd@!bVC3zFJRn?Q+purd zsuk}jl#d)a5(lDJ)uVfN-fq0-6}BTE zq^q-l$B$oXfMHqiiW6v3P(VT3y7h5rf{&{?lG5>oC#8?252U*%n71{3`gGhB%?l;L z3C>F=efst52M6AL_uV|<1Si!SxMOH=6}us1?AXN?Jd9NjIf0pU(kC^w3}y!N@(BMp zftin!H<0w|)k~Ta$D|KPkmCeuKQ)MI8{meJz&LSC`dqD03Jce*^Zn%!zH;K2^uezW z?~-Tr$-x8Mc{&*xBY4N6{J{qwl;#AF)ryLuW&x+9R2mhCWr5WvjuTQqqu?hok%AUa z{bH#2o%HdQ6S(4y%uFJhH{Em-Z!4QuXxolu9!9U~=9_Qk9gcG1=?cW}4io;be^SwD z)aa504`Vf){EjU-fYuOhyAVv$2mZ8G&#OYmqz^C9bo+#fMj&uvlhqdtKqixyISWMih! z)-78+j~x>j3@3Eb$2OXRoWKg?7HuUEg(CF{Bsb6YhtIs# z6(7-j zFvtvDNJ!YiWQNX>BuJn)!ISh3er$dHwbytNG|J^Tah&PHtGbS(W0|8^a^Q2^@}>ZSjK0${q8?JWfzf+)==UOLOwk zB8L!*uRP2AKD3 zzaz*Ao%9KZ6Ij~6Uq4oL*nWq@2|a$U4kxHmo_cB>etjGtjA;vor7(h=K$GO;p|){E zVVIoIy{d3Hf!f6Qxl)`MGkxd>V_J}~U5zX!MA9crPGD@-*s(ka!{me*KUazqR4K8s zyIF%a%%o3bIYBhDv){ChX84>yI4|iFCMS^m_S^OiTGcoKDl-ZyK3=-i_R(Z8MDP=F zPN1i4(#I1{cn{4EpA)EUJASSpCun#J!a(e%0w=afA5S=e;kLahPdKq1KNsQT=#k6i zWmkgyBLEQGqyi^UwRe2H<=4k6PHcNso^S%Slaj0>v?81chDNE~6yXG~0{4j%csn(9 zxJ9^EoP;KQG$(%JJ^IyG&C&F#K7rby&rk4*69~6Vn$Vp1%?Xk|&6+hcQ1OrxXg)PJ z*N}__4>^HwbJ9n1;x{LdUtBcPh^DukK)89PkGGtdCrxNh0^kIvFuEt6b7D^Vc*_aY zHj+M?lVCV8x+jT=PhcRCm|rZRPv6HMXZ00co?B8`S3NT`F_yjOVe4p+Y% zep5}!Aw!;lR(J+Ap6uZ*Cq~i-`3`S6fe$k>uJ)0K4!wd$IcZJ;fQlu3UU>d_JSoUq zPN4jlH{Jk*IK{GM%e=LPJt-?C`Byv|PIKa|Z+X(DOqmQ$u+{U&dazsRz=`LQp)H=2 z1x~PV@lR&T@qp&U;t;)R>jBM)ty^@V#RHlXi$nCPtp_wGwr6z`5zQSVdww= diff --git a/LCDproc.cpp b/LCDproc.cpp index eb99d35..33d368e 100644 --- a/LCDproc.cpp +++ b/LCDproc.cpp @@ -100,7 +100,6 @@ const unsigned int DMR_RSSI_COUNT = 4U; // 4 * 360ms = 1440ms const unsigned int YSF_RSSI_COUNT = 13U; // 13 * 100ms = 1300ms const unsigned int P25_RSSI_COUNT = 7U; // 7 * 180ms = 1260ms const unsigned int NXDN_RSSI_COUNT = 28U; // 28 * 40ms = 1120ms -const unsigned int M17_RSSI_COUNT = 28U; // 28 * 40ms = 1120ms CLCDproc::CLCDproc(std::string address, unsigned int port, unsigned short localPort, const std::string& callsign, unsigned int dmrid, bool displayClock, bool utc, bool duplex, bool dimOnIdle) : CDisplay(), @@ -198,7 +197,6 @@ void CLCDproc::setIdleInt() socketPrintf(m_socketfd, "screen_set YSF -priority hidden"); socketPrintf(m_socketfd, "screen_set P25 -priority hidden"); socketPrintf(m_socketfd, "screen_set NXDN -priority hidden"); - socketPrintf(m_socketfd, "screen_set M17 -priority hidden"); socketPrintf(m_socketfd, "widget_set Status Status %u %u Idle", m_cols - 3, m_rows); socketPrintf(m_socketfd, "output 0"); // Clear all LEDs } @@ -218,7 +216,6 @@ void CLCDproc::setErrorInt(const char* text) socketPrintf(m_socketfd, "screen_set YSF -priority hidden"); socketPrintf(m_socketfd, "screen_set P25 -priority hidden"); socketPrintf(m_socketfd, "screen_set NXDN -priority hidden"); - socketPrintf(m_socketfd, "screen_set M17 -priority hidden"); socketPrintf(m_socketfd, "widget_set Status Status %u %u Error", m_cols - 4, m_rows); socketPrintf(m_socketfd, "output 0"); // Clear all LEDs } @@ -236,7 +233,6 @@ void CLCDproc::setLockoutInt() socketPrintf(m_socketfd, "screen_set YSF -priority hidden"); socketPrintf(m_socketfd, "screen_set P25 -priority hidden"); socketPrintf(m_socketfd, "screen_set NXDN -priority hidden"); - socketPrintf(m_socketfd, "screen_set M17 -priority hidden"); socketPrintf(m_socketfd, "widget_set Status Status %u %u Lockout", m_cols - 6, m_rows); socketPrintf(m_socketfd, "output 0"); // Clear all LEDs } @@ -256,7 +252,6 @@ void CLCDproc::setQuitInt() socketPrintf(m_socketfd, "screen_set YSF -priority hidden"); socketPrintf(m_socketfd, "screen_set P25 -priority hidden"); socketPrintf(m_socketfd, "screen_set NXDN -priority hidden"); - socketPrintf(m_socketfd, "screen_set M17 -priority hidden"); socketPrintf(m_socketfd, "widget_set Status Status %u %u Stopped", m_cols - 6, m_rows); socketPrintf(m_socketfd, "output 0"); // Clear all LEDs } @@ -274,7 +269,6 @@ void CLCDproc::setFMInt() socketPrintf(m_socketfd, "screen_set YSF -priority hidden"); socketPrintf(m_socketfd, "screen_set P25 -priority hidden"); socketPrintf(m_socketfd, "screen_set NXDN -priority hidden"); - socketPrintf(m_socketfd, "screen_set M17 -priority hidden"); socketPrintf(m_socketfd, "widget_set Status Status %u %u FM", m_cols - 6, m_rows); socketPrintf(m_socketfd, "output 0"); // Clear all LEDs } @@ -571,51 +565,6 @@ void CLCDproc::clearNXDNInt() socketPrintf(m_socketfd, "output 16"); // Set LED5 color green } -void CLCDproc::writeM17Int(const char* source, const char* dest, const char* type) -{ - assert(source != nullptr); - assert(dest != nullptr); - assert(type != nullptr); - - m_clockDisplayTimer.stop(); // Stop the clock display - - socketPrintf(m_socketfd, "screen_set M17 -priority foreground"); - socketPrintf(m_socketfd, "widget_set M17 Mode 1 1 M17"); - - if (m_rows == 2U) { - socketPrintf(m_socketfd, "widget_set M17 Line2 1 2 15 2 h 3 \"%.9s > %.9s\"", source, dest); - } - else { - socketPrintf(m_socketfd, "widget_set M17 Line2 1 2 15 2 h 3 \"%.9s >\"", source); - socketPrintf(m_socketfd, "widget_set M17 Line3 1 3 15 3 h 3 \"%.9ss\"", dest); - socketPrintf(m_socketfd, "output 255"); // Set LED5 color red - } - - m_dmr = false; - m_rssiCount1 = 0U; -} - -void CLCDproc::writeM17RSSIInt(unsigned char rssi) -{ - if (m_rssiCount1 == 0U) { - socketPrintf(m_socketfd, "widget_set M17 Line4 1 4 %u 4 h 3 \"-%3udBm\"", m_cols - 1, rssi); - } - - m_rssiCount1++; - if (m_rssiCount1 >= M17_RSSI_COUNT) - m_rssiCount1 = 0U; -} - -void CLCDproc::clearM17Int() -{ - m_clockDisplayTimer.stop(); // Stop the clock display - - socketPrintf(m_socketfd, "widget_set M17 Line2 1 2 15 2 h 3 \"Listening\""); - socketPrintf(m_socketfd, "widget_set M17 Line3 1 3 15 3 h 3 \"\""); - socketPrintf(m_socketfd, "widget_set M17 Line4 1 4 15 4 h 3 \"\""); - socketPrintf(m_socketfd, "output 16"); // Set LED5 color green -} - void CLCDproc::writePOCSAGInt(uint32_t ric, const std::string& message) { } @@ -917,22 +866,5 @@ void CLCDproc::defineScreens() socketPrintf(m_socketfd, "widget_set NXDN Line3 3 1 15 1 h 3 \" \""); socketPrintf(m_socketfd, "widget_set NXDN Line4 4 2 15 2 h 3 \" \""); */ - -// The M17 Screen - - socketPrintf(m_socketfd, "screen_add M17"); - socketPrintf(m_socketfd, "screen_set M17 -name M17 -heartbeat on -priority hidden -backlight on"); - - socketPrintf(m_socketfd, "widget_add M17 Mode string"); - socketPrintf(m_socketfd, "widget_add M17 Line2 scroller"); - socketPrintf(m_socketfd, "widget_add M17 Line3 scroller"); - socketPrintf(m_socketfd, "widget_add M17 Line4 scroller"); - - /* Do we need to pre-populate the values?? - socketPrintf(m_socketfd, "widget_set M17 Line3 2 1 15 1 h 3 \"Listening\""); - socketPrintf(m_socketfd, "widget_set M17 Line3 3 1 15 1 h 3 \" \""); - socketPrintf(m_socketfd, "widget_set M17 Line4 4 2 15 2 h 3 \" \""); - */ - m_screensDefined = true; } diff --git a/LCDproc.h b/LCDproc.h index 38fb369..1aafc5d 100644 --- a/LCDproc.h +++ b/LCDproc.h @@ -67,10 +67,6 @@ protected: virtual void writeNXDNRSSIInt(unsigned char rssi); virtual void clearNXDNInt(); - virtual void writeM17Int(const char* source, const char* dest, const char* type); - virtual void writeM17RSSIInt(unsigned char rssi); - virtual void clearM17Int(); - virtual void writePOCSAGInt(uint32_t ric, const std::string& message); virtual void clearPOCSAGInt(); diff --git a/M17CRC.cpp b/M17CRC.cpp deleted file mode 100644 index 8bc4814..0000000 --- a/M17CRC.cpp +++ /dev/null @@ -1,84 +0,0 @@ -/* - * Copyright (C) 2020,2021,2025 by Jonathan Naylor G4KLX - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#include "M17CRC.h" - -#include -#include - -const uint16_t CRC16_TABLE[] = {0x0000U, 0x5935U, 0xB26AU, 0xEB5FU, 0x3DE1U, 0x64D4U, 0x8F8BU, 0xD6BEU, 0x7BC2U, 0x22F7U, 0xC9A8U, - 0x909DU, 0x4623U, 0x1F16U, 0xF449U, 0xAD7CU, 0xF784U, 0xAEB1U, 0x45EEU, 0x1CDBU, 0xCA65U, 0x9350U, - 0x780FU, 0x213AU, 0x8C46U, 0xD573U, 0x3E2CU, 0x6719U, 0xB1A7U, 0xE892U, 0x03CDU, 0x5AF8U, 0xB63DU, - 0xEF08U, 0x0457U, 0x5D62U, 0x8BDCU, 0xD2E9U, 0x39B6U, 0x6083U, 0xCDFFU, 0x94CAU, 0x7F95U, 0x26A0U, - 0xF01EU, 0xA92BU, 0x4274U, 0x1B41U, 0x41B9U, 0x188CU, 0xF3D3U, 0xAAE6U, 0x7C58U, 0x256DU, 0xCE32U, - 0x9707U, 0x3A7BU, 0x634EU, 0x8811U, 0xD124U, 0x079AU, 0x5EAFU, 0xB5F0U, 0xECC5U, 0x354FU, 0x6C7AU, - 0x8725U, 0xDE10U, 0x08AEU, 0x519BU, 0xBAC4U, 0xE3F1U, 0x4E8DU, 0x17B8U, 0xFCE7U, 0xA5D2U, 0x736CU, - 0x2A59U, 0xC106U, 0x9833U, 0xC2CBU, 0x9BFEU, 0x70A1U, 0x2994U, 0xFF2AU, 0xA61FU, 0x4D40U, 0x1475U, - 0xB909U, 0xE03CU, 0x0B63U, 0x5256U, 0x84E8U, 0xDDDDU, 0x3682U, 0x6FB7U, 0x8372U, 0xDA47U, 0x3118U, - 0x682DU, 0xBE93U, 0xE7A6U, 0x0CF9U, 0x55CCU, 0xF8B0U, 0xA185U, 0x4ADAU, 0x13EFU, 0xC551U, 0x9C64U, - 0x773BU, 0x2E0EU, 0x74F6U, 0x2DC3U, 0xC69CU, 0x9FA9U, 0x4917U, 0x1022U, 0xFB7DU, 0xA248U, 0x0F34U, - 0x5601U, 0xBD5EU, 0xE46BU, 0x32D5U, 0x6BE0U, 0x80BFU, 0xD98AU, 0x6A9EU, 0x33ABU, 0xD8F4U, 0x81C1U, - 0x577FU, 0x0E4AU, 0xE515U, 0xBC20U, 0x115CU, 0x4869U, 0xA336U, 0xFA03U, 0x2CBDU, 0x7588U, 0x9ED7U, - 0xC7E2U, 0x9D1AU, 0xC42FU, 0x2F70U, 0x7645U, 0xA0FBU, 0xF9CEU, 0x1291U, 0x4BA4U, 0xE6D8U, 0xBFEDU, - 0x54B2U, 0x0D87U, 0xDB39U, 0x820CU, 0x6953U, 0x3066U, 0xDCA3U, 0x8596U, 0x6EC9U, 0x37FCU, 0xE142U, - 0xB877U, 0x5328U, 0x0A1DU, 0xA761U, 0xFE54U, 0x150BU, 0x4C3EU, 0x9A80U, 0xC3B5U, 0x28EAU, 0x71DFU, - 0x2B27U, 0x7212U, 0x994DU, 0xC078U, 0x16C6U, 0x4FF3U, 0xA4ACU, 0xFD99U, 0x50E5U, 0x09D0U, 0xE28FU, - 0xBBBAU, 0x6D04U, 0x3431U, 0xDF6EU, 0x865BU, 0x5FD1U, 0x06E4U, 0xEDBBU, 0xB48EU, 0x6230U, 0x3B05U, - 0xD05AU, 0x896FU, 0x2413U, 0x7D26U, 0x9679U, 0xCF4CU, 0x19F2U, 0x40C7U, 0xAB98U, 0xF2ADU, 0xA855U, - 0xF160U, 0x1A3FU, 0x430AU, 0x95B4U, 0xCC81U, 0x27DEU, 0x7EEBU, 0xD397U, 0x8AA2U, 0x61FDU, 0x38C8U, - 0xEE76U, 0xB743U, 0x5C1CU, 0x0529U, 0xE9ECU, 0xB0D9U, 0x5B86U, 0x02B3U, 0xD40DU, 0x8D38U, 0x6667U, - 0x3F52U, 0x922EU, 0xCB1BU, 0x2044U, 0x7971U, 0xAFCFU, 0xF6FAU, 0x1DA5U, 0x4490U, 0x1E68U, 0x475DU, - 0xAC02U, 0xF537U, 0x2389U, 0x7ABCU, 0x91E3U, 0xC8D6U, 0x65AAU, 0x3C9FU, 0xD7C0U, 0x8EF5U, 0x584BU, - 0x017EU, 0xEA21U, 0xB314U}; - -bool CM17CRC::checkCRC16(const unsigned char* in, unsigned int nBytes) -{ - assert(in != nullptr); - assert(nBytes > 2U); - - uint16_t crc = createCRC16(in, nBytes - 2U); - - uint8_t temp[2U]; - temp[0U] = (crc >> 8) & 0xFFU; - temp[1U] = (crc >> 0) & 0xFFU; - - return temp[0U] == in[nBytes - 2U] && temp[1U] == in[nBytes - 1U]; -} - -void CM17CRC::encodeCRC16(unsigned char* in, unsigned int nBytes) -{ - assert(in != nullptr); - assert(nBytes > 2U); - - uint16_t crc = createCRC16(in, nBytes - 2U); - - in[nBytes - 2U] = (crc >> 8) & 0xFFU; - in[nBytes - 1U] = (crc >> 0) & 0xFFU; -} - -uint16_t CM17CRC::createCRC16(const unsigned char* in, unsigned int nBytes) -{ - assert(in != nullptr); - - uint16_t crc = 0xFFFFU; - - for (unsigned int i = 0U; i < nBytes; i++) - crc = (crc << 8) ^ CRC16_TABLE[((crc >> 8) ^ uint16_t(in[i])) & 0x00FFU]; - - return crc; -} diff --git a/M17CRC.h b/M17CRC.h deleted file mode 100644 index d06a9de..0000000 --- a/M17CRC.h +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright (C) 2020,2021 by Jonathan Naylor G4KLX - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#if !defined(M17CRC_H) -#define M17CRC_H - -#include - -class CM17CRC -{ -public: - static bool checkCRC16(const unsigned char* in, unsigned int nBytes); - static void encodeCRC16(unsigned char* in, unsigned int nBytes); - -private: - static uint16_t createCRC16(const unsigned char* in, unsigned int nBytes); -}; - -#endif diff --git a/M17Control.cpp b/M17Control.cpp deleted file mode 100644 index e0323b3..0000000 --- a/M17Control.cpp +++ /dev/null @@ -1,1015 +0,0 @@ -/* - * Copyright (C) 2020,2021,2023,2025 Jonathan Naylor, G4KLX - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "M17Control.h" -#include "M17Convolution.h" -#include "M17Utils.h" -#include "M17CRC.h" -#include "Golay24128.h" -#include "Utils.h" -#include "Sync.h" -#include "Log.h" - -#include -#include -#include -#include - -const unsigned int INTERLEAVER[] = { - 0U, 137U, 90U, 227U, 180U, 317U, 270U, 39U, 360U, 129U, 82U, 219U, 172U, 309U, 262U, 31U, 352U, 121U, 74U, 211U, 164U, - 301U, 254U, 23U, 344U, 113U, 66U, 203U, 156U, 293U, 246U, 15U, 336U, 105U, 58U, 195U, 148U, 285U, 238U, 7U, 328U, 97U, - 50U, 187U, 140U, 277U, 230U, 367U, 320U, 89U, 42U, 179U, 132U, 269U, 222U, 359U, 312U, 81U, 34U, 171U, 124U, 261U, 214U, - 351U, 304U, 73U, 26U, 163U, 116U, 253U, 206U, 343U, 296U, 65U, 18U, 155U, 108U, 245U, 198U, 335U, 288U, 57U, 10U, 147U, - 100U, 237U, 190U, 327U, 280U, 49U, 2U, 139U, 92U, 229U, 182U, 319U, 272U, 41U, 362U, 131U, 84U, 221U, 174U, 311U, 264U, - 33U, 354U, 123U, 76U, 213U, 166U, 303U, 256U, 25U, 346U, 115U, 68U, 205U, 158U, 295U, 248U, 17U, 338U, 107U, 60U, 197U, - 150U, 287U, 240U, 9U, 330U, 99U, 52U, 189U, 142U, 279U, 232U, 1U, 322U, 91U, 44U, 181U, 134U, 271U, 224U, 361U, 314U, 83U, - 36U, 173U, 126U, 263U, 216U, 353U, 306U, 75U, 28U, 165U, 118U, 255U, 208U, 345U, 298U, 67U, 20U, 157U, 110U, 247U, 200U, - 337U, 290U, 59U, 12U, 149U, 102U, 239U, 192U, 329U, 282U, 51U, 4U, 141U, 94U, 231U, 184U, 321U, 274U, 43U, 364U, 133U, 86U, - 223U, 176U, 313U, 266U, 35U, 356U, 125U, 78U, 215U, 168U, 305U, 258U, 27U, 348U, 117U, 70U, 207U, 160U, 297U, 250U, 19U, - 340U, 109U, 62U, 199U, 152U, 289U, 242U, 11U, 332U, 101U, 54U, 191U, 144U, 281U, 234U, 3U, 324U, 93U, 46U, 183U, 136U, 273U, - 226U, 363U, 316U, 85U, 38U, 175U, 128U, 265U, 218U, 355U, 308U, 77U, 30U, 167U, 120U, 257U, 210U, 347U, 300U, 69U, 22U, - 159U, 112U, 249U, 202U, 339U, 292U, 61U, 14U, 151U, 104U, 241U, 194U, 331U, 284U, 53U, 6U, 143U, 96U, 233U, 186U, 323U, - 276U, 45U, 366U, 135U, 88U, 225U, 178U, 315U, 268U, 37U, 358U, 127U, 80U, 217U, 170U, 307U, 260U, 29U, 350U, 119U, 72U, - 209U, 162U, 299U, 252U, 21U, 342U, 111U, 64U, 201U, 154U, 291U, 244U, 13U, 334U, 103U, 56U, 193U, 146U, 283U, 236U, 5U, - 326U, 95U, 48U, 185U, 138U, 275U, 228U, 365U, 318U, 87U, 40U, 177U, 130U, 267U, 220U, 357U, 310U, 79U, 32U, 169U, 122U, - 259U, 212U, 349U, 302U, 71U, 24U, 161U, 114U, 251U, 204U, 341U, 294U, 63U, 16U, 153U, 106U, 243U, 196U, 333U, 286U, 55U, - 8U, 145U, 98U, 235U, 188U, 325U, 278U, 47U}; - -const unsigned char SCRAMBLER[] = { - 0x00U, 0x00U, 0xD6U, 0xB5U, 0xE2U, 0x30U, 0x82U, 0xFFU, 0x84U, 0x62U, 0xBAU, 0x4EU, 0x96U, 0x90U, 0xD8U, 0x98U, 0xDDU, - 0x5DU, 0x0CU, 0xC8U, 0x52U, 0x43U, 0x91U, 0x1DU, 0xF8U, 0x6EU, 0x68U, 0x2FU, 0x35U, 0xDAU, 0x14U, 0xEAU, 0xCDU, 0x76U, - 0x19U, 0x8DU, 0xD5U, 0x80U, 0xD1U, 0x33U, 0x87U, 0x13U, 0x57U, 0x18U, 0x2DU, 0x29U, 0x78U, 0xC3U}; - -// #define DUMP_M17 - -const unsigned char BIT_MASK_TABLE[] = { 0x80U, 0x40U, 0x20U, 0x10U, 0x08U, 0x04U, 0x02U, 0x01U }; - -#define WRITE_BIT(p,i,b) p[(i)>>3] = (b) ? (p[(i)>>3] | BIT_MASK_TABLE[(i)&7]) : (p[(i)>>3] & ~BIT_MASK_TABLE[(i)&7]) -#define READ_BIT(p,i) (p[(i)>>3] & BIT_MASK_TABLE[(i)&7]) - -CM17Control::CM17Control(const std::string& callsign, unsigned int can, bool selfOnly, bool allowEncryption, CM17Network* network, CDisplay* display, unsigned int timeout, bool duplex, CRSSIInterpolator* rssiMapper) : -m_callsign(callsign), -m_can(can), -m_selfOnly(selfOnly), -m_allowEncryption(allowEncryption), -m_network(network), -m_display(display), -m_duplex(duplex), -m_queue(5000U, "M17 Control"), -m_source(), -m_dest(), -m_rfState(RPT_RF_STATE::LISTENING), -m_netState(RPT_NET_STATE::IDLE), -m_rfTimeoutTimer(1000U, timeout), -m_netTimeoutTimer(1000U, timeout), -m_networkWatchdog(1000U, 0U, 1500U), -m_elapsed(), -m_rfFrames(0U), -m_netFrames(0U), -m_rfErrs(0U), -m_rfBits(1U), -m_rfLSFCount(0U), -m_rfCurrentRFLSF(), -m_rfCurrentNetLSF(), -m_rfCollectingLSF(), -m_rfCollectedLSF(), -m_rfLSFn(0U), -m_netLSF(), -m_netLSFn(0U), -m_rfTextBits(0x00U), -m_netTextBits(0x00U), -m_rfText(nullptr), -m_netText(nullptr), -m_rssiMapper(rssiMapper), -m_rssi(0U), -m_maxRSSI(0U), -m_minRSSI(0U), -m_aveRSSI(0U), -m_rssiCount(0U), -m_enabled(true), -m_fp(nullptr) -{ - assert(display != nullptr); - assert(rssiMapper != nullptr); - - m_rfText = new char[4U * M17_META_LENGTH_BYTES]; - m_netText = new char[4U * M17_META_LENGTH_BYTES]; -} - -CM17Control::~CM17Control() -{ - delete[] m_netText; - delete[] m_rfText; -} - -bool CM17Control::writeModem(unsigned char* data, unsigned int len) -{ - assert(data != nullptr); - - if (!m_enabled) - return false; - - unsigned char type = data[0U]; - - if (type == TAG_LOST && (m_rfState == RPT_RF_STATE::AUDIO || m_rfState == RPT_RF_STATE::DATA_AUDIO)) { - if (m_rssi != 0U) - LogMessage("M17, transmission lost from %s to %s, %.1f seconds, BER: %.1f%%, RSSI: -%u/-%u/-%u dBm", m_source.c_str(), m_dest.c_str(), float(m_rfFrames) / 25.0F, float(m_rfErrs * 100U) / float(m_rfBits), m_minRSSI, m_maxRSSI, m_aveRSSI / m_rssiCount); - else - LogMessage("M17, transmission lost from %s to %s, %.1f seconds, BER: %.1f%%", m_source.c_str(), m_dest.c_str(), float(m_rfFrames) / 25.0F, float(m_rfErrs * 100U) / float(m_rfBits)); - writeEndRF(); - return false; - } - - if ((type == TAG_LOST) && (m_rfState == RPT_RF_STATE::DATA)) { - writeEndRF(); - return false; - } - - if ((type == TAG_LOST) && (m_rfState == RPT_RF_STATE::REJECTED)) { - writeEndRF(); - return false; - } - - if (type == TAG_LOST) { - m_rfState = RPT_RF_STATE::LISTENING; - return false; - } - - // Have we got RSSI bytes on the end? - if (len == (M17_FRAME_LENGTH_BYTES + 4U)) { - uint16_t raw = 0U; - raw |= (data[50U] << 8) & 0xFF00U; - raw |= (data[51U] << 0) & 0x00FFU; - - // Convert the raw RSSI to dBm - int rssi = m_rssiMapper->interpolate(raw); - if (rssi != 0) - LogDebug("M17, raw RSSI: %u, reported RSSI: %d dBm", raw, rssi); - - // RSSI is always reported as positive - m_rssi = (rssi >= 0) ? rssi : -rssi; - - if (m_rssi > m_minRSSI) - m_minRSSI = m_rssi; - if (m_rssi < m_maxRSSI) - m_maxRSSI = m_rssi; - - m_aveRSSI += m_rssi; - m_rssiCount++; - } - - unsigned char temp[M17_FRAME_LENGTH_BYTES]; - decorrelator(data + 2U, temp); - interleaver(temp, data + 2U); - - if ((m_rfState == RPT_RF_STATE::LISTENING) && (data[0U] == TAG_HEADER)) { - m_rfCurrentRFLSF.reset(); - m_rfCurrentNetLSF.reset(); - - CM17Convolution conv; - unsigned char frame[M17_LSF_LENGTH_BYTES]; - unsigned int ber = conv.decodeLinkSetup(data + 2U + M17_SYNC_LENGTH_BYTES, frame); - - bool valid = CM17CRC::checkCRC16(frame, M17_LSF_LENGTH_BYTES); - if (valid) { - m_rfCurrentNetLSF.setLinkSetup(frame); - - bool ret = processRFHeader(false); - if (!ret) { - m_rfCurrentRFLSF.reset(); - m_rfCurrentNetLSF.reset(); - return false; - } - - LogDebug("M17, link setup frame: errs: %u/368 (%.1f%%)", ber, float(ber) / 3.68F); - - m_rfFrames = 0U; - m_rfErrs = ber; - m_rfBits = 368U; - m_rfCollectingLSF.reset(); - m_rfCollectedLSF.reset(); - m_rfTimeoutTimer.start(); - m_minRSSI = m_rssi; - m_maxRSSI = m_rssi; - m_aveRSSI = m_rssi; - m_rssiCount = 1U; - m_rfLSFn = 0U; - m_rfLSFCount = 0U; - m_rfTextBits = 0x00U; - ::memset(m_rfText, 0x00U, 4U * M17_META_LENGTH_BYTES); -#if defined(DUMP_M17) - openFile(); -#endif - return true; - } else { - m_rfState = RPT_RF_STATE::LATE_ENTRY; - return false; - } - } - - if ((m_rfState == RPT_RF_STATE::LISTENING) && (data[0U] == TAG_DATA)) { - m_rfState = RPT_RF_STATE::LATE_ENTRY; - m_rfCurrentRFLSF.reset(); - m_rfCurrentNetLSF.reset(); - } - - if ((m_rfState == RPT_RF_STATE::LATE_ENTRY) && (data[0U] == TAG_DATA)) { - unsigned int lich1, lich2, lich3, lich4; - bool valid1 = CGolay24128::decode24128(data + 2U + M17_SYNC_LENGTH_BYTES + 0U, lich1); - bool valid2 = CGolay24128::decode24128(data + 2U + M17_SYNC_LENGTH_BYTES + 3U, lich2); - bool valid3 = CGolay24128::decode24128(data + 2U + M17_SYNC_LENGTH_BYTES + 6U, lich3); - bool valid4 = CGolay24128::decode24128(data + 2U + M17_SYNC_LENGTH_BYTES + 9U, lich4); - - if (!valid1 || !valid2 || !valid3 || !valid4) - return false; - - unsigned char lich[M17_LICH_FRAGMENT_LENGTH_BYTES]; - CM17Utils::combineFragmentLICH(lich1, lich2, lich3, lich4, lich); - - m_rfLSFn = (lich4 >> 5) & 0x07U; - m_rfCurrentNetLSF.setFragment(lich, m_rfLSFn); - - bool valid = m_rfCurrentNetLSF.isValid(); - if (valid) { - bool ret = processRFHeader(true); - if (!ret) { - m_rfCurrentRFLSF.reset(); - m_rfCurrentNetLSF.reset(); - return false; - } - - m_rfFrames = 0U; - m_rfErrs = 0U; - m_rfBits = 1U; - m_rfCollectingLSF.reset(); - m_rfCollectedLSF.reset(); - m_rfTimeoutTimer.start(); - m_minRSSI = m_rssi; - m_maxRSSI = m_rssi; - m_aveRSSI = m_rssi; - m_rssiCount = 1U; - m_rfLSFCount = 0U; - m_rfTextBits = 0x00U; - ::memset(m_rfText, 0x00U, 4U * M17_META_LENGTH_BYTES); -#if defined(DUMP_M17) - openFile(); -#endif - // Fall through - } else { - return false; - } - } - - if (((m_rfState == RPT_RF_STATE::AUDIO) || (m_rfState == RPT_RF_STATE::DATA_AUDIO)) && (data[0U] == TAG_DATA)) { -#if defined(DUMP_M17) - writeFile(data + 2U); -#endif - // Keep looking at the running LSF in case of changed META field data - unsigned int lich1, lich2, lich3, lich4; - bool valid1 = CGolay24128::decode24128(data + 2U + M17_SYNC_LENGTH_BYTES + 0U, lich1); - bool valid2 = CGolay24128::decode24128(data + 2U + M17_SYNC_LENGTH_BYTES + 3U, lich2); - bool valid3 = CGolay24128::decode24128(data + 2U + M17_SYNC_LENGTH_BYTES + 6U, lich3); - bool valid4 = CGolay24128::decode24128(data + 2U + M17_SYNC_LENGTH_BYTES + 9U, lich4); - - if (valid1 && valid2 && valid3 && valid4) { - unsigned char lich[M17_LICH_FRAGMENT_LENGTH_BYTES]; - CM17Utils::combineFragmentLICH(lich1, lich2, lich3, lich4, lich); - - unsigned int n = (lich4 >> 5) & 0x07U; - m_rfCollectingLSF.setFragment(lich, n); - - // If the latest LSF is valid, save it and start collecting the next one - bool valid = m_rfCollectingLSF.isValid(); - if (valid) { - m_rfCollectedLSF = m_rfCollectingLSF; - m_rfCollectingLSF.reset(); - - unsigned char encryptionType = m_rfCollectedLSF.getEncryptionType(); - unsigned char encryptionSubType = m_rfCollectedLSF.getEncryptionSubType(); - if (encryptionType == M17_ENCRYPTION_TYPE_NONE && encryptionSubType == M17_ENCRYPTION_SUB_TYPE_TEXT) { - unsigned char meta[20U]; - m_rfCollectedLSF.getMeta(meta); - CUtils::dump(1U, "M17, LSF text data fragment", meta, M17_META_LENGTH_BYTES); - - m_rfTextBits |= meta[0U]; - - switch (meta[0U] & 0x0FU) { - case 0x01U: - ::memcpy(m_rfText + 0U, meta + 1U, M17_META_LENGTH_BYTES - 1U); - break; - case 0x02U: - ::memcpy(m_rfText + 13U, meta + 1U, M17_META_LENGTH_BYTES - 1U); - break; - case 0x04U: - ::memcpy(m_rfText + 26U, meta + 1U, M17_META_LENGTH_BYTES - 1U); - break; - case 0x08U: - ::memcpy(m_rfText + 39U, meta + 1U, M17_META_LENGTH_BYTES - 1U); - break; - default: - break; - } - - if (m_rfTextBits == 0x11U || m_rfTextBits == 0x33U || m_rfTextBits == 0x77U || m_rfTextBits == 0xFFU) { - LogMessage("M17, text Data: \"%s\"", m_rfText); - m_rfTextBits = 0x00U; - } - } - } - } - - // Update the currently transmitted LSF when the fragement number is zero - if (m_rfLSFn == 0U) { - bool valid = m_rfCollectedLSF.isValid(); - if (valid) { - m_rfCurrentNetLSF = m_rfCollectedLSF; - m_rfCollectedLSF.reset(); - - m_rfLSFCount++; - if (m_rfLSFCount > 7U) { - createRFLSF(true); - m_rfLSFCount = 0U; - } else { - createRFLSF(false); - } - } - } - - CM17Convolution conv; - unsigned char frame[M17_FN_LENGTH_BYTES + M17_PAYLOAD_LENGTH_BYTES]; - unsigned int errors = conv.decodeData(data + 2U + M17_SYNC_LENGTH_BYTES + M17_LICH_FRAGMENT_FEC_LENGTH_BYTES, frame); - - uint16_t fn = (frame[0U] << 8) + (frame[1U] << 0); - - LogDebug("M17, audio: FN: %u, errs: %u/272 (%.1f%%)", fn, errors, float(errors) / 2.72F); - - m_rfBits += 272U; - m_rfErrs += errors; - - float ber = float(m_rfErrs) / float(m_rfBits); - m_display->writeM17BER(ber); - - if (m_duplex) { - unsigned char rfData[2U + M17_FRAME_LENGTH_BYTES]; - - rfData[0U] = TAG_DATA; - rfData[1U] = 0x00U; - - // Generate the sync - CSync::addM17StreamSync(rfData + 2U); - - unsigned char lich[M17_LICH_FRAGMENT_LENGTH_BYTES]; - m_rfCurrentRFLSF.getFragment(lich, m_rfLSFn); - - // Add the fragment number - lich[5U] = (m_rfLSFn & 0x07U) << 5; - - unsigned int frag1, frag2, frag3, frag4; - CM17Utils::splitFragmentLICH(lich, frag1, frag2, frag3, frag4); - - // Add Golay to the LICH fragment here - unsigned int lich1 = CGolay24128::encode24128(frag1); - unsigned int lich2 = CGolay24128::encode24128(frag2); - unsigned int lich3 = CGolay24128::encode24128(frag3); - unsigned int lich4 = CGolay24128::encode24128(frag4); - - CM17Utils::combineFragmentLICHFEC(lich1, lich2, lich3, lich4, rfData + 2U + M17_SYNC_LENGTH_BYTES); - - // Add the Convolution FEC - conv.encodeData(frame, rfData + 2U + M17_SYNC_LENGTH_BYTES + M17_LICH_FRAGMENT_FEC_LENGTH_BYTES); - - unsigned char temp[M17_FRAME_LENGTH_BYTES]; - interleaver(rfData + 2U, temp); - decorrelator(temp, rfData + 2U); - - writeQueueRF(rfData); - } - - if (m_network != nullptr && m_rfTimeoutTimer.isRunning() && !m_rfTimeoutTimer.hasExpired()) { - unsigned char netData[M17_LSF_LENGTH_BYTES + M17_FN_LENGTH_BYTES + M17_PAYLOAD_LENGTH_BYTES + M17_CRC_LENGTH_BYTES]; - - m_rfCurrentNetLSF.getNetwork(netData + 0U); - - // Copy the FN and payload from the frame - ::memcpy(netData + M17_LSF_LENGTH_BYTES - M17_CRC_LENGTH_BYTES, frame, M17_FN_LENGTH_BYTES + M17_PAYLOAD_LENGTH_BYTES); - // Remove any erronous EOF from the FN - netData[M17_LSF_LENGTH_BYTES - M17_CRC_LENGTH_BYTES + 0U] &= 0x7FU; - - // The CRC is added in the networking code - - m_network->write(netData); - } - - m_rfFrames++; - - m_rfLSFn++; - if (m_rfLSFn >= 6U) - m_rfLSFn = 0U; - - return true; - } - - if (((m_rfState == RPT_RF_STATE::AUDIO) || (m_rfState == RPT_RF_STATE::DATA_AUDIO)) && (data[0U] == TAG_EOT)) { -#if defined(DUMP_M17) - writeFile(data + 2U); -#endif - if (m_duplex) { - unsigned char rfData[M17_FRAME_LENGTH_BYTES + 2U]; - - rfData[0U] = TAG_EOT; - rfData[1U] = 0x00U; - - // Generate the sync - for (unsigned int i = 0U; i < M17_FRAME_LENGTH_BYTES; i += M17_SYNC_LENGTH_BYTES) - CSync::addM17EOTSync(rfData + 2U + i); - - writeQueueRF(rfData); - } - - if (m_network != nullptr && m_rfTimeoutTimer.isRunning() && !m_rfTimeoutTimer.hasExpired()) { - unsigned char netData[M17_LSF_LENGTH_BYTES + M17_FN_LENGTH_BYTES + M17_PAYLOAD_LENGTH_BYTES + M17_CRC_LENGTH_BYTES]; - - m_rfCurrentNetLSF.getNetwork(netData + 0U); - - // Add a EOF FN and silence for the EOF frame - netData[M17_LSF_LENGTH_BYTES - M17_CRC_LENGTH_BYTES + 0U] = 0x80U; - netData[M17_LSF_LENGTH_BYTES - M17_CRC_LENGTH_BYTES + 1U] = 0x00U; - - if (m_rfState == RPT_RF_STATE::AUDIO) { - ::memcpy(netData + M17_LSF_LENGTH_BYTES - M17_CRC_LENGTH_BYTES + M17_FN_LENGTH_BYTES + 0U, M17_3200_SILENCE, 8U); - ::memcpy(netData + M17_LSF_LENGTH_BYTES - M17_CRC_LENGTH_BYTES + M17_FN_LENGTH_BYTES + 8U, M17_3200_SILENCE, 8U); - } else if (m_rfState == RPT_RF_STATE::DATA_AUDIO) { - ::memcpy(netData + M17_LSF_LENGTH_BYTES - M17_CRC_LENGTH_BYTES + M17_FN_LENGTH_BYTES + 0U, M17_1600_SILENCE, 8U); - ::memset(netData + M17_LSF_LENGTH_BYTES - M17_CRC_LENGTH_BYTES + M17_FN_LENGTH_BYTES + 8U, 0x00U, 8U); - } else { - ::memset(netData + M17_LSF_LENGTH_BYTES - M17_CRC_LENGTH_BYTES + M17_FN_LENGTH_BYTES + 0U, 0x00U, 8U); - ::memset(netData + M17_LSF_LENGTH_BYTES - M17_CRC_LENGTH_BYTES + M17_FN_LENGTH_BYTES + 8U, 0x00U, 8U); - } - - // The CRC is added in the networking code - - m_network->write(netData); - } - - if (m_rssi != 0U) - LogMessage("M17, received RF end of transmission from %s to %s, %.1f seconds, BER: %.1f%%, RSSI: -%u/-%u/-%u dBm", m_source.c_str(), m_dest.c_str(), float(m_rfFrames) / 25.0F, float(m_rfErrs * 100U) / float(m_rfBits), m_minRSSI, m_maxRSSI, m_aveRSSI / m_rssiCount); - else - LogMessage("M17, received RF end of transmission from %s to %s, %.1f seconds, BER: %.1f%%", m_source.c_str(), m_dest.c_str(), float(m_rfFrames) / 25.0F, float(m_rfErrs * 100U) / float(m_rfBits)); - writeEndRF(); - - return true; - } - - return false; -} - -unsigned int CM17Control::readModem(unsigned char* data) -{ - assert(data != nullptr); - - if (m_queue.isEmpty()) - return 0U; - - unsigned char len = 0U; - m_queue.getData(&len, 1U); - - m_queue.getData(data, len); - - return len; -} - -void CM17Control::writeEndRF() -{ - m_rfState = RPT_RF_STATE::LISTENING; - - m_rfTimeoutTimer.stop(); - - m_source.clear(); - m_dest.clear(); - - m_rfCurrentRFLSF.reset(); - m_rfCurrentNetLSF.reset(); - m_rfCollectingLSF.reset(); - m_rfCollectedLSF.reset(); - - if (m_netState == RPT_NET_STATE::IDLE) { - m_display->clearM17(); - - if (m_network != nullptr) - m_network->reset(); - } - -#if defined(DUMP_M17) - closeFile(); -#endif -} - -void CM17Control::writeEndNet() -{ - m_netState = RPT_NET_STATE::IDLE; - - m_netTimeoutTimer.stop(); - m_networkWatchdog.stop(); - - m_source.clear(); - m_dest.clear(); - - m_netLSF.reset(); - - m_display->clearM17(); - - if (m_network != nullptr) - m_network->reset(); -} - -void CM17Control::writeNetwork() -{ - unsigned char netData[100U]; - bool exists = m_network->read(netData); - if (!exists) - return; - - if (!m_enabled) - return; - - if ((m_rfState != RPT_RF_STATE::LISTENING) && (m_rfState != RPT_RF_STATE::LATE_ENTRY) && (m_netState == RPT_NET_STATE::IDLE)) { - m_network->reset(); - return; - } - - m_networkWatchdog.start(); - - if (!m_allowEncryption) { - CM17LSF lsf; - lsf.setNetwork(netData); - - unsigned char type = lsf.getEncryptionType(); - if (type != M17_ENCRYPTION_TYPE_NONE) { - m_network->reset(); - return; - } - } - - if (m_netState == RPT_NET_STATE::IDLE) { - m_netLSF.setNetwork(netData); - - m_source = m_netLSF.getSource(); - m_dest = m_netLSF.getDest(); - - m_netLSF.setSource(m_callsign); - m_netLSF.setCAN(m_can); - - unsigned char dataType = m_netLSF.getDataType(); - switch (dataType) { - case M17_DATA_TYPE_DATA: - LogMessage("M17, received network data transmission from %s to %s", m_source.c_str(), m_dest.c_str()); - m_netState = RPT_NET_STATE::DATA; - break; - case M17_DATA_TYPE_VOICE: - LogMessage("M17, received network voice transmission from %s to %s", m_source.c_str(), m_dest.c_str()); - m_netState = RPT_NET_STATE::AUDIO; - break; - case M17_DATA_TYPE_VOICE_DATA: - LogMessage("M17, received network voice + data transmission from %s to %s", m_source.c_str(), m_dest.c_str()); - m_netState = RPT_NET_STATE::DATA_AUDIO; - break; - default: - LogMessage("M17, received network unknown transmission from %s to %s", m_source.c_str(), m_dest.c_str()); - m_network->reset(); - return; - } - - m_display->writeM17(m_source.c_str(), m_dest.c_str(), "N"); - - m_netTimeoutTimer.start(); - m_elapsed.start(); - m_netFrames = 0U; - m_netLSFn = 0U; - m_netTextBits = 0x00U; - ::memset(m_netText, 0x00U, 4U * M17_META_LENGTH_BYTES); - - // Create a dummy start message - unsigned char start[M17_FRAME_LENGTH_BYTES + 2U]; - - start[0U] = TAG_HEADER; - start[1U] = 0x00U; - - // Generate the sync - CSync::addM17LinkSetupSync(start + 2U); - - unsigned char setup[M17_LSF_LENGTH_BYTES]; - m_netLSF.getLinkSetup(setup); - - // Add the convolution FEC - CM17Convolution conv; - conv.encodeLinkSetup(setup, start + 2U + M17_SYNC_LENGTH_BYTES); - - unsigned char temp[M17_FRAME_LENGTH_BYTES]; - interleaver(start + 2U, temp); - decorrelator(temp, start + 2U); - - writeQueueNet(start); - } - - if ((m_netState == RPT_NET_STATE::AUDIO) || (m_netState == RPT_NET_STATE::DATA_AUDIO)) { - // Refresh the LSF every six frames in case the META field changes - if (m_netLSFn == 0U) { - m_netLSF.setNetwork(netData); - - m_netLSF.setSource(m_callsign); - m_netLSF.setCAN(m_can); - - unsigned char encryptionType = m_netLSF.getEncryptionType(); - unsigned char encryptionSubType = m_netLSF.getEncryptionSubType(); - if (encryptionType == M17_ENCRYPTION_TYPE_NONE && encryptionSubType == M17_ENCRYPTION_SUB_TYPE_TEXT) { - unsigned char meta[20U]; - m_netLSF.getMeta(meta); - CUtils::dump(1U, "M17, LSF text data fragment", meta, M17_META_LENGTH_BYTES); - - m_netTextBits |= meta[0U]; - - switch (meta[0U] & 0x0FU) { - case 0x01U: - ::memcpy(m_netText + 0U, meta + 1U, M17_META_LENGTH_BYTES - 1U); - break; - case 0x02U: - ::memcpy(m_netText + 13U, meta + 1U, M17_META_LENGTH_BYTES - 1U); - break; - case 0x04U: - ::memcpy(m_netText + 26U, meta + 1U, M17_META_LENGTH_BYTES - 1U); - break; - case 0x08U: - ::memcpy(m_netText + 39U, meta + 1U, M17_META_LENGTH_BYTES - 1U); - break; - default: - break; - } - - if (m_netTextBits == 0x11U || m_netTextBits == 0x33U || m_netTextBits == 0x77U || m_netTextBits == 0xFFU) { - LogMessage("M17, text Data: \"%s\"", m_netText); - m_netTextBits = 0x00U; - } - } - } - - unsigned char data[M17_FRAME_LENGTH_BYTES + 2U]; - - data[0U] = TAG_DATA; - data[1U] = 0x00U; - - // Generate the sync - CSync::addM17StreamSync(data + 2U); - - m_netFrames++; - - // Add the fragment LICH - unsigned char lich[M17_LICH_FRAGMENT_LENGTH_BYTES]; - m_netLSF.getFragment(lich, m_netLSFn); - - // Add the fragment number - lich[5U] = (m_netLSFn & 0x07U) << 5; - - unsigned int frag1, frag2, frag3, frag4; - CM17Utils::splitFragmentLICH(lich, frag1, frag2, frag3, frag4); - - // Add Golay to the LICH fragment here - unsigned int lich1 = CGolay24128::encode24128(frag1); - unsigned int lich2 = CGolay24128::encode24128(frag2); - unsigned int lich3 = CGolay24128::encode24128(frag3); - unsigned int lich4 = CGolay24128::encode24128(frag4); - - CM17Utils::combineFragmentLICHFEC(lich1, lich2, lich3, lich4, data + 2U + M17_SYNC_LENGTH_BYTES); - - // Add the FN and the data/audio - unsigned char payload[M17_FN_LENGTH_BYTES + M17_PAYLOAD_LENGTH_BYTES]; - - // Copy the FN minus the EOF marker - payload[0U] = netData[28U] & 0x7FU; - payload[1U] = netData[29U]; - - ::memcpy(payload + 2U, netData + 30U, M17_PAYLOAD_LENGTH_BYTES); - - // Add the Convolution FEC - CM17Convolution conv; - conv.encodeData(payload, data + 2U + M17_SYNC_LENGTH_BYTES + M17_LICH_FRAGMENT_FEC_LENGTH_BYTES); - - unsigned char temp[M17_FRAME_LENGTH_BYTES]; - interleaver(data + 2U, temp); - decorrelator(temp, data + 2U); - - writeQueueNet(data); - - m_netLSFn++; - if (m_netLSFn >= 6U) - m_netLSFn = 0U; - - // EOT handling - uint16_t fn = (netData[28U] << 8) + (netData[29U] << 0); - if ((fn & 0x8000U) == 0x8000U) { - LogMessage("M17, received network end of transmission from %s to %s, %.1f seconds", m_source.c_str(), m_dest.c_str(), float(m_netFrames) / 25.0F); - - unsigned char data[M17_FRAME_LENGTH_BYTES + 2U]; - - data[0U] = TAG_EOT; - data[1U] = 0x00U; - - // Generate the sync - for (unsigned int i = 0U; i < M17_FRAME_LENGTH_BYTES; i += M17_SYNC_LENGTH_BYTES) - CSync::addM17EOTSync(data + 2U + i); - - writeQueueNet(data); - - writeEndNet(); - } - } -} - -bool CM17Control::processRFHeader(bool lateEntry) -{ - unsigned char packetStream = m_rfCurrentNetLSF.getPacketStream(); - if (packetStream == M17_PACKET_TYPE) - return false; - - unsigned char can = m_rfCurrentNetLSF.getCAN(); - if (can != m_can) - return false; - - m_source = m_rfCurrentNetLSF.getSource(); - m_dest = m_rfCurrentNetLSF.getDest(); - - if (!m_allowEncryption) { - unsigned char type = m_rfCurrentNetLSF.getEncryptionType(); - if (type != M17_ENCRYPTION_TYPE_NONE) { - LogMessage("M17, access attempt with encryption from %s to %s", m_source.c_str(), m_dest.c_str()); - m_rfState = RPT_RF_STATE::REJECTED; - return true; - } - } - - if (m_selfOnly) { - bool ret = checkCallsign(m_source); - if (!ret) { - LogMessage("M17, invalid access attempt from %s to %s", m_source.c_str(), m_dest.c_str()); - m_rfState = RPT_RF_STATE::REJECTED; - return true; - } - } - - unsigned char dataType = m_rfCurrentNetLSF.getDataType(); - switch (dataType) { - case M17_DATA_TYPE_DATA: - LogMessage("M17, received RF%sdata transmission from %s to %s", lateEntry ? " late entry " : " ", m_source.c_str(), m_dest.c_str()); - m_rfState = RPT_RF_STATE::DATA; - break; - case M17_DATA_TYPE_VOICE: - LogMessage("M17, received RF%svoice transmission from %s to %s", lateEntry ? " late entry " : " ", m_source.c_str(), m_dest.c_str()); - m_rfState = RPT_RF_STATE::AUDIO; - break; - case M17_DATA_TYPE_VOICE_DATA: - LogMessage("M17, received RF%svoice + data transmission from %s to %s", lateEntry ? " late entry " : " ", m_source.c_str(), m_dest.c_str()); - m_rfState = RPT_RF_STATE::DATA_AUDIO; - break; - default: - return false; - } - - m_display->writeM17(m_source.c_str(), m_dest.c_str(), "R"); - - createRFLSF(true); - - if (m_duplex) { - unsigned char data[M17_FRAME_LENGTH_BYTES + 2U]; - - // Create a Link Setup frame - data[0U] = TAG_HEADER; - data[1U] = 0x00U; - - // Generate the sync - CSync::addM17LinkSetupSync(data + 2U); - - unsigned char setup[M17_LSF_LENGTH_BYTES]; - m_rfCurrentRFLSF.getLinkSetup(setup); - - // Add the convolution FEC - CM17Convolution conv; - conv.encodeLinkSetup(setup, data + 2U + M17_SYNC_LENGTH_BYTES); - - unsigned char temp[M17_FRAME_LENGTH_BYTES]; - interleaver(data + 2U, temp); - decorrelator(temp, data + 2U); - - writeQueueRF(data); - } - - return true; -} - -void CM17Control::createRFLSF(bool addCallsign) -{ - m_rfCurrentRFLSF = m_rfCurrentNetLSF; - - m_rfCurrentRFLSF.setSource(m_callsign); - - if (addCallsign) { - m_rfCurrentRFLSF.setEncryptionType(M17_ENCRYPTION_TYPE_NONE); - m_rfCurrentRFLSF.setEncryptionSubType(M17_ENCRYPTION_SUB_TYPE_CALLSIGNS); - - // Copy the encoded source into the META field - unsigned char meta[M17_META_LENGTH_BYTES]; - ::memset(meta, 0x00U, M17_META_LENGTH_BYTES); - CM17Utils::encodeCallsign(m_source, meta + 0U); - - m_rfCurrentRFLSF.setMeta(meta); - } -} - -void CM17Control::clock(unsigned int ms) -{ - if (m_network != nullptr) - writeNetwork(); - - if (!m_enabled) - return; - - m_rfTimeoutTimer.clock(ms); - m_netTimeoutTimer.clock(ms); - - if ((m_netState == RPT_NET_STATE::AUDIO) || (m_netState == RPT_NET_STATE::DATA_AUDIO)) { - m_networkWatchdog.clock(ms); - - if (m_networkWatchdog.hasExpired()) { - LogMessage("M17, network watchdog has expired, %.1f seconds", float(m_netFrames) / 25.0F); - writeEndNet(); - } - } -} - -void CM17Control::writeQueueRF(const unsigned char *data) -{ - assert(data != nullptr); - - if (m_netState != RPT_NET_STATE::IDLE) - return; - - if (m_rfTimeoutTimer.isRunning() && m_rfTimeoutTimer.hasExpired()) - return; - - const unsigned char len = M17_FRAME_LENGTH_BYTES + 2U; - - unsigned int space = m_queue.freeSpace(); - if (space < (len + 1U)) { - LogError("M17, overflow in the M17 RF queue"); - return; - } - - m_queue.addData(&len, 1U); - - m_queue.addData(data, len); -} - -void CM17Control::writeQueueNet(const unsigned char *data) -{ - assert(data != nullptr); - - if (m_netTimeoutTimer.isRunning() && m_netTimeoutTimer.hasExpired()) - return; - - const unsigned char len = M17_FRAME_LENGTH_BYTES + 2U; - - unsigned int space = m_queue.freeSpace(); - if (space < (len + 1U)) { - LogError("M17, overflow in the M17 RF queue"); - return; - } - - m_queue.addData(&len, 1U); - - m_queue.addData(data, len); -} - -void CM17Control::interleaver(const unsigned char* in, unsigned char* out) const -{ - assert(in != nullptr); - assert(out != nullptr); - - for (unsigned int i = 0U; i < (M17_FRAME_LENGTH_BITS - M17_SYNC_LENGTH_BITS); i++) { - unsigned int n1 = i + M17_SYNC_LENGTH_BITS; - bool b = READ_BIT(in, n1) != 0U; - unsigned int n2 = INTERLEAVER[i] + M17_SYNC_LENGTH_BITS; - WRITE_BIT(out, n2, b); - } -} - -void CM17Control::decorrelator(const unsigned char* in, unsigned char* out) const -{ - assert(in != nullptr); - assert(out != nullptr); - - for (unsigned int i = M17_SYNC_LENGTH_BYTES; i < M17_FRAME_LENGTH_BYTES; i++) { - out[i] = in[i] ^ SCRAMBLER[i]; - } -} - -bool CM17Control::checkCallsign(const std::string& callsign) const -{ - size_t len = m_callsign.size(); - - return m_callsign.compare(0U, len, callsign, 0U, len) == 0; -} - -bool CM17Control::openFile() -{ - if (m_fp != nullptr) - return true; - - time_t t; - ::time(&t); - - struct tm* tm = ::localtime(&t); - - char name[100U]; - ::sprintf(name, "M17_%04d%02d%02d_%02d%02d%02d.ambe", tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec); - - m_fp = ::fopen(name, "wb"); - if (m_fp == nullptr) - return false; - - ::fwrite("M17", 1U, 3U, m_fp); - - return true; -} - -bool CM17Control::writeFile(const unsigned char* data) -{ - if (m_fp == nullptr) - return false; - - ::fwrite(data, 1U, M17_FRAME_LENGTH_BYTES, m_fp); - - return true; -} - -void CM17Control::closeFile() -{ - if (m_fp != nullptr) { - ::fclose(m_fp); - m_fp = nullptr; - } -} - -bool CM17Control::isBusy() const -{ - return (m_rfState != RPT_RF_STATE::LISTENING) || (m_netState != RPT_NET_STATE::IDLE); -} - -void CM17Control::enable(bool enabled) -{ - if (!enabled && m_enabled) { - m_queue.clear(); - - // Reset the RF section - switch (m_rfState) { - case RPT_RF_STATE::LISTENING: - case RPT_RF_STATE::REJECTED: - case RPT_RF_STATE::INVALID: - break; - - default: - if (m_rfTimeoutTimer.isRunning()) { - LogMessage("M17, RF user has timed out"); - } - break; - } - m_rfState = RPT_RF_STATE::LISTENING; - - m_rfTimeoutTimer.stop(); - - // Reset the networking section - switch(m_netState) { - case RPT_NET_STATE::IDLE: - break; - - default: - if (m_netTimeoutTimer.isRunning()) { - LogMessage("M17, network user has timed out"); - } - break; - } - m_netState = RPT_NET_STATE::IDLE; - - m_netTimeoutTimer.stop(); - m_networkWatchdog.stop(); - } - - m_enabled = enabled; -} diff --git a/M17Control.h b/M17Control.h deleted file mode 100644 index 5a2274e..0000000 --- a/M17Control.h +++ /dev/null @@ -1,115 +0,0 @@ -/* - * Copyright (C) 2020,2021 by Jonathan Naylor G4KLX - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#if !defined(M17Control_H) -#define M17Control_H - -#include "RSSIInterpolator.h" -#include "M17Network.h" -#include "M17Defines.h" -#include "RingBuffer.h" -#include "StopWatch.h" -#include "Display.h" -#include "Defines.h" -#include "M17LSF.h" -#include "Timer.h" -#include "Modem.h" - -#include - -class CM17Control { -public: - CM17Control(const std::string& callsign, unsigned int can, bool selfOnly, bool allowEncryption, CM17Network* network, CDisplay* display, unsigned int timeout, bool duplex, CRSSIInterpolator* rssiMapper); - ~CM17Control(); - - bool writeModem(unsigned char* data, unsigned int len); - - unsigned int readModem(unsigned char* data); - - void clock(unsigned int ms); - - bool isBusy() const; - - void enable(bool enabled); - -private: - std::string m_callsign; - unsigned int m_can; - bool m_selfOnly; - bool m_allowEncryption; - CM17Network* m_network; - CDisplay* m_display; - bool m_duplex; - CRingBuffer m_queue; - std::string m_source; - std::string m_dest; - RPT_RF_STATE m_rfState; - RPT_NET_STATE m_netState; - CTimer m_rfTimeoutTimer; - CTimer m_netTimeoutTimer; - CTimer m_networkWatchdog; - CStopWatch m_elapsed; - unsigned int m_rfFrames; - unsigned int m_netFrames; - unsigned int m_rfErrs; - unsigned int m_rfBits; - unsigned int m_rfLSFCount; - CM17LSF m_rfCurrentRFLSF; - CM17LSF m_rfCurrentNetLSF; - CM17LSF m_rfCollectingLSF; - CM17LSF m_rfCollectedLSF; - unsigned int m_rfLSFn; - CM17LSF m_netLSF; - unsigned int m_netLSFn; - unsigned char m_rfTextBits; - unsigned char m_netTextBits; - char* m_rfText; - char* m_netText; - CRSSIInterpolator* m_rssiMapper; - unsigned char m_rssi; - unsigned char m_maxRSSI; - unsigned char m_minRSSI; - unsigned int m_aveRSSI; - unsigned int m_rssiCount; - bool m_enabled; - FILE* m_fp; - - bool processRFHeader(bool lateEntry); - - void writeQueueRF(const unsigned char* data); - - void writeQueueNet(const unsigned char* data); - - void writeNetwork(); - - void interleaver(const unsigned char* in, unsigned char* out) const; - void decorrelator(const unsigned char* in, unsigned char* out) const; - - bool checkCallsign(const std::string& source) const; - - void createRFLSF(bool addCallsign); - - void writeEndRF(); - void writeEndNet(); - - bool openFile(); - bool writeFile(const unsigned char* data); - void closeFile(); -}; - -#endif diff --git a/M17Convolution.cpp b/M17Convolution.cpp deleted file mode 100644 index fecd152..0000000 --- a/M17Convolution.cpp +++ /dev/null @@ -1,283 +0,0 @@ -/* - * Copyright (C) 2020,2021,2025 by Jonathan Naylor G4KLX - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#include "M17Convolution.h" - -#include -#include -#include -#include - -const unsigned int PUNCTURE_LIST_LINK_SETUP_COUNT = 60U; - -const unsigned int PUNCTURE_LIST_LINK_SETUP[] = { - 2U, 6U, 10U, 14U, 18U, 22U, 26U, 30U, 34U, 38U, 42U, 46U, 50U, 54U, 58U, 63U, 67U, 71U, 75U, 79U, 83U, - 87U, 91U, 95U, 99U, 103U, 107U, 111U, 115U, 119U, 124U, 128U, 132U, 136U, 140U, 144U, 148U, 152U, 156U, 160U, 164U, 168U, - 172U, 176U, 180U, 185U, 189U, 193U, 197U, 201U, 205U, 209U, 213U, 217U, 221U, 225U, 229U, 233U, 237U, 241U, 246U, 250U, 254U, - 258U, 262U, 266U, 270U, 274U, 278U, 282U, 286U, 290U, 294U, 298U, 302U, 307U, 311U, 315U, 319U, 323U, 327U, 331U, 335U, 339U, - 343U, 347U, 351U, 355U, 359U, 363U, 368U, 372U, 376U, 380U, 384U, 388U, 392U, 396U, 400U, 404U, 408U, 412U, 416U, 420U, 424U, - 429U, 433U, 437U, 441U, 445U, 449U, 453U, 457U, 461U, 465U, 469U, 473U, 477U, 481U, 485U}; - -const unsigned int PUNCTURE_LIST_DATA_COUNT = 12U; - -const unsigned int PUNCTURE_LIST_DATA[] = { - 11U, 23U, 35U, 47U, 59U, 71U, 83U, 95U, 107U, 119U, 131U, 143U, 155U, 167U, 179U, 191U, 203U, 215U, 227U, 239U, 251U, - 263U, 275U, 287U}; - -const unsigned char BIT_MASK_TABLE[] = {0x80U, 0x40U, 0x20U, 0x10U, 0x08U, 0x04U, 0x02U, 0x01U}; - -#define WRITE_BIT1(p,i,b) p[(i)>>3] = (b) ? (p[(i)>>3] | BIT_MASK_TABLE[(i)&7]) : (p[(i)>>3] & ~BIT_MASK_TABLE[(i)&7]) -#define READ_BIT1(p,i) (p[(i)>>3] & BIT_MASK_TABLE[(i)&7]) - -const uint8_t BRANCH_TABLE1[] = {0U, 0U, 0U, 0U, 2U, 2U, 2U, 2U}; -const uint8_t BRANCH_TABLE2[] = {0U, 2U, 2U, 0U, 0U, 2U, 2U, 0U}; - -const unsigned int NUM_OF_STATES_D2 = 8U; -const unsigned int NUM_OF_STATES = 16U; -const uint32_t M = 4U; -const unsigned int K = 5U; - -CM17Convolution::CM17Convolution() : -m_metrics1(nullptr), -m_metrics2(nullptr), -m_oldMetrics(nullptr), -m_newMetrics(nullptr), -m_decisions(nullptr), -m_dp(nullptr) -{ - m_metrics1 = new uint16_t[20U]; - m_metrics2 = new uint16_t[20U]; - m_decisions = new uint64_t[300U]; -} - -CM17Convolution::~CM17Convolution() -{ - delete[] m_metrics1; - delete[] m_metrics2; - delete[] m_decisions; -} - -void CM17Convolution::encodeLinkSetup(const unsigned char* in, unsigned char* out) const -{ - assert(in != nullptr); - assert(out != nullptr); - - unsigned char temp1[31U]; - ::memset(temp1, 0x00U, 31U); - ::memcpy(temp1, in, 30U); - - unsigned char temp2[61U]; - encode(temp1, temp2, 244U); - - unsigned int n = 0U; - unsigned int index = 0U; - for (unsigned int i = 0U; i < 488U; i++) { - if (i != PUNCTURE_LIST_LINK_SETUP[index]) { - bool b = READ_BIT1(temp2, i); - WRITE_BIT1(out, n, b); - n++; - } else { - index++; - } - } -} - -void CM17Convolution::encodeData(const unsigned char* in, unsigned char* out) const -{ - assert(in != nullptr); - assert(out != nullptr); - - unsigned char temp1[19U]; - ::memset(temp1, 0x00U, 19U); - ::memcpy(temp1, in, 18U); - - unsigned char temp2[37U]; - encode(temp1, temp2, 148U); - - unsigned int n = 0U; - unsigned int index = 0U; - for (unsigned int i = 0U; i < 296U; i++) { - if (i != PUNCTURE_LIST_DATA[index]) { - bool b = READ_BIT1(temp2, i); - WRITE_BIT1(out, n, b); - n++; - } else { - index++; - } - } -} - -unsigned int CM17Convolution::decodeLinkSetup(const unsigned char* in, unsigned char* out) -{ - assert(in != nullptr); - assert(out != nullptr); - - uint8_t temp[500U]; - ::memset(temp, 0x00U, 500U); - - unsigned int n = 0U; - unsigned int index = 0U; - for (unsigned int i = 0U; i < 368U; i++) { - if (n == PUNCTURE_LIST_LINK_SETUP[index]) { - temp[n++] = 1U; - index++; - } - - bool b = READ_BIT1(in, i); - temp[n++] = b ? 2U : 0U; - } - - start(); - - n = 0U; - for (unsigned int i = 0U; i < 244U; i++) { - uint8_t s0 = temp[n++]; - uint8_t s1 = temp[n++]; - - decode(s0, s1); - } - - return chainback(out, 240U) - PUNCTURE_LIST_LINK_SETUP_COUNT; -} - -unsigned int CM17Convolution::decodeData(const unsigned char* in, unsigned char* out) -{ - assert(in != nullptr); - assert(out != nullptr); - - uint8_t temp[300U]; - ::memset(temp, 0x00U, 300U); - - unsigned int n = 0U; - unsigned int index = 0U; - for (unsigned int i = 0U; i < 272U; i++) { - if (n == PUNCTURE_LIST_DATA[index]) { - temp[n++] = 1U; - index++; - } - - bool b = READ_BIT1(in, i); - temp[n++] = b ? 2U : 0U; - } - - start(); - - n = 0U; - for (unsigned int i = 0U; i < 148U; i++) { - uint8_t s0 = temp[n++]; - uint8_t s1 = temp[n++]; - - decode(s0, s1); - } - - return chainback(out, 144U) - PUNCTURE_LIST_DATA_COUNT; -} - -void CM17Convolution::start() -{ - ::memset(m_metrics1, 0x00U, NUM_OF_STATES * sizeof(uint16_t)); - ::memset(m_metrics2, 0x00U, NUM_OF_STATES * sizeof(uint16_t)); - - m_oldMetrics = m_metrics1; - m_newMetrics = m_metrics2; - m_dp = m_decisions; -} - -void CM17Convolution::decode(uint8_t s0, uint8_t s1) -{ - *m_dp = 0U; - - for (uint8_t i = 0U; i < NUM_OF_STATES_D2; i++) { - uint8_t j = i * 2U; - - uint16_t metric = std::abs(BRANCH_TABLE1[i] - s0) + std::abs(BRANCH_TABLE2[i] - s1); - - uint16_t m0 = m_oldMetrics[i] + metric; - uint16_t m1 = m_oldMetrics[i + NUM_OF_STATES_D2] + (M - metric); - uint8_t decision0 = (m0 >= m1) ? 1U : 0U; - m_newMetrics[j + 0U] = decision0 != 0U ? m1 : m0; - - m0 = m_oldMetrics[i] + (M - metric); - m1 = m_oldMetrics[i + NUM_OF_STATES_D2] + metric; - uint8_t decision1 = (m0 >= m1) ? 1U : 0U; - m_newMetrics[j + 1U] = decision1 != 0U ? m1 : m0; - - *m_dp |= (uint64_t(decision1) << (j + 1U)) | (uint64_t(decision0) << (j + 0U)); - } - - ++m_dp; - - assert((m_dp - m_decisions) <= 300); - - uint16_t* tmp = m_oldMetrics; - m_oldMetrics = m_newMetrics; - m_newMetrics = tmp; -} - -unsigned int CM17Convolution::chainback(unsigned char* out, unsigned int nBits) -{ - assert(out != nullptr); - - uint32_t state = 0U; - - while (nBits-- > 0) { - --m_dp; - - uint32_t i = state >> (9 - K); - uint8_t bit = uint8_t(*m_dp >> i) & 1; - state = (bit << 7) | (state >> 1); - - WRITE_BIT1(out, nBits, bit != 0U); - } - - unsigned int minCost = m_oldMetrics[0]; - - for (unsigned int i = 0U; i < NUM_OF_STATES; i++) { - if (m_oldMetrics[i] < minCost) - minCost = m_oldMetrics[i]; - } - - return minCost / (M >> 1); -} - -void CM17Convolution::encode(const unsigned char* in, unsigned char* out, unsigned int nBits) const -{ - assert(in != nullptr); - assert(out != nullptr); - assert(nBits > 0U); - - uint8_t d1 = 0U, d2 = 0U, d3 = 0U, d4 = 0U; - uint32_t k = 0U; - for (unsigned int i = 0U; i < nBits; i++) { - uint8_t d = READ_BIT1(in, i) ? 1U : 0U; - - uint8_t g1 = (d + d3 + d4) & 1; - uint8_t g2 = (d + d1 + d2 + d4) & 1; - - d4 = d3; - d3 = d2; - d2 = d1; - d1 = d; - - WRITE_BIT1(out, k, g1 != 0U); - k++; - - WRITE_BIT1(out, k, g2 != 0U); - k++; - } -} diff --git a/M17Convolution.h b/M17Convolution.h deleted file mode 100644 index 0c5c7c3..0000000 --- a/M17Convolution.h +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright (C) 2020,2021 by Jonathan Naylor G4KLX - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#if !defined(M17Convolution_H) -#define M17Convolution_H - -#include - -class CM17Convolution { -public: - CM17Convolution(); - ~CM17Convolution(); - - unsigned int decodeLinkSetup(const unsigned char* in, unsigned char* out); - unsigned int decodeData(const unsigned char* in, unsigned char* out); - - void encodeLinkSetup(const unsigned char* in, unsigned char* out) const; - void encodeData(const unsigned char* in, unsigned char* out) const; - -private: - uint16_t* m_metrics1; - uint16_t* m_metrics2; - uint16_t* m_oldMetrics; - uint16_t* m_newMetrics; - uint64_t* m_decisions; - uint64_t* m_dp; - - void start(); - void decode(uint8_t s0, uint8_t s1); - - unsigned int chainback(unsigned char* out, unsigned int nBits); - - void encode(const unsigned char* in, unsigned char* out, unsigned int nBits) const; -}; - -#endif diff --git a/M17Defines.h b/M17Defines.h deleted file mode 100644 index 5db7f7c..0000000 --- a/M17Defines.h +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Copyright (C) 2020,2021,2025 by Jonathan Naylor G4KLX - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#if !defined(M17DEFINES_H) -#define M17DEFINES_H - -const unsigned int M17_RADIO_SYMBOL_LENGTH = 5U; // At 24 kHz sample rate - -const unsigned int M17_FRAME_LENGTH_BITS = 384U; -const unsigned int M17_FRAME_LENGTH_BYTES = M17_FRAME_LENGTH_BITS / 8U; - -const unsigned char M17_LINK_SETUP_SYNC_BYTES[] = {0x55U, 0xF7U}; -const unsigned char M17_STREAM_SYNC_BYTES[] = {0xFFU, 0x5DU}; -const unsigned char M17_EOT_SYNC_BYTES[] = {0x55U, 0x5DU}; - -const unsigned int M17_SYNC_LENGTH_BITS = 16U; -const unsigned int M17_SYNC_LENGTH_BYTES = M17_SYNC_LENGTH_BITS / 8U; - -const unsigned int M17_LSF_LENGTH_BITS = 240U; -const unsigned int M17_LSF_LENGTH_BYTES = M17_LSF_LENGTH_BITS / 8U; - -const unsigned int M17_LSF_FRAGMENT_LENGTH_BITS = M17_LSF_LENGTH_BITS / 6U; -const unsigned int M17_LSF_FRAGMENT_LENGTH_BYTES = M17_LSF_FRAGMENT_LENGTH_BITS / 8U; - -const unsigned int M17_LICH_FRAGMENT_LENGTH_BITS = M17_LSF_FRAGMENT_LENGTH_BITS + 8U; -const unsigned int M17_LICH_FRAGMENT_LENGTH_BYTES = M17_LICH_FRAGMENT_LENGTH_BITS / 8U; - -const unsigned int M17_LSF_FRAGMENT_FEC_LENGTH_BITS = M17_LSF_FRAGMENT_LENGTH_BITS * 2U; -const unsigned int M17_LSF_FRAGMENT_FEC_LENGTH_BYTES = M17_LSF_FRAGMENT_FEC_LENGTH_BITS / 8U; - -const unsigned int M17_LICH_FRAGMENT_FEC_LENGTH_BITS = M17_LICH_FRAGMENT_LENGTH_BITS * 2U; -const unsigned int M17_LICH_FRAGMENT_FEC_LENGTH_BYTES = M17_LICH_FRAGMENT_FEC_LENGTH_BITS / 8U; - -const unsigned int M17_PAYLOAD_LENGTH_BITS = 128U; -const unsigned int M17_PAYLOAD_LENGTH_BYTES = M17_PAYLOAD_LENGTH_BITS / 8U; - -const unsigned char M17_NULL_NONCE[] = {0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U}; -const unsigned int M17_META_LENGTH_BITS = 112U; -const unsigned int M17_META_LENGTH_BYTES = M17_META_LENGTH_BITS / 8U; - -const unsigned int M17_FN_LENGTH_BITS = 16U; -const unsigned int M17_FN_LENGTH_BYTES = M17_FN_LENGTH_BITS / 8U; - -const unsigned int M17_CRC_LENGTH_BITS = 16U; -const unsigned int M17_CRC_LENGTH_BYTES = M17_CRC_LENGTH_BITS / 8U; - -const unsigned char M17_3200_SILENCE[] = {0x01U, 0x00U, 0x09U, 0x43U, 0x9CU, 0xE4U, 0x21U, 0x08U}; -const unsigned char M17_1600_SILENCE[] = {0x0CU, 0x41U, 0x09U, 0x03U, 0x0CU, 0x41U, 0x09U, 0x03U}; - -const unsigned char M17_PACKET_TYPE = 0U; -const unsigned char M17_STREAM_TYPE = 1U; - -const unsigned char M17_DATA_TYPE_DATA = 0x01U; -const unsigned char M17_DATA_TYPE_VOICE = 0x02U; -const unsigned char M17_DATA_TYPE_VOICE_DATA = 0x03U; - -const unsigned char M17_ENCRYPTION_TYPE_NONE = 0x00U; -const unsigned char M17_ENCRYPTION_TYPE_AES = 0x01U; -const unsigned char M17_ENCRYPTION_TYPE_SCRAMBLE = 0x02U; - -const unsigned char M17_ENCRYPTION_SUB_TYPE_TEXT = 0x00U; -const unsigned char M17_ENCRYPTION_SUB_TYPE_GPS = 0x01U; -const unsigned char M17_ENCRYPTION_SUB_TYPE_CALLSIGNS = 0x02U; - -#endif diff --git a/M17LSF.cpp b/M17LSF.cpp deleted file mode 100644 index f80e88f..0000000 --- a/M17LSF.cpp +++ /dev/null @@ -1,220 +0,0 @@ -/* - * Copyright (C) 2020,2021,2023,2025 by Jonathan Naylor G4KLX - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#include "M17LSF.h" -#include "M17Utils.h" -#include "M17Defines.h" -#include "M17CRC.h" - -#include -#include - -CM17LSF::CM17LSF(const CM17LSF& lsf) : -m_lsf(nullptr), -m_valid(lsf.m_valid) -{ - m_lsf = new unsigned char[M17_LSF_LENGTH_BYTES]; - - ::memcpy(m_lsf, lsf.m_lsf, M17_LSF_LENGTH_BYTES); -} - -CM17LSF::CM17LSF() : -m_lsf(nullptr), -m_valid(false) -{ - m_lsf = new unsigned char[M17_LSF_LENGTH_BYTES]; - - ::memset(m_lsf, 0x00U, M17_LSF_LENGTH_BYTES); -} - -CM17LSF::~CM17LSF() -{ - delete[] m_lsf; -} - -void CM17LSF::getNetwork(unsigned char* data) const -{ - assert(data != nullptr); - - ::memcpy(data, m_lsf, M17_LSF_LENGTH_BYTES); -} - -void CM17LSF::setNetwork(const unsigned char* data) -{ - assert(data != nullptr); - - ::memcpy(m_lsf, data, M17_LSF_LENGTH_BYTES); - - m_valid = true; -} - -std::string CM17LSF::getSource() const -{ - std::string callsign; - CM17Utils::decodeCallsign(m_lsf + 6U, callsign); - - return callsign; -} - -void CM17LSF::setSource(const std::string& callsign) -{ - CM17Utils::encodeCallsign(callsign, m_lsf + 6U); -} - -std::string CM17LSF::getDest() const -{ - std::string callsign; - CM17Utils::decodeCallsign(m_lsf + 0U, callsign); - - return callsign; -} - -void CM17LSF::setDest(const std::string& callsign) -{ - CM17Utils::encodeCallsign(callsign, m_lsf + 0U); -} - -unsigned char CM17LSF::getPacketStream() const -{ - return m_lsf[13U] & 0x01U; -} - -void CM17LSF::setPacketStream(unsigned char ps) -{ - m_lsf[13U] &= 0xF7U; - m_lsf[13U] |= ps & 0x01U; -} - -unsigned char CM17LSF::getDataType() const -{ - return (m_lsf[13U] >> 1) & 0x03U; -} - -void CM17LSF::setDataType(unsigned char type) -{ - m_lsf[13U] &= 0xF9U; - m_lsf[13U] |= (type << 1) & 0x06U; -} - -unsigned char CM17LSF::getEncryptionType() const -{ - return (m_lsf[13U] >> 3) & 0x03U; -} - -void CM17LSF::setEncryptionType(unsigned char type) -{ - m_lsf[13U] &= 0xE7U; - m_lsf[13U] |= (type << 3) & 0x18U; -} - -unsigned char CM17LSF::getEncryptionSubType() const -{ - return (m_lsf[13U] >> 5) & 0x03U; -} - -void CM17LSF::setEncryptionSubType(unsigned char type) -{ - m_lsf[13U] &= 0x9FU; - m_lsf[13U] |= (type << 5) & 0x60U; -} - -unsigned char CM17LSF::getCAN() const -{ - return ((m_lsf[12U] << 1) & 0x0EU) | ((m_lsf[13U] >> 7) & 0x01U); -} - -void CM17LSF::setCAN(unsigned char can) -{ - m_lsf[13U] &= 0x7FU; - m_lsf[13U] |= (can << 7) & 0x80U; - - m_lsf[12U] &= 0xF8U; - m_lsf[12U] |= (can >> 1) & 0x07U; -} - -void CM17LSF::getMeta(unsigned char* data) const -{ - assert(data != nullptr); - - ::memcpy(data, m_lsf + 14U, M17_META_LENGTH_BYTES); -} - -void CM17LSF::setMeta(const unsigned char* data) -{ - assert(data != nullptr); - - ::memcpy(m_lsf + 14U, data, M17_META_LENGTH_BYTES); -} - -void CM17LSF::reset() -{ - ::memset(m_lsf, 0x00U, M17_LSF_LENGTH_BYTES); - - m_valid = false; -} - -bool CM17LSF::isValid() const -{ - return m_valid; -} - -void CM17LSF::getLinkSetup(unsigned char* data) const -{ - assert(data != nullptr); - - ::memcpy(data, m_lsf, M17_LSF_LENGTH_BYTES); - - CM17CRC::encodeCRC16(data, M17_LSF_LENGTH_BYTES); -} - -void CM17LSF::setLinkSetup(const unsigned char* data) -{ - assert(data != nullptr); - - ::memcpy(m_lsf, data, M17_LSF_LENGTH_BYTES); - - m_valid = CM17CRC::checkCRC16(m_lsf, M17_LSF_LENGTH_BYTES); -} - -void CM17LSF::getFragment(unsigned char* data, unsigned int n) const -{ - assert(data != nullptr); - - CM17CRC::encodeCRC16(m_lsf, M17_LSF_LENGTH_BYTES); - - ::memcpy(data, m_lsf + (n * M17_LSF_FRAGMENT_LENGTH_BYTES), M17_LSF_FRAGMENT_LENGTH_BYTES); -} - -void CM17LSF::setFragment(const unsigned char* data, unsigned int n) -{ - assert(data != nullptr); - - ::memcpy(m_lsf + (n * M17_LSF_FRAGMENT_LENGTH_BYTES), data, M17_LSF_FRAGMENT_LENGTH_BYTES); - - m_valid = CM17CRC::checkCRC16(m_lsf, M17_LSF_LENGTH_BYTES); -} - -CM17LSF& CM17LSF::operator=(const CM17LSF& lsf) -{ - if (&lsf != this) { - ::memcpy(m_lsf, lsf.m_lsf, M17_LSF_LENGTH_BYTES); - m_valid = lsf.m_valid; - } - - return *this; -} diff --git a/M17LSF.h b/M17LSF.h deleted file mode 100644 index 92aaa2a..0000000 --- a/M17LSF.h +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Copyright (C) 2020,2021 by Jonathan Naylor G4KLX - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#if !defined(M17LSF_H) -#define M17LSF_H - -#include - -class CM17LSF { -public: - CM17LSF(const CM17LSF& lsf); - CM17LSF(); - ~CM17LSF(); - - void getNetwork(unsigned char* data) const; - void setNetwork(const unsigned char* data); - - std::string getSource() const; - void setSource(const std::string& callsign); - - std::string getDest() const; - void setDest(const std::string& callsign); - - unsigned char getPacketStream() const; - void setPacketStream(unsigned char ps); - - unsigned char getDataType() const; - void setDataType(unsigned char type); - - unsigned char getEncryptionType() const; - void setEncryptionType(unsigned char type); - - unsigned char getEncryptionSubType() const; - void setEncryptionSubType(unsigned char type); - - unsigned char getCAN() const; - void setCAN(unsigned char can); - - void getMeta(unsigned char* data) const; - void setMeta(const unsigned char* data); - - void reset(); - bool isValid() const; - - void getLinkSetup(unsigned char* data) const; - void setLinkSetup(const unsigned char* data); - - void getFragment(unsigned char* data, unsigned int n) const; - void setFragment(const unsigned char* data, unsigned int n); - - CM17LSF& operator=(const CM17LSF& lsf); - -private: - unsigned char* m_lsf; - bool m_valid; -}; - -#endif diff --git a/M17Network.cpp b/M17Network.cpp deleted file mode 100644 index d731bb5..0000000 --- a/M17Network.cpp +++ /dev/null @@ -1,217 +0,0 @@ -/* - * Copyright (C) 2020,2021,2023,2025 by Jonathan Naylor G4KLX - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#include "M17Network.h" -#include "M17Defines.h" -#include "M17Utils.h" -#include "Defines.h" -#include "Utils.h" -#include "Log.h" - -#include -#include -#include - -const unsigned int BUFFER_LENGTH = 200U; - -CM17Network::CM17Network(const std::string& localAddress, unsigned short localPort, const std::string& gatewayAddress, unsigned short gatewayPort, bool debug) : -m_socket(localAddress, localPort), -m_addr(), -m_addrLen(0U), -m_debug(debug), -m_enabled(false), -m_outId(0U), -m_inId(0U), -m_buffer(1000U, "M17 Network"), -m_random(), -m_timer(1000U, 5U) -{ - if (CUDPSocket::lookup(gatewayAddress, gatewayPort, m_addr, m_addrLen) != 0) { - m_addrLen = 0U; - return; - } - - std::random_device rd; - std::mt19937 mt(rd()); - m_random = mt; -} - -CM17Network::~CM17Network() -{ -} - -bool CM17Network::open() -{ - if (m_addrLen == 0U) { - LogError("M17, unable to resolve the gateway address"); - return false; - } - - LogMessage("Opening M17 network connection"); - - bool ret = m_socket.open(m_addr); - - if (ret) { - m_timer.start(); - return true; - } else { - return false; - } -} - -bool CM17Network::write(const unsigned char* data) -{ - if (m_addrLen == 0U) - return false; - - assert(data != nullptr); - - unsigned char buffer[100U]; - - buffer[0U] = 'M'; - buffer[1U] = '1'; - buffer[2U] = '7'; - buffer[3U] = ' '; - - // Create a random id for this transmission if needed - if (m_outId == 0U) { - std::uniform_int_distribution dist(0x0001, 0xFFFE); - m_outId = dist(m_random); - } - - buffer[4U] = m_outId / 256U; // Unique session id - buffer[5U] = m_outId % 256U; - - ::memcpy(buffer + 6U, data, 46U); - - // Dummy CRC - buffer[52U] = 0x00U; - buffer[53U] = 0x00U; - - if (m_debug) - CUtils::dump(1U, "M17 Network Transmitted", buffer, 54U); - - return m_socket.write(buffer, 54U, m_addr, m_addrLen); -} - -void CM17Network::clock(unsigned int ms) -{ - m_timer.clock(ms); - if (m_timer.isRunning() && m_timer.hasExpired()) { - sendPing(); - m_timer.start(); - } - - unsigned char buffer[BUFFER_LENGTH]; - - sockaddr_storage address; - unsigned int addrLen; - int length = m_socket.read(buffer, BUFFER_LENGTH, address, addrLen); - if (length <= 0) - return; - - if (!CUDPSocket::match(m_addr, address)) { - LogMessage("M17, packet received from an invalid source"); - return; - } - - if (m_debug) - CUtils::dump(1U, "M17 Network Received", buffer, length); - - if (!m_enabled) - return; - - if (::memcmp(buffer + 0U, "PING", 4U) == 0) - return; - - if (::memcmp(buffer + 0U, "M17 ", 4U) != 0) { - CUtils::dump(2U, "M17, received unknown packet", buffer, length); - return; - } - - uint16_t id = (buffer[4U] << 8) + (buffer[5U] << 0); - if (m_inId == 0U) { - m_inId = id; - } else { - if (id != m_inId) - return; - } - - unsigned char c = length - 6U; - m_buffer.addData(&c, 1U); - - m_buffer.addData(buffer + 6U, length - 6U); -} - -bool CM17Network::read(unsigned char* data) -{ - assert(data != nullptr); - - if (m_buffer.isEmpty()) - return false; - - unsigned char c = 0U; - m_buffer.getData(&c, 1U); - - m_buffer.getData(data, c); - - return true; -} - -void CM17Network::close() -{ - m_socket.close(); - - LogMessage("Closing M17 network connection"); -} - -void CM17Network::reset() -{ - m_outId = 0U; - m_inId = 0U; -} - -void CM17Network::enable(bool enabled) -{ - if (enabled && !m_enabled) - reset(); - else if (!enabled && m_enabled) - m_buffer.clear(); - - m_enabled = enabled; -} - -bool CM17Network::isConnected() const -{ - return (m_addrLen != 0); -} - -void CM17Network::sendPing() -{ - unsigned char buffer[5U]; - - buffer[0U] = 'P'; - buffer[1U] = 'I'; - buffer[2U] = 'N'; - buffer[3U] = 'G'; - - if (m_debug) - CUtils::dump(1U, "M17 Network Transmitted", buffer, 4U); - - m_socket.write(buffer, 4U, m_addr, m_addrLen); -} diff --git a/M17Network.h b/M17Network.h deleted file mode 100644 index e98ec08..0000000 --- a/M17Network.h +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright (C) 2020,2021 by Jonathan Naylor G4KLX - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#ifndef M17Network_H -#define M17Network_H - -#include "M17Defines.h" -#include "RingBuffer.h" -#include "UDPSocket.h" -#include "Timer.h" - -#include -#include - -class CM17Network { -public: - CM17Network(const std::string& localAddress, unsigned short localPort, const std::string& gatewayAddress, unsigned short gatewayPort, bool debug); - ~CM17Network(); - - bool open(); - - void enable(bool enabled); - - bool write(const unsigned char* data); - - bool read(unsigned char* data); - - void reset(); - - void close(); - - void clock(unsigned int ms); - - bool isConnected() const; - -private: - CUDPSocket m_socket; - sockaddr_storage m_addr; - unsigned int m_addrLen; - bool m_debug; - bool m_enabled; - uint16_t m_outId; - uint16_t m_inId; - CRingBuffer m_buffer; - std::mt19937 m_random; - CTimer m_timer; - - void sendPing(); -}; - -#endif diff --git a/M17Utils.cpp b/M17Utils.cpp deleted file mode 100644 index cc31564..0000000 --- a/M17Utils.cpp +++ /dev/null @@ -1,236 +0,0 @@ -/* - * Copyright (C) 2020,2021,2024,2025 by Jonathan Naylor G4KLX - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#include "M17Utils.h" -#include "M17Defines.h" - -#include -#include - -const std::string M17_CHARS = " ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-/."; - -const unsigned char BIT_MASK_TABLE[] = { 0x80U, 0x40U, 0x20U, 0x10U, 0x08U, 0x04U, 0x02U, 0x01U }; - -#define WRITE_BIT1(p,i,b) p[(i)>>3] = (b) ? (p[(i)>>3] | BIT_MASK_TABLE[(i)&7]) : (p[(i)>>3] & ~BIT_MASK_TABLE[(i)&7]) -#define READ_BIT1(p,i) (p[(i)>>3] & BIT_MASK_TABLE[(i)&7]) - -void CM17Utils::encodeCallsign(const std::string& callsign, unsigned char* encoded) -{ - assert(encoded != nullptr); - - if (callsign == "ALL" || callsign == "ALL ") { - encoded[0U] = 0xFFU; - encoded[1U] = 0xFFU; - encoded[2U] = 0xFFU; - encoded[3U] = 0xFFU; - encoded[4U] = 0xFFU; - encoded[5U] = 0xFFU; - return; - } - - unsigned int len = (unsigned int)callsign.size(); - if (len > 9U) - len = 9U; - - uint64_t enc = 0ULL; - for (int i = len - 1; i >= 0; i--) { - if ((i == 0) && (callsign[i] == '#')) { - enc += 262144000000000ULL; - } else { - size_t pos = M17_CHARS.find(callsign[i]); - if (pos == std::string::npos) - pos = 0ULL; - - enc *= 40ULL; - enc += pos; - } - } - - encoded[0U] = (enc >> 40) & 0xFFU; - encoded[1U] = (enc >> 32) & 0xFFU; - encoded[2U] = (enc >> 24) & 0xFFU; - encoded[3U] = (enc >> 16) & 0xFFU; - encoded[4U] = (enc >> 8) & 0xFFU; - encoded[5U] = (enc >> 0) & 0xFFU; -} - -void CM17Utils::decodeCallsign(const unsigned char* encoded, std::string& callsign) -{ - assert(encoded != nullptr); - - callsign.clear(); - - uint64_t enc = (uint64_t(encoded[0U]) << 40) + - (uint64_t(encoded[1U]) << 32) + - (uint64_t(encoded[2U]) << 24) + - (uint64_t(encoded[3U]) << 16) + - (uint64_t(encoded[4U]) << 8) + - (uint64_t(encoded[5U]) << 0); - - if (enc == 281474976710655ULL) { - callsign = "ALL"; - return; - } - - if (enc >= 268697600000000ULL) { - callsign = "Invalid"; - return; - } - - if (enc >= 262144000000000ULL) { - callsign = "#"; - enc -= 262144000000000ULL; - } - - while (enc > 0ULL) { - callsign += " ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-/."[enc % 40ULL]; - enc /= 40ULL; - } -} - -void CM17Utils::splitFragmentLICH(const unsigned char* data, unsigned int& frag1, unsigned int& frag2, unsigned int& frag3, unsigned int& frag4) -{ - assert(data != nullptr); - - frag1 = frag2 = frag3 = frag4 = 0x00U; - - unsigned int offset = 0U; - unsigned int MASK = 0x800U; - for (unsigned int i = 0U; i < (M17_LICH_FRAGMENT_LENGTH_BITS / 4U); i++, offset++, MASK >>= 1) { - bool b = READ_BIT1(data, offset) != 0x00U; - if (b) - frag1 |= MASK; - } - - MASK = 0x800U; - for (unsigned int i = 0U; i < (M17_LICH_FRAGMENT_LENGTH_BITS / 4U); i++, offset++, MASK >>= 1) { - bool b = READ_BIT1(data, offset) != 0x00U; - if (b) - frag2 |= MASK; - } - - MASK = 0x800U; - for (unsigned int i = 0U; i < (M17_LICH_FRAGMENT_LENGTH_BITS / 4U); i++, offset++, MASK >>= 1) { - bool b = READ_BIT1(data, offset) != 0x00U; - if (b) - frag3 |= MASK; - } - - MASK = 0x800U; - for (unsigned int i = 0U; i < (M17_LICH_FRAGMENT_LENGTH_BITS / 4U); i++, offset++, MASK >>= 1) { - bool b = READ_BIT1(data, offset) != 0x00U; - if (b) - frag4 |= MASK; - } -} - -void CM17Utils::splitFragmentLICHFEC(const unsigned char* data, unsigned int& frag1, unsigned int& frag2, unsigned int& frag3, unsigned int& frag4) -{ - assert(data != nullptr); - - frag1 = frag2 = frag3 = frag4 = 0x00U; - - unsigned int offset = 0U; - unsigned int MASK = 0x800000U; - for (unsigned int i = 0U; i < (M17_LICH_FRAGMENT_FEC_LENGTH_BITS / 4U); i++, offset++, MASK >>= 1) { - bool b = READ_BIT1(data, offset) != 0x00U; - if (b) - frag1 |= MASK; - } - - MASK = 0x800000U; - for (unsigned int i = 0U; i < (M17_LICH_FRAGMENT_FEC_LENGTH_BITS / 4U); i++, offset++, MASK >>= 1) { - bool b = READ_BIT1(data, offset) != 0x00U; - if (b) - frag2 |= MASK; - } - - MASK = 0x800000U; - for (unsigned int i = 0U; i < (M17_LICH_FRAGMENT_FEC_LENGTH_BITS / 4U); i++, offset++, MASK >>= 1) { - bool b = READ_BIT1(data, offset) != 0x00U; - if (b) - frag3 |= MASK; - } - - MASK = 0x800000U; - for (unsigned int i = 0U; i < (M17_LICH_FRAGMENT_FEC_LENGTH_BITS / 4U); i++, offset++, MASK >>= 1) { - bool b = READ_BIT1(data, offset) != 0x00U; - if (b) - frag4 |= MASK; - } -} - -void CM17Utils::combineFragmentLICH(unsigned int frag1, unsigned int frag2, unsigned int frag3, unsigned int frag4, unsigned char* data) -{ - assert(data != nullptr); - - unsigned int offset = 0U; - unsigned int MASK = 0x800U; - for (unsigned int i = 0U; i < (M17_LICH_FRAGMENT_LENGTH_BITS / 4U); i++, offset++, MASK >>= 1) { - bool b = (frag1 & MASK) == MASK; - WRITE_BIT1(data, offset, b); - } - - MASK = 0x800U; - for (unsigned int i = 0U; i < (M17_LICH_FRAGMENT_LENGTH_BITS / 4U); i++, offset++, MASK >>= 1) { - bool b = (frag2 & MASK) == MASK; - WRITE_BIT1(data, offset, b); - } - - MASK = 0x800U; - for (unsigned int i = 0U; i < (M17_LICH_FRAGMENT_LENGTH_BITS / 4U); i++, offset++, MASK >>= 1) { - bool b = (frag3 & MASK) == MASK; - WRITE_BIT1(data, offset, b); - } - - MASK = 0x800U; - for (unsigned int i = 0U; i < (M17_LICH_FRAGMENT_LENGTH_BITS / 4U); i++, offset++, MASK >>= 1) { - bool b = (frag4 & MASK) == MASK; - WRITE_BIT1(data, offset, b); - } -} - -void CM17Utils::combineFragmentLICHFEC(unsigned int frag1, unsigned int frag2, unsigned int frag3, unsigned int frag4, unsigned char* data) -{ - assert(data != nullptr); - - unsigned int offset = 0U; - unsigned int MASK = 0x800000U; - for (unsigned int i = 0U; i < (M17_LICH_FRAGMENT_FEC_LENGTH_BITS / 4U); i++, offset++, MASK >>= 1) { - bool b = (frag1 & MASK) == MASK; - WRITE_BIT1(data, offset, b); - } - - MASK = 0x800000U; - for (unsigned int i = 0U; i < (M17_LICH_FRAGMENT_FEC_LENGTH_BITS / 4U); i++, offset++, MASK >>= 1) { - bool b = (frag2 & MASK) == MASK; - WRITE_BIT1(data, offset, b); - } - - MASK = 0x800000U; - for (unsigned int i = 0U; i < (M17_LICH_FRAGMENT_FEC_LENGTH_BITS / 4U); i++, offset++, MASK >>= 1) { - bool b = (frag3 & MASK) == MASK; - WRITE_BIT1(data, offset, b); - } - - MASK = 0x800000U; - for (unsigned int i = 0U; i < (M17_LICH_FRAGMENT_FEC_LENGTH_BITS / 4U); i++, offset++, MASK >>= 1) { - bool b = (frag4 & MASK) == MASK; - WRITE_BIT1(data, offset, b); - } -} diff --git a/M17Utils.h b/M17Utils.h deleted file mode 100644 index c6e27ce..0000000 --- a/M17Utils.h +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright (C) 2020 by Jonathan Naylor G4KLX - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#if !defined(M17Utils_H) -#define M17Utils_H - -#include - -class CM17Utils { -public: - CM17Utils(); - ~CM17Utils(); - - static void encodeCallsign(const std::string& callsign, unsigned char* encoded); - static void decodeCallsign(const unsigned char* encoded, std::string& callsign); - - static void splitFragmentLICH(const unsigned char* data, unsigned int& frag1, unsigned int& frag2, unsigned int& frag3, unsigned int& frag4); - static void splitFragmentLICHFEC(const unsigned char* data, unsigned int& frag1, unsigned int& frag2, unsigned int& frag3, unsigned int& frag4); - - static void combineFragmentLICH(unsigned int frag1, unsigned int frag2, unsigned int frag3, unsigned int frag4, unsigned char* data); - static void combineFragmentLICHFEC(unsigned int frag1, unsigned int frag2, unsigned int frag3, unsigned int frag4, unsigned char* data); - -private: -}; - -#endif diff --git a/MMDVM.ini b/MMDVM.ini index 6b5697e..d77181f 100644 --- a/MMDVM.ini +++ b/MMDVM.ini @@ -77,7 +77,6 @@ RFLevel=100 # YSFTXLevel=50 # P25TXLevel=50 # NXDNTXLevel=50 -# M17TXLevel=50 # POCSAGTXLevel=50 # FMTXLevel=50 # AX25TXLevel=50 @@ -148,13 +147,6 @@ RemoteGateway=0 TXHang=5 # ModeHang=10 -[M17] -Enable=1 -CAN=0 -SelfOnly=0 -TXHang=5 -# ModeHang=10 - [POCSAG] Enable=1 Frequency=439987500 @@ -267,15 +259,6 @@ GatewayPort=14020 # ModeHang=3 Debug=0 -[M17 Network] -Enable=1 -LocalAddress=127.0.0.1 -LocalPort=17011 -GatewayAddress=127.0.0.1 -GatewayPort=17010 -# ModeHang=3 -Debug=0 - [POCSAG Network] Enable=1 LocalAddress=127.0.0.1 diff --git a/MMDVMHost.cpp b/MMDVMHost.cpp index 65733d6..436f6ac 100644 --- a/MMDVMHost.cpp +++ b/MMDVMHost.cpp @@ -139,7 +139,6 @@ m_dmr(nullptr), m_ysf(nullptr), m_p25(nullptr), m_nxdn(nullptr), -m_m17(nullptr), m_pocsag(nullptr), m_fm(nullptr), m_ax25(nullptr), @@ -148,7 +147,6 @@ m_dmrNetwork(nullptr), m_ysfNetwork(nullptr), m_p25Network(nullptr), m_nxdnNetwork(nullptr), -m_m17Network(nullptr), m_pocsagNetwork(nullptr), m_fmNetwork(nullptr), m_ax25Network(nullptr), @@ -159,14 +157,12 @@ m_dmrRFModeHang(10U), m_ysfRFModeHang(10U), m_p25RFModeHang(10U), m_nxdnRFModeHang(10U), -m_m17RFModeHang(10U), m_fmRFModeHang(10U), m_dstarNetModeHang(3U), m_dmrNetModeHang(3U), m_ysfNetModeHang(3U), m_p25NetModeHang(3U), m_nxdnNetModeHang(3U), -m_m17NetModeHang(3U), m_pocsagNetModeHang(3U), m_fmNetModeHang(3U), m_modeTimer(1000U), @@ -179,7 +175,6 @@ m_dmrEnabled(false), m_ysfEnabled(false), m_p25Enabled(false), m_nxdnEnabled(false), -m_m17Enabled(false), m_pocsagEnabled(false), m_fmEnabled(false), m_ax25Enabled(false), @@ -326,11 +321,6 @@ int CMMDVMHost::run() m_nxdnEnabled = false; } - if (m_m17Enabled && !m_modem->hasM17()) { - LogWarning("M17 enabled in the host but not in the modem firmware, disabling"); - m_m17Enabled = false; - } - if (m_fmEnabled && !m_modem->hasFM()) { LogWarning("FM enabled in the host but not in the modem firmware, disabling"); m_fmEnabled = false; @@ -380,12 +370,6 @@ int CMMDVMHost::run() return 1; } - if (m_m17Enabled && m_conf.getM17NetworkEnabled()) { - ret = createM17Network(); - if (!ret) - return 1; - } - if (m_pocsagEnabled && m_conf.getPOCSAGNetworkEnabled()) { ret = createPOCSAGNetwork(); if (!ret) @@ -690,23 +674,6 @@ int CMMDVMHost::run() m_nxdn = new CNXDNControl(ran, id, selfOnly, m_nxdnNetwork, m_display, m_timeout, m_duplex, remoteGateway, m_nxdnLookup, rssi); } - if (m_m17Enabled) { - bool selfOnly = m_conf.getM17SelfOnly(); - unsigned int can = m_conf.getM17CAN(); - bool allowEncryption = m_conf.getM17AllowEncryption(); - unsigned int txHang = m_conf.getM17TXHang(); - m_m17RFModeHang = m_conf.getM17ModeHang(); - - LogInfo("M17 RF Parameters"); - LogInfo(" Self Only: %s", selfOnly ? "yes" : "no"); - LogInfo(" CAN: %u", can); - LogInfo(" Allow Encryption: %s", allowEncryption ? "yes" : "no"); - LogInfo(" TX Hang: %us", txHang); - LogInfo(" Mode Hang: %us", m_m17RFModeHang); - - m_m17 = new CM17Control(m_callsign, can, selfOnly, allowEncryption, m_m17Network, m_display, m_timeout, m_duplex, rssi); - } - CTimer pocsagTimer(1000U, 30U); if (m_pocsagEnabled) { @@ -930,23 +897,6 @@ int CMMDVMHost::run() } } - len = m_modem->readM17Data(data); - if (m_m17 != nullptr && m_m17Enabled && len > 0U) { - if (m_mode == MODE_IDLE) { - bool ret = m_m17->writeModem(data, len); - if (ret) { - m_modeTimer.setTimeout(m_m17RFModeHang); - setMode(MODE_M17); - } - } else if (m_mode == MODE_M17) { - bool ret = m_m17->writeModem(data, len); - if (ret) - m_modeTimer.start(); - } else if (m_mode != MODE_LOCKOUT) { - LogWarning("M17 modem data received when in mode %u", m_mode); - } - } - len = m_modem->readFMData(data); if (m_fm != nullptr && m_fmEnabled && len > 0U) { if (m_mode == MODE_IDLE) { @@ -1104,25 +1054,6 @@ int CMMDVMHost::run() } } - if (m_m17 != nullptr && m_m17Enabled) { - ret = m_modem->hasM17Space(); - if (ret) { - len = m_m17->readModem(data); - if (len > 0U) { - if (m_mode == MODE_IDLE) { - m_modeTimer.setTimeout(m_m17NetModeHang); - setMode(MODE_M17); - } - if (m_mode == MODE_M17) { - m_modem->writeM17Data(data, len); - m_modeTimer.start(); - } else if (m_mode != MODE_LOCKOUT) { - LogWarning("M17 data received when in mode %u", m_mode); - } - } - } - } - if (m_pocsag != nullptr && m_pocsagEnabled) { ret = m_modem->hasPOCSAGSpace(); if (ret) { @@ -1216,8 +1147,6 @@ int CMMDVMHost::run() m_p25->clock(ms); if (m_nxdn != nullptr) m_nxdn->clock(ms); - if (m_m17 != nullptr) - m_m17->clock(ms); if (m_pocsag != nullptr) m_pocsag->clock(ms); if (m_fm != nullptr) @@ -1233,8 +1162,6 @@ int CMMDVMHost::run() m_p25Network->clock(ms); if (m_nxdnNetwork != nullptr) m_nxdnNetwork->clock(ms); - if (m_m17Network != nullptr) - m_m17Network->clock(ms); if (m_pocsagNetwork != nullptr) m_pocsagNetwork->clock(ms); if (m_fmNetwork != nullptr) @@ -1343,11 +1270,6 @@ int CMMDVMHost::run() delete m_nxdnNetwork; } - if (m_m17Network != nullptr) { - m_m17Network->close(); - delete m_m17Network; - } - if (m_pocsagNetwork != nullptr) { m_pocsagNetwork->close(); delete m_pocsagNetwork; @@ -1380,7 +1302,6 @@ int CMMDVMHost::run() delete m_ysf; delete m_p25; delete m_nxdn; - delete m_m17; delete m_pocsag; delete m_fm; delete m_ax25; @@ -1421,7 +1342,6 @@ bool CMMDVMHost::createModem() float ysfTXLevel = m_conf.getModemYSFTXLevel(); float p25TXLevel = m_conf.getModemP25TXLevel(); float nxdnTXLevel = m_conf.getModemNXDNTXLevel(); - float m17TXLevel = m_conf.getModemM17TXLevel(); float pocsagTXLevel = m_conf.getModemPOCSAGTXLevel(); float fmTXLevel = m_conf.getModemFMTXLevel(); float ax25TXLevel = m_conf.getModemAX25TXLevel(); @@ -1432,7 +1352,6 @@ bool CMMDVMHost::createModem() unsigned int ysfTXHang = m_conf.getFusionTXHang(); unsigned int p25TXHang = m_conf.getP25TXHang(); unsigned int nxdnTXHang = m_conf.getNXDNTXHang(); - unsigned int m17TXHang = m_conf.getM17TXHang(); unsigned int rxFrequency = m_conf.getRXFrequency(); unsigned int txFrequency = m_conf.getTXFrequency(); unsigned int pocsagFrequency = m_conf.getPOCSAGFrequency(); @@ -1483,7 +1402,6 @@ bool CMMDVMHost::createModem() LogInfo(" YSF TX Level: %.1f%%", ysfTXLevel); LogInfo(" P25 TX Level: %.1f%%", p25TXLevel); LogInfo(" NXDN TX Level: %.1f%%", nxdnTXLevel); - LogInfo(" M17 TX Level: %.1f%%", m17TXLevel); LogInfo(" POCSAG TX Level: %.1f%%", pocsagTXLevel); LogInfo(" FM TX Level: %.1f%%", fmTXLevel); LogInfo(" AX.25 TX Level: %.1f%%", ax25TXLevel); @@ -1507,14 +1425,13 @@ bool CMMDVMHost::createModem() return false; m_modem->setPort(port); - m_modem->setModeParams(m_dstarEnabled, m_dmrEnabled, m_ysfEnabled, m_p25Enabled, m_nxdnEnabled, m_m17Enabled, m_pocsagEnabled, m_fmEnabled, m_ax25Enabled); - m_modem->setLevels(rxLevel, cwIdTXLevel, dstarTXLevel, dmrTXLevel, ysfTXLevel, p25TXLevel, nxdnTXLevel, m17TXLevel, pocsagTXLevel, fmTXLevel, ax25TXLevel); + m_modem->setModeParams(m_dstarEnabled, m_dmrEnabled, m_ysfEnabled, m_p25Enabled, m_nxdnEnabled, m_pocsagEnabled, m_fmEnabled, m_ax25Enabled); + m_modem->setLevels(rxLevel, cwIdTXLevel, dstarTXLevel, dmrTXLevel, ysfTXLevel, p25TXLevel, nxdnTXLevel, pocsagTXLevel, fmTXLevel, ax25TXLevel); m_modem->setRFParams(rxFrequency, rxOffset, txFrequency, txOffset, txDCOffset, rxDCOffset, rfLevel, pocsagFrequency); m_modem->setDMRParams(colorCode); m_modem->setYSFParams(lowDeviation, ysfTXHang); m_modem->setP25Params(p25TXHang); m_modem->setNXDNParams(nxdnTXHang); - m_modem->setM17Params(m17TXHang); m_modem->setAX25Params(rxTwist, ax25TXDelay, ax25SlotTime, ax25PPersist); if (m_fmEnabled) { @@ -1824,35 +1741,6 @@ bool CMMDVMHost::createNXDNNetwork() return true; } -bool CMMDVMHost::createM17Network() -{ - std::string gatewayAddress = m_conf.getM17GatewayAddress(); - unsigned short gatewayPort = m_conf.getM17GatewayPort(); - std::string localAddress = m_conf.getM17LocalAddress(); - unsigned short localPort = m_conf.getM17LocalPort(); - m_m17NetModeHang = m_conf.getM17NetworkModeHang(); - bool debug = m_conf.getM17NetworkDebug(); - - LogInfo("M17 Network Parameters"); - LogInfo(" Gateway Address: %s", gatewayAddress.c_str()); - LogInfo(" Gateway Port: %hu", gatewayPort); - LogInfo(" Local Address: %s", localAddress.c_str()); - LogInfo(" Local Port: %hu", localPort); - LogInfo(" Mode Hang: %us", m_m17NetModeHang); - - m_m17Network = new CM17Network(localAddress, localPort, gatewayAddress, gatewayPort, debug); - bool ret = m_m17Network->open(); - if (!ret) { - delete m_m17Network; - m_m17Network = nullptr; - return false; - } - - m_m17Network->enable(true); - - return true; -} - bool CMMDVMHost::createPOCSAGNetwork() { std::string gatewayAddress = m_conf.getPOCSAGGatewayAddress(); @@ -1961,7 +1849,6 @@ void CMMDVMHost::readParams() m_ysfEnabled = m_conf.getFusionEnabled(); m_p25Enabled = m_conf.getP25Enabled(); m_nxdnEnabled = m_conf.getNXDNEnabled(); - m_m17Enabled = m_conf.getM17Enabled(); m_pocsagEnabled = m_conf.getPOCSAGEnabled(); m_fmEnabled = m_conf.getFMEnabled(); m_ax25Enabled = m_conf.getAX25Enabled(); @@ -1980,7 +1867,6 @@ void CMMDVMHost::readParams() LogInfo(" YSF: %s", m_ysfEnabled ? "enabled" : "disabled"); LogInfo(" P25: %s", m_p25Enabled ? "enabled" : "disabled"); LogInfo(" NXDN: %s", m_nxdnEnabled ? "enabled" : "disabled"); - LogInfo(" M17: %s", m_m17Enabled ? "enabled" : "disabled"); LogInfo(" POCSAG: %s", m_pocsagEnabled ? "enabled" : "disabled"); LogInfo(" FM: %s", m_fmEnabled ? "enabled" : "disabled"); LogInfo(" AX.25: %s", m_ax25Enabled ? "enabled" : "disabled"); @@ -1992,7 +1878,7 @@ void CMMDVMHost::enableModemMode(bool& mode, bool enabled) mode = enabled; - m_modem->setModeParams(m_dstarEnabled, m_dmrEnabled, m_ysfEnabled, m_p25Enabled, m_nxdnEnabled, m_m17Enabled, m_pocsagEnabled, m_fmEnabled, m_ax25Enabled); + m_modem->setModeParams(m_dstarEnabled, m_dmrEnabled, m_ysfEnabled, m_p25Enabled, m_nxdnEnabled, m_pocsagEnabled, m_fmEnabled, m_ax25Enabled); if (!m_modem->writeConfig()) LogError("Cannot write Config to MMDVM"); } @@ -2033,11 +1919,6 @@ void CMMDVMHost::processEnableModeCommand(unsigned char mode, bool hasController m_nxdnNetwork->enable(enableMode); m_nxdn->enable(enableMode); break; - case MODE_M17: - if (m_m17Network != nullptr) - m_m17Network->enable(enableMode); - m_m17->enable(enableMode); - break; case MODE_FM: if (isAX25) m_ax25->enable(enableMode); @@ -2066,9 +1947,6 @@ void CMMDVMHost::processEnableModeCommand(unsigned char mode, bool hasController case MODE_NXDN: while (m_modem->readNXDNData(data) > 0U); break; - case MODE_M17: - while (m_modem->readM17Data(data) > 0U); - break; case MODE_FM: while ((isAX25 ? m_modem->readAX25Data(data) : m_modem->readFMData(data)) > 0U); break; @@ -2100,8 +1978,6 @@ void CMMDVMHost::setMode(unsigned char mode) m_p25Network->enable(false); if (m_nxdnNetwork != nullptr) m_nxdnNetwork->enable(false); - if (m_m17Network != nullptr) - m_m17Network->enable(false); if (m_pocsagNetwork != nullptr) m_pocsagNetwork->enable(false); if (m_fmNetwork != nullptr) @@ -2118,8 +1994,6 @@ void CMMDVMHost::setMode(unsigned char mode) m_p25->enable(false); if (m_nxdn != nullptr) m_nxdn->enable(false); - if (m_m17 != nullptr) - m_m17->enable(false); if (m_pocsag != nullptr) m_pocsag->enable(false); if (m_fm != nullptr) @@ -2147,8 +2021,6 @@ void CMMDVMHost::setMode(unsigned char mode) m_p25Network->enable(false); if (m_nxdnNetwork != nullptr) m_nxdnNetwork->enable(false); - if (m_m17Network != nullptr) - m_m17Network->enable(false); if (m_pocsagNetwork != nullptr) m_pocsagNetwork->enable(false); if (m_fmNetwork != nullptr) @@ -2165,8 +2037,6 @@ void CMMDVMHost::setMode(unsigned char mode) m_p25->enable(false); if (m_nxdn != nullptr) m_nxdn->enable(false); - if (m_m17 != nullptr) - m_m17->enable(false); if (m_pocsag != nullptr) m_pocsag->enable(false); if (m_fm != nullptr) @@ -2198,8 +2068,6 @@ void CMMDVMHost::setMode(unsigned char mode) m_p25Network->enable(false); if (m_nxdnNetwork != nullptr) m_nxdnNetwork->enable(false); - if (m_m17Network != nullptr) - m_m17Network->enable(false); if (m_pocsagNetwork != nullptr) m_pocsagNetwork->enable(false); if (m_fmNetwork != nullptr) @@ -2216,8 +2084,6 @@ void CMMDVMHost::setMode(unsigned char mode) m_p25->enable(false); if (m_nxdn != nullptr) m_nxdn->enable(false); - if (m_m17 != nullptr) - m_m17->enable(false); if (m_pocsag != nullptr) m_pocsag->enable(false); if (m_fm != nullptr) @@ -2245,8 +2111,6 @@ void CMMDVMHost::setMode(unsigned char mode) m_p25Network->enable(true); if (m_nxdnNetwork != nullptr) m_nxdnNetwork->enable(false); - if (m_m17Network != nullptr) - m_m17Network->enable(false); if (m_pocsagNetwork != nullptr) m_pocsagNetwork->enable(false); if (m_fmNetwork != nullptr) @@ -2263,8 +2127,6 @@ void CMMDVMHost::setMode(unsigned char mode) m_p25->enable(true); if (m_nxdn != nullptr) m_nxdn->enable(false); - if (m_m17 != nullptr) - m_m17->enable(false); if (m_pocsag != nullptr) m_pocsag->enable(false); if (m_fm != nullptr) @@ -2292,8 +2154,6 @@ void CMMDVMHost::setMode(unsigned char mode) m_p25Network->enable(false); if (m_nxdnNetwork != nullptr && m_nxdnEnabled) m_nxdnNetwork->enable(true); - if (m_m17Network != nullptr) - m_m17Network->enable(false); if (m_pocsagNetwork != nullptr) m_pocsagNetwork->enable(false); if (m_fmNetwork != nullptr) @@ -2310,8 +2170,6 @@ void CMMDVMHost::setMode(unsigned char mode) m_p25->enable(false); if (m_nxdn != nullptr && m_nxdnEnabled) m_nxdn->enable(true); - if (m_m17 != nullptr) - m_m17->enable(false); if (m_pocsag != nullptr) m_pocsag->enable(false); if (m_fm != nullptr) @@ -2328,53 +2186,6 @@ void CMMDVMHost::setMode(unsigned char mode) } break; - case MODE_M17: - if (m_dstarNetwork != nullptr) - m_dstarNetwork->enable(false); - if (m_dmrNetwork != nullptr) - m_dmrNetwork->enable(false); - if (m_ysfNetwork != nullptr) - m_ysfNetwork->enable(false); - if (m_p25Network != nullptr) - m_p25Network->enable(false); - if (m_nxdnNetwork != nullptr) - m_nxdnNetwork->enable(false); - if (m_m17Network != nullptr && m_m17Enabled) - m_m17Network->enable(true); - if (m_pocsagNetwork != nullptr) - m_pocsagNetwork->enable(false); - if (m_fmNetwork != nullptr) - m_fmNetwork->enable(false); - if (m_ax25Network != nullptr) - m_ax25Network->enable(false); - if (m_dstar != nullptr) - m_dstar->enable(false); - if (m_dmr != nullptr) - m_dmr->enable(false); - if (m_ysf != nullptr) - m_ysf->enable(false); - if (m_p25 != nullptr) - m_p25->enable(false); - if (m_nxdn != nullptr) - m_nxdn->enable(false); - if (m_m17 != nullptr && m_m17Enabled) - m_m17->enable(true); - if (m_pocsag != nullptr) - m_pocsag->enable(false); - if (m_fm != nullptr) - m_fm->enable(false); - if (m_ax25 != nullptr) - m_ax25->enable(false); - 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: if (m_dstarNetwork != nullptr) m_dstarNetwork->enable(false); @@ -2386,8 +2197,6 @@ void CMMDVMHost::setMode(unsigned char mode) m_p25Network->enable(false); if (m_nxdnNetwork != nullptr) m_nxdnNetwork->enable(false); - if (m_m17Network != nullptr) - m_m17Network->enable(false); if (m_pocsagNetwork != nullptr && m_pocsagEnabled) m_pocsagNetwork->enable(true); if (m_fmNetwork != nullptr) @@ -2404,8 +2213,6 @@ void CMMDVMHost::setMode(unsigned char mode) m_p25->enable(false); if (m_nxdn != nullptr) m_nxdn->enable(false); - if (m_m17 != nullptr) - m_m17->enable(false); if (m_pocsag != nullptr && m_pocsagEnabled) m_pocsag->enable(true); if (m_fm != nullptr) @@ -2431,8 +2238,6 @@ void CMMDVMHost::setMode(unsigned char mode) m_p25Network->enable(false); if (m_nxdnNetwork != nullptr) m_nxdnNetwork->enable(false); - if (m_m17Network != nullptr) - m_m17Network->enable(false); if (m_pocsagNetwork != nullptr) m_pocsagNetwork->enable(false); if (m_fmNetwork != nullptr && m_fmEnabled) @@ -2449,8 +2254,6 @@ void CMMDVMHost::setMode(unsigned char mode) m_p25->enable(false); if (m_nxdn != nullptr) m_nxdn->enable(false); - if (m_m17 != nullptr) - m_m17->enable(false); if (m_pocsag != nullptr) m_pocsag->enable(false); if (m_fm != nullptr && m_fmEnabled) @@ -2483,8 +2286,6 @@ void CMMDVMHost::setMode(unsigned char mode) m_p25Network->enable(false); if (m_nxdnNetwork != nullptr) m_nxdnNetwork->enable(false); - if (m_m17Network != nullptr) - m_m17Network->enable(false); if (m_pocsagNetwork != nullptr) m_pocsagNetwork->enable(false); if (m_fmNetwork != nullptr) @@ -2501,8 +2302,6 @@ void CMMDVMHost::setMode(unsigned char mode) m_p25->enable(false); if (m_nxdn != nullptr) m_nxdn->enable(false); - if (m_m17 != nullptr) - m_m17->enable(false); if (m_pocsag != nullptr) m_pocsag->enable(false); if (m_fm != nullptr) @@ -2534,8 +2333,6 @@ void CMMDVMHost::setMode(unsigned char mode) m_p25Network->enable(false); if (m_nxdnNetwork != nullptr) m_nxdnNetwork->enable(false); - if (m_m17Network != nullptr) - m_m17Network->enable(false); if (m_pocsagNetwork != nullptr) m_pocsagNetwork->enable(false); if (m_fmNetwork != nullptr) @@ -2552,8 +2349,6 @@ void CMMDVMHost::setMode(unsigned char mode) m_p25->enable(false); if (m_nxdn != nullptr) m_nxdn->enable(false); - if (m_m17 != nullptr) - m_m17->enable(false); if (m_pocsag != nullptr) m_pocsag->enable(false); if (m_fm != nullptr) @@ -2583,8 +2378,6 @@ void CMMDVMHost::setMode(unsigned char mode) m_p25Network->enable(true); if (m_nxdnNetwork != nullptr && m_nxdnEnabled) m_nxdnNetwork->enable(true); - if (m_m17Network != nullptr && m_m17Enabled) - m_m17Network->enable(true); if (m_pocsagNetwork != nullptr && m_pocsagEnabled) m_pocsagNetwork->enable(true); if (m_fmNetwork != nullptr && m_fmEnabled) @@ -2601,8 +2394,6 @@ void CMMDVMHost::setMode(unsigned char mode) m_p25->enable(true); if (m_nxdn != nullptr && m_nxdnEnabled) m_nxdn->enable(true); - if (m_m17 != nullptr && m_m17Enabled) - m_m17->enable(true); if (m_pocsag != nullptr && m_pocsagEnabled) m_pocsag->enable(true); if (m_fm != nullptr && m_fmEnabled) @@ -2685,10 +2476,6 @@ void CMMDVMHost::remoteControl() if (m_nxdn != nullptr) processModeCommand(MODE_NXDN, m_nxdnRFModeHang); break; - case REMOTE_COMMAND::MODE_M17: - if (m_m17 != nullptr) - processModeCommand(MODE_M17, m_m17RFModeHang); - break; case REMOTE_COMMAND::MODE_FM: if (m_fmEnabled) processModeCommand(MODE_FM, 0); @@ -2708,9 +2495,6 @@ void CMMDVMHost::remoteControl() case REMOTE_COMMAND::ENABLE_NXDN: processEnableModeCommand(MODE_NXDN, (m_nxdn != nullptr), m_nxdnEnabled, true); break; - case REMOTE_COMMAND::ENABLE_M17: - processEnableModeCommand(MODE_M17, (m_m17 != nullptr), m_m17Enabled, true); - break; case REMOTE_COMMAND::ENABLE_FM: processEnableModeCommand(MODE_FM, (m_fm != nullptr), m_fmEnabled, true); break; @@ -2732,9 +2516,6 @@ void CMMDVMHost::remoteControl() case REMOTE_COMMAND::DISABLE_NXDN: processEnableModeCommand(MODE_NXDN, (m_nxdn != nullptr), m_nxdnEnabled, false); break; - case REMOTE_COMMAND::DISABLE_M17: - processEnableModeCommand(MODE_M17, (m_m17 != nullptr), m_m17Enabled, false); - break; case REMOTE_COMMAND::DISABLE_FM: processEnableModeCommand(MODE_FM, (m_fm != nullptr), m_fmEnabled, false); break; @@ -2830,7 +2611,6 @@ void CMMDVMHost::buildNetworkStatusString(std::string &str) str += std::string(" ysf:") + (((m_ysfNetwork == nullptr) || (m_ysfEnabled == false)) ? "n/a" : (m_ysfNetwork->isConnected() ? "conn" : "disc")); str += std::string(" p25:") + (((m_p25Network == nullptr) || (m_p25Enabled == false)) ? "n/a" : (m_p25Network->isConnected() ? "conn" : "disc")); str += std::string(" nxdn:") + (((m_nxdnNetwork == nullptr) || (m_nxdnEnabled == false)) ? "n/a" : (m_nxdnNetwork->isConnected() ? "conn" : "disc")); - str += std::string(" m17:") + (((m_m17Network == nullptr) || (m_m17Enabled == false)) ? "n/a" : (m_m17Network->isConnected() ? "conn" : "disc")); str += std::string(" fm:") + (m_fmEnabled ? "conn" : "n/a"); } @@ -2864,6 +2644,5 @@ void CMMDVMHost::buildNetworkHostsString(std::string &str) str += std::string(" ysf:\"") + ((m_ysfEnabled && (m_ysfNetwork != nullptr)) ? m_conf.getFusionNetworkGatewayAddress() : "NONE") + "\""; str += std::string(" p25:\"") + ((m_p25Enabled && (m_p25Network != nullptr)) ? m_conf.getP25GatewayAddress() : "NONE") + "\""; str += std::string(" nxdn:\"") + ((m_nxdnEnabled && (m_nxdnNetwork != nullptr)) ? m_conf.getNXDNGatewayAddress() : "NONE") + "\""; - str += std::string(" m17:\"") + ((m_m17Enabled && (m_m17Network != nullptr)) ? m_conf.getM17GatewayAddress() : "NONE") + "\""; str += std::string(" fm:\"") + ((m_fmEnabled && (m_fmNetwork != nullptr)) ? m_conf.getFMGatewayAddress() : "NONE") + "\""; } diff --git a/MMDVMHost.h b/MMDVMHost.h index 678e3ef..c3a1dc7 100644 --- a/MMDVMHost.h +++ b/MMDVMHost.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2015-2021 by Jonathan Naylor G4KLX + * Copyright (C) 2015-2021,2025 by Jonathan Naylor G4KLX * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -31,12 +31,10 @@ #include "YSFControl.h" #include "P25Control.h" #include "NXDNControl.h" -#include "M17Control.h" #include "NXDNLookup.h" #include "YSFNetwork.h" #include "P25Network.h" #include "DMRNetwork.h" -#include "M17Network.h" #include "FMNetwork.h" #include "DMRLookup.h" #include "FMControl.h" @@ -67,7 +65,6 @@ private: CYSFControl* m_ysf; CP25Control* m_p25; CNXDNControl* m_nxdn; - CM17Control* m_m17; CPOCSAGControl* m_pocsag; CFMControl* m_fm; CAX25Control* m_ax25; @@ -76,7 +73,6 @@ private: CYSFNetwork* m_ysfNetwork; CP25Network* m_p25Network; INXDNNetwork* m_nxdnNetwork; - CM17Network* m_m17Network; CPOCSAGNetwork* m_pocsagNetwork; CFMNetwork* m_fmNetwork; CAX25Network* m_ax25Network; @@ -87,14 +83,12 @@ private: unsigned int m_ysfRFModeHang; unsigned int m_p25RFModeHang; unsigned int m_nxdnRFModeHang; - unsigned int m_m17RFModeHang; unsigned int m_fmRFModeHang; unsigned int m_dstarNetModeHang; unsigned int m_dmrNetModeHang; unsigned int m_ysfNetModeHang; unsigned int m_p25NetModeHang; unsigned int m_nxdnNetModeHang; - unsigned int m_m17NetModeHang; unsigned int m_pocsagNetModeHang; unsigned int m_fmNetModeHang; CTimer m_modeTimer; @@ -107,7 +101,6 @@ private: bool m_ysfEnabled; bool m_p25Enabled; bool m_nxdnEnabled; - bool m_m17Enabled; bool m_pocsagEnabled; bool m_fmEnabled; bool m_ax25Enabled; @@ -129,7 +122,6 @@ private: bool createYSFNetwork(); bool createP25Network(); bool createNXDNNetwork(); - bool createM17Network(); bool createPOCSAGNetwork(); bool createFMNetwork(); bool createAX25Network(); diff --git a/MMDVMHost.vcxproj b/MMDVMHost.vcxproj index 230e6e5..642202d 100644 --- a/MMDVMHost.vcxproj +++ b/MMDVMHost.vcxproj @@ -207,13 +207,6 @@ - - - - - - - @@ -319,12 +312,6 @@ - - - - - - diff --git a/MMDVMHost.vcxproj.filters b/MMDVMHost.vcxproj.filters index 33b1adb..ac785b8 100644 --- a/MMDVMHost.vcxproj.filters +++ b/MMDVMHost.vcxproj.filters @@ -284,27 +284,6 @@ Header Files - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - Header Files @@ -601,24 +580,6 @@ Source Files - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - Source Files diff --git a/Makefile b/Makefile index 9132bc2..47ac0cc 100644 --- a/Makefile +++ b/Makefile @@ -12,7 +12,7 @@ OBJECTS = \ AMBEFEC.o BCH.o AX25Control.o AX25Network.o BPTC19696.o CASTInfo.o Conf.o CRC.o Display.o DMRControl.o DMRCSBK.o DMRData.o DMRDataHeader.o \ DMRDirectNetwork.o DMREMB.o DMREmbeddedData.o DMRFullLC.o DMRGatewayNetwork.o DMRLookup.o DMRLC.o DMRNetwork.o DMRShortLC.o DMRSlot.o DMRSlotType.o \ DMRAccessControl.o DMRTA.o DMRTrellis.o DStarControl.o DStarHeader.o DStarNetwork.o DStarSlowData.o FMControl.o FMNetwork.o Golay2087.o Golay24128.o \ - Hamming.o I2CController.o IIRDirectForm1Filter.o LCDproc.o Log.o M17Control.o M17Convolution.o M17CRC.o M17LSF.o M17Network.o M17Utils.o MMDVMHost.o \ + Hamming.o I2CController.o IIRDirectForm1Filter.o LCDproc.o Log.o MMDVMHost.o \ Modem.o ModemPort.o ModemSerialPort.o Mutex.o NetworkInfo.o Nextion.o NullController.o NullDisplay.o NXDNAudio.o NXDNControl.o \ NXDNConvolution.o NXDNCRC.o NXDNFACCH1.o NXDNIcomNetwork.o NXDNKenwoodNetwork.o NXDNLayer3.o NXDNLICH.o NXDNLookup.o NXDNNetwork.o NXDNSACCH.o \ NXDNUDCH.o P25Audio.o P25Control.o P25Data.o P25LowSpeedData.o P25Network.o P25NID.o P25Trellis.o P25Utils.o PseudoTTYController.o POCSAGControl.o \ diff --git a/Makefile.Pi.Adafruit b/Makefile.Pi.Adafruit index 5442c42..599b40f 100644 --- a/Makefile.Pi.Adafruit +++ b/Makefile.Pi.Adafruit @@ -13,7 +13,7 @@ OBJECTS = \ AMBEFEC.o AX25Control.o AX25Network.o BCH.o BPTC19696.o CASTInfo.o Conf.o CRC.o Display.o DMRControl.o DMRCSBK.o DMRData.o DMRDataHeader.o \ DMRDirectNetwork.o DMREMB.o DMREmbeddedData.o DMRFullLC.o DMRGatewayNetwork.o DMRLookup.o DMRLC.o DMRNetwork.o DMRShortLC.o DMRSlot.o DMRSlotType.o \ DMRAccessControl.o DMRTA.o DMRTrellis.o DStarControl.o DStarHeader.o DStarNetwork.o DStarSlowData.o FMControl.o FMNetwork.o Golay2087.o Golay24128.o \ - Hamming.o HD44780.o I2CController.o IIRDirectForm1Filter.o LCDproc.o Log.o M17Control.o M17Convolution.o M17CRC.o M17LSF.o M17Network.o M17Utils.o \ + Hamming.o HD44780.o I2CController.o IIRDirectForm1Filter.o LCDproc.o Log.o \ MMDVMHost.o Modem.o ModemPort.o ModemSerialPort.o Mutex.o NetworkInfo.o Nextion.o NullController.o NullDisplay.o NXDNAudio.o \ NXDNControl.o NXDNConvolution.o NXDNCRC.o NXDNFACCH1.o NXDNIcomNetwork.o NXDNKenwoodNetwork.o NXDNLayer3.o NXDNLICH.o NXDNLookup.o NXDNNetwork.o \ NXDNSACCH.o NXDNUDCH.o P25Audio.o P25Control.o P25Data.o P25LowSpeedData.o P25Network.o P25NID.o P25Trellis.o P25Utils.o PseudoTTYController.o \ diff --git a/Makefile.Pi.HD44780 b/Makefile.Pi.HD44780 index f857e52..28cb3fe 100644 --- a/Makefile.Pi.HD44780 +++ b/Makefile.Pi.HD44780 @@ -12,7 +12,7 @@ OBJECTS = \ AMBEFEC.o AX25Control.o AX25Network.o BCH.o BPTC19696.o CASTInfo.o Conf.o CRC.o Display.o DMRControl.o DMRCSBK.o DMRData.o DMRDataHeader.o \ DMRDirectNetwork.o DMREMB.o DMREmbeddedData.o DMRFullLC.o DMRGatewayNetwork.o DMRLookup.o DMRLC.o DMRNetwork.o DMRShortLC.o DMRSlot.o DMRSlotType.o \ DMRAccessControl.o DMRTA.o DMRTrellis.o DStarControl.o DStarHeader.o DStarNetwork.o DStarSlowData.o FMControl.o FMNetwork.o Golay2087.o Golay24128.o \ - Hamming.o HD44780.o I2CController.o IIRDirectForm1Filter.o LCDproc.o Log.o M17Control.o M17Convolution.o M17CRC.o M17LSF.o M17Network.o M17Utils.o \ + Hamming.o HD44780.o I2CController.o IIRDirectForm1Filter.o LCDproc.o Log.o \ MMDVMHost.o Modem.o ModemPort.o ModemSerialPort.o Mutex.o NetworkInfo.o Nextion.o NullController.o NullDisplay.o NXDNAudio.o \ NXDNControl.o NXDNConvolution.o NXDNCRC.o NXDNFACCH1.o NXDNIcomNetwork.o NXDNKenwoodNetwork.o NXDNLayer3.o NXDNLICH.o NXDNLookup.o NXDNNetwork.o \ NXDNSACCH.o NXDNUDCH.o P25Audio.o P25Control.o P25Data.o P25LowSpeedData.o P25Network.o P25NID.o P25Trellis.o P25Utils.o PseudoTTYController.o \ diff --git a/Makefile.Pi.I2C b/Makefile.Pi.I2C index 43e1d43..a50d8c1 100644 --- a/Makefile.Pi.I2C +++ b/Makefile.Pi.I2C @@ -12,7 +12,7 @@ OBJECTS = \ AMBEFEC.o AX25Control.o AX25Network.o BCH.o BPTC19696.o CASTInfo.o Conf.o CRC.o Display.o DMRControl.o DMRCSBK.o DMRData.o DMRDataHeader.o \ DMRDirectNetwork.o DMREMB.o DMREmbeddedData.o DMRFullLC.o DMRGatewayNetwork.o DMRLookup.o DMRLC.o DMRNetwork.o DMRShortLC.o DMRSlot.o DMRSlotType.o \ DMRAccessControl.o DMRTA.o DMRTrellis.o DStarControl.o DStarHeader.o DStarNetwork.o DStarSlowData.o FMControl.o FMNetwork.o Golay2087.o Golay24128.o \ - Hamming.o I2CController.o IIRDirectForm1Filter.o LCDproc.o Log.o M17Control.o M17Convolution.o M17CRC.o M17LSF.o M17Network.o M17Utils.o MMDVMHost.o \ + Hamming.o I2CController.o IIRDirectForm1Filter.o LCDproc.o Log.o MMDVMHost.o \ Modem.o ModemPort.o ModemSerialPort.o Mutex.o NetworkInfo.o Nextion.o NullController.o NullDisplay.o NXDNAudio.o NXDNControl.o \ NXDNConvolution.o NXDNCRC.o NXDNFACCH1.o NXDNIcomNetwork.o NXDNKenwoodNetwork.o NXDNLayer3.o NXDNLICH.o NXDNLookup.o NXDNNetwork.o NXDNSACCH.o \ NXDNUDCH.o P25Audio.o P25Control.o P25Data.o P25LowSpeedData.o P25Network.o P25NID.o P25Trellis.o P25Utils.o PseudoTTYController.o POCSAGControl.o \ diff --git a/Makefile.Pi.OLED b/Makefile.Pi.OLED index ab93d3f..2efb630 100644 --- a/Makefile.Pi.OLED +++ b/Makefile.Pi.OLED @@ -16,7 +16,7 @@ OBJECTS = \ AMBEFEC.o AX25Control.o AX25Network.o BCH.o BPTC19696.o CASTInfo.o Conf.o CRC.o Display.o DMRControl.o DMRCSBK.o DMRData.o DMRDataHeader.o \ DMRDirectNetwork.o DMREMB.o DMREmbeddedData.o DMRFullLC.o DMRGatewayNetwork.o DMRLookup.o DMRLC.o DMRNetwork.o DMRShortLC.o DMRSlot.o DMRSlotType.o \ DMRAccessControl.o DMRTA.o DMRTrellis.o DStarControl.o DStarHeader.o DStarNetwork.o DStarSlowData.o FMControl.o FMNetwork.o Golay2087.o Golay24128.o \ - Hamming.o I2CController.o IIRDirectForm1Filter.o LCDproc.o Log.o M17Control.o M17Convolution.o M17CRC.o M17LSF.o M17Network.o M17Utils.o MMDVMHost.o \ + Hamming.o I2CController.o IIRDirectForm1Filter.o LCDproc.o Log.o MMDVMHost.o \ Modem.o ModemPort.o ModemSerialPort.o Mutex.o NetworkInfo.o Nextion.o NullController.o NullDisplay.o NXDNAudio.o NXDNControl.o \ NXDNConvolution.o NXDNCRC.o NXDNFACCH1.o NXDNIcomNetwork.o NXDNKenwoodNetwork.o NXDNLayer3.o NXDNLICH.o NXDNLookup.o NXDNNetwork.o NXDNSACCH.o \ NXDNUDCH.o OLED.o P25Audio.o P25Control.o P25Data.o P25LowSpeedData.o P25Network.o P25NID.o P25Trellis.o P25Utils.o PseudoTTYController.o \ diff --git a/Makefile.Pi.PCF8574 b/Makefile.Pi.PCF8574 index 6e478ff..7f060d9 100644 --- a/Makefile.Pi.PCF8574 +++ b/Makefile.Pi.PCF8574 @@ -13,7 +13,7 @@ OBJECTS = \ AMBEFEC.o AX25Control.o AX25Network.o BCH.o BPTC19696.o CASTInfo.o Conf.o CRC.o Display.o DMRControl.o DMRCSBK.o DMRData.o DMRDataHeader.o \ DMRDirectNetwork.o DMREMB.o DMREmbeddedData.o DMRFullLC.o DMRGatewayNetwork.o DMRLookup.o DMRLC.o DMRNetwork.o DMRShortLC.o DMRSlot.o DMRSlotType.o \ DMRAccessControl.o DMRTA.o DMRTrellis.o DStarControl.o DStarHeader.o DStarNetwork.o DStarSlowData.o FMControl.o FMNetwork.o Golay2087.o Golay24128.o \ - Hamming.o HD44780.o I2CController.o IIRDirectForm1Filter.o LCDproc.o Log.o M17Control.o M17Convolution.o M17CRC.o M17LSF.o M17Network.o M17Utils.o \ + Hamming.o HD44780.o I2CController.o IIRDirectForm1Filter.o LCDproc.o Log.o \ MMDVMHost.o Modem.o ModemPort.o ModemSerialPort.o Mutex.o NetworkInfo.o Nextion.o NullController.o NullDisplay.o NXDNAudio.o \ NXDNControl.o NXDNConvolution.o NXDNCRC.o NXDNFACCH1.o NXDNIcomNetwork.o NXDNKenwoodNetwork.o NXDNLayer3.o NXDNLICH.o NXDNLookup.o NXDNNetwork.o \ NXDNSACCH.o NXDNUDCH.o P25Audio.o P25Control.o P25Data.o P25LowSpeedData.o P25Network.o P25NID.o P25Trellis.o P25Utils.o PseudoTTYController.o \ diff --git a/Modem.cpp b/Modem.cpp index 9269e20..fe32382 100644 --- a/Modem.cpp +++ b/Modem.cpp @@ -23,7 +23,6 @@ #include "NXDNDefines.h" #include "AX25Defines.h" #include "POCSAGDefines.h" -#include "M17Defines.h" #include "Thread.h" #include "Modem.h" #include "Utils.h" @@ -74,12 +73,6 @@ const unsigned char MMDVM_P25_LOST = 0x32U; const unsigned char MMDVM_NXDN_DATA = 0x40U; const unsigned char MMDVM_NXDN_LOST = 0x41U; -const unsigned char MMDVM_M17_LINK_SETUP = 0x45U; -const unsigned char MMDVM_M17_STREAM = 0x46U; -const unsigned char MMDVM_M17_PACKET = 0x47U; -const unsigned char MMDVM_M17_LOST = 0x48U; -const unsigned char MMDVM_M17_EOT = 0x49U; - const unsigned char MMDVM_POCSAG_DATA = 0x50U; const unsigned char MMDVM_AX25_DATA = 0x55U; @@ -116,7 +109,6 @@ const unsigned char CAP1_DMR = 0x02U; const unsigned char CAP1_YSF = 0x04U; const unsigned char CAP1_P25 = 0x08U; const unsigned char CAP1_NXDN = 0x10U; -const unsigned char CAP1_M17 = 0x20U; const unsigned char CAP1_FM = 0x40U; const unsigned char CAP2_POCSAG = 0x01U; const unsigned char CAP2_AX25 = 0x02U; @@ -129,7 +121,6 @@ m_ysfLoDev(false), m_ysfTXHang(4U), m_p25TXHang(5U), m_nxdnTXHang(5U), -m_m17TXHang(5U), m_duplex(duplex), m_rxInvert(rxInvert), m_txInvert(txInvert), @@ -143,7 +134,6 @@ m_dmrTXLevel(0.0F), m_ysfTXLevel(0.0F), m_p25TXLevel(0.0F), m_nxdnTXLevel(0.0F), -m_m17TXLevel(0.0F), m_pocsagTXLevel(0.0F), m_fmTXLevel(0.0F), m_ax25TXLevel(0.0F), @@ -159,7 +149,6 @@ m_dmrEnabled(false), m_ysfEnabled(false), m_p25Enabled(false), m_nxdnEnabled(false), -m_m17Enabled(false), m_pocsagEnabled(false), m_fmEnabled(false), m_ax25Enabled(false), @@ -183,8 +172,6 @@ m_rxP25Data(1000U, "Modem RX P25"), m_txP25Data(1000U, "Modem TX P25"), m_rxNXDNData(1000U, "Modem RX NXDN"), m_txNXDNData(1000U, "Modem TX NXDN"), -m_rxM17Data(1000U, "Modem RX M17"), -m_txM17Data(1000U, "Modem TX M17"), m_txPOCSAGData(1000U, "Modem TX POCSAG"), m_rxFMData(5000U, "Modem RX FM"), m_txFMData(5000U, "Modem TX FM"), @@ -204,7 +191,6 @@ m_dmrSpace2(0U), m_ysfSpace(0U), m_p25Space(0U), m_nxdnSpace(0U), -m_m17Space(0U), m_pocsagSpace(0U), m_fmSpace(0U), m_ax25Space(0U), @@ -282,20 +268,19 @@ void CModem::setRFParams(unsigned int rxFrequency, int rxOffset, unsigned int tx m_pocsagFrequency = pocsagFrequency + txOffset; } -void CModem::setModeParams(bool dstarEnabled, bool dmrEnabled, bool ysfEnabled, bool p25Enabled, bool nxdnEnabled, bool m17Enabled, bool pocsagEnabled, bool fmEnabled, bool ax25Enabled) +void CModem::setModeParams(bool dstarEnabled, bool dmrEnabled, bool ysfEnabled, bool p25Enabled, bool nxdnEnabled, bool pocsagEnabled, bool fmEnabled, bool ax25Enabled) { m_dstarEnabled = dstarEnabled; m_dmrEnabled = dmrEnabled; m_ysfEnabled = ysfEnabled; m_p25Enabled = p25Enabled; m_nxdnEnabled = nxdnEnabled; - m_m17Enabled = m17Enabled; m_pocsagEnabled = pocsagEnabled; m_fmEnabled = fmEnabled; m_ax25Enabled = ax25Enabled; } -void CModem::setLevels(float rxLevel, float cwIdTXLevel, float dstarTXLevel, float dmrTXLevel, float ysfTXLevel, float p25TXLevel, float nxdnTXLevel, float m17TXLevel, float pocsagTXLevel, float fmTXLevel, float ax25TXLevel) +void CModem::setLevels(float rxLevel, float cwIdTXLevel, float dstarTXLevel, float dmrTXLevel, float ysfTXLevel, float p25TXLevel, float nxdnTXLevel, float pocsagTXLevel, float fmTXLevel, float ax25TXLevel) { m_rxLevel = rxLevel; m_cwIdTXLevel = cwIdTXLevel; @@ -304,7 +289,6 @@ void CModem::setLevels(float rxLevel, float cwIdTXLevel, float dstarTXLevel, flo m_ysfTXLevel = ysfTXLevel; m_p25TXLevel = p25TXLevel; m_nxdnTXLevel = nxdnTXLevel; - m_m17TXLevel = m17TXLevel; m_pocsagTXLevel = pocsagTXLevel; m_fmTXLevel = fmTXLevel; m_ax25TXLevel = ax25TXLevel; @@ -333,11 +317,6 @@ void CModem::setNXDNParams(unsigned int txHang) m_nxdnTXHang = txHang; } -void CModem::setM17Params(unsigned int txHang) -{ - m_m17TXHang = txHang; -} - void CModem::setAX25Params(int rxTwist, unsigned int txDelay, unsigned int slotTime, unsigned int pPersist) { m_ax25RXTwist = rxTwist; @@ -664,58 +643,6 @@ void CModem::clock(unsigned int ms) } break; - case MMDVM_M17_LINK_SETUP: { - if (m_trace) - CUtils::dump(1U, "RX M17 Link Setup", m_buffer, m_length); - - unsigned char data = m_length - 2U; - m_rxM17Data.addData(&data, 1U); - - data = TAG_HEADER; - m_rxM17Data.addData(&data, 1U); - - m_rxM17Data.addData(m_buffer + 3U, m_length - 3U); - } - break; - - case MMDVM_M17_STREAM: { - if (m_trace) - CUtils::dump(1U, "RX M17 Stream Data", m_buffer, m_length); - - unsigned char data = m_length - 2U; - m_rxM17Data.addData(&data, 1U); - - data = TAG_DATA; - m_rxM17Data.addData(&data, 1U); - - m_rxM17Data.addData(m_buffer + 3U, m_length - 3U); - } - break; - - case MMDVM_M17_EOT: { - if (m_trace) - CUtils::dump(1U, "RX M17 EOT", m_buffer, m_length); - - unsigned char data = 1U; - m_rxM17Data.addData(&data, 1U); - - data = TAG_EOT; - m_rxM17Data.addData(&data, 1U); - } - break; - - case MMDVM_M17_LOST: { - if (m_trace) - CUtils::dump(1U, "RX M17 Lost", m_buffer, m_length); - - unsigned char data = 1U; - m_rxM17Data.addData(&data, 1U); - - data = TAG_LOST; - m_rxM17Data.addData(&data, 1U); - } - break; - case MMDVM_FM_DATA: { if (m_trace) CUtils::dump(1U, "RX FM Data", m_buffer, m_length); @@ -795,7 +722,6 @@ void CModem::clock(unsigned int ms) m_p25Space = 0U; m_nxdnSpace = 0U; - m_m17Space = 0U; m_pocsagSpace = 0U; m_fmSpace = 0U; m_ax25Space = 0U; @@ -812,8 +738,6 @@ void CModem::clock(unsigned int ms) m_nxdnSpace = m_buffer[m_offset + 8U]; if (m_length > (m_offset + 9U)) m_pocsagSpace = m_buffer[m_offset + 9U]; - if (m_length > (m_offset + 10U)) - m_m17Space = m_buffer[m_offset + 10U]; } break; @@ -842,7 +766,6 @@ void CModem::clock(unsigned int ms) m_ysfSpace = m_buffer[m_offset + 6U]; m_p25Space = m_buffer[m_offset + 7U]; m_nxdnSpace = m_buffer[m_offset + 8U]; - m_m17Space = m_buffer[m_offset + 9U]; m_fmSpace = m_buffer[m_offset + 10U]; m_pocsagSpace = m_buffer[m_offset + 11U]; m_ax25Space = m_buffer[m_offset + 12U]; @@ -856,7 +779,6 @@ void CModem::clock(unsigned int ms) m_ysfSpace = 0U; m_p25Space = 0U; m_nxdnSpace = 0U; - m_m17Space = 0U; m_pocsagSpace = 0U; m_fmSpace = 0U; m_ax25Space = 0U; @@ -864,7 +786,7 @@ void CModem::clock(unsigned int ms) } m_inactivityTimer.start(); - // LogMessage("status=%02X, tx=%d, space=%u,%u,%u,%u,%u,%u,%u,%u,%u,%u lockout=%d, cd=%d", m_buffer[m_offset + 2U], int(m_tx), m_dstarSpace, m_dmrSpace1, m_dmrSpace2, m_ysfSpace, m_p25Space, m_nxdnSpace, m_m17Space, m_pocsagSpace, m_fmSpace, m_ax25Space, int(m_lockout), int(m_cd)); + // LogMessage("status=%02X, tx=%d, space=%u,%u,%u,%u,%u,%u,%u,%u,%u lockout=%d, cd=%d", m_buffer[m_offset + 2U], int(m_tx), m_dstarSpace, m_dmrSpace1, m_dmrSpace2, m_ysfSpace, m_p25Space, m_nxdnSpace, m_pocsagSpace, m_fmSpace, m_ax25Space, int(m_lockout), int(m_cd)); break; case MMDVM_TRANSPARENT: { @@ -1042,34 +964,6 @@ void CModem::clock(unsigned int ms) m_nxdnSpace--; } - if (m_m17Space > 1U && !m_txM17Data.isEmpty()) { - unsigned char len = 0U; - m_txM17Data.getData(&len, 1U); - m_txM17Data.getData(m_buffer, len); - - if (m_trace) { - switch (m_buffer[2U]) { - case MMDVM_M17_LINK_SETUP: - CUtils::dump(1U, "TX M17 Link Setup", m_buffer, len); - break; - case MMDVM_M17_STREAM: - CUtils::dump(1U, "TX M17 Stream Data", m_buffer, len); - break; - case MMDVM_M17_EOT: - CUtils::dump(1U, "TX M17 EOT", m_buffer, len); - break; - } - } - - int ret = m_port->write(m_buffer, len); - if (ret != int(len)) - LogWarning("Error when writing M17 data to the MMDVM"); - - m_playoutTimer.start(); - - m_m17Space--; - } - if (m_pocsagSpace > 1U && !m_txPOCSAGData.isEmpty()) { unsigned char len = 0U; m_txPOCSAGData.getData(&len, 1U); @@ -1245,20 +1139,6 @@ unsigned int CModem::readNXDNData(unsigned char* data) return len; } -unsigned int CModem::readM17Data(unsigned char* data) -{ - assert(data != nullptr); - - if (m_rxM17Data.isEmpty()) - return 0U; - - unsigned char len = 0U; - m_rxM17Data.getData(&len, 1U); - m_rxM17Data.getData(data, len); - - return len; -} - unsigned int CModem::readFMData(unsigned char* data) { assert(data != nullptr); @@ -1506,47 +1386,6 @@ bool CModem::writeNXDNData(const unsigned char* data, unsigned int length) return true; } -bool CModem::hasM17Space() const -{ - unsigned int space = m_txM17Data.freeSpace() / (M17_FRAME_LENGTH_BYTES + 4U); - - return space > 1U; -} - -bool CModem::writeM17Data(const unsigned char* data, unsigned int length) -{ - assert(data != nullptr); - assert(length > 0U); - - unsigned char buffer[130U]; - - buffer[0U] = MMDVM_FRAME_START; - buffer[1U] = length + 2U; - - switch (data[0U]) { - case TAG_HEADER: - buffer[2U] = MMDVM_M17_LINK_SETUP; - ::memcpy(buffer + 3U, data + 1U, length - 1U); - break; - case TAG_DATA: - buffer[2U] = MMDVM_M17_STREAM; - ::memcpy(buffer + 3U, data + 1U, length - 1U); - break; - case TAG_EOT: - buffer[2U] = MMDVM_M17_EOT; - ::memcpy(buffer + 3U, data + 1U, length - 1U); - break; - default: - return false; - } - - unsigned char len = length + 2U; - m_txM17Data.addData(&len, 1U); - m_txM17Data.addData(buffer, len); - - return true; -} - bool CModem::hasPOCSAGSpace() const { unsigned int space = m_txPOCSAGData.freeSpace() / (POCSAG_FRAME_LENGTH_BYTES + 4U); @@ -1811,30 +1650,6 @@ bool CModem::writeNXDNInfo(const char* source, bool group, unsigned int dest, co return m_port->write(buffer, 31U) != 31; } -bool CModem::writeM17Info(const char* source, const char* dest, const char* type) -{ - assert(m_port != nullptr); - assert(source != nullptr); - assert(dest != nullptr); - assert(type != nullptr); - - unsigned char buffer[40U]; - - buffer[0U] = MMDVM_FRAME_START; - buffer[1U] = 31U; - buffer[2U] = MMDVM_QSO_INFO; - - buffer[3U] = MODE_M17; - - ::sprintf((char*)(buffer + 4U), "%9.9s", source); - - ::sprintf((char*)(buffer + 13U), "%9.9s", dest); - - ::memcpy(buffer + 22U, type, 1U); - - return m_port->write(buffer, 23U) != 23; -} - bool CModem::writePOCSAGInfo(unsigned int ric, const std::string& message) { assert(m_port != nullptr); @@ -1945,11 +1760,6 @@ bool CModem::hasNXDN() const return (m_capabilities1 & CAP1_NXDN) == CAP1_NXDN; } -bool CModem::hasM17() const -{ - return (m_capabilities1 & CAP1_M17) == CAP1_M17; -} - bool CModem::hasFM() const { return (m_capabilities1 & CAP1_FM) == CAP1_FM; @@ -2027,7 +1837,7 @@ bool CModem::readVersion() switch (m_protocolVersion) { case 1U: LogInfo("MMDVM protocol version: 1, description: %.*s", m_length - 4U, m_buffer + 4U); - m_capabilities1 = CAP1_DSTAR | CAP1_DMR | CAP1_YSF | CAP1_P25 | CAP1_NXDN | CAP1_M17; + m_capabilities1 = CAP1_DSTAR | CAP1_DMR | CAP1_YSF | CAP1_P25 | CAP1_NXDN; m_capabilities2 = CAP2_POCSAG; return true; @@ -2061,8 +1871,6 @@ bool CModem::readVersion() ::strcat(modeText, " P25"); if (hasNXDN()) ::strcat(modeText, " NXDN"); - if (hasM17()) - ::strcat(modeText, " M17"); if (hasFM()) ::strcat(modeText, " FM"); if (hasPOCSAG()) @@ -2157,8 +1965,6 @@ bool CModem::setConfig1() buffer[4U] |= 0x10U; if (m_pocsagEnabled) buffer[4U] |= 0x20U; - if (m_m17Enabled) - buffer[4U] |= 0x40U; buffer[5U] = m_txDelay / 10U; // In 10ms units @@ -2194,9 +2000,9 @@ bool CModem::setConfig1() buffer[23U] = (unsigned char)m_nxdnTXHang; - buffer[24U] = (unsigned char)(m_m17TXLevel * 2.55F + 0.5F); + buffer[24U] = 0x00U; - buffer[25U] = (unsigned char)m_m17TXHang; + buffer[25U] = 0x00U; // CUtils::dump(1U, "Written", buffer, 26U); @@ -2272,8 +2078,6 @@ bool CModem::setConfig2() buffer[4U] |= 0x10U; if (m_fmEnabled) buffer[4U] |= 0x20U; - if (m_m17Enabled) - buffer[4U] |= 0x40U; buffer[5U] = 0x00U; if (m_pocsagEnabled) @@ -2296,7 +2100,7 @@ bool CModem::setConfig2() buffer[14U] = (unsigned char)(m_ysfTXLevel * 2.55F + 0.5F); buffer[15U] = (unsigned char)(m_p25TXLevel * 2.55F + 0.5F); buffer[16U] = (unsigned char)(m_nxdnTXLevel * 2.55F + 0.5F); - buffer[17U] = (unsigned char)(m_m17TXLevel * 2.55F + 0.5F); + buffer[17U] = 0x00U; buffer[18U] = (unsigned char)(m_pocsagTXLevel * 2.55F + 0.5F); buffer[19U] = (unsigned char)(m_fmTXLevel * 2.55F + 0.5F); buffer[20U] = (unsigned char)(m_ax25TXLevel * 2.55F + 0.5F); @@ -2306,7 +2110,7 @@ bool CModem::setConfig2() buffer[23U] = (unsigned char)m_ysfTXHang; buffer[24U] = (unsigned char)m_p25TXHang; buffer[25U] = (unsigned char)m_nxdnTXHang; - buffer[26U] = (unsigned char)m_m17TXHang; + buffer[26U] = 0x00U; buffer[27U] = 0x00U; buffer[28U] = 0x00U; diff --git a/Modem.h b/Modem.h index 45809cc..082ccf9 100644 --- a/Modem.h +++ b/Modem.h @@ -47,13 +47,12 @@ public: void setPort(IModemPort* port); void setRFParams(unsigned int rxFrequency, int rxOffset, unsigned int txFrequency, int txOffset, int txDCOffset, int rxDCOffset, float rfLevel, unsigned int pocsagFrequency); - void setModeParams(bool dstarEnabled, bool dmrEnabled, bool ysfEnabled, bool p25Enabled, bool nxdnEnabled, bool m17Enabled, bool pocsagEnabled, bool fmEnabled, bool ax25Enabled); - void setLevels(float rxLevel, float cwIdTXLevel, float dstarTXLevel, float dmrTXLevel, float ysfTXLevel, float p25TXLevel, float nxdnTXLevel, float m17TXLevel, float pocsagLevel, float fmTXLevel, float ax25TXLevel); + void setModeParams(bool dstarEnabled, bool dmrEnabled, bool ysfEnabled, bool p25Enabled, bool nxdnEnabled, bool pocsagEnabled, bool fmEnabled, bool ax25Enabled); + void setLevels(float rxLevel, float cwIdTXLevel, float dstarTXLevel, float dmrTXLevel, float ysfTXLevel, float p25TXLevel, float nxdnTXLevel, float pocsagLevel, float fmTXLevel, float ax25TXLevel); void setDMRParams(unsigned int colorCode); void setYSFParams(bool loDev, unsigned int txHang); void setP25Params(unsigned int txHang); void setNXDNParams(unsigned int txHang); - void setM17Params(unsigned int txHang); void setAX25Params(int rxTwist, unsigned int txDelay, unsigned int slotTime, unsigned int pPersist); void setTransparentDataParams(unsigned int sendFrameType); @@ -69,7 +68,6 @@ public: bool hasYSF() const; bool hasP25() const; bool hasNXDN() const; - bool hasM17() const; bool hasPOCSAG() const; bool hasFM() const; bool hasAX25() const; @@ -82,7 +80,6 @@ public: unsigned int readYSFData(unsigned char* data); unsigned int readP25Data(unsigned char* data); unsigned int readNXDNData(unsigned char* data); - unsigned int readM17Data(unsigned char* data); unsigned int readFMData(unsigned char* data); unsigned int readAX25Data(unsigned char* data); @@ -92,7 +89,6 @@ public: bool hasYSFSpace() const; bool hasP25Space() const; bool hasNXDNSpace() const; - bool hasM17Space() const; bool hasPOCSAGSpace() const; unsigned int getFMSpace() const; bool hasAX25Space() const; @@ -110,7 +106,6 @@ public: bool writeYSFData(const unsigned char* data, unsigned int length); bool writeP25Data(const unsigned char* data, unsigned int length); bool writeNXDNData(const unsigned char* data, unsigned int length); - bool writeM17Data(const unsigned char* data, unsigned int length); bool writePOCSAGData(const unsigned char* data, unsigned int length); bool writeFMData(const unsigned char* data, unsigned int length); bool writeAX25Data(const unsigned char* data, unsigned int length); @@ -120,7 +115,6 @@ public: bool writeYSFInfo(const char* source, const char* dest, unsigned char dgid, const char* type, const char* origin); bool writeP25Info(const char* source, bool group, unsigned int dest, const char* type); bool writeNXDNInfo(const char* source, bool group, unsigned int dest, const char* type); - bool writeM17Info(const char* source, const char* dest, const char* type); bool writePOCSAGInfo(unsigned int ric, const std::string& message); bool writeIPInfo(const std::string& address); @@ -152,7 +146,6 @@ private: unsigned int m_ysfTXHang; unsigned int m_p25TXHang; unsigned int m_nxdnTXHang; - unsigned int m_m17TXHang; bool m_duplex; bool m_rxInvert; bool m_txInvert; @@ -166,7 +159,6 @@ private: float m_ysfTXLevel; float m_p25TXLevel; float m_nxdnTXLevel; - float m_m17TXLevel; float m_pocsagTXLevel; float m_fmTXLevel; float m_ax25TXLevel; @@ -182,7 +174,6 @@ private: bool m_ysfEnabled; bool m_p25Enabled; bool m_nxdnEnabled; - bool m_m17Enabled; bool m_pocsagEnabled; bool m_fmEnabled; bool m_ax25Enabled; @@ -206,8 +197,6 @@ private: CRingBuffer m_txP25Data; CRingBuffer m_rxNXDNData; CRingBuffer m_txNXDNData; - CRingBuffer m_rxM17Data; - CRingBuffer m_txM17Data; CRingBuffer m_txPOCSAGData; CRingBuffer m_rxFMData; CRingBuffer m_txFMData; @@ -227,7 +216,6 @@ private: unsigned int m_ysfSpace; unsigned int m_p25Space; unsigned int m_nxdnSpace; - unsigned int m_m17Space; unsigned int m_pocsagSpace; unsigned int m_fmSpace; unsigned int m_ax25Space; diff --git a/Nextion.cpp b/Nextion.cpp index adfe8e2..f2ce9fb 100644 --- a/Nextion.cpp +++ b/Nextion.cpp @@ -36,8 +36,6 @@ const unsigned int P25_RSSI_COUNT = 7U; // 7 * 180ms = 1260ms const unsigned int P25_BER_COUNT = 7U; // 7 * 180ms = 1260ms const unsigned int NXDN_RSSI_COUNT = 28U; // 28 * 40ms = 1120ms const unsigned int NXDN_BER_COUNT = 28U; // 28 * 40ms = 1120ms -const unsigned int M17_RSSI_COUNT = 28U; // 28 * 40ms = 1120ms -const unsigned int M17_BER_COUNT = 28U; // 28 * 40ms = 1120ms #define LAYOUT_COMPAT_MASK (7 << 0) // compatibility for old setting #define LAYOUT_TA_ENABLE (1 << 4) // enable Talker Alias (TA) display @@ -882,79 +880,6 @@ void CNextion::clearNXDNInt() sendCommand("t3.txt=\"\""); } -void CNextion::writeM17Int(const char* source, const char* dest, const char* type) -{ - assert(source != nullptr); - assert(dest != nullptr); - assert(type != nullptr); - - if (m_mode != MODE_M17) { - sendCommand("page M17"); - sendCommandAction(8U); - } - - char text[30U]; - if (m_brightness > 0U) { - ::sprintf(text, "dim=%u", m_brightness); - sendCommand(text); - } - - ::sprintf(text, "t0.txt=\"%s %.10s\"", type, source); - sendCommand(text); - sendCommandAction(142U); - - ::sprintf(text, "t1.txt=\"%s\"", dest); - sendCommand(text); - sendCommandAction(143U); - - m_clockDisplayTimer.stop(); - - m_mode = MODE_M17; - m_rssiAccum1 = 0U; - m_berAccum1 = 0.0F; - m_rssiCount1 = 0U; - m_berCount1 = 0U; -} - -void CNextion::writeM17RSSIInt(unsigned char rssi) -{ - m_rssiAccum1 += rssi; - m_rssiCount1++; - - if (m_rssiCount1 == M17_RSSI_COUNT) { - char text[25U]; - ::sprintf(text, "t2.txt=\"-%udBm\"", m_rssiAccum1 / M17_RSSI_COUNT); - sendCommand(text); - sendCommandAction(144U); - m_rssiAccum1 = 0U; - m_rssiCount1 = 0U; - } -} - -void CNextion::writeM17BERInt(float ber) -{ - m_berAccum1 += ber; - m_berCount1++; - - if (m_berCount1 == M17_BER_COUNT) { - char text[25U]; - ::sprintf(text, "t3.txt=\"%.1f%%\"", m_berAccum1 / float(M17_BER_COUNT)); - sendCommand(text); - sendCommandAction(145U); - m_berAccum1 = 0.0F; - m_berCount1 = 0U; - } -} - -void CNextion::clearM17Int() -{ - sendCommand("t0.txt=\"Listening\""); - sendCommandAction(141U); - sendCommand("t1.txt=\"\""); - sendCommand("t2.txt=\"\""); - sendCommand("t3.txt=\"\""); -} - void CNextion::writePOCSAGInt(uint32_t ric, const std::string& message) { if (m_mode != MODE_POCSAG) { diff --git a/Nextion.h b/Nextion.h index d488c8e..cbdfe22 100644 --- a/Nextion.h +++ b/Nextion.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2016,2017,2018,2020,2023,2024 by Jonathan Naylor G4KLX + * Copyright (C) 2016,2017,2018,2020,2023,2024,2025 by Jonathan Naylor G4KLX * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -71,11 +71,6 @@ protected: virtual void writeNXDNBERInt(float ber); virtual void clearNXDNInt(); - virtual void writeM17Int(const char* source, const char* dest, const char* type); - virtual void writeM17RSSIInt(unsigned char rssi); - virtual void writeM17BERInt(float ber); - virtual void clearM17Int(); - virtual void writePOCSAGInt(uint32_t ric, const std::string& message); virtual void clearPOCSAGInt(); diff --git a/NullDisplay.cpp b/NullDisplay.cpp index 5708028..e2e5473 100644 --- a/NullDisplay.cpp +++ b/NullDisplay.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2016,2018,2020 by Jonathan Naylor G4KLX + * Copyright (C) 2016,2018,2020,2025 by Jonathan Naylor G4KLX * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -134,20 +134,6 @@ void CNullDisplay::clearNXDNInt() #endif } -void CNullDisplay::writeM17Int(const char* source, const char* dest, const char* type) -{ -#if defined(RASPBERRY_PI) - ::digitalWrite(LED_STATUS, 1); -#endif -} - -void CNullDisplay::clearM17Int() -{ -#if defined(RASPBERRY_PI) - ::digitalWrite(LED_STATUS, 0); -#endif -} - void CNullDisplay::writePOCSAGInt(uint32_t ric, const std::string& message) { #if defined(RASPBERRY_PI) diff --git a/NullDisplay.h b/NullDisplay.h index 55e5114..b552175 100644 --- a/NullDisplay.h +++ b/NullDisplay.h @@ -55,9 +55,6 @@ protected: virtual void writeNXDNInt(const char* source, bool group, unsigned int dest, const char* type); virtual void clearNXDNInt(); - virtual void writeM17Int(const char* source, const char* dest, const char* type); - virtual void clearM17Int(); - virtual void writePOCSAGInt(uint32_t ric, const std::string& message); virtual void clearPOCSAGInt(); diff --git a/OLED.cpp b/OLED.cpp index 5731b7c..2348496 100644 --- a/OLED.cpp +++ b/OLED.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2016,2017,2018,2020,2023 by Jonathan Naylor G4KLX + * Copyright (C) 2016,2017,2018,2020,2023,2025 by Jonathan Naylor G4KLX * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -148,27 +148,6 @@ const unsigned char logo_NXDN_bmp[] = 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; -// Logo M17_sm, 128x16px -const unsigned char logo_M17_bmp[] = -{ -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x62, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x67, 0x37, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe7, 0x33, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xef, 0x70, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xee, 0xf0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xf1, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x7f, 0x31, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x77, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x77, 0x37, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x67, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x60, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -}; - // Logo POCASG/DAPNET, 128x16px const unsigned char logo_POCSAG_bmp[] = { @@ -654,40 +633,6 @@ void COLED::clearNXDNInt() m_display.display(); } -void COLED::writeM17Int(const char* source, const char* dest, const char* type) -{ - m_mode = MODE_M17; - - m_display.clearDisplay(); - m_display.fillRect(0, OLED_LINE2, m_display.width(), m_display.height(), BLACK); - - m_display.setCursor(0, OLED_LINE3); - m_display.printf("from: %s %s", type, source); - - m_display.setCursor(0, OLED_LINE4); - m_display.printf("to: %s", dest); - - m_display.setCursor(0, OLED_LINE6); - m_display.printf("%s", m_ipaddress.c_str()); - - OLED_statusbar(); - - m_display.display(); -} - -void COLED::clearM17Int() -{ - m_display.fillRect(0, OLED_LINE2, m_display.width(), m_display.height(), BLACK); - - m_display.setCursor(37, OLED_LINE4); - m_display.print("Standby"); - - m_display.setCursor(0, OLED_LINE6); - m_display.printf("%s", m_ipaddress.c_str()); - - m_display.display(); -} - void COLED::writePOCSAGInt(uint32_t ric, const std::string& message) { int pos; @@ -838,8 +783,6 @@ void COLED::OLED_statusbar() m_display.drawBitmap(0, 0, logo_P25_bmp, 128, 16, WHITE); else if (m_mode == MODE_NXDN) m_display.drawBitmap(0, 0, logo_NXDN_bmp, 128, 16, WHITE); - else if (m_mode == MODE_M17) - m_display.drawBitmap(0, 0, logo_M17_bmp, 128, 16, WHITE); else if (m_mode == MODE_POCSAG) m_display.drawBitmap(0, 0, logo_POCSAG_bmp, 128, 16, WHITE); else if (m_displayLogoScreensaver) @@ -848,4 +791,3 @@ void COLED::OLED_statusbar() if (m_displayScroll) m_display.startscrollleft(0x00, 0x01); } - diff --git a/OLED.h b/OLED.h index cff1dd2..b2616fc 100644 --- a/OLED.h +++ b/OLED.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2016,2017,2018,2020,2023 by Jonathan Naylor G4KLX + * Copyright (C) 2016,2017,2018,2020,2023,2025 by Jonathan Naylor G4KLX * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -76,9 +76,6 @@ protected: virtual int writeNXDNIntEx(const CUserDBentry& source, bool group, unsigned int dest, const char* type); virtual void clearNXDNInt(); - virtual void writeM17Int(const char* source, const char* dest, const char* type); - virtual void clearM17Int(); - virtual void writePOCSAGInt(uint32_t ric, const std::string& message); virtual void clearPOCSAGInt(); diff --git a/README.md b/README.md index 7aca830..2b0b45d 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ These are the source files for building the MMDVMHost, the program that interfaces to the MMDVM or DVMega on the one side, and a suitable network on -the other. It supports D-Star, DMR, P25 Phase 1, NXDN, System Fusion, M17, +the other. It supports D-Star, DMR, P25 Phase 1, NXDN, System Fusion, POCSAG, FM, and AX.25 on the MMDVM, and D-Star, DMR, and System Fusion on the DVMega. On the D-Star side the MMDVMHost interfaces with the ircDDB Gateway, on DMR it @@ -8,8 +8,7 @@ connects to the DMR Gateway to allow for connection to multiple DMR networks, or a single network directly. on System Fusion it connects to the YSF Gateway to allow access to the FCS and YSF networks. On P25 it connects to the P25 Gateway. On NXDN it connects to the NXDN Gateway which provides access to the NXDN and -NXCore talk groups. On M17 it uses the M17 Gateway to access the M17 reflector system. -It uses the DAPNET Gateway to access DAPNET to receive +NXCore talk groups. It uses the DAPNET Gateway to access DAPNET to receive paging messages. Finally it uses the FM Gateway to interface to existing FM networks. diff --git a/RemoteControl.cpp b/RemoteControl.cpp index f7d527d..478375d 100644 --- a/RemoteControl.cpp +++ b/RemoteControl.cpp @@ -102,8 +102,6 @@ REMOTE_COMMAND CRemoteControl::getCommand() m_command = REMOTE_COMMAND::MODE_P25; else if (m_args.at(1U) == "nxdn") m_command = REMOTE_COMMAND::MODE_NXDN; - else if (m_args.at(1U) == "m17") - m_command = REMOTE_COMMAND::MODE_M17; else replyStr = "KO"; } else if (m_args.at(0U) == "enable" && m_args.size() >= ENABLE_ARGS) { @@ -117,8 +115,6 @@ REMOTE_COMMAND CRemoteControl::getCommand() m_command = REMOTE_COMMAND::ENABLE_P25; else if (m_args.at(1U) == "nxdn") m_command = REMOTE_COMMAND::ENABLE_NXDN; - else if (m_args.at(1U) == "m17") - m_command = REMOTE_COMMAND::ENABLE_M17; else if (m_args.at(1U) == "fm") m_command = REMOTE_COMMAND::ENABLE_FM; else if (m_args.at(1U) == "ax25") @@ -136,8 +132,6 @@ REMOTE_COMMAND CRemoteControl::getCommand() m_command = REMOTE_COMMAND::DISABLE_P25; else if (m_args.at(1U) == "nxdn") m_command = REMOTE_COMMAND::DISABLE_NXDN; - else if (m_args.at(1U) == "m17") - m_command = REMOTE_COMMAND::DISABLE_M17; else if (m_args.at(1U) == "fm") m_command = REMOTE_COMMAND::DISABLE_FM; else if (m_args.at(1U) == "ax25") @@ -208,7 +202,6 @@ unsigned int CRemoteControl::getArgCount() const case REMOTE_COMMAND::MODE_YSF: case REMOTE_COMMAND::MODE_P25: case REMOTE_COMMAND::MODE_NXDN: - case REMOTE_COMMAND::MODE_M17: return (unsigned int)m_args.size() - SET_MODE_ARGS; case REMOTE_COMMAND::PAGE: case REMOTE_COMMAND::PAGE_BCD: @@ -232,7 +225,6 @@ std::string CRemoteControl::getArgString(unsigned int n) const case REMOTE_COMMAND::MODE_YSF: case REMOTE_COMMAND::MODE_P25: case REMOTE_COMMAND::MODE_NXDN: - case REMOTE_COMMAND::MODE_M17: n += SET_MODE_ARGS; break; case REMOTE_COMMAND::PAGE: diff --git a/RemoteControl.h b/RemoteControl.h index b5b0bd7..675a58c 100644 --- a/RemoteControl.h +++ b/RemoteControl.h @@ -35,14 +35,12 @@ enum class REMOTE_COMMAND { MODE_YSF, MODE_P25, MODE_NXDN, - MODE_M17, MODE_FM, ENABLE_DSTAR, ENABLE_DMR, ENABLE_YSF, ENABLE_P25, ENABLE_NXDN, - ENABLE_M17, ENABLE_FM, ENABLE_AX25, DISABLE_DSTAR, @@ -50,7 +48,6 @@ enum class REMOTE_COMMAND { DISABLE_YSF, DISABLE_P25, DISABLE_NXDN, - DISABLE_M17, DISABLE_FM, DISABLE_AX25, PAGE, diff --git a/Sync.cpp b/Sync.cpp index bb0f338..70abf36 100644 --- a/Sync.cpp +++ b/Sync.cpp @@ -23,7 +23,6 @@ #include "YSFDefines.h" #include "P25Defines.h" #include "NXDNDefines.h" -#include "M17Defines.h" #include #include @@ -84,25 +83,3 @@ void CSync::addNXDNSync(unsigned char* data) for (unsigned int i = 0U; i < NXDN_FSW_BYTES_LENGTH; i++) data[i] = (data[i] & ~NXDN_FSW_BYTES_MASK[i]) | NXDN_FSW_BYTES[i]; } - -void CSync::addM17LinkSetupSync(unsigned char* data) -{ - assert(data != nullptr); - - ::memcpy(data, M17_LINK_SETUP_SYNC_BYTES, M17_SYNC_LENGTH_BYTES); -} - -void CSync::addM17StreamSync(unsigned char* data) -{ - assert(data != nullptr); - - ::memcpy(data, M17_STREAM_SYNC_BYTES, M17_SYNC_LENGTH_BYTES); -} - -void CSync::addM17EOTSync(unsigned char* data) -{ - assert(data != nullptr); - - ::memcpy(data, M17_EOT_SYNC_BYTES, M17_SYNC_LENGTH_BYTES); -} - diff --git a/Sync.h b/Sync.h index 7f75711..131f88a 100644 --- a/Sync.h +++ b/Sync.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2015,2016,2018,2020,2021 by Jonathan Naylor G4KLX + * Copyright (C) 2015,2016,2018,2020,2021,2025 by Jonathan Naylor G4KLX * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -33,10 +33,6 @@ public: static void addNXDNSync(unsigned char* data); - static void addM17LinkSetupSync(unsigned char* data); - static void addM17StreamSync(unsigned char* data); - static void addM17EOTSync(unsigned char* data); - private: }; diff --git a/TFTSurenoo.cpp b/TFTSurenoo.cpp index 7233c94..15353da 100644 --- a/TFTSurenoo.cpp +++ b/TFTSurenoo.cpp @@ -101,7 +101,6 @@ static const struct layoutdef Layout[] = { #define STR_DSTAR "D-STAR" #define STR_MMDVM "MMDVM" #define STR_NXDN "NXDN" -#define STR_M17 "M17" #define STR_P25 "P25" #define STR_YSF "SystemFusion" @@ -375,29 +374,6 @@ void CTFTSurenoo::clearNXDNInt() clearDStarInt(); } -void CTFTSurenoo::writeM17Int(const char* source, const char* dest, const char* type) -{ - assert(source != nullptr); - assert(dest != nullptr); - assert(type != nullptr); - - if (m_mode != MODE_M17) - setModeLine(STR_M17); - - ::snprintf(m_temp, sizeof(m_temp), "%s %s", type, source); - setStatusLine(statusLineNo(0), m_temp); - - ::snprintf(m_temp, sizeof(m_temp), "%s", dest); - setStatusLine(statusLineNo(1), m_temp); - - m_mode = MODE_M17; -} - -void CTFTSurenoo::clearM17Int() -{ - clearDStarInt(); -} - void CTFTSurenoo::writePOCSAGInt(uint32_t ric, const std::string& message) { setStatusLine(statusLineNo(1), "POCSAG TX"); diff --git a/TFTSurenoo.h b/TFTSurenoo.h index 23e3d0f..41941d2 100644 --- a/TFTSurenoo.h +++ b/TFTSurenoo.h @@ -1,6 +1,6 @@ /* * Copyright (C) 2019 by SASANO Takayoshi JG1UAA - * Copyright (C) 2015,2016,2018,2020 by Jonathan Naylor G4KLX + * Copyright (C) 2015,2016,2018,2020,2025 by Jonathan Naylor G4KLX * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -61,9 +61,6 @@ protected: virtual int writeNXDNIntEx(const CUserDBentry& source, bool group, unsigned int dest, const char* type); virtual void clearNXDNInt(); - virtual void writeM17Int(const char* source, const char* dest, const char* type); - virtual void clearM17Int(); - virtual void writePOCSAGInt(uint32_t ric, const std::string& message); virtual void clearPOCSAGInt(); diff --git a/Version.h b/Version.h index adfcc95..d589832 100644 --- a/Version.h +++ b/Version.h @@ -19,6 +19,6 @@ #if !defined(VERSION_H) #define VERSION_H -const char* VERSION = "20250607"; +const char* VERSION = "20250709"; #endif From cf97dc3096bb99986d69df464f2ec5e1aee84403 Mon Sep 17 00:00:00 2001 From: Jonathan Naylor Date: Tue, 26 Aug 2025 15:14:00 +0100 Subject: [PATCH 08/11] Remove AX.25 --- AX25Control.cpp | 252 -------------------------------------- AX25Control.h | 50 -------- AX25Defines.h | 39 ------ AX25Network.cpp | 183 --------------------------- AX25Network.h | 62 ---------- Conf.cpp | 100 +-------------- Conf.h | 28 ----- MMDVM.ini | 15 --- MMDVMHost.cpp | 157 ++---------------------- MMDVMHost.h | 8 +- MMDVMHost.vcxproj | 5 - MMDVMHost.vcxproj.filters | 15 --- Makefile | 2 +- Makefile.Pi.Adafruit | 2 +- Makefile.Pi.HD44780 | 2 +- Makefile.Pi.I2C | 2 +- Makefile.Pi.OLED | 2 +- Makefile.Pi.PCF8574 | 2 +- Modem.cpp | 127 ++----------------- Modem.h | 18 +-- RemoteControl.cpp | 4 - RemoteControl.h | 2 - Version.h | 2 +- 23 files changed, 27 insertions(+), 1052 deletions(-) delete mode 100644 AX25Control.cpp delete mode 100644 AX25Control.h delete mode 100644 AX25Defines.h delete mode 100644 AX25Network.cpp delete mode 100644 AX25Network.h diff --git a/AX25Control.cpp b/AX25Control.cpp deleted file mode 100644 index bcb5587..0000000 --- a/AX25Control.cpp +++ /dev/null @@ -1,252 +0,0 @@ -/* - * Copyright (C) 2020,2025 Jonathan Naylor, G4KLX - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "AX25Control.h" -#include "AX25Defines.h" -#include "Utils.h" -#include "Log.h" - -#include -#include -#include -#include - -// #define DUMP_AX25 - -const unsigned char BIT_MASK_TABLE[] = { 0x80U, 0x40U, 0x20U, 0x10U, 0x08U, 0x04U, 0x02U, 0x01U }; - -#define WRITE_BIT1(p,i,b) p[(i)>>3] = (b) ? (p[(i)>>3] | BIT_MASK_TABLE[(i)&7]) : (p[(i)>>3] & ~BIT_MASK_TABLE[(i)&7]) -#define READ_BIT1(p,i) (p[(i)>>3] & BIT_MASK_TABLE[(i)&7]) - -CAX25Control::CAX25Control(CAX25Network* network, bool trace) : -m_network(network), -m_trace(trace), -m_enabled(true), -m_fp(nullptr) -{ -} - -CAX25Control::~CAX25Control() -{ -} - -bool CAX25Control::writeModem(unsigned char *data, unsigned int len) -{ - assert(data != nullptr); - - if (!m_enabled) - return false; - - if (m_trace) - decode(data, len); - - CUtils::dump(1U, "AX.25 received packet", data, len); - - if (m_network == nullptr) - return true; - - return m_network->write(data, len); -} - -unsigned int CAX25Control::readModem(unsigned char* data) -{ - assert(data != nullptr); - - if (m_network == nullptr) - return 0U; - - if (!m_enabled) - return 0U; - - unsigned int length = m_network->read(data, 500U); - - if (length > 0U) - CUtils::dump(1U, "AX.25 transmitted packet", data, length); - - return length; -} - -bool CAX25Control::openFile() -{ - if (m_fp != nullptr) - return true; - - time_t t; - ::time(&t); - - struct tm* tm = ::localtime(&t); - - char name[100U]; - ::sprintf(name, "AX25_%04d%02d%02d_%02d%02d%02d.ambe", tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec); - - m_fp = ::fopen(name, "wb"); - if (m_fp == nullptr) - return false; - - ::fwrite("AX25", 1U, 4U, m_fp); - - return true; -} - -bool CAX25Control::writeFile(const unsigned char* data, unsigned int length) -{ - if (m_fp == nullptr) - return false; - - ::fwrite(&length, 1U, sizeof(unsigned int), m_fp); - ::fwrite(data, 1U, length, m_fp); - - return true; -} - -void CAX25Control::closeFile() -{ - if (m_fp != nullptr) { - ::fclose(m_fp); - m_fp = nullptr; - } -} - -void CAX25Control::enable(bool enabled) -{ - m_enabled = enabled; -} - -void CAX25Control::decode(const unsigned char* data, unsigned int length) -{ - assert(data != nullptr); - assert(length >= 15U); - - std::string text; - - bool more = decodeAddress(data + 7U, text); - - text += '>'; - - decodeAddress(data + 0U, text); - - unsigned int n = 14U; - while (more && n < length) { - text += ','; - more = decodeAddress(data + n, text, true); - n += 7U; - } - - text += ' '; - - if ((data[n] & 0x01U) == 0x00U) { - // I frame - char t[20U]; - ::sprintf(t, "", (data[n] >> 1) & 0x07U, (data[n] >> 5) & 0x07U); - text += t; - } else { - if ((data[n] & 0x02U) == 0x00U) { - // S frame - char t[20U]; - switch (data[n] & 0x0FU) { - case 0x01U: - sprintf(t, "", (data[n] >> 5) & 0x07U); - break; - case 0x05U: - sprintf(t, "", (data[n] >> 5) & 0x07U); - break; - case 0x09U: - sprintf(t, "", (data[n] >> 5) & 0x07U); - break; - case 0x0DU: - sprintf(t, "", (data[n] >> 5) & 0x07U); - break; - default: - sprintf(t, "", (data[n] >> 5) & 0x07U); - break; - } - - text += t; - LogMessage("AX.25, %s", text.c_str()); - return; - } else { - // U frame - switch (data[n] & 0xEFU) { - case 0x6FU: - text += ""; - break; - case 0x2FU: - text += ""; - break; - case 0x43U: - text += ""; - break; - case 0x0FU: - text += ""; - break; - case 0x63U: - text += ""; - break; - case 0x87U: - text += ""; - break; - case 0x03U: - text += ""; - break; - case 0xAFU: - text += ""; - break; - case 0xE3U: - text += ""; - break; - default: - text += ""; - break; - } - - if ((data[n] & 0xEFU) != 0x03U) { - LogMessage("AX.25, %s", text.c_str()); - return; - } - } - } - - n += 2U; - - LogMessage("AX.25, %s %.*s", text.c_str(), length - n, data + n); -} - -bool CAX25Control::decodeAddress(const unsigned char* data, std::string& text, bool isDigi) const -{ - assert(data != nullptr); - - for (unsigned int i = 0U; i < 6U; i++) { - char c = data[i] >> 1; - if (c != ' ') - text += c; - } - - unsigned char ssid = (data[6U] >> 1) & 0x0FU; - if (ssid > 0U) { - text += '-'; - if (ssid >= 10U) { - text += '1'; - text += '0' + ssid - 10U; - } - else { - text += '0' + ssid; - } - } - - if (isDigi) { - if ((data[6U] & 0x80U) == 0x80U) - text += '*'; - } - - return (data[6U] & 0x01U) == 0x00U; -} diff --git a/AX25Control.h b/AX25Control.h deleted file mode 100644 index b4fed2a..0000000 --- a/AX25Control.h +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright (C) 2020 by Jonathan Naylor G4KLX - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#if !defined(AX25Control_H) -#define AX25Control_H - -#include "AX25Network.h" - -#include - -class CAX25Control { -public: - CAX25Control(CAX25Network* network, bool trace); - ~CAX25Control(); - - bool writeModem(unsigned char* data, unsigned int len); - - unsigned int readModem(unsigned char* data); - - void enable(bool enabled); - -private: - CAX25Network* m_network; - bool m_trace; - bool m_enabled; - FILE* m_fp; - - void decode(const unsigned char* data, unsigned int length); - bool decodeAddress(const unsigned char* data, std::string& text, bool isDigi = false) const; - bool openFile(); - bool writeFile(const unsigned char* data, unsigned int length); - void closeFile(); -}; - -#endif diff --git a/AX25Defines.h b/AX25Defines.h deleted file mode 100644 index a0f4c80..0000000 --- a/AX25Defines.h +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright (C) 2020 by Jonathan Naylor G4KLX - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#if !defined(AX25Defines_H) -#define AX25Defines_H - -const unsigned int AX25_CALLSIGN_TEXT_LENGTH = 6U; -const unsigned int AX25_SSID_LENGTH = 1U; -const unsigned int AX25_CALLSIGN_LENGTH = 7U; - -const unsigned int AX25_MAX_DIGIPEATERS = 6U; - -const unsigned char AX25_PID_NOL3 = 0xF0U; - -const unsigned int AX25_MAX_FRAME_LENGTH_BYTES = 330U; // Callsign (7) + Callsign (7) + 8 Digipeaters (56) + - // Control (1) + PID (1) + Data (256) + Checksum (2) -const unsigned char AX25_KISS_DATA = 0x00U; - -const unsigned char AX25_FEND = 0xC0U; -const unsigned char AX25_FESC = 0xDBU; -const unsigned char AX25_TFEND = 0xDCU; -const unsigned char AX25_TFESC = 0xDDU; - -#endif diff --git a/AX25Network.cpp b/AX25Network.cpp deleted file mode 100644 index 36c84e5..0000000 --- a/AX25Network.cpp +++ /dev/null @@ -1,183 +0,0 @@ -/* - * Copyright (C) 2020,2025 by Jonathan Naylor G4KLX - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#include "AX25Network.h" -#include "AX25Defines.h" -#include "Defines.h" -#include "Utils.h" -#include "Log.h" - -#include -#include -#include - -const unsigned int BUFFER_LENGTH = 500U; - - -CAX25Network::CAX25Network(const std::string& port, unsigned int speed, bool debug) : -m_serial(port, speed, false), -m_txData(nullptr), -m_rxData(nullptr), -m_rxLength(0U), -m_rxLastChar(0U), -m_debug(debug), -m_enabled(false) -{ - assert(!port.empty()); - assert(speed > 0U); - - m_txData = new unsigned char[BUFFER_LENGTH]; - m_rxData = new unsigned char[BUFFER_LENGTH]; -} - -CAX25Network::~CAX25Network() -{ - delete[] m_txData; - delete[] m_rxData; -} - -bool CAX25Network::open() -{ - LogMessage("Opening AX25 network connection"); - - return m_serial.open(); -} - -bool CAX25Network::write(const unsigned char* data, unsigned int length) -{ - assert(data != nullptr); - - if (!m_enabled) - return true; - - unsigned int txLength = 0U; - - m_txData[txLength++] = AX25_FEND; - m_txData[txLength++] = AX25_KISS_DATA; - - for (unsigned int i = 0U; i < length; i++) { - unsigned char c = data[i]; - - switch (c) { - case AX25_FEND: - m_txData[txLength++] = AX25_FESC; - m_txData[txLength++] = AX25_TFEND; - break; - case AX25_FESC: - m_txData[txLength++] = AX25_FESC; - m_txData[txLength++] = AX25_TFESC; - break; - default: - m_txData[txLength++] = c; - break; - } - } - - m_txData[txLength++] = AX25_FEND; - - if (m_debug) - CUtils::dump(1U, "AX25 Network Data Sent", m_txData, txLength); - - return m_serial.write(m_txData, txLength); -} - -unsigned int CAX25Network::read(unsigned char* data, unsigned int length) -{ - assert(data != nullptr); - - bool complete = false; - - unsigned char c; - while (m_serial.read(&c, 1U) > 0) { - if (m_rxLength == 0U && c == AX25_FEND) - m_rxData[m_rxLength++] = c; - else if (m_rxLength > 0U) - m_rxData[m_rxLength++] = c; - - if (m_rxLength > 1U && c == AX25_FEND) { - complete = true; - break; - } - } - - if (!m_enabled) - return 0U; - - if (!complete) - return 0U; - - if (m_rxLength == 0U) - return 0U; - - if (m_rxData[1U] != AX25_KISS_DATA) { - m_rxLength = 0U; - return 0U; - } - - complete = false; - - unsigned int dataLen = 0U; - for (unsigned int i = 2U; i < m_rxLength; i++) { - unsigned char c = m_rxData[i]; - - if (c == AX25_FEND) { - complete = true; - break; - } else if (c == AX25_TFEND && m_rxLastChar == AX25_FESC) { - data[dataLen++] = AX25_FEND; - } else if (c == AX25_TFESC && m_rxLastChar == AX25_FESC) { - data[dataLen++] = AX25_FESC; - } else { - data[dataLen++] = c; - } - - m_rxLastChar = c; - } - - if (!complete) - return 0U; - - if (m_debug) - CUtils::dump(1U, "AX25 Network Data Received", m_rxData, m_rxLength); - - m_rxLength = 0U; - m_rxLastChar = 0U; - - return dataLen; -} - -void CAX25Network::reset() -{ -} - -void CAX25Network::close() -{ - m_serial.close(); - - LogMessage("Closing AX25 network connection"); -} - -void CAX25Network::enable(bool enabled) -{ - m_enabled = enabled; - - if (enabled != m_enabled) { - m_rxLastChar = 0U; - m_rxLength = 0U; - } -} diff --git a/AX25Network.h b/AX25Network.h deleted file mode 100644 index c972ccb..0000000 --- a/AX25Network.h +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright (C) 2020,2021 by Jonathan Naylor G4KLX - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#ifndef AX25Network_H -#define AX25Network_H - -#if defined(_WIN32) || defined(_WIN64) -#include "UARTController.h" -#else -#include "PseudoTTYController.h" -#endif - -#include -#include - -class CAX25Network { -public: - CAX25Network(const std::string& port, unsigned int speed, bool debug); - ~CAX25Network(); - - bool open(); - - void enable(bool enabled); - - bool write(const unsigned char* data, unsigned int length); - - unsigned int read(unsigned char* data, unsigned int length); - - void reset(); - - void close(); - -private: -#if defined(_WIN32) || defined(_WIN64) - CUARTController m_serial; -#else - CPseudoTTYController m_serial; -#endif - unsigned char* m_txData; - unsigned char* m_rxData; - unsigned int m_rxLength; - unsigned char m_rxLastChar; - bool m_debug; - bool m_enabled; -}; - -#endif diff --git a/Conf.cpp b/Conf.cpp index 409ec1c..52a93a2 100644 --- a/Conf.cpp +++ b/Conf.cpp @@ -44,7 +44,6 @@ enum class SECTION { NXDN, POCSAG, FM, - AX25, DSTAR_NETWORK, DMR_NETWORK, FUSION_NETWORK, @@ -52,7 +51,6 @@ enum class SECTION { NXDN_NETWORK, POCSAG_NETWORK, FM_NETWORK, - AX25_NETWORK, TFTSERIAL_DISPLAY, HD44780_DISPLAY, NEXTION_DISPLAY, @@ -119,7 +117,6 @@ m_modemP25TXLevel(50.0F), m_modemNXDNTXLevel(50.0F), m_modemPOCSAGTXLevel(50.0F), m_modemFMTXLevel(50.0F), -m_modemAX25TXLevel(50.0F), m_modemRSSIMappingFile(), m_modemUseCOSAsLockout(false), m_modemTrace(false), @@ -218,12 +215,6 @@ m_fmRFAudioBoost(1U), m_fmMaxDevLevel(90.0F), m_fmExtAudioBoost(1U), m_fmModeHang(10U), -m_ax25Enabled(false), -m_ax25TXDelay(300U), -m_ax25RXTwist(6), -m_ax25SlotTime(30U), -m_ax25PPersist(128U), -m_ax25Trace(false), m_dstarNetworkEnabled(false), m_dstarGatewayAddress(), m_dstarGatewayPort(0U), @@ -287,10 +278,6 @@ m_fmTXAudioGain(1.0F), m_fmRXAudioGain(1.0F), m_fmNetworkModeHang(3U), m_fmNetworkDebug(false), -m_ax25NetworkEnabled(false), -m_ax25NetworkPort(), -m_ax25NetworkSpeed(9600U), -m_ax25NetworkDebug(false), m_tftSerialPort("/dev/ttyAMA0"), m_tftSerialBrightness(50U), m_tftSerialScreenLayout(0U), @@ -383,8 +370,6 @@ bool CConf::read() section = SECTION::POCSAG; else if (::strncmp(buffer, "[FM]", 4U) == 0) section = SECTION::FM; - else if (::strncmp(buffer, "[AX.25]", 7U) == 0) - section = SECTION::AX25; else if (::strncmp(buffer, "[D-Star Network]", 16U) == 0) section = SECTION::DSTAR_NETWORK; else if (::strncmp(buffer, "[DMR Network]", 13U) == 0) @@ -399,8 +384,6 @@ bool CConf::read() section = SECTION::POCSAG_NETWORK; else if (::strncmp(buffer, "[FM Network]", 12U) == 0) section = SECTION::FM_NETWORK; - else if (::strncmp(buffer, "[AX.25 Network]", 15U) == 0) - section = SECTION::AX25_NETWORK; else if (::strncmp(buffer, "[TFT Serial]", 12U) == 0) section = SECTION::TFTSERIAL_DISPLAY; else if (::strncmp(buffer, "[HD44780]", 9U) == 0) @@ -546,7 +529,7 @@ bool CConf::read() else if (::strcmp(key, "PTTInvert") == 0) m_modemPTTInvert = ::atoi(value) == 1; else if (::strcmp(key, "TXDelay") == 0) - m_ax25TXDelay = m_modemTXDelay = (unsigned int)::atoi(value); + m_modemTXDelay = (unsigned int)::atoi(value); else if (::strcmp(key, "DMRDelay") == 0) m_modemDMRDelay = (unsigned int)::atoi(value); else if (::strcmp(key, "RXOffset") == 0) @@ -562,7 +545,7 @@ bool CConf::read() else if (::strcmp(key, "RXLevel") == 0) m_modemRXLevel = float(::atof(value)); else if (::strcmp(key, "TXLevel") == 0) - m_modemAX25TXLevel = m_modemFMTXLevel = m_modemCWIdTXLevel = m_modemDStarTXLevel = m_modemDMRTXLevel = m_modemYSFTXLevel = m_modemP25TXLevel = m_modemNXDNTXLevel = m_modemPOCSAGTXLevel = float(::atof(value)); + m_modemFMTXLevel = m_modemCWIdTXLevel = m_modemDStarTXLevel = m_modemDMRTXLevel = m_modemYSFTXLevel = m_modemP25TXLevel = m_modemNXDNTXLevel = m_modemPOCSAGTXLevel = float(::atof(value)); else if (::strcmp(key, "CWIdTXLevel") == 0) m_modemCWIdTXLevel = float(::atof(value)); else if (::strcmp(key, "D-StarTXLevel") == 0) @@ -579,8 +562,6 @@ bool CConf::read() m_modemPOCSAGTXLevel = float(::atof(value)); else if (::strcmp(key, "FMTXLevel") == 0) m_modemFMTXLevel = float(::atof(value)); - else if (::strcmp(key, "AX25TXLevel") == 0) - m_modemAX25TXLevel = float(::atof(value)); else if (::strcmp(key, "RSSIMappingFile") == 0) m_modemRSSIMappingFile = value; else if (::strcmp(key, "UseCOSAsLockout") == 0) @@ -870,19 +851,6 @@ bool CConf::read() m_fmExtAudioBoost = (unsigned int)::atoi(value); else if (::strcmp(key, "ModeHang") == 0) m_fmModeHang = (unsigned int)::atoi(value); - } else if (section == SECTION::AX25) { - if (::strcmp(key, "Enable") == 0) - m_ax25Enabled = ::atoi(value) == 1; - else if (::strcmp(key, "TXDelay") == 0) - m_ax25TXDelay = (unsigned int)::atoi(value); - else if (::strcmp(key, "RXTwist") == 0) - m_ax25RXTwist = ::atoi(value); - else if (::strcmp(key, "SlotTime") == 0) - m_ax25SlotTime = (unsigned int)::atoi(value); - else if (::strcmp(key, "PPersist") == 0) - m_ax25PPersist = (unsigned int)::atoi(value); - else if (::strcmp(key, "Trace") == 0) - m_ax25Trace = ::atoi(value) == 1; } else if (section == SECTION::DSTAR_NETWORK) { if (::strcmp(key, "Enable") == 0) m_dstarNetworkEnabled = ::atoi(value) == 1; @@ -1016,15 +984,6 @@ bool CConf::read() m_fmNetworkModeHang = (unsigned int)::atoi(value); else if (::strcmp(key, "Debug") == 0) m_fmNetworkDebug = ::atoi(value) == 1; - } else if (section == SECTION::AX25_NETWORK) { - if (::strcmp(key, "Enable") == 0) - m_ax25NetworkEnabled = ::atoi(value) == 1; - else if (::strcmp(key, "Port") == 0) - m_ax25NetworkPort = value; - else if (::strcmp(key, "Speed") == 0) - m_ax25NetworkSpeed = (unsigned int)::atoi(value); - else if (::strcmp(key, "Debug") == 0) - m_ax25NetworkDebug = ::atoi(value) == 1; } else if (section == SECTION::TFTSERIAL_DISPLAY) { if (::strcmp(key, "Port") == 0) m_tftSerialPort = value; @@ -1397,11 +1356,6 @@ float CConf::getModemFMTXLevel() const return m_modemFMTXLevel; } -float CConf::getModemAX25TXLevel() const -{ - return m_modemAX25TXLevel; -} - std::string CConf::getModemRSSIMappingFile () const { return m_modemRSSIMappingFile; @@ -1892,36 +1846,6 @@ unsigned int CConf::getFMModeHang() const return m_fmModeHang; } -bool CConf::getAX25Enabled() const -{ - return m_ax25Enabled; -} - -unsigned int CConf::getAX25TXDelay() const -{ - return m_ax25TXDelay; -} - -int CConf::getAX25RXTwist() const -{ - return m_ax25RXTwist; -} - -unsigned int CConf::getAX25SlotTime() const -{ - return m_ax25SlotTime; -} - -unsigned int CConf::getAX25PPersist() const -{ - return m_ax25PPersist; -} - -bool CConf::getAX25Trace() const -{ - return m_ax25Trace; -} - bool CConf::getDStarNetworkEnabled() const { return m_dstarNetworkEnabled; @@ -2237,26 +2161,6 @@ bool CConf::getFMNetworkDebug() const return m_fmNetworkDebug; } -bool CConf::getAX25NetworkEnabled() const -{ - return m_ax25NetworkEnabled; -} - -std::string CConf::getAX25NetworkPort() const -{ - return m_ax25NetworkPort; -} - -unsigned int CConf::getAX25NetworkSpeed() const -{ - return m_ax25NetworkSpeed; -} - -bool CConf::getAX25NetworkDebug() const -{ - return m_ax25NetworkDebug; -} - std::string CConf::getTFTSerialPort() const { return m_tftSerialPort; diff --git a/Conf.h b/Conf.h index 30ea50c..e45c934 100644 --- a/Conf.h +++ b/Conf.h @@ -98,7 +98,6 @@ public: float getModemNXDNTXLevel() const; float getModemPOCSAGTXLevel() const; float getModemFMTXLevel() const; - float getModemAX25TXLevel() const; std::string getModemRSSIMappingFile() const; bool getModemUseCOSAsLockout() const; bool getModemTrace() const; @@ -176,14 +175,6 @@ public: bool getPOCSAGEnabled() const; unsigned int getPOCSAGFrequency() const; - // The AX.25 section - bool getAX25Enabled() const; - unsigned int getAX25TXDelay() const; - int getAX25RXTwist() const; - unsigned int getAX25SlotTime() const; - unsigned int getAX25PPersist() const; - bool getAX25Trace() const; - // The FM Section bool getFMEnabled() const; std::string getFMCallsign() const; @@ -299,12 +290,6 @@ public: unsigned int getFMNetworkModeHang() const; bool getFMNetworkDebug() const; - // The AX.25 Network section - bool getAX25NetworkEnabled() const; - std::string getAX25NetworkPort() const; - unsigned int getAX25NetworkSpeed() const; - bool getAX25NetworkDebug() const; - // The TFTSERIAL section std::string getTFTSerialPort() const; unsigned int getTFTSerialBrightness() const; @@ -421,7 +406,6 @@ private: float m_modemNXDNTXLevel; float m_modemPOCSAGTXLevel; float m_modemFMTXLevel; - float m_modemAX25TXLevel; std::string m_modemRSSIMappingFile; bool m_modemUseCOSAsLockout; bool m_modemTrace; @@ -529,13 +513,6 @@ private: unsigned int m_fmExtAudioBoost; unsigned int m_fmModeHang; - bool m_ax25Enabled; - unsigned int m_ax25TXDelay; - int m_ax25RXTwist; - unsigned int m_ax25SlotTime; - unsigned int m_ax25PPersist; - bool m_ax25Trace; - bool m_dstarNetworkEnabled; std::string m_dstarGatewayAddress; unsigned short m_dstarGatewayPort; @@ -606,11 +583,6 @@ private: unsigned int m_fmNetworkModeHang; bool m_fmNetworkDebug; - bool m_ax25NetworkEnabled; - std::string m_ax25NetworkPort; - unsigned int m_ax25NetworkSpeed; - bool m_ax25NetworkDebug; - std::string m_tftSerialPort; unsigned int m_tftSerialBrightness; unsigned int m_tftSerialScreenLayout; diff --git a/MMDVM.ini b/MMDVM.ini index d77181f..9b199c4 100644 --- a/MMDVM.ini +++ b/MMDVM.ini @@ -79,7 +79,6 @@ RFLevel=100 # NXDNTXLevel=50 # POCSAGTXLevel=50 # FMTXLevel=50 -# AX25TXLevel=50 RSSIMappingFile=RSSI.dat UseCOSAsLockout=0 Trace=0 @@ -197,14 +196,6 @@ MaxDevLevel=90 ExtAudioBoost=1 # ModeHang=10 -[AX.25] -Enable=1 -TXDelay=300 -RXTwist=6 -SlotTime=30 -PPersist=128 -Trace=1 - [D-Star Network] Enable=1 LocalAddress=127.0.0.1 @@ -287,12 +278,6 @@ RXAudioGain=1.0 # ModeHang=3 Debug=0 -[AX.25 Network] -Enable=1 -Port=/dev/ttyp7 -Speed=9600 -Debug=0 - [TFT Serial] # Port=modem Port=/dev/ttyAMA0 diff --git a/MMDVMHost.cpp b/MMDVMHost.cpp index 436f6ac..10fb079 100644 --- a/MMDVMHost.cpp +++ b/MMDVMHost.cpp @@ -141,7 +141,6 @@ m_p25(nullptr), m_nxdn(nullptr), m_pocsag(nullptr), m_fm(nullptr), -m_ax25(nullptr), m_dstarNetwork(nullptr), m_dmrNetwork(nullptr), m_ysfNetwork(nullptr), @@ -149,7 +148,6 @@ m_p25Network(nullptr), m_nxdnNetwork(nullptr), m_pocsagNetwork(nullptr), m_fmNetwork(nullptr), -m_ax25Network(nullptr), m_display(nullptr), m_mode(MODE_IDLE), m_dstarRFModeHang(10U), @@ -177,7 +175,6 @@ m_p25Enabled(false), m_nxdnEnabled(false), m_pocsagEnabled(false), m_fmEnabled(false), -m_ax25Enabled(false), m_cwIdTime(0U), m_dmrLookup(nullptr), m_nxdnLookup(nullptr), @@ -331,11 +328,6 @@ int CMMDVMHost::run() m_pocsagEnabled = false; } - if (m_ax25Enabled && !m_modem->hasAX25()) { - LogWarning("AX.25 enabled in the host but not in the modem firmware, disabling"); - m_ax25Enabled = false; - } - m_display = CDisplay::createDisplay(m_conf, m_modem); LogInfo("Opening network connections"); @@ -382,12 +374,6 @@ int CMMDVMHost::run() return 1; } - if (m_ax25Enabled && m_conf.getAX25NetworkEnabled()) { - ret = createAX25Network(); - if (!ret) - return 1; - } - sockaddr_storage transparentAddress; unsigned int transparentAddrLen; CUDPSocket* transparentSocket = nullptr; @@ -688,23 +674,6 @@ int CMMDVMHost::run() pocsagTimer.start(); } - if (m_ax25Enabled) { - unsigned int txDelay = m_conf.getAX25TXDelay(); - int rxTwist = m_conf.getAX25RXTwist(); - unsigned int slotTime = m_conf.getAX25SlotTime(); - unsigned int pPersist = m_conf.getAX25PPersist(); - bool trace = m_conf.getAX25Trace(); - - LogInfo("AX.25 RF Parameters"); - LogInfo(" TX Delay: %ums", txDelay); - LogInfo(" RX Twist: %d", rxTwist); - LogInfo(" Slot Time: %ums", slotTime); - LogInfo(" P-Persist: %u", pPersist); - LogInfo(" Trace: %s", trace ? "yes" : "no"); - - m_ax25 = new CAX25Control(m_ax25Network, trace); - } - if (m_fmEnabled) { bool preEmphasis = m_conf.getFMPreEmphasis(); bool deEmphasis = m_conf.getFMDeEmphasis(); @@ -914,15 +883,6 @@ int CMMDVMHost::run() } } - len = m_modem->readAX25Data(data); - if (m_ax25 != nullptr && m_ax25Enabled && len > 0U) { - if (m_mode == MODE_IDLE || m_mode == MODE_FM) { - m_ax25->writeModem(data, len); - } else if (m_mode != MODE_LOCKOUT) { - LogWarning("NXDN modem data received when in mode %u", m_mode); - } - } - len = m_modem->readTransparentData(data); if (transparentSocket != nullptr && len > 0U) transparentSocket->write(data, len, transparentAddress, transparentAddrLen); @@ -1092,21 +1052,6 @@ int CMMDVMHost::run() } } - if (m_ax25 != nullptr && m_ax25Enabled) { - ret = m_modem->hasAX25Space(); - if (ret) { - len = m_ax25->readModem(data); - if (len > 0U) { - if (m_mode == MODE_IDLE || m_mode == MODE_FM) { - m_modem->writeAX25Data(data, len); - } - else if (m_mode != MODE_LOCKOUT) { - LogWarning("AX.25 data received when in mode %u", m_mode); - } - } - } - } - if (transparentSocket != nullptr) { sockaddr_storage address; unsigned int addrlen; @@ -1280,11 +1225,6 @@ int CMMDVMHost::run() delete m_fmNetwork; } - if (m_ax25Network != nullptr) { - m_ax25Network->close(); - delete m_ax25Network; - } - if (transparentSocket != nullptr) { transparentSocket->close(); delete transparentSocket; @@ -1304,7 +1244,6 @@ int CMMDVMHost::run() delete m_nxdn; delete m_pocsag; delete m_fm; - delete m_ax25; LogInfo("MMDVMHost-%s has stopped", VERSION); @@ -1344,7 +1283,6 @@ bool CMMDVMHost::createModem() float nxdnTXLevel = m_conf.getModemNXDNTXLevel(); float pocsagTXLevel = m_conf.getModemPOCSAGTXLevel(); float fmTXLevel = m_conf.getModemFMTXLevel(); - float ax25TXLevel = m_conf.getModemAX25TXLevel(); bool trace = m_conf.getModemTrace(); bool debug = m_conf.getModemDebug(); unsigned int colorCode = m_conf.getDMRColorCode(); @@ -1360,10 +1298,6 @@ bool CMMDVMHost::createModem() int rxDCOffset = m_conf.getModemRXDCOffset(); int txDCOffset = m_conf.getModemTXDCOffset(); float rfLevel = m_conf.getModemRFLevel(); - int rxTwist = m_conf.getAX25RXTwist(); - unsigned int ax25TXDelay = m_conf.getAX25TXDelay(); - unsigned int ax25SlotTime = m_conf.getAX25SlotTime(); - unsigned int ax25PPersist = m_conf.getAX25PPersist(); bool useCOSAsLockout = m_conf.getModemUseCOSAsLockout(); LogInfo("Modem Parameters"); @@ -1404,7 +1338,6 @@ bool CMMDVMHost::createModem() LogInfo(" NXDN TX Level: %.1f%%", nxdnTXLevel); LogInfo(" POCSAG TX Level: %.1f%%", pocsagTXLevel); LogInfo(" FM TX Level: %.1f%%", fmTXLevel); - LogInfo(" AX.25 TX Level: %.1f%%", ax25TXLevel); LogInfo(" TX Frequency: %uHz (%uHz)", txFrequency, txFrequency + txOffset); LogInfo(" Use COS as Lockout: %s", useCOSAsLockout ? "yes" : "no"); @@ -1425,14 +1358,13 @@ bool CMMDVMHost::createModem() return false; m_modem->setPort(port); - m_modem->setModeParams(m_dstarEnabled, m_dmrEnabled, m_ysfEnabled, m_p25Enabled, m_nxdnEnabled, m_pocsagEnabled, m_fmEnabled, m_ax25Enabled); - m_modem->setLevels(rxLevel, cwIdTXLevel, dstarTXLevel, dmrTXLevel, ysfTXLevel, p25TXLevel, nxdnTXLevel, pocsagTXLevel, fmTXLevel, ax25TXLevel); + m_modem->setModeParams(m_dstarEnabled, m_dmrEnabled, m_ysfEnabled, m_p25Enabled, m_nxdnEnabled, m_pocsagEnabled, m_fmEnabled); + m_modem->setLevels(rxLevel, cwIdTXLevel, dstarTXLevel, dmrTXLevel, ysfTXLevel, p25TXLevel, nxdnTXLevel, pocsagTXLevel, fmTXLevel); m_modem->setRFParams(rxFrequency, rxOffset, txFrequency, txOffset, txDCOffset, rxDCOffset, rfLevel, pocsagFrequency); m_modem->setDMRParams(colorCode); m_modem->setYSFParams(lowDeviation, ysfTXHang); m_modem->setP25Params(p25TXHang); m_modem->setNXDNParams(nxdnTXHang); - m_modem->setAX25Params(rxTwist, ax25TXDelay, ax25SlotTime, ax25PPersist); if (m_fmEnabled) { std::string callsign = m_conf.getFMCallsign(); @@ -1818,30 +1750,6 @@ bool CMMDVMHost::createFMNetwork() return true; } -bool CMMDVMHost::createAX25Network() -{ - std::string port = m_conf.getAX25NetworkPort(); - unsigned int speed = m_conf.getAX25NetworkSpeed(); - bool debug = m_conf.getAX25NetworkDebug(); - - LogInfo("AX.25 Network Parameters"); - LogInfo(" Port: %s", port.c_str()); - LogInfo(" Speed: %u", speed); - - m_ax25Network = new CAX25Network(port, speed, debug); - - bool ret = m_ax25Network->open(); - if (!ret) { - delete m_ax25Network; - m_ax25Network = nullptr; - return false; - } - - m_ax25Network->enable(true); - - return true; -} - void CMMDVMHost::readParams() { m_dstarEnabled = m_conf.getDStarEnabled(); @@ -1851,7 +1759,6 @@ void CMMDVMHost::readParams() m_nxdnEnabled = m_conf.getNXDNEnabled(); m_pocsagEnabled = m_conf.getPOCSAGEnabled(); m_fmEnabled = m_conf.getFMEnabled(); - m_ax25Enabled = m_conf.getAX25Enabled(); m_duplex = m_conf.getDuplex(); m_callsign = m_conf.getCallsign(); m_id = m_conf.getId(); @@ -1869,7 +1776,6 @@ void CMMDVMHost::readParams() LogInfo(" NXDN: %s", m_nxdnEnabled ? "enabled" : "disabled"); LogInfo(" POCSAG: %s", m_pocsagEnabled ? "enabled" : "disabled"); LogInfo(" FM: %s", m_fmEnabled ? "enabled" : "disabled"); - LogInfo(" AX.25: %s", m_ax25Enabled ? "enabled" : "disabled"); } void CMMDVMHost::enableModemMode(bool& mode, bool enabled) @@ -1878,12 +1784,12 @@ void CMMDVMHost::enableModemMode(bool& mode, bool enabled) mode = enabled; - m_modem->setModeParams(m_dstarEnabled, m_dmrEnabled, m_ysfEnabled, m_p25Enabled, m_nxdnEnabled, m_pocsagEnabled, m_fmEnabled, m_ax25Enabled); + m_modem->setModeParams(m_dstarEnabled, m_dmrEnabled, m_ysfEnabled, m_p25Enabled, m_nxdnEnabled, m_pocsagEnabled, m_fmEnabled); if (!m_modem->writeConfig()) LogError("Cannot write Config to MMDVM"); } -void CMMDVMHost::processEnableModeCommand(unsigned char mode, bool hasController, bool& modeEnabled, bool enableMode, bool isAX25) +void CMMDVMHost::processEnableModeCommand(unsigned char mode, bool hasController, bool& modeEnabled, bool enableMode) { if (hasController && (modeEnabled != enableMode)) { unsigned char data[500U]; @@ -1920,10 +1826,9 @@ void CMMDVMHost::processEnableModeCommand(unsigned char mode, bool hasController m_nxdn->enable(enableMode); break; case MODE_FM: - if (isAX25) - m_ax25->enable(enableMode); - else - m_fm->enable(enableMode); + if (m_fmNetwork != nullptr) + m_fmNetwork->enable(enableMode); + m_fm->enable(enableMode); break; default: break; @@ -1948,7 +1853,7 @@ void CMMDVMHost::processEnableModeCommand(unsigned char mode, bool hasController while (m_modem->readNXDNData(data) > 0U); break; case MODE_FM: - while ((isAX25 ? m_modem->readAX25Data(data) : m_modem->readFMData(data)) > 0U); + while (m_modem->readFMData(data) > 0U); break; default: break; @@ -1982,8 +1887,6 @@ void CMMDVMHost::setMode(unsigned char mode) m_pocsagNetwork->enable(false); if (m_fmNetwork != nullptr) m_fmNetwork->enable(false); - if (m_ax25Network != nullptr) - m_ax25Network->enable(false); if (m_dstar != nullptr && m_dstarEnabled) m_dstar->enable(true); if (m_dmr != nullptr) @@ -1998,8 +1901,6 @@ void CMMDVMHost::setMode(unsigned char mode) m_pocsag->enable(false); if (m_fm != nullptr) m_fm->enable(false); - if (m_ax25 != nullptr) - m_ax25->enable(false); if (m_dstarEnabled) { m_modem->setMode(MODE_DSTAR); m_mode = MODE_DSTAR; @@ -2025,8 +1926,6 @@ void CMMDVMHost::setMode(unsigned char mode) m_pocsagNetwork->enable(false); if (m_fmNetwork != nullptr) m_fmNetwork->enable(false); - if (m_ax25Network != nullptr) - m_ax25Network->enable(false); if (m_dstar != nullptr) m_dstar->enable(false); if (m_dmr != nullptr && m_dmrEnabled) @@ -2041,8 +1940,6 @@ void CMMDVMHost::setMode(unsigned char mode) m_pocsag->enable(false); if (m_fm != nullptr) m_fm->enable(false); - if (m_ax25 != nullptr) - m_ax25->enable(false); if (m_dmrEnabled) { m_modem->setMode(MODE_DMR); if (m_duplex) { @@ -2072,8 +1969,6 @@ void CMMDVMHost::setMode(unsigned char mode) m_pocsagNetwork->enable(false); if (m_fmNetwork != nullptr) m_fmNetwork->enable(false); - if (m_ax25Network != nullptr) - m_ax25Network->enable(false); if (m_dstar != nullptr) m_dstar->enable(false); if (m_dmr != nullptr) @@ -2088,8 +1983,6 @@ void CMMDVMHost::setMode(unsigned char mode) m_pocsag->enable(false); if (m_fm != nullptr) m_fm->enable(false); - if (m_ax25 != nullptr) - m_ax25->enable(false); if (m_ysfEnabled) { m_modem->setMode(MODE_YSF); m_mode = MODE_YSF; @@ -2115,8 +2008,6 @@ void CMMDVMHost::setMode(unsigned char mode) m_pocsagNetwork->enable(false); if (m_fmNetwork != nullptr) m_fmNetwork->enable(false); - if (m_ax25Network != nullptr) - m_ax25Network->enable(false); if (m_dstar != nullptr) m_dstar->enable(false); if (m_dmr != nullptr) @@ -2131,8 +2022,6 @@ void CMMDVMHost::setMode(unsigned char mode) m_pocsag->enable(false); if (m_fm != nullptr) m_fm->enable(false); - if (m_ax25 != nullptr) - m_ax25->enable(false); if (m_p25Enabled) { m_modem->setMode(MODE_P25); m_mode = MODE_P25; @@ -2158,8 +2047,6 @@ void CMMDVMHost::setMode(unsigned char mode) m_pocsagNetwork->enable(false); if (m_fmNetwork != nullptr) m_fmNetwork->enable(false); - if (m_ax25Network != nullptr) - m_ax25Network->enable(false); if (m_dstar != nullptr) m_dstar->enable(false); if (m_dmr != nullptr) @@ -2174,8 +2061,6 @@ void CMMDVMHost::setMode(unsigned char mode) m_pocsag->enable(false); if (m_fm != nullptr) m_fm->enable(false); - if (m_ax25 != nullptr) - m_ax25->enable(false); if (m_nxdnEnabled) { m_modem->setMode(MODE_NXDN); m_mode = MODE_NXDN; @@ -2201,8 +2086,6 @@ void CMMDVMHost::setMode(unsigned char mode) m_pocsagNetwork->enable(true); if (m_fmNetwork != nullptr) m_fmNetwork->enable(false); - if (m_ax25Network != nullptr) - m_ax25Network->enable(false); if (m_dstar != nullptr) m_dstar->enable(false); if (m_dmr != nullptr) @@ -2217,8 +2100,6 @@ void CMMDVMHost::setMode(unsigned char mode) m_pocsag->enable(true); if (m_fm != nullptr) m_fm->enable(false); - if (m_ax25 != nullptr) - m_ax25->enable(false); m_modem->setMode(MODE_POCSAG); m_mode = MODE_POCSAG; m_modeTimer.start(); @@ -2242,8 +2123,6 @@ void CMMDVMHost::setMode(unsigned char mode) m_pocsagNetwork->enable(false); if (m_fmNetwork != nullptr && m_fmEnabled) m_fmNetwork->enable(true); - if (m_ax25Network != nullptr && m_ax25Enabled) - m_ax25Network->enable(true); if (m_dstar != nullptr) m_dstar->enable(false); if (m_dmr != nullptr) @@ -2258,8 +2137,6 @@ void CMMDVMHost::setMode(unsigned char mode) m_pocsag->enable(false); if (m_fm != nullptr && m_fmEnabled) m_fm->enable(true); - if (m_ax25 != nullptr && m_ax25Enabled) - m_ax25->enable(true); if (m_mode == MODE_DMR && m_duplex && m_modem->hasTX()) { m_modem->writeDMRStart(false); m_dmrTXTimer.stop(); @@ -2290,8 +2167,6 @@ void CMMDVMHost::setMode(unsigned char mode) m_pocsagNetwork->enable(false); if (m_fmNetwork != nullptr) m_fmNetwork->enable(false); - if (m_ax25Network != nullptr) - m_ax25Network->enable(false); if (m_dstar != nullptr) m_dstar->enable(false); if (m_dmr != nullptr) @@ -2306,8 +2181,6 @@ void CMMDVMHost::setMode(unsigned char mode) m_pocsag->enable(false); if (m_fm != nullptr) m_fm->enable(false); - if (m_ax25 != nullptr) - m_ax25->enable(false); if (m_mode == MODE_DMR && m_duplex && m_modem->hasTX()) { m_modem->writeDMRStart(false); m_dmrTXTimer.stop(); @@ -2337,8 +2210,6 @@ void CMMDVMHost::setMode(unsigned char mode) m_pocsagNetwork->enable(false); if (m_fmNetwork != nullptr) m_fmNetwork->enable(false); - if (m_ax25Network != nullptr) - m_ax25Network->enable(false); if (m_dstar != nullptr) m_dstar->enable(false); if (m_dmr != nullptr) @@ -2353,8 +2224,6 @@ void CMMDVMHost::setMode(unsigned char mode) m_pocsag->enable(false); if (m_fm != nullptr) m_fm->enable(false); - if (m_ax25 != nullptr) - m_ax25->enable(false); if (m_mode == MODE_DMR && m_duplex && m_modem->hasTX()) { m_modem->writeDMRStart(false); m_dmrTXTimer.stop(); @@ -2382,8 +2251,6 @@ void CMMDVMHost::setMode(unsigned char mode) m_pocsagNetwork->enable(true); if (m_fmNetwork != nullptr && m_fmEnabled) m_fmNetwork->enable(true); - if (m_ax25Network != nullptr && m_fmEnabled) - m_ax25Network->enable(true); if (m_dstar != nullptr && m_dstarEnabled) m_dstar->enable(true); if (m_dmr != nullptr && m_dmrEnabled) @@ -2398,8 +2265,6 @@ void CMMDVMHost::setMode(unsigned char mode) m_pocsag->enable(true); if (m_fm != nullptr && m_fmEnabled) m_fm->enable(true); - if (m_ax25 != nullptr && m_fmEnabled) - m_ax25->enable(true); if (m_mode == MODE_DMR && m_duplex && m_modem->hasTX() && m_dmrEnabled) { m_modem->writeDMRStart(false); m_dmrTXTimer.stop(); @@ -2498,9 +2363,6 @@ void CMMDVMHost::remoteControl() case REMOTE_COMMAND::ENABLE_FM: processEnableModeCommand(MODE_FM, (m_fm != nullptr), m_fmEnabled, true); break; - case REMOTE_COMMAND::ENABLE_AX25: - processEnableModeCommand(MODE_FM, (m_ax25 != nullptr), m_ax25Enabled, true, true); - break; case REMOTE_COMMAND::DISABLE_DSTAR: processEnableModeCommand(MODE_DSTAR, (m_dstar != nullptr), m_dstarEnabled, false); break; @@ -2519,9 +2381,6 @@ void CMMDVMHost::remoteControl() case REMOTE_COMMAND::DISABLE_FM: processEnableModeCommand(MODE_FM, (m_fm != nullptr), m_fmEnabled, false); break; - case REMOTE_COMMAND::DISABLE_AX25: - processEnableModeCommand(MODE_FM, (m_ax25 != nullptr), m_ax25Enabled, false, true); - break; case REMOTE_COMMAND::PAGE: if (m_pocsag != nullptr) { unsigned int ric = m_remoteControl->getArgUInt(0U); diff --git a/MMDVMHost.h b/MMDVMHost.h index c3a1dc7..2c9cbb7 100644 --- a/MMDVMHost.h +++ b/MMDVMHost.h @@ -23,10 +23,8 @@ #include "POCSAGNetwork.h" #include "POCSAGControl.h" #include "DStarNetwork.h" -#include "AX25Network.h" #include "NXDNNetwork.h" #include "DStarControl.h" -#include "AX25Control.h" #include "DMRControl.h" #include "YSFControl.h" #include "P25Control.h" @@ -67,7 +65,6 @@ private: CNXDNControl* m_nxdn; CPOCSAGControl* m_pocsag; CFMControl* m_fm; - CAX25Control* m_ax25; CDStarNetwork* m_dstarNetwork; IDMRNetwork* m_dmrNetwork; CYSFNetwork* m_ysfNetwork; @@ -75,7 +72,6 @@ private: INXDNNetwork* m_nxdnNetwork; CPOCSAGNetwork* m_pocsagNetwork; CFMNetwork* m_fmNetwork; - CAX25Network* m_ax25Network; CDisplay* m_display; unsigned char m_mode; unsigned int m_dstarRFModeHang; @@ -103,7 +99,6 @@ private: bool m_nxdnEnabled; bool m_pocsagEnabled; bool m_fmEnabled; - bool m_ax25Enabled; unsigned int m_cwIdTime; CDMRLookup* m_dmrLookup; CNXDNLookup* m_nxdnLookup; @@ -124,14 +119,13 @@ private: bool createNXDNNetwork(); bool createPOCSAGNetwork(); bool createFMNetwork(); - bool createAX25Network(); void remoteControl(); void processModeCommand(unsigned char mode, unsigned int timeout); void setMode(unsigned char mode); void enableModemMode(bool& mode, bool enabled); - void processEnableModeCommand(unsigned char mode, bool hasController, bool& modeEnabled, bool enableMode, bool isAX25 = false); + void processEnableModeCommand(unsigned char mode, bool hasController, bool& modeEnabled, bool enableMode); void createLockFile(const char* mode) const; void removeLockFile() const; diff --git a/MMDVMHost.vcxproj b/MMDVMHost.vcxproj index 642202d..7e8a4fb 100644 --- a/MMDVMHost.vcxproj +++ b/MMDVMHost.vcxproj @@ -165,9 +165,6 @@ - - - @@ -274,8 +271,6 @@ - - diff --git a/MMDVMHost.vcxproj.filters b/MMDVMHost.vcxproj.filters index ac785b8..2670f71 100644 --- a/MMDVMHost.vcxproj.filters +++ b/MMDVMHost.vcxproj.filters @@ -272,21 +272,12 @@ Header Files - - Header Files - - - Header Files - Header Files Header Files - - Header Files - Header Files @@ -568,12 +559,6 @@ Source Files - - Source Files - - - Source Files - Source Files diff --git a/Makefile b/Makefile index 47ac0cc..3eed7a8 100644 --- a/Makefile +++ b/Makefile @@ -9,7 +9,7 @@ LIBS = -lpthread -lutil LDFLAGS = -g -L/usr/local/lib OBJECTS = \ - AMBEFEC.o BCH.o AX25Control.o AX25Network.o BPTC19696.o CASTInfo.o Conf.o CRC.o Display.o DMRControl.o DMRCSBK.o DMRData.o DMRDataHeader.o \ + AMBEFEC.o BCH.o BPTC19696.o CASTInfo.o Conf.o CRC.o Display.o DMRControl.o DMRCSBK.o DMRData.o DMRDataHeader.o \ DMRDirectNetwork.o DMREMB.o DMREmbeddedData.o DMRFullLC.o DMRGatewayNetwork.o DMRLookup.o DMRLC.o DMRNetwork.o DMRShortLC.o DMRSlot.o DMRSlotType.o \ DMRAccessControl.o DMRTA.o DMRTrellis.o DStarControl.o DStarHeader.o DStarNetwork.o DStarSlowData.o FMControl.o FMNetwork.o Golay2087.o Golay24128.o \ Hamming.o I2CController.o IIRDirectForm1Filter.o LCDproc.o Log.o MMDVMHost.o \ diff --git a/Makefile.Pi.Adafruit b/Makefile.Pi.Adafruit index 599b40f..72f46cf 100644 --- a/Makefile.Pi.Adafruit +++ b/Makefile.Pi.Adafruit @@ -10,7 +10,7 @@ LIBS = -lwiringPi -lwiringPiDev -lpthread -lutil LDFLAGS = -g -L/usr/local/lib OBJECTS = \ - AMBEFEC.o AX25Control.o AX25Network.o BCH.o BPTC19696.o CASTInfo.o Conf.o CRC.o Display.o DMRControl.o DMRCSBK.o DMRData.o DMRDataHeader.o \ + AMBEFEC.o BCH.o BPTC19696.o CASTInfo.o Conf.o CRC.o Display.o DMRControl.o DMRCSBK.o DMRData.o DMRDataHeader.o \ DMRDirectNetwork.o DMREMB.o DMREmbeddedData.o DMRFullLC.o DMRGatewayNetwork.o DMRLookup.o DMRLC.o DMRNetwork.o DMRShortLC.o DMRSlot.o DMRSlotType.o \ DMRAccessControl.o DMRTA.o DMRTrellis.o DStarControl.o DStarHeader.o DStarNetwork.o DStarSlowData.o FMControl.o FMNetwork.o Golay2087.o Golay24128.o \ Hamming.o HD44780.o I2CController.o IIRDirectForm1Filter.o LCDproc.o Log.o \ diff --git a/Makefile.Pi.HD44780 b/Makefile.Pi.HD44780 index 28cb3fe..26755d2 100644 --- a/Makefile.Pi.HD44780 +++ b/Makefile.Pi.HD44780 @@ -9,7 +9,7 @@ LIBS = -lwiringPi -lwiringPiDev -lpthread -lutil LDFLAGS = -g -L/usr/local/lib OBJECTS = \ - AMBEFEC.o AX25Control.o AX25Network.o BCH.o BPTC19696.o CASTInfo.o Conf.o CRC.o Display.o DMRControl.o DMRCSBK.o DMRData.o DMRDataHeader.o \ + AMBEFEC.o BCH.o BPTC19696.o CASTInfo.o Conf.o CRC.o Display.o DMRControl.o DMRCSBK.o DMRData.o DMRDataHeader.o \ DMRDirectNetwork.o DMREMB.o DMREmbeddedData.o DMRFullLC.o DMRGatewayNetwork.o DMRLookup.o DMRLC.o DMRNetwork.o DMRShortLC.o DMRSlot.o DMRSlotType.o \ DMRAccessControl.o DMRTA.o DMRTrellis.o DStarControl.o DStarHeader.o DStarNetwork.o DStarSlowData.o FMControl.o FMNetwork.o Golay2087.o Golay24128.o \ Hamming.o HD44780.o I2CController.o IIRDirectForm1Filter.o LCDproc.o Log.o \ diff --git a/Makefile.Pi.I2C b/Makefile.Pi.I2C index a50d8c1..762b5f7 100644 --- a/Makefile.Pi.I2C +++ b/Makefile.Pi.I2C @@ -9,7 +9,7 @@ LIBS = -lwiringPi -lwiringPiDev -lpthread -lutil LDFLAGS = -g -L/usr/local/lib OBJECTS = \ - AMBEFEC.o AX25Control.o AX25Network.o BCH.o BPTC19696.o CASTInfo.o Conf.o CRC.o Display.o DMRControl.o DMRCSBK.o DMRData.o DMRDataHeader.o \ + AMBEFEC.o BCH.o BPTC19696.o CASTInfo.o Conf.o CRC.o Display.o DMRControl.o DMRCSBK.o DMRData.o DMRDataHeader.o \ DMRDirectNetwork.o DMREMB.o DMREmbeddedData.o DMRFullLC.o DMRGatewayNetwork.o DMRLookup.o DMRLC.o DMRNetwork.o DMRShortLC.o DMRSlot.o DMRSlotType.o \ DMRAccessControl.o DMRTA.o DMRTrellis.o DStarControl.o DStarHeader.o DStarNetwork.o DStarSlowData.o FMControl.o FMNetwork.o Golay2087.o Golay24128.o \ Hamming.o I2CController.o IIRDirectForm1Filter.o LCDproc.o Log.o MMDVMHost.o \ diff --git a/Makefile.Pi.OLED b/Makefile.Pi.OLED index 2efb630..3e96989 100644 --- a/Makefile.Pi.OLED +++ b/Makefile.Pi.OLED @@ -13,7 +13,7 @@ LIBS = -lArduiPi_OLED -lpthread -lutil LDFLAGS = -g -L/usr/local/lib OBJECTS = \ - AMBEFEC.o AX25Control.o AX25Network.o BCH.o BPTC19696.o CASTInfo.o Conf.o CRC.o Display.o DMRControl.o DMRCSBK.o DMRData.o DMRDataHeader.o \ + AMBEFEC.o BCH.o BPTC19696.o CASTInfo.o Conf.o CRC.o Display.o DMRControl.o DMRCSBK.o DMRData.o DMRDataHeader.o \ DMRDirectNetwork.o DMREMB.o DMREmbeddedData.o DMRFullLC.o DMRGatewayNetwork.o DMRLookup.o DMRLC.o DMRNetwork.o DMRShortLC.o DMRSlot.o DMRSlotType.o \ DMRAccessControl.o DMRTA.o DMRTrellis.o DStarControl.o DStarHeader.o DStarNetwork.o DStarSlowData.o FMControl.o FMNetwork.o Golay2087.o Golay24128.o \ Hamming.o I2CController.o IIRDirectForm1Filter.o LCDproc.o Log.o MMDVMHost.o \ diff --git a/Makefile.Pi.PCF8574 b/Makefile.Pi.PCF8574 index 7f060d9..7a86500 100644 --- a/Makefile.Pi.PCF8574 +++ b/Makefile.Pi.PCF8574 @@ -10,7 +10,7 @@ LIBS = -lwiringPi -lwiringPiDev -lpthread -lutil LDFLAGS = -g -L/usr/local/lib OBJECTS = \ - AMBEFEC.o AX25Control.o AX25Network.o BCH.o BPTC19696.o CASTInfo.o Conf.o CRC.o Display.o DMRControl.o DMRCSBK.o DMRData.o DMRDataHeader.o \ + AMBEFEC.o BCH.o BPTC19696.o CASTInfo.o Conf.o CRC.o Display.o DMRControl.o DMRCSBK.o DMRData.o DMRDataHeader.o \ DMRDirectNetwork.o DMREMB.o DMREmbeddedData.o DMRFullLC.o DMRGatewayNetwork.o DMRLookup.o DMRLC.o DMRNetwork.o DMRShortLC.o DMRSlot.o DMRSlotType.o \ DMRAccessControl.o DMRTA.o DMRTrellis.o DStarControl.o DStarHeader.o DStarNetwork.o DStarSlowData.o FMControl.o FMNetwork.o Golay2087.o Golay24128.o \ Hamming.o HD44780.o I2CController.o IIRDirectForm1Filter.o LCDproc.o Log.o \ diff --git a/Modem.cpp b/Modem.cpp index fe32382..d182f52 100644 --- a/Modem.cpp +++ b/Modem.cpp @@ -21,7 +21,6 @@ #include "YSFDefines.h" #include "P25Defines.h" #include "NXDNDefines.h" -#include "AX25Defines.h" #include "POCSAGDefines.h" #include "Thread.h" #include "Modem.h" @@ -75,8 +74,6 @@ const unsigned char MMDVM_NXDN_LOST = 0x41U; const unsigned char MMDVM_POCSAG_DATA = 0x50U; -const unsigned char MMDVM_AX25_DATA = 0x55U; - const unsigned char MMDVM_FM_PARAMS1 = 0x60U; const unsigned char MMDVM_FM_PARAMS2 = 0x61U; const unsigned char MMDVM_FM_PARAMS3 = 0x62U; @@ -111,7 +108,6 @@ const unsigned char CAP1_P25 = 0x08U; const unsigned char CAP1_NXDN = 0x10U; const unsigned char CAP1_FM = 0x40U; const unsigned char CAP2_POCSAG = 0x01U; -const unsigned char CAP2_AX25 = 0x02U; CModem::CModem(bool duplex, bool rxInvert, bool txInvert, bool pttInvert, unsigned int txDelay, unsigned int dmrDelay, bool useCOSAsLockout, bool trace, bool debug) : @@ -136,7 +132,6 @@ m_p25TXLevel(0.0F), m_nxdnTXLevel(0.0F), m_pocsagTXLevel(0.0F), m_fmTXLevel(0.0F), -m_ax25TXLevel(0.0F), m_rfLevel(0.0F), m_useCOSAsLockout(useCOSAsLockout), m_trace(trace), @@ -151,7 +146,6 @@ m_p25Enabled(false), m_nxdnEnabled(false), m_pocsagEnabled(false), m_fmEnabled(false), -m_ax25Enabled(false), m_rxDCOffset(0), m_txDCOffset(0), m_port(nullptr), @@ -175,8 +169,6 @@ m_txNXDNData(1000U, "Modem TX NXDN"), m_txPOCSAGData(1000U, "Modem TX POCSAG"), m_rxFMData(5000U, "Modem RX FM"), m_txFMData(5000U, "Modem TX FM"), -m_rxAX25Data(1000U, "Modem RX AX.25"), -m_txAX25Data(1000U, "Modem TX AX.25"), m_rxSerialData(1000U, "Modem RX Serial"), m_txSerialData(1000U, "Modem TX Serial"), m_rxTransparentData(1000U, "Modem RX Transparent"), @@ -193,17 +185,12 @@ m_p25Space(0U), m_nxdnSpace(0U), m_pocsagSpace(0U), m_fmSpace(0U), -m_ax25Space(0U), m_tx(false), m_cd(false), m_lockout(false), m_error(false), m_mode(MODE_IDLE), m_hwType(HW_TYPE::UNKNOWN), -m_ax25RXTwist(0), -m_ax25TXDelay(300U), -m_ax25SlotTime(30U), -m_ax25PPersist(128U), m_fmCallsign(), m_fmCallsignSpeed(20U), m_fmCallsignFrequency(1000U), @@ -268,7 +255,7 @@ void CModem::setRFParams(unsigned int rxFrequency, int rxOffset, unsigned int tx m_pocsagFrequency = pocsagFrequency + txOffset; } -void CModem::setModeParams(bool dstarEnabled, bool dmrEnabled, bool ysfEnabled, bool p25Enabled, bool nxdnEnabled, bool pocsagEnabled, bool fmEnabled, bool ax25Enabled) +void CModem::setModeParams(bool dstarEnabled, bool dmrEnabled, bool ysfEnabled, bool p25Enabled, bool nxdnEnabled, bool pocsagEnabled, bool fmEnabled) { m_dstarEnabled = dstarEnabled; m_dmrEnabled = dmrEnabled; @@ -277,10 +264,9 @@ void CModem::setModeParams(bool dstarEnabled, bool dmrEnabled, bool ysfEnabled, m_nxdnEnabled = nxdnEnabled; m_pocsagEnabled = pocsagEnabled; m_fmEnabled = fmEnabled; - m_ax25Enabled = ax25Enabled; } -void CModem::setLevels(float rxLevel, float cwIdTXLevel, float dstarTXLevel, float dmrTXLevel, float ysfTXLevel, float p25TXLevel, float nxdnTXLevel, float pocsagTXLevel, float fmTXLevel, float ax25TXLevel) +void CModem::setLevels(float rxLevel, float cwIdTXLevel, float dstarTXLevel, float dmrTXLevel, float ysfTXLevel, float p25TXLevel, float nxdnTXLevel, float pocsagTXLevel, float fmTXLevel) { m_rxLevel = rxLevel; m_cwIdTXLevel = cwIdTXLevel; @@ -291,7 +277,6 @@ void CModem::setLevels(float rxLevel, float cwIdTXLevel, float dstarTXLevel, flo m_nxdnTXLevel = nxdnTXLevel; m_pocsagTXLevel = pocsagTXLevel; m_fmTXLevel = fmTXLevel; - m_ax25TXLevel = ax25TXLevel; } void CModem::setDMRParams(unsigned int colorCode) @@ -317,14 +302,6 @@ void CModem::setNXDNParams(unsigned int txHang) m_nxdnTXHang = txHang; } -void CModem::setAX25Params(int rxTwist, unsigned int txDelay, unsigned int slotTime, unsigned int pPersist) -{ - m_ax25RXTwist = rxTwist; - m_ax25TXDelay = txDelay; - m_ax25SlotTime = slotTime; - m_ax25PPersist = pPersist; -} - void CModem::setTransparentDataParams(unsigned int sendFrameType) { m_sendTransparentDataFrameType = sendFrameType; @@ -685,17 +662,6 @@ void CModem::clock(unsigned int ms) } break; - case MMDVM_AX25_DATA: { - if (m_trace) - CUtils::dump(1U, "RX AX.25 Data", m_buffer, m_length); - - unsigned int data = m_length - m_offset; - m_rxAX25Data.addData((unsigned char*)&data, sizeof(unsigned int)); - - m_rxAX25Data.addData(m_buffer + m_offset, m_length - m_offset); - } - break; - case MMDVM_GET_STATUS: // if (m_trace) // CUtils::dump(1U, "GET_STATUS", m_buffer, m_length); @@ -724,7 +690,6 @@ void CModem::clock(unsigned int ms) m_nxdnSpace = 0U; m_pocsagSpace = 0U; m_fmSpace = 0U; - m_ax25Space = 0U; m_dstarSpace = m_buffer[m_offset + 3U]; m_dmrSpace1 = m_buffer[m_offset + 4U]; @@ -768,7 +733,6 @@ void CModem::clock(unsigned int ms) m_nxdnSpace = m_buffer[m_offset + 8U]; m_fmSpace = m_buffer[m_offset + 10U]; m_pocsagSpace = m_buffer[m_offset + 11U]; - m_ax25Space = m_buffer[m_offset + 12U]; } break; @@ -781,7 +745,6 @@ void CModem::clock(unsigned int ms) m_nxdnSpace = 0U; m_pocsagSpace = 0U; m_fmSpace = 0U; - m_ax25Space = 0U; break; } @@ -1002,23 +965,6 @@ void CModem::clock(unsigned int ms) m_fmSpace--; } - if (m_ax25Space > 0U && !m_txAX25Data.isEmpty()) { - unsigned int len = 0U; - m_txAX25Data.getData((unsigned char*)&len, sizeof(unsigned int)); - m_txAX25Data.getData(m_buffer, len); - - if (m_trace) - CUtils::dump(1U, "TX AX.25 Data", m_buffer, len); - - int ret = m_port->write(m_buffer, len); - if (ret != int(len)) - LogWarning("Error when writing AX.25 data to the MMDVM"); - - m_playoutTimer.start(); - - m_ax25Space = 0U; - } - if (!m_txTransparentData.isEmpty()) { unsigned char len = 0U; m_txTransparentData.getData(&len, 1U); @@ -1153,20 +1099,6 @@ unsigned int CModem::readFMData(unsigned char* data) return len; } -unsigned int CModem::readAX25Data(unsigned char* data) -{ - assert(data != nullptr); - - if (m_rxAX25Data.isEmpty()) - return 0U; - - unsigned int len = 0U; - m_rxAX25Data.getData((unsigned char*)&len, sizeof(unsigned int)); - m_rxAX25Data.getData(data, len); - - return len; -} - unsigned int CModem::readTransparentData(unsigned char* data) { assert(data != nullptr); @@ -1447,42 +1379,6 @@ bool CModem::writeFMData(const unsigned char* data, unsigned int length) return true; } -bool CModem::hasAX25Space() const -{ - unsigned int space = m_txAX25Data.freeSpace() / (AX25_MAX_FRAME_LENGTH_BYTES + 5U); - - return space > 1U; -} - -bool CModem::writeAX25Data(const unsigned char* data, unsigned int length) -{ - assert(data != nullptr); - assert(length > 0U); - - unsigned char buffer[500U]; - - unsigned int len; - if (length > 252U) { - buffer[0U] = MMDVM_FRAME_START; - buffer[1U] = 0U; - buffer[2U] = (length + 4U) - 255U; - buffer[3U] = MMDVM_AX25_DATA; - ::memcpy(buffer + 4U, data, length); - len = length + 4U; - } else { - buffer[0U] = MMDVM_FRAME_START; - buffer[1U] = length + 3U; - buffer[2U] = MMDVM_AX25_DATA; - ::memcpy(buffer + 3U, data, length); - len = length + 3U; - } - - m_txAX25Data.addData((unsigned char*)&len, sizeof(unsigned int)); - m_txAX25Data.addData(buffer, len); - - return true; -} - bool CModem::writeTransparentData(const unsigned char* data, unsigned int length) { assert(data != nullptr); @@ -1770,11 +1666,6 @@ bool CModem::hasPOCSAG() const return (m_capabilities2 & CAP2_POCSAG) == CAP2_POCSAG; } -bool CModem::hasAX25() const -{ - return (m_capabilities2 & CAP2_AX25) == CAP2_AX25; -} - unsigned int CModem::getVersion() const { return m_protocolVersion; @@ -1875,8 +1766,6 @@ bool CModem::readVersion() ::strcat(modeText, " FM"); if (hasPOCSAG()) ::strcat(modeText, " POCSAG"); - if (hasAX25()) - ::strcat(modeText, " AX.25"); LogInfo(modeText); return true; @@ -2082,8 +1971,6 @@ bool CModem::setConfig2() buffer[5U] = 0x00U; if (m_pocsagEnabled) buffer[5U] |= 0x01U; - if (m_ax25Enabled) - buffer[5U] |= 0x02U; buffer[6U] = m_txDelay / 10U; // In 10ms units @@ -2103,7 +1990,7 @@ bool CModem::setConfig2() buffer[17U] = 0x00U; buffer[18U] = (unsigned char)(m_pocsagTXLevel * 2.55F + 0.5F); buffer[19U] = (unsigned char)(m_fmTXLevel * 2.55F + 0.5F); - buffer[20U] = (unsigned char)(m_ax25TXLevel * 2.55F + 0.5F); + buffer[20U] = 0x00U; buffer[21U] = 0x00U; buffer[22U] = 0x00U; @@ -2117,10 +2004,10 @@ bool CModem::setConfig2() buffer[29U] = m_dmrColorCode; buffer[30U] = m_dmrDelay; - buffer[31U] = (unsigned char)(m_ax25RXTwist + 128); - buffer[32U] = m_ax25TXDelay / 10U; // In 10ms units - buffer[33U] = m_ax25SlotTime / 10U; // In 10ms units - buffer[34U] = m_ax25PPersist; + buffer[31U] = 0x00U; + buffer[32U] = 0x00U; + buffer[33U] = 0x00U; + buffer[34U] = 0x00U; buffer[35U] = 0x00U; buffer[36U] = 0x00U; diff --git a/Modem.h b/Modem.h index 082ccf9..24cd4b2 100644 --- a/Modem.h +++ b/Modem.h @@ -47,13 +47,12 @@ public: void setPort(IModemPort* port); void setRFParams(unsigned int rxFrequency, int rxOffset, unsigned int txFrequency, int txOffset, int txDCOffset, int rxDCOffset, float rfLevel, unsigned int pocsagFrequency); - void setModeParams(bool dstarEnabled, bool dmrEnabled, bool ysfEnabled, bool p25Enabled, bool nxdnEnabled, bool pocsagEnabled, bool fmEnabled, bool ax25Enabled); - void setLevels(float rxLevel, float cwIdTXLevel, float dstarTXLevel, float dmrTXLevel, float ysfTXLevel, float p25TXLevel, float nxdnTXLevel, float pocsagLevel, float fmTXLevel, float ax25TXLevel); + void setModeParams(bool dstarEnabled, bool dmrEnabled, bool ysfEnabled, bool p25Enabled, bool nxdnEnabled, bool pocsagEnabled, bool fmEnabled); + void setLevels(float rxLevel, float cwIdTXLevel, float dstarTXLevel, float dmrTXLevel, float ysfTXLevel, float p25TXLevel, float nxdnTXLevel, float pocsagLevel, float fmTXLevel); void setDMRParams(unsigned int colorCode); void setYSFParams(bool loDev, unsigned int txHang); void setP25Params(unsigned int txHang); void setNXDNParams(unsigned int txHang); - void setAX25Params(int rxTwist, unsigned int txDelay, unsigned int slotTime, unsigned int pPersist); void setTransparentDataParams(unsigned int sendFrameType); void setFMCallsignParams(const std::string& callsign, unsigned int callsignSpeed, unsigned int callsignFrequency, unsigned int callsignTime, unsigned int callsignHoldoff, float callsignHighLevel, float callsignLowLevel, bool callsignAtStart, bool callsignAtEnd, bool callsignAtLatch); @@ -70,7 +69,6 @@ public: bool hasNXDN() const; bool hasPOCSAG() const; bool hasFM() const; - bool hasAX25() const; unsigned int getVersion() const; @@ -81,7 +79,6 @@ public: unsigned int readP25Data(unsigned char* data); unsigned int readNXDNData(unsigned char* data); unsigned int readFMData(unsigned char* data); - unsigned int readAX25Data(unsigned char* data); bool hasDStarSpace() const; bool hasDMRSpace1() const; @@ -91,7 +88,6 @@ public: bool hasNXDNSpace() const; bool hasPOCSAGSpace() const; unsigned int getFMSpace() const; - bool hasAX25Space() const; bool hasTX() const; bool hasCD() const; @@ -108,7 +104,6 @@ public: bool writeNXDNData(const unsigned char* data, unsigned int length); bool writePOCSAGData(const unsigned char* data, unsigned int length); bool writeFMData(const unsigned char* data, unsigned int length); - bool writeAX25Data(const unsigned char* data, unsigned int length); bool writeDStarInfo(const char* my1, const char* my2, const char* your, const char* type, const char* reflector); bool writeDMRInfo(unsigned int slotNo, const std::string& src, bool group, const std::string& dst, const char* type); @@ -161,7 +156,6 @@ private: float m_nxdnTXLevel; float m_pocsagTXLevel; float m_fmTXLevel; - float m_ax25TXLevel; float m_rfLevel; bool m_useCOSAsLockout; bool m_trace; @@ -176,7 +170,6 @@ private: bool m_nxdnEnabled; bool m_pocsagEnabled; bool m_fmEnabled; - bool m_ax25Enabled; int m_rxDCOffset; int m_txDCOffset; IModemPort* m_port; @@ -200,8 +193,6 @@ private: CRingBuffer m_txPOCSAGData; CRingBuffer m_rxFMData; CRingBuffer m_txFMData; - CRingBuffer m_rxAX25Data; - CRingBuffer m_txAX25Data; CRingBuffer m_rxSerialData; CRingBuffer m_txSerialData; CRingBuffer m_rxTransparentData; @@ -218,17 +209,12 @@ private: unsigned int m_nxdnSpace; unsigned int m_pocsagSpace; unsigned int m_fmSpace; - unsigned int m_ax25Space; bool m_tx; bool m_cd; bool m_lockout; bool m_error; unsigned char m_mode; HW_TYPE m_hwType; - int m_ax25RXTwist; - unsigned int m_ax25TXDelay; - unsigned int m_ax25SlotTime; - unsigned int m_ax25PPersist; std::string m_fmCallsign; unsigned int m_fmCallsignSpeed; diff --git a/RemoteControl.cpp b/RemoteControl.cpp index 478375d..6eaf2c3 100644 --- a/RemoteControl.cpp +++ b/RemoteControl.cpp @@ -117,8 +117,6 @@ REMOTE_COMMAND CRemoteControl::getCommand() m_command = REMOTE_COMMAND::ENABLE_NXDN; else if (m_args.at(1U) == "fm") m_command = REMOTE_COMMAND::ENABLE_FM; - else if (m_args.at(1U) == "ax25") - m_command = REMOTE_COMMAND::ENABLE_AX25; else replyStr = "KO"; } else if (m_args.at(0U) == "disable" && m_args.size() >= DISABLE_ARGS) { @@ -134,8 +132,6 @@ REMOTE_COMMAND CRemoteControl::getCommand() m_command = REMOTE_COMMAND::DISABLE_NXDN; else if (m_args.at(1U) == "fm") m_command = REMOTE_COMMAND::DISABLE_FM; - else if (m_args.at(1U) == "ax25") - m_command = REMOTE_COMMAND::DISABLE_AX25; else replyStr = "KO"; } else if (m_args.at(0U) == "page" && m_args.size() >= PAGE_ARGS) { diff --git a/RemoteControl.h b/RemoteControl.h index 675a58c..edf6e01 100644 --- a/RemoteControl.h +++ b/RemoteControl.h @@ -42,14 +42,12 @@ enum class REMOTE_COMMAND { ENABLE_P25, ENABLE_NXDN, ENABLE_FM, - ENABLE_AX25, DISABLE_DSTAR, DISABLE_DMR, DISABLE_YSF, DISABLE_P25, DISABLE_NXDN, DISABLE_FM, - DISABLE_AX25, PAGE, PAGE_BCD, PAGE_A1, diff --git a/Version.h b/Version.h index d589832..e6314a6 100644 --- a/Version.h +++ b/Version.h @@ -19,6 +19,6 @@ #if !defined(VERSION_H) #define VERSION_H -const char* VERSION = "20250709"; +const char* VERSION = "20250826"; #endif From 7adccd212394a1267cc0448a497da66a42083f2d Mon Sep 17 00:00:00 2001 From: Jonathan Naylor Date: Tue, 26 Aug 2025 15:18:19 +0100 Subject: [PATCH 09/11] Remove the last vestage of AX.25 from the code. --- Modem.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modem.cpp b/Modem.cpp index d182f52..b067cd9 100644 --- a/Modem.cpp +++ b/Modem.cpp @@ -749,7 +749,7 @@ void CModem::clock(unsigned int ms) } m_inactivityTimer.start(); - // LogMessage("status=%02X, tx=%d, space=%u,%u,%u,%u,%u,%u,%u,%u,%u lockout=%d, cd=%d", m_buffer[m_offset + 2U], int(m_tx), m_dstarSpace, m_dmrSpace1, m_dmrSpace2, m_ysfSpace, m_p25Space, m_nxdnSpace, m_pocsagSpace, m_fmSpace, m_ax25Space, int(m_lockout), int(m_cd)); + // LogMessage("status=%02X, tx=%d, space=%u,%u,%u,%u,%u,%u,%u,%u lockout=%d, cd=%d", m_buffer[m_offset + 2U], int(m_tx), m_dstarSpace, m_dmrSpace1, m_dmrSpace2, m_ysfSpace, m_p25Space, m_nxdnSpace, m_pocsagSpace, m_fmSpace, int(m_lockout), int(m_cd)); break; case MMDVM_TRANSPARENT: { From bd6b3d58ca5a4cf6fca8d4f416ac8d841930bf6b Mon Sep 17 00:00:00 2001 From: Jonathan Naylor Date: Tue, 26 Aug 2025 17:08:55 +0100 Subject: [PATCH 10/11] Update README.md --- README.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 2b0b45d..03f25d6 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ These are the source files for building the MMDVMHost, the program that interfaces to the MMDVM or DVMega on the one side, and a suitable network on the other. It supports D-Star, DMR, P25 Phase 1, NXDN, System Fusion, -POCSAG, FM, and AX.25 on the MMDVM, and D-Star, DMR, and System Fusion on the DVMega. +POCSAG, and FM on the MMDVM, and D-Star, DMR, and System Fusion on the DVMega. On the D-Star side the MMDVMHost interfaces with the ircDDB Gateway, on DMR it connects to the DMR Gateway to allow for connection to multiple DMR networks, @@ -9,8 +9,7 @@ or a single network directly. on System Fusion it connects to the YSF Gateway to access to the FCS and YSF networks. On P25 it connects to the P25 Gateway. On NXDN it connects to the NXDN Gateway which provides access to the NXDN and NXCore talk groups. It uses the DAPNET Gateway to access DAPNET to receive -paging messages. Finally it uses the FM Gateway to interface to existing FM -networks. +paging messages. It builds on 32-bit and 64-bit Linux as well as on Windows using Visual Studio 2019 on x86 and x64. It can optionally control various Displays. Currently From 010c1249eefc1e9c23142b3dd00e74b7f5863a60 Mon Sep 17 00:00:00 2001 From: Jonathan Naylor Date: Tue, 26 Aug 2025 17:16:00 +0100 Subject: [PATCH 11/11] Update to VS2022. --- MMDVMHost.vcxproj | 8 ++++---- README.md | 2 +- RemoteCommand.vcxproj | 8 ++++---- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/MMDVMHost.vcxproj b/MMDVMHost.vcxproj index 7e8a4fb..27c0ff8 100644 --- a/MMDVMHost.vcxproj +++ b/MMDVMHost.vcxproj @@ -28,26 +28,26 @@ Application true - v142 + v143 Unicode Application false - v142 + v143 true Unicode Application true - v142 + v143 Unicode Application false - v142 + v143 true Unicode diff --git a/README.md b/README.md index 03f25d6..6d0c4be 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ NXCore talk groups. It uses the DAPNET Gateway to access DAPNET to receive paging messages. It builds on 32-bit and 64-bit Linux as well as on Windows using Visual Studio -2019 on x86 and x64. It can optionally control various Displays. Currently +2022 on x86 and x64. It can optionally control various Displays. Currently these are: - HD44780 (sizes 2x16, 2x40, 4x16, 4x20) diff --git a/RemoteCommand.vcxproj b/RemoteCommand.vcxproj index e4bbb73..8c70dd2 100644 --- a/RemoteCommand.vcxproj +++ b/RemoteCommand.vcxproj @@ -29,26 +29,26 @@ Application true - v142 + v143 Unicode Application false - v142 + v143 true Unicode Application true - v142 + v143 Unicode Application false - v142 + v143 true Unicode