Upgrade the Short LC signalling for data preamble CSBKs.

This commit is contained in:
Jonathan Naylor
2017-10-03 10:03:13 +01:00
parent 56ebac20a9
commit 84a9f2e9b8
2 changed files with 70 additions and 46 deletions

View File

@@ -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,6 +470,13 @@ bool CDMRSlot::writeModem(unsigned char *data, unsigned int len)
break; break;
} }
// 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; 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)
@@ -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,6 +1530,12 @@ 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;
} }
// 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) { } 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,7 +1750,7 @@ 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);
@@ -1745,7 +1758,7 @@ void CDMRSlot::setShortLC(unsigned int slotNo, unsigned int id, FLCO flco, bool
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;
@@ -1757,7 +1770,7 @@ void CDMRSlot::setShortLC(unsigned int slotNo, unsigned int id, FLCO flco, bool
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,32 +1796,36 @@ 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 else if (m_activity1 == ACTIVITY_DATA && m_flco1 == FLCO_USER_USER)
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 else if (m_activity2 == ACTIVITY_DATA && m_flco2 == FLCO_USER_USER)
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);

View File

@@ -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);
@@ -118,10 +125,10 @@ private:
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