diff --git a/AMBEFEC.cpp b/AMBEFEC.cpp index 31d368f..62e81aa 100644 --- a/AMBEFEC.cpp +++ b/AMBEFEC.cpp @@ -481,7 +481,7 @@ CAMBEFEC::~CAMBEFEC() #if defined(USE_DMR) || defined(USE_YSF) || defined(USE_NXDN) unsigned int CAMBEFEC::regenerateDMR(unsigned char* bytes) const { - assert(bytes != NULL); + assert(bytes != nullptr); unsigned int a1 = 0U, a2 = 0U, a3 = 0U; unsigned int MASK = 0x800000U; @@ -584,7 +584,7 @@ unsigned int CAMBEFEC::regenerateDMR(unsigned char* bytes) const #if defined(USE_DSTAR) unsigned int CAMBEFEC::regenerateDStar(unsigned char* bytes) const { - assert(bytes != NULL); + assert(bytes != nullptr); unsigned int a = 0U; unsigned int b = 0U; @@ -618,7 +618,7 @@ unsigned int CAMBEFEC::regenerateDStar(unsigned char* bytes) const #if defined(USE_YSF) || defined(USE_NXDN) unsigned int CAMBEFEC::regenerateYSFDN(unsigned char* bytes) const { - assert(bytes != NULL); + assert(bytes != nullptr); unsigned int a = 0U; unsigned int MASK = 0x800000U; @@ -671,7 +671,7 @@ unsigned int CAMBEFEC::regenerateYSFDN(unsigned char* bytes) const #if defined(USE_YSF) || defined(USE_P25) unsigned int CAMBEFEC::regenerateIMBE(unsigned char* bytes) const { - assert(bytes != NULL); + assert(bytes != nullptr); bool orig[144U]; bool temp[144U]; diff --git a/AX25Control.cpp b/AX25Control.cpp index cdd1b27..c9fd750 100644 --- a/AX25Control.cpp +++ b/AX25Control.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2020,2023 Jonathan Naylor, G4KLX + * Copyright (C) 2020,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 @@ -16,21 +16,19 @@ #include "Utils.h" #include "Log.h" -#if defined(USE_AX25) - #include #include #include #include -#include +// #define DUMP_AX25 const unsigned char BIT_MASK_TABLE[] = { 0x80U, 0x40U, 0x20U, 0x10U, 0x08U, 0x04U, 0x02U, 0x01U }; #define WRITE_BIT1(p,i,b) p[(i)>>3] = (b) ? (p[(i)>>3] | BIT_MASK_TABLE[(i)&7]) : (p[(i)>>3] & ~BIT_MASK_TABLE[(i)&7]) #define READ_BIT1(p,i) (p[(i)>>3] & BIT_MASK_TABLE[(i)&7]) -CAX25Control::CAX25Control(CAX25Network* network, bool trace, CRSSIInterpolator* rssiMapper) : +CAX25Control::CAX25Control(CAX25Network* network, bool trace) : m_network(network), m_trace(trace), m_rssiMapper(rssiMapper), @@ -45,7 +43,7 @@ CAX25Control::~CAX25Control() bool CAX25Control::writeModem(unsigned char *data, unsigned int len) { - assert(data != NULL); + assert(data != nullptr); if (!m_enabled) return false; @@ -73,18 +71,18 @@ bool CAX25Control::writeModem(unsigned char *data, unsigned int len) CUtils::dump(1U, "AX.25 received packet", data, len); - if (m_network == NULL) - return true; + if (m_network == nullptr) + return true; return m_network->write(data + offset, len - offset); } unsigned int CAX25Control::readModem(unsigned char* data) { - assert(data != NULL); + assert(data != nullptr); - if (m_network == NULL) - return 0U; + if (m_network == nullptr) + return 0U; if (!m_enabled) return 0U; @@ -106,8 +104,8 @@ void CAX25Control::enable(bool enabled) void CAX25Control::decode(const unsigned char* data, unsigned int length) { - assert(data != NULL); - assert(length >= 15U); + assert(data != nullptr); + assert(length >= 15U); std::string text; @@ -348,7 +346,7 @@ void CAX25Control::decodeJSON(const char* source, const unsigned char* data, uns bool CAX25Control::decodeAddress(const unsigned char* data, std::string& text, bool isDigi) const { - assert(data != NULL); + assert(data != nullptr); for (unsigned int i = 0U; i < 6U; i++) { char c = data[i] >> 1; diff --git a/AX25Network.cpp b/AX25Network.cpp index 9137f75..613d05f 100644 --- a/AX25Network.cpp +++ b/AX25Network.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2020,2023 by Jonathan Naylor G4KLX + * Copyright (C) 2020,2023,2025 by Jonathan Naylor G4KLX * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/BCH.cpp b/BCH.cpp index f8d2360..6bb8beb 100644 --- a/BCH.cpp +++ b/BCH.cpp @@ -125,7 +125,7 @@ void CBCH::encode(const int* data, int* bb) void CBCH::encode(unsigned char* nid) { - assert(nid != NULL); + assert(nid != nullptr); int data[16]; for (int i = 0; i < 16; i++) diff --git a/BPTC19696.cpp b/BPTC19696.cpp index aa18fe9..667fc0a 100644 --- a/BPTC19696.cpp +++ b/BPTC19696.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2012 by Ian Wraith - * Copyright (C) 2015,2023 by Jonathan Naylor G4KLX + * Copyright (C) 2012 by Ian Wraith + * 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 @@ -29,8 +29,8 @@ #include CBPTC19696::CBPTC19696() : -m_rawData(NULL), -m_deInterData(NULL) +m_rawData(nullptr), +m_deInterData(nullptr) { m_rawData = new bool[196]; m_deInterData = new bool[196]; @@ -45,8 +45,8 @@ CBPTC19696::~CBPTC19696() // The main decode function void CBPTC19696::decode(const unsigned char* in, unsigned char* out) { - assert(in != NULL); - assert(out != NULL); + assert(in != nullptr); + assert(out != nullptr); // Get the raw binary decodeExtractBinary(in); @@ -64,8 +64,8 @@ void CBPTC19696::decode(const unsigned char* in, unsigned char* out) // The main encode function void CBPTC19696::encode(const unsigned char* in, unsigned char* out) { - assert(in != NULL); - assert(out != NULL); + assert(in != nullptr); + assert(out != nullptr); // Extract Data encodeExtractData(in); diff --git a/CRC.cpp b/CRC.cpp index 37a7b95..fce82ac 100644 --- a/CRC.cpp +++ b/CRC.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2015,2016,2023 by Jonathan Naylor G4KLX + * Copyright (C) 2015,2016,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 @@ -127,7 +127,7 @@ const uint16_t CCITT16_TABLE2[] = { #if defined(USE_DMR) bool CCRC::checkFiveBit(bool* in, unsigned int tcrc) { - assert(in != NULL); + assert(in != nullptr); unsigned int crc; encodeFiveBit(in, crc); @@ -137,7 +137,7 @@ bool CCRC::checkFiveBit(bool* in, unsigned int tcrc) void CCRC::encodeFiveBit(const bool* in, unsigned int& tcrc) { - assert(in != NULL); + assert(in != nullptr); unsigned short total = 0U; for (unsigned int i = 0U; i < 72U; i += 8U) { @@ -155,7 +155,7 @@ void CCRC::encodeFiveBit(const bool* in, unsigned int& tcrc) #if defined(USE_DMR) || defined(USE_YSF) || defined(USE_P25) void CCRC::addCCITT162(unsigned char *in, unsigned int length) { - assert(in != NULL); + assert(in != nullptr); assert(length > 2U); union { @@ -176,7 +176,7 @@ void CCRC::addCCITT162(unsigned char *in, unsigned int length) bool CCRC::checkCCITT162(const unsigned char *in, unsigned int length) { - assert(in != NULL); + assert(in != nullptr); assert(length > 2U); union { @@ -198,7 +198,7 @@ bool CCRC::checkCCITT162(const unsigned char *in, unsigned int length) #if defined(USE_DSTAR) void CCRC::addCCITT161(unsigned char *in, unsigned int length) { - assert(in != NULL); + assert(in != nullptr); assert(length > 2U); union { @@ -219,7 +219,7 @@ void CCRC::addCCITT161(unsigned char *in, unsigned int length) bool CCRC::checkCCITT161(const unsigned char *in, unsigned int length) { - assert(in != NULL); + assert(in != nullptr); assert(length > 2U); union { @@ -241,7 +241,7 @@ bool CCRC::checkCCITT161(const unsigned char *in, unsigned int length) #if defined(USE_DMR) unsigned char CCRC::crc8(const unsigned char *in, unsigned int length) { - assert(in != NULL); + assert(in != nullptr); uint8_t crc = 0U; diff --git a/Conf.cpp b/Conf.cpp index ebf2876..2d74831 100644 --- a/Conf.cpp +++ b/Conf.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2015-2024 by Jonathan Naylor G4KLX + * Copyright (C) 2015-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 @@ -185,14 +185,14 @@ 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), #endif m_dstarModeHang(10U), #if defined(USE_DMR) m_dmrEnabled(false), -m_dmrBeacons(DMR_BEACONS_OFF), +m_dmrBeacons(DMR_BEACONS::OFF), m_dmrBeaconInterval(60U), m_dmrBeaconDuration(3U), #endif @@ -416,23 +416,23 @@ CConf::~CConf() bool CConf::read() { FILE* fp = ::fopen(m_file.c_str(), "rt"); - if (fp == NULL) { + if (fp == nullptr) { ::fprintf(stderr, "Couldn't open the .ini file - %s\n", m_file.c_str()); return false; } - SECTION section = SECTION_NONE; + SECTION section = SECTION::NONE; char buffer[BUFFER_SIZE]; - while (::fgets(buffer, BUFFER_SIZE, fp) != NULL) { + while (::fgets(buffer, BUFFER_SIZE, fp) != nullptr) { if (buffer[0U] == '#') continue; 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; else if (::strncmp(buffer, "[MQTT]", 6U) == 0) @@ -448,7 +448,7 @@ bool CConf::read() section = SECTION_NXDNID_LOOKUP; #endif else if (::strncmp(buffer, "[Modem]", 7U) == 0) - section = SECTION_MODEM; + section = SECTION::MODEM; else if (::strncmp(buffer, "[Transparent Data]", 18U) == 0) section = SECTION_TRANSPARENT; #if defined(USE_DSTAR) @@ -524,21 +524,21 @@ bool CConf::read() section = SECTION_AX25_NETWORK; #endif 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; } char* key = ::strtok(buffer, " \t=\r\n"); - if (key == NULL) + if (key == nullptr) continue; - char* value = ::strtok(NULL, "\r\n"); - if (value == NULL) + char* value = ::strtok(nullptr, "\r\n"); + if (value == nullptr) continue; // Remove quotes from the value @@ -550,7 +550,7 @@ bool CConf::read() char *p; // if value is not quoted, remove after # (to make comment) - if ((p = strchr(value, '#')) != NULL) + if ((p = strchr(value, '#')) != nullptr) *p = '\0'; // remove trailing tab/space @@ -558,7 +558,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++) @@ -579,7 +579,7 @@ bool CConf::read() m_dstarNetworkModeHang = m_dmrNetworkModeHang = m_fusionNetworkModeHang = m_p25NetworkModeHang = m_nxdnNetworkModeHang = m_m17NetworkModeHang = m_fmNetworkModeHang = (unsigned int)::atoi(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) @@ -653,7 +653,7 @@ bool CConf::read() else if (::strcmp(key, "I2CPort") == 0) m_modemI2CPort = value; else if (::strcmp(key, "I2CAddress") == 0) - m_modemI2CAddress = (unsigned int)::strtoul(value, NULL, 16); + m_modemI2CAddress = (unsigned int)::strtoul(value, nullptr, 16); else if (::strcmp(key, "ModemAddress") == 0) m_modemModemAddress = value; else if (::strcmp(key, "ModemPort") == 0) @@ -734,7 +734,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) @@ -758,7 +758,7 @@ bool CConf::read() m_dstarSelfOnly = ::atoi(value) == 1; else if (::strcmp(key, "BlackList") == 0) { char* p = ::strtok(value, ",\r\n"); - while (p != NULL) { + while (p != nullptr) { if (::strlen(p) > 0U) { for (unsigned int i = 0U; p[i] != 0; i++) p[i] = ::toupper(p[i]); @@ -766,11 +766,11 @@ bool CConf::read() callsign.resize(DSTAR_LONG_CALLSIGN_LENGTH, ' '); m_dstarBlackList.push_back(callsign); } - p = ::strtok(NULL, ",\r\n"); + p = ::strtok(nullptr, ",\r\n"); } } else if (::strcmp(key, "WhiteList") == 0) { char* p = ::strtok(value, ",\r\n"); - while (p != NULL) { + while (p != nullptr) { if (::strlen(p) > 0U) { for (unsigned int i = 0U; p[i] != 0; i++) p[i] = ::toupper(p[i]); @@ -778,31 +778,32 @@ bool CConf::read() callsign.resize(DSTAR_LONG_CALLSIGN_LENGTH, ' '); m_dstarWhiteList.push_back(callsign); } - p = ::strtok(NULL, ",\r\n"); + p = ::strtok(nullptr, ",\r\n"); } } else if (::strcmp(key, "AckReply") == 0) m_dstarAckReply = ::atoi(value) == 1; 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) { #endif #if defined(USE_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); @@ -818,43 +819,43 @@ bool CConf::read() m_dmrDumpTAData = ::atoi(value) == 1; else if (::strcmp(key, "Prefixes") == 0) { char* p = ::strtok(value, ",\r\n"); - while (p != NULL) { + while (p != nullptr) { unsigned int prefix = (unsigned int)::atoi(p); if (prefix > 0U && prefix <= 999U) m_dmrPrefixes.push_back(prefix); - p = ::strtok(NULL, ",\r\n"); + p = ::strtok(nullptr, ",\r\n"); } } else if (::strcmp(key, "BlackList") == 0) { char* p = ::strtok(value, ",\r\n"); - while (p != NULL) { + while (p != nullptr) { unsigned int id = (unsigned int)::atoi(p); if (id > 0U) m_dmrBlackList.push_back(id); - p = ::strtok(NULL, ",\r\n"); + p = ::strtok(nullptr, ",\r\n"); } } else if (::strcmp(key, "WhiteList") == 0) { char* p = ::strtok(value, ",\r\n"); - while (p != NULL) { + while (p != nullptr) { unsigned int id = (unsigned int)::atoi(p); if (id > 0U) m_dmrWhiteList.push_back(id); - p = ::strtok(NULL, ",\r\n"); + p = ::strtok(nullptr, ",\r\n"); } } else if (::strcmp(key, "Slot1TGWhiteList") == 0) { char* p = ::strtok(value, ",\r\n"); - while (p != NULL) { + while (p != nullptr) { unsigned int id = (unsigned int)::atoi(p); if (id > 0U) m_dmrSlot1TGWhiteList.push_back(id); - p = ::strtok(NULL, ",\r\n"); + p = ::strtok(nullptr, ",\r\n"); } } else if (::strcmp(key, "Slot2TGWhiteList") == 0) { char* p = ::strtok(value, ",\r\n"); - while (p != NULL) { + while (p != nullptr) { unsigned int id = (unsigned int)::atoi(p); if (id > 0U) m_dmrSlot2TGWhiteList.push_back(id); - p = ::strtok(NULL, ",\r\n"); + p = ::strtok(nullptr, ",\r\n"); } } else if (::strcmp(key, "TXHang") == 0) m_dmrTXHang = (unsigned int)::atoi(value); @@ -865,19 +866,19 @@ 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; } } @@ -904,7 +905,7 @@ bool CConf::read() else if (::strcmp(key, "Id") == 0) m_p25Id = (unsigned int)::atoi(value); else if (::strcmp(key, "NAC") == 0) - m_p25NAC = (unsigned int)::strtoul(value, NULL, 16); + m_p25NAC = (unsigned int)::strtoul(value, nullptr, 16); else if (::strcmp(key, "OverrideUIDCheck") == 0) m_p25OverrideUID = ::atoi(value) == 1; else if (::strcmp(key, "SelfOnly") == 0) @@ -1220,7 +1221,7 @@ bool CConf::read() 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; } @@ -1636,7 +1637,7 @@ unsigned int CConf::getDStarAckTime() const return m_dstarAckTime; } -DSTAR_ACK_MESSAGE CConf::getDStarAckMessage() const +DSTAR_ACK CConf::getDStarAckMessage() const { return m_dstarAckMessage; } @@ -1743,7 +1744,7 @@ unsigned int CConf::getDMRModeHang() const return m_dmrModeHang; } -DMR_OVCM_TYPES CConf::getDMROVCM() const +DMR_OVCM CConf::getDMROVCM() const { return m_dmrOVCM; } diff --git a/Conf.h b/Conf.h index d6186b1..6574599 100644 --- a/Conf.h +++ b/Conf.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2015-2024 by Jonathan Naylor G4KLX + * Copyright (C) 2015-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 diff --git a/DMRCSBK.cpp b/DMRCSBK.cpp index 16c0420..451c01e 100644 --- a/DMRCSBK.cpp +++ b/DMRCSBK.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2015,2016,2020,2021,2022,2023 by Jonathan Naylor G4KLX + * Copyright (C) 2015,2016,2020,2021,2022,2023,2025 by Jonathan Naylor G4KLX * Copyright (C) 2019 by Patrick Maier DK5MP * * This program is free software; you can redistribute it and/or modify @@ -28,8 +28,8 @@ #include CDMRCSBK::CDMRCSBK() : -m_data(NULL), -m_CSBKO(CSBKO_NONE), +m_data(nullptr), +m_CSBKO(CSBKO::NONE), m_FID(0x00U), m_GI(false), m_bsId(0U), @@ -49,7 +49,7 @@ CDMRCSBK::~CDMRCSBK() bool CDMRCSBK::put(const unsigned char* bytes) { - assert(bytes != NULL); + assert(bytes != nullptr); CBPTC19696 bptc; bptc.decode(bytes, m_data); @@ -69,7 +69,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]; @@ -78,7 +78,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]; @@ -88,7 +88,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]; @@ -98,7 +98,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]; @@ -107,7 +107,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]; @@ -116,7 +116,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]; @@ -125,7 +125,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]; @@ -134,7 +134,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]; @@ -149,7 +149,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]; @@ -173,7 +173,7 @@ bool CDMRCSBK::put(const unsigned char* bytes) void CDMRCSBK::get(unsigned char* bytes) const { - assert(bytes != NULL); + assert(bytes != nullptr); m_data[10U] ^= CSBK_CRC_MASK[0U]; m_data[11U] ^= CSBK_CRC_MASK[1U]; @@ -204,7 +204,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) diff --git a/DMRCSBK.h b/DMRCSBK.h index be9e6ef..9f24971 100644 --- a/DMRCSBK.h +++ b/DMRCSBK.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2015,2016,2020,2021,2022,2023 by Jonathan Naylor G4KLX + * Copyright (C) 2015,2016,2020,2021,2022,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 @@ -24,18 +24,18 @@ #if defined(USE_DMR) -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 diff --git a/DMRControl.cpp b/DMRControl.cpp index 2431131..1c166ba 100644 --- a/DMRControl.cpp +++ b/DMRControl.cpp @@ -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 @@ -47,7 +47,7 @@ CDMRControl::~CDMRControl() bool CDMRControl::processWakeup(const unsigned char* data) { - assert(data != NULL); + assert(data != nullptr); // Wakeups always come in on slot 1 if (data[0U] != TAG_DATA || data[1U] != (DMR_IDLE_RX | DMR_SYNC_DATA | DT_CSBK)) @@ -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(); @@ -78,35 +78,35 @@ bool CDMRControl::processWakeup(const unsigned char* data) bool CDMRControl::writeModemSlot1(unsigned char *data, unsigned int len) { - assert(data != NULL); + assert(data != nullptr); return m_slot1.writeModem(data, len); } bool CDMRControl::writeModemSlot2(unsigned char *data, unsigned int len) { - assert(data != NULL); + assert(data != nullptr); return m_slot2.writeModem(data, len); } unsigned int CDMRControl::readModemSlot1(unsigned char *data) { - assert(data != NULL); + assert(data != nullptr); return m_slot1.readModem(data); } unsigned int CDMRControl::readModemSlot2(unsigned char *data) { - assert(data != NULL); + assert(data != nullptr); return m_slot2.readModem(data); } void CDMRControl::clock() { - if (m_network != NULL) { + if (m_network != nullptr) { CDMRData data; bool ret = m_network->read(data); if (ret) { diff --git a/DMRControl.h b/DMRControl.h index 8a8b274..62dbaca 100644 --- a/DMRControl.h +++ b/DMRControl.h @@ -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 diff --git a/DMRData.cpp b/DMRData.cpp index a3566fa..850663e 100644 --- a/DMRData.cpp +++ b/DMRData.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2015,2016,2017,2023 Jonathan Naylor, G4KLX + * Copyright (C) 2015,2016,2017,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 @@ -24,7 +24,7 @@ CDMRData::CDMRData(const CDMRData& data) : m_slotNo(data.m_slotNo), -m_data(NULL), +m_data(nullptr), m_srcId(data.m_srcId), m_dstId(data.m_dstId), m_flco(data.m_flco), @@ -40,10 +40,10 @@ m_rssi(data.m_rssi) CDMRData::CDMRData() : m_slotNo(1U), -m_data(NULL), +m_data(nullptr), m_srcId(0U), m_dstId(0U), -m_flco(FLCO_GROUP), +m_flco(FLCO::GROUP), m_dataType(0U), m_seqNo(0U), m_n(0U), @@ -171,7 +171,7 @@ void CDMRData::setRSSI(unsigned char rssi) unsigned int CDMRData::getData(unsigned char* buffer) const { - assert(buffer != NULL); + assert(buffer != nullptr); ::memcpy(buffer, m_data, DMR_FRAME_LENGTH_BYTES); @@ -180,7 +180,7 @@ unsigned int CDMRData::getData(unsigned char* buffer) const void CDMRData::setData(const unsigned char* buffer) { - assert(buffer != NULL); + assert(buffer != nullptr); ::memcpy(m_data, buffer, DMR_FRAME_LENGTH_BYTES); } diff --git a/DMRDataHeader.cpp b/DMRDataHeader.cpp index 4cb251d..164cafb 100644 --- a/DMRDataHeader.cpp +++ b/DMRDataHeader.cpp @@ -1,6 +1,6 @@ /* * Copyright (C) 2012 by Ian Wraith - * Copyright (C) 2015,2016,2017,2023 by Jonathan Naylor G4KLX + * Copyright (C) 2015,2016,2017,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 @@ -34,7 +34,7 @@ const unsigned char UDTF_NMEA = 0x05U; CDMRDataHeader::CDMRDataHeader() : -m_data(NULL), +m_data(nullptr), m_GI(false), m_A(false), m_srcId(0U), @@ -54,7 +54,7 @@ CDMRDataHeader::~CDMRDataHeader() bool CDMRDataHeader::put(const unsigned char* bytes) { - assert(bytes != NULL); + assert(bytes != nullptr); CBPTC19696 bptc; bptc.decode(bytes, m_data); @@ -133,7 +133,7 @@ bool CDMRDataHeader::put(const unsigned char* bytes) void CDMRDataHeader::get(unsigned char* bytes) const { - assert(bytes != NULL); + assert(bytes != nullptr); CBPTC19696 bptc; bptc.encode(m_data, bytes); diff --git a/DMRDefines.h b/DMRDefines.h index 839f764..2f38874 100644 --- a/DMRDefines.h +++ b/DMRDefines.h @@ -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 diff --git a/DMREMB.cpp b/DMREMB.cpp index f3876c4..89c4635 100644 --- a/DMREMB.cpp +++ b/DMREMB.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2015,2016,2023 by Jonathan Naylor G4KLX + * Copyright (C) 2015,2016,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,7 +37,7 @@ CDMREMB::~CDMREMB() void CDMREMB::putData(const unsigned char* data) { - assert(data != NULL); + assert(data != nullptr); unsigned char DMREMB[2U]; DMREMB[0U] = (data[13U] << 4) & 0xF0U; @@ -54,7 +54,7 @@ void CDMREMB::putData(const unsigned char* data) void CDMREMB::getData(unsigned char* data) const { - assert(data != NULL); + assert(data != nullptr); unsigned char DMREMB[2U]; DMREMB[0U] = (m_colorCode << 4) & 0xF0U; diff --git a/DMREmbeddedData.cpp b/DMREmbeddedData.cpp index bddba92..97e8491 100644 --- a/DMREmbeddedData.cpp +++ b/DMREmbeddedData.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2015,2016,2017,2023 by Jonathan Naylor G4KLX + * Copyright (C) 2015,2016,2017,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 @@ -28,10 +28,10 @@ #include CDMREmbeddedData::CDMREmbeddedData() : -m_raw(NULL), -m_state(LCS_NONE), -m_data(NULL), -m_FLCO(FLCO_GROUP), +m_raw(nullptr), +m_state(LC_STATE::NONE), +m_data(nullptr), +m_FLCO(FLCO::GROUP), m_valid(false) { m_raw = new bool[128U]; @@ -47,7 +47,7 @@ CDMREmbeddedData::~CDMREmbeddedData() // Add LC data (which may consist of 4 blocks) to the data store bool CDMREmbeddedData::addData(const unsigned char* data, unsigned char lcss) { - assert(data != NULL); + assert(data != nullptr); bool rawData[40U]; CUtils::byteToBitsBE(data[14U], rawData + 0U); @@ -62,41 +62,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(); @@ -169,7 +169,7 @@ void CDMREmbeddedData::encodeEmbeddedData() unsigned char CDMREmbeddedData::getData(unsigned char* data, unsigned char n) const { - assert(data != NULL); + assert(data != nullptr); if (n >= 1U && n < 5U) { n--; @@ -278,10 +278,10 @@ void CDMREmbeddedData::decodeEmbeddedData() CDMRLC* CDMREmbeddedData::getLC() const { if (!m_valid) - return NULL; + return nullptr; - if (m_FLCO != FLCO_GROUP && m_FLCO != FLCO_USER_USER) - return NULL; + if ((m_FLCO != FLCO::GROUP) && (m_FLCO != FLCO::USER_USER)) + return nullptr; return new CDMRLC(m_data); } @@ -298,13 +298,13 @@ FLCO CDMREmbeddedData::getFLCO() const void CDMREmbeddedData::reset() { - m_state = LCS_NONE; + m_state = LC_STATE::NONE; m_valid = false; } bool CDMREmbeddedData::getRawData(unsigned char* data) const { - assert(data != NULL); + assert(data != nullptr); if (!m_valid) return false; diff --git a/DMREmbeddedData.h b/DMREmbeddedData.h index 2cdbbdd..f761a40 100644 --- a/DMREmbeddedData.h +++ b/DMREmbeddedData.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2015,2016,2017,2023 by Jonathan Naylor G4KLX + * Copyright (C) 2015,2016,2017,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 @@ -23,13 +23,11 @@ #include "Defines.h" #include "DMRLC.h" -#if defined(USE_DMR) - -enum LC_STATE { - LCS_NONE, - LCS_FIRST, - LCS_SECOND, - LCS_THIRD +enum class LC_STATE { + NONE, + FIRST, + SECOND, + THIRD }; class CDMREmbeddedData diff --git a/DMRFullLC.cpp b/DMRFullLC.cpp index b5684b2..31c7e53 100644 --- a/DMRFullLC.cpp +++ b/DMRFullLC.cpp @@ -1,6 +1,6 @@ /* * Copyright (C) 2012 by Ian Wraith - * Copyright (C) 2015,2016,2023 by Jonathan Naylor G4KLX + * Copyright (C) 2015,2016,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 @@ -39,7 +39,7 @@ CDMRFullLC::~CDMRFullLC() CDMRLC* CDMRFullLC::decode(const unsigned char* data, unsigned char type) { - assert(data != NULL); + assert(data != nullptr); unsigned char lcData[12U]; m_bptc.decode(data, lcData); @@ -59,18 +59,18 @@ CDMRLC* CDMRFullLC::decode(const unsigned char* data, unsigned char type) default: ::LogError("Unsupported LC type - %d", int(type)); - return NULL; + return nullptr; } if (!CRS129::check(lcData)) - return NULL; + return nullptr; return new CDMRLC(lcData); } void CDMRFullLC::encode(const CDMRLC& lc, unsigned char* data, unsigned char type) { - assert(data != NULL); + assert(data != nullptr); unsigned char lcData[12U]; lc.getData(lcData); diff --git a/DMRLC.cpp b/DMRLC.cpp index 131d0b9..ecfba19 100644 --- a/DMRLC.cpp +++ b/DMRLC.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2015,2016,2019,2021,2022,2023 by Jonathan Naylor G4KLX + * Copyright (C) 2015,2016,2019,2021,2022,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 @@ -38,13 +38,13 @@ 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), m_dstId(0U) { - assert(bytes != NULL); + assert(bytes != nullptr); m_PF = (bytes[0U] & 0x80U) == 0x80U; m_R = (bytes[0U] & 0x40U) == 0x40U; @@ -62,13 +62,13 @@ 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), m_dstId(0U) { - assert(bits != NULL); + assert(bits != nullptr); m_PF = bits[0U]; m_R = bits[1U]; @@ -100,7 +100,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), @@ -114,7 +114,7 @@ CDMRLC::~CDMRLC() void CDMRLC::getData(unsigned char* bytes) const { - assert(bytes != NULL); + assert(bytes != nullptr); bytes[0U] = (unsigned char)m_FLCO; @@ -139,7 +139,7 @@ void CDMRLC::getData(unsigned char* bytes) const void CDMRLC::getData(bool* bits) const { - assert(bits != NULL); + assert(bits != nullptr); unsigned char bytes[9U]; getData(bytes); diff --git a/DMRLookup.cpp b/DMRLookup.cpp index 35c06e2..82cda77 100644 --- a/DMRLookup.cpp +++ b/DMRLookup.cpp @@ -1,5 +1,5 @@ /* -* Copyright (C) 2016,2017,2023 by Jonathan Naylor G4KLX +* Copyright (C) 2016,2017,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 @@ -134,7 +134,7 @@ std::string CDMRLookup::find(unsigned int id) bool CDMRLookup::exists(unsigned int id) { - return m_table.lookup(id, NULL); + return m_table.lookup(id, nullptr); } #endif diff --git a/DMRShortLC.cpp b/DMRShortLC.cpp index 90ac2b9..aca67fa 100644 --- a/DMRShortLC.cpp +++ b/DMRShortLC.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2015,2016,2023 by Jonathan Naylor G4KLX + * Copyright (C) 2015,2016,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,8 +27,8 @@ #include CDMRShortLC::CDMRShortLC() : -m_rawData(NULL), -m_deInterData(NULL) +m_rawData(nullptr), +m_deInterData(nullptr) { m_rawData = new bool[72U]; m_deInterData = new bool[68U]; @@ -43,8 +43,8 @@ CDMRShortLC::~CDMRShortLC() // The main decode function bool CDMRShortLC::decode(const unsigned char* in, unsigned char* out) { - assert(in != NULL); - assert(out != NULL); + assert(in != nullptr); + assert(out != nullptr); // Get the raw binary decodeExtractBinary(in); @@ -66,8 +66,8 @@ bool CDMRShortLC::decode(const unsigned char* in, unsigned char* out) // The main encode function void CDMRShortLC::encode(const unsigned char* in, unsigned char* out) { - assert(in != NULL); - assert(out != NULL); + assert(in != nullptr); + assert(out != nullptr); // Extract Data encodeExtractData(in); @@ -84,7 +84,7 @@ void CDMRShortLC::encode(const unsigned char* in, unsigned char* out) void CDMRShortLC::decodeExtractBinary(const unsigned char* in) { - assert(in != NULL); + assert(in != nullptr); CUtils::byteToBitsBE(in[0U], m_rawData + 0U); CUtils::byteToBitsBE(in[1U], m_rawData + 8U); @@ -134,7 +134,7 @@ bool CDMRShortLC::decodeErrorCheck() // Extract the 36 bits of payload void CDMRShortLC::decodeExtractData(unsigned char* data) const { - assert(data != NULL); + assert(data != nullptr); bool bData[40U]; @@ -161,7 +161,7 @@ void CDMRShortLC::decodeExtractData(unsigned char* data) const // Extract the 36 bits of payload void CDMRShortLC::encodeExtractData(const unsigned char* in) const { - assert(in != NULL); + assert(in != nullptr); bool bData[40U]; CUtils::byteToBitsBE(in[0U], bData + 0U); @@ -215,7 +215,7 @@ void CDMRShortLC::encodeInterleave() void CDMRShortLC::encodeExtractBinary(unsigned char* data) { - assert(data != NULL); + assert(data != nullptr); CUtils::bitsToByteBE(m_rawData + 0U, data[0U]); CUtils::bitsToByteBE(m_rawData + 8U, data[1U]); diff --git a/DMRSlot.cpp b/DMRSlot.cpp index d6f8dc9..3072462 100644 --- a/DMRSlot.cpp +++ b/DMRSlot.cpp @@ -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 @@ -42,23 +42,24 @@ bool CDMRSlot::m_dumpTAData = true; CModem* CDMRSlot::m_modem = NULL; CDMRNetwork* CDMRSlot::m_network = NULL; bool CDMRSlot::m_duplex = true; -CDMRLookup* CDMRSlot::m_lookup = NULL; +CDMRLookup* CDMRSlot::m_lookup = nullptr; 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; +CRSSIInterpolator* CDMRSlot::m_rssiMapper = nullptr; unsigned int CDMRSlot::m_jitterTime = 360U; unsigned int CDMRSlot::m_jitterSlots = 6U; -unsigned char* CDMRSlot::m_idle = NULL; +unsigned char* CDMRSlot::m_idle = nullptr; 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; @@ -76,22 +77,22 @@ const unsigned int BER_COUNT = 18U * 141U; // 18 * 60ms = 1080ms 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_rfEmbeddedData(nullptr), m_rfEmbeddedReadN(0U), m_rfEmbeddedWriteN(1U), m_rfTalkerId(TALKER_ID_NONE), m_rfTalkerAlias(slotNo), m_netEmbeddedLC(), -m_netEmbeddedData(NULL), +m_netEmbeddedData(nullptr), m_netEmbeddedReadN(0U), m_netEmbeddedWriteN(1U), m_netTalkerId(TALKER_ID_NONE), m_netTalkerAlias(slotNo), -m_rfLC(NULL), -m_netLC(NULL), +m_rfLC(nullptr), +m_netLC(nullptr), m_rfSeqNo(0U), m_rfN(0U), m_lastrfN(0U), @@ -112,7 +113,7 @@ m_rfErrs(0U), m_netErrs(0U), m_rfTimeout(false), m_netTimeout(false), -m_lastFrame(NULL), +m_lastFrame(nullptr), m_lastFrameValid(false), m_rssi(0), m_maxRSSI(0), @@ -142,7 +143,7 @@ CDMRSlot::~CDMRSlot() bool CDMRSlot::writeModem(unsigned char *data, unsigned int len) { - assert(data != NULL); + assert(data != nullptr); if (!m_enabled) return false; @@ -185,7 +186,7 @@ bool CDMRSlot::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; } @@ -224,12 +225,12 @@ 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; CDMRLC* lc = fullLC.decode(data + 2U, DT_VOICE_LC_HEADER); - if (lc == NULL) + if (lc == nullptr) return false; unsigned int srcId = lc->getSrcId(); @@ -238,25 +239,34 @@ bool CDMRSlot::writeModem(unsigned char *data, unsigned int len) std::string dst = m_lookup->find(dstId); FLCO flco = lc->getFLCO(); + if (!m_protect) { + if (lc->getPF()) { + LogMessage("DMR Slot %u, RF user %u rejected", m_slotNo, srcId); + delete lc; + m_rfState = RPT_RF_STATE::LISTENING; + return false; + } + } + if (!CDMRAccessControl::validateSrcId(srcId)) { LogMessage("DMR Slot %u, RF user %u rejected", m_slotNo, srcId); writeJSONRF("rejected", srcId, src, flco == FLCO_GROUP, dstId); 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); writeJSONRF("rejected", srcId, src, flco == FLCO_GROUP, 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; @@ -311,7 +321,7 @@ 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; if (m_netState == RS_NET_IDLE) { setShortLC(m_slotNo, dstId, flco, ACTIVITY_VOICE); @@ -324,7 +334,7 @@ bool CDMRSlot::writeModem(unsigned char *data, unsigned int len) 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 @@ -342,14 +352,16 @@ bool CDMRSlot::writeModem(unsigned char *data, unsigned int len) data[0U] = TAG_DATA; data[1U] = 0x00U; - if (m_duplex) - writeQueueRF(data); + if (m_protect) { + if (m_duplex) + writeQueueRF(data); - writeNetworkRF(data, DT_VOICE_PI_HEADER); + writeNetworkRF(data, DT_VOICE_PI_HEADER); + } 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 @@ -396,7 +408,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; @@ -426,7 +438,7 @@ bool CDMRSlot::writeModem(unsigned char *data, unsigned int len) 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); @@ -445,7 +457,7 @@ 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; if (m_netState == RS_NET_IDLE) { setShortLC(m_slotNo, dstId, gi ? FLCO_GROUP : FLCO_USER_USER, ACTIVITY_DATA); @@ -469,13 +481,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(); @@ -515,38 +527,38 @@ 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); 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()); writeJSONRF("csbk", "Unit to Unit Voice Service Request", srcId, src, gi, dstId); 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()); writeJSONRF("csbk", "Unit to Unit Voice Answer Response", srcId, src, gi, dstId); 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()); writeJSONRF("csbk", "Negative Acknowledgment Response", srcId, src, gi, dstId); 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()); writeJSONRF("csbk", "Preamble", srcId, src, gi, dstId); 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()); writeJSONRF("csbk", "Call Alert", srcId, src, gi, dstId); 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()); writeJSONRF("csbk", "Call Alert Ack", srcId, src, gi, dstId); 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()); writeJSONRF("csbk", "Radio Check", srcId, src, gi, dstId); 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()); writeJSONRF("csbk", "Call Emergency", srcId, src, gi, dstId); break; @@ -562,8 +574,8 @@ bool CDMRSlot::writeModem(unsigned char *data, unsigned int len) } 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]; @@ -617,7 +629,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); @@ -657,13 +669,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; @@ -703,24 +715,24 @@ 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); logGPSPosition(data); } - if (m_network != NULL) + if (m_network != nullptr) m_network->writeRadioPosition(m_rfLC->getSrcId(), data); break; - case FLCO_TALKER_ALIAS_HEADER: - if (m_network != NULL) + case FLCO::TALKER_ALIAS_HEADER: + if (m_network != nullptr) m_network->writeTalkerAlias(m_rfLC->getSrcId(), 0U, data); if (!(m_rfTalkerId & TALKER_ID_HEADER)) { @@ -740,8 +752,8 @@ bool CDMRSlot::writeModem(unsigned char *data, unsigned int len) } break; - case FLCO_TALKER_ALIAS_BLOCK1: - if (m_network != NULL) + case FLCO::TALKER_ALIAS_BLOCK1: + if (m_network != nullptr) m_network->writeTalkerAlias(m_rfLC->getSrcId(), 1U, data); if (!(m_rfTalkerId & TALKER_ID_BLOCK1)) { @@ -761,8 +773,8 @@ bool CDMRSlot::writeModem(unsigned char *data, unsigned int len) } break; - case FLCO_TALKER_ALIAS_BLOCK2: - if (m_network != NULL) + case FLCO::TALKER_ALIAS_BLOCK2: + if (m_network != nullptr) m_network->writeTalkerAlias(m_rfLC->getSrcId(), 2U, data); if (!(m_rfTalkerId & TALKER_ID_BLOCK2)) { @@ -782,8 +794,8 @@ bool CDMRSlot::writeModem(unsigned char *data, unsigned int len) } break; - case FLCO_TALKER_ALIAS_BLOCK3: - if (m_network != NULL) + case FLCO::TALKER_ALIAS_BLOCK3: + if (m_network != nullptr) m_network->writeTalkerAlias(m_rfLC->getSrcId(), 3U, data); if (!(m_rfTalkerId & TALKER_ID_BLOCK3)) { @@ -844,7 +856,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); @@ -855,32 +867,41 @@ bool CDMRSlot::writeModem(unsigned char *data, unsigned int len) m_rfEmbeddedLC.addData(data + 2U, emb.getLCSS()); CDMRLC* lc = m_rfEmbeddedLC.getLC(); - if (lc != NULL) { + if (lc != nullptr) { unsigned int srcId = lc->getSrcId(); unsigned int dstId = lc->getDstId(); std::string src = m_lookup->find(srcId); std::string dst = m_lookup->find(dstId); FLCO flco = lc->getFLCO(); + if (!m_protect) { + if (lc->getPF()) { + LogMessage("DMR Slot %u, RF user %u rejected", m_slotNo, srcId); + delete lc; + m_rfState = RPT_RF_STATE::LISTENING; + return false; + } + } + if (!CDMRAccessControl::validateSrcId(srcId)) { LogMessage("DMR Slot %u, RF user %u rejected", m_slotNo, srcId); writeJSONRF("rejected", srcId, src, flco == FLCO_GROUP, dstId); 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); writeJSONRF("rejected", srcId, src, flco == FLCO_GROUP, 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; @@ -971,7 +992,7 @@ 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; if (m_netState == RS_NET_IDLE) { setShortLC(m_slotNo, dstId, flco, ACTIVITY_VOICE); @@ -992,7 +1013,7 @@ bool CDMRSlot::writeModem(unsigned char *data, unsigned int len) unsigned int CDMRSlot::readModem(unsigned char* data) { - assert(data != NULL); + assert(data != nullptr); if (m_queue.isEmpty()) return 0U; @@ -1007,13 +1028,13 @@ 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) setShortLC(m_slotNo, 0U); 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]; @@ -1049,12 +1070,12 @@ void CDMRSlot::writeEndRF(bool writeEnd) m_rfN = 0U; delete m_rfLC; - m_rfLC = NULL; + m_rfLC = nullptr; } void CDMRSlot::writeEndNet(bool writeEnd) { - m_netState = RS_NET_IDLE; + m_netState = RPT_NET_STATE::IDLE; setShortLC(m_slotNo, 0U); @@ -1108,7 +1129,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(); @@ -1119,12 +1140,12 @@ 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; CDMRLC* lc = fullLC.decode(data + 2U, DT_VOICE_LC_HEADER); - if (lc == NULL) { + if (lc == nullptr) { LogMessage("DMR Slot %u, bad LC received from the network, replacing", m_slotNo); lc = new CDMRLC(dmrData.getFLCO(), dmrData.getSrcId(), dmrData.getDstId()); } @@ -1135,12 +1156,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; @@ -1195,9 +1216,9 @@ 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; @@ -1206,15 +1227,15 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData) 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()); writeJSONNet("start", srcId, src, flco == FLCO_GROUP, dstId); } 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; @@ -1261,9 +1282,9 @@ 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; @@ -1293,7 +1314,7 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData) writeQueueNet(data); } 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 @@ -1334,7 +1355,7 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData) writeJSONNet("end", float(m_netFrames) / 16.667F, float(m_netLost * 100U) / float(m_netFrames), float(m_netErrs * 100U) / float(m_netBits)); writeEndNet(); } else if (dataType == DT_DATA_HEADER) { - if (m_netState == RS_NET_DATA) + if (m_netState == RPT_NET_STATE::DATA) return; CDMRDataHeader dataHeader; @@ -1371,9 +1392,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); @@ -1387,15 +1408,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; @@ -1451,9 +1472,9 @@ 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); @@ -1464,7 +1485,7 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData) writeJSONNet("late_entry", srcId, src, m_netLC->getFLCO() == FLCO_GROUP, dstId); } - 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); @@ -1503,7 +1524,7 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData) m_netN = dmrData.getN(); } } 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(); @@ -1526,19 +1547,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(); @@ -1555,7 +1576,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(); @@ -1572,7 +1593,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(); @@ -1589,7 +1610,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(); @@ -1661,13 +1682,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(); @@ -1689,7 +1710,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 @@ -1716,31 +1737,31 @@ 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()); writeJSONNet("csbk", "Unit to Unit Voice Service Request", srcId, src, gi, dstId); 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()); writeJSONNet("csbk", "Unit to Unit Voice Service Answer Response", srcId, src, gi, dstId); 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()); writeJSONNet("csbk", "UNegative Acknowledgment Response", srcId, src, gi, dstId); 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()); writeJSONNet("csbk", "Preamble", srcId, src, gi, dstId); 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()); writeJSONNet("csbk", "Call Alert", srcId, src, gi, dstId); 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()); writeJSONNet("csbk", "Call Alert Ack", srcId, src, gi, dstId); 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()); writeJSONNet("csbk", "Radio Check", srcId, src, gi, dstId); break; @@ -1882,11 +1903,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)); @@ -1900,7 +1921,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()) { @@ -1918,9 +1939,9 @@ void CDMRSlot::clock() void CDMRSlot::writeQueueRF(const unsigned char *data) { - assert(data != NULL); + assert(data != nullptr); - if (m_netState != RS_NET_IDLE) + if (m_netState != RPT_NET_STATE::IDLE) return; unsigned char len = DMR_FRAME_LENGTH_BYTES + 2U; @@ -1937,12 +1958,12 @@ void CDMRSlot::writeQueueRF(const unsigned char *data) void CDMRSlot::writeNetworkRF(const unsigned char* data, unsigned char dataType, FLCO flco, unsigned int srcId, unsigned int dstId, unsigned char errors) { - assert(data != NULL); + assert(data != nullptr); - if (m_netState != RS_NET_IDLE) + if (m_netState != RPT_NET_STATE::IDLE) return; - if (m_network == NULL) + if (m_network == nullptr) return; CDMRData dmrData; @@ -1965,15 +1986,15 @@ void CDMRSlot::writeNetworkRF(const unsigned char* data, unsigned char dataType, void CDMRSlot::writeNetworkRF(const unsigned char* data, unsigned char dataType, unsigned char errors) { - assert(data != NULL); - assert(m_rfLC != NULL); + assert(data != nullptr); + assert(m_rfLC != nullptr); writeNetworkRF(data, dataType, m_rfLC->getFLCO(), m_rfLC->getSrcId(), m_rfLC->getDstId(), errors); } void CDMRSlot::writeQueueNet(const unsigned char *data) { - assert(data != NULL); + assert(data != nullptr); unsigned char len = DMR_FRAME_LENGTH_BYTES + 2U; @@ -2002,6 +2023,7 @@ void CDMRSlot::init(unsigned int colorCode, bool embeddedLCOnly, bool dumpTAData m_lookup = lookup; m_hangCount = callHang * 17U; m_ovcm = ovcm; + m_protect = protect; m_rssiMapper = rssiMapper; @@ -2022,7 +2044,7 @@ void CDMRSlot::init(unsigned int colorCode, bool embeddedLCOnly, bool dumpTAData void CDMRSlot::setShortLC(unsigned int slotNo, unsigned int id, FLCO flco, ACTIVITY_TYPE type) { - assert(m_modem != NULL); + assert(m_modem != nullptr); switch (slotNo) { case 1U: @@ -2066,41 +2088,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; } @@ -2116,7 +2138,7 @@ void CDMRSlot::setShortLC(unsigned int slotNo, unsigned int id, FLCO flco, ACTIV bool CDMRSlot::insertSilence(const unsigned char* data, unsigned char seqNo) { - assert(data != NULL); + assert(data != nullptr); // Do not send duplicate if (seqNo == m_netN) @@ -2194,7 +2216,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) @@ -2203,7 +2225,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; @@ -2219,10 +2241,10 @@ void CDMRSlot::enable(bool enabled) m_rfN = 0U; delete m_rfLC; - m_rfLC = NULL; + m_rfLC = nullptr; // Reset the networking section - m_netState = RS_NET_IDLE; + m_netState = RPT_NET_STATE::IDLE; m_lastFrameValid = false; @@ -2240,7 +2262,7 @@ void CDMRSlot::enable(bool enabled) m_netN = 0U; delete m_netLC; - m_netLC = NULL; + m_netLC = nullptr; } m_enabled = enabled; diff --git a/DMRSlot.h b/DMRSlot.h index bee254a..e48b2ae 100644 --- a/DMRSlot.h +++ b/DMRSlot.h @@ -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 @@ -40,12 +40,12 @@ #include -enum ACTIVITY_TYPE { - ACTIVITY_NONE, - ACTIVITY_VOICE, - ACTIVITY_DATA, - ACTIVITY_CSBK, - ACTIVITY_EMERG +enum class ACTIVITY_TYPE { + NONE, + VOICE, + DATA, + CSBK, + EMERG }; class CDMRSlot { @@ -129,7 +129,8 @@ 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; diff --git a/DMRSlotType.cpp b/DMRSlotType.cpp index 24fdaaf..96c0ea1 100644 --- a/DMRSlotType.cpp +++ b/DMRSlotType.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2015,2016,2023 by Jonathan Naylor G4KLX + * Copyright (C) 2015,2016,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 @@ -36,7 +36,7 @@ CDMRSlotType::~CDMRSlotType() void CDMRSlotType::putData(const unsigned char* data) { - assert(data != NULL); + assert(data != nullptr); unsigned char DMRSlotType[3U]; DMRSlotType[0U] = (data[12U] << 2) & 0xFCU; @@ -56,7 +56,7 @@ void CDMRSlotType::putData(const unsigned char* data) void CDMRSlotType::getData(unsigned char* data) const { - assert(data != NULL); + assert(data != nullptr); unsigned char DMRSlotType[3U]; DMRSlotType[0U] = (m_colorCode << 4) & 0xF0U; diff --git a/DMRTA.cpp b/DMRTA.cpp index 165bee5..72a1188 100644 --- a/DMRTA.cpp +++ b/DMRTA.cpp @@ -1,5 +1,5 @@ /* -* Copyright (C) 2015,2016,2017,2018,2023 Jonathan Naylor, G4KLX +* Copyright (C) 2015,2016,2017,2018,2023,2025 Jonathan Naylor, G4KLX * Copyright (C) 2018 by Shawn Chain, BG5HHP * * This program is free software; you can redistribute it and/or modify @@ -33,7 +33,7 @@ CDMRTA::~CDMRTA() bool CDMRTA::add(unsigned int blockId, const unsigned char* data, unsigned int len) { - assert(data != NULL); + assert(data != nullptr); if (blockId > 3U) { // invalid block id diff --git a/DMRTrellis.cpp b/DMRTrellis.cpp index cdf30ed..6f0032b 100644 --- a/DMRTrellis.cpp +++ b/DMRTrellis.cpp @@ -1,5 +1,5 @@ /* -* Copyright (C) 2016 by Jonathan Naylor, G4KLX +* Copyright (C) 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 @@ -49,8 +49,8 @@ CDMRTrellis::~CDMRTrellis() bool CDMRTrellis::decode(const unsigned char* data, unsigned char* payload) { - assert(data != NULL); - assert(payload != NULL); + assert(data != nullptr); + assert(payload != nullptr); signed char dibits[98U]; deinterleave(data, dibits); @@ -83,8 +83,8 @@ bool CDMRTrellis::decode(const unsigned char* data, unsigned char* payload) void CDMRTrellis::encode(const unsigned char* payload, unsigned char* data) { - assert(payload != NULL); - assert(data != NULL); + assert(payload != nullptr); + assert(data != nullptr); unsigned char tribits[49U]; bitsToTribits(payload, tribits); diff --git a/DStarControl.cpp b/DStarControl.cpp index 6e5bad8..99e57ab 100644 --- a/DStarControl.cpp +++ b/DStarControl.cpp @@ -54,8 +54,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(), @@ -76,7 +76,8 @@ m_fec(), m_rfBits(1U), m_netBits(1U), m_rfErrs(0U), -m_lastFrame(NULL), +m_netErrs(0U), +m_lastFrame(nullptr), m_lastFrameValid(false), m_rssiMapper(rssiMapper), m_rssi(0), @@ -124,14 +125,14 @@ CDStarControl::~CDStarControl() bool CDStarControl::writeModem(unsigned char *data, unsigned int len) { - assert(data != NULL); + assert(data != nullptr); if (!m_enabled) return false; unsigned char type = data[0U]; - if (type == TAG_LOST && m_rfState == RS_RF_AUDIO) { + 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]; @@ -150,14 +151,14 @@ 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(); - if (m_network != NULL) + if (m_network != nullptr) m_network->reset(); } @@ -165,7 +166,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; } @@ -309,7 +310,7 @@ 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) writeJSONRSSI(); @@ -317,21 +318,21 @@ bool CDStarControl::writeModem(unsigned char *data, unsigned int len) LogMessage("D-Star, received RF header from %8.8s/%4.4s to %8.8s", my1, my2, your); writeJSONRF("start", 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(); - if (m_network != NULL) + if (m_network != nullptr) m_network->reset(); } return false; - } else if (m_rfState == RS_RF_AUDIO) { + } else if ((m_rfState == RPT_RF_STATE::AUDIO) || (m_rfState == RPT_RF_STATE::DATA)) { if (m_net) writeNetworkDataRF(DSTAR_END_PATTERN_BYTES, 0U, true); @@ -358,37 +359,74 @@ 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_rfState = RS_RF_LATE_ENTRY; + m_rfN = 0U; + m_rfState = RPT_RF_STATE::LATE_ENTRY; } return false; } - if (m_rfState == RS_RF_AUDIO) { + if ((m_rfState == RPT_RF_STATE::AUDIO) || (m_rfState == RPT_RF_STATE::DATA)) { // The sync is regenerated by the modem so can do exact match if (::memcmp(data + 1U + DSTAR_VOICE_FRAME_LENGTH_BYTES, DSTAR_SYNC_BYTES, DSTAR_DATA_FRAME_LENGTH_BYTES) == 0) { m_rfSlowData.start(); m_rfN = 0U; } + } - // Regenerate the sync and send the RSSI data to the display - if (m_rfN == 0U) { - CSync::addDStarSync(data + 1U); - writeJSONRSSI(); + 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 = RPT_RF_STATE::DATA; + } + } + + if (m_rfState == RPT_RF_STATE::DATA) { + LogDebug("D-Star, fast data sequence no. %u", m_rfN); + + m_rfBits += 48U; + m_rfFrames++; + + if (m_net) + writeNetworkDataRF(data, 0U, false); + + if (m_duplex) + writeQueueDataRF(data); + + m_rfSlowData.peakSlowData(data + 1U, m_rfN); + bool complete = m_rfSlowData.isComplete(); + + if (complete) { + unsigned char type = m_rfSlowData.getType(); + if (type == DSTAR_SLOW_DATA_TYPE_FASTDATA_END) { + LogMessage("D-Star, leaving fast data mode"); + m_rfState = RPT_RF_STATE::AUDIO; + } } + m_rfN = (m_rfN + 1U) % 21U; + } else if (m_rfState == RPT_RF_STATE::AUDIO) { + // Send the RSSI data to the display + if (m_rfN == 0U) + m_display->writeDStarRSSI(m_rssi); + unsigned int errors = 0U; - if (!m_rfHeader.isDataPacket()) { + if (::memcmp(data + 1U, DSTAR_nullptr_AMBE_DATA_BYTES_SCRAMBLED, DSTAR_VOICE_FRAME_LENGTH_BYTES) == 0) { + LogDebug("D-Star, audio sequence no. %u, null audio", m_rfN); + } else { errors = m_fec.regenerateDStar(data + 1U); m_bitErrsAccum += errors; m_rfErrs += errors; @@ -399,10 +437,10 @@ bool CDStarControl::writeModem(unsigned char *data, unsigned int len) m_rfBits += 48U; m_rfFrames++; - const unsigned char* text = m_rfSlowData.addText(data + 1U); - if (text != NULL) { - LogMessage("D-Star, slow data text = \"%s\"", text); - writeJSONText(text); + if (m_rfN != 0U) { + const unsigned char* text = m_rfSlowData.addText(data + 1U, m_rfN); + if (text != nullptr) + LogMessage("D-Star, RF slow data text = \"%s\"", text); } if (m_net) @@ -414,15 +452,20 @@ bool CDStarControl::writeModem(unsigned char *data, unsigned int len) } m_rfN = (m_rfN + 1U) % 21U; - } else 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(); + m_rfN = 0U; return false; } else { - CDStarHeader* header = m_rfSlowData.addHeader(data + 1U); - if (header == NULL) + CDStarHeader* header = m_rfSlowData.addHeader(data + 1U, m_rfN); + if (header == nullptr) { + m_rfN = (m_rfN + 1U) % 21U; return false; + } m_rfHeader = *header; delete header; @@ -523,7 +566,9 @@ bool CDStarControl::writeModem(unsigned char *data, unsigned int len) } unsigned int errors = 0U; - if (!m_rfHeader.isDataPacket()) { + if (::memcmp(data + 1U, DSTAR_nullptr_AMBE_DATA_BYTES_SCRAMBLED, DSTAR_VOICE_FRAME_LENGTH_BYTES) == 0) { + LogDebug("D-Star, audio sequence no. %u, null audio", m_rfN); + } else { errors = m_fec.regenerateDStar(data + 1U); LogDebug("D-Star, audio sequence no. %u, errs: %u/48 (%.1f%%)", m_rfN, errors, float(errors) / 0.48F); m_bitErrsAccum += errors; @@ -541,7 +586,7 @@ bool CDStarControl::writeModem(unsigned char *data, unsigned int len) writeQueueDataRF(data); } - m_rfState = RS_RF_AUDIO; + m_rfState = RPT_RF_STATE::AUDIO; m_rfN = (m_rfN + 1U) % 21U; @@ -562,7 +607,7 @@ bool CDStarControl::writeModem(unsigned char *data, unsigned int len) unsigned int CDStarControl::readModem(unsigned char* data) { - assert(data != NULL); + assert(data != nullptr); if (m_queue.isEmpty()) return 0U; @@ -577,21 +622,21 @@ 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) { m_ackTimer.start(); - if (m_network != NULL) + if (m_network != nullptr) m_network->reset(); } } void CDStarControl::writeEndNet() { - m_netState = RS_NET_IDLE; + m_netState = RPT_NET_STATE::IDLE; m_lastFrameValid = false; @@ -599,13 +644,13 @@ void CDStarControl::writeEndNet() m_networkWatchdog.stop(); m_packetTimer.stop(); - if (m_network != NULL) + if (m_network != nullptr) m_network->reset(); } void CDStarControl::writeNetwork() { - assert(m_network != NULL); + assert(m_network != nullptr); unsigned char data[DSTAR_HEADER_LENGTH_BYTES + 2U]; unsigned int length = m_network->read(data, DSTAR_HEADER_LENGTH_BYTES + 2U); @@ -615,7 +660,7 @@ void CDStarControl::writeNetwork() if (!m_enabled) return; - if (m_rfState == RS_RF_AUDIO && 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(); @@ -623,7 +668,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); @@ -664,7 +709,7 @@ void CDStarControl::writeNetwork() m_netState = RS_NET_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) { @@ -675,12 +720,9 @@ void CDStarControl::writeNetwork() writeJSONNet("start", my1, my2, your); } - // Something just above here introduces a large delay forcing erroneous(?) insertion of silence packets. - // Starting the elapsed timer here instead of the commented out position above solves that. m_elapsed.start(); - } else if (type == TAG_EOT) { - if (m_netState != RS_NET_AUDIO) + if ((m_netState != RPT_NET_STATE::AUDIO) && (m_netState != RPT_NET_STATE::DATA)) return; writeQueueEOTNet(); @@ -701,42 +743,89 @@ void CDStarControl::writeNetwork() writeEndNet(); } else if (type == TAG_DATA) { - if (m_netState != RS_NET_AUDIO) - return; + if ((m_netState == RPT_NET_STATE::AUDIO) || (m_netState == RPT_NET_STATE::DATA)) { + unsigned char n = data[1U]; - unsigned int errors = 0U; - unsigned char n = data[1U]; + // The sync is regenerated by the modem so can do exact match + if (::memcmp(data + 1U + DSTAR_VOICE_FRAME_LENGTH_BYTES, DSTAR_SYNC_BYTES, DSTAR_DATA_FRAME_LENGTH_BYTES) == 0) { + m_netSlowData.start(); + } else { + m_netSlowData.peakSlowData(data + 1U, n); - if (!m_netHeader.isDataPacket()) - errors = m_fec.regenerateDStar(data + 2U); + 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 = RPT_NET_STATE::DATA; + } + } + } + } - blankDTMF(data + 2U); + if (m_netState == RPT_NET_STATE::AUDIO) { + unsigned char n = data[1U]; - data[1U] = TAG_DATA; + unsigned int errors = 0U; + if (::memcmp(data + 2U, DSTAR_nullptr_AMBE_DATA_BYTES_SCRAMBLED, DSTAR_VOICE_FRAME_LENGTH_BYTES) != 0) { + errors = m_fec.regenerateDStar(data + 2U); + blankDTMF(data + 2U); + } - // Insert silence and reject if in the past - bool ret = insertSilence(data + 1U, n); - if (!ret) - return; + data[1U] = TAG_DATA; + + // Insert silence and reject if in the past + bool ret = insertSilence(data + 1U, n); + if (!ret) + return; m_netBits += 48U; - m_netN = n; + m_netN = n; - // Regenerate the sync - if (n == 0U) { - CSync::addDStarSync(data + 2U); - m_netSlowData.start(); + // Regenerate the sync + if (m_netN == 0U) { + CSync::addDStarSync(data + 2U); + m_netSlowData.start(); + } else { + const unsigned char* text = m_netSlowData.addText(data + 2U, m_netN); + if (text != nullptr) + LogMessage("D-Star, network slow data text = \"%s\"", text); + } + + m_packetTimer.start(); + m_netFrames++; + +#if defined(DUMP_DSTAR) + writeFile(data + 1U, length - 1U); +#endif + writeQueueDataNet(data + 1U); } - const unsigned char* text = m_netSlowData.addText(data + 2U); - if (text != NULL) { - LogMessage("D-Star, slow data text = \"%s\"", text); - writeJSONText(text); - } + if (m_netState == RPT_NET_STATE::DATA) { + m_netN = data[1U]; - m_packetTimer.start(); - m_netFrames++; + data[1U] = TAG_DATA; + + m_netBits += 48U; + + // Regenerate the sync + if (m_netN == 0U) { + CSync::addDStarSync(data + 2U); + m_netSlowData.start(); + } else { + m_netSlowData.peakSlowData(data + 2U, m_netN); + bool complete = m_netSlowData.isComplete(); + if (complete) { + unsigned char type = m_netSlowData.getType(); + if (type == DSTAR_SLOW_DATA_TYPE_FASTDATA_END) { + LogMessage("D-Star, leaving fast data mode"); + m_netState = RPT_NET_STATE::AUDIO; + } + } + } + + m_packetTimer.start(); + m_netFrames++; writeQueueDataNet(data + 1U); } else { @@ -749,7 +838,7 @@ void CDStarControl::clock() unsigned int ms = m_interval.elapsed(); m_interval.start(); - if (m_network != NULL) + if (m_network != nullptr) writeNetwork(); m_ackTimer.clock(ms); @@ -767,7 +856,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()) { @@ -787,7 +876,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()) { @@ -809,9 +898,9 @@ void CDStarControl::clock() void CDStarControl::writeQueueHeaderRF(const unsigned char *data) { - assert(data != NULL); + assert(data != nullptr); - if (m_netState != RS_NET_IDLE) + if (m_netState != RPT_NET_STATE::IDLE) return; if (m_rfTimeoutTimer.isRunning() && m_rfTimeoutTimer.hasExpired()) @@ -832,9 +921,9 @@ void CDStarControl::writeQueueHeaderRF(const unsigned char *data) void CDStarControl::writeQueueDataRF(const unsigned char *data) { - assert(data != NULL); + assert(data != nullptr); - if (m_netState != RS_NET_IDLE) + if (m_netState != RPT_NET_STATE::IDLE) return; if (m_rfTimeoutTimer.isRunning() && m_rfTimeoutTimer.hasExpired()) @@ -855,7 +944,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()) @@ -877,7 +966,7 @@ void CDStarControl::writeQueueEOTRF() void CDStarControl::writeQueueHeaderNet(const unsigned char *data) { - assert(data != NULL); + assert(data != nullptr); if (m_netTimeoutTimer.isRunning() && m_netTimeoutTimer.hasExpired()) return; @@ -897,7 +986,7 @@ void CDStarControl::writeQueueHeaderNet(const unsigned char *data) void CDStarControl::writeQueueDataNet(const unsigned char *data) { - assert(data != NULL); + assert(data != nullptr); if (m_netTimeoutTimer.isRunning() && m_netTimeoutTimer.hasExpired()) return; @@ -936,35 +1025,35 @@ void CDStarControl::writeQueueEOTNet() void CDStarControl::writeNetworkHeaderRF(const unsigned char* data) { - assert(data != NULL); + assert(data != nullptr); - if (m_network == NULL) + if (m_network == nullptr) return; // Don't send to the network if the timeout has expired 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) { - assert(data != NULL); + assert(data != nullptr); - if (m_network == NULL) + if (m_network == nullptr) return; // Don't send to the network if the timeout has expired 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::insertSilence(const unsigned char* data, unsigned char seqNo) { - assert(data != NULL); + assert(data != nullptr); // Check to see if we have any spaces to fill? unsigned int oldSeqNo = (m_netN + 1U) % 21U; @@ -999,19 +1088,19 @@ void CDStarControl::insertSilence(unsigned int count) for (unsigned int i = 0U; i < count; i++) { if (i < 3U && m_lastFrameValid) { if (n == 0U) { - ::memcpy(m_lastFrame + DSTAR_VOICE_FRAME_LENGTH_BYTES + 1U, DSTAR_NULL_SLOW_SYNC_BYTES, DSTAR_DATA_FRAME_LENGTH_BYTES); + ::memcpy(m_lastFrame + DSTAR_VOICE_FRAME_LENGTH_BYTES + 1U, DSTAR_nullptr_SLOW_SYNC_BYTES, DSTAR_DATA_FRAME_LENGTH_BYTES); writeQueueDataNet(m_lastFrame); } else { - ::memcpy(m_lastFrame + DSTAR_VOICE_FRAME_LENGTH_BYTES + 1U, DSTAR_NULL_SLOW_DATA_BYTES, DSTAR_DATA_FRAME_LENGTH_BYTES); + ::memcpy(m_lastFrame + DSTAR_VOICE_FRAME_LENGTH_BYTES + 1U, DSTAR_nullptr_SLOW_DATA_BYTES, DSTAR_DATA_FRAME_LENGTH_BYTES); writeQueueDataNet(m_lastFrame); } } else { m_lastFrameValid = false; if (n == 0U) - writeQueueDataNet(DSTAR_NULL_FRAME_SYNC_BYTES); + writeQueueDataNet(DSTAR_nullptr_FRAME_SYNC_BYTES); else - writeQueueDataNet(DSTAR_NULL_FRAME_DATA_BYTES); + writeQueueDataNet(DSTAR_nullptr_FRAME_DATA_BYTES); } m_netN = n; @@ -1025,7 +1114,7 @@ void CDStarControl::insertSilence(unsigned int count) void CDStarControl::blankDTMF(unsigned char* data) const { - assert(data != NULL); + assert(data != nullptr); // DTMF begins with these byte values if ((data[0] & DSTAR_DTMF_MASK[0]) == DSTAR_DTMF_SIG[0] && (data[1] & DSTAR_DTMF_MASK[1]) == DSTAR_DTMF_SIG[1] && @@ -1033,7 +1122,7 @@ void CDStarControl::blankDTMF(unsigned char* data) const (data[4] & DSTAR_DTMF_MASK[4]) == DSTAR_DTMF_SIG[4] && (data[5] & DSTAR_DTMF_MASK[5]) == DSTAR_DTMF_SIG[5] && (data[6] & DSTAR_DTMF_MASK[6]) == DSTAR_DTMF_SIG[6] && (data[7] & DSTAR_DTMF_MASK[7]) == DSTAR_DTMF_SIG[7] && (data[8] & DSTAR_DTMF_MASK[8]) == DSTAR_DTMF_SIG[8]) - ::memcpy(data, DSTAR_NULL_AMBE_DATA_BYTES, DSTAR_VOICE_FRAME_LENGTH_BYTES); + ::memcpy(data, DSTAR_nullptr_AMBE_DATA_BYTES, DSTAR_VOICE_FRAME_LENGTH_BYTES); } void CDStarControl::sendAck() @@ -1059,16 +1148,16 @@ void CDStarControl::sendAck() writeQueueHeaderRF(data); - writeQueueDataRF(DSTAR_NULL_FRAME_SYNC_BYTES); + writeQueueDataRF(DSTAR_nullptr_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) + if (m_network != nullptr) 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%% %ddBm ", reflector, float(m_rfErrs * 100U) / float(m_rfBits), m_aveRSSI / int(m_rssiCountTotal)); } else { @@ -1097,12 +1186,12 @@ void CDStarControl::sendAck() else ::sprintf(signalText, "S%d", 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)); @@ -1110,7 +1199,7 @@ void CDStarControl::sendAck() m_rfSlowData.setText(text); - ::memcpy(data, DSTAR_NULL_FRAME_DATA_BYTES, DSTAR_FRAME_LENGTH_BYTES + 1U); + ::memcpy(data, DSTAR_nullptr_FRAME_DATA_BYTES, DSTAR_FRAME_LENGTH_BYTES + 1U); for (unsigned int i = 0U; i < 19U; i++) { m_rfSlowData.getSlowData(data + 1U + DSTAR_VOICE_FRAME_LENGTH_BYTES); @@ -1138,16 +1227,16 @@ void CDStarControl::sendError() writeQueueHeaderRF(data); - writeQueueDataRF(DSTAR_NULL_FRAME_SYNC_BYTES); + writeQueueDataRF(DSTAR_nullptr_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) + if (m_network != nullptr) 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%% %ddBm ", reflector, float(m_rfErrs * 100U) / float(m_rfBits), m_aveRSSI / int(m_rssiCountTotal)); } else { @@ -1176,12 +1265,12 @@ void CDStarControl::sendError() else ::sprintf(signalText, "S%d", 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)); @@ -1189,7 +1278,7 @@ void CDStarControl::sendError() m_rfSlowData.setText(text); - ::memcpy(data, DSTAR_NULL_FRAME_DATA_BYTES, DSTAR_FRAME_LENGTH_BYTES + 1U); + ::memcpy(data, DSTAR_nullptr_FRAME_DATA_BYTES, DSTAR_FRAME_LENGTH_BYTES + 1U); for (unsigned int i = 0U; i < 19U; i++) { m_rfSlowData.getSlowData(data + 1U + DSTAR_VOICE_FRAME_LENGTH_BYTES); @@ -1201,7 +1290,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) @@ -1210,12 +1299,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; diff --git a/DStarControl.h b/DStarControl.h index f1e6ade..35f99a8 100644 --- a/DStarControl.h +++ b/DStarControl.h @@ -58,7 +58,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 m_blackList; diff --git a/DStarDefines.h b/DStarDefines.h index 6ac7f06..83b9d70 100644 --- a/DStarDefines.h +++ b/DStarDefines.h @@ -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 @@ -27,16 +27,16 @@ const unsigned int DSTAR_FRAME_LENGTH_BYTES = 12U; const unsigned char DSTAR_END_PATTERN_BYTES[] = { TAG_EOT, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0xC8, 0x7A }; const unsigned int DSTAR_END_PATTERN_LENGTH_BYTES = 6U; -const unsigned char DSTAR_NULL_AMBE_DATA_BYTES[] = { 0x9E, 0x8D, 0x32, 0x88, 0x26, 0x1A, 0x3F, 0x61, 0xE8 }; -// DSTAR_NULL_AMBE_DATA_BYTES_SCRAMBLED is DSTAR_NULL_AMBE_DATA_BYTES XORed with DSTAR_SCRAMBLER_BYTES. -const unsigned char DSTAR_NULL_AMBE_DATA_BYTES_SCRAMBLED[] = { 0xEEU, 0xC2U, 0xA1U, 0xC8U, 0x42U, 0x6EU, 0x52U, 0x51U, 0xC3U }; +const unsigned char DSTAR_nullptr_AMBE_DATA_BYTES[] = { 0x9E, 0x8D, 0x32, 0x88, 0x26, 0x1A, 0x3F, 0x61, 0xE8 }; +// DSTAR_nullptr_AMBE_DATA_BYTES_SCRAMBLED is DSTAR_nullptr_AMBE_DATA_BYTES XORed with DSTAR_SCRAMBLER_BYTES. +const unsigned char DSTAR_nullptr_AMBE_DATA_BYTES_SCRAMBLED[] = { 0xEEU, 0xC2U, 0xA1U, 0xC8U, 0x42U, 0x6EU, 0x52U, 0x51U, 0xC3U }; -const unsigned char DSTAR_NULL_SLOW_SYNC_BYTES[] = { 0x55, 0x2D, 0x16 }; +const unsigned char DSTAR_nullptr_SLOW_SYNC_BYTES[] = { 0x55, 0x2D, 0x16 }; // Note that these are already scrambled, 0x66 0x66 0x66 otherwise -const unsigned char DSTAR_NULL_SLOW_DATA_BYTES[] = { 0x16, 0x29, 0xF5 }; +const unsigned char DSTAR_nullptr_SLOW_DATA_BYTES[] = { 0x16, 0x29, 0xF5 }; -const unsigned char DSTAR_NULL_FRAME_SYNC_BYTES[] = { TAG_DATA, 0x9E, 0x8D, 0x32, 0x88, 0x26, 0x1A, 0x3F, 0x61, 0xE8, 0x55, 0x2D, 0x16 }; -const unsigned char DSTAR_NULL_FRAME_DATA_BYTES[] = { TAG_DATA, 0x9E, 0x8D, 0x32, 0x88, 0x26, 0x1A, 0x3F, 0x61, 0xE8, 0x16, 0x29, 0xF5 }; +const unsigned char DSTAR_nullptr_FRAME_SYNC_BYTES[] = { TAG_DATA, 0x9E, 0x8D, 0x32, 0x88, 0x26, 0x1A, 0x3F, 0x61, 0xE8, 0x55, 0x2D, 0x16 }; +const unsigned char DSTAR_nullptr_FRAME_DATA_BYTES[] = { TAG_DATA, 0x9E, 0x8D, 0x32, 0x88, 0x26, 0x1A, 0x3F, 0x61, 0xE8, 0x16, 0x29, 0xF5 }; const unsigned int DSTAR_VOICE_FRAME_LENGTH_BYTES = 9U; const unsigned int DSTAR_DATA_FRAME_LENGTH_BYTES = 3U; @@ -44,14 +44,14 @@ const unsigned int DSTAR_DATA_FRAME_LENGTH_BYTES = 3U; const unsigned int DSTAR_LONG_CALLSIGN_LENGTH = 8U; const unsigned int DSTAR_SHORT_CALLSIGN_LENGTH = 4U; -const unsigned char DSTAR_SLOW_DATA_TYPE_MASK = 0xF0U; -const unsigned char DSTAR_SLOW_DATA_TYPE_GPSDATA = 0x30U; -const unsigned char DSTAR_SLOW_DATA_TYPE_TEXT = 0x40U; -const unsigned char DSTAR_SLOW_DATA_TYPE_HEADER = 0x50U; -const unsigned char DSTAR_SLOW_DATA_TYPE_FASTDATA01 = 0x80U; -const unsigned char DSTAR_SLOW_DATA_TYPE_FASTDATA16 = 0x90U; -const unsigned char DSTAR_SLOW_DATA_TYPE_SQUELCH = 0xC0U; -const unsigned char DSTAR_SLOW_DATA_LENGTH_MASK = 0x0FU; +const unsigned char DSTAR_SLOW_DATA_TYPE_MASK = 0xF0U; +const unsigned char DSTAR_SLOW_DATA_TYPE_GPSDATA = 0x30U; +const unsigned char DSTAR_SLOW_DATA_TYPE_TEXT = 0x40U; +const unsigned char DSTAR_SLOW_DATA_TYPE_HEADER = 0x50U; +const unsigned char DSTAR_SLOW_DATA_TYPE_FASTDATA_END = 0x80U; +const unsigned char DSTAR_SLOW_DATA_TYPE_FASTDATA_BEGIN = 0x90U; +const unsigned char DSTAR_SLOW_DATA_TYPE_SQUELCH = 0xC0U; +const unsigned char DSTAR_SLOW_DATA_LENGTH_MASK = 0x0FU; // Data Frames are always scrambled using the first three bytes of // DSTAR_SCRAMBLER_BYTES, and Voice Frames are scrambled with all nine @@ -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 diff --git a/DStarHeader.cpp b/DStarHeader.cpp index b882501..2eacc4e 100644 --- a/DStarHeader.cpp +++ b/DStarHeader.cpp @@ -1,5 +1,5 @@ /* -* Copyright (C) 2016,2023 by Jonathan Naylor G4KLX +* Copyright (C) 2016,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,9 +27,9 @@ #include CDStarHeader::CDStarHeader(const unsigned char* header) : -m_header(NULL) +m_header(nullptr) { - assert(header != NULL); + assert(header != nullptr); m_header = new unsigned char[DSTAR_HEADER_LENGTH_BYTES]; @@ -37,7 +37,7 @@ m_header(NULL) } CDStarHeader::CDStarHeader() : -m_header(NULL) +m_header(nullptr) { m_header = new unsigned char[DSTAR_HEADER_LENGTH_BYTES]; @@ -89,77 +89,77 @@ void CDStarHeader::setUnavailable(bool on) void CDStarHeader::getMyCall1(unsigned char* call1) const { - assert(call1 != NULL); + assert(call1 != nullptr); ::memcpy(call1, m_header + 27U, DSTAR_LONG_CALLSIGN_LENGTH); } void CDStarHeader::getMyCall2(unsigned char* call2) const { - assert(call2 != NULL); + assert(call2 != nullptr); ::memcpy(call2, m_header + 35U, DSTAR_SHORT_CALLSIGN_LENGTH); } void CDStarHeader::setMyCall1(const unsigned char* call1) { - assert(call1 != NULL); + assert(call1 != nullptr); ::memcpy(m_header + 27U, call1, DSTAR_LONG_CALLSIGN_LENGTH); } void CDStarHeader::setMyCall2(const unsigned char* call2) { - assert(call2 != NULL); + assert(call2 != nullptr); ::memcpy(m_header + 35U, call2, DSTAR_SHORT_CALLSIGN_LENGTH); } void CDStarHeader::getRPTCall1(unsigned char* call1) const { - assert(call1 != NULL); + assert(call1 != nullptr); ::memcpy(call1, m_header + 11U, DSTAR_LONG_CALLSIGN_LENGTH); } void CDStarHeader::getRPTCall2(unsigned char* call2) const { - assert(call2 != NULL); + assert(call2 != nullptr); ::memcpy(call2, m_header + 3U, DSTAR_LONG_CALLSIGN_LENGTH); } void CDStarHeader::setRPTCall1(const unsigned char* call1) { - assert(call1 != NULL); + assert(call1 != nullptr); ::memcpy(m_header + 11U, call1, DSTAR_LONG_CALLSIGN_LENGTH); } void CDStarHeader::setRPTCall2(const unsigned char* call2) { - assert(call2 != NULL); + assert(call2 != nullptr); ::memcpy(m_header + 3U, call2, DSTAR_LONG_CALLSIGN_LENGTH); } void CDStarHeader::getYourCall(unsigned char* call) const { - assert(call != NULL); + assert(call != nullptr); ::memcpy(call, m_header + 19U, DSTAR_LONG_CALLSIGN_LENGTH); } void CDStarHeader::setYourCall(const unsigned char* call) { - assert(call != NULL); + assert(call != nullptr); ::memcpy(m_header + 19U, call, DSTAR_LONG_CALLSIGN_LENGTH); } void CDStarHeader::get(unsigned char* header) const { - assert(header != NULL); + assert(header != nullptr); ::memcpy(header, m_header, DSTAR_HEADER_LENGTH_BYTES); diff --git a/DStarNetwork.cpp b/DStarNetwork.cpp index 165e5fb..7a0acff 100644 --- a/DStarNetwork.cpp +++ b/DStarNetwork.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2009-2014,2016,2019,2020,2021,2023,2024 by Jonathan Naylor G4KLX + * Copyright (C) 2009-2014,2016,2019,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 @@ -45,8 +45,8 @@ m_outSeq(0U), m_inId(0U), m_buffer(1000U, "D-Star Network"), m_pollTimer(1000U, 60U), -m_linkStatus(LS_NONE), -m_linkReflector(NULL), +m_linkStatus(LINK_STATUS::NONE), +m_linkReflector(nullptr), m_random() { if (CUDPSocket::lookup(gatewayAddress, gatewayPort, m_addr, m_addrLen) != 0) @@ -81,7 +81,7 @@ bool CDStarNetwork::open() bool CDStarNetwork::writeHeader(const unsigned char* header, unsigned int length, bool busy) { - assert(header != NULL); + assert(header != nullptr); unsigned char buffer[50U]; @@ -119,7 +119,7 @@ bool CDStarNetwork::writeHeader(const unsigned char* header, unsigned int length bool CDStarNetwork::writeData(const unsigned char* data, unsigned int length, unsigned int errors, bool end, bool busy) { - assert(data != NULL); + assert(data != nullptr); unsigned char buffer[30U]; @@ -157,7 +157,7 @@ bool CDStarNetwork::writeData(const unsigned char* data, unsigned int length, un bool CDStarNetwork::writePoll(const char* text) { - assert(text != NULL); + assert(text != nullptr); unsigned char buffer[40U]; @@ -168,7 +168,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); @@ -287,7 +287,7 @@ void CDStarNetwork::clock(unsigned int ms) unsigned int CDStarNetwork::read(unsigned char* data, unsigned int length) { - assert(data != NULL); + assert(data != nullptr); if (m_buffer.isEmpty()) return 0U; @@ -342,7 +342,7 @@ void CDStarNetwork::enable(bool enabled) void CDStarNetwork::getStatus(LINK_STATUS& status, unsigned char* reflector) { - assert(reflector != NULL); + assert(reflector != nullptr); status = m_linkStatus; diff --git a/DStarSlowData.cpp b/DStarSlowData.cpp index 17e297d..5a64ee5 100644 --- a/DStarSlowData.cpp +++ b/DStarSlowData.cpp @@ -1,5 +1,5 @@ /* -* Copyright (C) 2016,2023 by Jonathan Naylor G4KLX +* Copyright (C) 2016,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 @@ -29,13 +29,14 @@ #include CDStarSlowData::CDStarSlowData() : -m_header(NULL), +m_header(nullptr), m_ptr(0U), -m_buffer(NULL), -m_text(NULL), +m_buffer(nullptr), +m_text(nullptr), m_textPtr(0U), m_textBits(0x00U), -m_state(SDD_FIRST) +m_type(0x00U), +m_complete(false) { m_header = new unsigned char[50U]; // DSTAR_HEADER_LENGTH_BYTES m_buffer = new unsigned char[DSTAR_DATA_FRAME_LENGTH_BYTES * 2U]; @@ -49,31 +50,40 @@ CDStarSlowData::~CDStarSlowData() delete[] m_text; } -CDStarHeader* CDStarSlowData::addHeader(const unsigned char* data) +void CDStarSlowData::peakSlowData(const unsigned char* data, unsigned int n) { - assert(data != NULL); + assert(data != nullptr); - switch (m_state) { - case SDD_FIRST: + if ((n % 2U) == 0U) { + m_type = data[9U] ^ DSTAR_SCRAMBLER_BYTES[0U]; + m_complete = false; + } else { + m_complete = true; + } +} + +CDStarHeader* CDStarSlowData::addHeader(const unsigned char* data, unsigned int n) +{ + assert(data != nullptr); + + if ((n % 2U) == 0U) { + m_type = data[9U] ^ DSTAR_SCRAMBLER_BYTES[0U]; m_buffer[0U] = data[9U] ^ DSTAR_SCRAMBLER_BYTES[0U]; m_buffer[1U] = data[10U] ^ DSTAR_SCRAMBLER_BYTES[1U]; m_buffer[2U] = data[11U] ^ DSTAR_SCRAMBLER_BYTES[2U]; - m_state = SDD_SECOND; - return NULL; - - case SDD_SECOND: + m_complete = false; + } else { m_buffer[3U] = data[9U] ^ DSTAR_SCRAMBLER_BYTES[0U]; m_buffer[4U] = data[10U] ^ DSTAR_SCRAMBLER_BYTES[1U]; m_buffer[5U] = data[11U] ^ DSTAR_SCRAMBLER_BYTES[2U]; - m_state = SDD_FIRST; - break; + m_complete = true; } if ((m_buffer[0U] & DSTAR_SLOW_DATA_TYPE_MASK) != DSTAR_SLOW_DATA_TYPE_HEADER) - return NULL; + return nullptr; if (m_ptr >= 45U) - return NULL; + return nullptr; ::memcpy(m_header + m_ptr, m_buffer + 1U, 5U); m_ptr += 5U; @@ -91,30 +101,27 @@ CDStarHeader* CDStarSlowData::addHeader(const unsigned char* data) if (!ret) { if (m_ptr == 45U) LogMessage("D-Star, invalid slow data header"); - return NULL; + return nullptr; } return new CDStarHeader(m_header); } -const unsigned char* CDStarSlowData::addText(const unsigned char* data) +const unsigned char* CDStarSlowData::addText(const unsigned char* data, unsigned int n) { - assert(data != NULL); + assert(data != nullptr); - switch (m_state) { - case SDD_FIRST: + if ((n % 2U) == 0U) { + m_type = data[9U] ^ DSTAR_SCRAMBLER_BYTES[0U]; m_buffer[0U] = data[9U] ^ DSTAR_SCRAMBLER_BYTES[0U]; m_buffer[1U] = data[10U] ^ DSTAR_SCRAMBLER_BYTES[1U]; m_buffer[2U] = data[11U] ^ DSTAR_SCRAMBLER_BYTES[2U]; - m_state = SDD_SECOND; - return NULL; - - case SDD_SECOND: + m_complete = false; + } else { m_buffer[3U] = data[9U] ^ DSTAR_SCRAMBLER_BYTES[0U]; m_buffer[4U] = data[10U] ^ DSTAR_SCRAMBLER_BYTES[1U]; m_buffer[5U] = data[11U] ^ DSTAR_SCRAMBLER_BYTES[2U]; - m_state = SDD_FIRST; - break; + m_complete = true; } switch (m_buffer[0U]) { @@ -156,13 +163,13 @@ const unsigned char* CDStarSlowData::addText(const unsigned char* data) m_textBits |= 0x08U; break; default: - return NULL; + return nullptr; } if (m_textBits != 0x0FU) - return NULL; + return nullptr; - CUtils::dump(1U, "D-STar slow data text", m_text, 20U); + CUtils::dump(1U, "D-Star slow data text", m_text, 20U); m_textBits = 0x00U; @@ -174,20 +181,22 @@ void CDStarSlowData::start() ::memset(m_header, 0x00U, DSTAR_HEADER_LENGTH_BYTES); m_ptr = 0U; - m_state = SDD_FIRST; + m_type = 0x00U; + m_complete = false; m_textBits = 0x00U; } void CDStarSlowData::reset() { m_ptr = 0U; - m_state = SDD_FIRST; + m_type = 0x00U; + m_complete = false; m_textBits = 0x00U; } void CDStarSlowData::setText(const char* text) { - assert(text != NULL); + assert(text != nullptr); m_text[0U] = DSTAR_SLOW_DATA_TYPE_TEXT | 0U; m_text[1U] = text[0U]; @@ -223,7 +232,7 @@ void CDStarSlowData::setText(const char* text) void CDStarSlowData::getSlowData(unsigned char* data) { - assert(data != NULL); + assert(data != nullptr); if (m_textPtr < 24U) { data[0U] = m_text[m_textPtr++] ^ DSTAR_SCRAMBLER_BYTES[0U]; @@ -236,5 +245,15 @@ void CDStarSlowData::getSlowData(unsigned char* data) } } +unsigned char CDStarSlowData::getType() const +{ + return m_type & DSTAR_SLOW_DATA_TYPE_MASK; +} + +bool CDStarSlowData::isComplete() const +{ + return m_complete; +} + #endif diff --git a/DStarSlowData.h b/DStarSlowData.h index 3e7dd58..666aeb1 100644 --- a/DStarSlowData.h +++ b/DStarSlowData.h @@ -1,5 +1,5 @@ /* -* Copyright (C) 2016,2023 by Jonathan Naylor G4KLX +* Copyright (C) 2016,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 @@ -29,9 +29,14 @@ public: CDStarSlowData(); ~CDStarSlowData(); - CDStarHeader* addHeader(const unsigned char* data); + void peakSlowData(const unsigned char* data, unsigned int n); - const unsigned char* addText(const unsigned char* data); + CDStarHeader* addHeader(const unsigned char* data, unsigned int n); + + const unsigned char* addText(const unsigned char* data, unsigned int n); + + unsigned char getType() const; + bool isComplete() const; void start(); void reset(); @@ -46,13 +51,8 @@ private: unsigned char* m_text; unsigned int m_textPtr; unsigned char m_textBits; - - enum SDD_STATE { - SDD_FIRST, - SDD_SECOND - }; - - SDD_STATE m_state; + unsigned char m_type; + bool m_complete; }; #endif diff --git a/Defines.h b/Defines.h index c0776af..760263f 100644 --- a/Defines.h +++ b/Defines.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2015,2016,2017,2018,2020,2021,2023 by Jonathan Naylor G4KLX + * Copyright (C) 2015,2016,2017,2018,2020,2021,2023,2025 by Jonathan Naylor G4KLX * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -54,56 +54,56 @@ const unsigned char TAG_RSSI = 0x04U; 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 diff --git a/FMControl.cpp b/FMControl.cpp index 9a74c5a..7848bb0 100644 --- a/FMControl.cpp +++ b/FMControl.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2020,2021,2023 by Jonathan Naylor G4KLX + * Copyright (C) 2020,2021,2023,2025 by Jonathan Naylor G4KLX * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -52,11 +52,11 @@ m_deEmphasisOn(deEmphasisOn), m_rssiMapper(rssiMapper), m_enabled(false), m_incomingRFAudio(1600U, "Incoming RF FM Audio"), -m_preEmphasis(NULL), -m_deEmphasis(NULL), -m_filterStage1(NULL), -m_filterStage2(NULL), -m_filterStage3(NULL) +m_preEmphasis(nullptr), +m_deEmphasis(nullptr), +m_filterStage1(nullptr), +m_filterStage2(nullptr), +m_filterStage3(nullptr) { assert(txAudioGain > 0.0F); assert(rxAudioGain > 0.0F); @@ -83,8 +83,8 @@ CFMControl::~CFMControl() bool CFMControl::writeModem(const unsigned char* data, unsigned int length) { - assert(data != NULL); - assert(length > 0U); + assert(data != nullptr); + assert(length > 0U); if (data[0U] == TAG_HEADER) { switch (data[1U]) { @@ -179,11 +179,11 @@ bool CFMControl::writeModem(const unsigned char* data, unsigned int length) unsigned int CFMControl::readModem(unsigned char* data, unsigned int space) { - assert(data != NULL); - assert(space > 0U); + assert(data != nullptr); + assert(space > 0U); - if (m_network == NULL) - return 0U; + if (m_network == nullptr) + return 0U; if (space > 240U) // 160 samples 12-bit space = 240U; // 160 samples 12-bit diff --git a/FMNetwork.cpp b/FMNetwork.cpp index 792903d..523f3e7 100644 --- a/FMNetwork.cpp +++ b/FMNetwork.cpp @@ -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 @@ -80,7 +80,7 @@ bool CFMNetwork::open() bool CFMNetwork::writeData(const float* data, unsigned int nSamples) { - assert(data != NULL); + assert(data != nullptr); assert(nSamples > 0U); if (m_seqNo == 0U) { @@ -210,7 +210,7 @@ void CFMNetwork::clock(unsigned int ms) unsigned int CFMNetwork::readData(float* out, unsigned int nOut) { - assert(out != NULL); + assert(out != nullptr); assert(nOut > 0U); unsigned int bytes = m_buffer.dataSize() / sizeof(unsigned short); diff --git a/FMNetwork.h b/FMNetwork.h index ce9e3c7..98c0dad 100644 --- a/FMNetwork.h +++ b/FMNetwork.h @@ -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 diff --git a/Golay2087.cpp b/Golay2087.cpp index 4be5771..a08d0d1 100644 --- a/Golay2087.cpp +++ b/Golay2087.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2015,2016,2023 by Jonathan Naylor G4KLX + * Copyright (C) 2015,2016,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 @@ -239,7 +239,7 @@ unsigned int CGolay2087::getSyndrome1987(unsigned int pattern) unsigned char CGolay2087::decode(const unsigned char* data) { - assert(data != NULL); + assert(data != nullptr); unsigned int code = (data[0U] << 11) + (data[1U] << 3) + (data[2U] >> 5); unsigned int syndrome = getSyndrome1987(code); @@ -253,7 +253,7 @@ unsigned char CGolay2087::decode(const unsigned char* data) void CGolay2087::encode(unsigned char* data) { - assert(data != NULL); + assert(data != nullptr); unsigned int value = data[0U]; diff --git a/Golay24128.cpp b/Golay24128.cpp index 22cef65..b414e05 100644 --- a/Golay24128.cpp +++ b/Golay24128.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2010,2016,2021 by Jonathan Naylor G4KLX + * Copyright (C) 2010,2016,2021,2025 by Jonathan Naylor G4KLX * Copyright (C) 2002 by Robert H. Morelos-Zaragoza. All rights reserved. */ @@ -1106,7 +1106,7 @@ bool CGolay24128::decode24128(unsigned int in, unsigned int& out) bool CGolay24128::decode24128(unsigned char* in, unsigned int& out) { - assert(in != NULL); + assert(in != nullptr); unsigned int code = (in[0U] << 16) | (in[1U] << 8) | (in[2U] << 0); diff --git a/Hamming.cpp b/Hamming.cpp index 166e012..a0a6415 100644 --- a/Hamming.cpp +++ b/Hamming.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2015,2016 by Jonathan Naylor G4KLX + * Copyright (C) 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 @@ -24,7 +24,7 @@ // Hamming (15,11,3) check a boolean data array bool CHamming::decode15113_1(bool* d) { - assert(d != NULL); + assert(d != nullptr); // Calculate the parity it should have bool c0 = d[0] ^ d[1] ^ d[2] ^ d[3] ^ d[4] ^ d[5] ^ d[6]; @@ -66,7 +66,7 @@ bool CHamming::decode15113_1(bool* d) void CHamming::encode15113_1(bool* d) { - assert(d != NULL); + assert(d != nullptr); // Calculate the checksum this row should have d[11] = d[0] ^ d[1] ^ d[2] ^ d[3] ^ d[4] ^ d[5] ^ d[6]; @@ -78,7 +78,7 @@ void CHamming::encode15113_1(bool* d) // Hamming (15,11,3) check a boolean data array bool CHamming::decode15113_2(bool* d) { - assert(d != NULL); + assert(d != nullptr); // Calculate the checksum this row should have bool c0 = d[0] ^ d[1] ^ d[2] ^ d[3] ^ d[5] ^ d[7] ^ d[8]; @@ -119,7 +119,7 @@ bool CHamming::decode15113_2(bool* d) void CHamming::encode15113_2(bool* d) { - assert(d != NULL); + assert(d != nullptr); // Calculate the checksum this row should have d[11] = d[0] ^ d[1] ^ d[2] ^ d[3] ^ d[5] ^ d[7] ^ d[8]; @@ -131,7 +131,7 @@ void CHamming::encode15113_2(bool* d) // Hamming (13,9,3) check a boolean data array bool CHamming::decode1393(bool* d) { - assert(d != NULL); + assert(d != nullptr); // Calculate the checksum this column should have bool c0 = d[0] ^ d[1] ^ d[3] ^ d[5] ^ d[6]; @@ -170,7 +170,7 @@ bool CHamming::decode1393(bool* d) void CHamming::encode1393(bool* d) { - assert(d != NULL); + assert(d != nullptr); // Calculate the checksum this column should have d[9] = d[0] ^ d[1] ^ d[3] ^ d[5] ^ d[6]; @@ -182,7 +182,7 @@ void CHamming::encode1393(bool* d) // Hamming (10,6,3) check a boolean data array bool CHamming::decode1063(bool* d) { - assert(d != NULL); + assert(d != nullptr); // Calculate the checksum this column should have bool c0 = d[0] ^ d[1] ^ d[2] ^ d[5]; @@ -218,7 +218,7 @@ bool CHamming::decode1063(bool* d) void CHamming::encode1063(bool* d) { - assert(d != NULL); + assert(d != nullptr); // Calculate the checksum this column should have d[6] = d[0] ^ d[1] ^ d[2] ^ d[5]; @@ -230,7 +230,7 @@ void CHamming::encode1063(bool* d) // A Hamming (16,11,4) Check bool CHamming::decode16114(bool* d) { - assert(d != NULL); + assert(d != nullptr); // Calculate the checksum this column should have bool c0 = d[0] ^ d[1] ^ d[2] ^ d[3] ^ d[5] ^ d[7] ^ d[8]; @@ -278,7 +278,7 @@ bool CHamming::decode16114(bool* d) void CHamming::encode16114(bool* d) { - assert(d != NULL); + assert(d != nullptr); d[11] = d[0] ^ d[1] ^ d[2] ^ d[3] ^ d[5] ^ d[7] ^ d[8]; d[12] = d[1] ^ d[2] ^ d[3] ^ d[4] ^ d[6] ^ d[8] ^ d[9]; @@ -290,7 +290,7 @@ void CHamming::encode16114(bool* d) // A Hamming (17,12,3) Check bool CHamming::decode17123(bool* d) { - assert(d != NULL); + assert(d != nullptr); // Calculate the checksum this column should have bool c0 = d[0] ^ d[1] ^ d[2] ^ d[3] ^ d[6] ^ d[7] ^ d[9]; @@ -339,7 +339,7 @@ bool CHamming::decode17123(bool* d) void CHamming::encode17123(bool* d) { - assert(d != NULL); + assert(d != nullptr); d[12] = d[0] ^ d[1] ^ d[2] ^ d[3] ^ d[6] ^ d[7] ^ d[9]; d[13] = d[0] ^ d[1] ^ d[2] ^ d[3] ^ d[4] ^ d[7] ^ d[8] ^ d[10]; diff --git a/Log.cpp b/Log.cpp index 4537544..d824af6 100644 --- a/Log.cpp +++ b/Log.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2015,2016,2020,2022,2023 by Jonathan Naylor G4KLX + * Copyright (C) 2015,2016,2020,2022,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 @@ -58,7 +58,7 @@ void LogFinalise() void Log(unsigned int level, const char* fmt, ...) { - assert(fmt != NULL); + assert(fmt != nullptr); char buffer[501U]; #if defined(_WIN32) || defined(_WIN64) @@ -68,7 +68,7 @@ void Log(unsigned int level, const char* fmt, ...) ::sprintf(buffer, "%c: %04u-%02u-%02u %02u:%02u:%02u.%03u ", LEVELS[level], st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond, st.wMilliseconds); #else struct timeval now; - ::gettimeofday(&now, NULL); + ::gettimeofday(&now, nullptr); struct tm* tm = ::gmtime(&now.tv_sec); @@ -78,7 +78,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); diff --git a/M17CRC.cpp b/M17CRC.cpp index 4bea5a8..bf80713 100644 --- a/M17CRC.cpp +++ b/M17CRC.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2020,2021,2023 by Jonathan Naylor G4KLX + * Copyright (C) 2020,2021,2023,2025 by Jonathan Naylor G4KLX * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -50,7 +50,7 @@ const uint16_t CRC16_TABLE[] = {0x0000U, 0x5935U, 0xB26AU, 0xEB5FU, 0x3DE1U, 0x6 bool CM17CRC::checkCRC16(const unsigned char* in, unsigned int nBytes) { - assert(in != NULL); + assert(in != nullptr); assert(nBytes > 2U); uint16_t crc = createCRC16(in, nBytes - 2U); @@ -64,7 +64,7 @@ bool CM17CRC::checkCRC16(const unsigned char* in, unsigned int nBytes) void CM17CRC::encodeCRC16(unsigned char* in, unsigned int nBytes) { - assert(in != NULL); + assert(in != nullptr); assert(nBytes > 2U); uint16_t crc = createCRC16(in, nBytes - 2U); @@ -75,7 +75,7 @@ void CM17CRC::encodeCRC16(unsigned char* in, unsigned int nBytes) uint16_t CM17CRC::createCRC16(const unsigned char* in, unsigned int nBytes) { - assert(in != NULL); + assert(in != nullptr); uint16_t crc = 0xFFFFU; diff --git a/M17Control.cpp b/M17Control.cpp index 3c36cbd..c9e0364 100644 --- a/M17Control.cpp +++ b/M17Control.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2020-2023 Jonathan Naylor, G4KLX + * Copyright (C) 2020-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 @@ -70,8 +70,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), @@ -90,8 +90,8 @@ m_netLSF(), m_netLSFn(0U), m_rfTextBits(0x00U), m_netTextBits(0x00U), -m_rfText(NULL), -m_netText(NULL), +m_rfText(nullptr), +m_netText(nullptr), m_rssiMapper(rssiMapper), m_rssi(0), m_maxRSSI(0), @@ -118,7 +118,7 @@ CM17Control::~CM17Control() bool CM17Control::writeModem(unsigned char* data, unsigned int len) { - assert(data != NULL); + assert(data != nullptr); if (!m_enabled) return false; @@ -137,18 +137,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; } @@ -179,7 +179,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(); @@ -226,18 +226,18 @@ bool CM17Control::writeModem(unsigned char* data, unsigned int len) 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); @@ -417,7 +417,7 @@ bool CM17Control::writeModem(unsigned char* data, unsigned int len) writeQueueRF(rfData); } - if (m_network != NULL && m_rfTimeoutTimer.isRunning() && !m_rfTimeoutTimer.hasExpired()) { + if (m_network != nullptr && m_rfTimeoutTimer.isRunning() && !m_rfTimeoutTimer.hasExpired()) { unsigned char netData[M17_LSF_LENGTH_BYTES + M17_FN_LENGTH_BYTES + M17_PAYLOAD_LENGTH_BYTES + M17_CRC_LENGTH_BYTES]; m_rfCurrentNetLSF.getNetwork(netData + 0U); @@ -455,7 +455,7 @@ bool CM17Control::writeModem(unsigned char* data, unsigned int len) writeQueueRF(rfData); } - if (m_network != NULL && m_rfTimeoutTimer.isRunning() && !m_rfTimeoutTimer.hasExpired()) { + if (m_network != nullptr && m_rfTimeoutTimer.isRunning() && !m_rfTimeoutTimer.hasExpired()) { unsigned char netData[M17_LSF_LENGTH_BYTES + M17_FN_LENGTH_BYTES + M17_PAYLOAD_LENGTH_BYTES + M17_CRC_LENGTH_BYTES]; m_rfCurrentNetLSF.getNetwork(netData + 0U); @@ -464,10 +464,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 { @@ -497,7 +497,7 @@ bool CM17Control::writeModem(unsigned char* data, unsigned int len) unsigned int CM17Control::readModem(unsigned char* data) { - assert(data != NULL); + assert(data != nullptr); if (m_queue.isEmpty()) return 0U; @@ -512,7 +512,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(); @@ -532,7 +532,7 @@ void CM17Control::writeEndRF() void CM17Control::writeEndNet() { - m_netState = RS_NET_IDLE; + m_netState = RPT_NET_STATE::IDLE; m_netTimeoutTimer.stop(); m_networkWatchdog.stop(); @@ -556,7 +556,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; } @@ -574,7 +574,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(); @@ -636,7 +636,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); @@ -855,13 +855,13 @@ void CM17Control::createRFLSF(bool addCallsign) void CM17Control::clock(unsigned int ms) { - if (m_network != NULL) + if (m_network != nullptr) writeNetwork(); 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()) { @@ -874,9 +874,9 @@ void CM17Control::clock(unsigned int ms) void CM17Control::writeQueueRF(const unsigned char *data) { - assert(data != NULL); + assert(data != nullptr); - if (m_netState != RS_NET_IDLE) + if (m_netState != RPT_NET_STATE::IDLE) return; if (m_rfTimeoutTimer.isRunning() && m_rfTimeoutTimer.hasExpired()) @@ -897,7 +897,7 @@ void CM17Control::writeQueueRF(const unsigned char *data) void CM17Control::writeQueueNet(const unsigned char *data) { - assert(data != NULL); + assert(data != nullptr); if (m_netTimeoutTimer.isRunning() && m_netTimeoutTimer.hasExpired()) return; @@ -917,8 +917,8 @@ void CM17Control::writeQueueNet(const unsigned char *data) void CM17Control::interleaver(const unsigned char* in, unsigned char* out) const { - assert(in != NULL); - assert(out != NULL); + assert(in != nullptr); + assert(out != nullptr); for (unsigned int i = 0U; i < (M17_FRAME_LENGTH_BITS - M17_SYNC_LENGTH_BITS); i++) { unsigned int n1 = i + M17_SYNC_LENGTH_BITS; @@ -930,8 +930,8 @@ void CM17Control::interleaver(const unsigned char* in, unsigned char* out) const void CM17Control::decorrelator(const unsigned char* in, unsigned char* out) const { - assert(in != NULL); - assert(out != NULL); + assert(in != nullptr); + assert(out != nullptr); for (unsigned int i = M17_SYNC_LENGTH_BYTES; i < M17_FRAME_LENGTH_BYTES; i++) { out[i] = in[i] ^ SCRAMBLER[i]; diff --git a/M17Convolution.cpp b/M17Convolution.cpp index 871d476..cb3f133 100644 --- a/M17Convolution.cpp +++ b/M17Convolution.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2020,2021,2023 by Jonathan Naylor G4KLX + * Copyright (C) 2020,2021,2023,2025 by Jonathan Naylor G4KLX * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -55,12 +55,12 @@ const uint32_t M = 4U; const unsigned int K = 5U; CM17Convolution::CM17Convolution() : -m_metrics1(NULL), -m_metrics2(NULL), -m_oldMetrics(NULL), -m_newMetrics(NULL), -m_decisions(NULL), -m_dp(NULL) +m_metrics1(nullptr), +m_metrics2(nullptr), +m_oldMetrics(nullptr), +m_newMetrics(nullptr), +m_decisions(nullptr), +m_dp(nullptr) { m_metrics1 = new uint16_t[20U]; m_metrics2 = new uint16_t[20U]; @@ -76,8 +76,8 @@ CM17Convolution::~CM17Convolution() void CM17Convolution::encodeLinkSetup(const unsigned char* in, unsigned char* out) const { - assert(in != NULL); - assert(out != NULL); + assert(in != nullptr); + assert(out != nullptr); unsigned char temp1[31U]; ::memset(temp1, 0x00U, 31U); @@ -101,8 +101,8 @@ void CM17Convolution::encodeLinkSetup(const unsigned char* in, unsigned char* ou void CM17Convolution::encodeData(const unsigned char* in, unsigned char* out) const { - assert(in != NULL); - assert(out != NULL); + assert(in != nullptr); + assert(out != nullptr); unsigned char temp1[19U]; ::memset(temp1, 0x00U, 19U); @@ -126,8 +126,8 @@ void CM17Convolution::encodeData(const unsigned char* in, unsigned char* out) co unsigned int CM17Convolution::decodeLinkSetup(const unsigned char* in, unsigned char* out) { - assert(in != NULL); - assert(out != NULL); + assert(in != nullptr); + assert(out != nullptr); uint8_t temp[500U]; ::memset(temp, 0x00U, 500U); @@ -159,8 +159,8 @@ unsigned int CM17Convolution::decodeLinkSetup(const unsigned char* in, unsigned unsigned int CM17Convolution::decodeData(const unsigned char* in, unsigned char* out) { - assert(in != NULL); - assert(out != NULL); + assert(in != nullptr); + assert(out != nullptr); uint8_t temp[300U]; ::memset(temp, 0x00U, 300U); @@ -233,7 +233,7 @@ void CM17Convolution::decode(uint8_t s0, uint8_t s1) unsigned int CM17Convolution::chainback(unsigned char* out, unsigned int nBits) { - assert(out != NULL); + assert(out != nullptr); uint32_t state = 0U; @@ -259,8 +259,8 @@ unsigned int CM17Convolution::chainback(unsigned char* out, unsigned int nBits) void CM17Convolution::encode(const unsigned char* in, unsigned char* out, unsigned int nBits) const { - assert(in != NULL); - assert(out != NULL); + assert(in != nullptr); + assert(out != nullptr); assert(nBits > 0U); uint8_t d1 = 0U, d2 = 0U, d3 = 0U, d4 = 0U; diff --git a/M17Defines.h b/M17Defines.h index 0543d8e..e96bd36 100644 --- a/M17Defines.h +++ b/M17Defines.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2020,2021 by Jonathan Naylor G4KLX + * Copyright (C) 2020,2021,2025 by Jonathan Naylor G4KLX * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -49,7 +49,7 @@ const unsigned int M17_LICH_FRAGMENT_FEC_LENGTH_BYTES = M17_LICH_FRAGMENT_FEC_LE const unsigned int M17_PAYLOAD_LENGTH_BITS = 128U; const unsigned int M17_PAYLOAD_LENGTH_BYTES = M17_PAYLOAD_LENGTH_BITS / 8U; -const unsigned char M17_NULL_NONCE[] = {0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U}; +const unsigned char M17_nullptr_NONCE[] = {0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U}; const unsigned int M17_META_LENGTH_BITS = 112U; const unsigned int M17_META_LENGTH_BYTES = M17_META_LENGTH_BITS / 8U; diff --git a/M17LSF.cpp b/M17LSF.cpp index 8dc5375..50607b0 100644 --- a/M17LSF.cpp +++ b/M17LSF.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2020,2021,2023 by Jonathan Naylor G4KLX + * Copyright (C) 2020,2021,2023,2025 by Jonathan Naylor G4KLX * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -27,7 +27,7 @@ #include CM17LSF::CM17LSF(const CM17LSF& lsf) : -m_lsf(NULL), +m_lsf(nullptr), m_valid(lsf.m_valid) { m_lsf = new unsigned char[M17_LSF_LENGTH_BYTES]; @@ -36,7 +36,7 @@ m_valid(lsf.m_valid) } CM17LSF::CM17LSF() : -m_lsf(NULL), +m_lsf(nullptr), m_valid(false) { m_lsf = new unsigned char[M17_LSF_LENGTH_BYTES]; @@ -51,14 +51,14 @@ CM17LSF::~CM17LSF() void CM17LSF::getNetwork(unsigned char* data) const { - assert(data != NULL); + assert(data != nullptr); ::memcpy(data, m_lsf, M17_LSF_LENGTH_BYTES); } void CM17LSF::setNetwork(const unsigned char* data) { - assert(data != NULL); + assert(data != nullptr); ::memcpy(m_lsf, data, M17_LSF_LENGTH_BYTES); @@ -151,14 +151,14 @@ void CM17LSF::setCAN(unsigned char can) void CM17LSF::getMeta(unsigned char* data) const { - assert(data != NULL); + assert(data != nullptr); ::memcpy(data, m_lsf + 14U, M17_META_LENGTH_BYTES); } void CM17LSF::setMeta(const unsigned char* data) { - assert(data != NULL); + assert(data != nullptr); ::memcpy(m_lsf + 14U, data, M17_META_LENGTH_BYTES); } @@ -177,7 +177,7 @@ bool CM17LSF::isValid() const void CM17LSF::getLinkSetup(unsigned char* data) const { - assert(data != NULL); + assert(data != nullptr); ::memcpy(data, m_lsf, M17_LSF_LENGTH_BYTES); @@ -186,7 +186,7 @@ void CM17LSF::getLinkSetup(unsigned char* data) const void CM17LSF::setLinkSetup(const unsigned char* data) { - assert(data != NULL); + assert(data != nullptr); ::memcpy(m_lsf, data, M17_LSF_LENGTH_BYTES); @@ -195,7 +195,7 @@ void CM17LSF::setLinkSetup(const unsigned char* data) void CM17LSF::getFragment(unsigned char* data, unsigned int n) const { - assert(data != NULL); + assert(data != nullptr); CM17CRC::encodeCRC16(m_lsf, M17_LSF_LENGTH_BYTES); @@ -204,7 +204,7 @@ void CM17LSF::getFragment(unsigned char* data, unsigned int n) const void CM17LSF::setFragment(const unsigned char* data, unsigned int n) { - assert(data != NULL); + assert(data != nullptr); ::memcpy(m_lsf + (n * M17_LSF_FRAGMENT_LENGTH_BYTES), data, M17_LSF_FRAGMENT_LENGTH_BYTES); diff --git a/M17Network.cpp b/M17Network.cpp index 4120e58..b62564f 100644 --- a/M17Network.cpp +++ b/M17Network.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2020,2021,2023 by Jonathan Naylor G4KLX + * Copyright (C) 2020,2021,2023,2025 by Jonathan Naylor G4KLX * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -80,7 +80,7 @@ bool CM17Network::write(const unsigned char* data) if (m_addrLen == 0U) return false; - assert(data != NULL); + assert(data != nullptr); unsigned char buffer[100U]; @@ -161,7 +161,7 @@ void CM17Network::clock(unsigned int ms) bool CM17Network::read(unsigned char* data) { - assert(data != NULL); + assert(data != nullptr); if (m_buffer.isEmpty()) return false; diff --git a/M17Utils.cpp b/M17Utils.cpp index 691d36d..ae84520 100644 --- a/M17Utils.cpp +++ b/M17Utils.cpp @@ -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 @@ -33,7 +33,7 @@ const unsigned char BIT_MASK_TABLE[] = { 0x80U, 0x40U, 0x20U, 0x10U, 0x08U, 0x04 void CM17Utils::encodeCallsign(const std::string& callsign, unsigned char* encoded) { - assert(encoded != NULL); + assert(encoded != nullptr); if (callsign == "ALL" || callsign == "ALL ") { encoded[0U] = 0xFFU; @@ -73,7 +73,7 @@ void CM17Utils::encodeCallsign(const std::string& callsign, unsigned char* encod void CM17Utils::decodeCallsign(const unsigned char* encoded, std::string& callsign) { - assert(encoded != NULL); + assert(encoded != nullptr); callsign.clear(); @@ -107,7 +107,7 @@ void CM17Utils::decodeCallsign(const unsigned char* encoded, std::string& callsi void CM17Utils::splitFragmentLICH(const unsigned char* data, unsigned int& frag1, unsigned int& frag2, unsigned int& frag3, unsigned int& frag4) { - assert(data != NULL); + assert(data != nullptr); frag1 = frag2 = frag3 = frag4 = 0x00U; @@ -143,7 +143,7 @@ void CM17Utils::splitFragmentLICH(const unsigned char* data, unsigned int& frag1 void CM17Utils::splitFragmentLICHFEC(const unsigned char* data, unsigned int& frag1, unsigned int& frag2, unsigned int& frag3, unsigned int& frag4) { - assert(data != NULL); + assert(data != nullptr); frag1 = frag2 = frag3 = frag4 = 0x00U; @@ -179,7 +179,7 @@ void CM17Utils::splitFragmentLICHFEC(const unsigned char* data, unsigned int& fr void CM17Utils::combineFragmentLICH(unsigned int frag1, unsigned int frag2, unsigned int frag3, unsigned int frag4, unsigned char* data) { - assert(data != NULL); + assert(data != nullptr); unsigned int offset = 0U; unsigned int MASK = 0x800U; @@ -209,7 +209,7 @@ void CM17Utils::combineFragmentLICH(unsigned int frag1, unsigned int frag2, unsi void CM17Utils::combineFragmentLICHFEC(unsigned int frag1, unsigned int frag2, unsigned int frag3, unsigned int frag4, unsigned char* data) { - assert(data != NULL); + assert(data != nullptr); unsigned int offset = 0U; unsigned int MASK = 0x800000U; diff --git a/MMDVMHost.cpp b/MMDVMHost.cpp index dbb3db6..30a705a 100644 --- a/MMDVMHost.cpp +++ b/MMDVMHost.cpp @@ -324,7 +324,7 @@ int CMMDVMHost::run() // If we are currently root... if (getuid() == 0) { struct passwd* user = ::getpwnam("mmdvm"); - if (user == NULL) { + if (user == nullptr) { ::fprintf(stderr, "Could not get the mmdvm user, exiting\n"); return -1; } @@ -539,7 +539,7 @@ int CMMDVMHost::run() sockaddr_storage transparentAddress; unsigned int transparentAddrLen; - CUDPSocket* transparentSocket = NULL; + CUDPSocket* transparentSocket = nullptr; unsigned int sendFrameType = 0U; if (m_conf.getTransparentEnabled()) { @@ -564,7 +564,7 @@ int CMMDVMHost::run() if (!ret) { LogWarning("Could not open the Transparent data socket, disabling"); delete transparentSocket; - transparentSocket = NULL; + transparentSocket = nullptr; sendFrameType=0; } m_modem->setTransparentDataParams(sendFrameType); @@ -634,7 +634,7 @@ int CMMDVMHost::run() std::vector 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(); @@ -643,7 +643,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"); @@ -679,7 +679,8 @@ 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) txHang = m_dmrRFModeHang; @@ -712,19 +713,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"); @@ -733,7 +737,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(); @@ -862,7 +866,7 @@ int CMMDVMHost::run() m_pocsag = new CPOCSAGControl(m_pocsagNetwork); - if (m_pocsagNetwork != NULL) + if (m_pocsagNetwork != nullptr) pocsagTimer.start(); } #endif @@ -924,7 +928,7 @@ int CMMDVMHost::run() #if defined(USE_DSTAR) len = m_modem->readDStarData(data); - if (m_dstar != NULL && len > 0U) { + if (m_dstar != nullptr && len > 0U) { if (m_mode == MODE_IDLE) { bool ret = m_dstar->writeModem(data, len); if (ret) { @@ -943,7 +947,7 @@ int CMMDVMHost::run() #if defined(USE_DMR) len = m_modem->readDMRData1(data); - if (m_dmr != NULL && len > 0U) { + if (m_dmr != nullptr && len > 0U) { if (m_mode == MODE_IDLE) { if (m_duplex) { bool ret = m_dmr->processWakeup(data); @@ -980,7 +984,7 @@ int CMMDVMHost::run() } len = m_modem->readDMRData2(data); - if (m_dmr != NULL && len > 0U) { + if (m_dmr != nullptr && len > 0U) { if (m_mode == MODE_IDLE) { if (m_duplex) { bool ret = m_dmr->processWakeup(data); @@ -1019,7 +1023,7 @@ int CMMDVMHost::run() #if defined(USE_YSF) len = m_modem->readYSFData(data); - if (m_ysf != NULL && len > 0U) { + if (m_ysf != nullptr && len > 0U) { if (m_mode == MODE_IDLE) { bool ret = m_ysf->writeModem(data, len); if (ret) { @@ -1038,7 +1042,7 @@ int CMMDVMHost::run() #if defined(USE_P25) len = m_modem->readP25Data(data); - if (m_p25 != NULL && len > 0U) { + if (m_p25 != nullptr && len > 0U) { if (m_mode == MODE_IDLE) { bool ret = m_p25->writeModem(data, len); if (ret) { @@ -1057,7 +1061,7 @@ int CMMDVMHost::run() #if defined(USE_NXDN) len = m_modem->readNXDNData(data); - if (m_nxdn != NULL && len > 0U) { + if (m_nxdn != nullptr && len > 0U) { if (m_mode == MODE_IDLE) { bool ret = m_nxdn->writeModem(data, len); if (ret) { @@ -1076,7 +1080,7 @@ int CMMDVMHost::run() #if defined(USE_M17) len = m_modem->readM17Data(data); - if (m_m17 != NULL && len > 0U) { + if (m_m17 != nullptr && len > 0U) { if (m_mode == MODE_IDLE) { bool ret = m_m17->writeModem(data, len); if (ret) { @@ -1095,7 +1099,7 @@ int CMMDVMHost::run() #if defined(USE_FM) len = m_modem->readFMData(data); - if (m_fm != NULL && len > 0U) { + if (m_fm != nullptr && len > 0U) { if (m_mode == MODE_IDLE) { bool ret = m_fm->writeModem(data, len); if (ret) { @@ -1114,7 +1118,7 @@ int CMMDVMHost::run() #if defined(USE_AX25) len = m_modem->readAX25Data(data); - if (m_ax25 != NULL && len > 0U) { + if (m_ax25 != nullptr && len > 0U) { if (m_mode == MODE_IDLE || m_mode == MODE_FM) { m_ax25->writeModem(data, len); } else if (m_mode != MODE_LOCKOUT) { @@ -1124,7 +1128,7 @@ int CMMDVMHost::run() #endif len = m_modem->readTransparentData(data); - if (transparentSocket != NULL && len > 0U) + if (transparentSocket != nullptr && len > 0U) transparentSocket->write(data, len, transparentAddress, transparentAddrLen); if (!m_fixedMode) { @@ -1344,7 +1348,7 @@ int CMMDVMHost::run() } #endif - if (transparentSocket != NULL) { + if (transparentSocket != nullptr) { sockaddr_storage address; unsigned int addrlen; len = transparentSocket->read(data, 200U, address, addrlen); @@ -1473,7 +1477,7 @@ int CMMDVMHost::run() #if defined(USE_DMR) 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()) { @@ -1486,8 +1490,8 @@ int CMMDVMHost::run() } } break; - case DMR_BEACONS_NETWORK: - if (m_dmrNetwork != NULL) { + case DMR_BEACONS::NETWORK: + if (m_dmrNetwork != nullptr) { bool beacon = m_dmrNetwork->wantsBeacon(); if (beacon) { if ((m_mode == MODE_IDLE || m_mode == MODE_DMR) && !m_modem->hasTX()) { @@ -1521,7 +1525,7 @@ int CMMDVMHost::run() #if defined(USE_POCSAG) pocsagTimer.clock(ms); if (pocsagTimer.isRunning() && pocsagTimer.hasExpired()) { - assert(m_pocsagNetwork != NULL); + assert(m_pocsagNetwork != nullptr); m_pocsagNetwork->enable(m_mode == MODE_IDLE || m_mode == MODE_POCSAG); pocsagTimer.start(); } @@ -1611,7 +1615,7 @@ int CMMDVMHost::run() } #endif - if (transparentSocket != NULL) { + if (transparentSocket != nullptr) { transparentSocket->close(); delete transparentSocket; } @@ -1833,7 +1837,7 @@ bool CMMDVMHost::createModem() m_modem = new CModem(m_duplex, rxInvert, txInvert, pttInvert, txDelay, dmrDelay, useCOSAsLockout, trace, debug); - IModemPort* port = NULL; + IModemPort* port = nullptr; if (protocol == "uart") port = new CUARTController(uartPort, uartSpeed, true); else if (protocol == "udp") @@ -1963,7 +1967,7 @@ bool CMMDVMHost::createModem() bool ret = m_modem->open(); if (!ret) { delete m_modem; - m_modem = NULL; + m_modem = nullptr; return false; } @@ -1992,7 +1996,7 @@ bool CMMDVMHost::createDStarNetwork() bool ret = m_dstarNetwork->open(); if (!ret) { delete m_dstarNetwork; - m_dstarNetwork = NULL; + m_dstarNetwork = nullptr; return false; } @@ -2045,7 +2049,7 @@ bool CMMDVMHost::createDMRNetwork() bool ret = m_dmrNetwork->open(); if (!ret) { delete m_dmrNetwork; - m_dmrNetwork = NULL; + m_dmrNetwork = nullptr; return false; } @@ -2077,7 +2081,7 @@ bool CMMDVMHost::createYSFNetwork() bool ret = m_ysfNetwork->open(); if (!ret) { delete m_ysfNetwork; - m_ysfNetwork = NULL; + m_ysfNetwork = nullptr; return false; } @@ -2109,7 +2113,7 @@ bool CMMDVMHost::createP25Network() bool ret = m_p25Network->open(); if (!ret) { delete m_p25Network; - m_p25Network = NULL; + m_p25Network = nullptr; return false; } @@ -2146,7 +2150,7 @@ bool CMMDVMHost::createNXDNNetwork() bool ret = m_nxdnNetwork->open(); if (!ret) { delete m_nxdnNetwork; - m_nxdnNetwork = NULL; + m_nxdnNetwork = nullptr; return false; } @@ -2177,7 +2181,7 @@ bool CMMDVMHost::createM17Network() bool ret = m_m17Network->open(); if (!ret) { delete m_m17Network; - m_m17Network = NULL; + m_m17Network = nullptr; return false; } @@ -2209,7 +2213,7 @@ bool CMMDVMHost::createPOCSAGNetwork() bool ret = m_pocsagNetwork->open(); if (!ret) { delete m_pocsagNetwork; - m_pocsagNetwork = NULL; + m_pocsagNetwork = nullptr; return false; } @@ -2250,7 +2254,7 @@ bool CMMDVMHost::createFMNetwork() bool ret = m_fmNetwork->open(); if (!ret) { delete m_fmNetwork; - m_fmNetwork = NULL; + m_fmNetwork = nullptr; return false; } @@ -2272,7 +2276,7 @@ bool CMMDVMHost::createAX25Network() bool ret = m_ax25Network->open(); if (!ret) { delete m_ax25Network; - m_ax25Network = NULL; + m_ax25Network = nullptr; return false; } @@ -2359,7 +2363,7 @@ void CMMDVMHost::setMode(unsigned char mode) switch (mode) { #if defined(USE_DSTAR) case MODE_DSTAR: - if (m_dstarNetwork != NULL) + if (m_dstarNetwork != nullptr) m_dstarNetwork->enable(true); #if defined(USE_DMR) if (m_dmrNetwork != NULL) @@ -3266,7 +3270,7 @@ void CMMDVMHost::createLockFile(const char* mode) const { if (m_lockFileEnabled) { FILE* fp = ::fopen(m_lockFileName.c_str(), "wt"); - if (fp != NULL) { + if (fp != nullptr) { ::fprintf(fp, "%s\n", mode); ::fclose(fp); } @@ -3281,16 +3285,16 @@ void CMMDVMHost::removeLockFile() const void CMMDVMHost::remoteControl(const std::string& commandString) { - if (m_remoteControl == NULL) + if (m_remoteControl == nullptr) return; REMOTE_COMMAND command = m_remoteControl->getCommand(commandString); 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; @@ -3340,7 +3344,7 @@ void CMMDVMHost::remoteControl(const std::string& commandString) case RCD_ENABLE_DSTAR: if (m_dstar != NULL && !m_dstarEnabled) processEnableCommand(m_dstarEnabled, true); - if (m_dstarNetwork != NULL) + if (m_dstarNetwork != nullptr) m_dstarNetwork->enable(true); break; #endif @@ -3348,7 +3352,7 @@ void CMMDVMHost::remoteControl(const std::string& commandString) case RCD_ENABLE_DMR: if (m_dmr != NULL && !m_dmrEnabled) processEnableCommand(m_dmrEnabled, true); - if (m_dmrNetwork != NULL) + if (m_dmrNetwork != nullptr) m_dmrNetwork->enable(true); break; #endif @@ -3356,7 +3360,7 @@ void CMMDVMHost::remoteControl(const std::string& commandString) case RCD_ENABLE_YSF: if (m_ysf != NULL && !m_ysfEnabled) processEnableCommand(m_ysfEnabled, true); - if (m_ysfNetwork != NULL) + if (m_ysfNetwork != nullptr) m_ysfNetwork->enable(true); break; #endif @@ -3364,7 +3368,7 @@ void CMMDVMHost::remoteControl(const std::string& commandString) case RCD_ENABLE_P25: if (m_p25 != NULL && !m_p25Enabled) processEnableCommand(m_p25Enabled, true); - if (m_p25Network != NULL) + if (m_p25Network != nullptr) m_p25Network->enable(true); break; #endif @@ -3372,7 +3376,7 @@ void CMMDVMHost::remoteControl(const std::string& commandString) case RCD_ENABLE_NXDN: if (m_nxdn != NULL && !m_nxdnEnabled) processEnableCommand(m_nxdnEnabled, true); - if (m_nxdnNetwork != NULL) + if (m_nxdnNetwork != nullptr) m_nxdnNetwork->enable(true); break; #endif @@ -3380,7 +3384,7 @@ void CMMDVMHost::remoteControl(const std::string& commandString) case RCD_ENABLE_M17: if (m_m17 != NULL && !m_m17Enabled) processEnableCommand(m_m17Enabled, true); - if (m_m17Network != NULL) + if (m_m17Network != nullptr) m_m17Network->enable(true); break; #endif @@ -3400,7 +3404,7 @@ void CMMDVMHost::remoteControl(const std::string& commandString) case RCD_DISABLE_DSTAR: if (m_dstar != NULL && m_dstarEnabled) processEnableCommand(m_dstarEnabled, false); - if (m_dstarNetwork != NULL) + if (m_dstarNetwork != nullptr) m_dstarNetwork->enable(false); break; #endif @@ -3408,7 +3412,7 @@ void CMMDVMHost::remoteControl(const std::string& commandString) case RCD_DISABLE_DMR: if (m_dmr != NULL && m_dmrEnabled) processEnableCommand(m_dmrEnabled, false); - if (m_dmrNetwork != NULL) + if (m_dmrNetwork != nullptr) m_dmrNetwork->enable(false); break; #endif @@ -3416,7 +3420,7 @@ void CMMDVMHost::remoteControl(const std::string& commandString) case RCD_DISABLE_YSF: if (m_ysf != NULL && m_ysfEnabled) processEnableCommand(m_ysfEnabled, false); - if (m_ysfNetwork != NULL) + if (m_ysfNetwork != nullptr) m_ysfNetwork->enable(false); break; #endif @@ -3424,7 +3428,7 @@ void CMMDVMHost::remoteControl(const std::string& commandString) case RCD_DISABLE_P25: if (m_p25 != NULL && m_p25Enabled) processEnableCommand(m_p25Enabled, false); - if (m_p25Network != NULL) + if (m_p25Network != nullptr) m_p25Network->enable(false); break; #endif @@ -3432,7 +3436,7 @@ void CMMDVMHost::remoteControl(const std::string& commandString) case RCD_DISABLE_NXDN: if (m_nxdn != NULL && m_nxdnEnabled) processEnableCommand(m_nxdnEnabled, false); - if (m_nxdnNetwork != NULL) + if (m_nxdnNetwork != nullptr) m_nxdnNetwork->enable(false); break; #endif @@ -3440,7 +3444,7 @@ void CMMDVMHost::remoteControl(const std::string& commandString) case RCD_DISABLE_M17: if (m_m17 != NULL && m_m17Enabled) processEnableCommand(m_m17Enabled, false); - if (m_m17Network != NULL) + if (m_m17Network != nullptr) m_m17Network->enable(false); break; #endif @@ -3469,8 +3473,8 @@ void CMMDVMHost::remoteControl(const std::string& commandString) m_pocsag->sendPage(ric, text); } break; - case RCD_PAGE_BCD: - if (m_pocsag != NULL) { + case REMOTE_COMMAND::PAGE_BCD: + if (m_pocsag != nullptr) { unsigned int ric = m_remoteControl->getArgUInt(0U); std::string text; for (unsigned int i = 1U; i < m_remoteControl->getArgCount(); i++) { @@ -3481,14 +3485,14 @@ void CMMDVMHost::remoteControl(const std::string& commandString) m_pocsag->sendPageBCD(ric, text); } break; - case RCD_PAGE_A1: - if (m_pocsag != NULL) { + case REMOTE_COMMAND::PAGE_A1: + if (m_pocsag != nullptr) { unsigned int ric = m_remoteControl->getArgUInt(0U); m_pocsag->sendPageAlert1(ric); } break; - case RCD_PAGE_A2: - if (m_pocsag != NULL) { + case REMOTE_COMMAND::PAGE_A2: + if (m_pocsag != nullptr) { unsigned int ric = m_remoteControl->getArgUInt(0U); std::string text; for (unsigned int i = 1U; i < m_remoteControl->getArgCount(); i++) { @@ -3513,7 +3517,7 @@ void CMMDVMHost::remoteControl(const std::string& commandString) m_modem->sendCWId(cwtext); } break; - case RCD_RELOAD: + case REMOTE_COMMAND::RELOAD: m_reload = true; break; default: @@ -3583,7 +3587,7 @@ void CMMDVMHost::buildNetworkHostsString(std::string &str) #if defined(USE_DSTAR) std::string dstarReflector; - if (m_dstarEnabled && (m_dstarNetwork != NULL)) { + if (m_dstarEnabled && (m_dstarNetwork != nullptr)) { unsigned char ref[DSTAR_LONG_CALLSIGN_LENGTH + 1]; LINK_STATUS status; @@ -3591,11 +3595,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; diff --git a/Modem.cpp b/Modem.cpp index 920a0dd..17f20c7 100644 --- a/Modem.cpp +++ b/Modem.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2011-2018,2020,2021,2023 by Jonathan Naylor G4KLX + * Copyright (C) 2011-2018,2020,2021,2023,2025 by Jonathan Naylor G4KLX * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -234,11 +234,11 @@ m_ax25Enabled(false), #endif m_rxDCOffset(0), m_txDCOffset(0), -m_port(NULL), -m_buffer(NULL), +m_port(nullptr), +m_buffer(nullptr), m_length(0U), m_offset(0U), -m_state(SS_START), +m_state(SERIAL_STATE::START), m_type(0U), #if defined(USE_DSTAR) m_rxDStarData(1000U, "Modem RX D-Star"), @@ -376,7 +376,7 @@ CModem::~CModem() void CModem::setPort(IModemPort* port) { - assert(port != NULL); + assert(port != nullptr); m_port = port; } @@ -522,7 +522,7 @@ bool CModem::open() if (!ret) { m_port->close(); delete m_port; - m_port = NULL; + m_port = nullptr; return false; } else { /* Stopping the inactivity timer here when a firmware version has been @@ -534,7 +534,7 @@ bool CModem::open() if (!ret) { m_port->close(); delete m_port; - m_port = NULL; + m_port = nullptr; return false; } @@ -542,7 +542,7 @@ bool CModem::open() if (!ret) { m_port->close(); delete m_port; - m_port = NULL; + m_port = nullptr; return false; } @@ -552,7 +552,7 @@ bool CModem::open() if (!ret) { m_port->close(); delete m_port; - m_port = NULL; + m_port = nullptr; return false; } @@ -560,7 +560,7 @@ bool CModem::open() if (!ret) { m_port->close(); delete m_port; - m_port = NULL; + m_port = nullptr; return false; } @@ -568,7 +568,7 @@ bool CModem::open() if (!ret) { m_port->close(); delete m_port; - m_port = NULL; + m_port = nullptr; return false; } @@ -577,7 +577,7 @@ bool CModem::open() if (!ret) { m_port->close(); delete m_port; - m_port = NULL; + m_port = nullptr; return false; } } @@ -594,7 +594,7 @@ bool CModem::open() void CModem::clock(unsigned int ms) { - assert(m_port != NULL); + assert(m_port != nullptr); // Poll the modem status every 250ms m_statusTimer.clock(ms); @@ -616,12 +616,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) { #if defined(USE_DSTAR) case MMDVM_DSTAR_HEADER: { @@ -1445,7 +1445,7 @@ void CModem::clock(unsigned int ms) void CModem::close() { - assert(m_port != NULL); + assert(m_port != nullptr); ::LogMessage("Closing the MMDVM"); @@ -1455,7 +1455,7 @@ void CModem::close() #if defined(USE_DSTAR) unsigned int CModem::readDStarData(unsigned char* data) { - assert(data != NULL); + assert(data != nullptr); if (m_rxDStarData.isEmpty()) return 0U; @@ -1471,7 +1471,7 @@ unsigned int CModem::readDStarData(unsigned char* data) #if defined(USE_DMR) unsigned int CModem::readDMRData1(unsigned char* data) { - assert(data != NULL); + assert(data != nullptr); if (m_rxDMRData1.isEmpty()) return 0U; @@ -1485,7 +1485,7 @@ unsigned int CModem::readDMRData1(unsigned char* data) unsigned int CModem::readDMRData2(unsigned char* data) { - assert(data != NULL); + assert(data != nullptr); if (m_rxDMRData2.isEmpty()) return 0U; @@ -1501,7 +1501,7 @@ unsigned int CModem::readDMRData2(unsigned char* data) #if defined(USE_YSF) unsigned int CModem::readYSFData(unsigned char* data) { - assert(data != NULL); + assert(data != nullptr); if (m_rxYSFData.isEmpty()) return 0U; @@ -1517,7 +1517,7 @@ unsigned int CModem::readYSFData(unsigned char* data) #if defined(USE_P25) unsigned int CModem::readP25Data(unsigned char* data) { - assert(data != NULL); + assert(data != nullptr); if (m_rxP25Data.isEmpty()) return 0U; @@ -1533,7 +1533,7 @@ unsigned int CModem::readP25Data(unsigned char* data) #if defined(USE_NXDN) unsigned int CModem::readNXDNData(unsigned char* data) { - assert(data != NULL); + assert(data != nullptr); if (m_rxNXDNData.isEmpty()) return 0U; @@ -1549,7 +1549,7 @@ unsigned int CModem::readNXDNData(unsigned char* data) #if defined(USE_M17) unsigned int CModem::readM17Data(unsigned char* data) { - assert(data != NULL); + assert(data != nullptr); if (m_rxM17Data.isEmpty()) return 0U; @@ -1565,7 +1565,7 @@ unsigned int CModem::readM17Data(unsigned char* data) #if defined(USE_FM) unsigned int CModem::readFMData(unsigned char* data) { - assert(data != NULL); + assert(data != nullptr); if (m_rxFMData.isEmpty()) return 0U; @@ -1581,7 +1581,7 @@ unsigned int CModem::readFMData(unsigned char* data) #if defined(USE_AX25) unsigned int CModem::readAX25Data(unsigned char* data) { - assert(data != NULL); + assert(data != nullptr); if (m_rxAX25Data.isEmpty()) return 0U; @@ -1596,7 +1596,7 @@ unsigned int CModem::readAX25Data(unsigned char* data) unsigned int CModem::readTransparentData(unsigned char* data) { - assert(data != NULL); + assert(data != nullptr); if (m_rxTransparentData.isEmpty()) return 0U; @@ -1632,7 +1632,7 @@ bool CModem::hasDStarSpace() const bool CModem::writeDStarData(const unsigned char* data, unsigned int length) { - assert(data != NULL); + assert(data != nullptr); assert(length > 0U); unsigned char buffer[50U]; @@ -1682,7 +1682,7 @@ bool CModem::hasDMRSpace2() const bool CModem::writeDMRData1(const unsigned char* data, unsigned int length) { - assert(data != NULL); + assert(data != nullptr); assert(length > 0U); if (data[0U] != TAG_DATA && data[0U] != TAG_EOT) @@ -1705,7 +1705,7 @@ bool CModem::writeDMRData1(const unsigned char* data, unsigned int length) bool CModem::writeDMRData2(const unsigned char* data, unsigned int length) { - assert(data != NULL); + assert(data != nullptr); assert(length > 0U); if (data[0U] != TAG_DATA && data[0U] != TAG_EOT) @@ -1737,7 +1737,7 @@ bool CModem::hasYSFSpace() const bool CModem::writeYSFData(const unsigned char* data, unsigned int length) { - assert(data != NULL); + assert(data != nullptr); assert(length > 0U); if (data[0U] != TAG_DATA && data[0U] != TAG_EOT) @@ -1769,7 +1769,7 @@ bool CModem::hasP25Space() const bool CModem::writeP25Data(const unsigned char* data, unsigned int length) { - assert(data != NULL); + assert(data != nullptr); assert(length > 0U); if (data[0U] != TAG_HEADER && data[0U] != TAG_DATA && data[0U] != TAG_EOT) @@ -1801,7 +1801,7 @@ bool CModem::hasNXDNSpace() const bool CModem::writeNXDNData(const unsigned char* data, unsigned int length) { - assert(data != NULL); + assert(data != nullptr); assert(length > 0U); if (data[0U] != TAG_DATA && data[0U] != TAG_EOT) @@ -1833,7 +1833,7 @@ bool CModem::hasM17Space() const bool CModem::writeM17Data(const unsigned char* data, unsigned int length) { - assert(data != NULL); + assert(data != nullptr); assert(length > 0U); unsigned char buffer[130U]; @@ -1876,7 +1876,7 @@ bool CModem::hasPOCSAGSpace() const bool CModem::writePOCSAGData(const unsigned char* data, unsigned int length) { - assert(data != NULL); + assert(data != nullptr); assert(length > 0U); unsigned char buffer[130U]; @@ -1903,7 +1903,7 @@ unsigned int CModem::getFMSpace() const bool CModem::writeFMData(const unsigned char* data, unsigned int length) { - assert(data != NULL); + assert(data != nullptr); assert(length > 0U); unsigned char buffer[500U]; @@ -1941,7 +1941,7 @@ bool CModem::hasAX25Space() const bool CModem::writeAX25Data(const unsigned char* data, unsigned int length) { - assert(data != NULL); + assert(data != nullptr); assert(length > 0U); unsigned char buffer[500U]; @@ -1971,7 +1971,7 @@ bool CModem::writeAX25Data(const unsigned char* data, unsigned int length) bool CModem::writeTransparentData(const unsigned char* data, unsigned int length) { - assert(data != NULL); + assert(data != nullptr); assert(length > 0U); unsigned char buffer[250U]; @@ -2006,12 +2006,12 @@ bool CModem::writeTransparentData(const unsigned char* data, unsigned int length #if defined(USE_DSTAR) bool CModem::writeDStarInfo(const char* my1, const char* my2, const char* your, const char* type, const char* reflector) { - assert(m_port != NULL); - assert(my1 != NULL); - assert(my2 != NULL); - assert(your != NULL); - assert(type != NULL); - assert(reflector != NULL); + assert(m_port != nullptr); + assert(my1 != nullptr); + assert(my2 != nullptr); + assert(your != nullptr); + assert(type != nullptr); + assert(reflector != nullptr); unsigned char buffer[50U]; @@ -2037,8 +2037,8 @@ bool CModem::writeDStarInfo(const char* my1, const char* my2, const char* your, #if defined(USE_DMR) bool CModem::writeDMRInfo(unsigned int slotNo, const std::string& src, bool group, const std::string& dest, const char* type) { - assert(m_port != NULL); - assert(type != NULL); + assert(m_port != nullptr); + assert(type != nullptr); unsigned char buffer[50U]; @@ -2065,11 +2065,11 @@ bool CModem::writeDMRInfo(unsigned int slotNo, const std::string& src, bool grou #if defined(USE_YSF) bool CModem::writeYSFInfo(const char* source, const char* dest, unsigned char dgid, const char* type, const char* origin) { - assert(m_port != NULL); - assert(source != NULL); - assert(dest != NULL); - assert(type != NULL); - assert(origin != NULL); + assert(m_port != nullptr); + assert(source != nullptr); + assert(dest != nullptr); + assert(type != nullptr); + assert(origin != nullptr); unsigned char buffer[40U]; @@ -2095,9 +2095,9 @@ bool CModem::writeYSFInfo(const char* source, const char* dest, unsigned char dg #if defined(USE_P25) bool CModem::writeP25Info(const char* source, bool group, unsigned int dest, const char* type) { - assert(m_port != NULL); - assert(source != NULL); - assert(type != NULL); + assert(m_port != nullptr); + assert(source != nullptr); + assert(type != nullptr); unsigned char buffer[40U]; @@ -2122,9 +2122,9 @@ bool CModem::writeP25Info(const char* source, bool group, unsigned int dest, con #if defined(USE_NXDN) bool CModem::writeNXDNInfo(const char* source, bool group, unsigned int dest, const char* type) { - assert(m_port != NULL); - assert(source != NULL); - assert(type != NULL); + assert(m_port != nullptr); + assert(source != nullptr); + assert(type != nullptr); unsigned char buffer[40U]; @@ -2149,10 +2149,10 @@ bool CModem::writeNXDNInfo(const char* source, bool group, unsigned int dest, co #if defined(USE_M17) bool CModem::writeM17Info(const char* source, const char* dest, const char* type) { - assert(m_port != NULL); - assert(source != NULL); - assert(dest != NULL); - assert(type != NULL); + assert(m_port != nullptr); + assert(source != nullptr); + assert(dest != nullptr); + assert(type != nullptr); unsigned char buffer[40U]; @@ -2175,7 +2175,7 @@ bool CModem::writeM17Info(const char* source, const char* dest, const char* type #if defined(USE_POCSAG) bool CModem::writePOCSAGInfo(unsigned int ric, const std::string& message) { - assert(m_port != NULL); + assert(m_port != nullptr); size_t length = message.size(); @@ -2199,7 +2199,7 @@ bool CModem::writePOCSAGInfo(unsigned int ric, const std::string& message) bool CModem::writeIPInfo(const std::string& address) { - assert(m_port != NULL); + assert(m_port != nullptr); size_t length = address.size(); @@ -2220,8 +2220,8 @@ bool CModem::writeIPInfo(const std::string& address) bool CModem::writeSerialData(const unsigned char* data, unsigned int length) { - assert(m_port != NULL); - assert(data != NULL); + assert(m_port != nullptr); + assert(data != nullptr); assert(length > 0U); unsigned char buffer[255U]; @@ -2311,7 +2311,7 @@ unsigned int CModem::getVersion() const bool CModem::readVersion() { - assert(m_port != NULL); + assert(m_port != nullptr); CThread::sleep(2000U); // 2s @@ -2335,31 +2335,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]; @@ -2433,7 +2433,7 @@ bool CModem::readVersion() bool CModem::readStatus() { - assert(m_port != NULL); + assert(m_port != nullptr); unsigned char buffer[3U]; @@ -2460,7 +2460,7 @@ bool CModem::writeConfig() bool CModem::setConfig1() { - assert(m_port != NULL); + assert(m_port != nullptr); unsigned char buffer[30U]; @@ -2610,18 +2610,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; } @@ -2633,7 +2633,7 @@ bool CModem::setConfig1() bool CModem::setConfig2() { - assert(m_port != NULL); + assert(m_port != nullptr); unsigned char buffer[50U]; @@ -2822,18 +2822,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; } @@ -2845,7 +2845,7 @@ bool CModem::setConfig2() bool CModem::setFrequency() { - assert(m_port != NULL); + assert(m_port != nullptr); unsigned char buffer[20U]; unsigned char len; @@ -2856,7 +2856,7 @@ bool CModem::setFrequency() pocsagFrequency = m_pocsagFrequency; #endif - if (m_hwType == HWT_DVMEGA) + if (m_hwType == HW_TYPE::DVMEGA) len = 12U; else { buffer[12U] = (unsigned char)(m_rfLevel * 2.55F + 0.5F); @@ -2906,18 +2906,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; } @@ -2927,92 +2927,92 @@ bool CModem::setFrequency() RESP_TYPE_MMDVM CModem::getResponse() { - assert(m_port != NULL); + assert(m_port != nullptr); - 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; @@ -3022,9 +3022,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 @@ -3039,7 +3039,7 @@ unsigned char CModem::getMode() const bool CModem::setMode(unsigned char mode) { - assert(m_port != NULL); + assert(m_port != nullptr); unsigned char buffer[4U]; @@ -3055,7 +3055,7 @@ bool CModem::setMode(unsigned char mode) bool CModem::sendCWId(const std::string& callsign) { - assert(m_port != NULL); + assert(m_port != nullptr); unsigned int length = (unsigned int)callsign.length(); if (length > 200U) @@ -3078,7 +3078,7 @@ bool CModem::sendCWId(const std::string& callsign) #if defined(USE_DMR) bool CModem::writeDMRStart(bool tx) { - assert(m_port != NULL); + assert(m_port != nullptr); if (tx && m_tx) return true; @@ -3099,7 +3099,7 @@ bool CModem::writeDMRStart(bool tx) bool CModem::writeDMRAbort(unsigned int slotNo) { - assert(m_port != NULL); + assert(m_port != nullptr); if (slotNo == 1U) m_txDMRData1.clear(); @@ -3120,8 +3120,8 @@ bool CModem::writeDMRAbort(unsigned int slotNo) bool CModem::writeDMRShortLC(const unsigned char* lc) { - assert(m_port != NULL); - assert(lc != NULL); + assert(m_port != nullptr); + assert(lc != nullptr); unsigned char buffer[12U]; @@ -3204,7 +3204,7 @@ void CModem::setFMExtParams(const std::string& ack, unsigned int audioBoost) bool CModem::setFMCallsignParams() { - assert(m_port != NULL); + assert(m_port != nullptr); unsigned char buffer[80U]; unsigned char len = 10U + (unsigned char)m_fmCallsign.size(); @@ -3244,18 +3244,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; } @@ -3265,7 +3265,7 @@ bool CModem::setFMCallsignParams() bool CModem::setFMAckParams() { - assert(m_port != NULL); + assert(m_port != nullptr); unsigned char buffer[80U]; unsigned char len = 8U + (unsigned char)m_fmRfAck.size(); @@ -3296,18 +3296,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; } @@ -3317,7 +3317,7 @@ bool CModem::setFMAckParams() bool CModem::setFMMiscParams() { - assert(m_port != NULL); + assert(m_port != nullptr); unsigned char buffer[20U]; @@ -3365,18 +3365,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; } @@ -3386,7 +3386,7 @@ bool CModem::setFMMiscParams() bool CModem::setFMExtParams() { - assert(m_port != NULL); + assert(m_port != nullptr); unsigned char buffer[80U]; unsigned char len = 7U + (unsigned char)m_fmExtAck.size(); @@ -3416,18 +3416,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; } diff --git a/Modem.h b/Modem.h index edd111d..cc88422 100644 --- a/Modem.h +++ b/Modem.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2011-2018,2020,2021,2023 by Jonathan Naylor G4KLX + * Copyright (C) 2011-2018,2020,2021,2023,2025 by Jonathan Naylor G4KLX * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -26,18 +26,18 @@ #include -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 { diff --git a/Mutex.cpp b/Mutex.cpp index 837e340..1d631c6 100644 --- a/Mutex.cpp +++ b/Mutex.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2015,2016 by Jonathan Naylor G4KLX + * Copyright (C) 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 @@ -23,7 +23,7 @@ CMutex::CMutex() : m_handle() { - m_handle = ::CreateMutex(NULL, FALSE, NULL); + m_handle = ::CreateMutex(nullptr, FALSE, nullptr); } CMutex::~CMutex() diff --git a/NXDNAudio.cpp b/NXDNAudio.cpp index 9a796cb..b7119aa 100644 --- a/NXDNAudio.cpp +++ b/NXDNAudio.cpp @@ -1,5 +1,5 @@ /* -* Copyright (C) 2018,2023 by Jonathan Naylor G4KLX +* Copyright (C) 2018,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 @@ -459,8 +459,8 @@ CNXDNAudio::~CNXDNAudio() void CNXDNAudio::decode(const unsigned char* in, unsigned char* out) const { - assert(in != NULL); - assert(out != NULL); + assert(in != nullptr); + assert(out != nullptr); decode(in + 0U, out, 0U); decode(in + 9U, out, 49U); @@ -468,8 +468,8 @@ void CNXDNAudio::decode(const unsigned char* in, unsigned char* out) const void CNXDNAudio::encode(const unsigned char* in, unsigned char* out) const { - assert(in != NULL); - assert(out != NULL); + assert(in != nullptr); + assert(out != nullptr); encode(in, out + 0U, 0U); encode(in, out + 9U, 49U); @@ -477,8 +477,8 @@ void CNXDNAudio::encode(const unsigned char* in, unsigned char* out) const void CNXDNAudio::decode(const unsigned char* in, unsigned char* out, unsigned int offset) const { - assert(in != NULL); - assert(out != NULL); + assert(in != nullptr); + assert(out != nullptr); unsigned int a = 0U; unsigned int MASK = 0x800000U; @@ -527,8 +527,8 @@ void CNXDNAudio::decode(const unsigned char* in, unsigned char* out, unsigned in void CNXDNAudio::encode(const unsigned char* in, unsigned char* out, unsigned int offset) const { - assert(in != NULL); - assert(out != NULL); + assert(in != nullptr); + assert(out != nullptr); unsigned int aOrig = 0U; unsigned int bOrig = 0U; diff --git a/NXDNCRC.cpp b/NXDNCRC.cpp index dff2e7f..05ca358 100644 --- a/NXDNCRC.cpp +++ b/NXDNCRC.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2018,2023 by Jonathan Naylor G4KLX + * Copyright (C) 2018,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 @@ -30,7 +30,7 @@ const uint8_t BIT_MASK_TABLE1[] = { 0x80U, 0x40U, 0x20U, 0x10U, 0x08U, 0x04U, 0 bool CNXDNCRC::checkCRC6(const unsigned char* in, unsigned int length) { - assert(in != NULL); + assert(in != nullptr); uint8_t crc = createCRC6(in, length); @@ -47,7 +47,7 @@ bool CNXDNCRC::checkCRC6(const unsigned char* in, unsigned int length) void CNXDNCRC::encodeCRC6(unsigned char* in, unsigned int length) { - assert(in != NULL); + assert(in != nullptr); uint8_t crc[1U]; crc[0U] = createCRC6(in, length); @@ -61,7 +61,7 @@ void CNXDNCRC::encodeCRC6(unsigned char* in, unsigned int length) bool CNXDNCRC::checkCRC12(const unsigned char* in, unsigned int length) { - assert(in != NULL); + assert(in != nullptr); uint16_t crc = createCRC12(in, length); uint8_t temp1[2U]; @@ -82,7 +82,7 @@ bool CNXDNCRC::checkCRC12(const unsigned char* in, unsigned int length) void CNXDNCRC::encodeCRC12(unsigned char* in, unsigned int length) { - assert(in != NULL); + assert(in != nullptr); uint16_t crc = createCRC12(in, length); @@ -99,7 +99,7 @@ void CNXDNCRC::encodeCRC12(unsigned char* in, unsigned int length) bool CNXDNCRC::checkCRC15(const unsigned char* in, unsigned int length) { - assert(in != NULL); + assert(in != nullptr); uint16_t crc = createCRC15(in, length); uint8_t temp1[2U]; @@ -120,7 +120,7 @@ bool CNXDNCRC::checkCRC15(const unsigned char* in, unsigned int length) void CNXDNCRC::encodeCRC15(unsigned char* in, unsigned int length) { - assert(in != NULL); + assert(in != nullptr); uint16_t crc = createCRC15(in, length); diff --git a/NXDNControl.cpp b/NXDNControl.cpp index 340ac80..8095a01 100644 --- a/NXDNControl.cpp +++ b/NXDNControl.cpp @@ -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 @@ -51,8 +51,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), @@ -89,14 +89,14 @@ CNXDNControl::~CNXDNControl() bool CNXDNControl::writeModem(unsigned char *data, unsigned int len) { - assert(data != NULL); + assert(data != nullptr); if (!m_enabled) return false; 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(); unsigned short srcId = m_rfLayer3.getSourceUnitId(); @@ -113,13 +113,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; @@ -187,7 +187,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; } @@ -211,17 +211,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; } } @@ -262,7 +262,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 (m_duplex) writeQueueRF(data); @@ -313,7 +313,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) { @@ -390,7 +390,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; } } @@ -418,7 +418,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); writeJSONRF("late_entry", srcId, source, grp, dstId); - m_rfState = RS_RF_AUDIO; + m_rfState = RPT_RF_STATE::AUDIO; // Create a dummy start message unsigned char start[NXDN_FRAME_LENGTH_BYTES + 2U]; @@ -460,14 +460,14 @@ 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 (m_duplex) writeQueueRF(start); } } - if (m_rfState == RS_RF_AUDIO) { + if (m_rfState == RPT_RF_STATE::AUDIO) { // Regenerate the sync CSync::addNXDNSync(data + 2U); @@ -563,7 +563,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 (m_duplex) writeQueueRF(data); @@ -580,7 +580,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) { @@ -599,7 +599,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; @@ -628,7 +628,7 @@ bool CNXDNControl::processData(unsigned char option, unsigned char *data) m_rfState = RS_RF_DATA; } - if (m_rfState != RS_RF_DATA) + if (m_rfState != RPT_RF_STATE::DATA) return false; CSync::addNXDNSync(data + 2U); @@ -662,13 +662,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; } @@ -693,7 +693,7 @@ bool CNXDNControl::processData(unsigned char option, unsigned char *data) unsigned int CNXDNControl::readModem(unsigned char* data) { - assert(data != NULL); + assert(data != nullptr); if (m_queue.isEmpty()) return 0U; @@ -708,7 +708,7 @@ 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(); @@ -724,7 +724,7 @@ void CNXDNControl::writeEndRF() void CNXDNControl::writeEndNet() { - m_netState = RS_NET_IDLE; + m_netState = RPT_NET_STATE::IDLE; m_netMask = 0x00U; m_netLayer3.reset(); @@ -747,7 +747,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(); @@ -768,7 +768,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(); @@ -780,13 +780,13 @@ void CNXDNControl::writeNetwork() LogMessage("NXDN, received network data header from %s to %s%u, %u blocks", source.c_str(), grp ? "TG " : "", dstId, frames); writeJSONNet("start", srcId, source, grp, 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; @@ -814,9 +814,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; @@ -855,14 +855,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: @@ -907,7 +907,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,13 +992,13 @@ void CNXDNControl::writeNetwork() void CNXDNControl::clock(unsigned int ms) { - if (m_network != NULL) + if (m_network != nullptr) writeNetwork(); 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()) { @@ -1011,9 +1011,9 @@ void CNXDNControl::clock(unsigned int ms) void CNXDNControl::writeQueueRF(const unsigned char *data) { - assert(data != NULL); + assert(data != nullptr); - if (m_netState != RS_NET_IDLE) + if (m_netState != RPT_NET_STATE::IDLE) return; if (m_rfTimeoutTimer.isRunning() && m_rfTimeoutTimer.hasExpired()) @@ -1034,7 +1034,7 @@ void CNXDNControl::writeQueueRF(const unsigned char *data) void CNXDNControl::writeQueueNet(const unsigned char *data) { - assert(data != NULL); + assert(data != nullptr); if (m_netTimeoutTimer.isRunning() && m_netTimeoutTimer.hasExpired()) return; @@ -1054,9 +1054,9 @@ void CNXDNControl::writeQueueNet(const unsigned char *data) void CNXDNControl::writeNetwork(const unsigned char *data, NXDN_NETWORK_MESSAGE_TYPE type) { - assert(data != NULL); + assert(data != nullptr); - if (m_network == NULL) + if (m_network == nullptr) return; if (m_rfTimeoutTimer.isRunning() && m_rfTimeoutTimer.hasExpired()) @@ -1067,7 +1067,7 @@ void CNXDNControl::writeNetwork(const unsigned char *data, NXDN_NETWORK_MESSAGE_ void CNXDNControl::scrambler(unsigned char* data) const { - assert(data != NULL); + assert(data != nullptr); for (unsigned int i = 0U; i < NXDN_FRAME_LENGTH_BYTES; i++) data[i] ^= SCRAMBLER[i]; diff --git a/NXDNConvolution.cpp b/NXDNConvolution.cpp index 8bf33e2..d5939e3 100644 --- a/NXDNConvolution.cpp +++ b/NXDNConvolution.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2009-2016,2018,2021,2023 by Jonathan Naylor G4KLX + * Copyright (C) 2009-2016,2018,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 @@ -39,12 +39,12 @@ const uint32_t M = 4U; const unsigned int K = 5U; CNXDNConvolution::CNXDNConvolution() : -m_metrics1(NULL), -m_metrics2(NULL), -m_oldMetrics(NULL), -m_newMetrics(NULL), -m_decisions(NULL), -m_dp(NULL) +m_metrics1(nullptr), +m_metrics2(nullptr), +m_oldMetrics(nullptr), +m_newMetrics(nullptr), +m_decisions(nullptr), +m_dp(nullptr) { m_metrics1 = new uint16_t[20U]; m_metrics2 = new uint16_t[20U]; @@ -101,7 +101,7 @@ void CNXDNConvolution::decode(uint8_t s0, uint8_t s1) unsigned int CNXDNConvolution::chainback(unsigned char* out, unsigned int nBits) { - assert(out != NULL); + assert(out != nullptr); uint32_t state = 0U; @@ -127,8 +127,8 @@ unsigned int CNXDNConvolution::chainback(unsigned char* out, unsigned int nBits) void CNXDNConvolution::encode(const unsigned char* in, unsigned char* out, unsigned int nBits) const { - assert(in != NULL); - assert(out != NULL); + assert(in != nullptr); + assert(out != nullptr); assert(nBits > 0U); uint8_t d1 = 0U, d2 = 0U, d3 = 0U, d4 = 0U; diff --git a/NXDNDefines.h b/NXDNDefines.h index 31291c4..3a3076e 100644 --- a/NXDNDefines.h +++ b/NXDNDefines.h @@ -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; diff --git a/NXDNFACCH1.cpp b/NXDNFACCH1.cpp index 53124ab..ee02fdd 100644 --- a/NXDNFACCH1.cpp +++ b/NXDNFACCH1.cpp @@ -1,5 +1,5 @@ /* -* Copyright (C) 2018,2023 by Jonathan Naylor G4KLX +* Copyright (C) 2018,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 @@ -50,14 +50,14 @@ const unsigned char BIT_MASK_TABLE[] = { 0x80U, 0x40U, 0x20U, 0x10U, 0x08U, 0x04 #define READ_BIT1(p,i) (p[(i)>>3] & BIT_MASK_TABLE[(i)&7]) CNXDNFACCH1::CNXDNFACCH1(const CNXDNFACCH1& facch1) : -m_data(NULL) +m_data(nullptr) { m_data = new unsigned char[10U + 2U]; ::memcpy(m_data, facch1.m_data, 10U + 2U); } CNXDNFACCH1::CNXDNFACCH1() : -m_data(NULL) +m_data(nullptr) { m_data = new unsigned char[10U + 2U]; } @@ -69,7 +69,7 @@ CNXDNFACCH1::~CNXDNFACCH1() bool CNXDNFACCH1::decode(const unsigned char* data, unsigned int offset) { - assert(data != NULL); + assert(data != nullptr); unsigned char temp1[18U]; @@ -115,7 +115,7 @@ bool CNXDNFACCH1::decode(const unsigned char* data, unsigned int offset) void CNXDNFACCH1::encode(unsigned char* data, unsigned int offset) const { - assert(data != NULL); + assert(data != nullptr); unsigned char temp1[12U]; ::memset(temp1, 0x00U, 12U); @@ -151,14 +151,14 @@ void CNXDNFACCH1::encode(unsigned char* data, unsigned int offset) const void CNXDNFACCH1::getData(unsigned char* data) const { - assert(data != NULL); + assert(data != nullptr); ::memcpy(data, m_data, 10U); } void CNXDNFACCH1::getRaw(unsigned char* data) const { - assert(data != NULL); + assert(data != nullptr); ::memset(data, 0x00U, 12U); ::memcpy(data, m_data, 10U); @@ -168,14 +168,14 @@ void CNXDNFACCH1::getRaw(unsigned char* data) const void CNXDNFACCH1::setData(const unsigned char* data) { - assert(data != NULL); + assert(data != nullptr); ::memcpy(m_data, data, 10U); } void CNXDNFACCH1::setRaw(const unsigned char* data) { - assert(data != NULL); + assert(data != nullptr); ::memcpy(m_data, data, 12U); } diff --git a/NXDNIcomNetwork.cpp b/NXDNIcomNetwork.cpp index 09f6341..5e730c6 100644 --- a/NXDNIcomNetwork.cpp +++ b/NXDNIcomNetwork.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2009-2014,2016,2018-2020,2023 by Jonathan Naylor G4KLX + * Copyright (C) 2009-2014,2016,2018-2020,2023,2025 by Jonathan Naylor G4KLX * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -62,7 +62,7 @@ bool CNXDNIcomNetwork::open() bool CNXDNIcomNetwork::write(const unsigned char* data, NXDN_NETWORK_MESSAGE_TYPE type) { - assert(data != NULL); + assert(data != nullptr); unsigned char buffer[110U]; ::memset(buffer, 0x00U, 110U); @@ -77,20 +77,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; @@ -140,7 +140,7 @@ void CNXDNIcomNetwork::clock(unsigned int ms) bool CNXDNIcomNetwork::read(unsigned char* data) { - assert(data != NULL); + assert(data != nullptr); if (m_buffer.isEmpty()) return false; diff --git a/NXDNKenwoodNetwork.cpp b/NXDNKenwoodNetwork.cpp index 223b96a..1cc3468 100644 --- a/NXDNKenwoodNetwork.cpp +++ b/NXDNKenwoodNetwork.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2009-2014,2016,2018,2020,2023 by Jonathan Naylor G4KLX + * Copyright (C) 2009-2014,2016,2018,2020,2023,2025 by Jonathan Naylor G4KLX * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -48,7 +48,7 @@ m_seen1(false), m_seen2(false), m_seen3(false), m_seen4(false), -m_sacch(NULL), +m_sacch(nullptr), m_sessionId(1U), m_seqNo(0U), m_ssrc(0U), @@ -109,18 +109,18 @@ bool CNXDNKenwoodNetwork::open() bool CNXDNKenwoodNetwork::write(const unsigned char* data, NXDN_NETWORK_MESSAGE_TYPE type) { - assert(data != NULL); + assert(data != nullptr); 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; @@ -129,7 +129,7 @@ bool CNXDNKenwoodNetwork::write(const unsigned char* data, NXDN_NETWORK_MESSAGE_ bool CNXDNKenwoodNetwork::processIcomVoiceHeader(const unsigned char* inData) { - assert(inData != NULL); + assert(inData != nullptr); unsigned char outData[30U]; ::memset(outData, 0x00U, 30U); @@ -173,7 +173,7 @@ bool CNXDNKenwoodNetwork::processIcomVoiceHeader(const unsigned char* inData) bool CNXDNKenwoodNetwork::processIcomVoiceData(const unsigned char* inData) { - assert(inData != NULL); + assert(inData != nullptr); unsigned char outData[40U], temp[10U]; ::memset(outData, 0x00U, 40U); @@ -253,7 +253,7 @@ bool CNXDNKenwoodNetwork::processIcomVoiceData(const unsigned char* inData) bool CNXDNKenwoodNetwork::processIcomDataHeader(const unsigned char* inData) { - assert(inData != NULL); + assert(inData != nullptr); unsigned char outData[30U]; ::memset(outData, 0x00U, 30U); @@ -297,7 +297,7 @@ bool CNXDNKenwoodNetwork::processIcomDataHeader(const unsigned char* inData) bool CNXDNKenwoodNetwork::processIcomDataData(const unsigned char* inData) { - assert(inData != NULL); + assert(inData != nullptr); unsigned char outData[40U]; ::memset(outData, 0x00U, 40U); @@ -330,7 +330,7 @@ bool CNXDNKenwoodNetwork::processIcomDataData(const unsigned char* inData) bool CNXDNKenwoodNetwork::writeRTPVoiceHeader(const unsigned char* data) { - assert(data != NULL); + assert(data != nullptr); unsigned char buffer[50U]; ::memset(buffer, 0x00U, 50U); @@ -377,7 +377,7 @@ bool CNXDNKenwoodNetwork::writeRTPVoiceHeader(const unsigned char* data) bool CNXDNKenwoodNetwork::writeRTPVoiceTrailer(const unsigned char* data) { - assert(data != NULL); + assert(data != nullptr); unsigned char buffer[50U]; ::memset(buffer, 0x00U, 50U); @@ -423,7 +423,7 @@ bool CNXDNKenwoodNetwork::writeRTPVoiceTrailer(const unsigned char* data) bool CNXDNKenwoodNetwork::writeRTPVoiceData(const unsigned char* data) { - assert(data != NULL); + assert(data != nullptr); unsigned char buffer[60U]; ::memset(buffer, 0x00U, 60U); @@ -469,7 +469,7 @@ bool CNXDNKenwoodNetwork::writeRTPVoiceData(const unsigned char* data) bool CNXDNKenwoodNetwork::writeRTPDataHeader(const unsigned char* data) { - assert(data != NULL); + assert(data != nullptr); unsigned char buffer[50U]; ::memset(buffer, 0x00U, 50U); @@ -511,7 +511,7 @@ bool CNXDNKenwoodNetwork::writeRTPDataHeader(const unsigned char* data) bool CNXDNKenwoodNetwork::writeRTPDataTrailer(const unsigned char* data) { - assert(data != NULL); + assert(data != nullptr); unsigned char buffer[50U]; ::memset(buffer, 0x00U, 50U); @@ -553,7 +553,7 @@ bool CNXDNKenwoodNetwork::writeRTPDataTrailer(const unsigned char* data) bool CNXDNKenwoodNetwork::writeRTPDataData(const unsigned char* data) { - assert(data != NULL); + assert(data != nullptr); unsigned char buffer[50U]; ::memset(buffer, 0x00U, 50U); @@ -607,7 +607,7 @@ bool CNXDNKenwoodNetwork::writeRTCPStart() m_startUSecs = st.wMilliseconds * 1000U; #else struct timeval tod; - ::gettimeofday(&tod, NULL); + ::gettimeofday(&tod, nullptr); m_startSecs = tod.tv_sec; m_startUSecs = tod.tv_usec; @@ -740,7 +740,7 @@ bool CNXDNKenwoodNetwork::writeRTCPHang() bool CNXDNKenwoodNetwork::read(unsigned char* data) { - assert(data != NULL); + assert(data != nullptr); unsigned char dummy[BUFFER_LENGTH]; readRTCP(dummy); @@ -766,7 +766,7 @@ bool CNXDNKenwoodNetwork::read(unsigned char* data) unsigned int CNXDNKenwoodNetwork::readRTP(unsigned char* data) { - assert(data != NULL); + assert(data != nullptr); unsigned char buffer[BUFFER_LENGTH]; @@ -776,7 +776,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; } @@ -794,7 +794,7 @@ unsigned int CNXDNKenwoodNetwork::readRTP(unsigned char* data) unsigned int CNXDNKenwoodNetwork::readRTCP(unsigned char* data) { - assert(data != NULL); + assert(data != nullptr); unsigned char buffer[BUFFER_LENGTH]; @@ -804,7 +804,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; } @@ -870,7 +870,7 @@ void CNXDNKenwoodNetwork::clock(unsigned int ms) bool CNXDNKenwoodNetwork::processKenwoodVoiceHeader(unsigned char* inData) { - assert(inData != NULL); + assert(inData != nullptr); unsigned char outData[50U], temp[20U]; ::memset(outData, 0x00U, 50U); @@ -927,7 +927,7 @@ bool CNXDNKenwoodNetwork::processKenwoodVoiceHeader(unsigned char* inData) bool CNXDNKenwoodNetwork::processKenwoodVoiceData(unsigned char* inData) { - assert(inData != NULL); + assert(inData != nullptr); unsigned char outData[50U], temp[20U]; ::memset(outData, 0x00U, 50U); @@ -1090,7 +1090,7 @@ unsigned long CNXDNKenwoodNetwork::getTimeStamp() const timeStamp += ms * 80U; #else struct timeval tod; - ::gettimeofday(&tod, NULL); + ::gettimeofday(&tod, nullptr); unsigned int ss = tod.tv_sec; unsigned int ms = tod.tv_usec / 1000U; @@ -1104,7 +1104,7 @@ unsigned long CNXDNKenwoodNetwork::getTimeStamp() const bool CNXDNKenwoodNetwork::processKenwoodVoiceLateEntry(unsigned char* inData) { - assert(inData != NULL); + assert(inData != nullptr); unsigned char sacch[4U]; sacch[0U] = inData[12U]; diff --git a/NXDNLICH.cpp b/NXDNLICH.cpp index 3f82927..5698fcd 100644 --- a/NXDNLICH.cpp +++ b/NXDNLICH.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2018,2023 by Jonathan Naylor G4KLX + * Copyright (C) 2018,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 @@ -31,14 +31,14 @@ const unsigned char BIT_MASK_TABLE[] = {0x80U, 0x40U, 0x20U, 0x10U, 0x08U, 0x04U #define READ_BIT1(p,i) (p[(i)>>3] & BIT_MASK_TABLE[(i)&7]) CNXDNLICH::CNXDNLICH(const CNXDNLICH& lich) : -m_lich(NULL) +m_lich(nullptr) { m_lich = new unsigned char[1U]; m_lich[0U] = lich.m_lich[0U]; } CNXDNLICH::CNXDNLICH() : -m_lich(NULL) +m_lich(nullptr) { m_lich = new unsigned char[1U]; } @@ -50,7 +50,7 @@ CNXDNLICH::~CNXDNLICH() bool CNXDNLICH::decode(const unsigned char* bytes) { - assert(bytes != NULL); + assert(bytes != nullptr); unsigned int offset = NXDN_FSW_LENGTH_BITS; for (unsigned int i = 0U; i < (NXDN_LICH_LENGTH_BITS / 2U); i++, offset += 2U) { @@ -66,7 +66,7 @@ bool CNXDNLICH::decode(const unsigned char* bytes) void CNXDNLICH::encode(unsigned char* bytes) { - assert(bytes != NULL); + assert(bytes != nullptr); bool parity = getParity(); if (parity) diff --git a/NXDNLayer3.cpp b/NXDNLayer3.cpp index de5c5b3..e0ebc6c 100644 --- a/NXDNLayer3.cpp +++ b/NXDNLayer3.cpp @@ -1,5 +1,5 @@ /* -* Copyright (C) 2018,2023 by Jonathan Naylor G4KLX +* Copyright (C) 2018,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 @@ -31,14 +31,14 @@ const unsigned char BIT_MASK_TABLE[] = { 0x80U, 0x40U, 0x20U, 0x10U, 0x08U, 0x04 #define READ_BIT1(p,i) (p[(i)>>3] & BIT_MASK_TABLE[(i)&7]) CNXDNLayer3::CNXDNLayer3(const CNXDNLayer3& layer3) : -m_data(NULL) +m_data(nullptr) { m_data = new unsigned char[22U]; ::memcpy(m_data, layer3.m_data, 22U); } CNXDNLayer3::CNXDNLayer3() : -m_data(NULL) +m_data(nullptr) { m_data = new unsigned char[22U]; ::memset(m_data, 0x00U, 22U); @@ -51,7 +51,7 @@ CNXDNLayer3::~CNXDNLayer3() void CNXDNLayer3::decode(const unsigned char* bytes, unsigned int length, unsigned int offset) { - assert(bytes != NULL); + assert(bytes != nullptr); for (unsigned int i = 0U; i < length; i++, offset++) { bool b = READ_BIT1(bytes, i); @@ -61,7 +61,7 @@ void CNXDNLayer3::decode(const unsigned char* bytes, unsigned int length, unsign void CNXDNLayer3::encode(unsigned char* bytes, unsigned int length, unsigned int offset) { - assert(bytes != NULL); + assert(bytes != nullptr); for (unsigned int i = 0U; i < length; i++, offset++) { bool b = READ_BIT1(m_data, offset); diff --git a/NXDNLookup.cpp b/NXDNLookup.cpp index b4aef1c..e21ddb0 100644 --- a/NXDNLookup.cpp +++ b/NXDNLookup.cpp @@ -1,5 +1,5 @@ /* -* Copyright (C) 2016,2017,2018,2021,2023 by Jonathan Naylor G4KLX +* Copyright (C) 2016,2017,2018,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 @@ -134,7 +134,7 @@ std::string CNXDNLookup::find(unsigned int id) bool CNXDNLookup::exists(unsigned int id) { - return m_table.lookup(id, NULL); + return m_table.lookup(id, nullptr); } #endif diff --git a/NXDNNetwork.h b/NXDNNetwork.h index d6e8869..b36319f 100644 --- a/NXDNNetwork.h +++ b/NXDNNetwork.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2020,2023 by Jonathan Naylor G4KLX + * Copyright (C) 2020,2023,2025 by Jonathan Naylor G4KLX * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -26,13 +26,13 @@ #include -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 { diff --git a/NXDNSACCH.cpp b/NXDNSACCH.cpp index df887fa..d1664a9 100644 --- a/NXDNSACCH.cpp +++ b/NXDNSACCH.cpp @@ -1,5 +1,5 @@ /* -* Copyright (C) 2018,2023 by Jonathan Naylor G4KLX +* Copyright (C) 2018,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 @@ -43,14 +43,14 @@ const unsigned char BIT_MASK_TABLE[] = { 0x80U, 0x40U, 0x20U, 0x10U, 0x08U, 0x04 #define READ_BIT1(p,i) (p[(i)>>3] & BIT_MASK_TABLE[(i)&7]) CNXDNSACCH::CNXDNSACCH(const CNXDNSACCH& sacch) : -m_data(NULL) +m_data(nullptr) { m_data = new unsigned char[5U]; ::memcpy(m_data, sacch.m_data, 5U); } CNXDNSACCH::CNXDNSACCH() : -m_data(NULL) +m_data(nullptr) { m_data = new unsigned char[5U]; } @@ -62,7 +62,7 @@ CNXDNSACCH::~CNXDNSACCH() bool CNXDNSACCH::decode(const unsigned char* data) { - assert(data != NULL); + assert(data != nullptr); unsigned char temp1[8U]; @@ -108,7 +108,7 @@ bool CNXDNSACCH::decode(const unsigned char* data) void CNXDNSACCH::encode(unsigned char* data) const { - assert(data != NULL); + assert(data != nullptr); unsigned char temp1[5U]; ::memset(temp1, 0x00U, 5U); @@ -158,7 +158,7 @@ unsigned char CNXDNSACCH::getStructure() const void CNXDNSACCH::getData(unsigned char* data) const { - assert(data != NULL); + assert(data != nullptr); unsigned int offset = 8U; for (unsigned int i = 0U; i < 18U; i++, offset++) { @@ -169,7 +169,7 @@ void CNXDNSACCH::getData(unsigned char* data) const void CNXDNSACCH::getRaw(unsigned char* data) const { - assert(data != NULL); + assert(data != nullptr); ::memcpy(data, m_data, 4U); @@ -190,7 +190,7 @@ void CNXDNSACCH::setStructure(unsigned char structure) void CNXDNSACCH::setData(const unsigned char* data) { - assert(data != NULL); + assert(data != nullptr); unsigned int offset = 8U; for (unsigned int i = 0U; i < 18U; i++, offset++) { @@ -201,7 +201,7 @@ void CNXDNSACCH::setData(const unsigned char* data) void CNXDNSACCH::setRaw(const unsigned char* data) { - assert(data != NULL); + assert(data != nullptr); ::memcpy(m_data, data, 4U); } diff --git a/NXDNUDCH.cpp b/NXDNUDCH.cpp index 4d34083..ab8f11a 100644 --- a/NXDNUDCH.cpp +++ b/NXDNUDCH.cpp @@ -1,5 +1,5 @@ /* -* Copyright (C) 2018,2023 by Jonathan Naylor G4KLX +* Copyright (C) 2018,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 @@ -71,14 +71,14 @@ const unsigned char BIT_MASK_TABLE[] = { 0x80U, 0x40U, 0x20U, 0x10U, 0x08U, 0x04 #define READ_BIT1(p,i) (p[(i)>>3] & BIT_MASK_TABLE[(i)&7]) CNXDNUDCH::CNXDNUDCH(const CNXDNUDCH& udch) : -m_data(NULL) +m_data(nullptr) { m_data = new unsigned char[23U + 3U]; ::memcpy(m_data, udch.m_data, 23U + 3U); } CNXDNUDCH::CNXDNUDCH() : -m_data(NULL) +m_data(nullptr) { m_data = new unsigned char[23U + 3U]; } @@ -90,7 +90,7 @@ CNXDNUDCH::~CNXDNUDCH() bool CNXDNUDCH::decode(const unsigned char* data) { - assert(data != NULL); + assert(data != nullptr); unsigned char temp1[44U]; @@ -136,7 +136,7 @@ bool CNXDNUDCH::decode(const unsigned char* data) void CNXDNUDCH::encode(unsigned char* data) const { - assert(data != NULL); + assert(data != nullptr); unsigned char temp1[25U]; ::memset(temp1, 0x00U, 25U); @@ -177,14 +177,14 @@ unsigned char CNXDNUDCH::getRAN() const void CNXDNUDCH::getData(unsigned char* data) const { - assert(data != NULL); + assert(data != nullptr); ::memcpy(data, m_data + 1U, 22U); } void CNXDNUDCH::getRaw(unsigned char* data) const { - assert(data != NULL); + assert(data != nullptr); ::memset(data, 0x00U, 25U); ::memcpy(data, m_data, 23U); @@ -197,14 +197,14 @@ void CNXDNUDCH::setRAN(unsigned char ran) void CNXDNUDCH::setData(const unsigned char* data) { - assert(data != NULL); + assert(data != nullptr); ::memcpy(m_data + 1U, data, 22U); } void CNXDNUDCH::setRaw(const unsigned char* data) { - assert(data != NULL); + assert(data != nullptr); ::memcpy(m_data, data, 25U); } diff --git a/P25Audio.cpp b/P25Audio.cpp index 5f2f9b2..d4ef26d 100644 --- a/P25Audio.cpp +++ b/P25Audio.cpp @@ -1,5 +1,5 @@ /* -* Copyright (C) 2016,2023 by Jonathan Naylor G4KLX +* Copyright (C) 2016,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 @@ -50,7 +50,7 @@ CP25Audio::~CP25Audio() unsigned int CP25Audio::process(unsigned char* data) { - assert(data != NULL); + assert(data != nullptr); unsigned int errs = 0U; @@ -97,8 +97,8 @@ unsigned int CP25Audio::process(unsigned char* data) void CP25Audio::decode(const unsigned char* data, unsigned char* imbe, unsigned int n) { - assert(data != NULL); - assert(imbe != NULL); + assert(data != nullptr); + assert(imbe != nullptr); unsigned char temp[18U]; @@ -206,8 +206,8 @@ void CP25Audio::decode(const unsigned char* data, unsigned char* imbe, unsigned void CP25Audio::encode(unsigned char* data, const unsigned char* imbe, unsigned int n) { - assert(data != NULL); - assert(imbe != NULL); + assert(data != nullptr); + assert(imbe != nullptr); bool bTemp[144U]; bool* bit = bTemp; diff --git a/P25Control.cpp b/P25Control.cpp index b6ef18d..5fbd64d 100644 --- a/P25Control.cpp +++ b/P25Control.cpp @@ -1,5 +1,5 @@ /* -* Copyright (C) 2016-2019,2021,2023,2024 by Jonathan Naylor G4KLX +* Copyright (C) 2016-2019,2021,2023,2024,2025 by Jonathan Naylor G4KLX * Copyright (C) 2018 by Bryan Biedenkapp N2PLL * * This program is free software; you can redistribute it and/or modify @@ -51,8 +51,8 @@ m_network(network), 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), @@ -72,11 +72,11 @@ m_rfData(), m_netData(), m_rfLSD(), m_netLSD(), -m_netLDU1(NULL), -m_netLDU2(NULL), -m_lastIMBE(NULL), -m_rfLDU(NULL), -m_rfPDU(NULL), +m_netLDU1(nullptr), +m_netLDU2(nullptr), +m_lastIMBE(nullptr), +m_rfLDU(nullptr), +m_rfPDU(nullptr), m_rfPDUCount(0U), m_rfPDUBits(0U), m_rssiMapper(rssiMapper), @@ -101,7 +101,7 @@ m_enabled(true) ::memset(m_netLDU2, 0x00U, 9U * 25U); m_lastIMBE = new unsigned char[11U]; - ::memcpy(m_lastIMBE, P25_NULL_IMBE, 11U); + ::memcpy(m_lastIMBE, P25_nullptr_IMBE, 11U); m_rfLDU = new unsigned char[P25_LDU_FRAME_LENGTH_BYTES]; ::memset(m_rfLDU, 0x00U, P25_LDU_FRAME_LENGTH_BYTES); @@ -121,14 +121,14 @@ CP25Control::~CP25Control() bool CP25Control::writeModem(unsigned char* data, unsigned int len) { - assert(data != NULL); + assert(data != nullptr); if (!m_enabled) return false; 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(); unsigned int srcId = m_rfData.getSrcId(); @@ -146,7 +146,7 @@ bool CP25Control::writeModem(unsigned char* data, unsigned int len) 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(); @@ -162,17 +162,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(); @@ -220,7 +220,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) { @@ -234,7 +234,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) { @@ -273,7 +273,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); writeJSONRF("start", srcId, source, grp, dstId); - m_rfState = RS_RF_AUDIO; + m_rfState = RPT_RF_STATE::AUDIO; m_minRSSI = m_rssi; m_maxRSSI = m_rssi; @@ -288,11 +288,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) { @@ -344,7 +344,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); @@ -497,7 +497,7 @@ bool CP25Control::writeModem(unsigned char* data, unsigned int len) unsigned int srcId = m_rfData.getSrcId(); std::string source = m_lookup->find(srcId); - m_rfState = RS_RF_LISTENING; + m_rfState = RPT_RF_STATE::LISTENING; m_rfTimeout.stop(); m_rfData.reset(); m_lastDUID = duid; @@ -521,10 +521,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; } @@ -554,12 +554,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; @@ -617,7 +617,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; } @@ -630,7 +630,7 @@ bool CP25Control::writeModem(unsigned char* data, unsigned int len) unsigned int CP25Control::readModem(unsigned char* data) { - assert(data != NULL); + assert(data != nullptr); if (m_queue.isEmpty()) return 0U; @@ -647,7 +647,7 @@ void CP25Control::writeNetwork() { unsigned char data[100U]; - if (m_network == NULL) + if (m_network == nullptr) return; unsigned int length = m_network->read(data, 100U); @@ -657,7 +657,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(); @@ -698,7 +698,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: @@ -735,7 +735,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 { @@ -753,13 +753,13 @@ void CP25Control::writeNetwork() void CP25Control::clock(unsigned int ms) { - if (m_network != NULL) + if (m_network != nullptr) writeNetwork(); 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()) { @@ -767,7 +767,7 @@ void CP25Control::clock(unsigned int ms) writeJSONNet("lost", float(m_netFrames) / 50.0F, float(m_netLost * 100U) / float(m_netFrames)); m_networkWatchdog.stop(); - m_netState = RS_NET_IDLE; + m_netState = RPT_NET_STATE::IDLE; m_netData.reset(); m_netTimeout.stop(); } @@ -776,7 +776,7 @@ void CP25Control::clock(unsigned int ms) void CP25Control::writeQueueRF(const unsigned char* data, unsigned int length) { - assert(data != NULL); + assert(data != nullptr); if (m_rfTimeout.isRunning() && m_rfTimeout.hasExpired()) return; @@ -795,7 +795,7 @@ void CP25Control::writeQueueRF(const unsigned char* data, unsigned int length) void CP25Control::writeQueueNet(const unsigned char* data, unsigned int length) { - assert(data != NULL); + assert(data != nullptr); if (m_netTimeout.isRunning() && m_netTimeout.hasExpired()) return; @@ -814,9 +814,9 @@ void CP25Control::writeQueueNet(const unsigned char* data, unsigned int length) void CP25Control::writeNetwork(const unsigned char *data, unsigned char type, bool end) { - assert(data != NULL); + assert(data != nullptr); - if (m_network == NULL) + if (m_network == nullptr) return; if (m_rfTimeout.isRunning() && m_rfTimeout.hasExpired()) @@ -837,7 +837,7 @@ void CP25Control::writeNetwork(const unsigned char *data, unsigned char type, bo void CP25Control::setBusyBits(unsigned char* data, unsigned int ssOffset, bool b1, bool b2) { - assert(data != NULL); + assert(data != nullptr); WRITE_BIT(data, ssOffset, b1); WRITE_BIT(data, ssOffset + 1U, b2); @@ -845,9 +845,9 @@ void CP25Control::setBusyBits(unsigned char* data, unsigned int ssOffset, bool b void CP25Control::addBusyBits(unsigned char* data, unsigned int length, bool b1, bool b2) { - assert(data != NULL); + assert(data != nullptr); - 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); @@ -856,7 +856,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 @@ -868,7 +868,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 diff --git a/P25Data.cpp b/P25Data.cpp index 46794f9..12e190e 100644 --- a/P25Data.cpp +++ b/P25Data.cpp @@ -1,5 +1,5 @@ /* -* Copyright (C) 2016,2017,2023,2024 by Jonathan Naylor G4KLX +* Copyright (C) 2016,2017,2023,2024,2025 by Jonathan Naylor G4KLX * Copyright (C) 2018 by Bryan Biedenkapp N2PLL * * This program is free software; you can redistribute it and/or modify @@ -38,7 +38,7 @@ const unsigned char BIT_MASK_TABLE[] = { 0x80U, 0x40U, 0x20U, 0x10U, 0x08U, 0x04 #define READ_BIT(p,i) (p[(i)>>3] & BIT_MASK_TABLE[(i)&7]) CP25Data::CP25Data() : -m_mi(NULL), +m_mi(nullptr), m_mfId(0U), m_algId(P25_ALGO_UNENCRYPT), m_kId(0U), @@ -79,7 +79,7 @@ CP25Data& CP25Data::operator=(const CP25Data& data) bool CP25Data::decodeHeader(const unsigned char* data) { - assert(data != NULL); + assert(data != nullptr); // deinterleave unsigned char rs[81U]; @@ -118,8 +118,8 @@ bool CP25Data::decodeHeader(const unsigned char* data) void CP25Data::encodeHeader(unsigned char* data) { - assert(data != NULL); - assert(m_mi != NULL); + assert(data != nullptr); + assert(m_mi != nullptr); unsigned char rs[81U]; ::memset(rs, 0x00U, 81U); @@ -149,7 +149,7 @@ void CP25Data::encodeHeader(unsigned char* data) bool CP25Data::decodeLDU1(const unsigned char* data) { - assert(data != NULL); + assert(data != nullptr); unsigned char rs[18U]; @@ -206,7 +206,7 @@ bool CP25Data::decodeLDU1(const unsigned char* data) void CP25Data::encodeLDU1(unsigned char* data) { - assert(data != NULL); + assert(data != nullptr); unsigned char rs[18U]; ::memset(rs, 0x00U, 18U); @@ -260,7 +260,7 @@ void CP25Data::encodeLDU1(unsigned char* data) bool CP25Data::decodeLDU2(const unsigned char* data) { - assert(data != NULL); + assert(data != nullptr); unsigned char rs[18U]; @@ -312,8 +312,8 @@ bool CP25Data::decodeLDU2(const unsigned char* data) void CP25Data::encodeLDU2(unsigned char* data) { - assert(data != NULL); - assert(m_mi != NULL); + assert(data != nullptr); + assert(m_mi != nullptr); unsigned char rs[18U]; ::memset(rs, 0x00U, 18U); @@ -351,7 +351,7 @@ void CP25Data::encodeLDU2(unsigned char* data) bool CP25Data::decodeTSDU(const unsigned char* data) { - assert(data != NULL); + assert(data != nullptr); // deinterleave unsigned char tsbk[12U]; @@ -406,7 +406,7 @@ bool CP25Data::decodeTSDU(const unsigned char* data) void CP25Data::encodeTSDU(unsigned char* data) { - assert(data != NULL); + assert(data != nullptr); unsigned char tsbk[12U]; ::memset(tsbk, 0x00U, 12U); @@ -461,14 +461,14 @@ void CP25Data::encodeTSDU(unsigned char* data) void CP25Data::setMI(const unsigned char* mi) { - assert(mi != NULL); + assert(mi != nullptr); ::memcpy(m_mi, mi, P25_MI_LENGTH_BYTES); } void CP25Data::getMI(unsigned char* mi) const { - assert(mi != NULL); + assert(mi != nullptr); ::memcpy(mi, m_mi, P25_MI_LENGTH_BYTES); } diff --git a/P25Defines.h b/P25Defines.h index 815f75a..b4377b9 100644 --- a/P25Defines.h +++ b/P25Defines.h @@ -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 * * 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; @@ -75,6 +75,6 @@ const unsigned char P25_DUID_LDU2 = 0x0AU; const unsigned char P25_DUID_PDU = 0x0CU; const unsigned char P25_DUID_TERM_LC = 0x0FU; -const unsigned char P25_NULL_IMBE[] = {0x04U, 0x0CU, 0xFDU, 0x7BU, 0xFBU, 0x7DU, 0xF2U, 0x7BU, 0x3DU, 0x9EU, 0x45U}; +const unsigned char P25_nullptr_IMBE[] = {0x04U, 0x0CU, 0xFDU, 0x7BU, 0xFBU, 0x7DU, 0xF2U, 0x7BU, 0x3DU, 0x9EU, 0x45U}; #endif diff --git a/P25LowSpeedData.cpp b/P25LowSpeedData.cpp index 84a83eb..32c0c3d 100644 --- a/P25LowSpeedData.cpp +++ b/P25LowSpeedData.cpp @@ -1,5 +1,5 @@ /* -* Copyright (C) 2016,2023 by Jonathan Naylor G4KLX +* Copyright (C) 2016,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 @@ -56,7 +56,7 @@ CP25LowSpeedData::~CP25LowSpeedData() void CP25LowSpeedData::process(unsigned char* data) { - assert(data != NULL); + assert(data != nullptr); unsigned char lsd[4U]; CP25Utils::decode(data, lsd, 1546U, 1578U); @@ -95,7 +95,7 @@ void CP25LowSpeedData::process(unsigned char* data) void CP25LowSpeedData::encode(unsigned char* data) const { - assert(data != NULL); + assert(data != nullptr); unsigned char lsd[4U]; lsd[0U] = m_lsd1; diff --git a/P25NID.cpp b/P25NID.cpp index e0afab0..8df8b9c 100644 --- a/P25NID.cpp +++ b/P25NID.cpp @@ -1,5 +1,5 @@ /* -* Copyright (C) 2016,2018,2023 by Jonathan Naylor G4KLX +* Copyright (C) 2016,2018,2023,2025 by Jonathan Naylor G4KLX * Copyright (C) 2018 by Bryan Biedenkapp * * This program is free software; you can redistribute it and/or modify @@ -31,13 +31,13 @@ const unsigned int MAX_NID_ERRS = 5U; CP25NID::CP25NID(unsigned int nac) : m_duid(0U), -m_hdr(NULL), -m_ldu1(NULL), -m_ldu2(NULL), -m_termlc(NULL), -m_term(NULL), -m_tsdu(NULL), -m_pdu(NULL) +m_hdr(nullptr), +m_ldu1(nullptr), +m_ldu2(nullptr), +m_termlc(nullptr), +m_term(nullptr), +m_tsdu(nullptr), +m_pdu(nullptr) { CBCH bch; @@ -104,7 +104,7 @@ CP25NID::~CP25NID() bool CP25NID::decode(const unsigned char* data) { - assert(data != NULL); + assert(data != nullptr); unsigned char nid[P25_NID_LENGTH_BYTES]; CP25Utils::decode(data, nid, 48U, 114U); @@ -156,7 +156,7 @@ bool CP25NID::decode(const unsigned char* data) void CP25NID::encode(unsigned char* data, unsigned char duid) const { - assert(data != NULL); + assert(data != nullptr); switch (duid) { case P25_DUID_HEADER: diff --git a/P25Network.cpp b/P25Network.cpp index 2f167ec..5f310a3 100644 --- a/P25Network.cpp +++ b/P25Network.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2009-2014,2016,2019,2020,2021,2023 by Jonathan Naylor G4KLX + * Copyright (C) 2009-2014,2016,2019,2020,2021,2023,2025 by Jonathan Naylor G4KLX * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -119,7 +119,7 @@ bool CP25Network::open() bool CP25Network::writeLDU1(const unsigned char* ldu1, const CP25Data& control, const CP25LowSpeedData& lsd, bool end) { - assert(ldu1 != NULL); + assert(ldu1 != nullptr); unsigned char buffer[22U]; @@ -248,7 +248,7 @@ bool CP25Network::writeLDU1(const unsigned char* ldu1, const CP25Data& control, bool CP25Network::writeLDU2(const unsigned char* ldu2, const CP25Data& control, const CP25LowSpeedData& lsd, bool end) { - assert(ldu2 != NULL); + assert(ldu2 != nullptr); unsigned char buffer[22U]; @@ -410,7 +410,7 @@ void CP25Network::clock(unsigned int ms) unsigned int CP25Network::read(unsigned char* data, unsigned int length) { - assert(data != NULL); + assert(data != nullptr); if (m_buffer.isEmpty()) return 0U; diff --git a/P25Trellis.cpp b/P25Trellis.cpp index 70e7b4b..3c4bcde 100644 --- a/P25Trellis.cpp +++ b/P25Trellis.cpp @@ -1,5 +1,5 @@ /* -* Copyright (C) 2016,2018,2023,2024 by Jonathan Naylor, G4KLX +* Copyright (C) 2016,2018,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 @@ -56,8 +56,8 @@ CP25Trellis::~CP25Trellis() bool CP25Trellis::decode34(const unsigned char* data, unsigned char* payload) { - assert(data != NULL); - assert(payload != NULL); + assert(data != nullptr); + assert(payload != nullptr); signed char dibits[98U]; deinterleave(data, dibits); @@ -90,8 +90,8 @@ bool CP25Trellis::decode34(const unsigned char* data, unsigned char* payload) void CP25Trellis::encode34(const unsigned char* payload, unsigned char* data) { - assert(payload != NULL); - assert(data != NULL); + assert(payload != nullptr); + assert(data != nullptr); unsigned char tribits[49U]; bitsToTribits(payload, tribits); @@ -115,8 +115,8 @@ void CP25Trellis::encode34(const unsigned char* payload, unsigned char* data) bool CP25Trellis::decode12(const unsigned char* data, unsigned char* payload) { - assert(data != NULL); - assert(payload != NULL); + assert(data != nullptr); + assert(payload != nullptr); signed char dibits[98U]; deinterleave(data, dibits); @@ -149,8 +149,8 @@ bool CP25Trellis::decode12(const unsigned char* data, unsigned char* payload) void CP25Trellis::encode12(const unsigned char* payload, unsigned char* data) { - assert(payload != NULL); - assert(data != NULL); + assert(payload != nullptr); + assert(data != nullptr); unsigned char bits[49U]; bitsToDibits(payload, bits); diff --git a/P25Utils.cpp b/P25Utils.cpp index cd4aecd..74ababb 100644 --- a/P25Utils.cpp +++ b/P25Utils.cpp @@ -1,5 +1,5 @@ /* -* Copyright (C) 2016,2018,2023 by Jonathan Naylor G4KLX +* Copyright (C) 2016,2018,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 @@ -31,24 +31,24 @@ const unsigned char BIT_MASK_TABLE[] = { 0x80U, 0x40U, 0x20U, 0x10U, 0x08U, 0x04 unsigned int CP25Utils::decode(const unsigned char* in, unsigned char* out, unsigned int start, unsigned int stop) { - assert(in != NULL); - assert(out != NULL); + assert(in != nullptr); + assert(out != nullptr); // Move the SSx positions to the range needed unsigned int ss0Pos = P25_SS0_START; 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); @@ -61,24 +61,24 @@ unsigned int CP25Utils::decode(const unsigned char* in, unsigned char* out, unsi unsigned int CP25Utils::encode(const unsigned char* in, unsigned char* out, unsigned int start, unsigned int stop) { - assert(in != NULL); - assert(out != NULL); + assert(in != nullptr); + assert(out != nullptr); // Move the SSx positions to the range needed unsigned int ss0Pos = P25_SS0_START; 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); @@ -91,8 +91,8 @@ unsigned int CP25Utils::encode(const unsigned char* in, unsigned char* out, unsi unsigned int CP25Utils::encode(const unsigned char* in, unsigned char* out, unsigned int length) { - assert(in != NULL); - assert(out != NULL); + assert(in != nullptr); + assert(out != nullptr); // Move the SSx positions to the range needed unsigned int ss0Pos = P25_SS0_START; @@ -102,9 +102,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); @@ -118,8 +118,8 @@ unsigned int CP25Utils::encode(const unsigned char* in, unsigned char* out, unsi unsigned int CP25Utils::compare(const unsigned char* data1, const unsigned char* data2, unsigned int length) { - assert(data1 != NULL); - assert(data2 != NULL); + assert(data1 != nullptr); + assert(data2 != nullptr); unsigned int errs = 0U; for (unsigned int i = 0U; i < length; i++) { diff --git a/POCSAGControl.cpp b/POCSAGControl.cpp index eec6945..b1446fc 100644 --- a/POCSAGControl.cpp +++ b/POCSAGControl.cpp @@ -1,5 +1,5 @@ /* -* Copyright (C) 2018,2019,2020,2023 Jonathan Naylor, G4KLX +* Copyright (C) 2018,2019,2020,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 @@ -84,7 +84,7 @@ CPOCSAGControl::~CPOCSAGControl() unsigned int CPOCSAGControl::readModem(unsigned char* data) { - assert(data != NULL); + assert(data != nullptr); if (m_queue.isEmpty()) return 0U; @@ -195,7 +195,7 @@ void CPOCSAGControl::sendPageAlert2(unsigned int ric, const std::string& text) bool CPOCSAGControl::readNetwork() { - if (m_network == NULL) + if (m_network == nullptr) return true; unsigned char data[300U]; @@ -292,7 +292,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; @@ -301,7 +301,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; } @@ -310,7 +310,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(); @@ -320,22 +320,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(); @@ -346,7 +346,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); } @@ -355,7 +355,7 @@ 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); writeJSON("network", 0U, "end"); m_state = PS_NONE; @@ -426,7 +426,7 @@ void CPOCSAGControl::packNumeric(const std::string& text, std::deque& for (std::string::const_iterator it = text.cbegin(); it != text.cend(); ++it) { char c = *it; - const BCD* bcd = NULL; + const BCD* bcd = nullptr; for (unsigned int i = 0U; BCD_VALUES[i].m_c != 0; i++) { if (BCD_VALUES[i].m_c == c) { bcd = BCD_VALUES + i; @@ -434,7 +434,7 @@ void CPOCSAGControl::packNumeric(const std::string& text, std::deque& } } - if (bcd != NULL) { + if (bcd != nullptr) { word |= bcd->m_bcd[n]; n++; @@ -519,7 +519,7 @@ void CPOCSAGControl::enable(bool enabled) delete *it; m_data.clear(); - m_state = PS_NONE; + m_state = POCSAG_STATE::NONE; } m_enabled = enabled; diff --git a/POCSAGControl.h b/POCSAGControl.h index 5e7e70b..ffcfcbe 100644 --- a/POCSAGControl.h +++ b/POCSAGControl.h @@ -1,5 +1,5 @@ /* -* Copyright (C) 2018,2019,2020,2023 by Jonathan Naylor G4KLX +* Copyright (C) 2018,2019,2020,2023,2025 by Jonathan Naylor G4KLX * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -62,11 +62,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 m_output; diff --git a/POCSAGNetwork.cpp b/POCSAGNetwork.cpp index 2999856..01a8fab 100644 --- a/POCSAGNetwork.cpp +++ b/POCSAGNetwork.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2018,2019,2020,2021,2023 by Jonathan Naylor G4KLX + * Copyright (C) 2018,2019,2020,2021,2023,2025 by Jonathan Naylor G4KLX * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -89,7 +89,7 @@ void CPOCSAGNetwork::clock(unsigned int ms) unsigned int CPOCSAGNetwork::read(unsigned char* data) { - assert(data != NULL); + assert(data != nullptr); if (m_buffer.isEmpty()) return 0U; diff --git a/QR1676.cpp b/QR1676.cpp index 42ec9f4..f2f1e63 100644 --- a/QR1676.cpp +++ b/QR1676.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2015,2016,2023 by Jonathan Naylor G4KLX + * Copyright (C) 2015,2016,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 @@ -94,7 +94,7 @@ unsigned int CQR1676::getSyndrome1576(unsigned int pattern) // Compute the EMB against a precomputed list of correct words void CQR1676::encode(unsigned char* data) { - assert(data != NULL); + assert(data != nullptr); unsigned int value = (data[0U] >> 1) & 0x7FU; unsigned int cksum = ENCODING_TABLE_1676[value]; @@ -105,7 +105,7 @@ void CQR1676::encode(unsigned char* data) unsigned char CQR1676::decode(const unsigned char* data) { - assert(data != NULL); + assert(data != nullptr); unsigned int code = (data[0U] << 7) + (data[1U] >> 1); unsigned int syndrome = getSyndrome1576(code); diff --git a/RS.h b/RS.h index 16cc53f..2ff4d2e 100644 --- a/RS.h +++ b/RS.h @@ -1,7 +1,7 @@ /* * Copyright (C) 2014 Hard Consulting Corporation * Copyright (C) 2023 Bryan Biedenkapp, N2PLL - * Copyright (C) 2024 Jonathan Naylor, G4KLX + * Copyright (C) 2024,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 @@ -1044,16 +1044,16 @@ TYP cor = alpha_to[modnn(index_of[num1] + index_of[num2] + NN - index_of[den])]; // Store the error correction pattern, if a correction buffer is available - if (corr != NULL) + if (corr != nullptr) corr[j] = cor; // If a data/parity buffer is given and the error is inside the message or // parity data, correct it if (loc[j] < (NN - NROOTS)) { - if (data != NULL) + if (data != nullptr) data[loc[j] - pad] ^= cor; } else if (loc[j] < NN) { - if (parity != NULL) + if (parity != nullptr) parity[loc[j] - (NN - NROOTS)] ^= cor; } } @@ -1082,7 +1082,7 @@ LogDebug(LOG_HOST, "%s", ss.str().c_str()); } #endif - if (eras_pos != NULL) { + if (eras_pos != nullptr) { for (int i = 0; i < count; i++) eras_pos[i] = loc[i] - pad; } diff --git a/RS129.cpp b/RS129.cpp index e152d84..144f6bd 100644 --- a/RS129.cpp +++ b/RS129.cpp @@ -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 @@ -103,8 +103,8 @@ static unsigned char gmult(unsigned char a, unsigned char b) */ void CRS129::encode(const unsigned char* msg, unsigned int nbytes, unsigned char* parity) { - assert(msg != NULL); - assert(parity != NULL); + assert(msg != nullptr); + assert(parity != nullptr); for (unsigned int i = 0U; i < NPAR + 1U; i++) parity[i] = 0x00U; @@ -122,7 +122,7 @@ void CRS129::encode(const unsigned char* msg, unsigned int nbytes, unsigned char // Reed-Solomon (12,9) check bool CRS129::check(const unsigned char* in) { - assert(in != NULL); + assert(in != nullptr); unsigned char parity[4U]; encode(in, 9U, parity); diff --git a/RS634717.cpp b/RS634717.cpp index e6fc7fd..ed435c4 100644 --- a/RS634717.cpp +++ b/RS634717.cpp @@ -1,5 +1,5 @@ /* -* Copyright (C) 2016,2023,2024 by Jonathan Naylor G4KLX +* Copyright (C) 2016,2023,2024,2025 by Jonathan Naylor G4KLX * Copyright (C) 2018,2023 by Bryan Biedenkapp N2PLL * * This program is free software; you can redistribute it and/or modify @@ -165,7 +165,7 @@ CRS634717::~CRS634717() bool CRS634717::decode241213(unsigned char* data) { - assert(data != NULL); + assert(data != nullptr); std::vector codeword(63, 0); @@ -187,7 +187,7 @@ bool CRS634717::decode241213(unsigned char* data) void CRS634717::encode241213(unsigned char* data) { - assert(data != NULL); + assert(data != nullptr); unsigned char codeword[24U]; @@ -208,7 +208,7 @@ void CRS634717::encode241213(unsigned char* data) bool CRS634717::decode24169(unsigned char* data) { - assert(data != NULL); + assert(data != nullptr); std::vector codeword(63, 0); @@ -230,7 +230,7 @@ bool CRS634717::decode24169(unsigned char* data) void CRS634717::encode24169(unsigned char* data) { - assert(data != NULL); + assert(data != nullptr); unsigned char codeword[24U]; @@ -251,7 +251,7 @@ void CRS634717::encode24169(unsigned char* data) bool CRS634717::decode362017(unsigned char* data) { - assert(data != NULL); + assert(data != nullptr); std::vector codeword(63, 0); @@ -273,7 +273,7 @@ bool CRS634717::decode362017(unsigned char* data) void CRS634717::encode362017(unsigned char* data) { - assert(data != NULL); + assert(data != nullptr); unsigned char codeword[36U]; diff --git a/RSSIInterpolator.cpp b/RSSIInterpolator.cpp index b277fbc..25a04f0 100644 --- a/RSSIInterpolator.cpp +++ b/RSSIInterpolator.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2016 by Jonathan Naylor G4KLX + * Copyright (C) 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 @@ -38,20 +38,20 @@ CRSSIInterpolator::~CRSSIInterpolator() bool CRSSIInterpolator::load(const std::string& filename) { FILE* fp = ::fopen(filename.c_str(), "rt"); - if (fp == NULL) { + if (fp == nullptr) { LogWarning("Cannot open the RSSI data file - %s", filename.c_str()); return false; } char buffer[100U]; - while (::fgets(buffer, 100, fp) != NULL) { + while (::fgets(buffer, 100, fp) != nullptr) { if (buffer[0U] == '#') continue; char* p1 = ::strtok(buffer, " \t\r\n"); - char* p2 = ::strtok(NULL, " \t\r\n"); + char* p2 = ::strtok(nullptr, " \t\r\n"); - if (p1 != NULL && p2 != NULL) { + if (p1 != nullptr && p2 != nullptr) { uint16_t raw = uint16_t(::atoi(p1)); int rssi = ::atoi(p2); m_map.insert(std::pair(raw, rssi)); diff --git a/RemoteControl.cpp b/RemoteControl.cpp index 87c31a5..8576f25 100644 --- a/RemoteControl.cpp +++ b/RemoteControl.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019,2020,2021,2023,2024 by Jonathan Naylor G4KLX + * Copyright (C) 2019,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 diff --git a/RemoteControl.h b/RemoteControl.h index 15480bf..5a5871b 100644 --- a/RemoteControl.h +++ b/RemoteControl.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2019,2020,2021,2023,2024 by Jonathan Naylor G4KLX + * Copyright (C) 2019,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 @@ -28,7 +28,7 @@ class CMMDVMHost; -enum REMOTE_COMMAND { +enum class REMOTE_COMMAND { RCD_NONE, RCD_MODE_IDLE, RCD_MODE_LOCKOUT, diff --git a/RingBuffer.h b/RingBuffer.h index 707de1c..c9496ac 100644 --- a/RingBuffer.h +++ b/RingBuffer.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2006-2009,2012,2013,2015,2016 by Jonathan Naylor G4KLX + * Copyright (C) 2006-2009,2012,2013,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 @@ -30,12 +30,12 @@ public: CRingBuffer(unsigned int length, const char* name) : m_length(length), m_name(name), - m_buffer(NULL), + m_buffer(nullptr), m_iPtr(0U), m_oPtr(0U) { assert(length > 0U); - assert(name != NULL); + assert(name != nullptr); m_buffer = new T[length]; diff --git a/StopWatch.cpp b/StopWatch.cpp index 481241b..3d59e12 100644 --- a/StopWatch.cpp +++ b/StopWatch.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2015,2016,2018 by Jonathan Naylor G4KLX + * Copyright (C) 2015,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 @@ -77,7 +77,7 @@ CStopWatch::~CStopWatch() unsigned long long CStopWatch::time() const { struct timeval now; - ::gettimeofday(&now, NULL); + ::gettimeofday(&now, nullptr); return now.tv_sec * 1000ULL + now.tv_usec / 1000ULL; } diff --git a/Sync.cpp b/Sync.cpp index f437f61..3b324f0 100644 --- a/Sync.cpp +++ b/Sync.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2015,2016,2018,2020,2021,2023 by Jonathan Naylor G4KLX + * Copyright (C) 2015,2016,2018,2020,2021,2023,2025 by Jonathan Naylor G4KLX * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -32,7 +32,7 @@ #if defined(USE_DSTAR) void CSync::addDStarSync(unsigned char* data) { - assert(data != NULL); + assert(data != nullptr); ::memcpy(data + DSTAR_VOICE_FRAME_LENGTH_BYTES, DSTAR_SYNC_BYTES, DSTAR_DATA_FRAME_LENGTH_BYTES); } @@ -41,7 +41,7 @@ void CSync::addDStarSync(unsigned char* data) #if defined(USE_DMR) void CSync::addDMRDataSync(unsigned char* data, bool duplex) { - assert(data != NULL); + assert(data != nullptr); if (duplex) { for (unsigned int i = 0U; i < 7U; i++) @@ -54,7 +54,7 @@ void CSync::addDMRDataSync(unsigned char* data, bool duplex) void CSync::addDMRAudioSync(unsigned char* data, bool duplex) { - assert(data != NULL); + assert(data != nullptr); if (duplex) { for (unsigned int i = 0U; i < 7U; i++) @@ -69,7 +69,7 @@ void CSync::addDMRAudioSync(unsigned char* data, bool duplex) #if defined(USE_YSF) void CSync::addYSFSync(unsigned char* data) { - assert(data != NULL); + assert(data != nullptr); ::memcpy(data, YSF_SYNC_BYTES, YSF_SYNC_LENGTH_BYTES); } @@ -78,7 +78,7 @@ void CSync::addYSFSync(unsigned char* data) #if defined(USE_P25) void CSync::addP25Sync(unsigned char* data) { - assert(data != NULL); + assert(data != nullptr); ::memcpy(data, P25_SYNC_BYTES, P25_SYNC_LENGTH_BYTES); } @@ -87,7 +87,7 @@ void CSync::addP25Sync(unsigned char* data) #if defined(USE_NXDN) void CSync::addNXDNSync(unsigned char* data) { - assert(data != NULL); + assert(data != nullptr); for (unsigned int i = 0U; i < NXDN_FSW_BYTES_LENGTH; i++) data[i] = (data[i] & ~NXDN_FSW_BYTES_MASK[i]) | NXDN_FSW_BYTES[i]; @@ -97,21 +97,21 @@ void CSync::addNXDNSync(unsigned char* data) #if defined(USE_M17) void CSync::addM17LinkSetupSync(unsigned char* data) { - assert(data != NULL); + assert(data != nullptr); ::memcpy(data, M17_LINK_SETUP_SYNC_BYTES, M17_SYNC_LENGTH_BYTES); } void CSync::addM17StreamSync(unsigned char* data) { - assert(data != NULL); + assert(data != nullptr); ::memcpy(data, M17_STREAM_SYNC_BYTES, M17_SYNC_LENGTH_BYTES); } void CSync::addM17EOTSync(unsigned char* data) { - assert(data != NULL); + assert(data != nullptr); ::memcpy(data, M17_EOT_SYNC_BYTES, M17_SYNC_LENGTH_BYTES); } diff --git a/Thread.cpp b/Thread.cpp index 6f76f5b..86b8967 100644 --- a/Thread.cpp +++ b/Thread.cpp @@ -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 @@ -31,9 +31,9 @@ CThread::~CThread() bool CThread::run() { - m_handle = ::CreateThread(NULL, 0, &helper, this, 0, NULL); + m_handle = ::CreateThread(nullptr, 0, &helper, this, 0, nullptr); - return m_handle != NULL; + return m_handle != nullptr; } @@ -74,13 +74,13 @@ CThread::~CThread() bool CThread::run() { - return ::pthread_create(&m_thread, NULL, helper, this) == 0; + return ::pthread_create(&m_thread, nullptr, helper, this) == 0; } void CThread::wait() { - ::pthread_join(m_thread, NULL); + ::pthread_join(m_thread, nullptr); } @@ -90,7 +90,7 @@ void* CThread::helper(void* arg) p->entry(); - return NULL; + return nullptr; } void CThread::sleep(unsigned int ms) @@ -100,7 +100,7 @@ void CThread::sleep(unsigned int ms) ts.tv_sec = ms / 1000U; ts.tv_nsec = (ms % 1000U) * 1000000U; - ::nanosleep(&ts, NULL); + ::nanosleep(&ts, nullptr); } #endif diff --git a/UARTController.cpp b/UARTController.cpp index 2400c33..a34f067 100644 --- a/UARTController.cpp +++ b/UARTController.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2002-2004,2007-2011,2013,2014-2017,2019,2020,2021 by Jonathan Naylor G4KLX + * Copyright (C) 2002-2004,2007-2011,2013,2014-2017,2019,2020,2021,2025 by Jonathan Naylor G4KLX * Copyright (C) 1999-2001 by Thomas Sailor HB9JNX * * This program is free software; you can redistribute it and/or modify @@ -68,7 +68,7 @@ bool CUARTController::open() std::string baseName = m_device.substr(4U); // Convert "\\.\COM10" to "COM10" - m_handle = ::CreateFileA(m_device.c_str(), GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); + m_handle = ::CreateFileA(m_device.c_str(), GENERIC_READ | GENERIC_WRITE, 0, nullptr, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, nullptr); if (m_handle == INVALID_HANDLE_VALUE) { LogError("Cannot open device - %s, err=%04lx", m_device.c_str(), ::GetLastError()); return false; @@ -77,7 +77,7 @@ bool CUARTController::open() DCB dcb; if (::GetCommState(m_handle, &dcb) == 0) { LogError("Cannot get the attributes for %s, err=%04lx", m_device.c_str(), ::GetLastError()); - ::ClearCommError(m_handle, &errCode, NULL); + ::ClearCommError(m_handle, &errCode, nullptr); ::CloseHandle(m_handle); return false; } @@ -97,7 +97,7 @@ bool CUARTController::open() if (::SetCommState(m_handle, &dcb) == 0) { LogError("Cannot set the attributes for %s, err=%04lx", m_device.c_str(), ::GetLastError()); - ::ClearCommError(m_handle, &errCode, NULL); + ::ClearCommError(m_handle, &errCode, nullptr); ::CloseHandle(m_handle); return false; } @@ -105,7 +105,7 @@ bool CUARTController::open() COMMTIMEOUTS timeouts; if (!::GetCommTimeouts(m_handle, &timeouts)) { LogError("Cannot get the timeouts for %s, err=%04lx", m_device.c_str(), ::GetLastError()); - ::ClearCommError(m_handle, &errCode, NULL); + ::ClearCommError(m_handle, &errCode, nullptr); ::CloseHandle(m_handle); return false; } @@ -116,26 +116,26 @@ bool CUARTController::open() if (!::SetCommTimeouts(m_handle, &timeouts)) { LogError("Cannot set the timeouts for %s, err=%04lx", m_device.c_str(), ::GetLastError()); - ::ClearCommError(m_handle, &errCode, NULL); + ::ClearCommError(m_handle, &errCode, nullptr); ::CloseHandle(m_handle); return false; } if (::EscapeCommFunction(m_handle, CLRDTR) == 0) { LogError("Cannot clear DTR for %s, err=%04lx", m_device.c_str(), ::GetLastError()); - ::ClearCommError(m_handle, &errCode, NULL); + ::ClearCommError(m_handle, &errCode, nullptr); ::CloseHandle(m_handle); return false; } if (::EscapeCommFunction(m_handle, m_assertRTS ? SETRTS : CLRRTS) == 0) { LogError("Cannot set/clear RTS for %s, err=%04lx", m_device.c_str(), ::GetLastError()); - ::ClearCommError(m_handle, &errCode, NULL); + ::ClearCommError(m_handle, &errCode, nullptr); ::CloseHandle(m_handle); return false; } - ::ClearCommError(m_handle, &errCode, NULL); + ::ClearCommError(m_handle, &errCode, nullptr); return true; } @@ -143,7 +143,7 @@ bool CUARTController::open() int CUARTController::read(unsigned char* buffer, unsigned int length) { assert(m_handle != INVALID_HANDLE_VALUE); - assert(buffer != NULL); + assert(buffer != nullptr); unsigned int ptr = 0U; @@ -165,7 +165,7 @@ int CUARTController::read(unsigned char* buffer, unsigned int length) int CUARTController::readNonblock(unsigned char* buffer, unsigned int length) { assert(m_handle != INVALID_HANDLE_VALUE); - assert(buffer != NULL); + assert(buffer != nullptr); if (length == 0U) return 0; @@ -185,7 +185,7 @@ int CUARTController::readNonblock(unsigned char* buffer, unsigned int length) readLength = length; DWORD bytes = 0UL; - BOOL ret = ::ReadFile(m_handle, buffer, readLength, &bytes, NULL); + BOOL ret = ::ReadFile(m_handle, buffer, readLength, &bytes, nullptr); if (!ret) { LogError("Error from ReadFile for %s: %04lx", m_device.c_str(), ::GetLastError()); return -1; @@ -197,7 +197,7 @@ int CUARTController::readNonblock(unsigned char* buffer, unsigned int length) int CUARTController::write(const unsigned char* buffer, unsigned int length) { assert(m_handle != INVALID_HANDLE_VALUE); - assert(buffer != NULL); + assert(buffer != nullptr); if (length == 0U) return 0; @@ -206,7 +206,7 @@ int CUARTController::write(const unsigned char* buffer, unsigned int length) while (ptr < length) { DWORD bytes = 0UL; - BOOL ret = ::WriteFile(m_handle, buffer + ptr, length - ptr, &bytes, NULL); + BOOL ret = ::WriteFile(m_handle, buffer + ptr, length - ptr, &bytes, nullptr); if (!ret) { LogError("Error from WriteFile for %s: %04lx", m_device.c_str(), ::GetLastError()); return -1; @@ -414,7 +414,7 @@ int CUARTController::setNonblock(bool nonblock) int CUARTController::read(unsigned char* buffer, unsigned int length) { - assert(buffer != NULL); + assert(buffer != nullptr); assert(m_fd != -1); if (length == 0U) @@ -431,11 +431,11 @@ int CUARTController::read(unsigned char* buffer, unsigned int length) struct timeval tv; tv.tv_sec = 0; tv.tv_usec = 0; - n = ::select(m_fd + 1, &fds, NULL, NULL, &tv); + n = ::select(m_fd + 1, &fds, nullptr, nullptr, &tv); if (n == 0) return 0; } else { - n = ::select(m_fd + 1, &fds, NULL, NULL, NULL); + n = ::select(m_fd + 1, &fds, nullptr, nullptr, nullptr); } if (n < 0) { @@ -470,7 +470,7 @@ bool CUARTController::canWrite(){ timeo.tv_sec = 0; timeo.tv_usec = 0; - int rc = ::select(m_fd + 1, NULL, &wset, NULL, &timeo); + int rc = ::select(m_fd + 1, nullptr, &wset, nullptr, &timeo); if (rc > 0 && FD_ISSET(m_fd, &wset)) return true; @@ -482,7 +482,7 @@ bool CUARTController::canWrite(){ int CUARTController::write(const unsigned char* buffer, unsigned int length) { - assert(buffer != NULL); + assert(buffer != nullptr); assert(m_fd != -1); if (length == 0U) diff --git a/UDPController.cpp b/UDPController.cpp index 3996d32..9b0ace1 100644 --- a/UDPController.cpp +++ b/UDPController.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2021 by Jonathan Naylor G4KLX + * Copyright (C) 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 @@ -54,7 +54,7 @@ bool CUDPController::open() int CUDPController::read(unsigned char* buffer, unsigned int length) { - assert(buffer != NULL); + assert(buffer != nullptr); assert(length > 0U); unsigned char data[BUFFER_LENGTH]; @@ -85,7 +85,7 @@ int CUDPController::read(unsigned char* buffer, unsigned int length) int CUDPController::write(const unsigned char* buffer, unsigned int length) { - assert(buffer != NULL); + assert(buffer != nullptr); assert(length > 0U); return m_socket.write(buffer, length, m_addr, m_addrLen) ? int(length) : -1; diff --git a/UDPSocket.cpp b/UDPSocket.cpp index 7bb258e..2ca23de 100644 --- a/UDPSocket.cpp +++ b/UDPSocket.cpp @@ -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 @@ -88,7 +88,7 @@ int CUDPSocket::lookup(const std::string& hostname, unsigned short port, sockadd /* Port is always digits, no needs to lookup service */ hints.ai_flags |= AI_NUMERICSERV; - int err = ::getaddrinfo(hostname.empty() ? NULL : hostname.c_str(), portstr.c_str(), &hints, &res); + int err = ::getaddrinfo(hostname.empty() ? nullptr : hostname.c_str(), portstr.c_str(), &hints, &res); if (err != 0) { sockaddr_in* paddr = (sockaddr_in*)&addr; ::memset(paddr, 0x00U, address_length = sizeof(sockaddr_in)); @@ -113,7 +113,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; @@ -128,7 +128,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; @@ -227,7 +227,7 @@ bool CUDPSocket::open() int CUDPSocket::read(unsigned char* buffer, unsigned int length, sockaddr_storage& address, unsigned int &addressLength) { - assert(buffer != NULL); + assert(buffer != nullptr); assert(length > 0U); #if defined(_WIN32) || defined(_WIN64) @@ -295,7 +295,7 @@ int CUDPSocket::read(unsigned char* buffer, unsigned int length, sockaddr_storag bool CUDPSocket::write(const unsigned char* buffer, unsigned int length, const sockaddr_storage& address, unsigned int addressLength) { - assert(buffer != NULL); + assert(buffer != nullptr); assert(length > 0U); #if defined(_WIN32) || defined(_WIN64) assert(m_fd != INVALID_SOCKET); diff --git a/UDPSocket.h b/UDPSocket.h index 07bf274..fc0c422 100644 --- a/UDPSocket.h +++ b/UDPSocket.h @@ -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 #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); diff --git a/UserDB.cpp b/UserDB.cpp index ea5ff84..7b209e5 100644 --- a/UserDB.cpp +++ b/UserDB.cpp @@ -1,6 +1,6 @@ /* * Copyright (C) 2020 by SASANO Takayoshi JG1UAA - * Copyright (C) 2023 by Jonathan Naylor G4KLX + * Copyright (C) 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 @@ -42,7 +42,7 @@ bool CUserDB::lookup(unsigned int id, class CUserDBentry *entry) m_mutex.lock(); try { - if (entry != NULL) + if (entry != nullptr) *entry = m_table.at(id); else (void)m_table.at(id); @@ -62,7 +62,7 @@ bool CUserDB::load(std::string const& filename) LogInfo("Loading ID lookup table from %s", filename.c_str()); FILE* fp = ::fopen(filename.c_str(), "rt"); - if (fp == NULL) { + if (fp == nullptr) { LogWarning("Cannot open ID lookup file - %s", filename.c_str()); return false; } @@ -74,7 +74,7 @@ bool CUserDB::load(std::string const& filename) // set index for entries char buffer[256U]; - if (::fgets(buffer, sizeof(buffer), fp) == NULL) { + if (::fgets(buffer, sizeof(buffer), fp) == nullptr) { LogWarning("ID lookup file has no entry - %s", filename.c_str()); m_mutex.unlock(); ::fclose(fp); @@ -89,7 +89,7 @@ bool CUserDB::load(std::string const& filename) ::rewind(fp); } - while (::fgets(buffer, sizeof(buffer), fp) != NULL) { + while (::fgets(buffer, sizeof(buffer), fp) != nullptr) { if (buffer[0U] != '#') parse(buffer, index); } @@ -112,7 +112,7 @@ bool CUserDB::makeindex(char* buf, std::unordered_map& index) // Remove the old index index.clear(); - for (i = 0, p1 = tokenize(buf, &p2); p1 != NULL; + for (i = 0, p1 = tokenize(buf, &p2); p1 != nullptr; i++, p1 = tokenize(p2, &p2)) { // create [column keyword] - [column number] table @@ -136,7 +136,7 @@ void CUserDB::parse(char* buf, std::unordered_map& index) std::unordered_map ptr; unsigned int id; - for (i = 0, p1 = tokenize(buf, &p2); p1 != NULL; + for (i = 0, p1 = tokenize(buf, &p2); p1 != nullptr; i++, p1 = tokenize(p2, &p2)) { for (auto it = index.begin(); it != index.end(); it++) { @@ -178,10 +178,10 @@ void CUserDB::toupper_string(char* str) char* CUserDB::tokenize(char* str, char** next) { if (*str == '\0') - return NULL; + return nullptr; char* p = ::strpbrk(str, ",\t\r\n"); - if (p == NULL) { + if (p == nullptr) { *next = str + ::strlen(str); } else { *p = '\0'; diff --git a/Utils.cpp b/Utils.cpp index 28832f9..aa4417f 100644 --- a/Utils.cpp +++ b/Utils.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2009,2014,2015,2016,2021,2022,2023 Jonathan Naylor, G4KLX + * Copyright (C) 2009,2014,2015,2016,2021,2022,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 @@ -26,14 +26,14 @@ void CUtils::dump(const std::string& title, const unsigned char* data, unsigned int length) { - assert(data != NULL); + assert(data != nullptr); dump(2U, title, data, length); } void CUtils::dump(int level, const std::string& title, const unsigned char* data, unsigned int length) { - assert(data != NULL); + assert(data != nullptr); ::Log(level, "%s", title.c_str()); @@ -79,14 +79,14 @@ void CUtils::dump(int level, const std::string& title, const unsigned char* data void CUtils::dump(const std::string& title, const bool* bits, unsigned int length) { - assert(bits != NULL); + assert(bits != nullptr); dump(2U, title, bits, length); } void CUtils::dump(int level, const std::string& title, const bool* bits, unsigned int length) { - assert(bits != NULL); + assert(bits != nullptr); unsigned char bytes[100U]; unsigned int nBytes = 0U; @@ -98,7 +98,7 @@ void CUtils::dump(int level, const std::string& title, const bool* bits, unsigne void CUtils::byteToBitsBE(unsigned char byte, bool* bits) { - assert(bits != NULL); + assert(bits != nullptr); bits[0U] = (byte & 0x80U) == 0x80U; bits[1U] = (byte & 0x40U) == 0x40U; @@ -112,7 +112,7 @@ void CUtils::byteToBitsBE(unsigned char byte, bool* bits) void CUtils::byteToBitsLE(unsigned char byte, bool* bits) { - assert(bits != NULL); + assert(bits != nullptr); bits[0U] = (byte & 0x01U) == 0x01U; bits[1U] = (byte & 0x02U) == 0x02U; @@ -126,7 +126,7 @@ void CUtils::byteToBitsLE(unsigned char byte, bool* bits) void CUtils::bitsToByteBE(const bool* bits, unsigned char& byte) { - assert(bits != NULL); + assert(bits != nullptr); byte = bits[0U] ? 0x80U : 0x00U; byte |= bits[1U] ? 0x40U : 0x00U; @@ -140,7 +140,7 @@ void CUtils::bitsToByteBE(const bool* bits, unsigned char& byte) void CUtils::bitsToByteLE(const bool* bits, unsigned char& byte) { - assert(bits != NULL); + assert(bits != nullptr); byte = bits[0U] ? 0x01U : 0x00U; byte |= bits[1U] ? 0x02U : 0x00U; diff --git a/Version.h b/Version.h index 7fac374..40c3f4e 100644 --- a/Version.h +++ b/Version.h @@ -19,6 +19,6 @@ #if !defined(VERSION_H) #define VERSION_H -const char* VERSION = "20250227"; +const char* VERSION = "20250314"; #endif diff --git a/YSFControl.cpp b/YSFControl.cpp index 7333713..61c7aa2 100644 --- a/YSFControl.cpp +++ b/YSFControl.cpp @@ -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 @@ -35,8 +35,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), @@ -48,10 +48,10 @@ m_netLost(0U), m_rfErrs(0U), m_rfBits(1U), m_netBits(1U), -m_rfSource(NULL), -m_rfDest(NULL), -m_netSource(NULL), -m_netDest(NULL), +m_rfSource(nullptr), +m_rfDest(nullptr), +m_netSource(nullptr), +m_netDest(nullptr), m_lastFICH(), m_netN(0U), m_rfPayload(), @@ -103,7 +103,7 @@ CYSFControl::~CYSFControl() bool CYSFControl::writeModem(unsigned char *data, unsigned int len) { - assert(data != NULL); + assert(data != nullptr); if (!m_enabled) return false; @@ -122,17 +122,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_rfSource = nullptr; + m_rfDest = nullptr; + 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; } @@ -227,7 +227,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; @@ -254,7 +254,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; @@ -294,13 +294,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_rfSource = nullptr; + m_rfDest = nullptr; + m_rfState = RPT_RF_STATE::LISTENING; + } else if (m_rfState == RPT_RF_STATE::AUDIO) { m_rfPayload.processHeaderData(data + 2U); CSync::addYSFSync(data + 2U); @@ -334,7 +334,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 @@ -395,7 +395,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; @@ -422,7 +422,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; @@ -462,13 +462,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_rfSource = nullptr; + m_rfDest = nullptr; + m_rfState = RPT_RF_STATE::LISTENING; + } else if (m_rfState == RPT_RF_STATE::AUDIO) { m_rfPayload.processHeaderData(data + 2U); CSync::addYSFSync(data + 2U); @@ -502,7 +502,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(); @@ -565,7 +565,7 @@ bool CYSFControl::processDNData(bool valid, unsigned char *data) writeJSONRSSI(); 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(); @@ -595,7 +595,7 @@ bool CYSFControl::processDNData(bool valid, unsigned char *data) m_rfSource = m_rfPayload.getSource(); - if (m_rfSource == NULL || m_rfDest == NULL) + if (m_rfSource == nullptr || m_rfDest == nullptr) return false; if (m_selfOnly) { @@ -612,7 +612,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; @@ -696,7 +696,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; @@ -720,7 +720,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; @@ -761,12 +761,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_rfSource = nullptr; + m_rfDest = nullptr; + m_rfState = RPT_RF_STATE::LISTENING; + } else if (m_rfState == RPT_RF_STATE::DATA) { m_rfPayload.processHeaderData(data + 2U); CSync::addYSFSync(data + 2U); @@ -800,7 +800,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(); @@ -847,7 +847,7 @@ bool CYSFControl::processFRData(bool valid, unsigned char *data) unsigned int CYSFControl::readModem(unsigned char* data) { - assert(data != NULL); + assert(data != nullptr); if (m_queue.isEmpty()) return 0U; @@ -862,14 +862,14 @@ 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(); // These variables are free'd by YSFPayload - m_rfSource = NULL; - m_rfDest = NULL; + m_rfSource = nullptr; + m_rfDest = nullptr; if (m_netState == RS_NET_IDLE) { if (m_network != NULL) @@ -879,7 +879,7 @@ void CYSFControl::writeEndRF() void CYSFControl::writeEndNet() { - m_netState = RS_NET_IDLE; + m_netState = RPT_NET_STATE::IDLE; m_netTimeoutTimer.stop(); m_networkWatchdog.stop(); @@ -901,7 +901,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(); @@ -934,7 +934,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_netBits = 1U; @@ -1047,13 +1047,13 @@ void CYSFControl::writeNetwork() void CYSFControl::clock(unsigned int ms) { - if (m_network != NULL) + if (m_network != nullptr) writeNetwork(); 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()) { @@ -1066,9 +1066,9 @@ void CYSFControl::clock(unsigned int ms) void CYSFControl::writeQueueRF(const unsigned char *data) { - assert(data != NULL); + assert(data != nullptr); - if (m_netState != RS_NET_IDLE) + if (m_netState != RPT_NET_STATE::IDLE) return; if (m_rfTimeoutTimer.isRunning() && m_rfTimeoutTimer.hasExpired()) @@ -1089,7 +1089,7 @@ void CYSFControl::writeQueueRF(const unsigned char *data) void CYSFControl::writeQueueNet(const unsigned char *data) { - assert(data != NULL); + assert(data != nullptr); if (m_netTimeoutTimer.isRunning() && m_netTimeoutTimer.hasExpired()) return; @@ -1109,9 +1109,9 @@ void CYSFControl::writeQueueNet(const unsigned char *data) void CYSFControl::writeNetwork(const unsigned char *data, unsigned int count) { - assert(data != NULL); + assert(data != nullptr); - if (m_network == NULL) + if (m_network == nullptr) return; if (m_rfTimeoutTimer.isRunning() && m_rfTimeoutTimer.hasExpired()) @@ -1127,18 +1127,18 @@ bool CYSFControl::checkCallsign(const unsigned char* callsign) const void CYSFControl::processNetCallsigns(const unsigned char* data, unsigned char dgid) { - assert(data != NULL); + assert(data != nullptr); if (::memcmp(m_netSource, " ", 10U) == 0 || ::memcmp(m_netDest, " ", 10U) == 0) { if (::memcmp(m_netSource, " ", YSF_CALLSIGN_LENGTH) == 0) { unsigned char* source = m_netPayload.getSource(); - if (source != NULL) + if (source != nullptr) ::memcpy(m_netSource, source, YSF_CALLSIGN_LENGTH); } if (::memcmp(m_netDest, " ", YSF_CALLSIGN_LENGTH) == 0) { unsigned char* dest = m_netPayload.getDest(); - if (dest != NULL) + if (dest != nullptr) ::memcpy(m_netDest, dest, YSF_CALLSIGN_LENGTH); } @@ -1151,7 +1151,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) @@ -1160,17 +1160,17 @@ 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(); // These variables are free'd by YSFPayload - m_rfSource = NULL; - m_rfDest = NULL; + m_rfSource = nullptr; + m_rfDest = nullptr; // Reset the networking section - m_netState = RS_NET_IDLE; + m_netState = RPT_NET_STATE::IDLE; m_netTimeoutTimer.stop(); m_networkWatchdog.stop(); diff --git a/YSFConvolution.cpp b/YSFConvolution.cpp index a6da4ba..8210bf1 100644 --- a/YSFConvolution.cpp +++ b/YSFConvolution.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2009-2016,2021,2023 by Jonathan Naylor G4KLX + * Copyright (C) 2009-2016,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 @@ -38,12 +38,12 @@ const uint32_t M = 2U; const unsigned int K = 5U; CYSFConvolution::CYSFConvolution() : -m_metrics1(NULL), -m_metrics2(NULL), -m_oldMetrics(NULL), -m_newMetrics(NULL), -m_decisions(NULL), -m_dp(NULL) +m_metrics1(nullptr), +m_metrics2(nullptr), +m_oldMetrics(nullptr), +m_newMetrics(nullptr), +m_decisions(nullptr), +m_dp(nullptr) { m_metrics1 = new uint16_t[20U]; m_metrics2 = new uint16_t[20U]; @@ -100,7 +100,7 @@ void CYSFConvolution::decode(uint8_t s0, uint8_t s1) unsigned int CYSFConvolution::chainback(unsigned char* out, unsigned int nBits) { - assert(out != NULL); + assert(out != nullptr); uint32_t state = 0U; @@ -126,8 +126,8 @@ unsigned int CYSFConvolution::chainback(unsigned char* out, unsigned int nBits) void CYSFConvolution::encode(const unsigned char* in, unsigned char* out, unsigned int nBits) const { - assert(in != NULL); - assert(out != NULL); + assert(in != nullptr); + assert(out != nullptr); assert(nBits > 0U); uint8_t d1 = 0U, d2 = 0U, d3 = 0U, d4 = 0U; diff --git a/YSFFICH.cpp b/YSFFICH.cpp index 12a0df9..333aad0 100644 --- a/YSFFICH.cpp +++ b/YSFFICH.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2016,2017,2019,2020,2021,2023 by Jonathan Naylor G4KLX + * Copyright (C) 2016,2017,2019,2020,2021,2023,2025 by Jonathan Naylor G4KLX * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -57,7 +57,7 @@ const unsigned int INTERLEAVE_TABLE[] = { 38U, 78U, 118U, 158U, 198U}; CYSFFICH::CYSFFICH(const CYSFFICH& fich) : -m_fich(NULL) +m_fich(nullptr) { m_fich = new unsigned char[6U]; @@ -65,7 +65,7 @@ m_fich(NULL) } CYSFFICH::CYSFFICH() : -m_fich(NULL) +m_fich(nullptr) { m_fich = new unsigned char[6U]; @@ -79,7 +79,7 @@ CYSFFICH::~CYSFFICH() bool CYSFFICH::decode(const unsigned char* bytes) { - assert(bytes != NULL); + assert(bytes != nullptr); // Skip the sync bytes bytes += YSF_SYNC_LENGTH_BYTES; @@ -122,7 +122,7 @@ bool CYSFFICH::decode(const unsigned char* bytes) void CYSFFICH::encode(unsigned char* bytes) { - assert(bytes != NULL); + assert(bytes != nullptr); // Skip the sync bytes bytes += YSF_SYNC_LENGTH_BYTES; diff --git a/YSFNetwork.cpp b/YSFNetwork.cpp index d8523ae..28db30a 100644 --- a/YSFNetwork.cpp +++ b/YSFNetwork.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2009-2014,2016,2019,2020,2021,2023 by Jonathan Naylor G4KLX + * Copyright (C) 2009-2014,2016,2019,2020,2021,2023,2025 by Jonathan Naylor G4KLX * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -38,7 +38,7 @@ m_debug(debug), m_enabled(false), m_buffer(1000U, "YSF Network"), m_pollTimer(1000U, 5U), -m_tag(NULL) +m_tag(nullptr) { m_callsign = callsign; m_callsign.resize(YSF_CALLSIGN_LENGTH, ' '); @@ -71,7 +71,7 @@ bool CYSFNetwork::open() bool CYSFNetwork::write(const unsigned char* src, const unsigned char* dest, const unsigned char* data, unsigned int count, bool end) { - assert(data != NULL); + assert(data != nullptr); unsigned char buffer[200U]; @@ -83,12 +83,12 @@ bool CYSFNetwork::write(const unsigned char* src, const unsigned char* dest, con for (unsigned int i = 0U; i < YSF_CALLSIGN_LENGTH; i++) buffer[i + 4U] = m_callsign.at(i); - if (src != NULL) + if (src != nullptr) ::memcpy(buffer + 14U, src, YSF_CALLSIGN_LENGTH); else ::memset(buffer + 14U, ' ', YSF_CALLSIGN_LENGTH); - if (dest != NULL) + if (dest != nullptr) ::memcpy(buffer + 24U, dest, YSF_CALLSIGN_LENGTH); else ::memset(buffer + 24U, ' ', YSF_CALLSIGN_LENGTH); @@ -169,7 +169,7 @@ void CYSFNetwork::clock(unsigned int ms) unsigned int CYSFNetwork::read(unsigned char* data) { - assert(data != NULL); + assert(data != nullptr); if (m_buffer.isEmpty()) return 0U; diff --git a/YSFPayload.cpp b/YSFPayload.cpp index 0d670a7..14645b6 100644 --- a/YSFPayload.cpp +++ b/YSFPayload.cpp @@ -1,5 +1,5 @@ /* -* Copyright (C) 2016,2017,2020,2023 Jonathan Naylor, G4KLX +* Copyright (C) 2016,2017,2020,2023,2025 Jonathan Naylor, G4KLX * Copyright (C) 2016 Mathias Weyland, HB9FRV * * This program is free software; you can redistribute it and/or modify @@ -86,10 +86,10 @@ const unsigned char BIT_MASK_TABLE[] = {0x80U, 0x40U, 0x20U, 0x10U, 0x08U, 0x04U #define READ_BIT1(p,i) (p[(i)>>3] & BIT_MASK_TABLE[(i)&7]) CYSFPayload::CYSFPayload() : -m_uplink(NULL), -m_downlink(NULL), -m_source(NULL), -m_dest(NULL), +m_uplink(nullptr), +m_downlink(nullptr), +m_source(nullptr), +m_dest(nullptr), m_fec() { } @@ -104,7 +104,7 @@ CYSFPayload::~CYSFPayload() bool CYSFPayload::processHeaderData(unsigned char* data) { - assert(data != NULL); + assert(data != nullptr); data += YSF_SYNC_LENGTH_BYTES + YSF_FICH_LENGTH_BYTES; @@ -138,12 +138,12 @@ bool CYSFPayload::processHeaderData(unsigned char* data) for (unsigned int i = 0U; i < 20U; i++) output[i] ^= WHITENING_DATA[i]; - if (m_dest == NULL) { + if (m_dest == nullptr) { m_dest = new unsigned char[YSF_CALLSIGN_LENGTH]; ::memcpy(m_dest, output + 0U, YSF_CALLSIGN_LENGTH); } - if (m_source == NULL) { + if (m_source == nullptr) { m_source = new unsigned char[YSF_CALLSIGN_LENGTH]; ::memcpy(m_source, output + YSF_CALLSIGN_LENGTH, YSF_CALLSIGN_LENGTH); } @@ -208,10 +208,10 @@ bool CYSFPayload::processHeaderData(unsigned char* data) for (unsigned int i = 0U; i < 20U; i++) output[i] ^= WHITENING_DATA[i]; - if (m_downlink != NULL) + if (m_downlink != nullptr) ::memcpy(output + 0U, m_downlink, YSF_CALLSIGN_LENGTH); - if (m_uplink != NULL) + if (m_uplink != nullptr) ::memcpy(output + YSF_CALLSIGN_LENGTH, m_uplink, YSF_CALLSIGN_LENGTH); for (unsigned int i = 0U; i < 20U; i++) @@ -253,7 +253,7 @@ bool CYSFPayload::processHeaderData(unsigned char* data) unsigned int CYSFPayload::processVDMode1Audio(unsigned char* data) { - assert(data != NULL); + assert(data != nullptr); data += YSF_SYNC_LENGTH_BYTES + YSF_FICH_LENGTH_BYTES; @@ -270,7 +270,7 @@ unsigned int CYSFPayload::processVDMode1Audio(unsigned char* data) bool CYSFPayload::processVDMode1Data(unsigned char* data, unsigned char fn, bool gateway) { - assert(data != NULL); + assert(data != nullptr); data += YSF_SYNC_LENGTH_BYTES + YSF_FICH_LENGTH_BYTES; @@ -306,12 +306,12 @@ bool CYSFPayload::processVDMode1Data(unsigned char* data, unsigned char fn, bool switch (fn) { case 0U: - if (m_dest == NULL) { + if (m_dest == nullptr) { m_dest = new unsigned char[YSF_CALLSIGN_LENGTH]; ::memcpy(m_dest, output + 0U, YSF_CALLSIGN_LENGTH); } - if (m_source == NULL) { + if (m_source == nullptr) { m_source = new unsigned char[YSF_CALLSIGN_LENGTH]; ::memcpy(m_source, output + YSF_CALLSIGN_LENGTH, YSF_CALLSIGN_LENGTH); } @@ -319,10 +319,10 @@ bool CYSFPayload::processVDMode1Data(unsigned char* data, unsigned char fn, bool break; case 1U: - if (m_downlink != NULL && !gateway) + if (m_downlink != nullptr && !gateway) ::memcpy(output + 0U, m_downlink, YSF_CALLSIGN_LENGTH); - if (m_uplink != NULL && !gateway) + if (m_uplink != nullptr && !gateway) ::memcpy(output + YSF_CALLSIGN_LENGTH, m_uplink, YSF_CALLSIGN_LENGTH); break; @@ -390,7 +390,7 @@ bool CYSFPayload::processVDMode1Data(unsigned char* data, unsigned char fn, bool unsigned int CYSFPayload::processVDMode2Audio(unsigned char* data) { - assert(data != NULL); + assert(data != nullptr); data += YSF_SYNC_LENGTH_BYTES + YSF_FICH_LENGTH_BYTES; @@ -468,7 +468,7 @@ unsigned int CYSFPayload::processVDMode2Audio(unsigned char* data) bool CYSFPayload::processVDMode2Data(unsigned char* data, unsigned char fn, bool gateway) { - assert(data != NULL); + assert(data != nullptr); data += YSF_SYNC_LENGTH_BYTES + YSF_FICH_LENGTH_BYTES; @@ -504,26 +504,26 @@ bool CYSFPayload::processVDMode2Data(unsigned char* data, unsigned char fn, bool switch (fn) { case 0U: - if (m_dest == NULL) { + if (m_dest == nullptr) { m_dest = new unsigned char[YSF_CALLSIGN_LENGTH]; ::memcpy(m_dest, output, YSF_CALLSIGN_LENGTH); } break; case 1U: - if (m_source == NULL) { + if (m_source == nullptr) { m_source = new unsigned char[YSF_CALLSIGN_LENGTH]; ::memcpy(m_source, output, YSF_CALLSIGN_LENGTH); } break; case 2U: - if (m_downlink != NULL && !gateway) + if (m_downlink != nullptr && !gateway) ::memcpy(output, m_downlink, YSF_CALLSIGN_LENGTH); break; case 3U: - if (m_uplink != NULL && !gateway) + if (m_uplink != nullptr && !gateway) ::memcpy(output, m_uplink, YSF_CALLSIGN_LENGTH); break; @@ -578,7 +578,7 @@ bool CYSFPayload::processVDMode2Data(unsigned char* data, unsigned char fn, bool bool CYSFPayload::processDataFRModeData(unsigned char* data, unsigned char fn, bool gateway) { - assert(data != NULL); + assert(data != nullptr); data += YSF_SYNC_LENGTH_BYTES + YSF_FICH_LENGTH_BYTES; @@ -616,12 +616,12 @@ bool CYSFPayload::processDataFRModeData(unsigned char* data, unsigned char fn, b case 0U: // CUtils::dump(1U, "FR Mode Data, CSD1", output, 20U); - if (m_dest == NULL) { + if (m_dest == nullptr) { m_dest = new unsigned char[YSF_CALLSIGN_LENGTH]; ::memcpy(m_dest, output + 0U, YSF_CALLSIGN_LENGTH); } - if (m_source == NULL) { + if (m_source == nullptr) { m_source = new unsigned char[YSF_CALLSIGN_LENGTH]; ::memcpy(m_source, output + YSF_CALLSIGN_LENGTH, YSF_CALLSIGN_LENGTH); } @@ -724,10 +724,10 @@ bool CYSFPayload::processDataFRModeData(unsigned char* data, unsigned char fn, b case 0U: // CUtils::dump(1U, "FR Mode Data, CSD2", output, 20U); - if (m_downlink != NULL && !gateway) + if (m_downlink != nullptr && !gateway) ::memcpy(output + 0U, m_downlink, YSF_CALLSIGN_LENGTH); - if (m_uplink != NULL && !gateway) + if (m_uplink != nullptr && !gateway) ::memcpy(output + YSF_CALLSIGN_LENGTH, m_uplink, YSF_CALLSIGN_LENGTH); break; @@ -803,7 +803,7 @@ bool CYSFPayload::processDataFRModeData(unsigned char* data, unsigned char fn, b unsigned int CYSFPayload::processVoiceFRModeAudio2(unsigned char* data) { - assert(data != NULL); + assert(data != nullptr); data += YSF_SYNC_LENGTH_BYTES + YSF_FICH_LENGTH_BYTES; @@ -817,7 +817,7 @@ unsigned int CYSFPayload::processVoiceFRModeAudio2(unsigned char* data) unsigned int CYSFPayload::processVoiceFRModeAudio5(unsigned char* data) { - assert(data != NULL); + assert(data != nullptr); data += YSF_SYNC_LENGTH_BYTES + YSF_FICH_LENGTH_BYTES; @@ -834,7 +834,7 @@ unsigned int CYSFPayload::processVoiceFRModeAudio5(unsigned char* data) bool CYSFPayload::processVoiceFRModeData(unsigned char* data) { - assert(data != NULL); + assert(data != nullptr); data += YSF_SYNC_LENGTH_BYTES + YSF_FICH_LENGTH_BYTES; @@ -890,9 +890,9 @@ bool CYSFPayload::processVoiceFRModeData(unsigned char* data) void CYSFPayload::writeHeader(unsigned char* data, const unsigned char* csd1, const unsigned char* csd2) { - assert(data != NULL); - assert(csd1 != NULL); - assert(csd2 != NULL); + assert(data != nullptr); + assert(csd1 != nullptr); + assert(csd2 != nullptr); writeDataFRModeData1(csd1, data); @@ -901,8 +901,8 @@ void CYSFPayload::writeHeader(unsigned char* data, const unsigned char* csd1, co void CYSFPayload::writeDataFRModeData1(const unsigned char* dt, unsigned char* data) { - assert(dt != NULL); - assert(data != NULL); + assert(dt != nullptr); + assert(data != nullptr); data += YSF_SYNC_LENGTH_BYTES + YSF_FICH_LENGTH_BYTES; @@ -945,8 +945,8 @@ void CYSFPayload::writeDataFRModeData1(const unsigned char* dt, unsigned char* d void CYSFPayload::writeDataFRModeData2(const unsigned char* dt, unsigned char* data) { - assert(dt != NULL); - assert(data != NULL); + assert(dt != nullptr); + assert(data != nullptr); data += YSF_SYNC_LENGTH_BYTES + YSF_FICH_LENGTH_BYTES; @@ -1024,8 +1024,8 @@ void CYSFPayload::reset() delete[] m_source; delete[] m_dest; - m_source = NULL; - m_dest = NULL; + m_source = nullptr; + m_dest = nullptr; } #endif