diff --git a/Conf.cpp b/Conf.cpp index af56965..b1f5469 100644 --- a/Conf.cpp +++ b/Conf.cpp @@ -37,7 +37,8 @@ enum SECTION { SECTION_DSTAR_NETWORK, SECTION_DMR_NETWORK, SECTION_FUSION_NETWORK, - SECTION_TFTSERIAL + SECTION_TFTSERIAL, + SECTION_HD44780 }; CConf::CConf(const std::string& file) : @@ -93,7 +94,9 @@ m_fusionNetworkAddress(), m_fusionNetworkPort(0U), m_fusionNetworkDebug(false), m_tftSerialPort(), -m_tftSerialBrightness(50U) +m_tftSerialBrightness(50U), +m_hd44780Rows(2U), +m_hd44780Columns(16U) { } @@ -137,9 +140,11 @@ bool CConf::read() section = SECTION_DMR_NETWORK; else if (::strncmp(buffer, "[System Fusion Network]", 23U) == 0) section = SECTION_FUSION_NETWORK; - else if (::strncmp(buffer, "[TFT Serial]", 11U) == 0) + else if (::strncmp(buffer, "[TFT Serial]", 12U) == 0) section = SECTION_TFTSERIAL; - else + else if (::strncmp(buffer, "[HD44780]", 9U) == 0) + section = SECTION_HD44780; + else section = SECTION_NONE; continue; @@ -265,6 +270,11 @@ bool CConf::read() m_tftSerialPort = value; else if (::strcmp(key, "Brightness") == 0) m_tftSerialBrightness = (unsigned int)::atoi(value); + } else if (section == SECTION_HD44780) { + if (::strcmp(key, "Rows") == 0) + m_hd44780Rows = (unsigned int)::atoi(value); + else if (::strcmp(key, "Columns") == 0) + m_hd44780Columns = (unsigned int)::atoi(value); } } @@ -532,3 +542,13 @@ unsigned int CConf::getTFTSerialBrightness() const { return m_tftSerialBrightness; } + +unsigned int CConf::getHD44780Rows() const +{ + return m_hd44780Rows; +} + +unsigned int CConf::getHD44780Columns() const +{ + return m_hd44780Columns; +} diff --git a/Conf.h b/Conf.h index cd2e188..ce59e71 100644 --- a/Conf.h +++ b/Conf.h @@ -103,6 +103,10 @@ public: std::string getTFTSerialPort() const; unsigned int getTFTSerialBrightness() const; + // The HD44780 section + unsigned int getHD44780Rows() const; + unsigned int getHD44780Columns() const; + private: std::string m_file; std::string m_callsign; @@ -167,6 +171,9 @@ private: std::string m_tftSerialPort; unsigned int m_tftSerialBrightness; + + unsigned int m_hd44780Rows; + unsigned int m_hd44780Columns; }; #endif diff --git a/HD44780.cpp b/HD44780.cpp new file mode 100644 index 0000000..6256763 --- /dev/null +++ b/HD44780.cpp @@ -0,0 +1,162 @@ +/* + * Copyright (C) 2016 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(RASPBERRY_PI) + +#include "HD44780.h" +#include "Log.h" + +#include +#include + +#include +#include + +CHD44780::CHD44780(unsigned int rows, unsigned int cols) : +m_rows(rows), +m_cols(cols), +m_fd(-1) +{ +} + +CHD44780::~CHD44780() +{ +} + +bool CHD44780::open() +{ + m_fd = ::lcdInit(m_rows, m_cols, 4, 11, 10, 0, 1, 2, 3, 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); + + return true; +} + +void CHD44780::setIdle() +{ + ::lcdClear(m_fd); + + ::lcdPosition(m_fd, 0, 0); + ::lcdPuts(m_fd, "MMDVM"); + + ::lcdPosition(m_fd, 0, 1); + ::lcdPuts(m_fd, "Idle"); +} + +void CHD44780::setLockout() +{ + ::lcdClear(m_fd); + + ::lcdPosition(m_fd, 0, 0); + ::lcdPuts(m_fd, "MMDVM"); + + ::lcdPosition(m_fd, 0, 1); + ::lcdPuts(m_fd, "Lockout"); +} + +void CHD44780::setDStar() +{ + ::lcdClear(m_fd); + + ::lcdPosition(m_fd, 0, 0); + ::lcdPuts(m_fd, "D-Star"); + + ::lcdPosition(m_fd, 0, 1); + ::lcdPuts(m_fd, "Listening"); +} + +void CHD44780::writeDStar(const char* my1, const char* my2, const char* your) +{ + ::lcdPosition(m_fd, 0, 1); + ::lcdPrintf(m_fd, "%s/%s > %s", my1, my2, your); +} + +void CHD44780::clearDStar() +{ + ::lcdPosition(m_fd, 0, 1); + ::lcdPuts(m_fd, "Listening "); +} + +void CHD44780::setDMR() +{ + ::lcdClear(m_fd); + + ::lcdPosition(m_fd, 0, 0); + ::lcdPuts(m_fd, "1 DMR Listening"); + + ::lcdPosition(m_fd, 0, 1); + ::lcdPuts(m_fd, "2 DMR Listening"); +} + +void CHD44780::writeDMR(unsigned int slotNo, unsigned int srcId, bool group, unsigned int dstId, const char* type) +{ + if (slotNo == 1U) { + ::lcdPosition(m_fd, 0, 0); + ::lcdPrintf(m_fd, "1 %s %u > %s%u", type, srcId, group ? "TG" : "", dstId); + } + else { + ::lcdPosition(m_fd, 0, 1); + ::lcdPrintf(m_fd, "2 %s %u > %s%u", type, srcId, group ? "TG" : "", dstId); + } +} + +void CHD44780::clearDMR(unsigned int slotNo) +{ + if (slotNo == 1U) { + ::lcdPosition(m_fd, 0, 0); + ::lcdPuts(m_fd, "1 Listening "); + } else { + ::lcdPosition(m_fd, 0, 1); + ::lcdPuts(m_fd, "2 Listening "); + } +} + +void CHD44780::setFusion() +{ + ::lcdClear(m_fd); + + ::lcdPosition(m_fd, 0, 0); + ::lcdPuts(m_fd, "System Fusion"); + + ::lcdPosition(m_fd, 0, 1); + ::lcdPuts(m_fd, "Listening"); +} + +void CHD44780::writeFusion(const char* source, const char* dest) +{ + ::lcdPosition(m_fd, 0, 1); + ::lcdPrintf(m_fd, "%s > %s", source, dest); +} + +void CHD44780::clearFusion() +{ + ::lcdPosition(m_fd, 0, 1); + ::lcdPuts(m_fd, "Listening "); +} + +void CHD44780::close() +{ +} + +#endif diff --git a/HD44780.h b/HD44780.h new file mode 100644 index 0000000..e0ae11e --- /dev/null +++ b/HD44780.h @@ -0,0 +1,62 @@ +/* + * Copyright (C) 2016 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(HD44780_H) +#define HD44780_H + +#if defined(RASPBERRY_PI) + +#include "Display.h" + +#include + +class CHD44780 : public IDisplay +{ +public: + CHD44780(unsigned int rows, unsigned int cols); + virtual ~CHD44780(); + + virtual bool open(); + + virtual void setIdle(); + + virtual void setLockout(); + + virtual void setDStar(); + virtual void writeDStar(const char* my1, const char* my2, const char* your); + virtual void clearDStar(); + + virtual void setDMR(); + virtual void writeDMR(unsigned int slotNo, unsigned int srdId, bool group, unsigned int dstId, const char* type); + virtual void clearDMR(unsigned int slotNo); + + virtual void setFusion(); + virtual void writeFusion(const char* source, const char* dest); + virtual void clearFusion(); + + virtual void close(); + +private: + unsigned int m_rows; + unsigned int m_cols; + int m_fd; +}; + +#endif + +#endif diff --git a/MMDVM.ini b/MMDVM.ini index fbc5150..e95036e 100644 --- a/MMDVM.ini +++ b/MMDVM.ini @@ -73,3 +73,7 @@ Debug=1 [TFT Serial] Port=/dev/ttyAMA0 Brightness=50 + +[HD44780] +Rows=2 +Columns=16 diff --git a/MMDVMHost.cpp b/MMDVMHost.cpp index d0c720d..3b4fa7f 100644 --- a/MMDVMHost.cpp +++ b/MMDVMHost.cpp @@ -27,6 +27,10 @@ #include "NullDisplay.h" #include "YSFControl.h" +#if defined(RASPBERRY_PI) +#include "HD44780.h" +#endif + #include #if !defined(_WIN32) && !defined(_WIN64) @@ -539,13 +543,23 @@ void CMMDVMHost::createDisplay() LogInfo(" Type: %s", type.c_str()); if (type == "TFT Serial") { - std::string port = m_conf.getTFTSerialPort(); + std::string port = m_conf.getTFTSerialPort(); unsigned int brightness = m_conf.getTFTSerialBrightness(); LogInfo(" Port: %s", port.c_str()); LogInfo(" Brightness: %u", brightness); m_display = new CTFTSerial(port, brightness); +#if defined(RASPBERRY_PI) + } else if (type == "HD44780") { + unsigned int rows = m_conf.getHD44780Rows(); + unsigned int columns = m_conf.getHD44780Columns(); + + LogInfo(" Rows: %u", rows); + LogInfo(" Columns: %u", columns); + + m_display = new CHD44780(rows, columns); +#endif } else { m_display = new CNullDisplay; } diff --git a/Makefile b/Makefile index 7331e31..1e031aa 100644 --- a/Makefile +++ b/Makefile @@ -6,9 +6,9 @@ LDFLAGS = -g OBJECTS = \ AMBEFEC.o BPTC19696.o Conf.o CRC.o Display.o DMRControl.o DMRCSBK.o DMRData.o DMRDataHeader.o DMREMB.o DMREmbeddedLC.o DMRFullLC.o DMRIPSC.o DMRLC.o DMRShortLC.o \ - DMRSlot.o DMRSlotType.o DStarControl.o DStarHeader.o DStarNetwork.o DStarSlowData.o Golay2087.o Golay24128.o Hamming.o Log.o MMDVMHost.o Modem.o NullDisplay.o \ - QR1676.o RS129.o SerialController.o SHA256.o StopWatch.o Sync.o TFTSerial.o Timer.o Trellis.o UDPSocket.o Utils.o YSFControl.o YSFConvolution.o YSFFICH.o \ - YSFParrot.o YSFPayload.o + DMRSlot.o DMRSlotType.o DStarControl.o DStarHeader.o DStarNetwork.o DStarSlowData.o Golay2087.o Golay24128.o Hamming.o HD44780.o Log.o MMDVMHost.o Modem.o \ + NullDisplay.o QR1676.o RS129.o SerialController.o SHA256.o StopWatch.o Sync.o TFTSerial.o Timer.o Trellis.o UDPSocket.o Utils.o YSFControl.o YSFConvolution.o \ + YSFFICH.o YSFParrot.o YSFPayload.o all: MMDVMHost