Skip to content

Commit d3f8c17

Browse files
committed
Add M17 LSF Text data interpretation.
1 parent af21cef commit d3f8c17

File tree

2 files changed

+85
-4
lines changed

2 files changed

+85
-4
lines changed

M17Control.cpp

Lines changed: 81 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,10 @@ m_rfCollectedLSF(),
8686
m_rfLSFn(0U),
8787
m_netLSF(),
8888
m_netLSFn(0U),
89+
m_rfTextBits(0x00U),
90+
m_netTextBits(0x00U),
91+
m_rfText(NULL),
92+
m_netText(NULL),
8993
m_rssiMapper(rssiMapper),
9094
m_rssi(0U),
9195
m_maxRSSI(0U),
@@ -97,10 +101,15 @@ m_fp(NULL)
97101
{
98102
assert(display != NULL);
99103
assert(rssiMapper != NULL);
104+
105+
m_rfText = new char[4U * M17_META_LENGTH_BYTES];
106+
m_netText = new char[4U * M17_META_LENGTH_BYTES];
100107
}
101108

102109
CM17Control::~CM17Control()
103110
{
111+
delete[] m_netText;
112+
delete[] m_rfText;
104113
}
105114

106115
bool CM17Control::writeModem(unsigned char* data, unsigned int len)
@@ -196,7 +205,8 @@ bool CM17Control::writeModem(unsigned char* data, unsigned int len)
196205
m_rssiCount = 1U;
197206
m_rfLSFn = 0U;
198207
m_rfLSFCount = 0U;
199-
208+
m_rfTextBits = 0x00U;
209+
::memset(m_rfText, 0x00U, 4U * M17_META_LENGTH_BYTES);
200210
#if defined(DUMP_M17)
201211
openFile();
202212
#endif
@@ -249,7 +259,8 @@ bool CM17Control::writeModem(unsigned char* data, unsigned int len)
249259
m_aveRSSI = m_rssi;
250260
m_rssiCount = 1U;
251261
m_rfLSFCount = 0U;
252-
262+
m_rfTextBits = 0x00U;
263+
::memset(m_rfText, 0x00U, 4U * M17_META_LENGTH_BYTES);
253264
#if defined(DUMP_M17)
254265
openFile();
255266
#endif
@@ -282,6 +293,38 @@ bool CM17Control::writeModem(unsigned char* data, unsigned int len)
282293
if (valid) {
283294
m_rfCollectedLSF = m_rfCollectingLSF;
284295
m_rfCollectingLSF.reset();
296+
297+
unsigned char encryptionType = m_rfCollectedLSF.getEncryptionType();
298+
unsigned char encryptionSubType = m_rfCollectedLSF.getEncryptionSubType();
299+
if (encryptionType == M17_ENCRYPTION_TYPE_NONE && encryptionSubType == M17_ENCRYPTION_SUB_TYPE_TEXT) {
300+
unsigned char meta[20U];
301+
m_rfCollectedLSF.getMeta(meta);
302+
CUtils::dump(1U, "M17, LSF text data fragment", meta, M17_META_LENGTH_BYTES);
303+
304+
m_rfTextBits |= meta[0U];
305+
306+
switch (meta[0U] & 0x0FU) {
307+
case 0x01U:
308+
::memcpy(m_rfText + 0U, meta + 1U, M17_META_LENGTH_BYTES - 1U);
309+
break;
310+
case 0x02U:
311+
::memcpy(m_rfText + 13U, meta + 1U, M17_META_LENGTH_BYTES - 1U);
312+
break;
313+
case 0x04U:
314+
::memcpy(m_rfText + 26U, meta + 1U, M17_META_LENGTH_BYTES - 1U);
315+
break;
316+
case 0x08U:
317+
::memcpy(m_rfText + 39U, meta + 1U, M17_META_LENGTH_BYTES - 1U);
318+
break;
319+
default:
320+
break;
321+
}
322+
323+
if (m_rfTextBits == 0x11U || m_rfTextBits == 0x33U || m_rfTextBits == 0x77U || m_rfTextBits == 0xFFU) {
324+
LogMessage("M17, text Data: \"%s\"", m_rfText);
325+
m_rfTextBits = 0x00U;
326+
}
327+
}
285328
}
286329
}
287330

@@ -547,8 +590,10 @@ void CM17Control::writeNetwork()
547590

548591
m_netTimeoutTimer.start();
549592
m_elapsed.start();
550-
m_netFrames = 0U;
551-
m_netLSFn = 0U;
593+
m_netFrames = 0U;
594+
m_netLSFn = 0U;
595+
m_netTextBits = 0x00U;
596+
::memset(m_netText, 0x00U, 4U * M17_META_LENGTH_BYTES);
552597

553598
// Create a dummy start message
554599
unsigned char start[M17_FRAME_LENGTH_BYTES + 2U];
@@ -580,6 +625,38 @@ void CM17Control::writeNetwork()
580625

581626
m_netLSF.setSource(m_callsign);
582627
m_netLSF.setCAN(m_can);
628+
629+
unsigned char encryptionType = m_netLSF.getEncryptionType();
630+
unsigned char encryptionSubType = m_netLSF.getEncryptionSubType();
631+
if (encryptionType == M17_ENCRYPTION_TYPE_NONE && encryptionSubType == M17_ENCRYPTION_SUB_TYPE_TEXT) {
632+
unsigned char meta[20U];
633+
m_netLSF.getMeta(meta);
634+
CUtils::dump(1U, "M17, LSF text data fragment", meta, M17_META_LENGTH_BYTES);
635+
636+
m_netTextBits |= meta[0U];
637+
638+
switch (meta[0U] & 0x0FU) {
639+
case 0x01U:
640+
::memcpy(m_netText + 0U, meta + 1U, M17_META_LENGTH_BYTES - 1U);
641+
break;
642+
case 0x02U:
643+
::memcpy(m_netText + 13U, meta + 1U, M17_META_LENGTH_BYTES - 1U);
644+
break;
645+
case 0x04U:
646+
::memcpy(m_netText + 26U, meta + 1U, M17_META_LENGTH_BYTES - 1U);
647+
break;
648+
case 0x08U:
649+
::memcpy(m_netText + 39U, meta + 1U, M17_META_LENGTH_BYTES - 1U);
650+
break;
651+
default:
652+
break;
653+
}
654+
655+
if (m_netTextBits == 0x11U || m_netTextBits == 0x33U || m_netTextBits == 0x77U || m_netTextBits == 0xFFU) {
656+
LogMessage("M17, text Data: \"%s\"", m_netText);
657+
m_netTextBits = 0x00U;
658+
}
659+
}
583660
}
584661

585662
unsigned char data[M17_FRAME_LENGTH_BYTES + 2U];

M17Control.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,10 @@ class CM17Control {
7676
unsigned int m_rfLSFn;
7777
CM17LSF m_netLSF;
7878
unsigned int m_netLSFn;
79+
unsigned char m_rfTextBits;
80+
unsigned char m_netTextBits;
81+
char* m_rfText;
82+
char* m_netText;
7983
CRSSIInterpolator* m_rssiMapper;
8084
unsigned char m_rssi;
8185
unsigned char m_maxRSSI;

0 commit comments

Comments
 (0)