@@ -49,7 +49,8 @@ enum LcdColour {
49
49
#define FONT_MEDIUM 24 // 12x24
50
50
#define FONT_LARGE 32 // 16x32
51
51
52
- #define FG_COLOUR COLOUR_CYAN
52
+ #define INFO_COLOUR COLOUR_CYAN
53
+ #define EXT_COLOUR COLOUR_DARK_GREEN
53
54
#define BG_COLOUR COLOUR_BLACK
54
55
#define ERROR_COLOUR COLOUR_DARK_RED
55
56
#define MODE_COLOUR COLOUR_YELLOW
@@ -63,7 +64,9 @@ enum LcdColour {
63
64
#define MODE_CHARS (X_WIDTH / (MODE_FONT_SIZE / 2 ))
64
65
#define STATUS_CHARS (X_WIDTH / (STATUS_FONT_SIZE / 2 ))
65
66
#define STATUS_LINES ((Y_WIDTH - STATUS_MARGIN) / STATUS_FONT_SIZE)
66
- #define statusLine_offset (x ) ((STATUS_CHARS + 1 ) * ((x) + 1 ))
67
+ #define statusLineOffset (x ) ((STATUS_CHARS + 1 ) * ((x) + 1 ))
68
+ #define statusLineNo (x ) (x)
69
+ #define INFO_LINES statusLineNo (2 )
67
70
68
71
// This module sometimes ignores display command (too busy?),
69
72
// so supress display refresh
@@ -77,13 +80,15 @@ enum LcdColour {
77
80
#define STR_P25 " P25"
78
81
#define STR_YSF " SystemFusion"
79
82
80
- CTFTSurenoo::CTFTSurenoo (const std::string& callsign, unsigned int dmrid, ISerialPort* serial, unsigned int brightness) :
83
+ CTFTSurenoo::CTFTSurenoo (const std::string& callsign, unsigned int dmrid, ISerialPort* serial, unsigned int brightness, bool duplex ) :
81
84
CDisplay(),
82
85
m_callsign(callsign),
83
86
m_dmrid(dmrid),
84
87
m_serial(serial),
85
88
m_brightness(brightness),
86
89
m_mode(MODE_IDLE),
90
+ m_duplex(duplex),
91
+ // m_duplex(true), // uncomment to force duplex display for testing!
87
92
m_refresh(false ),
88
93
m_refreshTimer(1000U , 0U , REFRESH_PERIOD),
89
94
m_lineBuf(NULL )
@@ -105,7 +110,7 @@ bool CTFTSurenoo::open()
105
110
return false ;
106
111
}
107
112
108
- m_lineBuf = new char [statusLine_offset (STATUS_LINES)];
113
+ m_lineBuf = new char [statusLineOffset (STATUS_LINES)];
109
114
if (m_lineBuf == NULL ) {
110
115
LogError (" Cannot allocate line buffer" );
111
116
m_serial->close ();
@@ -131,8 +136,8 @@ void CTFTSurenoo::setIdleInt()
131
136
setModeLine (STR_MMDVM);
132
137
133
138
::snprintf (m_temp, sizeof (m_temp), "%-6s / %u", m_callsign.c_str(), m_dmrid);
134
- setStatusLine (0 , m_temp);
135
- setStatusLine (2 , " IDLE" );
139
+ setStatusLine (statusLineNo ( 0 ) , m_temp);
140
+ setStatusLine (statusLineNo ( 1 ) , " IDLE" );
136
141
137
142
m_mode = MODE_IDLE;
138
143
}
@@ -142,16 +147,16 @@ void CTFTSurenoo::setErrorInt(const char* text)
142
147
assert (text != NULL );
143
148
144
149
setModeLine (STR_MMDVM);
145
- setStatusLine (0 , text);
146
- setStatusLine (2 , " ERROR" );
150
+ setStatusLine (statusLineNo ( 0 ) , text);
151
+ setStatusLine (statusLineNo ( 1 ) , " ERROR" );
147
152
148
153
m_mode = MODE_ERROR;
149
154
}
150
155
151
156
void CTFTSurenoo::setLockoutInt ()
152
157
{
153
158
setModeLine (STR_MMDVM);
154
- setStatusLine (2 , " LOCKOUT" );
159
+ setStatusLine (statusLineNo ( 1 ) , " LOCKOUT" );
155
160
156
161
m_mode = MODE_LOCKOUT;
157
162
}
@@ -162,7 +167,7 @@ void CTFTSurenoo::setQuitInt()
162
167
CThread::sleep (REFRESH_PERIOD);
163
168
164
169
setModeLine (STR_MMDVM);
165
- setStatusLine (2 , " STOPPED" );
170
+ setStatusLine (statusLineNo ( 1 ) , " STOPPED" );
166
171
167
172
refreshDisplay ();
168
173
@@ -180,57 +185,62 @@ void CTFTSurenoo::writeDStarInt(const char* my1, const char* my2, const char* yo
180
185
setModeLine (STR_MMDVM);
181
186
182
187
::snprintf (m_temp, sizeof (m_temp), "%s %.8s/%4.4s", type, my1, my2);
183
- setStatusLine (0 , m_temp);
188
+ setStatusLine (statusLineNo ( 0 ) , m_temp);
184
189
185
190
::snprintf (m_temp, sizeof (m_temp), "%.8s", your);
186
- setStatusLine (2 , m_temp);
191
+ setStatusLine (statusLineNo ( 1 ) , m_temp);
187
192
188
193
if (::strcmp (reflector, " " ) != 0 )
189
194
::snprintf (m_temp, sizeof (m_temp), "via %.8s", reflector);
190
195
else
191
196
::strcpy (m_temp, " " );
192
- setStatusLine (4 , m_temp);
197
+ setStatusLine (statusLineNo ( 2 ) , m_temp);
193
198
194
199
m_mode = MODE_DSTAR;
195
200
}
196
201
197
202
void CTFTSurenoo::clearDStarInt ()
198
203
{
199
- setStatusLine (0 , " Listening" );
200
- setStatusLine (2 , " " );
201
- setStatusLine (4 , " " );
204
+ setStatusLine (statusLineNo ( 0 ) , " Listening" );
205
+ setStatusLine (statusLineNo ( 1 ) , " " );
206
+ setStatusLine (statusLineNo ( 2 ) , " " );
202
207
}
203
208
204
209
void CTFTSurenoo::writeDMRInt (unsigned int slotNo, const std::string& src, bool group, const std::string& dst, const char * type)
205
210
{
206
211
assert (type != NULL );
207
212
208
- // slotNo comes 1 or 2, convert 0 or 1
209
- slotNo--;
213
+ if (m_mode != MODE_DMR) {
214
+ setModeLine (STR_DMR);
215
+ if (m_duplex) {
216
+ setStatusLine (statusLineNo (0 ), " Listening" );
217
+ setStatusLine (statusLineNo (1 ), " TS1" );
218
+ setStatusLine (statusLineNo (2 ), " Listening" );
219
+ setStatusLine (statusLineNo (3 ), " TS2" );
220
+ }
221
+ }
210
222
211
- setModeLine (STR_DMR);
223
+ int pos = m_duplex ? (slotNo - 1 ) : 0 ;
224
+ ::snprintf (m_temp, sizeof (m_temp), "%s %s", type, src.c_str());
225
+ setStatusLine (statusLineNo (pos * 2 ), m_temp);
212
226
213
- ::snprintf (m_temp, sizeof (m_temp), "%d Listening", 2 - slotNo);
214
- setStatusLine ((1 - slotNo) * 2 , m_temp);
215
-
216
- ::snprintf (m_temp, sizeof (m_temp), "%d %s %s", slotNo + 1, type, src.c_str());
217
- setStatusLine (slotNo * 2 , m_temp);
218
-
219
- ::snprintf (m_temp, sizeof (m_temp), "%s%s", group ? "TG" : "", dst.c_str());
220
- setStatusLine (slotNo * 2 + 1 , m_temp);
227
+ ::snprintf (m_temp, sizeof (m_temp), "TS%d %s%s", slotNo, group ? "TG" : "", dst.c_str());
228
+ setStatusLine (statusLineNo (pos * 2 + 1 ), m_temp);
221
229
222
230
m_mode = MODE_DMR;
223
231
}
224
232
225
233
void CTFTSurenoo::clearDMRInt (unsigned int slotNo)
226
234
{
227
- // slotNo comes 1 or 2, convert 0 or 1
228
- slotNo-- ;
235
+ int pos = m_duplex ? (slotNo - 1 ) : 0 ;
236
+ setStatusLine ( statusLineNo (pos * 2 ), " Listening " ) ;
229
237
230
- ::snprintf (m_temp, sizeof (m_temp), "%d Listening", slotNo + 1);
231
- setStatusLine (slotNo * 2 , m_temp);
232
-
233
- setStatusLine (slotNo * 2 + 1 , " " );
238
+ if (m_duplex) {
239
+ ::snprintf (m_temp, sizeof (m_temp), "TS%d", slotNo);
240
+ setStatusLine (statusLineNo (pos * 2 + 1 ), m_temp);
241
+ } else {
242
+ setStatusLine (statusLineNo (1 ), " " );
243
+ }
234
244
}
235
245
236
246
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
243
253
setModeLine (STR_YSF);
244
254
245
255
::snprintf (m_temp, sizeof (m_temp), "%s %.10s", type, source);
246
- setStatusLine (0 , m_temp);
256
+ setStatusLine (statusLineNo ( 0 ) , m_temp);
247
257
248
258
::snprintf (m_temp, sizeof (m_temp), " %.10s", dest);
249
- setStatusLine (2 , m_temp);
259
+ setStatusLine (statusLineNo ( 1 ) , m_temp);
250
260
251
261
if (::strcmp (origin, " " ) != 0 )
252
262
::snprintf (m_temp, sizeof (m_temp), "at %.10s", origin);
253
263
else
254
264
::strcpy (m_temp, " " );
255
- setStatusLine (4 , m_temp);
265
+ setStatusLine (statusLineNo ( 2 ) , m_temp);
256
266
257
267
m_mode = MODE_YSF;
258
268
}
@@ -270,10 +280,10 @@ void CTFTSurenoo::writeP25Int(const char* source, bool group, unsigned int dest,
270
280
setModeLine (STR_P25);
271
281
272
282
::snprintf (m_temp, sizeof (m_temp), "%s %.10s", type, source);
273
- setStatusLine (0 , m_temp);
283
+ setStatusLine (statusLineNo ( 0 ) , m_temp);
274
284
275
285
::snprintf (m_temp, sizeof (m_temp), " %s%u", group ? "TG" : "", dest);
276
- setStatusLine (2 , m_temp);
286
+ setStatusLine (statusLineNo ( 1 ) , m_temp);
277
287
278
288
m_mode = MODE_P25;
279
289
}
@@ -291,10 +301,10 @@ void CTFTSurenoo::writeNXDNInt(const char* source, bool group, unsigned int dest
291
301
setModeLine (STR_NXDN);
292
302
293
303
::snprintf (m_temp, sizeof (m_temp), "%s %.10s", type, source);
294
- setStatusLine (0 , m_temp);
304
+ setStatusLine (statusLineNo ( 0 ) , m_temp);
295
305
296
306
::snprintf (m_temp, sizeof (m_temp), " %s%u", group ? "TG" : "", dest);
297
- setStatusLine (2 , m_temp);
307
+ setStatusLine (statusLineNo ( 1 ) , m_temp);
298
308
299
309
m_mode = MODE_NXDN;
300
310
}
@@ -306,26 +316,26 @@ void CTFTSurenoo::clearNXDNInt()
306
316
307
317
void CTFTSurenoo::writePOCSAGInt (uint32_t ric, const std::string& message)
308
318
{
309
- setStatusLine (2 , " POCSAG TX" );
319
+ setStatusLine (statusLineNo ( 1 ) , " POCSAG TX" );
310
320
311
321
m_mode = MODE_POCSAG;
312
322
}
313
323
314
324
void CTFTSurenoo::clearPOCSAGInt ()
315
325
{
316
- setStatusLine (2 , " IDLE" );
326
+ setStatusLine (statusLineNo ( 1 ) , " IDLE" );
317
327
}
318
328
319
329
void CTFTSurenoo::writeCWInt ()
320
330
{
321
- setStatusLine (2 , " CW TX" );
331
+ setStatusLine (statusLineNo ( 1 ) , " CW TX" );
322
332
323
333
m_mode = MODE_CW;
324
334
}
325
335
326
336
void CTFTSurenoo::clearCWInt ()
327
337
{
328
- setStatusLine (2 , " IDLE" );
338
+ setStatusLine (statusLineNo ( 1 ) , " IDLE" );
329
339
}
330
340
331
341
void CTFTSurenoo::close ()
@@ -367,7 +377,7 @@ void CTFTSurenoo::setModeLine(const char *text)
367
377
368
378
void CTFTSurenoo::setStatusLine (unsigned int line, const char *text)
369
379
{
370
- setLineBuffer (m_lineBuf + statusLine_offset (line), text, STATUS_CHARS);
380
+ setLineBuffer (m_lineBuf + statusLineOffset (line), text, STATUS_CHARS);
371
381
}
372
382
373
383
void CTFTSurenoo::refreshDisplay (void )
@@ -390,13 +400,13 @@ void CTFTSurenoo::refreshDisplay(void)
390
400
391
401
// status line
392
402
for (int i = 0; i < STATUS_LINES; i++) {
393
- char *p = m_lineBuf + statusLine_offset (i);
403
+ char *p = m_lineBuf + statusLineOffset (i);
394
404
if (!::strlen(p)) continue;
395
405
396
406
::snprintf(m_temp, sizeof(m_temp), " DCV%d (%d,%d,' %s' ,%d);" ,
397
407
STATUS_FONT_SIZE, 0,
398
- STATUS_MARGIN + STATUS_FONT_SIZE * i,
399
- p, FG_COLOUR );
408
+ STATUS_MARGIN + STATUS_FONT_SIZE * i, p,
409
+ (!m_duplex && i >= INFO_LINES) ? EXT_COLOUR : INFO_COLOUR );
400
410
m_serial->write((unsigned char*)m_temp, (unsigned int)::strlen(m_temp));
401
411
}
402
412
0 commit comments