mirror of
https://github.com/g4klx/MMDVMHost.git
synced 2026-04-03 03:44:37 +02:00
Merge branch 'master' into mqtt
This commit is contained in:
commit
62c33086ca
|
|
@ -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];
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
2
BCH.cpp
2
BCH.cpp
|
|
@ -125,7 +125,7 @@ void CBCH::encode(const int* data, int* bb)
|
|||
|
||||
void CBCH::encode(unsigned char* nid)
|
||||
{
|
||||
assert(nid != NULL);
|
||||
assert(nid != nullptr);
|
||||
|
||||
int data[16];
|
||||
for (int i = 0; i < 16; i++)
|
||||
|
|
|
|||
|
|
@ -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
16
CRC.cpp
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (C) 2015,2016,2023 by Jonathan Naylor G4KLX
|
||||
* Copyright (C) 2015,2016,2023,2025 by Jonathan Naylor G4KLX
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
|
|
@ -127,7 +127,7 @@ const uint16_t CCITT16_TABLE2[] = {
|
|||
#if defined(USE_DMR)
|
||||
bool CCRC::checkFiveBit(bool* in, unsigned int tcrc)
|
||||
{
|
||||
assert(in != NULL);
|
||||
assert(in != nullptr);
|
||||
|
||||
unsigned int crc;
|
||||
encodeFiveBit(in, crc);
|
||||
|
|
@ -137,7 +137,7 @@ bool CCRC::checkFiveBit(bool* in, unsigned int tcrc)
|
|||
|
||||
void CCRC::encodeFiveBit(const bool* in, unsigned int& tcrc)
|
||||
{
|
||||
assert(in != NULL);
|
||||
assert(in != nullptr);
|
||||
|
||||
unsigned short total = 0U;
|
||||
for (unsigned int i = 0U; i < 72U; i += 8U) {
|
||||
|
|
@ -155,7 +155,7 @@ void CCRC::encodeFiveBit(const bool* in, unsigned int& tcrc)
|
|||
#if defined(USE_DMR) || defined(USE_YSF) || defined(USE_P25)
|
||||
void CCRC::addCCITT162(unsigned char *in, unsigned int length)
|
||||
{
|
||||
assert(in != NULL);
|
||||
assert(in != nullptr);
|
||||
assert(length > 2U);
|
||||
|
||||
union {
|
||||
|
|
@ -176,7 +176,7 @@ void CCRC::addCCITT162(unsigned char *in, unsigned int length)
|
|||
|
||||
bool CCRC::checkCCITT162(const unsigned char *in, unsigned int length)
|
||||
{
|
||||
assert(in != NULL);
|
||||
assert(in != nullptr);
|
||||
assert(length > 2U);
|
||||
|
||||
union {
|
||||
|
|
@ -198,7 +198,7 @@ bool CCRC::checkCCITT162(const unsigned char *in, unsigned int length)
|
|||
#if defined(USE_DSTAR)
|
||||
void CCRC::addCCITT161(unsigned char *in, unsigned int length)
|
||||
{
|
||||
assert(in != NULL);
|
||||
assert(in != nullptr);
|
||||
assert(length > 2U);
|
||||
|
||||
union {
|
||||
|
|
@ -219,7 +219,7 @@ void CCRC::addCCITT161(unsigned char *in, unsigned int length)
|
|||
|
||||
bool CCRC::checkCCITT161(const unsigned char *in, unsigned int length)
|
||||
{
|
||||
assert(in != NULL);
|
||||
assert(in != nullptr);
|
||||
assert(length > 2U);
|
||||
|
||||
union {
|
||||
|
|
@ -241,7 +241,7 @@ bool CCRC::checkCCITT161(const unsigned char *in, unsigned int length)
|
|||
#if defined(USE_DMR)
|
||||
unsigned char CCRC::crc8(const unsigned char *in, unsigned int length)
|
||||
{
|
||||
assert(in != NULL);
|
||||
assert(in != nullptr);
|
||||
|
||||
uint8_t crc = 0U;
|
||||
|
||||
|
|
|
|||
97
Conf.cpp
97
Conf.cpp
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (C) 2015-2024 by Jonathan Naylor G4KLX
|
||||
* Copyright (C) 2015-2025 by Jonathan Naylor G4KLX
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
|
|
@ -185,14 +185,14 @@ m_dstarBlackList(),
|
|||
m_dstarWhiteList(),
|
||||
m_dstarAckReply(true),
|
||||
m_dstarAckTime(750U),
|
||||
m_dstarAckMessage(DSTAR_ACK_BER),
|
||||
m_dstarAckMessage(DSTAR_ACK::BER),
|
||||
m_dstarErrorReply(true),
|
||||
m_dstarRemoteGateway(false),
|
||||
#endif
|
||||
m_dstarModeHang(10U),
|
||||
#if defined(USE_DMR)
|
||||
m_dmrEnabled(false),
|
||||
m_dmrBeacons(DMR_BEACONS_OFF),
|
||||
m_dmrBeacons(DMR_BEACONS::OFF),
|
||||
m_dmrBeaconInterval(60U),
|
||||
m_dmrBeaconDuration(3U),
|
||||
#endif
|
||||
|
|
@ -416,23 +416,23 @@ CConf::~CConf()
|
|||
bool CConf::read()
|
||||
{
|
||||
FILE* fp = ::fopen(m_file.c_str(), "rt");
|
||||
if (fp == NULL) {
|
||||
if (fp == nullptr) {
|
||||
::fprintf(stderr, "Couldn't open the .ini file - %s\n", m_file.c_str());
|
||||
return false;
|
||||
}
|
||||
|
||||
SECTION section = SECTION_NONE;
|
||||
SECTION section = SECTION::NONE;
|
||||
|
||||
char buffer[BUFFER_SIZE];
|
||||
while (::fgets(buffer, BUFFER_SIZE, fp) != NULL) {
|
||||
while (::fgets(buffer, BUFFER_SIZE, fp) != nullptr) {
|
||||
if (buffer[0U] == '#')
|
||||
continue;
|
||||
|
||||
if (buffer[0U] == '[') {
|
||||
if (::strncmp(buffer, "[General]", 9U) == 0)
|
||||
section = SECTION_GENERAL;
|
||||
section = SECTION::GENERAL;
|
||||
else if (::strncmp(buffer, "[Info]", 6U) == 0)
|
||||
section = SECTION_INFO;
|
||||
section = SECTION::INFO;
|
||||
else if (::strncmp(buffer, "[Log]", 5U) == 0)
|
||||
section = SECTION_LOG;
|
||||
else if (::strncmp(buffer, "[MQTT]", 6U) == 0)
|
||||
|
|
@ -448,7 +448,7 @@ bool CConf::read()
|
|||
section = SECTION_NXDNID_LOOKUP;
|
||||
#endif
|
||||
else if (::strncmp(buffer, "[Modem]", 7U) == 0)
|
||||
section = SECTION_MODEM;
|
||||
section = SECTION::MODEM;
|
||||
else if (::strncmp(buffer, "[Transparent Data]", 18U) == 0)
|
||||
section = SECTION_TRANSPARENT;
|
||||
#if defined(USE_DSTAR)
|
||||
|
|
@ -524,21 +524,21 @@ bool CConf::read()
|
|||
section = SECTION_AX25_NETWORK;
|
||||
#endif
|
||||
else if (::strncmp(buffer, "[Lock File]", 11U) == 0)
|
||||
section = SECTION_LOCK_FILE;
|
||||
section = SECTION::LOCK_FILE;
|
||||
else if (::strncmp(buffer, "[Remote Control]", 16U) == 0)
|
||||
section = SECTION_REMOTE_CONTROL;
|
||||
section = SECTION::REMOTE_CONTROL;
|
||||
else
|
||||
section = SECTION_NONE;
|
||||
section = SECTION::NONE;
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
char* key = ::strtok(buffer, " \t=\r\n");
|
||||
if (key == NULL)
|
||||
if (key == nullptr)
|
||||
continue;
|
||||
|
||||
char* value = ::strtok(NULL, "\r\n");
|
||||
if (value == NULL)
|
||||
char* value = ::strtok(nullptr, "\r\n");
|
||||
if (value == nullptr)
|
||||
continue;
|
||||
|
||||
// Remove quotes from the value
|
||||
|
|
@ -550,7 +550,7 @@ bool CConf::read()
|
|||
char *p;
|
||||
|
||||
// if value is not quoted, remove after # (to make comment)
|
||||
if ((p = strchr(value, '#')) != NULL)
|
||||
if ((p = strchr(value, '#')) != nullptr)
|
||||
*p = '\0';
|
||||
|
||||
// remove trailing tab/space
|
||||
|
|
@ -558,7 +558,7 @@ bool CConf::read()
|
|||
*p = '\0';
|
||||
}
|
||||
|
||||
if (section == SECTION_GENERAL) {
|
||||
if (section == SECTION::GENERAL) {
|
||||
if (::strcmp(key, "Callsign") == 0) {
|
||||
// Convert the callsign to upper case
|
||||
for (unsigned int i = 0U; value[i] != 0; i++)
|
||||
|
|
@ -579,7 +579,7 @@ bool CConf::read()
|
|||
m_dstarNetworkModeHang = m_dmrNetworkModeHang = m_fusionNetworkModeHang = m_p25NetworkModeHang = m_nxdnNetworkModeHang = m_m17NetworkModeHang = m_fmNetworkModeHang = (unsigned int)::atoi(value);
|
||||
else if (::strcmp(key, "Daemon") == 0)
|
||||
m_daemon = ::atoi(value) == 1;
|
||||
} else if (section == SECTION_INFO) {
|
||||
} else if (section == SECTION::INFO) {
|
||||
if (::strcmp(key, "TXFrequency") == 0)
|
||||
m_pocsagFrequency = m_txFrequency = (unsigned int)::atoi(value);
|
||||
else if (::strcmp(key, "RXFrequency") == 0)
|
||||
|
|
@ -653,7 +653,7 @@ bool CConf::read()
|
|||
else if (::strcmp(key, "I2CPort") == 0)
|
||||
m_modemI2CPort = value;
|
||||
else if (::strcmp(key, "I2CAddress") == 0)
|
||||
m_modemI2CAddress = (unsigned int)::strtoul(value, NULL, 16);
|
||||
m_modemI2CAddress = (unsigned int)::strtoul(value, nullptr, 16);
|
||||
else if (::strcmp(key, "ModemAddress") == 0)
|
||||
m_modemModemAddress = value;
|
||||
else if (::strcmp(key, "ModemPort") == 0)
|
||||
|
|
@ -734,7 +734,7 @@ bool CConf::read()
|
|||
m_modemTrace = ::atoi(value) == 1;
|
||||
else if (::strcmp(key, "Debug") == 0)
|
||||
m_modemDebug = ::atoi(value) == 1;
|
||||
} else if (section == SECTION_TRANSPARENT) {
|
||||
} else if (section == SECTION::TRANSPARENT) {
|
||||
if (::strcmp(key, "Enable") == 0)
|
||||
m_transparentEnabled = ::atoi(value) == 1;
|
||||
else if (::strcmp(key, "RemoteAddress") == 0)
|
||||
|
|
@ -758,7 +758,7 @@ bool CConf::read()
|
|||
m_dstarSelfOnly = ::atoi(value) == 1;
|
||||
else if (::strcmp(key, "BlackList") == 0) {
|
||||
char* p = ::strtok(value, ",\r\n");
|
||||
while (p != NULL) {
|
||||
while (p != nullptr) {
|
||||
if (::strlen(p) > 0U) {
|
||||
for (unsigned int i = 0U; p[i] != 0; i++)
|
||||
p[i] = ::toupper(p[i]);
|
||||
|
|
@ -766,11 +766,11 @@ bool CConf::read()
|
|||
callsign.resize(DSTAR_LONG_CALLSIGN_LENGTH, ' ');
|
||||
m_dstarBlackList.push_back(callsign);
|
||||
}
|
||||
p = ::strtok(NULL, ",\r\n");
|
||||
p = ::strtok(nullptr, ",\r\n");
|
||||
}
|
||||
} else if (::strcmp(key, "WhiteList") == 0) {
|
||||
char* p = ::strtok(value, ",\r\n");
|
||||
while (p != NULL) {
|
||||
while (p != nullptr) {
|
||||
if (::strlen(p) > 0U) {
|
||||
for (unsigned int i = 0U; p[i] != 0; i++)
|
||||
p[i] = ::toupper(p[i]);
|
||||
|
|
@ -778,31 +778,32 @@ bool CConf::read()
|
|||
callsign.resize(DSTAR_LONG_CALLSIGN_LENGTH, ' ');
|
||||
m_dstarWhiteList.push_back(callsign);
|
||||
}
|
||||
p = ::strtok(NULL, ",\r\n");
|
||||
p = ::strtok(nullptr, ",\r\n");
|
||||
}
|
||||
} else if (::strcmp(key, "AckReply") == 0)
|
||||
m_dstarAckReply = ::atoi(value) == 1;
|
||||
else if (::strcmp(key, "AckTime") == 0)
|
||||
m_dstarAckTime = (unsigned int)::atoi(value);
|
||||
else if (::strcmp(key, "AckMessage") == 0) {
|
||||
m_dstarAckMessage = (DSTAR_ACK_MESSAGE)::atoi(value);
|
||||
if (m_dstarAckMessage != DSTAR_ACK_BER && m_dstarAckMessage != DSTAR_ACK_RSSI && m_dstarAckMessage != DSTAR_ACK_SMETER)
|
||||
m_dstarAckMessage = DSTAR_ACK_BER;
|
||||
m_dstarAckMessage = DSTAR_ACK(::atoi(value));
|
||||
if ((m_dstarAckMessage != DSTAR_ACK::BER) && (m_dstarAckMessage != DSTAR_ACK::RSSI) && (m_dstarAckMessage != DSTAR_ACK::SMETER))
|
||||
m_dstarAckMessage = DSTAR_ACK::BER;
|
||||
} else if (::strcmp(key, "ErrorReply") == 0)
|
||||
m_dstarErrorReply = ::atoi(value) == 1;
|
||||
else if (::strcmp(key, "RemoteGateway") == 0)
|
||||
m_dstarRemoteGateway = ::atoi(value) == 1;
|
||||
else if (::strcmp(key, "ModeHang") == 0)
|
||||
m_dstarModeHang = (unsigned int)::atoi(value);
|
||||
} else if (section == SECTION::DMR) {
|
||||
#endif
|
||||
#if defined(USE_DMR)
|
||||
} else if (section == SECTION_DMR) {
|
||||
if (::strcmp(key, "Enable") == 0)
|
||||
m_dmrEnabled = ::atoi(value) == 1;
|
||||
else if (::strcmp(key, "Beacons") == 0)
|
||||
m_dmrBeacons = ::atoi(value) == 1 ? DMR_BEACONS_NETWORK : DMR_BEACONS_OFF;
|
||||
m_dmrBeacons = ::atoi(value) == 1 ? DMR_BEACONS::NETWORK : DMR_BEACONS::OFF;
|
||||
else if (::strcmp(key, "BeaconInterval") == 0) {
|
||||
m_dmrBeacons = m_dmrBeacons != DMR_BEACONS_OFF ? DMR_BEACONS_TIMED : DMR_BEACONS_OFF;
|
||||
m_dmrBeacons = m_dmrBeacons != DMR_BEACONS::OFF ? DMR_BEACONS::TIMED : DMR_BEACONS::OFF;
|
||||
m_dmrBeaconInterval = (unsigned int)::atoi(value);
|
||||
} else if (::strcmp(key, "BeaconDuration") == 0)
|
||||
m_dmrBeaconDuration = (unsigned int)::atoi(value);
|
||||
|
|
@ -818,43 +819,43 @@ bool CConf::read()
|
|||
m_dmrDumpTAData = ::atoi(value) == 1;
|
||||
else if (::strcmp(key, "Prefixes") == 0) {
|
||||
char* p = ::strtok(value, ",\r\n");
|
||||
while (p != NULL) {
|
||||
while (p != nullptr) {
|
||||
unsigned int prefix = (unsigned int)::atoi(p);
|
||||
if (prefix > 0U && prefix <= 999U)
|
||||
m_dmrPrefixes.push_back(prefix);
|
||||
p = ::strtok(NULL, ",\r\n");
|
||||
p = ::strtok(nullptr, ",\r\n");
|
||||
}
|
||||
} else if (::strcmp(key, "BlackList") == 0) {
|
||||
char* p = ::strtok(value, ",\r\n");
|
||||
while (p != NULL) {
|
||||
while (p != nullptr) {
|
||||
unsigned int id = (unsigned int)::atoi(p);
|
||||
if (id > 0U)
|
||||
m_dmrBlackList.push_back(id);
|
||||
p = ::strtok(NULL, ",\r\n");
|
||||
p = ::strtok(nullptr, ",\r\n");
|
||||
}
|
||||
} else if (::strcmp(key, "WhiteList") == 0) {
|
||||
char* p = ::strtok(value, ",\r\n");
|
||||
while (p != NULL) {
|
||||
while (p != nullptr) {
|
||||
unsigned int id = (unsigned int)::atoi(p);
|
||||
if (id > 0U)
|
||||
m_dmrWhiteList.push_back(id);
|
||||
p = ::strtok(NULL, ",\r\n");
|
||||
p = ::strtok(nullptr, ",\r\n");
|
||||
}
|
||||
} else if (::strcmp(key, "Slot1TGWhiteList") == 0) {
|
||||
char* p = ::strtok(value, ",\r\n");
|
||||
while (p != NULL) {
|
||||
while (p != nullptr) {
|
||||
unsigned int id = (unsigned int)::atoi(p);
|
||||
if (id > 0U)
|
||||
m_dmrSlot1TGWhiteList.push_back(id);
|
||||
p = ::strtok(NULL, ",\r\n");
|
||||
p = ::strtok(nullptr, ",\r\n");
|
||||
}
|
||||
} else if (::strcmp(key, "Slot2TGWhiteList") == 0) {
|
||||
char* p = ::strtok(value, ",\r\n");
|
||||
while (p != NULL) {
|
||||
while (p != nullptr) {
|
||||
unsigned int id = (unsigned int)::atoi(p);
|
||||
if (id > 0U)
|
||||
m_dmrSlot2TGWhiteList.push_back(id);
|
||||
p = ::strtok(NULL, ",\r\n");
|
||||
p = ::strtok(nullptr, ",\r\n");
|
||||
}
|
||||
} else if (::strcmp(key, "TXHang") == 0)
|
||||
m_dmrTXHang = (unsigned int)::atoi(value);
|
||||
|
|
@ -865,19 +866,19 @@ bool CConf::read()
|
|||
else if (::strcmp(key, "OVCM") == 0) {
|
||||
switch (::atoi(value)) {
|
||||
case 1:
|
||||
m_dmrOVCM = DMR_OVCM_RX_ON;
|
||||
m_dmrOVCM = DMR_OVCM::RX_ON;
|
||||
break;
|
||||
case 2:
|
||||
m_dmrOVCM = DMR_OVCM_TX_ON;
|
||||
m_dmrOVCM = DMR_OVCM::TX_ON;
|
||||
break;
|
||||
case 3:
|
||||
m_dmrOVCM = DMR_OVCM_ON;
|
||||
m_dmrOVCM = DMR_OVCM::ON;
|
||||
break;
|
||||
case 4:
|
||||
m_dmrOVCM = DMR_OVCM_FORCE_OFF;
|
||||
m_dmrOVCM = DMR_OVCM::FORCE_OFF;
|
||||
break;
|
||||
default:
|
||||
m_dmrOVCM = DMR_OVCM_OFF;
|
||||
m_dmrOVCM = DMR_OVCM::OFF;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
@ -904,7 +905,7 @@ bool CConf::read()
|
|||
else if (::strcmp(key, "Id") == 0)
|
||||
m_p25Id = (unsigned int)::atoi(value);
|
||||
else if (::strcmp(key, "NAC") == 0)
|
||||
m_p25NAC = (unsigned int)::strtoul(value, NULL, 16);
|
||||
m_p25NAC = (unsigned int)::strtoul(value, nullptr, 16);
|
||||
else if (::strcmp(key, "OverrideUIDCheck") == 0)
|
||||
m_p25OverrideUID = ::atoi(value) == 1;
|
||||
else if (::strcmp(key, "SelfOnly") == 0)
|
||||
|
|
@ -1220,7 +1221,7 @@ bool CConf::read()
|
|||
m_lockFileEnabled = ::atoi(value) == 1;
|
||||
else if (::strcmp(key, "File") == 0)
|
||||
m_lockFileName = value;
|
||||
} else if (section == SECTION_REMOTE_CONTROL) {
|
||||
} else if (section == SECTION::REMOTE_CONTROL) {
|
||||
if (::strcmp(key, "Enable") == 0)
|
||||
m_remoteControlEnabled = ::atoi(value) == 1;
|
||||
}
|
||||
|
|
@ -1636,7 +1637,7 @@ unsigned int CConf::getDStarAckTime() const
|
|||
return m_dstarAckTime;
|
||||
}
|
||||
|
||||
DSTAR_ACK_MESSAGE CConf::getDStarAckMessage() const
|
||||
DSTAR_ACK CConf::getDStarAckMessage() const
|
||||
{
|
||||
return m_dstarAckMessage;
|
||||
}
|
||||
|
|
@ -1743,7 +1744,7 @@ unsigned int CConf::getDMRModeHang() const
|
|||
return m_dmrModeHang;
|
||||
}
|
||||
|
||||
DMR_OVCM_TYPES CConf::getDMROVCM() const
|
||||
DMR_OVCM CConf::getDMROVCM() const
|
||||
{
|
||||
return m_dmrOVCM;
|
||||
}
|
||||
|
|
|
|||
2
Conf.h
2
Conf.h
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (C) 2015-2024 by Jonathan Naylor G4KLX
|
||||
* Copyright (C) 2015-2025 by Jonathan Naylor G4KLX
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
|
|
|
|||
30
DMRCSBK.cpp
30
DMRCSBK.cpp
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (C) 2015,2016,2020,2021,2022,2023 by Jonathan Naylor G4KLX
|
||||
* Copyright (C) 2015,2016,2020,2021,2022,2023,2025 by Jonathan Naylor G4KLX
|
||||
* Copyright (C) 2019 by Patrick Maier DK5MP
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
|
|
@ -28,8 +28,8 @@
|
|||
#include <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)
|
||||
|
|
|
|||
26
DMRCSBK.h
26
DMRCSBK.h
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (C) 2015,2016,2020,2021,2022,2023 by Jonathan Naylor G4KLX
|
||||
* Copyright (C) 2015,2016,2020,2021,2022,2023,2025 by Jonathan Naylor G4KLX
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
|
|
@ -24,18 +24,18 @@
|
|||
|
||||
#if defined(USE_DMR)
|
||||
|
||||
enum CSBKO {
|
||||
CSBKO_NONE = 0x00,
|
||||
CSBKO_UUVREQ = 0x04,
|
||||
CSBKO_UUANSRSP = 0x05,
|
||||
CSBKO_CTCSBK = 0x07,
|
||||
CSBKO_CALL_ALERT = 0x1F,
|
||||
CSBKO_CALL_ALERT_ACK = 0x20,
|
||||
CSBKO_RADIO_CHECK = 0x24,
|
||||
CSBKO_NACKRSP = 0x26,
|
||||
CSBKO_CALL_EMERGENCY = 0x27,
|
||||
CSBKO_BSDWNACT = 0x38,
|
||||
CSBKO_PRECCSBK = 0x3D
|
||||
enum class CSBKO {
|
||||
NONE = 0x00,
|
||||
UUVREQ = 0x04,
|
||||
UUANSRSP = 0x05,
|
||||
CTCSBK = 0x07,
|
||||
CALL_ALERT = 0x1F,
|
||||
CALL_ALERT_ACK = 0x20,
|
||||
RADIO_CHECK = 0x24,
|
||||
NACKRSP = 0x26,
|
||||
CALL_EMERGENCY = 0x27,
|
||||
BSDWNACT = 0x38,
|
||||
PRECCSBK = 0x3D
|
||||
};
|
||||
|
||||
class CDMRCSBK
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
12
DMRData.cpp
12
DMRData.cpp
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (C) 2015,2016,2017,2023 Jonathan Naylor, G4KLX
|
||||
* Copyright (C) 2015,2016,2017,2023,2025 Jonathan Naylor, G4KLX
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
|
|
@ -24,7 +24,7 @@
|
|||
|
||||
CDMRData::CDMRData(const CDMRData& data) :
|
||||
m_slotNo(data.m_slotNo),
|
||||
m_data(NULL),
|
||||
m_data(nullptr),
|
||||
m_srcId(data.m_srcId),
|
||||
m_dstId(data.m_dstId),
|
||||
m_flco(data.m_flco),
|
||||
|
|
@ -40,10 +40,10 @@ m_rssi(data.m_rssi)
|
|||
|
||||
CDMRData::CDMRData() :
|
||||
m_slotNo(1U),
|
||||
m_data(NULL),
|
||||
m_data(nullptr),
|
||||
m_srcId(0U),
|
||||
m_dstId(0U),
|
||||
m_flco(FLCO_GROUP),
|
||||
m_flco(FLCO::GROUP),
|
||||
m_dataType(0U),
|
||||
m_seqNo(0U),
|
||||
m_n(0U),
|
||||
|
|
@ -171,7 +171,7 @@ void CDMRData::setRSSI(unsigned char rssi)
|
|||
|
||||
unsigned int CDMRData::getData(unsigned char* buffer) const
|
||||
{
|
||||
assert(buffer != NULL);
|
||||
assert(buffer != nullptr);
|
||||
|
||||
::memcpy(buffer, m_data, DMR_FRAME_LENGTH_BYTES);
|
||||
|
||||
|
|
@ -180,7 +180,7 @@ unsigned int CDMRData::getData(unsigned char* buffer) const
|
|||
|
||||
void CDMRData::setData(const unsigned char* buffer)
|
||||
{
|
||||
assert(buffer != NULL);
|
||||
assert(buffer != nullptr);
|
||||
|
||||
::memcpy(m_data, buffer, DMR_FRAME_LENGTH_BYTES);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
18
DMRDefines.h
18
DMRDefines.h
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (C) 2015,2016,2021 by Jonathan Naylor G4KLX
|
||||
* Copyright (C) 2015,2016,2021,2025 by Jonathan Naylor G4KLX
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
|
|
@ -110,14 +110,14 @@ const unsigned char DPF_PROPRIETARY = 0x0FU;
|
|||
const unsigned char FID_ETSI = 0U;
|
||||
const unsigned char FID_DMRA = 16U;
|
||||
|
||||
enum FLCO {
|
||||
FLCO_GROUP = 0,
|
||||
FLCO_USER_USER = 3,
|
||||
FLCO_TALKER_ALIAS_HEADER = 4,
|
||||
FLCO_TALKER_ALIAS_BLOCK1 = 5,
|
||||
FLCO_TALKER_ALIAS_BLOCK2 = 6,
|
||||
FLCO_TALKER_ALIAS_BLOCK3 = 7,
|
||||
FLCO_GPS_INFO = 8
|
||||
enum class FLCO {
|
||||
GROUP = 0,
|
||||
USER_USER = 3,
|
||||
TALKER_ALIAS_HEADER = 4,
|
||||
TALKER_ALIAS_BLOCK1 = 5,
|
||||
TALKER_ALIAS_BLOCK2 = 6,
|
||||
TALKER_ALIAS_BLOCK3 = 7,
|
||||
GINFO = 8
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
16
DMRLC.cpp
16
DMRLC.cpp
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (C) 2015,2016,2019,2021,2022,2023 by Jonathan Naylor G4KLX
|
||||
* Copyright (C) 2015,2016,2019,2021,2022,2023,2025 by Jonathan Naylor G4KLX
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
|
|
@ -38,13 +38,13 @@ m_dstId(dstId)
|
|||
CDMRLC::CDMRLC(const unsigned char* bytes) :
|
||||
m_PF(false),
|
||||
m_R(false),
|
||||
m_FLCO(FLCO_GROUP),
|
||||
m_FLCO(FLCO::GROUP),
|
||||
m_FID(0U),
|
||||
m_options(0U),
|
||||
m_srcId(0U),
|
||||
m_dstId(0U)
|
||||
{
|
||||
assert(bytes != NULL);
|
||||
assert(bytes != nullptr);
|
||||
|
||||
m_PF = (bytes[0U] & 0x80U) == 0x80U;
|
||||
m_R = (bytes[0U] & 0x40U) == 0x40U;
|
||||
|
|
@ -62,13 +62,13 @@ m_dstId(0U)
|
|||
CDMRLC::CDMRLC(const bool* bits) :
|
||||
m_PF(false),
|
||||
m_R(false),
|
||||
m_FLCO(FLCO_GROUP),
|
||||
m_FLCO(FLCO::GROUP),
|
||||
m_FID(0U),
|
||||
m_options(0U),
|
||||
m_srcId(0U),
|
||||
m_dstId(0U)
|
||||
{
|
||||
assert(bits != NULL);
|
||||
assert(bits != nullptr);
|
||||
|
||||
m_PF = bits[0U];
|
||||
m_R = bits[1U];
|
||||
|
|
@ -100,7 +100,7 @@ m_dstId(0U)
|
|||
CDMRLC::CDMRLC() :
|
||||
m_PF(false),
|
||||
m_R(false),
|
||||
m_FLCO(FLCO_GROUP),
|
||||
m_FLCO(FLCO::GROUP),
|
||||
m_FID(0U),
|
||||
m_options(0U),
|
||||
m_srcId(0U),
|
||||
|
|
@ -114,7 +114,7 @@ CDMRLC::~CDMRLC()
|
|||
|
||||
void CDMRLC::getData(unsigned char* bytes) const
|
||||
{
|
||||
assert(bytes != NULL);
|
||||
assert(bytes != nullptr);
|
||||
|
||||
bytes[0U] = (unsigned char)m_FLCO;
|
||||
|
||||
|
|
@ -139,7 +139,7 @@ void CDMRLC::getData(unsigned char* bytes) const
|
|||
|
||||
void CDMRLC::getData(bool* bits) const
|
||||
{
|
||||
assert(bits != NULL);
|
||||
assert(bits != nullptr);
|
||||
|
||||
unsigned char bytes[9U];
|
||||
getData(bytes);
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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]);
|
||||
|
|
|
|||
326
DMRSlot.cpp
326
DMRSlot.cpp
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (C) 2015-2021,2023 Jonathan Naylor, G4KLX
|
||||
* Copyright (C) 2015-2021,2023,2025 Jonathan Naylor, G4KLX
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
|
|
@ -42,23 +42,24 @@ bool CDMRSlot::m_dumpTAData = true;
|
|||
CModem* CDMRSlot::m_modem = NULL;
|
||||
CDMRNetwork* CDMRSlot::m_network = NULL;
|
||||
bool CDMRSlot::m_duplex = true;
|
||||
CDMRLookup* CDMRSlot::m_lookup = NULL;
|
||||
CDMRLookup* CDMRSlot::m_lookup = nullptr;
|
||||
unsigned int CDMRSlot::m_hangCount = 3U * 17U;
|
||||
DMR_OVCM_TYPES CDMRSlot::m_ovcm = DMR_OVCM_OFF;
|
||||
DMR_OVCM CDMRSlot::m_ovcm = DMR_OVCM::OFF;
|
||||
bool CDMRSlot::m_protect = false;
|
||||
|
||||
CRSSIInterpolator* CDMRSlot::m_rssiMapper = NULL;
|
||||
CRSSIInterpolator* CDMRSlot::m_rssiMapper = nullptr;
|
||||
|
||||
unsigned int CDMRSlot::m_jitterTime = 360U;
|
||||
unsigned int CDMRSlot::m_jitterSlots = 6U;
|
||||
|
||||
unsigned char* CDMRSlot::m_idle = NULL;
|
||||
unsigned char* CDMRSlot::m_idle = nullptr;
|
||||
|
||||
FLCO CDMRSlot::m_flco1;
|
||||
unsigned char CDMRSlot::m_id1 = 0U;
|
||||
ACTIVITY_TYPE CDMRSlot::m_activity1 = ACTIVITY_NONE;
|
||||
ACTIVITY_TYPE CDMRSlot::m_activity1 = ACTIVITY_TYPE::NONE;
|
||||
FLCO CDMRSlot::m_flco2;
|
||||
unsigned char CDMRSlot::m_id2 = 0U;
|
||||
ACTIVITY_TYPE CDMRSlot::m_activity2 = ACTIVITY_NONE;
|
||||
ACTIVITY_TYPE CDMRSlot::m_activity2 = ACTIVITY_TYPE::NONE;
|
||||
|
||||
const unsigned char TALKER_ID_NONE = 0x00U;
|
||||
const unsigned char TALKER_ID_HEADER = 0x01U;
|
||||
|
|
@ -76,22 +77,22 @@ const unsigned int BER_COUNT = 18U * 141U; // 18 * 60ms = 1080ms
|
|||
CDMRSlot::CDMRSlot(unsigned int slotNo, unsigned int timeout) :
|
||||
m_slotNo(slotNo),
|
||||
m_queue(5000U, "DMR Slot"),
|
||||
m_rfState(RS_RF_LISTENING),
|
||||
m_netState(RS_NET_IDLE),
|
||||
m_rfState(RPT_RF_STATE::LISTENING),
|
||||
m_netState(RPT_NET_STATE::IDLE),
|
||||
m_rfEmbeddedLC(),
|
||||
m_rfEmbeddedData(NULL),
|
||||
m_rfEmbeddedData(nullptr),
|
||||
m_rfEmbeddedReadN(0U),
|
||||
m_rfEmbeddedWriteN(1U),
|
||||
m_rfTalkerId(TALKER_ID_NONE),
|
||||
m_rfTalkerAlias(slotNo),
|
||||
m_netEmbeddedLC(),
|
||||
m_netEmbeddedData(NULL),
|
||||
m_netEmbeddedData(nullptr),
|
||||
m_netEmbeddedReadN(0U),
|
||||
m_netEmbeddedWriteN(1U),
|
||||
m_netTalkerId(TALKER_ID_NONE),
|
||||
m_netTalkerAlias(slotNo),
|
||||
m_rfLC(NULL),
|
||||
m_netLC(NULL),
|
||||
m_rfLC(nullptr),
|
||||
m_netLC(nullptr),
|
||||
m_rfSeqNo(0U),
|
||||
m_rfN(0U),
|
||||
m_lastrfN(0U),
|
||||
|
|
@ -112,7 +113,7 @@ m_rfErrs(0U),
|
|||
m_netErrs(0U),
|
||||
m_rfTimeout(false),
|
||||
m_netTimeout(false),
|
||||
m_lastFrame(NULL),
|
||||
m_lastFrame(nullptr),
|
||||
m_lastFrameValid(false),
|
||||
m_rssi(0),
|
||||
m_maxRSSI(0),
|
||||
|
|
@ -142,7 +143,7 @@ CDMRSlot::~CDMRSlot()
|
|||
|
||||
bool CDMRSlot::writeModem(unsigned char *data, unsigned int len)
|
||||
{
|
||||
assert(data != NULL);
|
||||
assert(data != nullptr);
|
||||
|
||||
if (!m_enabled)
|
||||
return false;
|
||||
|
|
@ -185,7 +186,7 @@ bool CDMRSlot::writeModem(unsigned char *data, unsigned int len)
|
|||
}
|
||||
|
||||
if (data[0U] == TAG_LOST) {
|
||||
m_rfState = RS_RF_LISTENING;
|
||||
m_rfState = RPT_RF_STATE::LISTENING;
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
@ -224,12 +225,12 @@ bool CDMRSlot::writeModem(unsigned char *data, unsigned int len)
|
|||
slotType.setDataType(dataType);
|
||||
|
||||
if (dataType == DT_VOICE_LC_HEADER) {
|
||||
if (m_rfState == RS_RF_AUDIO)
|
||||
if (m_rfState == RPT_RF_STATE::AUDIO)
|
||||
return true;
|
||||
|
||||
CDMRFullLC fullLC;
|
||||
CDMRLC* lc = fullLC.decode(data + 2U, DT_VOICE_LC_HEADER);
|
||||
if (lc == NULL)
|
||||
if (lc == nullptr)
|
||||
return false;
|
||||
|
||||
unsigned int srcId = lc->getSrcId();
|
||||
|
|
@ -238,25 +239,34 @@ bool CDMRSlot::writeModem(unsigned char *data, unsigned int len)
|
|||
std::string dst = m_lookup->find(dstId);
|
||||
FLCO flco = lc->getFLCO();
|
||||
|
||||
if (!m_protect) {
|
||||
if (lc->getPF()) {
|
||||
LogMessage("DMR Slot %u, RF user %u rejected", m_slotNo, srcId);
|
||||
delete lc;
|
||||
m_rfState = RPT_RF_STATE::LISTENING;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if (!CDMRAccessControl::validateSrcId(srcId)) {
|
||||
LogMessage("DMR Slot %u, RF user %u rejected", m_slotNo, srcId);
|
||||
writeJSONRF("rejected", srcId, src, flco == FLCO_GROUP, dstId);
|
||||
delete lc;
|
||||
m_rfState = RS_RF_LISTENING;
|
||||
m_rfState = RPT_RF_STATE::LISTENING;
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!CDMRAccessControl::validateTGId(m_slotNo, flco == FLCO_GROUP, dstId)) {
|
||||
if (!CDMRAccessControl::validateTGId(m_slotNo, flco == FLCO::GROUP, dstId)) {
|
||||
LogMessage("DMR Slot %u, RF user %u rejected for using TG %u", m_slotNo, srcId, dstId);
|
||||
writeJSONRF("rejected", srcId, src, flco == FLCO_GROUP, dstId);
|
||||
delete lc;
|
||||
m_rfState = RS_RF_LISTENING;
|
||||
m_rfState = RPT_RF_STATE::LISTENING;
|
||||
return false;
|
||||
}
|
||||
|
||||
if (m_ovcm == DMR_OVCM_TX_ON || m_ovcm == DMR_OVCM_ON)
|
||||
if ((m_ovcm == DMR_OVCM::TX_ON) || (m_ovcm == DMR_OVCM::ON))
|
||||
lc->setOVCM(true);
|
||||
else if (m_ovcm == DMR_OVCM_FORCE_OFF)
|
||||
else if (m_ovcm == DMR_OVCM::FORCE_OFF)
|
||||
lc->setOVCM(false);
|
||||
|
||||
m_rfLC = lc;
|
||||
|
|
@ -311,7 +321,7 @@ bool CDMRSlot::writeModem(unsigned char *data, unsigned int len)
|
|||
|
||||
writeNetworkRF(data, DT_VOICE_LC_HEADER);
|
||||
|
||||
m_rfState = RS_RF_AUDIO;
|
||||
m_rfState = RPT_RF_STATE::AUDIO;
|
||||
|
||||
if (m_netState == RS_NET_IDLE) {
|
||||
setShortLC(m_slotNo, dstId, flco, ACTIVITY_VOICE);
|
||||
|
|
@ -324,7 +334,7 @@ bool CDMRSlot::writeModem(unsigned char *data, unsigned int len)
|
|||
|
||||
return true;
|
||||
} else if (dataType == DT_VOICE_PI_HEADER) {
|
||||
if (m_rfState != RS_RF_AUDIO)
|
||||
if (m_rfState != RPT_RF_STATE::AUDIO)
|
||||
return false;
|
||||
|
||||
// Regenerate the Slot Type
|
||||
|
|
@ -342,14 +352,16 @@ bool CDMRSlot::writeModem(unsigned char *data, unsigned int len)
|
|||
data[0U] = TAG_DATA;
|
||||
data[1U] = 0x00U;
|
||||
|
||||
if (m_duplex)
|
||||
writeQueueRF(data);
|
||||
if (m_protect) {
|
||||
if (m_duplex)
|
||||
writeQueueRF(data);
|
||||
|
||||
writeNetworkRF(data, DT_VOICE_PI_HEADER);
|
||||
writeNetworkRF(data, DT_VOICE_PI_HEADER);
|
||||
}
|
||||
|
||||
return true;
|
||||
} else if (dataType == DT_TERMINATOR_WITH_LC) {
|
||||
if (m_rfState != RS_RF_AUDIO)
|
||||
if (m_rfState != RPT_RF_STATE::AUDIO)
|
||||
return false;
|
||||
|
||||
// Regenerate the LC data
|
||||
|
|
@ -396,7 +408,7 @@ bool CDMRSlot::writeModem(unsigned char *data, unsigned int len)
|
|||
return true;
|
||||
}
|
||||
} else if (dataType == DT_DATA_HEADER) {
|
||||
if (m_rfState == RS_RF_DATA)
|
||||
if (m_rfState == RPT_RF_STATE::DATA)
|
||||
return true;
|
||||
|
||||
CDMRDataHeader dataHeader;
|
||||
|
|
@ -426,7 +438,7 @@ bool CDMRSlot::writeModem(unsigned char *data, unsigned int len)
|
|||
|
||||
m_rfFrames = dataHeader.getBlocks();
|
||||
|
||||
m_rfLC = new CDMRLC(gi ? FLCO_GROUP : FLCO_USER_USER, srcId, dstId);
|
||||
m_rfLC = new CDMRLC(gi ? FLCO::GROUP : FLCO::USER_USER, srcId, dstId);
|
||||
|
||||
// Regenerate the data header
|
||||
dataHeader.get(data + 2U);
|
||||
|
|
@ -445,7 +457,7 @@ bool CDMRSlot::writeModem(unsigned char *data, unsigned int len)
|
|||
|
||||
writeNetworkRF(data, DT_DATA_HEADER);
|
||||
|
||||
m_rfState = RS_RF_DATA;
|
||||
m_rfState = RPT_RF_STATE::DATA;
|
||||
|
||||
if (m_netState == RS_NET_IDLE) {
|
||||
setShortLC(m_slotNo, dstId, gi ? FLCO_GROUP : FLCO_USER_USER, ACTIVITY_DATA);
|
||||
|
|
@ -469,13 +481,13 @@ bool CDMRSlot::writeModem(unsigned char *data, unsigned int len)
|
|||
return false;
|
||||
|
||||
CSBKO csbko = csbk.getCSBKO();
|
||||
if (csbko == CSBKO_BSDWNACT)
|
||||
if (csbko == CSBKO::BSDWNACT)
|
||||
return false;
|
||||
|
||||
// set the OVCM bit for the supported csbk
|
||||
if (m_ovcm == DMR_OVCM_TX_ON || m_ovcm == DMR_OVCM_ON)
|
||||
if ((m_ovcm == DMR_OVCM::TX_ON) || (m_ovcm == DMR_OVCM::ON))
|
||||
csbk.setOVCM(true);
|
||||
else if (m_ovcm == DMR_OVCM_FORCE_OFF)
|
||||
else if (m_ovcm == DMR_OVCM::FORCE_OFF)
|
||||
csbk.setOVCM(false);
|
||||
|
||||
bool gi = csbk.getGI();
|
||||
|
|
@ -515,38 +527,38 @@ bool CDMRSlot::writeModem(unsigned char *data, unsigned int len)
|
|||
if (m_duplex)
|
||||
writeQueueRF(data);
|
||||
|
||||
writeNetworkRF(data, DT_CSBK, gi ? FLCO_GROUP : FLCO_USER_USER, srcId, dstId);
|
||||
writeNetworkRF(data, DT_CSBK, gi ? FLCO::GROUP : FLCO::USER_USER, srcId, dstId);
|
||||
|
||||
switch (csbko) {
|
||||
case CSBKO_UUVREQ:
|
||||
case CSBKO::UUVREQ:
|
||||
LogMessage("DMR Slot %u, received RF Unit to Unit Voice Service Request CSBK from %s to %s%s", m_slotNo, src.c_str(), gi ? "TG ": "", dst.c_str());
|
||||
writeJSONRF("csbk", "Unit to Unit Voice Service Request", srcId, src, gi, dstId);
|
||||
break;
|
||||
case CSBKO_UUANSRSP:
|
||||
case CSBKO::UUANSRSP:
|
||||
LogMessage("DMR Slot %u, received RF Unit to Unit Voice Service Answer Response CSBK from %s to %s%s", m_slotNo, src.c_str(), gi ? "TG ": "", dst.c_str());
|
||||
writeJSONRF("csbk", "Unit to Unit Voice Answer Response", srcId, src, gi, dstId);
|
||||
break;
|
||||
case CSBKO_NACKRSP:
|
||||
case CSBKO::NACKRSP:
|
||||
LogMessage("DMR Slot %u, received RF Negative Acknowledgment Response CSBK from %s to %s%s", m_slotNo, src.c_str(), gi ? "TG ": "", dst.c_str());
|
||||
writeJSONRF("csbk", "Negative Acknowledgment Response", srcId, src, gi, dstId);
|
||||
break;
|
||||
case CSBKO_PRECCSBK:
|
||||
case CSBKO::PRECCSBK:
|
||||
LogMessage("DMR Slot %u, received RF %s Preamble CSBK (%u to follow) from %s to %s%s", m_slotNo, csbk.getDataContent() ? "Data" : "CSBK", csbk.getCBF(), src.c_str(), gi ? "TG ": "", dst.c_str());
|
||||
writeJSONRF("csbk", "Preamble", srcId, src, gi, dstId);
|
||||
break;
|
||||
case CSBKO_CALL_ALERT:
|
||||
case CSBKO::CALL_ALERT:
|
||||
LogMessage("DMR Slot %u, received RF Call Alert CSBK from %s to %s%s", m_slotNo, src.c_str(), gi ? "TG " : "", dst.c_str());
|
||||
writeJSONRF("csbk", "Call Alert", srcId, src, gi, dstId);
|
||||
break;
|
||||
case CSBKO_CALL_ALERT_ACK:
|
||||
case CSBKO::CALL_ALERT_ACK:
|
||||
LogMessage("DMR Slot %u, received RF Call Alert Ack CSBK from %s to %s%s", m_slotNo, src.c_str(), gi ? "TG " : "", dst.c_str());
|
||||
writeJSONRF("csbk", "Call Alert Ack", srcId, src, gi, dstId);
|
||||
break;
|
||||
case CSBKO_RADIO_CHECK:
|
||||
case CSBKO::RADIO_CHECK:
|
||||
LogMessage("DMR Slot %u, received RF Radio Check %s CSBK from %s to %s%s", m_slotNo, /* TBD */ 1 ? "Req" : "Ack", src.c_str(), gi ? "TG " : "", dst.c_str());
|
||||
writeJSONRF("csbk", "Radio Check", srcId, src, gi, dstId);
|
||||
break;
|
||||
case CSBKO_CALL_EMERGENCY:
|
||||
case CSBKO::CALL_EMERGENCY:
|
||||
LogMessage("DMR Slot %u, received RF Call Emergency CSBK from %s to %s%s", m_slotNo, src.c_str(), gi ? "TG " : "", dst.c_str());
|
||||
writeJSONRF("csbk", "Call Emergency", srcId, src, gi, dstId);
|
||||
break;
|
||||
|
|
@ -562,8 +574,8 @@ bool CDMRSlot::writeModem(unsigned char *data, unsigned int len)
|
|||
}
|
||||
|
||||
return true;
|
||||
} else if (dataType == DT_RATE_12_DATA || dataType == DT_RATE_34_DATA || dataType == DT_RATE_1_DATA) {
|
||||
if (m_rfState != RS_RF_DATA || m_rfFrames == 0U)
|
||||
} else if ((dataType == DT_RATE_12_DATA) || (dataType == DT_RATE_34_DATA) || (dataType == DT_RATE_1_DATA)) {
|
||||
if ((m_rfState != RPT_RF_STATE::DATA) || (m_rfFrames == 0U))
|
||||
return false;
|
||||
|
||||
char title[80U];
|
||||
|
|
@ -617,7 +629,7 @@ bool CDMRSlot::writeModem(unsigned char *data, unsigned int len)
|
|||
return true;
|
||||
}
|
||||
} else if (audioSync) {
|
||||
if (m_rfState == RS_RF_AUDIO) {
|
||||
if (m_rfState == RPT_RF_STATE::AUDIO) {
|
||||
m_lastrfN = 0;
|
||||
// Convert the Audio Sync to be from the BS or MS as needed
|
||||
CSync::addDMRAudioSync(data + 2U, m_duplex);
|
||||
|
|
@ -657,13 +669,13 @@ bool CDMRSlot::writeModem(unsigned char *data, unsigned int len)
|
|||
}
|
||||
|
||||
return false;
|
||||
} else if (m_rfState == RS_RF_LISTENING) {
|
||||
} else if (m_rfState == RPT_RF_STATE::LISTENING) {
|
||||
m_rfEmbeddedLC.reset();
|
||||
m_rfState = RS_RF_LATE_ENTRY;
|
||||
m_rfState = RPT_RF_STATE::LATE_ENTRY;
|
||||
return false;
|
||||
}
|
||||
} else {
|
||||
if (m_rfState == RS_RF_AUDIO) {
|
||||
if (m_rfState == RPT_RF_STATE::AUDIO) {
|
||||
m_rfN = data[1U] & 0x0FU;
|
||||
if (m_rfN > 5U)
|
||||
return false;
|
||||
|
|
@ -703,24 +715,24 @@ bool CDMRSlot::writeModem(unsigned char *data, unsigned int len)
|
|||
|
||||
char text[80U];
|
||||
switch (flco) {
|
||||
case FLCO_GROUP:
|
||||
case FLCO_USER_USER:
|
||||
case FLCO::GROUP:
|
||||
case FLCO::USER_USER:
|
||||
// ::sprintf(text, "DMR Slot %u, Embedded LC", m_slotNo);
|
||||
// CUtils::dump(1U, text, data, 9U);
|
||||
break;
|
||||
|
||||
case FLCO_GPS_INFO:
|
||||
case FLCO::GINFO:
|
||||
if (m_dumpTAData) {
|
||||
::sprintf(text, "DMR Slot %u, Embedded GPS Info", m_slotNo);
|
||||
CUtils::dump(1U, text, data, 9U);
|
||||
logGPSPosition(data);
|
||||
}
|
||||
if (m_network != NULL)
|
||||
if (m_network != nullptr)
|
||||
m_network->writeRadioPosition(m_rfLC->getSrcId(), data);
|
||||
break;
|
||||
|
||||
case FLCO_TALKER_ALIAS_HEADER:
|
||||
if (m_network != NULL)
|
||||
case FLCO::TALKER_ALIAS_HEADER:
|
||||
if (m_network != nullptr)
|
||||
m_network->writeTalkerAlias(m_rfLC->getSrcId(), 0U, data);
|
||||
|
||||
if (!(m_rfTalkerId & TALKER_ID_HEADER)) {
|
||||
|
|
@ -740,8 +752,8 @@ bool CDMRSlot::writeModem(unsigned char *data, unsigned int len)
|
|||
}
|
||||
break;
|
||||
|
||||
case FLCO_TALKER_ALIAS_BLOCK1:
|
||||
if (m_network != NULL)
|
||||
case FLCO::TALKER_ALIAS_BLOCK1:
|
||||
if (m_network != nullptr)
|
||||
m_network->writeTalkerAlias(m_rfLC->getSrcId(), 1U, data);
|
||||
|
||||
if (!(m_rfTalkerId & TALKER_ID_BLOCK1)) {
|
||||
|
|
@ -761,8 +773,8 @@ bool CDMRSlot::writeModem(unsigned char *data, unsigned int len)
|
|||
}
|
||||
break;
|
||||
|
||||
case FLCO_TALKER_ALIAS_BLOCK2:
|
||||
if (m_network != NULL)
|
||||
case FLCO::TALKER_ALIAS_BLOCK2:
|
||||
if (m_network != nullptr)
|
||||
m_network->writeTalkerAlias(m_rfLC->getSrcId(), 2U, data);
|
||||
|
||||
if (!(m_rfTalkerId & TALKER_ID_BLOCK2)) {
|
||||
|
|
@ -782,8 +794,8 @@ bool CDMRSlot::writeModem(unsigned char *data, unsigned int len)
|
|||
}
|
||||
break;
|
||||
|
||||
case FLCO_TALKER_ALIAS_BLOCK3:
|
||||
if (m_network != NULL)
|
||||
case FLCO::TALKER_ALIAS_BLOCK3:
|
||||
if (m_network != nullptr)
|
||||
m_network->writeTalkerAlias(m_rfLC->getSrcId(), 3U, data);
|
||||
|
||||
if (!(m_rfTalkerId & TALKER_ID_BLOCK3)) {
|
||||
|
|
@ -844,7 +856,7 @@ bool CDMRSlot::writeModem(unsigned char *data, unsigned int len)
|
|||
}
|
||||
|
||||
return false;
|
||||
} else if (m_rfState == RS_RF_LATE_ENTRY) {
|
||||
} else if (m_rfState == RPT_RF_STATE::LATE_ENTRY) {
|
||||
CDMREMB emb;
|
||||
emb.putData(data + 2U);
|
||||
|
||||
|
|
@ -855,32 +867,41 @@ bool CDMRSlot::writeModem(unsigned char *data, unsigned int len)
|
|||
|
||||
m_rfEmbeddedLC.addData(data + 2U, emb.getLCSS());
|
||||
CDMRLC* lc = m_rfEmbeddedLC.getLC();
|
||||
if (lc != NULL) {
|
||||
if (lc != nullptr) {
|
||||
unsigned int srcId = lc->getSrcId();
|
||||
unsigned int dstId = lc->getDstId();
|
||||
std::string src = m_lookup->find(srcId);
|
||||
std::string dst = m_lookup->find(dstId);
|
||||
FLCO flco = lc->getFLCO();
|
||||
|
||||
if (!m_protect) {
|
||||
if (lc->getPF()) {
|
||||
LogMessage("DMR Slot %u, RF user %u rejected", m_slotNo, srcId);
|
||||
delete lc;
|
||||
m_rfState = RPT_RF_STATE::LISTENING;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if (!CDMRAccessControl::validateSrcId(srcId)) {
|
||||
LogMessage("DMR Slot %u, RF user %u rejected", m_slotNo, srcId);
|
||||
writeJSONRF("rejected", srcId, src, flco == FLCO_GROUP, dstId);
|
||||
delete lc;
|
||||
m_rfState = RS_RF_LISTENING;
|
||||
m_rfState = RPT_RF_STATE::LISTENING;
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!CDMRAccessControl::validateTGId(m_slotNo, flco == FLCO_GROUP, dstId)) {
|
||||
if (!CDMRAccessControl::validateTGId(m_slotNo, flco == FLCO::GROUP, dstId)) {
|
||||
LogMessage("DMR Slot %u, RF user %u rejected for using TG %u", m_slotNo, srcId, dstId);
|
||||
writeJSONRF("rejected", srcId, src, flco == FLCO_GROUP, dstId);
|
||||
delete lc;
|
||||
m_rfState = RS_RF_LISTENING;
|
||||
m_rfState = RPT_RF_STATE::LISTENING;
|
||||
return false;
|
||||
}
|
||||
|
||||
if (m_ovcm == DMR_OVCM_TX_ON || m_ovcm == DMR_OVCM_ON)
|
||||
if ((m_ovcm == DMR_OVCM::TX_ON) || (m_ovcm == DMR_OVCM::ON))
|
||||
lc->setOVCM(true);
|
||||
else if (m_ovcm == DMR_OVCM_FORCE_OFF)
|
||||
else if (m_ovcm == DMR_OVCM::FORCE_OFF)
|
||||
lc->setOVCM(false);
|
||||
|
||||
m_rfLC = lc;
|
||||
|
|
@ -971,7 +992,7 @@ bool CDMRSlot::writeModem(unsigned char *data, unsigned int len)
|
|||
|
||||
writeNetworkRF(data, DT_VOICE, errors);
|
||||
|
||||
m_rfState = RS_RF_AUDIO;
|
||||
m_rfState = RPT_RF_STATE::AUDIO;
|
||||
|
||||
if (m_netState == RS_NET_IDLE) {
|
||||
setShortLC(m_slotNo, dstId, flco, ACTIVITY_VOICE);
|
||||
|
|
@ -992,7 +1013,7 @@ bool CDMRSlot::writeModem(unsigned char *data, unsigned int len)
|
|||
|
||||
unsigned int CDMRSlot::readModem(unsigned char* data)
|
||||
{
|
||||
assert(data != NULL);
|
||||
assert(data != nullptr);
|
||||
|
||||
if (m_queue.isEmpty())
|
||||
return 0U;
|
||||
|
|
@ -1007,13 +1028,13 @@ unsigned int CDMRSlot::readModem(unsigned char* data)
|
|||
|
||||
void CDMRSlot::writeEndRF(bool writeEnd)
|
||||
{
|
||||
m_rfState = RS_RF_LISTENING;
|
||||
m_rfState = RPT_RF_STATE::LISTENING;
|
||||
|
||||
if (m_netState == RS_NET_IDLE)
|
||||
setShortLC(m_slotNo, 0U);
|
||||
|
||||
if (writeEnd) {
|
||||
if (m_netState == RS_NET_IDLE && m_duplex && !m_rfTimeout) {
|
||||
if ((m_netState == RPT_NET_STATE::IDLE) && m_duplex && !m_rfTimeout) {
|
||||
// Create a dummy start end frame
|
||||
unsigned char data[DMR_FRAME_LENGTH_BYTES + 2U];
|
||||
|
||||
|
|
@ -1049,12 +1070,12 @@ void CDMRSlot::writeEndRF(bool writeEnd)
|
|||
m_rfN = 0U;
|
||||
|
||||
delete m_rfLC;
|
||||
m_rfLC = NULL;
|
||||
m_rfLC = nullptr;
|
||||
}
|
||||
|
||||
void CDMRSlot::writeEndNet(bool writeEnd)
|
||||
{
|
||||
m_netState = RS_NET_IDLE;
|
||||
m_netState = RPT_NET_STATE::IDLE;
|
||||
|
||||
setShortLC(m_slotNo, 0U);
|
||||
|
||||
|
|
@ -1108,7 +1129,7 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData)
|
|||
if (!m_enabled)
|
||||
return;
|
||||
|
||||
if (m_rfState != RS_RF_LISTENING && m_netState == RS_NET_IDLE)
|
||||
if ((m_rfState != RPT_RF_STATE::LISTENING) && (m_netState == RPT_NET_STATE::IDLE))
|
||||
return;
|
||||
|
||||
m_networkWatchdog.start();
|
||||
|
|
@ -1119,12 +1140,12 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData)
|
|||
dmrData.getData(data + 2U);
|
||||
|
||||
if (dataType == DT_VOICE_LC_HEADER) {
|
||||
if (m_netState == RS_NET_AUDIO)
|
||||
if (m_netState == RPT_NET_STATE::AUDIO)
|
||||
return;
|
||||
|
||||
CDMRFullLC fullLC;
|
||||
CDMRLC* lc = fullLC.decode(data + 2U, DT_VOICE_LC_HEADER);
|
||||
if (lc == NULL) {
|
||||
if (lc == nullptr) {
|
||||
LogMessage("DMR Slot %u, bad LC received from the network, replacing", m_slotNo);
|
||||
lc = new CDMRLC(dmrData.getFLCO(), dmrData.getSrcId(), dmrData.getDstId());
|
||||
}
|
||||
|
|
@ -1135,12 +1156,12 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData)
|
|||
|
||||
if (dstId != dmrData.getDstId() || srcId != dmrData.getSrcId() || flco != dmrData.getFLCO())
|
||||
LogWarning("DMR Slot %u, DMRD header doesn't match the DMR RF header: %u->%s%u %u->%s%u", m_slotNo,
|
||||
dmrData.getSrcId(), dmrData.getFLCO() == FLCO_GROUP ? "TG" : "", dmrData.getDstId(),
|
||||
srcId, flco == FLCO_GROUP ? "TG" : "", dstId);
|
||||
dmrData.getSrcId(), dmrData.getFLCO() == FLCO::GROUP ? "TG" : "", dmrData.getDstId(),
|
||||
srcId, flco == FLCO::GROUP ? "TG" : "", dstId);
|
||||
|
||||
if (m_ovcm == DMR_OVCM_RX_ON || m_ovcm == DMR_OVCM_ON)
|
||||
if ((m_ovcm == DMR_OVCM::RX_ON) || (m_ovcm == DMR_OVCM::ON))
|
||||
lc->setOVCM(true);
|
||||
else if (m_ovcm == DMR_OVCM_FORCE_OFF)
|
||||
else if (m_ovcm == DMR_OVCM::FORCE_OFF)
|
||||
lc->setOVCM(false);
|
||||
|
||||
m_netLC = lc;
|
||||
|
|
@ -1195,9 +1216,9 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData)
|
|||
writeQueueNet(data);
|
||||
}
|
||||
|
||||
m_netState = RS_NET_AUDIO;
|
||||
m_netState = RPT_NET_STATE::AUDIO;
|
||||
|
||||
setShortLC(m_slotNo, dstId, flco, ACTIVITY_VOICE);
|
||||
setShortLC(m_slotNo, dstId, flco, ACTIVITY_TYPE::VOICE);
|
||||
std::string src = m_lookup->find(srcId);
|
||||
std::string dst = m_lookup->find(dstId);
|
||||
class CUserDBentry cn;
|
||||
|
|
@ -1206,15 +1227,15 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData)
|
|||
LogMessage("DMR Slot %u, received network voice header from %s to %s%s", m_slotNo, src.c_str(), flco == FLCO_GROUP ? "TG " : "", dst.c_str());
|
||||
writeJSONNet("start", srcId, src, flco == FLCO_GROUP, dstId);
|
||||
} else if (dataType == DT_VOICE_PI_HEADER) {
|
||||
if (m_netState != RS_NET_AUDIO) {
|
||||
if (m_netState != RPT_NET_STATE::AUDIO) {
|
||||
CDMRLC* lc = new CDMRLC(dmrData.getFLCO(), dmrData.getSrcId(), dmrData.getDstId());
|
||||
|
||||
unsigned int dstId = lc->getDstId();
|
||||
unsigned int srcId = lc->getSrcId();
|
||||
|
||||
if (m_ovcm == DMR_OVCM_RX_ON || m_ovcm == DMR_OVCM_ON)
|
||||
if ((m_ovcm == DMR_OVCM::RX_ON) || (m_ovcm == DMR_OVCM::ON))
|
||||
lc->setOVCM(true);
|
||||
else if (m_ovcm == DMR_OVCM_FORCE_OFF)
|
||||
else if (m_ovcm == DMR_OVCM::FORCE_OFF)
|
||||
lc->setOVCM(false);
|
||||
|
||||
m_netLC = lc;
|
||||
|
|
@ -1261,9 +1282,9 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData)
|
|||
m_netBits = 1U;
|
||||
m_netErrs = 0U;
|
||||
|
||||
m_netState = RS_NET_AUDIO;
|
||||
m_netState = RPT_NET_STATE::AUDIO;
|
||||
|
||||
setShortLC(m_slotNo, dstId, m_netLC->getFLCO(), ACTIVITY_VOICE);
|
||||
setShortLC(m_slotNo, dstId, m_netLC->getFLCO(), ACTIVITY_TYPE::VOICE);
|
||||
std::string src = m_lookup->find(srcId);
|
||||
std::string dst = m_lookup->find(dstId);
|
||||
class CUserDBentry cn;
|
||||
|
|
@ -1293,7 +1314,7 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData)
|
|||
|
||||
writeQueueNet(data);
|
||||
} else if (dataType == DT_TERMINATOR_WITH_LC) {
|
||||
if (m_netState != RS_NET_AUDIO)
|
||||
if (m_netState != RPT_NET_STATE::AUDIO)
|
||||
return;
|
||||
|
||||
// Regenerate the LC data
|
||||
|
|
@ -1334,7 +1355,7 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData)
|
|||
writeJSONNet("end", float(m_netFrames) / 16.667F, float(m_netLost * 100U) / float(m_netFrames), float(m_netErrs * 100U) / float(m_netBits));
|
||||
writeEndNet();
|
||||
} else if (dataType == DT_DATA_HEADER) {
|
||||
if (m_netState == RS_NET_DATA)
|
||||
if (m_netState == RPT_NET_STATE::DATA)
|
||||
return;
|
||||
|
||||
CDMRDataHeader dataHeader;
|
||||
|
|
@ -1371,9 +1392,9 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData)
|
|||
|
||||
writeQueueNet(data);
|
||||
|
||||
m_netState = RS_NET_DATA;
|
||||
m_netState = RPT_NET_STATE::DATA;
|
||||
|
||||
setShortLC(m_slotNo, dstId, gi ? FLCO_GROUP : FLCO_USER_USER, ACTIVITY_DATA);
|
||||
setShortLC(m_slotNo, dstId, gi ? FLCO::GROUP : FLCO::USER_USER, ACTIVITY_TYPE::DATA);
|
||||
|
||||
std::string src = m_lookup->find(srcId);
|
||||
std::string dst = m_lookup->find(dstId);
|
||||
|
|
@ -1387,15 +1408,15 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData)
|
|||
writeEndNet();
|
||||
}
|
||||
} else if (dataType == DT_VOICE_SYNC) {
|
||||
if (m_netState == RS_NET_IDLE) {
|
||||
if (m_netState == RPT_NET_STATE::IDLE) {
|
||||
CDMRLC* lc = new CDMRLC(dmrData.getFLCO(), dmrData.getSrcId(), dmrData.getDstId());
|
||||
|
||||
unsigned int dstId = lc->getDstId();
|
||||
unsigned int srcId = lc->getSrcId();
|
||||
|
||||
if (m_ovcm == DMR_OVCM_RX_ON || m_ovcm == DMR_OVCM_ON)
|
||||
if ((m_ovcm == DMR_OVCM::RX_ON) || (m_ovcm == DMR_OVCM::ON))
|
||||
lc->setOVCM(true);
|
||||
else if (m_ovcm == DMR_OVCM_FORCE_OFF)
|
||||
else if (m_ovcm == DMR_OVCM::FORCE_OFF)
|
||||
lc->setOVCM(false);
|
||||
|
||||
m_netLC = lc;
|
||||
|
|
@ -1451,9 +1472,9 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData)
|
|||
m_netEmbeddedWriteN = 1U;
|
||||
m_netTalkerId = TALKER_ID_NONE;
|
||||
|
||||
m_netState = RS_NET_AUDIO;
|
||||
m_netState = RPT_NET_STATE::AUDIO;
|
||||
|
||||
setShortLC(m_slotNo, dstId, m_netLC->getFLCO(), ACTIVITY_VOICE);
|
||||
setShortLC(m_slotNo, dstId, m_netLC->getFLCO(), ACTIVITY_TYPE::VOICE);
|
||||
|
||||
std::string src = m_lookup->find(srcId);
|
||||
std::string dst = m_lookup->find(dstId);
|
||||
|
|
@ -1464,7 +1485,7 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData)
|
|||
writeJSONNet("late_entry", srcId, src, m_netLC->getFLCO() == FLCO_GROUP, dstId);
|
||||
}
|
||||
|
||||
if (m_netState == RS_NET_AUDIO) {
|
||||
if (m_netState == RPT_NET_STATE::AUDIO) {
|
||||
unsigned char fid = m_netLC->getFID();
|
||||
if (fid == FID_ETSI || fid == FID_DMRA)
|
||||
m_netErrs += m_fec.regenerateDMR(data + 2U);
|
||||
|
|
@ -1503,7 +1524,7 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData)
|
|||
m_netN = dmrData.getN();
|
||||
}
|
||||
} else if (dataType == DT_VOICE) {
|
||||
if (m_netState != RS_NET_AUDIO)
|
||||
if (m_netState != RPT_NET_STATE::AUDIO)
|
||||
return;
|
||||
|
||||
unsigned char fid = m_netLC->getFID();
|
||||
|
|
@ -1526,19 +1547,19 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData)
|
|||
|
||||
char text[80U];
|
||||
switch (flco) {
|
||||
case FLCO_GROUP:
|
||||
case FLCO_USER_USER:
|
||||
case FLCO::GROUP:
|
||||
case FLCO::USER_USER:
|
||||
// ::sprintf(text, "DMR Slot %u, Embedded LC", m_slotNo);
|
||||
// CUtils::dump(1U, text, data, 9U);
|
||||
break;
|
||||
case FLCO_GPS_INFO:
|
||||
case FLCO::GINFO:
|
||||
if (m_dumpTAData) {
|
||||
::sprintf(text, "DMR Slot %u, Embedded GPS Info", m_slotNo);
|
||||
CUtils::dump(1U, text, data, 9U);
|
||||
logGPSPosition(data);
|
||||
}
|
||||
break;
|
||||
case FLCO_TALKER_ALIAS_HEADER:
|
||||
case FLCO::TALKER_ALIAS_HEADER:
|
||||
if (!(m_netTalkerId & TALKER_ID_HEADER)) {
|
||||
if (!m_netTalkerId)
|
||||
m_netTalkerAlias.reset();
|
||||
|
|
@ -1555,7 +1576,7 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData)
|
|||
m_netTalkerId |= TALKER_ID_HEADER;
|
||||
}
|
||||
break;
|
||||
case FLCO_TALKER_ALIAS_BLOCK1:
|
||||
case FLCO::TALKER_ALIAS_BLOCK1:
|
||||
if (!(m_netTalkerId & TALKER_ID_BLOCK1)) {
|
||||
if (!m_netTalkerId)
|
||||
m_netTalkerAlias.reset();
|
||||
|
|
@ -1572,7 +1593,7 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData)
|
|||
m_netTalkerId |= TALKER_ID_BLOCK1;
|
||||
}
|
||||
break;
|
||||
case FLCO_TALKER_ALIAS_BLOCK2:
|
||||
case FLCO::TALKER_ALIAS_BLOCK2:
|
||||
if (!(m_netTalkerId & TALKER_ID_BLOCK2)) {
|
||||
if (!m_netTalkerId)
|
||||
m_netTalkerAlias.reset();
|
||||
|
|
@ -1589,7 +1610,7 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData)
|
|||
m_netTalkerId |= TALKER_ID_BLOCK2;
|
||||
}
|
||||
break;
|
||||
case FLCO_TALKER_ALIAS_BLOCK3:
|
||||
case FLCO::TALKER_ALIAS_BLOCK3:
|
||||
if (!(m_netTalkerId & TALKER_ID_BLOCK3)) {
|
||||
if (!m_netTalkerId)
|
||||
m_netTalkerAlias.reset();
|
||||
|
|
@ -1661,13 +1682,13 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData)
|
|||
}
|
||||
|
||||
CSBKO csbko = csbk.getCSBKO();
|
||||
if (csbko == CSBKO_BSDWNACT)
|
||||
if (csbko == CSBKO::BSDWNACT)
|
||||
return;
|
||||
|
||||
// set the OVCM bit for the supported csbk
|
||||
if (m_ovcm == DMR_OVCM_RX_ON || m_ovcm == DMR_OVCM_ON)
|
||||
if ((m_ovcm == DMR_OVCM::RX_ON) || (m_ovcm == DMR_OVCM::ON))
|
||||
csbk.setOVCM(true);
|
||||
else if (m_ovcm == DMR_OVCM_FORCE_OFF)
|
||||
else if (m_ovcm == DMR_OVCM::FORCE_OFF)
|
||||
csbk.setOVCM(false);
|
||||
|
||||
bool gi = csbk.getGI();
|
||||
|
|
@ -1689,7 +1710,7 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData)
|
|||
data[0U] = TAG_DATA;
|
||||
data[1U] = 0x00U;
|
||||
|
||||
if (csbko == CSBKO_PRECCSBK && csbk.getDataContent()) {
|
||||
if ((csbko == CSBKO::PRECCSBK) && csbk.getDataContent()) {
|
||||
unsigned int cbf = NO_PREAMBLE_CSBK + csbk.getCBF() - 1U;
|
||||
for (unsigned int i = 0U; i < NO_PREAMBLE_CSBK; i++, cbf--) {
|
||||
// Change blocks to follow
|
||||
|
|
@ -1716,31 +1737,31 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData)
|
|||
std::string dst = m_lookup->find(dstId);
|
||||
|
||||
switch (csbko) {
|
||||
case CSBKO_UUVREQ:
|
||||
case CSBKO::UUVREQ:
|
||||
LogMessage("DMR Slot %u, received network Unit to Unit Voice Service Request CSBK from %s to %s%s", m_slotNo, src.c_str(), gi ? "TG ": "", dst.c_str());
|
||||
writeJSONNet("csbk", "Unit to Unit Voice Service Request", srcId, src, gi, dstId);
|
||||
break;
|
||||
case CSBKO_UUANSRSP:
|
||||
case CSBKO::UUANSRSP:
|
||||
LogMessage("DMR Slot %u, received network Unit to Unit Voice Service Answer Response CSBK from %s to %s%s", m_slotNo, src.c_str(), gi ? "TG ": "", dst.c_str());
|
||||
writeJSONNet("csbk", "Unit to Unit Voice Service Answer Response", srcId, src, gi, dstId);
|
||||
break;
|
||||
case CSBKO_NACKRSP:
|
||||
case CSBKO::NACKRSP:
|
||||
LogMessage("DMR Slot %u, received network Negative Acknowledgment Response CSBK from %s to %s%s", m_slotNo, src.c_str(), gi ? "TG ": "", dst.c_str());
|
||||
writeJSONNet("csbk", "UNegative Acknowledgment Response", srcId, src, gi, dstId);
|
||||
break;
|
||||
case CSBKO_PRECCSBK:
|
||||
case CSBKO::PRECCSBK:
|
||||
LogMessage("DMR Slot %u, received network %s Preamble CSBK (%u to follow) from %s to %s%s", m_slotNo, csbk.getDataContent() ? "Data" : "CSBK", csbk.getCBF(), src.c_str(), gi ? "TG " : "", dst.c_str());
|
||||
writeJSONNet("csbk", "Preamble", srcId, src, gi, dstId);
|
||||
break;
|
||||
case CSBKO_CALL_ALERT:
|
||||
case CSBKO::CALL_ALERT:
|
||||
LogMessage("DMR Slot %u, received network Call Alert CSBK from %s to %s%s", m_slotNo, src.c_str(), gi ? "TG " : "", dst.c_str());
|
||||
writeJSONNet("csbk", "Call Alert", srcId, src, gi, dstId);
|
||||
break;
|
||||
case CSBKO_CALL_ALERT_ACK:
|
||||
case CSBKO::CALL_ALERT_ACK:
|
||||
LogMessage("DMR Slot %u, received network Call Alert Ack CSBK from %s to %s%s", m_slotNo, src.c_str(), gi ? "TG " : "", dst.c_str());
|
||||
writeJSONNet("csbk", "Call Alert Ack", srcId, src, gi, dstId);
|
||||
break;
|
||||
case CSBKO_RADIO_CHECK:
|
||||
case CSBKO::RADIO_CHECK:
|
||||
LogMessage("DMR Slot %u, received network Radio Check %s CSBK from %s to %s%s", m_slotNo, /* TBD */ 1 ? "Req" : "Ack", src.c_str(), gi ? "TG " : "", dst.c_str());
|
||||
writeJSONNet("csbk", "Radio Check", srcId, src, gi, dstId);
|
||||
break;
|
||||
|
|
@ -1882,11 +1903,11 @@ void CDMRSlot::clock()
|
|||
}
|
||||
}
|
||||
|
||||
if (m_netState == RS_NET_AUDIO || m_netState == RS_NET_DATA) {
|
||||
if ((m_netState == RPT_NET_STATE::AUDIO) || (m_netState == RPT_NET_STATE::DATA)) {
|
||||
m_networkWatchdog.clock(ms);
|
||||
|
||||
if (m_networkWatchdog.hasExpired()) {
|
||||
if (m_netState == RS_NET_AUDIO) {
|
||||
if (m_netState == RPT_NET_STATE::AUDIO) {
|
||||
// We've received the voice header haven't we?
|
||||
m_netFrames += 1U;
|
||||
LogMessage("DMR Slot %u, network watchdog has expired, %.1f seconds, %u%% packet loss, BER: %.1f%%", m_slotNo, float(m_netFrames) / 16.667F, (m_netLost * 100U) / m_netFrames, float(m_netErrs * 100U) / float(m_netBits));
|
||||
|
|
@ -1900,7 +1921,7 @@ void CDMRSlot::clock()
|
|||
}
|
||||
}
|
||||
|
||||
if (m_netState == RS_NET_AUDIO) {
|
||||
if (m_netState == RPT_NET_STATE::AUDIO) {
|
||||
m_packetTimer.clock(ms);
|
||||
|
||||
if (m_packetTimer.isRunning() && m_packetTimer.hasExpired()) {
|
||||
|
|
@ -1918,9 +1939,9 @@ void CDMRSlot::clock()
|
|||
|
||||
void CDMRSlot::writeQueueRF(const unsigned char *data)
|
||||
{
|
||||
assert(data != NULL);
|
||||
assert(data != nullptr);
|
||||
|
||||
if (m_netState != RS_NET_IDLE)
|
||||
if (m_netState != RPT_NET_STATE::IDLE)
|
||||
return;
|
||||
|
||||
unsigned char len = DMR_FRAME_LENGTH_BYTES + 2U;
|
||||
|
|
@ -1937,12 +1958,12 @@ void CDMRSlot::writeQueueRF(const unsigned char *data)
|
|||
|
||||
void CDMRSlot::writeNetworkRF(const unsigned char* data, unsigned char dataType, FLCO flco, unsigned int srcId, unsigned int dstId, unsigned char errors)
|
||||
{
|
||||
assert(data != NULL);
|
||||
assert(data != nullptr);
|
||||
|
||||
if (m_netState != RS_NET_IDLE)
|
||||
if (m_netState != RPT_NET_STATE::IDLE)
|
||||
return;
|
||||
|
||||
if (m_network == NULL)
|
||||
if (m_network == nullptr)
|
||||
return;
|
||||
|
||||
CDMRData dmrData;
|
||||
|
|
@ -1965,15 +1986,15 @@ void CDMRSlot::writeNetworkRF(const unsigned char* data, unsigned char dataType,
|
|||
|
||||
void CDMRSlot::writeNetworkRF(const unsigned char* data, unsigned char dataType, unsigned char errors)
|
||||
{
|
||||
assert(data != NULL);
|
||||
assert(m_rfLC != NULL);
|
||||
assert(data != nullptr);
|
||||
assert(m_rfLC != nullptr);
|
||||
|
||||
writeNetworkRF(data, dataType, m_rfLC->getFLCO(), m_rfLC->getSrcId(), m_rfLC->getDstId(), errors);
|
||||
}
|
||||
|
||||
void CDMRSlot::writeQueueNet(const unsigned char *data)
|
||||
{
|
||||
assert(data != NULL);
|
||||
assert(data != nullptr);
|
||||
|
||||
unsigned char len = DMR_FRAME_LENGTH_BYTES + 2U;
|
||||
|
||||
|
|
@ -2002,6 +2023,7 @@ void CDMRSlot::init(unsigned int colorCode, bool embeddedLCOnly, bool dumpTAData
|
|||
m_lookup = lookup;
|
||||
m_hangCount = callHang * 17U;
|
||||
m_ovcm = ovcm;
|
||||
m_protect = protect;
|
||||
|
||||
m_rssiMapper = rssiMapper;
|
||||
|
||||
|
|
@ -2022,7 +2044,7 @@ void CDMRSlot::init(unsigned int colorCode, bool embeddedLCOnly, bool dumpTAData
|
|||
|
||||
void CDMRSlot::setShortLC(unsigned int slotNo, unsigned int id, FLCO flco, ACTIVITY_TYPE type)
|
||||
{
|
||||
assert(m_modem != NULL);
|
||||
assert(m_modem != nullptr);
|
||||
|
||||
switch (slotNo) {
|
||||
case 1U:
|
||||
|
|
@ -2066,41 +2088,41 @@ void CDMRSlot::setShortLC(unsigned int slotNo, unsigned int id, FLCO flco, ACTIV
|
|||
|
||||
if (m_id1 != 0U) {
|
||||
lc[2U] = m_id1;
|
||||
if (m_activity1 == ACTIVITY_VOICE && m_flco1 == FLCO_GROUP)
|
||||
if ((m_activity1 == ACTIVITY_TYPE::VOICE) && (m_flco1 == FLCO::GROUP))
|
||||
lc[1U] |= 0x08U;
|
||||
else if (m_activity1 == ACTIVITY_VOICE && m_flco1 == FLCO_USER_USER)
|
||||
else if ((m_activity1 == ACTIVITY_TYPE::VOICE) && (m_flco1 == FLCO::USER_USER))
|
||||
lc[1U] |= 0x09U;
|
||||
else if (m_activity1 == ACTIVITY_DATA && m_flco1 == FLCO_GROUP)
|
||||
else if ((m_activity1 == ACTIVITY_TYPE::DATA) && (m_flco1 == FLCO::GROUP))
|
||||
lc[1U] |= 0x0BU;
|
||||
else if (m_activity1 == ACTIVITY_DATA && m_flco1 == FLCO_USER_USER)
|
||||
else if ((m_activity1 == ACTIVITY_TYPE::DATA) && (m_flco1 == FLCO::USER_USER))
|
||||
lc[1U] |= 0x0AU;
|
||||
else if (m_activity1 == ACTIVITY_CSBK && m_flco1 == FLCO_GROUP)
|
||||
else if ((m_activity1 == ACTIVITY_TYPE::CSBK) && (m_flco1 == FLCO::GROUP))
|
||||
lc[1U] |= 0x02U;
|
||||
else if (m_activity1 == ACTIVITY_CSBK && m_flco1 == FLCO_USER_USER)
|
||||
else if ((m_activity1 == ACTIVITY_TYPE::CSBK) && (m_flco1 == FLCO::USER_USER))
|
||||
lc[1U] |= 0x03U;
|
||||
else if (m_activity1 == ACTIVITY_EMERG && m_flco1 == FLCO_GROUP)
|
||||
else if ((m_activity1 == ACTIVITY_TYPE::EMERG) && (m_flco1 == FLCO::GROUP))
|
||||
lc[1U] |= 0x0CU;
|
||||
else if (m_activity1 == ACTIVITY_EMERG && m_flco1 == FLCO_USER_USER)
|
||||
else if ((m_activity1 == ACTIVITY_TYPE::EMERG) && (m_flco1 == FLCO::USER_USER))
|
||||
lc[1U] |= 0x0DU;
|
||||
}
|
||||
|
||||
if (m_id2 != 0U) {
|
||||
lc[3U] = m_id2;
|
||||
if (m_activity2 == ACTIVITY_VOICE && m_flco2 == FLCO_GROUP)
|
||||
if ((m_activity2 == ACTIVITY_TYPE::VOICE) && (m_flco2 == FLCO::GROUP))
|
||||
lc[1U] |= 0x80U;
|
||||
else if (m_activity2 == ACTIVITY_VOICE && m_flco2 == FLCO_USER_USER)
|
||||
else if ((m_activity2 == ACTIVITY_TYPE::VOICE) && (m_flco2 == FLCO::USER_USER))
|
||||
lc[1U] |= 0x90U;
|
||||
else if (m_activity2 == ACTIVITY_DATA && m_flco2 == FLCO_GROUP)
|
||||
else if ((m_activity2 == ACTIVITY_TYPE::DATA) && (m_flco2 == FLCO::GROUP))
|
||||
lc[1U] |= 0xB0U;
|
||||
else if (m_activity2 == ACTIVITY_DATA && m_flco2 == FLCO_USER_USER)
|
||||
else if ((m_activity2 == ACTIVITY_TYPE::DATA) && (m_flco2 == FLCO::USER_USER))
|
||||
lc[1U] |= 0xA0U;
|
||||
else if (m_activity2 == ACTIVITY_CSBK && m_flco2 == FLCO_GROUP)
|
||||
else if ((m_activity2 == ACTIVITY_TYPE::CSBK) && (m_flco2 == FLCO::GROUP))
|
||||
lc[1U] |= 0x20U;
|
||||
else if (m_activity2 == ACTIVITY_CSBK && m_flco2 == FLCO_USER_USER)
|
||||
else if ((m_activity2 == ACTIVITY_TYPE::CSBK) && (m_flco2 == FLCO::USER_USER))
|
||||
lc[1U] |= 0x30U;
|
||||
else if (m_activity2 == ACTIVITY_EMERG && m_flco2 == FLCO_GROUP)
|
||||
else if ((m_activity2 == ACTIVITY_TYPE::EMERG) && (m_flco2 == FLCO::GROUP))
|
||||
lc[1U] |= 0xC0U;
|
||||
else if (m_activity2 == ACTIVITY_EMERG && m_flco2 == FLCO_USER_USER)
|
||||
else if ((m_activity2 == ACTIVITY_TYPE::EMERG) && (m_flco2 == FLCO::USER_USER))
|
||||
lc[1U] |= 0xD0U;
|
||||
}
|
||||
|
||||
|
|
@ -2116,7 +2138,7 @@ void CDMRSlot::setShortLC(unsigned int slotNo, unsigned int id, FLCO flco, ACTIV
|
|||
|
||||
bool CDMRSlot::insertSilence(const unsigned char* data, unsigned char seqNo)
|
||||
{
|
||||
assert(data != NULL);
|
||||
assert(data != nullptr);
|
||||
|
||||
// Do not send duplicate
|
||||
if (seqNo == m_netN)
|
||||
|
|
@ -2194,7 +2216,7 @@ void CDMRSlot::insertSilence(unsigned int count)
|
|||
|
||||
bool CDMRSlot::isBusy() const
|
||||
{
|
||||
return m_rfState != RS_RF_LISTENING || m_netState != RS_NET_IDLE;
|
||||
return (m_rfState != RPT_RF_STATE::LISTENING) || (m_netState != RPT_NET_STATE::IDLE);
|
||||
}
|
||||
|
||||
void CDMRSlot::enable(bool enabled)
|
||||
|
|
@ -2203,7 +2225,7 @@ void CDMRSlot::enable(bool enabled)
|
|||
m_queue.clear();
|
||||
|
||||
// Reset the RF section
|
||||
m_rfState = RS_RF_LISTENING;
|
||||
m_rfState = RPT_RF_STATE::LISTENING;
|
||||
|
||||
m_rfTimeoutTimer.stop();
|
||||
m_rfTimeout = false;
|
||||
|
|
@ -2219,10 +2241,10 @@ void CDMRSlot::enable(bool enabled)
|
|||
m_rfN = 0U;
|
||||
|
||||
delete m_rfLC;
|
||||
m_rfLC = NULL;
|
||||
m_rfLC = nullptr;
|
||||
|
||||
// Reset the networking section
|
||||
m_netState = RS_NET_IDLE;
|
||||
m_netState = RPT_NET_STATE::IDLE;
|
||||
|
||||
m_lastFrameValid = false;
|
||||
|
||||
|
|
@ -2240,7 +2262,7 @@ void CDMRSlot::enable(bool enabled)
|
|||
m_netN = 0U;
|
||||
|
||||
delete m_netLC;
|
||||
m_netLC = NULL;
|
||||
m_netLC = nullptr;
|
||||
}
|
||||
|
||||
m_enabled = enabled;
|
||||
|
|
|
|||
17
DMRSlot.h
17
DMRSlot.h
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (C) 2015-2021,2023 by Jonathan Naylor G4KLX
|
||||
* Copyright (C) 2015-2021,2023,2025 by Jonathan Naylor G4KLX
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
|
|
@ -40,12 +40,12 @@
|
|||
|
||||
#include <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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
321
DStarControl.cpp
321
DStarControl.cpp
|
|
@ -54,8 +54,8 @@ m_duplex(duplex),
|
|||
m_queue(5000U, "D-Star Control"),
|
||||
m_rfHeader(),
|
||||
m_netHeader(),
|
||||
m_rfState(RS_RF_LISTENING),
|
||||
m_netState(RS_NET_IDLE),
|
||||
m_rfState(RPT_RF_STATE::LISTENING),
|
||||
m_netState(RPT_NET_STATE::IDLE),
|
||||
m_net(false),
|
||||
m_rfSlowData(),
|
||||
m_netSlowData(),
|
||||
|
|
@ -76,7 +76,8 @@ m_fec(),
|
|||
m_rfBits(1U),
|
||||
m_netBits(1U),
|
||||
m_rfErrs(0U),
|
||||
m_lastFrame(NULL),
|
||||
m_netErrs(0U),
|
||||
m_lastFrame(nullptr),
|
||||
m_lastFrameValid(false),
|
||||
m_rssiMapper(rssiMapper),
|
||||
m_rssi(0),
|
||||
|
|
@ -124,14 +125,14 @@ CDStarControl::~CDStarControl()
|
|||
|
||||
bool CDStarControl::writeModem(unsigned char *data, unsigned int len)
|
||||
{
|
||||
assert(data != NULL);
|
||||
assert(data != nullptr);
|
||||
|
||||
if (!m_enabled)
|
||||
return false;
|
||||
|
||||
unsigned char type = data[0U];
|
||||
|
||||
if (type == TAG_LOST && m_rfState == RS_RF_AUDIO) {
|
||||
if (type == TAG_LOST && ((m_rfState == RPT_RF_STATE::AUDIO) || (m_rfState == RPT_RF_STATE::DATA))) {
|
||||
unsigned char my1[DSTAR_LONG_CALLSIGN_LENGTH];
|
||||
unsigned char my2[DSTAR_SHORT_CALLSIGN_LENGTH];
|
||||
unsigned char your[DSTAR_LONG_CALLSIGN_LENGTH];
|
||||
|
|
@ -150,14 +151,14 @@ bool CDStarControl::writeModem(unsigned char *data, unsigned int len)
|
|||
return false;
|
||||
}
|
||||
|
||||
if (type == TAG_LOST && m_rfState == RS_RF_INVALID) {
|
||||
m_rfState = RS_RF_LISTENING;
|
||||
if ((type == TAG_LOST) && (m_rfState == RPT_RF_STATE::INVALID)) {
|
||||
m_rfState = RPT_RF_STATE::LISTENING;
|
||||
|
||||
if (m_netState == RS_NET_IDLE) {
|
||||
if (m_netState == RPT_NET_STATE::IDLE) {
|
||||
if (m_errorReply)
|
||||
m_errTimer.start();
|
||||
|
||||
if (m_network != NULL)
|
||||
if (m_network != nullptr)
|
||||
m_network->reset();
|
||||
}
|
||||
|
||||
|
|
@ -165,7 +166,7 @@ bool CDStarControl::writeModem(unsigned char *data, unsigned int len)
|
|||
}
|
||||
|
||||
if (type == TAG_LOST) {
|
||||
m_rfState = RS_RF_LISTENING;
|
||||
m_rfState = RPT_RF_STATE::LISTENING;
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
@ -309,7 +310,7 @@ bool CDStarControl::writeModem(unsigned char *data, unsigned int len)
|
|||
writeNetworkHeaderRF(data);
|
||||
}
|
||||
|
||||
m_rfState = RS_RF_AUDIO;
|
||||
m_rfState = RPT_RF_STATE::AUDIO;
|
||||
|
||||
if (m_netState == RS_NET_IDLE)
|
||||
writeJSONRSSI();
|
||||
|
|
@ -317,21 +318,21 @@ bool CDStarControl::writeModem(unsigned char *data, unsigned int len)
|
|||
LogMessage("D-Star, received RF header from %8.8s/%4.4s to %8.8s", my1, my2, your);
|
||||
writeJSONRF("start", my1, my2, your);
|
||||
} else if (type == TAG_EOT) {
|
||||
if (m_rfState == RS_RF_REJECTED) {
|
||||
m_rfState = RS_RF_LISTENING;
|
||||
} else if (m_rfState == RS_RF_INVALID) {
|
||||
m_rfState = RS_RF_LISTENING;
|
||||
if (m_rfState == RPT_RF_STATE::REJECTED) {
|
||||
m_rfState = RPT_RF_STATE::LISTENING;
|
||||
} else if (m_rfState == RPT_RF_STATE::INVALID) {
|
||||
m_rfState = RPT_RF_STATE::LISTENING;
|
||||
|
||||
if (m_netState == RS_NET_IDLE) {
|
||||
if (m_netState == RPT_NET_STATE::IDLE) {
|
||||
if (m_errorReply)
|
||||
m_errTimer.start();
|
||||
|
||||
if (m_network != NULL)
|
||||
if (m_network != nullptr)
|
||||
m_network->reset();
|
||||
}
|
||||
|
||||
return false;
|
||||
} else if (m_rfState == RS_RF_AUDIO) {
|
||||
} else if ((m_rfState == RPT_RF_STATE::AUDIO) || (m_rfState == RPT_RF_STATE::DATA)) {
|
||||
if (m_net)
|
||||
writeNetworkDataRF(DSTAR_END_PATTERN_BYTES, 0U, true);
|
||||
|
||||
|
|
@ -358,37 +359,74 @@ bool CDStarControl::writeModem(unsigned char *data, unsigned int len)
|
|||
|
||||
return false;
|
||||
} else if (type == TAG_DATA) {
|
||||
if (m_rfState == RS_RF_REJECTED)
|
||||
if (m_rfState == RPT_RF_STATE::REJECTED)
|
||||
return true;
|
||||
|
||||
if (m_rfState == RS_RF_INVALID)
|
||||
if (m_rfState == RPT_RF_STATE::INVALID)
|
||||
return true;
|
||||
|
||||
if (m_rfState == RS_RF_LISTENING) {
|
||||
if (m_rfState == RPT_RF_STATE::LISTENING) {
|
||||
// The sync is regenerated by the modem so can do exact match
|
||||
if (::memcmp(data + 1U + DSTAR_VOICE_FRAME_LENGTH_BYTES, DSTAR_SYNC_BYTES, DSTAR_DATA_FRAME_LENGTH_BYTES) == 0) {
|
||||
m_rfSlowData.start();
|
||||
m_rfState = RS_RF_LATE_ENTRY;
|
||||
m_rfN = 0U;
|
||||
m_rfState = RPT_RF_STATE::LATE_ENTRY;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
if (m_rfState == RS_RF_AUDIO) {
|
||||
if ((m_rfState == RPT_RF_STATE::AUDIO) || (m_rfState == RPT_RF_STATE::DATA)) {
|
||||
// The sync is regenerated by the modem so can do exact match
|
||||
if (::memcmp(data + 1U + DSTAR_VOICE_FRAME_LENGTH_BYTES, DSTAR_SYNC_BYTES, DSTAR_DATA_FRAME_LENGTH_BYTES) == 0) {
|
||||
m_rfSlowData.start();
|
||||
m_rfN = 0U;
|
||||
}
|
||||
}
|
||||
|
||||
// Regenerate the sync and send the RSSI data to the display
|
||||
if (m_rfN == 0U) {
|
||||
CSync::addDStarSync(data + 1U);
|
||||
writeJSONRSSI();
|
||||
if (m_rfState == RPT_RF_STATE::AUDIO) {
|
||||
m_rfSlowData.peakSlowData(data + 1U, m_rfN);
|
||||
unsigned char type = m_rfSlowData.getType();
|
||||
|
||||
if (type == DSTAR_SLOW_DATA_TYPE_FASTDATA_BEGIN) {
|
||||
LogMessage("D-Star, starting fast data mode");
|
||||
m_rfState = RPT_RF_STATE::DATA;
|
||||
}
|
||||
}
|
||||
|
||||
if (m_rfState == RPT_RF_STATE::DATA) {
|
||||
LogDebug("D-Star, fast data sequence no. %u", m_rfN);
|
||||
|
||||
m_rfBits += 48U;
|
||||
m_rfFrames++;
|
||||
|
||||
if (m_net)
|
||||
writeNetworkDataRF(data, 0U, false);
|
||||
|
||||
if (m_duplex)
|
||||
writeQueueDataRF(data);
|
||||
|
||||
m_rfSlowData.peakSlowData(data + 1U, m_rfN);
|
||||
bool complete = m_rfSlowData.isComplete();
|
||||
|
||||
if (complete) {
|
||||
unsigned char type = m_rfSlowData.getType();
|
||||
if (type == DSTAR_SLOW_DATA_TYPE_FASTDATA_END) {
|
||||
LogMessage("D-Star, leaving fast data mode");
|
||||
m_rfState = RPT_RF_STATE::AUDIO;
|
||||
}
|
||||
}
|
||||
|
||||
m_rfN = (m_rfN + 1U) % 21U;
|
||||
} else if (m_rfState == RPT_RF_STATE::AUDIO) {
|
||||
// Send the RSSI data to the display
|
||||
if (m_rfN == 0U)
|
||||
m_display->writeDStarRSSI(m_rssi);
|
||||
|
||||
unsigned int errors = 0U;
|
||||
if (!m_rfHeader.isDataPacket()) {
|
||||
if (::memcmp(data + 1U, DSTAR_nullptr_AMBE_DATA_BYTES_SCRAMBLED, DSTAR_VOICE_FRAME_LENGTH_BYTES) == 0) {
|
||||
LogDebug("D-Star, audio sequence no. %u, null audio", m_rfN);
|
||||
} else {
|
||||
errors = m_fec.regenerateDStar(data + 1U);
|
||||
m_bitErrsAccum += errors;
|
||||
m_rfErrs += errors;
|
||||
|
|
@ -399,10 +437,10 @@ bool CDStarControl::writeModem(unsigned char *data, unsigned int len)
|
|||
m_rfBits += 48U;
|
||||
m_rfFrames++;
|
||||
|
||||
const unsigned char* text = m_rfSlowData.addText(data + 1U);
|
||||
if (text != NULL) {
|
||||
LogMessage("D-Star, slow data text = \"%s\"", text);
|
||||
writeJSONText(text);
|
||||
if (m_rfN != 0U) {
|
||||
const unsigned char* text = m_rfSlowData.addText(data + 1U, m_rfN);
|
||||
if (text != nullptr)
|
||||
LogMessage("D-Star, RF slow data text = \"%s\"", text);
|
||||
}
|
||||
|
||||
if (m_net)
|
||||
|
|
@ -414,15 +452,20 @@ bool CDStarControl::writeModem(unsigned char *data, unsigned int len)
|
|||
}
|
||||
|
||||
m_rfN = (m_rfN + 1U) % 21U;
|
||||
} else if (m_rfState == RS_RF_LATE_ENTRY) {
|
||||
}
|
||||
|
||||
if (m_rfState == RPT_RF_STATE::LATE_ENTRY) {
|
||||
// The sync is regenerated by the modem so can do exact match
|
||||
if (::memcmp(data + 1U + DSTAR_VOICE_FRAME_LENGTH_BYTES, DSTAR_SYNC_BYTES, DSTAR_DATA_FRAME_LENGTH_BYTES) == 0) {
|
||||
m_rfSlowData.reset();
|
||||
m_rfN = 0U;
|
||||
return false;
|
||||
} else {
|
||||
CDStarHeader* header = m_rfSlowData.addHeader(data + 1U);
|
||||
if (header == NULL)
|
||||
CDStarHeader* header = m_rfSlowData.addHeader(data + 1U, m_rfN);
|
||||
if (header == nullptr) {
|
||||
m_rfN = (m_rfN + 1U) % 21U;
|
||||
return false;
|
||||
}
|
||||
|
||||
m_rfHeader = *header;
|
||||
delete header;
|
||||
|
|
@ -523,7 +566,9 @@ bool CDStarControl::writeModem(unsigned char *data, unsigned int len)
|
|||
}
|
||||
|
||||
unsigned int errors = 0U;
|
||||
if (!m_rfHeader.isDataPacket()) {
|
||||
if (::memcmp(data + 1U, DSTAR_nullptr_AMBE_DATA_BYTES_SCRAMBLED, DSTAR_VOICE_FRAME_LENGTH_BYTES) == 0) {
|
||||
LogDebug("D-Star, audio sequence no. %u, null audio", m_rfN);
|
||||
} else {
|
||||
errors = m_fec.regenerateDStar(data + 1U);
|
||||
LogDebug("D-Star, audio sequence no. %u, errs: %u/48 (%.1f%%)", m_rfN, errors, float(errors) / 0.48F);
|
||||
m_bitErrsAccum += errors;
|
||||
|
|
@ -541,7 +586,7 @@ bool CDStarControl::writeModem(unsigned char *data, unsigned int len)
|
|||
writeQueueDataRF(data);
|
||||
}
|
||||
|
||||
m_rfState = RS_RF_AUDIO;
|
||||
m_rfState = RPT_RF_STATE::AUDIO;
|
||||
|
||||
m_rfN = (m_rfN + 1U) % 21U;
|
||||
|
||||
|
|
@ -562,7 +607,7 @@ bool CDStarControl::writeModem(unsigned char *data, unsigned int len)
|
|||
|
||||
unsigned int CDStarControl::readModem(unsigned char* data)
|
||||
{
|
||||
assert(data != NULL);
|
||||
assert(data != nullptr);
|
||||
|
||||
if (m_queue.isEmpty())
|
||||
return 0U;
|
||||
|
|
@ -577,21 +622,21 @@ unsigned int CDStarControl::readModem(unsigned char* data)
|
|||
|
||||
void CDStarControl::writeEndRF()
|
||||
{
|
||||
m_rfState = RS_RF_LISTENING;
|
||||
m_rfState = RPT_RF_STATE::LISTENING;
|
||||
|
||||
m_rfTimeoutTimer.stop();
|
||||
|
||||
if (m_netState == RS_NET_IDLE) {
|
||||
m_ackTimer.start();
|
||||
|
||||
if (m_network != NULL)
|
||||
if (m_network != nullptr)
|
||||
m_network->reset();
|
||||
}
|
||||
}
|
||||
|
||||
void CDStarControl::writeEndNet()
|
||||
{
|
||||
m_netState = RS_NET_IDLE;
|
||||
m_netState = RPT_NET_STATE::IDLE;
|
||||
|
||||
m_lastFrameValid = false;
|
||||
|
||||
|
|
@ -599,13 +644,13 @@ void CDStarControl::writeEndNet()
|
|||
m_networkWatchdog.stop();
|
||||
m_packetTimer.stop();
|
||||
|
||||
if (m_network != NULL)
|
||||
if (m_network != nullptr)
|
||||
m_network->reset();
|
||||
}
|
||||
|
||||
void CDStarControl::writeNetwork()
|
||||
{
|
||||
assert(m_network != NULL);
|
||||
assert(m_network != nullptr);
|
||||
|
||||
unsigned char data[DSTAR_HEADER_LENGTH_BYTES + 2U];
|
||||
unsigned int length = m_network->read(data, DSTAR_HEADER_LENGTH_BYTES + 2U);
|
||||
|
|
@ -615,7 +660,7 @@ void CDStarControl::writeNetwork()
|
|||
if (!m_enabled)
|
||||
return;
|
||||
|
||||
if (m_rfState == RS_RF_AUDIO && m_netState == RS_NET_IDLE)
|
||||
if (((m_rfState == RPT_RF_STATE::AUDIO) || (m_rfState == RPT_RF_STATE::DATA)) && (m_netState == RPT_NET_STATE::IDLE))
|
||||
return;
|
||||
|
||||
m_networkWatchdog.start();
|
||||
|
|
@ -623,7 +668,7 @@ void CDStarControl::writeNetwork()
|
|||
unsigned char type = data[0U];
|
||||
|
||||
if (type == TAG_HEADER) {
|
||||
if (m_netState != RS_NET_IDLE)
|
||||
if (m_netState != RPT_NET_STATE::IDLE)
|
||||
return;
|
||||
|
||||
CDStarHeader header(data + 1U);
|
||||
|
|
@ -664,7 +709,7 @@ void CDStarControl::writeNetwork()
|
|||
|
||||
m_netState = RS_NET_AUDIO;
|
||||
|
||||
LINK_STATUS status = LS_NONE;
|
||||
LINK_STATUS status = LINK_STATUS::NONE;
|
||||
unsigned char reflector[DSTAR_LONG_CALLSIGN_LENGTH];
|
||||
m_network->getStatus(status, reflector);
|
||||
if (status == LS_LINKED_DEXTRA || status == LS_LINKED_DPLUS || status == LS_LINKED_DCS || status == LS_LINKED_CCS || status == LS_LINKED_LOOPBACK) {
|
||||
|
|
@ -675,12 +720,9 @@ void CDStarControl::writeNetwork()
|
|||
writeJSONNet("start", my1, my2, your);
|
||||
}
|
||||
|
||||
// Something just above here introduces a large delay forcing erroneous(?) insertion of silence packets.
|
||||
// Starting the elapsed timer here instead of the commented out position above solves that.
|
||||
m_elapsed.start();
|
||||
|
||||
} else if (type == TAG_EOT) {
|
||||
if (m_netState != RS_NET_AUDIO)
|
||||
if ((m_netState != RPT_NET_STATE::AUDIO) && (m_netState != RPT_NET_STATE::DATA))
|
||||
return;
|
||||
|
||||
writeQueueEOTNet();
|
||||
|
|
@ -701,42 +743,89 @@ void CDStarControl::writeNetwork()
|
|||
|
||||
writeEndNet();
|
||||
} else if (type == TAG_DATA) {
|
||||
if (m_netState != RS_NET_AUDIO)
|
||||
return;
|
||||
if ((m_netState == RPT_NET_STATE::AUDIO) || (m_netState == RPT_NET_STATE::DATA)) {
|
||||
unsigned char n = data[1U];
|
||||
|
||||
unsigned int errors = 0U;
|
||||
unsigned char n = data[1U];
|
||||
// The sync is regenerated by the modem so can do exact match
|
||||
if (::memcmp(data + 1U + DSTAR_VOICE_FRAME_LENGTH_BYTES, DSTAR_SYNC_BYTES, DSTAR_DATA_FRAME_LENGTH_BYTES) == 0) {
|
||||
m_netSlowData.start();
|
||||
} else {
|
||||
m_netSlowData.peakSlowData(data + 1U, n);
|
||||
|
||||
if (!m_netHeader.isDataPacket())
|
||||
errors = m_fec.regenerateDStar(data + 2U);
|
||||
if (m_netState == RPT_NET_STATE::AUDIO) {
|
||||
unsigned char type = m_netSlowData.getType();
|
||||
if (type == DSTAR_SLOW_DATA_TYPE_FASTDATA_BEGIN) {
|
||||
LogMessage("D-Star, starting fast data mode");
|
||||
m_netState = RPT_NET_STATE::DATA;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
blankDTMF(data + 2U);
|
||||
if (m_netState == RPT_NET_STATE::AUDIO) {
|
||||
unsigned char n = data[1U];
|
||||
|
||||
data[1U] = TAG_DATA;
|
||||
unsigned int errors = 0U;
|
||||
if (::memcmp(data + 2U, DSTAR_nullptr_AMBE_DATA_BYTES_SCRAMBLED, DSTAR_VOICE_FRAME_LENGTH_BYTES) != 0) {
|
||||
errors = m_fec.regenerateDStar(data + 2U);
|
||||
blankDTMF(data + 2U);
|
||||
}
|
||||
|
||||
// Insert silence and reject if in the past
|
||||
bool ret = insertSilence(data + 1U, n);
|
||||
if (!ret)
|
||||
return;
|
||||
data[1U] = TAG_DATA;
|
||||
|
||||
// Insert silence and reject if in the past
|
||||
bool ret = insertSilence(data + 1U, n);
|
||||
if (!ret)
|
||||
return;
|
||||
|
||||
m_netBits += 48U;
|
||||
|
||||
m_netN = n;
|
||||
m_netN = n;
|
||||
|
||||
// Regenerate the sync
|
||||
if (n == 0U) {
|
||||
CSync::addDStarSync(data + 2U);
|
||||
m_netSlowData.start();
|
||||
// Regenerate the sync
|
||||
if (m_netN == 0U) {
|
||||
CSync::addDStarSync(data + 2U);
|
||||
m_netSlowData.start();
|
||||
} else {
|
||||
const unsigned char* text = m_netSlowData.addText(data + 2U, m_netN);
|
||||
if (text != nullptr)
|
||||
LogMessage("D-Star, network slow data text = \"%s\"", text);
|
||||
}
|
||||
|
||||
m_packetTimer.start();
|
||||
m_netFrames++;
|
||||
|
||||
#if defined(DUMP_DSTAR)
|
||||
writeFile(data + 1U, length - 1U);
|
||||
#endif
|
||||
writeQueueDataNet(data + 1U);
|
||||
}
|
||||
|
||||
const unsigned char* text = m_netSlowData.addText(data + 2U);
|
||||
if (text != NULL) {
|
||||
LogMessage("D-Star, slow data text = \"%s\"", text);
|
||||
writeJSONText(text);
|
||||
}
|
||||
if (m_netState == RPT_NET_STATE::DATA) {
|
||||
m_netN = data[1U];
|
||||
|
||||
m_packetTimer.start();
|
||||
m_netFrames++;
|
||||
data[1U] = TAG_DATA;
|
||||
|
||||
m_netBits += 48U;
|
||||
|
||||
// Regenerate the sync
|
||||
if (m_netN == 0U) {
|
||||
CSync::addDStarSync(data + 2U);
|
||||
m_netSlowData.start();
|
||||
} else {
|
||||
m_netSlowData.peakSlowData(data + 2U, m_netN);
|
||||
bool complete = m_netSlowData.isComplete();
|
||||
if (complete) {
|
||||
unsigned char type = m_netSlowData.getType();
|
||||
if (type == DSTAR_SLOW_DATA_TYPE_FASTDATA_END) {
|
||||
LogMessage("D-Star, leaving fast data mode");
|
||||
m_netState = RPT_NET_STATE::AUDIO;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
m_packetTimer.start();
|
||||
m_netFrames++;
|
||||
|
||||
writeQueueDataNet(data + 1U);
|
||||
} else {
|
||||
|
|
@ -749,7 +838,7 @@ void CDStarControl::clock()
|
|||
unsigned int ms = m_interval.elapsed();
|
||||
m_interval.start();
|
||||
|
||||
if (m_network != NULL)
|
||||
if (m_network != nullptr)
|
||||
writeNetwork();
|
||||
|
||||
m_ackTimer.clock(ms);
|
||||
|
|
@ -767,7 +856,7 @@ void CDStarControl::clock()
|
|||
m_rfTimeoutTimer.clock(ms);
|
||||
m_netTimeoutTimer.clock(ms);
|
||||
|
||||
if (m_netState == RS_NET_AUDIO) {
|
||||
if (m_netState == RPT_NET_STATE::AUDIO) {
|
||||
m_networkWatchdog.clock(ms);
|
||||
|
||||
if (m_networkWatchdog.hasExpired()) {
|
||||
|
|
@ -787,7 +876,7 @@ void CDStarControl::clock()
|
|||
}
|
||||
|
||||
// Only insert silence on audio data
|
||||
if (m_netState == RS_NET_AUDIO) {
|
||||
if (m_netState == RPT_NET_STATE::AUDIO) {
|
||||
m_packetTimer.clock(ms);
|
||||
|
||||
if (m_packetTimer.isRunning() && m_packetTimer.hasExpired()) {
|
||||
|
|
@ -809,9 +898,9 @@ void CDStarControl::clock()
|
|||
|
||||
void CDStarControl::writeQueueHeaderRF(const unsigned char *data)
|
||||
{
|
||||
assert(data != NULL);
|
||||
assert(data != nullptr);
|
||||
|
||||
if (m_netState != RS_NET_IDLE)
|
||||
if (m_netState != RPT_NET_STATE::IDLE)
|
||||
return;
|
||||
|
||||
if (m_rfTimeoutTimer.isRunning() && m_rfTimeoutTimer.hasExpired())
|
||||
|
|
@ -832,9 +921,9 @@ void CDStarControl::writeQueueHeaderRF(const unsigned char *data)
|
|||
|
||||
void CDStarControl::writeQueueDataRF(const unsigned char *data)
|
||||
{
|
||||
assert(data != NULL);
|
||||
assert(data != nullptr);
|
||||
|
||||
if (m_netState != RS_NET_IDLE)
|
||||
if (m_netState != RPT_NET_STATE::IDLE)
|
||||
return;
|
||||
|
||||
if (m_rfTimeoutTimer.isRunning() && m_rfTimeoutTimer.hasExpired())
|
||||
|
|
@ -855,7 +944,7 @@ void CDStarControl::writeQueueDataRF(const unsigned char *data)
|
|||
|
||||
void CDStarControl::writeQueueEOTRF()
|
||||
{
|
||||
if (m_netState != RS_NET_IDLE)
|
||||
if (m_netState != RPT_NET_STATE::IDLE)
|
||||
return;
|
||||
|
||||
if (m_rfTimeoutTimer.isRunning() && m_rfTimeoutTimer.hasExpired())
|
||||
|
|
@ -877,7 +966,7 @@ void CDStarControl::writeQueueEOTRF()
|
|||
|
||||
void CDStarControl::writeQueueHeaderNet(const unsigned char *data)
|
||||
{
|
||||
assert(data != NULL);
|
||||
assert(data != nullptr);
|
||||
|
||||
if (m_netTimeoutTimer.isRunning() && m_netTimeoutTimer.hasExpired())
|
||||
return;
|
||||
|
|
@ -897,7 +986,7 @@ void CDStarControl::writeQueueHeaderNet(const unsigned char *data)
|
|||
|
||||
void CDStarControl::writeQueueDataNet(const unsigned char *data)
|
||||
{
|
||||
assert(data != NULL);
|
||||
assert(data != nullptr);
|
||||
|
||||
if (m_netTimeoutTimer.isRunning() && m_netTimeoutTimer.hasExpired())
|
||||
return;
|
||||
|
|
@ -936,35 +1025,35 @@ void CDStarControl::writeQueueEOTNet()
|
|||
|
||||
void CDStarControl::writeNetworkHeaderRF(const unsigned char* data)
|
||||
{
|
||||
assert(data != NULL);
|
||||
assert(data != nullptr);
|
||||
|
||||
if (m_network == NULL)
|
||||
if (m_network == nullptr)
|
||||
return;
|
||||
|
||||
// Don't send to the network if the timeout has expired
|
||||
if (m_rfTimeoutTimer.isRunning() && m_rfTimeoutTimer.hasExpired())
|
||||
return;
|
||||
|
||||
m_network->writeHeader(data + 1U, DSTAR_HEADER_LENGTH_BYTES, m_netState != RS_NET_IDLE);
|
||||
m_network->writeHeader(data + 1U, DSTAR_HEADER_LENGTH_BYTES, m_netState != RPT_NET_STATE::IDLE);
|
||||
}
|
||||
|
||||
void CDStarControl::writeNetworkDataRF(const unsigned char* data, unsigned int errors, bool end)
|
||||
{
|
||||
assert(data != NULL);
|
||||
assert(data != nullptr);
|
||||
|
||||
if (m_network == NULL)
|
||||
if (m_network == nullptr)
|
||||
return;
|
||||
|
||||
// Don't send to the network if the timeout has expired
|
||||
if (m_rfTimeoutTimer.isRunning() && m_rfTimeoutTimer.hasExpired())
|
||||
return;
|
||||
|
||||
m_network->writeData(data + 1U, DSTAR_FRAME_LENGTH_BYTES, errors, end, m_netState != RS_NET_IDLE);
|
||||
m_network->writeData(data + 1U, DSTAR_FRAME_LENGTH_BYTES, errors, end, m_netState != RPT_NET_STATE::IDLE);
|
||||
}
|
||||
|
||||
bool CDStarControl::insertSilence(const unsigned char* data, unsigned char seqNo)
|
||||
{
|
||||
assert(data != NULL);
|
||||
assert(data != nullptr);
|
||||
|
||||
// Check to see if we have any spaces to fill?
|
||||
unsigned int oldSeqNo = (m_netN + 1U) % 21U;
|
||||
|
|
@ -999,19 +1088,19 @@ void CDStarControl::insertSilence(unsigned int count)
|
|||
for (unsigned int i = 0U; i < count; i++) {
|
||||
if (i < 3U && m_lastFrameValid) {
|
||||
if (n == 0U) {
|
||||
::memcpy(m_lastFrame + DSTAR_VOICE_FRAME_LENGTH_BYTES + 1U, DSTAR_NULL_SLOW_SYNC_BYTES, DSTAR_DATA_FRAME_LENGTH_BYTES);
|
||||
::memcpy(m_lastFrame + DSTAR_VOICE_FRAME_LENGTH_BYTES + 1U, DSTAR_nullptr_SLOW_SYNC_BYTES, DSTAR_DATA_FRAME_LENGTH_BYTES);
|
||||
writeQueueDataNet(m_lastFrame);
|
||||
} else {
|
||||
::memcpy(m_lastFrame + DSTAR_VOICE_FRAME_LENGTH_BYTES + 1U, DSTAR_NULL_SLOW_DATA_BYTES, DSTAR_DATA_FRAME_LENGTH_BYTES);
|
||||
::memcpy(m_lastFrame + DSTAR_VOICE_FRAME_LENGTH_BYTES + 1U, DSTAR_nullptr_SLOW_DATA_BYTES, DSTAR_DATA_FRAME_LENGTH_BYTES);
|
||||
writeQueueDataNet(m_lastFrame);
|
||||
}
|
||||
} else {
|
||||
m_lastFrameValid = false;
|
||||
|
||||
if (n == 0U)
|
||||
writeQueueDataNet(DSTAR_NULL_FRAME_SYNC_BYTES);
|
||||
writeQueueDataNet(DSTAR_nullptr_FRAME_SYNC_BYTES);
|
||||
else
|
||||
writeQueueDataNet(DSTAR_NULL_FRAME_DATA_BYTES);
|
||||
writeQueueDataNet(DSTAR_nullptr_FRAME_DATA_BYTES);
|
||||
}
|
||||
|
||||
m_netN = n;
|
||||
|
|
@ -1025,7 +1114,7 @@ void CDStarControl::insertSilence(unsigned int count)
|
|||
|
||||
void CDStarControl::blankDTMF(unsigned char* data) const
|
||||
{
|
||||
assert(data != NULL);
|
||||
assert(data != nullptr);
|
||||
|
||||
// DTMF begins with these byte values
|
||||
if ((data[0] & DSTAR_DTMF_MASK[0]) == DSTAR_DTMF_SIG[0] && (data[1] & DSTAR_DTMF_MASK[1]) == DSTAR_DTMF_SIG[1] &&
|
||||
|
|
@ -1033,7 +1122,7 @@ void CDStarControl::blankDTMF(unsigned char* data) const
|
|||
(data[4] & DSTAR_DTMF_MASK[4]) == DSTAR_DTMF_SIG[4] && (data[5] & DSTAR_DTMF_MASK[5]) == DSTAR_DTMF_SIG[5] &&
|
||||
(data[6] & DSTAR_DTMF_MASK[6]) == DSTAR_DTMF_SIG[6] && (data[7] & DSTAR_DTMF_MASK[7]) == DSTAR_DTMF_SIG[7] &&
|
||||
(data[8] & DSTAR_DTMF_MASK[8]) == DSTAR_DTMF_SIG[8])
|
||||
::memcpy(data, DSTAR_NULL_AMBE_DATA_BYTES, DSTAR_VOICE_FRAME_LENGTH_BYTES);
|
||||
::memcpy(data, DSTAR_nullptr_AMBE_DATA_BYTES, DSTAR_VOICE_FRAME_LENGTH_BYTES);
|
||||
}
|
||||
|
||||
void CDStarControl::sendAck()
|
||||
|
|
@ -1059,16 +1148,16 @@ void CDStarControl::sendAck()
|
|||
|
||||
writeQueueHeaderRF(data);
|
||||
|
||||
writeQueueDataRF(DSTAR_NULL_FRAME_SYNC_BYTES);
|
||||
writeQueueDataRF(DSTAR_nullptr_FRAME_SYNC_BYTES);
|
||||
|
||||
LINK_STATUS status = LS_NONE;
|
||||
LINK_STATUS status = LINK_STATUS::NONE;
|
||||
unsigned char reflector[DSTAR_LONG_CALLSIGN_LENGTH];
|
||||
if (m_network != NULL)
|
||||
if (m_network != nullptr)
|
||||
m_network->getStatus(status, reflector);
|
||||
|
||||
char text[40U];
|
||||
if (m_ackMessage == DSTAR_ACK_RSSI && m_rssi != 0) {
|
||||
if (status == LS_LINKED_DEXTRA || status == LS_LINKED_DPLUS || status == LS_LINKED_DCS || status == LS_LINKED_CCS || status == LS_LINKED_LOOPBACK) {
|
||||
if ((m_ackMessage == DSTAR_ACK::RSSI) && (m_rssi != 0U)) {
|
||||
if ((status == LINK_STATUS::LINKED_DEXTRA) || (status == LINK_STATUS::LINKED_DPLUS) || (status == LINK_STATUS::LINKED_DCS) || (status == LINK_STATUS::LINKED_CCS) || (status == LINK_STATUS::LINKED_LOOPBACK)) {
|
||||
CUtils::removeChar(reflector, ' ');//remove space from reflector so all nicely fits onto 20 chars in case rssi < 99dBm
|
||||
::sprintf(text, "%-8.8s %.1f%% %ddBm ", reflector, float(m_rfErrs * 100U) / float(m_rfBits), m_aveRSSI / int(m_rssiCountTotal));
|
||||
} else {
|
||||
|
|
@ -1097,12 +1186,12 @@ void CDStarControl::sendAck()
|
|||
else
|
||||
::sprintf(signalText, "S%d", signal);
|
||||
|
||||
if (status == LS_LINKED_DEXTRA || status == LS_LINKED_DPLUS || status == LS_LINKED_DCS || status == LS_LINKED_CCS || status == LS_LINKED_LOOPBACK)
|
||||
if ((status == LINK_STATUS::LINKED_DEXTRA) || (status == LINK_STATUS::LINKED_DPLUS) || (status == LINK_STATUS::LINKED_DCS) || (status == LINK_STATUS::LINKED_CCS) || (status == LINK_STATUS::LINKED_LOOPBACK))
|
||||
::sprintf(text, "%-8.8s %.1f%% %s ", reflector, float(m_rfErrs * 100U) / float(m_rfBits), signalText);
|
||||
else
|
||||
::sprintf(text, "BER:%.1f%% %s ", float(m_rfErrs * 100U) / float(m_rfBits), signalText);
|
||||
} else {
|
||||
if (status == LS_LINKED_DEXTRA || status == LS_LINKED_DPLUS || status == LS_LINKED_DCS || status == LS_LINKED_CCS || status == LS_LINKED_LOOPBACK)
|
||||
if ((status == LINK_STATUS::LINKED_DEXTRA) || (status == LINK_STATUS::LINKED_DPLUS) || (status == LINK_STATUS::LINKED_DCS) || (status == LINK_STATUS::LINKED_CCS) || (status == LINK_STATUS::LINKED_LOOPBACK))
|
||||
::sprintf(text, "%-8.8s BER: %.1f%% ", reflector, float(m_rfErrs * 100U) / float(m_rfBits));
|
||||
else
|
||||
::sprintf(text, "BER: %.1f%% ", float(m_rfErrs * 100U) / float(m_rfBits));
|
||||
|
|
@ -1110,7 +1199,7 @@ void CDStarControl::sendAck()
|
|||
|
||||
m_rfSlowData.setText(text);
|
||||
|
||||
::memcpy(data, DSTAR_NULL_FRAME_DATA_BYTES, DSTAR_FRAME_LENGTH_BYTES + 1U);
|
||||
::memcpy(data, DSTAR_nullptr_FRAME_DATA_BYTES, DSTAR_FRAME_LENGTH_BYTES + 1U);
|
||||
|
||||
for (unsigned int i = 0U; i < 19U; i++) {
|
||||
m_rfSlowData.getSlowData(data + 1U + DSTAR_VOICE_FRAME_LENGTH_BYTES);
|
||||
|
|
@ -1138,16 +1227,16 @@ void CDStarControl::sendError()
|
|||
|
||||
writeQueueHeaderRF(data);
|
||||
|
||||
writeQueueDataRF(DSTAR_NULL_FRAME_SYNC_BYTES);
|
||||
writeQueueDataRF(DSTAR_nullptr_FRAME_SYNC_BYTES);
|
||||
|
||||
LINK_STATUS status = LS_NONE;
|
||||
LINK_STATUS status = LINK_STATUS::NONE;
|
||||
unsigned char reflector[DSTAR_LONG_CALLSIGN_LENGTH];
|
||||
if (m_network != NULL)
|
||||
if (m_network != nullptr)
|
||||
m_network->getStatus(status, reflector);
|
||||
|
||||
char text[40U];
|
||||
if (m_ackMessage == DSTAR_ACK_RSSI && m_rssi != 0) {
|
||||
if (status == LS_LINKED_DEXTRA || status == LS_LINKED_DPLUS || status == LS_LINKED_DCS || status == LS_LINKED_CCS || status == LS_LINKED_LOOPBACK) {
|
||||
if ((m_ackMessage == DSTAR_ACK::RSSI) && (m_rssi != 0U)) {
|
||||
if ((status == LINK_STATUS::LINKED_DEXTRA) || (status == LINK_STATUS::LINKED_DPLUS) || (status == LINK_STATUS::LINKED_DCS) || (status == LINK_STATUS::LINKED_CCS) || (status == LINK_STATUS::LINKED_LOOPBACK)) {
|
||||
CUtils::removeChar(reflector, ' ');//remove space from reflector so all nicely fits onto 20 chars in case rssi < 99dBm
|
||||
::sprintf(text, "%-8.8s %.1f%% %ddBm ", reflector, float(m_rfErrs * 100U) / float(m_rfBits), m_aveRSSI / int(m_rssiCountTotal));
|
||||
} else {
|
||||
|
|
@ -1176,12 +1265,12 @@ void CDStarControl::sendError()
|
|||
else
|
||||
::sprintf(signalText, "S%d", signal);
|
||||
|
||||
if (status == LS_LINKED_DEXTRA || status == LS_LINKED_DPLUS || status == LS_LINKED_DCS || status == LS_LINKED_CCS || status == LS_LINKED_LOOPBACK)
|
||||
if ((status == LINK_STATUS::LINKED_DEXTRA) || (status == LINK_STATUS::LINKED_DPLUS) || (status == LINK_STATUS::LINKED_DCS) || (status == LINK_STATUS::LINKED_CCS) || (status == LINK_STATUS::LINKED_LOOPBACK))
|
||||
::sprintf(text, "%-8.8s %.1f%% %s ", reflector, float(m_rfErrs * 100U) / float(m_rfBits), signalText);
|
||||
else
|
||||
::sprintf(text, "BER:%.1f%% %s ", float(m_rfErrs * 100U) / float(m_rfBits), signalText);
|
||||
} else {
|
||||
if (status == LS_LINKED_DEXTRA || status == LS_LINKED_DPLUS || status == LS_LINKED_DCS || status == LS_LINKED_CCS || status == LS_LINKED_LOOPBACK)
|
||||
if ((status == LINK_STATUS::LINKED_DEXTRA) || (status == LINK_STATUS::LINKED_DPLUS) || (status == LINK_STATUS::LINKED_DCS) || (status == LINK_STATUS::LINKED_CCS) || (status == LINK_STATUS::LINKED_LOOPBACK))
|
||||
::sprintf(text, "%-8.8s BER: %.1f%% ", reflector, float(m_rfErrs * 100U) / float(m_rfBits));
|
||||
else
|
||||
::sprintf(text, "BER: %.1f%% ", float(m_rfErrs * 100U) / float(m_rfBits));
|
||||
|
|
@ -1189,7 +1278,7 @@ void CDStarControl::sendError()
|
|||
|
||||
m_rfSlowData.setText(text);
|
||||
|
||||
::memcpy(data, DSTAR_NULL_FRAME_DATA_BYTES, DSTAR_FRAME_LENGTH_BYTES + 1U);
|
||||
::memcpy(data, DSTAR_nullptr_FRAME_DATA_BYTES, DSTAR_FRAME_LENGTH_BYTES + 1U);
|
||||
|
||||
for (unsigned int i = 0U; i < 19U; i++) {
|
||||
m_rfSlowData.getSlowData(data + 1U + DSTAR_VOICE_FRAME_LENGTH_BYTES);
|
||||
|
|
@ -1201,7 +1290,7 @@ void CDStarControl::sendError()
|
|||
|
||||
bool CDStarControl::isBusy() const
|
||||
{
|
||||
return m_rfState != RS_RF_LISTENING || m_netState != RS_NET_IDLE;
|
||||
return (m_rfState != RPT_RF_STATE::LISTENING) || (m_netState != RPT_NET_STATE::IDLE);
|
||||
}
|
||||
|
||||
void CDStarControl::enable(bool enabled)
|
||||
|
|
@ -1210,12 +1299,12 @@ void CDStarControl::enable(bool enabled)
|
|||
m_queue.clear();
|
||||
|
||||
// Reset the RF section
|
||||
m_rfState = RS_RF_LISTENING;
|
||||
m_rfState = RPT_RF_STATE::LISTENING;
|
||||
|
||||
m_rfTimeoutTimer.stop();
|
||||
|
||||
// Reset the networking section
|
||||
m_netState = RS_NET_IDLE;
|
||||
m_netState = RPT_NET_STATE::IDLE;
|
||||
|
||||
m_lastFrameValid = false;
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
82
Defines.h
82
Defines.h
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (C) 2015,2016,2017,2018,2020,2021,2023 by Jonathan Naylor G4KLX
|
||||
* Copyright (C) 2015,2016,2017,2018,2020,2021,2023,2025 by Jonathan Naylor G4KLX
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
|
|
@ -54,56 +54,56 @@ const unsigned char TAG_RSSI = 0x04U;
|
|||
|
||||
const unsigned int DSTAR_MODEM_DATA_LEN = 220U;
|
||||
|
||||
enum HW_TYPE {
|
||||
HWT_MMDVM,
|
||||
HWT_DVMEGA,
|
||||
HWT_MMDVM_ZUMSPOT,
|
||||
HWT_MMDVM_HS_HAT,
|
||||
HWT_MMDVM_HS_DUAL_HAT,
|
||||
HWT_NANO_HOTSPOT,
|
||||
HWT_NANO_DV,
|
||||
HWT_D2RG_MMDVM_HS,
|
||||
HWT_MMDVM_HS,
|
||||
HWT_OPENGD77_HS,
|
||||
HWT_SKYBRIDGE,
|
||||
HWT_UNKNOWN
|
||||
enum class HW_TYPE {
|
||||
MMDVM,
|
||||
DVMEGA,
|
||||
MMDVM_ZUMSPOT,
|
||||
MMDVM_HS_HAT,
|
||||
MMDVM_HS_DUAL_HAT,
|
||||
NANO_HOTSPOT,
|
||||
NANO_DV,
|
||||
D2RG_MMDVM_HS,
|
||||
MMDVM_HS,
|
||||
OPENGD77_HS,
|
||||
SKYBRIDGE,
|
||||
UNKNOWN
|
||||
};
|
||||
|
||||
enum RPT_RF_STATE {
|
||||
RS_RF_LISTENING,
|
||||
RS_RF_LATE_ENTRY,
|
||||
RS_RF_AUDIO,
|
||||
RS_RF_DATA_AUDIO,
|
||||
RS_RF_DATA,
|
||||
RS_RF_REJECTED,
|
||||
RS_RF_INVALID
|
||||
enum class RPT_RF_STATE {
|
||||
LISTENING,
|
||||
LATE_ENTRY,
|
||||
AUDIO,
|
||||
DATA_AUDIO,
|
||||
DATA,
|
||||
REJECTED,
|
||||
INVALID
|
||||
};
|
||||
|
||||
enum RPT_NET_STATE {
|
||||
RS_NET_IDLE,
|
||||
RS_NET_AUDIO,
|
||||
RS_NET_DATA_AUDIO,
|
||||
RS_NET_DATA
|
||||
enum class RPT_NET_STATE {
|
||||
IDLE,
|
||||
AUDIO,
|
||||
DATA_AUDIO,
|
||||
DATA
|
||||
};
|
||||
|
||||
enum DMR_BEACONS {
|
||||
DMR_BEACONS_OFF,
|
||||
DMR_BEACONS_NETWORK,
|
||||
DMR_BEACONS_TIMED
|
||||
enum class DMR_BEACONS {
|
||||
OFF,
|
||||
NETWORK,
|
||||
TIMED
|
||||
};
|
||||
|
||||
enum DMR_OVCM_TYPES {
|
||||
DMR_OVCM_OFF,
|
||||
DMR_OVCM_RX_ON,
|
||||
DMR_OVCM_TX_ON,
|
||||
DMR_OVCM_ON,
|
||||
DMR_OVCM_FORCE_OFF
|
||||
enum class DMR_OVCM {
|
||||
OFF,
|
||||
RX_ON,
|
||||
TX_ON,
|
||||
ON,
|
||||
FORCE_OFF
|
||||
};
|
||||
|
||||
enum DSTAR_ACK_MESSAGE {
|
||||
DSTAR_ACK_BER,
|
||||
DSTAR_ACK_RSSI,
|
||||
DSTAR_ACK_SMETER
|
||||
enum class DSTAR_ACK {
|
||||
BER,
|
||||
RSSI,
|
||||
SMETER
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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];
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
26
Hamming.cpp
26
Hamming.cpp
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (C) 2015,2016 by Jonathan Naylor G4KLX
|
||||
* Copyright (C) 2015,2016,2025 by Jonathan Naylor G4KLX
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
|
|
@ -24,7 +24,7 @@
|
|||
// Hamming (15,11,3) check a boolean data array
|
||||
bool CHamming::decode15113_1(bool* d)
|
||||
{
|
||||
assert(d != NULL);
|
||||
assert(d != nullptr);
|
||||
|
||||
// Calculate the parity it should have
|
||||
bool c0 = d[0] ^ d[1] ^ d[2] ^ d[3] ^ d[4] ^ d[5] ^ d[6];
|
||||
|
|
@ -66,7 +66,7 @@ bool CHamming::decode15113_1(bool* d)
|
|||
|
||||
void CHamming::encode15113_1(bool* d)
|
||||
{
|
||||
assert(d != NULL);
|
||||
assert(d != nullptr);
|
||||
|
||||
// Calculate the checksum this row should have
|
||||
d[11] = d[0] ^ d[1] ^ d[2] ^ d[3] ^ d[4] ^ d[5] ^ d[6];
|
||||
|
|
@ -78,7 +78,7 @@ void CHamming::encode15113_1(bool* d)
|
|||
// Hamming (15,11,3) check a boolean data array
|
||||
bool CHamming::decode15113_2(bool* d)
|
||||
{
|
||||
assert(d != NULL);
|
||||
assert(d != nullptr);
|
||||
|
||||
// Calculate the checksum this row should have
|
||||
bool c0 = d[0] ^ d[1] ^ d[2] ^ d[3] ^ d[5] ^ d[7] ^ d[8];
|
||||
|
|
@ -119,7 +119,7 @@ bool CHamming::decode15113_2(bool* d)
|
|||
|
||||
void CHamming::encode15113_2(bool* d)
|
||||
{
|
||||
assert(d != NULL);
|
||||
assert(d != nullptr);
|
||||
|
||||
// Calculate the checksum this row should have
|
||||
d[11] = d[0] ^ d[1] ^ d[2] ^ d[3] ^ d[5] ^ d[7] ^ d[8];
|
||||
|
|
@ -131,7 +131,7 @@ void CHamming::encode15113_2(bool* d)
|
|||
// Hamming (13,9,3) check a boolean data array
|
||||
bool CHamming::decode1393(bool* d)
|
||||
{
|
||||
assert(d != NULL);
|
||||
assert(d != nullptr);
|
||||
|
||||
// Calculate the checksum this column should have
|
||||
bool c0 = d[0] ^ d[1] ^ d[3] ^ d[5] ^ d[6];
|
||||
|
|
@ -170,7 +170,7 @@ bool CHamming::decode1393(bool* d)
|
|||
|
||||
void CHamming::encode1393(bool* d)
|
||||
{
|
||||
assert(d != NULL);
|
||||
assert(d != nullptr);
|
||||
|
||||
// Calculate the checksum this column should have
|
||||
d[9] = d[0] ^ d[1] ^ d[3] ^ d[5] ^ d[6];
|
||||
|
|
@ -182,7 +182,7 @@ void CHamming::encode1393(bool* d)
|
|||
// Hamming (10,6,3) check a boolean data array
|
||||
bool CHamming::decode1063(bool* d)
|
||||
{
|
||||
assert(d != NULL);
|
||||
assert(d != nullptr);
|
||||
|
||||
// Calculate the checksum this column should have
|
||||
bool c0 = d[0] ^ d[1] ^ d[2] ^ d[5];
|
||||
|
|
@ -218,7 +218,7 @@ bool CHamming::decode1063(bool* d)
|
|||
|
||||
void CHamming::encode1063(bool* d)
|
||||
{
|
||||
assert(d != NULL);
|
||||
assert(d != nullptr);
|
||||
|
||||
// Calculate the checksum this column should have
|
||||
d[6] = d[0] ^ d[1] ^ d[2] ^ d[5];
|
||||
|
|
@ -230,7 +230,7 @@ void CHamming::encode1063(bool* d)
|
|||
// A Hamming (16,11,4) Check
|
||||
bool CHamming::decode16114(bool* d)
|
||||
{
|
||||
assert(d != NULL);
|
||||
assert(d != nullptr);
|
||||
|
||||
// Calculate the checksum this column should have
|
||||
bool c0 = d[0] ^ d[1] ^ d[2] ^ d[3] ^ d[5] ^ d[7] ^ d[8];
|
||||
|
|
@ -278,7 +278,7 @@ bool CHamming::decode16114(bool* d)
|
|||
|
||||
void CHamming::encode16114(bool* d)
|
||||
{
|
||||
assert(d != NULL);
|
||||
assert(d != nullptr);
|
||||
|
||||
d[11] = d[0] ^ d[1] ^ d[2] ^ d[3] ^ d[5] ^ d[7] ^ d[8];
|
||||
d[12] = d[1] ^ d[2] ^ d[3] ^ d[4] ^ d[6] ^ d[8] ^ d[9];
|
||||
|
|
@ -290,7 +290,7 @@ void CHamming::encode16114(bool* d)
|
|||
// A Hamming (17,12,3) Check
|
||||
bool CHamming::decode17123(bool* d)
|
||||
{
|
||||
assert(d != NULL);
|
||||
assert(d != nullptr);
|
||||
|
||||
// Calculate the checksum this column should have
|
||||
bool c0 = d[0] ^ d[1] ^ d[2] ^ d[3] ^ d[6] ^ d[7] ^ d[9];
|
||||
|
|
@ -339,7 +339,7 @@ bool CHamming::decode17123(bool* d)
|
|||
|
||||
void CHamming::encode17123(bool* d)
|
||||
{
|
||||
assert(d != NULL);
|
||||
assert(d != nullptr);
|
||||
|
||||
d[12] = d[0] ^ d[1] ^ d[2] ^ d[3] ^ d[6] ^ d[7] ^ d[9];
|
||||
d[13] = d[0] ^ d[1] ^ d[2] ^ d[3] ^ d[4] ^ d[7] ^ d[8] ^ d[10];
|
||||
|
|
|
|||
8
Log.cpp
8
Log.cpp
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (C) 2015,2016,2020,2022,2023 by Jonathan Naylor G4KLX
|
||||
* Copyright (C) 2015,2016,2020,2022,2023,2025 by Jonathan Naylor G4KLX
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
|
|
@ -58,7 +58,7 @@ void LogFinalise()
|
|||
|
||||
void Log(unsigned int level, const char* fmt, ...)
|
||||
{
|
||||
assert(fmt != NULL);
|
||||
assert(fmt != nullptr);
|
||||
|
||||
char buffer[501U];
|
||||
#if defined(_WIN32) || defined(_WIN64)
|
||||
|
|
@ -68,7 +68,7 @@ void Log(unsigned int level, const char* fmt, ...)
|
|||
::sprintf(buffer, "%c: %04u-%02u-%02u %02u:%02u:%02u.%03u ", LEVELS[level], st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond, st.wMilliseconds);
|
||||
#else
|
||||
struct timeval now;
|
||||
::gettimeofday(&now, NULL);
|
||||
::gettimeofday(&now, nullptr);
|
||||
|
||||
struct tm* tm = ::gmtime(&now.tv_sec);
|
||||
|
||||
|
|
@ -78,7 +78,7 @@ void Log(unsigned int level, const char* fmt, ...)
|
|||
va_list vl;
|
||||
va_start(vl, fmt);
|
||||
|
||||
::vsnprintf(buffer + ::strlen(buffer), 500, fmt, vl);
|
||||
::vsnprintf(buffer + ::strlen(buffer), 500 - ::strlen(buffer), fmt, vl);
|
||||
|
||||
va_end(vl);
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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];
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
22
M17LSF.cpp
22
M17LSF.cpp
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (C) 2020,2021,2023 by Jonathan Naylor G4KLX
|
||||
* Copyright (C) 2020,2021,2023,2025 by Jonathan Naylor G4KLX
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
|
|
@ -27,7 +27,7 @@
|
|||
#include <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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
14
M17Utils.cpp
14
M17Utils.cpp
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (C) 2020,2021,2023,2024 by Jonathan Naylor G4KLX
|
||||
* Copyright (C) 2020,2021,2023,2024,2025 by Jonathan Naylor G4KLX
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
|
|
@ -33,7 +33,7 @@ const unsigned char BIT_MASK_TABLE[] = { 0x80U, 0x40U, 0x20U, 0x10U, 0x08U, 0x04
|
|||
|
||||
void CM17Utils::encodeCallsign(const std::string& callsign, unsigned char* encoded)
|
||||
{
|
||||
assert(encoded != NULL);
|
||||
assert(encoded != nullptr);
|
||||
|
||||
if (callsign == "ALL" || callsign == "ALL ") {
|
||||
encoded[0U] = 0xFFU;
|
||||
|
|
@ -73,7 +73,7 @@ void CM17Utils::encodeCallsign(const std::string& callsign, unsigned char* encod
|
|||
|
||||
void CM17Utils::decodeCallsign(const unsigned char* encoded, std::string& callsign)
|
||||
{
|
||||
assert(encoded != NULL);
|
||||
assert(encoded != nullptr);
|
||||
|
||||
callsign.clear();
|
||||
|
||||
|
|
@ -107,7 +107,7 @@ void CM17Utils::decodeCallsign(const unsigned char* encoded, std::string& callsi
|
|||
|
||||
void CM17Utils::splitFragmentLICH(const unsigned char* data, unsigned int& frag1, unsigned int& frag2, unsigned int& frag3, unsigned int& frag4)
|
||||
{
|
||||
assert(data != NULL);
|
||||
assert(data != nullptr);
|
||||
|
||||
frag1 = frag2 = frag3 = frag4 = 0x00U;
|
||||
|
||||
|
|
@ -143,7 +143,7 @@ void CM17Utils::splitFragmentLICH(const unsigned char* data, unsigned int& frag1
|
|||
|
||||
void CM17Utils::splitFragmentLICHFEC(const unsigned char* data, unsigned int& frag1, unsigned int& frag2, unsigned int& frag3, unsigned int& frag4)
|
||||
{
|
||||
assert(data != NULL);
|
||||
assert(data != nullptr);
|
||||
|
||||
frag1 = frag2 = frag3 = frag4 = 0x00U;
|
||||
|
||||
|
|
@ -179,7 +179,7 @@ void CM17Utils::splitFragmentLICHFEC(const unsigned char* data, unsigned int& fr
|
|||
|
||||
void CM17Utils::combineFragmentLICH(unsigned int frag1, unsigned int frag2, unsigned int frag3, unsigned int frag4, unsigned char* data)
|
||||
{
|
||||
assert(data != NULL);
|
||||
assert(data != nullptr);
|
||||
|
||||
unsigned int offset = 0U;
|
||||
unsigned int MASK = 0x800U;
|
||||
|
|
@ -209,7 +209,7 @@ void CM17Utils::combineFragmentLICH(unsigned int frag1, unsigned int frag2, unsi
|
|||
|
||||
void CM17Utils::combineFragmentLICHFEC(unsigned int frag1, unsigned int frag2, unsigned int frag3, unsigned int frag4, unsigned char* data)
|
||||
{
|
||||
assert(data != NULL);
|
||||
assert(data != nullptr);
|
||||
|
||||
unsigned int offset = 0U;
|
||||
unsigned int MASK = 0x800000U;
|
||||
|
|
|
|||
146
MMDVMHost.cpp
146
MMDVMHost.cpp
|
|
@ -324,7 +324,7 @@ int CMMDVMHost::run()
|
|||
// If we are currently root...
|
||||
if (getuid() == 0) {
|
||||
struct passwd* user = ::getpwnam("mmdvm");
|
||||
if (user == NULL) {
|
||||
if (user == nullptr) {
|
||||
::fprintf(stderr, "Could not get the mmdvm user, exiting\n");
|
||||
return -1;
|
||||
}
|
||||
|
|
@ -539,7 +539,7 @@ int CMMDVMHost::run()
|
|||
|
||||
sockaddr_storage transparentAddress;
|
||||
unsigned int transparentAddrLen;
|
||||
CUDPSocket* transparentSocket = NULL;
|
||||
CUDPSocket* transparentSocket = nullptr;
|
||||
|
||||
unsigned int sendFrameType = 0U;
|
||||
if (m_conf.getTransparentEnabled()) {
|
||||
|
|
@ -564,7 +564,7 @@ int CMMDVMHost::run()
|
|||
if (!ret) {
|
||||
LogWarning("Could not open the Transparent data socket, disabling");
|
||||
delete transparentSocket;
|
||||
transparentSocket = NULL;
|
||||
transparentSocket = nullptr;
|
||||
sendFrameType=0;
|
||||
}
|
||||
m_modem->setTransparentDataParams(sendFrameType);
|
||||
|
|
@ -634,7 +634,7 @@ int CMMDVMHost::run()
|
|||
std::vector<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
286
Modem.cpp
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (C) 2011-2018,2020,2021,2023 by Jonathan Naylor G4KLX
|
||||
* Copyright (C) 2011-2018,2020,2021,2023,2025 by Jonathan Naylor G4KLX
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
|
|
@ -234,11 +234,11 @@ m_ax25Enabled(false),
|
|||
#endif
|
||||
m_rxDCOffset(0),
|
||||
m_txDCOffset(0),
|
||||
m_port(NULL),
|
||||
m_buffer(NULL),
|
||||
m_port(nullptr),
|
||||
m_buffer(nullptr),
|
||||
m_length(0U),
|
||||
m_offset(0U),
|
||||
m_state(SS_START),
|
||||
m_state(SERIAL_STATE::START),
|
||||
m_type(0U),
|
||||
#if defined(USE_DSTAR)
|
||||
m_rxDStarData(1000U, "Modem RX D-Star"),
|
||||
|
|
@ -376,7 +376,7 @@ CModem::~CModem()
|
|||
|
||||
void CModem::setPort(IModemPort* port)
|
||||
{
|
||||
assert(port != NULL);
|
||||
assert(port != nullptr);
|
||||
|
||||
m_port = port;
|
||||
}
|
||||
|
|
@ -522,7 +522,7 @@ bool CModem::open()
|
|||
if (!ret) {
|
||||
m_port->close();
|
||||
delete m_port;
|
||||
m_port = NULL;
|
||||
m_port = nullptr;
|
||||
return false;
|
||||
} else {
|
||||
/* Stopping the inactivity timer here when a firmware version has been
|
||||
|
|
@ -534,7 +534,7 @@ bool CModem::open()
|
|||
if (!ret) {
|
||||
m_port->close();
|
||||
delete m_port;
|
||||
m_port = NULL;
|
||||
m_port = nullptr;
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
@ -542,7 +542,7 @@ bool CModem::open()
|
|||
if (!ret) {
|
||||
m_port->close();
|
||||
delete m_port;
|
||||
m_port = NULL;
|
||||
m_port = nullptr;
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
@ -552,7 +552,7 @@ bool CModem::open()
|
|||
if (!ret) {
|
||||
m_port->close();
|
||||
delete m_port;
|
||||
m_port = NULL;
|
||||
m_port = nullptr;
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
@ -560,7 +560,7 @@ bool CModem::open()
|
|||
if (!ret) {
|
||||
m_port->close();
|
||||
delete m_port;
|
||||
m_port = NULL;
|
||||
m_port = nullptr;
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
@ -568,7 +568,7 @@ bool CModem::open()
|
|||
if (!ret) {
|
||||
m_port->close();
|
||||
delete m_port;
|
||||
m_port = NULL;
|
||||
m_port = nullptr;
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
@ -577,7 +577,7 @@ bool CModem::open()
|
|||
if (!ret) {
|
||||
m_port->close();
|
||||
delete m_port;
|
||||
m_port = NULL;
|
||||
m_port = nullptr;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
|
@ -594,7 +594,7 @@ bool CModem::open()
|
|||
|
||||
void CModem::clock(unsigned int ms)
|
||||
{
|
||||
assert(m_port != NULL);
|
||||
assert(m_port != nullptr);
|
||||
|
||||
// Poll the modem status every 250ms
|
||||
m_statusTimer.clock(ms);
|
||||
|
|
@ -616,12 +616,12 @@ void CModem::clock(unsigned int ms)
|
|||
|
||||
RESP_TYPE_MMDVM type = getResponse();
|
||||
|
||||
if (type == RTM_TIMEOUT) {
|
||||
if (type == RESP_TYPE_MMDVM::TIMEOUT) {
|
||||
// Nothing to do
|
||||
} else if (type == RTM_ERROR) {
|
||||
} else if (type == RESP_TYPE_MMDVM::ERR) {
|
||||
// Nothing to do
|
||||
} else {
|
||||
// type == RTM_OK
|
||||
// type == OK
|
||||
switch (m_type) {
|
||||
#if defined(USE_DSTAR)
|
||||
case MMDVM_DSTAR_HEADER: {
|
||||
|
|
@ -1445,7 +1445,7 @@ void CModem::clock(unsigned int ms)
|
|||
|
||||
void CModem::close()
|
||||
{
|
||||
assert(m_port != NULL);
|
||||
assert(m_port != nullptr);
|
||||
|
||||
::LogMessage("Closing the MMDVM");
|
||||
|
||||
|
|
@ -1455,7 +1455,7 @@ void CModem::close()
|
|||
#if defined(USE_DSTAR)
|
||||
unsigned int CModem::readDStarData(unsigned char* data)
|
||||
{
|
||||
assert(data != NULL);
|
||||
assert(data != nullptr);
|
||||
|
||||
if (m_rxDStarData.isEmpty())
|
||||
return 0U;
|
||||
|
|
@ -1471,7 +1471,7 @@ unsigned int CModem::readDStarData(unsigned char* data)
|
|||
#if defined(USE_DMR)
|
||||
unsigned int CModem::readDMRData1(unsigned char* data)
|
||||
{
|
||||
assert(data != NULL);
|
||||
assert(data != nullptr);
|
||||
|
||||
if (m_rxDMRData1.isEmpty())
|
||||
return 0U;
|
||||
|
|
@ -1485,7 +1485,7 @@ unsigned int CModem::readDMRData1(unsigned char* data)
|
|||
|
||||
unsigned int CModem::readDMRData2(unsigned char* data)
|
||||
{
|
||||
assert(data != NULL);
|
||||
assert(data != nullptr);
|
||||
|
||||
if (m_rxDMRData2.isEmpty())
|
||||
return 0U;
|
||||
|
|
@ -1501,7 +1501,7 @@ unsigned int CModem::readDMRData2(unsigned char* data)
|
|||
#if defined(USE_YSF)
|
||||
unsigned int CModem::readYSFData(unsigned char* data)
|
||||
{
|
||||
assert(data != NULL);
|
||||
assert(data != nullptr);
|
||||
|
||||
if (m_rxYSFData.isEmpty())
|
||||
return 0U;
|
||||
|
|
@ -1517,7 +1517,7 @@ unsigned int CModem::readYSFData(unsigned char* data)
|
|||
#if defined(USE_P25)
|
||||
unsigned int CModem::readP25Data(unsigned char* data)
|
||||
{
|
||||
assert(data != NULL);
|
||||
assert(data != nullptr);
|
||||
|
||||
if (m_rxP25Data.isEmpty())
|
||||
return 0U;
|
||||
|
|
@ -1533,7 +1533,7 @@ unsigned int CModem::readP25Data(unsigned char* data)
|
|||
#if defined(USE_NXDN)
|
||||
unsigned int CModem::readNXDNData(unsigned char* data)
|
||||
{
|
||||
assert(data != NULL);
|
||||
assert(data != nullptr);
|
||||
|
||||
if (m_rxNXDNData.isEmpty())
|
||||
return 0U;
|
||||
|
|
@ -1549,7 +1549,7 @@ unsigned int CModem::readNXDNData(unsigned char* data)
|
|||
#if defined(USE_M17)
|
||||
unsigned int CModem::readM17Data(unsigned char* data)
|
||||
{
|
||||
assert(data != NULL);
|
||||
assert(data != nullptr);
|
||||
|
||||
if (m_rxM17Data.isEmpty())
|
||||
return 0U;
|
||||
|
|
@ -1565,7 +1565,7 @@ unsigned int CModem::readM17Data(unsigned char* data)
|
|||
#if defined(USE_FM)
|
||||
unsigned int CModem::readFMData(unsigned char* data)
|
||||
{
|
||||
assert(data != NULL);
|
||||
assert(data != nullptr);
|
||||
|
||||
if (m_rxFMData.isEmpty())
|
||||
return 0U;
|
||||
|
|
@ -1581,7 +1581,7 @@ unsigned int CModem::readFMData(unsigned char* data)
|
|||
#if defined(USE_AX25)
|
||||
unsigned int CModem::readAX25Data(unsigned char* data)
|
||||
{
|
||||
assert(data != NULL);
|
||||
assert(data != nullptr);
|
||||
|
||||
if (m_rxAX25Data.isEmpty())
|
||||
return 0U;
|
||||
|
|
@ -1596,7 +1596,7 @@ unsigned int CModem::readAX25Data(unsigned char* data)
|
|||
|
||||
unsigned int CModem::readTransparentData(unsigned char* data)
|
||||
{
|
||||
assert(data != NULL);
|
||||
assert(data != nullptr);
|
||||
|
||||
if (m_rxTransparentData.isEmpty())
|
||||
return 0U;
|
||||
|
|
@ -1632,7 +1632,7 @@ bool CModem::hasDStarSpace() const
|
|||
|
||||
bool CModem::writeDStarData(const unsigned char* data, unsigned int length)
|
||||
{
|
||||
assert(data != NULL);
|
||||
assert(data != nullptr);
|
||||
assert(length > 0U);
|
||||
|
||||
unsigned char buffer[50U];
|
||||
|
|
@ -1682,7 +1682,7 @@ bool CModem::hasDMRSpace2() const
|
|||
|
||||
bool CModem::writeDMRData1(const unsigned char* data, unsigned int length)
|
||||
{
|
||||
assert(data != NULL);
|
||||
assert(data != nullptr);
|
||||
assert(length > 0U);
|
||||
|
||||
if (data[0U] != TAG_DATA && data[0U] != TAG_EOT)
|
||||
|
|
@ -1705,7 +1705,7 @@ bool CModem::writeDMRData1(const unsigned char* data, unsigned int length)
|
|||
|
||||
bool CModem::writeDMRData2(const unsigned char* data, unsigned int length)
|
||||
{
|
||||
assert(data != NULL);
|
||||
assert(data != nullptr);
|
||||
assert(length > 0U);
|
||||
|
||||
if (data[0U] != TAG_DATA && data[0U] != TAG_EOT)
|
||||
|
|
@ -1737,7 +1737,7 @@ bool CModem::hasYSFSpace() const
|
|||
|
||||
bool CModem::writeYSFData(const unsigned char* data, unsigned int length)
|
||||
{
|
||||
assert(data != NULL);
|
||||
assert(data != nullptr);
|
||||
assert(length > 0U);
|
||||
|
||||
if (data[0U] != TAG_DATA && data[0U] != TAG_EOT)
|
||||
|
|
@ -1769,7 +1769,7 @@ bool CModem::hasP25Space() const
|
|||
|
||||
bool CModem::writeP25Data(const unsigned char* data, unsigned int length)
|
||||
{
|
||||
assert(data != NULL);
|
||||
assert(data != nullptr);
|
||||
assert(length > 0U);
|
||||
|
||||
if (data[0U] != TAG_HEADER && data[0U] != TAG_DATA && data[0U] != TAG_EOT)
|
||||
|
|
@ -1801,7 +1801,7 @@ bool CModem::hasNXDNSpace() const
|
|||
|
||||
bool CModem::writeNXDNData(const unsigned char* data, unsigned int length)
|
||||
{
|
||||
assert(data != NULL);
|
||||
assert(data != nullptr);
|
||||
assert(length > 0U);
|
||||
|
||||
if (data[0U] != TAG_DATA && data[0U] != TAG_EOT)
|
||||
|
|
@ -1833,7 +1833,7 @@ bool CModem::hasM17Space() const
|
|||
|
||||
bool CModem::writeM17Data(const unsigned char* data, unsigned int length)
|
||||
{
|
||||
assert(data != NULL);
|
||||
assert(data != nullptr);
|
||||
assert(length > 0U);
|
||||
|
||||
unsigned char buffer[130U];
|
||||
|
|
@ -1876,7 +1876,7 @@ bool CModem::hasPOCSAGSpace() const
|
|||
|
||||
bool CModem::writePOCSAGData(const unsigned char* data, unsigned int length)
|
||||
{
|
||||
assert(data != NULL);
|
||||
assert(data != nullptr);
|
||||
assert(length > 0U);
|
||||
|
||||
unsigned char buffer[130U];
|
||||
|
|
@ -1903,7 +1903,7 @@ unsigned int CModem::getFMSpace() const
|
|||
|
||||
bool CModem::writeFMData(const unsigned char* data, unsigned int length)
|
||||
{
|
||||
assert(data != NULL);
|
||||
assert(data != nullptr);
|
||||
assert(length > 0U);
|
||||
|
||||
unsigned char buffer[500U];
|
||||
|
|
@ -1941,7 +1941,7 @@ bool CModem::hasAX25Space() const
|
|||
|
||||
bool CModem::writeAX25Data(const unsigned char* data, unsigned int length)
|
||||
{
|
||||
assert(data != NULL);
|
||||
assert(data != nullptr);
|
||||
assert(length > 0U);
|
||||
|
||||
unsigned char buffer[500U];
|
||||
|
|
@ -1971,7 +1971,7 @@ bool CModem::writeAX25Data(const unsigned char* data, unsigned int length)
|
|||
|
||||
bool CModem::writeTransparentData(const unsigned char* data, unsigned int length)
|
||||
{
|
||||
assert(data != NULL);
|
||||
assert(data != nullptr);
|
||||
assert(length > 0U);
|
||||
|
||||
unsigned char buffer[250U];
|
||||
|
|
@ -2006,12 +2006,12 @@ bool CModem::writeTransparentData(const unsigned char* data, unsigned int length
|
|||
#if defined(USE_DSTAR)
|
||||
bool CModem::writeDStarInfo(const char* my1, const char* my2, const char* your, const char* type, const char* reflector)
|
||||
{
|
||||
assert(m_port != NULL);
|
||||
assert(my1 != NULL);
|
||||
assert(my2 != NULL);
|
||||
assert(your != NULL);
|
||||
assert(type != NULL);
|
||||
assert(reflector != NULL);
|
||||
assert(m_port != nullptr);
|
||||
assert(my1 != nullptr);
|
||||
assert(my2 != nullptr);
|
||||
assert(your != nullptr);
|
||||
assert(type != nullptr);
|
||||
assert(reflector != nullptr);
|
||||
|
||||
unsigned char buffer[50U];
|
||||
|
||||
|
|
@ -2037,8 +2037,8 @@ bool CModem::writeDStarInfo(const char* my1, const char* my2, const char* your,
|
|||
#if defined(USE_DMR)
|
||||
bool CModem::writeDMRInfo(unsigned int slotNo, const std::string& src, bool group, const std::string& dest, const char* type)
|
||||
{
|
||||
assert(m_port != NULL);
|
||||
assert(type != NULL);
|
||||
assert(m_port != nullptr);
|
||||
assert(type != nullptr);
|
||||
|
||||
unsigned char buffer[50U];
|
||||
|
||||
|
|
@ -2065,11 +2065,11 @@ bool CModem::writeDMRInfo(unsigned int slotNo, const std::string& src, bool grou
|
|||
#if defined(USE_YSF)
|
||||
bool CModem::writeYSFInfo(const char* source, const char* dest, unsigned char dgid, const char* type, const char* origin)
|
||||
{
|
||||
assert(m_port != NULL);
|
||||
assert(source != NULL);
|
||||
assert(dest != NULL);
|
||||
assert(type != NULL);
|
||||
assert(origin != NULL);
|
||||
assert(m_port != nullptr);
|
||||
assert(source != nullptr);
|
||||
assert(dest != nullptr);
|
||||
assert(type != nullptr);
|
||||
assert(origin != nullptr);
|
||||
|
||||
unsigned char buffer[40U];
|
||||
|
||||
|
|
@ -2095,9 +2095,9 @@ bool CModem::writeYSFInfo(const char* source, const char* dest, unsigned char dg
|
|||
#if defined(USE_P25)
|
||||
bool CModem::writeP25Info(const char* source, bool group, unsigned int dest, const char* type)
|
||||
{
|
||||
assert(m_port != NULL);
|
||||
assert(source != NULL);
|
||||
assert(type != NULL);
|
||||
assert(m_port != nullptr);
|
||||
assert(source != nullptr);
|
||||
assert(type != nullptr);
|
||||
|
||||
unsigned char buffer[40U];
|
||||
|
||||
|
|
@ -2122,9 +2122,9 @@ bool CModem::writeP25Info(const char* source, bool group, unsigned int dest, con
|
|||
#if defined(USE_NXDN)
|
||||
bool CModem::writeNXDNInfo(const char* source, bool group, unsigned int dest, const char* type)
|
||||
{
|
||||
assert(m_port != NULL);
|
||||
assert(source != NULL);
|
||||
assert(type != NULL);
|
||||
assert(m_port != nullptr);
|
||||
assert(source != nullptr);
|
||||
assert(type != nullptr);
|
||||
|
||||
unsigned char buffer[40U];
|
||||
|
||||
|
|
@ -2149,10 +2149,10 @@ bool CModem::writeNXDNInfo(const char* source, bool group, unsigned int dest, co
|
|||
#if defined(USE_M17)
|
||||
bool CModem::writeM17Info(const char* source, const char* dest, const char* type)
|
||||
{
|
||||
assert(m_port != NULL);
|
||||
assert(source != NULL);
|
||||
assert(dest != NULL);
|
||||
assert(type != NULL);
|
||||
assert(m_port != nullptr);
|
||||
assert(source != nullptr);
|
||||
assert(dest != nullptr);
|
||||
assert(type != nullptr);
|
||||
|
||||
unsigned char buffer[40U];
|
||||
|
||||
|
|
@ -2175,7 +2175,7 @@ bool CModem::writeM17Info(const char* source, const char* dest, const char* type
|
|||
#if defined(USE_POCSAG)
|
||||
bool CModem::writePOCSAGInfo(unsigned int ric, const std::string& message)
|
||||
{
|
||||
assert(m_port != NULL);
|
||||
assert(m_port != nullptr);
|
||||
|
||||
size_t length = message.size();
|
||||
|
||||
|
|
@ -2199,7 +2199,7 @@ bool CModem::writePOCSAGInfo(unsigned int ric, const std::string& message)
|
|||
|
||||
bool CModem::writeIPInfo(const std::string& address)
|
||||
{
|
||||
assert(m_port != NULL);
|
||||
assert(m_port != nullptr);
|
||||
|
||||
size_t length = address.size();
|
||||
|
||||
|
|
@ -2220,8 +2220,8 @@ bool CModem::writeIPInfo(const std::string& address)
|
|||
|
||||
bool CModem::writeSerialData(const unsigned char* data, unsigned int length)
|
||||
{
|
||||
assert(m_port != NULL);
|
||||
assert(data != NULL);
|
||||
assert(m_port != nullptr);
|
||||
assert(data != nullptr);
|
||||
assert(length > 0U);
|
||||
|
||||
unsigned char buffer[255U];
|
||||
|
|
@ -2311,7 +2311,7 @@ unsigned int CModem::getVersion() const
|
|||
|
||||
bool CModem::readVersion()
|
||||
{
|
||||
assert(m_port != NULL);
|
||||
assert(m_port != nullptr);
|
||||
|
||||
CThread::sleep(2000U); // 2s
|
||||
|
||||
|
|
@ -2335,31 +2335,31 @@ bool CModem::readVersion()
|
|||
for (unsigned int count = 0U; count < MAX_RESPONSES; count++) {
|
||||
CThread::sleep(10U);
|
||||
RESP_TYPE_MMDVM resp = getResponse();
|
||||
if (resp == RTM_OK && m_buffer[2U] == MMDVM_GET_VERSION) {
|
||||
if ((resp == RESP_TYPE_MMDVM::OK) && (m_buffer[2U] == MMDVM_GET_VERSION)) {
|
||||
if (::memcmp(m_buffer + 4U, "MMDVM ", 6U) == 0)
|
||||
m_hwType = HWT_MMDVM;
|
||||
m_hwType = HW_TYPE::MMDVM;
|
||||
else if (::memcmp(m_buffer + 23U, "MMDVM ", 6U) == 0)
|
||||
m_hwType = HWT_MMDVM;
|
||||
m_hwType = HW_TYPE::MMDVM;
|
||||
else if (::memcmp(m_buffer + 4U, "DVMEGA", 6U) == 0)
|
||||
m_hwType = HWT_DVMEGA;
|
||||
m_hwType = HW_TYPE::DVMEGA;
|
||||
else if (::memcmp(m_buffer + 4U, "ZUMspot", 7U) == 0)
|
||||
m_hwType = HWT_MMDVM_ZUMSPOT;
|
||||
m_hwType = HW_TYPE::MMDVM_ZUMSPOT;
|
||||
else if (::memcmp(m_buffer + 4U, "MMDVM_HS_Hat", 12U) == 0)
|
||||
m_hwType = HWT_MMDVM_HS_HAT;
|
||||
m_hwType = HW_TYPE::MMDVM_HS_HAT;
|
||||
else if (::memcmp(m_buffer + 4U, "MMDVM_HS_Dual_Hat", 17U) == 0)
|
||||
m_hwType = HWT_MMDVM_HS_DUAL_HAT;
|
||||
m_hwType = HW_TYPE::MMDVM_HS_DUAL_HAT;
|
||||
else if (::memcmp(m_buffer + 4U, "Nano_hotSPOT", 12U) == 0)
|
||||
m_hwType = HWT_NANO_HOTSPOT;
|
||||
m_hwType = HW_TYPE::NANO_HOTSPOT;
|
||||
else if (::memcmp(m_buffer + 4U, "Nano_DV", 7U) == 0)
|
||||
m_hwType = HWT_NANO_DV;
|
||||
m_hwType = HW_TYPE::NANO_DV;
|
||||
else if (::memcmp(m_buffer + 4U, "D2RG_MMDVM_HS", 13U) == 0)
|
||||
m_hwType = HWT_D2RG_MMDVM_HS;
|
||||
m_hwType = HW_TYPE::D2RG_MMDVM_HS;
|
||||
else if (::memcmp(m_buffer + 4U, "MMDVM_HS-", 9U) == 0)
|
||||
m_hwType = HWT_MMDVM_HS;
|
||||
m_hwType = HW_TYPE::MMDVM_HS;
|
||||
else if (::memcmp(m_buffer + 4U, "OpenGD77_HS", 11U) == 0)
|
||||
m_hwType = HWT_OPENGD77_HS;
|
||||
m_hwType = HW_TYPE::OPENGD77_HS;
|
||||
else if (::memcmp(m_buffer + 4U, "SkyBridge", 9U) == 0)
|
||||
m_hwType = HWT_SKYBRIDGE;
|
||||
m_hwType = HW_TYPE::SKYBRIDGE;
|
||||
|
||||
m_protocolVersion = m_buffer[3U];
|
||||
|
||||
|
|
@ -2433,7 +2433,7 @@ bool CModem::readVersion()
|
|||
|
||||
bool CModem::readStatus()
|
||||
{
|
||||
assert(m_port != NULL);
|
||||
assert(m_port != nullptr);
|
||||
|
||||
unsigned char buffer[3U];
|
||||
|
||||
|
|
@ -2460,7 +2460,7 @@ bool CModem::writeConfig()
|
|||
|
||||
bool CModem::setConfig1()
|
||||
{
|
||||
assert(m_port != NULL);
|
||||
assert(m_port != nullptr);
|
||||
|
||||
unsigned char buffer[30U];
|
||||
|
||||
|
|
@ -2610,18 +2610,18 @@ bool CModem::setConfig1()
|
|||
CThread::sleep(10U);
|
||||
|
||||
resp = getResponse();
|
||||
if (resp == RTM_OK && m_buffer[2U] != MMDVM_ACK && m_buffer[2U] != MMDVM_NAK) {
|
||||
if ((resp == RESP_TYPE_MMDVM::OK) && (m_buffer[2U] != MMDVM_ACK) && (m_buffer[2U] != MMDVM_NAK)) {
|
||||
count++;
|
||||
if (count >= MAX_RESPONSES) {
|
||||
LogError("The MMDVM is not responding to the SET_CONFIG command");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
} while (resp == RTM_OK && m_buffer[2U] != MMDVM_ACK && m_buffer[2U] != MMDVM_NAK);
|
||||
} while ((resp == RESP_TYPE_MMDVM::OK) && (m_buffer[2U] != MMDVM_ACK) && (m_buffer[2U] != MMDVM_NAK));
|
||||
|
||||
// CUtils::dump(1U, "Response", m_buffer, m_length);
|
||||
|
||||
if (resp == RTM_OK && m_buffer[2U] == MMDVM_NAK) {
|
||||
if ((resp == RESP_TYPE_MMDVM::OK) && (m_buffer[2U] == MMDVM_NAK)) {
|
||||
LogError("Received a NAK to the SET_CONFIG command from the modem");
|
||||
return false;
|
||||
}
|
||||
|
|
@ -2633,7 +2633,7 @@ bool CModem::setConfig1()
|
|||
|
||||
bool CModem::setConfig2()
|
||||
{
|
||||
assert(m_port != NULL);
|
||||
assert(m_port != nullptr);
|
||||
|
||||
unsigned char buffer[50U];
|
||||
|
||||
|
|
@ -2822,18 +2822,18 @@ bool CModem::setConfig2()
|
|||
CThread::sleep(10U);
|
||||
|
||||
resp = getResponse();
|
||||
if (resp == RTM_OK && m_buffer[2U] != MMDVM_ACK && m_buffer[2U] != MMDVM_NAK) {
|
||||
if ((resp == RESP_TYPE_MMDVM::OK) && (m_buffer[2U] != MMDVM_ACK) && (m_buffer[2U] != MMDVM_NAK)) {
|
||||
count++;
|
||||
if (count >= MAX_RESPONSES) {
|
||||
LogError("The MMDVM is not responding to the SET_CONFIG command");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
} while (resp == RTM_OK && m_buffer[2U] != MMDVM_ACK && m_buffer[2U] != MMDVM_NAK);
|
||||
} while ((resp == RESP_TYPE_MMDVM::OK) && (m_buffer[2U] != MMDVM_ACK) && (m_buffer[2U] != MMDVM_NAK));
|
||||
|
||||
// CUtils::dump(1U, "Response", m_buffer, m_length);
|
||||
|
||||
if (resp == RTM_OK && m_buffer[2U] == MMDVM_NAK) {
|
||||
if ((resp == RESP_TYPE_MMDVM::OK) && (m_buffer[2U] == MMDVM_NAK)) {
|
||||
LogError("Received a NAK to the SET_CONFIG command from the modem");
|
||||
return false;
|
||||
}
|
||||
|
|
@ -2845,7 +2845,7 @@ bool CModem::setConfig2()
|
|||
|
||||
bool CModem::setFrequency()
|
||||
{
|
||||
assert(m_port != NULL);
|
||||
assert(m_port != nullptr);
|
||||
|
||||
unsigned char buffer[20U];
|
||||
unsigned char len;
|
||||
|
|
@ -2856,7 +2856,7 @@ bool CModem::setFrequency()
|
|||
pocsagFrequency = m_pocsagFrequency;
|
||||
#endif
|
||||
|
||||
if (m_hwType == HWT_DVMEGA)
|
||||
if (m_hwType == HW_TYPE::DVMEGA)
|
||||
len = 12U;
|
||||
else {
|
||||
buffer[12U] = (unsigned char)(m_rfLevel * 2.55F + 0.5F);
|
||||
|
|
@ -2906,18 +2906,18 @@ bool CModem::setFrequency()
|
|||
CThread::sleep(10U);
|
||||
|
||||
resp = getResponse();
|
||||
if (resp == RTM_OK && m_buffer[2U] != MMDVM_ACK && m_buffer[2U] != MMDVM_NAK) {
|
||||
if ((resp == RESP_TYPE_MMDVM::OK) && (m_buffer[2U] != MMDVM_ACK) && (m_buffer[2U] != MMDVM_NAK)) {
|
||||
count++;
|
||||
if (count >= MAX_RESPONSES) {
|
||||
LogError("The MMDVM is not responding to the SET_FREQ command");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
} while (resp == RTM_OK && m_buffer[2U] != MMDVM_ACK && m_buffer[2U] != MMDVM_NAK);
|
||||
} while ((resp == RESP_TYPE_MMDVM::OK) && (m_buffer[2U] != MMDVM_ACK) && (m_buffer[2U] != MMDVM_NAK));
|
||||
|
||||
// CUtils::dump(1U, "Response", m_buffer, m_length);
|
||||
|
||||
if (resp == RTM_OK && m_buffer[2U] == MMDVM_NAK) {
|
||||
if ((resp == RESP_TYPE_MMDVM::OK) && (m_buffer[2U] == MMDVM_NAK)) {
|
||||
LogError("Received a NAK to the SET_FREQ command from the modem");
|
||||
return false;
|
||||
}
|
||||
|
|
@ -2927,92 +2927,92 @@ bool CModem::setFrequency()
|
|||
|
||||
RESP_TYPE_MMDVM CModem::getResponse()
|
||||
{
|
||||
assert(m_port != NULL);
|
||||
assert(m_port != nullptr);
|
||||
|
||||
if (m_state == SS_START) {
|
||||
if (m_state == SERIAL_STATE::START) {
|
||||
// Get the start of the frame or nothing at all
|
||||
int ret = m_port->read(m_buffer + 0U, 1U);
|
||||
if (ret < 0) {
|
||||
LogError("Error when reading from the modem");
|
||||
return RTM_ERROR;
|
||||
return RESP_TYPE_MMDVM::ERR;
|
||||
}
|
||||
|
||||
if (ret == 0)
|
||||
return RTM_TIMEOUT;
|
||||
return RESP_TYPE_MMDVM::TIMEOUT;
|
||||
|
||||
if (m_buffer[0U] != MMDVM_FRAME_START)
|
||||
return RTM_TIMEOUT;
|
||||
return RESP_TYPE_MMDVM::TIMEOUT;
|
||||
|
||||
m_state = SS_LENGTH1;
|
||||
m_state = SERIAL_STATE::LENGTH1;
|
||||
m_length = 1U;
|
||||
}
|
||||
|
||||
if (m_state == SS_LENGTH1) {
|
||||
if (m_state == SERIAL_STATE::LENGTH1) {
|
||||
// Get the length of the frame, 1/2
|
||||
int ret = m_port->read(m_buffer + 1U, 1U);
|
||||
if (ret < 0) {
|
||||
LogError("Error when reading from the modem");
|
||||
m_state = SS_START;
|
||||
return RTM_ERROR;
|
||||
m_state = SERIAL_STATE::START;
|
||||
return RESP_TYPE_MMDVM::ERR;
|
||||
}
|
||||
|
||||
if (ret == 0)
|
||||
return RTM_TIMEOUT;
|
||||
return RESP_TYPE_MMDVM::TIMEOUT;
|
||||
|
||||
m_length = m_buffer[1U];
|
||||
m_offset = 2U;
|
||||
|
||||
if (m_length == 0U)
|
||||
m_state = SS_LENGTH2;
|
||||
m_state = SERIAL_STATE::LENGTH2;
|
||||
else
|
||||
m_state = SS_TYPE;
|
||||
m_state = SERIAL_STATE::TYPE;
|
||||
}
|
||||
|
||||
if (m_state == SS_LENGTH2) {
|
||||
if (m_state == SERIAL_STATE::LENGTH2) {
|
||||
// Get the length of the frane, 2/2
|
||||
int ret = m_port->read(m_buffer + 2U, 1U);
|
||||
if (ret < 0) {
|
||||
LogError("Error when reading from the modem");
|
||||
m_state = SS_START;
|
||||
return RTM_ERROR;
|
||||
m_state = SERIAL_STATE::START;
|
||||
return RESP_TYPE_MMDVM::ERR;
|
||||
}
|
||||
|
||||
if (ret == 0)
|
||||
return RTM_TIMEOUT;
|
||||
return RESP_TYPE_MMDVM::TIMEOUT;
|
||||
|
||||
m_length = m_buffer[2U] + 255U;
|
||||
m_offset = 3U;
|
||||
m_state = SS_TYPE;
|
||||
m_state = SERIAL_STATE::TYPE;
|
||||
}
|
||||
|
||||
if (m_state == SS_TYPE) {
|
||||
if (m_state == SERIAL_STATE::TYPE) {
|
||||
// Get the frame type
|
||||
int ret = m_port->read(&m_type, 1U);
|
||||
if (ret < 0) {
|
||||
LogError("Error when reading from the modem");
|
||||
m_state = SS_START;
|
||||
return RTM_ERROR;
|
||||
m_state = SERIAL_STATE::START;
|
||||
return RESP_TYPE_MMDVM::ERR;
|
||||
}
|
||||
|
||||
if (ret == 0)
|
||||
return RTM_TIMEOUT;
|
||||
return RESP_TYPE_MMDVM::TIMEOUT;
|
||||
|
||||
m_buffer[m_offset++] = m_type;
|
||||
|
||||
m_state = SS_DATA;
|
||||
m_state = SERIAL_STATE::DATA;
|
||||
}
|
||||
|
||||
if (m_state == SS_DATA) {
|
||||
if (m_state == SERIAL_STATE::DATA) {
|
||||
while (m_offset < m_length) {
|
||||
int ret = m_port->read(m_buffer + m_offset, m_length - m_offset);
|
||||
if (ret < 0) {
|
||||
LogError("Error when reading from the modem");
|
||||
m_state = SS_START;
|
||||
return RTM_ERROR;
|
||||
m_state = SERIAL_STATE::START;
|
||||
return RESP_TYPE_MMDVM::ERR;
|
||||
}
|
||||
|
||||
if (ret == 0)
|
||||
return RTM_TIMEOUT;
|
||||
return RESP_TYPE_MMDVM::TIMEOUT;
|
||||
|
||||
if (ret > 0)
|
||||
m_offset += ret;
|
||||
|
|
@ -3022,9 +3022,9 @@ RESP_TYPE_MMDVM CModem::getResponse()
|
|||
// CUtils::dump(1U, "Received", m_buffer, m_length);
|
||||
|
||||
m_offset = m_length > 255U ? 4U : 3U;
|
||||
m_state = SS_START;
|
||||
m_state = SERIAL_STATE::START;
|
||||
|
||||
return RTM_OK;
|
||||
return RESP_TYPE_MMDVM::OK;
|
||||
}
|
||||
|
||||
HW_TYPE CModem::getHWType() const
|
||||
|
|
@ -3039,7 +3039,7 @@ unsigned char CModem::getMode() const
|
|||
|
||||
bool CModem::setMode(unsigned char mode)
|
||||
{
|
||||
assert(m_port != NULL);
|
||||
assert(m_port != nullptr);
|
||||
|
||||
unsigned char buffer[4U];
|
||||
|
||||
|
|
@ -3055,7 +3055,7 @@ bool CModem::setMode(unsigned char mode)
|
|||
|
||||
bool CModem::sendCWId(const std::string& callsign)
|
||||
{
|
||||
assert(m_port != NULL);
|
||||
assert(m_port != nullptr);
|
||||
|
||||
unsigned int length = (unsigned int)callsign.length();
|
||||
if (length > 200U)
|
||||
|
|
@ -3078,7 +3078,7 @@ bool CModem::sendCWId(const std::string& callsign)
|
|||
#if defined(USE_DMR)
|
||||
bool CModem::writeDMRStart(bool tx)
|
||||
{
|
||||
assert(m_port != NULL);
|
||||
assert(m_port != nullptr);
|
||||
|
||||
if (tx && m_tx)
|
||||
return true;
|
||||
|
|
@ -3099,7 +3099,7 @@ bool CModem::writeDMRStart(bool tx)
|
|||
|
||||
bool CModem::writeDMRAbort(unsigned int slotNo)
|
||||
{
|
||||
assert(m_port != NULL);
|
||||
assert(m_port != nullptr);
|
||||
|
||||
if (slotNo == 1U)
|
||||
m_txDMRData1.clear();
|
||||
|
|
@ -3120,8 +3120,8 @@ bool CModem::writeDMRAbort(unsigned int slotNo)
|
|||
|
||||
bool CModem::writeDMRShortLC(const unsigned char* lc)
|
||||
{
|
||||
assert(m_port != NULL);
|
||||
assert(lc != NULL);
|
||||
assert(m_port != nullptr);
|
||||
assert(lc != nullptr);
|
||||
|
||||
unsigned char buffer[12U];
|
||||
|
||||
|
|
@ -3204,7 +3204,7 @@ void CModem::setFMExtParams(const std::string& ack, unsigned int audioBoost)
|
|||
|
||||
bool CModem::setFMCallsignParams()
|
||||
{
|
||||
assert(m_port != NULL);
|
||||
assert(m_port != nullptr);
|
||||
|
||||
unsigned char buffer[80U];
|
||||
unsigned char len = 10U + (unsigned char)m_fmCallsign.size();
|
||||
|
|
@ -3244,18 +3244,18 @@ bool CModem::setFMCallsignParams()
|
|||
CThread::sleep(10U);
|
||||
|
||||
resp = getResponse();
|
||||
if (resp == RTM_OK && m_buffer[2U] != MMDVM_ACK && m_buffer[2U] != MMDVM_NAK) {
|
||||
if ((resp == RESP_TYPE_MMDVM::OK) && (m_buffer[2U] != MMDVM_ACK) && (m_buffer[2U] != MMDVM_NAK)) {
|
||||
count++;
|
||||
if (count >= MAX_RESPONSES) {
|
||||
LogError("The MMDVM is not responding to the SET_FM_PARAMS1 command");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
} while (resp == RTM_OK && m_buffer[2U] != MMDVM_ACK && m_buffer[2U] != MMDVM_NAK);
|
||||
} while ((resp == RESP_TYPE_MMDVM::OK) && (m_buffer[2U] != MMDVM_ACK) && (m_buffer[2U] != MMDVM_NAK));
|
||||
|
||||
// CUtils::dump(1U, "Response", m_buffer, m_length);
|
||||
|
||||
if (resp == RTM_OK && m_buffer[2U] == MMDVM_NAK) {
|
||||
if ((resp == RESP_TYPE_MMDVM::OK) && (m_buffer[2U] == MMDVM_NAK)) {
|
||||
LogError("Received a NAK to the SET_FM_PARAMS1 command from the modem");
|
||||
return false;
|
||||
}
|
||||
|
|
@ -3265,7 +3265,7 @@ bool CModem::setFMCallsignParams()
|
|||
|
||||
bool CModem::setFMAckParams()
|
||||
{
|
||||
assert(m_port != NULL);
|
||||
assert(m_port != nullptr);
|
||||
|
||||
unsigned char buffer[80U];
|
||||
unsigned char len = 8U + (unsigned char)m_fmRfAck.size();
|
||||
|
|
@ -3296,18 +3296,18 @@ bool CModem::setFMAckParams()
|
|||
CThread::sleep(10U);
|
||||
|
||||
resp = getResponse();
|
||||
if (resp == RTM_OK && m_buffer[2U] != MMDVM_ACK && m_buffer[2U] != MMDVM_NAK) {
|
||||
if ((resp == RESP_TYPE_MMDVM::OK) && (m_buffer[2U] != MMDVM_ACK) && (m_buffer[2U] != MMDVM_NAK)) {
|
||||
count++;
|
||||
if (count >= MAX_RESPONSES) {
|
||||
LogError("The MMDVM is not responding to the SET_FM_PARAMS2 command");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
} while (resp == RTM_OK && m_buffer[2U] != MMDVM_ACK && m_buffer[2U] != MMDVM_NAK);
|
||||
} while ((resp == RESP_TYPE_MMDVM::OK) && (m_buffer[2U] != MMDVM_ACK) && (m_buffer[2U] != MMDVM_NAK));
|
||||
|
||||
// CUtils::dump(1U, "Response", m_buffer, m_length);
|
||||
|
||||
if (resp == RTM_OK && m_buffer[2U] == MMDVM_NAK) {
|
||||
if ((resp == RESP_TYPE_MMDVM::OK) && (m_buffer[2U] == MMDVM_NAK)) {
|
||||
LogError("Received a NAK to the SET_FM_PARAMS2 command from the modem");
|
||||
return false;
|
||||
}
|
||||
|
|
@ -3317,7 +3317,7 @@ bool CModem::setFMAckParams()
|
|||
|
||||
bool CModem::setFMMiscParams()
|
||||
{
|
||||
assert(m_port != NULL);
|
||||
assert(m_port != nullptr);
|
||||
|
||||
unsigned char buffer[20U];
|
||||
|
||||
|
|
@ -3365,18 +3365,18 @@ bool CModem::setFMMiscParams()
|
|||
CThread::sleep(10U);
|
||||
|
||||
resp = getResponse();
|
||||
if (resp == RTM_OK && m_buffer[2U] != MMDVM_ACK && m_buffer[2U] != MMDVM_NAK) {
|
||||
if ((resp == RESP_TYPE_MMDVM::OK) && (m_buffer[2U] != MMDVM_ACK) && (m_buffer[2U] != MMDVM_NAK)) {
|
||||
count++;
|
||||
if (count >= MAX_RESPONSES) {
|
||||
LogError("The MMDVM is not responding to the SET_FM_PARAMS3 command");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
} while (resp == RTM_OK && m_buffer[2U] != MMDVM_ACK && m_buffer[2U] != MMDVM_NAK);
|
||||
} while ((resp == RESP_TYPE_MMDVM::OK) && (m_buffer[2U] != MMDVM_ACK) && (m_buffer[2U] != MMDVM_NAK));
|
||||
|
||||
// CUtils::dump(1U, "Response", m_buffer, m_length);
|
||||
|
||||
if (resp == RTM_OK && m_buffer[2U] == MMDVM_NAK) {
|
||||
if ((resp == RESP_TYPE_MMDVM::OK) && (m_buffer[2U] == MMDVM_NAK)) {
|
||||
LogError("Received a NAK to the SET_FM_PARAMS3 command from the modem");
|
||||
return false;
|
||||
}
|
||||
|
|
@ -3386,7 +3386,7 @@ bool CModem::setFMMiscParams()
|
|||
|
||||
bool CModem::setFMExtParams()
|
||||
{
|
||||
assert(m_port != NULL);
|
||||
assert(m_port != nullptr);
|
||||
|
||||
unsigned char buffer[80U];
|
||||
unsigned char len = 7U + (unsigned char)m_fmExtAck.size();
|
||||
|
|
@ -3416,18 +3416,18 @@ bool CModem::setFMExtParams()
|
|||
CThread::sleep(10U);
|
||||
|
||||
resp = getResponse();
|
||||
if (resp == RTM_OK && m_buffer[2U] != MMDVM_ACK && m_buffer[2U] != MMDVM_NAK) {
|
||||
if ((resp == RESP_TYPE_MMDVM::OK) && (m_buffer[2U] != MMDVM_ACK) && (m_buffer[2U] != MMDVM_NAK)) {
|
||||
count++;
|
||||
if (count >= MAX_RESPONSES) {
|
||||
LogError("The MMDVM is not responding to the SET_FM_PARAMS4 command");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
} while (resp == RTM_OK && m_buffer[2U] != MMDVM_ACK && m_buffer[2U] != MMDVM_NAK);
|
||||
} while ((resp == RESP_TYPE_MMDVM::OK) && (m_buffer[2U] != MMDVM_ACK) && (m_buffer[2U] != MMDVM_NAK));
|
||||
|
||||
// CUtils::dump(1U, "Response", m_buffer, m_length);
|
||||
|
||||
if (resp == RTM_OK && m_buffer[2U] == MMDVM_NAK) {
|
||||
if ((resp == RESP_TYPE_MMDVM::OK) && (m_buffer[2U] == MMDVM_NAK)) {
|
||||
LogError("Received a NAK to the SET_FM_PARAMS4 command from the modem");
|
||||
return false;
|
||||
}
|
||||
|
|
|
|||
22
Modem.h
22
Modem.h
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (C) 2011-2018,2020,2021,2023 by Jonathan Naylor G4KLX
|
||||
* Copyright (C) 2011-2018,2020,2021,2023,2025 by Jonathan Naylor G4KLX
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
|
|
@ -26,18 +26,18 @@
|
|||
|
||||
#include <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 {
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
14
NXDNCRC.cpp
14
NXDNCRC.cpp
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (C) 2018,2023 by Jonathan Naylor G4KLX
|
||||
* Copyright (C) 2018,2023,2025 by Jonathan Naylor G4KLX
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
|
|
@ -30,7 +30,7 @@ const uint8_t BIT_MASK_TABLE1[] = { 0x80U, 0x40U, 0x20U, 0x10U, 0x08U, 0x04U, 0
|
|||
|
||||
bool CNXDNCRC::checkCRC6(const unsigned char* in, unsigned int length)
|
||||
{
|
||||
assert(in != NULL);
|
||||
assert(in != nullptr);
|
||||
|
||||
uint8_t crc = createCRC6(in, length);
|
||||
|
||||
|
|
@ -47,7 +47,7 @@ bool CNXDNCRC::checkCRC6(const unsigned char* in, unsigned int length)
|
|||
|
||||
void CNXDNCRC::encodeCRC6(unsigned char* in, unsigned int length)
|
||||
{
|
||||
assert(in != NULL);
|
||||
assert(in != nullptr);
|
||||
|
||||
uint8_t crc[1U];
|
||||
crc[0U] = createCRC6(in, length);
|
||||
|
|
@ -61,7 +61,7 @@ void CNXDNCRC::encodeCRC6(unsigned char* in, unsigned int length)
|
|||
|
||||
bool CNXDNCRC::checkCRC12(const unsigned char* in, unsigned int length)
|
||||
{
|
||||
assert(in != NULL);
|
||||
assert(in != nullptr);
|
||||
|
||||
uint16_t crc = createCRC12(in, length);
|
||||
uint8_t temp1[2U];
|
||||
|
|
@ -82,7 +82,7 @@ bool CNXDNCRC::checkCRC12(const unsigned char* in, unsigned int length)
|
|||
|
||||
void CNXDNCRC::encodeCRC12(unsigned char* in, unsigned int length)
|
||||
{
|
||||
assert(in != NULL);
|
||||
assert(in != nullptr);
|
||||
|
||||
uint16_t crc = createCRC12(in, length);
|
||||
|
||||
|
|
@ -99,7 +99,7 @@ void CNXDNCRC::encodeCRC12(unsigned char* in, unsigned int length)
|
|||
|
||||
bool CNXDNCRC::checkCRC15(const unsigned char* in, unsigned int length)
|
||||
{
|
||||
assert(in != NULL);
|
||||
assert(in != nullptr);
|
||||
|
||||
uint16_t crc = createCRC15(in, length);
|
||||
uint8_t temp1[2U];
|
||||
|
|
@ -120,7 +120,7 @@ bool CNXDNCRC::checkCRC15(const unsigned char* in, unsigned int length)
|
|||
|
||||
void CNXDNCRC::encodeCRC15(unsigned char* in, unsigned int length)
|
||||
{
|
||||
assert(in != NULL);
|
||||
assert(in != nullptr);
|
||||
|
||||
uint16_t crc = createCRC15(in, length);
|
||||
|
||||
|
|
|
|||
|
|
@ -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];
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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];
|
||||
|
|
|
|||
10
NXDNLICH.cpp
10
NXDNLICH.cpp
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (C) 2018,2023 by Jonathan Naylor G4KLX
|
||||
* Copyright (C) 2018,2023,2025 by Jonathan Naylor G4KLX
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
|
|
@ -31,14 +31,14 @@ const unsigned char BIT_MASK_TABLE[] = {0x80U, 0x40U, 0x20U, 0x10U, 0x08U, 0x04U
|
|||
#define READ_BIT1(p,i) (p[(i)>>3] & BIT_MASK_TABLE[(i)&7])
|
||||
|
||||
CNXDNLICH::CNXDNLICH(const CNXDNLICH& lich) :
|
||||
m_lich(NULL)
|
||||
m_lich(nullptr)
|
||||
{
|
||||
m_lich = new unsigned char[1U];
|
||||
m_lich[0U] = lich.m_lich[0U];
|
||||
}
|
||||
|
||||
CNXDNLICH::CNXDNLICH() :
|
||||
m_lich(NULL)
|
||||
m_lich(nullptr)
|
||||
{
|
||||
m_lich = new unsigned char[1U];
|
||||
}
|
||||
|
|
@ -50,7 +50,7 @@ CNXDNLICH::~CNXDNLICH()
|
|||
|
||||
bool CNXDNLICH::decode(const unsigned char* bytes)
|
||||
{
|
||||
assert(bytes != NULL);
|
||||
assert(bytes != nullptr);
|
||||
|
||||
unsigned int offset = NXDN_FSW_LENGTH_BITS;
|
||||
for (unsigned int i = 0U; i < (NXDN_LICH_LENGTH_BITS / 2U); i++, offset += 2U) {
|
||||
|
|
@ -66,7 +66,7 @@ bool CNXDNLICH::decode(const unsigned char* bytes)
|
|||
|
||||
void CNXDNLICH::encode(unsigned char* bytes)
|
||||
{
|
||||
assert(bytes != NULL);
|
||||
assert(bytes != nullptr);
|
||||
|
||||
bool parity = getParity();
|
||||
if (parity)
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
18
NXDNUDCH.cpp
18
NXDNUDCH.cpp
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (C) 2018,2023 by Jonathan Naylor G4KLX
|
||||
* Copyright (C) 2018,2023,2025 by Jonathan Naylor G4KLX
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
|
|
@ -71,14 +71,14 @@ const unsigned char BIT_MASK_TABLE[] = { 0x80U, 0x40U, 0x20U, 0x10U, 0x08U, 0x04
|
|||
#define READ_BIT1(p,i) (p[(i)>>3] & BIT_MASK_TABLE[(i)&7])
|
||||
|
||||
CNXDNUDCH::CNXDNUDCH(const CNXDNUDCH& udch) :
|
||||
m_data(NULL)
|
||||
m_data(nullptr)
|
||||
{
|
||||
m_data = new unsigned char[23U + 3U];
|
||||
::memcpy(m_data, udch.m_data, 23U + 3U);
|
||||
}
|
||||
|
||||
CNXDNUDCH::CNXDNUDCH() :
|
||||
m_data(NULL)
|
||||
m_data(nullptr)
|
||||
{
|
||||
m_data = new unsigned char[23U + 3U];
|
||||
}
|
||||
|
|
@ -90,7 +90,7 @@ CNXDNUDCH::~CNXDNUDCH()
|
|||
|
||||
bool CNXDNUDCH::decode(const unsigned char* data)
|
||||
{
|
||||
assert(data != NULL);
|
||||
assert(data != nullptr);
|
||||
|
||||
unsigned char temp1[44U];
|
||||
|
||||
|
|
@ -136,7 +136,7 @@ bool CNXDNUDCH::decode(const unsigned char* data)
|
|||
|
||||
void CNXDNUDCH::encode(unsigned char* data) const
|
||||
{
|
||||
assert(data != NULL);
|
||||
assert(data != nullptr);
|
||||
|
||||
unsigned char temp1[25U];
|
||||
::memset(temp1, 0x00U, 25U);
|
||||
|
|
@ -177,14 +177,14 @@ unsigned char CNXDNUDCH::getRAN() const
|
|||
|
||||
void CNXDNUDCH::getData(unsigned char* data) const
|
||||
{
|
||||
assert(data != NULL);
|
||||
assert(data != nullptr);
|
||||
|
||||
::memcpy(data, m_data + 1U, 22U);
|
||||
}
|
||||
|
||||
void CNXDNUDCH::getRaw(unsigned char* data) const
|
||||
{
|
||||
assert(data != NULL);
|
||||
assert(data != nullptr);
|
||||
|
||||
::memset(data, 0x00U, 25U);
|
||||
::memcpy(data, m_data, 23U);
|
||||
|
|
@ -197,14 +197,14 @@ void CNXDNUDCH::setRAN(unsigned char ran)
|
|||
|
||||
void CNXDNUDCH::setData(const unsigned char* data)
|
||||
{
|
||||
assert(data != NULL);
|
||||
assert(data != nullptr);
|
||||
|
||||
::memcpy(m_data + 1U, data, 22U);
|
||||
}
|
||||
|
||||
void CNXDNUDCH::setRaw(const unsigned char* data)
|
||||
{
|
||||
assert(data != NULL);
|
||||
assert(data != nullptr);
|
||||
|
||||
::memcpy(m_data, data, 25U);
|
||||
}
|
||||
|
|
|
|||
12
P25Audio.cpp
12
P25Audio.cpp
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (C) 2016,2023 by Jonathan Naylor G4KLX
|
||||
* Copyright (C) 2016,2023,2025 by Jonathan Naylor G4KLX
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
|
|
@ -50,7 +50,7 @@ CP25Audio::~CP25Audio()
|
|||
|
||||
unsigned int CP25Audio::process(unsigned char* data)
|
||||
{
|
||||
assert(data != NULL);
|
||||
assert(data != nullptr);
|
||||
|
||||
unsigned int errs = 0U;
|
||||
|
||||
|
|
@ -97,8 +97,8 @@ unsigned int CP25Audio::process(unsigned char* data)
|
|||
|
||||
void CP25Audio::decode(const unsigned char* data, unsigned char* imbe, unsigned int n)
|
||||
{
|
||||
assert(data != NULL);
|
||||
assert(imbe != NULL);
|
||||
assert(data != nullptr);
|
||||
assert(imbe != nullptr);
|
||||
|
||||
unsigned char temp[18U];
|
||||
|
||||
|
|
@ -206,8 +206,8 @@ void CP25Audio::decode(const unsigned char* data, unsigned char* imbe, unsigned
|
|||
|
||||
void CP25Audio::encode(unsigned char* data, const unsigned char* imbe, unsigned int n)
|
||||
{
|
||||
assert(data != NULL);
|
||||
assert(imbe != NULL);
|
||||
assert(data != nullptr);
|
||||
assert(imbe != nullptr);
|
||||
|
||||
bool bTemp[144U];
|
||||
bool* bit = bTemp;
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
28
P25Data.cpp
28
P25Data.cpp
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (C) 2016,2017,2023,2024 by Jonathan Naylor G4KLX
|
||||
* Copyright (C) 2016,2017,2023,2024,2025 by Jonathan Naylor G4KLX
|
||||
* Copyright (C) 2018 by Bryan Biedenkapp <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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
20
P25NID.cpp
20
P25NID.cpp
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (C) 2016,2018,2023 by Jonathan Naylor G4KLX
|
||||
* Copyright (C) 2016,2018,2023,2025 by Jonathan Naylor G4KLX
|
||||
* Copyright (C) 2018 by Bryan Biedenkapp <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:
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
38
P25Utils.cpp
38
P25Utils.cpp
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (C) 2016,2018,2023 by Jonathan Naylor G4KLX
|
||||
* Copyright (C) 2016,2018,2023,2025 by Jonathan Naylor G4KLX
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
|
|
@ -31,24 +31,24 @@ const unsigned char BIT_MASK_TABLE[] = { 0x80U, 0x40U, 0x20U, 0x10U, 0x08U, 0x04
|
|||
|
||||
unsigned int CP25Utils::decode(const unsigned char* in, unsigned char* out, unsigned int start, unsigned int stop)
|
||||
{
|
||||
assert(in != NULL);
|
||||
assert(out != NULL);
|
||||
assert(in != nullptr);
|
||||
assert(out != nullptr);
|
||||
|
||||
// Move the SSx positions to the range needed
|
||||
unsigned int ss0Pos = P25_SS0_START;
|
||||
unsigned int ss1Pos = P25_SS1_START;
|
||||
|
||||
while (ss0Pos < start) {
|
||||
ss0Pos += P25_SS_INCREMENT;
|
||||
ss1Pos += P25_SS_INCREMENT;
|
||||
ss0Pos += P25_INCREMENT;
|
||||
ss1Pos += P25_INCREMENT;
|
||||
}
|
||||
|
||||
unsigned int n = 0U;
|
||||
for (unsigned int i = start; i < stop; i++) {
|
||||
if (i == ss0Pos) {
|
||||
ss0Pos += P25_SS_INCREMENT;
|
||||
ss0Pos += P25_INCREMENT;
|
||||
} else if (i == ss1Pos) {
|
||||
ss1Pos += P25_SS_INCREMENT;
|
||||
ss1Pos += P25_INCREMENT;
|
||||
} else {
|
||||
bool b = READ_BIT(in, i);
|
||||
WRITE_BIT(out, n, b);
|
||||
|
|
@ -61,24 +61,24 @@ unsigned int CP25Utils::decode(const unsigned char* in, unsigned char* out, unsi
|
|||
|
||||
unsigned int CP25Utils::encode(const unsigned char* in, unsigned char* out, unsigned int start, unsigned int stop)
|
||||
{
|
||||
assert(in != NULL);
|
||||
assert(out != NULL);
|
||||
assert(in != nullptr);
|
||||
assert(out != nullptr);
|
||||
|
||||
// Move the SSx positions to the range needed
|
||||
unsigned int ss0Pos = P25_SS0_START;
|
||||
unsigned int ss1Pos = P25_SS1_START;
|
||||
|
||||
while (ss0Pos < start) {
|
||||
ss0Pos += P25_SS_INCREMENT;
|
||||
ss1Pos += P25_SS_INCREMENT;
|
||||
ss0Pos += P25_INCREMENT;
|
||||
ss1Pos += P25_INCREMENT;
|
||||
}
|
||||
|
||||
unsigned int n = 0U;
|
||||
for (unsigned int i = start; i < stop; i++) {
|
||||
if (i == ss0Pos) {
|
||||
ss0Pos += P25_SS_INCREMENT;
|
||||
ss0Pos += P25_INCREMENT;
|
||||
} else if (i == ss1Pos) {
|
||||
ss1Pos += P25_SS_INCREMENT;
|
||||
ss1Pos += P25_INCREMENT;
|
||||
} else {
|
||||
bool b = READ_BIT(in, n);
|
||||
WRITE_BIT(out, i, b);
|
||||
|
|
@ -91,8 +91,8 @@ unsigned int CP25Utils::encode(const unsigned char* in, unsigned char* out, unsi
|
|||
|
||||
unsigned int CP25Utils::encode(const unsigned char* in, unsigned char* out, unsigned int length)
|
||||
{
|
||||
assert(in != NULL);
|
||||
assert(out != NULL);
|
||||
assert(in != nullptr);
|
||||
assert(out != nullptr);
|
||||
|
||||
// Move the SSx positions to the range needed
|
||||
unsigned int ss0Pos = P25_SS0_START;
|
||||
|
|
@ -102,9 +102,9 @@ unsigned int CP25Utils::encode(const unsigned char* in, unsigned char* out, unsi
|
|||
unsigned int pos = 0U;
|
||||
while (n < length) {
|
||||
if (pos == ss0Pos) {
|
||||
ss0Pos += P25_SS_INCREMENT;
|
||||
ss0Pos += P25_INCREMENT;
|
||||
} else if (pos == ss1Pos) {
|
||||
ss1Pos += P25_SS_INCREMENT;
|
||||
ss1Pos += P25_INCREMENT;
|
||||
} else {
|
||||
bool b = READ_BIT(in, n);
|
||||
WRITE_BIT(out, pos, b);
|
||||
|
|
@ -118,8 +118,8 @@ unsigned int CP25Utils::encode(const unsigned char* in, unsigned char* out, unsi
|
|||
|
||||
unsigned int CP25Utils::compare(const unsigned char* data1, const unsigned char* data2, unsigned int length)
|
||||
{
|
||||
assert(data1 != NULL);
|
||||
assert(data2 != NULL);
|
||||
assert(data1 != nullptr);
|
||||
assert(data2 != nullptr);
|
||||
|
||||
unsigned int errs = 0U;
|
||||
for (unsigned int i = 0U; i < length; i++) {
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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
10
RS.h
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
* Copyright (C) 2014 Hard Consulting Corporation
|
||||
* Copyright (C) 2023 Bryan Biedenkapp, N2PLL
|
||||
* Copyright (C) 2024 Jonathan Naylor, G4KLX
|
||||
* Copyright (C) 2024,2025 Jonathan Naylor, G4KLX
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
|
|
@ -1044,16 +1044,16 @@
|
|||
TYP cor = alpha_to[modnn(index_of[num1] + index_of[num2] + NN - index_of[den])];
|
||||
|
||||
// Store the error correction pattern, if a correction buffer is available
|
||||
if (corr != NULL)
|
||||
if (corr != nullptr)
|
||||
corr[j] = cor;
|
||||
|
||||
// If a data/parity buffer is given and the error is inside the message or
|
||||
// parity data, correct it
|
||||
if (loc[j] < (NN - NROOTS)) {
|
||||
if (data != NULL)
|
||||
if (data != nullptr)
|
||||
data[loc[j] - pad] ^= cor;
|
||||
} else if (loc[j] < NN) {
|
||||
if (parity != NULL)
|
||||
if (parity != nullptr)
|
||||
parity[loc[j] - (NN - NROOTS)] ^= cor;
|
||||
}
|
||||
}
|
||||
|
|
@ -1082,7 +1082,7 @@
|
|||
LogDebug(LOG_HOST, "%s", ss.str().c_str());
|
||||
}
|
||||
#endif
|
||||
if (eras_pos != NULL) {
|
||||
if (eras_pos != nullptr) {
|
||||
for (int i = 0; i < count; i++)
|
||||
eras_pos[i] = loc[i] - pad;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
14
RS634717.cpp
14
RS634717.cpp
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (C) 2016,2023,2024 by Jonathan Naylor G4KLX
|
||||
* Copyright (C) 2016,2023,2024,2025 by Jonathan Naylor G4KLX
|
||||
* Copyright (C) 2018,2023 by Bryan Biedenkapp <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];
|
||||
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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];
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
20
Sync.cpp
20
Sync.cpp
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (C) 2015,2016,2018,2020,2021,2023 by Jonathan Naylor G4KLX
|
||||
* Copyright (C) 2015,2016,2018,2020,2021,2023,2025 by Jonathan Naylor G4KLX
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
|
|
@ -32,7 +32,7 @@
|
|||
#if defined(USE_DSTAR)
|
||||
void CSync::addDStarSync(unsigned char* data)
|
||||
{
|
||||
assert(data != NULL);
|
||||
assert(data != nullptr);
|
||||
|
||||
::memcpy(data + DSTAR_VOICE_FRAME_LENGTH_BYTES, DSTAR_SYNC_BYTES, DSTAR_DATA_FRAME_LENGTH_BYTES);
|
||||
}
|
||||
|
|
@ -41,7 +41,7 @@ void CSync::addDStarSync(unsigned char* data)
|
|||
#if defined(USE_DMR)
|
||||
void CSync::addDMRDataSync(unsigned char* data, bool duplex)
|
||||
{
|
||||
assert(data != NULL);
|
||||
assert(data != nullptr);
|
||||
|
||||
if (duplex) {
|
||||
for (unsigned int i = 0U; i < 7U; i++)
|
||||
|
|
@ -54,7 +54,7 @@ void CSync::addDMRDataSync(unsigned char* data, bool duplex)
|
|||
|
||||
void CSync::addDMRAudioSync(unsigned char* data, bool duplex)
|
||||
{
|
||||
assert(data != NULL);
|
||||
assert(data != nullptr);
|
||||
|
||||
if (duplex) {
|
||||
for (unsigned int i = 0U; i < 7U; i++)
|
||||
|
|
@ -69,7 +69,7 @@ void CSync::addDMRAudioSync(unsigned char* data, bool duplex)
|
|||
#if defined(USE_YSF)
|
||||
void CSync::addYSFSync(unsigned char* data)
|
||||
{
|
||||
assert(data != NULL);
|
||||
assert(data != nullptr);
|
||||
|
||||
::memcpy(data, YSF_SYNC_BYTES, YSF_SYNC_LENGTH_BYTES);
|
||||
}
|
||||
|
|
@ -78,7 +78,7 @@ void CSync::addYSFSync(unsigned char* data)
|
|||
#if defined(USE_P25)
|
||||
void CSync::addP25Sync(unsigned char* data)
|
||||
{
|
||||
assert(data != NULL);
|
||||
assert(data != nullptr);
|
||||
|
||||
::memcpy(data, P25_SYNC_BYTES, P25_SYNC_LENGTH_BYTES);
|
||||
}
|
||||
|
|
@ -87,7 +87,7 @@ void CSync::addP25Sync(unsigned char* data)
|
|||
#if defined(USE_NXDN)
|
||||
void CSync::addNXDNSync(unsigned char* data)
|
||||
{
|
||||
assert(data != NULL);
|
||||
assert(data != nullptr);
|
||||
|
||||
for (unsigned int i = 0U; i < NXDN_FSW_BYTES_LENGTH; i++)
|
||||
data[i] = (data[i] & ~NXDN_FSW_BYTES_MASK[i]) | NXDN_FSW_BYTES[i];
|
||||
|
|
@ -97,21 +97,21 @@ void CSync::addNXDNSync(unsigned char* data)
|
|||
#if defined(USE_M17)
|
||||
void CSync::addM17LinkSetupSync(unsigned char* data)
|
||||
{
|
||||
assert(data != NULL);
|
||||
assert(data != nullptr);
|
||||
|
||||
::memcpy(data, M17_LINK_SETUP_SYNC_BYTES, M17_SYNC_LENGTH_BYTES);
|
||||
}
|
||||
|
||||
void CSync::addM17StreamSync(unsigned char* data)
|
||||
{
|
||||
assert(data != NULL);
|
||||
assert(data != nullptr);
|
||||
|
||||
::memcpy(data, M17_STREAM_SYNC_BYTES, M17_SYNC_LENGTH_BYTES);
|
||||
}
|
||||
|
||||
void CSync::addM17EOTSync(unsigned char* data)
|
||||
{
|
||||
assert(data != NULL);
|
||||
assert(data != nullptr);
|
||||
|
||||
::memcpy(data, M17_EOT_SYNC_BYTES, M17_SYNC_LENGTH_BYTES);
|
||||
}
|
||||
|
|
|
|||
14
Thread.cpp
14
Thread.cpp
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (C) 2015,2016,2020 by Jonathan Naylor G4KLX
|
||||
* Copyright (C) 2015,2016,2020,2025 by Jonathan Naylor G4KLX
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
|
|
@ -31,9 +31,9 @@ CThread::~CThread()
|
|||
|
||||
bool CThread::run()
|
||||
{
|
||||
m_handle = ::CreateThread(NULL, 0, &helper, this, 0, NULL);
|
||||
m_handle = ::CreateThread(nullptr, 0, &helper, this, 0, nullptr);
|
||||
|
||||
return m_handle != NULL;
|
||||
return m_handle != nullptr;
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -74,13 +74,13 @@ CThread::~CThread()
|
|||
|
||||
bool CThread::run()
|
||||
{
|
||||
return ::pthread_create(&m_thread, NULL, helper, this) == 0;
|
||||
return ::pthread_create(&m_thread, nullptr, helper, this) == 0;
|
||||
}
|
||||
|
||||
|
||||
void CThread::wait()
|
||||
{
|
||||
::pthread_join(m_thread, NULL);
|
||||
::pthread_join(m_thread, nullptr);
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -90,7 +90,7 @@ void* CThread::helper(void* arg)
|
|||
|
||||
p->entry();
|
||||
|
||||
return NULL;
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
void CThread::sleep(unsigned int ms)
|
||||
|
|
@ -100,7 +100,7 @@ void CThread::sleep(unsigned int ms)
|
|||
ts.tv_sec = ms / 1000U;
|
||||
ts.tv_nsec = (ms % 1000U) * 1000000U;
|
||||
|
||||
::nanosleep(&ts, NULL);
|
||||
::nanosleep(&ts, nullptr);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
10
UDPSocket.h
10
UDPSocket.h
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (C) 2009-2011,2013,2015,2016,2020,2024 by Jonathan Naylor G4KLX
|
||||
* Copyright (C) 2009-2011,2013,2015,2016,2020,2024.2025 by Jonathan Naylor G4KLX
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
|
|
@ -36,9 +36,9 @@
|
|||
#include <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);
|
||||
|
||||
|
|
|
|||
18
UserDB.cpp
18
UserDB.cpp
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
* Copyright (C) 2020 by SASANO Takayoshi JG1UAA
|
||||
* Copyright (C) 2023 by Jonathan Naylor G4KLX
|
||||
* Copyright (C) 2023,2025 by Jonathan Naylor G4KLX
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
|
|
@ -42,7 +42,7 @@ bool CUserDB::lookup(unsigned int id, class CUserDBentry *entry)
|
|||
m_mutex.lock();
|
||||
|
||||
try {
|
||||
if (entry != NULL)
|
||||
if (entry != nullptr)
|
||||
*entry = m_table.at(id);
|
||||
else
|
||||
(void)m_table.at(id);
|
||||
|
|
@ -62,7 +62,7 @@ bool CUserDB::load(std::string const& filename)
|
|||
LogInfo("Loading ID lookup table from %s", filename.c_str());
|
||||
|
||||
FILE* fp = ::fopen(filename.c_str(), "rt");
|
||||
if (fp == NULL) {
|
||||
if (fp == nullptr) {
|
||||
LogWarning("Cannot open ID lookup file - %s", filename.c_str());
|
||||
return false;
|
||||
}
|
||||
|
|
@ -74,7 +74,7 @@ bool CUserDB::load(std::string const& filename)
|
|||
|
||||
// set index for entries
|
||||
char buffer[256U];
|
||||
if (::fgets(buffer, sizeof(buffer), fp) == NULL) {
|
||||
if (::fgets(buffer, sizeof(buffer), fp) == nullptr) {
|
||||
LogWarning("ID lookup file has no entry - %s", filename.c_str());
|
||||
m_mutex.unlock();
|
||||
::fclose(fp);
|
||||
|
|
@ -89,7 +89,7 @@ bool CUserDB::load(std::string const& filename)
|
|||
::rewind(fp);
|
||||
}
|
||||
|
||||
while (::fgets(buffer, sizeof(buffer), fp) != NULL) {
|
||||
while (::fgets(buffer, sizeof(buffer), fp) != nullptr) {
|
||||
if (buffer[0U] != '#')
|
||||
parse(buffer, index);
|
||||
}
|
||||
|
|
@ -112,7 +112,7 @@ bool CUserDB::makeindex(char* buf, std::unordered_map<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';
|
||||
|
|
|
|||
18
Utils.cpp
18
Utils.cpp
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (C) 2009,2014,2015,2016,2021,2022,2023 Jonathan Naylor, G4KLX
|
||||
* Copyright (C) 2009,2014,2015,2016,2021,2022,2023,2025 Jonathan Naylor, G4KLX
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
|
|
@ -26,14 +26,14 @@
|
|||
|
||||
void CUtils::dump(const std::string& title, const unsigned char* data, unsigned int length)
|
||||
{
|
||||
assert(data != NULL);
|
||||
assert(data != nullptr);
|
||||
|
||||
dump(2U, title, data, length);
|
||||
}
|
||||
|
||||
void CUtils::dump(int level, const std::string& title, const unsigned char* data, unsigned int length)
|
||||
{
|
||||
assert(data != NULL);
|
||||
assert(data != nullptr);
|
||||
|
||||
::Log(level, "%s", title.c_str());
|
||||
|
||||
|
|
@ -79,14 +79,14 @@ void CUtils::dump(int level, const std::string& title, const unsigned char* data
|
|||
|
||||
void CUtils::dump(const std::string& title, const bool* bits, unsigned int length)
|
||||
{
|
||||
assert(bits != NULL);
|
||||
assert(bits != nullptr);
|
||||
|
||||
dump(2U, title, bits, length);
|
||||
}
|
||||
|
||||
void CUtils::dump(int level, const std::string& title, const bool* bits, unsigned int length)
|
||||
{
|
||||
assert(bits != NULL);
|
||||
assert(bits != nullptr);
|
||||
|
||||
unsigned char bytes[100U];
|
||||
unsigned int nBytes = 0U;
|
||||
|
|
@ -98,7 +98,7 @@ void CUtils::dump(int level, const std::string& title, const bool* bits, unsigne
|
|||
|
||||
void CUtils::byteToBitsBE(unsigned char byte, bool* bits)
|
||||
{
|
||||
assert(bits != NULL);
|
||||
assert(bits != nullptr);
|
||||
|
||||
bits[0U] = (byte & 0x80U) == 0x80U;
|
||||
bits[1U] = (byte & 0x40U) == 0x40U;
|
||||
|
|
@ -112,7 +112,7 @@ void CUtils::byteToBitsBE(unsigned char byte, bool* bits)
|
|||
|
||||
void CUtils::byteToBitsLE(unsigned char byte, bool* bits)
|
||||
{
|
||||
assert(bits != NULL);
|
||||
assert(bits != nullptr);
|
||||
|
||||
bits[0U] = (byte & 0x01U) == 0x01U;
|
||||
bits[1U] = (byte & 0x02U) == 0x02U;
|
||||
|
|
@ -126,7 +126,7 @@ void CUtils::byteToBitsLE(unsigned char byte, bool* bits)
|
|||
|
||||
void CUtils::bitsToByteBE(const bool* bits, unsigned char& byte)
|
||||
{
|
||||
assert(bits != NULL);
|
||||
assert(bits != nullptr);
|
||||
|
||||
byte = bits[0U] ? 0x80U : 0x00U;
|
||||
byte |= bits[1U] ? 0x40U : 0x00U;
|
||||
|
|
@ -140,7 +140,7 @@ void CUtils::bitsToByteBE(const bool* bits, unsigned char& byte)
|
|||
|
||||
void CUtils::bitsToByteLE(const bool* bits, unsigned char& byte)
|
||||
{
|
||||
assert(bits != NULL);
|
||||
assert(bits != nullptr);
|
||||
|
||||
byte = bits[0U] ? 0x01U : 0x00U;
|
||||
byte |= bits[1U] ? 0x02U : 0x00U;
|
||||
|
|
|
|||
|
|
@ -19,6 +19,6 @@
|
|||
#if !defined(VERSION_H)
|
||||
#define VERSION_H
|
||||
|
||||
const char* VERSION = "20250227";
|
||||
const char* VERSION = "20250314";
|
||||
|
||||
#endif
|
||||
|
|
|
|||
128
YSFControl.cpp
128
YSFControl.cpp
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (C) 2015-2021,2023 Jonathan Naylor, G4KLX
|
||||
* Copyright (C) 2015-2021,2023,2025 Jonathan Naylor, G4KLX
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
|
|
@ -35,8 +35,8 @@ m_duplex(duplex),
|
|||
m_lowDeviation(lowDeviation),
|
||||
m_remoteGateway(remoteGateway),
|
||||
m_queue(5000U, "YSF Control"),
|
||||
m_rfState(RS_RF_LISTENING),
|
||||
m_netState(RS_NET_IDLE),
|
||||
m_rfState(RPT_RF_STATE::LISTENING),
|
||||
m_netState(RPT_NET_STATE::IDLE),
|
||||
m_rfTimeoutTimer(1000U, timeout),
|
||||
m_netTimeoutTimer(1000U, timeout),
|
||||
m_packetTimer(1000U, 0U, 200U),
|
||||
|
|
@ -48,10 +48,10 @@ m_netLost(0U),
|
|||
m_rfErrs(0U),
|
||||
m_rfBits(1U),
|
||||
m_netBits(1U),
|
||||
m_rfSource(NULL),
|
||||
m_rfDest(NULL),
|
||||
m_netSource(NULL),
|
||||
m_netDest(NULL),
|
||||
m_rfSource(nullptr),
|
||||
m_rfDest(nullptr),
|
||||
m_netSource(nullptr),
|
||||
m_netDest(nullptr),
|
||||
m_lastFICH(),
|
||||
m_netN(0U),
|
||||
m_rfPayload(),
|
||||
|
|
@ -103,7 +103,7 @@ CYSFControl::~CYSFControl()
|
|||
|
||||
bool CYSFControl::writeModem(unsigned char *data, unsigned int len)
|
||||
{
|
||||
assert(data != NULL);
|
||||
assert(data != nullptr);
|
||||
|
||||
if (!m_enabled)
|
||||
return false;
|
||||
|
|
@ -122,17 +122,17 @@ bool CYSFControl::writeModem(unsigned char *data, unsigned int len)
|
|||
return false;
|
||||
}
|
||||
|
||||
if (type == TAG_LOST && m_rfState == RS_RF_REJECTED) {
|
||||
if ((type == TAG_LOST) && (m_rfState == RPT_RF_STATE::REJECTED)) {
|
||||
m_rfPayload.reset();
|
||||
m_rfSource = NULL;
|
||||
m_rfDest = NULL;
|
||||
m_rfState = RS_RF_LISTENING;
|
||||
m_rfSource = nullptr;
|
||||
m_rfDest = nullptr;
|
||||
m_rfState = RPT_RF_STATE::LISTENING;
|
||||
return false;
|
||||
}
|
||||
|
||||
if (type == TAG_LOST) {
|
||||
m_rfPayload.reset();
|
||||
m_rfState = RS_RF_LISTENING;
|
||||
m_rfState = RPT_RF_STATE::LISTENING;
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
@ -227,7 +227,7 @@ bool CYSFControl::processVWData(bool valid, unsigned char *data)
|
|||
unsigned char dgid = m_lastFICH.getDGId();
|
||||
|
||||
if (valid && fi == YSF_FI_HEADER) {
|
||||
if (m_rfState == RS_RF_LISTENING) {
|
||||
if (m_rfState == RPT_RF_STATE::LISTENING) {
|
||||
bool valid = m_rfPayload.processHeaderData(data + 2U);
|
||||
if (!valid)
|
||||
return false;
|
||||
|
|
@ -254,7 +254,7 @@ bool CYSFControl::processVWData(bool valid, unsigned char *data)
|
|||
m_rfErrs = 0U;
|
||||
m_rfBits = 1U;
|
||||
m_rfTimeoutTimer.start();
|
||||
m_rfState = RS_RF_AUDIO;
|
||||
m_rfState = RPT_RF_STATE::AUDIO;
|
||||
|
||||
m_minRSSI = m_rssi;
|
||||
m_maxRSSI = m_rssi;
|
||||
|
|
@ -294,13 +294,13 @@ bool CYSFControl::processVWData(bool valid, unsigned char *data)
|
|||
|
||||
return true;
|
||||
}
|
||||
} else if (valid && fi == YSF_FI_TERMINATOR) {
|
||||
if (m_rfState == RS_RF_REJECTED) {
|
||||
} else if (valid && (fi == YSF_FI_TERMINATOR)) {
|
||||
if (m_rfState == RPT_RF_STATE::REJECTED) {
|
||||
m_rfPayload.reset();
|
||||
m_rfSource = NULL;
|
||||
m_rfDest = NULL;
|
||||
m_rfState = RS_RF_LISTENING;
|
||||
} else if (m_rfState == RS_RF_AUDIO) {
|
||||
m_rfSource = nullptr;
|
||||
m_rfDest = nullptr;
|
||||
m_rfState = RPT_RF_STATE::LISTENING;
|
||||
} else if (m_rfState == RPT_RF_STATE::AUDIO) {
|
||||
m_rfPayload.processHeaderData(data + 2U);
|
||||
|
||||
CSync::addYSFSync(data + 2U);
|
||||
|
|
@ -334,7 +334,7 @@ bool CYSFControl::processVWData(bool valid, unsigned char *data)
|
|||
writeEndRF();
|
||||
}
|
||||
} else {
|
||||
if (m_rfState == RS_RF_AUDIO) {
|
||||
if (m_rfState == RPT_RF_STATE::AUDIO) {
|
||||
// If valid is false, update the m_lastFICH for this transmission
|
||||
if (!valid) {
|
||||
// XXX Check these values
|
||||
|
|
@ -395,7 +395,7 @@ bool CYSFControl::processDNData(bool valid, unsigned char *data)
|
|||
unsigned char dgid = m_lastFICH.getDGId();
|
||||
|
||||
if (valid && fi == YSF_FI_HEADER) {
|
||||
if (m_rfState == RS_RF_LISTENING) {
|
||||
if (m_rfState == RPT_RF_STATE::LISTENING) {
|
||||
bool valid = m_rfPayload.processHeaderData(data + 2U);
|
||||
if (!valid)
|
||||
return false;
|
||||
|
|
@ -422,7 +422,7 @@ bool CYSFControl::processDNData(bool valid, unsigned char *data)
|
|||
m_rfErrs = 0U;
|
||||
m_rfBits = 1U;
|
||||
m_rfTimeoutTimer.start();
|
||||
m_rfState = RS_RF_AUDIO;
|
||||
m_rfState = RPT_RF_STATE::AUDIO;
|
||||
|
||||
m_minRSSI = m_rssi;
|
||||
m_maxRSSI = m_rssi;
|
||||
|
|
@ -462,13 +462,13 @@ bool CYSFControl::processDNData(bool valid, unsigned char *data)
|
|||
|
||||
return true;
|
||||
}
|
||||
} else if (valid && fi == YSF_FI_TERMINATOR) {
|
||||
if (m_rfState == RS_RF_REJECTED) {
|
||||
} else if (valid && (fi == YSF_FI_TERMINATOR)) {
|
||||
if (m_rfState == RPT_RF_STATE::REJECTED) {
|
||||
m_rfPayload.reset();
|
||||
m_rfSource = NULL;
|
||||
m_rfDest = NULL;
|
||||
m_rfState = RS_RF_LISTENING;
|
||||
} else if (m_rfState == RS_RF_AUDIO) {
|
||||
m_rfSource = nullptr;
|
||||
m_rfDest = nullptr;
|
||||
m_rfState = RPT_RF_STATE::LISTENING;
|
||||
} else if (m_rfState == RPT_RF_STATE::AUDIO) {
|
||||
m_rfPayload.processHeaderData(data + 2U);
|
||||
|
||||
CSync::addYSFSync(data + 2U);
|
||||
|
|
@ -502,7 +502,7 @@ bool CYSFControl::processDNData(bool valid, unsigned char *data)
|
|||
writeEndRF();
|
||||
}
|
||||
} else {
|
||||
if (m_rfState == RS_RF_AUDIO) {
|
||||
if (m_rfState == RPT_RF_STATE::AUDIO) {
|
||||
// If valid is false, update the m_lastFICH for this transmission
|
||||
if (!valid) {
|
||||
unsigned char ft = m_lastFICH.getFT();
|
||||
|
|
@ -565,7 +565,7 @@ bool CYSFControl::processDNData(bool valid, unsigned char *data)
|
|||
writeJSONRSSI();
|
||||
|
||||
return true;
|
||||
} else if (valid && m_rfState == RS_RF_LISTENING) {
|
||||
} else if (valid && (m_rfState == RPT_RF_STATE::LISTENING)) {
|
||||
// Only use clean frames for late entry.
|
||||
unsigned char fn = m_lastFICH.getFN();
|
||||
unsigned char dt = m_lastFICH.getDT();
|
||||
|
|
@ -595,7 +595,7 @@ bool CYSFControl::processDNData(bool valid, unsigned char *data)
|
|||
|
||||
m_rfSource = m_rfPayload.getSource();
|
||||
|
||||
if (m_rfSource == NULL || m_rfDest == NULL)
|
||||
if (m_rfSource == nullptr || m_rfDest == nullptr)
|
||||
return false;
|
||||
|
||||
if (m_selfOnly) {
|
||||
|
|
@ -612,7 +612,7 @@ bool CYSFControl::processDNData(bool valid, unsigned char *data)
|
|||
m_rfErrs = 0U;
|
||||
m_rfBits = 1U;
|
||||
m_rfTimeoutTimer.start();
|
||||
m_rfState = RS_RF_AUDIO;
|
||||
m_rfState = RPT_RF_STATE::AUDIO;
|
||||
|
||||
m_minRSSI = m_rssi;
|
||||
m_maxRSSI = m_rssi;
|
||||
|
|
@ -696,7 +696,7 @@ bool CYSFControl::processFRData(bool valid, unsigned char *data)
|
|||
unsigned char dgid = m_lastFICH.getDGId();
|
||||
|
||||
if (valid && fi == YSF_FI_HEADER) {
|
||||
if (m_rfState == RS_RF_LISTENING) {
|
||||
if (m_rfState == RPT_RF_STATE::LISTENING) {
|
||||
valid = m_rfPayload.processHeaderData(data + 2U);
|
||||
if (!valid)
|
||||
return false;
|
||||
|
|
@ -720,7 +720,7 @@ bool CYSFControl::processFRData(bool valid, unsigned char *data)
|
|||
m_rfDest = m_rfPayload.getDest();
|
||||
|
||||
m_rfFrames = 0U;
|
||||
m_rfState = RS_RF_DATA;
|
||||
m_rfState = RPT_RF_STATE::DATA;
|
||||
|
||||
m_minRSSI = m_rssi;
|
||||
m_maxRSSI = m_rssi;
|
||||
|
|
@ -761,12 +761,12 @@ bool CYSFControl::processFRData(bool valid, unsigned char *data)
|
|||
return true;
|
||||
}
|
||||
} else if (valid && fi == YSF_FI_TERMINATOR) {
|
||||
if (m_rfState == RS_RF_REJECTED) {
|
||||
if (m_rfState == RPT_RF_STATE::REJECTED) {
|
||||
m_rfPayload.reset();
|
||||
m_rfSource = NULL;
|
||||
m_rfDest = NULL;
|
||||
m_rfState = RS_RF_LISTENING;
|
||||
} else if (m_rfState == RS_RF_DATA) {
|
||||
m_rfSource = nullptr;
|
||||
m_rfDest = nullptr;
|
||||
m_rfState = RPT_RF_STATE::LISTENING;
|
||||
} else if (m_rfState == RPT_RF_STATE::DATA) {
|
||||
m_rfPayload.processHeaderData(data + 2U);
|
||||
|
||||
CSync::addYSFSync(data + 2U);
|
||||
|
|
@ -800,7 +800,7 @@ bool CYSFControl::processFRData(bool valid, unsigned char *data)
|
|||
writeEndRF();
|
||||
}
|
||||
} else {
|
||||
if (m_rfState == RS_RF_DATA) {
|
||||
if (m_rfState == RPT_RF_STATE::DATA) {
|
||||
// If valid is false, update the m_lastFICH for this transmission
|
||||
if (!valid) {
|
||||
unsigned char ft = m_lastFICH.getFT();
|
||||
|
|
@ -847,7 +847,7 @@ bool CYSFControl::processFRData(bool valid, unsigned char *data)
|
|||
|
||||
unsigned int CYSFControl::readModem(unsigned char* data)
|
||||
{
|
||||
assert(data != NULL);
|
||||
assert(data != nullptr);
|
||||
|
||||
if (m_queue.isEmpty())
|
||||
return 0U;
|
||||
|
|
@ -862,14 +862,14 @@ unsigned int CYSFControl::readModem(unsigned char* data)
|
|||
|
||||
void CYSFControl::writeEndRF()
|
||||
{
|
||||
m_rfState = RS_RF_LISTENING;
|
||||
m_rfState = RPT_RF_STATE::LISTENING;
|
||||
|
||||
m_rfTimeoutTimer.stop();
|
||||
m_rfPayload.reset();
|
||||
|
||||
// These variables are free'd by YSFPayload
|
||||
m_rfSource = NULL;
|
||||
m_rfDest = NULL;
|
||||
m_rfSource = nullptr;
|
||||
m_rfDest = nullptr;
|
||||
|
||||
if (m_netState == RS_NET_IDLE) {
|
||||
if (m_network != NULL)
|
||||
|
|
@ -879,7 +879,7 @@ void CYSFControl::writeEndRF()
|
|||
|
||||
void CYSFControl::writeEndNet()
|
||||
{
|
||||
m_netState = RS_NET_IDLE;
|
||||
m_netState = RPT_NET_STATE::IDLE;
|
||||
|
||||
m_netTimeoutTimer.stop();
|
||||
m_networkWatchdog.stop();
|
||||
|
|
@ -901,7 +901,7 @@ void CYSFControl::writeNetwork()
|
|||
if (!m_enabled)
|
||||
return;
|
||||
|
||||
if (m_rfState != RS_RF_LISTENING && m_netState == RS_NET_IDLE)
|
||||
if ((m_rfState != RPT_RF_STATE::LISTENING) && (m_netState == RPT_NET_STATE::IDLE))
|
||||
return;
|
||||
|
||||
m_networkWatchdog.start();
|
||||
|
|
@ -934,7 +934,7 @@ void CYSFControl::writeNetwork()
|
|||
m_netPayload.reset();
|
||||
m_packetTimer.start();
|
||||
m_elapsed.start();
|
||||
m_netState = RS_NET_AUDIO;
|
||||
m_netState = RPT_NET_STATE::AUDIO;
|
||||
m_netFrames = 0U;
|
||||
m_netLost = 0U;
|
||||
m_netBits = 1U;
|
||||
|
|
@ -1047,13 +1047,13 @@ void CYSFControl::writeNetwork()
|
|||
|
||||
void CYSFControl::clock(unsigned int ms)
|
||||
{
|
||||
if (m_network != NULL)
|
||||
if (m_network != nullptr)
|
||||
writeNetwork();
|
||||
|
||||
m_rfTimeoutTimer.clock(ms);
|
||||
m_netTimeoutTimer.clock(ms);
|
||||
|
||||
if (m_netState == RS_NET_AUDIO) {
|
||||
if (m_netState == RPT_NET_STATE::AUDIO) {
|
||||
m_networkWatchdog.clock(ms);
|
||||
|
||||
if (m_networkWatchdog.hasExpired()) {
|
||||
|
|
@ -1066,9 +1066,9 @@ void CYSFControl::clock(unsigned int ms)
|
|||
|
||||
void CYSFControl::writeQueueRF(const unsigned char *data)
|
||||
{
|
||||
assert(data != NULL);
|
||||
assert(data != nullptr);
|
||||
|
||||
if (m_netState != RS_NET_IDLE)
|
||||
if (m_netState != RPT_NET_STATE::IDLE)
|
||||
return;
|
||||
|
||||
if (m_rfTimeoutTimer.isRunning() && m_rfTimeoutTimer.hasExpired())
|
||||
|
|
@ -1089,7 +1089,7 @@ void CYSFControl::writeQueueRF(const unsigned char *data)
|
|||
|
||||
void CYSFControl::writeQueueNet(const unsigned char *data)
|
||||
{
|
||||
assert(data != NULL);
|
||||
assert(data != nullptr);
|
||||
|
||||
if (m_netTimeoutTimer.isRunning() && m_netTimeoutTimer.hasExpired())
|
||||
return;
|
||||
|
|
@ -1109,9 +1109,9 @@ void CYSFControl::writeQueueNet(const unsigned char *data)
|
|||
|
||||
void CYSFControl::writeNetwork(const unsigned char *data, unsigned int count)
|
||||
{
|
||||
assert(data != NULL);
|
||||
assert(data != nullptr);
|
||||
|
||||
if (m_network == NULL)
|
||||
if (m_network == nullptr)
|
||||
return;
|
||||
|
||||
if (m_rfTimeoutTimer.isRunning() && m_rfTimeoutTimer.hasExpired())
|
||||
|
|
@ -1127,18 +1127,18 @@ bool CYSFControl::checkCallsign(const unsigned char* callsign) const
|
|||
|
||||
void CYSFControl::processNetCallsigns(const unsigned char* data, unsigned char dgid)
|
||||
{
|
||||
assert(data != NULL);
|
||||
assert(data != nullptr);
|
||||
|
||||
if (::memcmp(m_netSource, " ", 10U) == 0 || ::memcmp(m_netDest, " ", 10U) == 0) {
|
||||
if (::memcmp(m_netSource, " ", YSF_CALLSIGN_LENGTH) == 0) {
|
||||
unsigned char* source = m_netPayload.getSource();
|
||||
if (source != NULL)
|
||||
if (source != nullptr)
|
||||
::memcpy(m_netSource, source, YSF_CALLSIGN_LENGTH);
|
||||
}
|
||||
|
||||
if (::memcmp(m_netDest, " ", YSF_CALLSIGN_LENGTH) == 0) {
|
||||
unsigned char* dest = m_netPayload.getDest();
|
||||
if (dest != NULL)
|
||||
if (dest != nullptr)
|
||||
::memcpy(m_netDest, dest, YSF_CALLSIGN_LENGTH);
|
||||
}
|
||||
|
||||
|
|
@ -1151,7 +1151,7 @@ void CYSFControl::processNetCallsigns(const unsigned char* data, unsigned char d
|
|||
|
||||
bool CYSFControl::isBusy() const
|
||||
{
|
||||
return m_rfState != RS_RF_LISTENING || m_netState != RS_NET_IDLE;
|
||||
return (m_rfState != RPT_RF_STATE::LISTENING) || (m_netState != RPT_NET_STATE::IDLE);
|
||||
}
|
||||
|
||||
void CYSFControl::enable(bool enabled)
|
||||
|
|
@ -1160,17 +1160,17 @@ void CYSFControl::enable(bool enabled)
|
|||
m_queue.clear();
|
||||
|
||||
// Reset the RF section
|
||||
m_rfState = RS_RF_LISTENING;
|
||||
m_rfState = RPT_RF_STATE::LISTENING;
|
||||
|
||||
m_rfTimeoutTimer.stop();
|
||||
m_rfPayload.reset();
|
||||
|
||||
// These variables are free'd by YSFPayload
|
||||
m_rfSource = NULL;
|
||||
m_rfDest = NULL;
|
||||
m_rfSource = nullptr;
|
||||
m_rfDest = nullptr;
|
||||
|
||||
// Reset the networking section
|
||||
m_netState = RS_NET_IDLE;
|
||||
m_netState = RPT_NET_STATE::IDLE;
|
||||
|
||||
m_netTimeoutTimer.stop();
|
||||
m_networkWatchdog.stop();
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
10
YSFFICH.cpp
10
YSFFICH.cpp
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (C) 2016,2017,2019,2020,2021,2023 by Jonathan Naylor G4KLX
|
||||
* Copyright (C) 2016,2017,2019,2020,2021,2023,2025 by Jonathan Naylor G4KLX
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
|
|
@ -57,7 +57,7 @@ const unsigned int INTERLEAVE_TABLE[] = {
|
|||
38U, 78U, 118U, 158U, 198U};
|
||||
|
||||
CYSFFICH::CYSFFICH(const CYSFFICH& fich) :
|
||||
m_fich(NULL)
|
||||
m_fich(nullptr)
|
||||
{
|
||||
m_fich = new unsigned char[6U];
|
||||
|
||||
|
|
@ -65,7 +65,7 @@ m_fich(NULL)
|
|||
}
|
||||
|
||||
CYSFFICH::CYSFFICH() :
|
||||
m_fich(NULL)
|
||||
m_fich(nullptr)
|
||||
{
|
||||
m_fich = new unsigned char[6U];
|
||||
|
||||
|
|
@ -79,7 +79,7 @@ CYSFFICH::~CYSFFICH()
|
|||
|
||||
bool CYSFFICH::decode(const unsigned char* bytes)
|
||||
{
|
||||
assert(bytes != NULL);
|
||||
assert(bytes != nullptr);
|
||||
|
||||
// Skip the sync bytes
|
||||
bytes += YSF_SYNC_LENGTH_BYTES;
|
||||
|
|
@ -122,7 +122,7 @@ bool CYSFFICH::decode(const unsigned char* bytes)
|
|||
|
||||
void CYSFFICH::encode(unsigned char* bytes)
|
||||
{
|
||||
assert(bytes != NULL);
|
||||
assert(bytes != nullptr);
|
||||
|
||||
// Skip the sync bytes
|
||||
bytes += YSF_SYNC_LENGTH_BYTES;
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue