diff --git a/src/common/dmr/lc/CSBK.cpp b/src/common/dmr/lc/CSBK.cpp index 230fa6fd..a07886c3 100644 --- a/src/common/dmr/lc/CSBK.cpp +++ b/src/common/dmr/lc/CSBK.cpp @@ -115,6 +115,8 @@ bool CSBK::regenerate(uint8_t* data, uint8_t dataType) csbk[10U] ^= CSBK_MBC_CRC_MASK[0U]; csbk[11U] ^= CSBK_MBC_CRC_MASK[1U]; break; + case DataType::MBC_DATA: + break; default: LogError(LOG_DMR, "CSBK::regenerate(), unhandled dataType = $%02X", dataType); break; @@ -136,6 +138,8 @@ bool CSBK::regenerate(uint8_t* data, uint8_t dataType) csbk[10U] ^= CSBK_MBC_CRC_MASK[0U]; csbk[11U] ^= CSBK_MBC_CRC_MASK[1U]; break; + case DataType::MBC_DATA: + break; default: LogError(LOG_DMR, "CSBK::regenerate(), unhandled dataType = $%02X", dataType); break; @@ -151,6 +155,8 @@ bool CSBK::regenerate(uint8_t* data, uint8_t dataType) csbk[10U] ^= CSBK_MBC_CRC_MASK[0U]; csbk[11U] ^= CSBK_MBC_CRC_MASK[1U]; break; + case DataType::MBC_DATA: + break; default: LogError(LOG_DMR, "CSBK::regenerate(), unhandled dataType = $%02X", dataType); break; @@ -167,6 +173,8 @@ bool CSBK::regenerate(uint8_t* data, uint8_t dataType) csbk[10U] ^= CSBK_MBC_CRC_MASK[0U]; csbk[11U] ^= CSBK_MBC_CRC_MASK[1U]; break; + case DataType::MBC_DATA: + break; default: LogError(LOG_DMR, "CSBK::regenerate(), unhandled dataType = $%02X", dataType); break; @@ -245,6 +253,8 @@ bool CSBK::decode(const uint8_t* data, uint8_t* payload) csbk[10U] ^= CSBK_MBC_CRC_MASK[0U]; csbk[11U] ^= CSBK_MBC_CRC_MASK[1U]; break; + case DataType::MBC_DATA: + break; default: LogError(LOG_DMR, "CSBK::decode(), unhandled dataType = $%02X", m_dataType); break; @@ -266,6 +276,8 @@ bool CSBK::decode(const uint8_t* data, uint8_t* payload) csbk[10U] ^= CSBK_MBC_CRC_MASK[0U]; csbk[11U] ^= CSBK_MBC_CRC_MASK[1U]; break; + case DataType::MBC_DATA: + break; default: LogError(LOG_DMR, "CSBK::decode(), unhandled dataType = $%02X", m_dataType); break; @@ -318,6 +330,8 @@ void CSBK::encode(uint8_t* data, const uint8_t* payload) csbk[10U] ^= CSBK_MBC_CRC_MASK[0U]; csbk[11U] ^= CSBK_MBC_CRC_MASK[1U]; break; + case DataType::MBC_DATA: + break; default: LogError(LOG_DMR, "CSBK::encoded(), unhandled dataType = $%02X", m_dataType); break; @@ -334,6 +348,8 @@ void CSBK::encode(uint8_t* data, const uint8_t* payload) csbk[10U] ^= CSBK_MBC_CRC_MASK[0U]; csbk[11U] ^= CSBK_MBC_CRC_MASK[1U]; break; + case DataType::MBC_DATA: + break; default: LogError(LOG_DMR, "CSBK::encode(), unhandled dataType = $%02X", m_dataType); break; diff --git a/src/common/dmr/lc/csbk/CSBKFactory.cpp b/src/common/dmr/lc/csbk/CSBKFactory.cpp index bdb4dc47..b4fbff83 100644 --- a/src/common/dmr/lc/csbk/CSBKFactory.cpp +++ b/src/common/dmr/lc/csbk/CSBKFactory.cpp @@ -55,6 +55,8 @@ std::unique_ptr CSBKFactory::createCSBK(const uint8_t* data, DataType::E d csbk[10U] ^= CSBK_MBC_CRC_MASK[0U]; csbk[11U] ^= CSBK_MBC_CRC_MASK[1U]; break; + case DataType::MBC_DATA: + break; default: LogError(LOG_DMR, "CSBKFactory::createCSBK(), unhandled dataType = $%02X", dataType); break; @@ -76,6 +78,8 @@ std::unique_ptr CSBKFactory::createCSBK(const uint8_t* data, DataType::E d csbk[10U] ^= CSBK_MBC_CRC_MASK[0U]; csbk[11U] ^= CSBK_MBC_CRC_MASK[1U]; break; + case DataType::MBC_DATA: + break; default: LogError(LOG_DMR, "CSBKFactory::createCSBK(), unhandled dataType = $%02X", dataType); break; @@ -86,34 +90,34 @@ std::unique_ptr CSBKFactory::createCSBK(const uint8_t* data, DataType::E d switch (CSBKO) { case CSBKO::BSDWNACT: - return decode(new CSBK_BSDWNACT(), data); + return decode(new CSBK_BSDWNACT(), data, dataType); case CSBKO::UU_V_REQ: - return decode(new CSBK_UU_V_REQ(), data); + return decode(new CSBK_UU_V_REQ(), data, dataType); case CSBKO::UU_ANS_RSP: - return decode(new CSBK_UU_ANS_RSP(), data); + return decode(new CSBK_UU_ANS_RSP(), data, dataType); case CSBKO::PRECCSBK: - return decode(new CSBK_PRECCSBK(), data); + return decode(new CSBK_PRECCSBK(), data, dataType); case CSBKO::RAND: // CSBKO::CALL_ALRT when FID == FID_MOT switch (FID) { case FID_MOT: - return decode(new CSBK_CALL_ALRT(), data); + return decode(new CSBK_CALL_ALRT(), data, dataType); case FID_ETSI: default: - return decode(new CSBK_RAND(), data); + return decode(new CSBK_RAND(), data, dataType); } case CSBKO::EXT_FNCT: - return decode(new CSBK_EXT_FNCT(), data); + return decode(new CSBK_EXT_FNCT(), data, dataType); case CSBKO::NACK_RSP: - return decode(new CSBK_NACK_RSP(), data); + return decode(new CSBK_NACK_RSP(), data, dataType); /** Tier 3 */ case CSBKO::ACK_RSP: - return decode(new CSBK_ACK_RSP(), data); + return decode(new CSBK_ACK_RSP(), data, dataType); case CSBKO::BROADCAST: - return decode(new CSBK_BROADCAST(), data); + return decode(new CSBK_BROADCAST(), data, dataType); case CSBKO::MAINT: - return decode(new CSBK_MAINT(), data); + return decode(new CSBK_MAINT(), data, dataType); default: LogError(LOG_DMR, "CSBKFactory::create(), unknown CSBK type, csbko = $%02X", CSBKO); @@ -129,11 +133,13 @@ std::unique_ptr CSBKFactory::createCSBK(const uint8_t* data, DataType::E d /* Decode a CSBK. */ -std::unique_ptr CSBKFactory::decode(CSBK* csbk, const uint8_t* data) +std::unique_ptr CSBKFactory::decode(CSBK* csbk, const uint8_t* data, DataType::E dataType) { assert(csbk != nullptr); assert(data != nullptr); + csbk->setDataType(dataType); + if (!csbk->decode(data)) { return nullptr; } diff --git a/src/common/dmr/lc/csbk/CSBKFactory.h b/src/common/dmr/lc/csbk/CSBKFactory.h index 1d07fb4c..0cd5eba4 100644 --- a/src/common/dmr/lc/csbk/CSBKFactory.h +++ b/src/common/dmr/lc/csbk/CSBKFactory.h @@ -84,7 +84,7 @@ namespace dmr * @param[in] data Buffer containing CSBK packet data to decode. * @returns CSBK* Instance of a CSBK representing the decoded data. */ - static std::unique_ptr decode(CSBK* csbk, const uint8_t* data); + static std::unique_ptr decode(CSBK* csbk, const uint8_t* data, defines::DataType::E dataType); }; } // namespace csbk } // namespace lc diff --git a/src/host/dmr/Control.cpp b/src/host/dmr/Control.cpp index 24a2e4bb..a8609a48 100644 --- a/src/host/dmr/Control.cpp +++ b/src/host/dmr/Control.cpp @@ -622,7 +622,7 @@ void Control::writeRF_Call_Alrt(uint32_t slotNo, uint32_t srcId, uint32_t dstId) bool Control::isBusy() const { - return (m_slot1->m_rfState != RS_RF_LISTENING || m_slot1->m_netState != RS_NET_IDLE) && + return (m_slot1->m_rfState != RS_RF_LISTENING || m_slot1->m_netState != RS_NET_IDLE) || (m_slot2->m_rfState != RS_RF_LISTENING || m_slot2->m_netState != RS_NET_IDLE); } diff --git a/src/host/dmr/Slot.cpp b/src/host/dmr/Slot.cpp index bb00a933..73aa397e 100644 --- a/src/host/dmr/Slot.cpp +++ b/src/host/dmr/Slot.cpp @@ -289,7 +289,7 @@ bool Slot::processFrame(uint8_t *data, uint32_t len) if (dataSync) { DataType::E dataType = (DataType::E)(data[1U] & 0x0FU); - if (dataType == DataType::CSBK) { + if (dataType == DataType::CSBK || dataType == DataType::MBC_HEADER || dataType == DataType::MBC_DATA) { return m_control->process(data, len); } @@ -495,7 +495,7 @@ void Slot::processNetwork(const data::NetData& dmrData) // if *this slot* is the TSCC slot, stop processing after this point if (m_enableTSCC && m_dedicatedTSCC) { - if (dataType != DataType::CSBK) + if (dataType != DataType::CSBK && dataType != DataType::MBC_HEADER && dataType != DataType::MBC_DATA) return; else { if (m_slotNo != s_dmr->m_tsccSlotNo) @@ -507,6 +507,8 @@ void Slot::processNetwork(const data::NetData& dmrData) switch (dataType) { case DataType::CSBK: + case DataType::MBC_HEADER: + case DataType::MBC_DATA: m_control->processNetwork(dmrData); break; case DataType::VOICE_LC_HEADER: diff --git a/src/host/dmr/packet/ControlSignaling.cpp b/src/host/dmr/packet/ControlSignaling.cpp index 572f9ca3..cf50e964 100644 --- a/src/host/dmr/packet/ControlSignaling.cpp +++ b/src/host/dmr/packet/ControlSignaling.cpp @@ -121,7 +121,7 @@ bool ControlSignaling::process(uint8_t* data, uint32_t len) slotType.setColorCode(m_slot->s_colorCode); slotType.setDataType(dataType); - if (dataType == DataType::CSBK) { + if (dataType == DataType::CSBK || dataType == DataType::MBC_HEADER || dataType == DataType::MBC_DATA) { // generate a new CSBK and check validity std::unique_ptr csbk = CSBKFactory::createCSBK(data + 2U, dataType); if (csbk == nullptr) @@ -369,7 +369,7 @@ bool ControlSignaling::process(uint8_t* data, uint32_t len) if (m_slot->s_duplex) m_slot->addFrame(data); - m_slot->writeNetwork(data, DataType::CSBK, gi ? FLCO::GROUP : FLCO::PRIVATE, srcId, dstId, 0U, 0U, true); + m_slot->writeNetwork(data, dataType, gi ? FLCO::GROUP : FLCO::PRIVATE, srcId, dstId, 0U, 0U, true); } return true; @@ -387,7 +387,7 @@ void ControlSignaling::processNetwork(const data::NetData& dmrData) uint8_t data[DMR_FRAME_LENGTH_BYTES + 2U]; dmrData.getData(data + 2U); - if (dataType == DataType::CSBK) { + if (dataType == DataType::CSBK || dataType == DataType::MBC_HEADER || dataType == DataType::MBC_DATA) { std::unique_ptr csbk = CSBKFactory::createCSBK(data + 2U, dataType); if (csbk == nullptr) { LogError(LOG_NET, "DMR Slot %u, CSBK, unable to decode the network CSBK", m_slot->m_slotNo);