Change all of the enums to the modern format.

This commit is contained in:
Jonathan Naylor 2025-03-13 18:16:33 +00:00
parent 78fc96b0a5
commit 43f8b2f6f0
50 changed files with 1085 additions and 1064 deletions

238
Conf.cpp
View file

@ -1,5 +1,5 @@
/*
* Copyright (C) 2015-2023 by Jonathan Naylor G4KLX
* Copyright (C) 2015-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
@ -27,41 +27,41 @@
const int BUFFER_SIZE = 500;
enum SECTION {
SECTION_NONE,
SECTION_GENERAL,
SECTION_INFO,
SECTION_LOG,
SECTION_CWID,
SECTION_DMRID_LOOKUP,
SECTION_NXDNID_LOOKUP,
SECTION_MODEM,
SECTION_TRANSPARENT,
SECTION_DSTAR,
SECTION_DMR,
SECTION_FUSION,
SECTION_P25,
SECTION_NXDN,
SECTION_M17,
SECTION_POCSAG,
SECTION_FM,
SECTION_AX25,
SECTION_DSTAR_NETWORK,
SECTION_DMR_NETWORK,
SECTION_FUSION_NETWORK,
SECTION_P25_NETWORK,
SECTION_NXDN_NETWORK,
SECTION_M17_NETWORK,
SECTION_POCSAG_NETWORK,
SECTION_FM_NETWORK,
SECTION_AX25_NETWORK,
SECTION_TFTSERIAL,
SECTION_HD44780,
SECTION_NEXTION,
SECTION_OLED,
SECTION_LCDPROC,
SECTION_LOCK_FILE,
SECTION_REMOTE_CONTROL
enum class SECTION {
NONE,
GENERAL,
INFO,
LOG,
CWID,
DMRID_LOOKUP,
NXDNID_LOOKUP,
MODEM,
TRANSPARENT,
DSTAR,
DMR,
FUSION,
P25,
NXDN,
M17,
POCSAG,
FM,
AX25,
DSTAR_NETWORK,
DMR_NETWORK,
FUSION_NETWORK,
P25_NETWORK,
NXDN_NETWORK,
M17_NETWORK,
POCSAG_NETWORK,
FM_NETWORK,
AX25_NETWORK,
TFTSERIAL,
HD44780,
NEXTION,
OLED,
LCDPROC,
LOCK_FILE,
REMOTE_CONTROL
};
CConf::CConf(const std::string& file) :
@ -139,12 +139,12 @@ m_dstarBlackList(),
m_dstarWhiteList(),
m_dstarAckReply(true),
m_dstarAckTime(750U),
m_dstarAckMessage(DSTAR_ACK_BER),
m_dstarAckMessage(DSTAR_ACK::BER),
m_dstarErrorReply(true),
m_dstarRemoteGateway(false),
m_dstarModeHang(10U),
m_dmrEnabled(false),
m_dmrBeacons(DMR_BEACONS_OFF),
m_dmrBeacons(DMR_BEACONS::OFF),
m_dmrBeaconInterval(60U),
m_dmrBeaconDuration(3U),
m_dmrId(0U),
@ -160,7 +160,7 @@ m_dmrSlot2TGWhiteList(),
m_dmrCallHang(10U),
m_dmrTXHang(4U),
m_dmrModeHang(10U),
m_dmrOVCM(DMR_OVCM_OFF),
m_dmrOVCM(DMR_OVCM::OFF),
m_dmrProtect(false),
m_fusionEnabled(false),
m_fusionLowDeviation(false),
@ -361,7 +361,7 @@ bool CConf::read()
return false;
}
SECTION section = SECTION_NONE;
SECTION section = SECTION::NONE;
char buffer[BUFFER_SIZE];
while (::fgets(buffer, BUFFER_SIZE, fp) != NULL) {
@ -370,73 +370,73 @@ bool CConf::read()
if (buffer[0U] == '[') {
if (::strncmp(buffer, "[General]", 9U) == 0)
section = SECTION_GENERAL;
section = SECTION::GENERAL;
else if (::strncmp(buffer, "[Info]", 6U) == 0)
section = SECTION_INFO;
section = SECTION::INFO;
else if (::strncmp(buffer, "[Log]", 5U) == 0)
section = SECTION_LOG;
section = SECTION::LOG;
else if (::strncmp(buffer, "[CW Id]", 7U) == 0)
section = SECTION_CWID;
section = SECTION::CWID;
else if (::strncmp(buffer, "[DMR Id Lookup]", 15U) == 0)
section = SECTION_DMRID_LOOKUP;
section = SECTION::DMRID_LOOKUP;
else if (::strncmp(buffer, "[NXDN Id Lookup]", 16U) == 0)
section = SECTION_NXDNID_LOOKUP;
section = SECTION::NXDNID_LOOKUP;
else if (::strncmp(buffer, "[Modem]", 7U) == 0)
section = SECTION_MODEM;
section = SECTION::MODEM;
else if (::strncmp(buffer, "[Transparent Data]", 18U) == 0)
section = SECTION_TRANSPARENT;
section = SECTION::TRANSPARENT;
else if (::strncmp(buffer, "[D-Star]", 8U) == 0)
section = SECTION_DSTAR;
section = SECTION::DSTAR;
else if (::strncmp(buffer, "[DMR]", 5U) == 0)
section = SECTION_DMR;
section = SECTION::DMR;
else if (::strncmp(buffer, "[System Fusion]", 15U) == 0)
section = SECTION_FUSION;
section = SECTION::FUSION;
else if (::strncmp(buffer, "[P25]", 5U) == 0)
section = SECTION_P25;
section = SECTION::P25;
else if (::strncmp(buffer, "[NXDN]", 6U) == 0)
section = SECTION_NXDN;
section = SECTION::NXDN;
else if (::strncmp(buffer, "[M17]", 5U) == 0)
section = SECTION_M17;
section = SECTION::M17;
else if (::strncmp(buffer, "[POCSAG]", 8U) == 0)
section = SECTION_POCSAG;
section = SECTION::POCSAG;
else if (::strncmp(buffer, "[FM]", 4U) == 0)
section = SECTION_FM;
section = SECTION::FM;
else if (::strncmp(buffer, "[AX.25]", 7U) == 0)
section = SECTION_AX25;
section = SECTION::AX25;
else if (::strncmp(buffer, "[D-Star Network]", 16U) == 0)
section = SECTION_DSTAR_NETWORK;
section = SECTION::DSTAR_NETWORK;
else if (::strncmp(buffer, "[DMR Network]", 13U) == 0)
section = SECTION_DMR_NETWORK;
section = SECTION::DMR_NETWORK;
else if (::strncmp(buffer, "[System Fusion Network]", 23U) == 0)
section = SECTION_FUSION_NETWORK;
section = SECTION::FUSION_NETWORK;
else if (::strncmp(buffer, "[P25 Network]", 13U) == 0)
section = SECTION_P25_NETWORK;
section = SECTION::P25_NETWORK;
else if (::strncmp(buffer, "[NXDN Network]", 14U) == 0)
section = SECTION_NXDN_NETWORK;
section = SECTION::NXDN_NETWORK;
else if (::strncmp(buffer, "[M17 Network]", 13U) == 0)
section = SECTION_M17_NETWORK;
section = SECTION::M17_NETWORK;
else if (::strncmp(buffer, "[POCSAG Network]", 16U) == 0)
section = SECTION_POCSAG_NETWORK;
section = SECTION::POCSAG_NETWORK;
else if (::strncmp(buffer, "[FM Network]", 12U) == 0)
section = SECTION_FM_NETWORK;
section = SECTION::FM_NETWORK;
else if (::strncmp(buffer, "[AX.25 Network]", 15U) == 0)
section = SECTION_AX25_NETWORK;
section = SECTION::AX25_NETWORK;
else if (::strncmp(buffer, "[TFT Serial]", 12U) == 0)
section = SECTION_TFTSERIAL;
section = SECTION::TFTSERIAL;
else if (::strncmp(buffer, "[HD44780]", 9U) == 0)
section = SECTION_HD44780;
section = SECTION::HD44780;
else if (::strncmp(buffer, "[Nextion]", 9U) == 0)
section = SECTION_NEXTION;
section = SECTION::NEXTION;
else if (::strncmp(buffer, "[OLED]", 6U) == 0)
section = SECTION_OLED;
section = SECTION::OLED;
else if (::strncmp(buffer, "[LCDproc]", 9U) == 0)
section = SECTION_LCDPROC;
section = SECTION::LCDPROC;
else if (::strncmp(buffer, "[Lock File]", 11U) == 0)
section = SECTION_LOCK_FILE;
section = SECTION::LOCK_FILE;
else if (::strncmp(buffer, "[Remote Control]", 16U) == 0)
section = SECTION_REMOTE_CONTROL;
section = SECTION::REMOTE_CONTROL;
else
section = SECTION_NONE;
section = SECTION::NONE;
continue;
}
@ -466,7 +466,7 @@ bool CConf::read()
*p = '\0';
}
if (section == SECTION_GENERAL) {
if (section == SECTION::GENERAL) {
if (::strcmp(key, "Callsign") == 0) {
// Convert the callsign to upper case
for (unsigned int i = 0U; value[i] != 0; i++)
@ -489,7 +489,7 @@ bool CConf::read()
m_display = value;
else if (::strcmp(key, "Daemon") == 0)
m_daemon = ::atoi(value) == 1;
} else if (section == SECTION_INFO) {
} else if (section == SECTION::INFO) {
if (::strcmp(key, "TXFrequency") == 0)
m_pocsagFrequency = m_txFrequency = (unsigned int)::atoi(value);
else if (::strcmp(key, "RXFrequency") == 0)
@ -508,7 +508,7 @@ bool CConf::read()
m_description = value;
else if (::strcmp(key, "URL") == 0)
m_url = value;
} else if (section == SECTION_LOG) {
} else if (section == SECTION::LOG) {
if (::strcmp(key, "FilePath") == 0)
m_logFilePath = value;
else if (::strcmp(key, "FileRoot") == 0)
@ -519,7 +519,7 @@ bool CConf::read()
m_logDisplayLevel = (unsigned int)::atoi(value);
else if (::strcmp(key, "FileRotate") == 0)
m_logFileRotate = ::atoi(value) == 1;
} else if (section == SECTION_CWID) {
} else if (section == SECTION::CWID) {
if (::strcmp(key, "Enable") == 0)
m_cwIdEnabled = ::atoi(value) == 1;
else if (::strcmp(key, "Time") == 0)
@ -530,17 +530,17 @@ bool CConf::read()
value[i] = ::toupper(value[i]);
m_cwIdCallsign = value;
}
} else if (section == SECTION_DMRID_LOOKUP) {
} else if (section == SECTION::DMRID_LOOKUP) {
if (::strcmp(key, "File") == 0)
m_dmrIdLookupFile = value;
else if (::strcmp(key, "Time") == 0)
m_dmrIdLookupTime = (unsigned int)::atoi(value);
} else if (section == SECTION_NXDNID_LOOKUP) {
} else if (section == SECTION::NXDNID_LOOKUP) {
if (::strcmp(key, "File") == 0)
m_nxdnIdLookupFile = value;
else if (::strcmp(key, "Time") == 0)
m_nxdnIdLookupTime = (unsigned int)::atoi(value);
} else if (section == SECTION_MODEM) {
} else if (section == SECTION::MODEM) {
if (::strcmp(key, "Protocol") == 0)
m_modemProtocol = value;
else if (::strcmp(key, "UARTPort") == 0)
@ -611,7 +611,7 @@ bool CConf::read()
m_modemTrace = ::atoi(value) == 1;
else if (::strcmp(key, "Debug") == 0)
m_modemDebug = ::atoi(value) == 1;
} else if (section == SECTION_TRANSPARENT) {
} else if (section == SECTION::TRANSPARENT) {
if (::strcmp(key, "Enable") == 0)
m_transparentEnabled = ::atoi(value) == 1;
else if (::strcmp(key, "RemoteAddress") == 0)
@ -622,7 +622,7 @@ bool CConf::read()
m_transparentLocalPort = (unsigned short)::atoi(value);
else if (::strcmp(key, "SendFrameType") == 0)
m_transparentSendFrameType = (unsigned int)::atoi(value);
} else if (section == SECTION_DSTAR) {
} else if (section == SECTION::DSTAR) {
if (::strcmp(key, "Enable") == 0)
m_dstarEnabled = ::atoi(value) == 1;
else if (::strcmp(key, "Module") == 0) {
@ -661,22 +661,22 @@ bool CConf::read()
else if (::strcmp(key, "AckTime") == 0)
m_dstarAckTime = (unsigned int)::atoi(value);
else if (::strcmp(key, "AckMessage") == 0) {
m_dstarAckMessage = (DSTAR_ACK_MESSAGE)::atoi(value);
if (m_dstarAckMessage != DSTAR_ACK_BER && m_dstarAckMessage != DSTAR_ACK_RSSI && m_dstarAckMessage != DSTAR_ACK_SMETER)
m_dstarAckMessage = DSTAR_ACK_BER;
m_dstarAckMessage = DSTAR_ACK(::atoi(value));
if ((m_dstarAckMessage != DSTAR_ACK::BER) && (m_dstarAckMessage != DSTAR_ACK::RSSI) && (m_dstarAckMessage != DSTAR_ACK::SMETER))
m_dstarAckMessage = DSTAR_ACK::BER;
} else if (::strcmp(key, "ErrorReply") == 0)
m_dstarErrorReply = ::atoi(value) == 1;
else if (::strcmp(key, "RemoteGateway") == 0)
m_dstarRemoteGateway = ::atoi(value) == 1;
else if (::strcmp(key, "ModeHang") == 0)
m_dstarModeHang = (unsigned int)::atoi(value);
} else if (section == SECTION_DMR) {
} else if (section == SECTION::DMR) {
if (::strcmp(key, "Enable") == 0)
m_dmrEnabled = ::atoi(value) == 1;
else if (::strcmp(key, "Beacons") == 0)
m_dmrBeacons = ::atoi(value) == 1 ? DMR_BEACONS_NETWORK : DMR_BEACONS_OFF;
m_dmrBeacons = ::atoi(value) == 1 ? DMR_BEACONS::NETWORK : DMR_BEACONS::OFF;
else if (::strcmp(key, "BeaconInterval") == 0) {
m_dmrBeacons = m_dmrBeacons != DMR_BEACONS_OFF ? DMR_BEACONS_TIMED : DMR_BEACONS_OFF;
m_dmrBeacons = m_dmrBeacons != DMR_BEACONS::OFF ? DMR_BEACONS::TIMED : DMR_BEACONS::OFF;
m_dmrBeaconInterval = (unsigned int)::atoi(value);
} else if (::strcmp(key, "BeaconDuration") == 0)
m_dmrBeaconDuration = (unsigned int)::atoi(value);
@ -739,24 +739,24 @@ bool CConf::read()
else if (::strcmp(key, "OVCM") == 0) {
switch (::atoi(value)) {
case 1:
m_dmrOVCM = DMR_OVCM_RX_ON;
m_dmrOVCM = DMR_OVCM::RX_ON;
break;
case 2:
m_dmrOVCM = DMR_OVCM_TX_ON;
m_dmrOVCM = DMR_OVCM::TX_ON;
break;
case 3:
m_dmrOVCM = DMR_OVCM_ON;
m_dmrOVCM = DMR_OVCM::ON;
break;
case 4:
m_dmrOVCM = DMR_OVCM_FORCE_OFF;
m_dmrOVCM = DMR_OVCM::FORCE_OFF;
break;
default:
m_dmrOVCM = DMR_OVCM_OFF;
m_dmrOVCM = DMR_OVCM::OFF;
break;
}
} else if (::strcmp(key, "Protect") == 0)
m_dmrProtect = ::atoi(value) == 1;
} else if (section == SECTION_FUSION) {
} else if (section == SECTION::FUSION) {
if (::strcmp(key, "Enable") == 0)
m_fusionEnabled = ::atoi(value) == 1;
else if (::strcmp(key, "LowDeviation") == 0)
@ -769,7 +769,7 @@ bool CConf::read()
m_fusionTXHang = (unsigned int)::atoi(value);
else if (::strcmp(key, "ModeHang") == 0)
m_fusionModeHang = (unsigned int)::atoi(value);
} else if (section == SECTION_P25) {
} else if (section == SECTION::P25) {
if (::strcmp(key, "Enable") == 0)
m_p25Enabled = ::atoi(value) == 1;
else if (::strcmp(key, "Id") == 0)
@ -786,7 +786,7 @@ bool CConf::read()
m_p25TXHang = (unsigned int)::atoi(value);
else if (::strcmp(key, "ModeHang") == 0)
m_p25ModeHang = (unsigned int)::atoi(value);
} else if (section == SECTION_NXDN) {
} else if (section == SECTION::NXDN) {
if (::strcmp(key, "Enable") == 0)
m_nxdnEnabled = ::atoi(value) == 1;
else if (::strcmp(key, "Id") == 0)
@ -801,7 +801,7 @@ 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) {
} else if (section == SECTION::M17) {
if (::strcmp(key, "Enable") == 0)
m_m17Enabled = ::atoi(value) == 1;
else if (::strcmp(key, "CAN") == 0)
@ -814,12 +814,12 @@ bool CConf::read()
m_m17TXHang = (unsigned int)::atoi(value);
else if (::strcmp(key, "ModeHang") == 0)
m_m17ModeHang = (unsigned int)::atoi(value);
} else if (section == SECTION_POCSAG) {
} else if (section == SECTION::POCSAG) {
if (::strcmp(key, "Enable") == 0)
m_pocsagEnabled = ::atoi(value) == 1;
else if (::strcmp(key, "Frequency") == 0)
m_pocsagFrequency = (unsigned int)::atoi(value);
} else if (section == SECTION_FM) {
} else if (section == SECTION::FM) {
if (::strcmp(key, "Enable") == 0)
m_fmEnabled = ::atoi(value) == 1;
else if (::strcmp(key, "Callsign") == 0) {
@ -905,7 +905,7 @@ 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) {
} else if (section == SECTION::AX25) {
if (::strcmp(key, "Enable") == 0)
m_ax25Enabled = ::atoi(value) == 1;
else if (::strcmp(key, "TXDelay") == 0)
@ -918,7 +918,7 @@ bool CConf::read()
m_ax25PPersist = (unsigned int)::atoi(value);
else if (::strcmp(key, "Trace") == 0)
m_ax25Trace = ::atoi(value) == 1;
} else if (section == SECTION_DSTAR_NETWORK) {
} else if (section == SECTION::DSTAR_NETWORK) {
if (::strcmp(key, "Enable") == 0)
m_dstarNetworkEnabled = ::atoi(value) == 1;
else if (::strcmp(key, "GatewayAddress") == 0)
@ -933,7 +933,7 @@ bool CConf::read()
m_dstarNetworkModeHang = (unsigned int)::atoi(value);
else if (::strcmp(key, "Debug") == 0)
m_dstarNetworkDebug = ::atoi(value) == 1;
} else if (section == SECTION_DMR_NETWORK) {
} else if (section == SECTION::DMR_NETWORK) {
if (::strcmp(key, "Enable") == 0)
m_dmrNetworkEnabled = ::atoi(value) == 1;
else if (::strcmp(key, "Type") == 0)
@ -960,7 +960,7 @@ bool CConf::read()
m_dmrNetworkSlot2 = ::atoi(value) == 1;
else if (::strcmp(key, "ModeHang") == 0)
m_dmrNetworkModeHang = (unsigned int)::atoi(value);
} else if (section == SECTION_FUSION_NETWORK) {
} else if (section == SECTION::FUSION_NETWORK) {
if (::strcmp(key, "Enable") == 0)
m_fusionNetworkEnabled = ::atoi(value) == 1;
else if (::strcmp(key, "LocalAddress") == 0)
@ -975,7 +975,7 @@ bool CConf::read()
m_fusionNetworkModeHang = (unsigned int)::atoi(value);
else if (::strcmp(key, "Debug") == 0)
m_fusionNetworkDebug = ::atoi(value) == 1;
} else if (section == SECTION_P25_NETWORK) {
} else if (section == SECTION::P25_NETWORK) {
if (::strcmp(key, "Enable") == 0)
m_p25NetworkEnabled = ::atoi(value) == 1;
else if (::strcmp(key, "GatewayAddress") == 0)
@ -990,7 +990,7 @@ bool CConf::read()
m_p25NetworkModeHang = (unsigned int)::atoi(value);
else if (::strcmp(key, "Debug") == 0)
m_p25NetworkDebug = ::atoi(value) == 1;
} else if (section == SECTION_NXDN_NETWORK) {
} else if (section == SECTION::NXDN_NETWORK) {
if (::strcmp(key, "Enable") == 0)
m_nxdnNetworkEnabled = ::atoi(value) == 1;
else if (::strcmp(key, "LocalAddress") == 0)
@ -1005,7 +1005,7 @@ 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) {
} else if (section == SECTION::M17_NETWORK) {
if (::strcmp(key, "Enable") == 0)
m_m17NetworkEnabled = ::atoi(value) == 1;
else if (::strcmp(key, "LocalAddress") == 0)
@ -1020,7 +1020,7 @@ bool CConf::read()
m_m17NetworkModeHang = (unsigned int)::atoi(value);
else if (::strcmp(key, "Debug") == 0)
m_m17NetworkDebug = ::atoi(value) == 1;
} else if (section == SECTION_POCSAG_NETWORK) {
} else if (section == SECTION::POCSAG_NETWORK) {
if (::strcmp(key, "Enable") == 0)
m_pocsagNetworkEnabled = ::atoi(value) == 1;
else if (::strcmp(key, "LocalAddress") == 0)
@ -1035,7 +1035,7 @@ bool CConf::read()
m_pocsagNetworkModeHang = (unsigned int)::atoi(value);
else if (::strcmp(key, "Debug") == 0)
m_pocsagNetworkDebug = ::atoi(value) == 1;
} else if (section == SECTION_FM_NETWORK) {
} else if (section == SECTION::FM_NETWORK) {
if (::strcmp(key, "Enable") == 0)
m_fmNetworkEnabled = ::atoi(value) == 1;
else if (::strcmp(key, "Protocol") == 0)
@ -1064,7 +1064,7 @@ 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) {
} else if (section == SECTION::AX25_NETWORK) {
if (::strcmp(key, "Enable") == 0)
m_ax25NetworkEnabled = ::atoi(value) == 1;
else if (::strcmp(key, "Port") == 0)
@ -1073,14 +1073,14 @@ bool CConf::read()
m_ax25NetworkSpeed = (unsigned int)::atoi(value);
else if (::strcmp(key, "Debug") == 0)
m_ax25NetworkDebug = ::atoi(value) == 1;
} else if (section == SECTION_TFTSERIAL) {
} else if (section == SECTION::TFTSERIAL) {
if (::strcmp(key, "Port") == 0)
m_tftSerialPort = value;
else if (::strcmp(key, "Brightness") == 0)
m_tftSerialBrightness = (unsigned int)::atoi(value);
else if (::strcmp(key, "ScreenLayout") == 0)
m_tftSerialScreenLayout = (unsigned int)::atoi(value);
} else if (section == SECTION_HD44780) {
} else if (section == SECTION::HD44780) {
if (::strcmp(key, "Rows") == 0)
m_hd44780Rows = (unsigned int)::atoi(value);
else if (::strcmp(key, "Columns") == 0)
@ -1107,7 +1107,7 @@ bool CConf::read()
p = ::strtok(NULL, ",\r\n");
}
}
} else if (section == SECTION_NEXTION) {
} else if (section == SECTION::NEXTION) {
if (::strcmp(key, "Port") == 0)
m_nextionPort = value;
else if (::strcmp(key, "Brightness") == 0)
@ -1126,7 +1126,7 @@ bool CConf::read()
m_nextionOutput = ::atoi(value) == 1;
else if (::strcmp(key, "NextionUDPPort") == 0)
m_nextionUDPPort = (unsigned short)::atoi(value);
} else if (section == SECTION_OLED) {
} else if (section == SECTION::OLED) {
if (::strcmp(key, "Type") == 0)
m_oledType = (unsigned char)::atoi(value);
else if (::strcmp(key, "Brightness") == 0)
@ -1139,7 +1139,7 @@ bool CConf::read()
m_oledRotate = ::atoi(value) == 1;
else if (::strcmp(key, "LogoScreensaver") == 0)
m_oledLogoScreensaver = ::atoi(value) == 1;
} else if (section == SECTION_LCDPROC) {
} else if (section == SECTION::LCDPROC) {
if (::strcmp(key, "Address") == 0)
m_lcdprocAddress = value;
else if (::strcmp(key, "Port") == 0)
@ -1152,12 +1152,12 @@ bool CConf::read()
m_lcdprocUTC = ::atoi(value) == 1;
else if (::strcmp(key, "DimOnIdle") == 0)
m_lcdprocDimOnIdle = ::atoi(value) == 1;
} else if (section == SECTION_LOCK_FILE) {
} else if (section == SECTION::LOCK_FILE) {
if (::strcmp(key, "Enable") == 0)
m_lockFileEnabled = ::atoi(value) == 1;
else if (::strcmp(key, "File") == 0)
m_lockFileName = value;
} else if (section == SECTION_REMOTE_CONTROL) {
} else if (section == SECTION::REMOTE_CONTROL) {
if (::strcmp(key, "Enable") == 0)
m_remoteControlEnabled = ::atoi(value) == 1;
else if (::strcmp(key, "Port") == 0)
@ -1535,7 +1535,7 @@ unsigned int CConf::getDStarAckTime() const
return m_dstarAckTime;
}
DSTAR_ACK_MESSAGE CConf::getDStarAckMessage() const
DSTAR_ACK CConf::getDStarAckMessage() const
{
return m_dstarAckMessage;
}
@ -1640,7 +1640,7 @@ unsigned int CConf::getDMRModeHang() const
return m_dmrModeHang;
}
DMR_OVCM_TYPES CConf::getDMROVCM() const
DMR_OVCM CConf::getDMROVCM() const
{
return m_dmrOVCM;
}

10
Conf.h
View file

@ -1,5 +1,5 @@
/*
* Copyright (C) 2015-2023 by Jonathan Naylor G4KLX
* Copyright (C) 2015-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
@ -120,7 +120,7 @@ public:
std::vector<std::string> getDStarWhiteList() const;
bool getDStarAckReply() const;
unsigned int getDStarAckTime() const;
DSTAR_ACK_MESSAGE getDStarAckMessage() const;
DSTAR_ACK getDStarAckMessage() const;
bool getDStarErrorReply() const;
bool getDStarRemoteGateway() const;
unsigned int getDStarModeHang() const;
@ -143,7 +143,7 @@ public:
unsigned int getDMRCallHang() const;
unsigned int getDMRTXHang() const;
unsigned int getDMRModeHang() const;
DMR_OVCM_TYPES getDMROVCM() const;
DMR_OVCM getDMROVCM() const;
bool getDMRProtect() const;
// The System Fusion section
@ -459,7 +459,7 @@ private:
std::vector<std::string> m_dstarWhiteList;
bool m_dstarAckReply;
unsigned int m_dstarAckTime;
DSTAR_ACK_MESSAGE m_dstarAckMessage;
DSTAR_ACK m_dstarAckMessage;
bool m_dstarErrorReply;
bool m_dstarRemoteGateway;
unsigned int m_dstarModeHang;
@ -481,7 +481,7 @@ private:
unsigned int m_dmrCallHang;
unsigned int m_dmrTXHang;
unsigned int m_dmrModeHang;
DMR_OVCM_TYPES m_dmrOVCM;
DMR_OVCM m_dmrOVCM;
bool m_dmrProtect;
bool m_fusionEnabled;

View file

@ -1,5 +1,5 @@
/*
* Copyright (C) 2015,2016,2020,2021,2022 by Jonathan Naylor G4KLX
* Copyright (C) 2015,2016,2020,2021,2022,2025 by Jonathan Naylor G4KLX
* Copyright (C) 2019 by Patrick Maier DK5MP
*
* This program is free software; you can redistribute it and/or modify
@ -27,7 +27,7 @@
CDMRCSBK::CDMRCSBK() :
m_data(NULL),
m_CSBKO(CSBKO_NONE),
m_CSBKO(CSBKO::NONE),
m_FID(0x00U),
m_GI(false),
m_bsId(0U),
@ -67,7 +67,7 @@ bool CDMRCSBK::put(const unsigned char* bytes)
m_FID = m_data[1U];
switch (m_CSBKO) {
case CSBKO_BSDWNACT:
case CSBKO::BSDWNACT:
m_GI = false;
m_bsId = m_data[4U] << 16 | m_data[5U] << 8 | m_data[6U];
m_srcId = m_data[7U] << 16 | m_data[8U] << 8 | m_data[9U];
@ -76,7 +76,7 @@ bool CDMRCSBK::put(const unsigned char* bytes)
CUtils::dump(1U, "Downlink Activate CSBK", m_data, 12U);
break;
case CSBKO_UUVREQ:
case CSBKO::UUVREQ:
m_GI = false;
m_dstId = m_data[4U] << 16 | m_data[5U] << 8 | m_data[6U];
m_srcId = m_data[7U] << 16 | m_data[8U] << 8 | m_data[9U];
@ -86,7 +86,7 @@ bool CDMRCSBK::put(const unsigned char* bytes)
CUtils::dump(1U, "Unit to Unit Service Request CSBK", m_data, 12U);
break;
case CSBKO_UUANSRSP:
case CSBKO::UUANSRSP:
m_GI = false;
m_dstId = m_data[4U] << 16 | m_data[5U] << 8 | m_data[6U];
m_srcId = m_data[7U] << 16 | m_data[8U] << 8 | m_data[9U];
@ -96,7 +96,7 @@ bool CDMRCSBK::put(const unsigned char* bytes)
CUtils::dump(1U, "Unit to Unit Service Answer Response CSBK", m_data, 12U);
break;
case CSBKO_PRECCSBK:
case CSBKO::PRECCSBK:
m_GI = (m_data[2U] & 0x40U) == 0x40U;
m_dstId = m_data[4U] << 16 | m_data[5U] << 8 | m_data[6U];
m_srcId = m_data[7U] << 16 | m_data[8U] << 8 | m_data[9U];
@ -105,7 +105,7 @@ bool CDMRCSBK::put(const unsigned char* bytes)
CUtils::dump(1U, "Preamble CSBK", m_data, 12U);
break;
case CSBKO_NACKRSP:
case CSBKO::NACKRSP:
m_GI = false;
m_srcId = m_data[4U] << 16 | m_data[5U] << 8 | m_data[6U];
m_dstId = m_data[7U] << 16 | m_data[8U] << 8 | m_data[9U];
@ -114,7 +114,7 @@ bool CDMRCSBK::put(const unsigned char* bytes)
CUtils::dump(1U, "Negative Acknowledge Response CSBK", m_data, 12U);
break;
case CSBKO_CALL_ALERT:
case CSBKO::CALL_ALERT:
m_GI = false;
m_dstId = m_data[4U] << 16 | m_data[5U] << 8 | m_data[6U];
m_srcId = m_data[7U] << 16 | m_data[8U] << 8 | m_data[9U];
@ -123,7 +123,7 @@ bool CDMRCSBK::put(const unsigned char* bytes)
CUtils::dump(1U, "Call Alert CSBK", m_data, 12U);
break;
case CSBKO_CALL_ALERT_ACK:
case CSBKO::CALL_ALERT_ACK:
m_GI = false;
m_dstId = m_data[4U] << 16 | m_data[5U] << 8 | m_data[6U];
m_srcId = m_data[7U] << 16 | m_data[8U] << 8 | m_data[9U];
@ -132,7 +132,7 @@ bool CDMRCSBK::put(const unsigned char* bytes)
CUtils::dump(1U, "Call Alert Ack CSBK", m_data, 12U);
break;
case CSBKO_RADIO_CHECK:
case CSBKO::RADIO_CHECK:
m_GI = false;
if (m_data[3U] == 0x80) {
m_dstId = m_data[4U] << 16 | m_data[5U] << 8 | m_data[6U];
@ -147,7 +147,7 @@ bool CDMRCSBK::put(const unsigned char* bytes)
m_CBF = 0U;
break;
case CSBKO_CALL_EMERGENCY:
case CSBKO::CALL_EMERGENCY:
m_GI = true;
m_dstId = m_data[4U] << 16 | m_data[5U] << 8 | m_data[6U];
m_srcId = m_data[7U] << 16 | m_data[8U] << 8 | m_data[9U];
@ -202,7 +202,7 @@ bool CDMRCSBK::getOVCM() const
void CDMRCSBK::setOVCM(bool ovcm)
{
if (m_CSBKO == CSBKO_UUVREQ || m_CSBKO == CSBKO_UUANSRSP) {
if ((m_CSBKO == CSBKO::UUVREQ) || (m_CSBKO == CSBKO::UUANSRSP)) {
m_OVCM = ovcm;
if (ovcm)

View file

@ -1,5 +1,5 @@
/*
* Copyright (C) 2015,2016,2020,2021,2022 by Jonathan Naylor G4KLX
* Copyright (C) 2015,2016,2020,2021,2022,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
@ -21,18 +21,18 @@
#include "DMRDefines.h"
enum CSBKO {
CSBKO_NONE = 0x00,
CSBKO_UUVREQ = 0x04,
CSBKO_UUANSRSP = 0x05,
CSBKO_CTCSBK = 0x07,
CSBKO_CALL_ALERT = 0x1F,
CSBKO_CALL_ALERT_ACK = 0x20,
CSBKO_RADIO_CHECK = 0x24,
CSBKO_NACKRSP = 0x26,
CSBKO_CALL_EMERGENCY = 0x27,
CSBKO_BSDWNACT = 0x38,
CSBKO_PRECCSBK = 0x3D
enum class CSBKO {
NONE = 0x00,
UUVREQ = 0x04,
UUANSRSP = 0x05,
CTCSBK = 0x07,
CALL_ALERT = 0x1F,
CALL_ALERT_ACK = 0x20,
RADIO_CHECK = 0x24,
NACKRSP = 0x26,
CALL_EMERGENCY = 0x27,
BSDWNACT = 0x38,
PRECCSBK = 0x3D
};
class CDMRCSBK

View file

@ -1,5 +1,5 @@
/*
* Copyright (C) 2015-2021 Jonathan Naylor, G4KLX
* Copyright (C) 2015-2021,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
@ -21,7 +21,7 @@
#include <cassert>
#include <algorithm>
CDMRControl::CDMRControl(unsigned int id, unsigned int colorCode, unsigned int callHang, bool selfOnly, bool embeddedLCOnly, bool dumpTAData, const std::vector<unsigned int>& prefixes, const std::vector<unsigned int>& blacklist, const std::vector<unsigned int>& whitelist, const std::vector<unsigned int>& slot1TGWhitelist, const std::vector<unsigned int>& slot2TGWhitelist, unsigned int timeout, CModem* modem, IDMRNetwork* network, CDisplay* display, bool duplex, CDMRLookup* lookup, CRSSIInterpolator* rssi, unsigned int jitter, DMR_OVCM_TYPES ovcm, bool protect) :
CDMRControl::CDMRControl(unsigned int id, unsigned int colorCode, unsigned int callHang, bool selfOnly, bool embeddedLCOnly, bool dumpTAData, const std::vector<unsigned int>& prefixes, const std::vector<unsigned int>& blacklist, const std::vector<unsigned int>& whitelist, const std::vector<unsigned int>& slot1TGWhitelist, const std::vector<unsigned int>& slot2TGWhitelist, unsigned int timeout, CModem* modem, IDMRNetwork* network, CDisplay* display, bool duplex, CDMRLookup* lookup, CRSSIInterpolator* rssi, unsigned int jitter, DMR_OVCM ovcm, bool protect) :
m_colorCode(colorCode),
m_modem(modem),
m_network(network),
@ -59,7 +59,7 @@ bool CDMRControl::processWakeup(const unsigned char* data)
return false;
CSBKO csbko = csbk.getCSBKO();
if (csbko != CSBKO_BSDWNACT)
if (csbko != CSBKO::BSDWNACT)
return false;
unsigned int srcId = csbk.getSrcId();

View file

@ -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,7 +31,7 @@
class CDMRControl {
public:
CDMRControl(unsigned int id, unsigned int colorCode, unsigned int callHang, bool selfOnly, bool embeddedLCOnly, bool dumpTAData, const std::vector<unsigned int>& prefixes, const std::vector<unsigned int>& blacklist, const std::vector<unsigned int>& whitelist, const std::vector<unsigned int>& slot1TGWhitelist, const std::vector<unsigned int>& slot2TGWhitelist, unsigned int timeout, CModem* modem, IDMRNetwork* network, CDisplay* display, bool duplex, CDMRLookup* lookup, CRSSIInterpolator* rssi, unsigned int jitter, DMR_OVCM_TYPES ovcm, bool protect);
CDMRControl(unsigned int id, unsigned int colorCode, unsigned int callHang, bool selfOnly, bool embeddedLCOnly, bool dumpTAData, const std::vector<unsigned int>& prefixes, const std::vector<unsigned int>& blacklist, const std::vector<unsigned int>& whitelist, const std::vector<unsigned int>& slot1TGWhitelist, const std::vector<unsigned int>& slot2TGWhitelist, unsigned int timeout, CModem* modem, IDMRNetwork* network, CDisplay* display, bool duplex, CDMRLookup* lookup, CRSSIInterpolator* rssi, unsigned int jitter, DMR_OVCM ovcm, bool protect);
~CDMRControl();
bool processWakeup(const unsigned char* data);

View file

@ -1,5 +1,5 @@
/*
* Copyright (C) 2015,2016,2017 Jonathan Naylor, G4KLX
* Copyright (C) 2015,2016,2017,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
@ -42,7 +42,7 @@ m_slotNo(1U),
m_data(NULL),
m_srcId(0U),
m_dstId(0U),
m_flco(FLCO_GROUP),
m_flco(FLCO::GROUP),
m_dataType(0U),
m_seqNo(0U),
m_n(0U),

View file

@ -1,5 +1,5 @@
/*
* Copyright (C) 2015,2016,2021 by Jonathan Naylor G4KLX
* Copyright (C) 2015,2016,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
@ -110,14 +110,14 @@ const unsigned char DPF_PROPRIETARY = 0x0FU;
const unsigned char FID_ETSI = 0U;
const unsigned char FID_DMRA = 16U;
enum FLCO {
FLCO_GROUP = 0,
FLCO_USER_USER = 3,
FLCO_TALKER_ALIAS_HEADER = 4,
FLCO_TALKER_ALIAS_BLOCK1 = 5,
FLCO_TALKER_ALIAS_BLOCK2 = 6,
FLCO_TALKER_ALIAS_BLOCK3 = 7,
FLCO_GPS_INFO = 8
enum class FLCO {
GROUP = 0,
USER_USER = 3,
TALKER_ALIAS_HEADER = 4,
TALKER_ALIAS_BLOCK1 = 5,
TALKER_ALIAS_BLOCK2 = 6,
TALKER_ALIAS_BLOCK3 = 7,
GINFO = 8
};
#endif

View file

@ -1,5 +1,5 @@
/*
* Copyright (C) 2015,2016,2017,2018,2020,2021,2024 by Jonathan Naylor G4KLX
* Copyright (C) 2015,2016,2017,2018,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
@ -45,7 +45,7 @@ m_enabled(false),
m_slot1(slot1),
m_slot2(slot2),
m_hwType(hwType),
m_status(WAITING_CONNECT),
m_status(STATUS::WAITING_CONNECT),
m_retryTimer(1000U, 10U),
m_timeoutTimer(1000U, 60U),
m_buffer(NULL),
@ -131,7 +131,7 @@ bool CDMRDirectNetwork::open()
LogMessage("DMR, Opening DMR Network");
m_status = WAITING_CONNECT;
m_status = STATUS::WAITING_CONNECT;
m_timeoutTimer.stop();
m_retryTimer.start();
@ -148,7 +148,7 @@ void CDMRDirectNetwork::enable(bool enabled)
bool CDMRDirectNetwork::read(CDMRData& data)
{
if (m_status != RUNNING)
if (m_status != STATUS::RUNNING)
return false;
if (m_rxData.isEmpty())
@ -180,7 +180,7 @@ bool CDMRDirectNetwork::read(CDMRData& data)
if (slotNo == 2U && !m_slot2)
return false;
FLCO flco = (m_buffer[15U] & 0x40U) == 0x40U ? FLCO_USER_USER : FLCO_GROUP;
FLCO flco = (m_buffer[15U] & 0x40U) == 0x40U ? FLCO::USER_USER : FLCO::GROUP;
data.setSeqNo(seqNo);
data.setSlotNo(slotNo);
@ -212,7 +212,7 @@ bool CDMRDirectNetwork::read(CDMRData& data)
bool CDMRDirectNetwork::write(const CDMRData& data)
{
if (m_status != RUNNING)
if (m_status != STATUS::RUNNING)
return false;
unsigned char buffer[HOMEBREW_DATA_PACKET_LENGTH];
@ -246,7 +246,7 @@ bool CDMRDirectNetwork::write(const CDMRData& data)
buffer[15U] = slotNo == 1U ? 0x00U : 0x80U;
FLCO flco = data.getFLCO();
buffer[15U] |= flco == FLCO_GROUP ? 0x00U : 0x40U;
buffer[15U] |= flco == FLCO::GROUP ? 0x00U : 0x40U;
unsigned int slotIndex = slotNo - 1U;
@ -283,7 +283,7 @@ bool CDMRDirectNetwork::write(const CDMRData& data)
bool CDMRDirectNetwork::writeRadioPosition(unsigned int id, const unsigned char* data)
{
if (m_status != RUNNING)
if (m_status != STATUS::RUNNING)
return false;
unsigned char buffer[20U];
@ -301,7 +301,7 @@ bool CDMRDirectNetwork::writeRadioPosition(unsigned int id, const unsigned char*
bool CDMRDirectNetwork::writeTalkerAlias(unsigned int id, unsigned char type, const unsigned char* data)
{
if (m_status != RUNNING)
if (m_status != STATUS::RUNNING)
return false;
unsigned char buffer[20U];
@ -321,14 +321,14 @@ bool CDMRDirectNetwork::writeTalkerAlias(unsigned int id, unsigned char type, co
bool CDMRDirectNetwork::isConnected() const
{
return (m_status == RUNNING);
return (m_status == STATUS::RUNNING);
}
void CDMRDirectNetwork::close(bool sayGoodbye)
{
LogMessage("DMR, Closing DMR Network");
if (sayGoodbye && (m_status == RUNNING)) {
if (sayGoodbye && (m_status == STATUS::RUNNING)) {
unsigned char buffer[9U];
::memcpy(buffer + 0U, "RPTCL", 5U);
::memcpy(buffer + 5U, m_id, 4U);
@ -346,23 +346,23 @@ void CDMRDirectNetwork::clock(unsigned int ms)
m_retryTimer.clock(ms);
if (m_retryTimer.isRunning() && m_retryTimer.hasExpired()) {
switch (m_status) {
case WAITING_CONNECT:
case STATUS::WAITING_CONNECT:
writeLogin();
m_status = WAITING_LOGIN;
m_status = STATUS::WAITING_LOGIN;
break;
case WAITING_LOGIN:
case STATUS::WAITING_LOGIN:
writeLogin();
break;
case WAITING_AUTHORISATION:
case STATUS::WAITING_AUTHORISATION:
writeAuthorisation();
break;
case WAITING_OPTIONS:
case STATUS::WAITING_OPTIONS:
writeOptions();
break;
case WAITING_CONFIG:
case STATUS::WAITING_CONFIG:
writeConfig();
break;
case RUNNING:
case STATUS::RUNNING:
writePing();
break;
default:
@ -398,9 +398,9 @@ void CDMRDirectNetwork::clock(unsigned int ms)
m_rxData.addData(m_buffer, len);
}
} else if (::memcmp(m_buffer, "MSTNAK", 6U) == 0) {
if (m_status == RUNNING) {
if (m_status == STATUS::RUNNING) {
LogWarning("DMR, Login to the master has failed, retrying login ...");
m_status = WAITING_LOGIN;
m_status = STATUS::WAITING_LOGIN;
m_timeoutTimer.start();
m_retryTimer.start();
} else {
@ -414,36 +414,36 @@ void CDMRDirectNetwork::clock(unsigned int ms)
}
} else if (::memcmp(m_buffer, "RPTACK", 6U) == 0) {
switch (m_status) {
case WAITING_LOGIN:
case STATUS::WAITING_LOGIN:
LogDebug("DMR, Sending authorisation");
::memcpy(m_salt, m_buffer + 6U, sizeof(uint32_t));
writeAuthorisation();
m_status = WAITING_AUTHORISATION;
m_status = STATUS::WAITING_AUTHORISATION;
m_timeoutTimer.start();
m_retryTimer.start();
break;
case WAITING_AUTHORISATION:
case STATUS::WAITING_AUTHORISATION:
LogDebug("DMR, Sending configuration");
writeConfig();
m_status = WAITING_CONFIG;
m_status = STATUS::WAITING_CONFIG;
m_timeoutTimer.start();
m_retryTimer.start();
break;
case WAITING_CONFIG:
case STATUS::WAITING_CONFIG:
if (m_options.empty()) {
LogMessage("DMR, Logged into the master successfully");
m_status = RUNNING;
m_status = STATUS::RUNNING;
} else {
LogDebug("DMR, Sending options");
writeOptions();
m_status = WAITING_OPTIONS;
m_status = STATUS::WAITING_OPTIONS;
}
m_timeoutTimer.start();
m_retryTimer.start();
break;
case WAITING_OPTIONS:
case STATUS::WAITING_OPTIONS:
LogMessage("DMR, Logged into the master successfully");
m_status = RUNNING;
m_status = STATUS::RUNNING;
m_timeoutTimer.start();
m_retryTimer.start();
break;
@ -526,16 +526,16 @@ bool CDMRDirectNetwork::writeConfig()
slots = '2';
switch (m_hwType) {
case HWT_MMDVM:
case HW_TYPE::MMDVM:
software = "MMDVM";
break;
case HWT_MMDVM_HS:
case HW_TYPE::MMDVM_HS:
software = "MMDVM_MMDVM_HS";
break;
case HWT_MMDVM_HS_DUAL_HAT:
case HW_TYPE::MMDVM_HS_DUAL_HAT:
software = "MMDVM_MMDVM_HS_Dual_Hat";
break;
case HWT_NANO_HOTSPOT:
case HW_TYPE::NANO_HOTSPOT:
software = "MMDVM_Nano_hotSPOT";
break;
default:
@ -546,31 +546,31 @@ bool CDMRDirectNetwork::writeConfig()
slots = '4';
switch (m_hwType) {
case HWT_MMDVM:
case HW_TYPE::MMDVM:
software = "MMDVM_DMO";
break;
case HWT_DVMEGA:
case HW_TYPE::DVMEGA:
software = "MMDVM_DVMega";
break;
case HWT_MMDVM_ZUMSPOT:
case HW_TYPE::MMDVM_ZUMSPOT:
software = "MMDVM_ZUMspot";
break;
case HWT_MMDVM_HS_HAT:
case HW_TYPE::MMDVM_HS_HAT:
software = "MMDVM_MMDVM_HS_Hat";
break;
case HWT_MMDVM_HS_DUAL_HAT:
case HW_TYPE::MMDVM_HS_DUAL_HAT:
software = "MMDVM_MMDVM_HS_Dual_Hat";
break;
case HWT_NANO_HOTSPOT:
case HW_TYPE::NANO_HOTSPOT:
software = "MMDVM_Nano_hotSPOT";
break;
case HWT_NANO_DV:
case HW_TYPE::NANO_DV:
software = "MMDVM_Nano_DV";
break;
case HWT_D2RG_MMDVM_HS:
case HW_TYPE::D2RG_MMDVM_HS:
software = "MMDVM_D2RG_MMDVM_HS";
break;
case HWT_MMDVM_HS:
case HW_TYPE::MMDVM_HS:
software = "MMDVM_MMDVM_HS";
break;
default:

View file

@ -1,5 +1,5 @@
/*
* Copyright (C) 2015,2016,2017,2018,2020,2021 by Jonathan Naylor G4KLX
* Copyright (C) 2015,2016,2017,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
@ -75,7 +75,7 @@ private:
bool m_slot2;
HW_TYPE m_hwType;
enum STATUS {
enum class STATUS {
WAITING_CONNECT,
WAITING_LOGIN,
WAITING_AUTHORISATION,

View file

@ -1,5 +1,5 @@
/*
* Copyright (C) 2015,2016,2017 by Jonathan Naylor G4KLX
* Copyright (C) 2015,2016,2017,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
@ -28,9 +28,9 @@
CDMREmbeddedData::CDMREmbeddedData() :
m_raw(NULL),
m_state(LCS_NONE),
m_state(LC_STATE::NONE),
m_data(NULL),
m_FLCO(FLCO_GROUP),
m_FLCO(FLCO::GROUP),
m_valid(false)
{
m_raw = new bool[128U];
@ -61,41 +61,41 @@ bool CDMREmbeddedData::addData(const unsigned char* data, unsigned char lcss)
m_raw[a] = rawData[a + 4U];
// Show we are ready for the next LC block
m_state = LCS_FIRST;
m_state = LC_STATE::FIRST;
m_valid = false;
return false;
}
// Is this the 2nd block of a 4 block embedded LC ?
if (lcss == 3U && m_state == LCS_FIRST) {
if ((lcss == 3U) && (m_state == LC_STATE::FIRST)) {
for (unsigned int a = 0U; a < 32U; a++)
m_raw[a + 32U] = rawData[a + 4U];
// Show we are ready for the next LC block
m_state = LCS_SECOND;
m_state = LC_STATE::SECOND;
return false;
}
// Is this the 3rd block of a 4 block embedded LC ?
if (lcss == 3U && m_state == LCS_SECOND) {
if ((lcss == 3U) && (m_state == LC_STATE::SECOND)) {
for (unsigned int a = 0U; a < 32U; a++)
m_raw[a + 64U] = rawData[a + 4U];
// Show we are ready for the final LC block
m_state = LCS_THIRD;
m_state = LC_STATE::THIRD;
return false;
}
// Is this the final block of a 4 block embedded LC ?
if (lcss == 2U && m_state == LCS_THIRD) {
if ((lcss == 2U) && (m_state == LC_STATE::THIRD)) {
for (unsigned int a = 0U; a < 32U; a++)
m_raw[a + 96U] = rawData[a + 4U];
// Show that we're not ready for any more data
m_state = LCS_NONE;
m_state = LC_STATE::NONE;
// Process the complete data block
decodeEmbeddedData();
@ -279,7 +279,7 @@ CDMRLC* CDMREmbeddedData::getLC() const
if (!m_valid)
return NULL;
if (m_FLCO != FLCO_GROUP && m_FLCO != FLCO_USER_USER)
if ((m_FLCO != FLCO::GROUP) && (m_FLCO != FLCO::USER_USER))
return NULL;
return new CDMRLC(m_data);
@ -297,7 +297,7 @@ FLCO CDMREmbeddedData::getFLCO() const
void CDMREmbeddedData::reset()
{
m_state = LCS_NONE;
m_state = LC_STATE::NONE;
m_valid = false;
}

View file

@ -1,5 +1,5 @@
/*
* Copyright (C) 2015,2016,2017 by Jonathan Naylor G4KLX
* Copyright (C) 2015,2016,2017,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
@ -22,11 +22,11 @@
#include "DMRDefines.h"
#include "DMRLC.h"
enum LC_STATE {
LCS_NONE,
LCS_FIRST,
LCS_SECOND,
LCS_THIRD
enum class LC_STATE {
NONE,
FIRST,
SECOND,
THIRD
};
class CDMREmbeddedData

View file

@ -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
@ -157,7 +157,7 @@ bool CDMRGatewayNetwork::read(CDMRData& data)
if (slotNo == 2U && !m_slot2)
return false;
FLCO flco = (m_buffer[15U] & 0x40U) == 0x40U ? FLCO_USER_USER : FLCO_GROUP;
FLCO flco = (m_buffer[15U] & 0x40U) == 0x40U ? FLCO::USER_USER : FLCO::GROUP;
data.setSeqNo(seqNo);
data.setSlotNo(slotNo);
@ -220,7 +220,7 @@ bool CDMRGatewayNetwork::write(const CDMRData& data)
buffer[15U] = slotNo == 1U ? 0x00U : 0x80U;
FLCO flco = data.getFLCO();
buffer[15U] |= flco == FLCO_GROUP ? 0x00U : 0x40U;
buffer[15U] |= flco == FLCO::GROUP ? 0x00U : 0x40U;
unsigned int slotIndex = slotNo - 1U;
@ -349,16 +349,16 @@ bool CDMRGatewayNetwork::writeConfig()
slots = '2';
switch (m_hwType) {
case HWT_MMDVM:
case HW_TYPE::MMDVM:
software = "MMDVM";
break;
case HWT_MMDVM_HS:
case HW_TYPE::MMDVM_HS:
software = "MMDVM_MMDVM_HS";
break;
case HWT_MMDVM_HS_DUAL_HAT:
case HW_TYPE::MMDVM_HS_DUAL_HAT:
software = "MMDVM_MMDVM_HS_Dual_Hat";
break;
case HWT_NANO_HOTSPOT:
case HW_TYPE::NANO_HOTSPOT:
software = "MMDVM_Nano_hotSPOT";
break;
default:
@ -369,37 +369,37 @@ bool CDMRGatewayNetwork::writeConfig()
slots = '4';
switch (m_hwType) {
case HWT_MMDVM:
case HW_TYPE::MMDVM:
software = "MMDVM_DMO";
break;
case HWT_DVMEGA:
case HW_TYPE::DVMEGA:
software = "MMDVM_DVMega";
break;
case HWT_MMDVM_ZUMSPOT:
case HW_TYPE::MMDVM_ZUMSPOT:
software = "MMDVM_ZUMspot";
break;
case HWT_MMDVM_HS_HAT:
case HW_TYPE::MMDVM_HS_HAT:
software = "MMDVM_MMDVM_HS_Hat";
break;
case HWT_MMDVM_HS_DUAL_HAT:
case HW_TYPE::MMDVM_HS_DUAL_HAT:
software = "MMDVM_MMDVM_HS_Dual_Hat";
break;
case HWT_NANO_HOTSPOT:
case HW_TYPE::NANO_HOTSPOT:
software = "MMDVM_Nano_hotSPOT";
break;
case HWT_NANO_DV:
case HW_TYPE::NANO_DV:
software = "MMDVM_Nano_DV";
break;
case HWT_D2RG_MMDVM_HS:
case HW_TYPE::D2RG_MMDVM_HS:
software = "MMDVM_D2RG_MMDVM_HS";
break;
case HWT_MMDVM_HS:
case HW_TYPE::MMDVM_HS:
software = "MMDVM_MMDVM_HS";
break;
case HWT_OPENGD77_HS:
case HW_TYPE::OPENGD77_HS:
software = "MMDVM_OpenGD77_HS";
break;
case HWT_SKYBRIDGE:
case HW_TYPE::SKYBRIDGE:
software = "MMDVM_SkyBridge";
break;
default:

View file

@ -1,5 +1,5 @@
/*
* Copyright (C) 2015,2016,2019,2021,2022 by Jonathan Naylor G4KLX
* Copyright (C) 2015,2016,2019,2021,2022,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
@ -37,7 +37,7 @@ m_dstId(dstId)
CDMRLC::CDMRLC(const unsigned char* bytes) :
m_PF(false),
m_R(false),
m_FLCO(FLCO_GROUP),
m_FLCO(FLCO::GROUP),
m_FID(0U),
m_options(0U),
m_srcId(0U),
@ -61,7 +61,7 @@ m_dstId(0U)
CDMRLC::CDMRLC(const bool* bits) :
m_PF(false),
m_R(false),
m_FLCO(FLCO_GROUP),
m_FLCO(FLCO::GROUP),
m_FID(0U),
m_options(0U),
m_srcId(0U),
@ -99,7 +99,7 @@ m_dstId(0U)
CDMRLC::CDMRLC() :
m_PF(false),
m_R(false),
m_FLCO(FLCO_GROUP),
m_FLCO(FLCO::GROUP),
m_FID(0U),
m_options(0U),
m_srcId(0U),

View file

@ -1,5 +1,5 @@
/*
* Copyright (C) 2015-2021,2023 Jonathan Naylor, G4KLX
* Copyright (C) 2015-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
@ -43,7 +43,7 @@ CDisplay* CDMRSlot::m_display = NULL;
bool CDMRSlot::m_duplex = true;
CDMRLookup* CDMRSlot::m_lookup = NULL;
unsigned int CDMRSlot::m_hangCount = 3U * 17U;
DMR_OVCM_TYPES CDMRSlot::m_ovcm = DMR_OVCM_OFF;
DMR_OVCM CDMRSlot::m_ovcm = DMR_OVCM::OFF;
bool CDMRSlot::m_protect = false;
CRSSIInterpolator* CDMRSlot::m_rssiMapper = NULL;
@ -55,10 +55,10 @@ unsigned char* CDMRSlot::m_idle = NULL;
FLCO CDMRSlot::m_flco1;
unsigned char CDMRSlot::m_id1 = 0U;
ACTIVITY_TYPE CDMRSlot::m_activity1 = ACTIVITY_NONE;
ACTIVITY_TYPE CDMRSlot::m_activity1 = ACTIVITY_TYPE::NONE;
FLCO CDMRSlot::m_flco2;
unsigned char CDMRSlot::m_id2 = 0U;
ACTIVITY_TYPE CDMRSlot::m_activity2 = ACTIVITY_NONE;
ACTIVITY_TYPE CDMRSlot::m_activity2 = ACTIVITY_TYPE::NONE;
const unsigned char TALKER_ID_NONE = 0x00U;
const unsigned char TALKER_ID_HEADER = 0x01U;
@ -75,8 +75,8 @@ const unsigned int NO_PREAMBLE_CSBK = 15U;
CDMRSlot::CDMRSlot(unsigned int slotNo, unsigned int timeout) :
m_slotNo(slotNo),
m_queue(5000U, "DMR Slot"),
m_rfState(RS_RF_LISTENING),
m_netState(RS_NET_IDLE),
m_rfState(RPT_RF_STATE::LISTENING),
m_netState(RPT_NET_STATE::IDLE),
m_rfEmbeddedLC(),
m_rfEmbeddedData(NULL),
m_rfEmbeddedReadN(0U),
@ -143,15 +143,15 @@ bool CDMRSlot::writeModem(unsigned char *data, unsigned int len)
if (!m_enabled)
return false;
if (data[0U] == TAG_LOST && m_rfState == RS_RF_AUDIO) {
if ((data[0U] == TAG_LOST) && (m_rfState == RPT_RF_STATE::AUDIO)) {
std::string src = m_lookup->find(m_rfLC->getSrcId());
std::string dst = m_lookup->find(m_rfLC->getDstId());
FLCO flco = m_rfLC->getFLCO();
if (m_rssi != 0U)
LogMessage("DMR Slot %u, RF voice transmission lost from %s to %s%s, %.1f seconds, BER: %.1f%%, RSSI: -%u/-%u/-%u dBm", m_slotNo, src.c_str(), flco == FLCO_GROUP ? "TG " : "", dst.c_str(), float(m_rfFrames) / 16.667F, float(m_rfErrs * 100U) / float(m_rfBits), m_minRSSI, m_maxRSSI, m_aveRSSI / m_rssiCount);
LogMessage("DMR Slot %u, RF voice transmission lost from %s to %s%s, %.1f seconds, BER: %.1f%%, RSSI: -%u/-%u/-%u dBm", m_slotNo, src.c_str(), flco == FLCO::GROUP ? "TG " : "", dst.c_str(), float(m_rfFrames) / 16.667F, float(m_rfErrs * 100U) / float(m_rfBits), m_minRSSI, m_maxRSSI, m_aveRSSI / m_rssiCount);
else
LogMessage("DMR Slot %u, RF voice transmission lost from %s to %s%s, %.1f seconds, BER: %.1f%%", m_slotNo, src.c_str(), flco == FLCO_GROUP ? "TG " : "", dst.c_str(), float(m_rfFrames) / 16.667F, float(m_rfErrs * 100U) / float(m_rfBits));
LogMessage("DMR Slot %u, RF voice transmission lost from %s to %s%s, %.1f seconds, BER: %.1f%%", m_slotNo, src.c_str(), flco == FLCO::GROUP ? "TG " : "", dst.c_str(), float(m_rfFrames) / 16.667F, float(m_rfErrs * 100U) / float(m_rfBits));
if (m_rfTimeout) {
writeEndRF();
return false;
@ -161,18 +161,18 @@ bool CDMRSlot::writeModem(unsigned char *data, unsigned int len)
}
}
if (data[0U] == TAG_LOST && m_rfState == RS_RF_DATA) {
if ((data[0U] == TAG_LOST) && (m_rfState == RPT_RF_STATE::DATA)) {
std::string src = m_lookup->find(m_rfLC->getSrcId());
std::string dst = m_lookup->find(m_rfLC->getDstId());
FLCO flco = m_rfLC->getFLCO();
LogMessage("DMR Slot %u, RF data transmission lost from %s to %s%s", m_slotNo, src.c_str(), flco == FLCO_GROUP ? "TG " : "", dst.c_str());
LogMessage("DMR Slot %u, RF data transmission lost from %s to %s%s", m_slotNo, src.c_str(), flco == FLCO::GROUP ? "TG " : "", dst.c_str());
writeEndRF();
return false;
}
if (data[0U] == TAG_LOST) {
m_rfState = RS_RF_LISTENING;
m_rfState = RPT_RF_STATE::LISTENING;
return false;
}
@ -211,7 +211,7 @@ bool CDMRSlot::writeModem(unsigned char *data, unsigned int len)
slotType.setDataType(dataType);
if (dataType == DT_VOICE_LC_HEADER) {
if (m_rfState == RS_RF_AUDIO)
if (m_rfState == RPT_RF_STATE::AUDIO)
return true;
CDMRFullLC fullLC;
@ -227,7 +227,7 @@ bool CDMRSlot::writeModem(unsigned char *data, unsigned int len)
if (lc->getPF()) {
LogMessage("DMR Slot %u, RF user %u rejected", m_slotNo, srcId);
delete lc;
m_rfState = RS_RF_LISTENING;
m_rfState = RPT_RF_STATE::LISTENING;
return false;
}
}
@ -235,20 +235,20 @@ bool CDMRSlot::writeModem(unsigned char *data, unsigned int len)
if (!CDMRAccessControl::validateSrcId(srcId)) {
LogMessage("DMR Slot %u, RF user %u rejected", m_slotNo, srcId);
delete lc;
m_rfState = RS_RF_LISTENING;
m_rfState = RPT_RF_STATE::LISTENING;
return false;
}
if (!CDMRAccessControl::validateTGId(m_slotNo, flco == FLCO_GROUP, dstId)) {
if (!CDMRAccessControl::validateTGId(m_slotNo, flco == FLCO::GROUP, dstId)) {
LogMessage("DMR Slot %u, RF user %u rejected for using TG %u", m_slotNo, srcId, dstId);
delete lc;
m_rfState = RS_RF_LISTENING;
m_rfState = RPT_RF_STATE::LISTENING;
return false;
}
if (m_ovcm == DMR_OVCM_TX_ON || m_ovcm == DMR_OVCM_ON)
if ((m_ovcm == DMR_OVCM::TX_ON) || (m_ovcm == DMR_OVCM::ON))
lc->setOVCM(true);
else if (m_ovcm == DMR_OVCM_FORCE_OFF)
else if (m_ovcm == DMR_OVCM::FORCE_OFF)
lc->setOVCM(false);
m_rfLC = lc;
@ -297,22 +297,22 @@ bool CDMRSlot::writeModem(unsigned char *data, unsigned int len)
writeNetworkRF(data, DT_VOICE_LC_HEADER);
m_rfState = RS_RF_AUDIO;
m_rfState = RPT_RF_STATE::AUDIO;
std::string src = m_lookup->find(srcId);
std::string dst = m_lookup->find(dstId);
if (m_netState == RS_NET_IDLE) {
setShortLC(m_slotNo, dstId, flco, ACTIVITY_VOICE);
m_display->writeDMR(m_slotNo, src, flco == FLCO_GROUP, dst, "R");
if (m_netState == RPT_NET_STATE::IDLE) {
setShortLC(m_slotNo, dstId, flco, ACTIVITY_TYPE::VOICE);
m_display->writeDMR(m_slotNo, src, flco == FLCO::GROUP, dst, "R");
m_display->writeDMRRSSI(m_slotNo, m_rssi);
}
LogMessage("DMR Slot %u, received RF voice header from %s to %s%s", m_slotNo, src.c_str(), flco == FLCO_GROUP ? "TG " : "", dst.c_str());
LogMessage("DMR Slot %u, received RF voice header from %s to %s%s", m_slotNo, src.c_str(), flco == FLCO::GROUP ? "TG " : "", dst.c_str());
return true;
} else if (dataType == DT_VOICE_PI_HEADER) {
if (m_rfState != RS_RF_AUDIO)
if (m_rfState != RPT_RF_STATE::AUDIO)
return false;
// Regenerate the Slot Type
@ -339,7 +339,7 @@ bool CDMRSlot::writeModem(unsigned char *data, unsigned int len)
return true;
} else if (dataType == DT_TERMINATOR_WITH_LC) {
if (m_rfState != RS_RF_AUDIO)
if (m_rfState != RPT_RF_STATE::AUDIO)
return false;
// Regenerate the LC data
@ -369,9 +369,9 @@ bool CDMRSlot::writeModem(unsigned char *data, unsigned int len)
FLCO flco = m_rfLC->getFLCO();
if (m_rssi != 0U)
LogMessage("DMR Slot %u, received RF end of voice transmission from %s to %s%s, %.1f seconds, BER: %.1f%%, RSSI: -%u/-%u/-%u dBm", m_slotNo, src.c_str(), flco == FLCO_GROUP ? "TG " : "", dst.c_str(), float(m_rfFrames) / 16.667F, float(m_rfErrs * 100U) / float(m_rfBits), m_minRSSI, m_maxRSSI, m_aveRSSI / m_rssiCount);
LogMessage("DMR Slot %u, received RF end of voice transmission from %s to %s%s, %.1f seconds, BER: %.1f%%, RSSI: -%u/-%u/-%u dBm", m_slotNo, src.c_str(), flco == FLCO::GROUP ? "TG " : "", dst.c_str(), float(m_rfFrames) / 16.667F, float(m_rfErrs * 100U) / float(m_rfBits), m_minRSSI, m_maxRSSI, m_aveRSSI / m_rssiCount);
else
LogMessage("DMR Slot %u, received RF end of voice transmission from %s to %s%s, %.1f seconds, BER: %.1f%%", m_slotNo, src.c_str(), flco == FLCO_GROUP ? "TG " : "", dst.c_str(), float(m_rfFrames) / 16.667F, float(m_rfErrs * 100U) / float(m_rfBits));
LogMessage("DMR Slot %u, received RF end of voice transmission from %s to %s%s, %.1f seconds, BER: %.1f%%", m_slotNo, src.c_str(), flco == FLCO::GROUP ? "TG " : "", dst.c_str(), float(m_rfFrames) / 16.667F, float(m_rfErrs * 100U) / float(m_rfBits));
m_display->writeDMRTA(m_slotNo, NULL, " ");
@ -383,7 +383,7 @@ bool CDMRSlot::writeModem(unsigned char *data, unsigned int len)
return true;
}
} else if (dataType == DT_DATA_HEADER) {
if (m_rfState == RS_RF_DATA)
if (m_rfState == RPT_RF_STATE::DATA)
return true;
CDMRDataHeader dataHeader;
@ -397,19 +397,19 @@ bool CDMRSlot::writeModem(unsigned char *data, unsigned int len)
if (!CDMRAccessControl::validateSrcId(srcId)) {
LogMessage("DMR Slot %u, RF user %u rejected", m_slotNo, srcId);
m_rfState = RS_RF_LISTENING;
m_rfState = RPT_RF_STATE::LISTENING;
return false;
}
if (!CDMRAccessControl::validateTGId(m_slotNo, gi, dstId)) {
LogMessage("DMR Slot %u, RF user %u rejected for using TG %u", m_slotNo, srcId, dstId);
m_rfState = RS_RF_LISTENING;
m_rfState = RPT_RF_STATE::LISTENING;
return false;
}
m_rfFrames = dataHeader.getBlocks();
m_rfLC = new CDMRLC(gi ? FLCO_GROUP : FLCO_USER_USER, srcId, dstId);
m_rfLC = new CDMRLC(gi ? FLCO::GROUP : FLCO::USER_USER, srcId, dstId);
// Regenerate the data header
dataHeader.get(data + 2U);
@ -428,13 +428,13 @@ bool CDMRSlot::writeModem(unsigned char *data, unsigned int len)
writeNetworkRF(data, DT_DATA_HEADER);
m_rfState = RS_RF_DATA;
m_rfState = RPT_RF_STATE::DATA;
std::string src = m_lookup->find(srcId);
std::string dst = m_lookup->find(dstId);
if (m_netState == RS_NET_IDLE) {
setShortLC(m_slotNo, dstId, gi ? FLCO_GROUP : FLCO_USER_USER, ACTIVITY_DATA);
if (m_netState == RPT_NET_STATE::IDLE) {
setShortLC(m_slotNo, dstId, gi ? FLCO::GROUP : FLCO::USER_USER, ACTIVITY_TYPE::DATA);
m_display->writeDMR(m_slotNo, src, gi, dst, "R");
m_display->writeDMRRSSI(m_slotNo, m_rssi);
}
@ -454,13 +454,13 @@ bool CDMRSlot::writeModem(unsigned char *data, unsigned int len)
return false;
CSBKO csbko = csbk.getCSBKO();
if (csbko == CSBKO_BSDWNACT)
if (csbko == CSBKO::BSDWNACT)
return false;
// set the OVCM bit for the supported csbk
if (m_ovcm == DMR_OVCM_TX_ON || m_ovcm == DMR_OVCM_ON)
if ((m_ovcm == DMR_OVCM::TX_ON) || (m_ovcm == DMR_OVCM::ON))
csbk.setOVCM(true);
else if (m_ovcm == DMR_OVCM_FORCE_OFF)
else if (m_ovcm == DMR_OVCM::FORCE_OFF)
csbk.setOVCM(false);
bool gi = csbk.getGI();
@ -470,13 +470,13 @@ bool CDMRSlot::writeModem(unsigned char *data, unsigned int len)
if (srcId != 0U || dstId != 0U) {
if (!CDMRAccessControl::validateSrcId(srcId)) {
LogMessage("DMR Slot %u, RF user %u rejected", m_slotNo, srcId);
m_rfState = RS_RF_LISTENING;
m_rfState = RPT_RF_STATE::LISTENING;
return false;
}
if (!CDMRAccessControl::validateTGId(m_slotNo, gi, dstId)) {
LogMessage("DMR Slot %u, RF user %u rejected for using TG %u", m_slotNo, srcId, dstId);
m_rfState = RS_RF_LISTENING;
m_rfState = RPT_RF_STATE::LISTENING;
return false;
}
}
@ -496,34 +496,34 @@ bool CDMRSlot::writeModem(unsigned char *data, unsigned int len)
if (m_duplex)
writeQueueRF(data);
writeNetworkRF(data, DT_CSBK, gi ? FLCO_GROUP : FLCO_USER_USER, srcId, dstId);
writeNetworkRF(data, DT_CSBK, gi ? FLCO::GROUP : FLCO::USER_USER, srcId, dstId);
std::string src = m_lookup->find(srcId);
std::string dst = m_lookup->find(dstId);
switch (csbko) {
case CSBKO_UUVREQ:
case CSBKO::UUVREQ:
LogMessage("DMR Slot %u, received RF Unit to Unit Voice Service Request CSBK from %s to %s%s", m_slotNo, src.c_str(), gi ? "TG ": "", dst.c_str());
break;
case CSBKO_UUANSRSP:
case CSBKO::UUANSRSP:
LogMessage("DMR Slot %u, received RF Unit to Unit Voice Service Answer Response CSBK from %s to %s%s", m_slotNo, src.c_str(), gi ? "TG ": "", dst.c_str());
break;
case CSBKO_NACKRSP:
case CSBKO::NACKRSP:
LogMessage("DMR Slot %u, received RF Negative Acknowledgment Response CSBK from %s to %s%s", m_slotNo, src.c_str(), gi ? "TG ": "", dst.c_str());
break;
case CSBKO_PRECCSBK:
case CSBKO::PRECCSBK:
LogMessage("DMR Slot %u, received RF %s Preamble CSBK (%u to follow) from %s to %s%s", m_slotNo, csbk.getDataContent() ? "Data" : "CSBK", csbk.getCBF(), src.c_str(), gi ? "TG ": "", dst.c_str());
break;
case CSBKO_CALL_ALERT:
case CSBKO::CALL_ALERT:
LogMessage("DMR Slot %u, received RF Call Alert CSBK from %s to %s%s", m_slotNo, src.c_str(), gi ? "TG " : "", dst.c_str());
break;
case CSBKO_CALL_ALERT_ACK:
case CSBKO::CALL_ALERT_ACK:
LogMessage("DMR Slot %u, received RF Call Alert Ack CSBK from %s to %s%s", m_slotNo, src.c_str(), gi ? "TG " : "", dst.c_str());
break;
case CSBKO_RADIO_CHECK:
case CSBKO::RADIO_CHECK:
LogMessage("DMR Slot %u, received RF Radio Check %s CSBK from %s to %s%s", m_slotNo, /* TBD */ 1 ? "Req" : "Ack", src.c_str(), gi ? "TG " : "", dst.c_str());
break;
case CSBKO_CALL_EMERGENCY:
case CSBKO::CALL_EMERGENCY:
LogMessage("DMR Slot %u, received RF Call Emergency CSBK from %s to %s%s", m_slotNo, src.c_str(), gi ? "TG " : "", dst.c_str());
break;
default:
@ -532,15 +532,15 @@ bool CDMRSlot::writeModem(unsigned char *data, unsigned int len)
}
// If data preamble, signal its existence
if (m_netState == RS_NET_IDLE && csbko == CSBKO_PRECCSBK && csbk.getDataContent()) {
setShortLC(m_slotNo, dstId, gi ? FLCO_GROUP : FLCO_USER_USER, ACTIVITY_DATA);
if ((m_netState == RPT_NET_STATE::IDLE) && (csbko == CSBKO::PRECCSBK) && csbk.getDataContent()) {
setShortLC(m_slotNo, dstId, gi ? FLCO::GROUP : FLCO::USER_USER, ACTIVITY_TYPE::DATA);
m_display->writeDMR(m_slotNo, src, gi, dst, "R");
m_display->writeDMRRSSI(m_slotNo, m_rssi);
}
return true;
} else if (dataType == DT_RATE_12_DATA || dataType == DT_RATE_34_DATA || dataType == DT_RATE_1_DATA) {
if (m_rfState != RS_RF_DATA || m_rfFrames == 0U)
} else if ((dataType == DT_RATE_12_DATA) || (dataType == DT_RATE_34_DATA) || (dataType == DT_RATE_1_DATA)) {
if ((m_rfState != RPT_RF_STATE::DATA) || (m_rfFrames == 0U))
return false;
char title[80U];
@ -593,7 +593,7 @@ bool CDMRSlot::writeModem(unsigned char *data, unsigned int len)
return true;
}
} else if (audioSync) {
if (m_rfState == RS_RF_AUDIO) {
if (m_rfState == RPT_RF_STATE::AUDIO) {
m_lastrfN = 0;
// Convert the Audio Sync to be from the BS or MS as needed
CSync::addDMRAudioSync(data + 2U, m_duplex);
@ -630,13 +630,13 @@ bool CDMRSlot::writeModem(unsigned char *data, unsigned int len)
}
return false;
} else if (m_rfState == RS_RF_LISTENING) {
} else if (m_rfState == RPT_RF_STATE::LISTENING) {
m_rfEmbeddedLC.reset();
m_rfState = RS_RF_LATE_ENTRY;
m_rfState = RPT_RF_STATE::LATE_ENTRY;
return false;
}
} else {
if (m_rfState == RS_RF_AUDIO) {
if (m_rfState == RPT_RF_STATE::AUDIO) {
m_rfN = data[1U] & 0x0FU;
if (m_rfN > 5U)
return false;
@ -673,13 +673,13 @@ bool CDMRSlot::writeModem(unsigned char *data, unsigned int len)
char text[80U];
switch (flco) {
case FLCO_GROUP:
case FLCO_USER_USER:
case FLCO::GROUP:
case FLCO::USER_USER:
// ::sprintf(text, "DMR Slot %u, Embedded LC", m_slotNo);
// CUtils::dump(1U, text, data, 9U);
break;
case FLCO_GPS_INFO:
case FLCO::GINFO:
if (m_dumpTAData) {
::sprintf(text, "DMR Slot %u, Embedded GPS Info", m_slotNo);
CUtils::dump(1U, text, data, 9U);
@ -689,7 +689,7 @@ bool CDMRSlot::writeModem(unsigned char *data, unsigned int len)
m_network->writeRadioPosition(m_rfLC->getSrcId(), data);
break;
case FLCO_TALKER_ALIAS_HEADER:
case FLCO::TALKER_ALIAS_HEADER:
if (m_network != NULL)
m_network->writeTalkerAlias(m_rfLC->getSrcId(), 0U, data);
@ -708,7 +708,7 @@ bool CDMRSlot::writeModem(unsigned char *data, unsigned int len)
}
break;
case FLCO_TALKER_ALIAS_BLOCK1:
case FLCO::TALKER_ALIAS_BLOCK1:
if (m_network != NULL)
m_network->writeTalkerAlias(m_rfLC->getSrcId(), 1U, data);
@ -727,7 +727,7 @@ bool CDMRSlot::writeModem(unsigned char *data, unsigned int len)
}
break;
case FLCO_TALKER_ALIAS_BLOCK2:
case FLCO::TALKER_ALIAS_BLOCK2:
if (m_network != NULL)
m_network->writeTalkerAlias(m_rfLC->getSrcId(), 2U, data);
@ -746,7 +746,7 @@ bool CDMRSlot::writeModem(unsigned char *data, unsigned int len)
}
break;
case FLCO_TALKER_ALIAS_BLOCK3:
case FLCO::TALKER_ALIAS_BLOCK3:
if (m_network != NULL)
m_network->writeTalkerAlias(m_rfLC->getSrcId(), 3U, data);
@ -806,7 +806,7 @@ bool CDMRSlot::writeModem(unsigned char *data, unsigned int len)
}
return false;
} else if (m_rfState == RS_RF_LATE_ENTRY) {
} else if (m_rfState == RPT_RF_STATE::LATE_ENTRY) {
CDMREMB emb;
emb.putData(data + 2U);
@ -826,7 +826,7 @@ bool CDMRSlot::writeModem(unsigned char *data, unsigned int len)
if (lc->getPF()) {
LogMessage("DMR Slot %u, RF user %u rejected", m_slotNo, srcId);
delete lc;
m_rfState = RS_RF_LISTENING;
m_rfState = RPT_RF_STATE::LISTENING;
return false;
}
}
@ -834,20 +834,20 @@ bool CDMRSlot::writeModem(unsigned char *data, unsigned int len)
if (!CDMRAccessControl::validateSrcId(srcId)) {
LogMessage("DMR Slot %u, RF user %u rejected", m_slotNo, srcId);
delete lc;
m_rfState = RS_RF_LISTENING;
m_rfState = RPT_RF_STATE::LISTENING;
return false;
}
if (!CDMRAccessControl::validateTGId(m_slotNo, flco == FLCO_GROUP, dstId)) {
if (!CDMRAccessControl::validateTGId(m_slotNo, flco == FLCO::GROUP, dstId)) {
LogMessage("DMR Slot %u, RF user %u rejected for using TG %u", m_slotNo, srcId, dstId);
delete lc;
m_rfState = RS_RF_LISTENING;
m_rfState = RPT_RF_STATE::LISTENING;
return false;
}
if (m_ovcm == DMR_OVCM_TX_ON || m_ovcm == DMR_OVCM_ON)
if ((m_ovcm == DMR_OVCM::TX_ON) || (m_ovcm == DMR_OVCM::ON))
lc->setOVCM(true);
else if (m_ovcm == DMR_OVCM_FORCE_OFF)
else if (m_ovcm == DMR_OVCM::FORCE_OFF)
lc->setOVCM(false);
m_rfLC = lc;
@ -930,19 +930,19 @@ bool CDMRSlot::writeModem(unsigned char *data, unsigned int len)
writeNetworkRF(data, DT_VOICE, errors);
m_rfState = RS_RF_AUDIO;
m_rfState = RPT_RF_STATE::AUDIO;
std::string src = m_lookup->find(srcId);
std::string dst = m_lookup->find(dstId);
if (m_netState == RS_NET_IDLE) {
setShortLC(m_slotNo, dstId, flco, ACTIVITY_VOICE);
m_display->writeDMR(m_slotNo, src, flco == FLCO_GROUP, dst, "R");
if (m_netState == RPT_NET_STATE::IDLE) {
setShortLC(m_slotNo, dstId, flco, ACTIVITY_TYPE::VOICE);
m_display->writeDMR(m_slotNo, src, flco == FLCO::GROUP, dst, "R");
m_display->writeDMRRSSI(m_slotNo, m_rssi);
m_display->writeDMRBER(m_slotNo, float(errors) / 1.41F);
}
LogMessage("DMR Slot %u, received RF late entry from %s to %s%s", m_slotNo, src.c_str(), flco == FLCO_GROUP ? "TG " : "", dst.c_str());
LogMessage("DMR Slot %u, received RF late entry from %s to %s%s", m_slotNo, src.c_str(), flco == FLCO::GROUP ? "TG " : "", dst.c_str());
return true;
}
@ -969,15 +969,15 @@ unsigned int CDMRSlot::readModem(unsigned char* data)
void CDMRSlot::writeEndRF(bool writeEnd)
{
m_rfState = RS_RF_LISTENING;
m_rfState = RPT_RF_STATE::LISTENING;
if (m_netState == RS_NET_IDLE) {
if (m_netState == RPT_NET_STATE::IDLE) {
setShortLC(m_slotNo, 0U);
m_display->clearDMR(m_slotNo);
}
if (writeEnd) {
if (m_netState == RS_NET_IDLE && m_duplex && !m_rfTimeout) {
if ((m_netState == RPT_NET_STATE::IDLE) && m_duplex && !m_rfTimeout) {
// Create a dummy start end frame
unsigned char data[DMR_FRAME_LENGTH_BYTES + 2U];
@ -1015,7 +1015,7 @@ void CDMRSlot::writeEndRF(bool writeEnd)
void CDMRSlot::writeEndNet(bool writeEnd)
{
m_netState = RS_NET_IDLE;
m_netState = RPT_NET_STATE::IDLE;
setShortLC(m_slotNo, 0U);
@ -1075,7 +1075,7 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData)
if (!m_enabled)
return;
if (m_rfState != RS_RF_LISTENING && m_netState == RS_NET_IDLE)
if ((m_rfState != RPT_RF_STATE::LISTENING) && (m_netState == RPT_NET_STATE::IDLE))
return;
m_networkWatchdog.start();
@ -1086,7 +1086,7 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData)
dmrData.getData(data + 2U);
if (dataType == DT_VOICE_LC_HEADER) {
if (m_netState == RS_NET_AUDIO)
if (m_netState == RPT_NET_STATE::AUDIO)
return;
CDMRFullLC fullLC;
@ -1102,12 +1102,12 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData)
if (dstId != dmrData.getDstId() || srcId != dmrData.getSrcId() || flco != dmrData.getFLCO())
LogWarning("DMR Slot %u, DMRD header doesn't match the DMR RF header: %u->%s%u %u->%s%u", m_slotNo,
dmrData.getSrcId(), dmrData.getFLCO() == FLCO_GROUP ? "TG" : "", dmrData.getDstId(),
srcId, flco == FLCO_GROUP ? "TG" : "", dstId);
dmrData.getSrcId(), dmrData.getFLCO() == FLCO::GROUP ? "TG" : "", dmrData.getDstId(),
srcId, flco == FLCO::GROUP ? "TG" : "", dstId);
if (m_ovcm == DMR_OVCM_RX_ON || m_ovcm == DMR_OVCM_ON)
if ((m_ovcm == DMR_OVCM::RX_ON) || (m_ovcm == DMR_OVCM::ON))
lc->setOVCM(true);
else if (m_ovcm == DMR_OVCM_FORCE_OFF)
else if (m_ovcm == DMR_OVCM::FORCE_OFF)
lc->setOVCM(false);
m_netLC = lc;
@ -1162,31 +1162,31 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData)
writeQueueNet(data);
}
m_netState = RS_NET_AUDIO;
m_netState = RPT_NET_STATE::AUDIO;
setShortLC(m_slotNo, dstId, flco, ACTIVITY_VOICE);
setShortLC(m_slotNo, dstId, flco, ACTIVITY_TYPE::VOICE);
std::string src = m_lookup->find(srcId);
std::string dst = m_lookup->find(dstId);
class CUserDBentry cn;
m_lookup->findWithName(srcId, &cn);
m_display->writeDMR(m_slotNo, cn, flco == FLCO_GROUP, dst, "N");
m_display->writeDMR(m_slotNo, cn, flco == FLCO::GROUP, dst, "N");
#if defined(DUMP_DMR)
openFile();
writeFile(data);
#endif
LogMessage("DMR Slot %u, received network voice header from %s to %s%s", m_slotNo, src.c_str(), flco == FLCO_GROUP ? "TG " : "", dst.c_str());
LogMessage("DMR Slot %u, received network voice header from %s to %s%s", m_slotNo, src.c_str(), flco == FLCO::GROUP ? "TG " : "", dst.c_str());
} else if (dataType == DT_VOICE_PI_HEADER) {
if (m_netState != RS_NET_AUDIO) {
if (m_netState != RPT_NET_STATE::AUDIO) {
CDMRLC* lc = new CDMRLC(dmrData.getFLCO(), dmrData.getSrcId(), dmrData.getDstId());
unsigned int dstId = lc->getDstId();
unsigned int srcId = lc->getSrcId();
if (m_ovcm == DMR_OVCM_RX_ON || m_ovcm == DMR_OVCM_ON)
if ((m_ovcm == DMR_OVCM::RX_ON) || (m_ovcm == DMR_OVCM::ON))
lc->setOVCM(true);
else if (m_ovcm == DMR_OVCM_FORCE_OFF)
else if (m_ovcm == DMR_OVCM::FORCE_OFF)
lc->setOVCM(false);
m_netLC = lc;
@ -1236,17 +1236,17 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData)
m_netBits = 1U;
m_netErrs = 0U;
m_netState = RS_NET_AUDIO;
m_netState = RPT_NET_STATE::AUDIO;
setShortLC(m_slotNo, dstId, m_netLC->getFLCO(), ACTIVITY_VOICE);
setShortLC(m_slotNo, dstId, m_netLC->getFLCO(), ACTIVITY_TYPE::VOICE);
std::string src = m_lookup->find(srcId);
std::string dst = m_lookup->find(dstId);
class CUserDBentry cn;
m_lookup->findWithName(srcId, &cn);
m_display->writeDMR(m_slotNo, cn, m_netLC->getFLCO() == FLCO_GROUP, dst, "N");
m_display->writeDMR(m_slotNo, cn, m_netLC->getFLCO() == FLCO::GROUP, dst, "N");
LogMessage("DMR Slot %u, received network late entry from %s to %s%s", m_slotNo, src.c_str(), m_netLC->getFLCO() == FLCO_GROUP ? "TG " : "", dst.c_str());
LogMessage("DMR Slot %u, received network late entry from %s to %s%s", m_slotNo, src.c_str(), m_netLC->getFLCO() == FLCO::GROUP ? "TG " : "", dst.c_str());
}
// Regenerate the Slot Type
@ -1274,7 +1274,7 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData)
writeFile(data);
#endif
} else if (dataType == DT_TERMINATOR_WITH_LC) {
if (m_netState != RS_NET_AUDIO)
if (m_netState != RPT_NET_STATE::AUDIO)
return;
// Regenerate the LC data
@ -1313,11 +1313,11 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData)
// We've received the voice header and terminator haven't we?
m_netFrames += 2U;
LogMessage("DMR Slot %u, received network end of voice transmission from %s to %s%s, %.1f seconds, %u%% packet loss, BER: %.1f%%", m_slotNo, src.c_str(), flco == FLCO_GROUP ? "TG " : "", dst.c_str(), float(m_netFrames) / 16.667F, (m_netLost * 100U) / m_netFrames, float(m_netErrs * 100U) / float(m_netBits));
LogMessage("DMR Slot %u, received network end of voice transmission from %s to %s%s, %.1f seconds, %u%% packet loss, BER: %.1f%%", m_slotNo, src.c_str(), flco == FLCO::GROUP ? "TG " : "", dst.c_str(), float(m_netFrames) / 16.667F, (m_netLost * 100U) / m_netFrames, float(m_netErrs * 100U) / float(m_netBits));
m_display->writeDMRTA(m_slotNo, NULL, " ");
writeEndNet();
} else if (dataType == DT_DATA_HEADER) {
if (m_netState == RS_NET_DATA)
if (m_netState == RPT_NET_STATE::DATA)
return;
CDMRDataHeader dataHeader;
@ -1354,9 +1354,9 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData)
writeQueueNet(data);
m_netState = RS_NET_DATA;
m_netState = RPT_NET_STATE::DATA;
setShortLC(m_slotNo, dstId, gi ? FLCO_GROUP : FLCO_USER_USER, ACTIVITY_DATA);
setShortLC(m_slotNo, dstId, gi ? FLCO::GROUP : FLCO::USER_USER, ACTIVITY_TYPE::DATA);
std::string src = m_lookup->find(srcId);
std::string dst = m_lookup->find(dstId);
@ -1370,15 +1370,15 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData)
writeEndNet();
}
} else if (dataType == DT_VOICE_SYNC) {
if (m_netState == RS_NET_IDLE) {
if (m_netState == RPT_NET_STATE::IDLE) {
CDMRLC* lc = new CDMRLC(dmrData.getFLCO(), dmrData.getSrcId(), dmrData.getDstId());
unsigned int dstId = lc->getDstId();
unsigned int srcId = lc->getSrcId();
if (m_ovcm == DMR_OVCM_RX_ON || m_ovcm == DMR_OVCM_ON)
if ((m_ovcm == DMR_OVCM::RX_ON) || (m_ovcm == DMR_OVCM::ON))
lc->setOVCM(true);
else if (m_ovcm == DMR_OVCM_FORCE_OFF)
else if (m_ovcm == DMR_OVCM::FORCE_OFF)
lc->setOVCM(false);
m_netLC = lc;
@ -1437,21 +1437,21 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData)
m_netEmbeddedWriteN = 1U;
m_netTalkerId = TALKER_ID_NONE;
m_netState = RS_NET_AUDIO;
m_netState = RPT_NET_STATE::AUDIO;
setShortLC(m_slotNo, dstId, m_netLC->getFLCO(), ACTIVITY_VOICE);
setShortLC(m_slotNo, dstId, m_netLC->getFLCO(), ACTIVITY_TYPE::VOICE);
std::string src = m_lookup->find(srcId);
std::string dst = m_lookup->find(dstId);
class CUserDBentry cn;
m_lookup->findWithName(srcId, &cn);
m_display->writeDMR(m_slotNo, cn, m_netLC->getFLCO() == FLCO_GROUP, dst, "N");
m_display->writeDMR(m_slotNo, cn, m_netLC->getFLCO() == FLCO::GROUP, dst, "N");
LogMessage("DMR Slot %u, received network late entry from %s to %s%s", m_slotNo, src.c_str(), m_netLC->getFLCO() == FLCO_GROUP ? "TG " : "", dst.c_str());
LogMessage("DMR Slot %u, received network late entry from %s to %s%s", m_slotNo, src.c_str(), m_netLC->getFLCO() == FLCO::GROUP ? "TG " : "", dst.c_str());
}
if (m_netState == RS_NET_AUDIO) {
if (m_netState == RPT_NET_STATE::AUDIO) {
unsigned char fid = m_netLC->getFID();
if (fid == FID_ETSI || fid == FID_DMRA)
m_netErrs += m_fec.regenerateDMR(data + 2U);
@ -1494,7 +1494,7 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData)
#endif
}
} else if (dataType == DT_VOICE) {
if (m_netState != RS_NET_AUDIO)
if (m_netState != RPT_NET_STATE::AUDIO)
return;
unsigned char fid = m_netLC->getFID();
@ -1517,19 +1517,19 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData)
char text[80U];
switch (flco) {
case FLCO_GROUP:
case FLCO_USER_USER:
case FLCO::GROUP:
case FLCO::USER_USER:
// ::sprintf(text, "DMR Slot %u, Embedded LC", m_slotNo);
// CUtils::dump(1U, text, data, 9U);
break;
case FLCO_GPS_INFO:
case FLCO::GINFO:
if (m_dumpTAData) {
::sprintf(text, "DMR Slot %u, Embedded GPS Info", m_slotNo);
CUtils::dump(1U, text, data, 9U);
logGPSPosition(data);
}
break;
case FLCO_TALKER_ALIAS_HEADER:
case FLCO::TALKER_ALIAS_HEADER:
if (!(m_netTalkerId & TALKER_ID_HEADER)) {
if (!m_netTalkerId)
m_netTalkerAlias.reset();
@ -1544,7 +1544,7 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData)
m_netTalkerId |= TALKER_ID_HEADER;
}
break;
case FLCO_TALKER_ALIAS_BLOCK1:
case FLCO::TALKER_ALIAS_BLOCK1:
if (!(m_netTalkerId & TALKER_ID_BLOCK1)) {
if (!m_netTalkerId)
m_netTalkerAlias.reset();
@ -1559,7 +1559,7 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData)
m_netTalkerId |= TALKER_ID_BLOCK1;
}
break;
case FLCO_TALKER_ALIAS_BLOCK2:
case FLCO::TALKER_ALIAS_BLOCK2:
if (!(m_netTalkerId & TALKER_ID_BLOCK2)) {
if (!m_netTalkerId)
m_netTalkerAlias.reset();
@ -1574,7 +1574,7 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData)
m_netTalkerId |= TALKER_ID_BLOCK2;
}
break;
case FLCO_TALKER_ALIAS_BLOCK3:
case FLCO::TALKER_ALIAS_BLOCK3:
if (!(m_netTalkerId & TALKER_ID_BLOCK3)) {
if (!m_netTalkerId)
m_netTalkerAlias.reset();
@ -1648,13 +1648,13 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData)
}
CSBKO csbko = csbk.getCSBKO();
if (csbko == CSBKO_BSDWNACT)
if (csbko == CSBKO::BSDWNACT)
return;
// set the OVCM bit for the supported csbk
if (m_ovcm == DMR_OVCM_RX_ON || m_ovcm == DMR_OVCM_ON)
if ((m_ovcm == DMR_OVCM::RX_ON) || (m_ovcm == DMR_OVCM::ON))
csbk.setOVCM(true);
else if (m_ovcm == DMR_OVCM_FORCE_OFF)
else if (m_ovcm == DMR_OVCM::FORCE_OFF)
csbk.setOVCM(false);
bool gi = csbk.getGI();
@ -1676,7 +1676,7 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData)
data[0U] = TAG_DATA;
data[1U] = 0x00U;
if (csbko == CSBKO_PRECCSBK && csbk.getDataContent()) {
if ((csbko == CSBKO::PRECCSBK) && csbk.getDataContent()) {
unsigned int cbf = NO_PREAMBLE_CSBK + csbk.getCBF() - 1U;
for (unsigned int i = 0U; i < NO_PREAMBLE_CSBK; i++, cbf--) {
// Change blocks to follow
@ -1709,25 +1709,25 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData)
std::string dst = m_lookup->find(dstId);
switch (csbko) {
case CSBKO_UUVREQ:
case CSBKO::UUVREQ:
LogMessage("DMR Slot %u, received network Unit to Unit Voice Service Request CSBK from %s to %s%s", m_slotNo, src.c_str(), gi ? "TG ": "", dst.c_str());
break;
case CSBKO_UUANSRSP:
case CSBKO::UUANSRSP:
LogMessage("DMR Slot %u, received network Unit to Unit Voice Service Answer Response CSBK from %s to %s%s", m_slotNo, src.c_str(), gi ? "TG ": "", dst.c_str());
break;
case CSBKO_NACKRSP:
case CSBKO::NACKRSP:
LogMessage("DMR Slot %u, received network Negative Acknowledgment Response CSBK from %s to %s%s", m_slotNo, src.c_str(), gi ? "TG ": "", dst.c_str());
break;
case CSBKO_PRECCSBK:
case CSBKO::PRECCSBK:
LogMessage("DMR Slot %u, received network %s Preamble CSBK (%u to follow) from %s to %s%s", m_slotNo, csbk.getDataContent() ? "Data" : "CSBK", csbk.getCBF(), src.c_str(), gi ? "TG " : "", dst.c_str());
break;
case CSBKO_CALL_ALERT:
case CSBKO::CALL_ALERT:
LogMessage("DMR Slot %u, received network Call Alert CSBK from %s to %s%s", m_slotNo, src.c_str(), gi ? "TG " : "", dst.c_str());
break;
case CSBKO_CALL_ALERT_ACK:
case CSBKO::CALL_ALERT_ACK:
LogMessage("DMR Slot %u, received network Call Alert Ack CSBK from %s to %s%s", m_slotNo, src.c_str(), gi ? "TG " : "", dst.c_str());
break;
case CSBKO_RADIO_CHECK:
case CSBKO::RADIO_CHECK:
LogMessage("DMR Slot %u, received network Radio Check %s CSBK from %s to %s%s", m_slotNo, /* TBD */ 1 ? "Req" : "Ack", src.c_str(), gi ? "TG " : "", dst.c_str());
break;
default:
@ -1736,12 +1736,12 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData)
}
// If data preamble, signal its existence
if (csbko == CSBKO_PRECCSBK && csbk.getDataContent()) {
setShortLC(m_slotNo, dstId, gi ? FLCO_GROUP : FLCO_USER_USER, ACTIVITY_DATA);
if ((csbko == CSBKO::PRECCSBK) && csbk.getDataContent()) {
setShortLC(m_slotNo, dstId, gi ? FLCO::GROUP : FLCO::USER_USER, ACTIVITY_TYPE::DATA);
m_display->writeDMR(m_slotNo, src, gi, dst, "N");
}
} else if (dataType == DT_RATE_12_DATA || dataType == DT_RATE_34_DATA || dataType == DT_RATE_1_DATA) {
if (m_netState != RS_NET_DATA || m_netFrames == 0U) {
} else if ((dataType == DT_RATE_12_DATA) || (dataType == DT_RATE_34_DATA) || (dataType == DT_RATE_1_DATA)) {
if ((m_netState != RPT_NET_STATE::DATA) || (m_netFrames == 0U)) {
writeEndNet();
return;
}
@ -1870,11 +1870,11 @@ void CDMRSlot::clock()
}
}
if (m_netState == RS_NET_AUDIO || m_netState == RS_NET_DATA) {
if ((m_netState == RPT_NET_STATE::AUDIO) || (m_netState == RPT_NET_STATE::DATA)) {
m_networkWatchdog.clock(ms);
if (m_networkWatchdog.hasExpired()) {
if (m_netState == RS_NET_AUDIO) {
if (m_netState == RPT_NET_STATE::AUDIO) {
// We've received the voice header haven't we?
m_netFrames += 1U;
LogMessage("DMR Slot %u, network watchdog has expired, %.1f seconds, %u%% packet loss, BER: %.1f%%", m_slotNo, float(m_netFrames) / 16.667F, (m_netLost * 100U) / m_netFrames, float(m_netErrs * 100U) / float(m_netBits));
@ -1892,7 +1892,7 @@ void CDMRSlot::clock()
}
}
if (m_netState == RS_NET_AUDIO) {
if (m_netState == RPT_NET_STATE::AUDIO) {
m_packetTimer.clock(ms);
if (m_packetTimer.isRunning() && m_packetTimer.hasExpired()) {
@ -1912,7 +1912,7 @@ void CDMRSlot::writeQueueRF(const unsigned char *data)
{
assert(data != NULL);
if (m_netState != RS_NET_IDLE)
if (m_netState != RPT_NET_STATE::IDLE)
return;
unsigned char len = DMR_FRAME_LENGTH_BYTES + 2U;
@ -1931,7 +1931,7 @@ void CDMRSlot::writeNetworkRF(const unsigned char* data, unsigned char dataType,
{
assert(data != NULL);
if (m_netState != RS_NET_IDLE)
if (m_netState != RPT_NET_STATE::IDLE)
return;
if (m_network == NULL)
@ -1979,7 +1979,7 @@ void CDMRSlot::writeQueueNet(const unsigned char *data)
m_queue.addData(data, len);
}
void CDMRSlot::init(unsigned int colorCode, bool embeddedLCOnly, bool dumpTAData, unsigned int callHang, CModem* modem, IDMRNetwork* network, CDisplay* display, bool duplex, CDMRLookup* lookup, CRSSIInterpolator* rssiMapper, unsigned int jitter, DMR_OVCM_TYPES ovcm, bool protect)
void CDMRSlot::init(unsigned int colorCode, bool embeddedLCOnly, bool dumpTAData, unsigned int callHang, CModem* modem, IDMRNetwork* network, CDisplay* display, bool duplex, CDMRLookup* lookup, CRSSIInterpolator* rssiMapper, unsigned int jitter, DMR_OVCM ovcm, bool protect)
{
assert(modem != NULL);
assert(display != NULL);
@ -2061,41 +2061,41 @@ void CDMRSlot::setShortLC(unsigned int slotNo, unsigned int id, FLCO flco, ACTIV
if (m_id1 != 0U) {
lc[2U] = m_id1;
if (m_activity1 == ACTIVITY_VOICE && m_flco1 == FLCO_GROUP)
if ((m_activity1 == ACTIVITY_TYPE::VOICE) && (m_flco1 == FLCO::GROUP))
lc[1U] |= 0x08U;
else if (m_activity1 == ACTIVITY_VOICE && m_flco1 == FLCO_USER_USER)
else if ((m_activity1 == ACTIVITY_TYPE::VOICE) && (m_flco1 == FLCO::USER_USER))
lc[1U] |= 0x09U;
else if (m_activity1 == ACTIVITY_DATA && m_flco1 == FLCO_GROUP)
else if ((m_activity1 == ACTIVITY_TYPE::DATA) && (m_flco1 == FLCO::GROUP))
lc[1U] |= 0x0BU;
else if (m_activity1 == ACTIVITY_DATA && m_flco1 == FLCO_USER_USER)
else if ((m_activity1 == ACTIVITY_TYPE::DATA) && (m_flco1 == FLCO::USER_USER))
lc[1U] |= 0x0AU;
else if (m_activity1 == ACTIVITY_CSBK && m_flco1 == FLCO_GROUP)
else if ((m_activity1 == ACTIVITY_TYPE::CSBK) && (m_flco1 == FLCO::GROUP))
lc[1U] |= 0x02U;
else if (m_activity1 == ACTIVITY_CSBK && m_flco1 == FLCO_USER_USER)
else if ((m_activity1 == ACTIVITY_TYPE::CSBK) && (m_flco1 == FLCO::USER_USER))
lc[1U] |= 0x03U;
else if (m_activity1 == ACTIVITY_EMERG && m_flco1 == FLCO_GROUP)
else if ((m_activity1 == ACTIVITY_TYPE::EMERG) && (m_flco1 == FLCO::GROUP))
lc[1U] |= 0x0CU;
else if (m_activity1 == ACTIVITY_EMERG && m_flco1 == FLCO_USER_USER)
else if ((m_activity1 == ACTIVITY_TYPE::EMERG) && (m_flco1 == FLCO::USER_USER))
lc[1U] |= 0x0DU;
}
if (m_id2 != 0U) {
lc[3U] = m_id2;
if (m_activity2 == ACTIVITY_VOICE && m_flco2 == FLCO_GROUP)
if ((m_activity2 == ACTIVITY_TYPE::VOICE) && (m_flco2 == FLCO::GROUP))
lc[1U] |= 0x80U;
else if (m_activity2 == ACTIVITY_VOICE && m_flco2 == FLCO_USER_USER)
else if ((m_activity2 == ACTIVITY_TYPE::VOICE) && (m_flco2 == FLCO::USER_USER))
lc[1U] |= 0x90U;
else if (m_activity2 == ACTIVITY_DATA && m_flco2 == FLCO_GROUP)
else if ((m_activity2 == ACTIVITY_TYPE::DATA) && (m_flco2 == FLCO::GROUP))
lc[1U] |= 0xB0U;
else if (m_activity2 == ACTIVITY_DATA && m_flco2 == FLCO_USER_USER)
else if ((m_activity2 == ACTIVITY_TYPE::DATA) && (m_flco2 == FLCO::USER_USER))
lc[1U] |= 0xA0U;
else if (m_activity2 == ACTIVITY_CSBK && m_flco2 == FLCO_GROUP)
else if ((m_activity2 == ACTIVITY_TYPE::CSBK) && (m_flco2 == FLCO::GROUP))
lc[1U] |= 0x20U;
else if (m_activity2 == ACTIVITY_CSBK && m_flco2 == FLCO_USER_USER)
else if ((m_activity2 == ACTIVITY_TYPE::CSBK) && (m_flco2 == FLCO::USER_USER))
lc[1U] |= 0x30U;
else if (m_activity2 == ACTIVITY_EMERG && m_flco2 == FLCO_GROUP)
else if ((m_activity2 == ACTIVITY_TYPE::EMERG) && (m_flco2 == FLCO::GROUP))
lc[1U] |= 0xC0U;
else if (m_activity2 == ACTIVITY_EMERG && m_flco2 == FLCO_USER_USER)
else if ((m_activity2 == ACTIVITY_TYPE::EMERG) && (m_flco2 == FLCO::USER_USER))
lc[1U] |= 0xD0U;
}
@ -2229,7 +2229,7 @@ void CDMRSlot::insertSilence(unsigned int count)
bool CDMRSlot::isBusy() const
{
return m_rfState != RS_RF_LISTENING || m_netState != RS_NET_IDLE;
return (m_rfState != RPT_RF_STATE::LISTENING) || (m_netState != RPT_NET_STATE::IDLE);
}
void CDMRSlot::enable(bool enabled)
@ -2238,7 +2238,7 @@ void CDMRSlot::enable(bool enabled)
m_queue.clear();
// Reset the RF section
m_rfState = RS_RF_LISTENING;
m_rfState = RPT_RF_STATE::LISTENING;
m_rfTimeoutTimer.stop();
m_rfTimeout = false;
@ -2254,7 +2254,7 @@ void CDMRSlot::enable(bool enabled)
m_rfLC = NULL;
// Reset the networking section
m_netState = RS_NET_IDLE;
m_netState = RPT_NET_STATE::IDLE;
m_lastFrameValid = false;

View file

@ -1,5 +1,5 @@
/*
* Copyright (C) 2015-2021,2023 by Jonathan Naylor G4KLX
* Copyright (C) 2015-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
@ -37,12 +37,12 @@
#include <vector>
enum ACTIVITY_TYPE {
ACTIVITY_NONE,
ACTIVITY_VOICE,
ACTIVITY_DATA,
ACTIVITY_CSBK,
ACTIVITY_EMERG
enum class ACTIVITY_TYPE {
NONE,
VOICE,
DATA,
CSBK,
EMERG
};
class CDMRSlot {
@ -62,7 +62,7 @@ public:
void enable(bool enabled);
static void init(unsigned int colorCode, bool embeddedLCOnly, bool dumpTAData, unsigned int callHang, CModem* modem, IDMRNetwork* network, CDisplay* display, bool duplex, CDMRLookup* lookup, CRSSIInterpolator* rssiMapper, unsigned int jitter, DMR_OVCM_TYPES ovcm, bool protect);
static void init(unsigned int colorCode, bool embeddedLCOnly, bool dumpTAData, unsigned int callHang, CModem* modem, IDMRNetwork* network, CDisplay* display, bool duplex, CDMRLookup* lookup, CRSSIInterpolator* rssiMapper, unsigned int jitter, DMR_OVCM ovcm, bool protect);
private:
unsigned int m_slotNo;
@ -124,7 +124,7 @@ private:
static bool m_duplex;
static CDMRLookup* m_lookup;
static unsigned int m_hangCount;
static DMR_OVCM_TYPES m_ovcm;
static DMR_OVCM m_ovcm;
static bool m_protect;
static CRSSIInterpolator* m_rssiMapper;
@ -158,7 +158,7 @@ private:
bool insertSilence(const unsigned char* data, unsigned char seqNo);
void insertSilence(unsigned int count);
static void setShortLC(unsigned int slotNo, unsigned int id, FLCO flco = FLCO_GROUP, ACTIVITY_TYPE type = ACTIVITY_NONE);
static void setShortLC(unsigned int slotNo, unsigned int id, FLCO flco = FLCO::GROUP, ACTIVITY_TYPE type = ACTIVITY_TYPE::NONE);
};
#endif

View file

@ -37,7 +37,7 @@ bool CallsignCompare(const std::string& arg, const unsigned char* my)
// #define DUMP_DSTAR
CDStarControl::CDStarControl(const std::string& callsign, const std::string& module, bool selfOnly, bool ackReply, unsigned int ackTime, DSTAR_ACK_MESSAGE ackMessage, bool errorReply, const std::vector<std::string>& blackList, const std::vector<std::string>& whiteList, CDStarNetwork* network, CDisplay* display, unsigned int timeout, bool duplex, bool remoteGateway, CRSSIInterpolator* rssiMapper) :
CDStarControl::CDStarControl(const std::string& callsign, const std::string& module, bool selfOnly, bool ackReply, unsigned int ackTime, DSTAR_ACK ackMessage, bool errorReply, const std::vector<std::string>& blackList, const std::vector<std::string>& whiteList, CDStarNetwork* network, CDisplay* display, unsigned int timeout, bool duplex, bool remoteGateway, CRSSIInterpolator* rssiMapper) :
m_callsign(NULL),
m_gateway(NULL),
m_selfOnly(selfOnly),
@ -53,8 +53,8 @@ m_duplex(duplex),
m_queue(5000U, "D-Star Control"),
m_rfHeader(),
m_netHeader(),
m_rfState(RS_RF_LISTENING),
m_netState(RS_NET_IDLE),
m_rfState(RPT_RF_STATE::LISTENING),
m_netState(RPT_NET_STATE::IDLE),
m_net(false),
m_rfSlowData(),
m_netSlowData(),
@ -129,7 +129,7 @@ bool CDStarControl::writeModem(unsigned char *data, unsigned int len)
unsigned char type = data[0U];
if (type == TAG_LOST && ((m_rfState == RS_RF_AUDIO) || (m_rfState == RS_RF_DATA))) {
if (type == TAG_LOST && ((m_rfState == RPT_RF_STATE::AUDIO) || (m_rfState == RPT_RF_STATE::DATA))) {
unsigned char my1[DSTAR_LONG_CALLSIGN_LENGTH];
unsigned char my2[DSTAR_SHORT_CALLSIGN_LENGTH];
unsigned char your[DSTAR_LONG_CALLSIGN_LENGTH];
@ -145,10 +145,10 @@ bool CDStarControl::writeModem(unsigned char *data, unsigned int len)
return false;
}
if (type == TAG_LOST && m_rfState == RS_RF_INVALID) {
m_rfState = RS_RF_LISTENING;
if ((type == TAG_LOST) && (m_rfState == RPT_RF_STATE::INVALID)) {
m_rfState = RPT_RF_STATE::LISTENING;
if (m_netState == RS_NET_IDLE) {
if (m_netState == RPT_NET_STATE::IDLE) {
if (m_errorReply)
m_errTimer.start();
@ -160,7 +160,7 @@ bool CDStarControl::writeModem(unsigned char *data, unsigned int len)
}
if (type == TAG_LOST) {
m_rfState = RS_RF_LISTENING;
m_rfState = RPT_RF_STATE::LISTENING;
return false;
}
@ -220,7 +220,7 @@ bool CDStarControl::writeModem(unsigned char *data, unsigned int len)
// Is this a transmission destined for a repeater?
if (!header.isRepeater()) {
LogMessage("D-Star, non repeater RF header received from %8.8s", my1);
m_rfState = RS_RF_INVALID;
m_rfState = RPT_RF_STATE::INVALID;
return true;
}
@ -230,19 +230,19 @@ bool CDStarControl::writeModem(unsigned char *data, unsigned int len)
// Is it for us?
if (::memcmp(callsign, m_callsign, DSTAR_LONG_CALLSIGN_LENGTH) != 0) {
LogMessage("D-Star, received RF header for wrong repeater (%8.8s) from %8.8s", callsign, my1);
m_rfState = RS_RF_INVALID;
m_rfState = RPT_RF_STATE::INVALID;
return true;
}
if (m_selfOnly && ::memcmp(my1, m_callsign, DSTAR_LONG_CALLSIGN_LENGTH - 1U) != 0 && !(std::find_if(m_whiteList.begin(), m_whiteList.end(), std::bind(CallsignCompare, std::placeholders::_1, my1)) != m_whiteList.end())) {
LogMessage("D-Star, invalid access attempt from %8.8s", my1);
m_rfState = RS_RF_REJECTED;
m_rfState = RPT_RF_STATE::REJECTED;
return true;
}
if (!m_selfOnly && std::find_if(m_blackList.begin(), m_blackList.end(), std::bind(CallsignCompare, std::placeholders::_1, my1)) != m_blackList.end()) {
LogMessage("D-Star, invalid access attempt from %8.8s", my1);
m_rfState = RS_RF_REJECTED;
m_rfState = RPT_RF_STATE::REJECTED;
return true;
}
@ -297,21 +297,21 @@ bool CDStarControl::writeModem(unsigned char *data, unsigned int len)
writeNetworkHeaderRF(data);
}
m_rfState = RS_RF_AUDIO;
m_rfState = RPT_RF_STATE::AUDIO;
if (m_netState == RS_NET_IDLE) {
if (m_netState == RPT_NET_STATE::IDLE) {
m_display->writeDStar((char*)my1, (char*)my2, (char*)your, "R", " ");
m_display->writeDStarRSSI(m_rssi);
}
LogMessage("D-Star, received RF header from %8.8s/%4.4s to %8.8s", my1, my2, your);
} else if (type == TAG_EOT) {
if (m_rfState == RS_RF_REJECTED) {
m_rfState = RS_RF_LISTENING;
} else if (m_rfState == RS_RF_INVALID) {
m_rfState = RS_RF_LISTENING;
if (m_rfState == RPT_RF_STATE::REJECTED) {
m_rfState = RPT_RF_STATE::LISTENING;
} else if (m_rfState == RPT_RF_STATE::INVALID) {
m_rfState = RPT_RF_STATE::LISTENING;
if (m_netState == RS_NET_IDLE) {
if (m_netState == RPT_NET_STATE::IDLE) {
if (m_errorReply)
m_errTimer.start();
@ -320,7 +320,7 @@ bool CDStarControl::writeModem(unsigned char *data, unsigned int len)
}
return false;
} else if ((m_rfState == RS_RF_AUDIO) || (m_rfState == RS_RF_DATA)) {
} else if ((m_rfState == RPT_RF_STATE::AUDIO) || (m_rfState == RPT_RF_STATE::DATA)) {
if (m_net)
writeNetworkDataRF(DSTAR_END_PATTERN_BYTES, 0U, true);
@ -344,24 +344,24 @@ bool CDStarControl::writeModem(unsigned char *data, unsigned int len)
return false;
} else if (type == TAG_DATA) {
if (m_rfState == RS_RF_REJECTED)
if (m_rfState == RPT_RF_STATE::REJECTED)
return true;
if (m_rfState == RS_RF_INVALID)
if (m_rfState == RPT_RF_STATE::INVALID)
return true;
if (m_rfState == RS_RF_LISTENING) {
if (m_rfState == RPT_RF_STATE::LISTENING) {
// The sync is regenerated by the modem so can do exact match
if (::memcmp(data + 1U + DSTAR_VOICE_FRAME_LENGTH_BYTES, DSTAR_SYNC_BYTES, DSTAR_DATA_FRAME_LENGTH_BYTES) == 0) {
m_rfSlowData.start();
m_rfN = 0U;
m_rfState = RS_RF_LATE_ENTRY;
m_rfState = RPT_RF_STATE::LATE_ENTRY;
}
return false;
}
if ((m_rfState == RS_RF_AUDIO) || (m_rfState == RS_RF_DATA)) {
if ((m_rfState == RPT_RF_STATE::AUDIO) || (m_rfState == RPT_RF_STATE::DATA)) {
// The sync is regenerated by the modem so can do exact match
if (::memcmp(data + 1U + DSTAR_VOICE_FRAME_LENGTH_BYTES, DSTAR_SYNC_BYTES, DSTAR_DATA_FRAME_LENGTH_BYTES) == 0) {
m_rfSlowData.start();
@ -369,17 +369,17 @@ bool CDStarControl::writeModem(unsigned char *data, unsigned int len)
}
}
if (m_rfState == RS_RF_AUDIO) {
if (m_rfState == RPT_RF_STATE::AUDIO) {
m_rfSlowData.peakSlowData(data + 1U, m_rfN);
unsigned char type = m_rfSlowData.getType();
if (type == DSTAR_SLOW_DATA_TYPE_FASTDATA_BEGIN) {
LogMessage("D-Star, starting fast data mode");
m_rfState = RS_RF_DATA;
m_rfState = RPT_RF_STATE::DATA;
}
}
if (m_rfState == RS_RF_DATA) {
if (m_rfState == RPT_RF_STATE::DATA) {
LogDebug("D-Star, fast data sequence no. %u", m_rfN);
m_rfBits += 48U;
@ -398,12 +398,12 @@ bool CDStarControl::writeModem(unsigned char *data, unsigned int len)
unsigned char type = m_rfSlowData.getType();
if (type == DSTAR_SLOW_DATA_TYPE_FASTDATA_END) {
LogMessage("D-Star, leaving fast data mode");
m_rfState = RS_RF_AUDIO;
m_rfState = RPT_RF_STATE::AUDIO;
}
}
m_rfN = (m_rfN + 1U) % 21U;
} else if (m_rfState == RS_RF_AUDIO) {
} else if (m_rfState == RPT_RF_STATE::AUDIO) {
// Send the RSSI data to the display
if (m_rfN == 0U)
m_display->writeDStarRSSI(m_rssi);
@ -438,7 +438,7 @@ bool CDStarControl::writeModem(unsigned char *data, unsigned int len)
m_rfN = (m_rfN + 1U) % 21U;
}
if (m_rfState == RS_RF_LATE_ENTRY) {
if (m_rfState == RPT_RF_STATE::LATE_ENTRY) {
// The sync is regenerated by the modem so can do exact match
if (::memcmp(data + 1U + DSTAR_VOICE_FRAME_LENGTH_BYTES, DSTAR_SYNC_BYTES, DSTAR_DATA_FRAME_LENGTH_BYTES) == 0) {
m_rfSlowData.reset();
@ -461,7 +461,7 @@ bool CDStarControl::writeModem(unsigned char *data, unsigned int len)
// Is this a transmission destined for a repeater?
if (!m_rfHeader.isRepeater()) {
LogMessage("D-Star, non repeater RF header received from %8.8s", my1);
m_rfState = RS_RF_INVALID;
m_rfState = RPT_RF_STATE::INVALID;
return true;
}
@ -471,19 +471,19 @@ bool CDStarControl::writeModem(unsigned char *data, unsigned int len)
// Is it for us?
if (::memcmp(callsign, m_callsign, DSTAR_LONG_CALLSIGN_LENGTH) != 0) {
LogMessage("D-Star, received RF header for wrong repeater (%8.8s) from %8.8s", callsign, my1);
m_rfState = RS_RF_INVALID;
m_rfState = RPT_RF_STATE::INVALID;
return true;
}
if (m_selfOnly && ::memcmp(my1, m_callsign, DSTAR_LONG_CALLSIGN_LENGTH - 1U) != 0 && !(std::find_if(m_whiteList.begin(), m_whiteList.end(), std::bind(CallsignCompare, std::placeholders::_1, my1)) != m_whiteList.end())) {
LogMessage("D-Star, invalid access attempt from %8.8s", my1);
m_rfState = RS_RF_REJECTED;
m_rfState = RPT_RF_STATE::REJECTED;
return true;
}
if (!m_selfOnly && std::find_if(m_blackList.begin(), m_blackList.end(), std::bind(CallsignCompare, std::placeholders::_1, my1)) != m_blackList.end()) {
LogMessage("D-Star, invalid access attempt from %8.8s", my1);
m_rfState = RS_RF_REJECTED;
m_rfState = RPT_RF_STATE::REJECTED;
return true;
}
@ -564,9 +564,9 @@ bool CDStarControl::writeModem(unsigned char *data, unsigned int len)
writeQueueDataRF(data);
}
m_rfState = RS_RF_AUDIO;
m_rfState = RPT_RF_STATE::AUDIO;
if (m_netState == RS_NET_IDLE) {
if (m_netState == RPT_NET_STATE::IDLE) {
m_display->writeDStar((char*)my1, (char*)my2, (char*)your, "R", " ");
m_display->writeDStarRSSI(m_rssi);
m_display->writeDStarBER(float(errors) / 0.48F);
@ -600,11 +600,11 @@ unsigned int CDStarControl::readModem(unsigned char* data)
void CDStarControl::writeEndRF()
{
m_rfState = RS_RF_LISTENING;
m_rfState = RPT_RF_STATE::LISTENING;
m_rfTimeoutTimer.stop();
if (m_netState == RS_NET_IDLE) {
if (m_netState == RPT_NET_STATE::IDLE) {
m_display->clearDStar();
m_ackTimer.start();
@ -616,7 +616,7 @@ void CDStarControl::writeEndRF()
void CDStarControl::writeEndNet()
{
m_netState = RS_NET_IDLE;
m_netState = RPT_NET_STATE::IDLE;
m_lastFrameValid = false;
@ -646,7 +646,7 @@ void CDStarControl::writeNetwork()
if (!m_enabled)
return;
if (((m_rfState == RS_RF_AUDIO) || (m_rfState == RS_RF_DATA)) && (m_netState == RS_NET_IDLE))
if (((m_rfState == RPT_RF_STATE::AUDIO) || (m_rfState == RPT_RF_STATE::DATA)) && (m_netState == RPT_NET_STATE::IDLE))
return;
m_networkWatchdog.start();
@ -654,7 +654,7 @@ void CDStarControl::writeNetwork()
unsigned char type = data[0U];
if (type == TAG_HEADER) {
if (m_netState != RS_NET_IDLE)
if (m_netState != RPT_NET_STATE::IDLE)
return;
CDStarHeader header(data + 1U);
@ -698,12 +698,12 @@ void CDStarControl::writeNetwork()
openFile();
writeFile(data + 1U, length - 1U);
#endif
m_netState = RS_NET_AUDIO;
m_netState = RPT_NET_STATE::AUDIO;
LINK_STATUS status = LS_NONE;
LINK_STATUS status = LINK_STATUS::NONE;
unsigned char reflector[DSTAR_LONG_CALLSIGN_LENGTH];
m_network->getStatus(status, reflector);
if (status == LS_LINKED_DEXTRA || status == LS_LINKED_DPLUS || status == LS_LINKED_DCS || status == LS_LINKED_CCS || status == LS_LINKED_LOOPBACK) {
if ((status == LINK_STATUS::LINKED_DEXTRA) || (status == LINK_STATUS::LINKED_DPLUS) || (status == LINK_STATUS::LINKED_DCS) || (status == LINK_STATUS::LINKED_CCS) || (status == LINK_STATUS::LINKED_LOOPBACK)) {
m_display->writeDStar((char*)my1, (char*)my2, (char*)your, "N", (char*) reflector);
LogMessage("D-Star, received network header from %8.8s/%4.4s to %8.8s via %8.8s", my1, my2, your, reflector);
} else {
@ -713,7 +713,7 @@ void CDStarControl::writeNetwork()
m_elapsed.start();
} else if (type == TAG_EOT) {
if ((m_netState != RS_NET_AUDIO) && (m_netState != RS_NET_DATA))
if ((m_netState != RPT_NET_STATE::AUDIO) && (m_netState != RPT_NET_STATE::DATA))
return;
writeQueueEOTNet();
@ -737,7 +737,7 @@ void CDStarControl::writeNetwork()
writeEndNet();
} else if (type == TAG_DATA) {
if ((m_netState == RS_NET_AUDIO) || (m_netState == RS_NET_DATA)) {
if ((m_netState == RPT_NET_STATE::AUDIO) || (m_netState == RPT_NET_STATE::DATA)) {
unsigned char n = data[1U];
// The sync is regenerated by the modem so can do exact match
@ -746,17 +746,17 @@ void CDStarControl::writeNetwork()
} else {
m_netSlowData.peakSlowData(data + 1U, n);
if (m_netState == RS_NET_AUDIO) {
if (m_netState == RPT_NET_STATE::AUDIO) {
unsigned char type = m_netSlowData.getType();
if (type == DSTAR_SLOW_DATA_TYPE_FASTDATA_BEGIN) {
LogMessage("D-Star, starting fast data mode");
m_netState = RS_NET_DATA;
m_netState = RPT_NET_STATE::DATA;
}
}
}
}
if (m_netState == RS_NET_AUDIO) {
if (m_netState == RPT_NET_STATE::AUDIO) {
unsigned char n = data[1U];
unsigned int errors = 0U;
@ -796,7 +796,7 @@ void CDStarControl::writeNetwork()
writeQueueDataNet(data + 1U);
}
if (m_netState == RS_NET_DATA) {
if (m_netState == RPT_NET_STATE::DATA) {
m_netN = data[1U];
data[1U] = TAG_DATA;
@ -814,7 +814,7 @@ void CDStarControl::writeNetwork()
unsigned char type = m_netSlowData.getType();
if (type == DSTAR_SLOW_DATA_TYPE_FASTDATA_END) {
LogMessage("D-Star, leaving fast data mode");
m_netState = RS_NET_AUDIO;
m_netState = RPT_NET_STATE::AUDIO;
}
}
}
@ -855,7 +855,7 @@ void CDStarControl::clock()
m_rfTimeoutTimer.clock(ms);
m_netTimeoutTimer.clock(ms);
if (m_netState == RS_NET_AUDIO) {
if (m_netState == RPT_NET_STATE::AUDIO) {
m_networkWatchdog.clock(ms);
if (m_networkWatchdog.hasExpired()) {
@ -870,7 +870,7 @@ void CDStarControl::clock()
}
// Only insert silence on audio data
if (m_netState == RS_NET_AUDIO) {
if (m_netState == RPT_NET_STATE::AUDIO) {
m_packetTimer.clock(ms);
if (m_packetTimer.isRunning() && m_packetTimer.hasExpired()) {
@ -894,7 +894,7 @@ void CDStarControl::writeQueueHeaderRF(const unsigned char *data)
{
assert(data != NULL);
if (m_netState != RS_NET_IDLE)
if (m_netState != RPT_NET_STATE::IDLE)
return;
if (m_rfTimeoutTimer.isRunning() && m_rfTimeoutTimer.hasExpired())
@ -917,7 +917,7 @@ void CDStarControl::writeQueueDataRF(const unsigned char *data)
{
assert(data != NULL);
if (m_netState != RS_NET_IDLE)
if (m_netState != RPT_NET_STATE::IDLE)
return;
if (m_rfTimeoutTimer.isRunning() && m_rfTimeoutTimer.hasExpired())
@ -938,7 +938,7 @@ void CDStarControl::writeQueueDataRF(const unsigned char *data)
void CDStarControl::writeQueueEOTRF()
{
if (m_netState != RS_NET_IDLE)
if (m_netState != RPT_NET_STATE::IDLE)
return;
if (m_rfTimeoutTimer.isRunning() && m_rfTimeoutTimer.hasExpired())
@ -1028,7 +1028,7 @@ void CDStarControl::writeNetworkHeaderRF(const unsigned char* data)
if (m_rfTimeoutTimer.isRunning() && m_rfTimeoutTimer.hasExpired())
return;
m_network->writeHeader(data + 1U, DSTAR_HEADER_LENGTH_BYTES, m_netState != RS_NET_IDLE);
m_network->writeHeader(data + 1U, DSTAR_HEADER_LENGTH_BYTES, m_netState != RPT_NET_STATE::IDLE);
}
void CDStarControl::writeNetworkDataRF(const unsigned char* data, unsigned int errors, bool end)
@ -1042,7 +1042,7 @@ void CDStarControl::writeNetworkDataRF(const unsigned char* data, unsigned int e
if (m_rfTimeoutTimer.isRunning() && m_rfTimeoutTimer.hasExpired())
return;
m_network->writeData(data + 1U, DSTAR_FRAME_LENGTH_BYTES, errors, end, m_netState != RS_NET_IDLE);
m_network->writeData(data + 1U, DSTAR_FRAME_LENGTH_BYTES, errors, end, m_netState != RPT_NET_STATE::IDLE);
}
bool CDStarControl::openFile()
@ -1184,20 +1184,20 @@ void CDStarControl::sendAck()
writeQueueDataRF(DSTAR_NULL_FRAME_SYNC_BYTES);
LINK_STATUS status = LS_NONE;
LINK_STATUS status = LINK_STATUS::NONE;
unsigned char reflector[DSTAR_LONG_CALLSIGN_LENGTH];
if (m_network != NULL)
m_network->getStatus(status, reflector);
char text[40U];
if (m_ackMessage == DSTAR_ACK_RSSI && m_rssi != 0) {
if (status == LS_LINKED_DEXTRA || status == LS_LINKED_DPLUS || status == LS_LINKED_DCS || status == LS_LINKED_CCS || status == LS_LINKED_LOOPBACK) {
if ((m_ackMessage == DSTAR_ACK::RSSI) && (m_rssi != 0U)) {
if ((status == LINK_STATUS::LINKED_DEXTRA) || (status == LINK_STATUS::LINKED_DPLUS) || (status == LINK_STATUS::LINKED_DCS) || (status == LINK_STATUS::LINKED_CCS) || (status == LINK_STATUS::LINKED_LOOPBACK)) {
CUtils::removeChar(reflector, ' ');//remove space from reflector so all nicely fits onto 20 chars in case rssi < 99dBm
::sprintf(text, "%-8.8s %.1f%% -%udBm ", reflector, float(m_rfErrs * 100U) / float(m_rfBits), m_aveRSSI / m_rssiCount);
} else {
::sprintf(text, "BER:%.1f%% -%udBm ", float(m_rfErrs * 100U) / float(m_rfBits), m_aveRSSI / m_rssiCount);
}
} else if (m_ackMessage == DSTAR_ACK_SMETER && m_rssi != 0) {
} else if ((m_ackMessage == DSTAR_ACK::SMETER) && (m_rssi != 0U)) {
unsigned int signal, plus;
char signalText[15U];
CSMeter::getSignal(m_aveRSSI / m_rssiCount, signal, plus);
@ -1206,12 +1206,12 @@ void CDStarControl::sendAck()
else
::sprintf(signalText, "S%u", signal);
if (status == LS_LINKED_DEXTRA || status == LS_LINKED_DPLUS || status == LS_LINKED_DCS || status == LS_LINKED_CCS || status == LS_LINKED_LOOPBACK)
if ((status == LINK_STATUS::LINKED_DEXTRA) || (status == LINK_STATUS::LINKED_DPLUS) || (status == LINK_STATUS::LINKED_DCS) || (status == LINK_STATUS::LINKED_CCS) || (status == LINK_STATUS::LINKED_LOOPBACK))
::sprintf(text, "%-8.8s %.1f%% %s ", reflector, float(m_rfErrs * 100U) / float(m_rfBits), signalText);
else
::sprintf(text, "BER:%.1f%% %s ", float(m_rfErrs * 100U) / float(m_rfBits), signalText);
} else {
if (status == LS_LINKED_DEXTRA || status == LS_LINKED_DPLUS || status == LS_LINKED_DCS || status == LS_LINKED_CCS || status == LS_LINKED_LOOPBACK)
if ((status == LINK_STATUS::LINKED_DEXTRA) || (status == LINK_STATUS::LINKED_DPLUS) || (status == LINK_STATUS::LINKED_DCS) || (status == LINK_STATUS::LINKED_CCS) || (status == LINK_STATUS::LINKED_LOOPBACK))
::sprintf(text, "%-8.8s BER: %.1f%% ", reflector, float(m_rfErrs * 100U) / float(m_rfBits));
else
::sprintf(text, "BER: %.1f%% ", float(m_rfErrs * 100U) / float(m_rfBits));
@ -1249,20 +1249,20 @@ void CDStarControl::sendError()
writeQueueDataRF(DSTAR_NULL_FRAME_SYNC_BYTES);
LINK_STATUS status = LS_NONE;
LINK_STATUS status = LINK_STATUS::NONE;
unsigned char reflector[DSTAR_LONG_CALLSIGN_LENGTH];
if (m_network != NULL)
m_network->getStatus(status, reflector);
char text[40U];
if (m_ackMessage == DSTAR_ACK_RSSI && m_rssi != 0) {
if (status == LS_LINKED_DEXTRA || status == LS_LINKED_DPLUS || status == LS_LINKED_DCS || status == LS_LINKED_CCS || status == LS_LINKED_LOOPBACK) {
if ((m_ackMessage == DSTAR_ACK::RSSI) && (m_rssi != 0U)) {
if ((status == LINK_STATUS::LINKED_DEXTRA) || (status == LINK_STATUS::LINKED_DPLUS) || (status == LINK_STATUS::LINKED_DCS) || (status == LINK_STATUS::LINKED_CCS) || (status == LINK_STATUS::LINKED_LOOPBACK)) {
CUtils::removeChar(reflector, ' ');//remove space from reflector so all nicely fits onto 20 chars in case rssi < 99dBm
::sprintf(text, "%-8.8s %.1f%% -%udBm ", reflector, float(m_rfErrs * 100U) / float(m_rfBits), m_aveRSSI / m_rssiCount);
} else {
::sprintf(text, "BER:%.1f%% -%udBm ", float(m_rfErrs * 100U) / float(m_rfBits), m_aveRSSI / m_rssiCount);
}
} else if (m_ackMessage == DSTAR_ACK_SMETER && m_rssi != 0) {
} else if ((m_ackMessage == DSTAR_ACK::SMETER) && (m_rssi != 0U)) {
unsigned int signal, plus;
char signalText[15U];
CSMeter::getSignal(m_aveRSSI / m_rssiCount, signal, plus);
@ -1271,12 +1271,12 @@ void CDStarControl::sendError()
else
::sprintf(signalText, "S%u", signal);
if (status == LS_LINKED_DEXTRA || status == LS_LINKED_DPLUS || status == LS_LINKED_DCS || status == LS_LINKED_CCS || status == LS_LINKED_LOOPBACK)
if ((status == LINK_STATUS::LINKED_DEXTRA) || (status == LINK_STATUS::LINKED_DPLUS) || (status == LINK_STATUS::LINKED_DCS) || (status == LINK_STATUS::LINKED_CCS) || (status == LINK_STATUS::LINKED_LOOPBACK))
::sprintf(text, "%-8.8s %.1f%% %s ", reflector, float(m_rfErrs * 100U) / float(m_rfBits), signalText);
else
::sprintf(text, "BER:%.1f%% %s ", float(m_rfErrs * 100U) / float(m_rfBits), signalText);
} else {
if (status == LS_LINKED_DEXTRA || status == LS_LINKED_DPLUS || status == LS_LINKED_DCS || status == LS_LINKED_CCS || status == LS_LINKED_LOOPBACK)
if ((status == LINK_STATUS::LINKED_DEXTRA) || (status == LINK_STATUS::LINKED_DPLUS) || (status == LINK_STATUS::LINKED_DCS) || (status == LINK_STATUS::LINKED_CCS) || (status == LINK_STATUS::LINKED_LOOPBACK))
::sprintf(text, "%-8.8s BER: %.1f%% ", reflector, float(m_rfErrs * 100U) / float(m_rfBits));
else
::sprintf(text, "BER: %.1f%% ", float(m_rfErrs * 100U) / float(m_rfBits));
@ -1296,7 +1296,7 @@ void CDStarControl::sendError()
bool CDStarControl::isBusy() const
{
return m_rfState != RS_RF_LISTENING || m_netState != RS_NET_IDLE;
return (m_rfState != RPT_RF_STATE::LISTENING) || (m_netState != RPT_NET_STATE::IDLE);
}
void CDStarControl::enable(bool enabled)
@ -1305,12 +1305,12 @@ void CDStarControl::enable(bool enabled)
m_queue.clear();
// Reset the RF section
m_rfState = RS_RF_LISTENING;
m_rfState = RPT_RF_STATE::LISTENING;
m_rfTimeoutTimer.stop();
// Reset the networking section
m_netState = RS_NET_IDLE;
m_netState = RPT_NET_STATE::IDLE;
m_lastFrameValid = false;

View file

@ -37,7 +37,7 @@
class CDStarControl {
public:
CDStarControl(const std::string& callsign, const std::string& module, bool selfOnly, bool ackReply, unsigned int ackTime, DSTAR_ACK_MESSAGE ackMessage, bool errorReply, const std::vector<std::string>& blackList, const std::vector<std::string>& whiteList, CDStarNetwork* network, CDisplay* display, unsigned int timeout, bool duplex, bool remoteGateway, CRSSIInterpolator* rssiMapper);
CDStarControl(const std::string& callsign, const std::string& module, bool selfOnly, bool ackReply, unsigned int ackTime, DSTAR_ACK ackMessage, bool errorReply, const std::vector<std::string>& blackList, const std::vector<std::string>& whiteList, CDStarNetwork* network, CDisplay* display, unsigned int timeout, bool duplex, bool remoteGateway, CRSSIInterpolator* rssiMapper);
~CDStarControl();
bool writeModem(unsigned char* data, unsigned int len);
@ -55,7 +55,7 @@ private:
unsigned char* m_gateway;
bool m_selfOnly;
bool m_ackReply;
DSTAR_ACK_MESSAGE m_ackMessage;
DSTAR_ACK m_ackMessage;
bool m_errorReply;
bool m_remoteGateway;
std::vector<std::string> m_blackList;

View file

@ -1,5 +1,5 @@
/*
* Copyright (C) 2015,2016,2018,2019,2021 by Jonathan Naylor G4KLX
* Copyright (C) 2015,2016,2018,2019,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
@ -66,7 +66,7 @@ const unsigned char DSTAR_URGENT_MASK = 0x08U;
const unsigned char DSTAR_REPEATER_CONTROL = 0x07U;
const unsigned char DSTAR_AUTO_REPLY = 0x06U;
const unsigned char DSTAR_RESEND_REQUESTED = 0x04U;
const unsigned char DSTAR_ACK_FLAG = 0x03U;
const unsigned char FLAG = 0x03U;
const unsigned char DSTAR_NO_RESPONSE = 0x02U;
const unsigned char DSTAR_RELAY_UNAVAILABLE = 0x01U;
@ -77,19 +77,19 @@ const unsigned char DSTAR_DTMF_SIG[] = { 0x82U, 0x08U, 0x20U, 0x82U, 0x00U, 0x0
const unsigned int DSTAR_FRAME_TIME = 20U;
enum LINK_STATUS {
LS_NONE,
LS_PENDING_IRCDDB,
LS_LINKING_LOOPBACK,
LS_LINKING_DEXTRA,
LS_LINKING_DPLUS,
LS_LINKING_DCS,
LS_LINKING_CCS,
LS_LINKED_LOOPBACK,
LS_LINKED_DEXTRA,
LS_LINKED_DPLUS,
LS_LINKED_DCS,
LS_LINKED_CCS
enum class LINK_STATUS {
NONE,
PENDING_IRCDDB,
LINKING_LOOPBACK,
LINKING_DEXTRA,
LINKING_DPLUS,
LINKING_DCS,
LINKING_CCS,
LINKED_LOOPBACK,
LINKED_DEXTRA,
LINKED_DPLUS,
LINKED_DCS,
LINKED_CCS
};
#endif

View file

@ -1,5 +1,5 @@
/*
* Copyright (C) 2009-2014,2016,2019,2020,2021,2024 by Jonathan Naylor G4KLX
* Copyright (C) 2009-2014,2016,2019,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
@ -43,7 +43,7 @@ m_outSeq(0U),
m_inId(0U),
m_buffer(1000U, "D-Star Network"),
m_pollTimer(1000U, 60U),
m_linkStatus(LS_NONE),
m_linkStatus(LINK_STATUS::NONE),
m_linkReflector(NULL),
m_random()
{
@ -166,7 +166,7 @@ bool CDStarNetwork::writePoll(const char* text)
buffer[4] = 0x0AU; // Poll with text
unsigned int length = ::strlen(text);
unsigned int length = (unsigned int)::strlen(text);
// Include the nul at the end also
::memcpy(buffer + 5U, text, length + 1U);

View file

@ -1,5 +1,5 @@
/*
* Copyright (C) 2015,2016,2017,2018,2020,2021 by Jonathan Naylor G4KLX
* Copyright (C) 2015,2016,2017,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
@ -42,56 +42,56 @@ const unsigned char TAG_EOT = 0x03U;
const unsigned int DSTAR_MODEM_DATA_LEN = 220U;
enum HW_TYPE {
HWT_MMDVM,
HWT_DVMEGA,
HWT_MMDVM_ZUMSPOT,
HWT_MMDVM_HS_HAT,
HWT_MMDVM_HS_DUAL_HAT,
HWT_NANO_HOTSPOT,
HWT_NANO_DV,
HWT_D2RG_MMDVM_HS,
HWT_MMDVM_HS,
HWT_OPENGD77_HS,
HWT_SKYBRIDGE,
HWT_UNKNOWN
enum class HW_TYPE {
MMDVM,
DVMEGA,
MMDVM_ZUMSPOT,
MMDVM_HS_HAT,
MMDVM_HS_DUAL_HAT,
NANO_HOTSPOT,
NANO_DV,
D2RG_MMDVM_HS,
MMDVM_HS,
OPENGD77_HS,
SKYBRIDGE,
UNKNOWN
};
enum RPT_RF_STATE {
RS_RF_LISTENING,
RS_RF_LATE_ENTRY,
RS_RF_AUDIO,
RS_RF_DATA_AUDIO,
RS_RF_DATA,
RS_RF_REJECTED,
RS_RF_INVALID
enum class RPT_RF_STATE {
LISTENING,
LATE_ENTRY,
AUDIO,
DATA_AUDIO,
DATA,
REJECTED,
INVALID
};
enum RPT_NET_STATE {
RS_NET_IDLE,
RS_NET_AUDIO,
RS_NET_DATA_AUDIO,
RS_NET_DATA
enum class RPT_NET_STATE {
IDLE,
AUDIO,
DATA_AUDIO,
DATA
};
enum DMR_BEACONS {
DMR_BEACONS_OFF,
DMR_BEACONS_NETWORK,
DMR_BEACONS_TIMED
enum class DMR_BEACONS {
OFF,
NETWORK,
TIMED
};
enum DMR_OVCM_TYPES {
DMR_OVCM_OFF,
DMR_OVCM_RX_ON,
DMR_OVCM_TX_ON,
DMR_OVCM_ON,
DMR_OVCM_FORCE_OFF
enum class DMR_OVCM {
OFF,
RX_ON,
TX_ON,
ON,
FORCE_OFF
};
enum DSTAR_ACK_MESSAGE {
DSTAR_ACK_BER,
DSTAR_ACK_RSSI,
DSTAR_ACK_SMETER
enum class DSTAR_ACK {
BER,
RSSI,
SMETER
};
#endif

View file

@ -1,5 +1,5 @@
/*
* Copyright (C) 2020,2021,2023,2024 by Jonathan Naylor G4KLX
* Copyright (C) 2020,2021,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
@ -35,7 +35,7 @@ const unsigned int BUFFER_LENGTH = 1500U;
CFMNetwork::CFMNetwork(const std::string& callsign, const std::string& protocol, const std::string& localAddress, unsigned short localPort, const std::string& gatewayAddress, unsigned short gatewayPort, unsigned int sampleRate, const std::string& squelchFile, bool debug) :
m_callsign(callsign),
m_protocol(FMNP_USRP),
m_protocol(FM_NETWORK_PROTOCOL::USRP),
m_socket(localAddress, localPort),
m_addr(),
m_addrLen(0U),
@ -65,9 +65,9 @@ m_fp(NULL)
m_callsign = callsign.substr(0U, pos);
if (protocol == "RAW")
m_protocol = FMNP_RAW;
m_protocol = FM_NETWORK_PROTOCOL::RAW;
else
m_protocol = FMNP_USRP;
m_protocol = FM_NETWORK_PROTOCOL::USRP;
#if defined(HAS_SRC)
m_resampler = ::src_new(SRC_SINC_FASTEST, 1, &m_error);
@ -90,7 +90,7 @@ bool CFMNetwork::open()
LogMessage("Opening FM network connection");
if (m_protocol == FMNP_RAW) {
if (m_protocol == FM_NETWORK_PROTOCOL::RAW) {
if (!m_squelchFile.empty()) {
m_fp = ::fopen(m_squelchFile.c_str(), "wb");
if (m_fp == NULL) {
@ -105,7 +105,7 @@ bool CFMNetwork::open()
}
#if !defined(HAS_SRC)
if ((m_protocol == FMNP_RAW) && (m_sampleRate != MMDVM_SAMPLERATE)) {
if ((m_protocol == FM_NETWORK_PROTOCOL::RAW) && (m_sampleRate != MMDVM_SAMPLERATE)) {
LogError("The resampler needed for non-native sample rates has not been included");
return false;
}
@ -119,9 +119,9 @@ bool CFMNetwork::writeData(const float* data, unsigned int nSamples)
assert(data != NULL);
assert(nSamples > 0U);
if (m_protocol == FMNP_USRP)
if (m_protocol == FM_NETWORK_PROTOCOL::USRP)
return writeUSRPData(data, nSamples);
else if (m_protocol == FMNP_RAW)
else if (m_protocol == FM_NETWORK_PROTOCOL::RAW)
return writeRawData(data, nSamples);
else
return false;
@ -264,7 +264,7 @@ bool CFMNetwork::writeRawData(const float* in, unsigned int nIn)
bool CFMNetwork::writeEnd()
{
if (m_protocol == FMNP_USRP)
if (m_protocol == FM_NETWORK_PROTOCOL::USRP)
return writeUSRPEnd();
else
return writeRawEnd();
@ -366,13 +366,13 @@ void CFMNetwork::clock(unsigned int ms)
return;
// Check if the data is for us
if (m_protocol == FMNP_USRP) {
if (!CUDPSocket::match(addr, m_addr, IMT_ADDRESS_AND_PORT)) {
if (m_protocol == FM_NETWORK_PROTOCOL::USRP) {
if (!CUDPSocket::match(addr, m_addr, IPMATCHTYPE::IMT_ADDREAND_PORT)) {
LogMessage("FM packet received from an invalid source");
return;
}
} else {
if (!CUDPSocket::match(addr, m_addr, IMT_ADDRESS_ONLY)) {
if (!CUDPSocket::match(addr, m_addr, IPMATCHTYPE::IMT_ADDREONLY)) {
LogMessage("FM packet received from an invalid source");
return;
}
@ -384,7 +384,7 @@ void CFMNetwork::clock(unsigned int ms)
if (m_debug)
CUtils::dump(1U, "FM Network Data Received", buffer, length);
if (m_protocol == FMNP_USRP) {
if (m_protocol == FM_NETWORK_PROTOCOL::USRP) {
// Invalid packet type?
if (::memcmp(buffer, "USRP", 4U) != 0)
return;
@ -400,7 +400,7 @@ void CFMNetwork::clock(unsigned int ms)
if (type == 0U)
m_buffer.addData(buffer + 32U, length - 32U);
} else if (m_protocol == FMNP_RAW) {
} else if (m_protocol == FM_NETWORK_PROTOCOL::RAW) {
m_buffer.addData(buffer, length);
}
}
@ -415,7 +415,7 @@ unsigned int CFMNetwork::readData(float* out, unsigned int nOut)
return 0U;
#if defined(HAS_SRC)
if ((m_protocol == FMNP_RAW) && (m_sampleRate != MMDVM_SAMPLERATE)) {
if ((m_protocol == RAW) && (m_sampleRate != MMDVM_SAMPLERATE)) {
unsigned int nIn = (nOut * m_sampleRate) / MMDVM_SAMPLERATE;
if (bytes < nIn) {

View file

@ -1,5 +1,5 @@
/*
* Copyright (C) 2020,2021,2023,2024 by Jonathan Naylor G4KLX
* Copyright (C) 2020,2021,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
@ -29,9 +29,9 @@
#include <cstdint>
#include <string>
enum FM_NETWORK_PROTOCOL {
FMNP_USRP,
FMNP_RAW
enum class FM_NETWORK_PROTOCOL {
USRP,
RAW
};
class CFMNetwork {

View file

@ -1,6 +1,6 @@
/*
* Copyright (C) 2016,2017,2018 by Tony Corbett G0WFV
* Copyright (C) 2018,2020,2024 by Jonathan Naylor G4KLX
* Copyright (C) 2018,2020,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
@ -78,7 +78,11 @@
#define BUFFER_MAX_LEN 128
#if defined(_WIN32) || defined(_WIN64)
SOCKET m_socketfd;
#else
int m_socketfd;
#endif
char m_buffer[BUFFER_MAX_LEN];
fd_set m_readfds, m_writefds;
struct timeval m_timeout;
@ -141,7 +145,7 @@ bool CLCDproc::open()
LogError("LCDproc, cannot lookup server");
return false;
}
memcpy(&serverAddress, res->ai_addr, addrlen = res->ai_addrlen);
memcpy(&serverAddress, res->ai_addr, addrlen = (unsigned int)res->ai_addrlen);
freeaddrinfo(res);
/* Lookup the client address (random port - need to specify manual port from ini file) */
@ -671,7 +675,7 @@ void CLCDproc::clockInt(unsigned int ms)
* exceptfds = we are not waiting for exception fds
*/
if (select(m_socketfd + 1, &m_readfds, NULL, NULL, &m_timeout) == -1) {
if (select(int(m_socketfd) + 1, &m_readfds, NULL, NULL, &m_timeout) == -1) {
LogError("LCDproc, error on select");
return;
}
@ -767,7 +771,11 @@ void CLCDproc::close()
{
}
#if defined(_WIN32) || defined(_WIN64)
int CLCDproc::socketPrintf(SOCKET fd, const char* format, ...)
#else
int CLCDproc::socketPrintf(int fd, const char *format, ...)
#endif
{
char buf[BUFFER_MAX_LEN];
va_list ap;
@ -790,7 +798,7 @@ int CLCDproc::socketPrintf(int fd, const char *format, ...)
m_timeout.tv_sec = 0;
m_timeout.tv_usec = 0;
if (select(m_socketfd + 1, NULL, &m_writefds, NULL, &m_timeout) == -1)
if (select(int(m_socketfd) + 1, NULL, &m_writefds, NULL, &m_timeout) == -1)
LogError("LCDproc, error on select");
if (FD_ISSET(m_socketfd, &m_writefds)) {

View file

@ -1,6 +1,6 @@
/*
* Copyright (C) 2016,2017 by Tony Corbett G0WFV
* Copyright (C) 2018,2020 by Jonathan Naylor G4KLX
* Copyright (C) 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
@ -25,6 +25,11 @@
#include <string>
#if defined(_WIN32) || defined(_WIN64)
#include <ws2tcpip.h>
#include <Winsock2.h>
#endif
class CLCDproc : public CDisplay
{
public:
@ -89,7 +94,11 @@ private:
unsigned int m_rssiCount1;
unsigned int m_rssiCount2;
#if defined(_WIN32) || defined(_WIN64)
int socketPrintf(SOCKET fd, const char* format, ...);
#else
int socketPrintf(int fd, const char *format, ...);
#endif
void defineScreens();
};

View file

@ -1,5 +1,5 @@
/*
* Copyright (C) 2015,2016,2020 by Jonathan Naylor G4KLX
* Copyright (C) 2015,2016,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
@ -167,7 +167,7 @@ void Log(unsigned int level, const char* fmt, ...)
va_list vl;
va_start(vl, fmt);
::vsnprintf(buffer + ::strlen(buffer), 500, fmt, vl);
::vsnprintf(buffer + ::strlen(buffer), 500 - ::strlen(buffer), fmt, vl);
va_end(vl);

View file

@ -1,5 +1,5 @@
/*
* Copyright (C) 2020,2021,2023 Jonathan Naylor, G4KLX
* 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
@ -68,8 +68,8 @@ m_duplex(duplex),
m_queue(5000U, "M17 Control"),
m_source(),
m_dest(),
m_rfState(RS_RF_LISTENING),
m_netState(RS_NET_IDLE),
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),
@ -121,7 +121,7 @@ bool CM17Control::writeModem(unsigned char* data, unsigned int len)
unsigned char type = data[0U];
if (type == TAG_LOST && (m_rfState == RS_RF_AUDIO || m_rfState == RS_RF_DATA_AUDIO)) {
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
@ -130,18 +130,18 @@ bool CM17Control::writeModem(unsigned char* data, unsigned int len)
return false;
}
if (type == TAG_LOST && m_rfState == RS_RF_DATA) {
if ((type == TAG_LOST) && (m_rfState == RPT_RF_STATE::DATA)) {
writeEndRF();
return false;
}
if (type == TAG_LOST && m_rfState == RS_RF_REJECTED) {
if ((type == TAG_LOST) && (m_rfState == RPT_RF_STATE::REJECTED)) {
writeEndRF();
return false;
}
if (type == TAG_LOST) {
m_rfState = RS_RF_LISTENING;
m_rfState = RPT_RF_STATE::LISTENING;
return false;
}
@ -172,7 +172,7 @@ bool CM17Control::writeModem(unsigned char* data, unsigned int len)
decorrelator(data + 2U, temp);
interleaver(temp, data + 2U);
if (m_rfState == RS_RF_LISTENING && data[0U] == TAG_HEADER) {
if ((m_rfState == RPT_RF_STATE::LISTENING) && (data[0U] == TAG_HEADER)) {
m_rfCurrentRFLSF.reset();
m_rfCurrentNetLSF.reset();
@ -212,18 +212,18 @@ bool CM17Control::writeModem(unsigned char* data, unsigned int len)
#endif
return true;
} else {
m_rfState = RS_RF_LATE_ENTRY;
m_rfState = RPT_RF_STATE::LATE_ENTRY;
return false;
}
}
if (m_rfState == RS_RF_LISTENING && data[0U] == TAG_DATA) {
m_rfState = RS_RF_LATE_ENTRY;
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 == RS_RF_LATE_ENTRY && data[0U] == TAG_DATA) {
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);
@ -270,7 +270,7 @@ bool CM17Control::writeModem(unsigned char* data, unsigned int len)
}
}
if ((m_rfState == RS_RF_AUDIO || m_rfState == RS_RF_DATA_AUDIO) && data[0U] == TAG_DATA) {
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
@ -419,7 +419,7 @@ bool CM17Control::writeModem(unsigned char* data, unsigned int len)
return true;
}
if ((m_rfState == RS_RF_AUDIO || m_rfState == RS_RF_DATA_AUDIO) && data[0U] == TAG_EOT) {
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
@ -445,10 +445,10 @@ bool CM17Control::writeModem(unsigned char* data, unsigned int len)
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 == RS_RF_AUDIO) {
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 == RS_RF_DATA_AUDIO) {
} 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 {
@ -490,7 +490,7 @@ unsigned int CM17Control::readModem(unsigned char* data)
void CM17Control::writeEndRF()
{
m_rfState = RS_RF_LISTENING;
m_rfState = RPT_RF_STATE::LISTENING;
m_rfTimeoutTimer.stop();
@ -502,7 +502,7 @@ void CM17Control::writeEndRF()
m_rfCollectingLSF.reset();
m_rfCollectedLSF.reset();
if (m_netState == RS_NET_IDLE) {
if (m_netState == RPT_NET_STATE::IDLE) {
m_display->clearM17();
if (m_network != NULL)
@ -516,7 +516,7 @@ void CM17Control::writeEndRF()
void CM17Control::writeEndNet()
{
m_netState = RS_NET_IDLE;
m_netState = RPT_NET_STATE::IDLE;
m_netTimeoutTimer.stop();
m_networkWatchdog.stop();
@ -542,7 +542,7 @@ void CM17Control::writeNetwork()
if (!m_enabled)
return;
if (m_rfState != RS_RF_LISTENING && m_rfState != RS_RF_LATE_ENTRY && m_netState == RS_NET_IDLE) {
if ((m_rfState != RPT_RF_STATE::LISTENING) && (m_rfState != RPT_RF_STATE::LATE_ENTRY) && (m_netState == RPT_NET_STATE::IDLE)) {
m_network->reset();
return;
}
@ -560,7 +560,7 @@ void CM17Control::writeNetwork()
}
}
if (m_netState == RS_NET_IDLE) {
if (m_netState == RPT_NET_STATE::IDLE) {
m_netLSF.setNetwork(netData);
m_source = m_netLSF.getSource();
@ -573,15 +573,15 @@ void CM17Control::writeNetwork()
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 = RS_NET_DATA;
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 = RS_NET_AUDIO;
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 = RS_NET_DATA_AUDIO;
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());
@ -621,7 +621,7 @@ void CM17Control::writeNetwork()
writeQueueNet(start);
}
if (m_netState == RS_NET_AUDIO || m_netState == RS_NET_DATA_AUDIO) {
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);
@ -751,7 +751,7 @@ bool CM17Control::processRFHeader(bool lateEntry)
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 = RS_RF_REJECTED;
m_rfState = RPT_RF_STATE::REJECTED;
return true;
}
}
@ -760,7 +760,7 @@ bool CM17Control::processRFHeader(bool lateEntry)
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 = RS_RF_REJECTED;
m_rfState = RPT_RF_STATE::REJECTED;
return true;
}
}
@ -769,15 +769,15 @@ bool CM17Control::processRFHeader(bool lateEntry)
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 = RS_RF_DATA;
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 = RS_RF_AUDIO;
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 = RS_RF_DATA_AUDIO;
m_rfState = RPT_RF_STATE::DATA_AUDIO;
break;
default:
return false;
@ -841,7 +841,7 @@ void CM17Control::clock(unsigned int ms)
m_rfTimeoutTimer.clock(ms);
m_netTimeoutTimer.clock(ms);
if (m_netState == RS_NET_AUDIO || m_netState == RS_NET_DATA_AUDIO) {
if ((m_netState == RPT_NET_STATE::AUDIO) || (m_netState == RPT_NET_STATE::DATA_AUDIO)) {
m_networkWatchdog.clock(ms);
if (m_networkWatchdog.hasExpired()) {
@ -855,7 +855,7 @@ void CM17Control::writeQueueRF(const unsigned char *data)
{
assert(data != NULL);
if (m_netState != RS_NET_IDLE)
if (m_netState != RPT_NET_STATE::IDLE)
return;
if (m_rfTimeoutTimer.isRunning() && m_rfTimeoutTimer.hasExpired())
@ -966,7 +966,7 @@ void CM17Control::closeFile()
bool CM17Control::isBusy() const
{
return m_rfState != RS_RF_LISTENING || m_netState != RS_NET_IDLE;
return (m_rfState != RPT_RF_STATE::LISTENING) || (m_netState != RPT_NET_STATE::IDLE);
}
void CM17Control::enable(bool enabled)
@ -975,12 +975,12 @@ void CM17Control::enable(bool enabled)
m_queue.clear();
// Reset the RF section
m_rfState = RS_RF_LISTENING;
m_rfState = RPT_RF_STATE::LISTENING;
m_rfTimeoutTimer.stop();
// Reset the networking section
m_netState = RS_NET_IDLE;
m_netState = RPT_NET_STATE::IDLE;
m_netTimeoutTimer.stop();
m_networkWatchdog.stop();

View file

@ -1,5 +1,5 @@
/*
* Copyright (C) 2015-2021,2023,2024 by Jonathan Naylor G4KLX
* Copyright (C) 2015-2021,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
@ -70,7 +70,7 @@ static void sigHandler(int signum)
const char* HEADER1 = "This software is for use on amateur radio networks only,";
const char* HEADER2 = "it is to be used for educational purposes only. Its use on";
const char* HEADER3 = "commercial networks is strictly prohibited.";
const char* HEADER4 = "Copyright(C) 2015-2024 by Jonathan Naylor, G4KLX and others";
const char* HEADER4 = "Copyright(C) 2015-2025 by Jonathan Naylor, G4KLX and others";
int main(int argc, char** argv)
{
@ -497,7 +497,7 @@ int CMMDVMHost::run()
std::vector<std::string> whiteList = m_conf.getDStarWhiteList();
bool ackReply = m_conf.getDStarAckReply();
unsigned int ackTime = m_conf.getDStarAckTime();
DSTAR_ACK_MESSAGE ackMessage = m_conf.getDStarAckMessage();
DSTAR_ACK ackMessage = m_conf.getDStarAckMessage();
bool errorReply = m_conf.getDStarErrorReply();
bool remoteGateway = m_conf.getDStarRemoteGateway();
m_dstarRFModeHang = m_conf.getDStarModeHang();
@ -506,7 +506,7 @@ int CMMDVMHost::run()
LogInfo(" Module: %s", module.c_str());
LogInfo(" Self Only: %s", selfOnly ? "yes" : "no");
LogInfo(" Ack Reply: %s", ackReply ? "yes" : "no");
LogInfo(" Ack message: %s", ackMessage == DSTAR_ACK_RSSI? "RSSI" : (ackMessage == DSTAR_ACK_SMETER ? "SMETER" : "BER"));
LogInfo(" Ack message: %s", ackMessage == DSTAR_ACK::RSSI? "RSSI" : (ackMessage == DSTAR_ACK::SMETER ? "SMETER" : "BER"));
LogInfo(" Ack Time: %ums", ackTime);
LogInfo(" Error Reply: %s", errorReply ? "yes" : "no");
LogInfo(" Remote Gateway: %s", remoteGateway ? "yes" : "no");
@ -520,7 +520,7 @@ int CMMDVMHost::run()
m_dstar = new CDStarControl(m_callsign, module, selfOnly, ackReply, ackTime, ackMessage, errorReply, blackList, whiteList, m_dstarNetwork, m_display, m_timeout, m_duplex, remoteGateway, rssi);
}
DMR_BEACONS dmrBeacons = DMR_BEACONS_OFF;
DMR_BEACONS dmrBeacons = DMR_BEACONS::OFF;
CTimer dmrBeaconIntervalTimer(1000U);
CTimer dmrBeaconDurationTimer(1000U);
@ -540,7 +540,7 @@ int CMMDVMHost::run()
unsigned int jitter = m_conf.getDMRNetworkJitter();
m_dmrRFModeHang = m_conf.getDMRModeHang();
dmrBeacons = m_conf.getDMRBeacons();
DMR_OVCM_TYPES ovcm = m_conf.getDMROVCM();
DMR_OVCM ovcm = m_conf.getDMROVCM();
bool protect = m_conf.getDMRProtect();
if (txHang > m_dmrRFModeHang)
@ -574,22 +574,22 @@ int CMMDVMHost::run()
LogInfo(" Call Hang: %us", callHang);
LogInfo(" TX Hang: %us", txHang);
LogInfo(" Mode Hang: %us", m_dmrRFModeHang);
if (ovcm == DMR_OVCM_OFF)
if (ovcm == DMR_OVCM::OFF)
LogInfo(" OVCM: off");
else if (ovcm == DMR_OVCM_RX_ON)
else if (ovcm == DMR_OVCM::RX_ON)
LogInfo(" OVCM: on(rx only)");
else if (ovcm == DMR_OVCM_TX_ON)
else if (ovcm == DMR_OVCM::TX_ON)
LogInfo(" OVCM: on(tx only)");
else if (ovcm == DMR_OVCM_ON)
else if (ovcm == DMR_OVCM::ON)
LogInfo(" OVCM: on");
else if (ovcm == DMR_OVCM_FORCE_OFF)
else if (ovcm == DMR_OVCM::FORCE_OFF)
LogInfo(" OVCM: off (forced)");
if (protect)
LogInfo(" Protect: yes");
switch (dmrBeacons) {
case DMR_BEACONS_NETWORK: {
case DMR_BEACONS::NETWORK: {
unsigned int dmrBeaconDuration = m_conf.getDMRBeaconDuration();
LogInfo(" DMR Roaming Beacons Type: network");
@ -598,7 +598,7 @@ int CMMDVMHost::run()
dmrBeaconDurationTimer.setTimeout(dmrBeaconDuration);
}
break;
case DMR_BEACONS_TIMED: {
case DMR_BEACONS::TIMED: {
unsigned int dmrBeaconInterval = m_conf.getDMRBeaconInterval();
unsigned int dmrBeaconDuration = m_conf.getDMRBeaconDuration();
@ -1253,7 +1253,7 @@ int CMMDVMHost::run()
}
switch (dmrBeacons) {
case DMR_BEACONS_TIMED:
case DMR_BEACONS::TIMED:
dmrBeaconIntervalTimer.clock(ms);
if (dmrBeaconIntervalTimer.isRunning() && dmrBeaconIntervalTimer.hasExpired()) {
if ((m_mode == MODE_IDLE || m_mode == MODE_DMR) && !m_modem->hasTX()) {
@ -1266,7 +1266,7 @@ int CMMDVMHost::run()
}
}
break;
case DMR_BEACONS_NETWORK:
case DMR_BEACONS::NETWORK:
if (m_dmrNetwork != NULL) {
bool beacon = m_dmrNetwork->wantsBeacon();
if (beacon) {
@ -2544,131 +2544,131 @@ void CMMDVMHost::remoteControl()
REMOTE_COMMAND command = m_remoteControl->getCommand();
switch (command) {
case RCD_MODE_IDLE:
case REMOTE_COMMAND::MODE_IDLE:
m_fixedMode = false;
setMode(MODE_IDLE);
break;
case RCD_MODE_LOCKOUT:
case REMOTE_COMMAND::MODE_LOCKOUT:
m_fixedMode = false;
setMode(MODE_LOCKOUT);
break;
case RCD_MODE_DSTAR:
case REMOTE_COMMAND::MODE_DSTAR:
if (m_dstar != NULL)
processModeCommand(MODE_DSTAR, m_dstarRFModeHang);
break;
case RCD_MODE_DMR:
case REMOTE_COMMAND::MODE_DMR:
if (m_dmr != NULL)
processModeCommand(MODE_DMR, m_dmrRFModeHang);
break;
case RCD_MODE_YSF:
case REMOTE_COMMAND::MODE_YSF:
if (m_ysf != NULL)
processModeCommand(MODE_YSF, m_ysfRFModeHang);
break;
case RCD_MODE_P25:
case REMOTE_COMMAND::MODE_P25:
if (m_p25 != NULL)
processModeCommand(MODE_P25, m_p25RFModeHang);
break;
case RCD_MODE_NXDN:
case REMOTE_COMMAND::MODE_NXDN:
if (m_nxdn != NULL)
processModeCommand(MODE_NXDN, m_nxdnRFModeHang);
break;
case RCD_MODE_M17:
case REMOTE_COMMAND::MODE_M17:
if (m_m17 != NULL)
processModeCommand(MODE_M17, m_m17RFModeHang);
break;
case RCD_MODE_FM:
case REMOTE_COMMAND::MODE_FM:
if (m_fmEnabled)
processModeCommand(MODE_FM, 0);
break;
case RCD_ENABLE_DSTAR:
case REMOTE_COMMAND::ENABLE_DSTAR:
if (m_dstar != NULL && !m_dstarEnabled)
processEnableCommand(m_dstarEnabled, true);
if (m_dstarNetwork != NULL)
m_dstarNetwork->enable(true);
break;
case RCD_ENABLE_DMR:
case REMOTE_COMMAND::ENABLE_DMR:
if (m_dmr != NULL && !m_dmrEnabled)
processEnableCommand(m_dmrEnabled, true);
if (m_dmrNetwork != NULL)
m_dmrNetwork->enable(true);
break;
case RCD_ENABLE_YSF:
case REMOTE_COMMAND::ENABLE_YSF:
if (m_ysf != NULL && !m_ysfEnabled)
processEnableCommand(m_ysfEnabled, true);
if (m_ysfNetwork != NULL)
m_ysfNetwork->enable(true);
break;
case RCD_ENABLE_P25:
case REMOTE_COMMAND::ENABLE_P25:
if (m_p25 != NULL && !m_p25Enabled)
processEnableCommand(m_p25Enabled, true);
if (m_p25Network != NULL)
m_p25Network->enable(true);
break;
case RCD_ENABLE_NXDN:
case REMOTE_COMMAND::ENABLE_NXDN:
if (m_nxdn != NULL && !m_nxdnEnabled)
processEnableCommand(m_nxdnEnabled, true);
if (m_nxdnNetwork != NULL)
m_nxdnNetwork->enable(true);
break;
case RCD_ENABLE_M17:
case REMOTE_COMMAND::ENABLE_M17:
if (m_m17 != NULL && !m_m17Enabled)
processEnableCommand(m_m17Enabled, true);
if (m_m17Network != NULL)
m_m17Network->enable(true);
break;
case RCD_ENABLE_FM:
case REMOTE_COMMAND::ENABLE_FM:
if (!m_fmEnabled)
processEnableCommand(m_fmEnabled, true);
break;
case RCD_ENABLE_AX25:
case REMOTE_COMMAND::ENABLE_AX25:
if (!m_ax25Enabled)
processEnableCommand(m_ax25Enabled, true);
break;
case RCD_DISABLE_DSTAR:
case REMOTE_COMMAND::DISABLE_DSTAR:
if (m_dstar != NULL && m_dstarEnabled)
processEnableCommand(m_dstarEnabled, false);
if (m_dstarNetwork != NULL)
m_dstarNetwork->enable(false);
break;
case RCD_DISABLE_DMR:
case REMOTE_COMMAND::DISABLE_DMR:
if (m_dmr != NULL && m_dmrEnabled)
processEnableCommand(m_dmrEnabled, false);
if (m_dmrNetwork != NULL)
m_dmrNetwork->enable(false);
break;
case RCD_DISABLE_YSF:
case REMOTE_COMMAND::DISABLE_YSF:
if (m_ysf != NULL && m_ysfEnabled)
processEnableCommand(m_ysfEnabled, false);
if (m_ysfNetwork != NULL)
m_ysfNetwork->enable(false);
break;
case RCD_DISABLE_P25:
case REMOTE_COMMAND::DISABLE_P25:
if (m_p25 != NULL && m_p25Enabled)
processEnableCommand(m_p25Enabled, false);
if (m_p25Network != NULL)
m_p25Network->enable(false);
break;
case RCD_DISABLE_NXDN:
case REMOTE_COMMAND::DISABLE_NXDN:
if (m_nxdn != NULL && m_nxdnEnabled)
processEnableCommand(m_nxdnEnabled, false);
if (m_nxdnNetwork != NULL)
m_nxdnNetwork->enable(false);
break;
case RCD_DISABLE_M17:
case REMOTE_COMMAND::DISABLE_M17:
if (m_m17 != NULL && m_m17Enabled)
processEnableCommand(m_m17Enabled, false);
if (m_m17Network != NULL)
m_m17Network->enable(false);
break;
case RCD_DISABLE_FM:
case REMOTE_COMMAND::DISABLE_FM:
if (m_fmEnabled)
processEnableCommand(m_fmEnabled, false);
break;
case RCD_DISABLE_AX25:
case REMOTE_COMMAND::DISABLE_AX25:
if (m_ax25Enabled == true)
processEnableCommand(m_ax25Enabled, false);
break;
case RCD_PAGE:
case REMOTE_COMMAND::PAGE:
if (m_pocsag != NULL) {
unsigned int ric = m_remoteControl->getArgUInt(0U);
std::string text;
@ -2680,7 +2680,7 @@ void CMMDVMHost::remoteControl()
m_pocsag->sendPage(ric, text);
}
break;
case RCD_PAGE_BCD:
case REMOTE_COMMAND::PAGE_BCD:
if (m_pocsag != NULL) {
unsigned int ric = m_remoteControl->getArgUInt(0U);
std::string text;
@ -2692,13 +2692,13 @@ void CMMDVMHost::remoteControl()
m_pocsag->sendPageBCD(ric, text);
}
break;
case RCD_PAGE_A1:
case REMOTE_COMMAND::PAGE_A1:
if (m_pocsag != NULL) {
unsigned int ric = m_remoteControl->getArgUInt(0U);
m_pocsag->sendPageAlert1(ric);
}
break;
case RCD_PAGE_A2:
case REMOTE_COMMAND::PAGE_A2:
if (m_pocsag != NULL) {
unsigned int ric = m_remoteControl->getArgUInt(0U);
std::string text;
@ -2710,7 +2710,7 @@ void CMMDVMHost::remoteControl()
m_pocsag->sendPageAlert2(ric, text);
}
break;
case RCD_CW:
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;
@ -2723,7 +2723,7 @@ void CMMDVMHost::remoteControl()
m_modem->sendCWId(cwtext);
}
break;
case RCD_RELOAD:
case REMOTE_COMMAND::RELOAD:
m_reload = true;
break;
default:
@ -2785,11 +2785,11 @@ void CMMDVMHost::buildNetworkHostsString(std::string &str)
m_dstarNetwork->getStatus(status, &ref[0]);
switch (status) {
case LINK_STATUS::LS_LINKED_LOOPBACK:
case LINK_STATUS::LS_LINKED_DEXTRA:
case LINK_STATUS::LS_LINKED_DPLUS:
case LINK_STATUS::LS_LINKED_DCS:
case LINK_STATUS::LS_LINKED_CCS:
case LINK_STATUS::LINKED_LOOPBACK:
case LINK_STATUS::LINKED_DEXTRA:
case LINK_STATUS::LINKED_DPLUS:
case LINK_STATUS::LINKED_DCS:
case LINK_STATUS::LINKED_CCS:
dstarReflector = std::string((char *)ref);
break;

136
Modem.cpp
View file

@ -1,5 +1,5 @@
/*
* Copyright (C) 2011-2018,2020,2021 by Jonathan Naylor G4KLX
* Copyright (C) 2011-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
@ -169,7 +169,7 @@ m_port(NULL),
m_buffer(NULL),
m_length(0U),
m_offset(0U),
m_state(SS_START),
m_state(SERIAL_STATE::START),
m_type(0U),
m_rxDStarData(1000U, "Modem RX D-Star"),
m_txDStarData(1000U, "Modem TX D-Star"),
@ -213,7 +213,7 @@ m_cd(false),
m_lockout(false),
m_error(false),
m_mode(MODE_IDLE),
m_hwType(HWT_UNKNOWN),
m_hwType(HW_TYPE::UNKNOWN),
m_ax25RXTwist(0),
m_ax25TXDelay(300U),
m_ax25SlotTime(30U),
@ -455,12 +455,12 @@ void CModem::clock(unsigned int ms)
RESP_TYPE_MMDVM type = getResponse();
if (type == RTM_TIMEOUT) {
if (type == RESP_TYPE_MMDVM::TIMEOUT) {
// Nothing to do
} else if (type == RTM_ERROR) {
} else if (type == RESP_TYPE_MMDVM::ERR) {
// Nothing to do
} else {
// type == RTM_OK
// type == OK
switch (m_type) {
case MMDVM_DSTAR_HEADER: {
if (m_trace)
@ -1996,31 +1996,31 @@ bool CModem::readVersion()
for (unsigned int count = 0U; count < MAX_RESPONSES; count++) {
CThread::sleep(10U);
RESP_TYPE_MMDVM resp = getResponse();
if (resp == RTM_OK && m_buffer[2U] == MMDVM_GET_VERSION) {
if ((resp == RESP_TYPE_MMDVM::OK) && (m_buffer[2U] == MMDVM_GET_VERSION)) {
if (::memcmp(m_buffer + 4U, "MMDVM ", 6U) == 0)
m_hwType = HWT_MMDVM;
m_hwType = HW_TYPE::MMDVM;
else if (::memcmp(m_buffer + 23U, "MMDVM ", 6U) == 0)
m_hwType = HWT_MMDVM;
m_hwType = HW_TYPE::MMDVM;
else if (::memcmp(m_buffer + 4U, "DVMEGA", 6U) == 0)
m_hwType = HWT_DVMEGA;
m_hwType = HW_TYPE::DVMEGA;
else if (::memcmp(m_buffer + 4U, "ZUMspot", 7U) == 0)
m_hwType = HWT_MMDVM_ZUMSPOT;
m_hwType = HW_TYPE::MMDVM_ZUMSPOT;
else if (::memcmp(m_buffer + 4U, "MMDVM_HS_Hat", 12U) == 0)
m_hwType = HWT_MMDVM_HS_HAT;
m_hwType = HW_TYPE::MMDVM_HS_HAT;
else if (::memcmp(m_buffer + 4U, "MMDVM_HS_Dual_Hat", 17U) == 0)
m_hwType = HWT_MMDVM_HS_DUAL_HAT;
m_hwType = HW_TYPE::MMDVM_HS_DUAL_HAT;
else if (::memcmp(m_buffer + 4U, "Nano_hotSPOT", 12U) == 0)
m_hwType = HWT_NANO_HOTSPOT;
m_hwType = HW_TYPE::NANO_HOTSPOT;
else if (::memcmp(m_buffer + 4U, "Nano_DV", 7U) == 0)
m_hwType = HWT_NANO_DV;
m_hwType = HW_TYPE::NANO_DV;
else if (::memcmp(m_buffer + 4U, "D2RG_MMDVM_HS", 13U) == 0)
m_hwType = HWT_D2RG_MMDVM_HS;
m_hwType = HW_TYPE::D2RG_MMDVM_HS;
else if (::memcmp(m_buffer + 4U, "MMDVM_HS-", 9U) == 0)
m_hwType = HWT_MMDVM_HS;
m_hwType = HW_TYPE::MMDVM_HS;
else if (::memcmp(m_buffer + 4U, "OpenGD77_HS", 11U) == 0)
m_hwType = HWT_OPENGD77_HS;
m_hwType = HW_TYPE::OPENGD77_HS;
else if (::memcmp(m_buffer + 4U, "SkyBridge", 9U) == 0)
m_hwType = HWT_SKYBRIDGE;
m_hwType = HW_TYPE::SKYBRIDGE;
m_protocolVersion = m_buffer[3U];
@ -2210,18 +2210,18 @@ bool CModem::setConfig1()
CThread::sleep(10U);
resp = getResponse();
if (resp == RTM_OK && m_buffer[2U] != MMDVM_ACK && m_buffer[2U] != MMDVM_NAK) {
if ((resp == RESP_TYPE_MMDVM::OK) && (m_buffer[2U] != MMDVM_ACK) && (m_buffer[2U] != MMDVM_NAK)) {
count++;
if (count >= MAX_RESPONSES) {
LogError("The MMDVM is not responding to the SET_CONFIG command");
return false;
}
}
} while (resp == RTM_OK && m_buffer[2U] != MMDVM_ACK && m_buffer[2U] != MMDVM_NAK);
} while ((resp == RESP_TYPE_MMDVM::OK) && (m_buffer[2U] != MMDVM_ACK) && (m_buffer[2U] != MMDVM_NAK));
// CUtils::dump(1U, "Response", m_buffer, m_length);
if (resp == RTM_OK && m_buffer[2U] == MMDVM_NAK) {
if ((resp == RESP_TYPE_MMDVM::OK) && (m_buffer[2U] == MMDVM_NAK)) {
LogError("Received a NAK to the SET_CONFIG command from the modem");
return false;
}
@ -2336,18 +2336,18 @@ bool CModem::setConfig2()
CThread::sleep(10U);
resp = getResponse();
if (resp == RTM_OK && m_buffer[2U] != MMDVM_ACK && m_buffer[2U] != MMDVM_NAK) {
if ((resp == RESP_TYPE_MMDVM::OK) && (m_buffer[2U] != MMDVM_ACK) && (m_buffer[2U] != MMDVM_NAK)) {
count++;
if (count >= MAX_RESPONSES) {
LogError("The MMDVM is not responding to the SET_CONFIG command");
return false;
}
}
} while (resp == RTM_OK && m_buffer[2U] != MMDVM_ACK && m_buffer[2U] != MMDVM_NAK);
} while ((resp == RESP_TYPE_MMDVM::OK) && (m_buffer[2U] != MMDVM_ACK) && (m_buffer[2U] != MMDVM_NAK));
// CUtils::dump(1U, "Response", m_buffer, m_length);
if (resp == RTM_OK && m_buffer[2U] == MMDVM_NAK) {
if ((resp == RESP_TYPE_MMDVM::OK) && (m_buffer[2U] == MMDVM_NAK)) {
LogError("Received a NAK to the SET_CONFIG command from the modem");
return false;
}
@ -2368,7 +2368,7 @@ bool CModem::setFrequency()
if (m_pocsagEnabled)
pocsagFrequency = m_pocsagFrequency;
if (m_hwType == HWT_DVMEGA)
if (m_hwType == HW_TYPE::DVMEGA)
len = 12U;
else {
buffer[12U] = (unsigned char)(m_rfLevel * 2.55F + 0.5F);
@ -2411,18 +2411,18 @@ bool CModem::setFrequency()
CThread::sleep(10U);
resp = getResponse();
if (resp == RTM_OK && m_buffer[2U] != MMDVM_ACK && m_buffer[2U] != MMDVM_NAK) {
if ((resp == RESP_TYPE_MMDVM::OK) && (m_buffer[2U] != MMDVM_ACK) && (m_buffer[2U] != MMDVM_NAK)) {
count++;
if (count >= MAX_RESPONSES) {
LogError("The MMDVM is not responding to the SET_FREQ command");
return false;
}
}
} while (resp == RTM_OK && m_buffer[2U] != MMDVM_ACK && m_buffer[2U] != MMDVM_NAK);
} while ((resp == RESP_TYPE_MMDVM::OK) && (m_buffer[2U] != MMDVM_ACK) && (m_buffer[2U] != MMDVM_NAK));
// CUtils::dump(1U, "Response", m_buffer, m_length);
if (resp == RTM_OK && m_buffer[2U] == MMDVM_NAK) {
if ((resp == RESP_TYPE_MMDVM::OK) && (m_buffer[2U] == MMDVM_NAK)) {
LogError("Received a NAK to the SET_FREQ command from the modem");
return false;
}
@ -2434,90 +2434,90 @@ RESP_TYPE_MMDVM CModem::getResponse()
{
assert(m_port != NULL);
if (m_state == SS_START) {
if (m_state == SERIAL_STATE::START) {
// Get the start of the frame or nothing at all
int ret = m_port->read(m_buffer + 0U, 1U);
if (ret < 0) {
LogError("Error when reading from the modem");
return RTM_ERROR;
return RESP_TYPE_MMDVM::ERR;
}
if (ret == 0)
return RTM_TIMEOUT;
return RESP_TYPE_MMDVM::TIMEOUT;
if (m_buffer[0U] != MMDVM_FRAME_START)
return RTM_TIMEOUT;
return RESP_TYPE_MMDVM::TIMEOUT;
m_state = SS_LENGTH1;
m_state = SERIAL_STATE::LENGTH1;
m_length = 1U;
}
if (m_state == SS_LENGTH1) {
if (m_state == SERIAL_STATE::LENGTH1) {
// Get the length of the frame, 1/2
int ret = m_port->read(m_buffer + 1U, 1U);
if (ret < 0) {
LogError("Error when reading from the modem");
m_state = SS_START;
return RTM_ERROR;
m_state = SERIAL_STATE::START;
return RESP_TYPE_MMDVM::ERR;
}
if (ret == 0)
return RTM_TIMEOUT;
return RESP_TYPE_MMDVM::TIMEOUT;
m_length = m_buffer[1U];
m_offset = 2U;
if (m_length == 0U)
m_state = SS_LENGTH2;
m_state = SERIAL_STATE::LENGTH2;
else
m_state = SS_TYPE;
m_state = SERIAL_STATE::TYPE;
}
if (m_state == SS_LENGTH2) {
if (m_state == SERIAL_STATE::LENGTH2) {
// Get the length of the frane, 2/2
int ret = m_port->read(m_buffer + 2U, 1U);
if (ret < 0) {
LogError("Error when reading from the modem");
m_state = SS_START;
return RTM_ERROR;
m_state = SERIAL_STATE::START;
return RESP_TYPE_MMDVM::ERR;
}
if (ret == 0)
return RTM_TIMEOUT;
return RESP_TYPE_MMDVM::TIMEOUT;
m_length = m_buffer[2U] + 255U;
m_offset = 3U;
m_state = SS_TYPE;
m_state = SERIAL_STATE::TYPE;
}
if (m_state == SS_TYPE) {
if (m_state == SERIAL_STATE::TYPE) {
// Get the frame type
int ret = m_port->read(&m_type, 1U);
if (ret < 0) {
LogError("Error when reading from the modem");
m_state = SS_START;
return RTM_ERROR;
m_state = SERIAL_STATE::START;
return RESP_TYPE_MMDVM::ERR;
}
if (ret == 0)
return RTM_TIMEOUT;
return RESP_TYPE_MMDVM::TIMEOUT;
m_buffer[m_offset++] = m_type;
m_state = SS_DATA;
m_state = SERIAL_STATE::DATA;
}
if (m_state == SS_DATA) {
if (m_state == SERIAL_STATE::DATA) {
while (m_offset < m_length) {
int ret = m_port->read(m_buffer + m_offset, m_length - m_offset);
if (ret < 0) {
LogError("Error when reading from the modem");
m_state = SS_START;
return RTM_ERROR;
m_state = SERIAL_STATE::START;
return RESP_TYPE_MMDVM::ERR;
}
if (ret == 0)
return RTM_TIMEOUT;
return RESP_TYPE_MMDVM::TIMEOUT;
if (ret > 0)
m_offset += ret;
@ -2527,9 +2527,9 @@ RESP_TYPE_MMDVM CModem::getResponse()
// CUtils::dump(1U, "Received", m_buffer, m_length);
m_offset = m_length > 255U ? 4U : 3U;
m_state = SS_START;
m_state = SERIAL_STATE::START;
return RTM_OK;
return RESP_TYPE_MMDVM::OK;
}
HW_TYPE CModem::getHWType() const
@ -2746,18 +2746,18 @@ bool CModem::setFMCallsignParams()
CThread::sleep(10U);
resp = getResponse();
if (resp == RTM_OK && m_buffer[2U] != MMDVM_ACK && m_buffer[2U] != MMDVM_NAK) {
if ((resp == RESP_TYPE_MMDVM::OK) && (m_buffer[2U] != MMDVM_ACK) && (m_buffer[2U] != MMDVM_NAK)) {
count++;
if (count >= MAX_RESPONSES) {
LogError("The MMDVM is not responding to the SET_FM_PARAMS1 command");
return false;
}
}
} while (resp == RTM_OK && m_buffer[2U] != MMDVM_ACK && m_buffer[2U] != MMDVM_NAK);
} while ((resp == RESP_TYPE_MMDVM::OK) && (m_buffer[2U] != MMDVM_ACK) && (m_buffer[2U] != MMDVM_NAK));
// CUtils::dump(1U, "Response", m_buffer, m_length);
if (resp == RTM_OK && m_buffer[2U] == MMDVM_NAK) {
if ((resp == RESP_TYPE_MMDVM::OK) && (m_buffer[2U] == MMDVM_NAK)) {
LogError("Received a NAK to the SET_FM_PARAMS1 command from the modem");
return false;
}
@ -2798,18 +2798,18 @@ bool CModem::setFMAckParams()
CThread::sleep(10U);
resp = getResponse();
if (resp == RTM_OK && m_buffer[2U] != MMDVM_ACK && m_buffer[2U] != MMDVM_NAK) {
if ((resp == RESP_TYPE_MMDVM::OK) && (m_buffer[2U] != MMDVM_ACK) && (m_buffer[2U] != MMDVM_NAK)) {
count++;
if (count >= MAX_RESPONSES) {
LogError("The MMDVM is not responding to the SET_FM_PARAMS2 command");
return false;
}
}
} while (resp == RTM_OK && m_buffer[2U] != MMDVM_ACK && m_buffer[2U] != MMDVM_NAK);
} while ((resp == RESP_TYPE_MMDVM::OK) && (m_buffer[2U] != MMDVM_ACK) && (m_buffer[2U] != MMDVM_NAK));
// CUtils::dump(1U, "Response", m_buffer, m_length);
if (resp == RTM_OK && m_buffer[2U] == MMDVM_NAK) {
if ((resp == RESP_TYPE_MMDVM::OK) && (m_buffer[2U] == MMDVM_NAK)) {
LogError("Received a NAK to the SET_FM_PARAMS2 command from the modem");
return false;
}
@ -2867,18 +2867,18 @@ bool CModem::setFMMiscParams()
CThread::sleep(10U);
resp = getResponse();
if (resp == RTM_OK && m_buffer[2U] != MMDVM_ACK && m_buffer[2U] != MMDVM_NAK) {
if ((resp == RESP_TYPE_MMDVM::OK) && (m_buffer[2U] != MMDVM_ACK) && (m_buffer[2U] != MMDVM_NAK)) {
count++;
if (count >= MAX_RESPONSES) {
LogError("The MMDVM is not responding to the SET_FM_PARAMS3 command");
return false;
}
}
} while (resp == RTM_OK && m_buffer[2U] != MMDVM_ACK && m_buffer[2U] != MMDVM_NAK);
} while ((resp == RESP_TYPE_MMDVM::OK) && (m_buffer[2U] != MMDVM_ACK) && (m_buffer[2U] != MMDVM_NAK));
// CUtils::dump(1U, "Response", m_buffer, m_length);
if (resp == RTM_OK && m_buffer[2U] == MMDVM_NAK) {
if ((resp == RESP_TYPE_MMDVM::OK) && (m_buffer[2U] == MMDVM_NAK)) {
LogError("Received a NAK to the SET_FM_PARAMS3 command from the modem");
return false;
}
@ -2918,18 +2918,18 @@ bool CModem::setFMExtParams()
CThread::sleep(10U);
resp = getResponse();
if (resp == RTM_OK && m_buffer[2U] != MMDVM_ACK && m_buffer[2U] != MMDVM_NAK) {
if ((resp == RESP_TYPE_MMDVM::OK) && (m_buffer[2U] != MMDVM_ACK) && (m_buffer[2U] != MMDVM_NAK)) {
count++;
if (count >= MAX_RESPONSES) {
LogError("The MMDVM is not responding to the SET_FM_PARAMS4 command");
return false;
}
}
} while (resp == RTM_OK && m_buffer[2U] != MMDVM_ACK && m_buffer[2U] != MMDVM_NAK);
} while ((resp == RESP_TYPE_MMDVM::OK) && (m_buffer[2U] != MMDVM_ACK) && (m_buffer[2U] != MMDVM_NAK));
// CUtils::dump(1U, "Response", m_buffer, m_length);
if (resp == RTM_OK && m_buffer[2U] == MMDVM_NAK) {
if ((resp == RESP_TYPE_MMDVM::OK) && (m_buffer[2U] == MMDVM_NAK)) {
LogError("Received a NAK to the SET_FM_PARAMS4 command from the modem");
return false;
}

22
Modem.h
View file

@ -1,5 +1,5 @@
/*
* Copyright (C) 2011-2018,2020,2021 by Jonathan Naylor G4KLX
* Copyright (C) 2011-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
@ -26,18 +26,18 @@
#include <string>
enum RESP_TYPE_MMDVM {
RTM_OK,
RTM_TIMEOUT,
RTM_ERROR
enum class RESP_TYPE_MMDVM {
OK,
TIMEOUT,
ERR
};
enum SERIAL_STATE {
SS_START,
SS_LENGTH1,
SS_LENGTH2,
SS_TYPE,
SS_DATA
enum class SERIAL_STATE {
START,
LENGTH1,
LENGTH2,
TYPE,
DATA
};
class CModem {

View file

@ -1,5 +1,5 @@
/*
* Copyright (C) 2015-2021 Jonathan Naylor, G4KLX
* Copyright (C) 2015-2021,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
@ -49,8 +49,8 @@ m_duplex(duplex),
m_remoteGateway(remoteGateway),
m_lookup(lookup),
m_queue(5000U, "NXDN Control"),
m_rfState(RS_RF_LISTENING),
m_netState(RS_NET_IDLE),
m_rfState(RPT_RF_STATE::LISTENING),
m_netState(RPT_NET_STATE::IDLE),
m_rfTimeoutTimer(1000U, timeout),
m_netTimeoutTimer(1000U, timeout),
m_packetTimer(1000U, 0U, 200U),
@ -92,7 +92,7 @@ bool CNXDNControl::writeModem(unsigned char *data, unsigned int len)
unsigned char type = data[0U];
if (type == TAG_LOST && m_rfState == RS_RF_AUDIO) {
if ((type == TAG_LOST) && (m_rfState == RPT_RF_STATE::AUDIO)) {
unsigned short dstId = m_rfLayer3.getDestinationGroupId();
bool grp = m_rfLayer3.getIsGroup();
std::string source = m_lookup->find(m_rfLayer3.getSourceUnitId());
@ -105,13 +105,13 @@ bool CNXDNControl::writeModem(unsigned char *data, unsigned int len)
return false;
}
if (type == TAG_LOST && m_rfState == RS_RF_DATA) {
if ((type == TAG_LOST) && (m_rfState == RPT_RF_STATE::DATA)) {
writeEndRF();
return false;
}
if (type == TAG_LOST) {
m_rfState = RS_RF_LISTENING;
m_rfState = RPT_RF_STATE::LISTENING;
m_rfMask = 0x00U;
m_rfLayer3.reset();
return false;
@ -179,7 +179,7 @@ bool CNXDNControl::processVoice(unsigned char usc, unsigned char option, unsigne
unsigned char ran = sacch.getRAN();
if (ran != m_ran && ran != 0U)
return false;
} else if (m_rfState == RS_RF_LISTENING) {
} else if (m_rfState == RPT_RF_STATE::LISTENING) {
return false;
}
@ -203,17 +203,17 @@ bool CNXDNControl::processVoice(unsigned char usc, unsigned char option, unsigne
unsigned char type = layer3.getMessageType();
if (type == NXDN_MESSAGE_TYPE_TX_REL) {
if (m_rfState != RS_RF_AUDIO) {
m_rfState = RS_RF_LISTENING;
if (m_rfState != RPT_RF_STATE::AUDIO) {
m_rfState = RPT_RF_STATE::LISTENING;
m_rfMask = 0x00U;
m_rfLayer3.reset();
return false;
}
} else if (type == NXDN_MESSAGE_TYPE_VCALL) {
if (m_rfState == RS_RF_LISTENING && m_selfOnly) {
if ((m_rfState == RPT_RF_STATE::LISTENING) && m_selfOnly) {
unsigned short srcId = layer3.getSourceUnitId();
if (srcId != m_id) {
m_rfState = RS_RF_REJECTED;
m_rfState = RPT_RF_STATE::REJECTED;
return true;
}
}
@ -254,7 +254,7 @@ bool CNXDNControl::processVoice(unsigned char usc, unsigned char option, unsigne
scrambler(data + 2U);
writeNetwork(netData, data[0U] == TAG_EOT ? NNMT_VOICE_TRAILER : NNMT_VOICE_HEADER);
writeNetwork(netData, data[0U] == TAG_EOT ? NXDN_NETWORK_MESSAGE_TYPE::VOICE_TRAILER : NXDN_NETWORK_MESSAGE_TYPE::VOICE_HEADER);
#if defined(DUMP_NXDN)
writeFile(data + 2U);
@ -278,7 +278,7 @@ bool CNXDNControl::processVoice(unsigned char usc, unsigned char option, unsigne
m_rfErrs = 0U;
m_rfBits = 1U;
m_rfTimeoutTimer.start();
m_rfState = RS_RF_AUDIO;
m_rfState = RPT_RF_STATE::AUDIO;
m_minRSSI = m_rssi;
m_maxRSSI = m_rssi;
m_aveRSSI = m_rssi;
@ -297,7 +297,7 @@ bool CNXDNControl::processVoice(unsigned char usc, unsigned char option, unsigne
return true;
} else {
if (m_rfState == RS_RF_LISTENING) {
if (m_rfState == RPT_RF_STATE::LISTENING) {
CNXDNFACCH1 facch;
bool valid = false;
switch (option) {
@ -374,7 +374,7 @@ bool CNXDNControl::processVoice(unsigned char usc, unsigned char option, unsigne
if (m_selfOnly) {
if (srcId != m_id) {
m_rfState = RS_RF_REJECTED;
m_rfState = RPT_RF_STATE::REJECTED;
return true;
}
}
@ -383,7 +383,7 @@ bool CNXDNControl::processVoice(unsigned char usc, unsigned char option, unsigne
m_rfErrs = 0U;
m_rfBits = 1U;
m_rfTimeoutTimer.start();
m_rfState = RS_RF_AUDIO;
m_rfState = RPT_RF_STATE::AUDIO;
m_minRSSI = m_rssi;
m_maxRSSI = m_rssi;
@ -396,7 +396,7 @@ bool CNXDNControl::processVoice(unsigned char usc, unsigned char option, unsigne
LogMessage("NXDN, received RF late entry from %s to %s%u", source.c_str(), grp ? "TG " : "", dstId);
m_display->writeNXDN(source.c_str(), grp, dstId, "R");
m_rfState = RS_RF_AUDIO;
m_rfState = RPT_RF_STATE::AUDIO;
// Create a dummy start message
unsigned char start[NXDN_FRAME_LENGTH_BYTES + 2U];
@ -438,7 +438,7 @@ bool CNXDNControl::processVoice(unsigned char usc, unsigned char option, unsigne
scrambler(start + 2U);
writeNetwork(netData, NNMT_VOICE_HEADER);
writeNetwork(netData, NXDN_NETWORK_MESSAGE_TYPE::VOICE_HEADER);
#if defined(DUMP_NXDN)
writeFile(start + 2U);
@ -448,7 +448,7 @@ bool CNXDNControl::processVoice(unsigned char usc, unsigned char option, unsigne
}
}
if (m_rfState == RS_RF_AUDIO) {
if (m_rfState == RPT_RF_STATE::AUDIO) {
// Regenerate the sync
CSync::addNXDNSync(data + 2U);
@ -544,7 +544,7 @@ bool CNXDNControl::processVoice(unsigned char usc, unsigned char option, unsigne
scrambler(data + 2U);
writeNetwork(netData, NNMT_VOICE_BODY);
writeNetwork(netData, NXDN_NETWORK_MESSAGE_TYPE::VOICE_BODY);
#if defined(DUMP_NXDN)
writeFile(data + 2U);
@ -565,7 +565,7 @@ bool CNXDNControl::processData(unsigned char option, unsigned char *data)
{
CNXDNUDCH udch;
bool validUDCH = udch.decode(data + 2U);
if (m_rfState == RS_RF_LISTENING && !validUDCH)
if ((m_rfState == RPT_RF_STATE::LISTENING) && !validUDCH)
return false;
if (validUDCH) {
@ -584,7 +584,7 @@ bool CNXDNControl::processData(unsigned char option, unsigned char *data)
CNXDNLayer3 layer3;
layer3.decode(buffer, 184U);
if (m_rfState == RS_RF_LISTENING) {
if (m_rfState == RPT_RF_STATE::LISTENING) {
unsigned char type = layer3.getMessageType();
if (type != NXDN_MESSAGE_TYPE_DCALL_HDR)
return false;
@ -610,14 +610,14 @@ bool CNXDNControl::processData(unsigned char option, unsigned char *data)
m_rfLayer3 = layer3;
m_rfFrames = 0U;
m_rfState = RS_RF_DATA;
m_rfState = RPT_RF_STATE::DATA;
#if defined(DUMP_NXDN)
openFile();
#endif
}
if (m_rfState != RS_RF_DATA)
if (m_rfState != RPT_RF_STATE::DATA)
return false;
CSync::addNXDNSync(data + 2U);
@ -651,13 +651,13 @@ bool CNXDNControl::processData(unsigned char option, unsigned char *data)
switch (type) {
case NXDN_MESSAGE_TYPE_DCALL_HDR:
writeNetwork(netData, NNMT_DATA_HEADER);
writeNetwork(netData, NXDN_NETWORK_MESSAGE_TYPE::DATA_HEADER);
break;
case NXDN_MESSAGE_TYPE_TX_REL:
writeNetwork(netData, NNMT_DATA_TRAILER);
writeNetwork(netData, NXDN_NETWORK_MESSAGE_TYPE::DATA_TRAILER);
break;
default:
writeNetwork(netData, NNMT_DATA_BODY);
writeNetwork(netData, NXDN_NETWORK_MESSAGE_TYPE::DATA_BODY);
break;
}
@ -699,14 +699,14 @@ unsigned int CNXDNControl::readModem(unsigned char* data)
void CNXDNControl::writeEndRF()
{
m_rfState = RS_RF_LISTENING;
m_rfState = RPT_RF_STATE::LISTENING;
m_rfMask = 0x00U;
m_rfLayer3.reset();
m_rfTimeoutTimer.stop();
if (m_netState == RS_NET_IDLE) {
if (m_netState == RPT_NET_STATE::IDLE) {
m_display->clearNXDN();
if (m_network != NULL)
@ -720,7 +720,7 @@ void CNXDNControl::writeEndRF()
void CNXDNControl::writeEndNet()
{
m_netState = RS_NET_IDLE;
m_netState = RPT_NET_STATE::IDLE;
m_netMask = 0x00U;
m_netLayer3.reset();
@ -745,7 +745,7 @@ void CNXDNControl::writeNetwork()
if (!m_enabled)
return;
if (m_rfState != RS_RF_LISTENING && m_netState == RS_NET_IDLE)
if ((m_rfState != RPT_RF_STATE::LISTENING) && (m_netState == RPT_NET_STATE::IDLE))
return;
m_networkWatchdog.start();
@ -766,7 +766,7 @@ void CNXDNControl::writeNetwork()
layer3.setData(netData + 2U, 23U);
unsigned char type = layer3.getMessageType();
if (m_netState == RS_NET_IDLE) {
if (m_netState == RPT_NET_STATE::IDLE) {
if (type == NXDN_MESSAGE_TYPE_DCALL_HDR) {
unsigned short srcId = layer3.getSourceUnitId();
unsigned short dstId = layer3.getDestinationGroupId();
@ -778,13 +778,13 @@ void CNXDNControl::writeNetwork()
m_display->writeNXDN(source.c_str(), grp, dstId, "N");
LogMessage("NXDN, received network data header from %s to %s%u, %u blocks", source.c_str(), grp ? "TG " : "", dstId, frames);
m_netState = RS_NET_DATA;
m_netState = RPT_NET_STATE::DATA;
} else {
return;
}
}
if (m_netState == RS_NET_DATA) {
if (m_netState == RPT_NET_STATE::DATA) {
data[0U] = type == NXDN_MESSAGE_TYPE_TX_REL ? TAG_EOT : TAG_DATA;
data[1U] = 0x00U;
@ -810,9 +810,9 @@ void CNXDNControl::writeNetwork()
m_netLayer3.setData(netData + 5U + 0U, 10U);
unsigned char type = m_netLayer3.getMessageType();
if (type == NXDN_MESSAGE_TYPE_TX_REL && m_netState == RS_NET_IDLE)
if ((type == NXDN_MESSAGE_TYPE_TX_REL) && (m_netState == RPT_NET_STATE::IDLE))
return;
if (type == NXDN_MESSAGE_TYPE_VCALL && m_netState != RS_NET_IDLE)
if ((type == NXDN_MESSAGE_TYPE_VCALL) && (m_netState != RPT_NET_STATE::IDLE))
return;
CNXDNSACCH sacch;
@ -849,14 +849,14 @@ void CNXDNControl::writeNetwork()
m_netTimeoutTimer.start();
m_packetTimer.start();
m_elapsed.start();
m_netState = RS_NET_AUDIO;
m_netState = RPT_NET_STATE::AUDIO;
m_netFrames = 1U;
} else {
CUtils::dump(2U, "NXDN, interesting non superblock network frame", netData, 33U);
return;
}
} else {
if (m_netState == RS_NET_IDLE) {
if (m_netState == RPT_NET_STATE::IDLE) {
unsigned char structure = (netData[1U] >> 6) & 0x03U;
switch (structure) {
case NXDN_SR_1_4:
@ -901,7 +901,7 @@ void CNXDNControl::writeNetwork()
m_netTimeoutTimer.start();
m_packetTimer.start();
m_elapsed.start();
m_netState = RS_NET_AUDIO;
m_netState = RPT_NET_STATE::AUDIO;
m_netFrames = 1U;
// Create a dummy start message
@ -992,7 +992,7 @@ void CNXDNControl::clock(unsigned int ms)
m_rfTimeoutTimer.clock(ms);
m_netTimeoutTimer.clock(ms);
if (m_netState == RS_NET_AUDIO) {
if (m_netState == RPT_NET_STATE::AUDIO) {
m_networkWatchdog.clock(ms);
if (m_networkWatchdog.hasExpired()) {
@ -1006,7 +1006,7 @@ void CNXDNControl::writeQueueRF(const unsigned char *data)
{
assert(data != NULL);
if (m_netState != RS_NET_IDLE)
if (m_netState != RPT_NET_STATE::IDLE)
return;
if (m_rfTimeoutTimer.isRunning() && m_rfTimeoutTimer.hasExpired())
@ -1108,7 +1108,7 @@ void CNXDNControl::closeFile()
bool CNXDNControl::isBusy() const
{
return m_rfState != RS_RF_LISTENING || m_netState != RS_NET_IDLE;
return (m_rfState != RPT_RF_STATE::LISTENING) || (m_netState != RPT_NET_STATE::IDLE);
}
void CNXDNControl::enable(bool enabled)
@ -1117,7 +1117,7 @@ void CNXDNControl::enable(bool enabled)
m_queue.clear();
// Reset the RF section
m_rfState = RS_RF_LISTENING;
m_rfState = RPT_RF_STATE::LISTENING;
m_rfMask = 0x00U;
m_rfLayer3.reset();
@ -1125,7 +1125,7 @@ void CNXDNControl::enable(bool enabled)
m_rfTimeoutTimer.stop();
// Reset the networking section
m_netState = RS_NET_IDLE;
m_netState = RPT_NET_STATE::IDLE;
m_netMask = 0x00U;
m_netLayer3.reset();

View file

@ -1,5 +1,5 @@
/*
* Copyright (C) 2016,2017,2018 by Jonathan Naylor G4KLX
* Copyright (C) 2016,2017,2018,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
@ -50,7 +50,7 @@ const unsigned char NXDN_LICH_RFCT_RTCH_C = 3U;
const unsigned char NXDN_LICH_USC_SACCH_NS = 0U;
const unsigned char NXDN_LICH_USC_UDCH = 1U;
const unsigned char NXDN_LICH_USC_SACCH_SS = 2U;
const unsigned char NXDN_LICH_USC_SACCH_SS_IDLE = 3U;
const unsigned char NXDN_LICH_USC_SACCH_IDLE = 3U;
const unsigned char NXDN_LICH_STEAL_NONE = 3U;
const unsigned char NXDN_LICH_STEAL_FACCH1_2 = 2U;

View file

@ -1,5 +1,5 @@
/*
* Copyright (C) 2009-2014,2016,2018-2020 by Jonathan Naylor G4KLX
* Copyright (C) 2009-2014,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
@ -76,20 +76,20 @@ bool CNXDNIcomNetwork::write(const unsigned char* data, NXDN_NETWORK_MESSAGE_TYP
buffer[7U] = 0xE0U;
switch (type) {
case NNMT_VOICE_HEADER:
case NNMT_VOICE_TRAILER:
case NXDN_NETWORK_MESSAGE_TYPE::VOICE_HEADER:
case NXDN_NETWORK_MESSAGE_TYPE::VOICE_TRAILER:
buffer[37U] = 0x23U;
buffer[38U] = 0x1CU;
buffer[39U] = 0x21U;
break;
case NNMT_VOICE_BODY:
case NXDN_NETWORK_MESSAGE_TYPE::VOICE_BODY:
buffer[37U] = 0x23U;
buffer[38U] = 0x10U;
buffer[39U] = 0x21U;
break;
case NNMT_DATA_HEADER:
case NNMT_DATA_BODY:
case NNMT_DATA_TRAILER:
case NXDN_NETWORK_MESSAGE_TYPE::DATA_HEADER:
case NXDN_NETWORK_MESSAGE_TYPE::DATA_BODY:
case NXDN_NETWORK_MESSAGE_TYPE::DATA_TRAILER:
buffer[37U] = 0x23U;
buffer[38U] = 0x02U;
buffer[39U] = 0x18U;

View file

@ -1,5 +1,5 @@
/*
* Copyright (C) 2009-2014,2016,2018,2020 by Jonathan Naylor G4KLX
* Copyright (C) 2009-2014,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
@ -110,15 +110,15 @@ bool CNXDNKenwoodNetwork::write(const unsigned char* data, NXDN_NETWORK_MESSAGE_
assert(data != NULL);
switch (type) {
case NNMT_VOICE_HEADER: // Voice header or trailer
case NNMT_VOICE_TRAILER:
case NXDN_NETWORK_MESSAGE_TYPE::VOICE_HEADER: // Voice header or trailer
case NXDN_NETWORK_MESSAGE_TYPE::VOICE_TRAILER:
return processIcomVoiceHeader(data);
case NNMT_VOICE_BODY: // Voice data
case NXDN_NETWORK_MESSAGE_TYPE::VOICE_BODY: // Voice data
return processIcomVoiceData(data);
case NNMT_DATA_HEADER: // Data header or trailer
case NNMT_DATA_TRAILER:
case NXDN_NETWORK_MESSAGE_TYPE::DATA_HEADER: // Data header or trailer
case NXDN_NETWORK_MESSAGE_TYPE::DATA_TRAILER:
return processIcomDataHeader(data);
case NNMT_DATA_BODY: // Data data
case NXDN_NETWORK_MESSAGE_TYPE::DATA_BODY: // Data data
return processIcomDataData(data);
default:
return false;
@ -774,7 +774,7 @@ unsigned int CNXDNKenwoodNetwork::readRTP(unsigned char* data)
if (length <= 0)
return 0U;
if (!CUDPSocket::match(m_rtpAddr, address, IMT_ADDRESS_ONLY)) {
if (!CUDPSocket::match(m_rtpAddr, address, IPMATCHTYPE::IMT_ADDREONLY)) {
LogMessage("NXDN, RTP packet received from an invalid source");
return 0U;
}
@ -802,7 +802,7 @@ unsigned int CNXDNKenwoodNetwork::readRTCP(unsigned char* data)
if (length <= 0)
return 0U;
if (!CUDPSocket::match(m_rtpAddr, address, IMT_ADDRESS_ONLY)) {
if (!CUDPSocket::match(m_rtpAddr, address, IPMATCHTYPE::IMT_ADDREONLY)) {
LogMessage("NXDN, RTCP packet received from an invalid source");
return 0U;
}

View file

@ -1,5 +1,5 @@
/*
* Copyright (C) 2020 by Jonathan Naylor G4KLX
* 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
@ -23,13 +23,13 @@
#include <cstdint>
enum NXDN_NETWORK_MESSAGE_TYPE {
NNMT_VOICE_HEADER,
NNMT_VOICE_BODY,
NNMT_VOICE_TRAILER,
NNMT_DATA_HEADER,
NNMT_DATA_BODY,
NNMT_DATA_TRAILER
enum class NXDN_NETWORK_MESSAGE_TYPE {
VOICE_HEADER,
VOICE_BODY,
VOICE_TRAILER,
DATA_HEADER,
DATA_BODY,
DATA_TRAILER
};
class INXDNNetwork {

View file

@ -1,4 +1,5 @@
/*
* Copyright (C) 2025 by Jonathan Naylor G4KLX
* Copyright (C) 2017 by Lieven De Samblanx ON7LDS
*
* This program is free software; you can redistribute it and/or modify
@ -123,7 +124,7 @@ void CNetworkInfo::getNetworkInterface(unsigned char* info)
struct rt_msghdr *rtm;
for (char *p = buf; p < buf + size; p += rtm->rtm_msglen) {
rtm = (struct rt_msghdr *)p;
if (rtm->rtm_version != RTM_VERSION)
if (rtm->rtm_version != VERSION)
continue;
#if defined(__OpenBSD__)
struct sockaddr_in *sa = (struct sockaddr_in *)(p + rtm->rtm_hdrlen);

View file

@ -1,5 +1,5 @@
/*
* Copyright (C) 2016-2019,2021,2024 by Jonathan Naylor G4KLX
* Copyright (C) 2016-2019,2021,2024,2025 by Jonathan Naylor G4KLX
* Copyright (C) 2018 by Bryan Biedenkapp <gatekeep@gmail.com> N2PLL
*
* This program is free software; you can redistribute it and/or modify
@ -49,8 +49,8 @@ m_display(display),
m_duplex(duplex),
m_lookup(lookup),
m_queue(1000U, "P25 Control"),
m_rfState(RS_RF_LISTENING),
m_netState(RS_NET_IDLE),
m_rfState(RPT_RF_STATE::LISTENING),
m_netState(RPT_NET_STATE::IDLE),
m_rfTimeout(1000U, timeout),
m_netTimeout(1000U, timeout),
m_networkWatchdog(1000U, 0U, 1500U),
@ -124,7 +124,7 @@ bool CP25Control::writeModem(unsigned char* data, unsigned int len)
bool sync = data[1U] == 0x01U;
if (data[0U] == TAG_LOST && m_rfState == RS_RF_AUDIO) {
if ((data[0U] == TAG_LOST) && (m_rfState == RPT_RF_STATE::AUDIO)) {
bool grp = m_rfData.getLCF() == P25_LCF_GROUP;
unsigned int dstId = m_rfData.getDstId();
std::string source = m_lookup->find(m_rfData.getSrcId());
@ -136,12 +136,12 @@ bool CP25Control::writeModem(unsigned char* data, unsigned int len)
// LogMessage("P25, total frames: %d, bits: %d, undecodable LC: %d, errors: %d, BER: %.4f%%", m_rfFrames, m_rfBits, m_rfUndecodableLC, m_rfErrs, float(m_rfErrs * 100U) / float(m_rfBits));
if (m_netState == RS_NET_IDLE)
if (m_netState == RPT_NET_STATE::IDLE)
m_display->clearP25();
writeNetwork(m_rfLDU, m_lastDUID, true);
writeNetwork(data + 2U, P25_DUID_TERM, true);
m_rfState = RS_RF_LISTENING;
m_rfState = RPT_RF_STATE::LISTENING;
m_rfTimeout.stop();
m_rfData.reset();
#if defined(DUMP_P25)
@ -150,11 +150,11 @@ bool CP25Control::writeModem(unsigned char* data, unsigned int len)
return false;
}
if (data[0U] == TAG_LOST && m_rfState == RS_RF_DATA) {
if (m_netState == RS_NET_IDLE)
if ((data[0U] == TAG_LOST) && (m_rfState == RPT_RF_STATE::DATA)) {
if (m_netState == RPT_NET_STATE::IDLE)
m_display->clearP25();
m_rfState = RS_RF_LISTENING;
m_rfState = RPT_RF_STATE::LISTENING;
m_rfPDUCount = 0U;
m_rfPDUBits = 0U;
#if defined(DUMP_P25)
@ -164,17 +164,17 @@ bool CP25Control::writeModem(unsigned char* data, unsigned int len)
}
if (data[0U] == TAG_LOST) {
m_rfState = RS_RF_LISTENING;
m_rfState = RPT_RF_STATE::LISTENING;
return false;
}
if (!sync && m_rfState == RS_RF_LISTENING)
if (!sync && (m_rfState == RPT_RF_STATE::LISTENING))
return false;
// Decode the NID
bool valid = m_nid.decode(data + 2U);
if (m_rfState == RS_RF_LISTENING && !valid)
if ((m_rfState == RPT_RF_STATE::LISTENING) && !valid)
return false;
unsigned char duid = m_nid.getDUID();
@ -222,7 +222,7 @@ bool CP25Control::writeModem(unsigned char* data, unsigned int len)
}
if (duid == P25_DUID_HEADER) {
if (m_rfState == RS_RF_LISTENING) {
if (m_rfState == RPT_RF_STATE::LISTENING) {
m_rfData.reset();
bool ret = m_rfData.decodeHeader(data + 2U);
if (!ret) {
@ -236,7 +236,7 @@ bool CP25Control::writeModem(unsigned char* data, unsigned int len)
return true;
}
} else if (duid == P25_DUID_LDU1) {
if (m_rfState == RS_RF_LISTENING) {
if (m_rfState == RPT_RF_STATE::LISTENING) {
m_rfData.reset();
bool ret = m_rfData.decodeLDU1(data + 2U);
if (!ret) {
@ -275,7 +275,7 @@ bool CP25Control::writeModem(unsigned char* data, unsigned int len)
LogMessage("P25, received RF voice transmission from %s to %s%u", source.c_str(), grp ? "TG " : "", dstId);
m_display->writeP25(source.c_str(), grp, dstId, "R");
m_rfState = RS_RF_AUDIO;
m_rfState = RPT_RF_STATE::AUDIO;
m_minRSSI = m_rssi;
m_maxRSSI = m_rssi;
@ -284,11 +284,11 @@ bool CP25Control::writeModem(unsigned char* data, unsigned int len)
createRFHeader();
writeNetwork(data + 2U, P25_DUID_HEADER, false);
} else if (m_rfState == RS_RF_AUDIO) {
} else if (m_rfState == RPT_RF_STATE::AUDIO) {
writeNetwork(m_rfLDU, m_lastDUID, false);
}
if (m_rfState == RS_RF_AUDIO) {
if (m_rfState == RPT_RF_STATE::AUDIO) {
/*
bool ret = m_rfData.decodeLDU1(data + 2U);
if (!ret) {
@ -342,7 +342,7 @@ bool CP25Control::writeModem(unsigned char* data, unsigned int len)
return true;
}
} else if (duid == P25_DUID_LDU2) {
if (m_rfState == RS_RF_AUDIO) {
if (m_rfState == RPT_RF_STATE::AUDIO) {
/*
bool ret = m_rfData.decodeLDU2(data + 2U);
if (!ret) {
@ -398,10 +398,10 @@ bool CP25Control::writeModem(unsigned char* data, unsigned int len)
return true;
}
} else if (duid == P25_DUID_TSDU) {
if (m_rfState != RS_RF_DATA) {
if (m_rfState != RPT_RF_STATE::DATA) {
m_rfPDUCount = 0U;
m_rfPDUBits = 0U;
m_rfState = RS_RF_DATA;
m_rfState = RPT_RF_STATE::DATA;
m_rfDataFrames = 0U;
}
@ -475,10 +475,10 @@ bool CP25Control::writeModem(unsigned char* data, unsigned int len)
break;
}
m_rfState = RS_RF_LISTENING;
m_rfState = RPT_RF_STATE::LISTENING;
return true;
} else if (duid == P25_DUID_TERM || duid == P25_DUID_TERM_LC) {
if (m_rfState == RS_RF_AUDIO) {
if (m_rfState == RPT_RF_STATE::AUDIO) {
writeNetwork(m_rfLDU, m_lastDUID, true);
::memset(data + 2U, 0x00U, P25_TERM_FRAME_LENGTH_BYTES);
@ -496,7 +496,7 @@ bool CP25Control::writeModem(unsigned char* data, unsigned int len)
unsigned int dstId = m_rfData.getDstId();
std::string source = m_lookup->find(m_rfData.getSrcId());
m_rfState = RS_RF_LISTENING;
m_rfState = RPT_RF_STATE::LISTENING;
m_rfTimeout.stop();
m_rfData.reset();
m_lastDUID = duid;
@ -523,10 +523,10 @@ bool CP25Control::writeModem(unsigned char* data, unsigned int len)
}
}
} else if (duid == P25_DUID_PDU) {
if (m_rfState != RS_RF_DATA) {
if (m_rfState != RPT_RF_STATE::DATA) {
m_rfPDUCount = 0U;
m_rfPDUBits = 0U;
m_rfState = RS_RF_DATA;
m_rfState = RPT_RF_STATE::DATA;
m_rfDataFrames = 0U;
}
@ -556,12 +556,12 @@ bool CP25Control::writeModem(unsigned char* data, unsigned int len)
} else {
m_rfPDUCount = 0U;
m_rfPDUBits = 0U;
m_rfState = RS_RF_LISTENING;
m_rfState = RPT_RF_STATE::LISTENING;
m_rfDataFrames = 0U;
}
}
if (m_rfState == RS_RF_DATA) {
if (m_rfState == RPT_RF_STATE::DATA) {
m_rfPDUCount++;
unsigned int bitLength = ((m_rfDataFrames + 1U) * P25_PDU_FEC_LENGTH_BITS) + P25_SYNC_LENGTH_BITS + P25_NID_LENGTH_BITS;
@ -620,7 +620,7 @@ bool CP25Control::writeModem(unsigned char* data, unsigned int len)
m_rfPDUCount = 0U;
m_rfPDUBits = 0U;
m_rfState = RS_RF_LISTENING;
m_rfState = RPT_RF_STATE::LISTENING;
m_rfDataFrames = 0U;
}
@ -660,7 +660,7 @@ void CP25Control::writeNetwork()
if (!m_enabled)
return;
if (m_rfState != RS_RF_LISTENING && m_netState == RS_NET_IDLE)
if ((m_rfState != RPT_RF_STATE::LISTENING) && (m_netState == RPT_NET_STATE::IDLE))
return;
m_networkWatchdog.start();
@ -701,7 +701,7 @@ void CP25Control::writeNetwork()
case 0x6AU:
::memcpy(m_netLDU1 + 200U, data, 16U);
checkNetLDU2();
if (m_netState != RS_NET_IDLE)
if (m_netState != RPT_NET_STATE::IDLE)
createNetLDU1();
break;
case 0x6BU:
@ -738,7 +738,7 @@ void CP25Control::writeNetwork()
break;
case 0x73U:
::memcpy(m_netLDU2 + 200U, data, 16U);
if (m_netState == RS_NET_IDLE) {
if (m_netState == RPT_NET_STATE::IDLE) {
createNetHeader();
createNetLDU1();
} else {
@ -762,14 +762,14 @@ void CP25Control::clock(unsigned int ms)
m_rfTimeout.clock(ms);
m_netTimeout.clock(ms);
if (m_netState == RS_NET_AUDIO) {
if (m_netState == RPT_NET_STATE::AUDIO) {
m_networkWatchdog.clock(ms);
if (m_networkWatchdog.hasExpired()) {
LogMessage("P25, network watchdog has expired, %.1f seconds, %u%% packet loss", float(m_netFrames) / 50.0F, (m_netLost * 100U) / m_netFrames);
m_display->clearP25();
m_networkWatchdog.stop();
m_netState = RS_NET_IDLE;
m_netState = RPT_NET_STATE::IDLE;
m_netData.reset();
m_netTimeout.stop();
}
@ -849,7 +849,7 @@ void CP25Control::addBusyBits(unsigned char* data, unsigned int length, bool b1,
{
assert(data != NULL);
for (unsigned int ss0Pos = P25_SS0_START; ss0Pos < length; ss0Pos += P25_SS_INCREMENT) {
for (unsigned int ss0Pos = P25_SS0_START; ss0Pos < length; ss0Pos += P25_INCREMENT) {
unsigned int ss1Pos = ss0Pos + 1U;
WRITE_BIT(data, ss0Pos, b1);
WRITE_BIT(data, ss1Pos, b2);
@ -858,7 +858,7 @@ void CP25Control::addBusyBits(unsigned char* data, unsigned int length, bool b1,
void CP25Control::checkNetLDU1()
{
if (m_netState == RS_NET_IDLE)
if (m_netState == RPT_NET_STATE::IDLE)
return;
// Check for an unflushed LDU1
@ -870,7 +870,7 @@ void CP25Control::checkNetLDU1()
void CP25Control::checkNetLDU2()
{
if (m_netState == RS_NET_IDLE)
if (m_netState == RPT_NET_STATE::IDLE)
return;
// Check for an unflushed LDU1
@ -1018,7 +1018,7 @@ void CP25Control::createNetHeader()
m_display->writeP25(source.c_str(), lcf == P25_LCF_GROUP, dstId, "N");
m_netState = RS_NET_AUDIO;
m_netState = RPT_NET_STATE::AUDIO;
m_netTimeout.start();
m_netFrames = 0U;
m_netLost = 0U;
@ -1193,7 +1193,7 @@ void CP25Control::createNetTerminator()
m_netTimeout.stop();
m_networkWatchdog.stop();
m_netData.reset();
m_netState = RS_NET_IDLE;
m_netState = RPT_NET_STATE::IDLE;
}
bool CP25Control::openFile()
@ -1240,7 +1240,7 @@ void CP25Control::closeFile()
bool CP25Control::isBusy() const
{
return m_rfState != RS_RF_LISTENING || m_netState != RS_NET_IDLE;
return (m_rfState != RPT_RF_STATE::LISTENING) || (m_netState != RPT_NET_STATE::IDLE);
}
void CP25Control::enable(bool enabled)
@ -1249,7 +1249,7 @@ void CP25Control::enable(bool enabled)
m_queue.clear();
// Reset the RF section
m_rfState = RS_RF_LISTENING;
m_rfState = RPT_RF_STATE::LISTENING;
m_rfTimeout.stop();
m_rfData.reset();
@ -1257,7 +1257,7 @@ void CP25Control::enable(bool enabled)
m_netTimeout.stop();
m_networkWatchdog.stop();
m_netData.reset();
m_netState = RS_NET_IDLE;
m_netState = RPT_NET_STATE::IDLE;
}
m_enabled = enabled;

View file

@ -1,5 +1,5 @@
/*
* Copyright (C) 2016 by Jonathan Naylor G4KLX
* Copyright (C) 2016,2025 by Jonathan Naylor G4KLX
* Copyright (C) 2018 by Bryan Biedenkapp <gatekeep@gmail.com>
*
* This program is free software; you can redistribute it and/or modify
@ -65,7 +65,7 @@ const unsigned char P25_LCF_TSBK_ACK_RSP_FNE = 0x20U;
const unsigned int P25_SS0_START = 70U;
const unsigned int P25_SS1_START = 71U;
const unsigned int P25_SS_INCREMENT = 72U;
const unsigned int P25_INCREMENT = 72U;
const unsigned char P25_DUID_HEADER = 0x00U;
const unsigned char P25_DUID_TERM = 0x03U;

View file

@ -1,5 +1,5 @@
/*
* Copyright (C) 2016,2018 by Jonathan Naylor G4KLX
* Copyright (C) 2016,2018,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
@ -37,16 +37,16 @@ unsigned int CP25Utils::decode(const unsigned char* in, unsigned char* out, unsi
unsigned int ss1Pos = P25_SS1_START;
while (ss0Pos < start) {
ss0Pos += P25_SS_INCREMENT;
ss1Pos += P25_SS_INCREMENT;
ss0Pos += P25_INCREMENT;
ss1Pos += P25_INCREMENT;
}
unsigned int n = 0U;
for (unsigned int i = start; i < stop; i++) {
if (i == ss0Pos) {
ss0Pos += P25_SS_INCREMENT;
ss0Pos += P25_INCREMENT;
} else if (i == ss1Pos) {
ss1Pos += P25_SS_INCREMENT;
ss1Pos += P25_INCREMENT;
} else {
bool b = READ_BIT(in, i);
WRITE_BIT(out, n, b);
@ -67,16 +67,16 @@ unsigned int CP25Utils::encode(const unsigned char* in, unsigned char* out, unsi
unsigned int ss1Pos = P25_SS1_START;
while (ss0Pos < start) {
ss0Pos += P25_SS_INCREMENT;
ss1Pos += P25_SS_INCREMENT;
ss0Pos += P25_INCREMENT;
ss1Pos += P25_INCREMENT;
}
unsigned int n = 0U;
for (unsigned int i = start; i < stop; i++) {
if (i == ss0Pos) {
ss0Pos += P25_SS_INCREMENT;
ss0Pos += P25_INCREMENT;
} else if (i == ss1Pos) {
ss1Pos += P25_SS_INCREMENT;
ss1Pos += P25_INCREMENT;
} else {
bool b = READ_BIT(in, n);
WRITE_BIT(out, i, b);
@ -100,9 +100,9 @@ unsigned int CP25Utils::encode(const unsigned char* in, unsigned char* out, unsi
unsigned int pos = 0U;
while (n < length) {
if (pos == ss0Pos) {
ss0Pos += P25_SS_INCREMENT;
ss0Pos += P25_INCREMENT;
} else if (pos == ss1Pos) {
ss1Pos += P25_SS_INCREMENT;
ss1Pos += P25_INCREMENT;
} else {
bool b = READ_BIT(in, n);
WRITE_BIT(out, pos, b);

View file

@ -1,5 +1,5 @@
/*
* Copyright (C) 2018,2019,2020 Jonathan Naylor, G4KLX
* Copyright (C) 2018,2019,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
@ -68,7 +68,7 @@ m_output(),
m_buffer(),
m_ric(0U),
m_data(),
m_state(PS_NONE),
m_state(POCSAG_STATE::NONE),
m_enabled(true),
m_fp(NULL)
{
@ -289,7 +289,7 @@ bool CPOCSAGControl::processData()
void CPOCSAGControl::clock(unsigned int ms)
{
if (m_state == PS_NONE) {
if (m_state == POCSAG_STATE::NONE) {
bool ret = readNetwork();
if (!ret)
return;
@ -298,7 +298,7 @@ void CPOCSAGControl::clock(unsigned int ms)
if (!ret)
return;
m_state = PS_WAITING;
m_state = POCSAG_STATE::WAITING;
m_frames = 0U;
m_count = 1U;
@ -311,7 +311,7 @@ void CPOCSAGControl::clock(unsigned int ms)
m_output.push_back(POCSAG_SYNC_WORD);
for (unsigned int i = 0U; i < POCSAG_FRAME_ADDRESSES; i++) {
if (m_state == PS_WAITING) {
if (m_state == POCSAG_STATE::WAITING) {
if (i == (m_ric % POCSAG_FRAME_ADDRESSES)) {
uint32_t w1 = m_buffer.front();
m_buffer.pop_front();
@ -321,22 +321,22 @@ void CPOCSAGControl::clock(unsigned int ms)
m_output.push_back(w1);
m_output.push_back(w2);
m_state = PS_SENDING;
m_state = POCSAG_STATE::SENDING;
} else {
m_output.push_back(POCSAG_IDLE_WORD);
m_output.push_back(POCSAG_IDLE_WORD);
}
} else if (m_state == PS_SENDING) {
} else if (m_state == POCSAG_STATE::SENDING) {
if (m_buffer.empty()) {
m_output.push_back(POCSAG_IDLE_WORD);
m_output.push_back(POCSAG_IDLE_WORD);
bool ret = processData();
if (ret) {
m_state = PS_WAITING;
m_state = POCSAG_STATE::WAITING;
m_count++;
} else {
m_state = PS_ENDING;
m_state = POCSAG_STATE::ENDING;
}
} else {
uint32_t w1 = m_buffer.front();
@ -347,7 +347,7 @@ void CPOCSAGControl::clock(unsigned int ms)
m_output.push_back(w1);
m_output.push_back(w2);
}
} else { // PS_ENDING
} else { // ENDING
m_output.push_back(POCSAG_IDLE_WORD);
m_output.push_back(POCSAG_IDLE_WORD);
}
@ -356,10 +356,10 @@ void CPOCSAGControl::clock(unsigned int ms)
writeQueue();
m_frames++;
if (m_state == PS_ENDING) {
if (m_state == POCSAG_STATE::ENDING) {
LogMessage("POCSAG, transmitted %u frame(s) of data from %u message(s)", m_frames, m_count);
m_display->clearPOCSAG();
m_state = PS_NONE;
m_state = POCSAG_STATE::NONE;
#if defined(DUMP_POCSAG)
closeFile();
@ -568,7 +568,7 @@ void CPOCSAGControl::enable(bool enabled)
delete *it;
m_data.clear();
m_state = PS_NONE;
m_state = POCSAG_STATE::NONE;
}
m_enabled = enabled;

View file

@ -1,5 +1,5 @@
/*
* Copyright (C) 2018,2019,2020 by Jonathan Naylor G4KLX
* Copyright (C) 2018,2019,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
@ -60,11 +60,11 @@ private:
unsigned int m_frames;
unsigned int m_count;
enum POCSAG_STATE {
PS_NONE,
PS_WAITING,
PS_SENDING,
PS_ENDING
enum class POCSAG_STATE {
NONE,
WAITING,
SENDING,
ENDING
};
std::deque<uint32_t> m_output;

View file

@ -1,5 +1,5 @@
/*
* Copyright (C) 2019,2020 by Jonathan Naylor G4KLX
* Copyright (C) 2019,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
@ -85,7 +85,7 @@ int CRemoteCommand::send(const std::string& command)
if (!ret)
return 1;
ret = socket.write((unsigned char*)command.c_str(), command.length(), addr, addrLen);
ret = socket.write((unsigned char*)command.c_str(), (unsigned int)command.length(), addr, addrLen);
if (!ret) {
socket.close();
return 1;

View file

@ -1,5 +1,5 @@
/*
* Copyright (C) 2019,2020,2021,2024 by Jonathan Naylor G4KLX
* Copyright (C) 2019,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
@ -38,7 +38,7 @@ m_host(host),
m_socket(address, port),
m_addr(),
m_addrLen(0U),
m_command(RCD_NONE),
m_command(REMOTE_COMMAND::NONE),
m_args()
{
assert(port > 0U);
@ -63,7 +63,7 @@ bool CRemoteControl::open()
REMOTE_COMMAND CRemoteControl::getCommand()
{
m_command = RCD_NONE;
m_command = REMOTE_COMMAND::NONE;
m_args.clear();
char command[BUFFER_LENGTH];
@ -89,79 +89,79 @@ REMOTE_COMMAND CRemoteControl::getCommand()
if (m_args.at(0U) == "mode" && m_args.size() >= SET_MODE_ARGS) {
// Mode command is in the form of "mode <mode> [<timeout>|fixed]"
if (m_args.at(1U) == "idle")
m_command = RCD_MODE_IDLE;
m_command = REMOTE_COMMAND::MODE_IDLE;
else if (m_args.at(1U) == "lockout")
m_command = RCD_MODE_LOCKOUT;
m_command = REMOTE_COMMAND::MODE_LOCKOUT;
else if (m_args.at(1U) == "d-star")
m_command = RCD_MODE_DSTAR;
m_command = REMOTE_COMMAND::MODE_DSTAR;
else if (m_args.at(1U) == "dmr")
m_command = RCD_MODE_DMR;
m_command = REMOTE_COMMAND::MODE_DMR;
else if (m_args.at(1U) == "ysf")
m_command = RCD_MODE_YSF;
m_command = REMOTE_COMMAND::MODE_YSF;
else if (m_args.at(1U) == "p25")
m_command = RCD_MODE_P25;
m_command = REMOTE_COMMAND::MODE_P25;
else if (m_args.at(1U) == "nxdn")
m_command = RCD_MODE_NXDN;
m_command = REMOTE_COMMAND::MODE_NXDN;
else if (m_args.at(1U) == "m17")
m_command = RCD_MODE_M17;
m_command = REMOTE_COMMAND::MODE_M17;
else
replyStr = "KO";
} else if (m_args.at(0U) == "enable" && m_args.size() >= ENABLE_ARGS) {
if (m_args.at(1U) == "dstar")
m_command = RCD_ENABLE_DSTAR;
m_command = REMOTE_COMMAND::ENABLE_DSTAR;
else if (m_args.at(1U) == "dmr")
m_command = RCD_ENABLE_DMR;
m_command = REMOTE_COMMAND::ENABLE_DMR;
else if (m_args.at(1U) == "ysf")
m_command = RCD_ENABLE_YSF;
m_command = REMOTE_COMMAND::ENABLE_YSF;
else if (m_args.at(1U) == "p25")
m_command = RCD_ENABLE_P25;
m_command = REMOTE_COMMAND::ENABLE_P25;
else if (m_args.at(1U) == "nxdn")
m_command = RCD_ENABLE_NXDN;
m_command = REMOTE_COMMAND::ENABLE_NXDN;
else if (m_args.at(1U) == "m17")
m_command = RCD_ENABLE_M17;
m_command = REMOTE_COMMAND::ENABLE_M17;
else if (m_args.at(1U) == "fm")
m_command = RCD_ENABLE_FM;
m_command = REMOTE_COMMAND::ENABLE_FM;
else if (m_args.at(1U) == "ax25")
m_command = RCD_ENABLE_AX25;
m_command = REMOTE_COMMAND::ENABLE_AX25;
else
replyStr = "KO";
} else if (m_args.at(0U) == "disable" && m_args.size() >= DISABLE_ARGS) {
if (m_args.at(1U) == "dstar")
m_command = RCD_DISABLE_DSTAR;
m_command = REMOTE_COMMAND::DISABLE_DSTAR;
else if (m_args.at(1U) == "dmr")
m_command = RCD_DISABLE_DMR;
m_command = REMOTE_COMMAND::DISABLE_DMR;
else if (m_args.at(1U) == "ysf")
m_command = RCD_DISABLE_YSF;
m_command = REMOTE_COMMAND::DISABLE_YSF;
else if (m_args.at(1U) == "p25")
m_command = RCD_DISABLE_P25;
m_command = REMOTE_COMMAND::DISABLE_P25;
else if (m_args.at(1U) == "nxdn")
m_command = RCD_DISABLE_NXDN;
m_command = REMOTE_COMMAND::DISABLE_NXDN;
else if (m_args.at(1U) == "m17")
m_command = RCD_DISABLE_M17;
m_command = REMOTE_COMMAND::DISABLE_M17;
else if (m_args.at(1U) == "fm")
m_command = RCD_DISABLE_FM;
m_command = REMOTE_COMMAND::DISABLE_FM;
else if (m_args.at(1U) == "ax25")
m_command = RCD_DISABLE_AX25;
m_command = REMOTE_COMMAND::DISABLE_AX25;
else
replyStr = "KO";
} else if (m_args.at(0U) == "page" && m_args.size() >= PAGE_ARGS) {
// Page command is in the form of "page <ric> <message>"
m_command = RCD_PAGE;
m_command = REMOTE_COMMAND::PAGE;
} else if (m_args.at(0U) == "page_bcd" && m_args.size() >= PAGE_ARGS) {
// BCD page command is in the form of "page_bcd <ric> <bcd message>"
m_command = RCD_PAGE_BCD;
m_command = REMOTE_COMMAND::PAGE_BCD;
} else if (m_args.at(0U) == "page_a1" && m_args.size() == 2) {
// Alert1 page command is in the form of "page_a1 <ric>"
m_command = RCD_PAGE_A1;
m_command = REMOTE_COMMAND::PAGE_A1;
} else if (m_args.at(0U) == "page_a2" && m_args.size() >= PAGE_ARGS) {
// Alert2 page command is in the form of "page_a2 <ric> <message>"
m_command = RCD_PAGE_A2;
m_command = REMOTE_COMMAND::PAGE_A2;
} else if (m_args.at(0U) == "cw" && m_args.size() >= CW_ARGS) {
// CW command is in the form of "cw <message>"
m_command = RCD_CW;
m_command = REMOTE_COMMAND::CW;
} else if (m_args.at(0U) == "reload") {
// Reload command is in the form of "reload"
m_command = RCD_RELOAD;
m_command = REMOTE_COMMAND::RELOAD;
} else if (m_args.at(0U) == "status") {
if (m_host != NULL) {
m_host->buildNetworkStatusString(replyStr);
@ -169,7 +169,7 @@ REMOTE_COMMAND CRemoteControl::getCommand()
replyStr = "KO";
}
m_command = RCD_CONNECTION_STATUS;
m_command = REMOTE_COMMAND::CONNECTION_STATUS;
} else if (m_args.at(0U) == "hosts") {
if (m_host != NULL) {
m_host->buildNetworkHostsString(replyStr);
@ -177,13 +177,13 @@ REMOTE_COMMAND CRemoteControl::getCommand()
replyStr = "KO";
}
m_command = RCD_CONFIG_HOSTS;
m_command = REMOTE_COMMAND::CONFIG_HOSTS;
} else {
replyStr = "KO";
}
::snprintf(buffer, BUFFER_LENGTH * 2, "%s remote command of \"%s\" received", ((m_command == RCD_NONE) ? "Invalid" : "Valid"), command);
if (m_command == RCD_NONE) {
::snprintf(buffer, BUFFER_LENGTH * 2, "%s remote command of \"%s\" received", ((m_command == REMOTE_COMMAND::NONE) ? "Invalid" : "Valid"), command);
if (m_command == REMOTE_COMMAND::NONE) {
m_args.clear();
LogWarning(buffer);
} else {
@ -201,21 +201,21 @@ REMOTE_COMMAND CRemoteControl::getCommand()
unsigned int CRemoteControl::getArgCount() const
{
switch (m_command) {
case RCD_MODE_IDLE:
case RCD_MODE_LOCKOUT:
case RCD_MODE_DSTAR:
case RCD_MODE_DMR:
case RCD_MODE_YSF:
case RCD_MODE_P25:
case RCD_MODE_NXDN:
case RCD_MODE_M17:
case REMOTE_COMMAND::MODE_IDLE:
case REMOTE_COMMAND::MODE_LOCKOUT:
case REMOTE_COMMAND::MODE_DSTAR:
case REMOTE_COMMAND::MODE_DMR:
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 RCD_PAGE:
case RCD_PAGE_BCD:
case RCD_PAGE_A1:
case RCD_PAGE_A2:
case REMOTE_COMMAND::PAGE:
case REMOTE_COMMAND::PAGE_BCD:
case REMOTE_COMMAND::PAGE_A1:
case REMOTE_COMMAND::PAGE_A2:
return (unsigned int)m_args.size() - 1U;
case RCD_CW:
case REMOTE_COMMAND::CW:
return (unsigned int)m_args.size() - 1U;
default:
return 0U;
@ -225,23 +225,23 @@ unsigned int CRemoteControl::getArgCount() const
std::string CRemoteControl::getArgString(unsigned int n) const
{
switch (m_command) {
case RCD_MODE_IDLE:
case RCD_MODE_LOCKOUT:
case RCD_MODE_DSTAR:
case RCD_MODE_DMR:
case RCD_MODE_YSF:
case RCD_MODE_P25:
case RCD_MODE_NXDN:
case RCD_MODE_M17:
case REMOTE_COMMAND::MODE_IDLE:
case REMOTE_COMMAND::MODE_LOCKOUT:
case REMOTE_COMMAND::MODE_DSTAR:
case REMOTE_COMMAND::MODE_DMR:
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 RCD_PAGE:
case RCD_PAGE_BCD:
case RCD_PAGE_A1:
case RCD_PAGE_A2:
case REMOTE_COMMAND::PAGE:
case REMOTE_COMMAND::PAGE_BCD:
case REMOTE_COMMAND::PAGE_A1:
case REMOTE_COMMAND::PAGE_A2:
n += 1U;
break;
case RCD_CW:
case REMOTE_COMMAND::CW:
n += 1U;
break;
default:

View file

@ -1,5 +1,5 @@
/*
* Copyright (C) 2019,2020,2021,2024 by Jonathan Naylor G4KLX
* Copyright (C) 2019,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
@ -26,41 +26,41 @@
class CMMDVMHost;
enum REMOTE_COMMAND {
RCD_NONE,
RCD_MODE_IDLE,
RCD_MODE_LOCKOUT,
RCD_MODE_DSTAR,
RCD_MODE_DMR,
RCD_MODE_YSF,
RCD_MODE_P25,
RCD_MODE_NXDN,
RCD_MODE_M17,
RCD_MODE_FM,
RCD_ENABLE_DSTAR,
RCD_ENABLE_DMR,
RCD_ENABLE_YSF,
RCD_ENABLE_P25,
RCD_ENABLE_NXDN,
RCD_ENABLE_M17,
RCD_ENABLE_FM,
RCD_ENABLE_AX25,
RCD_DISABLE_DSTAR,
RCD_DISABLE_DMR,
RCD_DISABLE_YSF,
RCD_DISABLE_P25,
RCD_DISABLE_NXDN,
RCD_DISABLE_M17,
RCD_DISABLE_FM,
RCD_DISABLE_AX25,
RCD_PAGE,
RCD_PAGE_BCD,
RCD_PAGE_A1,
RCD_PAGE_A2,
RCD_CW,
RCD_RELOAD,
RCD_CONNECTION_STATUS,
RCD_CONFIG_HOSTS
enum class REMOTE_COMMAND {
NONE,
MODE_IDLE,
MODE_LOCKOUT,
MODE_DSTAR,
MODE_DMR,
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,
DISABLE_DMR,
DISABLE_YSF,
DISABLE_P25,
DISABLE_NXDN,
DISABLE_M17,
DISABLE_FM,
DISABLE_AX25,
PAGE,
PAGE_BCD,
PAGE_A1,
PAGE_A2,
CW,
RELOAD,
CONNECTION_STATUS,
CONFIG_HOSTS
};
class CRemoteControl {

View file

@ -1,6 +1,6 @@
/*
* Copyright (C) 2005, 2006, 2008, 2009 Free Software Foundation, Inc.
* Copyright (C) 2011,2015,2016 by Jonathan Naylor G4KLX
* Copyright (C) 2005,2006,2008,2009 Free Software Foundation, Inc.
* Copyright (C) 2011,2015,2016,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
@ -22,9 +22,7 @@
#include <cstdint>
enum {
SHA256_DIGEST_SIZE = 256 / 8
};
const unsigned int SHA256_DIGEST_SIZE = 256U / 8U;
class CSHA256 {
public:

View file

@ -1,6 +1,6 @@
/*
* Copyright (C) 2019 by SASANO Takayoshi JG1UAA
* Copyright (C) 2015,2016,2018,2019,2020 by Jonathan Naylor G4KLX
* Copyright (C) 2015,2016,2018,2019,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
@ -56,18 +56,28 @@ static const struct layoutdef Layout[] = {
#define Y_WIDTH Layout[m_screenLayout].y_width
#define ROTATION Layout[m_screenLayout].rotation
enum LcdColour {
COLOUR_BLACK, COLOUR_RED, COLOUR_GREEN, COLOUR_BLUE,
COLOUR_YELLOW, COLOUR_CYAN, COLOUR_MAGENTA, COLOUR_GREY,
COLOUR_DARK_GREY, COLOUR_DARK_RED, COLOUR_DARK_GREEN, COLOUR_DARK_BLUE,
COLOUR_DARK_YELLOW, COLOUR_DARK_CYAN, COLOUR_DARK_MAGENTA, COLOUR_WHITE
};
#define COLOUR_BLACK 0
#define COLOUR_RED 1
#define COLOUR_GREEN 2
#define COLOUR_BLUE 3
#define COLOUR_YELLOW 4
#define COLOUR_CYAN 5
#define COLOUR_MAGENTA 6
#define COLOUR_GREY 7
#define COLOUR_DARK_GREY 8
#define COLOUR_DARK_RED 9
#define COLOUR_DARK_GREEN 10
#define COLOUR_DARK_BLUE 11
#define COLOUR_DARK_YELLOW 12
#define COLOUR_DARK_CYAN 13
#define COLOUR_DARK_MAGENTA 14
#define COLOUR_WHITE 15
#define INFO_COLOUR COLOUR_CYAN
#define EXT_COLOUR COLOUR_DARK_GREEN
#define BG_COLOUR COLOUR_BLACK
#define ERROR_COLOUR COLOUR_DARK_RED
#define MODE_COLOUR COLOUR_YELLOW
#define INFO_COLOUR COLOUR_CYAN
#define EXT_COLOUR COLOUR_DARK_GREEN
#define BG_COLOUR COLOUR_BLACK
#define ERROR_COLOUR COLOUR_DARK_RED
#define MODE_COLOUR COLOUR_YELLOW
// MODE_FONT_SIZE should be equal or larger than STATUS_FONT_SIZE
#define MODE_FONT_SIZE Layout[m_screenLayout].mode_font_size
@ -107,6 +117,7 @@ m_duplex(duplex),
m_refresh(false),
m_refreshTimer(1000U, 0U, REFRESH_PERIOD),
m_lineBuf(NULL),
m_temp(),
m_screenLayout(screenLayout)
{
assert(serial != NULL);
@ -127,12 +138,6 @@ bool CTFTSurenoo::open()
}
m_lineBuf = new char[statusLineOffset(STATUS_LINES)];
if (m_lineBuf == NULL) {
LogError("Cannot allocate line buffer");
m_serial->close();
delete m_serial;
return false;
}
lcdReset();
clearScreen(BG_COLOUR);
@ -477,7 +482,7 @@ void CTFTSurenoo::refreshDisplay(void)
// clear display
::snprintf(m_temp, sizeof(m_temp), "BOXF(%d,%d,%d,%d,%d);",
0, 0, X_WIDTH - 1, Y_WIDTH - 1, BG_COLOUR);
m_serial->write((unsigned char*)m_temp, ::strlen(m_temp));
m_serial->write((unsigned char*)m_temp, (unsigned int)::strlen(m_temp));
// mode line
::snprintf(m_temp, sizeof(m_temp), "DCV%d(%d,%d,'%s',%d);",

View file

@ -1,5 +1,5 @@
/*
* Copyright (C) 2006-2016,2020,2024 by Jonathan Naylor G4KLX
* Copyright (C) 2006-2016,2020,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
@ -119,7 +119,7 @@ bool CUDPSocket::match(const sockaddr_storage& addr1, const sockaddr_storage& ad
if (addr1.ss_family != addr2.ss_family)
return false;
if (type == IMT_ADDRESS_AND_PORT) {
if (type == IPMATCHTYPE::IMT_ADDREAND_PORT) {
switch (addr1.ss_family) {
case AF_INET:
struct sockaddr_in *in_1, *in_2;
@ -134,7 +134,7 @@ bool CUDPSocket::match(const sockaddr_storage& addr1, const sockaddr_storage& ad
default:
return false;
}
} else if (type == IMT_ADDRESS_ONLY) {
} else if (type == IPMATCHTYPE::IMT_ADDREONLY) {
switch (addr1.ss_family) {
case AF_INET:
struct sockaddr_in *in_1, *in_2;

View file

@ -1,5 +1,5 @@
/*
* Copyright (C) 2009-2011,2013,2015,2016,2020,2024 by Jonathan Naylor G4KLX
* Copyright (C) 2009-2011,2013,2015,2016,2020,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
@ -36,9 +36,9 @@
#include <Winsock2.h>
#endif
enum IPMATCHTYPE {
IMT_ADDRESS_AND_PORT,
IMT_ADDRESS_ONLY
enum class IPMATCHTYPE {
IMT_ADDREAND_PORT,
IMT_ADDREONLY
};
class CUDPSocket {
@ -61,7 +61,7 @@ public:
static int lookup(const std::string& hostName, unsigned short port, sockaddr_storage& address, unsigned int& addressLength);
static int lookup(const std::string& hostName, unsigned short port, sockaddr_storage& address, unsigned int& addressLength, struct addrinfo& hints);
static bool match(const sockaddr_storage& addr1, const sockaddr_storage& addr2, IPMATCHTYPE type = IMT_ADDRESS_AND_PORT);
static bool match(const sockaddr_storage& addr1, const sockaddr_storage& addr2, IPMATCHTYPE type = IPMATCHTYPE::IMT_ADDREAND_PORT);
static bool isNone(const sockaddr_storage& addr);

View file

@ -19,6 +19,6 @@
#if !defined(VERSION_H)
#define VERSION_H
const char* VERSION = "20250312";
const char* VERSION = "20250313";
#endif

View file

@ -1,5 +1,5 @@
/*
* Copyright (C) 2015-2021 Jonathan Naylor, G4KLX
* Copyright (C) 2015-2021,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
@ -33,8 +33,8 @@ m_duplex(duplex),
m_lowDeviation(lowDeviation),
m_remoteGateway(remoteGateway),
m_queue(5000U, "YSF Control"),
m_rfState(RS_RF_LISTENING),
m_netState(RS_NET_IDLE),
m_rfState(RPT_RF_STATE::LISTENING),
m_netState(RPT_NET_STATE::IDLE),
m_rfTimeoutTimer(1000U, timeout),
m_netTimeoutTimer(1000U, timeout),
m_packetTimer(1000U, 0U, 200U),
@ -107,7 +107,7 @@ bool CYSFControl::writeModem(unsigned char *data, unsigned int len)
unsigned char type = data[0U];
if (type == TAG_LOST && m_rfState == RS_RF_AUDIO) {
if ((type == TAG_LOST) && (m_rfState == RPT_RF_STATE::AUDIO)) {
if (m_rssi != 0U)
LogMessage("YSF, transmission lost from %10.10s to %10.10s, %.1f seconds, BER: %.1f%%, RSSI: -%u/-%u/-%u dBm", m_rfSource, m_rfDest, float(m_rfFrames) / 10.0F, float(m_rfErrs * 100U) / float(m_rfBits), m_minRSSI, m_maxRSSI, m_aveRSSI / m_rssiCount);
else
@ -116,17 +116,17 @@ bool CYSFControl::writeModem(unsigned char *data, unsigned int len)
return false;
}
if (type == TAG_LOST && m_rfState == RS_RF_REJECTED) {
if ((type == TAG_LOST) && (m_rfState == RPT_RF_STATE::REJECTED)) {
m_rfPayload.reset();
m_rfSource = NULL;
m_rfDest = NULL;
m_rfState = RS_RF_LISTENING;
m_rfState = RPT_RF_STATE::LISTENING;
return false;
}
if (type == TAG_LOST) {
m_rfPayload.reset();
m_rfState = RS_RF_LISTENING;
m_rfState = RPT_RF_STATE::LISTENING;
return false;
}
@ -221,7 +221,7 @@ bool CYSFControl::processVWData(bool valid, unsigned char *data)
unsigned char dgid = m_lastFICH.getDGId();
if (valid && fi == YSF_FI_HEADER) {
if (m_rfState == RS_RF_LISTENING) {
if (m_rfState == RPT_RF_STATE::LISTENING) {
bool valid = m_rfPayload.processHeaderData(data + 2U);
if (!valid)
return false;
@ -232,7 +232,7 @@ bool CYSFControl::processVWData(bool valid, unsigned char *data)
bool ret = checkCallsign(m_rfSource);
if (!ret) {
LogMessage("YSF, invalid access attempt from %10.10s to DG-ID %u", m_rfSource, dgid);
m_rfState = RS_RF_REJECTED;
m_rfState = RPT_RF_STATE::REJECTED;
return true;
}
}
@ -247,7 +247,7 @@ bool CYSFControl::processVWData(bool valid, unsigned char *data)
m_rfErrs = 0U;
m_rfBits = 1U;
m_rfTimeoutTimer.start();
m_rfState = RS_RF_AUDIO;
m_rfState = RPT_RF_STATE::AUDIO;
m_minRSSI = m_rssi;
m_maxRSSI = m_rssi;
@ -286,13 +286,13 @@ bool CYSFControl::processVWData(bool valid, unsigned char *data)
return true;
}
} else if (valid && fi == YSF_FI_TERMINATOR) {
if (m_rfState == RS_RF_REJECTED) {
} else if (valid && (fi == YSF_FI_TERMINATOR)) {
if (m_rfState == RPT_RF_STATE::REJECTED) {
m_rfPayload.reset();
m_rfSource = NULL;
m_rfDest = NULL;
m_rfState = RS_RF_LISTENING;
} else if (m_rfState == RS_RF_AUDIO) {
m_rfState = RPT_RF_STATE::LISTENING;
} else if (m_rfState == RPT_RF_STATE::AUDIO) {
m_rfPayload.processHeaderData(data + 2U);
CSync::addYSFSync(data + 2U);
@ -325,7 +325,7 @@ bool CYSFControl::processVWData(bool valid, unsigned char *data)
writeEndRF();
}
} else {
if (m_rfState == RS_RF_AUDIO) {
if (m_rfState == RPT_RF_STATE::AUDIO) {
// If valid is false, update the m_lastFICH for this transmission
if (!valid) {
// XXX Check these values
@ -390,7 +390,7 @@ bool CYSFControl::processDNData(bool valid, unsigned char *data)
unsigned char dgid = m_lastFICH.getDGId();
if (valid && fi == YSF_FI_HEADER) {
if (m_rfState == RS_RF_LISTENING) {
if (m_rfState == RPT_RF_STATE::LISTENING) {
bool valid = m_rfPayload.processHeaderData(data + 2U);
if (!valid)
return false;
@ -401,7 +401,7 @@ bool CYSFControl::processDNData(bool valid, unsigned char *data)
bool ret = checkCallsign(m_rfSource);
if (!ret) {
LogMessage("YSF, invalid access attempt from %10.10s to DG-ID %u", m_rfSource, dgid);
m_rfState = RS_RF_REJECTED;
m_rfState = RPT_RF_STATE::REJECTED;
return true;
}
}
@ -416,7 +416,7 @@ bool CYSFControl::processDNData(bool valid, unsigned char *data)
m_rfErrs = 0U;
m_rfBits = 1U;
m_rfTimeoutTimer.start();
m_rfState = RS_RF_AUDIO;
m_rfState = RPT_RF_STATE::AUDIO;
m_minRSSI = m_rssi;
m_maxRSSI = m_rssi;
@ -455,13 +455,13 @@ bool CYSFControl::processDNData(bool valid, unsigned char *data)
return true;
}
} else if (valid && fi == YSF_FI_TERMINATOR) {
if (m_rfState == RS_RF_REJECTED) {
} else if (valid && (fi == YSF_FI_TERMINATOR)) {
if (m_rfState == RPT_RF_STATE::REJECTED) {
m_rfPayload.reset();
m_rfSource = NULL;
m_rfDest = NULL;
m_rfState = RS_RF_LISTENING;
} else if (m_rfState == RS_RF_AUDIO) {
m_rfState = RPT_RF_STATE::LISTENING;
} else if (m_rfState == RPT_RF_STATE::AUDIO) {
m_rfPayload.processHeaderData(data + 2U);
CSync::addYSFSync(data + 2U);
@ -494,7 +494,7 @@ bool CYSFControl::processDNData(bool valid, unsigned char *data)
writeEndRF();
}
} else {
if (m_rfState == RS_RF_AUDIO) {
if (m_rfState == RPT_RF_STATE::AUDIO) {
// If valid is false, update the m_lastFICH for this transmission
if (!valid) {
unsigned char ft = m_lastFICH.getFT();
@ -560,7 +560,7 @@ bool CYSFControl::processDNData(bool valid, unsigned char *data)
m_display->writeFusionRSSI(m_rssi);
return true;
} else if (valid && m_rfState == RS_RF_LISTENING) {
} else if (valid && (m_rfState == RPT_RF_STATE::LISTENING)) {
// Only use clean frames for late entry.
unsigned char fn = m_lastFICH.getFN();
unsigned char dt = m_lastFICH.getDT();
@ -597,7 +597,7 @@ bool CYSFControl::processDNData(bool valid, unsigned char *data)
bool ret = checkCallsign(m_rfSource);
if (!ret) {
LogMessage("YSF, invalid access attempt from %10.10s to DG-ID %u", m_rfSource, dgid);
m_rfState = RS_RF_REJECTED;
m_rfState = RPT_RF_STATE::REJECTED;
return true;
}
}
@ -606,7 +606,7 @@ bool CYSFControl::processDNData(bool valid, unsigned char *data)
m_rfErrs = 0U;
m_rfBits = 1U;
m_rfTimeoutTimer.start();
m_rfState = RS_RF_AUDIO;
m_rfState = RPT_RF_STATE::AUDIO;
m_minRSSI = m_rssi;
m_maxRSSI = m_rssi;
@ -692,7 +692,7 @@ bool CYSFControl::processFRData(bool valid, unsigned char *data)
unsigned char dgid = m_lastFICH.getDGId();
if (valid && fi == YSF_FI_HEADER) {
if (m_rfState == RS_RF_LISTENING) {
if (m_rfState == RPT_RF_STATE::LISTENING) {
valid = m_rfPayload.processHeaderData(data + 2U);
if (!valid)
return false;
@ -703,7 +703,7 @@ bool CYSFControl::processFRData(bool valid, unsigned char *data)
bool ret = checkCallsign(m_rfSource);
if (!ret) {
LogMessage("YSF, invalid access attempt from %10.10s to DG-ID %u", m_rfSource, dgid);
m_rfState = RS_RF_REJECTED;
m_rfState = RPT_RF_STATE::REJECTED;
return true;
}
}
@ -715,7 +715,7 @@ bool CYSFControl::processFRData(bool valid, unsigned char *data)
m_rfDest = m_rfPayload.getDest();
m_rfFrames = 0U;
m_rfState = RS_RF_DATA;
m_rfState = RPT_RF_STATE::DATA;
m_minRSSI = m_rssi;
m_maxRSSI = m_rssi;
@ -754,12 +754,12 @@ bool CYSFControl::processFRData(bool valid, unsigned char *data)
return true;
}
} else if (valid && fi == YSF_FI_TERMINATOR) {
if (m_rfState == RS_RF_REJECTED) {
if (m_rfState == RPT_RF_STATE::REJECTED) {
m_rfPayload.reset();
m_rfSource = NULL;
m_rfDest = NULL;
m_rfState = RS_RF_LISTENING;
} else if (m_rfState == RS_RF_DATA) {
m_rfState = RPT_RF_STATE::LISTENING;
} else if (m_rfState == RPT_RF_STATE::DATA) {
m_rfPayload.processHeaderData(data + 2U);
CSync::addYSFSync(data + 2U);
@ -792,7 +792,7 @@ bool CYSFControl::processFRData(bool valid, unsigned char *data)
writeEndRF();
}
} else {
if (m_rfState == RS_RF_DATA) {
if (m_rfState == RPT_RF_STATE::DATA) {
// If valid is false, update the m_lastFICH for this transmission
if (!valid) {
unsigned char ft = m_lastFICH.getFT();
@ -857,7 +857,7 @@ unsigned int CYSFControl::readModem(unsigned char* data)
void CYSFControl::writeEndRF()
{
m_rfState = RS_RF_LISTENING;
m_rfState = RPT_RF_STATE::LISTENING;
m_rfTimeoutTimer.stop();
m_rfPayload.reset();
@ -866,7 +866,7 @@ void CYSFControl::writeEndRF()
m_rfSource = NULL;
m_rfDest = NULL;
if (m_netState == RS_NET_IDLE) {
if (m_netState == RPT_NET_STATE::IDLE) {
m_display->clearFusion();
if (m_network != NULL)
@ -880,7 +880,7 @@ void CYSFControl::writeEndRF()
void CYSFControl::writeEndNet()
{
m_netState = RS_NET_IDLE;
m_netState = RPT_NET_STATE::IDLE;
m_netTimeoutTimer.stop();
m_networkWatchdog.stop();
@ -904,7 +904,7 @@ void CYSFControl::writeNetwork()
if (!m_enabled)
return;
if (m_rfState != RS_RF_LISTENING && m_netState == RS_NET_IDLE)
if ((m_rfState != RPT_RF_STATE::LISTENING) && (m_netState == RPT_NET_STATE::IDLE))
return;
m_networkWatchdog.start();
@ -937,7 +937,7 @@ void CYSFControl::writeNetwork()
m_netPayload.reset();
m_packetTimer.start();
m_elapsed.start();
m_netState = RS_NET_AUDIO;
m_netState = RPT_NET_STATE::AUDIO;
m_netFrames = 0U;
m_netLost = 0U;
m_netErrs = 0U;
@ -1060,7 +1060,7 @@ void CYSFControl::clock(unsigned int ms)
m_rfTimeoutTimer.clock(ms);
m_netTimeoutTimer.clock(ms);
if (m_netState == RS_NET_AUDIO) {
if (m_netState == RPT_NET_STATE::AUDIO) {
m_networkWatchdog.clock(ms);
if (m_networkWatchdog.hasExpired()) {
@ -1074,7 +1074,7 @@ void CYSFControl::writeQueueRF(const unsigned char *data)
{
assert(data != NULL);
if (m_netState != RS_NET_IDLE)
if (m_netState != RPT_NET_STATE::IDLE)
return;
if (m_rfTimeoutTimer.isRunning() && m_rfTimeoutTimer.hasExpired())
@ -1197,7 +1197,7 @@ void CYSFControl::processNetCallsigns(const unsigned char* data, unsigned char d
bool CYSFControl::isBusy() const
{
return m_rfState != RS_RF_LISTENING || m_netState != RS_NET_IDLE;
return (m_rfState != RPT_RF_STATE::LISTENING) || (m_netState != RPT_NET_STATE::IDLE);
}
void CYSFControl::enable(bool enabled)
@ -1206,7 +1206,7 @@ void CYSFControl::enable(bool enabled)
m_queue.clear();
// Reset the RF section
m_rfState = RS_RF_LISTENING;
m_rfState = RPT_RF_STATE::LISTENING;
m_rfTimeoutTimer.stop();
m_rfPayload.reset();
@ -1216,7 +1216,7 @@ void CYSFControl::enable(bool enabled)
m_rfDest = NULL;
// Reset the networking section
m_netState = RS_NET_IDLE;
m_netState = RPT_NET_STATE::IDLE;
m_netTimeoutTimer.stop();
m_networkWatchdog.stop();