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.
This commit is contained in:
SASANO Takayoshi 2020-02-29 06:51:26 +09:00
parent ead41ba9a5
commit 0bc6bcdb26
3 changed files with 29 additions and 10 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

@ -65,7 +65,7 @@ enum LcdColour {
#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 statusLineOffset(x) ((STATUS_CHARS + 1) * ((x) + 1)) #define statusLineOffset(x) ((STATUS_CHARS + 1) * ((x) + 1))
#define statusLineNo(x) ((x) * 2) #define statusLineNo(x) (x)
#define INFO_LINES statusLineNo(2) #define INFO_LINES statusLineNo(2)
// This module sometimes ignores display command (too busy?), // This module sometimes ignores display command (too busy?),
@ -80,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)
@ -208,21 +210,37 @@ void CTFTSurenoo::writeDMRInt(unsigned int slotNo, const std::string& src, bool
{ {
assert(type != NULL); 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()); ::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()); ::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; m_mode = MODE_DMR;
} }
void CTFTSurenoo::clearDMRInt(unsigned int slotNo) void CTFTSurenoo::clearDMRInt(unsigned int slotNo)
{ {
setStatusLine(statusLineNo(0), "Listening"); int pos = m_duplex ? (slotNo - 1) : 0;
setStatusLine(statusLineNo(1), ""); 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) 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);", ::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, p, 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)); 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;