mirror of
https://github.com/g4klx/MMDVMHost
synced 2025-12-21 06:55:52 +08:00
Clean up the DMR Talker Alias code and logging.
This commit is contained in:
128
DMRTA.cpp
128
DMRTA.cpp
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 2015,2016,2017,2018 Jonathan Naylor, G4KLX
|
||||
* Copyright (C) 2015,2016,2017,2018,2023 Jonathan Naylor, G4KLX
|
||||
* Copyright (C) 2018 by Shawn Chain, BG5HHP
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
@@ -18,8 +18,9 @@
|
||||
#include <cstring>
|
||||
#include <cassert>
|
||||
|
||||
CDMRTA::CDMRTA() :
|
||||
m_TA(),
|
||||
CDMRTA::CDMRTA(unsigned int slotNo) :
|
||||
m_slotNo(slotNo),
|
||||
m_ta(),
|
||||
m_buf()
|
||||
{
|
||||
}
|
||||
@@ -31,13 +32,14 @@ CDMRTA::~CDMRTA()
|
||||
bool CDMRTA::add(unsigned int blockId, const unsigned char* data, unsigned int len)
|
||||
{
|
||||
assert(data != NULL);
|
||||
if (blockId > 3) {
|
||||
|
||||
if (blockId > 3U) {
|
||||
// invalid block id
|
||||
reset();
|
||||
return false;
|
||||
}
|
||||
|
||||
unsigned int offset = blockId * 7;
|
||||
unsigned int offset = blockId * 7U;
|
||||
|
||||
if (offset + len >= sizeof(m_buf)) {
|
||||
// buffer overflow
|
||||
@@ -52,75 +54,83 @@ bool CDMRTA::add(unsigned int blockId, const unsigned char* data, unsigned int l
|
||||
|
||||
const unsigned char* CDMRTA::get()
|
||||
{
|
||||
return (unsigned char*)m_TA;
|
||||
return (unsigned char*)m_ta;
|
||||
}
|
||||
|
||||
void CDMRTA::reset()
|
||||
{
|
||||
::memset(m_TA, 0, sizeof(m_TA));
|
||||
::memset(m_buf, 0, sizeof(m_buf));
|
||||
::memset(m_ta, 0x00U, sizeof(m_ta));
|
||||
::memset(m_buf, 0x00U, sizeof(m_buf));
|
||||
}
|
||||
|
||||
bool CDMRTA::decodeTA()
|
||||
{
|
||||
unsigned char *b;
|
||||
unsigned char c;
|
||||
int j;
|
||||
unsigned int i, t1, t2;
|
||||
unsigned int taFormat = (m_buf[0] >> 6U) & 0x03U;
|
||||
unsigned int taSize = (m_buf[0] >> 1U) & 0x1FU;
|
||||
::strcpy(m_ta, "(could not decode)");
|
||||
|
||||
unsigned char* talkerAlias = m_buf;
|
||||
switch (taFormat) {
|
||||
case 0U: { // 7 bit
|
||||
::memset(m_ta, 0x00U, sizeof(m_ta));
|
||||
|
||||
unsigned int TAformat = (talkerAlias[0] >> 6U) & 0x03U;
|
||||
unsigned int TAsize = (talkerAlias[0] >> 1U) & 0x1FU;
|
||||
::strcpy(m_TA, "(could not decode)");
|
||||
unsigned char* b = m_buf;
|
||||
unsigned int t1 = 0U;
|
||||
unsigned int t2 = 0U;
|
||||
unsigned char c = 0U;
|
||||
|
||||
switch (TAformat) {
|
||||
case 0U: // 7 bit
|
||||
::memset(m_TA, 0, sizeof(m_TA));
|
||||
b = &talkerAlias[0];
|
||||
t1 = 0U; t2 = 0U; c = 0U;
|
||||
for (i = 0U; (i < 32U) && (t2 < TAsize); i++) {
|
||||
for (j = 7; j >= 0; j--) {
|
||||
c = (c << 1U) | (b[i] >> j);
|
||||
if (++t1 == 7U) {
|
||||
if (i > 0U)
|
||||
m_TA[t2++] = c & 0x7FU;
|
||||
for (unsigned int i = 0U; (i < 32U) && (t2 < taSize); i++) {
|
||||
for (int j = 7; j >= 0; j--) {
|
||||
c = (c << 1U) | (b[i] >> j);
|
||||
|
||||
t1 = 0U;
|
||||
c = 0U;
|
||||
}
|
||||
}
|
||||
}
|
||||
m_TA[TAsize] = 0;
|
||||
break;
|
||||
if (++t1 == 7U) {
|
||||
if (i > 0U)
|
||||
m_ta[t2++] = c & 0x7FU;
|
||||
|
||||
case 1U: // ISO 8 bit
|
||||
case 2U: // UTF8
|
||||
::memcpy(m_TA, talkerAlias + 1U, sizeof(m_TA));
|
||||
break;
|
||||
t1 = 0U;
|
||||
c = 0U;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
case 3U: // UTF16 poor man's conversion
|
||||
t2=0;
|
||||
::memset(&m_TA, 0, sizeof(m_TA));
|
||||
for (i = 0U; (i < 15U) && (t2 < TAsize); i++) {
|
||||
if (talkerAlias[2U * i + 1U] == 0)
|
||||
m_TA[t2++] = talkerAlias[2U * i + 2U];
|
||||
else
|
||||
m_TA[t2++] = '?';
|
||||
}
|
||||
m_TA[TAsize] = 0;
|
||||
break;
|
||||
}
|
||||
m_ta[taSize] = 0;
|
||||
}
|
||||
break;
|
||||
|
||||
size_t TAlen = ::strlen(m_TA);
|
||||
LogMessage("DMR Talker Alias (Data Format %u, Received %u/%u char): '%s'", TAformat, TAlen, TAsize, m_TA);
|
||||
case 1U: // ISO 8 bit
|
||||
case 2U: // UTF8
|
||||
::memcpy(m_ta, m_buf + 1U, sizeof(m_ta));
|
||||
break;
|
||||
|
||||
if (TAlen > TAsize) {
|
||||
if (TAlen < 29U)
|
||||
strcat(m_TA, " ?");
|
||||
else
|
||||
strcpy(m_TA + 28U, " ?");
|
||||
}
|
||||
case 3U: { // UTF16 poor man's conversion
|
||||
unsigned int t2 = 0U;
|
||||
::memset(&m_ta, 0x00U, sizeof(m_ta));
|
||||
|
||||
return TAlen >= TAsize;
|
||||
for (unsigned int i = 0U; (i < 15U) && (t2 < taSize); i++) {
|
||||
if (m_buf[2U * i + 1U] == 0)
|
||||
m_ta[t2++] = m_buf[2U * i + 2U];
|
||||
else
|
||||
m_ta[t2++] = '?';
|
||||
}
|
||||
|
||||
m_ta[taSize] = 0;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
size_t taLen = ::strlen(m_ta);
|
||||
|
||||
if (taLen == taSize)
|
||||
LogMessage("DMR Slot %u, Talker Alias \"%s\"", m_slotNo, m_ta);
|
||||
|
||||
LogDebug("DMR Slot %u, Talker Alias (Data Format %u, Received %u/%u char): '%s'", m_slotNo, taFormat, taLen, taSize, m_ta);
|
||||
|
||||
if (taLen > taSize) {
|
||||
if (taLen < 29U)
|
||||
::strcat(m_ta, " ?");
|
||||
else
|
||||
::strcpy(m_ta + 28U, " ?");
|
||||
}
|
||||
|
||||
return taLen >= taSize;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user