Merge branch 'master' into mqtt

This commit is contained in:
Jonathan Naylor 2025-03-14 13:39:49 +00:00
commit 62c33086ca
102 changed files with 1621 additions and 1489 deletions

View file

@ -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];

View file

@ -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 <cstdio>
#include <cassert>
#include <cstring>
#include <ctime>
#include <nlohmann/json.hpp>
// #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;

View file

@ -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

View file

@ -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++)

View file

@ -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 <cstring>
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);

16
CRC.cpp
View file

@ -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;

View file

@ -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;
}

2
Conf.h
View file

@ -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

View file

@ -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 <cassert>
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)

View file

@ -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

View file

@ -1,5 +1,5 @@
/*
* Copyright (C) 2015-2021,2023 Jonathan Naylor, G4KLX
* Copyright (C) 2015-2021,2023,2025 Jonathan Naylor, G4KLX
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@ -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) {

View file

@ -1,5 +1,5 @@
/*
* Copyright (C) 2015-2021,2023 by Jonathan Naylor G4KLX
* Copyright (C) 2015-2021,2023,2025 by Jonathan Naylor G4KLX
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by

View file

@ -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);
}

View file

@ -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);

View file

@ -1,5 +1,5 @@
/*
* Copyright (C) 2015,2016,2021 by Jonathan Naylor G4KLX
* Copyright (C) 2015,2016,2021,2025 by Jonathan Naylor G4KLX
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@ -110,14 +110,14 @@ const unsigned char DPF_PROPRIETARY = 0x0FU;
const unsigned char FID_ETSI = 0U;
const unsigned char FID_DMRA = 16U;
enum FLCO {
FLCO_GROUP = 0,
FLCO_USER_USER = 3,
FLCO_TALKER_ALIAS_HEADER = 4,
FLCO_TALKER_ALIAS_BLOCK1 = 5,
FLCO_TALKER_ALIAS_BLOCK2 = 6,
FLCO_TALKER_ALIAS_BLOCK3 = 7,
FLCO_GPS_INFO = 8
enum class FLCO {
GROUP = 0,
USER_USER = 3,
TALKER_ALIAS_HEADER = 4,
TALKER_ALIAS_BLOCK1 = 5,
TALKER_ALIAS_BLOCK2 = 6,
TALKER_ALIAS_BLOCK3 = 7,
GINFO = 8
};
#endif

View file

@ -1,5 +1,5 @@
/*
* Copyright (C) 2015,2016,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;

View file

@ -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 <cstring>
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;

View file

@ -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

View file

@ -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);

View file

@ -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);

View file

@ -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

View file

@ -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 <cstring>
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]);

View file

@ -1,5 +1,5 @@
/*
* Copyright (C) 2015-2021,2023 Jonathan Naylor, G4KLX
* Copyright (C) 2015-2021,2023,2025 Jonathan Naylor, G4KLX
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@ -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;

View file

@ -1,5 +1,5 @@
/*
* Copyright (C) 2015-2021,2023 by Jonathan Naylor G4KLX
* Copyright (C) 2015-2021,2023,2025 by Jonathan Naylor G4KLX
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@ -40,12 +40,12 @@
#include <nlohmann/json.hpp>
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;

View file

@ -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;

View file

@ -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

View file

@ -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);

View file

@ -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;

View file

@ -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<std::string> m_blackList;

View file

@ -1,5 +1,5 @@
/*
* Copyright (C) 2015,2016,2018,2019,2021 by Jonathan Naylor G4KLX
* Copyright (C) 2015,2016,2018,2019,2021,2025 by Jonathan Naylor G4KLX
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@ -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

View file

@ -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 <cstring>
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);

View file

@ -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;

View file

@ -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 <cstring>
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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -1,5 +1,5 @@
/*
* Copyright (C) 2020,2021,2023,2024 by Jonathan Naylor G4KLX
* Copyright (C) 2020,2021,2023,2024,2025 by Jonathan Naylor G4KLX
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@ -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);

View file

@ -1,5 +1,5 @@
/*
* Copyright (C) 2020,2021,2023,2024 by Jonathan Naylor G4KLX
* Copyright (C) 2020,2021,2023,2024,2025 by Jonathan Naylor G4KLX
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by

View file

@ -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];

View file

@ -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);

View file

@ -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];

View file

@ -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);

View file

@ -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;

View file

@ -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];

View file

@ -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;

View file

@ -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;

View file

@ -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 <cstring>
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);

View file

@ -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;

View file

@ -1,5 +1,5 @@
/*
* Copyright (C) 2020,2021,2023,2024 by Jonathan Naylor G4KLX
* Copyright (C) 2020,2021,2023,2024,2025 by Jonathan Naylor G4KLX
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@ -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;

View file

@ -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<std::string> whiteList = m_conf.getDStarWhiteList();
bool ackReply = m_conf.getDStarAckReply();
unsigned int ackTime = m_conf.getDStarAckTime();
DSTAR_ACK_MESSAGE ackMessage = m_conf.getDStarAckMessage();
DSTAR_ACK ackMessage = m_conf.getDStarAckMessage();
bool errorReply = m_conf.getDStarErrorReply();
bool remoteGateway = m_conf.getDStarRemoteGateway();
m_dstarRFModeHang = m_conf.getDStarModeHang();
@ -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;

286
Modem.cpp
View file

@ -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;
}

22
Modem.h
View file

@ -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 <string>
enum RESP_TYPE_MMDVM {
RTM_OK,
RTM_TIMEOUT,
RTM_ERROR
enum class RESP_TYPE_MMDVM {
OK,
TIMEOUT,
ERR
};
enum SERIAL_STATE {
SS_START,
SS_LENGTH1,
SS_LENGTH2,
SS_TYPE,
SS_DATA
enum class SERIAL_STATE {
START,
LENGTH1,
LENGTH2,
TYPE,
DATA
};
class CModem {

View file

@ -1,5 +1,5 @@
/*
* Copyright (C) 2015,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()

View file

@ -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;

View file

@ -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);

View file

@ -1,5 +1,5 @@
/*
* Copyright (C) 2015-2021,2023 Jonathan Naylor, G4KLX
* Copyright (C) 2015-2021,2023,2025 Jonathan Naylor, G4KLX
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@ -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];

View file

@ -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;

View file

@ -1,5 +1,5 @@
/*
* Copyright (C) 2016,2017,2018 by Jonathan Naylor G4KLX
* Copyright (C) 2016,2017,2018,2025 by Jonathan Naylor G4KLX
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@ -50,7 +50,7 @@ const unsigned char NXDN_LICH_RFCT_RTCH_C = 3U;
const unsigned char NXDN_LICH_USC_SACCH_NS = 0U;
const unsigned char NXDN_LICH_USC_UDCH = 1U;
const unsigned char NXDN_LICH_USC_SACCH_SS = 2U;
const unsigned char NXDN_LICH_USC_SACCH_SS_IDLE = 3U;
const unsigned char NXDN_LICH_USC_SACCH_IDLE = 3U;
const unsigned char NXDN_LICH_STEAL_NONE = 3U;
const unsigned char NXDN_LICH_STEAL_FACCH1_2 = 2U;

View file

@ -1,5 +1,5 @@
/*
* Copyright (C) 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);
}

View file

@ -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;

View file

@ -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];

View file

@ -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)

View file

@ -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);

View file

@ -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

View file

@ -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 <cstdint>
enum NXDN_NETWORK_MESSAGE_TYPE {
NNMT_VOICE_HEADER,
NNMT_VOICE_BODY,
NNMT_VOICE_TRAILER,
NNMT_DATA_HEADER,
NNMT_DATA_BODY,
NNMT_DATA_TRAILER
enum class NXDN_NETWORK_MESSAGE_TYPE {
VOICE_HEADER,
VOICE_BODY,
VOICE_TRAILER,
DATA_HEADER,
DATA_BODY,
DATA_TRAILER
};
class INXDNNetwork {

View file

@ -1,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);
}

View file

@ -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);
}

View file

@ -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;

View file

@ -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 <gatekeep@gmail.com> 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

View file

@ -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 <gatekeep@gmail.com> 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);
}

View file

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

View file

@ -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;

View file

@ -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 <gatekeep@gmail.com>
*
* 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:

View file

@ -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;

View file

@ -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);

View file

@ -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++) {

View file

@ -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<uint32_t>&
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<uint32_t>&
}
}
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;

View file

@ -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<uint32_t> m_output;

View file

@ -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;

View file

@ -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);

10
RS.h
View file

@ -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;
}

View file

@ -1,5 +1,5 @@
/*
* Copyright (C) 2015,2023 by Jonathan Naylor G4KLX
* Copyright (C) 2015,2023,2025 by Jonathan Naylor G4KLX
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@ -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);

View file

@ -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 <gatekeep@gmail.com> 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<unsigned char> 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<unsigned char> 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<unsigned char> 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];

View file

@ -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<uint16_t, int>(raw, rssi));

View file

@ -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

View file

@ -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,

View file

@ -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];

View file

@ -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;
}

View file

@ -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);
}

View file

@ -1,5 +1,5 @@
/*
* Copyright (C) 2015,2016,2020 by Jonathan Naylor G4KLX
* Copyright (C) 2015,2016,2020,2025 by Jonathan Naylor G4KLX
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@ -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

View file

@ -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)

View file

@ -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;

View file

@ -1,5 +1,5 @@
/*
* Copyright (C) 2006-2016,2020,2024 by Jonathan Naylor G4KLX
* Copyright (C) 2006-2016,2020,2024,2025 by Jonathan Naylor G4KLX
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@ -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);

View file

@ -1,5 +1,5 @@
/*
* Copyright (C) 2009-2011,2013,2015,2016,2020,2024 by Jonathan Naylor G4KLX
* Copyright (C) 2009-2011,2013,2015,2016,2020,2024.2025 by Jonathan Naylor G4KLX
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@ -36,9 +36,9 @@
#include <Winsock2.h>
#endif
enum IPMATCHTYPE {
IMT_ADDRESS_AND_PORT,
IMT_ADDRESS_ONLY
enum class IPMATCHTYPE {
IMT_ADDREAND_PORT,
IMT_ADDREONLY
};
class CUDPSocket {
@ -61,7 +61,7 @@ public:
static int lookup(const std::string& hostName, unsigned short port, sockaddr_storage& address, unsigned int& addressLength);
static int lookup(const std::string& hostName, unsigned short port, sockaddr_storage& address, unsigned int& addressLength, struct addrinfo& hints);
static bool match(const sockaddr_storage& addr1, const sockaddr_storage& addr2, IPMATCHTYPE type = IMT_ADDRESS_AND_PORT);
static bool match(const sockaddr_storage& addr1, const sockaddr_storage& addr2, IPMATCHTYPE type = IPMATCHTYPE::IMT_ADDREAND_PORT);
static bool isNone(const sockaddr_storage& addr);

View file

@ -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<std::string, int>& 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<std::string, int>& index)
std::unordered_map<std::string, char*> 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';

View file

@ -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;

View file

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

View file

@ -1,5 +1,5 @@
/*
* Copyright (C) 2015-2021,2023 Jonathan Naylor, G4KLX
* Copyright (C) 2015-2021,2023,2025 Jonathan Naylor, G4KLX
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@ -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();

View file

@ -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;

View file

@ -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;

Some files were not shown because too many files have changed in this diff Show more