Make the compilation of M17 conditional.

This commit is contained in:
Jonathan Naylor 2023-06-29 18:15:33 +01:00
parent 7724be0fd7
commit 72152cc82b
22 changed files with 339 additions and 83 deletions

View file

@ -45,7 +45,9 @@ enum SECTION {
SECTION_FUSION,
SECTION_P25,
SECTION_NXDN,
#if defined(USE_M17)
SECTION_M17,
#endif
#if defined(USE_POCSAG)
SECTION_POCSAG,
#endif
@ -62,7 +64,9 @@ enum SECTION {
SECTION_FUSION_NETWORK,
SECTION_P25_NETWORK,
SECTION_NXDN_NETWORK,
#if defined(USE_M17)
SECTION_M17_NETWORK,
#endif
#if defined(USE_POCSAG)
SECTION_POCSAG_NETWORK,
#endif
@ -196,11 +200,13 @@ m_nxdnSelfOnly(false),
m_nxdnRemoteGateway(false),
m_nxdnTXHang(5U),
m_nxdnModeHang(10U),
#if defined(USE_M17)
m_m17Enabled(false),
m_m17CAN(0U),
m_m17SelfOnly(false),
m_m17AllowEncryption(false),
m_m17TXHang(5U),
#endif
m_m17ModeHang(10U),
#if defined(USE_POCSAG)
m_pocsagEnabled(false),
@ -301,13 +307,17 @@ m_nxdnLocalAddress(),
m_nxdnLocalPort(0U),
m_nxdnNetworkModeHang(3U),
m_nxdnNetworkDebug(false),
#if defined(USE_M17)
m_m17NetworkEnabled(false),
m_m17GatewayAddress(),
m_m17GatewayPort(0U),
m_m17LocalAddress(),
m_m17LocalPort(0U),
#endif
m_m17NetworkModeHang(3U),
#if defined(USE_M17)
m_m17NetworkDebug(false),
#endif
#if defined(USE_POCSAG)
m_pocsagNetworkEnabled(false),
m_pocsagGatewayAddress(),
@ -395,8 +405,10 @@ bool CConf::read()
section = SECTION_P25;
else if (::strncmp(buffer, "[NXDN]", 6U) == 0)
section = SECTION_NXDN;
#if defined(USE_M17)
else if (::strncmp(buffer, "[M17]", 5U) == 0)
section = SECTION_M17;
#endif
#if defined(USE_POCSAG)
else if (::strncmp(buffer, "[POCSAG]", 8U) == 0)
section = SECTION_POCSAG;
@ -421,8 +433,10 @@ bool CConf::read()
section = SECTION_P25_NETWORK;
else if (::strncmp(buffer, "[NXDN Network]", 14U) == 0)
section = SECTION_NXDN_NETWORK;
#if defined(USE_M17)
else if (::strncmp(buffer, "[M17 Network]", 13U) == 0)
section = SECTION_M17_NETWORK;
#endif
#if defined(USE_POCSAG)
else if (::strncmp(buffer, "[POCSAG Network]", 16U) == 0)
section = SECTION_POCSAG_NETWORK;
@ -600,8 +614,10 @@ bool CConf::read()
m_modemP25TXLevel = float(::atof(value));
else if (::strcmp(key, "NXDNTXLevel") == 0)
m_modemNXDNTXLevel = float(::atof(value));
#if defined(USE_M17)
else if (::strcmp(key, "M17TXLevel") == 0)
m_modemM17TXLevel = float(::atof(value));
#endif
#if defined(USE_POCSAG)
else if (::strcmp(key, "POCSAGTXLevel") == 0)
m_modemPOCSAGTXLevel = float(::atof(value));
@ -813,6 +829,7 @@ bool CConf::read()
m_nxdnTXHang = (unsigned int)::atoi(value);
else if (::strcmp(key, "ModeHang") == 0)
m_nxdnModeHang = (unsigned int)::atoi(value);
#if defined(USE_M17)
} else if (section == SECTION_M17) {
if (::strcmp(key, "Enable") == 0)
m_m17Enabled = ::atoi(value) == 1;
@ -826,6 +843,7 @@ bool CConf::read()
m_m17TXHang = (unsigned int)::atoi(value);
else if (::strcmp(key, "ModeHang") == 0)
m_m17ModeHang = (unsigned int)::atoi(value);
#endif
#if defined(USE_POCSAG)
} else if (section == SECTION_POCSAG) {
if (::strcmp(key, "Enable") == 0)
@ -1019,6 +1037,7 @@ bool CConf::read()
m_nxdnNetworkModeHang = (unsigned int)::atoi(value);
else if (::strcmp(key, "Debug") == 0)
m_nxdnNetworkDebug = ::atoi(value) == 1;
#if defined(USE_M17)
} else if (section == SECTION_M17_NETWORK) {
if (::strcmp(key, "Enable") == 0)
m_m17NetworkEnabled = ::atoi(value) == 1;
@ -1034,6 +1053,7 @@ bool CConf::read()
m_m17NetworkModeHang = (unsigned int)::atoi(value);
else if (::strcmp(key, "Debug") == 0)
m_m17NetworkDebug = ::atoi(value) == 1;
#endif
#if defined(USE_POCSAG)
} else if (section == SECTION_POCSAG_NETWORK) {
if (::strcmp(key, "Enable") == 0)
@ -1372,10 +1392,12 @@ float CConf::getModemNXDNTXLevel() const
return m_modemNXDNTXLevel;
}
#if defined(USE_M17)
float CConf::getModemM17TXLevel() const
{
return m_modemM17TXLevel;
}
#endif
#if defined(USE_POCSAG)
float CConf::getModemPOCSAGTXLevel() const
@ -1695,6 +1717,7 @@ unsigned int CConf::getNXDNModeHang() const
return m_nxdnModeHang;
}
#if defined(USE_M17)
bool CConf::getM17Enabled() const
{
return m_m17Enabled;
@ -1724,6 +1747,7 @@ unsigned int CConf::getM17ModeHang() const
{
return m_m17ModeHang;
}
#endif
#if defined(USE_POCSAG)
bool CConf::getPOCSAGEnabled() const
@ -2148,6 +2172,7 @@ bool CConf::getNXDNNetworkDebug() const
return m_nxdnNetworkDebug;
}
#if defined(USE_M17)
bool CConf::getM17NetworkEnabled() const
{
return m_m17NetworkEnabled;
@ -2182,6 +2207,7 @@ bool CConf::getM17NetworkDebug() const
{
return m_m17NetworkDebug;
}
#endif
#if defined(USE_POCSAG)
bool CConf::getPOCSAGNetworkEnabled() const

12
Conf.h
View file

@ -100,7 +100,9 @@ public:
float getModemYSFTXLevel() const;
float getModemP25TXLevel() const;
float getModemNXDNTXLevel() const;
#if defined(USE_M17)
float getModemM17TXLevel() const;
#endif
#if defined(USE_POCSAG)
float getModemPOCSAGTXLevel() const;
#endif
@ -184,6 +186,7 @@ public:
unsigned int getNXDNTXHang() const;
unsigned int getNXDNModeHang() const;
#if defined(USE_M17)
// The M17 section
bool getM17Enabled() const;
unsigned int getM17CAN() const;
@ -191,6 +194,7 @@ public:
bool getM17AllowEncryption() const;
unsigned int getM17TXHang() const;
unsigned int getM17ModeHang() const;
#endif
#if defined(USE_POCSAG)
// The POCSAG section
@ -299,6 +303,7 @@ public:
unsigned int getNXDNNetworkModeHang() const;
bool getNXDNNetworkDebug() const;
#if defined(USE_M17)
// The M17 Network section
bool getM17NetworkEnabled() const;
std::string getM17GatewayAddress() const;
@ -307,6 +312,7 @@ public:
unsigned short getM17LocalPort() const;
unsigned int getM17NetworkModeHang() const;
bool getM17NetworkDebug() const;
#endif
#if defined(USE_POCSAG)
// The POCSAG Network section
@ -484,11 +490,13 @@ private:
unsigned int m_nxdnTXHang;
unsigned int m_nxdnModeHang;
#if defined(USE_M17)
bool m_m17Enabled;
unsigned int m_m17CAN;
bool m_m17SelfOnly;
bool m_m17AllowEncryption;
unsigned int m_m17TXHang;
#endif
unsigned int m_m17ModeHang;
#if defined(USE_POCSAG)
@ -598,13 +606,17 @@ private:
unsigned int m_nxdnNetworkModeHang;
bool m_nxdnNetworkDebug;
#if defined(USE_M17)
bool m_m17NetworkEnabled;
std::string m_m17GatewayAddress;
unsigned short m_m17GatewayPort;
std::string m_m17LocalAddress;
unsigned short m_m17LocalPort;
#endif
unsigned int m_m17NetworkModeHang;
#if defined(USE_M17)
bool m_m17NetworkDebug;
#endif
#if defined(USE_POCSAG)
bool m_pocsagNetworkEnabled;

View file

@ -1,5 +1,5 @@
/*
* Copyright (C) 2020,2021 by Jonathan Naylor G4KLX
* Copyright (C) 2020,2021,2023 by Jonathan Naylor G4KLX
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@ -18,6 +18,8 @@
#include "M17CRC.h"
#if defined(USE_M17)
#include <cstdio>
#include <cassert>
@ -82,3 +84,6 @@ uint16_t CM17CRC::createCRC16(const unsigned char* in, unsigned int nBytes)
return crc;
}
#endif

View file

@ -1,5 +1,5 @@
/*
* Copyright (C) 2020,2021 by Jonathan Naylor G4KLX
* Copyright (C) 2020,2021,2023 by Jonathan Naylor G4KLX
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@ -19,6 +19,10 @@
#if !defined(M17CRC_H)
#define M17CRC_H
#include "Defines.h"
#if defined(USE_M17)
#include <cstdint>
class CM17CRC
@ -32,3 +36,6 @@ private:
};
#endif
#endif

View file

@ -20,6 +20,8 @@
#include "Sync.h"
#include "Log.h"
#if defined(USE_M17)
#include <cstdio>
#include <cassert>
#include <cstring>
@ -53,8 +55,6 @@ const unsigned char SCRAMBLER[] = {
const unsigned int RSSI_COUNT = 28U; // 28 * 40ms = 1120ms
const unsigned int BER_COUNT = 28U * 272U; // 28 * 40ms = 1120ms
// #define DUMP_M17
const unsigned char BIT_MASK_TABLE[] = { 0x80U, 0x40U, 0x20U, 0x10U, 0x08U, 0x04U, 0x02U, 0x01U };
#define WRITE_BIT(p,i,b) p[(i)>>3] = (b) ? (p[(i)>>3] | BIT_MASK_TABLE[(i)&7]) : (p[(i)>>3] & ~BIT_MASK_TABLE[(i)&7])
@ -102,8 +102,7 @@ m_rssiAccum(0U),
m_rssiCount(0U),
m_bitsCount(0U),
m_bitErrsAccum(0U),
m_enabled(true),
m_fp(NULL)
m_enabled(true)
{
assert(rssiMapper != NULL);
@ -227,9 +226,7 @@ bool CM17Control::writeModem(unsigned char* data, unsigned int len)
m_rfLSFCount = 0U;
m_rfTextBits = 0x00U;
::memset(m_rfText, 0x00U, 4U * M17_META_LENGTH_BYTES);
#if defined(DUMP_M17)
openFile();
#endif
return true;
} else {
m_rfState = RS_RF_LATE_ENTRY;
@ -290,9 +287,7 @@ bool CM17Control::writeModem(unsigned char* data, unsigned int len)
m_rfLSFCount = 0U;
m_rfTextBits = 0x00U;
::memset(m_rfText, 0x00U, 4U * M17_META_LENGTH_BYTES);
#if defined(DUMP_M17)
openFile();
#endif
// Fall through
} else {
return false;
@ -300,9 +295,6 @@ bool CM17Control::writeModem(unsigned char* data, unsigned int len)
}
if ((m_rfState == RS_RF_AUDIO || m_rfState == RS_RF_DATA_AUDIO) && data[0U] == TAG_DATA) {
#if defined(DUMP_M17)
writeFile(data + 2U);
#endif
// Keep looking at the running LSF in case of changed META field data
unsigned int lich1, lich2, lich3, lich4;
bool valid1 = CGolay24128::decode24128(data + 2U + M17_SYNC_LENGTH_BYTES + 0U, lich1);
@ -453,9 +445,6 @@ bool CM17Control::writeModem(unsigned char* data, unsigned int len)
}
if ((m_rfState == RS_RF_AUDIO || m_rfState == RS_RF_DATA_AUDIO) && data[0U] == TAG_EOT) {
#if defined(DUMP_M17)
writeFile(data + 2U);
#endif
if (m_duplex) {
unsigned char rfData[M17_FRAME_LENGTH_BYTES + 2U];
@ -542,10 +531,6 @@ void CM17Control::writeEndRF()
if (m_network != NULL)
m_network->reset();
}
#if defined(DUMP_M17)
closeFile();
#endif
}
void CM17Control::writeEndNet()
@ -960,46 +945,6 @@ bool CM17Control::checkCallsign(const std::string& callsign) const
return m_callsign.compare(0U, len, callsign, 0U, len) == 0;
}
bool CM17Control::openFile()
{
if (m_fp != NULL)
return true;
time_t t;
::time(&t);
struct tm* tm = ::localtime(&t);
char name[100U];
::sprintf(name, "M17_%04d%02d%02d_%02d%02d%02d.ambe", tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec);
m_fp = ::fopen(name, "wb");
if (m_fp == NULL)
return false;
::fwrite("M17", 1U, 3U, m_fp);
return true;
}
bool CM17Control::writeFile(const unsigned char* data)
{
if (m_fp == NULL)
return false;
::fwrite(data, 1U, M17_FRAME_LENGTH_BYTES, m_fp);
return true;
}
void CM17Control::closeFile()
{
if (m_fp != NULL) {
::fclose(m_fp);
m_fp = NULL;
}
}
bool CM17Control::isBusy() const
{
return m_rfState != RS_RF_LISTENING || m_netState != RS_NET_IDLE;
@ -1224,3 +1169,5 @@ void CM17Control::writeJSONNet(nlohmann::json& json, const char* action, RPT_NET
}
}
#endif

View file

@ -29,6 +29,8 @@
#include "Timer.h"
#include "Modem.h"
#if defined(USE_M17)
#include <string>
#include <nlohmann/json.hpp>
@ -91,7 +93,6 @@ private:
unsigned int m_bitsCount;
unsigned int m_bitErrsAccum;
bool m_enabled;
FILE* m_fp;
bool processRFHeader(bool lateEntry);
@ -127,10 +128,9 @@ private:
void writeJSONRF(nlohmann::json& json, const char* action, float duration, float ber);
void writeJSONNet(nlohmann::json& json, const char* action);
void writeJSONNet(nlohmann::json& json, const char* action, RPT_NET_STATE state, const std::string& source, const std::string& dest);
bool openFile();
bool writeFile(const unsigned char* data);
void closeFile();
};
#endif
#endif

View file

@ -1,5 +1,5 @@
/*
* Copyright (C) 2020,2021 by Jonathan Naylor G4KLX
* Copyright (C) 2020,2021,2023 by Jonathan Naylor G4KLX
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@ -18,6 +18,8 @@
#include "M17Convolution.h"
#if defined(USE_M17)
#include <cstdio>
#include <cassert>
#include <cstring>
@ -281,3 +283,6 @@ void CM17Convolution::encode(const unsigned char* in, unsigned char* out, unsign
k++;
}
}
#endif

View file

@ -1,5 +1,5 @@
/*
* Copyright (C) 2020,2021 by Jonathan Naylor G4KLX
* Copyright (C) 2020,2021,2023 by Jonathan Naylor G4KLX
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@ -19,6 +19,10 @@
#if !defined(M17Convolution_H)
#define M17Convolution_H
#include "Defines.h"
#if defined(USE_M17)
#include <cstdint>
class CM17Convolution {
@ -49,3 +53,6 @@ private:
};
#endif
#endif

View file

@ -1,5 +1,5 @@
/*
* Copyright (C) 2020,2021 by Jonathan Naylor G4KLX
* Copyright (C) 2020,2021,2023 by Jonathan Naylor G4KLX
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@ -21,6 +21,8 @@
#include "M17Defines.h"
#include "M17CRC.h"
#if defined(USE_M17)
#include <cassert>
#include <cstring>
@ -216,3 +218,6 @@ CM17LSF& CM17LSF::operator=(const CM17LSF& lsf)
return *this;
}
#endif

View file

@ -1,5 +1,5 @@
/*
* Copyright (C) 2020,2021 by Jonathan Naylor G4KLX
* Copyright (C) 2020,2021,2023 by Jonathan Naylor G4KLX
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@ -19,6 +19,10 @@
#if !defined(M17LSF_H)
#define M17LSF_H
#include "Defines.h"
#if defined(USE_M17)
#include <string>
class CM17LSF {
@ -71,3 +75,6 @@ private:
};
#endif
#endif

View file

@ -1,5 +1,5 @@
/*
* Copyright (C) 2020,2021 by Jonathan Naylor G4KLX
* Copyright (C) 2020,2021,2023 by Jonathan Naylor G4KLX
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@ -19,10 +19,11 @@
#include "M17Network.h"
#include "M17Defines.h"
#include "M17Utils.h"
#include "Defines.h"
#include "Utils.h"
#include "Log.h"
#if defined(USE_M17)
#include <cstdio>
#include <cassert>
#include <cstring>
@ -213,3 +214,6 @@ void CM17Network::sendPing()
m_socket.write(buffer, 4U, m_addr, m_addrLen);
}
#endif

View file

@ -1,5 +1,5 @@
/*
* Copyright (C) 2020,2021 by Jonathan Naylor G4KLX
* Copyright (C) 2020,2021,2023 by Jonathan Naylor G4KLX
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@ -22,8 +22,11 @@
#include "M17Defines.h"
#include "RingBuffer.h"
#include "UDPSocket.h"
#include "Defines.h"
#include "Timer.h"
#if defined(USE_M17)
#include <random>
#include <cstdint>
@ -64,3 +67,6 @@ private:
};
#endif
#endif

View file

@ -1,5 +1,5 @@
/*
* Copyright (C) 2020,2021 by Jonathan Naylor G4KLX
* Copyright (C) 2020,2021,2023 by Jonathan Naylor G4KLX
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@ -19,6 +19,8 @@
#include "M17Utils.h"
#include "M17Defines.h"
#if defined(USE_M17)
#include <cassert>
const std::string M17_CHARS = " ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-/.";
@ -224,3 +226,6 @@ void CM17Utils::combineFragmentLICHFEC(unsigned int frag1, unsigned int frag2, u
WRITE_BIT1(data, offset, b);
}
}
#endif

View file

@ -1,5 +1,5 @@
/*
* Copyright (C) 2020 by Jonathan Naylor G4KLX
* Copyright (C) 2020,2023 by Jonathan Naylor G4KLX
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@ -19,6 +19,10 @@
#if !defined(M17Utils_H)
#define M17Utils_H
#include "Defines.h"
#if defined(USE_M17)
#include <string>
class CM17Utils {
@ -39,3 +43,6 @@ private:
};
#endif
#endif

View file

@ -153,7 +153,9 @@ m_dmr(NULL),
m_ysf(NULL),
m_p25(NULL),
m_nxdn(NULL),
#if defined(USE_M17)
m_m17(NULL),
#endif
#if defined(USE_POCSAG)
m_pocsag(NULL),
#endif
@ -170,7 +172,9 @@ m_dmrNetwork(NULL),
m_ysfNetwork(NULL),
m_p25Network(NULL),
m_nxdnNetwork(NULL),
#if defined(USE_M17)
m_m17Network(NULL),
#endif
#if defined(USE_POCSAG)
m_pocsagNetwork(NULL),
#endif
@ -188,7 +192,9 @@ m_dmrRFModeHang(10U),
m_ysfRFModeHang(10U),
m_p25RFModeHang(10U),
m_nxdnRFModeHang(10U),
#if defined(USE_M17)
m_m17RFModeHang(10U),
#endif
#if defined(USE_FM)
m_fmRFModeHang(10U),
#endif
@ -199,7 +205,9 @@ m_dmrNetModeHang(3U),
m_ysfNetModeHang(3U),
m_p25NetModeHang(3U),
m_nxdnNetModeHang(3U),
#if defined(USE_M17)
m_m17NetModeHang(3U),
#endif
#if defined(USE_POCSAG)
m_pocsagNetModeHang(3U),
#endif
@ -369,10 +377,12 @@ int CMMDVMHost::run()
m_nxdnEnabled = false;
}
#if defined(USE_M17)
if (m_m17Enabled && !m_modem->hasM17()) {
LogWarning("M17 enabled in the host but not in the modem firmware, disabling");
m_m17Enabled = false;
}
#endif
#if defined(USE_FM)
if (m_fmEnabled && !m_modem->hasFM()) {
@ -430,11 +440,13 @@ int CMMDVMHost::run()
return 1;
}
#if defined(USE_M17)
if (m_m17Enabled && m_conf.getM17NetworkEnabled()) {
ret = createM17Network();
if (!ret)
return 1;
}
#endif
#if defined(USE_POCSAG)
if (m_pocsagEnabled && m_conf.getPOCSAGNetworkEnabled()) {
@ -745,6 +757,7 @@ int CMMDVMHost::run()
m_nxdn = new CNXDNControl(ran, id, selfOnly, m_nxdnNetwork, m_timeout, m_duplex, remoteGateway, m_nxdnLookup, rssi);
}
#if defined(USE_M17)
if (m_m17Enabled) {
bool selfOnly = m_conf.getM17SelfOnly();
unsigned int can = m_conf.getM17CAN();
@ -761,6 +774,7 @@ int CMMDVMHost::run()
m_m17 = new CM17Control(m_callsign, can, selfOnly, allowEncryption, m_m17Network, m_timeout, m_duplex, rssi);
}
#endif
#if defined(USE_POCSAG)
CTimer pocsagTimer(1000U, 30U);
@ -980,6 +994,7 @@ int CMMDVMHost::run()
}
}
#if defined(USE_M17)
len = m_modem->readM17Data(data);
if (m_m17 != NULL && len > 0U) {
if (m_mode == MODE_IDLE) {
@ -996,6 +1011,7 @@ int CMMDVMHost::run()
LogWarning("M17 modem data received when in mode %u", m_mode);
}
}
#endif
#if defined(USE_FM)
len = m_modem->readFMData(data);
@ -1160,6 +1176,7 @@ int CMMDVMHost::run()
}
}
#if defined(USE_M17)
if (m_m17 != NULL) {
ret = m_modem->hasM17Space();
if (ret) {
@ -1178,6 +1195,7 @@ int CMMDVMHost::run()
}
}
}
#endif
#if defined(USE_POCSAG)
if (m_pocsag != NULL) {
@ -1280,8 +1298,10 @@ int CMMDVMHost::run()
m_p25->clock(ms);
if (m_nxdn != NULL)
m_nxdn->clock(ms);
#if defined(USE_M17)
if (m_m17 != NULL)
m_m17->clock(ms);
#endif
#if defined(USE_POCSAG)
if (m_pocsag != NULL)
m_pocsag->clock(ms);
@ -1303,8 +1323,10 @@ int CMMDVMHost::run()
m_p25Network->clock(ms);
if (m_nxdnNetwork != NULL)
m_nxdnNetwork->clock(ms);
#if defined(USE_M17)
if (m_m17Network != NULL)
m_m17Network->clock(ms);
#endif
#if defined(USE_POCSAG)
if (m_pocsagNetwork != NULL)
m_pocsagNetwork->clock(ms);
@ -1421,10 +1443,12 @@ int CMMDVMHost::run()
delete m_nxdnNetwork;
}
#if defined(USE_M17)
if (m_m17Network != NULL) {
m_m17Network->close();
delete m_m17Network;
}
#endif
#if defined(USE_POCSAG)
if (m_pocsagNetwork != NULL) {
@ -1464,7 +1488,9 @@ int CMMDVMHost::run()
delete m_ysf;
delete m_p25;
delete m_nxdn;
#if defined(USE_M17)
delete m_m17;
#endif
#if defined(USE_POCSAG)
delete m_pocsag;
#endif
@ -1516,7 +1542,11 @@ bool CMMDVMHost::createModem()
float ysfTXLevel = m_conf.getModemYSFTXLevel();
float p25TXLevel = m_conf.getModemP25TXLevel();
float nxdnTXLevel = m_conf.getModemNXDNTXLevel();
#if defined(USE_M17)
float m17TXLevel = m_conf.getModemM17TXLevel();
#else
float m17TXLevel = 0.0F;
#endif
#if defined(USE_POCSAG)
float pocsagTXLevel = m_conf.getModemPOCSAGTXLevel();
#else
@ -1539,7 +1569,9 @@ bool CMMDVMHost::createModem()
unsigned int ysfTXHang = m_conf.getFusionTXHang();
unsigned int p25TXHang = m_conf.getP25TXHang();
unsigned int nxdnTXHang = m_conf.getNXDNTXHang();
#if defined(USE_M17)
unsigned int m17TXHang = m_conf.getM17TXHang();
#endif
unsigned int rxFrequency = m_conf.getRXFrequency();
unsigned int txFrequency = m_conf.getTXFrequency();
#if defined(USE_POCSAG)
@ -1598,7 +1630,9 @@ bool CMMDVMHost::createModem()
LogInfo(" YSF TX Level: %.1f%%", ysfTXLevel);
LogInfo(" P25 TX Level: %.1f%%", p25TXLevel);
LogInfo(" NXDN TX Level: %.1f%%", nxdnTXLevel);
#if defined(USE_M17)
LogInfo(" M17 TX Level: %.1f%%", m17TXLevel);
#endif
#if defined(USE_POCSAG)
LogInfo(" POCSAG TX Level: %.1f%%", pocsagTXLevel);
#endif
@ -1635,7 +1669,9 @@ bool CMMDVMHost::createModem()
m_modem->setYSFParams(lowDeviation, ysfTXHang);
m_modem->setP25Params(p25TXHang);
m_modem->setNXDNParams(nxdnTXHang);
#if defined(USE_M17)
m_modem->setM17Params(m17TXHang);
#endif
#if defined(USE_AX25)
m_modem->setAX25Params(rxTwist, ax25TXDelay, ax25SlotTime, ax25PPersist);
#endif
@ -1919,6 +1955,7 @@ bool CMMDVMHost::createNXDNNetwork()
return true;
}
#if defined(USE_M17)
bool CMMDVMHost::createM17Network()
{
std::string gatewayAddress = m_conf.getM17GatewayAddress();
@ -1947,6 +1984,7 @@ bool CMMDVMHost::createM17Network()
return true;
}
#endif
#if defined(USE_POCSAG)
bool CMMDVMHost::createPOCSAGNetwork()
@ -2058,7 +2096,9 @@ void CMMDVMHost::readParams()
m_ysfEnabled = m_conf.getFusionEnabled();
m_p25Enabled = m_conf.getP25Enabled();
m_nxdnEnabled = m_conf.getNXDNEnabled();
#if defined(USE_M17)
m_m17Enabled = m_conf.getM17Enabled();
#endif
#if defined(USE_POCSAG)
m_pocsagEnabled = m_conf.getPOCSAGEnabled();
#endif
@ -2085,7 +2125,9 @@ void CMMDVMHost::readParams()
LogInfo(" YSF: %s", m_ysfEnabled ? "enabled" : "disabled");
LogInfo(" P25: %s", m_p25Enabled ? "enabled" : "disabled");
LogInfo(" NXDN: %s", m_nxdnEnabled ? "enabled" : "disabled");
#if defined(USE_M17)
LogInfo(" M17: %s", m_m17Enabled ? "enabled" : "disabled");
#endif
#if defined(USE_POCSAG)
LogInfo(" POCSAG: %s", m_pocsagEnabled ? "enabled" : "disabled");
#endif
@ -2115,8 +2157,10 @@ void CMMDVMHost::setMode(unsigned char mode)
m_p25Network->enable(false);
if (m_nxdnNetwork != NULL)
m_nxdnNetwork->enable(false);
#if defined(USE_M17)
if (m_m17Network != NULL)
m_m17Network->enable(false);
#endif
#if defined(USE_POCSAG)
if (m_pocsagNetwork != NULL)
m_pocsagNetwork->enable(false);
@ -2141,8 +2185,10 @@ void CMMDVMHost::setMode(unsigned char mode)
m_p25->enable(false);
if (m_nxdn != NULL)
m_nxdn->enable(false);
#if defined(USE_M17)
if (m_m17 != NULL)
m_m17->enable(false);
#endif
#if defined(USE_POCSAG)
if (m_pocsag != NULL)
m_pocsag->enable(false);
@ -2176,8 +2222,10 @@ void CMMDVMHost::setMode(unsigned char mode)
m_p25Network->enable(false);
if (m_nxdnNetwork != NULL)
m_nxdnNetwork->enable(false);
#if defined(USE_M17)
if (m_m17Network != NULL)
m_m17Network->enable(false);
#endif
#if defined(USE_POCSAG)
if (m_pocsagNetwork != NULL)
m_pocsagNetwork->enable(false);
@ -2202,8 +2250,10 @@ void CMMDVMHost::setMode(unsigned char mode)
m_p25->enable(false);
if (m_nxdn != NULL)
m_nxdn->enable(false);
#if defined(USE_M17)
if (m_m17 != NULL)
m_m17->enable(false);
#endif
#if defined(USE_POCSAG)
if (m_pocsag != NULL)
m_pocsag->enable(false);
@ -2241,8 +2291,10 @@ void CMMDVMHost::setMode(unsigned char mode)
m_p25Network->enable(false);
if (m_nxdnNetwork != NULL)
m_nxdnNetwork->enable(false);
#if defined(USE_M17)
if (m_m17Network != NULL)
m_m17Network->enable(false);
#endif
#if defined(USE_POCSAG)
if (m_pocsagNetwork != NULL)
m_pocsagNetwork->enable(false);
@ -2267,8 +2319,10 @@ void CMMDVMHost::setMode(unsigned char mode)
m_p25->enable(false);
if (m_nxdn != NULL)
m_nxdn->enable(false);
#if defined(USE_M17)
if (m_m17 != NULL)
m_m17->enable(false);
#endif
#if defined(USE_POCSAG)
if (m_pocsag != NULL)
m_pocsag->enable(false);
@ -2302,8 +2356,10 @@ void CMMDVMHost::setMode(unsigned char mode)
m_p25Network->enable(true);
if (m_nxdnNetwork != NULL)
m_nxdnNetwork->enable(false);
#if defined(USE_M17)
if (m_m17Network != NULL)
m_m17Network->enable(false);
#endif
#if defined(USE_POCSAG)
if (m_pocsagNetwork != NULL)
m_pocsagNetwork->enable(false);
@ -2328,8 +2384,10 @@ void CMMDVMHost::setMode(unsigned char mode)
m_p25->enable(true);
if (m_nxdn != NULL)
m_nxdn->enable(false);
#if defined(USE_M17)
if (m_m17 != NULL)
m_m17->enable(false);
#endif
#if defined(USE_POCSAG)
if (m_pocsag != NULL)
m_pocsag->enable(false);
@ -2363,8 +2421,10 @@ void CMMDVMHost::setMode(unsigned char mode)
m_p25Network->enable(false);
if (m_nxdnNetwork != NULL)
m_nxdnNetwork->enable(true);
#if defined(USE_M17)
if (m_m17Network != NULL)
m_m17Network->enable(false);
#endif
#if defined(USE_POCSAG)
if (m_pocsagNetwork != NULL)
m_pocsagNetwork->enable(false);
@ -2389,8 +2449,10 @@ void CMMDVMHost::setMode(unsigned char mode)
m_p25->enable(false);
if (m_nxdn != NULL)
m_nxdn->enable(true);
#if defined(USE_M17)
if (m_m17 != NULL)
m_m17->enable(false);
#endif
#if defined(USE_POCSAG)
if (m_pocsag != NULL)
m_pocsag->enable(false);
@ -2424,8 +2486,10 @@ void CMMDVMHost::setMode(unsigned char mode)
m_p25Network->enable(false);
if (m_nxdnNetwork != NULL)
m_nxdnNetwork->enable(false);
#if defined(USE_M17)
if (m_m17Network != NULL)
m_m17Network->enable(true);
#endif
#if defined(USE_POCSAG)
if (m_pocsagNetwork != NULL)
m_pocsagNetwork->enable(false);
@ -2450,8 +2514,10 @@ void CMMDVMHost::setMode(unsigned char mode)
m_p25->enable(false);
if (m_nxdn != NULL)
m_nxdn->enable(false);
#if defined(USE_M17)
if (m_m17 != NULL)
m_m17->enable(true);
#endif
#if defined(USE_POCSAG)
if (m_pocsag != NULL)
m_pocsag->enable(false);
@ -2485,8 +2551,10 @@ void CMMDVMHost::setMode(unsigned char mode)
m_p25Network->enable(false);
if (m_nxdnNetwork != NULL)
m_nxdnNetwork->enable(false);
#if defined(USE_M17)
if (m_m17Network != NULL)
m_m17Network->enable(false);
#endif
#if defined(USE_POCSAG)
if (m_pocsagNetwork != NULL)
m_pocsagNetwork->enable(true);
@ -2511,8 +2579,10 @@ void CMMDVMHost::setMode(unsigned char mode)
m_p25->enable(false);
if (m_nxdn != NULL)
m_nxdn->enable(false);
#if defined(USE_M17)
if (m_m17 != NULL)
m_m17->enable(false);
#endif
#if defined(USE_POCSAG)
if (m_pocsag != NULL)
m_pocsag->enable(true);
@ -2546,8 +2616,10 @@ void CMMDVMHost::setMode(unsigned char mode)
m_p25Network->enable(false);
if (m_nxdnNetwork != NULL)
m_nxdnNetwork->enable(false);
#if defined(USE_M17)
if (m_m17Network != NULL)
m_m17Network->enable(false);
#endif
#if defined(USE_POCSAG)
if (m_pocsagNetwork != NULL)
m_pocsagNetwork->enable(false);
@ -2572,8 +2644,10 @@ void CMMDVMHost::setMode(unsigned char mode)
m_p25->enable(false);
if (m_nxdn != NULL)
m_nxdn->enable(false);
#if defined(USE_M17)
if (m_m17 != NULL)
m_m17->enable(false);
#endif
#if defined(USE_POCSAG)
if (m_pocsag != NULL)
m_pocsag->enable(false);
@ -2611,8 +2685,10 @@ void CMMDVMHost::setMode(unsigned char mode)
m_p25Network->enable(false);
if (m_nxdnNetwork != NULL)
m_nxdnNetwork->enable(false);
#if defined(USE_M17)
if (m_m17Network != NULL)
m_m17Network->enable(false);
#endif
#if defined(USE_POCSAG)
if (m_pocsagNetwork != NULL)
m_pocsagNetwork->enable(false);
@ -2637,8 +2713,10 @@ void CMMDVMHost::setMode(unsigned char mode)
m_p25->enable(false);
if (m_nxdn != NULL)
m_nxdn->enable(false);
#if defined(USE_M17)
if (m_m17 != NULL)
m_m17->enable(false);
#endif
#if defined(USE_POCSAG)
if (m_pocsag != NULL)
m_pocsag->enable(false);
@ -2677,8 +2755,10 @@ void CMMDVMHost::setMode(unsigned char mode)
m_p25Network->enable(false);
if (m_nxdnNetwork != NULL)
m_nxdnNetwork->enable(false);
#if defined(USE_M17)
if (m_m17Network != NULL)
m_m17Network->enable(false);
#endif
#if defined(USE_POCSAG)
if (m_pocsagNetwork != NULL)
m_pocsagNetwork->enable(false);
@ -2703,8 +2783,10 @@ void CMMDVMHost::setMode(unsigned char mode)
m_p25->enable(false);
if (m_nxdn != NULL)
m_nxdn->enable(false);
#if defined(USE_M17)
if (m_m17 != NULL)
m_m17->enable(false);
#endif
#if defined(USE_POCSAG)
if (m_pocsag != NULL)
m_pocsag->enable(false);
@ -2741,8 +2823,10 @@ void CMMDVMHost::setMode(unsigned char mode)
m_p25Network->enable(true);
if (m_nxdnNetwork != NULL)
m_nxdnNetwork->enable(true);
#if defined(USE_M17)
if (m_m17Network != NULL)
m_m17Network->enable(true);
#endif
#if defined(USE_POCSAG)
if (m_pocsagNetwork != NULL)
m_pocsagNetwork->enable(true);
@ -2767,8 +2851,10 @@ void CMMDVMHost::setMode(unsigned char mode)
m_p25->enable(true);
if (m_nxdn != NULL)
m_nxdn->enable(true);
#if defined(USE_M17)
if (m_m17 != NULL)
m_m17->enable(true);
#endif
#if defined(USE_POCSAG)
if (m_pocsag != NULL)
m_pocsag->enable(true);
@ -2856,10 +2942,12 @@ void CMMDVMHost::remoteControl(const std::string& commandString)
if (m_nxdn != NULL)
processModeCommand(MODE_NXDN, m_nxdnRFModeHang);
break;
#if defined(USE_M17)
case RCD_MODE_M17:
if (m_m17 != NULL)
processModeCommand(MODE_M17, m_m17RFModeHang);
break;
#endif
#if defined(USE_FM)
case RCD_MODE_FM:
if (m_fmEnabled)
@ -2898,12 +2986,14 @@ void CMMDVMHost::remoteControl(const std::string& commandString)
if (m_nxdnNetwork != NULL)
m_nxdnNetwork->enable(true);
break;
#if defined(USE_M17)
case RCD_ENABLE_M17:
if (m_m17 != NULL && !m_m17Enabled)
processEnableCommand(m_m17Enabled, true);
if (m_m17Network != NULL)
m_m17Network->enable(true);
break;
#endif
#if defined(USE_FM)
case RCD_ENABLE_FM:
if (!m_fmEnabled)
@ -2948,12 +3038,14 @@ void CMMDVMHost::remoteControl(const std::string& commandString)
if (m_nxdnNetwork != NULL)
m_nxdnNetwork->enable(false);
break;
#if defined(USE_M17)
case RCD_DISABLE_M17:
if (m_m17 != NULL && m_m17Enabled)
processEnableCommand(m_m17Enabled, false);
if (m_m17Network != NULL)
m_m17Network->enable(false);
break;
#endif
#if defined(USE_FM)
case RCD_DISABLE_FM:
if (m_fmEnabled)
@ -3070,7 +3162,9 @@ void CMMDVMHost::buildNetworkStatusString(std::string &str)
str += std::string(" ysf:") + (((m_ysfNetwork == NULL) || !m_ysfEnabled) ? "n/a" : (m_ysfNetwork->isConnected() ? "conn" : "disc"));
str += std::string(" p25:") + (((m_p25Network == NULL) || !m_p25Enabled) ? "n/a" : (m_p25Network->isConnected() ? "conn" : "disc"));
str += std::string(" nxdn:") + (((m_nxdnNetwork == NULL) || !m_nxdnEnabled) ? "n/a" : (m_nxdnNetwork->isConnected() ? "conn" : "disc"));
#if defined(USE_M17)
str += std::string(" m17:") + (((m_m17Network == NULL) || !m_m17Enabled) ? "n/a" : (m_m17Network->isConnected() ? "conn" : "disc"));
#endif
#if defined(USE_FM)
str += std::string(" fm:") + (m_fmEnabled ? "conn" : "n/a");
#endif
@ -3109,7 +3203,9 @@ void CMMDVMHost::buildNetworkHostsString(std::string &str)
str += std::string(" ysf:\"") + ((m_ysfEnabled && (m_ysfNetwork != NULL)) ? m_conf.getFusionNetworkGatewayAddress() : "NONE") + "\"";
str += std::string(" p25:\"") + ((m_p25Enabled && (m_p25Network != NULL)) ? m_conf.getP25GatewayAddress() : "NONE") + "\"";
str += std::string(" nxdn:\"") + ((m_nxdnEnabled && (m_nxdnNetwork != NULL)) ? m_conf.getNXDNGatewayAddress() : "NONE") + "\"";
#if defined(USE_M17)
str += std::string(" m17:\"") + ((m_m17Enabled && (m_m17Network != NULL)) ? m_conf.getM17GatewayAddress() : "NONE") + "\"";
#endif
#if defined(USE_FM)
str += std::string(" fm:\"") + ((m_fmEnabled && (m_fmNetwork != NULL)) ? m_conf.getFMGatewayAddress() : "NONE") + "\"";
#endif

View file

@ -68,7 +68,9 @@ private:
CYSFControl* m_ysf;
CP25Control* m_p25;
CNXDNControl* m_nxdn;
#if defined(USE_M17)
CM17Control* m_m17;
#endif
#if defined(USE_POCSAG)
CPOCSAGControl* m_pocsag;
#endif
@ -85,7 +87,9 @@ private:
CYSFNetwork* m_ysfNetwork;
CP25Network* m_p25Network;
INXDNNetwork* m_nxdnNetwork;
#if defined(USE_M17)
CM17Network* m_m17Network;
#endif
#if defined(USE_POCSAG)
CPOCSAGNetwork* m_pocsagNetwork;
#endif
@ -103,7 +107,9 @@ private:
unsigned int m_ysfRFModeHang;
unsigned int m_p25RFModeHang;
unsigned int m_nxdnRFModeHang;
#if defined(USE_M17)
unsigned int m_m17RFModeHang;
#endif
#if defined(USE_FM)
unsigned int m_fmRFModeHang;
#endif
@ -114,7 +120,9 @@ private:
unsigned int m_ysfNetModeHang;
unsigned int m_p25NetModeHang;
unsigned int m_nxdnNetModeHang;
#if defined(USE_M17)
unsigned int m_m17NetModeHang;
#endif
#if defined(USE_POCSAG)
unsigned int m_pocsagNetModeHang;
#endif
@ -155,7 +163,9 @@ private:
bool createYSFNetwork();
bool createP25Network();
bool createNXDNNetwork();
#if defined(USE_M17)
bool createM17Network();
#endif
#if defined(USE_POCSAG)
bool createPOCSAGNetwork();
#endif

View file

@ -76,11 +76,13 @@ const unsigned char MMDVM_P25_LOST = 0x32U;
const unsigned char MMDVM_NXDN_DATA = 0x40U;
const unsigned char MMDVM_NXDN_LOST = 0x41U;
#if defined(USE_M17)
const unsigned char MMDVM_M17_LINK_SETUP = 0x45U;
const unsigned char MMDVM_M17_STREAM = 0x46U;
const unsigned char MMDVM_M17_PACKET = 0x47U;
const unsigned char MMDVM_M17_LOST = 0x48U;
const unsigned char MMDVM_M17_EOT = 0x49U;
#endif
#if defined(USE_POCSAG)
const unsigned char MMDVM_POCSAG_DATA = 0x50U;
@ -126,7 +128,9 @@ const unsigned char CAP1_DMR = 0x02U;
const unsigned char CAP1_YSF = 0x04U;
const unsigned char CAP1_P25 = 0x08U;
const unsigned char CAP1_NXDN = 0x10U;
#if defined(USE_M17)
const unsigned char CAP1_M17 = 0x20U;
#endif
#if defined(USE_FM)
const unsigned char CAP1_FM = 0x40U;
#endif
@ -144,7 +148,9 @@ m_ysfLoDev(false),
m_ysfTXHang(4U),
m_p25TXHang(5U),
m_nxdnTXHang(5U),
#if defined(USE_M17)
m_m17TXHang(5U),
#endif
m_duplex(duplex),
m_rxInvert(rxInvert),
m_txInvert(txInvert),
@ -160,7 +166,9 @@ m_dmrTXLevel(0.0F),
m_ysfTXLevel(0.0F),
m_p25TXLevel(0.0F),
m_nxdnTXLevel(0.0F),
#if defined(USE_M17)
m_m17TXLevel(0.0F),
#endif
#if defined(USE_POCSAG)
m_pocsagTXLevel(0.0F),
#endif
@ -186,7 +194,9 @@ m_dmrEnabled(false),
m_ysfEnabled(false),
m_p25Enabled(false),
m_nxdnEnabled(false),
#if defined(USE_M17)
m_m17Enabled(false),
#endif
#if defined(USE_POCSAG)
m_pocsagEnabled(false),
#endif
@ -218,8 +228,10 @@ m_rxP25Data(1000U, "Modem RX P25"),
m_txP25Data(1000U, "Modem TX P25"),
m_rxNXDNData(1000U, "Modem RX NXDN"),
m_txNXDNData(1000U, "Modem TX NXDN"),
#if defined(USE_M17)
m_rxM17Data(1000U, "Modem RX M17"),
m_txM17Data(1000U, "Modem TX M17"),
#endif
#if defined(USE_POCSAG)
m_txPOCSAGData(1000U, "Modem TX POCSAG"),
#endif
@ -247,7 +259,9 @@ m_dmrSpace2(0U),
m_ysfSpace(0U),
m_p25Space(0U),
m_nxdnSpace(0U),
#if defined(USE_M17)
m_m17Space(0U),
#endif
#if defined(USE_POCSAG)
m_pocsagSpace(0U),
#endif
@ -346,7 +360,9 @@ void CModem::setModeParams(bool dstarEnabled, bool dmrEnabled, bool ysfEnabled,
m_ysfEnabled = ysfEnabled;
m_p25Enabled = p25Enabled;
m_nxdnEnabled = nxdnEnabled;
#if defined(USE_M17)
m_m17Enabled = m17Enabled;
#endif
#if defined(USE_POCSAG)
m_pocsagEnabled = pocsagEnabled;
#endif
@ -369,7 +385,9 @@ void CModem::setLevels(float rxLevel, float cwIdTXLevel, float dstarTXLevel, flo
m_ysfTXLevel = ysfTXLevel;
m_p25TXLevel = p25TXLevel;
m_nxdnTXLevel = nxdnTXLevel;
#if defined(USE_M17)
m_m17TXLevel = m17TXLevel;
#endif
#if defined(USE_POCSAG)
m_pocsagTXLevel = pocsagTXLevel;
#endif
@ -404,10 +422,12 @@ void CModem::setNXDNParams(unsigned int txHang)
m_nxdnTXHang = txHang;
}
#if defined(USE_M17)
void CModem::setM17Params(unsigned int txHang)
{
m_m17TXHang = txHang;
}
#endif
#if defined(USE_AX25)
void CModem::setAX25Params(int rxTwist, unsigned int txDelay, unsigned int slotTime, unsigned int pPersist)
@ -741,6 +761,7 @@ void CModem::clock(unsigned int ms)
}
break;
#if defined(USE_M17)
case MMDVM_M17_LINK_SETUP: {
if (m_trace)
CUtils::dump(1U, "RX M17 Link Setup", m_buffer, m_length);
@ -792,7 +813,7 @@ void CModem::clock(unsigned int ms)
m_rxM17Data.addData(&data, 1U);
}
break;
#endif
#if defined(USE_FM)
case MMDVM_FM_DATA: {
if (m_trace)
@ -875,7 +896,9 @@ void CModem::clock(unsigned int ms)
m_p25Space = 0U;
m_nxdnSpace = 0U;
#if defined(USE_M17)
m_m17Space = 0U;
#endif
#if defined(USE_POCSAG)
m_pocsagSpace = 0U;
#endif
@ -901,8 +924,10 @@ void CModem::clock(unsigned int ms)
if (m_length > (m_offset + 9U))
m_pocsagSpace = m_buffer[m_offset + 9U];
#endif
#if defined(USE_M17)
if (m_length > (m_offset + 10U))
m_m17Space = m_buffer[m_offset + 10U];
#endif
}
break;
@ -933,7 +958,9 @@ void CModem::clock(unsigned int ms)
m_ysfSpace = m_buffer[m_offset + 6U];
m_p25Space = m_buffer[m_offset + 7U];
m_nxdnSpace = m_buffer[m_offset + 8U];
#if defined(USE_M17)
m_m17Space = m_buffer[m_offset + 9U];
#endif
#if defined(USE_FM)
m_fmSpace = m_buffer[m_offset + 10U];
#endif
@ -955,7 +982,9 @@ void CModem::clock(unsigned int ms)
m_ysfSpace = 0U;
m_p25Space = 0U;
m_nxdnSpace = 0U;
#if defined(USE_M17)
m_m17Space = 0U;
#endif
#if defined(USE_POCSAG)
m_pocsagSpace = 0U;
#endif
@ -1154,6 +1183,7 @@ void CModem::clock(unsigned int ms)
m_nxdnSpace--;
}
#if defined(USE_M17)
if (m_m17Space > 1U && !m_txM17Data.isEmpty()) {
unsigned char len = 0U;
m_txM17Data.getData(&len, 1U);
@ -1181,6 +1211,7 @@ void CModem::clock(unsigned int ms)
m_m17Space--;
}
#endif
#if defined(USE_POCSAG)
if (m_pocsagSpace > 1U && !m_txPOCSAGData.isEmpty()) {
@ -1365,6 +1396,7 @@ unsigned int CModem::readNXDNData(unsigned char* data)
return len;
}
#if defined(USE_M17)
unsigned int CModem::readM17Data(unsigned char* data)
{
assert(data != NULL);
@ -1378,6 +1410,7 @@ unsigned int CModem::readM17Data(unsigned char* data)
return len;
}
#endif
#if defined(USE_FM)
unsigned int CModem::readFMData(unsigned char* data)
@ -1632,6 +1665,7 @@ bool CModem::writeNXDNData(const unsigned char* data, unsigned int length)
return true;
}
#if defined(USE_M17)
bool CModem::hasM17Space() const
{
unsigned int space = m_txM17Data.freeSpace() / (M17_FRAME_LENGTH_BYTES + 4U);
@ -1672,6 +1706,7 @@ bool CModem::writeM17Data(const unsigned char* data, unsigned int length)
return true;
}
#endif
#if defined(USE_POCSAG)
bool CModem::hasPOCSAGSpace() const
@ -1945,6 +1980,7 @@ bool CModem::writeNXDNInfo(const char* source, bool group, unsigned int dest, co
return m_port->write(buffer, 31U) != 31;
}
#if defined(USE_M17)
bool CModem::writeM17Info(const char* source, const char* dest, const char* type)
{
assert(m_port != NULL);
@ -1968,6 +2004,7 @@ bool CModem::writeM17Info(const char* source, const char* dest, const char* type
return m_port->write(buffer, 23U) != 23;
}
#endif
#if defined(USE_POCSAG)
bool CModem::writePOCSAGInfo(unsigned int ric, const std::string& message)
@ -2083,10 +2120,12 @@ bool CModem::hasNXDN() const
return (m_capabilities1 & CAP1_NXDN) == CAP1_NXDN;
}
#if defined(USE_M17)
bool CModem::hasM17() const
{
return (m_capabilities1 & CAP1_M17) == CAP1_M17;
}
#endif
#if defined(USE_FM)
bool CModem::hasFM() const
@ -2176,7 +2215,10 @@ bool CModem::readVersion()
#if defined(USE_DSTAR)
m_capabilities1 |= CAP1_DSTAR;
#endif
m_capabilities1 |= CAP1_DMR | CAP1_YSF | CAP1_P25 | CAP1_NXDN | CAP1_M17;
m_capabilities1 |= CAP1_DMR | CAP1_YSF | CAP1_P25 | CAP1_NXDN;
#if defined(USE_M17)
m_capabilities1 |= CAP1_M17;
#endif
#if defined(USE_POCSAG)
m_capabilities2 |= CAP2_POCSAG;
#endif
@ -2214,8 +2256,10 @@ bool CModem::readVersion()
::strcat(modeText, " P25");
if (hasNXDN())
::strcat(modeText, " NXDN");
#if defined(USE_M17)
if (hasM17())
::strcat(modeText, " M17");
#endif
#if defined(USE_FM)
if (hasFM())
::strcat(modeText, " FM");
@ -2320,8 +2364,10 @@ bool CModem::setConfig1()
if (m_pocsagEnabled)
buffer[4U] |= 0x20U;
#endif
#if defined(USE_M17)
if (m_m17Enabled)
buffer[4U] |= 0x40U;
#endif
buffer[5U] = m_txDelay / 10U; // In 10ms units
@ -2366,9 +2412,13 @@ bool CModem::setConfig1()
buffer[23U] = (unsigned char)m_nxdnTXHang;
#if defined(USE_M17)
buffer[24U] = (unsigned char)(m_m17TXLevel * 2.55F + 0.5F);
buffer[25U] = (unsigned char)m_m17TXHang;
#else
buffer[24U] = 0U;
buffer[25U] = 0U;
#endif
// CUtils::dump(1U, "Written", buffer, 26U);
@ -2448,8 +2498,10 @@ bool CModem::setConfig2()
if (m_fmEnabled)
buffer[4U] |= 0x20U;
#endif
#if defined(USE_M17)
if (m_m17Enabled)
buffer[4U] |= 0x40U;
#endif
buffer[5U] = 0x00U;
#if defined(USE_POCSAG)
@ -2479,7 +2531,11 @@ bool CModem::setConfig2()
buffer[14U] = (unsigned char)(m_ysfTXLevel * 2.55F + 0.5F);
buffer[15U] = (unsigned char)(m_p25TXLevel * 2.55F + 0.5F);
buffer[16U] = (unsigned char)(m_nxdnTXLevel * 2.55F + 0.5F);
#if defined(USE_M17)
buffer[17U] = (unsigned char)(m_m17TXLevel * 2.55F + 0.5F);
#else
buffer[17U] = 0U;
#endif
#if defined(USE_POCSAG)
buffer[18U] = (unsigned char)(m_pocsagTXLevel * 2.55F + 0.5F);
#else
@ -2501,7 +2557,11 @@ bool CModem::setConfig2()
buffer[23U] = (unsigned char)m_ysfTXHang;
buffer[24U] = (unsigned char)m_p25TXHang;
buffer[25U] = (unsigned char)m_nxdnTXHang;
#if defined(USE_M17)
buffer[26U] = (unsigned char)m_m17TXHang;
#else
buffer[26U] = 0U;
#endif
buffer[27U] = 0x00U;
buffer[28U] = 0x00U;

22
Modem.h
View file

@ -53,7 +53,9 @@ public:
void setYSFParams(bool loDev, unsigned int txHang);
void setP25Params(unsigned int txHang);
void setNXDNParams(unsigned int txHang);
#if defined(USE_M17)
void setM17Params(unsigned int txHang);
#endif
#if defined(USE_AX25)
void setAX25Params(int rxTwist, unsigned int txDelay, unsigned int slotTime, unsigned int pPersist);
#endif
@ -75,7 +77,9 @@ public:
bool hasYSF() const;
bool hasP25() const;
bool hasNXDN() const;
#if defined(USE_M17)
bool hasM17() const;
#endif
#if defined(USE_POCSAG)
bool hasPOCSAG() const;
#endif
@ -95,7 +99,9 @@ public:
unsigned int readYSFData(unsigned char* data);
unsigned int readP25Data(unsigned char* data);
unsigned int readNXDNData(unsigned char* data);
#if defined(USE_M17)
unsigned int readM17Data(unsigned char* data);
#endif
#if defined(USE_FM)
unsigned int readFMData(unsigned char* data);
#endif
@ -111,7 +117,9 @@ public:
bool hasYSFSpace() const;
bool hasP25Space() const;
bool hasNXDNSpace() const;
#if defined(USE_M17)
bool hasM17Space() const;
#endif
#if defined(USE_POCSAG)
bool hasPOCSAGSpace() const;
#endif
@ -138,7 +146,9 @@ public:
bool writeYSFData(const unsigned char* data, unsigned int length);
bool writeP25Data(const unsigned char* data, unsigned int length);
bool writeNXDNData(const unsigned char* data, unsigned int length);
#if defined(USE_M17)
bool writeM17Data(const unsigned char* data, unsigned int length);
#endif
#if defined(USE_POCSAG)
bool writePOCSAGData(const unsigned char* data, unsigned int length);
#endif
@ -156,7 +166,9 @@ public:
bool writeYSFInfo(const char* source, const char* dest, unsigned char dgid, const char* type, const char* origin);
bool writeP25Info(const char* source, bool group, unsigned int dest, const char* type);
bool writeNXDNInfo(const char* source, bool group, unsigned int dest, const char* type);
#if defined(USE_M17)
bool writeM17Info(const char* source, const char* dest, const char* type);
#endif
#if defined(USE_POCSAG)
bool writePOCSAGInfo(unsigned int ric, const std::string& message);
#endif
@ -190,7 +202,9 @@ private:
unsigned int m_ysfTXHang;
unsigned int m_p25TXHang;
unsigned int m_nxdnTXHang;
#if defined(USE_M17)
unsigned int m_m17TXHang;
#endif
bool m_duplex;
bool m_rxInvert;
bool m_txInvert;
@ -206,7 +220,9 @@ private:
float m_ysfTXLevel;
float m_p25TXLevel;
float m_nxdnTXLevel;
#if defined(USE_M17)
float m_m17TXLevel;
#endif
#if defined(USE_POCSAG)
float m_pocsagTXLevel;
#endif
@ -232,7 +248,9 @@ private:
bool m_ysfEnabled;
bool m_p25Enabled;
bool m_nxdnEnabled;
#if defined(USE_M17)
bool m_m17Enabled;
#endif
#if defined(USE_POCSAG)
bool m_pocsagEnabled;
#endif
@ -265,8 +283,10 @@ private:
CRingBuffer<unsigned char> m_txP25Data;
CRingBuffer<unsigned char> m_rxNXDNData;
CRingBuffer<unsigned char> m_txNXDNData;
#if defined(USE_M17)
CRingBuffer<unsigned char> m_rxM17Data;
CRingBuffer<unsigned char> m_txM17Data;
#endif
#if defined(USE_POCSAG)
CRingBuffer<unsigned char> m_txPOCSAGData;
#endif
@ -294,7 +314,9 @@ private:
unsigned int m_ysfSpace;
unsigned int m_p25Space;
unsigned int m_nxdnSpace;
#if defined(USE_M17)
unsigned int m_m17Space;
#endif
#if defined(USE_POCSAG)
unsigned int m_pocsagSpace;
#endif

View file

@ -77,8 +77,10 @@ REMOTE_COMMAND CRemoteControl::getCommand(const std::string& command)
m_command = RCD_MODE_P25;
else if (m_args.at(1U) == "nxdn")
m_command = RCD_MODE_NXDN;
#if defined(USE_M17)
else if (m_args.at(1U) == "m17")
m_command = RCD_MODE_M17;
#endif
else
reply = "KO";
} else if (m_args.at(0U) == "enable" && m_args.size() >= ENABLE_ARGS) {
@ -99,8 +101,11 @@ REMOTE_COMMAND CRemoteControl::getCommand(const std::string& command)
if (m_args.at(1U) == "nxdn")
m_command = RCD_ENABLE_NXDN;
else
#if defined(USE_M17)
if (m_args.at(1U) == "m17")
m_command = RCD_ENABLE_M17;
else
#endif
#if defined(USE_FM)
if (m_args.at(1U) == "fm")
m_command = RCD_ENABLE_FM;
@ -130,9 +135,11 @@ REMOTE_COMMAND CRemoteControl::getCommand(const std::string& command)
if (m_args.at(1U) == "nxdn")
m_command = RCD_DISABLE_NXDN;
else
#if defined(USE_M17)
if (m_args.at(1U) == "m17")
m_command = RCD_DISABLE_M17;
else
#endif
#if defined(USE_FM)
if (m_args.at(1U) == "fm")
m_command = RCD_DISABLE_FM;
@ -211,7 +218,9 @@ unsigned int CRemoteControl::getArgCount() const
case RCD_MODE_YSF:
case RCD_MODE_P25:
case RCD_MODE_NXDN:
#if defined(USE_M17)
case RCD_MODE_M17:
#endif
return m_args.size() - SET_MODE_ARGS;
#if defined(USE_POCSAG)
case RCD_PAGE:
@ -239,7 +248,9 @@ std::string CRemoteControl::getArgString(unsigned int n) const
case RCD_MODE_YSF:
case RCD_MODE_P25:
case RCD_MODE_NXDN:
#if defined(USE_M17)
case RCD_MODE_M17:
#endif
n += SET_MODE_ARGS;
break;
#if defined(USE_POCSAG)

View file

@ -39,7 +39,9 @@ enum REMOTE_COMMAND {
RCD_MODE_YSF,
RCD_MODE_P25,
RCD_MODE_NXDN,
#if defined(USE_M17)
RCD_MODE_M17,
#endif
#if defined(USE_FM)
RCD_MODE_FM,
#endif
@ -50,7 +52,9 @@ enum REMOTE_COMMAND {
RCD_ENABLE_YSF,
RCD_ENABLE_P25,
RCD_ENABLE_NXDN,
#if defined(USE_M17)
RCD_ENABLE_M17,
#endif
#if defined(USE_FM)
RCD_ENABLE_FM,
#endif
@ -64,7 +68,9 @@ enum REMOTE_COMMAND {
RCD_DISABLE_YSF,
RCD_DISABLE_P25,
RCD_DISABLE_NXDN,
#if defined(USE_M17)
RCD_DISABLE_M17,
#endif
#if defined(USE_FM)
RCD_DISABLE_FM,
#endif

View file

@ -1,5 +1,5 @@
/*
* Copyright (C) 2015,2016,2018,2020,2021 by Jonathan Naylor G4KLX
* Copyright (C) 2015,2016,2018,2020,2021,2023 by Jonathan Naylor G4KLX
*
* This 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 <cassert>
#include <cstring>
#if defined(USE_DSTAR)
void CSync::addDStarSync(unsigned char* data)
{
assert(data != NULL);
::memcpy(data + DSTAR_VOICE_FRAME_LENGTH_BYTES, DSTAR_SYNC_BYTES, DSTAR_DATA_FRAME_LENGTH_BYTES);
}
#endif
void CSync::addDMRDataSync(unsigned char* data, bool duplex)
{
@ -85,6 +86,7 @@ void CSync::addNXDNSync(unsigned char* data)
data[i] = (data[i] & ~NXDN_FSW_BYTES_MASK[i]) | NXDN_FSW_BYTES[i];
}
#if defined(USE_M17)
void CSync::addM17LinkSetupSync(unsigned char* data)
{
assert(data != NULL);
@ -105,4 +107,5 @@ void CSync::addM17EOTSync(unsigned char* data)
::memcpy(data, M17_EOT_SYNC_BYTES, M17_SYNC_LENGTH_BYTES);
}
#endif

9
Sync.h
View file

@ -1,5 +1,5 @@
/*
* Copyright (C) 2015,2016,2018,2020,2021 by Jonathan Naylor G4KLX
* Copyright (C) 2015,2016,2018,2020,2021,2023 by Jonathan Naylor G4KLX
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@ -19,11 +19,14 @@
#if !defined(SYNC_H)
#define SYNC_H
#include "Defines.h"
class CSync
{
public:
#if defined(USE_DSTAR)
static void addDStarSync(unsigned char* data);
#endif
static void addDMRDataSync(unsigned char* data, bool duplex);
static void addDMRAudioSync(unsigned char* data, bool duplex);
@ -33,9 +36,11 @@ public:
static void addNXDNSync(unsigned char* data);
#if defined(USE_M17)
static void addM17LinkSetupSync(unsigned char* data);
static void addM17StreamSync(unsigned char* data);
static void addM17EOTSync(unsigned char* data);
#endif
private:
};