Merge pull request #558 from jg1uaa/master

TFTSurenoo: Simplify DMR status display
This commit is contained in:
Jonathan Naylor 2020-02-29 12:15:32 +00:00 committed by GitHub
commit 8d87037ee5
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 61 additions and 50 deletions

View file

@ -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); serial = new CSerialController(port, (type == "TFT Serial") ? SERIAL_9600 : SERIAL_115200);
if (type == "TFT Surenoo") if (type == "TFT Surenoo")
display = new CTFTSurenoo(conf.getCallsign(), dmrid, serial, brightness); display = new CTFTSurenoo(conf.getCallsign(), dmrid, serial, brightness, conf.getDuplex());
else else
display = new CTFTSerial(conf.getCallsign(), dmrid, serial, brightness); display = new CTFTSerial(conf.getCallsign(), dmrid, serial, brightness);
} else if (type == "Nextion") { } else if (type == "Nextion") {

View file

@ -49,7 +49,8 @@ enum LcdColour {
#define FONT_MEDIUM 24 // 12x24 #define FONT_MEDIUM 24 // 12x24
#define FONT_LARGE 32 // 16x32 #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 BG_COLOUR COLOUR_BLACK
#define ERROR_COLOUR COLOUR_DARK_RED #define ERROR_COLOUR COLOUR_DARK_RED
#define MODE_COLOUR COLOUR_YELLOW #define MODE_COLOUR COLOUR_YELLOW
@ -63,7 +64,9 @@ enum LcdColour {
#define MODE_CHARS (X_WIDTH / (MODE_FONT_SIZE / 2)) #define MODE_CHARS (X_WIDTH / (MODE_FONT_SIZE / 2))
#define STATUS_CHARS (X_WIDTH / (STATUS_FONT_SIZE / 2)) #define STATUS_CHARS (X_WIDTH / (STATUS_FONT_SIZE / 2))
#define STATUS_LINES ((Y_WIDTH - STATUS_MARGIN) / STATUS_FONT_SIZE) #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)
#define INFO_LINES statusLineNo(2)
// This module sometimes ignores display command (too busy?), // This module sometimes ignores display command (too busy?),
// so supress display refresh // so supress display refresh
@ -77,13 +80,15 @@ enum LcdColour {
#define STR_P25 "P25" #define STR_P25 "P25"
#define STR_YSF "SystemFusion" #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(), CDisplay(),
m_callsign(callsign), m_callsign(callsign),
m_dmrid(dmrid), m_dmrid(dmrid),
m_serial(serial), m_serial(serial),
m_brightness(brightness), m_brightness(brightness),
m_mode(MODE_IDLE), m_mode(MODE_IDLE),
m_duplex(duplex),
//m_duplex(true), // uncomment to force duplex display for testing!
m_refresh(false), m_refresh(false),
m_refreshTimer(1000U, 0U, REFRESH_PERIOD), m_refreshTimer(1000U, 0U, REFRESH_PERIOD),
m_lineBuf(NULL) m_lineBuf(NULL)
@ -105,7 +110,7 @@ bool CTFTSurenoo::open()
return false; return false;
} }
m_lineBuf = new char[statusLine_offset(STATUS_LINES)]; m_lineBuf = new char[statusLineOffset(STATUS_LINES)];
if (m_lineBuf == NULL) { if (m_lineBuf == NULL) {
LogError("Cannot allocate line buffer"); LogError("Cannot allocate line buffer");
m_serial->close(); m_serial->close();
@ -131,8 +136,8 @@ void CTFTSurenoo::setIdleInt()
setModeLine(STR_MMDVM); setModeLine(STR_MMDVM);
::snprintf(m_temp, sizeof(m_temp), "%-6s / %u", m_callsign.c_str(), m_dmrid); ::snprintf(m_temp, sizeof(m_temp), "%-6s / %u", m_callsign.c_str(), m_dmrid);
setStatusLine(0, m_temp); setStatusLine(statusLineNo(0), m_temp);
setStatusLine(2, "IDLE"); setStatusLine(statusLineNo(1), "IDLE");
m_mode = MODE_IDLE; m_mode = MODE_IDLE;
} }
@ -142,8 +147,8 @@ void CTFTSurenoo::setErrorInt(const char* text)
assert(text != NULL); assert(text != NULL);
setModeLine(STR_MMDVM); setModeLine(STR_MMDVM);
setStatusLine(0, text); setStatusLine(statusLineNo(0), text);
setStatusLine(2, "ERROR"); setStatusLine(statusLineNo(1), "ERROR");
m_mode = MODE_ERROR; m_mode = MODE_ERROR;
} }
@ -151,7 +156,7 @@ void CTFTSurenoo::setErrorInt(const char* text)
void CTFTSurenoo::setLockoutInt() void CTFTSurenoo::setLockoutInt()
{ {
setModeLine(STR_MMDVM); setModeLine(STR_MMDVM);
setStatusLine(2, "LOCKOUT"); setStatusLine(statusLineNo(1), "LOCKOUT");
m_mode = MODE_LOCKOUT; m_mode = MODE_LOCKOUT;
} }
@ -162,7 +167,7 @@ void CTFTSurenoo::setQuitInt()
CThread::sleep(REFRESH_PERIOD); CThread::sleep(REFRESH_PERIOD);
setModeLine(STR_MMDVM); setModeLine(STR_MMDVM);
setStatusLine(2, "STOPPED"); setStatusLine(statusLineNo(1), "STOPPED");
refreshDisplay(); refreshDisplay();
@ -180,57 +185,62 @@ void CTFTSurenoo::writeDStarInt(const char* my1, const char* my2, const char* yo
setModeLine(STR_MMDVM); setModeLine(STR_MMDVM);
::snprintf(m_temp, sizeof(m_temp), "%s %.8s/%4.4s", type, my1, my2); ::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); ::snprintf(m_temp, sizeof(m_temp), "%.8s", your);
setStatusLine(2, m_temp); setStatusLine(statusLineNo(1), m_temp);
if (::strcmp(reflector, " ") != 0) if (::strcmp(reflector, " ") != 0)
::snprintf(m_temp, sizeof(m_temp), "via %.8s", reflector); ::snprintf(m_temp, sizeof(m_temp), "via %.8s", reflector);
else else
::strcpy(m_temp, ""); ::strcpy(m_temp, "");
setStatusLine(4, m_temp); setStatusLine(statusLineNo(2), m_temp);
m_mode = MODE_DSTAR; m_mode = MODE_DSTAR;
} }
void CTFTSurenoo::clearDStarInt() void CTFTSurenoo::clearDStarInt()
{ {
setStatusLine(0, "Listening"); setStatusLine(statusLineNo(0), "Listening");
setStatusLine(2, ""); setStatusLine(statusLineNo(1), "");
setStatusLine(4, ""); setStatusLine(statusLineNo(2), "");
} }
void CTFTSurenoo::writeDMRInt(unsigned int slotNo, const std::string& src, bool group, const std::string& dst, const char* type) void CTFTSurenoo::writeDMRInt(unsigned int slotNo, const std::string& src, bool group, const std::string& dst, const char* type)
{ {
assert(type != NULL); assert(type != NULL);
// slotNo comes 1 or 2, convert 0 or 1 if (m_mode != MODE_DMR) {
slotNo--; setModeLine(STR_DMR);
if (m_duplex) {
setStatusLine(statusLineNo(0), "Listening");
setStatusLine(statusLineNo(1), "TS1");
setStatusLine(statusLineNo(2), "Listening");
setStatusLine(statusLineNo(3), "TS2");
}
}
setModeLine(STR_DMR); int pos = m_duplex ? (slotNo - 1) : 0;
::snprintf(m_temp, sizeof(m_temp), "%s %s", type, src.c_str());
setStatusLine(statusLineNo(pos * 2), m_temp);
::snprintf(m_temp, sizeof(m_temp), "%d Listening", 2 - slotNo); ::snprintf(m_temp, sizeof(m_temp), "TS%d %s%s", slotNo, group ? "TG" : "", dst.c_str());
setStatusLine((1 - slotNo) * 2, m_temp); setStatusLine(statusLineNo(pos * 2 + 1), 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);
m_mode = MODE_DMR; m_mode = MODE_DMR;
} }
void CTFTSurenoo::clearDMRInt(unsigned int slotNo) void CTFTSurenoo::clearDMRInt(unsigned int slotNo)
{ {
// slotNo comes 1 or 2, convert 0 or 1 int pos = m_duplex ? (slotNo - 1) : 0;
slotNo--; setStatusLine(statusLineNo(pos * 2), "Listening");
::snprintf(m_temp, sizeof(m_temp), "%d Listening", slotNo + 1); if (m_duplex) {
setStatusLine(slotNo * 2, m_temp); ::snprintf(m_temp, sizeof(m_temp), "TS%d", slotNo);
setStatusLine(statusLineNo(pos * 2 + 1), m_temp);
setStatusLine(slotNo * 2 + 1, ""); } else {
setStatusLine(statusLineNo(1), "");
}
} }
void CTFTSurenoo::writeFusionInt(const char* source, const char* dest, const char* type, const char* origin) void CTFTSurenoo::writeFusionInt(const char* source, const char* dest, const char* type, const char* origin)
@ -243,16 +253,16 @@ void CTFTSurenoo::writeFusionInt(const char* source, const char* dest, const cha
setModeLine(STR_YSF); setModeLine(STR_YSF);
::snprintf(m_temp, sizeof(m_temp), "%s %.10s", type, source); ::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); ::snprintf(m_temp, sizeof(m_temp), " %.10s", dest);
setStatusLine(2, m_temp); setStatusLine(statusLineNo(1), m_temp);
if (::strcmp(origin, " ") != 0) if (::strcmp(origin, " ") != 0)
::snprintf(m_temp, sizeof(m_temp), "at %.10s", origin); ::snprintf(m_temp, sizeof(m_temp), "at %.10s", origin);
else else
::strcpy(m_temp, ""); ::strcpy(m_temp, "");
setStatusLine(4, m_temp); setStatusLine(statusLineNo(2), m_temp);
m_mode = MODE_YSF; m_mode = MODE_YSF;
} }
@ -270,10 +280,10 @@ void CTFTSurenoo::writeP25Int(const char* source, bool group, unsigned int dest,
setModeLine(STR_P25); setModeLine(STR_P25);
::snprintf(m_temp, sizeof(m_temp), "%s %.10s", type, source); ::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); ::snprintf(m_temp, sizeof(m_temp), " %s%u", group ? "TG" : "", dest);
setStatusLine(2, m_temp); setStatusLine(statusLineNo(1), m_temp);
m_mode = MODE_P25; m_mode = MODE_P25;
} }
@ -291,10 +301,10 @@ void CTFTSurenoo::writeNXDNInt(const char* source, bool group, unsigned int dest
setModeLine(STR_NXDN); setModeLine(STR_NXDN);
::snprintf(m_temp, sizeof(m_temp), "%s %.10s", type, source); ::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); ::snprintf(m_temp, sizeof(m_temp), " %s%u", group ? "TG" : "", dest);
setStatusLine(2, m_temp); setStatusLine(statusLineNo(1), m_temp);
m_mode = MODE_NXDN; m_mode = MODE_NXDN;
} }
@ -306,26 +316,26 @@ void CTFTSurenoo::clearNXDNInt()
void CTFTSurenoo::writePOCSAGInt(uint32_t ric, const std::string& message) void CTFTSurenoo::writePOCSAGInt(uint32_t ric, const std::string& message)
{ {
setStatusLine(2, "POCSAG TX"); setStatusLine(statusLineNo(1), "POCSAG TX");
m_mode = MODE_POCSAG; m_mode = MODE_POCSAG;
} }
void CTFTSurenoo::clearPOCSAGInt() void CTFTSurenoo::clearPOCSAGInt()
{ {
setStatusLine(2, "IDLE"); setStatusLine(statusLineNo(1), "IDLE");
} }
void CTFTSurenoo::writeCWInt() void CTFTSurenoo::writeCWInt()
{ {
setStatusLine(2, "CW TX"); setStatusLine(statusLineNo(1), "CW TX");
m_mode = MODE_CW; m_mode = MODE_CW;
} }
void CTFTSurenoo::clearCWInt() void CTFTSurenoo::clearCWInt()
{ {
setStatusLine(2, "IDLE"); setStatusLine(statusLineNo(1), "IDLE");
} }
void CTFTSurenoo::close() void CTFTSurenoo::close()
@ -367,7 +377,7 @@ void CTFTSurenoo::setModeLine(const char *text)
void CTFTSurenoo::setStatusLine(unsigned int line, 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) void CTFTSurenoo::refreshDisplay(void)
@ -390,13 +400,13 @@ void CTFTSurenoo::refreshDisplay(void)
// status line // status line
for (int i = 0; i < STATUS_LINES; i++) { 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; if (!::strlen(p)) continue;
::snprintf(m_temp, sizeof(m_temp), "DCV%d(%d,%d,'%s',%d);", ::snprintf(m_temp, sizeof(m_temp), "DCV%d(%d,%d,'%s',%d);",
STATUS_FONT_SIZE, 0, STATUS_FONT_SIZE, 0,
STATUS_MARGIN + STATUS_FONT_SIZE * i, STATUS_MARGIN + STATUS_FONT_SIZE * i, p,
p, FG_COLOUR); (!m_duplex && i >= INFO_LINES) ? EXT_COLOUR : INFO_COLOUR);
m_serial->write((unsigned char*)m_temp, (unsigned int)::strlen(m_temp)); m_serial->write((unsigned char*)m_temp, (unsigned int)::strlen(m_temp));
} }

View file

@ -29,7 +29,7 @@
class CTFTSurenoo : public CDisplay class CTFTSurenoo : public CDisplay
{ {
public: 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 ~CTFTSurenoo();
virtual bool open(); virtual bool open();
@ -71,6 +71,7 @@ private:
ISerialPort* m_serial; ISerialPort* m_serial;
unsigned int m_brightness; unsigned int m_brightness;
unsigned char m_mode; unsigned char m_mode;
bool m_duplex;
bool m_refresh; bool m_refresh;
CTimer m_refreshTimer; CTimer m_refreshTimer;
char* m_lineBuf; char* m_lineBuf;