diff --git a/DMRCSBK.cpp b/DMRCSBK.cpp index 7b33e85..bbf62be 100644 --- a/DMRCSBK.cpp +++ b/DMRCSBK.cpp @@ -28,6 +28,7 @@ CDMRCSBK::CDMRCSBK() : m_data(NULL), m_CSBKO(CSBKO_NONE), m_FID(0x00U), +m_GI(false), m_bsId(0U), m_srcId(0U), m_dstId(0U) @@ -81,6 +82,7 @@ bool CDMRCSBK::put(const unsigned char* bytes) break; case CSBKO_PRECCSBK: + m_GI = (m_data[2U] & 0x40U) == 0x40U; m_dstId = m_data[4U] << 16 | m_data[5U] << 8 | m_data[6U]; m_srcId = m_data[7U] << 16 | m_data[8U] << 8 | m_data[9U]; CUtils::dump(1U, "Preamble CSBK", m_data, 12U); @@ -118,6 +120,11 @@ unsigned char CDMRCSBK::getFID() const return m_FID; } +bool CDMRCSBK::getGI() const +{ + return m_GI; +} + unsigned int CDMRCSBK::getBSId() const { return m_bsId; diff --git a/DMRCSBK.h b/DMRCSBK.h index 00e7612..26932b1 100644 --- a/DMRCSBK.h +++ b/DMRCSBK.h @@ -48,6 +48,9 @@ public: // For BS Dwn Act unsigned int getBSId() const; + // For Pre + bool getGI() const; + unsigned int getSrcId() const; unsigned int getDstId() const; @@ -55,6 +58,7 @@ private: unsigned char* m_data; CSBKO m_CSBKO; unsigned char m_FID; + bool m_GI; unsigned int m_bsId; unsigned int m_srcId; unsigned int m_dstId; diff --git a/DMRSlot.cpp b/DMRSlot.cpp index 2a6fa34..d204d1b 100644 --- a/DMRSlot.cpp +++ b/DMRSlot.cpp @@ -124,7 +124,7 @@ void CDMRSlot::writeModem(unsigned char *data) CDMRFullLC fullLC; m_rfLC = fullLC.decode(data + 2U, DT_VOICE_LC_HEADER); if (m_rfLC == NULL) { - LogMessage("DMR Slot %u: unable to decode the RF LC", m_slotNo); + LogMessage("DMR Slot %u, unable to decode the RF LC", m_slotNo); return; } @@ -222,7 +222,7 @@ void CDMRSlot::writeModem(unsigned char *data) CDMRDataHeader dataHeader; bool valid = dataHeader.put(data + 2U); if (!valid) { - LogMessage("DMR Slot %u: unable to decode the RF data header", m_slotNo); + LogMessage("DMR Slot %u, unable to decode the RF data header", m_slotNo); return; } @@ -266,7 +266,7 @@ void CDMRSlot::writeModem(unsigned char *data) CDMRCSBK csbk; bool valid = csbk.put(data + 2U); if (!valid) { - LogMessage("DMR Slot %u: unable to decode the RF CSBK", m_slotNo); + LogMessage("DMR Slot %u, unable to decode the RF CSBK", m_slotNo); return; } @@ -274,6 +274,10 @@ void CDMRSlot::writeModem(unsigned char *data) if (csbko == CSBKO_BSDWNACT) return; + bool gi = csbk.getGI(); + unsigned int srcId = csbk.getSrcId(); + unsigned int dstId = csbk.getDstId(); + // Regenerate the CSBK data csbk.get(data + 2U); @@ -291,27 +295,27 @@ void CDMRSlot::writeModem(unsigned char *data) if (m_duplex) writeQueueRF(data); - writeNetworkRF(data, DT_CSBK, FLCO_USER_USER, csbk.getSrcId(), csbk.getDstId()); + writeNetworkRF(data, DT_CSBK, gi ? FLCO_GROUP : FLCO_USER_USER, srcId, dstId); switch (csbko) { case CSBKO_UUVREQ: - LogMessage("DMR Slot %u, received RF Unit to Unit Voice Service Request CSBK from %u to %u", m_slotNo, csbk.getSrcId(), csbk.getDstId()); + LogMessage("DMR Slot %u, received RF Unit to Unit Voice Service Request CSBK from %u to %u", m_slotNo, srcId, dstId); break; case CSBKO_UUANSRSP: - LogMessage("DMR Slot %u, received RF Unit to Unit Voice Service Answer Response CSBK from %u to %u", m_slotNo, csbk.getSrcId(), csbk.getDstId()); + LogMessage("DMR Slot %u, received RF Unit to Unit Voice Service Answer Response CSBK from %u to %u", m_slotNo, srcId, dstId); break; case CSBKO_NACKRSP: - LogMessage("DMR Slot %u, received RF Negative Acknowledgment Response CSBK from %u to %u", m_slotNo, csbk.getSrcId(), csbk.getDstId()); + LogMessage("DMR Slot %u, received RF Negative Acknowledgment Response CSBK from %u to %u", m_slotNo, srcId, dstId); break; case CSBKO_PRECCSBK: - LogMessage("DMR Slot %u, received RF Preamble CSBK from %u to %u", m_slotNo, csbk.getSrcId(), csbk.getDstId()); + LogMessage("DMR Slot %u, received RF Preamble CSBK from %u to %s%u", m_slotNo, srcId, gi ? "TG" : "", dstId); break; default: LogWarning("DMR Slot %u, unhandled RF CSBK type - 0x%02X", m_slotNo, csbko); break; } } else if (dataType == DT_RATE_12_DATA || dataType == DT_RATE_34_DATA || dataType == DT_RATE_1_DATA) { - if (m_rfState != RS_RF_DATA) + if (m_rfState != RS_RF_DATA || m_rfFrames == 0U) return; // Regenerate and display the payload @@ -757,7 +761,7 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData) CDMRDataHeader dataHeader; bool valid = dataHeader.put(data + 2U); if (!valid) { - LogMessage("DMR Slot %u: unable to decode the network data header", m_slotNo); + LogMessage("DMR Slot %u, unable to decode the network data header", m_slotNo); return; } @@ -918,7 +922,7 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData) CDMRCSBK csbk; bool valid = csbk.put(data + 2U); if (!valid) { - LogMessage("DMR Slot %u: unable to decode the network CSBK", m_slotNo); + LogMessage("DMR Slot %u, unable to decode the network CSBK", m_slotNo); return; } @@ -926,6 +930,10 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData) if (csbko == CSBKO_BSDWNACT) return; + bool gi = csbk.getGI(); + unsigned int srcId = csbk.getSrcId(); + unsigned int dstId = csbk.getDstId(); + // Regenerate the CSBK data csbk.get(data + 2U); @@ -951,23 +959,23 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData) switch (csbko) { case CSBKO_UUVREQ: - LogMessage("DMR Slot %u, received network Unit to Unit Voice Service Request CSBK from %u to %u", m_slotNo, csbk.getSrcId(), csbk.getDstId()); + LogMessage("DMR Slot %u, received network Unit to Unit Voice Service Request CSBK from %u to %u", m_slotNo, srcId, dstId); break; case CSBKO_UUANSRSP: - LogMessage("DMR Slot %u, received network Unit to Unit Voice Service Answer Response CSBK from %u to %u", m_slotNo, csbk.getSrcId(), csbk.getDstId()); + LogMessage("DMR Slot %u, received network Unit to Unit Voice Service Answer Response CSBK from %u to %u", m_slotNo, srcId, dstId); break; case CSBKO_NACKRSP: - LogMessage("DMR Slot %u, received network Negative Acknowledgment Response CSBK from %u to %u", m_slotNo, csbk.getSrcId(), csbk.getDstId()); + LogMessage("DMR Slot %u, received network Negative Acknowledgment Response CSBK from %u to %u", m_slotNo, srcId, dstId); break; case CSBKO_PRECCSBK: - LogMessage("DMR Slot %u, received network Preamble CSBK from %u to %u", m_slotNo, csbk.getSrcId(), csbk.getDstId()); + LogMessage("DMR Slot %u, received network Preamble CSBK from %u to %s%u", m_slotNo, srcId, gi ? "TG" : "", dstId); break; default: LogWarning("DMR Slot %u, unhandled network CSBK type - 0x%02X", m_slotNo, csbko); break; } } else if (dataType == DT_RATE_12_DATA || dataType == DT_RATE_34_DATA || dataType == DT_RATE_1_DATA) { - if (m_netState != RS_NET_DATA) + if (m_netState != RS_NET_DATA || m_netFrames == 0U) return; // Regenerate and display the payload