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