From ead41ba9a57b21e8d008af9cc0742092008a9a24 Mon Sep 17 00:00:00 2001 From: SASANO Takayoshi Date: Fri, 28 Feb 2020 04:53:14 +0900 Subject: [PATCH 1/2] Simplify DMR status display Old DMR status display takes 4 lines i.e.: 1 Listening (unused line here) 2 N Callsign TGxx To make room for display area for future development, DMR status display are changed to 2-lines style like this: N Callsign TS2 TGxx And, added three small changes: - use statusLine() macro to change layout easily - use two -> three colors yellow: radio mode (DMR, YSF, etc) cyan: main status (callsign, TG/Timeslot) dark green: additional information (D* reflector etc) *NEW* - rename statusLine_offset() -> statusLineOffset() --- TFTSurenoo.cpp | 86 +++++++++++++++++++++++--------------------------- 1 file changed, 39 insertions(+), 47 deletions(-) diff --git a/TFTSurenoo.cpp b/TFTSurenoo.cpp index 6f253cc..b984437 100644 --- a/TFTSurenoo.cpp +++ b/TFTSurenoo.cpp @@ -49,7 +49,8 @@ enum LcdColour { #define FONT_MEDIUM 24 // 12x24 #define FONT_LARGE 32 // 16x32 -#define FG_COLOUR COLOUR_CYAN +#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 @@ -63,7 +64,9 @@ enum LcdColour { #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 statusLine_offset(x) ((STATUS_CHARS + 1) * ((x) + 1)) +#define statusLineOffset(x) ((STATUS_CHARS + 1) * ((x) + 1)) +#define statusLineNo(x) ((x) * 2) +#define INFO_LINES statusLineNo(2) // This module sometimes ignores display command (too busy?), // so supress display refresh @@ -105,7 +108,7 @@ bool CTFTSurenoo::open() return false; } - m_lineBuf = new char[statusLine_offset(STATUS_LINES)]; + m_lineBuf = new char[statusLineOffset(STATUS_LINES)]; if (m_lineBuf == NULL) { LogError("Cannot allocate line buffer"); m_serial->close(); @@ -131,8 +134,8 @@ void CTFTSurenoo::setIdleInt() setModeLine(STR_MMDVM); ::snprintf(m_temp, sizeof(m_temp), "%-6s / %u", m_callsign.c_str(), m_dmrid); - setStatusLine(0, m_temp); - setStatusLine(2, "IDLE"); + setStatusLine(statusLineNo(0), m_temp); + setStatusLine(statusLineNo(1), "IDLE"); m_mode = MODE_IDLE; } @@ -142,8 +145,8 @@ void CTFTSurenoo::setErrorInt(const char* text) assert(text != NULL); setModeLine(STR_MMDVM); - setStatusLine(0, text); - setStatusLine(2, "ERROR"); + setStatusLine(statusLineNo(0), text); + setStatusLine(statusLineNo(1), "ERROR"); m_mode = MODE_ERROR; } @@ -151,7 +154,7 @@ void CTFTSurenoo::setErrorInt(const char* text) void CTFTSurenoo::setLockoutInt() { setModeLine(STR_MMDVM); - setStatusLine(2, "LOCKOUT"); + setStatusLine(statusLineNo(1), "LOCKOUT"); m_mode = MODE_LOCKOUT; } @@ -162,7 +165,7 @@ void CTFTSurenoo::setQuitInt() CThread::sleep(REFRESH_PERIOD); setModeLine(STR_MMDVM); - setStatusLine(2, "STOPPED"); + setStatusLine(statusLineNo(1), "STOPPED"); refreshDisplay(); @@ -180,57 +183,46 @@ void CTFTSurenoo::writeDStarInt(const char* my1, const char* my2, const char* yo setModeLine(STR_MMDVM); ::snprintf(m_temp, sizeof(m_temp), "%s %.8s/%4.4s", type, my1, my2); - setStatusLine(0, m_temp); + setStatusLine(statusLineNo(0), m_temp); ::snprintf(m_temp, sizeof(m_temp), "%.8s", your); - setStatusLine(2, m_temp); + setStatusLine(statusLineNo(1), m_temp); if (::strcmp(reflector, " ") != 0) ::snprintf(m_temp, sizeof(m_temp), "via %.8s", reflector); else ::strcpy(m_temp, ""); - setStatusLine(4, m_temp); + setStatusLine(statusLineNo(2), m_temp); m_mode = MODE_DSTAR; } void CTFTSurenoo::clearDStarInt() { - setStatusLine(0, "Listening"); - setStatusLine(2, ""); - setStatusLine(4, ""); + setStatusLine(statusLineNo(0), "Listening"); + setStatusLine(statusLineNo(1), ""); + setStatusLine(statusLineNo(2), ""); } void CTFTSurenoo::writeDMRInt(unsigned int slotNo, const std::string& src, bool group, const std::string& dst, const char* type) { assert(type != NULL); - // slotNo comes 1 or 2, convert 0 or 1 - slotNo--; - setModeLine(STR_DMR); - ::snprintf(m_temp, sizeof(m_temp), "%d Listening", 2 - slotNo); - setStatusLine((1 - slotNo) * 2, m_temp); + ::snprintf(m_temp, sizeof(m_temp), "%s %s", type, src.c_str()); + setStatusLine(statusLineNo(0), m_temp); - ::snprintf(m_temp, sizeof(m_temp), "%d %s %s", slotNo + 1, type, src.c_str()); - setStatusLine(slotNo * 2, m_temp); - - ::snprintf(m_temp, sizeof(m_temp), "%s%s", group ? "TG" : "", dst.c_str()); - setStatusLine(slotNo * 2 + 1, m_temp); + ::snprintf(m_temp, sizeof(m_temp), "TS%d %s%s", slotNo, group ? "TG" : "", dst.c_str()); + setStatusLine(statusLineNo(1), m_temp); m_mode = MODE_DMR; } void CTFTSurenoo::clearDMRInt(unsigned int slotNo) { - // slotNo comes 1 or 2, convert 0 or 1 - slotNo--; - - ::snprintf(m_temp, sizeof(m_temp), "%d Listening", slotNo + 1); - setStatusLine(slotNo * 2, m_temp); - - setStatusLine(slotNo * 2 + 1, ""); + setStatusLine(statusLineNo(0), "Listening"); + setStatusLine(statusLineNo(1), ""); } void CTFTSurenoo::writeFusionInt(const char* source, const char* dest, const char* type, const char* origin) @@ -243,16 +235,16 @@ void CTFTSurenoo::writeFusionInt(const char* source, const char* dest, const cha setModeLine(STR_YSF); ::snprintf(m_temp, sizeof(m_temp), "%s %.10s", type, source); - setStatusLine(0, m_temp); + setStatusLine(statusLineNo(0), m_temp); ::snprintf(m_temp, sizeof(m_temp), " %.10s", dest); - setStatusLine(2, m_temp); + setStatusLine(statusLineNo(1), m_temp); if (::strcmp(origin, " ") != 0) ::snprintf(m_temp, sizeof(m_temp), "at %.10s", origin); else ::strcpy(m_temp, ""); - setStatusLine(4, m_temp); + setStatusLine(statusLineNo(2), m_temp); m_mode = MODE_YSF; } @@ -270,10 +262,10 @@ void CTFTSurenoo::writeP25Int(const char* source, bool group, unsigned int dest, setModeLine(STR_P25); ::snprintf(m_temp, sizeof(m_temp), "%s %.10s", type, source); - setStatusLine(0, m_temp); + setStatusLine(statusLineNo(0), m_temp); ::snprintf(m_temp, sizeof(m_temp), " %s%u", group ? "TG" : "", dest); - setStatusLine(2, m_temp); + setStatusLine(statusLineNo(1), m_temp); m_mode = MODE_P25; } @@ -291,10 +283,10 @@ void CTFTSurenoo::writeNXDNInt(const char* source, bool group, unsigned int dest setModeLine(STR_NXDN); ::snprintf(m_temp, sizeof(m_temp), "%s %.10s", type, source); - setStatusLine(0, m_temp); + setStatusLine(statusLineNo(0), m_temp); ::snprintf(m_temp, sizeof(m_temp), " %s%u", group ? "TG" : "", dest); - setStatusLine(2, m_temp); + setStatusLine(statusLineNo(1), m_temp); m_mode = MODE_NXDN; } @@ -306,26 +298,26 @@ void CTFTSurenoo::clearNXDNInt() void CTFTSurenoo::writePOCSAGInt(uint32_t ric, const std::string& message) { - setStatusLine(2, "POCSAG TX"); + setStatusLine(statusLineNo(1), "POCSAG TX"); m_mode = MODE_POCSAG; } void CTFTSurenoo::clearPOCSAGInt() { - setStatusLine(2, "IDLE"); + setStatusLine(statusLineNo(1), "IDLE"); } void CTFTSurenoo::writeCWInt() { - setStatusLine(2, "CW TX"); + setStatusLine(statusLineNo(1), "CW TX"); m_mode = MODE_CW; } void CTFTSurenoo::clearCWInt() { - setStatusLine(2, "IDLE"); + setStatusLine(statusLineNo(1), "IDLE"); } void CTFTSurenoo::close() @@ -367,7 +359,7 @@ void CTFTSurenoo::setModeLine(const char *text) void CTFTSurenoo::setStatusLine(unsigned int line, const char *text) { - setLineBuffer(m_lineBuf + statusLine_offset(line), text, STATUS_CHARS); + setLineBuffer(m_lineBuf + statusLineOffset(line), text, STATUS_CHARS); } void CTFTSurenoo::refreshDisplay(void) @@ -390,13 +382,13 @@ void CTFTSurenoo::refreshDisplay(void) // status line for (int i = 0; i < STATUS_LINES; i++) { - char *p = m_lineBuf + statusLine_offset(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, FG_COLOUR); + STATUS_MARGIN + STATUS_FONT_SIZE * i, p, + (i < INFO_LINES) ? INFO_COLOUR : EXT_COLOUR); m_serial->write((unsigned char*)m_temp, (unsigned int)::strlen(m_temp)); } From 0bc6bcdb267bb726ebf55b59c5210cb04e138966 Mon Sep 17 00:00:00 2001 From: SASANO Takayoshi Date: Sat, 29 Feb 2020 06:51:26 +0900 Subject: [PATCH 2/2] Fix DMR status display for duplex mode Previous change (simplyfy DMR status display) did not consider DMR duplex mode. Now DMR simplex mode uses 2-lines style, duplex mode 4-lines like this. Listening TS1 N Callsign TS2 TGxx For this change, statusLine() no longer have meaning. It will be removed in the future. --- Display.cpp | 2 +- TFTSurenoo.cpp | 34 ++++++++++++++++++++++++++-------- TFTSurenoo.h | 3 ++- 3 files changed, 29 insertions(+), 10 deletions(-) diff --git a/Display.cpp b/Display.cpp index 39f72a8..84148b7 100644 --- a/Display.cpp +++ b/Display.cpp @@ -447,7 +447,7 @@ CDisplay* CDisplay::createDisplay(const CConf& conf, CUMP* ump, CModem* modem) serial = new CSerialController(port, (type == "TFT Serial") ? SERIAL_9600 : SERIAL_115200); if (type == "TFT Surenoo") - display = new CTFTSurenoo(conf.getCallsign(), dmrid, serial, brightness); + display = new CTFTSurenoo(conf.getCallsign(), dmrid, serial, brightness, conf.getDuplex()); else display = new CTFTSerial(conf.getCallsign(), dmrid, serial, brightness); } else if (type == "Nextion") { diff --git a/TFTSurenoo.cpp b/TFTSurenoo.cpp index b984437..5d15856 100644 --- a/TFTSurenoo.cpp +++ b/TFTSurenoo.cpp @@ -65,7 +65,7 @@ enum LcdColour { #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) * 2) +#define statusLineNo(x) (x) #define INFO_LINES statusLineNo(2) // This module sometimes ignores display command (too busy?), @@ -80,13 +80,15 @@ enum LcdColour { #define STR_P25 "P25" #define STR_YSF "SystemFusion" -CTFTSurenoo::CTFTSurenoo(const std::string& callsign, unsigned int dmrid, ISerialPort* serial, unsigned int brightness) : +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) @@ -208,21 +210,37 @@ void CTFTSurenoo::writeDMRInt(unsigned int slotNo, const std::string& src, bool { assert(type != NULL); - setModeLine(STR_DMR); + 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(0), m_temp); + setStatusLine(statusLineNo(pos * 2), m_temp); ::snprintf(m_temp, sizeof(m_temp), "TS%d %s%s", slotNo, group ? "TG" : "", dst.c_str()); - setStatusLine(statusLineNo(1), m_temp); + setStatusLine(statusLineNo(pos * 2 + 1), m_temp); m_mode = MODE_DMR; } void CTFTSurenoo::clearDMRInt(unsigned int slotNo) { - setStatusLine(statusLineNo(0), "Listening"); - setStatusLine(statusLineNo(1), ""); + 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 { + setStatusLine(statusLineNo(1), ""); + } } void CTFTSurenoo::writeFusionInt(const char* source, const char* dest, const char* type, const char* origin) @@ -388,7 +406,7 @@ void CTFTSurenoo::refreshDisplay(void) ::snprintf(m_temp, sizeof(m_temp), "DCV%d(%d,%d,'%s',%d);", STATUS_FONT_SIZE, 0, STATUS_MARGIN + STATUS_FONT_SIZE * i, p, - (i < INFO_LINES) ? INFO_COLOUR : EXT_COLOUR); + (!m_duplex && i >= INFO_LINES) ? EXT_COLOUR : INFO_COLOUR); m_serial->write((unsigned char*)m_temp, (unsigned int)::strlen(m_temp)); } diff --git a/TFTSurenoo.h b/TFTSurenoo.h index c95c5c0..20a743a 100644 --- a/TFTSurenoo.h +++ b/TFTSurenoo.h @@ -29,7 +29,7 @@ class CTFTSurenoo : public CDisplay { public: - CTFTSurenoo(const std::string& callsign, unsigned int dmrid, ISerialPort* serial, unsigned int brightness); + CTFTSurenoo(const std::string& callsign, unsigned int dmrid, ISerialPort* serial, unsigned int brightness, bool duplex); virtual ~CTFTSurenoo(); virtual bool open(); @@ -71,6 +71,7 @@ private: ISerialPort* m_serial; unsigned int m_brightness; unsigned char m_mode; + bool m_duplex; bool m_refresh; CTimer m_refreshTimer; char* m_lineBuf;