From d01520bea17d3be0a128461881063db47e82084a Mon Sep 17 00:00:00 2001 From: Jonathan Naylor Date: Fri, 16 Jun 2023 17:18:43 +0100 Subject: [PATCH] Remove all of the display processing from the code. --- Conf.cpp | 284 +------------------------------------- Conf.h | 79 ----------- DMRControl.cpp | 5 +- DMRControl.h | 3 +- DMRSlot.cpp | 69 ++------- DMRSlot.h | 4 +- DStarControl.cpp | 57 +++++--- DStarControl.h | 4 +- M17Control.cpp | 20 +-- M17Control.h | 6 +- MMDVM.ini | 53 ------- MMDVMHost.cpp | 31 +---- MMDVMHost.h | 2 - MMDVMHost.vcxproj | 2 - MMDVMHost.vcxproj.filters | 6 - Makefile | 2 +- NXDNControl.cpp | 19 +-- NXDNControl.h | 4 +- P25Control.cpp | 23 +-- P25Control.h | 4 +- POCSAGControl.cpp | 7 +- POCSAGControl.h | 4 +- README.md | 24 +--- SMeter.cpp | 37 ----- SMeter.h | 29 ---- YSFControl.cpp | 27 +--- YSFControl.h | 4 +- 27 files changed, 74 insertions(+), 735 deletions(-) delete mode 100644 SMeter.cpp delete mode 100644 SMeter.h diff --git a/Conf.cpp b/Conf.cpp index bd34e44..0a7067d 100644 --- a/Conf.cpp +++ b/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 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; diff --git a/Conf.h b/Conf.h index 1071dcc..0763386 100644 --- a/Conf.h +++ b/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 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 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; diff --git a/DMRControl.cpp b/DMRControl.cpp index 34f080c..f828d9f 100644 --- a/DMRControl.cpp +++ b/DMRControl.cpp @@ -21,7 +21,7 @@ #include #include -CDMRControl::CDMRControl(unsigned int id, unsigned int colorCode, unsigned int callHang, bool selfOnly, bool embeddedLCOnly, bool dumpTAData, const std::vector& prefixes, const std::vector& blacklist, const std::vector& whitelist, const std::vector& slot1TGWhitelist, const std::vector& 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& prefixes, const std::vector& blacklist, const std::vector& whitelist, const std::vector& slot1TGWhitelist, const std::vector& 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() diff --git a/DMRControl.h b/DMRControl.h index 040fe92..c3c3b90 100644 --- a/DMRControl.h +++ b/DMRControl.h @@ -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& prefixes, const std::vector& blacklist, const std::vector& whitelist, const std::vector& slot1TGWhitelist, const std::vector& 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& prefixes, const std::vector& blacklist, const std::vector& whitelist, const std::vector& slot1TGWhitelist, const std::vector& 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); diff --git a/DMRSlot.cpp b/DMRSlot.cpp index 304c30b..30f7f0c 100644 --- a/DMRSlot.cpp +++ b/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; diff --git a/DMRSlot.h b/DMRSlot.h index 5d13f24..592dad9 100644 --- a/DMRSlot.h +++ b/DMRSlot.h @@ -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; diff --git a/DStarControl.cpp b/DStarControl.cpp index acfc8f5..ee9ad0d 100644 --- a/DStarControl.cpp +++ b/DStarControl.cpp @@ -15,7 +15,6 @@ #include "Utils.h" #include "Sync.h" #include "Log.h" -#include "SMeter.h" #include #include @@ -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& blackList, const std::vector& 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& blackList, const std::vector& 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 diff --git a/DStarControl.h b/DStarControl.h index 1eef4f8..95655e5 100644 --- a/DStarControl.h +++ b/DStarControl.h @@ -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& blackList, const std::vector& 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& blackList, const std::vector& 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 m_blackList; std::vector m_whiteList; CDStarNetwork* m_network; - CDisplay* m_display; bool m_duplex; CRingBuffer m_queue; CDStarHeader m_rfHeader; diff --git a/M17Control.cpp b/M17Control.cpp index c1abf2e..945bdd3 100644 --- a/M17Control.cpp +++ b/M17Control.cpp @@ -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) { diff --git a/M17Control.h b/M17Control.h index 3472232..a08b1b5 100644 --- a/M17Control.h +++ b/M17Control.h @@ -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 m_queue; std::string m_source; diff --git a/MMDVM.ini b/MMDVM.ini index 17c564b..9989fd2 100644 --- a/MMDVM.ini +++ b/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 diff --git a/MMDVMHost.cpp b/MMDVMHost.cpp index 35d2a17..2e8efdb 100644 --- a/MMDVMHost.cpp +++ b/MMDVMHost.cpp @@ -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; diff --git a/MMDVMHost.h b/MMDVMHost.h index 9bd1d3d..3643097 100644 --- a/MMDVMHost.h +++ b/MMDVMHost.h @@ -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; diff --git a/MMDVMHost.vcxproj b/MMDVMHost.vcxproj index 6e8081f..41835c9 100644 --- a/MMDVMHost.vcxproj +++ b/MMDVMHost.vcxproj @@ -239,7 +239,6 @@ - @@ -336,7 +335,6 @@ - diff --git a/MMDVMHost.vcxproj.filters b/MMDVMHost.vcxproj.filters index 62f43bc..77f9351 100644 --- a/MMDVMHost.vcxproj.filters +++ b/MMDVMHost.vcxproj.filters @@ -320,9 +320,6 @@ Header Files - - Header Files - @@ -601,8 +598,5 @@ Source Files - - Source Files - diff --git a/Makefile b/Makefile index 4393a12..bc50df0 100644 --- a/Makefile +++ b/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 diff --git a/NXDNControl.cpp b/NXDNControl.cpp index ca25f0c..cbe9051 100644 --- a/NXDNControl.cpp +++ b/NXDNControl.cpp @@ -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(); diff --git a/NXDNControl.h b/NXDNControl.h index 5b538d1..a87a84c 100644 --- a/NXDNControl.h +++ b/NXDNControl.h @@ -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; diff --git a/P25Control.cpp b/P25Control.cpp index c75d891..d000516 100644 --- a/P25Control.cpp +++ b/P25Control.cpp @@ -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(); diff --git a/P25Control.h b/P25Control.h index 7d4814e..db185e4 100644 --- a/P25Control.h +++ b/P25Control.h @@ -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 m_queue; diff --git a/POCSAGControl.cpp b/POCSAGControl.cpp index 75a263c..2bb0189 100644 --- a/POCSAGControl.cpp +++ b/POCSAGControl.cpp @@ -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) diff --git a/POCSAGControl.h b/POCSAGControl.h index 58ff928..215483f 100644 --- a/POCSAGControl.h +++ b/POCSAGControl.h @@ -22,7 +22,6 @@ #include "POCSAGNetwork.h" #include "POCSAGDefines.h" #include "RingBuffer.h" -#include "Display.h" #include "Defines.h" #include @@ -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 m_queue; unsigned int m_frames; unsigned int m_count; diff --git a/README.md b/README.md index 7aca830..5a80511 100644 --- a/README.md +++ b/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. diff --git a/SMeter.cpp b/SMeter.cpp deleted file mode 100644 index 75b36f8..0000000 --- a/SMeter.cpp +++ /dev/null @@ -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; - } -} diff --git a/SMeter.h b/SMeter.h deleted file mode 100644 index 76c4d60..0000000 --- a/SMeter.h +++ /dev/null @@ -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 \ No newline at end of file diff --git a/YSFControl.cpp b/YSFControl.cpp index ee65f4c..ab9cd4f 100644 --- a/YSFControl.cpp +++ b/YSFControl.cpp @@ -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); } diff --git a/YSFControl.h b/YSFControl.h index 2ff85c4..6b96a2e 100644 --- a/YSFControl.h +++ b/YSFControl.h @@ -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;