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;