mirror of
https://github.com/g4klx/MMDVMHost
synced 2025-12-21 06:55:52 +08:00
Upgrade the Short LC signalling for data preamble CSBKs.
This commit is contained in:
101
DMRSlot.cpp
101
DMRSlot.cpp
@@ -51,10 +51,10 @@ unsigned char* CDMRSlot::m_idle = NULL;
|
|||||||
|
|
||||||
FLCO CDMRSlot::m_flco1;
|
FLCO CDMRSlot::m_flco1;
|
||||||
unsigned char CDMRSlot::m_id1 = 0U;
|
unsigned char CDMRSlot::m_id1 = 0U;
|
||||||
bool CDMRSlot::m_voice1 = true;
|
ACTIVITY_TYPE CDMRSlot::m_activity1 = ACTIVITY_NONE;
|
||||||
FLCO CDMRSlot::m_flco2;
|
FLCO CDMRSlot::m_flco2;
|
||||||
unsigned char CDMRSlot::m_id2 = 0U;
|
unsigned char CDMRSlot::m_id2 = 0U;
|
||||||
bool CDMRSlot::m_voice2 = true;
|
ACTIVITY_TYPE CDMRSlot::m_activity2 = ACTIVITY_NONE;
|
||||||
|
|
||||||
const unsigned char TALKER_ID_NONE = 0x00U;
|
const unsigned char TALKER_ID_NONE = 0x00U;
|
||||||
const unsigned char TALKER_ID_HEADER = 0x01U;
|
const unsigned char TALKER_ID_HEADER = 0x01U;
|
||||||
@@ -267,7 +267,7 @@ bool CDMRSlot::writeModem(unsigned char *data, unsigned int len)
|
|||||||
std::string dst = m_lookup->find(dstId);
|
std::string dst = m_lookup->find(dstId);
|
||||||
|
|
||||||
if (m_netState == RS_NET_IDLE) {
|
if (m_netState == RS_NET_IDLE) {
|
||||||
setShortLC(m_slotNo, dstId, flco, true);
|
setShortLC(m_slotNo, dstId, flco, ACTIVITY_VOICE);
|
||||||
m_display->writeDMR(m_slotNo, src, flco == FLCO_GROUP, dst, "R");
|
m_display->writeDMR(m_slotNo, src, flco == FLCO_GROUP, dst, "R");
|
||||||
m_display->writeDMRRSSI(m_slotNo, m_rssi);
|
m_display->writeDMRRSSI(m_slotNo, m_rssi);
|
||||||
}
|
}
|
||||||
@@ -391,7 +391,7 @@ bool CDMRSlot::writeModem(unsigned char *data, unsigned int len)
|
|||||||
std::string dst = m_lookup->find(dstId);
|
std::string dst = m_lookup->find(dstId);
|
||||||
|
|
||||||
if (m_netState == RS_NET_IDLE) {
|
if (m_netState == RS_NET_IDLE) {
|
||||||
setShortLC(m_slotNo, dstId, gi ? FLCO_GROUP : FLCO_USER_USER, false);
|
setShortLC(m_slotNo, dstId, gi ? FLCO_GROUP : FLCO_USER_USER, ACTIVITY_DATA);
|
||||||
m_display->writeDMR(m_slotNo, src, gi, dst, "R");
|
m_display->writeDMR(m_slotNo, src, gi, dst, "R");
|
||||||
m_display->writeDMRRSSI(m_slotNo, m_rssi);
|
m_display->writeDMRRSSI(m_slotNo, m_rssi);
|
||||||
}
|
}
|
||||||
@@ -470,7 +470,14 @@ bool CDMRSlot::writeModem(unsigned char *data, unsigned int len)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
// If data preamble, signal its existence
|
||||||
|
if (m_netState == RS_NET_IDLE && csbko == CSBKO_PRECCSBK && csbk.getDataContent()) {
|
||||||
|
setShortLC(m_slotNo, dstId, gi ? FLCO_GROUP : FLCO_USER_USER, ACTIVITY_CSBK);
|
||||||
|
m_display->writeDMR(m_slotNo, src, gi, dst, "R");
|
||||||
|
m_display->writeDMRRSSI(m_slotNo, m_rssi);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
} else if (dataType == DT_RATE_12_DATA || dataType == DT_RATE_34_DATA || dataType == DT_RATE_1_DATA) {
|
} else if (dataType == DT_RATE_12_DATA || dataType == DT_RATE_34_DATA || dataType == DT_RATE_1_DATA) {
|
||||||
if (m_rfState != RS_RF_DATA || m_rfFrames == 0U)
|
if (m_rfState != RS_RF_DATA || m_rfFrames == 0U)
|
||||||
return false;
|
return false;
|
||||||
@@ -810,7 +817,7 @@ bool CDMRSlot::writeModem(unsigned char *data, unsigned int len)
|
|||||||
std::string dst = m_lookup->find(dstId);
|
std::string dst = m_lookup->find(dstId);
|
||||||
|
|
||||||
if (m_netState == RS_NET_IDLE) {
|
if (m_netState == RS_NET_IDLE) {
|
||||||
setShortLC(m_slotNo, dstId, flco, true);
|
setShortLC(m_slotNo, dstId, flco, ACTIVITY_VOICE);
|
||||||
m_display->writeDMR(m_slotNo, src, flco == FLCO_GROUP, dst, "R");
|
m_display->writeDMR(m_slotNo, src, flco == FLCO_GROUP, dst, "R");
|
||||||
m_display->writeDMRRSSI(m_slotNo, m_rssi);
|
m_display->writeDMRRSSI(m_slotNo, m_rssi);
|
||||||
m_display->writeDMRBER(m_slotNo, float(errors) / 1.41F);
|
m_display->writeDMRBER(m_slotNo, float(errors) / 1.41F);
|
||||||
@@ -1025,7 +1032,7 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData)
|
|||||||
|
|
||||||
m_netState = RS_NET_AUDIO;
|
m_netState = RS_NET_AUDIO;
|
||||||
|
|
||||||
setShortLC(m_slotNo, dstId, flco, true);
|
setShortLC(m_slotNo, dstId, flco, ACTIVITY_VOICE);
|
||||||
|
|
||||||
std::string src = m_lookup->find(srcId);
|
std::string src = m_lookup->find(srcId);
|
||||||
std::string dst = m_lookup->find(dstId);
|
std::string dst = m_lookup->find(dstId);
|
||||||
@@ -1093,7 +1100,7 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData)
|
|||||||
|
|
||||||
m_netState = RS_NET_AUDIO;
|
m_netState = RS_NET_AUDIO;
|
||||||
|
|
||||||
setShortLC(m_slotNo, dstId, m_netLC->getFLCO(), true);
|
setShortLC(m_slotNo, dstId, m_netLC->getFLCO(), ACTIVITY_VOICE);
|
||||||
|
|
||||||
std::string src = m_lookup->find(srcId);
|
std::string src = m_lookup->find(srcId);
|
||||||
std::string dst = m_lookup->find(dstId);
|
std::string dst = m_lookup->find(dstId);
|
||||||
@@ -1205,7 +1212,7 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData)
|
|||||||
|
|
||||||
m_netState = RS_NET_DATA;
|
m_netState = RS_NET_DATA;
|
||||||
|
|
||||||
setShortLC(m_slotNo, dstId, gi ? FLCO_GROUP : FLCO_USER_USER, false);
|
setShortLC(m_slotNo, dstId, gi ? FLCO_GROUP : FLCO_USER_USER, ACTIVITY_DATA);
|
||||||
|
|
||||||
std::string src = m_lookup->find(srcId);
|
std::string src = m_lookup->find(srcId);
|
||||||
std::string dst = m_lookup->find(dstId);
|
std::string dst = m_lookup->find(dstId);
|
||||||
@@ -1283,7 +1290,7 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData)
|
|||||||
|
|
||||||
m_netState = RS_NET_AUDIO;
|
m_netState = RS_NET_AUDIO;
|
||||||
|
|
||||||
setShortLC(m_slotNo, dstId, m_netLC->getFLCO(), true);
|
setShortLC(m_slotNo, dstId, m_netLC->getFLCO(), ACTIVITY_VOICE);
|
||||||
|
|
||||||
std::string src = m_lookup->find(srcId);
|
std::string src = m_lookup->find(srcId);
|
||||||
std::string dst = m_lookup->find(dstId);
|
std::string dst = m_lookup->find(dstId);
|
||||||
@@ -1523,7 +1530,13 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData)
|
|||||||
LogWarning("DMR Slot %u, unhandled network CSBK type - 0x%02X", m_slotNo, csbko);
|
LogWarning("DMR Slot %u, unhandled network CSBK type - 0x%02X", m_slotNo, csbko);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} else if (dataType == DT_RATE_12_DATA || dataType == DT_RATE_34_DATA || dataType == DT_RATE_1_DATA) {
|
|
||||||
|
// If data preamble, signal its existence
|
||||||
|
if (csbko == CSBKO_PRECCSBK && csbk.getDataContent()) {
|
||||||
|
setShortLC(m_slotNo, dstId, gi ? FLCO_GROUP : FLCO_USER_USER, ACTIVITY_CSBK);
|
||||||
|
m_display->writeDMR(m_slotNo, src, gi, dst, "N");
|
||||||
|
}
|
||||||
|
} else if (dataType == DT_RATE_12_DATA || dataType == DT_RATE_34_DATA || dataType == DT_RATE_1_DATA) {
|
||||||
if (m_netState != RS_NET_DATA || m_netFrames == 0U)
|
if (m_netState != RS_NET_DATA || m_netFrames == 0U)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@@ -1737,15 +1750,15 @@ void CDMRSlot::init(unsigned int colorCode, bool embeddedLCOnly, bool dumpTAData
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void CDMRSlot::setShortLC(unsigned int slotNo, unsigned int id, FLCO flco, bool voice)
|
void CDMRSlot::setShortLC(unsigned int slotNo, unsigned int id, FLCO flco, ACTIVITY_TYPE type)
|
||||||
{
|
{
|
||||||
assert(m_modem != NULL);
|
assert(m_modem != NULL);
|
||||||
|
|
||||||
switch (slotNo) {
|
switch (slotNo) {
|
||||||
case 1U:
|
case 1U:
|
||||||
m_id1 = 0U;
|
m_id1 = 0U;
|
||||||
m_flco1 = flco;
|
m_flco1 = flco;
|
||||||
m_voice1 = voice;
|
m_activity1 = type;
|
||||||
if (id != 0U) {
|
if (id != 0U) {
|
||||||
unsigned char buffer[3U];
|
unsigned char buffer[3U];
|
||||||
buffer[0U] = (id << 16) & 0xFFU;
|
buffer[0U] = (id << 16) & 0xFFU;
|
||||||
@@ -1755,9 +1768,9 @@ void CDMRSlot::setShortLC(unsigned int slotNo, unsigned int id, FLCO flco, bool
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 2U:
|
case 2U:
|
||||||
m_id2 = 0U;
|
m_id2 = 0U;
|
||||||
m_flco2 = flco;
|
m_flco2 = flco;
|
||||||
m_voice2 = voice;
|
m_activity2 = type;
|
||||||
if (id != 0U) {
|
if (id != 0U) {
|
||||||
unsigned char buffer[3U];
|
unsigned char buffer[3U];
|
||||||
buffer[0U] = (id << 16) & 0xFFU;
|
buffer[0U] = (id << 16) & 0xFFU;
|
||||||
@@ -1783,33 +1796,37 @@ void CDMRSlot::setShortLC(unsigned int slotNo, unsigned int id, FLCO flco, bool
|
|||||||
|
|
||||||
if (m_id1 != 0U) {
|
if (m_id1 != 0U) {
|
||||||
lc[2U] = m_id1;
|
lc[2U] = m_id1;
|
||||||
if (m_voice1) {
|
lc[1U] &= 0x0FU;
|
||||||
if (m_flco1 == FLCO_GROUP)
|
if (m_activity1 == ACTIVITY_VOICE && m_flco1 == FLCO_GROUP)
|
||||||
lc[1U] |= 0x80U;
|
lc[1U] |= 0x80U;
|
||||||
else
|
else if (m_activity1 == ACTIVITY_VOICE && m_flco1 == FLCO_USER_USER)
|
||||||
lc[1U] |= 0x90U;
|
lc[1U] |= 0x90U;
|
||||||
} else {
|
else if (m_activity1 == ACTIVITY_DATA && m_flco1 == FLCO_GROUP)
|
||||||
if (m_flco1 == FLCO_GROUP)
|
lc[1U] |= 0xB0U;
|
||||||
lc[1U] |= 0xB0U;
|
else if (m_activity1 == ACTIVITY_DATA && m_flco1 == FLCO_USER_USER)
|
||||||
else
|
lc[1U] |= 0xA0U;
|
||||||
lc[1U] |= 0xA0U;
|
else if (m_activity1 == ACTIVITY_CSBK && m_flco1 == FLCO_GROUP)
|
||||||
}
|
lc[1U] |= 0x20U;
|
||||||
}
|
else if (m_activity1 == ACTIVITY_CSBK && m_flco1 == FLCO_USER_USER)
|
||||||
|
lc[1U] |= 0x30U;
|
||||||
|
}
|
||||||
|
|
||||||
if (m_id2 != 0U) {
|
if (m_id2 != 0U) {
|
||||||
lc[3U] = m_id2;
|
lc[3U] = m_id2;
|
||||||
if (m_voice2) {
|
lc[1U] &= 0xF0U;
|
||||||
if (m_flco2 == FLCO_GROUP)
|
if (m_activity2 == ACTIVITY_VOICE && m_flco2 == FLCO_GROUP)
|
||||||
lc[1U] |= 0x08U;
|
lc[1U] |= 0x08U;
|
||||||
else
|
else if (m_activity2 == ACTIVITY_VOICE && m_flco2 == FLCO_USER_USER)
|
||||||
lc[1U] |= 0x09U;
|
lc[1U] |= 0x09U;
|
||||||
} else {
|
else if (m_activity2 == ACTIVITY_DATA && m_flco2 == FLCO_GROUP)
|
||||||
if (m_flco2 == FLCO_GROUP)
|
lc[1U] |= 0x0BU;
|
||||||
lc[1U] |= 0x0BU;
|
else if (m_activity2 == ACTIVITY_DATA && m_flco2 == FLCO_USER_USER)
|
||||||
else
|
lc[1U] |= 0x0AU;
|
||||||
lc[1U] |= 0x0AU;
|
else if (m_activity2 == ACTIVITY_CSBK && m_flco2 == FLCO_GROUP)
|
||||||
}
|
lc[1U] |= 0x02U;
|
||||||
}
|
else if (m_activity2 == ACTIVITY_CSBK && m_flco2 == FLCO_USER_USER)
|
||||||
|
lc[1U] |= 0x03U;
|
||||||
|
}
|
||||||
|
|
||||||
lc[4U] = CCRC::crc8(lc, 4U);
|
lc[4U] = CCRC::crc8(lc, 4U);
|
||||||
|
|
||||||
|
|||||||
15
DMRSlot.h
15
DMRSlot.h
@@ -36,6 +36,13 @@
|
|||||||
|
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
|
enum ACTIVITY_TYPE {
|
||||||
|
ACTIVITY_NONE,
|
||||||
|
ACTIVITY_VOICE,
|
||||||
|
ACTIVITY_DATA,
|
||||||
|
ACTIVITY_CSBK
|
||||||
|
};
|
||||||
|
|
||||||
class CDMRSlot {
|
class CDMRSlot {
|
||||||
public:
|
public:
|
||||||
CDMRSlot(unsigned int slotNo, unsigned int timeout);
|
CDMRSlot(unsigned int slotNo, unsigned int timeout);
|
||||||
@@ -116,12 +123,12 @@ private:
|
|||||||
|
|
||||||
static unsigned char* m_idle;
|
static unsigned char* m_idle;
|
||||||
|
|
||||||
static FLCO m_flco1;
|
static FLCO m_flco1;
|
||||||
static unsigned char m_id1;
|
static unsigned char m_id1;
|
||||||
static bool m_voice1;
|
static ACTIVITY_TYPE m_activity1;
|
||||||
static FLCO m_flco2;
|
static FLCO m_flco2;
|
||||||
static unsigned char m_id2;
|
static unsigned char m_id2;
|
||||||
static bool m_voice2;
|
static ACTIVITY_TYPE m_activity2;
|
||||||
|
|
||||||
void writeQueueRF(const unsigned char* data);
|
void writeQueueRF(const unsigned char* data);
|
||||||
void writeQueueNet(const unsigned char* data);
|
void writeQueueNet(const unsigned char* data);
|
||||||
@@ -138,7 +145,7 @@ private:
|
|||||||
bool insertSilence(const unsigned char* data, unsigned char seqNo);
|
bool insertSilence(const unsigned char* data, unsigned char seqNo);
|
||||||
void insertSilence(unsigned int count);
|
void insertSilence(unsigned int count);
|
||||||
|
|
||||||
static void setShortLC(unsigned int slotNo, unsigned int id, FLCO flco = FLCO_GROUP, bool voice = true);
|
static void setShortLC(unsigned int slotNo, unsigned int id, FLCO flco = FLCO_GROUP, ACTIVITY_TYPE type = ACTIVITY_NONE);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
Reference in New Issue
Block a user