Merge pull request #447 from shawnchain/refactor-display
Move display creation from main class to static CDisplay::create()
This commit is contained in:
commit
b194598f2a
173
Display.cpp
173
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<unsigned int> 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;
|
||||
}
|
|
@ -25,6 +25,10 @@
|
|||
|
||||
#include <cstdint>
|
||||
|
||||
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;
|
||||
|
|
169
MMDVMHost.cpp
169
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 <cstdio>
|
||||
#include <vector>
|
||||
|
||||
|
@ -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<unsigned int> 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);
|
||||
|
|
|
@ -92,7 +92,6 @@ private:
|
|||
bool createP25Network();
|
||||
bool createNXDNNetwork();
|
||||
bool createPOCSAGNetwork();
|
||||
void createDisplay();
|
||||
|
||||
void setMode(unsigned char mode);
|
||||
};
|
||||
|
|
Loading…
Reference in a new issue