diff --git a/CASTInfo.cpp b/CASTInfo.cpp deleted file mode 100644 index 071f320..0000000 --- a/CASTInfo.cpp +++ /dev/null @@ -1,163 +0,0 @@ -/* - * Copyright (C) 2016,2018,2020,2021 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 - * 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 "CASTInfo.h" - -static bool networkInfoInitialized = false; -static unsigned char passCounter = 0; - -CCASTInfo::CCASTInfo(CModem* modem) : -CDisplay(), -m_modem(modem), -m_ipaddress() -{ -} - -CCASTInfo::~CCASTInfo() -{ -} - -bool CCASTInfo::open() -{ - return true; -} - -void CCASTInfo::setIdleInt() -{ - unsigned char info[100U]; - CNetworkInfo* m_network; - - passCounter ++; - if (passCounter > 253U) - networkInfoInitialized = false; - - if (! networkInfoInitialized) { - //LogMessage("Initialize CNetworkInfo"); - info[0]=0; - m_network = new CNetworkInfo; - m_network->getNetworkInterface(info); - m_ipaddress = (char*)info; - delete m_network; - - if (m_modem != NULL) - m_modem->writeIPInfo(m_ipaddress); - - networkInfoInitialized = true; - passCounter = 0; - } - - -} - -void CCASTInfo::setErrorInt(const char* text) -{ -} - -void CCASTInfo::setLockoutInt() -{ -} - -void CCASTInfo::setQuitInt() -{ -} - -void CCASTInfo::setFMInt() -{ -} - -void CCASTInfo::writeDStarInt(const char* my1, const char* my2, const char* your, const char* type, const char* reflector) -{ - if (m_modem != NULL) - m_modem->writeDStarInfo(my1, my2, your, type, reflector); -} - -void CCASTInfo::clearDStarInt() -{ -} - -void CCASTInfo::writeDMRInt(unsigned int slotNo, const std::string& src, bool group, const std::string& dst, const char* type) -{ - if (m_modem != NULL) - m_modem->writeDMRInfo(slotNo, src, group, dst, type); -} - -void CCASTInfo::clearDMRInt(unsigned int slotNo) -{ -} - -void CCASTInfo::writeFusionInt(const char* source, const char* dest, unsigned char dgid, const char* type, const char* origin) -{ - if (m_modem != NULL) - m_modem->writeYSFInfo(source, dest, dgid, type, origin); -} - -void CCASTInfo::clearFusionInt() -{ -} - -void CCASTInfo::writeP25Int(const char* source, bool group, unsigned int dest, const char* type) -{ - if (m_modem != NULL) - m_modem->writeP25Info(source, group, dest, type); -} - -void CCASTInfo::clearP25Int() -{ -} - -void CCASTInfo::writeNXDNInt(const char* source, bool group, unsigned int dest, const char* type) -{ - if (m_modem != NULL) - m_modem->writeNXDNInfo(source, group, dest, type); -} - -void CCASTInfo::clearNXDNInt() -{ -} - -void CCASTInfo::writeM17Int(const char* source, const char* dest, const char* type) -{ - if (m_modem != NULL) - m_modem->writeM17Info(source, dest, type); -} - -void CCASTInfo::clearM17Int() -{ -} - -void CCASTInfo::writePOCSAGInt(uint32_t ric, const std::string& message) -{ - if (m_modem != NULL) - m_modem->writePOCSAGInfo(ric, message); -} - -void CCASTInfo::clearPOCSAGInt() -{ -} - -void CCASTInfo::writeCWInt() -{ -} - -void CCASTInfo::clearCWInt() -{ -} - -void CCASTInfo::close() -{ -} diff --git a/CASTInfo.h b/CASTInfo.h deleted file mode 100644 index 41e3955..0000000 --- a/CASTInfo.h +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Copyright (C) 2016,2018,2020,2021 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 - * 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(CASTINFO_H) -#define CASTINFO_H - -#include "Display.h" - -#include - -#include "NetworkInfo.h" -#include "Modem.h" - -class CCASTInfo : public CDisplay -{ -public: - CCASTInfo(CModem* modem); - virtual ~CCASTInfo(); - - virtual bool open(); - - virtual void close(); - -protected: - virtual void setIdleInt(); - virtual void setErrorInt(const char* text); - virtual void setLockoutInt(); - virtual void setQuitInt(); - virtual void setFMInt(); - - virtual void writeDStarInt(const char* my1, const char* my2, const char* your, const char* type, const char* reflector); - virtual void clearDStarInt(); - - virtual void writeDMRInt(unsigned int slotNo, const std::string& src, bool group, const std::string& dst, const char* type); - virtual void clearDMRInt(unsigned int slotNo); - - virtual void writeFusionInt(const char* source, const char* dest, unsigned char dgid, const char* type, const char* origin); - virtual void clearFusionInt(); - - virtual void writeP25Int(const char* source, bool group, unsigned int dest, const char* type); - virtual void clearP25Int(); - - virtual void writeNXDNInt(const char* source, bool group, unsigned int dest, const char* type); - virtual void clearNXDNInt(); - - virtual void writeM17Int(const char* source, const char* dest, const char* type); - virtual void clearM17Int(); - - virtual void writePOCSAGInt(uint32_t ric, const std::string& message); - virtual void clearPOCSAGInt(); - - virtual void writeCWInt(); - virtual void clearCWInt(); - -private: - CModem* m_modem; - std::string m_ipaddress; -}; - -#endif diff --git a/Display.cpp b/Display.cpp deleted file mode 100644 index 718ed84..0000000 --- a/Display.cpp +++ /dev/null @@ -1,701 +0,0 @@ -/* - * Copyright (C) 2016,2017,2018,2020,2021,2023 by Jonathan Naylor G4KLX - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * 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 "Display.h" -#include "Defines.h" -#include "UARTController.h" -#include "ModemSerialPort.h" -#include "NullDisplay.h" -#include "TFTSurenoo.h" -#include "LCDproc.h" -#include "Nextion.h" -#include "CASTInfo.h" -#include "Conf.h" -#include "Modem.h" -#include "Log.h" - -#if defined(HD44780) -#include "HD44780.h" -#endif - -#if defined(OLED) -#include "OLED.h" -#endif - -#include -#include -#include - -CDisplay::CDisplay() : -m_timer1(3000U, 3U), -m_timer2(3000U, 3U), -m_mode1(MODE_IDLE), -m_mode2(MODE_IDLE) -{ -} - -CDisplay::~CDisplay() -{ -} - -void CDisplay::setIdle() -{ - m_timer1.stop(); - m_timer2.stop(); - - m_mode1 = MODE_IDLE; - m_mode2 = MODE_IDLE; - - setIdleInt(); -} - -void CDisplay::setLockout() -{ - m_timer1.stop(); - m_timer2.stop(); - - m_mode1 = MODE_IDLE; - m_mode2 = MODE_IDLE; - - setLockoutInt(); -} - -void CDisplay::setError(const char* text) -{ - assert(text != NULL); - - m_timer1.stop(); - m_timer2.stop(); - - m_mode1 = MODE_IDLE; - m_mode2 = MODE_IDLE; - - setErrorInt(text); -} - -void CDisplay::setQuit() -{ - m_timer1.stop(); - m_timer2.stop(); - - m_mode1 = MODE_QUIT; - m_mode2 = MODE_QUIT; - - setQuitInt(); -} - -void CDisplay::setFM() -{ - m_timer1.stop(); - m_timer2.stop(); - - m_mode1 = MODE_FM; - m_mode2 = MODE_FM; - - setFMInt(); -} - -void CDisplay::writeDStar(const char* my1, const char* my2, const char* your, const char* type, const char* reflector) -{ - assert(my1 != NULL); - assert(my2 != NULL); - assert(your != NULL); - assert(type != NULL); - assert(reflector != NULL); - - m_timer1.start(); - m_mode1 = MODE_IDLE; - - writeDStarInt(my1, my2, your, type, reflector); -} - -void CDisplay::writeDStarRSSI(unsigned char rssi) -{ - if (rssi != 0U) - writeDStarRSSIInt(rssi); -} - -void CDisplay::writeDStarBER(float ber) -{ - writeDStarBERInt(ber); -} - -void CDisplay::clearDStar() -{ - if (m_timer1.hasExpired()) { - clearDStarInt(); - m_timer1.stop(); - m_mode1 = MODE_IDLE; - } else { - m_mode1 = MODE_DSTAR; - } -} - -void CDisplay::writeDMR(unsigned int slotNo, const std::string& src, bool group, const std::string& dst, const char* type) -{ - assert(type != NULL); - - if (slotNo == 1U) { - m_timer1.start(); - m_mode1 = MODE_IDLE; - } else { - m_timer2.start(); - m_mode2 = MODE_IDLE; - } - writeDMRInt(slotNo, src, group, dst, type); -} - -void CDisplay::writeDMR(unsigned int slotNo, const class CUserDBentry& src, bool group, const std::string& dst, const char* type) -{ - assert(type != NULL); - - if (slotNo == 1U) { - m_timer1.start(); - m_mode1 = MODE_IDLE; - } else { - m_timer2.start(); - m_mode2 = MODE_IDLE; - } - - if (int err = writeDMRIntEx(slotNo, src, group, dst, type)) { - std::string src_str = src.get(keyCALLSIGN); - if (err < 0 && !src.get(keyFIRST_NAME).empty()) { - // emulate the result of old CDMRLookup::findWithName() - // (it returned callsign and firstname) - src_str += " " + src.get(keyFIRST_NAME); - } - writeDMRInt(slotNo, src_str, group, dst, type); - } -} - -void CDisplay::writeDMRRSSI(unsigned int slotNo, unsigned char rssi) -{ - if (rssi != 0U) - writeDMRRSSIInt(slotNo, rssi); -} - -void CDisplay::writeDMRTA(unsigned int slotNo, const unsigned char* talkerAlias, const char* type) -{ - if (::strcmp(type, " ") == 0) { - writeDMRTAInt(slotNo, (unsigned char*)"", type); - return; - } - - if (::strlen((char*)talkerAlias) >= 4U) - writeDMRTAInt(slotNo, (unsigned char*)talkerAlias, type); -} - -void CDisplay::writeDMRBER(unsigned int slotNo, float ber) -{ - writeDMRBERInt(slotNo, ber); -} - -void CDisplay::clearDMR(unsigned int slotNo) -{ - if (slotNo == 1U) { - if (m_timer1.hasExpired()) { - clearDMRInt(slotNo); - m_timer1.stop(); - m_mode1 = MODE_IDLE; - } else { - m_mode1 = MODE_DMR; - } - } else { - if (m_timer2.hasExpired()) { - clearDMRInt(slotNo); - m_timer2.stop(); - m_mode2 = MODE_IDLE; - } else { - m_mode2 = MODE_DMR; - } - } -} - -void CDisplay::writeFusion(const char* source, const char* dest, unsigned char dgid, const char* type, const char* origin) -{ - assert(source != NULL); - assert(dest != NULL); - assert(type != NULL); - assert(origin != NULL); - - m_timer1.start(); - m_mode1 = MODE_IDLE; - - writeFusionInt(source, dest, dgid, type, origin); -} - -void CDisplay::writeFusionRSSI(unsigned char rssi) -{ - if (rssi != 0U) - writeFusionRSSIInt(rssi); -} - -void CDisplay::writeFusionBER(float ber) -{ - writeFusionBERInt(ber); -} - -void CDisplay::clearFusion() -{ - if (m_timer1.hasExpired()) { - clearFusionInt(); - m_timer1.stop(); - m_mode1 = MODE_IDLE; - } else { - m_mode1 = MODE_YSF; - } -} - -void CDisplay::writeP25(const char* source, bool group, unsigned int dest, const char* type) -{ - assert(source != NULL); - assert(type != NULL); - - m_timer1.start(); - m_mode1 = MODE_IDLE; - - writeP25Int(source, group, dest, type); -} - -void CDisplay::writeP25RSSI(unsigned char rssi) -{ - if (rssi != 0U) - writeP25RSSIInt(rssi); -} - -void CDisplay::writeP25BER(float ber) -{ - writeP25BERInt(ber); -} - -void CDisplay::clearP25() -{ - if (m_timer1.hasExpired()) { - clearP25Int(); - m_timer1.stop(); - m_mode1 = MODE_IDLE; - } else { - m_mode1 = MODE_P25; - } -} - -void CDisplay::writeNXDN(const char* source, bool group, unsigned int dest, const char* type) -{ - assert(source != NULL); - assert(type != NULL); - - m_timer1.start(); - m_mode1 = MODE_IDLE; - - writeNXDNInt(source, group, dest, type); -} - -void CDisplay::writeNXDN(const class CUserDBentry& source, bool group, unsigned int dest, const char* type) -{ - assert(type != NULL); - - m_timer1.start(); - m_mode1 = MODE_IDLE; - - if (writeNXDNIntEx(source, group, dest, type)) - writeNXDNInt(source.get(keyCALLSIGN).c_str(), group, dest, type); -} - -void CDisplay::writeNXDNRSSI(unsigned char rssi) -{ - if (rssi != 0U) - writeNXDNRSSIInt(rssi); -} - -void CDisplay::writeNXDNBER(float ber) -{ - writeNXDNBERInt(ber); -} - -void CDisplay::clearNXDN() -{ - if (m_timer1.hasExpired()) { - clearNXDNInt(); - m_timer1.stop(); - m_mode1 = MODE_IDLE; - } else { - m_mode1 = MODE_NXDN; - } -} - -void CDisplay::writeM17(const char* source, const char* dest, const char* type) -{ - assert(source != NULL); - assert(dest != NULL); - assert(type != NULL); - - m_timer1.start(); - m_mode1 = MODE_IDLE; - - writeM17Int(source, dest, type); -} - -void CDisplay::writeM17RSSI(unsigned char rssi) -{ - if (rssi != 0U) - writeM17RSSIInt(rssi); -} - -void CDisplay::writeM17BER(float ber) -{ - writeM17BERInt(ber); -} - -void CDisplay::clearM17() -{ - if (m_timer1.hasExpired()) { - clearM17Int(); - m_timer1.stop(); - m_mode1 = MODE_IDLE; - } else { - m_mode1 = MODE_M17; - } -} - -void CDisplay::writePOCSAG(uint32_t ric, const std::string& message) -{ - m_timer1.start(); - m_mode1 = MODE_POCSAG; - - writePOCSAGInt(ric, message); -} - -void CDisplay::clearPOCSAG() -{ - if (m_timer1.hasExpired()) { - clearPOCSAGInt(); - m_timer1.stop(); - m_mode1 = MODE_IDLE; - } else { - m_mode1 = MODE_POCSAG; - } -} - -void CDisplay::writeCW() -{ - m_timer1.start(); - m_mode1 = MODE_CW; - - writeCWInt(); -} - -void CDisplay::clock(unsigned int ms) -{ - m_timer1.clock(ms); - if (m_timer1.isRunning() && m_timer1.hasExpired()) { - switch (m_mode1) { - case MODE_DSTAR: - clearDStarInt(); - m_mode1 = MODE_IDLE; - m_timer1.stop(); - break; - case MODE_DMR: - clearDMRInt(1U); - m_mode1 = MODE_IDLE; - m_timer1.stop(); - break; - case MODE_YSF: - clearFusionInt(); - m_mode1 = MODE_IDLE; - m_timer1.stop(); - break; - case MODE_P25: - clearP25Int(); - m_mode1 = MODE_IDLE; - m_timer1.stop(); - break; - case MODE_NXDN: - clearNXDNInt(); - m_mode1 = MODE_IDLE; - m_timer1.stop(); - break; - case MODE_M17: - clearM17Int(); - m_mode1 = MODE_IDLE; - m_timer1.stop(); - break; - case MODE_POCSAG: - clearPOCSAGInt(); - m_mode1 = MODE_IDLE; - m_timer1.stop(); - break; - case MODE_CW: - clearCWInt(); - m_mode1 = MODE_IDLE; - m_timer1.stop(); - break; - default: - break; - } - } - - // Timer/mode 2 are only used for DMR - m_timer2.clock(ms); - if (m_timer2.isRunning() && m_timer2.hasExpired()) { - if (m_mode2 == MODE_DMR) { - clearDMRInt(2U); - m_mode2 = MODE_IDLE; - m_timer2.stop(); - } - } - - clockInt(ms); -} - -void CDisplay::clockInt(unsigned int ms) -{ -} - -void CDisplay::writeDStarRSSIInt(unsigned char rssi) -{ -} - -void CDisplay::writeDStarBERInt(float ber) -{ -} - -int CDisplay::writeDMRIntEx(unsigned int slotNo, const class CUserDBentry& src, bool group, const std::string& dst, const char* type) -{ - /* - * return value: - * < 0 error condition (i.e. not supported) - * -> call writeXXXXInt() to display - * = 0 no error, writeXXXXIntEx() displayed whole status - * = 1 no error, writeXXXXIntEx() displayed partial status - * -> call writeXXXXInt() to display remain part - * > 1 reserved for future use - */ - return -1; // not supported -} - -void CDisplay::writeDMRRSSIInt(unsigned int slotNo, unsigned char rssi) -{ -} - -void CDisplay::writeDMRTAInt(unsigned int slotNo, const unsigned char* talkerAlias, const char* type) -{ -} - -void CDisplay::writeDMRBERInt(unsigned int slotNo, float ber) -{ -} - -void CDisplay::writeFusionRSSIInt(unsigned char rssi) -{ -} - -void CDisplay::writeFusionBERInt(float ber) -{ -} - -void CDisplay::writeP25RSSIInt(unsigned char rssi) -{ -} - -void CDisplay::writeP25BERInt(float ber) -{ -} - -void CDisplay::writeNXDNRSSIInt(unsigned char rssi) -{ -} - -void CDisplay::writeNXDNBERInt(float ber) -{ -} - -void CDisplay::writeM17RSSIInt(unsigned char rssi) -{ -} - -void CDisplay::writeM17BERInt(float ber) -{ -} - -int CDisplay::writeNXDNIntEx(const class CUserDBentry& source, bool group, unsigned int dest, const char* type) -{ - /* return value definition is same as writeDMRIntEx() */ - return -1; // not supported -} - - -/* Factory method extracted from MMDVMHost.cpp - BG5HHP */ -CDisplay* CDisplay::createDisplay(const CConf& conf, CModem* modem) -{ - CDisplay *display = NULL; - - std::string type = conf.getDisplay(); - unsigned int dmrid = conf.getDMRId(); - - LogInfo("Display Parameters"); - LogInfo(" Type: %s", type.c_str()); - - if (type == "TFT Surenoo") { - std::string port = conf.getTFTSerialPort(); - unsigned int brightness = conf.getTFTSerialBrightness(); - - LogInfo(" Port: %s", port.c_str()); - LogInfo(" Brightness: %u", brightness); - - ISerialPort* serial = NULL; - if (port == "modem") - serial = new IModemSerialPort(modem); - else - serial = new CUARTController(port, 115200U); - - display = new CTFTSurenoo(conf.getCallsign(), dmrid, serial, brightness, conf.getDuplex()); - } else if (type == "Nextion") { - std::string port = conf.getNextionPort(); - unsigned int brightness = conf.getNextionBrightness(); - bool displayClock = conf.getNextionDisplayClock(); - bool utc = conf.getNextionUTC(); - unsigned int idleBrightness = conf.getNextionIdleBrightness(); - unsigned int screenLayout = conf.getNextionScreenLayout(); - unsigned int txFrequency = conf.getTXFrequency(); - unsigned int rxFrequency = conf.getRXFrequency(); - bool displayTempInF = conf.getNextionTempInFahrenheit(); - - LogInfo(" Port: %s", port.c_str()); - LogInfo(" Brightness: %u", brightness); - LogInfo(" Clock Display: %s", displayClock ? "yes" : "no"); - if (displayClock) - LogInfo(" Display UTC: %s", utc ? "yes" : "no"); - LogInfo(" Idle Brightness: %u", idleBrightness); - LogInfo(" Temperature in Fahrenheit: %s ", displayTempInF ? "yes" : "no"); - - switch (screenLayout) { - case 0U: - LogInfo(" Screen Layout: G4KLX (Default)"); - break; - case 2U: - LogInfo(" Screen Layout: ON7LDS"); - break; - case 3U: - LogInfo(" Screen Layout: DIY by ON7LDS"); - break; - case 4U: - LogInfo(" Screen Layout: DIY by ON7LDS (High speed)"); - break; - default: - LogInfo(" Screen Layout: %u (Unknown)", screenLayout); - break; - } - - if (port == "modem") { - ISerialPort* serial = new IModemSerialPort(modem); - display = new CNextion(conf.getCallsign(), dmrid, serial, brightness, displayClock, utc, idleBrightness, screenLayout, txFrequency, rxFrequency, displayTempInF); - } else { - unsigned int baudrate = 9600U; - if (screenLayout == 4U) - baudrate = 115200U; - - LogInfo(" Display baudrate: %u ", baudrate); - ISerialPort* serial = new CUARTController(port, baudrate); - display = new CNextion(conf.getCallsign(), dmrid, serial, brightness, displayClock, utc, idleBrightness, screenLayout, txFrequency, rxFrequency, displayTempInF); - } - } else if (type == "LCDproc") { - std::string address = conf.getLCDprocAddress(); - unsigned int port = conf.getLCDprocPort(); - unsigned int localPort = conf.getLCDprocLocalPort(); - bool displayClock = conf.getLCDprocDisplayClock(); - bool utc = conf.getLCDprocUTC(); - bool dimOnIdle = conf.getLCDprocDimOnIdle(); - - LogInfo(" Address: %s", address.c_str()); - LogInfo(" Port: %u", port); - - if (localPort == 0 ) - LogInfo(" Local Port: random"); - else - LogInfo(" Local Port: %u", localPort); - - LogInfo(" Dim Display on Idle: %s", dimOnIdle ? "yes" : "no"); - LogInfo(" Clock Display: %s", displayClock ? "yes" : "no"); - - if (displayClock) - LogInfo(" Display UTC: %s", utc ? "yes" : "no"); - - display = new CLCDproc(address.c_str(), port, localPort, conf.getCallsign(), dmrid, displayClock, utc, conf.getDuplex(), dimOnIdle); -#if defined(HD44780) - } else if (type == "HD44780") { - unsigned int rows = conf.getHD44780Rows(); - unsigned int columns = conf.getHD44780Columns(); - std::vector pins = conf.getHD44780Pins(); - unsigned int i2cAddress = conf.getHD44780i2cAddress(); - bool pwm = conf.getHD44780PWM(); - unsigned int pwmPin = conf.getHD44780PWMPin(); - unsigned int pwmBright = conf.getHD44780PWMBright(); - unsigned int pwmDim = conf.getHD44780PWMDim(); - bool displayClock = conf.getHD44780DisplayClock(); - bool utc = conf.getHD44780UTC(); - - if (pins.size() == 6U) { - LogInfo(" Rows: %u", rows); - LogInfo(" Columns: %u", columns); - -#if defined(ADAFRUIT_DISPLAY) || defined(PCF8574_DISPLAY) - LogInfo(" Device Address: %#x", i2cAddress); -#else - LogInfo(" Pins: %u,%u,%u,%u,%u,%u", pins.at(0U), pins.at(1U), pins.at(2U), pins.at(3U), pins.at(4U), pins.at(5U)); -#endif - - LogInfo(" PWM Backlight: %s", pwm ? "yes" : "no"); - if (pwm) { - LogInfo(" PWM Pin: %u", pwmPin); - LogInfo(" PWM Bright: %u", pwmBright); - LogInfo(" PWM Dim: %u", pwmDim); - } - - LogInfo(" Clock Display: %s", displayClock ? "yes" : "no"); - if (displayClock) - LogInfo(" Display UTC: %s", utc ? "yes" : "no"); - - display = new CHD44780(rows, columns, conf.getCallsign(), dmrid, pins, i2cAddress, pwm, pwmPin, pwmBright, pwmDim, displayClock, utc, conf.getDuplex()); - } -#endif -#if defined(OLED) - } else if (type == "OLED") { - unsigned char type = conf.getOLEDType(); - unsigned char brightness = conf.getOLEDBrightness(); - bool invert = conf.getOLEDInvert(); - bool scroll = conf.getOLEDScroll(); - bool rotate = conf.getOLEDRotate(); - bool logosaver = conf.getOLEDLogoScreensaver(); - - display = new COLED(type, brightness, invert, scroll, rotate, logosaver, conf.getDuplex()); -#endif - } else if (type == "CAST") { - display = new CCASTInfo(modem); - } else { - LogWarning("No valid display found, disabling"); - display = new CNullDisplay; - } - - bool ret = display->open(); - if (!ret) { - delete display; - display = new CNullDisplay; - } - - return display; -} diff --git a/Display.h b/Display.h deleted file mode 100644 index 109b0ca..0000000 --- a/Display.h +++ /dev/null @@ -1,146 +0,0 @@ -/* - * Copyright (C) 2016,2017,2018,2020,2021,2023 by Jonathan Naylor G4KLX - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * 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(DISPLAY_H) -#define DISPLAY_H - -#include "Timer.h" -#include "UserDBentry.h" -#include "Modem.h" - -#include - -#include - -class CConf; -class CModem; - -class CDisplay -{ -public: - CDisplay(); - virtual ~CDisplay() = 0; - - virtual bool open() = 0; - - void setIdle(); - void setLockout(); - void setError(const char* text); - void setQuit(); - void setFM(); - - void writeDStar(const char* my1, const char* my2, const char* your, const char* type, const char* reflector); - void writeDStarRSSI(unsigned char rssi); - void writeDStarBER(float ber); - void clearDStar(); - - void writeDMR(unsigned int slotNo, const std::string& src, bool group, const std::string& dst, const char* type); - void writeDMR(unsigned int slotNo, const class CUserDBentry& src, bool group, const std::string& dst, const char* type); - void writeDMRRSSI(unsigned int slotNo, unsigned char rssi); - void writeDMRBER(unsigned int slotNo, float ber); - void writeDMRTA(unsigned int slotNo, const unsigned char* talkerAlias, const char* type); - void clearDMR(unsigned int slotNo); - - void writeFusion(const char* source, const char* dest, unsigned char dgid, const char* type, const char* origin); - void writeFusionRSSI(unsigned char rssi); - void writeFusionBER(float ber); - void clearFusion(); - - void writeP25(const char* source, bool group, unsigned int dest, const char* type); - void writeP25RSSI(unsigned char rssi); - void writeP25BER(float ber); - void clearP25(); - - void writeNXDN(const char* source, bool group, unsigned int dest, const char* type); - void writeNXDN(const class CUserDBentry& source, bool group, unsigned int dest, const char* type); - void writeNXDNRSSI(unsigned char rssi); - void writeNXDNBER(float ber); - void clearNXDN(); - - void writeM17(const char* source, const char* dest, const char* type); - void writeM17RSSI(unsigned char rssi); - void writeM17BER(float ber); - void clearM17(); - - void writePOCSAG(uint32_t ric, const std::string& message); - void clearPOCSAG(); - - void writeCW(); - - virtual void close() = 0; - - void clock(unsigned int ms); - - static CDisplay* createDisplay(const CConf& conf, CModem* modem); - -protected: - virtual void setIdleInt() = 0; - virtual void setLockoutInt() = 0; - virtual void setErrorInt(const char* text) = 0; - virtual void setQuitInt() = 0; - virtual void setFMInt() = 0; - - virtual void writeDStarInt(const char* my1, const char* my2, const char* your, const char* type, const char* reflector) = 0; - virtual void writeDStarRSSIInt(unsigned char rssi); - virtual void writeDStarBERInt(float ber); - virtual void clearDStarInt() = 0; - - virtual void writeDMRInt(unsigned int slotNo, const std::string& src, bool group, const std::string& dst, const char* type) = 0; - virtual int writeDMRIntEx(unsigned int slotNo, const class CUserDBentry& src, bool group, const std::string& dst, const char* type); - virtual void writeDMRRSSIInt(unsigned int slotNo, unsigned char rssi); - virtual void writeDMRTAInt(unsigned int slotNo, const unsigned char* talkerAlias, const char* type); - virtual void writeDMRBERInt(unsigned int slotNo, float ber); - virtual void clearDMRInt(unsigned int slotNo) = 0; - - virtual void writeFusionInt(const char* source, const char* dest, unsigned char dgid, const char* type, const char* origin) = 0; - virtual void writeFusionRSSIInt(unsigned char rssi); - virtual void writeFusionBERInt(float ber); - virtual void clearFusionInt() = 0; - - virtual void writeP25Int(const char* source, bool group, unsigned int dest, const char* type) = 0; - virtual void writeP25RSSIInt(unsigned char rssi); - virtual void writeP25BERInt(float ber); - virtual void clearP25Int() = 0; - - virtual void writeNXDNInt(const char* source, bool group, unsigned int dest, const char* type) = 0; - virtual int writeNXDNIntEx(const class CUserDBentry& source, bool group, unsigned int dest, const char* type); - virtual void writeNXDNRSSIInt(unsigned char rssi); - virtual void writeNXDNBERInt(float ber); - virtual void clearNXDNInt() = 0; - - virtual void writeM17Int(const char* source, const char* dest, const char* type) = 0; - virtual void writeM17RSSIInt(unsigned char rssi); - virtual void writeM17BERInt(float ber); - virtual void clearM17Int() = 0; - - virtual void writePOCSAGInt(uint32_t ric, const std::string& message) = 0; - virtual void clearPOCSAGInt() = 0; - - virtual void writeCWInt() = 0; - virtual void clearCWInt() = 0; - - virtual void clockInt(unsigned int ms); - -private: - CTimer m_timer1; - CTimer m_timer2; - unsigned char m_mode1; - unsigned char m_mode2; -}; - -#endif diff --git a/HD44780.cpp b/HD44780.cpp deleted file mode 100644 index f91c0de..0000000 --- a/HD44780.cpp +++ /dev/null @@ -1,1193 +0,0 @@ -/* - * Copyright (C) 2016,2017,2018,2020,2021 by Jonathan Naylor G4KLX & Tony Corbett G0WFV - * - * 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 "HD44780.h" -#include "Log.h" - -#include -#include -#include -#include - -#include -#include -#include - -const char* LISTENING = "Listening "; -const char* DEADSPACE = " "; - -char m_buffer1[128U]; -char m_buffer2[128U]; -char m_buffer3[128U]; -char m_buffer4[128U]; - -const unsigned int DSTAR_RSSI_COUNT = 3U; // 3 * 420ms = 1260ms -const unsigned int DMR_RSSI_COUNT = 4U; // 4 * 360ms = 1440ms -const unsigned int YSF_RSSI_COUNT = 13U; // 13 * 100ms = 1300ms -const unsigned int P25_RSSI_COUNT = 7U; // 7 * 180ms = 1260ms -const unsigned int NXDN_RSSI_COUNT = 28U; // 28 * 40ms = 1120ms -const unsigned int M17_RSSI_COUNT = 28U; // 28 * 40ms = 1120ms - -CHD44780::CHD44780(unsigned int rows, unsigned int cols, const std::string& callsign, unsigned int dmrid, const std::vector& pins, unsigned int i2cAddress, bool pwm, unsigned int pwmPin, unsigned int pwmBright, unsigned int pwmDim, bool displayClock, bool utc, bool duplex) : -CDisplay(), -m_rows(rows), -m_cols(cols), -m_callsign(callsign), -m_dmrid(dmrid), -m_rb(pins.at(0U)), -m_strb(pins.at(1U)), -m_d0(pins.at(2U)), -m_d1(pins.at(3U)), -m_d2(pins.at(4U)), -m_d3(pins.at(5U)), -m_i2cAddress(i2cAddress), -m_pwm(pwm), -m_pwmPin(pwmPin), -m_pwmBright(pwmBright), -m_pwmDim(pwmDim), -m_displayClock(displayClock), -m_utc(utc), -m_duplex(duplex), -//m_duplex(true), // uncomment to force duplex display for testing! -m_fd(-1), -m_dmr(false), -m_clockDisplayTimer(1000U, 0U, 250U), // Update the clock display every 250ms -m_rssiCount1(0U), -m_rssiCount2(0U) -{ - assert(rows > 1U); - assert(cols > 15U); -} - -// Text-based custom character for "from" -unsigned char fmChar[8] = -{ - 0b11100, - 0b10000, - 0b11000, - 0b10000, - 0b00101, - 0b00111, - 0b00101, - 0b00101 -}; - -// Text-based custom character for "to" -unsigned char toChar[8] = -{ - 0b11100, - 0b01000, - 0b01000, - 0b01000, - 0b00010, - 0b00101, - 0b00101, - 0b00010 -}; - -// Icon-based custom character for RF traffic -unsigned char rfChar[8] = -{ - 0b11111, - 0b10101, - 0b01110, - 0b00100, - 0b00100, - 0b00100, - 0b00100, - 0b00000 -}; - -// Icon-based custom character for network traffic -unsigned char ipChar[8] = -{ - 0b00000, - 0b01110, - 0b10001, - 0b00100, - 0b01010, - 0b00000, - 0b00100, - 0b00000 -}; - -// Icon-based custom character for call to talkgroup -unsigned char tgChar[8] = -{ - 0b01110, - 0b10001, - 0b10001, - 0b10001, - 0b01010, - 0b01100, - 0b10000, - 0b00000 -}; - -// Icon-based custom character for private call -unsigned char privChar[8] = -{ - 0b00100, - 0b00000, - 0b11111, - 0b01110, - 0b01110, - 0b01010, - 0b01010, - 0b00000 -}; - -CHD44780::~CHD44780() -{ -} - -bool CHD44780::open() -{ - ::wiringPiSetup(); - - if (m_pwm) { - if (m_pwmPin != 1U) { - ::softPwmCreate(m_pwmPin, 0, 100); - ::softPwmWrite(m_pwmPin, m_pwmDim); - } else { - ::pinMode(m_pwmPin, PWM_OUTPUT); - ::pwmWrite(m_pwmPin, (m_pwmDim / 100) * 1024); - } - } - -#ifdef ADAFRUIT_DISPLAY - adafruitLCDSetup(); -#endif - -#ifdef PCF8574_DISPLAY - pcf8574LCDSetup(); -#endif - - m_fd = ::lcdInit(m_rows, m_cols, 4, m_rb, m_strb, m_d0, m_d1, m_d2, m_d3, 0, 0, 0, 0); - if (m_fd == -1) { - LogError("Unable to open the HD44780"); - return false; - } - - ::lcdDisplay(m_fd, 1); - ::lcdCursor(m_fd, 0); - ::lcdCursorBlink(m_fd, 0); - ::lcdCharDef(m_fd, 0, fmChar); - ::lcdCharDef(m_fd, 1, toChar); - ::lcdCharDef(m_fd, 2, rfChar); - ::lcdCharDef(m_fd, 3, ipChar); - ::lcdCharDef(m_fd, 4, privChar); - ::lcdCharDef(m_fd, 5, tgChar); - - return true; -} - -#ifdef ADAFRUIT_DISPLAY -void CHD44780::adafruitLCDSetup() -{ - // The other control pins are initialised with lcdInit() - ::mcp23017Setup(AF_BASE, m_i2cAddress); - - // Backlight LEDs - ::pinMode(AF_RED, OUTPUT); - ::pinMode(AF_GREEN, OUTPUT); - ::pinMode(AF_BLUE, OUTPUT); - - // Control signals - ::pinMode(AF_RW, OUTPUT); - ::digitalWrite(AF_RW, LOW); - - m_rb = AF_RS; - m_strb = AF_E; - m_d0 = AF_D0; - m_d1 = AF_D1; - m_d2 = AF_D2; - m_d3 = AF_D3; -} - -void CHD44780::adafruitLCDColour(ADAFRUIT_COLOUR colour) -{ - switch (colour) { - case AC_OFF: - ::digitalWrite(AF_RED, AF_OFF); - ::digitalWrite(AF_GREEN, AF_OFF); - ::digitalWrite(AF_BLUE, AF_OFF); - break; - case AC_WHITE: - ::digitalWrite(AF_RED, AF_ON); - ::digitalWrite(AF_GREEN, AF_ON); - ::digitalWrite(AF_BLUE, AF_ON); - break; - case AC_RED: - ::digitalWrite(AF_RED, AF_ON); - ::digitalWrite(AF_GREEN, AF_OFF); - ::digitalWrite(AF_BLUE, AF_OFF); - break; - case AC_GREEN: - ::digitalWrite(AF_RED, AF_OFF); - ::digitalWrite(AF_GREEN, AF_ON); - ::digitalWrite(AF_BLUE, AF_OFF); - break; - case AC_BLUE: - ::digitalWrite(AF_RED, AF_OFF); - ::digitalWrite(AF_GREEN, AF_OFF); - ::digitalWrite(AF_BLUE, AF_ON); - break; - case AC_PURPLE: - ::digitalWrite(AF_RED, AF_ON); - ::digitalWrite(AF_GREEN, AF_OFF); - ::digitalWrite(AF_BLUE, AF_ON); - break; - case AC_YELLOW: - ::digitalWrite(AF_RED, AF_ON); - ::digitalWrite(AF_GREEN, AF_ON); - ::digitalWrite(AF_BLUE, AF_OFF); - break; - case AC_ICE: - ::digitalWrite(AF_RED, AF_OFF); - ::digitalWrite(AF_GREEN, AF_ON); - ::digitalWrite(AF_BLUE, AF_ON); - break; - default: - break; - } -} -#endif - -#ifdef PCF8574_DISPLAY -void CHD44780::pcf8574LCDSetup() -{ - // Initalize PFC8574 - ::pcf8574Setup(AF_BASE, m_i2cAddress); - - // Turn on backlight - ::pinMode(AF_BL, OUTPUT); - ::digitalWrite(AF_BL, 1); - - // Set LCD to write mode. - ::pinMode(AF_RW, OUTPUT); - ::digitalWrite(AF_RW, 0); - - m_rb = AF_RS; - m_strb = AF_E; - m_d0 = AF_D0; - m_d1 = AF_D1; - m_d2 = AF_D2; - m_d3 = AF_D3; -} -#endif - -void CHD44780::setIdleInt() -{ - m_clockDisplayTimer.start(); // Start the clock display in IDLE only - ::lcdClear(m_fd); - -#ifdef ADAFRUIT_DISPLAY - adafruitLCDColour(AC_WHITE); -#endif - - if (m_pwm) { - if (m_pwmPin != 1U) - ::softPwmWrite(m_pwmPin, m_pwmDim); - else - ::pwmWrite(m_pwmPin, (m_pwmDim / 100) * 1024); - } - - // Print callsign and ID at on top row for all screen sizes - ::lcdPosition(m_fd, 0, 0); - ::lcdPrintf(m_fd, "%-6s", m_callsign.c_str()); - ::lcdPosition(m_fd, m_cols - 7, 0); - ::lcdPrintf(m_fd, "%7u", m_dmrid); - - // Print MMDVM and Idle on bottom row for all screen sizes - ::lcdPosition(m_fd, 0, m_rows - 1); - ::lcdPuts(m_fd, "MMDVM"); - ::lcdPosition(m_fd, m_cols - 4, m_rows - 1); - ::lcdPuts(m_fd, "Idle"); // Gets overwritten by clock on 2 line screen - - m_dmr = false; -} - -void CHD44780::setErrorInt(const char* text) -{ - assert(text != NULL); - -#ifdef ADAFRUIT_DISPLAY - adafruitLCDColour(AC_RED); -#endif - - m_clockDisplayTimer.stop(); // Stop the clock display - ::lcdClear(m_fd); - - if (m_pwm) { - if (m_pwmPin != 1U) - ::softPwmWrite(m_pwmPin, m_pwmBright); - else - ::pwmWrite(m_pwmPin, (m_pwmBright / 100) * 1024); - } - - ::lcdPosition(m_fd, 0, 0); - ::lcdPuts(m_fd, "MMDVM"); - - ::lcdPosition(m_fd, 0, 1); - ::lcdPrintf(m_fd, "%s ERROR", text); - - m_dmr = false; -} - -void CHD44780::setLockoutInt() -{ -#ifdef ADAFRUIT_DISPLAY - adafruitLCDColour(AC_RED); -#endif - - m_clockDisplayTimer.stop(); // Stop the clock display - ::lcdClear(m_fd); - - if (m_pwm) { - if (m_pwmPin != 1U) - ::softPwmWrite(m_pwmPin, m_pwmBright); - else - ::pwmWrite(m_pwmPin, (m_pwmBright / 100) * 1024); - } - - ::lcdPosition(m_fd, 0, 0); - ::lcdPuts(m_fd, "MMDVM"); - - ::lcdPosition(m_fd, 0, 1); - ::lcdPuts(m_fd, "Lockout"); - - m_dmr = false; -} - -void CHD44780::setQuitInt() -{ -#ifdef ADAFRUIT_DISPLAY - adafruitLCDColour(AC_RED); -#endif - - m_clockDisplayTimer.stop(); // Stop the clock display - ::lcdClear(m_fd); - - if (m_pwm) { - if (m_pwmPin != 1U) - ::softPwmWrite(m_pwmPin, m_pwmBright); - else - ::pwmWrite(m_pwmPin, (m_pwmBright / 100) * 1024); - } - - ::lcdPosition(m_fd, 0, 0); - ::lcdPuts(m_fd, "MMDVM"); - - ::lcdPosition(m_fd, 0, 1); - ::lcdPuts(m_fd, "STOPPED"); - - m_dmr = false; -} - -void CHD44780::setFMInt() -{ - m_clockDisplayTimer.stop(); - ::lcdClear(m_fd); - -#ifdef ADAFRUIT_DISPLAY - adafruitLCDColour(AC_WHITE); -#endif - - if (m_pwm) { - if (m_pwmPin != 1U) - ::softPwmWrite(m_pwmPin, m_pwmDim); - else - ::pwmWrite(m_pwmPin, (m_pwmDim / 100) * 1024); - } - - // Print callsign and ID at on top row for all screen sizes - ::lcdPosition(m_fd, 0, 0); - ::lcdPrintf(m_fd, "%-6s", m_callsign.c_str()); - ::lcdPosition(m_fd, m_cols - 7, 0); - ::lcdPrintf(m_fd, "%7u", m_dmrid); - - // Print MMDVM and Idle on bottom row for all screen sizes - ::lcdPosition(m_fd, 0, m_rows - 1); - ::lcdPuts(m_fd, "MMDVM"); - ::lcdPosition(m_fd, m_cols - 4, m_rows - 1); - ::lcdPuts(m_fd, "FM"); // Gets overwritten by clock on 2 line screen - - m_dmr = false; -} - -void CHD44780::writeDStarInt(const char* my1, const char* my2, const char* your, const char* type, const char* reflector) -{ - assert(my1 != NULL); - assert(my2 != NULL); - assert(your != NULL); - assert(type != NULL); - assert(reflector != NULL); - -#ifdef ADAFRUIT_DISPLAY - adafruitLCDColour(AC_RED); -#endif - - m_clockDisplayTimer.stop(); // Stop the clock display - ::lcdClear(m_fd); - - if (m_pwm) { - if (m_pwmPin != 1U) - ::softPwmWrite(m_pwmPin, m_pwmBright); - else - ::pwmWrite(m_pwmPin, (m_pwmBright / 100) * 1024); - } - - if (m_rows > 2U) { - ::lcdPosition(m_fd, 0, (m_rows / 2) - 2); - ::sprintf(m_buffer1, "%s%s", "D-Star", DEADSPACE); - ::lcdPrintf(m_fd, "%.*s", m_cols, m_buffer1); - } - - ::lcdPosition(m_fd, 0, (m_rows / 2) - 1); - ::lcdPutchar(m_fd, 0); - ::lcdPrintf(m_fd, " %.8s/%.4s", my1, my2); - ::lcdPosition(m_fd, m_cols - 1, (m_rows / 2) - 1); - - if (strcmp(type, "R") == 0) - ::lcdPutchar(m_fd, 2); - else - ::lcdPutchar(m_fd, 3); - - ::sprintf(m_buffer1, "%.8s", your); - - char *p = m_buffer1; - for (; *p; ++p) { - if (*p == ' ') - *p = '_'; - } - - if (strcmp(reflector, " ") != 0) { - if (m_rows == 2 && m_cols == 40) { - ::sprintf(m_buffer3, " via %.8s", reflector); - strcat(m_buffer1, m_buffer3); - } else if (m_rows > 2) { - ::sprintf(m_buffer3, "via %.8s", reflector); - ::lcdPosition(m_fd, 0, (m_rows / 2) + 1); - ::lcdPrintf(m_fd, "%.*s", m_cols, m_buffer3); - } - } - - ::lcdPosition(m_fd, 0, (m_rows / 2)); - ::lcdPutchar(m_fd, 1); - ::lcdPrintf(m_fd, " %.*s", m_cols, m_buffer1); - - m_dmr = false; - m_rssiCount1 = 0U; -} - -void CHD44780::writeDStarRSSIInt(unsigned char rssi) -{ - if (m_rssiCount1 == 0U && m_rows > 2) { - ::lcdPosition(m_fd, 0, 3); - ::lcdPrintf(m_fd, "-%3udBm", rssi); - } - - m_rssiCount1++; - if (m_rssiCount1 >= DSTAR_RSSI_COUNT) - m_rssiCount1 = 0U; -} - -void CHD44780::clearDStarInt() -{ -#ifdef ADAFRUIT_DISPLAY - adafruitLCDColour(AC_PURPLE); -#endif - - m_clockDisplayTimer.stop(); // Stop the clock display - ::lcdClear(m_fd); - - ::lcdPosition(m_fd, 0, (m_rows / 2) - 1); - ::sprintf(m_buffer2, "%s%s", "D-Star", DEADSPACE); - ::lcdPrintf(m_fd, "%.*s", m_cols, m_buffer2); - ::lcdPosition(m_fd, 0, (m_rows / 2)); - ::lcdPrintf(m_fd, "%.*s", m_cols, LISTENING); -} - -void CHD44780::writeDMRInt(unsigned int slotNo, const std::string& src, bool group, const std::string& dst, const char* type) -{ - assert(type != NULL); - - if (!m_dmr) { - m_clockDisplayTimer.stop(); // Stop the clock display - ::lcdClear(m_fd); - -#ifdef ADAFRUIT_DISPLAY - adafruitLCDColour(AC_GREEN); -#endif - - if (m_pwm) { - if (m_pwmPin != 1U) - ::softPwmWrite(m_pwmPin, m_pwmBright); - else - ::pwmWrite(m_pwmPin, (m_pwmBright / 100) * 1024); - } - - if (m_duplex) { - if (m_rows > 2U) { - ::lcdPosition(m_fd, 0, (m_rows / 2) - 2); - ::sprintf(m_buffer1, "%s%s", "DMR", DEADSPACE); - ::lcdPrintf(m_fd, "%.*s", m_cols, m_buffer1); - } - - if (slotNo == 1U) { - //m_dmrScrollTimer2.stop(); - ::lcdPosition(m_fd, 0, (m_rows / 2)); - ::lcdPrintf(m_fd, "2 %.*s", m_cols - 2U, LISTENING); - } else { - //m_dmrScrollTimer1.stop(); - ::lcdPosition(m_fd, 0, (m_rows / 2) - 1); - ::lcdPrintf(m_fd, "1 %.*s", m_cols - 2U, LISTENING); - } - } else { - //m_dmrScrollTimer2.stop(); - - if (m_rows > 2U) { - ::lcdPosition(m_fd, 0, (m_rows / 2) - 2); - ::sprintf(m_buffer1, "%s", DEADSPACE); - ::lcdPrintf(m_fd, "%.*s", m_cols, m_buffer1); - } - - ::lcdPosition(m_fd, 0, (m_rows / 2) - 1); - ::sprintf(m_buffer1, "%s%s", "DMR", DEADSPACE); - ::lcdPrintf(m_fd, "%.*s", m_cols, m_buffer1); - ::lcdPosition(m_fd, 0, (m_rows / 2)); - ::lcdPrintf(m_fd, "%.*s", m_cols, LISTENING); - } - } - -#ifdef ADAFRUIT_DISPLAY - adafruitLCDColour(AC_RED); -#endif - - if (m_duplex) { - if (m_rows > 2U) { - ::lcdPosition(m_fd, 0, (m_rows / 2) - 2); - ::sprintf(m_buffer1, "%s%s", "DMR", DEADSPACE); - ::lcdPrintf(m_fd, "%.*s", m_cols, m_buffer1); - } - - if (slotNo == 1U) { - ::lcdPosition(m_fd, 0, (m_rows / 2) - 1); - ::lcdPuts(m_fd, "1 "); - if (m_cols > 16 ) - ::sprintf(m_buffer1, "%s > %s%s%s", src.c_str(), group ? "TG" : "", dst.c_str(), DEADSPACE); - else - ::sprintf(m_buffer1, "%s>%s%s", src.c_str(), dst.c_str(), DEADSPACE); - ::lcdPrintf(m_fd, "%.*s", m_cols - 2U, m_buffer1); - - ::lcdPosition(m_fd, m_cols - 3U, (m_rows / 2) - 1); - ::lcdPuts(m_fd, " "); - - if (group) - ::lcdPutchar(m_fd, 5); - else - ::lcdPutchar(m_fd, 4); - - if (strcmp(type, "R") == 0) - ::lcdPutchar(m_fd, 2); - else - ::lcdPutchar(m_fd, 3); - } else { - ::lcdPosition(m_fd, 0, (m_rows / 2)); - ::lcdPuts(m_fd, "2 "); - - if (m_cols > 16) - ::sprintf(m_buffer2, "%s > %s%s%s", src.c_str(), group ? "TG" : "", dst.c_str(), DEADSPACE); - else - ::sprintf(m_buffer2, "%s>%s%s", src.c_str(), dst.c_str(), DEADSPACE); - ::lcdPrintf(m_fd, "%.*s", m_cols - 2U, m_buffer2); - - ::lcdPosition(m_fd, m_cols - 3U, (m_rows / 2)); - ::lcdPuts(m_fd, " "); - - if (group) - ::lcdPutchar(m_fd, 5); - else - ::lcdPutchar(m_fd, 4); - - if (strcmp(type, "R") == 0) - ::lcdPutchar(m_fd, 2); - else - ::lcdPutchar(m_fd, 3); - } - } else { - if (m_rows > 2U) { - ::lcdPosition(m_fd, 0, (m_rows / 2) - 2); - ::sprintf(m_buffer1, "%s%s", "DMR", DEADSPACE); - ::lcdPrintf(m_fd, "%.*s", m_cols, m_buffer1); - } - - ::lcdPosition(m_fd, 0, (m_rows / 2) - 1); - ::lcdPutchar(m_fd, 0); - ::sprintf(m_buffer2, " %s%s", src.c_str(), DEADSPACE); - ::lcdPrintf(m_fd, "%.*s", m_cols - 4U, m_buffer2); - ::lcdPosition(m_fd, m_cols - 1U, (m_rows / 2) - 1); - - if (strcmp(type, "R") == 0) - ::lcdPutchar(m_fd, 2); - else - ::lcdPutchar(m_fd, 3); - - ::lcdPosition(m_fd, 0, (m_rows / 2)); - ::lcdPutchar(m_fd, 1); - ::sprintf(m_buffer2, " %s%s%s", group ? "TG" : "", dst.c_str(), DEADSPACE); - ::lcdPrintf(m_fd, "%.*s", m_cols - 4U, m_buffer2); - ::lcdPosition(m_fd, m_cols - 1U, (m_rows / 2)); - - if (group) - ::lcdPutchar(m_fd, 5); - else - ::lcdPutchar(m_fd, 4); - } - - m_dmr = true; - m_rssiCount1 = 0U; - m_rssiCount2 = 0U; -} - -void CHD44780::writeDMRRSSIInt(unsigned int slotNo, unsigned char rssi) -{ - if (m_rows > 2) { - if (slotNo == 1U) { - if (m_rssiCount1 == 0U) { - ::lcdPosition(m_fd, 0, 3); - ::lcdPrintf(m_fd, "-%3udBm", rssi); - } - - m_rssiCount1++; - if (m_rssiCount1 >= DMR_RSSI_COUNT) - m_rssiCount1 = 0U; - } else { - if (m_rssiCount2 == 0U) { - ::lcdPosition(m_fd, (m_cols / 2), 3); - ::lcdPrintf(m_fd, "-%3udBm", rssi); - } - - m_rssiCount2++; - if (m_rssiCount2 >= DMR_RSSI_COUNT) - m_rssiCount2 = 0U; - } - } -} - -void CHD44780::clearDMRInt(unsigned int slotNo) -{ -#ifdef ADAFRUIT_DISPLAY - adafruitLCDColour(AC_PURPLE); -#endif - - m_clockDisplayTimer.stop(); // Stop the clock display - - if (m_duplex) { - if (slotNo == 1U) { - ::lcdPosition(m_fd, 0, (m_rows / 2) - 1); - ::lcdPrintf(m_fd, "1 %.*s", m_cols - 2U, LISTENING); - - if (m_rows > 2) { // clear slot 1 RSSI - ::lcdPosition(m_fd, 0, 3); - ::lcdPrintf(m_fd, "%.*s", m_cols / 2, DEADSPACE); - } - } else { - ::lcdPosition(m_fd, 0, (m_rows / 2)); - ::lcdPrintf(m_fd, "2 %.*s", m_cols - 2U, LISTENING); - - if (m_rows > 2) { // cleat slot 2 RSSI - ::lcdPosition(m_fd, m_cols / 2, 3); - ::lcdPrintf(m_fd, "%.*s", m_cols / 2, DEADSPACE); - } - } - } else { - if (m_rows > 2U) { - ::lcdPosition(m_fd, 0, (m_rows / 2) - 2); - ::sprintf(m_buffer1, "%s", DEADSPACE); - ::lcdPrintf(m_fd, "%.*s", m_cols, m_buffer1); - } - - ::lcdPosition(m_fd, 0, (m_rows / 2) - 1); - ::sprintf(m_buffer2, "%s%s", "DMR", DEADSPACE); - ::lcdPrintf(m_fd, "%.*s", m_cols, m_buffer2); - ::lcdPosition(m_fd, 0, (m_rows / 2)); - ::lcdPrintf(m_fd, "%.*s", m_cols, LISTENING); - } -} - -void CHD44780::writeFusionInt(const char* source, const char* dest, unsigned char dgid, const char* type, const char* origin) -{ - assert(source != NULL); - assert(dest != NULL); - assert(type != NULL); - assert(origin != NULL); - -#ifdef ADAFRUIT_DISPLAY - adafruitLCDColour(AC_RED); -#endif - - m_clockDisplayTimer.stop(); // Stop the clock display - ::lcdClear(m_fd); - - if (m_pwm) { - if (m_pwmPin != 1U) - ::softPwmWrite(m_pwmPin, m_pwmBright); - else - ::pwmWrite(m_pwmPin, (m_pwmBright / 100) * 1024); - } - - ::lcdPosition(m_fd, 0, 0); - ::lcdPuts(m_fd, "System Fusion"); - - if (m_rows == 2U && m_cols == 16U) { - ::sprintf(m_buffer1, "%.10s >", source); - ::lcdPosition(m_fd, 0, 1); - ::lcdPrintf(m_fd, "%.*s", m_cols, m_buffer1); - } else if (m_rows == 4U && m_cols == 16U) { - ::sprintf(m_buffer1, "%.10s >", source); - ::lcdPosition(m_fd, 0, 1); - ::lcdPrintf(m_fd, "%.*s", m_cols, m_buffer1); - - ::sprintf(m_buffer1, "DG-ID %u", dgid); - ::lcdPosition(m_fd, 0, 2); - ::lcdPrintf(m_fd, "%.*s", m_cols, m_buffer1); - } else if (m_rows == 4U && m_cols == 20U) { - ::sprintf(m_buffer1, "%.10s >", source); - ::lcdPosition(m_fd, 0, 1); - ::lcdPrintf(m_fd, "%.*s", m_cols, m_buffer1); - - ::sprintf(m_buffer1, "DG-ID %u", dgid); - ::lcdPosition(m_fd, 0, 2); - ::lcdPrintf(m_fd, "%.*s", m_cols, m_buffer1); - } else if (m_rows == 2 && m_cols == 40U) { - ::sprintf(m_buffer1, "%.10s > DG-ID %u", source, dgid); - - ::lcdPosition(m_fd, 0, 1); - ::lcdPrintf(m_fd, "%.*s", m_cols, m_buffer1); - } - - m_dmr = false; - m_rssiCount1 = 0U; -} - -void CHD44780::writeFusionRSSIInt(unsigned char rssi) -{ - if (m_rssiCount1 == 0U && m_rows > 2) { - ::lcdPosition(m_fd, 0, 3); - ::lcdPrintf(m_fd, "-%3udBm", rssi); - } - - m_rssiCount1++; - if (m_rssiCount1 >= YSF_RSSI_COUNT) - m_rssiCount1 = 0U; -} - -void CHD44780::clearFusionInt() -{ -#ifdef ADAFRUIT_DISPLAY - adafruitLCDColour(AC_PURPLE); -#endif - m_clockDisplayTimer.stop(); // Stop the clock display - - if (m_rows == 2U && m_cols == 16U) { - ::lcdPosition(m_fd, 0, 1); - ::lcdPrintf(m_fd, "%.*s", m_cols, LISTENING); - } else if (m_rows == 4U && m_cols == 16U) { - ::lcdPosition(m_fd, 0, 1); - ::lcdPrintf(m_fd, "%.*s", m_cols, LISTENING); - - ::lcdPosition(m_fd, 0, 2); - ::lcdPrintf(m_fd, "%.*s", m_cols, " "); - - ::lcdPosition(m_fd, 0, 3); - ::lcdPrintf(m_fd, "%.*s", m_cols, " "); - } else if (m_rows == 4U && m_cols == 20U) { - ::lcdPosition(m_fd, 0, 1); - ::lcdPrintf(m_fd, "%.*s", m_cols, LISTENING); - - ::lcdPosition(m_fd, 0, 2); - ::lcdPrintf(m_fd, "%.*s", m_cols, " "); - - ::lcdPosition(m_fd, 0, 3); - ::lcdPrintf(m_fd, "%.*s", m_cols, " "); - } else if (m_rows == 2 && m_cols == 40U) { - ::lcdPosition(m_fd, 0, 1); - ::lcdPrintf(m_fd, "%.*s", m_cols, LISTENING); - } -} - -void CHD44780::writeP25Int(const char* source, bool group, unsigned int dest, const char* type) -{ - assert(source != NULL); - assert(type != NULL); - -#ifdef ADAFRUIT_DISPLAY - adafruitLCDColour(AC_RED); -#endif - - m_clockDisplayTimer.stop(); // Stop the clock display - ::lcdClear(m_fd); - - if (m_pwm) { - if (m_pwmPin != 1U) - ::softPwmWrite(m_pwmPin, m_pwmBright); - else - ::pwmWrite(m_pwmPin, (m_pwmBright / 100) * 1024); - } - - ::lcdPosition(m_fd, 0, 0); - ::lcdPuts(m_fd, "P25"); - - if (m_rows == 2U && m_cols == 16U) { - ::sprintf(m_buffer1, "%.10s >", source); - ::lcdPosition(m_fd, 0, 1); - ::lcdPrintf(m_fd, "%.*s", m_cols, m_buffer1); - } else if (m_rows == 4U && m_cols == 16U) { - ::sprintf(m_buffer1, "%.10s >", source); - ::lcdPosition(m_fd, 0, 1); - ::lcdPrintf(m_fd, "%.*s", m_cols, m_buffer1); - - ::sprintf(m_buffer1, "%s%u", group ? "TG" : "", dest); - ::lcdPosition(m_fd, 0, 2); - ::lcdPrintf(m_fd, "%.*s", m_cols, m_buffer1); - } else if (m_rows == 4U && m_cols == 20U) { - ::sprintf(m_buffer1, "%.10s >", source); - ::lcdPosition(m_fd, 0, 1); - ::lcdPrintf(m_fd, "%.*s", m_cols, m_buffer1); - - ::sprintf(m_buffer1, "%s%u", group ? "TG" : "", dest); - ::lcdPosition(m_fd, 0, 2); - ::lcdPrintf(m_fd, "%.*s", m_cols, m_buffer1); - } else if (m_rows == 2 && m_cols == 40U) { - ::sprintf(m_buffer1, "%.10s > %s%u", source, group ? "TG" : "", dest); - - ::lcdPosition(m_fd, 0, 1); - ::lcdPrintf(m_fd, "%.*s", m_cols, m_buffer1); - } - - m_dmr = false; - m_rssiCount1 = 0U; -} - -void CHD44780::writeP25RSSIInt(unsigned char rssi) -{ - if (m_rssiCount1 == 0U && m_rows > 2) { - ::lcdPosition(m_fd, 0, 3); - ::lcdPrintf(m_fd, "-%3udBm", rssi); - } - - m_rssiCount1++; - if (m_rssiCount1 >= P25_RSSI_COUNT) - m_rssiCount1 = 0U; -} - -void CHD44780::clearP25Int() -{ -#ifdef ADAFRUIT_DISPLAY - adafruitLCDColour(AC_PURPLE); -#endif - - m_clockDisplayTimer.stop(); // Stop the clock display - - if (m_rows == 2U && m_cols == 16U) { - ::lcdPosition(m_fd, 0, 1); - ::lcdPrintf(m_fd, "%.*s", m_cols, LISTENING); - } else if (m_rows == 4U && m_cols == 16U) { - ::lcdPosition(m_fd, 0, 1); - ::lcdPrintf(m_fd, "%.*s", m_cols, LISTENING); - - ::lcdPosition(m_fd, 0, 2); - ::lcdPrintf(m_fd, "%.*s", m_cols, " "); - - ::lcdPosition(m_fd, 0, 3); - ::lcdPrintf(m_fd, "%.*s", m_cols, " "); - } else if (m_rows == 4U && m_cols == 20U) { - ::lcdPosition(m_fd, 0, 1); - ::lcdPrintf(m_fd, "%.*s", m_cols, LISTENING); - - ::lcdPosition(m_fd, 0, 2); - ::lcdPrintf(m_fd, "%.*s", m_cols, " "); - - ::lcdPosition(m_fd, 0, 3); - ::lcdPrintf(m_fd, "%.*s", m_cols, " "); - } else if (m_rows == 2 && m_cols == 40U) { - ::lcdPosition(m_fd, 0, 1); - ::lcdPrintf(m_fd, "%.*s", m_cols, LISTENING); - } -} - -void CHD44780::writeNXDNInt(const char* source, bool group, unsigned int dest, const char* type) -{ - assert(source != NULL); - assert(type != NULL); - -#ifdef ADAFRUIT_DISPLAY - adafruitLCDColour(AC_RED); -#endif - - m_clockDisplayTimer.stop(); // Stop the clock display - ::lcdClear(m_fd); - - if (m_pwm) { - if (m_pwmPin != 1U) - ::softPwmWrite(m_pwmPin, m_pwmBright); - else - ::pwmWrite(m_pwmPin, (m_pwmBright / 100) * 1024); - } - - ::lcdPosition(m_fd, 0, 0); - ::lcdPuts(m_fd, "NXDN"); - - if (m_rows == 2U && m_cols == 16U) { - ::sprintf(m_buffer1, "%.10s >", source); - ::lcdPosition(m_fd, 0, 1); - ::lcdPrintf(m_fd, "%.*s", m_cols, m_buffer1); - } else if (m_rows == 4U && m_cols == 16U) { - ::sprintf(m_buffer1, "%.10s >", source); - ::lcdPosition(m_fd, 0, 1); - ::lcdPrintf(m_fd, "%.*s", m_cols, m_buffer1); - - ::sprintf(m_buffer1, "%s%u", group ? "TG" : "", dest); - ::lcdPosition(m_fd, 0, 2); - ::lcdPrintf(m_fd, "%.*s", m_cols, m_buffer1); - } else if (m_rows == 4U && m_cols == 20U) { - ::sprintf(m_buffer1, "%.10s >", source); - ::lcdPosition(m_fd, 0, 1); - ::lcdPrintf(m_fd, "%.*s", m_cols, m_buffer1); - - ::sprintf(m_buffer1, "%s%u", group ? "TG" : "", dest); - ::lcdPosition(m_fd, 0, 2); - ::lcdPrintf(m_fd, "%.*s", m_cols, m_buffer1); - } else if (m_rows == 2 && m_cols == 40U) { - ::sprintf(m_buffer1, "%.10s > %s%u", source, group ? "TG" : "", dest); - ::lcdPosition(m_fd, 0, 1); - ::lcdPrintf(m_fd, "%.*s", m_cols, m_buffer1); - } - - m_dmr = false; - m_rssiCount1 = 0U; -} - -void CHD44780::writeNXDNRSSIInt(unsigned char rssi) -{ - if (m_rssiCount1 == 0U && m_rows > 2) { - ::lcdPosition(m_fd, 0, 3); - ::lcdPrintf(m_fd, "-%3udBm", rssi); - } - - m_rssiCount1++; - if (m_rssiCount1 >= NXDN_RSSI_COUNT) - m_rssiCount1 = 0U; -} - -void CHD44780::clearNXDNInt() -{ -#ifdef ADAFRUIT_DISPLAY - adafruitLCDColour(AC_PURPLE); -#endif - - m_clockDisplayTimer.stop(); // Stop the clock display - - if (m_rows == 2U && m_cols == 16U) { - ::lcdPosition(m_fd, 0, 1); - ::lcdPrintf(m_fd, "%.*s", m_cols, LISTENING); - } else if (m_rows == 4U && m_cols == 16U) { - ::lcdPosition(m_fd, 0, 1); - ::lcdPrintf(m_fd, "%.*s", m_cols, LISTENING); - - ::lcdPosition(m_fd, 0, 2); - ::lcdPrintf(m_fd, "%.*s", m_cols, " "); - - ::lcdPosition(m_fd, 0, 3); - ::lcdPrintf(m_fd, "%.*s", m_cols, " "); - } else if (m_rows == 4U && m_cols == 20U) { - ::lcdPosition(m_fd, 0, 1); - ::lcdPrintf(m_fd, "%.*s", m_cols, LISTENING); - - ::lcdPosition(m_fd, 0, 2); - ::lcdPrintf(m_fd, "%.*s", m_cols, " "); - - ::lcdPosition(m_fd, 0, 3); - ::lcdPrintf(m_fd, "%.*s", m_cols, " "); - } else if (m_rows == 2 && m_cols == 40U) { - ::lcdPosition(m_fd, 0, 1); - ::lcdPrintf(m_fd, "%.*s", m_cols, LISTENING); - } -} - -void CHD44780::writeM17Int(const char* source, const char* dest, const char* type) -{ - assert(source != NULL); - assert(dest != NULL); - assert(type != NULL); - -#ifdef ADAFRUIT_DISPLAY - adafruitLCDColour(AC_RED); -#endif - - m_clockDisplayTimer.stop(); // Stop the clock display - ::lcdClear(m_fd); - - if (m_pwm) { - if (m_pwmPin != 1U) - ::softPwmWrite(m_pwmPin, m_pwmBright); - else - ::pwmWrite(m_pwmPin, (m_pwmBright / 100) * 1024); - } - - ::lcdPosition(m_fd, 0, 0); - ::lcdPuts(m_fd, "M17"); - - ::sprintf(m_buffer1, "%.9s", source); - ::sprintf(m_buffer2, "%.9s", dest); - - if (m_rows == 2U && m_cols == 16U) { - ::lcdPosition(m_fd, 5, 0); - ::lcdPrintf(m_fd, "%.*s", m_cols - 5, m_buffer1); - ::lcdPosition(m_fd, 5, 1); - ::lcdPrintf(m_fd, "%.*s", m_cols - 5, m_buffer2); - } else if (m_rows == 4U && m_cols == 16U) { - ::lcdPosition(m_fd, 0, 1); - ::lcdPrintf(m_fd, "%.*s", m_cols, m_buffer1); - ::lcdPosition(m_fd, 0, 2); - ::lcdPrintf(m_fd, "%.*s", m_cols, m_buffer2); - } else if (m_rows == 4U && m_cols == 20U) { - ::lcdPosition(m_fd, 0, 1); - ::lcdPrintf(m_fd, "%.*s", m_cols, m_buffer1); - ::lcdPosition(m_fd, 0, 2); - ::lcdPrintf(m_fd, "%.*s", m_cols, m_buffer1); - } else if (m_rows == 2 && m_cols == 40U) { - ::sprintf(m_buffer1, "%.9s > %.9s", source, dest); - ::lcdPosition(m_fd, 0, 1); - ::lcdPrintf(m_fd, "%.*s", m_cols, m_buffer1); - } - - m_dmr = false; - m_rssiCount1 = 0U; -} - -void CHD44780::writeM17RSSIInt(unsigned char rssi) -{ - if (m_rssiCount1 == 0U && m_rows > 2) { - ::lcdPosition(m_fd, 0, 3); - ::lcdPrintf(m_fd, "-%3udBm", rssi); - } - - m_rssiCount1++; - if (m_rssiCount1 >= M17_RSSI_COUNT) - m_rssiCount1 = 0U; -} - -void CHD44780::clearM17Int() -{ -#ifdef ADAFRUIT_DISPLAY - adafruitLCDColour(AC_PURPLE); -#endif - m_clockDisplayTimer.stop(); // Stop the clock display - - if (m_rows == 2U && m_cols == 16U) { - ::lcdPosition(m_fd, 5, 0); - ::lcdPrintf(m_fd, "%.*s", m_cols - 5, LISTENING); - ::lcdPosition(m_fd, 5, 1); - ::lcdPrintf(m_fd, "%.*s", m_cols - 5, " "); - } else if (m_rows == 4U && m_cols == 16U) { - ::lcdPosition(m_fd, 0, 1); - ::lcdPrintf(m_fd, "%.*s", m_cols, LISTENING); - - ::lcdPosition(m_fd, 0, 2); - ::lcdPrintf(m_fd, "%.*s", m_cols, " "); - - ::lcdPosition(m_fd, 0, 3); - ::lcdPrintf(m_fd, "%.*s", m_cols, " "); - } else if (m_rows == 4U && m_cols == 20U) { - ::lcdPosition(m_fd, 0, 1); - ::lcdPrintf(m_fd, "%.*s", m_cols, LISTENING); - - ::lcdPosition(m_fd, 0, 2); - ::lcdPrintf(m_fd, "%.*s", m_cols, " "); - - ::lcdPosition(m_fd, 0, 3); - ::lcdPrintf(m_fd, "%.*s", m_cols, " "); - } else if (m_rows == 2 && m_cols == 40U) { - ::lcdPosition(m_fd, 0, 1); - ::lcdPrintf(m_fd, "%.*s", m_cols, LISTENING); - } -} - -void CHD44780::writePOCSAGInt(uint32_t ric, const std::string& message) -{ - ::lcdPosition(m_fd, m_cols - 5, m_rows - 1); - ::lcdPuts(m_fd, "POCSG"); // Shortened "POCSAG TX" to 5 characters because it wraps around onto the next line (or on 16x2 displays the 1st line). -} - -void CHD44780::clearPOCSAGInt() -{ - ::lcdPosition(m_fd, m_cols - 5, m_rows - 1); - ::lcdPuts(m_fd, " Idle"); // Reverted back to 5 character implementation. -} - -void CHD44780::writeCWInt() -{ - ::lcdPosition(m_fd, m_cols - 5, m_rows - 1); - ::lcdPuts(m_fd, "CW TX"); -} - -void CHD44780::clearCWInt() -{ - ::lcdPosition(m_fd, m_cols - 5, m_rows - 1); - ::lcdPuts(m_fd, " Idle"); -} - -void CHD44780::clockInt(unsigned int ms) -{ - m_clockDisplayTimer.clock(ms); - - // Idle clock display - if (m_displayClock && m_clockDisplayTimer.isRunning() && m_clockDisplayTimer.hasExpired()) { - time_t currentTime; - struct tm *Time; - ::time(¤tTime); - - if (m_utc) - Time = ::gmtime(¤tTime); - else - Time = ::localtime(¤tTime); - - setlocale(LC_TIME,""); - ::strftime(m_buffer1, 128, "%X", Time); // Time - ::strftime(m_buffer2, 128, "%x", Time); // Date - - if (m_cols == 16U && m_rows == 2U) { - ::lcdPosition(m_fd, m_cols - 10, 1); - ::lcdPrintf(m_fd, "%s%.*s", strlen(m_buffer1) > 8 ? "" : " ", 10, m_buffer1); - } else { - ::lcdPosition(m_fd, (m_cols - (strlen(m_buffer1) == 8 ? 8 : 10)) / 2, m_rows == 2 ? 1 : 2); - ::lcdPrintf(m_fd, "%.*s", strlen(m_buffer1) == 8 ? 8 : 10, m_buffer1); - ::lcdPosition(m_fd, (m_cols - strlen(m_buffer2)) / 2, m_rows == 2 ? 0 : 1); - ::lcdPrintf(m_fd, "%s", m_buffer2); - } - - m_clockDisplayTimer.start(); - } -} - -void CHD44780::close() -{ -} diff --git a/HD44780.h b/HD44780.h deleted file mode 100644 index 308f50d..0000000 --- a/HD44780.h +++ /dev/null @@ -1,178 +0,0 @@ -/* - * Copyright (C) 2016,2017,2018,2020,2021 by Jonathan Naylor G4KLX & Tony Corbett G0WFV - * - * 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(HD44780_H) -#define HD44780_H - -#include "Display.h" -#include "Timer.h" - -#include -#include - -#include -#include - -enum ADAFRUIT_COLOUR { - AC_OFF, - AC_WHITE, - AC_RED, - AC_GREEN, - AC_BLUE, - AC_PURPLE, - AC_YELLOW, - AC_ICE -}; - -// Defines for the Adafruit Pi LCD interface board -#ifdef ADAFRUIT_DISPLAY -#define AF_BASE 100 - -/* Not yet used defines (for possible future use) - * - * #define AF_SELECT (AF_BASE + 0) - * #define AF_RIGHT (AF_BASE + 1) - * #define AF_DOWN (AF_BASE + 2) - * #define AF_UP (AF_BASE + 3) - * #define AF_LEFT (AF_BASE + 4) - */ - -#define AF_RED (AF_BASE + 6) -#define AF_GREEN (AF_BASE + 7) -#define AF_BLUE (AF_BASE + 8) - -#define AF_D3 (AF_BASE + 9) -#define AF_D2 (AF_BASE + 10) -#define AF_D1 (AF_BASE + 11) -#define AF_D0 (AF_BASE + 12) -#define AF_E (AF_BASE + 13) -#define AF_RW (AF_BASE + 14) -#define AF_RS (AF_BASE + 15) - -#define AF_ON LOW -#define AF_OFF HIGH - -// #define MCP23017 0x20 -#endif - -// Define for HD44780 connected via a PCF8574 GPIO extender -#ifdef PCF8574_DISPLAY -#define AF_BASE 100 - -#define AF_RS (AF_BASE + 0) -#define AF_RW (AF_BASE + 1) -#define AF_E (AF_BASE + 2) -#define AF_BL (AF_BASE + 3) -#define AF_D0 (AF_BASE + 4) -#define AF_D1 (AF_BASE + 5) -#define AF_D2 (AF_BASE + 6) -#define AF_D3 (AF_BASE + 7) - -// #define PCF8574 0x27 -#endif - -class CHD44780 : public CDisplay -{ -public: - CHD44780(unsigned int rows, unsigned int cols, const std::string& callsign, unsigned int dmrid, const std::vector& pins, unsigned int i2cAddress, bool pwm, unsigned int pwmPin, unsigned int pwmBright, unsigned int pwmDim, bool displayClock, bool utc, bool duplex); - virtual ~CHD44780(); - - virtual bool open(); - - virtual void close(); - -protected: - virtual void setIdleInt(); - virtual void setErrorInt(const char* text); - virtual void setLockoutInt(); - virtual void setQuitInt(); - virtual void setFMInt(); - - virtual void writeDStarInt(const char* my1, const char* my2, const char* your, const char* type, const char* reflector); - virtual void writeDStarRSSIInt(unsigned char rssi); - virtual void clearDStarInt(); - - virtual void writeDMRInt(unsigned int slotNo, const std::string& src, bool group, const std::string& dst, const char* type); - virtual void writeDMRRSSIInt(unsigned int slotNo, unsigned char rssi); - virtual void clearDMRInt(unsigned int slotNo); - - virtual void writeFusionInt(const char* source, const char* dest, unsigned char dgid, const char* type, const char* origin); - virtual void writeFusionRSSIInt(unsigned char rssi); - virtual void clearFusionInt(); - - virtual void writeP25Int(const char* source, bool group, unsigned int dest, const char* type); - virtual void writeP25RSSIInt(unsigned char rssi); - virtual void clearP25Int(); - - virtual void writeNXDNInt(const char* source, bool group, unsigned int dest, const char* type); - virtual void writeNXDNRSSIInt(unsigned char rssi); - virtual void clearNXDNInt(); - - virtual void writeM17Int(const char* source, const char* dest, const char* type); - virtual void writeM17RSSIInt(unsigned char rssi); - virtual void clearM17Int(); - - virtual void writePOCSAGInt(uint32_t ric, const std::string& message); - virtual void clearPOCSAGInt(); - - virtual void writeCWInt(); - virtual void clearCWInt(); - - virtual void clockInt(unsigned int ms); - -private: - unsigned int m_rows; - unsigned int m_cols; - std::string m_callsign; - unsigned int m_dmrid; - unsigned int m_rb; - unsigned int m_strb; - unsigned int m_d0; - unsigned int m_d1; - unsigned int m_d2; - unsigned int m_d3; - unsigned int m_i2cAddress; - bool m_pwm; - unsigned int m_pwmPin; - unsigned int m_pwmBright; - unsigned int m_pwmDim; - bool m_displayClock; - bool m_utc; - bool m_duplex; - int m_fd; - bool m_dmr; - CTimer m_clockDisplayTimer; - unsigned int m_rssiCount1; - unsigned int m_rssiCount2; -/* - CTimer m_dmrScrollTimer1; - CTimer m_dmrScrollTimer2; - CTimer m_dstarScrollTimer; -*/ - -#ifdef ADAFRUIT_DISPLAY - void adafruitLCDSetup(); - void adafruitLCDColour(ADAFRUIT_COLOUR colour); -#endif - -#ifdef PCF8574_DISPLAY - void pcf8574LCDSetup(); -#endif -}; - -#endif diff --git a/HD44780.layouts b/HD44780.layouts deleted file mode 100644 index 08b6224..0000000 --- a/HD44780.layouts +++ /dev/null @@ -1,107 +0,0 @@ -IDLE SCREEN LAYOUTS -------------------- - -16 x 2 ------- - - With clock Without clock - ---------- ------------- - - 0 1 0 1 - 0123456789012345 0123456789012345 - +----------------+ +----------------+ -0|AAAAAA NNNNNNN| 0|AAAAAA NNNNNNN| -1|MMDVM HH:MM:SS| 1|MMDVM Idle| - +----------------+ +----------------+ - -40 x 2 ------- - - With clock Without clock - ---------- ------------- - - 0 1 2 3 0 1 2 3 - 0123456789012345678901234567890123456789 0123456789012345678901234567890123456789 - +----------------------------------------+ +----------------------------------------+ -0|AAAAAA DD/MM/YY NNNNNNN| 0|AAAAAA NNNNNNN| -1|MMDVM HH:MM:SS Idle| 1|MMDVM Idle| - +----------------------------------------+ +----------------------------------------+ - -16 x 4 ------- - - With clock Without clock - ---------- ------------- - - 0 1 0 1 - 0123456789012345 0123456789012345 - +----------------+ +----------------+ -0|AAAAAA NNNNNNN| 0|AAAAAA NNNNNNN| -1| DD/MM/YY | 1| | -2| HH:MM:SS | 2| | -3|MMDVM Idle| 3|MMDVM Idle| - +----------------+ +----------------+ - -20 x 4 ------- - - With clock Without clock - ---------- ------------- - - 0 1 0 1 - 01234567890123456479 01234567890123456789 - +--------------------+ +--------------------+ -0|AAAAAA NNNNNNN| 0|AAAAAA NNNNNNN| -1| DD/MM/YY | 1| | -2| HH:MM:SS | 2| | -3|MMDVM Idle| 3|MMDVM Idle| - +--------------------+ +--------------------+ - -D-STAR LAYOUTS -------------- - -16 x 2 ------- - - 0 1 - 0123456789012345 - +----------------+ -0|F AAAAAAAA/AAAAX| -1|T AAAAAAAA | - +----------------+ - -40 x 2 ------- - - 0 1 2 3 - 0123456789012345678901234567890123456789 - +----------------------------------------+ -0|F AAAAAAAA/AAAA X| -1|T AAAAAAAA via AAAAAAAA | - +----------------------------------------+ - -16 x 4 ------- - - - 0 1 - 0123456789012345 - +----------------+ -0|D-Star | -1|F AAAAAAAA/AAAAX| -2|T AAAAAAAA | -3|via AAAAAAAA | - +----------------+ - - -20 x 4 ------- - - 0 1 - 01234567890123456479 - +--------------------+ -0|D-Star | -1|F AAAAAAAA/AAAA X| -2|T AAAAAAAA | -3|via AAAAAAAA | - +--------------------+ diff --git a/Images/DMR.bmp b/Images/DMR.bmp deleted file mode 100644 index e537438..0000000 Binary files a/Images/DMR.bmp and /dev/null differ diff --git a/Images/DStar.bmp b/Images/DStar.bmp deleted file mode 100644 index abb23f6..0000000 Binary files a/Images/DStar.bmp and /dev/null differ diff --git a/Images/M17.bmp b/Images/M17.bmp deleted file mode 100644 index 8d88e8e..0000000 Binary files a/Images/M17.bmp and /dev/null differ diff --git a/Images/MMDVM.bmp b/Images/MMDVM.bmp deleted file mode 100644 index 9d25d9f..0000000 Binary files a/Images/MMDVM.bmp and /dev/null differ diff --git a/Images/NXDN.bmp b/Images/NXDN.bmp deleted file mode 100644 index ec022b0..0000000 Binary files a/Images/NXDN.bmp and /dev/null differ diff --git a/Images/P25.bmp b/Images/P25.bmp deleted file mode 100644 index 8e87af3..0000000 Binary files a/Images/P25.bmp and /dev/null differ diff --git a/Images/POCSAG.bmp b/Images/POCSAG.bmp deleted file mode 100644 index bd80cdd..0000000 Binary files a/Images/POCSAG.bmp and /dev/null differ diff --git a/Images/YSF.bmp b/Images/YSF.bmp deleted file mode 100644 index d1a8292..0000000 Binary files a/Images/YSF.bmp and /dev/null differ diff --git a/LCDproc.cpp b/LCDproc.cpp deleted file mode 100644 index 43595a8..0000000 --- a/LCDproc.cpp +++ /dev/null @@ -1,921 +0,0 @@ -/* - * Copyright (C) 2016,2017,2018 by Tony Corbett G0WFV - * Copyright (C) 2018,2020 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 - * 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. - */ - -/* -* Some LCD displays include additional LEDs for status. -* If they exist, the LDCproc server will use the output command. -* If the LEDs do not exist, the command is ignored. -* to control these LEDs Below are the values for the Crystalfontz CFA-635. -* N4IRS - -* LED 1 (DMR) -* Green 1 0000 0001 -* Red 16 0001 0000 -* Yellow 17 0001 0001 - -* LED 2 (P25) -* Green 2 0000 0010 -* Red 32 0010 0000 -* Yellow 34 0010 0010 - -* LED 3 (Fusion) -* Green 4 0000 0100 -* Red 64 0100 0000 -* Yellow 68 1000 0100 - -* LED 4 (D-Star) -* Green 8 0000 1000 -* Red 128 1000 0000 -* Yellow 136 1000 1000 - -* LED 5 (NXDN) -* Green 16 0001 0000 -* Red 255 1111 1111 -* Yellow 255 1111 1111 - -*/ - -#include "LCDproc.h" -#include "Log.h" - -#include -#include -#include -#include -#include -#include - -#if !defined(_WIN32) && !defined(_WIN64) -#include -#include -#include -#include -#include -#include -#include -#include -#include -#else -#include -#endif - -#define BUFFER_MAX_LEN 128 - -int m_socketfd; -char m_buffer[BUFFER_MAX_LEN]; -fd_set m_readfds, m_writefds; -struct timeval m_timeout; -int m_recvsize; -unsigned int m_rows(0); -unsigned int m_cols(0); -bool m_screensDefined(false); -bool m_connected(false); - -char m_displayBuffer1[BUFFER_MAX_LEN]; -char m_displayBuffer2[BUFFER_MAX_LEN]; - -const unsigned int DSTAR_RSSI_COUNT = 3U; // 3 * 420ms = 1260ms -const unsigned int DMR_RSSI_COUNT = 4U; // 4 * 360ms = 1440ms -const unsigned int YSF_RSSI_COUNT = 13U; // 13 * 100ms = 1300ms -const unsigned int P25_RSSI_COUNT = 7U; // 7 * 180ms = 1260ms -const unsigned int NXDN_RSSI_COUNT = 28U; // 28 * 40ms = 1120ms -const unsigned int M17_RSSI_COUNT = 28U; // 28 * 40ms = 1120ms - -CLCDproc::CLCDproc(std::string address, unsigned int port, unsigned short localPort, const std::string& callsign, unsigned int dmrid, bool displayClock, bool utc, bool duplex, bool dimOnIdle) : -CDisplay(), -m_address(address), -m_port(port), -m_localPort(localPort), -m_callsign(callsign), -m_dmrid(dmrid), -m_displayClock(displayClock), -m_utc(utc), -m_duplex(duplex), -//m_duplex(true), // uncomment to force duplex display for testing! -m_dimOnIdle(dimOnIdle), -m_dmr(false), -m_clockDisplayTimer(1000U, 0U, 250U), // Update the clock display every 250ms -m_rssiCount1(0U), -m_rssiCount2(0U) -{ -} - -CLCDproc::~CLCDproc() -{ -} - -bool CLCDproc::open() -{ - int err; - unsigned int addrlen; - std::string port, localPort; - struct sockaddr_storage serverAddress, clientAddress; - struct addrinfo hints, *res; - - port = std::to_string(m_port); - localPort = std::to_string(m_localPort); - memset(&hints, 0, sizeof(hints)); - - /* Lookup the hostname address */ - hints.ai_flags = AI_NUMERICSERV; - hints.ai_socktype = SOCK_STREAM; - err = getaddrinfo(m_address.c_str(), port.c_str(), &hints, &res); - if (err) { - LogError("LCDproc, cannot lookup server"); - return false; - } - memcpy(&serverAddress, res->ai_addr, addrlen = res->ai_addrlen); - freeaddrinfo(res); - - /* Lookup the client address (random port - need to specify manual port from ini file) */ - hints.ai_flags = AI_NUMERICSERV | AI_PASSIVE; - hints.ai_family = serverAddress.ss_family; - err = getaddrinfo(NULL, localPort.c_str(), &hints, &res); - if (err) { - LogError("LCDproc, cannot lookup client"); - return false; - } - memcpy(&clientAddress, res->ai_addr, res->ai_addrlen); - freeaddrinfo(res); - - /* Create TCP socket */ - m_socketfd = socket(clientAddress.ss_family, SOCK_STREAM, 0); - if (m_socketfd == -1) { - LogError("LCDproc, failed to create socket"); - return false; - } - - /* Bind the address to the socket */ - if (bind(m_socketfd, (struct sockaddr *)&clientAddress, addrlen) == -1) { - LogError("LCDproc, error whilst binding address"); - return false; - } - - /* Connect to server */ - if (connect(m_socketfd, (struct sockaddr *)&serverAddress, addrlen) == -1) { - LogError("LCDproc, cannot connect to server"); - return false; - } - - socketPrintf(m_socketfd, "hello"); // Login to the LCD server - socketPrintf(m_socketfd, "output 0"); // Clear all LEDs - - return true; -} - -void CLCDproc::setIdleInt() -{ - m_clockDisplayTimer.start(); // Start the clock display in IDLE only - - if (m_screensDefined) { - socketPrintf(m_socketfd, "screen_set DStar -priority hidden"); - socketPrintf(m_socketfd, "screen_set DMR -priority hidden"); - socketPrintf(m_socketfd, "screen_set YSF -priority hidden"); - socketPrintf(m_socketfd, "screen_set P25 -priority hidden"); - socketPrintf(m_socketfd, "screen_set NXDN -priority hidden"); - socketPrintf(m_socketfd, "screen_set M17 -priority hidden"); - socketPrintf(m_socketfd, "widget_set Status Status %u %u Idle", m_cols - 3, m_rows); - socketPrintf(m_socketfd, "output 0"); // Clear all LEDs - } - - m_dmr = false; -} - -void CLCDproc::setErrorInt(const char* text) -{ - assert(text != NULL); - - m_clockDisplayTimer.stop(); // Stop the clock display - - if (m_screensDefined) { - socketPrintf(m_socketfd, "screen_set DStar -priority hidden"); - socketPrintf(m_socketfd, "screen_set DMR -priority hidden"); - socketPrintf(m_socketfd, "screen_set YSF -priority hidden"); - socketPrintf(m_socketfd, "screen_set P25 -priority hidden"); - socketPrintf(m_socketfd, "screen_set NXDN -priority hidden"); - socketPrintf(m_socketfd, "screen_set M17 -priority hidden"); - socketPrintf(m_socketfd, "widget_set Status Status %u %u Error", m_cols - 4, m_rows); - socketPrintf(m_socketfd, "output 0"); // Clear all LEDs - } - - m_dmr = false; -} - -void CLCDproc::setLockoutInt() -{ - m_clockDisplayTimer.stop(); // Stop the clock display - - if (m_screensDefined) { - socketPrintf(m_socketfd, "screen_set DStar -priority hidden"); - socketPrintf(m_socketfd, "screen_set DMR -priority hidden"); - socketPrintf(m_socketfd, "screen_set YSF -priority hidden"); - socketPrintf(m_socketfd, "screen_set P25 -priority hidden"); - socketPrintf(m_socketfd, "screen_set NXDN -priority hidden"); - socketPrintf(m_socketfd, "screen_set M17 -priority hidden"); - socketPrintf(m_socketfd, "widget_set Status Status %u %u Lockout", m_cols - 6, m_rows); - socketPrintf(m_socketfd, "output 0"); // Clear all LEDs - } - - m_dmr = false; -} - -// LED 4 Green 8 Red 128 Yellow 136 - -void CLCDproc::setQuitInt() -{ - m_clockDisplayTimer.stop(); // Stop the clock display - - if (m_screensDefined) { - socketPrintf(m_socketfd, "screen_set DStar -priority hidden"); - socketPrintf(m_socketfd, "screen_set DMR -priority hidden"); - socketPrintf(m_socketfd, "screen_set YSF -priority hidden"); - socketPrintf(m_socketfd, "screen_set P25 -priority hidden"); - socketPrintf(m_socketfd, "screen_set NXDN -priority hidden"); - socketPrintf(m_socketfd, "screen_set M17 -priority hidden"); - socketPrintf(m_socketfd, "widget_set Status Status %u %u Stopped", m_cols - 6, m_rows); - socketPrintf(m_socketfd, "output 0"); // Clear all LEDs - } - - m_dmr = false; -} - -void CLCDproc::setFMInt() -{ - m_clockDisplayTimer.stop(); // Stop the clock display - - if (m_screensDefined) { - socketPrintf(m_socketfd, "screen_set DStar -priority hidden"); - socketPrintf(m_socketfd, "screen_set DMR -priority hidden"); - socketPrintf(m_socketfd, "screen_set YSF -priority hidden"); - socketPrintf(m_socketfd, "screen_set P25 -priority hidden"); - socketPrintf(m_socketfd, "screen_set NXDN -priority hidden"); - socketPrintf(m_socketfd, "screen_set M17 -priority hidden"); - socketPrintf(m_socketfd, "widget_set Status Status %u %u FM", m_cols - 6, m_rows); - socketPrintf(m_socketfd, "output 0"); // Clear all LEDs - } - - m_dmr = false; -} - -void CLCDproc::writeDStarInt(const char* my1, const char* my2, const char* your, const char* type, const char* reflector) -{ - assert(my1 != NULL); - assert(my2 != NULL); - assert(your != NULL); - assert(type != NULL); - assert(reflector != NULL); - - m_clockDisplayTimer.stop(); // Stop the clock display - - socketPrintf(m_socketfd, "screen_set DStar -priority foreground"); - socketPrintf(m_socketfd, "widget_set DStar Mode 1 1 \"D-Star\""); - - ::sprintf(m_displayBuffer1, "%.8s", your); - - char *p = m_displayBuffer1; - for (; *p; ++p) { - if (*p == ' ') - *p = '_'; - } - - if (strcmp(reflector, " ") != 0) - sprintf(m_displayBuffer2, " via %.8s", reflector); - else - memset(m_displayBuffer2, 0, BUFFER_MAX_LEN); - - if (m_rows == 2U) { - socketPrintf(m_socketfd, "widget_set DStar Line2 1 2 %u 2 h 3 \"%.8s/%.4s to %s%s\"", m_cols - 1, my1, my2, m_displayBuffer1, m_displayBuffer2); - } else { - socketPrintf(m_socketfd, "widget_set DStar Line2 1 2 %u 2 h 3 \"%.8s/%.4s\"", m_cols - 1, my1, my2); - socketPrintf(m_socketfd, "widget_set DStar Line3 1 3 %u 3 h 3 \"%s%s\"", m_cols - 1, m_displayBuffer1, m_displayBuffer2); - socketPrintf(m_socketfd, "output 128"); // Set LED4 color red - } - - m_dmr = false; - m_rssiCount1 = 0U; -} - -void CLCDproc::writeDStarRSSIInt(unsigned char rssi) -{ - if (m_rssiCount1 == 0U) { - socketPrintf(m_socketfd, "widget_set DStar Line4 1 4 %u 4 h 3 \"-%3udBm\"", m_cols - 1, rssi); - } - - m_rssiCount1++; - if (m_rssiCount1 >= DSTAR_RSSI_COUNT) - m_rssiCount1 = 0U; -} - -void CLCDproc::clearDStarInt() -{ - m_clockDisplayTimer.stop(); // Stop the clock display - - socketPrintf(m_socketfd, "widget_set DStar Line2 1 2 15 2 h 3 \"Listening\""); - socketPrintf(m_socketfd, "widget_set DStar Line3 1 3 15 3 h 3 \"\""); - socketPrintf(m_socketfd, "widget_set DStar Line4 1 4 15 4 h 3 \"\""); - socketPrintf(m_socketfd, "output 8"); // Set LED4 color green -} - -// LED 1 Green 1 Red 16 Yellow 17 - -void CLCDproc::writeDMRInt(unsigned int slotNo, const std::string& src, bool group, const std::string& dst, const char* type) -{ - assert(type != NULL); - - if (!m_dmr) { - m_clockDisplayTimer.stop(); // Stop the clock display - - socketPrintf(m_socketfd, "screen_set DMR -priority foreground"); - - if (m_duplex) { - if (m_rows > 2U) - socketPrintf(m_socketfd, "widget_set DMR Mode 1 1 DMR"); - if (slotNo == 1U) - socketPrintf(m_socketfd, "widget_set DMR Slot2 3 %u %u %u h 3 \"Listening\"", m_rows / 2 + 1, m_cols - 1, m_rows / 2 + 1); - else - socketPrintf(m_socketfd, "widget_set DMR Slot1 3 %u %u %u h 3 \"Listening\"", m_rows / 2, m_cols - 1, m_rows / 2); - } else { - socketPrintf(m_socketfd, "widget_set DMR Slot1_ 1 %u \"\"", m_rows / 2); - socketPrintf(m_socketfd, "widget_set DMR Slot2_ 1 %u \"\"", m_rows / 2 + 1); - - socketPrintf(m_socketfd, "widget_set DMR Slot1 1 %u %u %u h 3 \"Listening\"", m_rows / 2, m_cols - 1, m_rows / 2); - socketPrintf(m_socketfd, "widget_set DMR Slot2 1 %u %u %u h 3 \"\"", m_rows / 2 + 1, m_cols - 1, m_rows / 2 + 1); - } - } - - if (m_duplex) { - if (m_rows > 2U) - socketPrintf(m_socketfd, "widget_set DMR Mode 1 1 DMR"); - - if (slotNo == 1U) - socketPrintf(m_socketfd, "widget_set DMR Slot1 3 %u %u %u h 3 \"%s > %s%s\"", m_rows / 2, m_cols - 1, m_rows / 2, src.c_str(), group ? "TG" : "", dst.c_str()); - else - socketPrintf(m_socketfd, "widget_set DMR Slot2 3 %u %u %u h 3 \"%s > %s%s\"", m_rows / 2 + 1, m_cols - 1, m_rows / 2 + 1, src.c_str(), group ? "TG" : "", dst.c_str()); - } else { - socketPrintf(m_socketfd, "widget_set DMR Mode 1 1 DMR"); - - if (m_rows == 2U) { - socketPrintf(m_socketfd, "widget_set DMR Slot1 1 2 %u 2 h 3 \"%s > %s%s\"", m_cols - 1, src.c_str(), group ? "TG" : "", dst.c_str()); - } else { - socketPrintf(m_socketfd, "widget_set DMR Slot1 1 2 %u 2 h 3 \"%s >\"", m_cols - 1, src.c_str()); - socketPrintf(m_socketfd, "widget_set DMR Slot2 1 3 %u 3 h 3 \"%s%s\"", m_cols - 1, group ? "TG" : "", dst.c_str()); - } - } - socketPrintf(m_socketfd, "output 16"); // Set LED1 color red - m_dmr = true; - m_rssiCount1 = 0U; - m_rssiCount2 = 0U; -} - -void CLCDproc::writeDMRRSSIInt(unsigned int slotNo, unsigned char rssi) -{ - if (m_rows > 2) { - if (slotNo == 1U) { - if (m_rssiCount1 == 0U) - socketPrintf(m_socketfd, "widget_set DMR Slot1RSSI %u %u -%3udBm", 1, 4, rssi); - - m_rssiCount1++; - - if (m_rssiCount1 >= DMR_RSSI_COUNT) - m_rssiCount1 = 0U; - } else { - if (m_rssiCount2 == 0U) - socketPrintf(m_socketfd, "widget_set DMR Slot2RSSI %u %u -%3udBm", (m_cols / 2) + 1, 4, rssi); - - m_rssiCount2++; - - if (m_rssiCount2 >= DMR_RSSI_COUNT) - m_rssiCount2 = 0U; - } - } -} - -void CLCDproc::clearDMRInt(unsigned int slotNo) -{ - m_clockDisplayTimer.stop(); // Stop the clock display - - if (m_duplex) { - if (slotNo == 1U) { - socketPrintf(m_socketfd, "widget_set DMR Slot1 3 %u %u %u h 3 \"Listening\"", m_rows / 2, m_cols - 1, m_rows / 2); - socketPrintf(m_socketfd, "widget_set DMR Slot1RSSI %u %u %*.s", 1, 4, m_cols / 2, " "); - } else { - socketPrintf(m_socketfd, "widget_set DMR Slot2 3 %u %u %u h 3 \"Listening\"", m_rows / 2 + 1, m_cols - 1, m_rows / 2 + 1); - socketPrintf(m_socketfd, "widget_set DMR Slot2RSSI %u %u %*.s", (m_cols / 2) + 1, 4, m_cols / 2, " "); - } - } else { - socketPrintf(m_socketfd, "widget_set DMR Slot1 1 2 15 2 h 3 \"Listening\""); - socketPrintf(m_socketfd, "widget_set DMR Slot2 1 3 15 3 h 3 \"\""); - socketPrintf(m_socketfd, "widget_set DMR Slot2RSSI %u %u %*.s", (m_cols / 2) + 1, 4, m_cols / 2, " "); - } - socketPrintf(m_socketfd, "output 1"); // Set LED1 color green -} - -// LED 3 Green 4 Red 64 Yellow 68 - -void CLCDproc::writeFusionInt(const char* source, const char* dest, unsigned char dgid, const char* type, const char* origin) -{ - assert(source != NULL); - assert(dest != NULL); - assert(type != NULL); - assert(origin != NULL); - - m_clockDisplayTimer.stop(); // Stop the clock display - - socketPrintf(m_socketfd, "screen_set YSF -priority foreground"); - socketPrintf(m_socketfd, "widget_set YSF Mode 1 1 \"System Fusion\""); - - if (m_rows == 2U) { - socketPrintf(m_socketfd, "widget_set YSF Line2 1 2 15 2 h 3 \"%.10s > DG-ID %u\"", source, dgid); - } else { - socketPrintf(m_socketfd, "widget_set YSF Line2 1 2 15 2 h 3 \"%.10s >\"", source); - socketPrintf(m_socketfd, "widget_set YSF Line3 1 3 15 3 h 3 \"DG-ID %u\"", dgid); - socketPrintf(m_socketfd, "output 64"); // Set LED3 color red - } - - m_dmr = false; - m_rssiCount1 = 0U; -} - -void CLCDproc::writeFusionRSSIInt(unsigned char rssi) -{ - if (m_rssiCount1 == 0U) - socketPrintf(m_socketfd, "widget_set YSF Line4 1 4 %u 4 h 3 \"-%3udBm\"", m_cols - 1, rssi); - - m_rssiCount1++; - if (m_rssiCount1 >= YSF_RSSI_COUNT) - m_rssiCount1 = 0U; -} - -void CLCDproc::clearFusionInt() -{ - m_clockDisplayTimer.stop(); // Stop the clock display - - socketPrintf(m_socketfd, "widget_set YSF Line2 1 2 15 2 h 3 \"Listening\""); - socketPrintf(m_socketfd, "widget_set YSF Line3 1 3 15 3 h 3 \"\""); - socketPrintf(m_socketfd, "widget_set YSF Line4 1 4 15 4 h 3 \"\""); - socketPrintf(m_socketfd, "output 4"); // Set LED3 color green -} - -// LED 2 Green 2 Red 32 Yellow 34 - -void CLCDproc::writeP25Int(const char* source, bool group, unsigned int dest, const char* type) -{ - assert(source != NULL); - assert(type != NULL); - - m_clockDisplayTimer.stop(); // Stop the clock display - - socketPrintf(m_socketfd, "screen_set P25 -priority foreground"); - socketPrintf(m_socketfd, "widget_set P25 Mode 1 1 P25"); - - if (m_rows == 2U) { - socketPrintf(m_socketfd, "widget_set P25 Line2 1 2 15 2 h 3 \"%.10s > %s%u\"", source, group ? "TG" : "", dest); - } else { - socketPrintf(m_socketfd, "widget_set P25 Line2 1 2 15 2 h 3 \"%.10s >\"", source); - socketPrintf(m_socketfd, "widget_set P25 Line3 1 3 15 3 h 3 \"%s%u\"", group ? "TG" : "", dest); - socketPrintf(m_socketfd, "output 32"); // Set LED2 color red - } - - m_dmr = false; - m_rssiCount1 = 0U; -} - -void CLCDproc::writeP25RSSIInt(unsigned char rssi) -{ - if (m_rssiCount1 == 0U) { - socketPrintf(m_socketfd, "widget_set P25 Line4 1 4 %u 4 h 3 \"-%3udBm\"", m_cols - 1, rssi); - } - - m_rssiCount1++; - if (m_rssiCount1 >= P25_RSSI_COUNT) - m_rssiCount1 = 0U; -} - -void CLCDproc::clearP25Int() -{ - m_clockDisplayTimer.stop(); // Stop the clock display - - socketPrintf(m_socketfd, "widget_set P25 Line2 1 2 15 2 h 3 \"Listening\""); - socketPrintf(m_socketfd, "widget_set P25 Line3 1 3 15 3 h 3 \"\""); - socketPrintf(m_socketfd, "widget_set P25 Line4 1 4 15 4 h 3 \"\""); - socketPrintf(m_socketfd, "output 2"); // Set LED2 color green -} - -// LED 5 Green 16 Red 255 Yellow 255 - -void CLCDproc::writeNXDNInt(const char* source, bool group, unsigned int dest, const char* type) -{ - assert(source != NULL); - assert(type != NULL); - - m_clockDisplayTimer.stop(); // Stop the clock display - - socketPrintf(m_socketfd, "screen_set NXDN -priority foreground"); - socketPrintf(m_socketfd, "widget_set NXDN Mode 1 1 NXDN"); - - if (m_rows == 2U) { - socketPrintf(m_socketfd, "widget_set NXDN Line2 1 2 15 2 h 3 \"%.10s > %s%u\"", source, group ? "TG" : "", dest); - } else { - socketPrintf(m_socketfd, "widget_set NXDN Line2 1 2 15 2 h 3 \"%.10s >\"", source); - socketPrintf(m_socketfd, "widget_set NXDN Line3 1 3 15 3 h 3 \"%s%u\"", group ? "TG" : "", dest); - socketPrintf(m_socketfd, "output 255"); // Set LED5 color red - } - - m_dmr = false; - m_rssiCount1 = 0U; -} - -void CLCDproc::writeNXDNRSSIInt(unsigned char rssi) -{ - if (m_rssiCount1 == 0U) { - socketPrintf(m_socketfd, "widget_set NXDN Line4 1 4 %u 4 h 3 \"-%3udBm\"", m_cols - 1, rssi); - } - - m_rssiCount1++; - if (m_rssiCount1 >= NXDN_RSSI_COUNT) - m_rssiCount1 = 0U; -} - -void CLCDproc::clearNXDNInt() -{ - m_clockDisplayTimer.stop(); // Stop the clock display - - socketPrintf(m_socketfd, "widget_set NXDN Line2 1 2 15 2 h 3 \"Listening\""); - socketPrintf(m_socketfd, "widget_set NXDN Line3 1 3 15 3 h 3 \"\""); - socketPrintf(m_socketfd, "widget_set NXDN Line4 1 4 15 4 h 3 \"\""); - socketPrintf(m_socketfd, "output 16"); // Set LED5 color green -} - -void CLCDproc::writeM17Int(const char* source, const char* dest, const char* type) -{ - assert(source != NULL); - assert(dest != NULL); - assert(type != NULL); - - m_clockDisplayTimer.stop(); // Stop the clock display - - socketPrintf(m_socketfd, "screen_set M17 -priority foreground"); - socketPrintf(m_socketfd, "widget_set M17 Mode 1 1 M17"); - - if (m_rows == 2U) { - socketPrintf(m_socketfd, "widget_set M17 Line2 1 2 15 2 h 3 \"%.9s > %.9s\"", source, dest); - } - else { - socketPrintf(m_socketfd, "widget_set M17 Line2 1 2 15 2 h 3 \"%.9s >\"", source); - socketPrintf(m_socketfd, "widget_set M17 Line3 1 3 15 3 h 3 \"%.9ss\"", dest); - socketPrintf(m_socketfd, "output 255"); // Set LED5 color red - } - - m_dmr = false; - m_rssiCount1 = 0U; -} - -void CLCDproc::writeM17RSSIInt(unsigned char rssi) -{ - if (m_rssiCount1 == 0U) { - socketPrintf(m_socketfd, "widget_set M17 Line4 1 4 %u 4 h 3 \"-%3udBm\"", m_cols - 1, rssi); - } - - m_rssiCount1++; - if (m_rssiCount1 >= M17_RSSI_COUNT) - m_rssiCount1 = 0U; -} - -void CLCDproc::clearM17Int() -{ - m_clockDisplayTimer.stop(); // Stop the clock display - - socketPrintf(m_socketfd, "widget_set M17 Line2 1 2 15 2 h 3 \"Listening\""); - socketPrintf(m_socketfd, "widget_set M17 Line3 1 3 15 3 h 3 \"\""); - socketPrintf(m_socketfd, "widget_set M17 Line4 1 4 15 4 h 3 \"\""); - socketPrintf(m_socketfd, "output 16"); // Set LED5 color green -} - -void CLCDproc::writePOCSAGInt(uint32_t ric, const std::string& message) -{ -} - -void CLCDproc::clearPOCSAGInt() -{ -} - -void CLCDproc::writeCWInt() -{ -} - -void CLCDproc::clearCWInt() -{ -} - -void CLCDproc::clockInt(unsigned int ms) -{ - m_clockDisplayTimer.clock(ms); - - // Idle clock display - if (m_displayClock && m_clockDisplayTimer.isRunning() && m_clockDisplayTimer.hasExpired()) { - time_t currentTime; - struct tm *Time; - time(¤tTime); - - if (m_utc) - Time = gmtime(¤tTime); - else - Time = localtime(¤tTime); - - setlocale(LC_TIME, ""); - strftime(m_displayBuffer1, 128, "%X", Time); // Time - strftime(m_displayBuffer2, 128, "%x", Time); // Date - - if (m_cols < 26U && m_rows == 2U) { - socketPrintf(m_socketfd, "widget_set Status Time %u 2 \"%s%s\"", m_cols - 9, strlen(m_displayBuffer1) > 8 ? "" : " ", m_displayBuffer1); - } else { - socketPrintf(m_socketfd, "widget_set Status Time %u %u \"%s\"", (m_cols - (strlen(m_displayBuffer1) == 8 ? 6 : 8)) / 2, m_rows / 2, m_displayBuffer1); - socketPrintf(m_socketfd, "widget_set Status Date %u %u \"%s\"", (m_cols - (strlen(m_displayBuffer1) == 8 ? 6 : 8)) / 2, m_rows / 2 + 1, m_displayBuffer2); - } - - m_clockDisplayTimer.start(); - } - - // We must set all this information on each select we do - FD_ZERO(&m_readfds); // empty readfds - - // Then we put all the descriptors we want to wait for in a mask = m_readfds - FD_SET(m_socketfd, &m_readfds); - - // Timeout, we will stop waiting for information - m_timeout.tv_sec = 0; - m_timeout.tv_usec = 0; - - /* The first parameter is the biggest descriptor + 1. The first one was 0, so - * every other descriptor will be bigger - * - * readfds = &m_readfds - * writefds = we are not waiting for writefds - * exceptfds = we are not waiting for exception fds - */ - - if (select(m_socketfd + 1, &m_readfds, NULL, NULL, &m_timeout) == -1) - LogError("LCDproc, error on select"); - - // If something was received from the server... - if (FD_ISSET(m_socketfd, &m_readfds)) { - m_recvsize = recv(m_socketfd, m_buffer, BUFFER_MAX_LEN, 0); - - if (m_recvsize == -1) - LogError("LCDproc, cannot receive information"); - - m_buffer[m_recvsize] = '\0'; - - char *argv[256]; - size_t len = strlen(m_buffer); - - // Now split the string into tokens... - int argc = 0; - int newtoken = 1; - - for (size_t i = 0U; i < len; i++) { - switch (m_buffer[i]) { - case ' ': - newtoken = 1; - m_buffer[i] = 0; - break; - default: /* regular chars, keep tokenizing */ - if (newtoken) - argv[argc++] = m_buffer + i; - newtoken = 0; - break; - case '\0': - case '\n': - m_buffer[i] = 0; - if (argc > 0) { - if (0 == strcmp(argv[0], "listen")) { - LogDebug("LCDproc, the %s screen is displayed", argv[1]); - } else if (0 == strcmp(argv[0], "ignore")) { - LogDebug("LCDproc, the %s screen is hidden", argv[1]); - } else if (0 == strcmp(argv[0], "key")) { - LogDebug("LCDproc, Key %s", argv[1]); - } else if (0 == strcmp(argv[0], "menu")) { - } else if (0 == strcmp(argv[0], "connect")) { - // connect LCDproc 0.5.7 protocol 0.3 lcd wid 16 hgt 2 cellwid 5 cellhgt 8 - int a; - - for (a = 1; a < argc; a++) { - if (0 == strcmp(argv[a], "wid")) - m_cols = atoi(argv[++a]); - else if (0 == strcmp(argv[a], "hgt")) - m_rows = atoi(argv[++a]); - else if (0 == strcmp(argv[a], "cellwid")) { - //lcd_cellwid = atoi(argv[++a]); - } else if (0 == strcmp(argv[a], "cellhgt")) { - //lcd_cellhgt = atoi(argv[++a]); - } - } - - m_connected = true; - socketPrintf(m_socketfd, "client_set -name MMDVMHost"); - } else if (0 == strcmp(argv[0], "bye")) { - //close the socket- todo - } else if (0 == strcmp(argv[0], "success")) { - //LogDebug("LCDproc, command successful"); - } else if (0 == strcmp(argv[0], "huh?")) { - sprintf(m_displayBuffer1, "LCDproc, command failed:"); - sprintf(m_displayBuffer2, " "); - - int j; - for (j = 1; j < argc; j++) { - strcat(m_displayBuffer1, m_displayBuffer2); - strcat(m_displayBuffer1, argv[j]); - } - LogDebug("%s", m_displayBuffer1); - } - } - - /* Restart tokenizing */ - argc = 0; - newtoken = 1; - break; - } /* switch( m_buffer[i] ) */ - } - } - - if (!m_screensDefined && m_connected) - defineScreens(); -} - -void CLCDproc::close() -{ -} - -int CLCDproc::socketPrintf(int fd, const char *format, ...) -{ - char buf[BUFFER_MAX_LEN]; - va_list ap; - - va_start(ap, format); - int size = vsnprintf(buf, BUFFER_MAX_LEN, format, ap); - va_end(ap); - - if (size < 0) { - LogError("LCDproc, socketPrintf: vsnprintf failed"); - return -1; - } - - if (size > BUFFER_MAX_LEN) - LogWarning("LCDproc, socketPrintf: vsnprintf truncated message"); - - FD_ZERO(&m_writefds); // empty writefds - FD_SET(m_socketfd, &m_writefds); - - m_timeout.tv_sec = 0; - m_timeout.tv_usec = 0; - - if (select(m_socketfd + 1, NULL, &m_writefds, NULL, &m_timeout) == -1) - LogError("LCDproc, error on select"); - - if (FD_ISSET(m_socketfd, &m_writefds)) { - if (send(m_socketfd, buf, int(strlen(buf) + 1U), 0) == -1) { - LogError("LCDproc, cannot send data"); - return -1; - } - } - - return 0; -} - -void CLCDproc::defineScreens() -{ - // The Status Screen - - socketPrintf(m_socketfd, "screen_add Status"); - socketPrintf(m_socketfd, "screen_set Status -name Status -heartbeat on -priority info -backlight %s", m_dimOnIdle ? "off" : "on"); - - socketPrintf(m_socketfd, "widget_add Status Callsign string"); - socketPrintf(m_socketfd, "widget_add Status DMRNumber string"); - socketPrintf(m_socketfd, "widget_add Status Title string"); - socketPrintf(m_socketfd, "widget_add Status Status string"); - socketPrintf(m_socketfd, "widget_add Status Time string"); - socketPrintf(m_socketfd, "widget_add Status Date string"); - - socketPrintf(m_socketfd, "widget_set Status Callsign 1 1 %s", m_callsign.c_str()); - socketPrintf(m_socketfd, "widget_set Status DMRNumber %u 1 %u", m_cols - 7, m_dmrid); - socketPrintf(m_socketfd, "widget_set Status Title 1 %u MMDVM", m_rows); - socketPrintf(m_socketfd, "widget_set Status Status %u %u Idle", m_cols - 3, m_rows); - - // The DStar Screen - - socketPrintf(m_socketfd, "screen_add DStar"); - socketPrintf(m_socketfd, "screen_set DStar -name DStar -heartbeat on -priority hidden -backlight on"); - - socketPrintf(m_socketfd, "widget_add DStar Mode string"); - socketPrintf(m_socketfd, "widget_add DStar Line2 scroller"); - socketPrintf(m_socketfd, "widget_add DStar Line3 scroller"); - socketPrintf(m_socketfd, "widget_add DStar Line4 scroller"); - -/* Do we need to pre-populate the values?? - socketPrintf(m_socketfd, "widget_set DStar Line2 1 2 15 2 h 3 \"Listening\""); - socketPrintf(m_socketfd, "widget_set DStar Line3 1 3 15 3 h 3 \"\""); - socketPrintf(m_socketfd, "widget_set DStar Line4 1 4 15 4 h 3 \"\""); -*/ - - // The DMR Screen - - socketPrintf(m_socketfd, "screen_add DMR"); - socketPrintf(m_socketfd, "screen_set DMR -name DMR -heartbeat on -priority hidden -backlight on"); - - socketPrintf(m_socketfd, "widget_add DMR Mode string"); - socketPrintf(m_socketfd, "widget_add DMR Slot1_ string"); - socketPrintf(m_socketfd, "widget_add DMR Slot2_ string"); - socketPrintf(m_socketfd, "widget_add DMR Slot1 scroller"); - socketPrintf(m_socketfd, "widget_add DMR Slot2 scroller"); - socketPrintf(m_socketfd, "widget_add DMR Slot1RSSI string"); - socketPrintf(m_socketfd, "widget_add DMR Slot2RSSI string"); - -/* Do we need to pre-populate the values?? - socketPrintf(m_socketfd, "widget_set DMR Slot1_ 1 %u 1", m_rows / 2); - socketPrintf(m_socketfd, "widget_set DMR Slot2_ 1 %u 2", m_rows / 2 + 1); - socketPrintf(m_socketfd, "widget_set DMR Slot1 3 1 15 1 h 3 \"Listening\""); - socketPrintf(m_socketfd, "widget_set DMR Slot2 3 2 15 2 h 3 \"Listening\""); -*/ - - // The YSF Screen - - socketPrintf(m_socketfd, "screen_add YSF"); - socketPrintf(m_socketfd, "screen_set YSF -name YSF -heartbeat on -priority hidden -backlight on"); - - socketPrintf(m_socketfd, "widget_add YSF Mode string"); - socketPrintf(m_socketfd, "widget_add YSF Line2 scroller"); - socketPrintf(m_socketfd, "widget_add YSF Line3 scroller"); - socketPrintf(m_socketfd, "widget_add YSF Line4 scroller"); - -/* Do we need to pre-populate the values?? - socketPrintf(m_socketfd, "widget_set YSF Line2 2 1 15 1 h 3 \"Listening\""); - socketPrintf(m_socketfd, "widget_set YSF Line3 3 1 15 1 h 3 \" \""); - socketPrintf(m_socketfd, "widget_set YSF Line4 4 2 15 2 h 3 \" \""); -*/ - - // The P25 Screen - - socketPrintf(m_socketfd, "screen_add P25"); - socketPrintf(m_socketfd, "screen_set P25 -name P25 -heartbeat on -priority hidden -backlight on"); - - socketPrintf(m_socketfd, "widget_add P25 Mode string"); - socketPrintf(m_socketfd, "widget_add P25 Line2 scroller"); - socketPrintf(m_socketfd, "widget_add P25 Line3 scroller"); - socketPrintf(m_socketfd, "widget_add P25 Line4 scroller"); - -/* Do we need to pre-populate the values?? - socketPrintf(m_socketfd, "widget_set P25 Line3 2 1 15 1 h 3 \"Listening\""); - socketPrintf(m_socketfd, "widget_set P25 Line3 3 1 15 1 h 3 \" \""); - socketPrintf(m_socketfd, "widget_set P25 Line4 4 2 15 2 h 3 \" \""); -*/ - - // The NXDN Screen - - socketPrintf(m_socketfd, "screen_add NXDN"); - socketPrintf(m_socketfd, "screen_set NXDN -name NXDN -heartbeat on -priority hidden -backlight on"); - - socketPrintf(m_socketfd, "widget_add NXDN Mode string"); - socketPrintf(m_socketfd, "widget_add NXDN Line2 scroller"); - socketPrintf(m_socketfd, "widget_add NXDN Line3 scroller"); - socketPrintf(m_socketfd, "widget_add NXDN Line4 scroller"); - -/* Do we need to pre-populate the values?? - socketPrintf(m_socketfd, "widget_set NXDN Line3 2 1 15 1 h 3 \"Listening\""); - socketPrintf(m_socketfd, "widget_set NXDN Line3 3 1 15 1 h 3 \" \""); - socketPrintf(m_socketfd, "widget_set NXDN Line4 4 2 15 2 h 3 \" \""); -*/ - -// The M17 Screen - - socketPrintf(m_socketfd, "screen_add M17"); - socketPrintf(m_socketfd, "screen_set M17 -name M17 -heartbeat on -priority hidden -backlight on"); - - socketPrintf(m_socketfd, "widget_add M17 Mode string"); - socketPrintf(m_socketfd, "widget_add M17 Line2 scroller"); - socketPrintf(m_socketfd, "widget_add M17 Line3 scroller"); - socketPrintf(m_socketfd, "widget_add M17 Line4 scroller"); - - /* Do we need to pre-populate the values?? - socketPrintf(m_socketfd, "widget_set M17 Line3 2 1 15 1 h 3 \"Listening\""); - socketPrintf(m_socketfd, "widget_set M17 Line3 3 1 15 1 h 3 \" \""); - socketPrintf(m_socketfd, "widget_set M17 Line4 4 2 15 2 h 3 \" \""); - */ - - m_screensDefined = true; -} diff --git a/LCDproc.h b/LCDproc.h deleted file mode 100644 index aee8214..0000000 --- a/LCDproc.h +++ /dev/null @@ -1,96 +0,0 @@ -/* - * Copyright (C) 2016,2017 by Tony Corbett G0WFV - * Copyright (C) 2018,2020 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 - * 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(LCDproc_H) -#define LCDproc_H - -#include "Display.h" -#include "Timer.h" - -#include - -class CLCDproc : public CDisplay -{ -public: - CLCDproc(std::string address, unsigned int port, unsigned short localPort, const std::string& callsign, unsigned int dmrid, bool displayClock, bool utc, bool duplex, bool dimOnIdle); - virtual ~CLCDproc(); - - virtual bool open(); - - virtual void close(); - -protected: - virtual void setIdleInt(); - virtual void setErrorInt(const char* text); - virtual void setLockoutInt(); - virtual void setQuitInt(); - virtual void setFMInt(); - - virtual void writeDStarInt(const char* my1, const char* my2, const char* your, const char* type, const char* reflector); - virtual void writeDStarRSSIInt(unsigned char rssi); - virtual void clearDStarInt(); - - virtual void writeDMRInt(unsigned int slotNo, const std::string& src, bool group, const std::string& dst, const char* type); - virtual void writeDMRRSSIInt(unsigned int slotNo, unsigned char rssi); - virtual void clearDMRInt(unsigned int slotNo); - - virtual void writeFusionInt(const char* source, const char* dest, unsigned char dgid, const char* type, const char* origin); - virtual void writeFusionRSSIInt(unsigned char rssi); - virtual void clearFusionInt(); - - virtual void writeP25Int(const char* source, bool group, unsigned int dest, const char* type); - virtual void writeP25RSSIInt(unsigned char rssi); - virtual void clearP25Int(); - - virtual void writeNXDNInt(const char* source, bool group, unsigned int dest, const char* type); - virtual void writeNXDNRSSIInt(unsigned char rssi); - virtual void clearNXDNInt(); - - virtual void writeM17Int(const char* source, const char* dest, const char* type); - virtual void writeM17RSSIInt(unsigned char rssi); - virtual void clearM17Int(); - - virtual void writePOCSAGInt(uint32_t ric, const std::string& message); - virtual void clearPOCSAGInt(); - - virtual void writeCWInt(); - virtual void clearCWInt(); - - virtual void clockInt(unsigned int ms); - -private: - std::string m_address; - unsigned int m_port; - unsigned short m_localPort; - std::string m_callsign; - unsigned int m_dmrid; - bool m_displayClock; - bool m_utc; - bool m_duplex; - bool m_dimOnIdle; - bool m_dmr; - CTimer m_clockDisplayTimer; - unsigned int m_rssiCount1; - unsigned int m_rssiCount2; - - int socketPrintf(int fd, const char *format, ...); - void defineScreens(); -}; - -#endif diff --git a/MMDVMHost.vcxproj b/MMDVMHost.vcxproj index 8ccad16..6e8081f 100644 --- a/MMDVMHost.vcxproj +++ b/MMDVMHost.vcxproj @@ -158,11 +158,9 @@ - - @@ -191,7 +189,6 @@ - @@ -204,10 +201,7 @@ - - - @@ -248,7 +242,6 @@ - @@ -270,10 +263,8 @@ - - @@ -300,7 +291,6 @@ - @@ -312,10 +302,7 @@ - - - @@ -352,7 +339,6 @@ - diff --git a/MMDVMHost.vcxproj.filters b/MMDVMHost.vcxproj.filters index b64bfd1..62f43bc 100644 --- a/MMDVMHost.vcxproj.filters +++ b/MMDVMHost.vcxproj.filters @@ -23,9 +23,6 @@ Header Files - - Header Files - Header Files @@ -56,9 +53,6 @@ Header Files - - Header Files - Header Files @@ -143,9 +137,6 @@ Header Files - - Header Files - Header Files @@ -203,15 +194,9 @@ Header Files - - Header Files - Header Files - - Header Files - Header Files @@ -263,12 +248,6 @@ Header Files - - Header Files - - - Header Files - Header Files @@ -355,9 +334,6 @@ Source Files - - Source Files - Source Files @@ -382,9 +358,6 @@ Source Files - - Source Files - Source Files @@ -460,9 +433,6 @@ Source Files - - Source Files - Source Files @@ -517,15 +487,9 @@ Source Files - - Source Files - Source Files - - Source Files - Source Files @@ -571,12 +535,6 @@ Source Files - - Source Files - - - Source Files - Source Files diff --git a/Makefile b/Makefile index df255e1..4393a12 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -# This makefile is for all platforms, but doesn't include support for the HD44780, OLED, or PCF8574 displays on the Raspberry Pi. +# This makefile is for all platforms. CC = cc CXX = c++ @@ -7,14 +7,14 @@ LIBS = -lpthread -lutil -lmosquitto LDFLAGS = -g -L/usr/local/lib OBJECTS = \ - AMBEFEC.o BCH.o AX25Control.o AX25Network.o BPTC19696.o CASTInfo.o Conf.o CRC.o Display.o DMRControl.o DMRCSBK.o DMRData.o DMRDataHeader.o \ + AMBEFEC.o BCH.o AX25Control.o AX25Network.o BPTC19696.o Conf.o CRC.o DMRControl.o DMRCSBK.o DMRData.o DMRDataHeader.o \ DMREMB.o DMREmbeddedData.o DMRFullLC.o DMRLookup.o DMRLC.o DMRNetwork.o DMRShortLC.o DMRSlot.o DMRSlotType.o \ DMRAccessControl.o DMRTA.o DMRTrellis.o DStarControl.o DStarHeader.o DStarNetwork.o DStarSlowData.o FMControl.o FMNetwork.o Golay2087.o Golay24128.o \ - Hamming.o I2CController.o IIRDirectForm1Filter.o LCDproc.o Log.o M17Control.o M17Convolution.o M17CRC.o M17LSF.o M17Network.o M17Utils.o MMDVMHost.o \ - MQTTPublisher.o Modem.o ModemPort.o ModemSerialPort.o Mutex.o NetworkInfo.o Nextion.o NullController.o NullDisplay.o NXDNAudio.o NXDNControl.o \ + Hamming.o I2CController.o IIRDirectForm1Filter.o Log.o M17Control.o M17Convolution.o M17CRC.o M17LSF.o M17Network.o M17Utils.o MMDVMHost.o \ + 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 TFTSurenoo.o Thread.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 \ 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/Makefile.Pi.Adafruit b/Makefile.Pi.Adafruit deleted file mode 100644 index 127eb7e..0000000 --- a/Makefile.Pi.Adafruit +++ /dev/null @@ -1,69 +0,0 @@ -# This makefile is for use with the Raspberry Pi when using an HD44780 compatible display. The wiringpi library is needed. -# Support for the Adafruit i2c 16 x 2 RGB LCD Pi Plate - -CC = cc -CXX = c++ -CFLAGS = -g -O3 -Wall -std=c++0x -pthread -DHAVE_LOG_H -DHD44780 -DADAFRUIT_DISPLAY -I/usr/local/include -LIBS = -lwiringPi -lwiringPiDev -lpthread -lutil -lmosquitto -LDFLAGS = -g -L/usr/local/lib - -OBJECTS = \ - AMBEFEC.o AX25Control.o AX25Network.o BCH.o BPTC19696.o CASTInfo.o Conf.o CRC.o Display.o DMRControl.o DMRCSBK.o DMRData.o DMRDataHeader.o \ - DMREMB.o DMREmbeddedData.o DMRFullLC.o DMRLookup.o DMRLC.o DMRNetwork.o DMRShortLC.o DMRSlot.o DMRSlotType.o \ - DMRAccessControl.o DMRTA.o DMRTrellis.o DStarControl.o DStarHeader.o DStarNetwork.o DStarSlowData.o FMControl.o FMNetwork.o Golay2087.o Golay24128.o \ - Hamming.o HD44780.o I2CController.o IIRDirectForm1Filter.o LCDproc.o Log.o M17Control.o M17Convolution.o M17CRC.o M17LSF.o M17Network.o M17Utils.o \ - MMDVMHost.o MQTTPublisher.o Modem.o ModemPort.o ModemSerialPort.o Mutex.o NetworkInfo.o Nextion.o NullController.o NullDisplay.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 \ - TFTSurenoo.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 - -MMDVMHost: GitVersion.h $(OBJECTS) - $(CXX) $(OBJECTS) $(CFLAGS) $(LIBS) -o MMDVMHost - -RemoteCommand: Log.o MQTTPublisher.o RemoteCommand.o UDPSocket.o - $(CXX) Log.o MQTTPublisher.o RemoteCommand.o UDPSocket.o $(CFLAGS) $(LIBS) -o RemoteCommand - -%.o: %.cpp - $(CXX) $(CFLAGS) -c -o $@ $< - -.PHONY install: -install: all - install -m 755 MMDVMHost /usr/local/bin/ - install -m 755 RemoteCommand /usr/local/bin/ - -.PHONY install-service: -install-service: install /etc/MMDVM.ini - @useradd --user-group -M --system mmdvm --shell /bin/false || true - @usermod --groups dialout --append mmdvm || true - @mkdir /var/log/mmdvm || true - @chown mmdvm:mmdvm /var/log/mmdvm - @cp ./linux/systemd/mmdvmhost.service /lib/systemd/system/ - @systemctl enable mmdvmhost.service - -/etc/MMDVM.ini: - @cp -n MMDVM.ini /etc/MMDVM.ini - @sed -i 's/FilePath=./FilePath=\/var\/log\/mmdvm\//' /etc/MMDVM.ini - @sed -i 's/Daemon=0/Daemon=1/' /etc/MMDVM.ini - @chown mmdvm:mmdvm /etc/MMDVM.ini - -.PHONY uninstall-service: -uninstall-service: - @systemctl stop mmdvmhost.service || true - @systemctl disable mmdvmhost.service || true - @rm -f /usr/local/bin/MMDVMHost || true - @rm -f /lib/systemd/system/mmdvmhost.service || true - -clean: - $(RM) MMDVMHost RemoteCommand *.o *.d *.bak *~ GitVersion.h - -# Export the current git version if the index file exists, else 000... -GitVersion.h: -ifneq ("$(wildcard .git/index)","") - echo "const char *gitversion = \"$(shell git rev-parse HEAD)\";" > $@ -else - echo "const char *gitversion = \"0000000000000000000000000000000000000000\";" > $@ -endif diff --git a/Makefile.Pi.HD44780 b/Makefile.Pi.HD44780 deleted file mode 100644 index fb42d1e..0000000 --- a/Makefile.Pi.HD44780 +++ /dev/null @@ -1,68 +0,0 @@ -# This makefile is for use with the Raspberry Pi when using an HD44780 compatible display. The wiringpi library is needed. - -CC = cc -CXX = c++ -CFLAGS = -g -O3 -Wall -std=c++0x -pthread -DHAVE_LOG_H -DHD44780 -I/usr/local/include -LIBS = -lwiringPi -lwiringPiDev -lpthread -lutil -lmosquitto -LDFLAGS = -g -L/usr/local/lib - -OBJECTS = \ - AMBEFEC.o AX25Control.o AX25Network.o BCH.o BPTC19696.o CASTInfo.o Conf.o CRC.o Display.o DMRControl.o DMRCSBK.o DMRData.o DMRDataHeader.o \ - DMREMB.o DMREmbeddedData.o DMRFullLC.o DMRLookup.o DMRLC.o DMRNetwork.o DMRShortLC.o DMRSlot.o DMRSlotType.o \ - DMRAccessControl.o DMRTA.o DMRTrellis.o DStarControl.o DStarHeader.o DStarNetwork.o DStarSlowData.o FMControl.o FMNetwork.o Golay2087.o Golay24128.o \ - Hamming.o HD44780.o I2CController.o IIRDirectForm1Filter.o LCDproc.o Log.o M17Control.o M17Convolution.o M17CRC.o M17LSF.o M17Network.o M17Utils.o \ - MMDVMHost.o MQTTPublisher.o Modem.o ModemPort.o ModemSerialPort.o Mutex.o NetworkInfo.o Nextion.o NullController.o NullDisplay.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 \ - TFTSurenoo.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 - -MMDVMHost: GitVersion.h $(OBJECTS) - $(CXX) $(OBJECTS) $(CFLAGS) $(LIBS) -o MMDVMHost - -RemoteCommand: Log.o MQTTPublisher.o RemoteCommand.o UDPSocket.o - $(CXX) Log.o MQTTPublisher.o RemoteCommand.o UDPSocket.o $(CFLAGS) $(LIBS) -o RemoteCommand - -%.o: %.cpp - $(CXX) $(CFLAGS) -c -o $@ $< - -.PHONY install: -install: all - install -m 755 MMDVMHost /usr/local/bin/ - install -m 755 RemoteCommand /usr/local/bin/ - -.PHONY install-service: -install-service: install /etc/MMDVM.ini - @useradd --user-group -M --system mmdvm --shell /bin/false || true - @usermod --groups dialout --append mmdvm || true - @mkdir /var/log/mmdvm || true - @chown mmdvm:mmdvm /var/log/mmdvm - @cp ./linux/systemd/mmdvmhost.service /lib/systemd/system/ - @systemctl enable mmdvmhost.service - -/etc/MMDVM.ini: - @cp -n MMDVM.ini /etc/MMDVM.ini - @sed -i 's/FilePath=./FilePath=\/var\/log\/mmdvm\//' /etc/MMDVM.ini - @sed -i 's/Daemon=0/Daemon=1/' /etc/MMDVM.ini - @chown mmdvm:mmdvm /etc/MMDVM.ini - -.PHONY uninstall-service: -uninstall-service: - @systemctl stop mmdvmhost.service || true - @systemctl disable mmdvmhost.service || true - @rm -f /usr/local/bin/MMDVMHost || true - @rm -f /lib/systemd/system/mmdvmhost.service || true - -clean: - $(RM) MMDVMHost RemoteCommand *.o *.d *.bak *~ GitVersion.h - -# Export the current git version if the index file exists, else 000... -GitVersion.h: -ifneq ("$(wildcard .git/index)","") - echo "const char *gitversion = \"$(shell git rev-parse HEAD)\";" > $@ -else - echo "const char *gitversion = \"0000000000000000000000000000000000000000\";" > $@ -endif diff --git a/Makefile.Pi.I2C b/Makefile.Pi.I2C deleted file mode 100644 index 0c5275a..0000000 --- a/Makefile.Pi.I2C +++ /dev/null @@ -1,67 +0,0 @@ -# This makefile is for use with the Raspberry Pi. The wiringpi library is needed. - -CC = cc -CXX = c++ -CFLAGS = -g -O3 -Wall -std=c++0x -pthread -DHAVE_LOG_H -DRASPBERRY_PI -I/usr/local/include -LIBS = -lwiringPi -lwiringPiDev -lpthread -lutil -lmosquitto -LDFLAGS = -g -L/usr/local/lib - -OBJECTS = \ - AMBEFEC.o AX25Control.o AX25Network.o BCH.o BPTC19696.o CASTInfo.o Conf.o CRC.o Display.o DMRControl.o DMRCSBK.o DMRData.o DMRDataHeader.o \ - DMREMB.o DMREmbeddedData.o DMRFullLC.o DMRLookup.o DMRLC.o DMRNetwork.o DMRShortLC.o DMRSlot.o DMRSlotType.o \ - DMRAccessControl.o DMRTA.o DMRTrellis.o DStarControl.o DStarHeader.o DStarNetwork.o DStarSlowData.o FMControl.o FMNetwork.o Golay2087.o Golay24128.o \ - Hamming.o I2CController.o IIRDirectForm1Filter.o LCDproc.o Log.o M17Control.o M17Convolution.o M17CRC.o M17LSF.o M17Network.o M17Utils.o MMDVMHost.o \ - MQTTPublisher.o Modem.o ModemPort.o ModemSerialPort.o Mutex.o NetworkInfo.o Nextion.o NullController.o NullDisplay.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 TFTSurenoo.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 - -MMDVMHost: GitVersion.h $(OBJECTS) - $(CXX) $(OBJECTS) $(CFLAGS) $(LIBS) -o MMDVMHost - -RemoteCommand: Log.o MQTTPublisher.o RemoteCommand.o UDPSocket.o - $(CXX) Log.o MQTTPublisher.o RemoteCommand.o UDPSocket.o $(CFLAGS) $(LIBS) -o RemoteCommand - -%.o: %.cpp - $(CXX) $(CFLAGS) -c -o $@ $< - -.PHONY install: -install: all - install -m 755 MMDVMHost /usr/local/bin/ - install -m 755 RemoteCommand /usr/local/bin/ - -.PHONY install-service: -install-service: install /etc/MMDVM.ini - @useradd --user-group -M --system mmdvm --shell /bin/false || true - @usermod --groups dialout --append mmdvm || true - @mkdir /var/log/mmdvm || true - @chown mmdvm:mmdvm /var/log/mmdvm - @cp ./linux/systemd/mmdvmhost.service /lib/systemd/system/ - @systemctl enable mmdvmhost.service - -/etc/MMDVM.ini: - @cp -n MMDVM.ini /etc/MMDVM.ini - @sed -i 's/FilePath=./FilePath=\/var\/log\/mmdvm\//' /etc/MMDVM.ini - @sed -i 's/Daemon=0/Daemon=1/' /etc/MMDVM.ini - @chown mmdvm:mmdvm /etc/MMDVM.ini - -.PHONY uninstall-service: -uninstall-service: - @systemctl stop mmdvmhost.service || true - @systemctl disable mmdvmhost.service || true - @rm -f /usr/local/bin/MMDVMHost || true - @rm -f /lib/systemd/system/mmdvmhost.service || true - -clean: - $(RM) MMDVMHost RemoteCommand *.o *.d *.bak *~ GitVersion.h - -# Export the current git version if the index file exists, else 000... -GitVersion.h: -ifneq ("$(wildcard .git/index)","") - echo "const char *gitversion = \"$(shell git rev-parse HEAD)\";" > $@ -else - echo "const char *gitversion = \"0000000000000000000000000000000000000000\";" > $@ -endif diff --git a/Makefile.Pi.OLED b/Makefile.Pi.OLED deleted file mode 100644 index 75721ea..0000000 --- a/Makefile.Pi.OLED +++ /dev/null @@ -1,73 +0,0 @@ -# This makefile is for use with the Raspberry Pi when using an OLED display. The wiringpi library is not needed. - -CC = cc -CXX = c++ -CFLAGS = -g -O3 -Wall -std=c++0x -pthread -DHAVE_LOG_H -DOLED -I/usr/local/include -LIBS = -lArduiPi_OLED -lpthread -lutil -lmosquitto - -# If you use NetBSD, add following CFLAGS -#CFLAGS += -L/usr/local/lib -Wl,-rpath=/usr/local/lib - -LDFLAGS = -g -L/usr/local/lib - -OBJECTS = \ - AMBEFEC.o AX25Control.o AX25Network.o BCH.o BPTC19696.o CASTInfo.o Conf.o CRC.o Display.o DMRControl.o DMRCSBK.o DMRData.o DMRDataHeader.o \ - DMREMB.o DMREmbeddedData.o DMRFullLC.o DMRLookup.o DMRLC.o DMRNetwork.o DMRShortLC.o DMRSlot.o DMRSlotType.o \ - DMRAccessControl.o DMRTA.o DMRTrellis.o DStarControl.o DStarHeader.o DStarNetwork.o DStarSlowData.o FMControl.o FMNetwork.o Golay2087.o Golay24128.o \ - Hamming.o I2CController.o IIRDirectForm1Filter.o LCDproc.o Log.o M17Control.o M17Convolution.o M17CRC.o M17LSF.o M17Network.o M17Utils.o MMDVMHost.o \ - MQTTPublisher.o Modem.o ModemPort.o ModemSerialPort.o Mutex.o NetworkInfo.o Nextion.o NullController.o NullDisplay.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 OLED.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 \ - TFTSurenoo.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 - -MMDVMHost: GitVersion.h $(OBJECTS) - $(CXX) $(OBJECTS) $(CFLAGS) $(LIBS) -o MMDVMHost - -RemoteCommand: Log.o MQTTPublisher.o RemoteCommand.o UDPSocket.o - $(CXX) Log.o MQTTPublisher.o RemoteCommand.o UDPSocket.o $(CFLAGS) $(LIBS) -o RemoteCommand - -%.o: %.cpp - $(CXX) $(CFLAGS) -c -o $@ $< - -.PHONY install: -install: all - install -m 755 MMDVMHost /usr/local/bin/ - install -m 755 RemoteCommand /usr/local/bin/ - -.PHONY install-service: -install-service: install /etc/MMDVM.ini - @useradd --user-group -M --system mmdvm --shell /bin/false || true - @usermod --groups dialout --append mmdvm || true - @mkdir /var/log/mmdvm || true - @chown mmdvm:mmdvm /var/log/mmdvm - @cp ./linux/systemd/mmdvmhost.service /lib/systemd/system/ - @systemctl enable mmdvmhost.service - -/etc/MMDVM.ini: - @cp -n MMDVM.ini /etc/MMDVM.ini - @sed -i 's/FilePath=./FilePath=\/var\/log\/mmdvm\//' /etc/MMDVM.ini - @sed -i 's/Daemon=0/Daemon=1/' /etc/MMDVM.ini - @chown mmdvm:mmdvm /etc/MMDVM.ini - -.PHONY uninstall-service: -uninstall-service: - @systemctl stop mmdvmhost.service || true - @systemctl disable mmdvmhost.service || true - @rm -f /usr/local/bin/MMDVMHost || true - @rm -f /lib/systemd/system/mmdvmhost.service || true - -clean: - $(RM) MMDVMHost RemoteCommand *.o *.d *.bak *~ GitVersion.h - -# Export the current git version if the index file exists, else 000... -GitVersion.h: -ifneq ("$(wildcard .git/index)","") - echo "const char *gitversion = \"$(shell git rev-parse HEAD)\";" > $@ -else - echo "const char *gitversion = \"0000000000000000000000000000000000000000\";" > $@ -endif - diff --git a/Makefile.Pi.PCF8574 b/Makefile.Pi.PCF8574 deleted file mode 100644 index 3bdf856..0000000 --- a/Makefile.Pi.PCF8574 +++ /dev/null @@ -1,69 +0,0 @@ -# This makefile is for use with the Raspberry Pi when using an HD44780 compatible display. The wiringpi library is needed. -# Support for the HD44780 connected via a PCF8574 8-bit GPIO expander IC - -CC = cc -CXX = c++ -CFLAGS = -g -O3 -Wall -std=c++0x -pthread -DHAVE_LOG_H -DHD44780 -DPCF8574_DISPLAY -I/usr/local/include -LIBS = -lwiringPi -lwiringPiDev -lpthread -lutil -lmosquitto -LDFLAGS = -g -L/usr/local/lib - -OBJECTS = \ - AMBEFEC.o AX25Control.o AX25Network.o BCH.o BPTC19696.o CASTInfo.o Conf.o CRC.o Display.o DMRControl.o DMRCSBK.o DMRData.o DMRDataHeader.o \ - DMREMB.o DMREmbeddedData.o DMRFullLC.o DMRLookup.o DMRLC.o DMRNetwork.o DMRShortLC.o DMRSlot.o DMRSlotType.o \ - DMRAccessControl.o DMRTA.o DMRTrellis.o DStarControl.o DStarHeader.o DStarNetwork.o DStarSlowData.o FMControl.o FMNetwork.o Golay2087.o Golay24128.o \ - Hamming.o HD44780.o I2CController.o IIRDirectForm1Filter.o LCDproc.o Log.o M17Control.o M17Convolution.o M17CRC.o M17LSF.o M17Network.o M17Utils.o \ - MMDVMHost.o MQTTPublisher.o Modem.o ModemPort.o ModemSerialPort.o Mutex.o NetworkInfo.o Nextion.o NullController.o NullDisplay.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 \ - TFTSurenoo.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 - -MMDVMHost: GitVersion.h $(OBJECTS) - $(CXX) $(OBJECTS) $(CFLAGS) $(LIBS) -o MMDVMHost - -RemoteCommand: Log.o MQTTPublisher.o RemoteCommand.o UDPSocket.o - $(CXX) Log.o MQTTPublisher.o RemoteCommand.o UDPSocket.o $(CFLAGS) $(LIBS) -o RemoteCommand - -%.o: %.cpp - $(CXX) $(CFLAGS) -c -o $@ $< - -.PHONY install: -install: all - install -m 755 MMDVMHost /usr/local/bin/ - install -m 755 RemoteCommand /usr/local/bin/ - -.PHONY install-service: -install-service: install /etc/MMDVM.ini - @useradd --user-group -M --system mmdvm --shell /bin/false || true - @usermod --groups dialout --append mmdvm || true - @mkdir /var/log/mmdvm || true - @chown mmdvm:mmdvm /var/log/mmdvm - @cp ./linux/systemd/mmdvmhost.service /lib/systemd/system/ - @systemctl enable mmdvmhost.service - -/etc/MMDVM.ini: - @cp -n MMDVM.ini /etc/MMDVM.ini - @sed -i 's/FilePath=./FilePath=\/var\/log\/mmdvm\//' /etc/MMDVM.ini - @sed -i 's/Daemon=0/Daemon=1/' /etc/MMDVM.ini - @chown mmdvm:mmdvm /etc/MMDVM.ini - -.PHONY uninstall-service: -uninstall-service: - @systemctl stop mmdvmhost.service || true - @systemctl disable mmdvmhost.service || true - @rm -f /usr/local/bin/MMDVMHost || true - @rm -f /lib/systemd/system/mmdvmhost.service || true - -clean: - $(RM) MMDVMHost RemoteCommand *.o *.d *.bak *~ GitVersion.h - -# Export the current git version if the index file exists, else 000... -GitVersion.h: -ifneq ("$(wildcard .git/index)","") - echo "const char *gitversion = \"$(shell git rev-parse HEAD)\";" > $@ -else - echo "const char *gitversion = \"0000000000000000000000000000000000000000\";" > $@ -endif diff --git a/NetworkInfo.cpp b/NetworkInfo.cpp deleted file mode 100644 index 78f6080..0000000 --- a/NetworkInfo.cpp +++ /dev/null @@ -1,277 +0,0 @@ -/* - * Copyright (C) 2017 by Lieven De Samblanx ON7LDS - * - * 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 "NetworkInfo.h" -#include "Log.h" - -#include -#include -#include -#include -#include - -#include -#if defined(__linux__) || defined(__OpenBSD__) || defined(__NetBSD__) || defined(__FreeBSD__) || defined(__APPLE__) -#include -#include -#include -#include -#include -#if defined(__OpenBSD__) || defined(__NetBSD__) || defined(__FreeBSD__) || defined(__APPLE__) -#include -#include -#include -#endif -#elif defined(_WIN32) || defined(_WIN64) -#include -#include -#pragma comment(lib, "iphlpapi.lib") -#ifndef NO_ERROR -#define NO_ERROR 0 -#endif -#ifndef ERROR_BUFFER_OVERFLOW -#define ERROR_BUFFER_OVERFLOW 111 -#endif -#ifndef ERROR_INSUFFICIENT_BUFFER -#define ERROR_INSUFFICIENT_BUFFER 122 -#endif -#endif - -CNetworkInfo::CNetworkInfo() -{ -} - -CNetworkInfo::~CNetworkInfo() -{ -} - -void CNetworkInfo::getNetworkInterface(unsigned char* info) -{ - LogInfo("Interfaces Info"); - - ::strcpy((char*)info, "(address unknown)"); - -#if defined(__linux__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__FreeBSD__) || defined(__APPLE__) - char* dflt = NULL; - -#if defined(__linux__) - FILE* fp = ::fopen("/proc/net/route" , "r"); // IPv4 routing - if (fp == NULL) { - LogError("Unabled to open /proc/route"); - return; - } - - char line[100U]; - while (::fgets(line, 100U, fp)) { - char* p1 = strtok(line , " \t"); - char* p2 = strtok(NULL , " \t"); - - if (p1 != NULL && p2 != NULL) { - if (::strcmp(p2, "00000000") == 0) { - dflt = p1; - break; - } - } - } - - ::fclose(fp); - -#elif defined(__OpenBSD__) || defined(__NetBSD__) || defined(__FreeBSD__) || defined(__APPLE__) - int mib[] = { - CTL_NET, - PF_ROUTE, - 0, // protocol - AF_INET, // IPv4 routing - NET_RT_DUMP, - 0, // show all routes -#if defined(__OpenBSD__) || defined(__FreeBSD__) - 0, // table id -#endif - }; - const int cnt = sizeof(mib) / sizeof(int); - size_t size; - char ifname[IF_NAMESIZE] = {}; - - if (::sysctl(mib, cnt, NULL, &size, NULL, 0) == -1 || size <= 0) { - LogError("Unable to estimate routing table size"); - return; - } - - char *buf = new char[size]; - if (::sysctl(mib, cnt, buf, &size, NULL, 0) == -1) { - LogError("Unable to get routing table"); - delete[] buf; - return; - } - - struct rt_msghdr *rtm; - for (char *p = buf; p < buf + size; p += rtm->rtm_msglen) { - rtm = (struct rt_msghdr *)p; - if (rtm->rtm_version != RTM_VERSION) - continue; -#if defined(__OpenBSD__) - struct sockaddr_in *sa = (struct sockaddr_in *)(p + rtm->rtm_hdrlen); -#elif defined(__NetBSD__) || defined(__FreeBSD__) || defined(__APPLE__) - struct sockaddr_in *sa = (struct sockaddr_in *)(rtm + 1); -#endif - if (sa->sin_addr.s_addr == INADDR_ANY) { - ::if_indextoname(rtm->rtm_index, ifname); - break; - } - } - - delete[] buf; - if (::strlen(ifname)) - dflt = ifname; -#endif - if (dflt == NULL) { - LogError("Unable to find the default route"); - return; - } - - const unsigned int IFLISTSIZ = 25U; - char interfacelist[IFLISTSIZ][50+INET6_ADDRSTRLEN]; - for (unsigned int n = 0U; n < IFLISTSIZ; n++) - interfacelist[n][0] = 0; - - struct ifaddrs* ifaddr; - if (::getifaddrs(&ifaddr) == -1) { - LogError("getifaddrs failure"); - return; - } - - unsigned int ifnr = 0U; - for (struct ifaddrs* ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) { - if (ifa->ifa_addr == NULL) - continue; - - int family = ifa->ifa_addr->sa_family; - if (family == AF_INET || family == AF_INET6) { - char host[NI_MAXHOST]; - int s = ::getnameinfo(ifa->ifa_addr, family == AF_INET ? sizeof(struct sockaddr_in) : sizeof(struct sockaddr_in6), host, NI_MAXHOST, NULL, 0, NI_NUMERICHOST); - if (s != 0) { - LogError("getnameinfo() failed: %s\n", gai_strerror(s)); - continue; - } - - if (family == AF_INET) { - ::sprintf(interfacelist[ifnr], "%s:%s", ifa->ifa_name, host); - LogInfo(" IPv4: %s", interfacelist[ifnr]); - ifnr++; - } else { - ::sprintf(interfacelist[ifnr], "%s:%s", ifa->ifa_name, host); - LogInfo(" IPv6: %s", interfacelist[ifnr]); - // due to default routing is for IPv4, other - // protocols are not candidate to display. - } - } - } - - ::freeifaddrs(ifaddr); - - LogInfo(" Default interface is : %s" , dflt); - - for (unsigned int n = 0U; n < ifnr; n++) { - char* p = ::strchr(interfacelist[n], '%'); - if (p != NULL) - *p = 0; - - if (::strstr(interfacelist[n], dflt) != 0) { - ::strcpy((char*)info, interfacelist[n]); - break; - } - } - - LogInfo(" IP to show: %s", info); -#elif defined(_WIN32) || defined(_WIN64) - PMIB_IPFORWARDTABLE pIpForwardTable = (MIB_IPFORWARDTABLE *)::malloc(sizeof(MIB_IPFORWARDTABLE)); - if (pIpForwardTable == NULL) { - LogError("Error allocating memory"); - return; - } - - DWORD dwSize = 0U; - if (::GetIpForwardTable(pIpForwardTable, &dwSize, 0) == ERROR_INSUFFICIENT_BUFFER) { - ::free(pIpForwardTable); - pIpForwardTable = (MIB_IPFORWARDTABLE *)::malloc(dwSize); - if (pIpForwardTable == NULL) { - LogError("Error allocating memory"); - return; - } - } - - DWORD ret = ::GetIpForwardTable(pIpForwardTable, &dwSize, 0); - if (ret != NO_ERROR) { - ::free(pIpForwardTable); - LogError("GetIpForwardTable failed."); - return; - } - - DWORD found = 999U; - for (DWORD i = 0U; i < pIpForwardTable->dwNumEntries; i++) { - if (pIpForwardTable->table[i].dwForwardDest == 0U) { - found = i; - break; - } - } - - if (found == 999U) { - ::free(pIpForwardTable); - LogError("Unable to find the default destination in the routing table."); - return; - } - - DWORD ifnr = pIpForwardTable->table[found].dwForwardIfIndex; - ::free(pIpForwardTable); - - PIP_ADAPTER_INFO pAdapterInfo = (IP_ADAPTER_INFO *)::malloc(sizeof(IP_ADAPTER_INFO)); - if (pAdapterInfo == NULL) { - LogError("Error allocating memory"); - return; - } - - ULONG buflen = sizeof(IP_ADAPTER_INFO); - if (::GetAdaptersInfo(pAdapterInfo, &buflen) == ERROR_BUFFER_OVERFLOW) { - ::free(pAdapterInfo); - pAdapterInfo = (IP_ADAPTER_INFO *)::malloc(buflen); - if (pAdapterInfo == NULL) { - LogError("Error allocating memory"); - return; - } - } - - if (::GetAdaptersInfo(pAdapterInfo, &buflen) != NO_ERROR) { - ::free(pAdapterInfo); - LogError("Call to GetAdaptersInfo failed."); - return; - } - - PIP_ADAPTER_INFO pAdapter = pAdapterInfo; - while (pAdapter != NULL) { - LogInfo(" IP : %s", pAdapter->IpAddressList.IpAddress.String); - if (pAdapter->Index == ifnr) - ::strcpy((char*)info, pAdapter->IpAddressList.IpAddress.String); - - pAdapter = pAdapter->Next; - } - - ::free(pAdapterInfo); - - LogInfo(" IP to show: %s", info); -#endif -} diff --git a/NetworkInfo.h b/NetworkInfo.h deleted file mode 100644 index 2febcde..0000000 --- a/NetworkInfo.h +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright (C) 2017 by Lieven De Samblanx ON7LDS - * - * 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(NETWORKINFO_H) -#define NETWORKINFO_H - -class CNetworkInfo { -public: - CNetworkInfo(); - ~CNetworkInfo(); - - void getNetworkInterface(unsigned char* info); - -private: -}; - -#endif diff --git a/Nextion.cpp b/Nextion.cpp deleted file mode 100644 index 6df9a6d..0000000 --- a/Nextion.cpp +++ /dev/null @@ -1,998 +0,0 @@ -/* - * Copyright (C) 2016,2017,2018,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 - * 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 "NetworkInfo.h" -#include "Nextion.h" -#include "Log.h" - -#include -#include -#include -#include -#include - -const unsigned int DSTAR_RSSI_COUNT = 3U; // 3 * 420ms = 1260ms -const unsigned int DSTAR_BER_COUNT = 63U; // 63 * 20ms = 1260ms -const unsigned int DMR_RSSI_COUNT = 4U; // 4 * 360ms = 1440ms -const unsigned int DMR_BER_COUNT = 24U; // 24 * 60ms = 1440ms -const unsigned int YSF_RSSI_COUNT = 13U; // 13 * 100ms = 1300ms -const unsigned int YSF_BER_COUNT = 13U; // 13 * 100ms = 1300ms -const unsigned int P25_RSSI_COUNT = 7U; // 7 * 180ms = 1260ms -const unsigned int P25_BER_COUNT = 7U; // 7 * 180ms = 1260ms -const unsigned int NXDN_RSSI_COUNT = 28U; // 28 * 40ms = 1120ms -const unsigned int NXDN_BER_COUNT = 28U; // 28 * 40ms = 1120ms -const unsigned int M17_RSSI_COUNT = 28U; // 28 * 40ms = 1120ms -const unsigned int M17_BER_COUNT = 28U; // 28 * 40ms = 1120ms - -#define LAYOUT_COMPAT_MASK (7 << 0) // compatibility for old setting -#define LAYOUT_TA_ENABLE (1 << 4) // enable Talker Alias (TA) display -#define LAYOUT_TA_COLOUR (1 << 5) // TA display with font colour change -#define LAYOUT_TA_FONTSIZE (1 << 6) // TA display with font size change -#define LAYOUT_DIY (1 << 7) // use ON7LDS-DIY layout - -// bit[3:2] is used in Display.cpp to set connection speed for LCD panel. -// 00:low, others:high-speed. bit[2] is overlapped with LAYOUT_COMPAT_MASK. -#define LAYOUT_HIGHSPEED (3 << 2) - -CNextion::CNextion(const std::string& callsign, unsigned int dmrid, ISerialPort* serial, unsigned int brightness, bool displayClock, bool utc, unsigned int idleBrightness, unsigned int screenLayout, unsigned int txFrequency, unsigned int rxFrequency, bool displayTempInF) : -CDisplay(), -m_callsign(callsign), -m_ipaddress("(ip unknown)"), -m_dmrid(dmrid), -m_serial(serial), -m_brightness(brightness), -m_mode(MODE_IDLE), -m_displayClock(displayClock), -m_utc(utc), -m_idleBrightness(idleBrightness), -m_screenLayout(0), -m_clockDisplayTimer(1000U, 0U, 400U), -m_rssiAccum1(0U), -m_rssiAccum2(0U), -m_berAccum1(0.0F), -m_berAccum2(0.0F), -m_rssiCount1(0U), -m_rssiCount2(0U), -m_berCount1(0U), -m_berCount2(0U), -m_txFrequency(txFrequency), -m_rxFrequency(rxFrequency), -m_fl_txFrequency(0.0F), -m_fl_rxFrequency(0.0F), -m_displayTempInF(displayTempInF) -{ - assert(serial != NULL); - assert(brightness >= 0U && brightness <= 100U); - - static const unsigned int feature_set[] = { - 0, // 0: G4KLX - 0, // 1: (reserved, low speed) - // 2: ON7LDS - LAYOUT_TA_ENABLE | LAYOUT_TA_COLOUR | LAYOUT_TA_FONTSIZE, - LAYOUT_TA_ENABLE | LAYOUT_DIY, // 3: ON7LDS-DIY - LAYOUT_TA_ENABLE | LAYOUT_DIY, // 4: ON7LDS-DIY (high speed) - 0, // 5: (reserved, high speed) - 0, // 6: (reserved, high speed) - 0, // 7: (reserved, high speed) - }; - - if (screenLayout & ~LAYOUT_COMPAT_MASK) - m_screenLayout = screenLayout & ~LAYOUT_COMPAT_MASK; - else - m_screenLayout = feature_set[screenLayout]; -} - -CNextion::~CNextion() -{ -} - -bool CNextion::open() -{ - unsigned char info[100U]; - CNetworkInfo* m_network; - - bool ret = m_serial->open(); - if (!ret) { - LogError("Cannot open the port for the Nextion display"); - delete m_serial; - return false; - } - - info[0] = 0; - m_network = new CNetworkInfo; - m_network->getNetworkInterface(info); - m_ipaddress = (char*)info; - - sendCommand("bkcmd=0"); - sendCommandAction(0U); - - m_fl_txFrequency = double(m_txFrequency) / 1000000.0F; - m_fl_rxFrequency = double(m_rxFrequency) / 1000000.0F; - - setIdle(); - - return true; -} - -void CNextion::setIdleInt() -{ - // a few bits borrowed from Lieven De Samblanx ON7LDS, NextionDriver - char command[100U]; - - sendCommand("page MMDVM"); - sendCommandAction(1U); - - if (m_brightness>0) { - ::sprintf(command, "dim=%u", m_idleBrightness); - sendCommand(command); - } - - ::sprintf(command, "t0.txt=\"%s/%u\"", m_callsign.c_str(), m_dmrid); - sendCommand(command); - - if (m_screenLayout & LAYOUT_DIY) { - ::sprintf(command, "t4.txt=\"%s\"", m_callsign.c_str()); - sendCommand(command); - ::sprintf(command, "t5.txt=\"%u\"", m_dmrid); - sendCommand(command); - sendCommandAction(17U); - - ::sprintf(command, "t30.txt=\"%3.6f\"",m_fl_rxFrequency); // RX freq - sendCommand(command); - sendCommandAction(20U); - - ::sprintf(command, "t32.txt=\"%3.6f\"",m_fl_txFrequency); // TX freq - sendCommand(command); - sendCommandAction(21U); - - // CPU temperature - FILE* fp = ::fopen("/sys/class/thermal/thermal_zone0/temp", "rt"); - if (fp != NULL) { - double val = 0.0; - int n = ::fscanf(fp, "%lf", &val); - ::fclose(fp); - - if (n == 1) { - val /= 1000.0; - if (m_displayTempInF) { - val = (1.8 * val) + 32.0; - ::sprintf(command, "t20.txt=\"%2.1f %cF\"", val, 176); - } else { - ::sprintf(command, "t20.txt=\"%2.1f %cC\"", val, 176); - } - sendCommand(command); - sendCommandAction(22U); - } - } - } else { - sendCommandAction(17U); - } - - sendCommand("t1.txt=\"MMDVM IDLE\""); - sendCommandAction(11U); - - ::sprintf(command, "t3.txt=\"%s\"", m_ipaddress.c_str()); - sendCommand(command); - sendCommandAction(16U); - - m_clockDisplayTimer.start(); - - m_mode = MODE_IDLE; -} - -void CNextion::setErrorInt(const char* text) -{ - assert(text != NULL); - - sendCommand("page MMDVM"); - sendCommandAction(1U); - - char command[20]; - if (m_brightness>0) { - ::sprintf(command, "dim=%u", m_brightness); - sendCommand(command); - } - - ::sprintf(command, "t0.txt=\"%s\"", text); - sendCommandAction(13U); - - sendCommand(command); - sendCommand("t1.txt=\"ERROR\""); - sendCommandAction(14U); - - m_clockDisplayTimer.stop(); - - m_mode = MODE_ERROR; -} - -void CNextion::setLockoutInt() -{ - sendCommand("page MMDVM"); - sendCommandAction(1U); - - char command[20]; - if (m_brightness>0) { - ::sprintf(command, "dim=%u", m_brightness); - sendCommand(command); - } - - sendCommand("t0.txt=\"LOCKOUT\""); - sendCommandAction(15U); - - m_clockDisplayTimer.stop(); - - m_mode = MODE_LOCKOUT; -} - -void CNextion::setQuitInt() -{ - sendCommand("page MMDVM"); - sendCommandAction(1U); - - char command[100]; - if (m_brightness>0) { - ::sprintf(command, "dim=%u", m_idleBrightness); - sendCommand(command); - } - - ::sprintf(command, "t3.txt=\"%s\"", m_ipaddress.c_str()); - sendCommand(command); - sendCommandAction(16U); - - sendCommand("t0.txt=\"MMDVM STOPPED\""); - sendCommandAction(19U); - - m_clockDisplayTimer.stop(); - - m_mode = MODE_QUIT; -} - -void CNextion::setFMInt() -{ - sendCommand("page MMDVM"); - sendCommandAction(1U); - - char command[20]; - if (m_brightness > 0) { - ::sprintf(command, "dim=%u", m_brightness); - sendCommand(command); - } - - sendCommand("t0.txt=\"FM\""); - sendCommandAction(18U); - - m_clockDisplayTimer.stop(); - - m_mode = MODE_FM; -} - -void CNextion::writeDStarInt(const char* my1, const char* my2, const char* your, const char* type, const char* reflector) -{ - assert(my1 != NULL); - assert(my2 != NULL); - assert(your != NULL); - assert(type != NULL); - assert(reflector != NULL); - - if (m_mode != MODE_DSTAR) { - sendCommand("page DStar"); - sendCommandAction(2U); - } - - char text[50U]; - if (m_brightness>0) { - ::sprintf(text, "dim=%u", m_brightness); - sendCommand(text); - } - - ::sprintf(text, "t0.txt=\"%s %.8s/%4.4s\"", type, my1, my2); - sendCommand(text); - sendCommandAction(42U); - - ::sprintf(text, "t1.txt=\"%.8s\"", your); - sendCommand(text); - sendCommandAction(45U); - - if (::strcmp(reflector, " ") != 0) { - ::sprintf(text, "t2.txt=\"via %.8s\"", reflector); - sendCommand(text); - sendCommandAction(46U); - } - - m_clockDisplayTimer.stop(); - - m_mode = MODE_DSTAR; - m_rssiAccum1 = 0U; - m_berAccum1 = 0.0F; - m_rssiCount1 = 0U; - m_berCount1 = 0U; -} - -void CNextion::writeDStarRSSIInt(unsigned char rssi) -{ - m_rssiAccum1 += rssi; - m_rssiCount1++; - - if (m_rssiCount1 == DSTAR_RSSI_COUNT) { - char text[25U]; - ::sprintf(text, "t3.txt=\"-%udBm\"", m_rssiAccum1 / DSTAR_RSSI_COUNT); - sendCommand(text); - sendCommandAction(47U); - m_rssiAccum1 = 0U; - m_rssiCount1 = 0U; - } -} - -void CNextion::writeDStarBERInt(float ber) -{ - m_berAccum1 += ber; - m_berCount1++; - - if (m_berCount1 == DSTAR_BER_COUNT) { - char text[25U]; - ::sprintf(text, "t4.txt=\"%.1f%%\"", m_berAccum1 / float(DSTAR_BER_COUNT)); - sendCommand(text); - sendCommandAction(48U); - m_berAccum1 = 0.0F; - m_berCount1 = 0U; - } -} - -void CNextion::clearDStarInt() -{ - sendCommand("t0.txt=\"Listening\""); - sendCommandAction(41U); - sendCommand("t1.txt=\"\""); - sendCommand("t2.txt=\"\""); - sendCommand("t3.txt=\"\""); - sendCommand("t4.txt=\"\""); -} - -void CNextion::writeDMRInt(unsigned int slotNo, const std::string& src, bool group, const std::string& dst, const char* type) -{ - assert(type != NULL); - - if (m_mode != MODE_DMR) { - sendCommand("page DMR"); - sendCommandAction(3U); - - - if (slotNo == 1U) { - if (m_screenLayout & LAYOUT_TA_ENABLE) { - if (m_screenLayout & LAYOUT_TA_COLOUR) - sendCommand("t2.pco=0"); - if (m_screenLayout & LAYOUT_TA_FONTSIZE) - sendCommand("t2.font=4"); - } - - sendCommand("t2.txt=\"2 Listening\""); - sendCommandAction(69U); - } else { - if (m_screenLayout & LAYOUT_TA_ENABLE) { - if (m_screenLayout & LAYOUT_TA_COLOUR) - sendCommand("t0.pco=0"); - if (m_screenLayout & LAYOUT_TA_FONTSIZE) - sendCommand("t0.font=4"); - } - - sendCommand("t0.txt=\"1 Listening\""); - sendCommandAction(61U); - } - } - - char text[50U]; - if (m_brightness>0) { - ::sprintf(text, "dim=%u", m_brightness); - sendCommand(text); - } - - if (slotNo == 1U) { - ::sprintf(text, "t0.txt=\"1 %s %s\"", type, src.c_str()); - - if (m_screenLayout & LAYOUT_TA_ENABLE) { - if (m_screenLayout & LAYOUT_TA_COLOUR) - sendCommand("t0.pco=0"); - if (m_screenLayout & LAYOUT_TA_FONTSIZE) - sendCommand("t0.font=4"); - } - - sendCommand(text); - sendCommandAction(62U); - - ::sprintf(text, "t1.txt=\"%s%s\"", group ? "TG" : "", dst.c_str()); - sendCommand(text); - sendCommandAction(65U); - } else { - ::sprintf(text, "t2.txt=\"2 %s %s\"", type, src.c_str()); - - if (m_screenLayout & LAYOUT_TA_ENABLE) { - if (m_screenLayout & LAYOUT_TA_COLOUR) - sendCommand("t2.pco=0"); - if (m_screenLayout & LAYOUT_TA_FONTSIZE) - sendCommand("t2.font=4"); - } - - sendCommand(text); - sendCommandAction(70U); - - ::sprintf(text, "t3.txt=\"%s%s\"", group ? "TG" : "", dst.c_str()); - sendCommand(text); - sendCommandAction(73U); - } - - m_clockDisplayTimer.stop(); - - m_mode = MODE_DMR; - m_rssiAccum1 = 0U; - m_rssiAccum2 = 0U; - m_berAccum1 = 0.0F; - m_berAccum2 = 0.0F; - m_rssiCount1 = 0U; - m_rssiCount2 = 0U; - m_berCount1 = 0U; - m_berCount2 = 0U; -} - -void CNextion::writeDMRRSSIInt(unsigned int slotNo, unsigned char rssi) -{ - if (slotNo == 1U) { - m_rssiAccum1 += rssi; - m_rssiCount1++; - - if (m_rssiCount1 == DMR_RSSI_COUNT) { - char text[25U]; - ::sprintf(text, "t4.txt=\"-%udBm\"", m_rssiAccum1 / DMR_RSSI_COUNT); - sendCommand(text); - sendCommandAction(66U); - m_rssiAccum1 = 0U; - m_rssiCount1 = 0U; - } - } else { - m_rssiAccum2 += rssi; - m_rssiCount2++; - - if (m_rssiCount2 == DMR_RSSI_COUNT) { - char text[25U]; - ::sprintf(text, "t5.txt=\"-%udBm\"", m_rssiAccum2 / DMR_RSSI_COUNT); - sendCommand(text); - sendCommandAction(74U); - m_rssiAccum2 = 0U; - m_rssiCount2 = 0U; - } - } -} - -void CNextion::writeDMRTAInt(unsigned int slotNo, const unsigned char* talkerAlias, const char* type) -{ - if (!(m_screenLayout & LAYOUT_TA_ENABLE)) - return; - - if (type[0] == ' ') { - if (slotNo == 1U) { - if (m_screenLayout & LAYOUT_TA_COLOUR) - sendCommand("t0.pco=33808"); - sendCommandAction(64U); - } else { - if (m_screenLayout & LAYOUT_TA_COLOUR) - sendCommand("t2.pco=33808"); - sendCommandAction(72U); - } - - return; - } - - if (slotNo == 1U) { - char text[50U]; - ::sprintf(text, "t0.txt=\"1 %s %s\"", type, talkerAlias); - - if (m_screenLayout & LAYOUT_TA_FONTSIZE) { - if (::strlen((char*)talkerAlias) > (16U-4U)) - sendCommand("t0.font=3"); - if (::strlen((char*)talkerAlias) > (20U-4U)) - sendCommand("t0.font=2"); - if (::strlen((char*)talkerAlias) > (24U-4U)) - sendCommand("t0.font=1"); - } - - if (m_screenLayout & LAYOUT_TA_COLOUR) - sendCommand("t0.pco=1024"); - - sendCommand(text); - sendCommandAction(63U); - } else { - char text[50U]; - ::sprintf(text, "t2.txt=\"2 %s %s\"", type, talkerAlias); - - if (m_screenLayout & LAYOUT_TA_FONTSIZE) { - if (::strlen((char*)talkerAlias) > (16U-4U)) - sendCommand("t2.font=3"); - if (::strlen((char*)talkerAlias) > (20U-4U)) - sendCommand("t2.font=2"); - if (::strlen((char*)talkerAlias) > (24U-4U)) - sendCommand("t2.font=1"); - } - - if (m_screenLayout & LAYOUT_TA_COLOUR) - sendCommand("t2.pco=1024"); - - sendCommand(text); - sendCommandAction(71U); - } -} - -void CNextion::writeDMRBERInt(unsigned int slotNo, float ber) -{ - if (slotNo == 1U) { - m_berAccum1 += ber; - m_berCount1++; - - if (m_berCount1 == DMR_BER_COUNT) { - char text[25U]; - ::sprintf(text, "t6.txt=\"%.1f%%\"", m_berAccum1 / DMR_BER_COUNT); - sendCommand(text); - sendCommandAction(67U); - m_berAccum1 = 0U; - m_berCount1 = 0U; - } - } else { - m_berAccum2 += ber; - m_berCount2++; - - if (m_berCount2 == DMR_BER_COUNT) { - char text[25U]; - ::sprintf(text, "t7.txt=\"%.1f%%\"", m_berAccum2 / DMR_BER_COUNT); - sendCommand(text); - sendCommandAction(75U); - m_berAccum2 = 0U; - m_berCount2 = 0U; - } - } -} - -void CNextion::clearDMRInt(unsigned int slotNo) -{ - - if (slotNo == 1U) { - sendCommand("t0.txt=\"1 Listening\""); - sendCommandAction(61U); - - if (m_screenLayout & LAYOUT_TA_ENABLE) { - if (m_screenLayout & LAYOUT_TA_COLOUR) - sendCommand("t0.pco=0"); - if (m_screenLayout & LAYOUT_TA_FONTSIZE) - sendCommand("t0.font=4"); - } - - sendCommand("t1.txt=\"\""); - sendCommand("t4.txt=\"\""); - sendCommand("t6.txt=\"\""); - } else { - sendCommand("t2.txt=\"2 Listening\""); - sendCommandAction(69U); - - if (m_screenLayout & LAYOUT_TA_ENABLE) { - if (m_screenLayout & LAYOUT_TA_COLOUR) - sendCommand("t2.pco=0"); - if (m_screenLayout & LAYOUT_TA_FONTSIZE) - sendCommand("t2.font=4"); - } - - sendCommand("t3.txt=\"\""); - sendCommand("t5.txt=\"\""); - sendCommand("t7.txt=\"\""); - } -} - -void CNextion::writeFusionInt(const char* source, const char* dest, unsigned char dgid, const char* type, const char* origin) -{ - assert(source != NULL); - assert(dest != NULL); - assert(type != NULL); - assert(origin != NULL); - - if (m_mode != MODE_YSF) { - sendCommand("page YSF"); - sendCommandAction(4U); - } - - - char text[30U]; - if (m_brightness>0) { - ::sprintf(text, "dim=%u", m_brightness); - sendCommand(text); - } - - ::sprintf(text, "t0.txt=\"%s %.10s\"", type, source); - sendCommand(text); - sendCommandAction(82U); - - ::sprintf(text, "t1.txt=\"DG-ID %u\"", dgid); - sendCommand(text); - sendCommandAction(83U); - - if (::strcmp(origin, " ") != 0) { - ::sprintf(text, "t2.txt=\"at %.10s\"", origin); - sendCommand(text); - sendCommandAction(84U); - } - - m_clockDisplayTimer.stop(); - - m_mode = MODE_YSF; - m_rssiAccum1 = 0U; - m_berAccum1 = 0.0F; - m_rssiCount1 = 0U; - m_berCount1 = 0U; -} - -void CNextion::writeFusionRSSIInt(unsigned char rssi) -{ - m_rssiAccum1 += rssi; - m_rssiCount1++; - - if (m_rssiCount1 == YSF_RSSI_COUNT) { - char text[25U]; - ::sprintf(text, "t3.txt=\"-%udBm\"", m_rssiAccum1 / YSF_RSSI_COUNT); - sendCommand(text); - sendCommandAction(85U); - m_rssiAccum1 = 0U; - m_rssiCount1 = 0U; - } -} - -void CNextion::writeFusionBERInt(float ber) -{ - m_berAccum1 += ber; - m_berCount1++; - - if (m_berCount1 == YSF_BER_COUNT) { - char text[25U]; - ::sprintf(text, "t4.txt=\"%.1f%%\"", m_berAccum1 / float(YSF_BER_COUNT)); - sendCommand(text); - sendCommandAction(86U); - m_berAccum1 = 0.0F; - m_berCount1 = 0U; - } -} - -void CNextion::clearFusionInt() -{ - sendCommand("t0.txt=\"Listening\""); - sendCommandAction(81U); - sendCommand("t1.txt=\"\""); - sendCommand("t2.txt=\"\""); - sendCommand("t3.txt=\"\""); - sendCommand("t4.txt=\"\""); -} - -void CNextion::writeP25Int(const char* source, bool group, unsigned int dest, const char* type) -{ - assert(source != NULL); - assert(type != NULL); - - if (m_mode != MODE_P25) { - sendCommand("page P25"); - sendCommandAction(5U); - } - - char text[30U]; - if (m_brightness>0) { - ::sprintf(text, "dim=%u", m_brightness); - sendCommand(text); - } - - ::sprintf(text, "t0.txt=\"%s %.10s\"", type, source); - sendCommand(text); - sendCommandAction(102U); - - ::sprintf(text, "t1.txt=\"%s%u\"", group ? "TG" : "", dest); - sendCommand(text); - sendCommandAction(103U); - - m_clockDisplayTimer.stop(); - - m_mode = MODE_P25; - m_rssiAccum1 = 0U; - m_berAccum1 = 0.0F; - m_rssiCount1 = 0U; - m_berCount1 = 0U; -} - -void CNextion::writeP25RSSIInt(unsigned char rssi) -{ - m_rssiAccum1 += rssi; - m_rssiCount1++; - - if (m_rssiCount1 == P25_RSSI_COUNT) { - char text[25U]; - ::sprintf(text, "t2.txt=\"-%udBm\"", m_rssiAccum1 / P25_RSSI_COUNT); - sendCommand(text); - sendCommandAction(104U); - m_rssiAccum1 = 0U; - m_rssiCount1 = 0U; - } -} - -void CNextion::writeP25BERInt(float ber) -{ - m_berAccum1 += ber; - m_berCount1++; - - if (m_berCount1 == P25_BER_COUNT) { - char text[25U]; - ::sprintf(text, "t3.txt=\"%.1f%%\"", m_berAccum1 / float(P25_BER_COUNT)); - sendCommand(text); - sendCommandAction(105U); - m_berAccum1 = 0.0F; - m_berCount1 = 0U; - } -} - -void CNextion::clearP25Int() -{ - sendCommand("t0.txt=\"Listening\""); - sendCommandAction(101U); - sendCommand("t1.txt=\"\""); - sendCommand("t2.txt=\"\""); - sendCommand("t3.txt=\"\""); -} - -void CNextion::writeNXDNInt(const char* source, bool group, unsigned int dest, const char* type) -{ - assert(source != NULL); - assert(type != NULL); - - if (m_mode != MODE_NXDN) { - sendCommand("page NXDN"); - sendCommandAction(6U); - } - - char text[30U]; - if (m_brightness>0) { - ::sprintf(text, "dim=%u", m_brightness); - sendCommand(text); - } - - ::sprintf(text, "t0.txt=\"%s %.10s\"", type, source); - sendCommand(text); - sendCommandAction(122U); - - ::sprintf(text, "t1.txt=\"%s%u\"", group ? "TG" : "", dest); - sendCommand(text); - sendCommandAction(123U); - - m_clockDisplayTimer.stop(); - - m_mode = MODE_NXDN; - m_rssiAccum1 = 0U; - m_berAccum1 = 0.0F; - m_rssiCount1 = 0U; - m_berCount1 = 0U; -} - -void CNextion::writeNXDNRSSIInt(unsigned char rssi) -{ - m_rssiAccum1 += rssi; - m_rssiCount1++; - - if (m_rssiCount1 == NXDN_RSSI_COUNT) { - char text[25U]; - ::sprintf(text, "t2.txt=\"-%udBm\"", m_rssiAccum1 / NXDN_RSSI_COUNT); - sendCommand(text); - sendCommandAction(124U); - m_rssiAccum1 = 0U; - m_rssiCount1 = 0U; - } -} - -void CNextion::writeNXDNBERInt(float ber) -{ - m_berAccum1 += ber; - m_berCount1++; - - if (m_berCount1 == NXDN_BER_COUNT) { - char text[25U]; - ::sprintf(text, "t3.txt=\"%.1f%%\"", m_berAccum1 / float(NXDN_BER_COUNT)); - sendCommand(text); - sendCommandAction(125U); - m_berAccum1 = 0.0F; - m_berCount1 = 0U; - } -} - -void CNextion::clearNXDNInt() -{ - sendCommand("t0.txt=\"Listening\""); - sendCommandAction(121U); - sendCommand("t1.txt=\"\""); - sendCommand("t2.txt=\"\""); - sendCommand("t3.txt=\"\""); -} - -void CNextion::writeM17Int(const char* source, const char* dest, const char* type) -{ - assert(source != NULL); - assert(dest != NULL); - assert(type != NULL); - - if (m_mode != MODE_M17) { - sendCommand("page M17"); - sendCommandAction(8U); - } - - char text[30U]; - if (m_brightness > 0) { - ::sprintf(text, "dim=%u", m_brightness); - sendCommand(text); - } - - ::sprintf(text, "t0.txt=\"%s %.10s\"", type, source); - sendCommand(text); - sendCommandAction(142U); - - ::sprintf(text, "t1.txt=\"%s\"", dest); - sendCommand(text); - sendCommandAction(143U); - - m_clockDisplayTimer.stop(); - - m_mode = MODE_M17; - m_rssiAccum1 = 0U; - m_berAccum1 = 0.0F; - m_rssiCount1 = 0U; - m_berCount1 = 0U; -} - -void CNextion::writeM17RSSIInt(unsigned char rssi) -{ - m_rssiAccum1 += rssi; - m_rssiCount1++; - - if (m_rssiCount1 == M17_RSSI_COUNT) { - char text[25U]; - ::sprintf(text, "t2.txt=\"-%udBm\"", m_rssiAccum1 / M17_RSSI_COUNT); - sendCommand(text); - sendCommandAction(144U); - m_rssiAccum1 = 0U; - m_rssiCount1 = 0U; - } -} - -void CNextion::writeM17BERInt(float ber) -{ - m_berAccum1 += ber; - m_berCount1++; - - if (m_berCount1 == M17_BER_COUNT) { - char text[25U]; - ::sprintf(text, "t3.txt=\"%.1f%%\"", m_berAccum1 / float(M17_BER_COUNT)); - sendCommand(text); - sendCommandAction(145U); - m_berAccum1 = 0.0F; - m_berCount1 = 0U; - } -} - -void CNextion::clearM17Int() -{ - sendCommand("t0.txt=\"Listening\""); - sendCommandAction(141U); - sendCommand("t1.txt=\"\""); - sendCommand("t2.txt=\"\""); - sendCommand("t3.txt=\"\""); -} - -void CNextion::writePOCSAGInt(uint32_t ric, const std::string& message) -{ - if (m_mode != MODE_POCSAG) { - sendCommand("page POCSAG"); - sendCommandAction(7U); - } - - char text[200U]; - if (m_brightness>0) { - ::sprintf(text, "dim=%u", m_brightness); - sendCommand(text); - } - - ::sprintf(text, "t0.txt=\"RIC: %u\"", ric); - sendCommand(text); - sendCommandAction(132U); - - ::sprintf(text, "t1.txt=\"%s\"", message.c_str()); - sendCommand(text); - sendCommandAction(133U); - - m_clockDisplayTimer.stop(); - - m_mode = MODE_POCSAG; -} - -void CNextion::clearPOCSAGInt() -{ - sendCommand("t0.txt=\"Waiting\""); - sendCommandAction(134U); - sendCommand("t1.txt=\"\""); -} - -void CNextion::writeCWInt() -{ - sendCommand("t1.txt=\"Sending CW Ident\""); - sendCommandAction(12U); - m_clockDisplayTimer.start(); - - m_mode = MODE_CW; -} - -void CNextion::clearCWInt() -{ - sendCommand("t1.txt=\"MMDVM IDLE\""); - sendCommandAction(11U); -} - -void CNextion::clockInt(unsigned int ms) -{ - // Update the clock display in IDLE mode every 400ms - m_clockDisplayTimer.clock(ms); - if (m_displayClock && (m_mode == MODE_IDLE || m_mode == MODE_CW) && m_clockDisplayTimer.isRunning() && m_clockDisplayTimer.hasExpired()) { - time_t currentTime; - struct tm *Time; - ::time(¤tTime); // Get the current time - - if (m_utc) - Time = ::gmtime(¤tTime); - else - Time = ::localtime(¤tTime); - - setlocale(LC_TIME,""); - char text[50U]; - strftime(text, 50, "t2.txt=\"%x %X\"", Time); - sendCommand(text); - - m_clockDisplayTimer.start(); // restart the clock display timer - } -} - -void CNextion::close() -{ - m_serial->close(); - delete m_serial; -} - -void CNextion::sendCommandAction(unsigned int status) -{ - if (!(m_screenLayout & LAYOUT_DIY)) - return; - - char text[30U]; - ::sprintf(text, "MMDVM.status.val=%d", status); - sendCommand(text); - sendCommand("click S0,1"); -} - -void CNextion::sendCommand(const char* command) -{ - assert(command != NULL); - - m_serial->write((unsigned char*)command, (unsigned int)::strlen(command)); - m_serial->write((unsigned char*)"\xFF\xFF\xFF", 3U); - // Since we just firing commands at the display, and not listening for the response, - // we must add a bit of a delay to allow the display to process the commands, else some are getting mangled. - // 10 ms is just a guess, but seems to be sufficient. - CThread::sleep(10U); -} diff --git a/Nextion.h b/Nextion.h deleted file mode 100644 index d440526..0000000 --- a/Nextion.h +++ /dev/null @@ -1,115 +0,0 @@ -/* - * Copyright (C) 2016,2017,2018,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 - * 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(NEXTION_H) -#define NEXTION_H - -#include "Display.h" -#include "Defines.h" -#include "SerialPort.h" -#include "Timer.h" -#include "Thread.h" -#include - -class CNextion : public CDisplay -{ -public: - CNextion(const std::string& callsign, unsigned int dmrid, ISerialPort* serial, unsigned int brightness, bool displayClock, bool utc, unsigned int idleBrightness, unsigned int screenLayout, unsigned int txFrequency, unsigned int rxFrequency, bool displayTempInF); - virtual ~CNextion(); - - virtual bool open(); - - virtual void close(); - -protected: - virtual void setIdleInt(); - virtual void setErrorInt(const char* text); - virtual void setLockoutInt(); - virtual void setQuitInt(); - virtual void setFMInt(); - - virtual void writeDStarInt(const char* my1, const char* my2, const char* your, const char* type, const char* reflector); - virtual void writeDStarRSSIInt(unsigned char rssi); - virtual void writeDStarBERInt(float ber); - virtual void clearDStarInt(); - - virtual void writeDMRInt(unsigned int slotNo, const std::string& src, bool group, const std::string& dst, const char* type); - virtual void writeDMRRSSIInt(unsigned int slotNo, unsigned char rssi); - virtual void writeDMRTAInt(unsigned int slotNo, const unsigned char* talkerAlias, const char* type); - virtual void writeDMRBERInt(unsigned int slotNo, float ber); - virtual void clearDMRInt(unsigned int slotNo); - - virtual void writeFusionInt(const char* source, const char* dest, unsigned char dgid, const char* type, const char* origin); - virtual void writeFusionRSSIInt(unsigned char rssi); - virtual void writeFusionBERInt(float ber); - virtual void clearFusionInt(); - - virtual void writeP25Int(const char* source, bool group, unsigned int dest, const char* type); - virtual void writeP25RSSIInt(unsigned char rssi); - virtual void writeP25BERInt(float ber); - virtual void clearP25Int(); - - virtual void writeNXDNInt(const char* source, bool group, unsigned int dest, const char* type); - virtual void writeNXDNRSSIInt(unsigned char rssi); - virtual void writeNXDNBERInt(float ber); - virtual void clearNXDNInt(); - - virtual void writeM17Int(const char* source, const char* dest, const char* type); - virtual void writeM17RSSIInt(unsigned char rssi); - virtual void writeM17BERInt(float ber); - virtual void clearM17Int(); - - virtual void writePOCSAGInt(uint32_t ric, const std::string& message); - virtual void clearPOCSAGInt(); - - virtual void writeCWInt(); - virtual void clearCWInt(); - - virtual void clockInt(unsigned int ms); - -private: - std::string m_callsign; - std::string m_ipaddress; - unsigned int m_dmrid; - ISerialPort* m_serial; - unsigned int m_brightness; - unsigned char m_mode; - bool m_displayClock; - bool m_utc; - unsigned int m_idleBrightness; - unsigned int m_screenLayout; - CTimer m_clockDisplayTimer; - unsigned int m_rssiAccum1; - unsigned int m_rssiAccum2; - float m_berAccum1; - float m_berAccum2; - unsigned int m_rssiCount1; - unsigned int m_rssiCount2; - unsigned int m_berCount1; - unsigned int m_berCount2; - unsigned int m_txFrequency; - unsigned int m_rxFrequency; - double m_fl_txFrequency; - double m_fl_rxFrequency; - bool m_displayTempInF; - - void sendCommand(const char* command); - void sendCommandAction(unsigned int status); -}; - -#endif diff --git a/Nextion_DB2OE/NX3224K024.HMI b/Nextion_DB2OE/NX3224K024.HMI deleted file mode 100644 index 183e5fd..0000000 Binary files a/Nextion_DB2OE/NX3224K024.HMI and /dev/null differ diff --git a/Nextion_DB2OE/NX3224K024.tft b/Nextion_DB2OE/NX3224K024.tft deleted file mode 100644 index 9c44cb5..0000000 Binary files a/Nextion_DB2OE/NX3224K024.tft and /dev/null differ diff --git a/Nextion_DB2OE/NX3224K028.HMI b/Nextion_DB2OE/NX3224K028.HMI deleted file mode 100644 index 41c180a..0000000 Binary files a/Nextion_DB2OE/NX3224K028.HMI and /dev/null differ diff --git a/Nextion_DB2OE/NX3224K028.tft b/Nextion_DB2OE/NX3224K028.tft deleted file mode 100644 index d71ad25..0000000 Binary files a/Nextion_DB2OE/NX3224K028.tft and /dev/null differ diff --git a/Nextion_DB2OE/NX3224T024.HMI b/Nextion_DB2OE/NX3224T024.HMI deleted file mode 100644 index f41718c..0000000 Binary files a/Nextion_DB2OE/NX3224T024.HMI and /dev/null differ diff --git a/Nextion_DB2OE/NX3224T024.tft b/Nextion_DB2OE/NX3224T024.tft deleted file mode 100644 index db4d491..0000000 Binary files a/Nextion_DB2OE/NX3224T024.tft and /dev/null differ diff --git a/Nextion_DB2OE/NX3224T028.HMI b/Nextion_DB2OE/NX3224T028.HMI deleted file mode 100644 index 56f8dc9..0000000 Binary files a/Nextion_DB2OE/NX3224T028.HMI and /dev/null differ diff --git a/Nextion_DB2OE/NX3224T028.tft b/Nextion_DB2OE/NX3224T028.tft deleted file mode 100644 index 7f335de..0000000 Binary files a/Nextion_DB2OE/NX3224T028.tft and /dev/null differ diff --git a/Nextion_DB2OE/NX4024K032.HMI b/Nextion_DB2OE/NX4024K032.HMI deleted file mode 100644 index 96dde1c..0000000 Binary files a/Nextion_DB2OE/NX4024K032.HMI and /dev/null differ diff --git a/Nextion_DB2OE/NX4024K032.tft b/Nextion_DB2OE/NX4024K032.tft deleted file mode 100644 index 3b661fb..0000000 Binary files a/Nextion_DB2OE/NX4024K032.tft and /dev/null differ diff --git a/Nextion_DB2OE/NX4024T032.HMI b/Nextion_DB2OE/NX4024T032.HMI deleted file mode 100644 index 9ba4b5e..0000000 Binary files a/Nextion_DB2OE/NX4024T032.HMI and /dev/null differ diff --git a/Nextion_DB2OE/NX4024T032.tft b/Nextion_DB2OE/NX4024T032.tft deleted file mode 100644 index a18610b..0000000 Binary files a/Nextion_DB2OE/NX4024T032.tft and /dev/null differ diff --git a/Nextion_DB2OE/NX4827K043.HMI b/Nextion_DB2OE/NX4827K043.HMI deleted file mode 100644 index 561300b..0000000 Binary files a/Nextion_DB2OE/NX4827K043.HMI and /dev/null differ diff --git a/Nextion_DB2OE/NX4827K043.tft b/Nextion_DB2OE/NX4827K043.tft deleted file mode 100644 index 5a25191..0000000 Binary files a/Nextion_DB2OE/NX4827K043.tft and /dev/null differ diff --git a/Nextion_DB2OE/NX4827T043.HMI b/Nextion_DB2OE/NX4827T043.HMI deleted file mode 100644 index be9fa45..0000000 Binary files a/Nextion_DB2OE/NX4827T043.HMI and /dev/null differ diff --git a/Nextion_DB2OE/NX4827T043.tft b/Nextion_DB2OE/NX4827T043.tft deleted file mode 100644 index 8ec3ae9..0000000 Binary files a/Nextion_DB2OE/NX4827T043.tft and /dev/null differ diff --git a/Nextion_G4KLX/NX3224K024.HMI b/Nextion_G4KLX/NX3224K024.HMI deleted file mode 100644 index ef8698b..0000000 Binary files a/Nextion_G4KLX/NX3224K024.HMI and /dev/null differ diff --git a/Nextion_G4KLX/NX3224K024.tft b/Nextion_G4KLX/NX3224K024.tft deleted file mode 100644 index b1a66da..0000000 Binary files a/Nextion_G4KLX/NX3224K024.tft and /dev/null differ diff --git a/Nextion_G4KLX/NX3224K028.HMI b/Nextion_G4KLX/NX3224K028.HMI deleted file mode 100644 index f6c1475..0000000 Binary files a/Nextion_G4KLX/NX3224K028.HMI and /dev/null differ diff --git a/Nextion_G4KLX/NX3224K028.tft b/Nextion_G4KLX/NX3224K028.tft deleted file mode 100644 index 28b552d..0000000 Binary files a/Nextion_G4KLX/NX3224K028.tft and /dev/null differ diff --git a/Nextion_G4KLX/NX3224T024.HMI b/Nextion_G4KLX/NX3224T024.HMI deleted file mode 100644 index ae1204d..0000000 Binary files a/Nextion_G4KLX/NX3224T024.HMI and /dev/null differ diff --git a/Nextion_G4KLX/NX3224T024.tft b/Nextion_G4KLX/NX3224T024.tft deleted file mode 100644 index 06ad235..0000000 Binary files a/Nextion_G4KLX/NX3224T024.tft and /dev/null differ diff --git a/Nextion_G4KLX/NX3224T028.HMI b/Nextion_G4KLX/NX3224T028.HMI deleted file mode 100644 index 744dd07..0000000 Binary files a/Nextion_G4KLX/NX3224T028.HMI and /dev/null differ diff --git a/Nextion_G4KLX/NX3224T028.tft b/Nextion_G4KLX/NX3224T028.tft deleted file mode 100644 index 2209493..0000000 Binary files a/Nextion_G4KLX/NX3224T028.tft and /dev/null differ diff --git a/Nextion_G4KLX/NX4024K032.HMI b/Nextion_G4KLX/NX4024K032.HMI deleted file mode 100644 index 85cdc48..0000000 Binary files a/Nextion_G4KLX/NX4024K032.HMI and /dev/null differ diff --git a/Nextion_G4KLX/NX4024K032.tft b/Nextion_G4KLX/NX4024K032.tft deleted file mode 100644 index 04da59a..0000000 Binary files a/Nextion_G4KLX/NX4024K032.tft and /dev/null differ diff --git a/Nextion_G4KLX/NX4024T032.HMI b/Nextion_G4KLX/NX4024T032.HMI deleted file mode 100644 index 10dbda4..0000000 Binary files a/Nextion_G4KLX/NX4024T032.HMI and /dev/null differ diff --git a/Nextion_G4KLX/NX4024T032.tft b/Nextion_G4KLX/NX4024T032.tft deleted file mode 100644 index 31ba971..0000000 Binary files a/Nextion_G4KLX/NX4024T032.tft and /dev/null differ diff --git a/Nextion_G4KLX/NX4832K035.HMI b/Nextion_G4KLX/NX4832K035.HMI deleted file mode 100644 index 3693082..0000000 Binary files a/Nextion_G4KLX/NX4832K035.HMI and /dev/null differ diff --git a/Nextion_G4KLX/NX4832K035.tft b/Nextion_G4KLX/NX4832K035.tft deleted file mode 100644 index ff3678d..0000000 Binary files a/Nextion_G4KLX/NX4832K035.tft and /dev/null differ diff --git a/Nextion_G4KLX/NX4832T035.HMI b/Nextion_G4KLX/NX4832T035.HMI deleted file mode 100644 index cda3ced..0000000 Binary files a/Nextion_G4KLX/NX4832T035.HMI and /dev/null differ diff --git a/Nextion_G4KLX/NX4832T035.tft b/Nextion_G4KLX/NX4832T035.tft deleted file mode 100644 index dd9c7a2..0000000 Binary files a/Nextion_G4KLX/NX4832T035.tft and /dev/null differ diff --git a/Nextion_G4KLX/README.md b/Nextion_G4KLX/README.md deleted file mode 100644 index f0367f5..0000000 --- a/Nextion_G4KLX/README.md +++ /dev/null @@ -1,66 +0,0 @@ -# Update Nextion Displays from the Command Line - -This directory contains a simple python script which you can use to update the -Nextion displays. All you need is a compiled .tft file which is written to the -display's flash memory. The precompiled .tft files with the MMDVMHost default -layout are to be found in this directory as well. - -To update the Nextion display you just need to know the serial port the display -is connected to. It could be /dev/ttyUSBx for USB<->Serial adapters or -/dev/ttyAMA0 for the UART on the Raspberry Pi for example. - -# Prerequisites - -You need to have python installed as well as the python-serial package. That can -normally be found in your distro's package manager. - -# File Naming Convention - -There are compiled .tft files in the repo for basic and enhanced Nextion -displays of sizes 2.4", 2.8", 3.2" and 3.5". Please choose depending on the -model number printed on the back of the display. - -The basic displays are denoted by a "T" as 7th character in the filename and -model number whereas enhanced displays have a "K" in that position. The actual -display size can be derived from the last two digits. The four digits in between -the characters refert to the diplay's resolution. - -For example: A model number NX4832T035 represents a display with: - - - a resolution of 320x480 pixels - - basic command set - - a screen size of 3.5" - -# Updating the Display - -Now comes the easy part. Just execute: - -``` -$ python nextion.py NX4832T035.tft /dev/ttyUSB0 -``` - -And the output should be as follows: - -``` -Trying with baudrate: 2400... -Trying with baudrate: 4800... -Trying with baudrate: 9600... -Connected with baudrate: 9600... -Status: comok -Touchscreen: yes -Model: NX4832T035_011R -Firmware version: 68 -MCU code: 61488 -Serial: D2658880C35D2124 -Flash size: 16777216 -Downloading, 100%... -File transferred successfully -``` - -# Known errors - -Especially when using USB<->Serial adapters there are cases in which the scripts -stops at different times. This is known and due to the very simple update -protocol. In this case you have to fix the display by using a SD-Card to update -the display. The /dev/ttyAMAx ports do not seems to suffer from this issue. - diff --git a/Nextion_G4KLX/nextion.py b/Nextion_G4KLX/nextion.py deleted file mode 100644 index b9e501e..0000000 --- a/Nextion_G4KLX/nextion.py +++ /dev/null @@ -1,136 +0,0 @@ -''' - * Copyright (C) 2016 Alex Koren - * - * 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. -''' - -import serial -import time -import sys -import os -import re - -e = "\xff\xff\xff" - -def getBaudrate(ser, fSize=None, checkModel=None): - for baudrate in (2400, 4800, 9600, 19200, 38400, 57600, 115200): - ser.baudrate = baudrate - ser.timeout = 3000 / baudrate + .2 - print 'Trying with baudrate: ' + str(baudrate) + '...' - ser.write("\xff\xff\xff") - ser.write('connect') - ser.write("\xff\xff\xff") - r = ser.read(128) - if 'comok' in r: - print 'Connected with baudrate: ' + str(baudrate) + '...' - noConnect = False - status, unknown1, model, fwversion, mcucode, serial, flashSize = r.strip("\xff\x00").split(',') - print 'Status: ' + status.split(' ')[0] - if status.split(' ')[1] == "1": - print 'Touchscreen: yes' - else: - print 'Touchscreen: no' - print 'Model: ' + model - print 'Firmware version: ' + fwversion - print 'MCU code: ' + mcucode - print 'Serial: ' + serial - print 'Flash size: ' + flashSize - if fSize and fSize > flashSize: - print 'File too big!' - return False - if checkModel and not checkModel in model: - print 'Wrong Display!' - return False - return True - return False - -def setDownloadBaudrate(ser, fSize, baudrate): - ser.write("") - ser.write("whmi-wri " + str(fSize) + "," + str(baudrate) + ",0" + e) - time.sleep(.05) - ser.baudrate = baudrate - ser.timeout = .5 - r = ser.read(1) - if "\x05" in r: - return True - return False - -def transferFile(ser, filename, fSize): - with open(filename, 'rb') as hmif: - dcount = 0 - while True: - data = hmif.read(4096) - if len(data) == 0: - break - dcount += len(data) - ser.timeout = 5 - ser.write(data) - sys.stdout.write('\rDownloading, %3.1f%%...'% (dcount / float(fSize) * 100.0)) - sys.stdout.flush() - ser.timeout = .5 - time.sleep(.5) - r = ser.read(1) - if "\x05" in r: - continue - else: - print - return False - break - print - return True - -def upload(ser, filename, checkModel=None): - if not getBaudrate(ser, os.path.getsize(filename), checkModel): - print 'Could not find baudrate' - exit(1) - - if not setDownloadBaudrate(ser, os.path.getsize(filename), 115200): - print 'Could not set download baudrate' - exit(1) - - if not transferFile(ser, filename, os.path.getsize(filename)): - print 'Could not transfer file' - exit(1) - - print 'File transferred successfully' - exit(0) - -if __name__ == "__main__": - if len(sys.argv) != 4 and len(sys.argv) != 3: - print 'usage:\npython nextion.py file_to_upload.tft /path/to/dev/ttyDevice [nextion_model_name]\ - \nexample: nextion.py newUI.tft /dev/ttyUSB0 NX3224T024\ - \nnote: model name is optional' - exit(1) - - try: - ser = serial.Serial(sys.argv[2], 9600, timeout=5) - except serial.serialutil.SerialException: - print 'could not open serial device ' + sys.argv[2] - exit(1) - if serial.VERSION <= "3.0": - if not ser.isOpen(): - ser.open() - else: - if not ser.is_open: - ser.open() - - checkModel = None - if len(sys.argv) == 4: - checkModel = sys.argv[3] - pattern = re.compile("^NX\d{4}[TK]\d{3}$") - if not pattern.match(checkModel): - print 'Invalid model name. Please give a correct one (e.g. NX3224T024)' - exit(1) - upload(ser, sys.argv[1], checkModel) diff --git a/Nextion_ON7LDS/NX3224T024-L2.HMI b/Nextion_ON7LDS/NX3224T024-L2.HMI deleted file mode 100644 index f4896dd..0000000 Binary files a/Nextion_ON7LDS/NX3224T024-L2.HMI and /dev/null differ diff --git a/Nextion_ON7LDS/NX3224T024-L2.tft b/Nextion_ON7LDS/NX3224T024-L2.tft deleted file mode 100644 index c929092..0000000 Binary files a/Nextion_ON7LDS/NX3224T024-L2.tft and /dev/null differ diff --git a/Nextion_ON7LDS/NX3224T024-L3.HMI b/Nextion_ON7LDS/NX3224T024-L3.HMI deleted file mode 100644 index f2c1330..0000000 Binary files a/Nextion_ON7LDS/NX3224T024-L3.HMI and /dev/null differ diff --git a/Nextion_ON7LDS/NX3224T024-L3.tft b/Nextion_ON7LDS/NX3224T024-L3.tft deleted file mode 100644 index 4ba4609..0000000 Binary files a/Nextion_ON7LDS/NX3224T024-L3.tft and /dev/null differ diff --git a/Nextion_ON7LDS/NX3224T028-L2.HMI b/Nextion_ON7LDS/NX3224T028-L2.HMI deleted file mode 100644 index 768ed56..0000000 Binary files a/Nextion_ON7LDS/NX3224T028-L2.HMI and /dev/null differ diff --git a/Nextion_ON7LDS/NX3224T028-L2.tft b/Nextion_ON7LDS/NX3224T028-L2.tft deleted file mode 100644 index 2ffd4ce..0000000 Binary files a/Nextion_ON7LDS/NX3224T028-L2.tft and /dev/null differ diff --git a/Nextion_ON7LDS/NX3224T028-L3.HMI b/Nextion_ON7LDS/NX3224T028-L3.HMI deleted file mode 100644 index 31ca688..0000000 Binary files a/Nextion_ON7LDS/NX3224T028-L3.HMI and /dev/null differ diff --git a/Nextion_ON7LDS/NX3224T028-L3.tft b/Nextion_ON7LDS/NX3224T028-L3.tft deleted file mode 100644 index 99647e3..0000000 Binary files a/Nextion_ON7LDS/NX3224T028-L3.tft and /dev/null differ diff --git a/Nextion_ON7LDS/NX4024T032-L2.HMI b/Nextion_ON7LDS/NX4024T032-L2.HMI deleted file mode 100644 index 331aac6..0000000 Binary files a/Nextion_ON7LDS/NX4024T032-L2.HMI and /dev/null differ diff --git a/Nextion_ON7LDS/NX4024T032-L2.tft b/Nextion_ON7LDS/NX4024T032-L2.tft deleted file mode 100644 index abec64c..0000000 Binary files a/Nextion_ON7LDS/NX4024T032-L2.tft and /dev/null differ diff --git a/Nextion_ON7LDS/NX4832T035-L2.HMI b/Nextion_ON7LDS/NX4832T035-L2.HMI deleted file mode 100644 index 9bb0de2..0000000 Binary files a/Nextion_ON7LDS/NX4832T035-L2.HMI and /dev/null differ diff --git a/Nextion_ON7LDS/NX4832T035-L2.tft b/Nextion_ON7LDS/NX4832T035-L2.tft deleted file mode 100644 index 960795c..0000000 Binary files a/Nextion_ON7LDS/NX4832T035-L2.tft and /dev/null differ diff --git a/Nextion_ON7LDS/NX4832T035-L3.HMI b/Nextion_ON7LDS/NX4832T035-L3.HMI deleted file mode 100644 index c7ca2ed..0000000 Binary files a/Nextion_ON7LDS/NX4832T035-L3.HMI and /dev/null differ diff --git a/Nextion_ON7LDS/NX4832T035-L3.tft b/Nextion_ON7LDS/NX4832T035-L3.tft deleted file mode 100644 index 45ee468..0000000 Binary files a/Nextion_ON7LDS/NX4832T035-L3.tft and /dev/null differ diff --git a/Nextion_ON7LDS/README-L2 b/Nextion_ON7LDS/README-L2 deleted file mode 100644 index 46e799d..0000000 --- a/Nextion_ON7LDS/README-L2 +++ /dev/null @@ -1,41 +0,0 @@ -Nextion Display Layouts by ON7LDS (for MMDVMHost) -================================================= - - ################################ - # # - # screenLayout 2 files (-L2) # - # # - ################################ - -The -L2 files in this directory are Nextion screen layouts with better - fonts than the (rather ugly) standard Nextion fonts - -There are some other changes: - -* On the main screen there is a field to display the active ip address of the - device. On Linux it is preceded with the network interface name. -* DMR: if received, the Talker Alias is decoded and displayed. The TA will be - in green, so the user knows it is a decoded TA displaying. - This happens on-the-fly: as the parts of the TA arrive, they will immediately - be shown. -* If you want to change my screen layout, the only thing to keep in mind is - that the MMDVMHost program will select following font numbers: - default font for the TA field : font 4 - TA >16 characters : font 3 - TA >20 characters : font 2 - TA >24 characters : font 1 - There always have to be at least 5 fonts, of which font 1-4 are used for the - TA. If your display is wide enough to show all characters in one font, you - must copy this font to the lesser ('smaller') fonts. - i.e. : the 3.2" the display can show more than 31 characters (the maximum - TA length) in font 2, so this font is also copied to font 1. -* If you want more control about what and how it is displayed, you better - select Layout 3 or 4 (see README-L3) -* The screenlayout has to be selected with the parameter ScreenLayout in the - MMDVM.ini file under the Nextion section. This way, the extra function - to automatically change the font size, is activated. - 0 = auto (future use, for now it's G4KLX layout) - 1 = G4KLX layout - 2 = ON7LDS layout (this README file) - 3 = ON7LDS DIY layout (see README-L3) - 4 = ON7LDS DIY layout High Speed (see README-L3) diff --git a/Nextion_ON7LDS/README-L3 b/Nextion_ON7LDS/README-L3 deleted file mode 100644 index 7846be5..0000000 --- a/Nextion_ON7LDS/README-L3 +++ /dev/null @@ -1,249 +0,0 @@ -Nextion Display Layouts by ON7LDS (for MMDVMHost) -================================================= - - #################################### - # # - # screenLayout 3 & 4 files (-L3) # - # # - # ON7LDS DIY layouts # - # # - #################################### - -The screenlayout has to be selected with the parameter ScreenLayout in the -MMDVM.ini file under the Nextion section. This way, the extra functions -are activated. - 0 = auto (future use, for now it's G4KLX layout) - 1 = G4KLX layout - 2 = ON7LDS layout (see README-L2) - 3 = ON7LDS DIY layout (this README file) - 4 = ON7LDS DIY layout High Speed (this README file) - -screenLayout 3 and 4 are the same, but selecting 3, MMDVMHost will communicate -at 9600bps with the display and selecting 4 will set the baudrate to 115200. -If you select 4 (115200bps) *you* have to program your Nextion to default to -that baudrate. - -How to set the default Nextion Display baudrate ? -You could use the Nextion editor, connect to your display with the debug - tool (do not forget to select your display and not the simulator) and - give the command 'bauds=115200'. -Another option is to set the command above in the Preinitialization Event - of the first page. Nextion recommends to do the latter in any case, - because 'on rare occasions bauds has become lost' - - -ON7LDS DIY layouts ------------------- -When selecting this layout, all processing can and should be done in the -Nextion display itself. -Whenever MMDVMHost sends new data to the screen, it also sends information -about what was sent as a number in global variable MMDVM.status. -(see further in this document for a table of numbers and their events) - -Then MMDVMHost activates the Touch Press Event of object 'S0' of the -active page. -In this event procedure, all processing can be done. - -Check the Touch Press Event of object 'S0' of the DMR page of the example -HMI file. As a straightforward example, the code there will show you how -to do some tasks when receiving data from MMDVMHost or NextionDriver: -- change colors and fonts of the TA on the DMR page when it arrives. - (TA length calculation is done in the display itself !) -- remove the slot number from t2.txt (since it's always 2) -- in the middle of the DMR screen, the previous user is displayed - for each slot (S1 at the left, S2 at the right) - This is done by copying the data from the ID/TA field to these - fields at call end. - -The examples are there to give you an idea of what can be done. -It is up to your imagination to go even further. -When, for example, you want to change the text 'listening' to some -other text, like 'RX', you just have to monitor the event status and -take action in the Touch Event of S0 of the corresponding page. -Or you could hide/show pictures, switch to other pages, etc. - -Check the NextionDriver program and the display layouts there to see - some other examples of what can be done by programming in the - display. (https://github.com/on7lds/NextionDriver) - - -NOTE: it might be good to *not* remove fields from the display when you do not - need them, but make them small (i.e. 10 x 10 pixels) and put them aside: - Give them the same font colour and background colour as where you put them - OR - Put them behind some picture: put them on top of the picture, then select the - picture and click the 'Bring Top' button to put it on top of all those fields - OR - set them invisible when the page is selected (with the 'vis' command) in the - preinitialize event of the page - - This way, you can use the data from the fields to process them - as is done with the GPS data in the example. - - - - -Status codes that will be sent: -------------------------------- -The status code gives more information about which type of information -was sent to the display. - - 1 : page MMDVM - 2 : page D-Star - 3 : page DMR - 4 : page YSF - 5 : page P25 - 6 : page NXDN - 7 : page POCSAG - 8 : page M17 - -MMDVMHOST -11 : IDLE -12 : CW -13 : ERROR text -14 : ERROR -15 : LOCKOUT -16 : IPaddress -17 : ID/Call (t0 and t4,t5 are sent) -19 : END -20 : RX Frequency -21 : TX Frequency -22 : Temperature -23 : Location - -DSTAR -41 : D-Star listening -42 : type/my1/my2 -45 : your -46 : reflector -47 : RSSI -48 : ber - -DMR -61 : DMR listening1 -62 : ID1 -63 : TA1 -64 : Call end1 -65 : TG1 -66 : RSSI1 -67 : ber1 -69 : DMR listening2 -70 : ID2 -71 : TA2 -72 : Call end2 -73 : TG2 -74 : RSSI2 -75 : ber2 -76 : GPS1 (t8,t9,t12) -77 : GPS2 (t10,t11,t13) - -YSF -81 : YSF listening -82 : src -83 : dest -84 : origin -85 : RSSI -86 : ber - -P25 -101 : P25 listening -102 : source -103 : dest -104 : RSSI -105 : ber - -NXDN -121 : NXDN listening -122 : source -123 : dest -124 : RSSI -125 : ber - -POCSAG -132 : RIC -133 : message text -134 : waiting - -M17 -141 : M17 listening -142 : source -143 : dest -144 : RSSI -145 : ber - -Fields (and their numbers) on the pages, used by MMDVMHost ----------------------------------------------------------- - -MMDVM -t0 : owner call & ID / errortext LOCKOUT -t1 : status / ERROR -t2 : date & time - - -screenLayout >2 : -t3 : ip address -t4 : owner call -t5 : owner ID -t20 : CPU Temperature in C. ( Can be changed to F in mmdmvhost config setting: [NEXTION] Section, Setting=DisplayTempInFahrenheit=1) -t30 : RX Frequency -t31 : Location -t32 : TX Frequency - - -D-Star -t0 : type my1 my2 -t1 : your -t2 : reflector -t3 : rssi -t4 : ber - - -DMR -t0 : src1 id / call / TA -t1 : dst -t2 : src2 id / call / TA -t3 : dst -t4 : rssi1 -t5 : rssi2 -t6 : ber1 -t7 : ber2 - -screenLayout >2 : -t8 : GPS1 dec -t9 : GPS1 DMS -t10: GPS2 dec -t11: GPS2 DMS -t12: GPS1 err -t13: GPS2 err - - -YSF -t0 : type,source -t1 : dst -t2 : src -t3 : rssi -t4 : ber - - -P25 -t0 : type,source -t1 : dst -t2 : rssi -t3 : ber - - -NXDN -t0 : type,source -t1 : dst -t2 : rssi -t3 : ber - -POCSAG -t0 : waiting / RIC -t1 : message - -M17 -t0 : source -t1 : dst -t2 : rssi -t3 : ber diff --git a/Nextion_ON7LDS/README.md b/Nextion_ON7LDS/README.md deleted file mode 100644 index 4cc5bb9..0000000 --- a/Nextion_ON7LDS/README.md +++ /dev/null @@ -1,34 +0,0 @@ -Nextion Display Layouts by ON7LDS (for MMDVMHost) -================================================= - -##### WARNING -These layouts should be opened with Nextion Editor LTS (v0.53) -The fonts that are used are made by me at the time (with 'zi edit') and are (in my opinion) very good readable and compact to show as much as possible. -Nextion has changed a lot since then and sadly, these fonts seem not to be compatible with later versions of Nextion Editor. - - - -##### Use - -The screenlayout has to be selected with the parameter **ScreenLayout** in the -MMDVM.ini file under the Nextion section. This way, the extra functions -are activated. - - 0 = auto (future use, for now it's G4KLX layout) - 1 = G4KLX layout - 2 = ON7LDS layout (see README-L2) - 3 = ON7LDS DIY layout - 4 = ON7LDS DIY layout High Speed - -Layout 2 is a no-nonsense layout. It is the original (G4KLX) layout with the Talker Alias added. TA color and fonts size can not be changed. At least not easily. - -Layout 3 (as is 4) is a layout without any predefined layout options (color, fonts). It sends the fields **and** information about what was sent to the display, so all layout processing can and should be done in the display itself. - -More information about the layouts can be found in - * README-L2 for the screenLayout 2 setting (list of field names : see README-L3) - * README-L3 for the screenLayout 3 and 4 settings - - -When you want extra control over what has to be sent to the Nextion display, you could consider the program 'NextionDriver' at https://github.com/on7lds/NextionDriver as a companion to MMDVMHost. -This program sends extra information about the host to the display, can do callsign lookup with extended information (name, city, country) and can do more processing which would not be the task of MMDVMHost (for example: with the help of this program, it is possible to use buttons on the display to do actions on the host itself). -In verbose mode, this program shows you all communication between MMDVMHost and the display. diff --git a/NullDisplay.cpp b/NullDisplay.cpp deleted file mode 100644 index 5708028..0000000 --- a/NullDisplay.cpp +++ /dev/null @@ -1,175 +0,0 @@ -/* - * Copyright (C) 2016,2018,2020 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 - * 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 "NullDisplay.h" - -#if defined(RASPBERRY_PI) -#include -#endif - -#define LED_STATUS 28 - -CNullDisplay::CNullDisplay() : -CDisplay() -{ -} - -CNullDisplay::~CNullDisplay() -{ -} - -bool CNullDisplay::open() -{ -#if defined(RASPBERRY_PI) - ::wiringPiSetup(); - - ::pinMode(LED_STATUS, OUTPUT); - ::digitalWrite(LED_STATUS, 0); -#endif - return true; -} - -void CNullDisplay::setIdleInt() -{ -} - -void CNullDisplay::setErrorInt(const char* text) -{ -} - -void CNullDisplay::setLockoutInt() -{ -} - -void CNullDisplay::setQuitInt() -{ -} - -void CNullDisplay::setFMInt() -{ -} - -void CNullDisplay::writeDStarInt(const char* my1, const char* my2, const char* your, const char* type, const char* reflector) -{ -#if defined(RASPBERRY_PI) - ::digitalWrite(LED_STATUS, 1); -#endif -} - -void CNullDisplay::clearDStarInt() -{ -#if defined(RASPBERRY_PI) - ::digitalWrite(LED_STATUS, 0); -#endif -} - -void CNullDisplay::writeDMRInt(unsigned int slotNo, const std::string& src, bool group, const std::string& dst, const char* type) -{ -#if defined(RASPBERRY_PI) - ::digitalWrite(LED_STATUS, 1); -#endif -} - -void CNullDisplay::clearDMRInt(unsigned int slotNo) -{ -#if defined(RASPBERRY_PI) - ::digitalWrite(LED_STATUS, 0); -#endif -} - -void CNullDisplay::writeFusionInt(const char* source, const char* dest, unsigned char dgid, const char* type, const char* origin) -{ -#if defined(RASPBERRY_PI) - ::digitalWrite(LED_STATUS, 1); -#endif -} - -void CNullDisplay::clearFusionInt() -{ -#if defined(RASPBERRY_PI) - ::digitalWrite(LED_STATUS, 0); -#endif -} - -void CNullDisplay::writeP25Int(const char* source, bool group, unsigned int dest, const char* type) -{ -#if defined(RASPBERRY_PI) - ::digitalWrite(LED_STATUS, 1); -#endif -} - -void CNullDisplay::clearP25Int() -{ -#if defined(RASPBERRY_PI) - ::digitalWrite(LED_STATUS, 0); -#endif -} - -void CNullDisplay::writeNXDNInt(const char* source, bool group, unsigned int dest, const char* type) -{ -#if defined(RASPBERRY_PI) - ::digitalWrite(LED_STATUS, 1); -#endif -} - -void CNullDisplay::clearNXDNInt() -{ -#if defined(RASPBERRY_PI) - ::digitalWrite(LED_STATUS, 0); -#endif -} - -void CNullDisplay::writeM17Int(const char* source, const char* dest, const char* type) -{ -#if defined(RASPBERRY_PI) - ::digitalWrite(LED_STATUS, 1); -#endif -} - -void CNullDisplay::clearM17Int() -{ -#if defined(RASPBERRY_PI) - ::digitalWrite(LED_STATUS, 0); -#endif -} - -void CNullDisplay::writePOCSAGInt(uint32_t ric, const std::string& message) -{ -#if defined(RASPBERRY_PI) - ::digitalWrite(LED_STATUS, 1); -#endif -} - -void CNullDisplay::clearPOCSAGInt() -{ -#if defined(RASPBERRY_PI) - ::digitalWrite(LED_STATUS, 0); -#endif -} - -void CNullDisplay::writeCWInt() -{ -} - -void CNullDisplay::clearCWInt() -{ -} - -void CNullDisplay::close() -{ -} diff --git a/NullDisplay.h b/NullDisplay.h deleted file mode 100644 index c53dc08..0000000 --- a/NullDisplay.h +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright (C) 2016,2018,2020 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 - * 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(NULLDISPLAY_H) -#define NULLDISPLAY_H - -#include "Display.h" - -#include - -class CNullDisplay : public CDisplay -{ -public: - CNullDisplay(); - virtual ~CNullDisplay(); - - virtual bool open(); - - virtual void close(); - -protected: - virtual void setIdleInt(); - virtual void setErrorInt(const char* text); - virtual void setLockoutInt(); - virtual void setQuitInt(); - virtual void setFMInt(); - - virtual void writeDStarInt(const char* my1, const char* my2, const char* your, const char* type, const char* reflector); - virtual void clearDStarInt(); - - virtual void writeDMRInt(unsigned int slotNo, const std::string& src, bool group, const std::string& dst, const char* type); - virtual void clearDMRInt(unsigned int slotNo); - - virtual void writeFusionInt(const char* source, const char* dest, unsigned char dgid, const char* type, const char* origin); - virtual void clearFusionInt(); - - virtual void writeP25Int(const char* source, bool group, unsigned int dest, const char* type); - virtual void clearP25Int(); - - virtual void writeNXDNInt(const char* source, bool group, unsigned int dest, const char* type); - virtual void clearNXDNInt(); - - virtual void writeM17Int(const char* source, const char* dest, const char* type); - virtual void clearM17Int(); - - virtual void writePOCSAGInt(uint32_t ric, const std::string& message); - virtual void clearPOCSAGInt(); - - virtual void writeCWInt(); - virtual void clearCWInt(); - -private: -}; - -#endif diff --git a/OLED.cpp b/OLED.cpp deleted file mode 100644 index 19ca09f..0000000 --- a/OLED.cpp +++ /dev/null @@ -1,814 +0,0 @@ -/* - * Copyright (C) 2016,2017,2018,2020 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 - * 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 "OLED.h" -#include "Log.h" - -static bool networkInfoInitialized = false; -static unsigned char passCounter = 0; - -//Logo MMDVM for Idle Screen -static unsigned char logo_glcd_bmp[] = -{ -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x01, 0xF8, 0x03, 0xFC, 0x7F, 0x80, 0x3F, 0xC7, 0xFF, 0xFC, 0xF8, 0x00, 0xF9, 0xFC, 0x01, 0xFE, -0x01, 0xFC, 0x07, 0xFC, 0x7F, 0xC0, 0x7F, 0xC4, 0x00, 0x02, 0x48, 0x00, 0x91, 0xFE, 0x03, 0xFE, -0x03, 0xFC, 0x07, 0xFC, 0x7F, 0xC0, 0x7F, 0xC5, 0xFF, 0xF1, 0x24, 0x01, 0x23, 0xFE, 0x03, 0xFE, -0x03, 0xFE, 0x0F, 0xBC, 0x7B, 0xE0, 0xFB, 0xC5, 0x00, 0x09, 0x24, 0x01, 0x23, 0xDF, 0x07, 0xDE, -0x07, 0xDE, 0x0F, 0x3C, 0x79, 0xE0, 0xF3, 0xC5, 0x00, 0x05, 0x12, 0x02, 0x47, 0xCF, 0x07, 0x9E, -0x07, 0x9F, 0x1F, 0x3C, 0x79, 0xF1, 0xF3, 0xC5, 0x00, 0x05, 0x12, 0x02, 0x47, 0x8F, 0x8F, 0x9E, -0x0F, 0x8F, 0x1E, 0x3C, 0x78, 0xF1, 0xE3, 0xC5, 0x00, 0x05, 0x09, 0x04, 0x8F, 0x87, 0x8F, 0x1E, -0x0F, 0x0F, 0xBE, 0x3C, 0x78, 0xFB, 0xE3, 0xC5, 0x00, 0x05, 0x09, 0x04, 0x8F, 0x07, 0xDF, 0x1E, -0x1F, 0x07, 0xFC, 0x3C, 0x78, 0x7F, 0xC3, 0xC5, 0x00, 0x05, 0x04, 0x89, 0x1F, 0x03, 0xFE, 0x1E, -0x1E, 0x03, 0xFC, 0x3C, 0x78, 0x7F, 0xC3, 0xC5, 0x00, 0x09, 0x04, 0x89, 0x1E, 0x01, 0xFE, 0x1E, -0x3E, 0x03, 0xF8, 0x3C, 0x78, 0x3F, 0x83, 0xC5, 0xFF, 0xF1, 0x02, 0x72, 0x3E, 0x01, 0xFC, 0x1E, -0x3C, 0x01, 0xF0, 0x3C, 0x78, 0x1F, 0x03, 0xC4, 0x00, 0x02, 0x02, 0x02, 0x3C, 0x00, 0xF8, 0x1E, -0x7C, 0x01, 0xF0, 0x3C, 0x78, 0x1F, 0x03, 0xC7, 0xFF, 0xFC, 0x01, 0xFC, 0x7C, 0x00, 0xF8, 0x1E, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 -}; - -//Logo D-Star 128x16 px -static unsigned char logo_dstar_bmp[] = -{ -0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x60, 0x03, 0xFF, 0xC0, 0x00, 0x00, 0x1F, 0xF0, 0xFF, 0xFE, 0x07, 0x80, 0x3F, 0xF8, -0x00, 0x00, 0xC0, 0x07, 0xC1, 0xE0, 0x00, 0x00, 0x78, 0x7C, 0xFF, 0xFE, 0x0F, 0xC0, 0x3F, 0xFC, -0x00, 0x01, 0xC0, 0x07, 0x80, 0xF0, 0x00, 0x00, 0xE0, 0x3C, 0x07, 0x80, 0x0F, 0xC0, 0x78, 0x0E, -0x00, 0x03, 0xC0, 0x07, 0x80, 0x70, 0x00, 0x00, 0xE0, 0x38, 0x07, 0x00, 0x1B, 0xC0, 0x78, 0x0E, -0x00, 0x07, 0xC0, 0x07, 0x80, 0x70, 0x00, 0x01, 0xE0, 0x00, 0x07, 0x00, 0x33, 0xC0, 0x70, 0x1E, -0x07, 0xFF, 0xFE, 0x07, 0x00, 0x70, 0x00, 0x01, 0xF8, 0x00, 0x07, 0x00, 0x63, 0xC0, 0x70, 0x3C, -0x01, 0xFF, 0xF8, 0x0F, 0x00, 0x71, 0xFF, 0xE0, 0xFF, 0xF0, 0x0E, 0x00, 0xE1, 0xE0, 0xFF, 0xE0, -0x00, 0x7F, 0xE0, 0x0F, 0x00, 0x60, 0x00, 0x00, 0x03, 0xF8, 0x0E, 0x00, 0xC1, 0xE0, 0xFF, 0xE0, -0x00, 0x3F, 0x80, 0x0E, 0x00, 0xE0, 0x00, 0x00, 0x00, 0xF0, 0x0E, 0x01, 0xFF, 0xE0, 0xE0, 0x70, -0x00, 0x7F, 0x00, 0x1E, 0x00, 0xE0, 0x00, 0x03, 0x80, 0x70, 0x0C, 0x03, 0xFC, 0xE0, 0xE0, 0x30, -0x00, 0xFF, 0x00, 0x1E, 0x01, 0xC0, 0x00, 0x07, 0x80, 0xE0, 0x1C, 0x07, 0x00, 0xE1, 0xE0, 0x38, -0x01, 0xEF, 0x00, 0x1C, 0x07, 0x80, 0x00, 0x07, 0xC1, 0xE0, 0x1C, 0x06, 0x00, 0xF1, 0xC0, 0x38, -0x03, 0x87, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x03, 0xFF, 0x80, 0x1C, 0x0C, 0x00, 0xF3, 0xC0, 0x38, -0x06, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 -}; - -//Logo DMR 128x16 px -static unsigned char logo_dmr_bmp[] = -{ -0x00, 0x01, 0xFF, 0xFF, 0xF8, 0x01, 0xF8, 0x00, 0x00, 0x1F, 0x1F, 0xFF, 0xFF, 0xFC, 0x00, 0x00, -0x00, 0x01, 0xFF, 0xFF, 0xFF, 0x81, 0xFC, 0x00, 0x00, 0x3F, 0x1F, 0xFF, 0xFF, 0xFF, 0x00, 0x00, -0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xE1, 0xFE, 0x00, 0x00, 0xFF, 0x1F, 0xFF, 0xFF, 0xFF, 0x00, 0x00, -0x00, 0x01, 0xF8, 0x00, 0x0F, 0xF1, 0xFF, 0x80, 0x01, 0xFF, 0x1F, 0x80, 0x00, 0x1F, 0x00, 0x00, -0x00, 0x01, 0xF8, 0x00, 0x03, 0xF9, 0xFF, 0xC0, 0x03, 0xFF, 0x1F, 0x80, 0x00, 0x0F, 0x00, 0x00, -0x00, 0x01, 0xF8, 0x00, 0x01, 0xF9, 0xFF, 0xE0, 0x07, 0xFF, 0x1F, 0x80, 0x00, 0x0F, 0x00, 0x00, -0x00, 0x01, 0xF8, 0x00, 0x01, 0xFD, 0xF3, 0xF0, 0x1F, 0x9F, 0x1F, 0x80, 0x00, 0x1F, 0x00, 0x00, -0x00, 0x01, 0xF8, 0x00, 0x00, 0xFD, 0xF1, 0xFC, 0x3F, 0x1F, 0x1F, 0xFF, 0xFF, 0xFF, 0x00, 0x00, -0x00, 0x01, 0xF8, 0x00, 0x00, 0xFD, 0xF0, 0xFE, 0x7E, 0x1F, 0x1F, 0xFF, 0xFF, 0xFF, 0x00, 0x00, -0x00, 0x01, 0xF8, 0x00, 0x01, 0xFD, 0xF0, 0x7F, 0xFC, 0x1F, 0x1F, 0xFF, 0xFF, 0xFC, 0x00, 0x00, -0x00, 0x01, 0xF8, 0x00, 0x01, 0xF9, 0xF0, 0x1F, 0xF0, 0x1F, 0x1F, 0x81, 0xFC, 0x00, 0x00, 0x00, -0x00, 0x01, 0xF8, 0x00, 0x07, 0xF9, 0xF0, 0x0F, 0xE0, 0x1F, 0x1F, 0x80, 0x7F, 0x00, 0x00, 0x00, -0x00, 0x01, 0xF8, 0x00, 0x3F, 0xF1, 0xF0, 0x07, 0xC0, 0x1F, 0x1F, 0x80, 0x3F, 0xC0, 0x00, 0x00, -0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xC1, 0xF0, 0x03, 0x80, 0x1F, 0x1F, 0x80, 0x0F, 0xF0, 0x00, 0x00, -0x00, 0x01, 0xFF, 0xFF, 0xFF, 0x01, 0xF0, 0x00, 0x00, 0x1F, 0x1F, 0x80, 0x03, 0xFC, 0x00, 0x00, -0x00, 0x01, 0xFF, 0xFF, 0xF0, 0x01, 0xF0, 0x00, 0x00, 0x1F, 0x1F, 0x80, 0x01, 0xFF, 0x00, 0x00 -}; - -//Logo Fusion 128x16 -const unsigned char logo_fusion_bmp [] = -{ -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x01, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x03, 0xFC, 0x00, 0x1F, 0xE1, 0xFE, 0x1F, 0xFF, 0xF8, 0x7F, 0xC3, 0xFF, 0xFF, 0x1F, 0xFF, 0xFE, -0x03, 0xFC, 0x00, 0x3F, 0xC3, 0xFC, 0x3F, 0x80, 0x00, 0x7F, 0x87, 0xF0, 0xFF, 0x0F, 0xF1, 0xFF, -0x07, 0xFF, 0xFC, 0x7F, 0x83, 0xF8, 0x7F, 0x80, 0x00, 0xFF, 0x0F, 0xF0, 0xFF, 0x1F, 0xE1, 0xFE, -0x0F, 0xFF, 0xF0, 0x7F, 0x07, 0xF0, 0xFF, 0xFF, 0xC1, 0xFF, 0x1F, 0xE1, 0xFE, 0x3F, 0xC3, 0xFC, -0x0F, 0xF0, 0x00, 0xFE, 0x0F, 0xE0, 0x7F, 0xFF, 0xE1, 0xFE, 0x3F, 0xC3, 0xFC, 0x3F, 0xC3, 0xFC, -0x1F, 0xE0, 0x01, 0xFC, 0x1F, 0xE0, 0x1F, 0xFF, 0xE3, 0xFC, 0x3F, 0xC3, 0xF8, 0x7F, 0x87, 0xF8, -0x3F, 0xC0, 0x03, 0xFC, 0x3F, 0xC0, 0x00, 0x3F, 0xC7, 0xF8, 0x7F, 0x87, 0xF8, 0xFF, 0x0F, 0xF0, -0x7F, 0xC0, 0x03, 0xFF, 0xFF, 0xE0, 0x00, 0x7F, 0x07, 0xF8, 0x7F, 0xCF, 0xE1, 0xFF, 0x1F, 0xF8, -0x7F, 0x80, 0x01, 0xFF, 0xFF, 0xC7, 0xFF, 0xFC, 0x0F, 0xF0, 0x3F, 0xFF, 0x81, 0xFE, 0x1F, 0xF0, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 -}; - -//Logo P25 128x16px -const unsigned char logo_P25_bmp [] = -{ -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x01, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x03, 0xff, 0xff, 0xc0, 0x01, 0xff, 0xff, 0xff, 0xf8, 0x00, -0x01, 0xff, 0xff, 0xff, 0xff, 0x80, 0x3f, 0xff, 0xff, 0xfc, 0x01, 0xff, 0xff, 0xff, 0xf8, 0x00, -0x01, 0xff, 0xff, 0xff, 0xff, 0xe0, 0xff, 0xf8, 0x3f, 0xff, 0x01, 0xff, 0xff, 0xff, 0xf8, 0x00, -0x01, 0xff, 0xc0, 0x00, 0x7f, 0xf1, 0xff, 0xc0, 0x07, 0xff, 0x01, 0xff, 0x00, 0x00, 0x00, 0x00, -0x01, 0xff, 0xc0, 0x00, 0x3f, 0xf3, 0xff, 0x80, 0x03, 0xff, 0x81, 0xff, 0x00, 0x00, 0x00, 0x00, -0x01, 0xff, 0xc0, 0x00, 0x3f, 0xf1, 0xff, 0x80, 0x07, 0xff, 0x01, 0xff, 0xff, 0xff, 0xe0, 0x00, -0x01, 0xff, 0xc0, 0x07, 0xff, 0xe0, 0x00, 0x00, 0x1f, 0xfe, 0x01, 0xff, 0xff, 0xff, 0xfe, 0x00, -0x01, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x07, 0xff, 0x80, -0x01, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x07, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x01, 0xff, 0xc0, -0x01, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xc0, -0x01, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x07, 0xff, 0xe0, 0x00, 0x03, 0xf0, 0x00, 0x03, 0xff, 0xc0, -0x01, 0xff, 0xc0, 0x00, 0x00, 0x00, 0xff, 0xff, 0x80, 0x00, 0x1f, 0xff, 0x00, 0x1f, 0xff, 0x00, -0x01, 0xff, 0xc0, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0x87, 0xff, 0xff, 0xff, 0xfc, 0x00, -0x01, 0xff, 0xc0, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0x80, 0x7f, 0xff, 0xff, 0xc0, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 -}; - -// Logo NXDN_sm, 128x16px -const unsigned char logo_NXDN_bmp [] = -{ -0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, -0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, -0xff, 0xf0, 0x1f, 0xf8, 0x0f, 0x00, 0xff, 0x80, 0x7c, 0x00, 0x0f, 0xff, 0x80, 0x7f, 0xe0, 0x7f, -0xff, 0xe0, 0x0f, 0xf0, 0x1f, 0x80, 0x7e, 0x01, 0xf8, 0x00, 0x00, 0x7f, 0x00, 0x3f, 0xc0, 0x7f, -0xff, 0xc0, 0x07, 0xe0, 0x3f, 0x80, 0x38, 0x07, 0xf0, 0x00, 0x00, 0x3e, 0x00, 0x3f, 0x80, 0xff, -0xff, 0x80, 0x03, 0xc0, 0x3f, 0xc0, 0x00, 0x3f, 0xe0, 0x1f, 0x80, 0x3e, 0x00, 0x1f, 0x01, 0xff, -0xff, 0x00, 0x03, 0x80, 0x7f, 0xe0, 0x00, 0xff, 0xc0, 0x3f, 0x80, 0x3c, 0x00, 0x0e, 0x03, 0xff, -0xfe, 0x00, 0x01, 0x00, 0xff, 0xe0, 0x03, 0xff, 0x80, 0x7f, 0x80, 0x78, 0x08, 0x04, 0x03, 0xff, -0xfc, 0x03, 0x00, 0x01, 0xff, 0x80, 0x01, 0xff, 0x00, 0xff, 0x00, 0xf0, 0x1c, 0x00, 0x07, 0xff, -0xfc, 0x07, 0x80, 0x03, 0xfc, 0x00, 0x01, 0xfe, 0x01, 0xfc, 0x01, 0xe0, 0x1e, 0x00, 0x0f, 0xff, -0xf8, 0x0f, 0xc0, 0x07, 0xf0, 0x0e, 0x00, 0xfc, 0x00, 0x00, 0x07, 0xc0, 0x3f, 0x00, 0x1f, 0xff, -0xf0, 0x1f, 0xe0, 0x0f, 0x80, 0x3f, 0x00, 0x7c, 0x00, 0x00, 0x3f, 0xc0, 0x7f, 0x80, 0x3f, 0xff, -0xe0, 0x3f, 0xf0, 0x0e, 0x01, 0xff, 0x80, 0x38, 0x00, 0x07, 0xff, 0x80, 0xff, 0x80, 0x7f, 0xff, -0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, -0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, -0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff -}; - -// Logo M17_sm, 128x16px -const unsigned char logo_M17_bmp [] = -{ -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x62, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x67, 0x37, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe7, 0x33, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xef, 0x70, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xee, 0xf0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xff, 0xf1, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x7f, 0x31, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x77, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x77, 0x37, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x67, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x60, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -}; - -// Logo POCASG/DAPNET, 128x16px -const unsigned char logo_POCSAG_bmp [] = -{ -0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, -0xff, 0xff, 0xff, 0xf8, 0x7f, 0xfe, 0x03, 0xfe, 0xfe, 0x03, 0xdf, 0xf6, 0x00, 0x00, 0x1f, 0xff, -0xff, 0xff, 0xff, 0xff, 0x7f, 0xfe, 0xfc, 0xfc, 0xfe, 0xfc, 0xcf, 0xf6, 0xff, 0xfb, 0xff, 0xff, -0xff, 0xff, 0xff, 0xff, 0x7f, 0xfe, 0xfe, 0x7d, 0x7e, 0xfe, 0xc7, 0xf6, 0xff, 0xfb, 0xff, 0xff, -0xff, 0xff, 0xff, 0xfb, 0x7a, 0x7e, 0xff, 0x79, 0x7e, 0xfe, 0xd3, 0xf6, 0xff, 0xfb, 0xff, 0xff, -0xff, 0xff, 0xff, 0xff, 0xf7, 0xbe, 0xff, 0x7b, 0xbe, 0xfe, 0xdb, 0xf6, 0xff, 0xfb, 0xff, 0xff, -0xff, 0xff, 0xff, 0xff, 0xff, 0xbe, 0xff, 0xbb, 0xbe, 0xfe, 0xdd, 0xf6, 0xff, 0xfb, 0xff, 0xff, -0xff, 0xff, 0xff, 0xf9, 0xff, 0xbe, 0xff, 0xb7, 0xde, 0xfe, 0xde, 0xf6, 0x01, 0xfb, 0xff, 0xff, -0xff, 0xff, 0xff, 0xee, 0x77, 0xbe, 0xff, 0xb7, 0xde, 0x81, 0xde, 0x76, 0xff, 0xfb, 0xff, 0xff, -0xff, 0xff, 0xff, 0xdf, 0xb7, 0x7e, 0xff, 0xa0, 0x1e, 0xff, 0xdf, 0x36, 0xff, 0xfb, 0xff, 0xff, -0xff, 0xff, 0xff, 0xdf, 0xbc, 0xfe, 0xff, 0x6f, 0xee, 0xff, 0xdf, 0xb6, 0xff, 0xfb, 0xff, 0xff, -0xff, 0xff, 0xff, 0xdf, 0xbf, 0xfe, 0xff, 0x6f, 0xee, 0xff, 0xdf, 0xd6, 0xff, 0xfb, 0xff, 0xff, -0xff, 0xff, 0xff, 0xdf, 0xbf, 0xfe, 0xfe, 0xdf, 0xf6, 0xff, 0xdf, 0xe6, 0xff, 0xfb, 0xff, 0xff, -0xff, 0xff, 0xff, 0xdf, 0x7f, 0xfe, 0xf9, 0xdf, 0xf6, 0xff, 0xdf, 0xe6, 0xff, 0xfb, 0xff, 0xff, -0xff, 0xff, 0xff, 0xe6, 0x7f, 0xfe, 0x07, 0xff, 0xf6, 0xff, 0xdf, 0xf6, 0x00, 0xfb, 0xff, 0xff, -0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff -}; - -COLED::COLED(unsigned char displayType, unsigned char displayBrightness, bool displayInvert, bool displayScroll, bool displayRotate, bool displayLogoScreensaver, bool duplex) : -m_displayType(displayType), -m_displayBrightness(displayBrightness), -m_displayInvert(displayInvert), -m_displayScroll(displayScroll), -m_displayRotate(displayRotate), -m_displayLogoScreensaver(displayLogoScreensaver), -m_duplex(duplex), -//m_duplex(true), // uncomment to force duplex display for testing! -m_ipaddress(), -m_display() -{ -} - -COLED::~COLED() -{ -} - -bool COLED::open() -{ - - // SPI - if (m_display.oled_is_spi_proto(m_displayType)) - { - // SPI change parameters to fit to your LCD - if ( !m_display.init(OLED_SPI_DC,OLED_SPI_RESET,OLED_SPI_CS, m_displayType) ) - return false; - } - else - { - // I2C change parameters to fit to your LCD - if ( !m_display.init(OLED_I2C_RESET, m_displayType) ) - return false; - } - - - m_display.begin(); - - m_display.invertDisplay(m_displayInvert ? 1 : 0); - if (m_displayBrightness > 0U) - m_display.setBrightness(m_displayBrightness); - - if (m_displayRotate > 0U) { - m_display.sendCommand(0xC0); - m_display.sendCommand(0xA0); - } - - // init done - m_display.setTextWrap(false); // disable text wrap as default - m_display.clearDisplay(); // clears the screen buffer - m_display.display(); // display it (clear display) - - OLED_statusbar(); - m_display.setCursor(0,OLED_LINE4); - m_display.setTextSize(1); - m_display.print(" -Initializing-"); - m_display.display(); - - return true; -} - -void COLED::setIdleInt() -{ - m_mode = MODE_IDLE; - - m_display.clearDisplay(); - OLED_statusbar(); - - if (m_displayScroll && m_displayLogoScreensaver) - m_display.startscrolldiagleft(0x00,0x0f); //the MMDVM logo scrolls the whole screen - - unsigned char info[100U]; - CNetworkInfo* m_network; - - passCounter ++; - if (passCounter > 253U) - networkInfoInitialized = false; - - if (! networkInfoInitialized) { - //LogMessage("Initialize CNetworkInfo"); - info[0]=0; - m_network = new CNetworkInfo; - m_network->getNetworkInterface(info); - m_ipaddress = (char*)info; - delete m_network; - - networkInfoInitialized = true; - passCounter = 0; - } - - // Let's let the users know if they are in Auto-AP mode... - if (m_ipaddress.find("wlan0_ap") != std::string::npos) { - size_t pos = m_ipaddress.find("wlan0_ap"); - if (pos != std::string::npos) { - m_ipaddress.erase(pos, 9); // remove redundant/superfluous "wlan0_ap" from string - } - // Read ssid value from /etc/hostapd.conf if it exists... - std::string ssid; - std::ifstream configFile("/etc/hostapd/hostapd.conf"); - if (configFile.is_open()) { - std::string line; - while (std::getline(configFile, line)) { - if (line.find("ssid=") != std::string::npos) { - std::istringstream iss(line); - std::string key, value; - if (std::getline(iss, key, '=') && std::getline(iss, value)) { - ssid = value; - break; - } - } - } - configFile.close(); - } else { - ssid = "Unknown"; // `/etc/hostapd.conf` does not exist... - } - - if (m_displayLogoScreensaver) { - m_display.setCursor(0, OLED_LINE3); - m_display.setTextSize(1); - m_display.printf("Auto-AP Running..."); - m_display.setCursor(0, OLED_LINE5); - m_display.setTextSize(1); - m_display.printf("SSID: %s", ssid.c_str()); - m_display.setCursor(0, OLED_LINE6); - m_display.setTextSize(1); - m_display.printf("IP: %s", m_ipaddress.c_str()); - } - } else { // Connected to network - no Auto-AP mode; normal display layout... - if (m_displayLogoScreensaver) { - m_display.setCursor(0,OLED_LINE3); - m_display.setTextSize(1); - m_display.print(" -IDLE-"); - m_display.setCursor(0, OLED_LINE5); - m_display.printf("%s", m_ipaddress.c_str()); - } - } - m_display.display(); - -} - -void COLED::setErrorInt(const char* text) -{ - m_mode = MODE_ERROR; - - m_display.clearDisplay(); - OLED_statusbar(); - - m_display.setTextWrap(true); // text wrap temorally enable - m_display.setCursor(0,OLED_LINE1); - m_display.printf("%s\n",text); - m_display.setTextWrap(false); - - m_display.display(); -} - -void COLED::setLockoutInt() -{ - m_mode = MODE_LOCKOUT; - - m_display.clearDisplay(); - OLED_statusbar(); - - m_display.setCursor(0,30); - m_display.setTextSize(3); - m_display.print("Lockout"); - - m_display.setTextSize(1); - m_display.display(); -} - -void COLED::setQuitInt() -{ - m_mode = MODE_QUIT; - - m_display.clearDisplay(); - OLED_statusbar(); - - m_display.setCursor(0,30); - m_display.setTextSize(2); - m_display.print(" Stopping"); - - m_display.setTextSize(1); - m_display.display(); - sleep(2); -} - -void COLED::setFMInt() -{ - m_mode = MODE_FM; - - m_display.clearDisplay(); - OLED_statusbar(); - - m_display.setCursor(0,30); - m_display.setTextSize(3); - m_display.print("FM"); - - m_display.setTextSize(1); - m_display.display(); -} - -void COLED::writeDStarInt(const char* my1, const char* my2, const char* your, const char* type, const char* reflector) -{ - m_mode = MODE_DSTAR; - - m_display.clearDisplay(); - m_display.fillRect(0,OLED_LINE3,m_display.width(),m_display.height(),BLACK); //clear everything beneath logo - - m_display.setCursor(0,OLED_LINE3); - m_display.printf("%s %.8s/%4.4s",type,my1,my2); - - m_display.setCursor(0,OLED_LINE4); - m_display.printf("-> %.8s",your); - - m_display.setCursor(0,OLED_LINE5); - m_display.printf("via %.8s",reflector); - - m_display.setCursor(0,OLED_LINE6); - m_display.printf("%s",m_ipaddress.c_str()); - - OLED_statusbar(); - m_display.display(); -} - -void COLED::clearDStarInt() -{ - m_display.fillRect(0,OLED_LINE3, m_display.width(),m_display.height(),BLACK); //clear everything beneath the logo - - m_display.setCursor(40,OLED_LINE3); - m_display.print("Standby"); - - m_display.setCursor(0,OLED_LINE5); - m_display.printf("%s",m_ipaddress.c_str()); - - m_display.display(); -} - -void COLED::writeDMRInt(unsigned int slotNo,const std::string& src,bool group,const std::string& dst,const char* type) -{ - CUserDBentry tmp; - - tmp.set(keyCALLSIGN, src); - writeDMRIntEx(slotNo, tmp, group, dst, type); -} - -#define CALLandNAME(u) ((u).get(keyCALLSIGN) + " " + (u).get(keyFIRST_NAME)) - -int COLED::writeDMRIntEx(unsigned int slotNo, const class CUserDBentry& src, bool group, const std::string& dst, const char* type) -{ - - if (m_mode != MODE_DMR) { - m_display.clearDisplay(); - m_mode = MODE_DMR; - clearDMRInt(slotNo); - } - // if both slots, use lines 2-3 for slot 1, lines 4-5 for slot 2 - // if single slot, use lines 2-3 - if ( m_duplex ) { - - if (slotNo == 1U) { - m_display.fillRect(0,OLED_LINE2,m_display.width(),40,BLACK); - m_display.setCursor(0,OLED_LINE2); - m_display.printf("%s",CALLandNAME(src).c_str()); - m_display.setCursor(0,OLED_LINE3); - m_display.printf("Slot: %i %s %s%s",slotNo,type,group ? "TG: " : "",dst.c_str()); - } - else - { - m_display.fillRect(0,OLED_LINE4,m_display.width(),40,BLACK); - m_display.setCursor(0,OLED_LINE4); - m_display.printf("%s",CALLandNAME(src).c_str()); - m_display.setCursor(0,OLED_LINE5); - m_display.printf("Slot: %i %s %s%s",slotNo,type,group ? "TG: " : "",dst.c_str()); - } - - m_display.fillRect(0,OLED_LINE6,m_display.width(),20,BLACK); - m_display.setCursor(0,OLED_LINE6); - m_display.printf("%s",m_ipaddress.c_str()); - } - else - { - m_display.fillRect(0,OLED_LINE2,m_display.width(),m_display.height(),BLACK); - m_display.setCursor(0,OLED_LINE2); - m_display.printf("%s",CALLandNAME(src).c_str()); - m_display.setCursor(0,OLED_LINE3); - m_display.printf("Slot: %i %s %s%s",slotNo,type,group ? "TG: " : "",dst.c_str()); - m_display.setCursor(0,OLED_LINE4); - m_display.printf("%s",src.get(keyCITY).c_str()); - m_display.setCursor(0,OLED_LINE5); - m_display.printf("%s",src.get(keySTATE).c_str()); - m_display.setCursor(0,OLED_LINE6); - m_display.printf("%s",src.get(keyCOUNTRY).c_str()); - } - - OLED_statusbar(); - m_display.display(); - - // must be 0, to avoid calling writeDMRInt() from CDisplay::writeDMR() - return 0; -} - -void COLED::clearDMRInt(unsigned int slotNo) -{ - // if both slots, use lines 2-3 for slot 1, lines 4-5 for slot 2 - // if single slot, use lines 2-3 - if ( m_duplex ){ - if (slotNo == 1U) { - m_display.fillRect(0, OLED_LINE3, m_display.width(), 40, BLACK); - m_display.setCursor(0,OLED_LINE3); - m_display.print("Slot: 1 Standby"); - } - else { - m_display.fillRect(0, OLED_LINE5, m_display.width(), 40, BLACK); - m_display.setCursor(0, OLED_LINE5); - m_display.print("Slot: 2 Standby"); - } - } - else { - m_display.fillRect(0, OLED_LINE2, m_display.width(), m_display.height(), BLACK); - m_display.setCursor(0,OLED_LINE3); - m_display.printf("Slot: %i Standby",slotNo); - } - - m_display.fillRect(0, OLED_LINE6, m_display.width(), 20, BLACK); - m_display.setCursor(0,OLED_LINE6); - m_display.printf("%s",m_ipaddress.c_str()); - m_display.display(); -} - -void COLED::writeFusionInt(const char* source, const char* dest, unsigned char dgid, const char* type, const char* origin) -{ - m_mode = MODE_YSF; - - m_display.clearDisplay(); - m_display.fillRect(0,OLED_LINE2,m_display.width(),m_display.height(),BLACK); - - m_display.setCursor(0,OLED_LINE4); - m_display.printf("%s %.10s", type, source); - - m_display.setCursor(0,OLED_LINE5); - m_display.printf(" DG-ID %u", dgid); - - OLED_statusbar(); - - m_display.display(); -} - -void COLED::clearFusionInt() -{ - m_display.fillRect(0, OLED_LINE2, m_display.width(), m_display.height(), BLACK); - - m_display.setCursor(40,OLED_LINE4); - m_display.print("Standby"); - - m_display.setCursor(0,OLED_LINE6); - m_display.printf("%s",m_ipaddress.c_str()); - - m_display.display(); -} - -void COLED::writeP25Int(const char* source, bool group, unsigned int dest, const char* type) -{ - m_mode = MODE_P25; - - m_display.clearDisplay(); - m_display.fillRect(0, OLED_LINE2, m_display.width(), m_display.height(), BLACK); - - m_display.setCursor(0,OLED_LINE3); - m_display.printf("%s %.10s", type, source); - - m_display.setCursor(0,OLED_LINE4); - m_display.printf(" %s%u", group ? "TG" : "", dest); - - OLED_statusbar(); - m_display.display(); -} - -void COLED::clearP25Int() -{ - m_display.fillRect(0, OLED_LINE2, m_display.width(), m_display.height(), BLACK); - - m_display.setCursor(40,OLED_LINE4); - m_display.print("Standby"); - - m_display.setCursor(0,OLED_LINE6); - m_display.printf("%s",m_ipaddress.c_str()); - - m_display.display(); -} - -void COLED::writeNXDNInt(const char* source, bool group, unsigned int dest, const char* type) -{ - CUserDBentry tmp; - - tmp.set(keyCALLSIGN, source); - writeNXDNIntEx(tmp, group, dest, type); -} - -int COLED::writeNXDNIntEx(const class CUserDBentry& source, bool group, unsigned int dest, const char* type) -{ - m_mode = MODE_NXDN; - - m_display.clearDisplay(); - m_display.fillRect(0, OLED_LINE2, m_display.width(), m_display.height(), BLACK); - - m_display.setCursor(0,OLED_LINE2); - m_display.printf("%s %s", type, CALLandNAME(source).c_str()); - - m_display.setCursor(0,OLED_LINE3); - m_display.printf(" %s%u", group ? "TG" : "", dest); - - m_display.setCursor(0,OLED_LINE4); - m_display.printf("%s",source.get(keyCITY).c_str()); - - m_display.setCursor(0,OLED_LINE5); - m_display.printf("%s",source.get(keySTATE).c_str()); - - m_display.setCursor(0,OLED_LINE6); - m_display.printf("%s",source.get(keyCOUNTRY).c_str()); - - OLED_statusbar(); - m_display.display(); - - // must be 0, to avoid calling writeNXDNInt() from CDisplay::writeNXDN() - return 0; -} - -void COLED::clearNXDNInt() -{ - m_display.fillRect(0, OLED_LINE2, m_display.width(), m_display.height(), BLACK); - - m_display.setCursor(40,OLED_LINE3); - m_display.print("Standby"); - - m_display.setCursor(0,OLED_LINE6); - m_display.printf("%s",m_ipaddress.c_str()); - - m_display.display(); -} - -void COLED::writeM17Int(const char* source, const char* dest, const char* type) -{ - m_mode = MODE_M17; - - m_display.clearDisplay(); - m_display.fillRect(0, OLED_LINE2, m_display.width(), m_display.height(), BLACK); - - m_display.setCursor(0,OLED_LINE3); - m_display.printf("from: %s %s", type, source); - - m_display.setCursor(0,OLED_LINE4); - m_display.printf("to: %s", dest); - - m_display.setCursor(0,OLED_LINE6); - m_display.printf("%s",m_ipaddress.c_str()); - - - OLED_statusbar(); - m_display.display(); -} - -void COLED::clearM17Int() -{ - m_display.fillRect(0, OLED_LINE2, m_display.width(), m_display.height(), BLACK); - - m_display.setCursor(40,OLED_LINE4); - m_display.print("Standby"); - - m_display.setCursor(0,OLED_LINE6); - m_display.printf("%s",m_ipaddress.c_str()); - - m_display.display(); -} - -void COLED::writePOCSAGInt(uint32_t ric, const std::string& message) -{ - int pos; - int length = message.length(); - std::string rublic; - - // extract rublic index "(xx-xx)" - switch (ric) { - case 4512U: - case 4520U: - if (length) { - std::string::size_type start = message.find("("); - std::string::size_type end = message.find(") "); - if (start != std::string::npos && end != std::string::npos) { - rublic = message.substr(start, end - start + 1); - pos = end + 2; - break; - } - } - /*FALLTHROUGH*/ - default: - rublic = ""; - pos = 0; - break; - } - - // remove double-quotation leading/trailing message - if (length && message.at(pos) == '\"' && message.at(length - 1) == '\"') { - pos++; - length--; - } - - m_mode = MODE_POCSAG; - - m_display.clearDisplay(); - m_display.fillRect(0, OLED_LINE2, m_display.width(), m_display.height(), BLACK); - - m_display.setCursor(0,OLED_LINE2); - m_display.printf("RIC: %u", ric); - if (!rublic.empty()) { - m_display.printf(" / %s", rublic.c_str()); - } - - m_display.setTextWrap(true); // text wrap temorally enable - m_display.setCursor(0,OLED_LINE3); - // no room to display "MSG: " header - - // due to limitation of AdaFruit_GFX::vprintf() (in ArduiPi_OLED), - // the maximum string length displayed by single printf() call is 63. - // to avoid this, divide POCSAG (max 80 chars) message into some pieces. - while (pos < length) { - int remain = length - pos; - int n = (remain < 40) ? remain : 40; - m_display.printf("%s", message.substr(pos, n).c_str()); - pos += n; - } - m_display.setTextWrap(false); - - OLED_statusbar(); - m_display.display(); -} - -void COLED::clearPOCSAGInt() -{ - m_display.fillRect(0, OLED_LINE2, m_display.width(), m_display.height(), BLACK); - - m_display.setCursor(40,OLED_LINE3); - m_display.print("Standby"); - - m_display.setCursor(0,OLED_LINE6); - m_display.printf("%s",m_ipaddress.c_str()); - - m_display.display(); -} - -void COLED::writeCWInt() -{ - m_display.clearDisplay(); - - m_display.setCursor(0,30); - m_display.setTextSize(3); - m_display.print("CW ID TX"); - - m_display.setTextSize(1); - m_display.display(); - if (m_displayScroll) - m_display.startscrollleft(0x02,0x0f); -} - -void COLED::clearCWInt() -{ - m_display.clearDisplay(); - - m_display.setCursor(0,OLED_LINE1); - m_display.setTextSize(2); - m_display.setTextSize(1); - m_display.print(" -IDLE-"); - m_display.setCursor(0,OLED_LINE3); - m_display.printf("%s",m_ipaddress.c_str()); - - if (m_displayScroll) - m_display.startscrolldiagleft(0x00,0x0f); - m_display.display(); - - -} - -void COLED::close() -{ - m_display.clearDisplay(); - m_display.fillRect(0, 0, m_display.width(), 16, BLACK); - if (m_displayScroll) - m_display.startscrollleft(0x00,0x01); - m_display.setCursor(0,OLED_LINE3); - m_display.setTextSize(2); - m_display.print(" -OFFLINE-"); - m_display.display(); - - m_display.close(); -} - -void COLED::OLED_statusbar() -{ - m_display.stopscroll(); - m_display.fillRect(0, 0, m_display.width(), 16, BLACK); - m_display.setTextColor(WHITE); - - m_display.setCursor(0,0); - if (m_mode == MODE_DMR) - m_display.drawBitmap(0, 0, logo_dmr_bmp, 128, 16, WHITE); - else if (m_mode == MODE_DSTAR) - m_display.drawBitmap(0, 0, logo_dstar_bmp, 128, 16, WHITE); - else if (m_mode == MODE_YSF) - m_display.drawBitmap(0, 0, logo_fusion_bmp, 128, 16, WHITE); - else if (m_mode == MODE_P25) - m_display.drawBitmap(0, 0, logo_P25_bmp, 128, 16, WHITE); - else if (m_mode == MODE_NXDN) - m_display.drawBitmap(0, 0, logo_NXDN_bmp, 128, 16, WHITE); - else if (m_mode == MODE_M17) - m_display.drawBitmap(0, 0, logo_M17_bmp, 128, 16, WHITE); - else if (m_mode == MODE_POCSAG) - m_display.drawBitmap(0, 0, logo_POCSAG_bmp, 128, 16, WHITE); - else if (m_displayLogoScreensaver) - m_display.drawBitmap(0, 0, logo_glcd_bmp, 128, 16, WHITE); - - if (m_displayScroll) - m_display.startscrollleft(0x00,0x01); -} diff --git a/OLED.h b/OLED.h deleted file mode 100644 index 14723cb..0000000 --- a/OLED.h +++ /dev/null @@ -1,103 +0,0 @@ -/* - * Copyright (C) 2016,2017,2018,2020 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 - * 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(OLED_H) -#define OLED_H - -#define OLED_STATUSBAR 0 -#define OLED_LINE1 8 //16 -#define OLED_LINE2 18 //26 -#define OLED_LINE3 28 //36 -#define OLED_LINE4 37 //46 -#define OLED_LINE5 47 //56 -#define OLED_LINE6 57 - -#include "Display.h" -#include "Defines.h" -#include "UserDBentry.h" - -#include -#include -#include - -#include "ArduiPi_OLED_lib.h" -#include "Adafruit_GFX.h" -#include "ArduiPi_OLED.h" -#include "NetworkInfo.h" - -class COLED : public CDisplay -{ -public: - COLED(unsigned char displayType, unsigned char displayBrighness, bool displayInvert, bool displayScroll, bool displayRotate, bool displayLogoScreensaver, bool duplex); - virtual ~COLED(); - - virtual bool open(); - - virtual void setIdleInt(); - - virtual void setErrorInt(const char* text); - virtual void setLockoutInt(); - virtual void setQuitInt(); - virtual void setFMInt(); - - virtual void writeDStarInt(const char* my1, const char* my2, const char* your, const char* type, const char* reflector); - virtual void clearDStarInt(); - - virtual void writeDMRInt(unsigned int slotNo, const std::string& src, bool group, const std::string& dst, const char* type); - virtual int writeDMRIntEx(unsigned int slotNo, const class CUserDBentry& src, bool group, const std::string& dst, const char* type); - virtual void clearDMRInt(unsigned int slotNo); - - virtual void writeFusionInt(const char* source, const char* dest, unsigned char dgid, const char* type, const char* origin); - virtual void clearFusionInt(); - - virtual void writeP25Int(const char* source, bool group, unsigned int dest, const char* type); - virtual void clearP25Int(); - - virtual void writeNXDNInt(const char* source, bool group, unsigned int dest, const char* type); - virtual int writeNXDNIntEx(const class CUserDBentry& source, bool group, unsigned int dest, const char* type); - virtual void clearNXDNInt(); - - virtual void writeM17Int(const char* source, const char* dest, const char* type); - virtual void clearM17Int(); - - virtual void writePOCSAGInt(uint32_t ric, const std::string& message); - virtual void clearPOCSAGInt(); - - virtual void writeCWInt(); - virtual void clearCWInt(); - - virtual void close(); - -private: - const char* m_slot1_state; - const char* m_slot2_state; - unsigned char m_mode; - unsigned char m_displayType; - unsigned char m_displayBrightness; - bool m_displayInvert; - bool m_displayScroll; - bool m_displayRotate; - bool m_displayLogoScreensaver; - bool m_duplex; - std::string m_ipaddress; - ArduiPi_OLED m_display; - - void OLED_statusbar(); -}; - -#endif diff --git a/OLED.md b/OLED.md deleted file mode 100644 index dc15703..0000000 --- a/OLED.md +++ /dev/null @@ -1,47 +0,0 @@ -# Prerequisite - -Enable I2C and SPI modules directly with raspi-config tool, issue a -``` -sudo raspi-config -``` - -Then go to menu Advanced Option, select SPI and under question ” Would you like the SPI kernel module to be loaded by default ?”, select Yes, Do the same thing for I2C Advanced Option. - -As I don’t use monitor or TV connected to Pi, I decreased dedicated video memory, always in raspi-config, go to Advanced Options then Memory Split, then type 16 Mo (the minimal) used for GPU, then select Finish, and select Yes when asked to reboot. - -To be able to compile you will need the compiler and some others tools, issue a : - -``` -sudo apt-get install build-essential git-core libi2c-dev i2c-tools lm-sensors wiringpi -``` -*italic* Sometimes I2C and SPI modules are not started and thus he cannot start the sample code. The solution to start the modules at startup by adding the two following lines into the file /etc/modules - -``` -i2c-dev -spidev -``` -Reboot, then you MUST see SPI and I2C devices with the following command - -``` -root@raspberrypi:~# ls /dev/i2c* -/dev/i2c-0 -root@raspberrypi:~# ls /dev/spi* -/dev/spidev0.0 /dev/spidev0.1 -``` -# Installation of the generic Driver - -The Driver is based on Adafruit Arduino library, I ported the code to be able to compile and run on Raspberry Pi but added also some features. - -Get all the file from github dedicated repo : -``` -git clone https://github.com/hallard/ArduiPi_OLED -cd ArduiPi_OLED -sudo make -``` - -# Building MMDVMHost -``` -make -f Makefile.Pi.OLED -``` - -The initial guide is written by [Charles](http://hallard.me/adafruit-oled-display-driver-for-pi/) diff --git a/README.HD44780 b/README.HD44780 deleted file mode 100644 index 35c2dea..0000000 --- a/README.HD44780 +++ /dev/null @@ -1,84 +0,0 @@ - - HD44780 LCD SUPPORT - - -Support for the HD44780 LCD is via the wiringPi library available at -http://wiringpi.com/download-and-install/ which must be installed in all cases. - -The HD44780 in 4-bit mode is probably the most common connection method and -wiring details can be found at http://wiringpi.com/dev-lib/lcd-library/ - -The setup that is commonly used for MMDVM is the 4-bit connection that is also -documented within wiringPi. The HD44780 displays have a standardized 16-pin -connector (14 pins if without backlight). The pin numbers on HD44780 refer to -this standard numbering. - -The pin numbers on Raspberry Pi side are the physical pin numbers of the GPIO -pin header, in brackets the wiringPi pin number as these are referred to in the -MMDVM.ini file. - -The wiring ist as follows: - - HD44780 pin Raspberry Pi GPIO - GND 1 -------- 6 GND - VCC 2 -------- 2 +5V - V0 3 -------- Trimmer between +5V and GND for contrast - RS 4 -------- 26 CE1 (11) - RW 5 -------- 6 GND - E 6 -------- 24 CE0 (10) - D0 7 - D1 8 - D2 9 - D3 10 - D4 11 -------- 11 GPIO0 (0) - D5 12 -------- 12 GPIO1 (1) - D6 13 -------- 13 GPIO2 (2) - D7 14 -------- 15 GPIO3 (3) - VCC 15 -------- 2 +5V - GND 16 -------- 6 GND - -The relevant part in the MMDVM.ini is like outlined below. - -[HD44780] -Rows=4 -Columns=20 - -# For basic HD44780 displays (4-bit connection) -# rs, strb, d0, d1, d2, d3 -Pins=11,10,0,1,2,3 - -To compile MMDVMHost with support for the HD44780 use the following commands. - -# make clean -# make -f Makefile.Pi.HD44780 - -Other HD44780 variations exist that connect via I2C. Support is also via -wiringPi, but to compile for each I2C device requires a different Makefile -depending on the IC attached to the LCD. - - - ADAFRUIT RGB LCD SHIELD - - -The Adafruit RGB LCD Shield is available from https://www.adafruit.com/product/714 -I2C is via the MCP23017 IC and is enabled with Makefile.Pi.Adafruit. The -I2C device address in MMDVM.ini should be set to 0x20. - - - PCF8574 IC - - -HD44780 LCDs connected via a PCF8574 Remote 8-Bit I/O Expander are available on -eBay for very little money! This IC uses Makefile.Pi.PCF8574 and the I2C -device address should be set to 0x27. - - - BEWARE - - - The I2C device address can be manually configured on some devices! - - - CHECK YOUR ACTUAL DEVICE ADDRESS - - -More information on configuring and using I2C on the RPi including how to probe -the I2C bus for device addresses can be found at -https://learn.sparkfun.com/tutorials/raspberry-pi-spi-and-i2c-tutorial#i2c-on-pi - - - PWM BACKLIGHT CONTROL - - -Whilst connected in 4-bit mode or via the PCF8574 IC, the LED backlight can be -wired for control via PWM. Connect the backlight +ve pin to any spare GPIO pin -and configure MMDVM.ini as appropriate. By default, wiringPi pin 21 is -configured. diff --git a/TFTSurenoo.cpp b/TFTSurenoo.cpp deleted file mode 100644 index af6c340..0000000 --- a/TFTSurenoo.cpp +++ /dev/null @@ -1,529 +0,0 @@ -/* - * Copyright (C) 2019 by SASANO Takayoshi JG1UAA - * Copyright (C) 2015,2016,2018,2019,2020 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 - * 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 "TFTSurenoo.h" -#include "Thread.h" -#include "Log.h" - -#include -#include -#include - -/* - * UART-TFT LCD Driver for Surenoo JC22-V05 (128x160) - * other Surenoo UART-LCD will be work, but display area is still 160x128 - * (tested with JC028-V03 240x320 module) - */ - -// x = 0 to 159, y = 0 to 127 - Landscape -// x = 0 to 127, y = 0 to 159 - Portrait -#define X_WIDTH 160 -#define Y_WIDTH 128 - -#define ROTATION_PORTRAIT 0 -#define ROTATION_LANDSCAPE 1 - -enum LcdColour { - COLOUR_BLACK, COLOUR_RED, COLOUR_GREEN, COLOUR_BLUE, - COLOUR_YELLOW, COLOUR_CYAN, COLOUR_MAGENTA, COLOUR_GREY, - COLOUR_DARK_GREY, COLOUR_DARK_RED, COLOUR_DARK_GREEN, COLOUR_DARK_BLUE, - COLOUR_DARK_YELLOW, COLOUR_DARK_CYAN, COLOUR_DARK_MAGENTA, COLOUR_WHITE -}; - -#define FONT_SMALL 16 // 8x16 -#define FONT_MEDIUM 24 // 12x24 -#define FONT_LARGE 32 // 16x32 - -#define INFO_COLOUR COLOUR_CYAN -#define EXT_COLOUR COLOUR_DARK_GREEN -#define BG_COLOUR COLOUR_BLACK -#define ERROR_COLOUR COLOUR_DARK_RED -#define MODE_COLOUR COLOUR_YELLOW - -// MODE_FONT_SIZE should be equal or larger than STATUS_FONT_SIZE -#define MODE_FONT_SIZE FONT_MEDIUM -#define STATUS_FONT_SIZE FONT_SMALL - -#define STATUS_MARGIN 32 // pixel - -#define MODE_CHARS (X_WIDTH / (MODE_FONT_SIZE / 2)) -#define STATUS_CHARS (X_WIDTH / (STATUS_FONT_SIZE / 2)) -#define STATUS_LINES ((Y_WIDTH - STATUS_MARGIN) / STATUS_FONT_SIZE) -#define statusLineOffset(x) ((STATUS_CHARS + 1) * ((x) + 1)) -#define statusLineNo(x) (x) -#define INFO_LINES statusLineNo(2) - -// This module sometimes ignores display command (too busy?), -// so supress display refresh -#define REFRESH_PERIOD 600 // msec - -#define STR_CRLF "\x0D\x0A" -#define STR_DMR "DMR" -#define STR_DSTAR "D-STAR" -#define STR_MMDVM "MMDVM" -#define STR_NXDN "NXDN" -#define STR_M17 "M17" -#define STR_P25 "P25" -#define STR_YSF "SystemFusion" - -CTFTSurenoo::CTFTSurenoo(const std::string& callsign, unsigned int dmrid, ISerialPort* serial, unsigned int brightness, bool duplex) : -CDisplay(), -m_callsign(callsign), -m_dmrid(dmrid), -m_serial(serial), -m_brightness(brightness), -m_mode(MODE_IDLE), -m_duplex(duplex), -//m_duplex(true), // uncomment to force duplex display for testing! -m_refresh(false), -m_refreshTimer(1000U, 0U, REFRESH_PERIOD), -m_lineBuf(NULL) -{ - assert(serial != NULL); - assert(brightness >= 0U && brightness <= 255U); -} - -CTFTSurenoo::~CTFTSurenoo() -{ -} - -bool CTFTSurenoo::open() -{ - bool ret = m_serial->open(); - if (!ret) { - LogError("Cannot open the port for the TFT Serial"); - delete m_serial; - return false; - } - - m_lineBuf = new char[statusLineOffset(STATUS_LINES)]; - if (m_lineBuf == NULL) { - LogError("Cannot allocate line buffer"); - m_serial->close(); - delete m_serial; - return false; - } - - lcdReset(); - clearScreen(BG_COLOUR); - setIdle(); - - m_refreshTimer.start(); - - return true; -} - -void CTFTSurenoo::setIdleInt() -{ - setModeLine(STR_MMDVM); - - ::snprintf(m_temp, sizeof(m_temp), "%s / %u", m_callsign.c_str(), m_dmrid); - setStatusLine(statusLineNo(0), m_temp); - setStatusLine(statusLineNo(1), "IDLE"); - - m_mode = MODE_IDLE; -} - -void CTFTSurenoo::setErrorInt(const char* text) -{ - assert(text != NULL); - - setModeLine(STR_MMDVM); - setStatusLine(statusLineNo(0), text); - setStatusLine(statusLineNo(1), "ERROR"); - - m_mode = MODE_ERROR; -} - -void CTFTSurenoo::setLockoutInt() -{ - setModeLine(STR_MMDVM); - setStatusLine(statusLineNo(1), "LOCKOUT"); - - m_mode = MODE_LOCKOUT; -} - -void CTFTSurenoo::setQuitInt() -{ - // m_refreshTimer has stopped, need delay here - CThread::sleep(REFRESH_PERIOD); - - setModeLine(STR_MMDVM); - setStatusLine(statusLineNo(1), "STOPPED"); - - refreshDisplay(); - - m_mode = MODE_QUIT; -} - -void CTFTSurenoo::setFMInt() -{ - setModeLine(STR_MMDVM); - setStatusLine(statusLineNo(1), "FM"); - - m_mode = MODE_FM; -} - -void CTFTSurenoo::writeDStarInt(const char* my1, const char* my2, const char* your, const char* type, const char* reflector) -{ - assert(my1 != NULL); - assert(my2 != NULL); - assert(your != NULL); - assert(type != NULL); - assert(reflector != NULL); - - setModeLine(STR_MMDVM); - - ::snprintf(m_temp, sizeof(m_temp), "%s %s/%s", type, my1, my2); - setStatusLine(statusLineNo(0), m_temp); - - ::snprintf(m_temp, sizeof(m_temp), "%s", your); - setStatusLine(statusLineNo(1), m_temp); - - if (::strcmp(reflector, " ") != 0) - ::snprintf(m_temp, sizeof(m_temp), "via %s", reflector); - else - ::strcpy(m_temp, ""); - setStatusLine(statusLineNo(2), m_temp); - - m_mode = MODE_DSTAR; -} - -void CTFTSurenoo::clearDStarInt() -{ - setStatusLine(statusLineNo(0), "Listening"); - for (int i = 1; i < STATUS_LINES; i++) - setStatusLine(statusLineNo(i), ""); -} - -void CTFTSurenoo::writeDMRInt(unsigned int slotNo, const std::string& src, bool group, const std::string& dst, const char* type) -{ - assert(type != NULL); - - if (m_mode != MODE_DMR) { - setModeLine(STR_DMR); - if (m_duplex) { - setStatusLine(statusLineNo(0), "Listening"); - setStatusLine(statusLineNo(1), "TS1"); - setStatusLine(statusLineNo(2), "Listening"); - setStatusLine(statusLineNo(3), "TS2"); - } - } - - int pos = m_duplex ? (slotNo - 1) : 0; - ::snprintf(m_temp, sizeof(m_temp), "%s %s", type, src.c_str()); - setStatusLine(statusLineNo(pos * 2), m_temp); - - ::snprintf(m_temp, sizeof(m_temp), "TS%d %s%s", slotNo, group ? "TG" : "", dst.c_str()); - setStatusLine(statusLineNo(pos * 2 + 1), m_temp); - - m_mode = MODE_DMR; -} - -int CTFTSurenoo::writeDMRIntEx(unsigned int slotNo, const class CUserDBentry& src, bool group, const std::string& dst, const char* type) -{ - assert(type != NULL); - - // duplex mode is not supported - if (m_duplex) - return -1; - - setModeLine(STR_DMR); - setStatusLine(statusLineNo(2), (src.get(keyFIRST_NAME) + " " + src.get(keyLAST_NAME)).c_str()); - setStatusLine(statusLineNo(3), src.get(keyCITY).c_str()); - setStatusLine(statusLineNo(4), src.get(keySTATE).c_str()); - setStatusLine(statusLineNo(5), src.get(keyCOUNTRY).c_str()); - - m_mode = MODE_DMR; - - return 1; -} - -void CTFTSurenoo::clearDMRInt(unsigned int slotNo) -{ - int pos = m_duplex ? (slotNo - 1) : 0; - setStatusLine(statusLineNo(pos * 2), "Listening"); - - if (m_duplex) { - ::snprintf(m_temp, sizeof(m_temp), "TS%d", slotNo); - setStatusLine(statusLineNo(pos * 2 + 1), m_temp); - } else { - for (int i = 1; i < STATUS_LINES; i++) - setStatusLine(statusLineNo(i), ""); - } -} - -void CTFTSurenoo::writeFusionInt(const char* source, const char* dest, unsigned char dgid, const char* type, const char* origin) -{ - assert(source != NULL); - assert(dest != NULL); - assert(type != NULL); - assert(origin != NULL); - - setModeLine(STR_YSF); - - ::snprintf(m_temp, sizeof(m_temp), "%s %s", type, source); - setStatusLine(statusLineNo(0), m_temp); - - ::snprintf(m_temp, sizeof(m_temp), "DG-ID %u", dgid); - setStatusLine(statusLineNo(1), m_temp); - - if (::strcmp(origin, " ") != 0) - ::snprintf(m_temp, sizeof(m_temp), "at %s", origin); - else - ::strcpy(m_temp, ""); - setStatusLine(statusLineNo(2), m_temp); - - m_mode = MODE_YSF; -} - -void CTFTSurenoo::clearFusionInt() -{ - clearDStarInt(); -} - -void CTFTSurenoo::writeP25Int(const char* source, bool group, unsigned int dest, const char* type) -{ - assert(source != NULL); - assert(type != NULL); - - setModeLine(STR_P25); - - ::snprintf(m_temp, sizeof(m_temp), "%s %s", type, source); - setStatusLine(statusLineNo(0), m_temp); - - ::snprintf(m_temp, sizeof(m_temp), "%s%u", group ? "TG" : "", dest); - setStatusLine(statusLineNo(1), m_temp); - - m_mode = MODE_P25; -} - -void CTFTSurenoo::clearP25Int() -{ - clearDStarInt(); -} - -void CTFTSurenoo::writeNXDNInt(const char* source, bool group, unsigned int dest, const char* type) -{ - assert(source != NULL); - assert(type != NULL); - - if (m_mode != MODE_NXDN) - setModeLine(STR_NXDN); - - ::snprintf(m_temp, sizeof(m_temp), "%s %s", type, source); - setStatusLine(statusLineNo(0), m_temp); - - ::snprintf(m_temp, sizeof(m_temp), "%s%u", group ? "TG" : "", dest); - setStatusLine(statusLineNo(1), m_temp); - - m_mode = MODE_NXDN; -} - -int CTFTSurenoo::writeNXDNIntEx(const class CUserDBentry& source, bool group, unsigned int dest, const char* type) -{ - assert(type != NULL); - - setModeLine(STR_NXDN); - setStatusLine(statusLineNo(2), (source.get(keyFIRST_NAME) + " " + source.get(keyLAST_NAME)).c_str()); - setStatusLine(statusLineNo(3), source.get(keyCITY).c_str()); - setStatusLine(statusLineNo(4), source.get(keySTATE).c_str()); - setStatusLine(statusLineNo(5), source.get(keyCOUNTRY).c_str()); - - m_mode = MODE_NXDN; - - return 1; -} - -void CTFTSurenoo::clearNXDNInt() -{ - clearDStarInt(); -} - -void CTFTSurenoo::writeM17Int(const char* source, const char* dest, const char* type) -{ - assert(source != NULL); - assert(dest != NULL); - assert(type != NULL); - - if (m_mode != MODE_M17) - setModeLine(STR_M17); - - ::snprintf(m_temp, sizeof(m_temp), "%s %s", type, source); - setStatusLine(statusLineNo(0), m_temp); - - ::snprintf(m_temp, sizeof(m_temp), "%s", dest); - setStatusLine(statusLineNo(1), m_temp); - - m_mode = MODE_M17; -} - -void CTFTSurenoo::clearM17Int() -{ - clearDStarInt(); -} - -void CTFTSurenoo::writePOCSAGInt(uint32_t ric, const std::string& message) -{ - setStatusLine(statusLineNo(1), "POCSAG TX"); - - m_mode = MODE_POCSAG; -} - -void CTFTSurenoo::clearPOCSAGInt() -{ - setStatusLine(statusLineNo(1), "IDLE"); -} - -void CTFTSurenoo::writeCWInt() -{ - setStatusLine(statusLineNo(1), "CW TX"); - - m_mode = MODE_CW; -} - -void CTFTSurenoo::clearCWInt() -{ - setStatusLine(statusLineNo(1), "IDLE"); -} - -void CTFTSurenoo::close() -{ - delete[] m_lineBuf; - - m_serial->close(); - delete m_serial; -} - -void CTFTSurenoo::clockInt(unsigned int ms) -{ - m_refreshTimer.clock(ms); // renew timer status - - if (m_refreshTimer.isRunning() && m_refreshTimer.hasExpired()) { - refreshDisplay(); - m_refreshTimer.start(); // reset timer, wait for next period - } -} - -void CTFTSurenoo::setLineBuffer(char *buf, const char *text, int maxchar) -{ - int i; - - for (i = 0; i < maxchar && text[i] != '\0'; i++) - buf[i] = text[i]; - buf[i] = '\0'; - - m_refresh = true; -} - -void CTFTSurenoo::setModeLine(const char *text) -{ - setLineBuffer(m_lineBuf, text, MODE_CHARS); - - // clear all status line - for (int i = 0; i < STATUS_LINES; i++) setStatusLine(i, ""); -} - -void CTFTSurenoo::setStatusLine(unsigned int line, const char *text) -{ - setLineBuffer(m_lineBuf + statusLineOffset(line), text, STATUS_CHARS); -} - -void CTFTSurenoo::refreshDisplay(void) -{ - if (!m_refresh) return; - - // send CR+LF to avoid first command is not processed - ::snprintf(m_temp, sizeof(m_temp), STR_CRLF); - m_serial->write((unsigned char*)m_temp, (unsigned int)::strlen(m_temp)); - - // config display - setRotation(ROTATION_LANDSCAPE); - setBrightness(m_brightness); - setBackground(BG_COLOUR); - m_serial->write((unsigned char*)m_temp, (unsigned int)::strlen(m_temp)); - CThread::sleep(5); - - // clear display - ::snprintf(m_temp, sizeof(m_temp), "BOXF(%d,%d,%d,%d,%d);", - 0, 0, X_WIDTH - 1, Y_WIDTH - 1, BG_COLOUR); - m_serial->write((unsigned char*)m_temp, ::strlen(m_temp)); - - // mode line - ::snprintf(m_temp, sizeof(m_temp), "DCV%d(%d,%d,'%s',%d);", - MODE_FONT_SIZE, 0, 0, m_lineBuf, MODE_COLOUR); - m_serial->write((unsigned char*)m_temp, (unsigned int)::strlen(m_temp)); - - // status line - for (int i = 0; i < STATUS_LINES; i++) { - char *p = m_lineBuf + statusLineOffset(i); - if (!::strlen(p)) continue; - - ::snprintf(m_temp, sizeof(m_temp), "DCV%d(%d,%d,'%s',%d);", - STATUS_FONT_SIZE, 0, - STATUS_MARGIN + STATUS_FONT_SIZE * i, p, - (!m_duplex && i >= INFO_LINES) ? EXT_COLOUR : INFO_COLOUR); - m_serial->write((unsigned char*)m_temp, (unsigned int)::strlen(m_temp)); - } - - // sending CR+LF finishes commands - ::snprintf(m_temp, sizeof(m_temp), STR_CRLF); - m_serial->write((unsigned char*)m_temp, (unsigned int)::strlen(m_temp)); - - m_refresh = false; -} - -void CTFTSurenoo::lcdReset(void) -{ - ::snprintf(m_temp, sizeof(m_temp), "RESET;" STR_CRLF); - m_serial->write((unsigned char*)m_temp, (unsigned int)::strlen(m_temp)); - CThread::sleep(250); // document says 230ms -} - -void CTFTSurenoo::clearScreen(unsigned char colour) -{ - assert(colour >= 0U && colour <= 63U); - - ::snprintf(m_temp, sizeof(m_temp), "CLR(%d);" STR_CRLF, colour); - m_serial->write((unsigned char*)m_temp, (unsigned int)::strlen(m_temp)); - CThread::sleep(100); // at least 60ms (@240x320 panel) -} - -void CTFTSurenoo::setBackground(unsigned char colour) -{ - assert(colour >= 0U && colour <= 63U); - - ::snprintf(m_temp, sizeof(m_temp), "SBC(%d);", colour); - m_serial->write((unsigned char*)m_temp, (unsigned int)::strlen(m_temp)); -} - -void CTFTSurenoo::setRotation(unsigned char rotation) -{ - assert(rotation >= 0U && rotation <= 1U); - - ::snprintf(m_temp, sizeof(m_temp), "DIR(%d);", rotation); - m_serial->write((unsigned char*)m_temp, (unsigned int)::strlen(m_temp)); -} - -void CTFTSurenoo::setBrightness(unsigned char brightness) -{ - assert(brightness >= 0U && brightness <= 255U); - - ::snprintf(m_temp, sizeof(m_temp), "BL(%d);", brightness); - m_serial->write((unsigned char*)m_temp, (unsigned int)::strlen(m_temp)); -} diff --git a/TFTSurenoo.h b/TFTSurenoo.h deleted file mode 100644 index 2e9abdb..0000000 --- a/TFTSurenoo.h +++ /dev/null @@ -1,99 +0,0 @@ -/* - * Copyright (C) 2019 by SASANO Takayoshi JG1UAA - * Copyright (C) 2015,2016,2018,2020 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 - * 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(TFTSURENOO_H) -#define TFTSURENOO_H - -#include "Display.h" -#include "Defines.h" -#include "SerialPort.h" -#include "UserDBentry.h" - -#include - -class CTFTSurenoo : public CDisplay -{ -public: - CTFTSurenoo(const std::string& callsign, unsigned int dmrid, ISerialPort* serial, unsigned int brightness, bool duplex); - virtual ~CTFTSurenoo(); - - virtual bool open(); - - virtual void close(); - -protected: - virtual void setIdleInt(); - virtual void setErrorInt(const char* text); - virtual void setLockoutInt(); - virtual void setQuitInt(); - virtual void setFMInt(); - - virtual void writeDStarInt(const char* my1, const char* my2, const char* your, const char* type, const char* reflector); - virtual void clearDStarInt(); - - virtual void writeDMRInt(unsigned int slotNo, const std::string& src, bool group, const std::string& dst, const char* type); - virtual int writeDMRIntEx(unsigned int slotNo, const class CUserDBentry& src, bool group, const std::string& dst, const char* type); - virtual void clearDMRInt(unsigned int slotNo); - - virtual void writeFusionInt(const char* source, const char* dest, unsigned char dgid, const char* type, const char* origin); - virtual void clearFusionInt(); - - virtual void writeP25Int(const char* source, bool group, unsigned int dest, const char* type); - virtual void clearP25Int(); - - virtual void writeNXDNInt(const char* source, bool group, unsigned int dest, const char* type); - virtual int writeNXDNIntEx(const class CUserDBentry& source, bool group, unsigned int dest, const char* type); - virtual void clearNXDNInt(); - - virtual void writeM17Int(const char* source, const char* dest, const char* type); - virtual void clearM17Int(); - - virtual void writePOCSAGInt(uint32_t ric, const std::string& message); - virtual void clearPOCSAGInt(); - - virtual void writeCWInt(); - virtual void clearCWInt(); - - virtual void clockInt(unsigned int ms); - -private: - std::string m_callsign; - unsigned int m_dmrid; - ISerialPort* m_serial; - unsigned int m_brightness; - unsigned char m_mode; - bool m_duplex; - bool m_refresh; - CTimer m_refreshTimer; - char* m_lineBuf; - char m_temp[128]; - - void setLineBuffer(char *buf, const char *text, int maxchar); - void setModeLine(const char *text); - void setStatusLine(unsigned int line, const char *text); - void refreshDisplay(void); - - void lcdReset(void); - void clearScreen(unsigned char colour); - void setBackground(unsigned char colour); - void setRotation(unsigned char rotation); - void setBrightness(unsigned char brightness); -}; - -#endif