mirror of
https://github.com/g4klx/MMDVMHost
synced 2025-12-29 14:35:41 +08:00
Remove all of the display processing from the code.
This commit is contained in:
284
Conf.cpp
284
Conf.cpp
@@ -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
79
Conf.h
@@ -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;
|
||||
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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);
|
||||
|
||||
69
DMRSlot.cpp
69
DMRSlot.cpp
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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;
|
||||
|
||||
53
MMDVM.ini
53
MMDVM.ini
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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" />
|
||||
|
||||
@@ -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>
|
||||
|
||||
2
Makefile
2
Makefile
@@ -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
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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;
|
||||
|
||||
24
README.md
24
README.md
@@ -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.
|
||||
|
||||
37
SMeter.cpp
37
SMeter.cpp
@@ -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;
|
||||
}
|
||||
}
|
||||
29
SMeter.h
29
SMeter.h
@@ -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
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user