mirror of
https://github.com/g4klx/MMDVMHost
synced 2025-12-21 15:09:23 +08:00
Add BER display to the Nextion and reduce Talker Id logging.
This commit is contained in:
93
DMRSlot.cpp
93
DMRSlot.cpp
@@ -54,6 +54,12 @@ FLCO CDMRSlot::m_flco2;
|
||||
unsigned char CDMRSlot::m_id2 = 0U;
|
||||
bool CDMRSlot::m_voice2 = true;
|
||||
|
||||
const unsigned char TALKER_ID_NONE = 0x00U;
|
||||
const unsigned char TALKER_ID_HEADER = 0x01U;
|
||||
const unsigned char TALKER_ID_BLOCK1 = 0x02U;
|
||||
const unsigned char TALKER_ID_BLOCK2 = 0x04U;
|
||||
const unsigned char TALKER_ID_BLOCK3 = 0x08U;
|
||||
|
||||
// #define DUMP_DMR
|
||||
|
||||
CDMRSlot::CDMRSlot(unsigned int slotNo, unsigned int timeout) :
|
||||
@@ -65,10 +71,12 @@ m_rfEmbeddedLC(),
|
||||
m_rfEmbeddedData(NULL),
|
||||
m_rfEmbeddedReadN(0U),
|
||||
m_rfEmbeddedWriteN(1U),
|
||||
m_rfTalkerId(TALKER_ID_NONE),
|
||||
m_netEmbeddedLC(),
|
||||
m_netEmbeddedData(NULL),
|
||||
m_netEmbeddedReadN(0U),
|
||||
m_netEmbeddedWriteN(1U),
|
||||
m_netTalkerId(TALKER_ID_NONE),
|
||||
m_rfLC(NULL),
|
||||
m_netLC(NULL),
|
||||
m_rfDataHeader(),
|
||||
@@ -222,8 +230,10 @@ void CDMRSlot::writeModem(unsigned char *data, unsigned int len)
|
||||
m_rfSeqNo = 0U;
|
||||
m_rfBits = 1U;
|
||||
m_rfErrs = 0U;
|
||||
|
||||
m_rfEmbeddedReadN = 0U;
|
||||
m_rfEmbeddedWriteN = 1U;
|
||||
m_rfTalkerId = TALKER_ID_NONE;
|
||||
|
||||
m_minRSSI = m_rssi;
|
||||
m_maxRSSI = m_rssi;
|
||||
@@ -452,7 +462,7 @@ void CDMRSlot::writeModem(unsigned char *data, unsigned int len)
|
||||
if (ret) {
|
||||
trellis.encode(payload, data + 2U);
|
||||
} else {
|
||||
LogMessage("DMR Slot %u, unfixable RF rate 3/4 data", m_slotNo);
|
||||
LogDebug("DMR Slot %u, unfixable rate 3/4 data", m_slotNo);
|
||||
CUtils::dump(1U, "Data", data + 2U, DMR_FRAME_LENGTH_BYTES);
|
||||
}
|
||||
}
|
||||
@@ -485,7 +495,8 @@ void CDMRSlot::writeModem(unsigned char *data, unsigned int len)
|
||||
unsigned char fid = m_rfLC->getFID();
|
||||
if (fid == FID_ETSI || fid == FID_DMRA) {
|
||||
errors = m_fec.regenerateDMR(data + 2U);
|
||||
LogDebug("DMR Slot %u, audio sequence no. 0, errs: %u/141", m_slotNo, errors);
|
||||
LogDebug("DMR Slot %u, audio sequence no. 0, errs: %u/141 (%.1f%%)", m_slotNo, errors, float(errors) / 1.41F);
|
||||
m_display->writeDMRBER(m_slotNo, float(errors) / 1.41F);
|
||||
m_rfErrs += errors;
|
||||
}
|
||||
|
||||
@@ -518,7 +529,8 @@ void CDMRSlot::writeModem(unsigned char *data, unsigned int len)
|
||||
unsigned char fid = m_rfLC->getFID();
|
||||
if (fid == FID_ETSI || fid == FID_DMRA) {
|
||||
errors = m_fec.regenerateDMR(data + 2U);
|
||||
LogDebug("DMR Slot %u, audio sequence no. %u, errs: %u/141", m_slotNo, m_rfN, errors);
|
||||
LogDebug("DMR Slot %u, audio sequence no. %u, errs: %u/141 (%.1f%%)", m_slotNo, m_rfN, errors, float(errors) / 1.41F);
|
||||
m_display->writeDMRBER(m_slotNo, float(errors) / 1.41F);
|
||||
m_rfErrs += errors;
|
||||
}
|
||||
|
||||
@@ -547,23 +559,35 @@ void CDMRSlot::writeModem(unsigned char *data, unsigned int len)
|
||||
break;
|
||||
case FLCO_GPS_INFO:
|
||||
::sprintf(text, "DMR Slot %u, Embedded GPS Info", m_slotNo);
|
||||
CUtils::dump(1U, text, data, 9U);
|
||||
CUtils::dump(2U, text, data, 9U);
|
||||
break;
|
||||
case FLCO_TALKER_ALIAS_HEADER:
|
||||
::sprintf(text, "DMR Slot %u, Embedded Talker Alias Header", m_slotNo);
|
||||
CUtils::dump(1U, text, data, 9U);
|
||||
if (!(m_rfTalkerId & TALKER_ID_HEADER)) {
|
||||
::sprintf(text, "DMR Slot %u, Embedded Talker Alias Header", m_slotNo);
|
||||
CUtils::dump(2U, text, data, 9U);
|
||||
m_rfTalkerId |= TALKER_ID_HEADER;
|
||||
}
|
||||
break;
|
||||
case FLCO_TALKER_ALIAS_BLOCK1:
|
||||
::sprintf(text, "DMR Slot %u, Embedded Talker Alias Block 1", m_slotNo);
|
||||
CUtils::dump(1U, text, data, 9U);
|
||||
if (!(m_rfTalkerId & TALKER_ID_BLOCK1)) {
|
||||
::sprintf(text, "DMR Slot %u, Embedded Talker Alias Block 1", m_slotNo);
|
||||
CUtils::dump(2U, text, data, 9U);
|
||||
m_rfTalkerId |= TALKER_ID_BLOCK1;
|
||||
}
|
||||
break;
|
||||
case FLCO_TALKER_ALIAS_BLOCK2:
|
||||
::sprintf(text, "DMR Slot %u, Embedded Talker Alias Block 2", m_slotNo);
|
||||
CUtils::dump(1U, text, data, 9U);
|
||||
if (!(m_rfTalkerId & TALKER_ID_BLOCK2)) {
|
||||
::sprintf(text, "DMR Slot %u, Embedded Talker Alias Block 2", m_slotNo);
|
||||
CUtils::dump(2U, text, data, 9U);
|
||||
m_rfTalkerId |= TALKER_ID_BLOCK2;
|
||||
}
|
||||
break;
|
||||
case FLCO_TALKER_ALIAS_BLOCK3:
|
||||
::sprintf(text, "DMR Slot %u, Embedded Talker Alias Block 3", m_slotNo);
|
||||
CUtils::dump(1U, text, data, 9U);
|
||||
if (!(m_rfTalkerId & TALKER_ID_BLOCK3)) {
|
||||
::sprintf(text, "DMR Slot %u, Embedded Talker Alias Block 3", m_slotNo);
|
||||
CUtils::dump(2U, text, data, 9U);
|
||||
m_rfTalkerId |= TALKER_ID_BLOCK3;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
::sprintf(text, "DMR Slot %u, Unknown Embedded Data", m_slotNo);
|
||||
@@ -657,8 +681,10 @@ void CDMRSlot::writeModem(unsigned char *data, unsigned int len)
|
||||
m_rfSeqNo = 0U;
|
||||
m_rfBits = 1U;
|
||||
m_rfErrs = 0U;
|
||||
|
||||
m_rfEmbeddedReadN = 0U;
|
||||
m_rfEmbeddedWriteN = 1U;
|
||||
m_rfTalkerId = TALKER_ID_NONE;
|
||||
|
||||
m_minRSSI = m_rssi;
|
||||
m_maxRSSI = m_rssi;
|
||||
@@ -686,7 +712,7 @@ void CDMRSlot::writeModem(unsigned char *data, unsigned int len)
|
||||
unsigned char fid = m_rfLC->getFID();
|
||||
if (fid == FID_ETSI || fid == FID_DMRA) {
|
||||
errors = m_fec.regenerateDMR(data + 2U);
|
||||
LogDebug("DMR Slot %u, audio sequence no. %u, errs: %u/141", m_slotNo, m_rfN, errors);
|
||||
LogDebug("DMR Slot %u, audio sequence no. %u, errs: %u/141 (%.1f%%)", m_slotNo, m_rfN, errors, float(errors) / 1.41F);
|
||||
m_rfErrs += errors;
|
||||
}
|
||||
|
||||
@@ -710,6 +736,7 @@ void CDMRSlot::writeModem(unsigned char *data, unsigned int len)
|
||||
setShortLC(m_slotNo, dstId, flco, true);
|
||||
m_display->writeDMR(m_slotNo, src, flco == FLCO_GROUP, dst, "R");
|
||||
m_display->writeDMRRSSI(m_slotNo, m_rssi);
|
||||
m_display->writeDMRBER(m_slotNo, float(errors) / 1.41F);
|
||||
}
|
||||
|
||||
LogMessage("DMR Slot %u, received RF late entry from %s to %s%s", m_slotNo, src.c_str(), flco == FLCO_GROUP ? "TG " : "", dst.c_str());
|
||||
@@ -939,8 +966,10 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData)
|
||||
m_netLost = 0U;
|
||||
m_netBits = 1U;
|
||||
m_netErrs = 0U;
|
||||
|
||||
m_netEmbeddedReadN = 0U;
|
||||
m_netEmbeddedWriteN = 1U;
|
||||
m_netTalkerId = TALKER_ID_NONE;
|
||||
|
||||
if (m_duplex) {
|
||||
m_queue.clear();
|
||||
@@ -1195,8 +1224,10 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData)
|
||||
m_netLost = 0U;
|
||||
m_netBits = 1U;
|
||||
m_netErrs = 0U;
|
||||
|
||||
m_netEmbeddedReadN = 0U;
|
||||
m_netEmbeddedWriteN = 1U;
|
||||
m_netTalkerId = TALKER_ID_NONE;
|
||||
|
||||
m_netState = RS_NET_AUDIO;
|
||||
|
||||
@@ -1284,23 +1315,35 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData)
|
||||
break;
|
||||
case FLCO_GPS_INFO:
|
||||
::sprintf(text, "DMR Slot %u, Embedded GPS Info", m_slotNo);
|
||||
CUtils::dump(1U, text, data, 9U);
|
||||
CUtils::dump(2U, text, data, 9U);
|
||||
break;
|
||||
case FLCO_TALKER_ALIAS_HEADER:
|
||||
::sprintf(text, "DMR Slot %u, Embedded Talker Alias Header", m_slotNo);
|
||||
CUtils::dump(1U, text, data, 9U);
|
||||
if (!(m_netTalkerId & TALKER_ID_HEADER)) {
|
||||
::sprintf(text, "DMR Slot %u, Embedded Talker Alias Header", m_slotNo);
|
||||
CUtils::dump(2U, text, data, 9U);
|
||||
m_netTalkerId |= TALKER_ID_HEADER;
|
||||
}
|
||||
break;
|
||||
case FLCO_TALKER_ALIAS_BLOCK1:
|
||||
::sprintf(text, "DMR Slot %u, Embedded Talker Alias Block 1", m_slotNo);
|
||||
CUtils::dump(1U, text, data, 9U);
|
||||
if (!(m_netTalkerId & TALKER_ID_BLOCK1)) {
|
||||
::sprintf(text, "DMR Slot %u, Embedded Talker Alias Block 1", m_slotNo);
|
||||
CUtils::dump(2U, text, data, 9U);
|
||||
m_netTalkerId |= TALKER_ID_BLOCK1;
|
||||
}
|
||||
break;
|
||||
case FLCO_TALKER_ALIAS_BLOCK2:
|
||||
::sprintf(text, "DMR Slot %u, Embedded Talker Alias Block 2", m_slotNo);
|
||||
CUtils::dump(1U, text, data, 9U);
|
||||
if (!(m_netTalkerId & TALKER_ID_BLOCK2)) {
|
||||
::sprintf(text, "DMR Slot %u, Embedded Talker Alias Block 2", m_slotNo);
|
||||
CUtils::dump(2U, text, data, 9U);
|
||||
m_netTalkerId |= TALKER_ID_BLOCK2;
|
||||
}
|
||||
break;
|
||||
case FLCO_TALKER_ALIAS_BLOCK3:
|
||||
::sprintf(text, "DMR Slot %u, Embedded Talker Alias Block 3", m_slotNo);
|
||||
CUtils::dump(1U, text, data, 9U);
|
||||
if (!(m_netTalkerId & TALKER_ID_BLOCK3)) {
|
||||
::sprintf(text, "DMR Slot %u, Embedded Talker Alias Block 3", m_slotNo);
|
||||
CUtils::dump(2U, text, data, 9U);
|
||||
m_netTalkerId |= TALKER_ID_BLOCK3;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
::sprintf(text, "DMR Slot %u, Unknown Embedded Data", m_slotNo);
|
||||
@@ -1426,12 +1469,8 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData)
|
||||
CDMRTrellis trellis;
|
||||
unsigned char payload[18U];
|
||||
bool ret = trellis.decode(data + 2U, payload);
|
||||
if (ret) {
|
||||
if (ret)
|
||||
trellis.encode(payload, data + 2U);
|
||||
} else {
|
||||
LogMessage("DMR Slot %u, unfixable network rate 3/4 data", m_slotNo);
|
||||
CUtils::dump(1U, "Data", data + 2U, DMR_FRAME_LENGTH_BYTES);
|
||||
}
|
||||
}
|
||||
|
||||
// Regenerate the Slot Type
|
||||
|
||||
Reference in New Issue
Block a user