Remove all of the display processing from the code.

This commit is contained in:
Jonathan Naylor
2023-06-16 17:18:43 +01:00
parent f12604bb1c
commit d01520bea1
27 changed files with 74 additions and 735 deletions

284
Conf.cpp
View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2015-2022,2023 by Jonathan Naylor G4KLX
* Copyright (C) 2015-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
@@ -56,11 +56,6 @@ enum SECTION {
SECTION_POCSAG_NETWORK,
SECTION_FM_NETWORK,
SECTION_AX25_NETWORK,
SECTION_TFTSERIAL,
SECTION_HD44780,
SECTION_NEXTION,
SECTION_OLED,
SECTION_LCDPROC,
SECTION_LOCK_FILE,
SECTION_REMOTE_CONTROL
};
@@ -71,7 +66,6 @@ m_callsign(),
m_id(0U),
m_timeout(120U),
m_duplex(true),
m_display(),
m_daemon(false),
m_rxFrequency(0U),
m_txFrequency(0U),
@@ -307,37 +301,6 @@ m_ax25NetworkEnabled(false),
m_ax25NetworkPort(),
m_ax25NetworkSpeed(9600U),
m_ax25NetworkDebug(false),
m_tftSerialPort("/dev/ttyAMA0"),
m_tftSerialBrightness(50U),
m_hd44780Rows(2U),
m_hd44780Columns(16U),
m_hd44780Pins(),
m_hd44780i2cAddress(),
m_hd44780PWM(false),
m_hd44780PWMPin(),
m_hd44780PWMBright(),
m_hd44780PWMDim(),
m_hd44780DisplayClock(false),
m_hd44780UTC(false),
m_nextionPort("/dev/ttyAMA0"),
m_nextionBrightness(50U),
m_nextionDisplayClock(false),
m_nextionUTC(false),
m_nextionIdleBrightness(20U),
m_nextionScreenLayout(0U),
m_nextionTempInFahrenheit(false),
m_oledType(3U),
m_oledBrightness(0U),
m_oledInvert(false),
m_oledScroll(false),
m_oledRotate(false),
m_oledLogoScreensaver(true),
m_lcdprocAddress(),
m_lcdprocPort(0U),
m_lcdprocLocalPort(0U),
m_lcdprocDisplayClock(false),
m_lcdprocUTC(false),
m_lcdprocDimOnIdle(false),
m_lockFileEnabled(false),
m_lockFileName(),
m_remoteControlEnabled(false),
@@ -420,16 +383,6 @@ bool CConf::read()
section = SECTION_FM_NETWORK;
else if (::strncmp(buffer, "[AX.25 Network]", 15U) == 0)
section = SECTION_AX25_NETWORK;
else if (::strncmp(buffer, "[TFT Serial]", 12U) == 0)
section = SECTION_TFTSERIAL;
else if (::strncmp(buffer, "[HD44780]", 9U) == 0)
section = SECTION_HD44780;
else if (::strncmp(buffer, "[Nextion]", 9U) == 0)
section = SECTION_NEXTION;
else if (::strncmp(buffer, "[OLED]", 6U) == 0)
section = SECTION_OLED;
else if (::strncmp(buffer, "[LCDproc]", 9U) == 0)
section = SECTION_LCDPROC;
else if (::strncmp(buffer, "[Lock File]", 11U) == 0)
section = SECTION_LOCK_FILE;
else if (::strncmp(buffer, "[Remote Control]", 16U) == 0)
@@ -484,8 +437,6 @@ bool CConf::read()
m_dstarModeHang = m_dmrModeHang = m_fusionModeHang = m_p25ModeHang = m_nxdnModeHang = m_m17ModeHang = m_fmModeHang = (unsigned int)::atoi(value);
else if (::strcmp(key, "NetModeHang") == 0)
m_dstarNetworkModeHang = m_dmrNetworkModeHang = m_fusionNetworkModeHang = m_p25NetworkModeHang = m_nxdnNetworkModeHang = m_m17NetworkModeHang = m_fmNetworkModeHang = (unsigned int)::atoi(value);
else if (::strcmp(key, "Display") == 0)
m_display = value;
else if (::strcmp(key, "Daemon") == 0)
m_daemon = ::atoi(value) == 1;
} else if (section == SECTION_INFO) {
@@ -1072,79 +1023,6 @@ bool CConf::read()
m_ax25NetworkSpeed = (unsigned int)::atoi(value);
else if (::strcmp(key, "Debug") == 0)
m_ax25NetworkDebug = ::atoi(value) == 1;
} else if (section == SECTION_TFTSERIAL) {
if (::strcmp(key, "Port") == 0)
m_tftSerialPort = value;
else if (::strcmp(key, "Brightness") == 0)
m_tftSerialBrightness = (unsigned int)::atoi(value);
} else if (section == SECTION_HD44780) {
if (::strcmp(key, "Rows") == 0)
m_hd44780Rows = (unsigned int)::atoi(value);
else if (::strcmp(key, "Columns") == 0)
m_hd44780Columns = (unsigned int)::atoi(value);
else if (::strcmp(key, "I2CAddress") == 0)
m_hd44780i2cAddress = (unsigned int)::strtoul(value, NULL, 16);
else if (::strcmp(key, "PWM") == 0)
m_hd44780PWM = ::atoi(value) == 1;
else if (::strcmp(key, "PWMPin") == 0)
m_hd44780PWMPin = (unsigned int)::atoi(value);
else if (::strcmp(key, "PWMBright") == 0)
m_hd44780PWMBright = (unsigned int)::atoi(value);
else if (::strcmp(key, "PWMDim") == 0)
m_hd44780PWMDim = (unsigned int)::atoi(value);
else if (::strcmp(key, "DisplayClock") == 0)
m_hd44780DisplayClock = ::atoi(value) == 1;
else if (::strcmp(key, "UTC") == 0)
m_hd44780UTC = ::atoi(value) == 1;
else if (::strcmp(key, "Pins") == 0) {
char* p = ::strtok(value, ",\r\n");
while (p != NULL) {
unsigned int pin = (unsigned int)::atoi(p);
m_hd44780Pins.push_back(pin);
p = ::strtok(NULL, ",\r\n");
}
}
} else if (section == SECTION_NEXTION) {
if (::strcmp(key, "Port") == 0)
m_nextionPort = value;
else if (::strcmp(key, "Brightness") == 0)
m_nextionIdleBrightness = m_nextionBrightness = (unsigned int)::atoi(value);
else if (::strcmp(key, "DisplayClock") == 0)
m_nextionDisplayClock = ::atoi(value) == 1;
else if (::strcmp(key, "UTC") == 0)
m_nextionUTC = ::atoi(value) == 1;
else if (::strcmp(key, "IdleBrightness") == 0)
m_nextionIdleBrightness = (unsigned int)::atoi(value);
else if (::strcmp(key, "ScreenLayout") == 0)
m_nextionScreenLayout = (unsigned int)::strtoul(value, NULL, 0);
else if (::strcmp(key, "DisplayTempInFahrenheit") == 0)
m_nextionTempInFahrenheit = ::atoi(value) == 1;
} else if (section == SECTION_OLED) {
if (::strcmp(key, "Type") == 0)
m_oledType = (unsigned char)::atoi(value);
else if (::strcmp(key, "Brightness") == 0)
m_oledBrightness = (unsigned char)::atoi(value);
else if (::strcmp(key, "Invert") == 0)
m_oledInvert = ::atoi(value) == 1;
else if (::strcmp(key, "Scroll") == 0)
m_oledScroll = ::atoi(value) == 1;
else if (::strcmp(key, "Rotate") == 0)
m_oledRotate = ::atoi(value) == 1;
else if (::strcmp(key, "LogoScreensaver") == 0)
m_oledLogoScreensaver = ::atoi(value) == 1;
} else if (section == SECTION_LCDPROC) {
if (::strcmp(key, "Address") == 0)
m_lcdprocAddress = value;
else if (::strcmp(key, "Port") == 0)
m_lcdprocPort = (unsigned short)::atoi(value);
else if (::strcmp(key, "LocalPort") == 0)
m_lcdprocLocalPort = (unsigned short)::atoi(value);
else if (::strcmp(key, "DisplayClock") == 0)
m_lcdprocDisplayClock = ::atoi(value) == 1;
else if (::strcmp(key, "UTC") == 0)
m_lcdprocUTC = ::atoi(value) == 1;
else if (::strcmp(key, "DimOnIdle") == 0)
m_lcdprocDimOnIdle = ::atoi(value) == 1;
} else if (section == SECTION_LOCK_FILE) {
if (::strcmp(key, "Enable") == 0)
m_lockFileEnabled = ::atoi(value) == 1;
@@ -1183,11 +1061,6 @@ bool CConf::getDuplex() const
return m_duplex;
}
std::string CConf::getDisplay() const
{
return m_display;
}
bool CConf::getDaemon() const
{
return m_daemon;
@@ -2363,161 +2236,6 @@ bool CConf::getAX25NetworkDebug() const
return m_ax25NetworkDebug;
}
std::string CConf::getTFTSerialPort() const
{
return m_tftSerialPort;
}
unsigned int CConf::getTFTSerialBrightness() const
{
return m_tftSerialBrightness;
}
unsigned int CConf::getHD44780Rows() const
{
return m_hd44780Rows;
}
unsigned int CConf::getHD44780Columns() const
{
return m_hd44780Columns;
}
std::vector<unsigned int> CConf::getHD44780Pins() const
{
return m_hd44780Pins;
}
unsigned int CConf::getHD44780i2cAddress() const
{
return m_hd44780i2cAddress;
}
bool CConf::getHD44780PWM() const
{
return m_hd44780PWM;
}
unsigned int CConf::getHD44780PWMPin() const
{
return m_hd44780PWMPin;
}
unsigned int CConf::getHD44780PWMBright() const
{
return m_hd44780PWMBright;
}
unsigned int CConf::getHD44780PWMDim() const
{
return m_hd44780PWMDim;
}
bool CConf::getHD44780DisplayClock() const
{
return m_hd44780DisplayClock;
}
bool CConf::getHD44780UTC() const
{
return m_hd44780UTC;
}
std::string CConf::getNextionPort() const
{
return m_nextionPort;
}
unsigned int CConf::getNextionBrightness() const
{
return m_nextionBrightness;
}
bool CConf::getNextionDisplayClock() const
{
return m_nextionDisplayClock;
}
bool CConf::getNextionUTC() const
{
return m_nextionUTC;
}
unsigned int CConf::getNextionIdleBrightness() const
{
return m_nextionIdleBrightness;
}
unsigned int CConf::getNextionScreenLayout() const
{
return m_nextionScreenLayout;
}
unsigned char CConf::getOLEDType() const
{
return m_oledType;
}
unsigned char CConf::getOLEDBrightness() const
{
return m_oledBrightness;
}
bool CConf::getOLEDInvert() const
{
return m_oledInvert;
}
bool CConf::getOLEDScroll() const
{
return m_oledScroll;
}
bool CConf::getOLEDRotate() const
{
return m_oledRotate;
}
bool CConf::getOLEDLogoScreensaver() const
{
return m_oledLogoScreensaver;
}
std::string CConf::getLCDprocAddress() const
{
return m_lcdprocAddress;
}
unsigned short CConf::getLCDprocPort() const
{
return m_lcdprocPort;
}
unsigned short CConf::getLCDprocLocalPort() const
{
return m_lcdprocLocalPort;
}
bool CConf::getLCDprocDisplayClock() const
{
return m_lcdprocDisplayClock;
}
bool CConf::getLCDprocUTC() const
{
return m_lcdprocUTC;
}
bool CConf::getLCDprocDimOnIdle() const
{
return m_lcdprocDimOnIdle;
}
bool CConf::getNextionTempInFahrenheit() const
{
return m_nextionTempInFahrenheit;
}
bool CConf::getLockFileEnabled() const
{
return m_lockFileEnabled;

79
Conf.h
View File

@@ -35,7 +35,6 @@ public:
unsigned int getId() const;
unsigned int getTimeout() const;
bool getDuplex() const;
std::string getDisplay() const;
bool getDaemon() const;
// The Info section
@@ -324,47 +323,6 @@ public:
unsigned int getAX25NetworkSpeed() const;
bool getAX25NetworkDebug() const;
// The TFTSERIAL section
std::string getTFTSerialPort() const;
unsigned int getTFTSerialBrightness() const;
// The HD44780 section
unsigned int getHD44780Rows() const;
unsigned int getHD44780Columns() const;
std::vector<unsigned int> getHD44780Pins() const;
unsigned int getHD44780i2cAddress() const;
bool getHD44780PWM() const;
unsigned int getHD44780PWMPin() const;
unsigned int getHD44780PWMBright() const;
unsigned int getHD44780PWMDim() const;
bool getHD44780DisplayClock() const;
bool getHD44780UTC() const;
// The Nextion section
std::string getNextionPort() const;
unsigned int getNextionBrightness() const;
bool getNextionDisplayClock() const;
bool getNextionUTC() const;
unsigned int getNextionIdleBrightness() const;
unsigned int getNextionScreenLayout() const;
bool getNextionTempInFahrenheit() const;
// The OLED section
unsigned char getOLEDType() const;
unsigned char getOLEDBrightness() const;
bool getOLEDInvert() const;
bool getOLEDScroll() const;
bool getOLEDRotate() const;
bool getOLEDLogoScreensaver() const;
// The LCDproc section
std::string getLCDprocAddress() const;
unsigned short getLCDprocPort() const;
unsigned short getLCDprocLocalPort() const;
bool getLCDprocDisplayClock() const;
bool getLCDprocUTC() const;
bool getLCDprocDimOnIdle() const;
// The Lock File section
bool getLockFileEnabled() const;
std::string getLockFileName() const;
@@ -380,7 +338,6 @@ private:
unsigned int m_id;
unsigned int m_timeout;
bool m_duplex;
std::string m_display;
bool m_daemon;
unsigned int m_rxFrequency;
@@ -643,42 +600,6 @@ private:
unsigned int m_ax25NetworkSpeed;
bool m_ax25NetworkDebug;
std::string m_tftSerialPort;
unsigned int m_tftSerialBrightness;
unsigned int m_hd44780Rows;
unsigned int m_hd44780Columns;
std::vector<unsigned int> m_hd44780Pins;
unsigned int m_hd44780i2cAddress;
bool m_hd44780PWM;
unsigned int m_hd44780PWMPin;
unsigned int m_hd44780PWMBright;
unsigned int m_hd44780PWMDim;
bool m_hd44780DisplayClock;
bool m_hd44780UTC;
std::string m_nextionPort;
unsigned int m_nextionBrightness;
bool m_nextionDisplayClock;
bool m_nextionUTC;
unsigned int m_nextionIdleBrightness;
unsigned int m_nextionScreenLayout;
bool m_nextionTempInFahrenheit;
unsigned char m_oledType;
unsigned char m_oledBrightness;
bool m_oledInvert;
bool m_oledScroll;
bool m_oledRotate;
bool m_oledLogoScreensaver;
std::string m_lcdprocAddress;
unsigned short m_lcdprocPort;
unsigned short m_lcdprocLocalPort;
bool m_lcdprocDisplayClock;
bool m_lcdprocUTC;
bool m_lcdprocDimOnIdle;
bool m_lockFileEnabled;
std::string m_lockFileName;

View File

@@ -21,7 +21,7 @@
#include <cassert>
#include <algorithm>
CDMRControl::CDMRControl(unsigned int id, unsigned int colorCode, unsigned int callHang, bool selfOnly, bool embeddedLCOnly, bool dumpTAData, const std::vector<unsigned int>& prefixes, const std::vector<unsigned int>& blacklist, const std::vector<unsigned int>& whitelist, const std::vector<unsigned int>& slot1TGWhitelist, const std::vector<unsigned int>& slot2TGWhitelist, unsigned int timeout, CModem* modem, CDMRNetwork* network, CDisplay* display, bool duplex, CDMRLookup* lookup, CRSSIInterpolator* rssi, unsigned int jitter, DMR_OVCM_TYPES ovcm) :
CDMRControl::CDMRControl(unsigned int id, unsigned int colorCode, unsigned int callHang, bool selfOnly, bool embeddedLCOnly, bool dumpTAData, const std::vector<unsigned int>& prefixes, const std::vector<unsigned int>& blacklist, const std::vector<unsigned int>& whitelist, const std::vector<unsigned int>& slot1TGWhitelist, const std::vector<unsigned int>& slot2TGWhitelist, unsigned int timeout, CModem* modem, CDMRNetwork* network, bool duplex, CDMRLookup* lookup, CRSSIInterpolator* rssi, unsigned int jitter, DMR_OVCM_TYPES ovcm) :
m_colorCode(colorCode),
m_modem(modem),
m_network(network),
@@ -31,14 +31,13 @@ m_lookup(lookup)
{
assert(id != 0U);
assert(modem != NULL);
assert(display != NULL);
assert(lookup != NULL);
assert(rssi != NULL);
// Load black and white lists to DMRAccessControl
CDMRAccessControl::init(blacklist, whitelist, slot1TGWhitelist, slot2TGWhitelist, selfOnly, prefixes, id);
CDMRSlot::init(colorCode, embeddedLCOnly, dumpTAData, callHang, modem, network, display, duplex, m_lookup, rssi, jitter, ovcm);
CDMRSlot::init(colorCode, embeddedLCOnly, dumpTAData, callHang, modem, network, duplex, m_lookup, rssi, jitter, ovcm);
}
CDMRControl::~CDMRControl()

View File

@@ -22,7 +22,6 @@
#include "RSSIInterpolator.h"
#include "DMRNetwork.h"
#include "DMRLookup.h"
#include "Display.h"
#include "DMRSlot.h"
#include "DMRData.h"
#include "Modem.h"
@@ -31,7 +30,7 @@
class CDMRControl {
public:
CDMRControl(unsigned int id, unsigned int colorCode, unsigned int callHang, bool selfOnly, bool embeddedLCOnly, bool dumpTAData, const std::vector<unsigned int>& prefixes, const std::vector<unsigned int>& blacklist, const std::vector<unsigned int>& whitelist, const std::vector<unsigned int>& slot1TGWhitelist, const std::vector<unsigned int>& slot2TGWhitelist, unsigned int timeout, CModem* modem, CDMRNetwork* network, CDisplay* display, bool duplex, CDMRLookup* lookup, CRSSIInterpolator* rssi, unsigned int jitter, DMR_OVCM_TYPES ovcm);
CDMRControl(unsigned int id, unsigned int colorCode, unsigned int callHang, bool selfOnly, bool embeddedLCOnly, bool dumpTAData, const std::vector<unsigned int>& prefixes, const std::vector<unsigned int>& blacklist, const std::vector<unsigned int>& whitelist, const std::vector<unsigned int>& slot1TGWhitelist, const std::vector<unsigned int>& slot2TGWhitelist, unsigned int timeout, CModem* modem, CDMRNetwork* network, bool duplex, CDMRLookup* lookup, CRSSIInterpolator* rssi, unsigned int jitter, DMR_OVCM_TYPES ovcm);
~CDMRControl();
bool processWakeup(const unsigned char* data);

View File

@@ -39,7 +39,6 @@ bool CDMRSlot::m_dumpTAData = true;
CModem* CDMRSlot::m_modem = NULL;
CDMRNetwork* CDMRSlot::m_network = NULL;
CDisplay* CDMRSlot::m_display = NULL;
bool CDMRSlot::m_duplex = true;
CDMRLookup* CDMRSlot::m_lookup = NULL;
unsigned int CDMRSlot::m_hangCount = 3U * 17U;
@@ -320,8 +319,6 @@ bool CDMRSlot::writeModem(unsigned char *data, unsigned int len)
if (m_netState == RS_NET_IDLE) {
setShortLC(m_slotNo, dstId, flco, ACTIVITY_VOICE);
m_display->writeDMR(m_slotNo, src, flco == FLCO_GROUP, dst, "R");
m_display->writeDMRRSSI(m_slotNo, m_rssi);
writeJSONRSSI();
writeJSONBER();
}
@@ -395,8 +392,6 @@ bool CDMRSlot::writeModem(unsigned char *data, unsigned int len)
writeJSONRF("end", float(m_rfFrames) / 16.667F, float(m_rfErrs * 100U) / float(m_rfBits));
}
m_display->writeDMRTA(m_slotNo, NULL, " ");
if (m_rfTimeout) {
writeEndRF();
return false;
@@ -458,8 +453,6 @@ bool CDMRSlot::writeModem(unsigned char *data, unsigned int len)
if (m_netState == RS_NET_IDLE) {
setShortLC(m_slotNo, dstId, gi ? FLCO_GROUP : FLCO_USER_USER, ACTIVITY_DATA);
m_display->writeDMR(m_slotNo, src, gi, dst, "R");
m_display->writeDMRRSSI(m_slotNo, m_rssi);
writeJSONRSSI();
}
@@ -569,8 +562,6 @@ bool CDMRSlot::writeModem(unsigned char *data, unsigned int len)
// If data preamble, signal its existence
if (m_netState == RS_NET_IDLE && csbko == CSBKO_PRECCSBK && csbk.getDataContent()) {
setShortLC(m_slotNo, dstId, gi ? FLCO_GROUP : FLCO_USER_USER, ACTIVITY_DATA);
m_display->writeDMR(m_slotNo, src, gi, dst, "R");
m_display->writeDMRRSSI(m_slotNo, m_rssi);
writeJSONRSSI();
}
@@ -635,7 +626,6 @@ bool CDMRSlot::writeModem(unsigned char *data, unsigned int len)
m_rfErrs += errors;
m_bitErrsAccum += errors;
m_display->writeDMRBER(m_slotNo, float(errors) / 1.41F);
writeJSONBER();
}
@@ -648,7 +638,6 @@ bool CDMRSlot::writeModem(unsigned char *data, unsigned int len)
m_rfEmbeddedData[m_rfEmbeddedWriteN].reset();
m_display->writeDMRRSSI(m_slotNo, m_rssi);
writeJSONRSSI();
if (!m_rfTimeout) {
@@ -688,7 +677,6 @@ bool CDMRSlot::writeModem(unsigned char *data, unsigned int len)
m_rfErrs += errors;
m_bitErrsAccum += errors;
m_display->writeDMRBER(m_slotNo, float(errors) / 1.41F);
writeJSONBER();
}
@@ -736,10 +724,8 @@ bool CDMRSlot::writeModem(unsigned char *data, unsigned int len)
m_rfTalkerAlias.reset();
bool complete = m_rfTalkerAlias.add(0U, data + 2U, 7U);
if (complete) {
if (complete)
writeJSONText(m_rfTalkerAlias.get());
m_display->writeDMRTA(m_slotNo, m_rfTalkerAlias.get(), "R");
}
if (m_dumpTAData) {
::sprintf(text, "DMR Slot %u, Embedded Talker Alias Header", m_slotNo);
@@ -759,10 +745,8 @@ bool CDMRSlot::writeModem(unsigned char *data, unsigned int len)
m_rfTalkerAlias.reset();
bool complete = m_rfTalkerAlias.add(1U, data + 2U, 7U);
if (complete) {
if (complete)
writeJSONText(m_rfTalkerAlias.get());
m_display->writeDMRTA(m_slotNo, m_rfTalkerAlias.get(), "R");
}
if (m_dumpTAData) {
::sprintf(text, "DMR Slot %u, Embedded Talker Alias Block 1", m_slotNo);
@@ -782,10 +766,8 @@ bool CDMRSlot::writeModem(unsigned char *data, unsigned int len)
m_rfTalkerAlias.reset();
bool complete = m_rfTalkerAlias.add(2U, data + 2U, 7U);
if (complete) {
if (complete)
writeJSONText(m_rfTalkerAlias.get());
m_display->writeDMRTA(m_slotNo, m_rfTalkerAlias.get(), "R");
}
if (m_dumpTAData) {
::sprintf(text, "DMR Slot %u, Embedded Talker Alias Block 2", m_slotNo);
@@ -805,10 +787,8 @@ bool CDMRSlot::writeModem(unsigned char *data, unsigned int len)
m_rfTalkerAlias.reset();
bool complete = m_rfTalkerAlias.add(3U, data + 2U, 7U);
if (complete) {
if (complete)
writeJSONText(m_rfTalkerAlias.get());
m_display->writeDMRTA(m_slotNo, m_rfTalkerAlias.get(), "R");
}
if (m_dumpTAData) {
::sprintf(text, "DMR Slot %u, Embedded Talker Alias Block 3", m_slotNo);
@@ -991,9 +971,6 @@ bool CDMRSlot::writeModem(unsigned char *data, unsigned int len)
if (m_netState == RS_NET_IDLE) {
setShortLC(m_slotNo, dstId, flco, ACTIVITY_VOICE);
m_display->writeDMR(m_slotNo, src, flco == FLCO_GROUP, dst, "R");
m_display->writeDMRRSSI(m_slotNo, m_rssi);
m_display->writeDMRBER(m_slotNo, float(errors) / 1.41F);
writeJSONRSSI();
writeJSONBER();
}
@@ -1028,10 +1005,8 @@ void CDMRSlot::writeEndRF(bool writeEnd)
{
m_rfState = RS_RF_LISTENING;
if (m_netState == RS_NET_IDLE) {
if (m_netState == RS_NET_IDLE)
setShortLC(m_slotNo, 0U);
m_display->clearDMR(m_slotNo);
}
if (writeEnd) {
if (m_netState == RS_NET_IDLE && m_duplex && !m_rfTimeout) {
@@ -1079,8 +1054,6 @@ void CDMRSlot::writeEndNet(bool writeEnd)
setShortLC(m_slotNo, 0U);
m_display->clearDMR(m_slotNo);
m_lastFrameValid = false;
if (writeEnd && !m_netTimeout) {
@@ -1229,7 +1202,6 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData)
std::string dst = m_lookup->find(dstId);
class CUserDBentry cn;
m_lookup->findWithName(srcId, &cn);
m_display->writeDMR(m_slotNo, cn, flco == FLCO_GROUP, dst, "N");
#if defined(DUMP_DMR)
openFile();
@@ -1305,8 +1277,6 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData)
class CUserDBentry cn;
m_lookup->findWithName(srcId, &cn);
m_display->writeDMR(m_slotNo, cn, m_netLC->getFLCO() == FLCO_GROUP, dst, "N");
LogMessage("DMR Slot %u, received network late entry from %s to %s%s", m_slotNo, src.c_str(), m_netLC->getFLCO() == FLCO_GROUP ? "TG " : "", dst.c_str());
writeJSONNet("late_entry", srcId, src, m_netLC->getFLCO() == FLCO_GROUP, dstId);
}
@@ -1378,7 +1348,6 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData)
m_netFrames += 2U;
LogMessage("DMR Slot %u, received network end of voice transmission from %s to %s%s, %.1f seconds, %u%% packet loss, BER: %.1f%%", m_slotNo, src.c_str(), flco == FLCO_GROUP ? "TG " : "", dst.c_str(), float(m_netFrames) / 16.667F, (m_netLost * 100U) / m_netFrames, float(m_netErrs * 100U) / float(m_netBits));
writeJSONNet("end", float(m_netFrames) / 16.667F, (m_netLost * 100U) / m_netFrames, float(m_netErrs * 100U) / float(m_netBits));
m_display->writeDMRTA(m_slotNo, NULL, " ");
writeEndNet();
} else if (dataType == DT_DATA_HEADER) {
if (m_netState == RS_NET_DATA)
@@ -1425,8 +1394,6 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData)
std::string src = m_lookup->find(srcId);
std::string dst = m_lookup->find(dstId);
m_display->writeDMR(m_slotNo, src, gi, dst, "N");
LogMessage("DMR Slot %u, received network data header from %s to %s%s, %u blocks", m_slotNo, src.c_str(), gi ? "TG ": "", dst.c_str(), m_netFrames);
writeJSONNet("start", srcId, src, gi, dstId, m_netFrames);
@@ -1512,8 +1479,6 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData)
class CUserDBentry cn;
m_lookup->findWithName(srcId, &cn);
m_display->writeDMR(m_slotNo, cn, m_netLC->getFLCO() == FLCO_GROUP, dst, "N");
LogMessage("DMR Slot %u, received network late entry from %s to %s%s", m_slotNo, src.c_str(), m_netLC->getFLCO() == FLCO_GROUP ? "TG " : "", dst.c_str());
writeJSONNet("late_entry", srcId, src, m_netLC->getFLCO() == FLCO_GROUP, dstId);
}
@@ -1602,10 +1567,8 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData)
m_netTalkerAlias.reset();
bool complete = m_netTalkerAlias.add(0U, data + 2U, 7U);
if (complete) {
if (complete)
writeJSONText(m_netTalkerAlias.get());
m_display->writeDMRTA(m_slotNo, m_netTalkerAlias.get(), "N");
}
if (m_dumpTAData) {
::sprintf(text, "DMR Slot %u, Embedded Talker Alias Header", m_slotNo);
@@ -1621,10 +1584,8 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData)
m_netTalkerAlias.reset();
bool complete = m_netTalkerAlias.add(1U, data + 2U, 7U);
if (complete) {
if (complete)
writeJSONText(m_netTalkerAlias.get());
m_display->writeDMRTA(m_slotNo, m_netTalkerAlias.get(), "N");
}
if (m_dumpTAData) {
::sprintf(text, "DMR Slot %u, Embedded Talker Alias Block 1", m_slotNo);
@@ -1640,10 +1601,8 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData)
m_netTalkerAlias.reset();
bool complete = m_netTalkerAlias.add(2U, data + 2U, 7U);
if (complete) {
if (complete)
writeJSONText(m_netTalkerAlias.get());
m_display->writeDMRTA(m_slotNo, m_netTalkerAlias.get(), "N");
}
if (m_dumpTAData) {
::sprintf(text, "DMR Slot %u, Embedded Talker Alias Block 2", m_slotNo);
@@ -1659,10 +1618,8 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData)
m_netTalkerAlias.reset();
bool complete = m_netTalkerAlias.add(3U, data + 2U, 7U);
if (complete) {
if (complete)
writeJSONText(m_netTalkerAlias.get());
m_display->writeDMRTA(m_slotNo, m_netTalkerAlias.get(), "N");
}
if (m_dumpTAData) {
::sprintf(text, "DMR Slot %u, Embedded Talker Alias Block 3", m_slotNo);
@@ -1826,10 +1783,8 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData)
}
// If data preamble, signal its existence
if (csbko == CSBKO_PRECCSBK && csbk.getDataContent()) {
if (csbko == CSBKO_PRECCSBK && csbk.getDataContent())
setShortLC(m_slotNo, dstId, gi ? FLCO_GROUP : FLCO_USER_USER, ACTIVITY_DATA);
m_display->writeDMR(m_slotNo, src, gi, dst, "N");
}
} else if (dataType == DT_RATE_12_DATA || dataType == DT_RATE_34_DATA || dataType == DT_RATE_1_DATA) {
if (m_netState != RS_NET_DATA || m_netFrames == 0U) {
writeEndNet();
@@ -2065,10 +2020,9 @@ void CDMRSlot::writeQueueNet(const unsigned char *data)
m_queue.addData(data, len);
}
void CDMRSlot::init(unsigned int colorCode, bool embeddedLCOnly, bool dumpTAData, unsigned int callHang, CModem* modem, CDMRNetwork* network, CDisplay* display, bool duplex, CDMRLookup* lookup, CRSSIInterpolator* rssiMapper, unsigned int jitter, DMR_OVCM_TYPES ovcm)
void CDMRSlot::init(unsigned int colorCode, bool embeddedLCOnly, bool dumpTAData, unsigned int callHang, CModem* modem, CDMRNetwork* network, bool duplex, CDMRLookup* lookup, CRSSIInterpolator* rssiMapper, unsigned int jitter, DMR_OVCM_TYPES ovcm)
{
assert(modem != NULL);
assert(display != NULL);
assert(lookup != NULL);
assert(rssiMapper != NULL);
@@ -2077,7 +2031,6 @@ void CDMRSlot::init(unsigned int colorCode, bool embeddedLCOnly, bool dumpTAData
m_dumpTAData = dumpTAData;
m_modem = modem;
m_network = network;
m_display = display;
m_duplex = duplex;
m_lookup = lookup;
m_hangCount = callHang * 17U;

View File

@@ -29,7 +29,6 @@
#include "AMBEFEC.h"
#include "DMRSlot.h"
#include "DMRData.h"
#include "Display.h"
#include "Defines.h"
#include "Timer.h"
#include "Modem.h"
@@ -64,7 +63,7 @@ public:
void enable(bool enabled);
static void init(unsigned int colorCode, bool embeddedLCOnly, bool dumpTAData, unsigned int callHang, CModem* modem, CDMRNetwork* network, CDisplay* display, bool duplex, CDMRLookup* lookup, CRSSIInterpolator* rssiMapper, unsigned int jitter, DMR_OVCM_TYPES ovcm);
static void init(unsigned int colorCode, bool embeddedLCOnly, bool dumpTAData, unsigned int callHang, CModem* modem, CDMRNetwork* network, bool duplex, CDMRLookup* lookup, CRSSIInterpolator* rssiMapper, unsigned int jitter, DMR_OVCM_TYPES ovcm);
private:
unsigned int m_slotNo;
@@ -126,7 +125,6 @@ private:
static CModem* m_modem;
static CDMRNetwork* m_network;
static CDisplay* m_display;
static bool m_duplex;
static CDMRLookup* m_lookup;
static unsigned int m_hangCount;

View File

@@ -15,7 +15,6 @@
#include "Utils.h"
#include "Sync.h"
#include "Log.h"
#include "SMeter.h"
#include <cstdio>
#include <cassert>
@@ -41,7 +40,7 @@ bool CallsignCompare(const std::string& arg, const unsigned char* my)
// #define DUMP_DSTAR
CDStarControl::CDStarControl(const std::string& callsign, const std::string& module, bool selfOnly, bool ackReply, unsigned int ackTime, DSTAR_ACK_MESSAGE ackMessage, bool errorReply, const std::vector<std::string>& blackList, const std::vector<std::string>& whiteList, CDStarNetwork* network, CDisplay* display, unsigned int timeout, bool duplex, bool remoteGateway, CRSSIInterpolator* rssiMapper) :
CDStarControl::CDStarControl(const std::string& callsign, const std::string& module, bool selfOnly, bool ackReply, unsigned int ackTime, DSTAR_ACK_MESSAGE ackMessage, bool errorReply, const std::vector<std::string>& blackList, const std::vector<std::string>& whiteList, CDStarNetwork* network, unsigned int timeout, bool duplex, bool remoteGateway, CRSSIInterpolator* rssiMapper) :
m_callsign(NULL),
m_gateway(NULL),
m_selfOnly(selfOnly),
@@ -52,7 +51,6 @@ m_remoteGateway(remoteGateway),
m_blackList(blackList),
m_whiteList(whiteList),
m_network(network),
m_display(display),
m_duplex(duplex),
m_queue(5000U, "D-Star Control"),
m_rfHeader(),
@@ -102,7 +100,6 @@ m_netNextFrameIsFastData(false),
m_rfSkipDTMFBlankingFrames(0U),
m_netSkipDTMFBlankingFrames(0U)
{
assert(display != NULL);
assert(rssiMapper != NULL);
m_callsign = new unsigned char[DSTAR_LONG_CALLSIGN_LENGTH];
@@ -411,11 +408,8 @@ bool CDStarControl::writeModem(unsigned char *data, unsigned int len)
m_rfState = RS_RF_AUDIO;
if (m_netState == RS_NET_IDLE) {
m_display->writeDStar((char*)my1, (char*)my2, (char*)your, "R", " ");
m_display->writeDStarRSSI(m_rssi);
if (m_netState == RS_NET_IDLE)
writeJSONRSSI();
}
LogMessage("D-Star, received RF header from %8.8s/%4.4s to %8.8s", my1, my2, your);
writeJSONRF("start", my1, my2, your);
@@ -486,7 +480,6 @@ bool CDStarControl::writeModem(unsigned char *data, unsigned int len)
// Regenerate the sync and send the RSSI data to the display
if (m_rfN == 0U) {
CSync::addDStarSync(data + 1U);
m_display->writeDStarRSSI(m_rssi);
writeJSONRSSI();
}
@@ -495,7 +488,6 @@ bool CDStarControl::writeModem(unsigned char *data, unsigned int len)
errors = maybeFixupVoiceFrame(data, len, 1U, "RF", m_rfN, m_duplex, m_rfVoiceSyncData, m_rfVoiceSyncDataLen, m_rfNextFrameIsFastData, m_rfSkipDTMFBlankingFrames);
m_bitErrsAccum += errors;
m_rfErrs += errors;
m_display->writeDStarBER(float(errors) / 0.48F);
writeJSONBER();
}
@@ -656,9 +648,6 @@ bool CDStarControl::writeModem(unsigned char *data, unsigned int len)
m_rfN = (m_rfN + 1U) % 21U;
if (m_netState == RS_NET_IDLE) {
m_display->writeDStar((char*)my1, (char*)my2, (char*)your, "R", " ");
m_display->writeDStarRSSI(m_rssi);
m_display->writeDStarBER(float(errors) / 0.48F);
writeJSONRSSI();
writeJSONBER();
}
@@ -695,8 +684,6 @@ void CDStarControl::writeEndRF()
m_rfTimeoutTimer.stop();
if (m_netState == RS_NET_IDLE) {
m_display->clearDStar();
m_ackTimer.start();
if (m_network != NULL)
@@ -710,8 +697,6 @@ void CDStarControl::writeEndNet()
m_lastFrameValid = false;
m_display->clearDStar();
m_netTimeoutTimer.stop();
m_networkWatchdog.stop();
m_packetTimer.stop();
@@ -793,11 +778,9 @@ void CDStarControl::writeNetwork()
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) {
m_display->writeDStar((char*)my1, (char*)my2, (char*)your, "N", (char*) reflector);
LogMessage("D-Star, received network header from %8.8s/%4.4s to %8.8s via %8.8s", my1, my2, your, reflector);
writeJSONNet("start", my1, my2, your, reflector);
} else {
m_display->writeDStar((char*)my1, (char*)my2, (char*)your, "N", (char*) " ");
LogMessage("D-Star, received network header from %8.8s/%4.4s to %8.8s", my1, my2, your);
writeJSONNet("start", my1, my2, your);
}
@@ -1258,9 +1241,23 @@ void CDStarControl::sendAck()
::sprintf(text, "BER:%.1f%% -%udBm ", float(m_rfErrs * 100U) / float(m_rfBits), m_aveRSSI / m_rssiCountTotal);
}
} else if (m_ackMessage == DSTAR_ACK_SMETER && m_rssi != 0) {
unsigned int signal, plus;
const unsigned int RSSI_S1 = 141U;
const unsigned int RSSI_S9 = 93U;
unsigned int signal = 0U;
unsigned int plus = 0U;
unsigned int rssi = m_aveRSSI / m_rssiCountTotal;
if (rssi > RSSI_S1) {
plus = rssi - RSSI_S1;
} else if (rssi > RSSI_S9 && rssi <= RSSI_S1) {
signal = ((RSSI_S1 - rssi) / 6U) + 1U;
plus = (RSSI_S1 - rssi) % 6U;
} else {
plus = RSSI_S9 - rssi;
}
char signalText[15U];
CSMeter::getSignal(m_aveRSSI / m_rssiCountTotal, signal, plus);
if (plus != 0U)
::sprintf(signalText, "S%u+%02u", signal, plus);
else
@@ -1323,9 +1320,23 @@ void CDStarControl::sendError()
::sprintf(text, "BER:%.1f%% -%udBm ", float(m_rfErrs * 100U) / float(m_rfBits), m_aveRSSI / m_rssiCountTotal);
}
} else if (m_ackMessage == DSTAR_ACK_SMETER && m_rssi != 0) {
unsigned int signal, plus;
const unsigned int RSSI_S1 = 141U;
const unsigned int RSSI_S9 = 93U;
unsigned int signal = 0U;
unsigned int plus = 0U;
unsigned int rssi = m_aveRSSI / m_rssiCountTotal;
if (rssi > RSSI_S1) {
plus = rssi - RSSI_S1;
} else if (rssi > RSSI_S9 && rssi <= RSSI_S1) {
signal = ((RSSI_S1 - rssi) / 6U) + 1U;
plus = (RSSI_S1 - rssi) % 6U;
} else {
plus = RSSI_S9 - rssi;
}
char signalText[15U];
CSMeter::getSignal(m_aveRSSI / m_rssiCountTotal, signal, plus);
if (plus != 0U)
::sprintf(signalText, "S%u+%02u", signal, plus);
else

View File

@@ -27,7 +27,6 @@
#include "RingBuffer.h"
#include "StopWatch.h"
#include "AMBEFEC.h"
#include "Display.h"
#include "Defines.h"
#include "Timer.h"
#include "Modem.h"
@@ -39,7 +38,7 @@
class CDStarControl {
public:
CDStarControl(const std::string& callsign, const std::string& module, bool selfOnly, bool ackReply, unsigned int ackTime, DSTAR_ACK_MESSAGE ackMessage, bool errorReply, const std::vector<std::string>& blackList, const std::vector<std::string>& whiteList, CDStarNetwork* network, CDisplay* display, unsigned int timeout, bool duplex, bool remoteGateway, CRSSIInterpolator* rssiMapper);
CDStarControl(const std::string& callsign, const std::string& module, bool selfOnly, bool ackReply, unsigned int ackTime, DSTAR_ACK_MESSAGE ackMessage, bool errorReply, const std::vector<std::string>& blackList, const std::vector<std::string>& whiteList, CDStarNetwork* network, unsigned int timeout, bool duplex, bool remoteGateway, CRSSIInterpolator* rssiMapper);
~CDStarControl();
bool writeModem(unsigned char* data, unsigned int len);
@@ -63,7 +62,6 @@ private:
std::vector<std::string> m_blackList;
std::vector<std::string> m_whiteList;
CDStarNetwork* m_network;
CDisplay* m_display;
bool m_duplex;
CRingBuffer<unsigned char> m_queue;
CDStarHeader m_rfHeader;

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2020,2021,2022,2023 Jonathan Naylor, G4KLX
* Copyright (C) 2020-2023 Jonathan Naylor, G4KLX
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -60,13 +60,12 @@ const unsigned char BIT_MASK_TABLE[] = { 0x80U, 0x40U, 0x20U, 0x10U, 0x08U, 0x04
#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])
#define READ_BIT(p,i) (p[(i)>>3] & BIT_MASK_TABLE[(i)&7])
CM17Control::CM17Control(const std::string& callsign, unsigned int can, bool selfOnly, bool allowEncryption, CM17Network* network, CDisplay* display, unsigned int timeout, bool duplex, CRSSIInterpolator* rssiMapper) :
CM17Control::CM17Control(const std::string& callsign, unsigned int can, bool selfOnly, bool allowEncryption, CM17Network* network, unsigned int timeout, bool duplex, CRSSIInterpolator* rssiMapper) :
m_callsign(callsign),
m_can(can),
m_selfOnly(selfOnly),
m_allowEncryption(allowEncryption),
m_network(network),
m_display(display),
m_duplex(duplex),
m_queue(5000U, "M17 Control"),
m_source(),
@@ -106,7 +105,6 @@ m_bitErrsAccum(0U),
m_enabled(true),
m_fp(NULL)
{
assert(display != NULL);
assert(rssiMapper != NULL);
m_rfText = new char[4U * M17_META_LENGTH_BYTES];
@@ -390,14 +388,10 @@ bool CM17Control::writeModem(unsigned char* data, unsigned int len)
m_bitErrsAccum += errors;
m_bitsCount += 272U;
writeJSONBER();
m_display->writeM17RSSI(m_rssi);
writeJSONRSSI();
float ber = float(m_rfErrs) / float(m_rfBits);
m_display->writeM17BER(ber);
if (m_duplex) {
unsigned char rfData[2U + M17_FRAME_LENGTH_BYTES];
@@ -545,8 +539,6 @@ void CM17Control::writeEndRF()
m_rfCollectedLSF.reset();
if (m_netState == RS_NET_IDLE) {
m_display->clearM17();
if (m_network != NULL)
m_network->reset();
}
@@ -568,8 +560,6 @@ void CM17Control::writeEndNet()
m_netLSF.reset();
m_display->clearM17();
if (m_network != NULL)
m_network->reset();
}
@@ -631,8 +621,6 @@ void CM17Control::writeNetwork()
return;
}
m_display->writeM17(m_source.c_str(), m_dest.c_str(), "N");
m_netTimeoutTimer.start();
m_elapsed.start();
m_netFrames = 0U;
@@ -832,8 +820,6 @@ bool CM17Control::processRFHeader(bool lateEntry)
return false;
}
m_display->writeM17(m_source.c_str(), m_dest.c_str(), "R");
createRFLSF(true);
if (m_duplex) {

View File

@@ -1,5 +1,5 @@
/*
* Copyright (C) 2020,2021,2022 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
@@ -24,7 +24,6 @@
#include "M17Defines.h"
#include "RingBuffer.h"
#include "StopWatch.h"
#include "Display.h"
#include "Defines.h"
#include "M17LSF.h"
#include "Timer.h"
@@ -36,7 +35,7 @@
class CM17Control {
public:
CM17Control(const std::string& callsign, unsigned int can, bool selfOnly, bool allowEncryption, CM17Network* network, CDisplay* display, unsigned int timeout, bool duplex, CRSSIInterpolator* rssiMapper);
CM17Control(const std::string& callsign, unsigned int can, bool selfOnly, bool allowEncryption, CM17Network* network, unsigned int timeout, bool duplex, CRSSIInterpolator* rssiMapper);
~CM17Control();
bool writeModem(unsigned char* data, unsigned int len);
@@ -55,7 +54,6 @@ private:
bool m_selfOnly;
bool m_allowEncryption;
CM17Network* m_network;
CDisplay* m_display;
bool m_duplex;
CRingBuffer<unsigned char> m_queue;
std::string m_source;

View File

@@ -6,7 +6,6 @@ Duplex=1
# ModeHang=10
RFModeHang=10
NetModeHang=3
Display=None
Daemon=0
[Info]
@@ -307,58 +306,6 @@ Port=/dev/ttyp7
Speed=9600
Debug=0
[TFT Serial]
# Port=modem
Port=/dev/ttyAMA0
Brightness=50
[HD44780]
Rows=2
Columns=16
# For basic HD44780 displays (4-bit connection)
# rs, strb, d0, d1, d2, d3
Pins=11,10,0,1,2,3
# Device address for I2C
I2CAddress=0x20
# PWM backlight
PWM=0
PWMPin=21
PWMBright=100
PWMDim=16
DisplayClock=1
UTC=0
[Nextion]
# Port=modem
Port=/dev/ttyAMA0
Brightness=50
DisplayClock=1
UTC=0
#Screen Layout: 0=G4KLX 2=ON7LDS
ScreenLayout=2
IdleBrightness=20
[OLED]
Type=3
Brightness=0
Invert=0
Scroll=1
Rotate=0
Cast=0
LogoScreensaver=1
[LCDproc]
Address=localhost
Port=13666
#LocalPort=13667
DimOnIdle=0
DisplayClock=1
UTC=0
[Lock File]
Enable=0
File=/tmp/MMDVM_Active.lck

View File

@@ -162,7 +162,6 @@ m_m17Network(NULL),
m_pocsagNetwork(NULL),
m_fmNetwork(NULL),
m_ax25Network(NULL),
m_display(NULL),
m_mode(MODE_IDLE),
m_dstarRFModeHang(10U),
m_dmrRFModeHang(10U),
@@ -364,8 +363,6 @@ int CMMDVMHost::run()
m_ax25Enabled = false;
}
m_display = CDisplay::createDisplay(m_conf, m_modem);
LogInfo("Opening network connections");
writeJSONMessage("Opening network connections");
@@ -537,7 +534,7 @@ int CMMDVMHost::run()
if (whiteList.size() > 0U)
LogInfo(" White List: %u", whiteList.size());
m_dstar = new CDStarControl(m_callsign, module, selfOnly, ackReply, ackTime, ackMessage, errorReply, blackList, whiteList, m_dstarNetwork, m_display, m_timeout, m_duplex, remoteGateway, rssi);
m_dstar = new CDStarControl(m_callsign, module, selfOnly, ackReply, ackTime, ackMessage, errorReply, blackList, whiteList, m_dstarNetwork, m_timeout, m_duplex, remoteGateway, rssi);
}
DMR_BEACONS dmrBeacons = DMR_BEACONS_OFF;
@@ -633,7 +630,7 @@ int CMMDVMHost::run()
break;
}
m_dmr = new CDMRControl(id, colorCode, callHang, selfOnly, embeddedLCOnly, dumpTAData, prefixes, blackList, whiteList, slot1TGWhiteList, slot2TGWhiteList, m_timeout, m_modem, m_dmrNetwork, m_display, m_duplex, m_dmrLookup, rssi, jitter, ovcm);
m_dmr = new CDMRControl(id, colorCode, callHang, selfOnly, embeddedLCOnly, dumpTAData, prefixes, blackList, whiteList, slot1TGWhiteList, slot2TGWhiteList, m_timeout, m_modem, m_dmrNetwork, m_duplex, m_dmrLookup, rssi, jitter, ovcm);
m_dmrTXTimer.setTimeout(txHang);
}
@@ -652,7 +649,7 @@ int CMMDVMHost::run()
LogInfo(" Self Only: %s", selfOnly ? "yes" : "no");
LogInfo(" Mode Hang: %us", m_ysfRFModeHang);
m_ysf = new CYSFControl(m_callsign, selfOnly, m_ysfNetwork, m_display, m_timeout, m_duplex, lowDeviation, remoteGateway, rssi);
m_ysf = new CYSFControl(m_callsign, selfOnly, m_ysfNetwork, m_timeout, m_duplex, lowDeviation, remoteGateway, rssi);
}
if (m_p25Enabled) {
@@ -673,7 +670,7 @@ int CMMDVMHost::run()
LogInfo(" TX Hang: %us", txHang);
LogInfo(" Mode Hang: %us", m_p25RFModeHang);
m_p25 = new CP25Control(nac, id, selfOnly, uidOverride, m_p25Network, m_display, m_timeout, m_duplex, m_dmrLookup, remoteGateway, rssi);
m_p25 = new CP25Control(nac, id, selfOnly, uidOverride, m_p25Network, m_timeout, m_duplex, m_dmrLookup, remoteGateway, rssi);
}
if (m_nxdnEnabled) {
@@ -703,7 +700,7 @@ int CMMDVMHost::run()
LogInfo(" TX Hang: %us", txHang);
LogInfo(" Mode Hang: %us", m_nxdnRFModeHang);
m_nxdn = new CNXDNControl(ran, id, selfOnly, m_nxdnNetwork, m_display, m_timeout, m_duplex, remoteGateway, m_nxdnLookup, rssi);
m_nxdn = new CNXDNControl(ran, id, selfOnly, m_nxdnNetwork, m_timeout, m_duplex, remoteGateway, m_nxdnLookup, rssi);
}
if (m_m17Enabled) {
@@ -720,7 +717,7 @@ int CMMDVMHost::run()
LogInfo(" TX Hang: %us", txHang);
LogInfo(" Mode Hang: %us", m_m17RFModeHang);
m_m17 = new CM17Control(m_callsign, can, selfOnly, allowEncryption, m_m17Network, m_display, m_timeout, m_duplex, rssi);
m_m17 = new CM17Control(m_callsign, can, selfOnly, allowEncryption, m_m17Network, m_timeout, m_duplex, rssi);
}
CTimer pocsagTimer(1000U, 30U);
@@ -731,7 +728,7 @@ int CMMDVMHost::run()
LogInfo("POCSAG RF Parameters");
LogInfo(" Frequency: %uHz", frequency);
m_pocsag = new CPOCSAGControl(m_pocsagNetwork, m_display);
m_pocsag = new CPOCSAGControl(m_pocsagNetwork);
if (m_pocsagNetwork != NULL)
pocsagTimer.start();
@@ -1206,8 +1203,6 @@ int CMMDVMHost::run()
unsigned int ms = stopWatch.elapsed();
stopWatch.start();
m_display->clock(ms);
m_modem->clock(ms);
if (!m_fixedMode)
@@ -1261,7 +1256,6 @@ int CMMDVMHost::run()
if (m_cwIdTimer.isRunning() && m_cwIdTimer.hasExpired()) {
if (!m_modem->hasTX()){
LogDebug("sending CW ID");
m_display->writeCW();
m_modem->sendCWId(m_cwCallsign);
m_cwIdTimer.setTimeout(m_cwIdTime);
@@ -1410,9 +1404,6 @@ int CMMDVMHost::run()
m_modem->close();
delete m_modem;
m_display->close();
delete m_display;
if (m_mqtt != NULL) {
m_mqtt->close();
delete m_mqtt;
@@ -1974,7 +1965,6 @@ void CMMDVMHost::readParams()
void CMMDVMHost::setMode(unsigned char mode)
{
assert(m_modem != NULL);
assert(m_display != NULL);
switch (mode) {
case MODE_DSTAR:
@@ -2338,7 +2328,6 @@ void CMMDVMHost::setMode(unsigned char mode)
m_dmrTXTimer.stop();
}
m_modem->setMode(MODE_FM);
m_display->setFM();
m_mode = MODE_FM;
m_modeTimer.start();
m_cwIdTimer.stop();
@@ -2388,7 +2377,6 @@ void CMMDVMHost::setMode(unsigned char mode)
m_dmrTXTimer.stop();
}
m_modem->setMode(MODE_IDLE);
m_display->setLockout();
m_mode = MODE_LOCKOUT;
m_modeTimer.stop();
m_cwIdTimer.stop();
@@ -2438,7 +2426,6 @@ void CMMDVMHost::setMode(unsigned char mode)
m_modem->writeDMRStart(false);
m_dmrTXTimer.stop();
}
m_display->setError("MODEM");
m_mode = MODE_ERROR;
m_modeTimer.stop();
m_cwIdTimer.stop();
@@ -2496,9 +2483,6 @@ void CMMDVMHost::setMode(unsigned char mode)
m_cwIdTimer.setTimeout(m_cwIdTime / 4U);
m_cwIdTimer.start();
}
m_display->setIdle();
if (mode == MODE_QUIT)
m_display->setQuit();
m_mode = MODE_IDLE;
m_modeTimer.stop();
removeLockFile();
@@ -2706,7 +2690,6 @@ void CMMDVMHost::remoteControl()
cwtext += " ";
cwtext += m_remoteControl->getArgString(i);
}
m_display->writeCW();
m_modem->sendCWId(cwtext);
}
break;

View File

@@ -40,7 +40,6 @@
#include "FMNetwork.h"
#include "DMRLookup.h"
#include "FMControl.h"
#include "Display.h"
#include "Timer.h"
#include "Modem.h"
#include "Conf.h"
@@ -79,7 +78,6 @@ private:
CPOCSAGNetwork* m_pocsagNetwork;
CFMNetwork* m_fmNetwork;
CAX25Network* m_ax25Network;
CDisplay* m_display;
unsigned char m_mode;
unsigned int m_dstarRFModeHang;
unsigned int m_dmrRFModeHang;

View File

@@ -239,7 +239,6 @@
<ClInclude Include="Modem.h" />
<ClInclude Include="SerialPort.h" />
<ClInclude Include="SHA256.h" />
<ClInclude Include="SMeter.h" />
<ClInclude Include="StopWatch.h" />
<ClInclude Include="Sync.h" />
<ClInclude Include="Thread.h" />
@@ -336,7 +335,6 @@
<ClCompile Include="Modem.cpp" />
<ClCompile Include="SerialPort.cpp" />
<ClCompile Include="SHA256.cpp" />
<ClCompile Include="SMeter.cpp" />
<ClCompile Include="StopWatch.cpp" />
<ClCompile Include="Sync.cpp" />
<ClCompile Include="Thread.cpp" />

View File

@@ -320,9 +320,6 @@
<ClInclude Include="ModemPort.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="SMeter.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<ClCompile Include="BPTC19696.cpp">
@@ -601,8 +598,5 @@
<ClCompile Include="ModemPort.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="SMeter.cpp">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup>
</Project>

View File

@@ -14,7 +14,7 @@ OBJECTS = \
MQTTPublisher.o Modem.o ModemPort.o ModemSerialPort.o Mutex.o NullController.o NXDNAudio.o NXDNControl.o \
NXDNConvolution.o NXDNCRC.o NXDNFACCH1.o NXDNIcomNetwork.o NXDNKenwoodNetwork.o NXDNLayer3.o NXDNLICH.o NXDNLookup.o NXDNNetwork.o NXDNSACCH.o \
NXDNUDCH.o P25Audio.o P25Control.o P25Data.o P25LowSpeedData.o P25Network.o P25NID.o P25Trellis.o P25Utils.o PseudoTTYController.o POCSAGControl.o \
POCSAGNetwork.o QR1676.o RemoteControl.o RS129.o RS241213.o RSSIInterpolator.o SerialPort.o SMeter.o StopWatch.o Sync.o SHA256.o Thread.o \
POCSAGNetwork.o QR1676.o RemoteControl.o RS129.o RS241213.o RSSIInterpolator.o SerialPort.o StopWatch.o Sync.o SHA256.o Thread.o \
Timer.o UARTController.o UDPController.o UDPSocket.o UserDB.o UserDBentry.o Utils.o YSFControl.o YSFConvolution.o YSFFICH.o YSFNetwork.o YSFPayload.o
all: MMDVMHost RemoteCommand

View File

@@ -42,12 +42,11 @@ const unsigned char BIT_MASK_TABLE[] = { 0x80U, 0x40U, 0x20U, 0x10U, 0x08U, 0x04
#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])
CNXDNControl::CNXDNControl(unsigned int ran, unsigned int id, bool selfOnly, INXDNNetwork* network, CDisplay* display, unsigned int timeout, bool duplex, bool remoteGateway, CNXDNLookup* lookup, CRSSIInterpolator* rssiMapper) :
CNXDNControl::CNXDNControl(unsigned int ran, unsigned int id, bool selfOnly, INXDNNetwork* network, unsigned int timeout, bool duplex, bool remoteGateway, CNXDNLookup* lookup, CRSSIInterpolator* rssiMapper) :
m_ran(ran),
m_id(id),
m_selfOnly(selfOnly),
m_network(network),
m_display(display),
m_duplex(duplex),
m_remoteGateway(remoteGateway),
m_lookup(lookup),
@@ -81,7 +80,6 @@ m_bitErrsAccum(0U),
m_enabled(true),
m_fp(NULL)
{
assert(display != NULL);
assert(lookup != NULL);
assert(rssiMapper != NULL);
}
@@ -321,7 +319,6 @@ bool CNXDNControl::processVoice(unsigned char usc, unsigned char option, unsigne
LogMessage("NXDN, received RF header from %s to %s%u", source.c_str(), grp ? "TG " : "", dstId);
writeJSONRF("start", srcId, source, grp, dstId);
m_display->writeNXDN(source.c_str(), grp, dstId, "R");
}
return true;
@@ -433,7 +430,6 @@ bool CNXDNControl::processVoice(unsigned char usc, unsigned char option, unsigne
std::string source = m_lookup->find(srcId);
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_display->writeNXDN(source.c_str(), grp, dstId, "R");
m_rfState = RS_RF_AUDIO;
@@ -523,7 +519,6 @@ bool CNXDNControl::processVoice(unsigned char usc, unsigned char option, unsigne
m_rfErrs += errors;
m_rfBits += 188U;
writeJSONBER(188U, errors);
m_display->writeNXDNBER(float(errors) / 1.88F);
LogDebug("NXDN, AMBE FEC %u/188 (%.1f%%)", errors, float(errors) / 1.88F);
CNXDNAudio audio;
@@ -543,7 +538,6 @@ bool CNXDNControl::processVoice(unsigned char usc, unsigned char option, unsigne
m_rfErrs += errors;
m_rfBits += 94U;
writeJSONBER(94U, errors);
m_display->writeNXDNBER(float(errors) / 0.94F);
LogDebug("NXDN, AMBE FEC %u/94 (%.1f%%)", errors, float(errors) / 0.94F);
CNXDNAudio audio;
@@ -556,7 +550,6 @@ bool CNXDNControl::processVoice(unsigned char usc, unsigned char option, unsigne
m_rfErrs += errors;
m_rfBits += 94U;
writeJSONBER(94U, errors);
m_display->writeNXDNBER(float(errors) / 0.94F);
LogDebug("NXDN, AMBE FEC %u/94 (%.1f%%)", errors, float(errors) / 0.94F);
CNXDNAudio audio;
@@ -597,7 +590,6 @@ bool CNXDNControl::processVoice(unsigned char usc, unsigned char option, unsigne
m_rfFrames++;
m_display->writeNXDNRSSI(m_rssi);
writeJSONRSSI();
}
@@ -645,8 +637,6 @@ bool CNXDNControl::processData(unsigned char option, unsigned char *data)
std::string source = m_lookup->find(srcId);
m_display->writeNXDN(source.c_str(), grp, dstId, "R");
m_display->writeNXDNRSSI(m_rssi);
writeJSONRSSI();
LogMessage("NXDN, received RF data header from %s to %s%u, %u blocks", source.c_str(), grp ? "TG " : "", dstId, frames);
@@ -754,8 +744,6 @@ void CNXDNControl::writeEndRF()
m_rfTimeoutTimer.stop();
if (m_netState == RS_NET_IDLE) {
m_display->clearNXDN();
if (m_network != NULL)
m_network->reset();
}
@@ -776,8 +764,6 @@ void CNXDNControl::writeEndNet()
m_networkWatchdog.stop();
m_packetTimer.stop();
m_display->clearNXDN();
if (m_network != NULL)
m_network->reset();
}
@@ -822,7 +808,6 @@ void CNXDNControl::writeNetwork()
unsigned char frames = layer3.getDataBlocks();
std::string source = m_lookup->find(srcId);
m_display->writeNXDN(source.c_str(), grp, dstId, "N");
LogMessage("NXDN, received network data header from %s to %s%u, %u blocks", source.c_str(), grp ? "TG " : "", dstId, frames);
writeJSONNet("start", srcId, source, grp, dstId, frames);
@@ -897,7 +882,6 @@ void CNXDNControl::writeNetwork()
} else if (type == NXDN_MESSAGE_TYPE_VCALL) {
LogMessage("NXDN, received network transmission from %s to %s%u", source.get(keyCALLSIGN).c_str(), grp ? "TG " : "", dstId);
writeJSONNet("start", srcId, source.get(keyCALLSIGN), grp, dstId);
m_display->writeNXDN(source, grp, dstId, "N");
m_netTimeoutTimer.start();
m_packetTimer.start();
@@ -950,7 +934,6 @@ void CNXDNControl::writeNetwork()
m_lookup->findWithName(srcId, &source);
LogMessage("NXDN, received network transmission from %s to %s%u", source.get(keyCALLSIGN).c_str(), grp ? "TG " : "", dstId);
writeJSONNet("start", srcId, source.get(keyCALLSIGN), grp, dstId);
m_display->writeNXDN(source, grp, dstId, "N");
m_netTimeoutTimer.start();
m_packetTimer.start();

View File

@@ -27,7 +27,6 @@
#include "RingBuffer.h"
#include "StopWatch.h"
#include "NXDNLICH.h"
#include "Display.h"
#include "Defines.h"
#include "Timer.h"
#include "Modem.h"
@@ -38,7 +37,7 @@
class CNXDNControl {
public:
CNXDNControl(unsigned int ran, unsigned int id, bool selfOnly, INXDNNetwork* network, CDisplay* display, unsigned int timeout, bool duplex, bool remoteGateway, CNXDNLookup* lookup, CRSSIInterpolator* rssiMapper);
CNXDNControl(unsigned int ran, unsigned int id, bool selfOnly, INXDNNetwork* network, unsigned int timeout, bool duplex, bool remoteGateway, CNXDNLookup* lookup, CRSSIInterpolator* rssiMapper);
~CNXDNControl();
bool writeModem(unsigned char* data, unsigned int len);
@@ -56,7 +55,6 @@ private:
unsigned int m_id;
bool m_selfOnly;
INXDNNetwork* m_network;
CDisplay* m_display;
bool m_duplex;
bool m_remoteGateway;
CNXDNLookup* m_lookup;

View File

@@ -41,14 +41,13 @@ const unsigned char BIT_MASK_TABLE[] = {0x80U, 0x40U, 0x20U, 0x10U, 0x08U, 0x04U
#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])
#define READ_BIT(p,i) (p[(i)>>3] & BIT_MASK_TABLE[(i)&7])
CP25Control::CP25Control(unsigned int nac, unsigned int id, bool selfOnly, bool uidOverride, CP25Network* network, CDisplay* display, unsigned int timeout, bool duplex, CDMRLookup* lookup, bool remoteGateway, CRSSIInterpolator* rssiMapper) :
CP25Control::CP25Control(unsigned int nac, unsigned int id, bool selfOnly, bool uidOverride, CP25Network* network, unsigned int timeout, bool duplex, CDMRLookup* lookup, bool remoteGateway, CRSSIInterpolator* rssiMapper) :
m_nac(nac),
m_id(id),
m_selfOnly(selfOnly),
m_uidOverride(uidOverride),
m_remoteGateway(remoteGateway),
m_network(network),
m_display(display),
m_duplex(duplex),
m_lookup(lookup),
m_queue(1000U, "P25 Control"),
@@ -90,7 +89,6 @@ m_bitErrsAccum(0U),
m_enabled(true),
m_fp(NULL)
{
assert(display != NULL);
assert(lookup != NULL);
assert(rssiMapper != NULL);
@@ -142,9 +140,6 @@ bool CP25Control::writeModem(unsigned char* data, unsigned int len)
writeJSONRF("lost", float(m_rfFrames) / 5.56F, float(m_rfErrs * 100U) / float(m_rfBits));
}
if (m_netState == RS_NET_IDLE)
m_display->clearP25();
writeNetwork(m_rfLDU, m_lastDUID, true);
writeNetwork(data + 2U, P25_DUID_TERM, true);
m_rfState = RS_RF_LISTENING;
@@ -157,9 +152,6 @@ bool CP25Control::writeModem(unsigned char* data, unsigned int len)
}
if (data[0U] == TAG_LOST && m_rfState == RS_RF_DATA) {
if (m_netState == RS_NET_IDLE)
m_display->clearP25();
m_rfState = RS_RF_LISTENING;
m_rfPDUCount = 0U;
m_rfPDUBits = 0U;
@@ -269,7 +261,6 @@ 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_display->writeP25(source.c_str(), grp, dstId, "R");
m_rfState = RS_RF_AUDIO;
@@ -307,8 +298,6 @@ bool CP25Control::writeModem(unsigned char* data, unsigned int len)
unsigned int errors = m_audio.process(data + 2U);
LogDebug("P25, LDU1 audio, errs: %u/1233 (%.1f%%)", errors, float(errors) / 12.33F);
m_display->writeP25BER(float(errors) / 12.33F);
m_rfBits += 1233U;
m_rfErrs += errors;
m_rfFrames++;
@@ -333,7 +322,6 @@ bool CP25Control::writeModem(unsigned char* data, unsigned int len)
writeQueueRF(data, P25_LDU_FRAME_LENGTH_BYTES + 2U);
}
m_display->writeP25RSSI(m_rssi);
writeJSONRSSI();
return true;
@@ -358,8 +346,6 @@ bool CP25Control::writeModem(unsigned char* data, unsigned int len)
unsigned int errors = m_audio.process(data + 2U);
LogDebug("P25, LDU2 audio, errs: %u/1233 (%.1f%%)", errors, float(errors) / 12.33F);
m_display->writeP25BER(float(errors) / 12.33F);
m_rfBits += 1233U;
m_rfErrs += errors;
m_rfFrames++;
@@ -384,7 +370,6 @@ bool CP25Control::writeModem(unsigned char* data, unsigned int len)
writeQueueRF(data, P25_LDU_FRAME_LENGTH_BYTES + 2U);
}
m_display->writeP25RSSI(m_rssi);
writeJSONRSSI();
return true;
@@ -502,8 +487,6 @@ bool CP25Control::writeModem(unsigned char* data, unsigned int len)
writeJSONRF("end", float(m_rfFrames) / 5.56F, float(m_rfErrs * 100U) / float(m_rfBits));
}
m_display->clearP25();
#if defined(DUMP_P25)
closeFile();
#endif
@@ -610,7 +593,6 @@ bool CP25Control::writeModem(unsigned char* data, unsigned int len)
}
LogMessage("P25, ended RF data transmission");
m_display->clearP25();
m_rfPDUCount = 0U;
m_rfPDUBits = 0U;
@@ -762,7 +744,6 @@ void CP25Control::clock(unsigned int ms)
if (m_networkWatchdog.hasExpired()) {
LogMessage("P25, network watchdog has expired, %.1f seconds, %u%% packet loss", float(m_netFrames) / 50.0F, (m_netLost * 100U) / m_netFrames);
writeJSONNet("lost", float(m_netFrames) / 50.0F, float(m_netLost * 100U) / float(m_netFrames));
m_display->clearP25();
m_networkWatchdog.stop();
m_netState = RS_NET_IDLE;
@@ -1009,7 +990,6 @@ void CP25Control::createNetHeader()
LogMessage("P25, received network transmission from %s to %s%u", source.c_str(), lcf == P25_LCF_GROUP ? "TG " : "", dstId);
writeJSONNet("start", srcId, source, lcf == P25_LCF_GROUP, dstId);
m_display->writeP25(source.c_str(), lcf == P25_LCF_GROUP, dstId, "N");
m_netState = RS_NET_AUDIO;
m_netTimeout.start();
@@ -1165,7 +1145,6 @@ void CP25Control::createNetTerminator()
LogMessage("P25, network end of transmission from %s to %s%u, %.1f seconds, %u%% packet loss", source.c_str(), m_netData.getLCF() == P25_LCF_GROUP ? "TG " : "", dstId, float(m_netFrames) / 50.0F, (m_netLost * 100U) / m_netFrames);
writeJSONNet("end", float(m_netFrames) / 50.0F, float(m_netLost * 100U) / float(m_netFrames));
m_display->clearP25();
m_netTimeout.stop();
m_networkWatchdog.stop();
m_netData.reset();

View File

@@ -27,7 +27,6 @@
#include "DMRLookup.h"
#include "P25Audio.h"
#include "Defines.h"
#include "Display.h"
#include "P25Data.h"
#include "P25NID.h"
#include "Modem.h"
@@ -39,7 +38,7 @@
class CP25Control {
public:
CP25Control(unsigned int nac, unsigned int id, bool selfOly, bool uidOverride, CP25Network* network, CDisplay* display, unsigned int timeout, bool duplex, CDMRLookup* lookup, bool remoteGateway, CRSSIInterpolator* rssiMapper);
CP25Control(unsigned int nac, unsigned int id, bool selfOly, bool uidOverride, CP25Network* network, unsigned int timeout, bool duplex, CDMRLookup* lookup, bool remoteGateway, CRSSIInterpolator* rssiMapper);
~CP25Control();
bool writeModem(unsigned char* data, unsigned int len);
@@ -59,7 +58,6 @@ private:
bool m_uidOverride;
bool m_remoteGateway;
CP25Network* m_network;
CDisplay* m_display;
bool m_duplex;
CDMRLookup* m_lookup;
CRingBuffer<unsigned char> m_queue;

View File

@@ -58,9 +58,8 @@ const unsigned char FUNCTIONAL_ALERT1 = 1U;
const unsigned char FUNCTIONAL_ALERT2 = 2U;
const unsigned char FUNCTIONAL_ALPHANUMERIC = 3U;
CPOCSAGControl::CPOCSAGControl(CPOCSAGNetwork* network, CDisplay* display) :
CPOCSAGControl::CPOCSAGControl(CPOCSAGNetwork* network) :
m_network(network),
m_display(display),
m_queue(5000U, "POCSAG Control"),
m_frames(0U),
m_count(0U),
@@ -72,7 +71,6 @@ m_state(PS_NONE),
m_enabled(true),
m_fp(NULL)
{
assert(display != NULL);
}
CPOCSAGControl::~CPOCSAGControl()
@@ -285,8 +283,6 @@ bool CPOCSAGControl::processData()
POCSAGData* output = m_data.front();
m_data.pop_front();
m_display->writePOCSAG(output->m_ric, output->m_display);
m_buffer = output->m_buffer;
m_ric = output->m_ric;
@@ -366,7 +362,6 @@ void CPOCSAGControl::clock(unsigned int ms)
if (m_state == PS_ENDING) {
LogMessage("POCSAG, transmitted %u frame(s) of data from %u message(s)", m_frames, m_count);
m_display->clearPOCSAG();
m_state = PS_NONE;
#if defined(DUMP_POCSAG)

View File

@@ -22,7 +22,6 @@
#include "POCSAGNetwork.h"
#include "POCSAGDefines.h"
#include "RingBuffer.h"
#include "Display.h"
#include "Defines.h"
#include <cstdint>
@@ -41,7 +40,7 @@ struct POCSAGData {
class CPOCSAGControl {
public:
CPOCSAGControl(CPOCSAGNetwork* network, CDisplay* display);
CPOCSAGControl(CPOCSAGNetwork* network);
~CPOCSAGControl();
void sendPage(unsigned int ric, const std::string& text);
@@ -57,7 +56,6 @@ public:
private:
CPOCSAGNetwork* m_network;
CDisplay* m_display;
CRingBuffer<unsigned char> m_queue;
unsigned int m_frames;
unsigned int m_count;

View File

@@ -14,29 +14,7 @@ paging messages. Finally it uses the FM Gateway to interface to existing FM
networks.
It builds on 32-bit and 64-bit Linux as well as on Windows using Visual Studio
2019 on x86 and x64. It can optionally control various Displays. Currently
these are:
- HD44780 (sizes 2x16, 2x40, 4x16, 4x20)
- Support for HD44780 via 4 bit GPIO connection (user selectable pins)
- Adafruit 16x2 LCD+Keypad Kits (I2C)
- Connection via PCF8574 GPIO Extender (I2C)
- Nextion TFTs (all sizes, both Basic and Enhanced versions)
- OLED 128x64 (SSD1306)
- LCDproc
The Nextion displays can connect to the UART on the Raspberry Pi, or via a USB
to TTL serial converter like the FT-232RL. It may also be connected to the UART
output of the MMDVM modem (Arduino Due, STM32, Teensy).
The HD44780 displays are integrated with wiringPi for Raspberry Pi based
platforms.
The OLED display needs an extra library see OLED.md
The LCDproc support enables the use of a multitude of other LCD screens. See
the [supported devices](http://lcdproc.omnipotent.net/hardware.php3) page on
the LCDproc website for more info.
2019 on x86 and x64.
This software is licenced under the GPL v2 and is primarily intended for amateur and
educational use.

View File

@@ -1,37 +0,0 @@
/*
* Copyright (C) 2015-2021 by Jonathan Naylor G4KLX
* Copyright (C) 2021 by Geoffrey Merck F4FXL / KC3FRA
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include "SMeter.h"
const unsigned int RSSI_S1 = 141U;
const unsigned int RSSI_S9 = 93U;
void CSMeter::getSignal(unsigned int rssi, unsigned int& signal, unsigned int& plus)
{
if (rssi > RSSI_S1) {
signal = 0U;
plus = rssi - RSSI_S1;
} else if (rssi > RSSI_S9 && rssi <= RSSI_S1) {
signal = ((RSSI_S1 - rssi) / 6U) + 1U;
plus = (RSSI_S1 - rssi) % 6U;
} else {
signal = 9U;
plus = RSSI_S9 - rssi;
}
}

View File

@@ -1,29 +0,0 @@
/*
* Copyright (C) 2015-2021 by Jonathan Naylor G4KLX
* Copyright (C) 2021 by Geoffrey Merck F4FXL / KC3FRA
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#if !defined(SMETER_H)
#define SMETER_H
class CSMeter
{
public:
static void getSignal(unsigned int rssi, unsigned int& signal, unsigned int& plus);
};
#endif

View File

@@ -26,12 +26,11 @@ const unsigned int BER_COUNT = 13U; // 13 * 100ms = 1300ms
// #define DUMP_YSF
CYSFControl::CYSFControl(const std::string& callsign, bool selfOnly, CYSFNetwork* network, CDisplay* display, unsigned int timeout, bool duplex, bool lowDeviation, bool remoteGateway, CRSSIInterpolator* rssiMapper) :
CYSFControl::CYSFControl(const std::string& callsign, bool selfOnly, CYSFNetwork* network, unsigned int timeout, bool duplex, bool lowDeviation, bool remoteGateway, CRSSIInterpolator* rssiMapper) :
m_callsign(NULL),
m_selfCallsign(NULL),
m_selfOnly(selfOnly),
m_network(network),
m_display(display),
m_duplex(duplex),
m_lowDeviation(lowDeviation),
m_remoteGateway(remoteGateway),
@@ -70,7 +69,6 @@ m_bitErrsAccum(0U),
m_enabled(true),
m_fp(NULL)
{
assert(display != NULL);
assert(rssiMapper != NULL);
m_rfPayload.setUplink(callsign);
@@ -276,7 +274,6 @@ bool CYSFControl::processVWData(bool valid, unsigned char *data)
#if defined(DUMP_YSF)
openFile();
#endif
m_display->writeFusion((char*)m_rfSource, (char*)m_rfDest, dgid, "R", " ");
LogMessage("YSF, received RF header from %10.10s to DG-ID %u", m_rfSource, dgid);
writeJSONRF("start", "voice_vw", m_rfSource, dgid);
@@ -303,7 +300,6 @@ bool CYSFControl::processVWData(bool valid, unsigned char *data)
m_rfFrames++;
m_display->writeFusionRSSI(m_rssi);
writeJSONRSSI();
return true;
@@ -371,13 +367,11 @@ bool CYSFControl::processVWData(bool valid, unsigned char *data)
unsigned int errors = m_rfPayload.processVoiceFRModeAudio2(data + 2U);
m_rfErrs += errors;
m_rfBits += 288U;
m_display->writeFusionBER(float(errors) / 2.88F);
LogDebug("YSF, V Mode 3, seq %u, AMBE FEC %u/288 (%.1f%%)", m_rfFrames % 128, errors, float(errors) / 2.88F);
} else {
unsigned int errors = m_rfPayload.processVoiceFRModeAudio5(data + 2U);
m_rfErrs += errors;
m_rfBits += 720U;
m_display->writeFusionBER(float(errors) / 7.2F);
LogDebug("YSF, V Mode 3, seq %u, AMBE FEC %u/720 (%.1f%%)", m_rfFrames % 128, errors, float(errors) / 7.2F);
writeJSONBER(720U, errors);
}
@@ -401,8 +395,7 @@ bool CYSFControl::processVWData(bool valid, unsigned char *data)
#endif
m_rfFrames++;
m_display->writeFusionRSSI(m_rssi);
wrteJSONRSSI();
writeJSONRSSI();
return true;
}
@@ -460,7 +453,6 @@ bool CYSFControl::processDNData(bool valid, unsigned char *data)
#if defined(DUMP_YSF)
openFile();
#endif
m_display->writeFusion((char*)m_rfSource, (char*)m_rfDest, dgid, "R", " ");
LogMessage("YSF, received RF header from %10.10s to DG-ID %u", m_rfSource, dgid);
writeJSONRF("start", "voice_dn", m_rfSource, dgid);
@@ -487,7 +479,6 @@ bool CYSFControl::processDNData(bool valid, unsigned char *data)
m_rfFrames++;
m_display->writeFusionRSSI(m_rssi);
writeJSONRSSI();
return true;
@@ -557,7 +548,6 @@ bool CYSFControl::processDNData(bool valid, unsigned char *data)
unsigned int errors = m_rfPayload.processVDMode1Audio(data + 2U);
m_rfErrs += errors;
m_rfBits += 235U;
m_display->writeFusionBER(float(errors) / 2.35F);
LogDebug("YSF, V/D Mode 1, seq %u, AMBE FEC %u/235 (%.1f%%)", m_rfFrames % 128, errors, float(errors) / 2.35F);
writeJSONBER(235U, errors);
}
@@ -568,7 +558,6 @@ bool CYSFControl::processDNData(bool valid, unsigned char *data)
unsigned int errors = m_rfPayload.processVDMode2Audio(data + 2U);
m_rfErrs += errors;
m_rfBits += 405U;
m_display->writeFusionBER(float(errors) / 4.05F);
LogDebug("YSF, V/D Mode 2, seq %u, Repetition FEC %u/405 (%.1f%%)", m_rfFrames % 128, errors, float(errors) / 4.05F);
writeJSONBER(405U, errors);
}
@@ -599,7 +588,6 @@ bool CYSFControl::processDNData(bool valid, unsigned char *data)
#endif
m_rfFrames++;
m_display->writeFusionRSSI(m_rssi);
writeJSONRSSI();
return true;
@@ -702,7 +690,6 @@ bool CYSFControl::processDNData(bool valid, unsigned char *data)
#if defined(DUMP_YSF)
writeFile(buffer + 2U);
#endif
m_display->writeFusion((char*)m_rfSource, (char*)m_rfDest, dgid, "R", " ");
LogMessage("YSF, received RF late entry from %10.10s to DG-ID %u", m_rfSource, dgid);
writeJSONRF("late_entry", "voice_dn", m_rfSource, dgid);
@@ -729,7 +716,6 @@ bool CYSFControl::processDNData(bool valid, unsigned char *data)
#endif
m_rfFrames++;
m_display->writeFusionRSSI(m_rssi);
writeJSONRSSI();
return true;
@@ -785,7 +771,6 @@ bool CYSFControl::processFRData(bool valid, unsigned char *data)
#if defined(DUMP_YSF)
openFile();
#endif
m_display->writeFusion((char*)m_rfSource, (char*)m_rfDest, dgid, "R", " ");
LogMessage("YSF, received RF header from %10.10s to DG-ID %u", m_rfSource, dgid);
writeJSONRF("start", "data_fr", m_rfSource, dgid);
@@ -811,7 +796,6 @@ bool CYSFControl::processFRData(bool valid, unsigned char *data)
m_rfFrames++;
m_display->writeFusionRSSI(m_rssi);
writeJSONRSSI();
return true;
@@ -897,7 +881,6 @@ bool CYSFControl::processFRData(bool valid, unsigned char *data)
#endif
m_rfFrames++;
m_display->writeFusionRSSI(m_rssi);
writeJSONRSSI();
return true;
@@ -934,8 +917,6 @@ void CYSFControl::writeEndRF()
m_rfDest = NULL;
if (m_netState == RS_NET_IDLE) {
m_display->clearFusion();
if (m_network != NULL)
m_network->reset();
}
@@ -955,8 +936,6 @@ void CYSFControl::writeEndNet()
m_netPayload.reset();
m_display->clearFusion();
if (m_network != NULL)
m_network->reset();
}
@@ -996,7 +975,6 @@ void CYSFControl::writeNetwork()
::memcpy(m_netDest, data + 24U, YSF_CALLSIGN_LENGTH);
if (::memcmp(m_netSource, " ", 10U) != 0 && ::memcmp(m_netDest, " ", 10U) != 0) {
m_display->writeFusion((char*)m_netSource, (char*)m_netDest, dgid, "N", (char*)(data + 4U));
LogMessage("YSF, received network data from %10.10s to DG-ID %u at %10.10s", m_netSource, dgid, data + 4U);
writeJSONNet("start", m_netSource, dgid, data + 4U);
}
@@ -1254,7 +1232,6 @@ void CYSFControl::processNetCallsigns(const unsigned char* data, unsigned char d
}
if (::memcmp(m_netSource, " ", 10U) != 0 && ::memcmp(m_netDest, " ", 10U) != 0) {
m_display->writeFusion((char*)m_netSource, (char*)m_netDest, dgid, "N", (char*)(data + 4U));
LogMessage("YSF, received network data from %10.10s to DG-ID %u at %10.10s", m_netSource, dgid, data + 4U);
writeJSONNet("start", m_netSource, dgid, data + 4U);
}

View File

@@ -26,7 +26,6 @@
#include "RingBuffer.h"
#include "StopWatch.h"
#include "YSFFICH.h"
#include "Display.h"
#include "Defines.h"
#include "Timer.h"
#include "Modem.h"
@@ -37,7 +36,7 @@
class CYSFControl {
public:
CYSFControl(const std::string& callsign, bool selfOnly, CYSFNetwork* network, CDisplay* display, unsigned int timeout, bool duplex, bool lowDeviation, bool remoteGateway, CRSSIInterpolator* rssiMapper);
CYSFControl(const std::string& callsign, bool selfOnly, CYSFNetwork* network, unsigned int timeout, bool duplex, bool lowDeviation, bool remoteGateway, CRSSIInterpolator* rssiMapper);
~CYSFControl();
bool writeModem(unsigned char* data, unsigned int len);
@@ -55,7 +54,6 @@ private:
unsigned char* m_selfCallsign;
bool m_selfOnly;
CYSFNetwork* m_network;
CDisplay* m_display;
bool m_duplex;
bool m_lowDeviation;
bool m_remoteGateway;