From eece693f0582b7fcec73ba5e0531df862174da27 Mon Sep 17 00:00:00 2001 From: Jonathan Naylor Date: Tue, 10 Nov 2020 10:08:59 +0000 Subject: [PATCH] Remove support for the Hobbytronics TFT display. --- Display.cpp | 10 +- MMDVMHost.vcxproj | 2 - MMDVMHost.vcxproj.filters | 6 - Makefile | 4 +- Makefile.Pi | 4 +- Makefile.Pi.Adafruit | 4 +- Makefile.Pi.HD44780 | 4 +- Makefile.Pi.OLED | 4 +- Makefile.Pi.PCF8574 | 4 +- README.md | 1 - TFTSerial.cpp | 630 -------------------------------------- TFTSerial.h | 92 ------ TFTSerial/DMR_sm.bmp | Bin 24054 -> 0 bytes TFTSerial/DStar_sm.bmp | Bin 24054 -> 0 bytes TFTSerial/M17_sm.bmp | Bin 24054 -> 0 bytes TFTSerial/MMDVM_sm.bmp | Bin 25494 -> 0 bytes TFTSerial/NXDN_sm.bmp | Bin 23574 -> 0 bytes TFTSerial/P25_sm.bmp | Bin 24054 -> 0 bytes TFTSerial/YSF_sm.bmp | Bin 24054 -> 0 bytes 19 files changed, 15 insertions(+), 750 deletions(-) delete mode 100644 TFTSerial.cpp delete mode 100644 TFTSerial.h delete mode 100644 TFTSerial/DMR_sm.bmp delete mode 100644 TFTSerial/DStar_sm.bmp delete mode 100644 TFTSerial/M17_sm.bmp delete mode 100644 TFTSerial/MMDVM_sm.bmp delete mode 100644 TFTSerial/NXDN_sm.bmp delete mode 100644 TFTSerial/P25_sm.bmp delete mode 100644 TFTSerial/YSF_sm.bmp diff --git a/Display.cpp b/Display.cpp index e26219f..7d4b1a9 100644 --- a/Display.cpp +++ b/Display.cpp @@ -21,7 +21,6 @@ #include "SerialController.h" #include "ModemSerialPort.h" #include "NullDisplay.h" -#include "TFTSerial.h" #include "TFTSurenoo.h" #include "LCDproc.h" #include "Nextion.h" @@ -546,7 +545,7 @@ CDisplay* CDisplay::createDisplay(const CConf& conf, IModem* modem) LogInfo("Display Parameters"); LogInfo(" Type: %s", type.c_str()); - if (type == "TFT Serial" || type == "TFT Surenoo") { + if (type == "TFT Surenoo") { std::string port = conf.getTFTSerialPort(); unsigned int brightness = conf.getTFTSerialBrightness(); @@ -557,12 +556,9 @@ CDisplay* CDisplay::createDisplay(const CConf& conf, IModem* modem) if (port == "modem") serial = new IModemSerialPort(modem); else - serial = new CSerialController(port, (type == "TFT Serial") ? 9600U : 115200U); + serial = new CSerialController(port, 115200U); - if (type == "TFT Surenoo") - display = new CTFTSurenoo(conf.getCallsign(), dmrid, serial, brightness, conf.getDuplex()); - else - display = new CTFTSerial(conf.getCallsign(), dmrid, serial, brightness); + display = new CTFTSurenoo(conf.getCallsign(), dmrid, serial, brightness, conf.getDuplex()); } else if (type == "Nextion") { std::string port = conf.getNextionPort(); unsigned int brightness = conf.getNextionBrightness(); diff --git a/MMDVMHost.vcxproj b/MMDVMHost.vcxproj index e68e630..f54bca0 100644 --- a/MMDVMHost.vcxproj +++ b/MMDVMHost.vcxproj @@ -246,7 +246,6 @@ - @@ -348,7 +347,6 @@ - diff --git a/MMDVMHost.vcxproj.filters b/MMDVMHost.vcxproj.filters index 5764b22..f9d3698 100644 --- a/MMDVMHost.vcxproj.filters +++ b/MMDVMHost.vcxproj.filters @@ -80,9 +80,6 @@ Header Files - - Header Files - Header Files @@ -397,9 +394,6 @@ Source Files - - Source Files - Source Files diff --git a/Makefile b/Makefile index adbd0a2..bd052ec 100644 --- a/Makefile +++ b/Makefile @@ -14,8 +14,8 @@ OBJECTS = \ Mutex.o NetworkInfo.o Nextion.o NullDisplay.o NullModem.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 SerialController.o SerialModem.o SerialPort.o StopWatch.o Sync.o TFTSerial.o TFTSurenoo.o Thread.o Timer.o UDPSocket.o \ - UserDB.o UserDBentry.o Utils.o YSFControl.o YSFConvolution.o YSFFICH.o YSFNetwork.o YSFPayload.o + RSSIInterpolator.o SerialController.o SerialModem.o SerialPort.o StopWatch.o Sync.o TFTSurenoo.o Thread.o Timer.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 b/Makefile.Pi index a25a1c0..c82bbbd 100644 --- a/Makefile.Pi +++ b/Makefile.Pi @@ -14,8 +14,8 @@ OBJECTS = \ Mutex.o NetworkInfo.o Nextion.o NullDisplay.o NullModem.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 SerialController.o SerialModem.o SerialPort.o StopWatch.o Sync.o TFTSerial.o TFTSurenoo.o Thread.o Timer.o UDPSocket.o \ - UserDB.o UserDBentry.o Utils.o YSFControl.o YSFConvolution.o YSFFICH.o YSFNetwork.o YSFPayload.o + RSSIInterpolator.o SerialController.o SerialModem.o SerialPort.o StopWatch.o Sync.o TFTSurenoo.o Thread.o Timer.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 index c747908..355c95d 100644 --- a/Makefile.Pi.Adafruit +++ b/Makefile.Pi.Adafruit @@ -15,8 +15,8 @@ OBJECTS = \ Mutex.o NetworkInfo.o Nextion.o NullDisplay.o NullModem.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 SerialController.o SerialModem.o SerialPort.o StopWatch.o Sync.o TFTSerial.o TFTSurenoo.o Thread.o Timer.o UDPSocket.o \ - UserDB.o UserDBentry.o Utils.o YSFControl.o YSFConvolution.o YSFFICH.o YSFNetwork.o YSFPayload.o + RSSIInterpolator.o SerialController.o SerialModem.o SerialPort.o StopWatch.o Sync.o TFTSurenoo.o Thread.o Timer.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.HD44780 b/Makefile.Pi.HD44780 index 99004d7..d4bbe63 100644 --- a/Makefile.Pi.HD44780 +++ b/Makefile.Pi.HD44780 @@ -14,8 +14,8 @@ OBJECTS = \ Mutex.o NetworkInfo.o Nextion.o NullDisplay.o NullModem.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 SerialController.o SerialModem.o SerialPort.o StopWatch.o Sync.o TFTSerial.o TFTSurenoo.o Thread.o Timer.o UDPSocket.o \ - UserDB.o UserDBentry.o Utils.o YSFControl.o YSFConvolution.o YSFFICH.o YSFNetwork.o YSFPayload.o + RSSIInterpolator.o SerialController.o SerialModem.o SerialPort.o StopWatch.o Sync.o TFTSurenoo.o Thread.o Timer.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.OLED b/Makefile.Pi.OLED index 14c4a48..3c9a487 100644 --- a/Makefile.Pi.OLED +++ b/Makefile.Pi.OLED @@ -18,8 +18,8 @@ OBJECTS = \ Mutex.o NetworkInfo.o Nextion.o NullDisplay.o NullModem.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 SerialController.o SerialModem.o SerialPort.o StopWatch.o Sync.o TFTSerial.o TFTSurenoo.o Thread.o Timer.o \ - UDPSocket.o UserDB.o UserDBentry.o Utils.o YSFControl.o YSFConvolution.o YSFFICH.o YSFNetwork.o YSFPayload.o + RS129.o RS241213.o RSSIInterpolator.o SerialController.o SerialModem.o SerialPort.o StopWatch.o Sync.o TFTSurenoo.o Thread.o Timer.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.PCF8574 b/Makefile.Pi.PCF8574 index d1675f6..0798819 100644 --- a/Makefile.Pi.PCF8574 +++ b/Makefile.Pi.PCF8574 @@ -15,8 +15,8 @@ OBJECTS = \ Mutex.o NetworkInfo.o Nextion.o NullDisplay.o NullModem.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 SerialController.o SerialModem.o SerialPort.o StopWatch.o Sync.o TFTSerial.o TFTSurenoo.o Thread.o Timer.o UDPSocket.o \ - UserDB.o UserDBentry.o Utils.o YSFControl.o YSFConvolution.o YSFFICH.o YSFNetwork.o YSFPayload.o + RSSIInterpolator.o SerialController.o SerialModem.o SerialPort.o StopWatch.o Sync.o TFTSurenoo.o Thread.o Timer.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/README.md b/README.md index a02236f..69f2e0a 100644 --- a/README.md +++ b/README.md @@ -23,7 +23,6 @@ these are: - Adafruit 16x2 LCD+Keypad Kits (I2C) - Connection via PCF8574 GPIO Extender (I2C) - Nextion TFTs (all sizes, both Basic and Enhanced versions) -- TFT display sold by Hobbytronics in UK - OLED 128x64 (SSD1306) - LCDproc diff --git a/TFTSerial.cpp b/TFTSerial.cpp deleted file mode 100644 index 2d0e9dc..0000000 --- a/TFTSerial.cpp +++ /dev/null @@ -1,630 +0,0 @@ -/* - * 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. - */ - -#include "TFTSerial.h" -#include "Log.h" - -#include -#include -#include - -const unsigned char ROTATION_PORTRAIT_LEFT = 0U; -const unsigned char ROTATION_LANDSCAPE_UD = 1U; -const unsigned char ROTATION_PORTRAIT_RIGHT = 2U; -const unsigned char ROTATION_LANDSCAPE = 3U; - -const unsigned char COLOUR_BLACK = 0U; -const unsigned char COLOUR_BLUE = 1U; -const unsigned char COLOUR_RED = 2U; -const unsigned char COLOUR_GREEN = 3U; -const unsigned char COLOUR_CYAN = 4U; -const unsigned char COLOUR_MAGENTA = 5U; -const unsigned char COLOUR_YELLOW = 6U; -const unsigned char COLOUR_WHITE = 7U; - -const unsigned char FONT_SMALL = 1U; -const unsigned char FONT_MEDIUM = 2U; -const unsigned char FONT_LARGE = 3U; - -// x = 0 to 159, y = 0 to 127 - Landscape -// x = 0 to 127, y = 0 to 159 - Portrait - -CTFTSerial::CTFTSerial(const std::string& callsign, unsigned int dmrid, ISerialPort* serial, unsigned int brightness) : -CDisplay(), -m_callsign(callsign), -m_dmrid(dmrid), -m_serial(serial), -m_brightness(brightness), -m_mode(MODE_IDLE) -{ - assert(serial != NULL); - assert(brightness >= 0U && brightness <= 100U); -} - -CTFTSerial::~CTFTSerial() -{ -} - -bool CTFTSerial::open() -{ - bool ret = m_serial->open(); - if (!ret) { - LogError("Cannot open the port for the TFT Serial"); - delete m_serial; - return false; - } - - setRotation(ROTATION_LANDSCAPE); - - setBrightness(m_brightness); - - setBackground(COLOUR_WHITE); - - setForeground(COLOUR_BLACK); - - setIdle(); - - return true; -} - -void CTFTSerial::setIdleInt() -{ - // Clear the screen - clearScreen(); - - setFontSize(FONT_LARGE); - - // Draw MMDVM logo - displayBitmap(0U, 0U, "MMDVM_sm.bmp"); - - char text[30]; - ::sprintf(text, "%-6s / %u", m_callsign.c_str(), m_dmrid); - - gotoPosPixel(18U, 55U); - displayText(text); - - gotoPosPixel(45U, 90U); - displayText("IDLE"); - - m_mode = MODE_IDLE; -} - -void CTFTSerial::setErrorInt(const char* text) -{ - assert(text != NULL); - - // Clear the screen - clearScreen(); - - setFontSize(FONT_MEDIUM); - - // Draw MMDVM logo - displayBitmap(0U, 0U, "MMDVM_sm.bmp"); - - setForeground(COLOUR_RED); - - gotoPosPixel(18U, 55U); - displayText(text); - - gotoPosPixel(18U, 90U); - displayText("ERROR"); - - setForeground(COLOUR_BLACK); - - m_mode = MODE_ERROR; -} - -void CTFTSerial::setLockoutInt() -{ - // Clear the screen - clearScreen(); - - setFontSize(FONT_LARGE); - - // Draw MMDVM logo - displayBitmap(0U, 0U, "MMDVM_sm.bmp"); - - gotoPosPixel(20U, 60U); - displayText("LOCKOUT"); - - m_mode = MODE_LOCKOUT; -} - -void CTFTSerial::setQuitInt() -{ - // Clear the screen - clearScreen(); - - setFontSize(FONT_LARGE); - - // Draw MMDVM logo - displayBitmap(0U, 0U, "MMDVM_sm.bmp"); - - gotoPosPixel(20U, 60U); - displayText("STOPPED"); - - m_mode = MODE_QUIT; -} - -void CTFTSerial::setFMInt() -{ - // Clear the screen - clearScreen(); - - setFontSize(FONT_LARGE); - - // Draw MMDVM logo - displayBitmap(0U, 0U, "MMDVM_sm.bmp"); - - gotoPosPixel(20U, 60U); - displayText("FM"); - - m_mode = MODE_FM; -} - -void CTFTSerial::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) { - // Clear the screen - clearScreen(); - - setFontSize(FONT_MEDIUM); - - // Draw D-Star insignia - displayBitmap(0U, 0U, "DStar_sm.bmp"); - } - - char text[30U]; - - ::sprintf(text, "%s %.8s/%4.4s", type, my1, my2); - gotoPosPixel(5U, 70U); - displayText(text); - - ::sprintf(text, "%.8s", your); - gotoPosPixel(5U, 90U); - displayText(text); - - if (::strcmp(reflector, " ") != 0) { - ::sprintf(text, "via %.8s", reflector); - gotoPosPixel(5U, 110U); - displayText(text); - } else { - gotoPosPixel(5U, 110U); - displayText(" "); - } - - m_mode = MODE_DSTAR; -} - -void CTFTSerial::clearDStarInt() -{ - gotoPosPixel(5U, 70U); - displayText(" Listening "); - - gotoPosPixel(5U, 90U); - displayText(" "); - - gotoPosPixel(5U, 110U); - displayText(" "); -} - -void CTFTSerial::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) { - // Clear the screen - clearScreen(); - - setFontSize(FONT_MEDIUM); - - // Draw DMR insignia - displayBitmap(0U, 0U, "DMR_sm.bmp"); - - if (slotNo == 1U) { - gotoPosPixel(5U, 90U); - displayText("2 Listening"); - } else { - gotoPosPixel(5U, 55U); - displayText("1 Listening"); - } - } - - if (slotNo == 1U) { - char text[30U]; - - ::sprintf(text, "1 %s %s", type, src.c_str()); - gotoPosPixel(5U, 55U); - displayText(text); - - ::sprintf(text, "%s%s", group ? "TG" : "", dst.c_str()); - gotoPosPixel(65U, 72U); - displayText(text); - } else { - char text[30U]; - - ::sprintf(text, "2 %s %s", type, src.c_str()); - gotoPosPixel(5U, 90U); - displayText(text); - - ::sprintf(text, "%s%s", group ? "TG" : "", dst.c_str()); - gotoPosPixel(65U, 107U); - displayText(text); - } - - m_mode = MODE_DMR; -} - -void CTFTSerial::clearDMRInt(unsigned int slotNo) -{ - if (slotNo == 1U) { - gotoPosPixel(5U, 55U); - displayText("1 Listening "); - - gotoPosPixel(65U, 72U); - displayText(" "); - } else { - gotoPosPixel(5U, 90U); - displayText("2 Listening "); - - gotoPosPixel(65U, 107U); - displayText(" "); - } -} - -void CTFTSerial::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) { - // Clear the screen - clearScreen(); - - setFontSize(FONT_MEDIUM); - - // Draw the System Fusion insignia - displayBitmap(0U, 0U, "YSF_sm.bmp"); - } - - char text[30U]; - ::sprintf(text, "%s %.10s", type, source); - - gotoPosPixel(5U, 70U); - displayText(text); - - ::sprintf(text, " DG-ID %u", dgid); - - gotoPosPixel(5U, 90U); - displayText(text); - - if (::strcmp(origin, " ") != 0) { - ::sprintf(text, "at %.10s", origin); - gotoPosPixel(5U, 110U); - displayText(text); - } else { - gotoPosPixel(5U, 110U); - displayText(" "); - } - - m_mode = MODE_YSF; -} - -void CTFTSerial::clearFusionInt() -{ - gotoPosPixel(5U, 70U); - displayText(" Listening "); - - gotoPosPixel(5U, 90U); - displayText(" "); - - gotoPosPixel(5U, 110U); - displayText(" "); -} - -void CTFTSerial::writeP25Int(const char* source, bool group, unsigned int dest, const char* type) -{ - assert(source != NULL); - assert(type != NULL); - - if (m_mode != MODE_P25) { - // Clear the screen - clearScreen(); - - setFontSize(FONT_MEDIUM); - - // Draw the P25 insignia - displayBitmap(0U, 0U, "P25_sm.bmp"); - } - - char text[30U]; - ::sprintf(text, "%s %.10s", type, source); - - gotoPosPixel(5U, 70U); - displayText(text); - - ::sprintf(text, " %s%u", group ? "TG" : "", dest); - - gotoPosPixel(5U, 90U); - displayText(text); - - m_mode = MODE_P25; -} - -void CTFTSerial::clearP25Int() -{ - gotoPosPixel(5U, 70U); - displayText(" Listening "); - - gotoPosPixel(5U, 90U); - displayText(" "); - - gotoPosPixel(5U, 110U); - displayText(" "); -} - -void CTFTSerial::writeNXDNInt(const char* source, bool group, unsigned int dest, const char* type) -{ - assert(source != NULL); - assert(type != NULL); - - if (m_mode != MODE_NXDN) { - // Clear the screen - clearScreen(); - - setFontSize(FONT_MEDIUM); - - // Draw the NXDN insignia - displayBitmap(0U, 0U, "NXDN_sm.bmp"); - } - - char text[30U]; - ::sprintf(text, "%s %.10s", type, source); - - gotoPosPixel(5U, 70U); - displayText(text); - - ::sprintf(text, " %s%u", group ? "TG" : "", dest); - - gotoPosPixel(5U, 90U); - displayText(text); - - m_mode = MODE_NXDN; -} - -void CTFTSerial::clearNXDNInt() -{ - gotoPosPixel(5U, 70U); - displayText(" Listening "); - - gotoPosPixel(5U, 90U); - displayText(" "); - - gotoPosPixel(5U, 110U); - displayText(" "); -} - -void CTFTSerial::writeM17Int(const char* source, const char* dest, const char* type) -{ - assert(source != NULL); - assert(dest != NULL); - assert(type != NULL); - - if (m_mode != MODE_M17) { - // Clear the screen - clearScreen(); - - setFontSize(FONT_MEDIUM); - - // Draw the M17 insignia - displayBitmap(0U, 0U, "M17_sm.bmp"); - } - - char text[30U]; - ::sprintf(text, "%s %.10s", type, source); - - gotoPosPixel(5U, 70U); - displayText(text); - - ::sprintf(text, " %s", dest); - - gotoPosPixel(5U, 90U); - displayText(text); - - m_mode = MODE_M17; -} - -void CTFTSerial::clearM17Int() -{ - gotoPosPixel(5U, 70U); - displayText(" Listening "); - - gotoPosPixel(5U, 90U); - displayText(" "); - - gotoPosPixel(5U, 110U); - displayText(" "); -} - -void CTFTSerial::writePOCSAGInt(uint32_t ric, const std::string& message) -{ - gotoPosPixel(15U, 90U); - displayText("POCSAG TX"); - - m_mode = MODE_CW; -} - -void CTFTSerial::clearPOCSAGInt() -{ - gotoPosPixel(45U, 90U); - displayText("IDLE"); -} - -void CTFTSerial::writeCWInt() -{ - gotoPosPixel(45U, 90U); - displayText("CW TX"); - - m_mode = MODE_CW; -} - -void CTFTSerial::clearCWInt() -{ - gotoPosPixel(45U, 90U); - displayText("IDLE"); -} - -void CTFTSerial::close() -{ - m_serial->close(); - delete m_serial; -} - -void CTFTSerial::clearScreen() -{ - m_serial->write((unsigned char*)"\x1B\x00\xFF", 3U); -} - -void CTFTSerial::setForeground(unsigned char colour) -{ - assert(colour >= 0U && colour <= 7U); - - m_serial->write((unsigned char*)"\x1B\x01", 2U); - m_serial->write(&colour, 1U); - m_serial->write((unsigned char*)"\xFF", 1U); -} - -void CTFTSerial::setBackground(unsigned char colour) -{ - assert(colour >= 0U && colour <= 7U); - - m_serial->write((unsigned char*)"\x1B\x02", 2U); - m_serial->write(&colour, 1U); - m_serial->write((unsigned char*)"\xFF", 1U); -} - -void CTFTSerial::setRotation(unsigned char rotation) -{ - assert(rotation >= 0U && rotation <= 3U); - - m_serial->write((unsigned char*)"\x1B\x03", 2U); - m_serial->write(&rotation, 1U); - m_serial->write((unsigned char*)"\xFF", 1U); -} - -void CTFTSerial::setFontSize(unsigned char size) -{ - assert(size >= 1U && size <= 3U); - - m_serial->write((unsigned char*)"\x1B\x04", 2U); - m_serial->write(&size, 1U); - m_serial->write((unsigned char*)"\xFF", 1U); -} - -void CTFTSerial::gotoBegOfLine() -{ - m_serial->write((unsigned char*)"\x1B\x05\xFF", 3U); -} - -void CTFTSerial::gotoPosText(unsigned char x, unsigned char y) -{ - m_serial->write((unsigned char*)"\x1B\x06", 2U); - m_serial->write(&x, 1U); - m_serial->write(&y, 1U); - m_serial->write((unsigned char*)"\xFF", 1U); -} - -void CTFTSerial::gotoPosPixel(unsigned char x, unsigned char y) -{ - m_serial->write((unsigned char*)"\x1B\x07", 2U); - m_serial->write(&x, 1U); - m_serial->write(&y, 1U); - m_serial->write((unsigned char*)"\xFF", 1U); -} - -void CTFTSerial::drawLine(unsigned char x1, unsigned char y1, unsigned char x2, unsigned char y2) -{ - m_serial->write((unsigned char*)"\x1B\x08", 2U); - m_serial->write(&x1, 1U); - m_serial->write(&y1, 1U); - m_serial->write(&x2, 1U); - m_serial->write(&y2, 1U); - m_serial->write((unsigned char*)"\xFF", 1U); -} - -void CTFTSerial::drawBox(unsigned char x1, unsigned char y1, unsigned char x2, unsigned char y2, bool filled) -{ - if (filled) - m_serial->write((unsigned char*)"\x1B\x0A", 2U); - else - m_serial->write((unsigned char*)"\x1B\x09", 2U); - - m_serial->write(&x1, 1U); - m_serial->write(&y1, 1U); - m_serial->write(&x2, 1U); - m_serial->write(&y2, 1U); - m_serial->write((unsigned char*)"\xFF", 1U); -} - -void CTFTSerial::drawCircle(unsigned char x, unsigned char y, unsigned char radius, bool filled) -{ - if (filled) - m_serial->write((unsigned char*)"\x1B\x0C", 2U); - else - m_serial->write((unsigned char*)"\x1B\x0B", 2U); - - m_serial->write(&x, 1U); - m_serial->write(&y, 1U); - m_serial->write(&radius, 1U); - m_serial->write((unsigned char*)"\xFF", 1U); -} - -void CTFTSerial::displayBitmap(unsigned char x, unsigned char y, const char* filename) -{ - assert(filename != NULL); - - m_serial->write((unsigned char*)"\x1B\x0D", 2U); - m_serial->write(&x, 1U); - m_serial->write(&y, 1U); - m_serial->write((unsigned char*)filename, (unsigned int)::strlen(filename)); - m_serial->write((unsigned char*)"\xFF", 1U); -} - -void CTFTSerial::setBrightness(unsigned char brightness) -{ - assert(brightness >= 0U && brightness <= 100U); - - m_serial->write((unsigned char*)"\x1B\x0E", 2U); - m_serial->write(&brightness, 1U); - m_serial->write((unsigned char*)"\xFF", 1U); -} - -void CTFTSerial::displayText(const char* text) -{ - assert(text != NULL); - - m_serial->write((unsigned char*)text, (unsigned int)::strlen(text)); -} diff --git a/TFTSerial.h b/TFTSerial.h deleted file mode 100644 index 86d4130..0000000 --- a/TFTSerial.h +++ /dev/null @@ -1,92 +0,0 @@ -/* - * 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(TFTSERIAL_H) -#define TFTSERIAL_H - -#include "Display.h" -#include "Defines.h" -#include "SerialPort.h" - -#include - -class CTFTSerial : public CDisplay -{ -public: - CTFTSerial(const std::string& callsign, unsigned int dmrid, ISerialPort* serial, unsigned int brightness); - virtual ~CTFTSerial(); - - 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: - std::string m_callsign; - unsigned int m_dmrid; - ISerialPort* m_serial; - unsigned int m_brightness; - unsigned char m_mode; - - void clearScreen(); - void setBackground(unsigned char colour); - void setForeground(unsigned char colour); - void setRotation(unsigned char rotation); - void setFontSize(unsigned char size); - void gotoBegOfLine(); - void gotoPosText(unsigned char x, unsigned char y); - void gotoPosPixel(unsigned char x, unsigned char y); - void drawLine(unsigned char x1, unsigned char y1, unsigned char x2, unsigned char y2); - void drawBox(unsigned char x1, unsigned char y1, unsigned char x2, unsigned char y2, bool filled); - void drawCircle(unsigned char x, unsigned char y, unsigned char radius, bool filled); - void displayBitmap(unsigned char x, unsigned char y, const char* filename); - void setBrightness(unsigned char brightness); - void displayText(const char* text); -}; - -#endif diff --git a/TFTSerial/DMR_sm.bmp b/TFTSerial/DMR_sm.bmp deleted file mode 100644 index 2fae46a3c491253e54cf05c22140722c0475c53a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24054 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 diff --git a/TFTSerial/DStar_sm.bmp b/TFTSerial/DStar_sm.bmp deleted file mode 100644 index f4e2afc1982b92f99f9fba2ee3b1fc9ff86ee394..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24054 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 diff --git a/TFTSerial/MMDVM_sm.bmp b/TFTSerial/MMDVM_sm.bmp deleted file mode 100644 index 674d1c6360b1b6adb7f9296af3121cb3c0c3cca3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25494 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 diff --git a/TFTSerial/NXDN_sm.bmp b/TFTSerial/NXDN_sm.bmp deleted file mode 100644 index 30420d87fc103c16695e4786c48af97583df7c27..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23574 zcmeHOXN*o;6g4D7jZV}E(G$J*r-tZ6@1hH$L??(|Lv*4OB3g(N3DJJ&f+z{2cR}>_ z-r^)@&g^r~y7#+Y=Er;YOJ-)Dz1LcM-}8OVc>Sq8^BPAnJktN)LSh z{yhmU<(_mYQGl~&&k}iG zk;|7a6Z-V&(|r|u0Yo2fAE(!11yLISKjONXoo3ge&Y}hcDe%`!!ZM^Am5w-v6)2Ajr zgnjDNDXnH3L~!%w%{E?mmM>o}6msTN+a3a#(8QOupr~e}MvW3cUe=K#M+DIe71FnF z-##I(n~xqnBBCEYe9%Z?@SaziqeqVxtPo97-o}j^U4rGymnTFODpI6~P0yDvA18kM z_RVH-3ZgcpNs}hNtl)qF0|wYBlqX}xj4qw2Q>VIEZQ8VPv9v#R>eMcJaDTUM-L#-E zN|!F}(h*2k)AN2TSg@cAulyqEty{M^zG1_Lf`aDJqenR_)@XwU4eTuNOqw*wC55jf zPYRqaityjQecPoF(0}F16`^T1fByVw>#SV4(!>yZ_Uzd<9Uk1;goTjFnmlPx9o+O-<8Yx^$_nR=jv|6GQCW zxpUie&J>r2wO;qd|;ImoC`~ zF?sIXxkD0(LE!xP^9k4vjUPXr6jQO{ucJk-SN81LeZNMxZrw`sUCPSuB4U*zCL&+M zxq0)ZnP}(Eom^Z*yL9Pd(!<$gb!f(n8Kx$tb)o>?#L9+Ax9#fHt8)b&wFONNzZo%2 zHo>M%Rt8Ydh!G=9Fzlj5f1Q8xeD&+s&jg29dok(Z>~Z79dDaFeCaqc%_p%E{{P*wQ z*9x9SojP?0orJ_HnJv!8-Zg91v?R%HU&86U=2jqbE+BFcm`B7-M)UE9c9X zFO?=HbOh!K4H+`Tx1{>@>$~X0zk2m*Uu80SgfgK|n>LN49y4Z);1ck;bLSLz!-fq6 z<_fun3Zeks%$6;iOMmRxv5HIP@-D9O^VBLDVnrf|ES{yLHnN5TaY95$WUo-6f(zfN zQzr$+l7b7v{UTS0=B!z>Tq*GF3_*U6^DnHcSFZ*siHnHxiWMssMDy9RXM$)pOO+}` zMB27(Yl4L>)-AVf+a>^JQ)Mwd!meGrHfDvwshj)v?IPD zZX_Sh9zA*lsR5Xd9Xo1GZme0eCZHzY+8`o)3$JqJ%7RM@K7aoFx^?Ra0MoA4ty{YQ z7@~+=A(~|65TocEIdZtN!;f^UR;}WIfF+eIS(51J(6VLA0t!xwM90RP z9zm>Ix2_pA?cTk6SE*9P^avYL*d-B8vng_gXkxX>6bx?n>C;E0Bb3vpPX{cCh=>qI ztwA)g^C*aB6Fd7vgg>Hp?b>B>4;(mPDhIbQyi_`b!e{zs8N?>~B!u-nrAgK+uwz2< z>d>)c$4DYOgolRa5+i^9{5Ds6#2SvNgM%mPZ*r~TgFw@#fukRTwlNMgPIT9T!&#ke*DN&>%|{^ zQ5#;aGa6cRHUQWd$2`3$sY&z?AEg{K6bkX5TzB`M6%yLa#G zD>4Dx#wN8*A3AiXi-lDP8y~BuY15`IebbNqSx@DYCr_F%VS7^G#L)|$iImPoX#^;2yVv6GYv#3fpalXh`>e{ty8ZV5A6DPXpY0{(-;1ErG@4NJs zA1gvcmLJQ+UWVZE%~oW*d-txOpvm`!z_Rb+;Aa>4^yR!{T6e4z^LcJNV7;BEaXyRUC87r8>dfQ z3cg%h&Gxv&mH+eS&o;&MU@YoV5X*YL$9~F|Eo&+Z+xM1SxNxCKiD{SFz64Cr#F05u z+_W=i&TP}Q2P>Z@*tT(cT!U@H#>eWx_ZObh*t!+3u3fthA3oey?ZJZw*i#T()ojtC z1)1GUDd1lZ%*Q)!d6Lc+!J-Ntw%AVc>Sq8^BPAnJjr2cjN`dLZh7 Ks0aSfJ@5}d(?}!$ diff --git a/TFTSerial/P25_sm.bmp b/TFTSerial/P25_sm.bmp deleted file mode 100644 index 5ba24f609b837d732147cbb0704ec38d481ab7d8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24054 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