diff --git a/Display.cpp b/Display.cpp index a2caec9..5e605b4 100644 --- a/Display.cpp +++ b/Display.cpp @@ -430,3 +430,176 @@ void CDisplay::writeNXDNRSSIInt(unsigned char rssi) void CDisplay::writeNXDNBERInt(float ber) { } + +/* Factory method extracted from MMDVMHost.cpp - BG5HHP */ +#include "SerialController.h" +#include "ModemSerialPort.h" +#include "TFTSerial.h" +#include "LCDproc.h" +#include "Nextion.h" +#include "NullDisplay.h" + +#include "Conf.h" +#include "Modem.h" +#include "UMP.h" + +#if defined(HD44780) +#include "HD44780.h" +#endif + +#if defined(OLED) +#include "OLED.h" +#endif + +CDisplay* CDisplay::createDisplay(const CConf &conf, CUMP *ump, 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 Serial") { + 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 CModemSerialPort(modem); + else + serial = new CSerialController(port, SERIAL_9600); + + display = new CTFTSerial(conf.getCallsign(), dmrid, serial, brightness); + } 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(); + + 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); + + 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 CModemSerialPort(modem); + display = new CNextion(conf.getCallsign(), dmrid, serial, brightness, displayClock, utc, idleBrightness, screenLayout); + } else if (port == "ump") { + if (ump != NULL) + display = new CNextion(conf.getCallsign(), dmrid, ump, brightness, displayClock, utc, idleBrightness, screenLayout); + else + display = new CNullDisplay; + } else { + SERIAL_SPEED baudrate = SERIAL_9600; + if (screenLayout==4U) + baudrate = SERIAL_115200; + ISerialPort* serial = new CSerialController(port, baudrate); + display = new CNextion(conf.getCallsign(), dmrid, serial, brightness, displayClock, utc, idleBrightness, screenLayout); + } + } 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"); + + m_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(); + display = new COLED(type, brightness, invert, scroll, conf.getDMRNetworkSlot1(), conf.getDMRNetworkSlot2()); +#endif + } else { + LogWarning("No valid display found, disabling"); + display = new CNullDisplay; + } + + bool ret = display->open(); + if (!ret) { + delete display; + display = new CNullDisplay; + } + return display; +} \ No newline at end of file diff --git a/Display.h b/Display.h index 4dc1b83..19af920 100644 --- a/Display.h +++ b/Display.h @@ -25,6 +25,10 @@ #include +class CConf; +class CModem; +class CUMP; + class CDisplay { public: @@ -72,6 +76,8 @@ public: void clock(unsigned int ms); + static CDisplay* createDisplay(const CConf &conf, CUMP *ump, CModem *modem); + protected: virtual void setIdleInt() = 0; virtual void setLockoutInt() = 0; diff --git a/MMDVMHost.cpp b/MMDVMHost.cpp index 8c1ea20..054d113 100644 --- a/MMDVMHost.cpp +++ b/MMDVMHost.cpp @@ -19,32 +19,19 @@ #include "MMDVMHost.h" #include "RSSIInterpolator.h" #include "SerialController.h" -#include "ModemSerialPort.h" #include "Version.h" #include "StopWatch.h" #include "Defines.h" #include "DStarControl.h" #include "DMRControl.h" -#include "TFTSerial.h" -#include "NullDisplay.h" #include "YSFControl.h" #include "P25Control.h" #include "NXDNControl.h" #include "POCSAGControl.h" -#include "Nextion.h" -#include "LCDproc.h" #include "Thread.h" #include "Log.h" #include "GitVersion.h" -#if defined(HD44780) -#include "HD44780.h" -#endif - -#if defined(OLED) -#include "OLED.h" -#endif - #include #include @@ -286,7 +273,7 @@ int CMMDVMHost::run() } } - createDisplay(); + m_display = CDisplay::createDisplay(m_conf,m_ump,m_modem); if (m_dstarEnabled && m_conf.getDStarNetworkEnabled()) { ret = createDStarNetwork(); @@ -1364,160 +1351,6 @@ void CMMDVMHost::readParams() LogInfo(" POCSAG: %s", m_pocsagEnabled ? "enabled" : "disabled"); } -void CMMDVMHost::createDisplay() -{ - std::string type = m_conf.getDisplay(); - unsigned int dmrid = m_conf.getDMRId(); - - LogInfo("Display Parameters"); - LogInfo(" Type: %s", type.c_str()); - - if (type == "TFT Serial") { - std::string port = m_conf.getTFTSerialPort(); - unsigned int brightness = m_conf.getTFTSerialBrightness(); - - LogInfo(" Port: %s", port.c_str()); - LogInfo(" Brightness: %u", brightness); - - ISerialPort* serial = NULL; - if (port == "modem") - serial = new CModemSerialPort(m_modem); - else - serial = new CSerialController(port, SERIAL_9600); - - m_display = new CTFTSerial(m_callsign, dmrid, serial, brightness); - } else if (type == "Nextion") { - std::string port = m_conf.getNextionPort(); - unsigned int brightness = m_conf.getNextionBrightness(); - bool displayClock = m_conf.getNextionDisplayClock(); - bool utc = m_conf.getNextionUTC(); - unsigned int idleBrightness = m_conf.getNextionIdleBrightness(); - unsigned int screenLayout = m_conf.getNextionScreenLayout(); - - 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); - - 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 CModemSerialPort(m_modem); - m_display = new CNextion(m_callsign, dmrid, serial, brightness, displayClock, utc, idleBrightness, screenLayout); - } else if (port == "ump") { - if (m_ump != NULL) - m_display = new CNextion(m_callsign, dmrid, m_ump, brightness, displayClock, utc, idleBrightness, screenLayout); - } else { - SERIAL_SPEED baudrate = SERIAL_9600; - if (screenLayout==4U) - baudrate = SERIAL_115200; - ISerialPort* serial = new CSerialController(port, baudrate); - m_display = new CNextion(m_callsign, dmrid, serial, brightness, displayClock, utc, idleBrightness, screenLayout); - } - } else if (type == "LCDproc") { - std::string address = m_conf.getLCDprocAddress(); - unsigned int port = m_conf.getLCDprocPort(); - unsigned int localPort = m_conf.getLCDprocLocalPort(); - bool displayClock = m_conf.getLCDprocDisplayClock(); - bool utc = m_conf.getLCDprocUTC(); - bool dimOnIdle = m_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"); - - m_display = new CLCDproc(address.c_str(), port, localPort, m_callsign, dmrid, displayClock, utc, m_duplex, dimOnIdle); -#if defined(HD44780) - } else if (type == "HD44780") { - unsigned int rows = m_conf.getHD44780Rows(); - unsigned int columns = m_conf.getHD44780Columns(); - std::vector pins = m_conf.getHD44780Pins(); - unsigned int i2cAddress = m_conf.getHD44780i2cAddress(); - bool pwm = m_conf.getHD44780PWM(); - unsigned int pwmPin = m_conf.getHD44780PWMPin(); - unsigned int pwmBright = m_conf.getHD44780PWMBright(); - unsigned int pwmDim = m_conf.getHD44780PWMDim(); - bool displayClock = m_conf.getHD44780DisplayClock(); - bool utc = m_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"); - - m_display = new CHD44780(rows, columns, m_callsign, dmrid, pins, i2cAddress, pwm, pwmPin, pwmBright, pwmDim, displayClock, utc, m_duplex); - } -#endif - -#if defined(OLED) - } else if (type == "OLED") { - unsigned char type = m_conf.getOLEDType(); - unsigned char brightness = m_conf.getOLEDBrightness(); - bool invert = m_conf.getOLEDInvert(); - bool scroll = m_conf.getOLEDScroll(); - m_display = new COLED(type, brightness, invert, scroll, m_conf.getDMRNetworkSlot1(), m_conf.getDMRNetworkSlot2()); -#endif - } else { - m_display = new CNullDisplay; - } - - if (m_display == NULL) { - LogWarning("No valid display found, disabling"); - m_display = new CNullDisplay; - return; - } - - bool ret = m_display->open(); - if (!ret) { - delete m_display; - m_display = new CNullDisplay; - } -} - void CMMDVMHost::setMode(unsigned char mode) { assert(m_modem != NULL); diff --git a/MMDVMHost.h b/MMDVMHost.h index c19623f..889fe69 100644 --- a/MMDVMHost.h +++ b/MMDVMHost.h @@ -92,7 +92,6 @@ private: bool createP25Network(); bool createNXDNNetwork(); bool createPOCSAGNetwork(); - void createDisplay(); void setMode(unsigned char mode); };