diff --git a/src/common/p25/lc/tsbk/OSP_SNDCP_CH_GNT.cpp b/src/common/p25/lc/tsbk/OSP_SNDCP_CH_GNT.cpp index 63766722..77915c03 100644 --- a/src/common/p25/lc/tsbk/OSP_SNDCP_CH_GNT.cpp +++ b/src/common/p25/lc/tsbk/OSP_SNDCP_CH_GNT.cpp @@ -44,7 +44,19 @@ bool OSP_SNDCP_CH_GNT::decode(const uint8_t* data, bool rawTSBK) { assert(data != nullptr); - /* stub */ + uint8_t tsbk[P25_TSBK_LENGTH_BYTES + 1U]; + ::memset(tsbk, 0x00U, P25_TSBK_LENGTH_BYTES); + + bool ret = TSBK::decode(data, tsbk, rawTSBK); + if (!ret) + return false; + + ulong64_t tsbkValue = TSBK::toValue(tsbk); + + m_dataServiceOptions = (uint8_t)((tsbkValue >> 56) & 0xFFU); // Data Service Options + m_grpVchId = (uint8_t)((tsbkValue >> 52) & 0x0FU); // Channel (T) ID + m_dataChannelNo = ((tsbkValue >> 40) & 0xFFFU); // Channel (T) Number + m_dstId = (uint32_t)(tsbkValue & 0xFFFFFFU); // Target Radio Address return true; } diff --git a/src/common/p25/lc/tsbk/TSBKFactory.cpp b/src/common/p25/lc/tsbk/TSBKFactory.cpp index a650f0f4..9a16ff97 100644 --- a/src/common/p25/lc/tsbk/TSBKFactory.cpp +++ b/src/common/p25/lc/tsbk/TSBKFactory.cpp @@ -224,6 +224,8 @@ std::unique_ptr TSBKFactory::createTSBK(const uint8_t* data, bool rawTSBK) return decode(new ISP_AUTH_SU_DMD(), data, rawTSBK); case TSBKO::OSP_ADJ_STS_BCAST: return decode(new OSP_ADJ_STS_BCAST(), data, rawTSBK); + case TSBKO::OSP_SNDCP_CH_GNT: + return decode(new OSP_SNDCP_CH_GNT(), data, rawTSBK); default: LogError(LOG_P25, "TSBKFactory::create(), unknown TSBK LCO value, mfId = $%02X, lco = $%02X", mfId, lco); break;