correct missing handling of MBC_DATA for DMR;

pull/121/merge
Bryan Biedenkapp 3 weeks ago
parent 64529052ff
commit 07b0ebaf85

@ -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;

@ -55,6 +55,8 @@ std::unique_ptr<CSBK> 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<CSBK> 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<CSBK> 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<CSBK> CSBKFactory::createCSBK(const uint8_t* data, DataType::E d
/* Decode a CSBK. */
std::unique_ptr<CSBK> CSBKFactory::decode(CSBK* csbk, const uint8_t* data)
std::unique_ptr<CSBK> 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;
}

@ -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<CSBK> decode(CSBK* csbk, const uint8_t* data);
static std::unique_ptr<CSBK> decode(CSBK* csbk, const uint8_t* data, defines::DataType::E dataType);
};
} // namespace csbk
} // namespace lc

@ -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);
}

@ -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:

@ -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<lc::CSBK> 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<lc::CSBK> 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);

Loading…
Cancel
Save

Powered by TurnKey Linux.