diff --git a/p25/TrunkPacket.cpp b/p25/TrunkPacket.cpp index 36af0dab..3924c180 100644 --- a/p25/TrunkPacket.cpp +++ b/p25/TrunkPacket.cpp @@ -157,9 +157,9 @@ void TrunkPacket::resetNet() /// /// Buffer containing data frame. /// Length of data frame. -/// Flag indicating the data parameter contains MBT data. +/// Flag indicating the data parameter contains raw TSBK data. /// -bool TrunkPacket::process(uint8_t* data, uint32_t len, bool mbtData) +bool TrunkPacket::process(uint8_t* data, uint32_t len, bool blockData) { assert(data != NULL); @@ -167,7 +167,7 @@ bool TrunkPacket::process(uint8_t* data, uint32_t len, bool mbtData) return false; uint8_t duid = 0U; - if (!mbtData) { + if (!blockData) { // Decode the NID bool valid = m_p25->m_nid.decode(data + 2U); diff --git a/p25/TrunkPacket.h b/p25/TrunkPacket.h index 7bbb31e7..8d21e4ff 100644 --- a/p25/TrunkPacket.h +++ b/p25/TrunkPacket.h @@ -61,7 +61,7 @@ namespace p25 void resetNet(); /// Process a data frame from the RF interface. - bool process(uint8_t* data, uint32_t len, bool mbtData = false); + bool process(uint8_t* data, uint32_t len, bool blockData = false); /// Process a data frame from the network. bool processNetwork(uint8_t* data, uint32_t len, lc::LC& control, data::LowSpeedData& lsd, uint8_t& duid); diff --git a/p25/data/DataBlock.cpp b/p25/data/DataBlock.cpp index 3e777824..e02840ae 100644 --- a/p25/data/DataBlock.cpp +++ b/p25/data/DataBlock.cpp @@ -139,6 +139,9 @@ bool DataBlock::decode(const uint8_t* data, const DataHeader header) m_data[i] = buffer[i]; // Payload Data } } + else if (m_fmt == PDU_FMT_AMBT) { + // ignore AMBT this is handled else where + } else { LogError(LOG_P25, "unknown FMT value in P25_DUID_PDU, fmt = $%02X", m_fmt); } @@ -193,6 +196,9 @@ void DataBlock::encode(uint8_t* data) m_trellis.encode12(buffer, data); } + else if (m_fmt == PDU_FMT_AMBT) { + // ignore AMBT this is handled else where + } else { LogError(LOG_P25, "unknown FMT value in P25_DUID_PDU, fmt = $%02X", m_fmt); return; @@ -236,7 +242,7 @@ void DataBlock::setData(const uint8_t* buffer) if ((m_fmt == PDU_FMT_CONFIRMED) || (m_fmt == PDU_FMT_RSP && m_confirmed)) { ::memcpy(m_data, buffer, P25_PDU_CONFIRMED_DATA_LENGTH_BYTES); } - else if ((m_fmt == PDU_FMT_UNCONFIRMED) || (m_fmt == PDU_FMT_RSP && !m_confirmed)) { + else if ((m_fmt == PDU_FMT_UNCONFIRMED) || (m_fmt == PDU_FMT_RSP && !m_confirmed) || (m_fmt == PDU_FMT_AMBT)) { ::memcpy(m_data, buffer, P25_PDU_UNCONFIRMED_LENGTH_BYTES); } else { @@ -255,7 +261,7 @@ uint32_t DataBlock::getData(uint8_t* buffer) const ::memcpy(buffer, m_data, P25_PDU_CONFIRMED_DATA_LENGTH_BYTES); return P25_PDU_CONFIRMED_DATA_LENGTH_BYTES; } - else if ((m_fmt == PDU_FMT_UNCONFIRMED) || (m_fmt == PDU_FMT_RSP && !m_confirmed)) { + else if ((m_fmt == PDU_FMT_UNCONFIRMED) || (m_fmt == PDU_FMT_RSP && !m_confirmed) || (m_fmt == PDU_FMT_AMBT)) { ::memcpy(buffer, m_data, P25_PDU_UNCONFIRMED_LENGTH_BYTES); return P25_PDU_UNCONFIRMED_LENGTH_BYTES; } diff --git a/p25/data/DataHeader.cpp b/p25/data/DataHeader.cpp index 1f9f25c3..e41f0995 100644 --- a/p25/data/DataHeader.cpp +++ b/p25/data/DataHeader.cpp @@ -127,6 +127,9 @@ bool DataHeader::decode(const uint8_t* data) m_n = 0U; m_seqNo = 0U; m_headerOffset = 0U; + + m_ambtField8 = header[8U]; // AMBT Field 8 + m_ambtField9 = header[9U]; // AMBT Field 9 } else { m_sync = (header[8U] & 0x80U) == 0x80U; // Re-synchronize Flag @@ -169,6 +172,8 @@ void DataHeader::encode(uint8_t* data) if (m_fmt == PDU_FMT_AMBT) { header[7U] = (m_ambtOpcode & 0x3FU); // AMBT Opcode + header[8U] = m_ambtField8; // AMBT Field 8 + header[9U] = m_ambtField9; // AMBT Field 9 } else { header[7U] = (m_padCount & 0x1FU); // Pad Count diff --git a/p25/data/DataHeader.h b/p25/data/DataHeader.h index 084e94bf..80b62159 100644 --- a/p25/data/DataHeader.h +++ b/p25/data/DataHeader.h @@ -91,8 +91,13 @@ namespace p25 __PROPERTY(uint8_t, seqNo, SeqNo); /// Offset of the header. __PROPERTY(uint8_t, headerOffset, HeaderOffset); + /// Alternate Trunking Block Opcode __PROPERTY(uint8_t, ambtOpcode, AMBTOpcode); + /// Alternate Trunking Block Field 8 + __PROPERTY(uint8_t, ambtField8, AMBTField8); + /// Alternate Trunking Block Field 9 + __PROPERTY(uint8_t, ambtField9, AMBTField9); private: edac::Trellis m_trellis;