Skip to content

Commit d709c2b

Browse files
committed
Clean up the DMR Talker Alias code and logging.
1 parent e10454c commit d709c2b

File tree

8 files changed

+143
-124
lines changed

8 files changed

+143
-124
lines changed

DMRSlot.cpp

Lines changed: 33 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (C) 2015-2021 Jonathan Naylor, G4KLX
2+
* Copyright (C) 2015-2021,2023 Jonathan Naylor, G4KLX
33
*
44
* This program is free software; you can redistribute it and/or modify
55
* it under the terms of the GNU General Public License as published by
@@ -81,12 +81,13 @@ m_rfEmbeddedData(NULL),
8181
m_rfEmbeddedReadN(0U),
8282
m_rfEmbeddedWriteN(1U),
8383
m_rfTalkerId(TALKER_ID_NONE),
84-
m_rfTalkerAlias(),
84+
m_rfTalkerAlias(slotNo),
8585
m_netEmbeddedLC(),
8686
m_netEmbeddedData(NULL),
8787
m_netEmbeddedReadN(0U),
8888
m_netEmbeddedWriteN(1U),
8989
m_netTalkerId(TALKER_ID_NONE),
90+
m_netTalkerAlias(slotNo),
9091
m_rfLC(NULL),
9192
m_netLC(NULL),
9293
m_rfSeqNo(0U),
@@ -661,7 +662,7 @@ bool CDMRSlot::writeModem(unsigned char *data, unsigned int len)
661662
case FLCO_GPS_INFO:
662663
if (m_dumpTAData) {
663664
::sprintf(text, "DMR Slot %u, Embedded GPS Info", m_slotNo);
664-
CUtils::dump(2U, text, data, 9U);
665+
CUtils::dump(1U, text, data, 9U);
665666
logGPSPosition(data);
666667
}
667668
if (m_network != NULL)
@@ -675,12 +676,12 @@ bool CDMRSlot::writeModem(unsigned char *data, unsigned int len)
675676
if (!(m_rfTalkerId & TALKER_ID_HEADER)) {
676677
if (m_rfTalkerId == TALKER_ID_NONE)
677678
m_rfTalkerAlias.reset();
678-
m_rfTalkerAlias.add(0, data + 2U, 7U);
679-
m_display->writeDMRTA(m_slotNo, (unsigned char*)m_rfTalkerAlias.get(), "R");
679+
m_rfTalkerAlias.add(0U, data + 2U, 7U);
680+
m_display->writeDMRTA(m_slotNo, m_rfTalkerAlias.get(), "R");
680681

681682
if (m_dumpTAData) {
682683
::sprintf(text, "DMR Slot %u, Embedded Talker Alias Header", m_slotNo);
683-
CUtils::dump(2U, text, data, 9U);
684+
CUtils::dump(1U, text, data, 9U);
684685
}
685686

686687
m_rfTalkerId |= TALKER_ID_HEADER;
@@ -694,12 +695,12 @@ bool CDMRSlot::writeModem(unsigned char *data, unsigned int len)
694695
if (!(m_rfTalkerId & TALKER_ID_BLOCK1)) {
695696
if (m_rfTalkerId == TALKER_ID_NONE)
696697
m_rfTalkerAlias.reset();
697-
m_rfTalkerAlias.add(1, data + 2U, 7U);
698-
m_display->writeDMRTA(m_slotNo, (unsigned char*)m_rfTalkerAlias.get(), "R");
698+
m_rfTalkerAlias.add(1U, data + 2U, 7U);
699+
m_display->writeDMRTA(m_slotNo, m_rfTalkerAlias.get(), "R");
699700

700701
if (m_dumpTAData) {
701702
::sprintf(text, "DMR Slot %u, Embedded Talker Alias Block 1", m_slotNo);
702-
CUtils::dump(2U, text, data, 9U);
703+
CUtils::dump(1U, text, data, 9U);
703704
}
704705

705706
m_rfTalkerId |= TALKER_ID_BLOCK1;
@@ -713,12 +714,12 @@ bool CDMRSlot::writeModem(unsigned char *data, unsigned int len)
713714
if (!(m_rfTalkerId & TALKER_ID_BLOCK2)) {
714715
if (m_rfTalkerId == TALKER_ID_NONE)
715716
m_rfTalkerAlias.reset();
716-
m_rfTalkerAlias.add(2, data + 2U, 7U);
717-
m_display->writeDMRTA(m_slotNo, (unsigned char*)m_rfTalkerAlias.get(), "R");
717+
m_rfTalkerAlias.add(2U, data + 2U, 7U);
718+
m_display->writeDMRTA(m_slotNo, m_rfTalkerAlias.get(), "R");
718719

719720
if (m_dumpTAData) {
720721
::sprintf(text, "DMR Slot %u, Embedded Talker Alias Block 2", m_slotNo);
721-
CUtils::dump(2U, text, data, 9U);
722+
CUtils::dump(1U, text, data, 9U);
722723
}
723724

724725
m_rfTalkerId |= TALKER_ID_BLOCK2;
@@ -732,12 +733,12 @@ bool CDMRSlot::writeModem(unsigned char *data, unsigned int len)
732733
if (!(m_rfTalkerId & TALKER_ID_BLOCK3)) {
733734
if (m_rfTalkerId == TALKER_ID_NONE)
734735
m_rfTalkerAlias.reset();
735-
m_rfTalkerAlias.add(3, data + 2U, 7U);
736-
m_display->writeDMRTA(m_slotNo, (unsigned char*)m_rfTalkerAlias.get(), "R");
736+
m_rfTalkerAlias.add(3U, data + 2U, 7U);
737+
m_display->writeDMRTA(m_slotNo, m_rfTalkerAlias.get(), "R");
737738

738739
if (m_dumpTAData) {
739740
::sprintf(text, "DMR Slot %u, Embedded Talker Alias Block 3", m_slotNo);
740-
CUtils::dump(2U, text, data, 9U);
741+
CUtils::dump(1U, text, data, 9U);
741742
}
742743

743744
m_rfTalkerId |= TALKER_ID_BLOCK3;
@@ -1494,20 +1495,20 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData)
14941495
case FLCO_GPS_INFO:
14951496
if (m_dumpTAData) {
14961497
::sprintf(text, "DMR Slot %u, Embedded GPS Info", m_slotNo);
1497-
CUtils::dump(2U, text, data, 9U);
1498+
CUtils::dump(1U, text, data, 9U);
14981499
logGPSPosition(data);
14991500
}
15001501
break;
15011502
case FLCO_TALKER_ALIAS_HEADER:
15021503
if (!(m_netTalkerId & TALKER_ID_HEADER)) {
15031504
if (!m_netTalkerId)
1504-
m_rfTalkerAlias.reset();
1505-
m_rfTalkerAlias.add(0, data + 2U, 7U);
1506-
m_display->writeDMRTA(m_slotNo, (unsigned char*)m_rfTalkerAlias.get(), "N");
1505+
m_netTalkerAlias.reset();
1506+
m_netTalkerAlias.add(0U, data + 2U, 7U);
1507+
m_display->writeDMRTA(m_slotNo, m_netTalkerAlias.get(), "N");
15071508

15081509
if (m_dumpTAData) {
15091510
::sprintf(text, "DMR Slot %u, Embedded Talker Alias Header", m_slotNo);
1510-
CUtils::dump(2U, text, data, 9U);
1511+
CUtils::dump(1U, text, data, 9U);
15111512
}
15121513

15131514
m_netTalkerId |= TALKER_ID_HEADER;
@@ -1516,13 +1517,13 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData)
15161517
case FLCO_TALKER_ALIAS_BLOCK1:
15171518
if (!(m_netTalkerId & TALKER_ID_BLOCK1)) {
15181519
if (!m_netTalkerId)
1519-
m_rfTalkerAlias.reset();
1520-
m_rfTalkerAlias.add(1, data + 2U, 7U);
1521-
m_display->writeDMRTA(m_slotNo, (unsigned char*)m_rfTalkerAlias.get(), "N");
1520+
m_netTalkerAlias.reset();
1521+
m_netTalkerAlias.add(1U, data + 2U, 7U);
1522+
m_display->writeDMRTA(m_slotNo, m_netTalkerAlias.get(), "N");
15221523

15231524
if (m_dumpTAData) {
15241525
::sprintf(text, "DMR Slot %u, Embedded Talker Alias Block 1", m_slotNo);
1525-
CUtils::dump(2U, text, data, 9U);
1526+
CUtils::dump(1U, text, data, 9U);
15261527
}
15271528

15281529
m_netTalkerId |= TALKER_ID_BLOCK1;
@@ -1531,13 +1532,13 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData)
15311532
case FLCO_TALKER_ALIAS_BLOCK2:
15321533
if (!(m_netTalkerId & TALKER_ID_BLOCK2)) {
15331534
if (!m_netTalkerId)
1534-
m_rfTalkerAlias.reset();
1535-
m_rfTalkerAlias.add(2, data + 2U, 7U);
1536-
m_display->writeDMRTA(m_slotNo, (unsigned char*)m_rfTalkerAlias.get(), "N");
1535+
m_netTalkerAlias.reset();
1536+
m_netTalkerAlias.add(2U, data + 2U, 7U);
1537+
m_display->writeDMRTA(m_slotNo, m_netTalkerAlias.get(), "N");
15371538

15381539
if (m_dumpTAData) {
15391540
::sprintf(text, "DMR Slot %u, Embedded Talker Alias Block 2", m_slotNo);
1540-
CUtils::dump(2U, text, data, 9U);
1541+
CUtils::dump(1U, text, data, 9U);
15411542
}
15421543

15431544
m_netTalkerId |= TALKER_ID_BLOCK2;
@@ -1546,13 +1547,13 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData)
15461547
case FLCO_TALKER_ALIAS_BLOCK3:
15471548
if (!(m_netTalkerId & TALKER_ID_BLOCK3)) {
15481549
if (!m_netTalkerId)
1549-
m_rfTalkerAlias.reset();
1550-
m_rfTalkerAlias.add(3, data+2U, 7U);
1551-
m_display->writeDMRTA(m_slotNo, (unsigned char*)m_rfTalkerAlias.get(), "N");
1550+
m_netTalkerAlias.reset();
1551+
m_netTalkerAlias.add(3U, data + 2U, 7U);
1552+
m_display->writeDMRTA(m_slotNo, m_netTalkerAlias.get(), "N");
15521553

15531554
if (m_dumpTAData) {
15541555
::sprintf(text, "DMR Slot %u, Embedded Talker Alias Block 3", m_slotNo);
1555-
CUtils::dump(2U, text, data, 9U);
1556+
CUtils::dump(1U, text, data, 9U);
15561557
}
15571558

15581559
m_netTalkerId |= TALKER_ID_BLOCK3;

DMRSlot.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (C) 2015-2021 by Jonathan Naylor G4KLX
2+
* Copyright (C) 2015-2021,2023 by Jonathan Naylor G4KLX
33
*
44
* This program is free software; you can redistribute it and/or modify
55
* it under the terms of the GNU General Public License as published by
@@ -80,6 +80,7 @@ class CDMRSlot {
8080
unsigned int m_netEmbeddedReadN;
8181
unsigned int m_netEmbeddedWriteN;
8282
unsigned char m_netTalkerId;
83+
CDMRTA m_netTalkerAlias;
8384
CDMRLC* m_rfLC;
8485
CDMRLC* m_netLC;
8586
unsigned char m_rfSeqNo;
@@ -132,7 +133,7 @@ class CDMRSlot {
132133

133134
static unsigned char* m_idle;
134135

135-
static FLCO m_flco1;
136+
static FLCO m_flco1;
136137
static unsigned char m_id1;
137138
static ACTIVITY_TYPE m_activity1;
138139
static FLCO m_flco2;

DMRTA.cpp

Lines changed: 78 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (C) 2015,2016,2017,2018 Jonathan Naylor, G4KLX
2+
* Copyright (C) 2015,2016,2017,2018,2023 Jonathan Naylor, G4KLX
33
* Copyright (C) 2018 by Shawn Chain, BG5HHP
44
*
55
* This program is free software; you can redistribute it and/or modify
@@ -18,8 +18,9 @@
1818
#include <cstring>
1919
#include <cassert>
2020

21-
CDMRTA::CDMRTA() :
22-
m_TA(),
21+
CDMRTA::CDMRTA(unsigned int slotNo) :
22+
m_slotNo(slotNo),
23+
m_ta(),
2324
m_buf()
2425
{
2526
}
@@ -31,13 +32,14 @@ CDMRTA::~CDMRTA()
3132
bool CDMRTA::add(unsigned int blockId, const unsigned char* data, unsigned int len)
3233
{
3334
assert(data != NULL);
34-
if (blockId > 3) {
35+
36+
if (blockId > 3U) {
3537
// invalid block id
3638
reset();
3739
return false;
3840
}
3941

40-
unsigned int offset = blockId * 7;
42+
unsigned int offset = blockId * 7U;
4143

4244
if (offset + len >= sizeof(m_buf)) {
4345
// buffer overflow
@@ -52,75 +54,83 @@ bool CDMRTA::add(unsigned int blockId, const unsigned char* data, unsigned int l
5254

5355
const unsigned char* CDMRTA::get()
5456
{
55-
return (unsigned char*)m_TA;
57+
return (unsigned char*)m_ta;
5658
}
5759

5860
void CDMRTA::reset()
5961
{
60-
::memset(m_TA, 0, sizeof(m_TA));
61-
::memset(m_buf, 0, sizeof(m_buf));
62+
::memset(m_ta, 0x00U, sizeof(m_ta));
63+
::memset(m_buf, 0x00U, sizeof(m_buf));
6264
}
6365

6466
bool CDMRTA::decodeTA()
6567
{
66-
unsigned char *b;
67-
unsigned char c;
68-
int j;
69-
unsigned int i, t1, t2;
70-
71-
unsigned char* talkerAlias = m_buf;
72-
73-
unsigned int TAformat = (talkerAlias[0] >> 6U) & 0x03U;
74-
unsigned int TAsize = (talkerAlias[0] >> 1U) & 0x1FU;
75-
::strcpy(m_TA, "(could not decode)");
76-
77-
switch (TAformat) {
78-
case 0U: // 7 bit
79-
::memset(m_TA, 0, sizeof(m_TA));
80-
b = &talkerAlias[0];
81-
t1 = 0U; t2 = 0U; c = 0U;
82-
for (i = 0U; (i < 32U) && (t2 < TAsize); i++) {
83-
for (j = 7; j >= 0; j--) {
84-
c = (c << 1U) | (b[i] >> j);
85-
if (++t1 == 7U) {
86-
if (i > 0U)
87-
m_TA[t2++] = c & 0x7FU;
88-
89-
t1 = 0U;
90-
c = 0U;
91-
}
92-
}
93-
}
94-
m_TA[TAsize] = 0;
95-
break;
96-
97-
case 1U: // ISO 8 bit
98-
case 2U: // UTF8
99-
::memcpy(m_TA, talkerAlias + 1U, sizeof(m_TA));
100-
break;
101-
102-
case 3U: // UTF16 poor man's conversion
103-
t2=0;
104-
::memset(&m_TA, 0, sizeof(m_TA));
105-
for (i = 0U; (i < 15U) && (t2 < TAsize); i++) {
106-
if (talkerAlias[2U * i + 1U] == 0)
107-
m_TA[t2++] = talkerAlias[2U * i + 2U];
108-
else
109-
m_TA[t2++] = '?';
110-
}
111-
m_TA[TAsize] = 0;
112-
break;
113-
}
114-
115-
size_t TAlen = ::strlen(m_TA);
116-
LogMessage("DMR Talker Alias (Data Format %u, Received %u/%u char): '%s'", TAformat, TAlen, TAsize, m_TA);
117-
118-
if (TAlen > TAsize) {
119-
if (TAlen < 29U)
120-
strcat(m_TA, " ?");
121-
else
122-
strcpy(m_TA + 28U, " ?");
123-
}
124-
125-
return TAlen >= TAsize;
68+
unsigned int taFormat = (m_buf[0] >> 6U) & 0x03U;
69+
unsigned int taSize = (m_buf[0] >> 1U) & 0x1FU;
70+
::strcpy(m_ta, "(could not decode)");
71+
72+
switch (taFormat) {
73+
case 0U: { // 7 bit
74+
::memset(m_ta, 0x00U, sizeof(m_ta));
75+
76+
unsigned char* b = m_buf;
77+
unsigned int t1 = 0U;
78+
unsigned int t2 = 0U;
79+
unsigned char c = 0U;
80+
81+
for (unsigned int i = 0U; (i < 32U) && (t2 < taSize); i++) {
82+
for (int j = 7; j >= 0; j--) {
83+
c = (c << 1U) | (b[i] >> j);
84+
85+
if (++t1 == 7U) {
86+
if (i > 0U)
87+
m_ta[t2++] = c & 0x7FU;
88+
89+
t1 = 0U;
90+
c = 0U;
91+
}
92+
}
93+
}
94+
95+
m_ta[taSize] = 0;
96+
}
97+
break;
98+
99+
case 1U: // ISO 8 bit
100+
case 2U: // UTF8
101+
::memcpy(m_ta, m_buf + 1U, sizeof(m_ta));
102+
break;
103+
104+
case 3U: { // UTF16 poor man's conversion
105+
unsigned int t2 = 0U;
106+
::memset(&m_ta, 0x00U, sizeof(m_ta));
107+
108+
for (unsigned int i = 0U; (i < 15U) && (t2 < taSize); i++) {
109+
if (m_buf[2U * i + 1U] == 0)
110+
m_ta[t2++] = m_buf[2U * i + 2U];
111+
else
112+
m_ta[t2++] = '?';
113+
}
114+
115+
m_ta[taSize] = 0;
116+
}
117+
break;
118+
}
119+
120+
size_t taLen = ::strlen(m_ta);
121+
122+
if (taLen == taSize)
123+
LogMessage("DMR Slot %u, Talker Alias \"%s\"", m_slotNo, m_ta);
124+
125+
LogDebug("DMR Slot %u, Talker Alias (Data Format %u, Received %u/%u char): '%s'", m_slotNo, taFormat, taLen, taSize, m_ta);
126+
127+
if (taLen > taSize) {
128+
if (taLen < 29U)
129+
::strcat(m_ta, " ?");
130+
else
131+
::strcpy(m_ta + 28U, " ?");
132+
}
133+
134+
return taLen >= taSize;
126135
}
136+

0 commit comments

Comments
 (0)