Skip to content

Commit e818d0f

Browse files
committed
add UserDB display for OLED
To display UserDB on DMR mode, set Slot1=0 and Slot2=1 in [DMR Network] section.
1 parent d77d44f commit e818d0f

File tree

2 files changed

+60
-16
lines changed

2 files changed

+60
-16
lines changed

OLED.cpp

Lines changed: 57 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,7 @@ bool COLED::open()
217217
}
218218

219219
// init done
220+
m_display.setTextWrap(false); // disable text wrap as default
220221
m_display.clearDisplay(); // clears the screen buffer
221222
m_display.display(); // display it (clear display)
222223

@@ -271,8 +272,10 @@ void COLED::setErrorInt(const char* text)
271272
m_display.clearDisplay();
272273
OLED_statusbar();
273274

275+
m_display.setTextWrap(true); // text wrap temorally enable
274276
m_display.setCursor(0,OLED_LINE1);
275277
m_display.printf("%s\n",text);
278+
m_display.setTextWrap(false);
276279

277280
m_display.display();
278281
}
@@ -360,6 +363,16 @@ void COLED::clearDStarInt()
360363
}
361364

362365
void COLED::writeDMRInt(unsigned int slotNo,const std::string& src,bool group,const std::string& dst,const char* type)
366+
{
367+
CUserDBentry tmp;
368+
369+
tmp.set(keyCALLSIGN, src);
370+
writeDMRIntEx(slotNo, tmp, group, dst, type);
371+
}
372+
373+
#define CALLandNAME(u) ((u).get(keyCALLSIGN) + " " + (u).get(keyFIRST_NAME))
374+
375+
int COLED::writeDMRIntEx(unsigned int slotNo, const class CUserDBentry& src, bool group, const std::string& dst, const char* type)
363376
{
364377

365378
if (m_mode != MODE_DMR) {
@@ -368,48 +381,55 @@ void COLED::writeDMRInt(unsigned int slotNo,const std::string& src,bool group,co
368381
clearDMRInt(slotNo);
369382
}
370383
// if both slots, use lines 2-3 for slot 1, lines 4-5 for slot 2
371-
// if single slot, use lines 3-4
384+
// if single slot, use lines 2-3
372385
if ( m_slot1Enabled && m_slot2Enabled ) {
373386

374387
if (slotNo == 1U) {
375388
m_display.fillRect(0,OLED_LINE2,m_display.width(),40,BLACK);
376389
m_display.setCursor(0,OLED_LINE2);
377-
m_display.printf("%s",src.c_str());
390+
m_display.printf("%s",CALLandNAME(src).c_str());
378391
m_display.setCursor(0,OLED_LINE3);
379392
m_display.printf("Slot: %i %s %s%s",slotNo,type,group ? "TG: " : "",dst.c_str());
380393
}
381394
else
382395
{
383396
m_display.fillRect(0,OLED_LINE4,m_display.width(),40,BLACK);
384397
m_display.setCursor(0,OLED_LINE4);
385-
m_display.printf("%s",src.c_str());
398+
m_display.printf("%s",CALLandNAME(src).c_str());
386399
m_display.setCursor(0,OLED_LINE5);
387400
m_display.printf("Slot: %i %s %s%s",slotNo,type,group ? "TG: " : "",dst.c_str());
388401
}
389402

403+
m_display.fillRect(0,OLED_LINE6,m_display.width(),20,BLACK);
404+
m_display.setCursor(0,OLED_LINE6);
405+
m_display.printf("%s",m_ipaddress.c_str());
390406
}
391407
else
392408
{
393-
m_display.fillRect(0,OLED_LINE3,m_display.width(),20,BLACK);
409+
m_display.fillRect(0,OLED_LINE2,m_display.width(),m_display.height(),BLACK);
410+
m_display.setCursor(0,OLED_LINE2);
411+
m_display.printf("%s",CALLandNAME(src).c_str());
394412
m_display.setCursor(0,OLED_LINE3);
395-
m_display.printf("%s",src.c_str());
396-
m_display.setCursor(0,OLED_LINE4);
397413
m_display.printf("Slot: %i %s %s%s",slotNo,type,group ? "TG: " : "",dst.c_str());
414+
m_display.setCursor(0,OLED_LINE4);
415+
m_display.printf("%s",src.get(keyCITY).c_str());
416+
m_display.setCursor(0,OLED_LINE5);
417+
m_display.printf("%s",src.get(keySTATE).c_str());
418+
m_display.setCursor(0,OLED_LINE6);
419+
m_display.printf("%s",src.get(keyCOUNTRY).c_str());
398420
}
399421

400-
m_display.fillRect(0,OLED_LINE6,m_display.width(),20,BLACK);
401-
m_display.setCursor(0,OLED_LINE6);
402-
m_display.printf("%s",m_ipaddress.c_str());
403-
404422
OLED_statusbar();
405423
m_display.display();
406424

425+
// must be 0, to avoid calling writeDMRInt() from CDisplay::writeDMR()
426+
return 0;
407427
}
408428

409429
void COLED::clearDMRInt(unsigned int slotNo)
410430
{
411431
// if both slots, use lines 2-3 for slot 1, lines 4-5 for slot 2
412-
// if single slot, use lines 3-4
432+
// if single slot, use lines 2-3
413433
if ( m_slot1Enabled && m_slot2Enabled ){
414434
if (slotNo == 1U) {
415435
m_display.fillRect(0, OLED_LINE3, m_display.width(), 40, BLACK);
@@ -423,8 +443,8 @@ void COLED::clearDMRInt(unsigned int slotNo)
423443
}
424444
}
425445
else {
426-
m_display.fillRect(0, OLED_LINE4, m_display.width(), 40, BLACK);
427-
m_display.setCursor(0,OLED_LINE4);
446+
m_display.fillRect(0, OLED_LINE2, m_display.width(), m_display.height(), BLACK);
447+
m_display.setCursor(0,OLED_LINE3);
428448
m_display.printf("Slot: %i Listening",slotNo);
429449
}
430450

@@ -497,28 +517,47 @@ void COLED::clearP25Int()
497517
}
498518

499519
void COLED::writeNXDNInt(const char* source, bool group, unsigned int dest, const char* type)
520+
{
521+
CUserDBentry tmp;
522+
523+
tmp.set(keyCALLSIGN, source);
524+
writeNXDNIntEx(tmp, group, dest, type);
525+
}
526+
527+
int COLED::writeNXDNIntEx(const class CUserDBentry& source, bool group, unsigned int dest, const char* type)
500528
{
501529
m_mode = MODE_NXDN;
502530

503531
m_display.clearDisplay();
504532
m_display.fillRect(0, OLED_LINE2, m_display.width(), m_display.height(), BLACK);
505533

534+
m_display.setCursor(0,OLED_LINE2);
535+
m_display.printf("%s %s", type, CALLandNAME(source).c_str());
536+
506537
m_display.setCursor(0,OLED_LINE3);
507-
m_display.printf("%s %.10s", type, source);
538+
m_display.printf(" %s%u", group ? "TG" : "", dest);
539+
540+
m_display.setCursor(0,OLED_LINE4);
541+
m_display.printf("%s",source.get(keyCITY).c_str());
508542

509543
m_display.setCursor(0,OLED_LINE5);
510-
m_display.printf(" %s%u", group ? "TG" : "", dest);
544+
m_display.printf("%s",source.get(keySTATE).c_str());
545+
546+
m_display.setCursor(0,OLED_LINE6);
547+
m_display.printf("%s",source.get(keyCOUNTRY).c_str());
511548

512549
OLED_statusbar();
513550
m_display.display();
514551

552+
// must be 0, to avoid calling writeNXDNInt() from CDisplay::writeNXDN()
553+
return 0;
515554
}
516555

517556
void COLED::clearNXDNInt()
518557
{
519558
m_display.fillRect(0, OLED_LINE2, m_display.width(), m_display.height(), BLACK);
520559

521-
m_display.setCursor(40,OLED_LINE4);
560+
m_display.setCursor(40,OLED_LINE3);
522561
m_display.print("Listening");
523562

524563
m_display.setCursor(0,OLED_LINE6);
@@ -537,8 +576,10 @@ void COLED::writePOCSAGInt(uint32_t ric, const std::string& message)
537576
m_display.setCursor(0,OLED_LINE3);
538577
m_display.printf("RIC: %u", ric);
539578

579+
m_display.setTextWrap(true); // text wrap temorally enable
540580
m_display.setCursor(0,OLED_LINE5);
541581
m_display.printf("MSG: %s", message.c_str());
582+
m_display.setTextWrap(false);
542583

543584
OLED_statusbar();
544585
m_display.display();

OLED.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929

3030
#include "Display.h"
3131
#include "Defines.h"
32+
#include "UserDBentry.h"
3233

3334
#include <string>
3435

@@ -56,6 +57,7 @@ class COLED : public CDisplay
5657
virtual void clearDStarInt();
5758

5859
virtual void writeDMRInt(unsigned int slotNo, const std::string& src, bool group, const std::string& dst, const char* type);
60+
virtual int writeDMRIntEx(unsigned int slotNo, const class CUserDBentry& src, bool group, const std::string& dst, const char* type);
5961
virtual void clearDMRInt(unsigned int slotNo);
6062

6163
virtual void writeFusionInt(const char* source, const char* dest, unsigned char dgid, const char* type, const char* origin);
@@ -65,6 +67,7 @@ class COLED : public CDisplay
6567
virtual void clearP25Int();
6668

6769
virtual void writeNXDNInt(const char* source, bool group, unsigned int dest, const char* type);
70+
virtual int writeNXDNIntEx(const class CUserDBentry& source, bool group, unsigned int dest, const char* type);
6871
virtual void clearNXDNInt();
6972

7073
virtual void writePOCSAGInt(uint32_t ric, const std::string& message);

0 commit comments

Comments
 (0)