more very very experiemental PDU AMBT support;

pull/12/head
Bryan Biedenkapp 4 years ago
parent ab5c056111
commit 8bd0a0cbbc

@ -157,9 +157,9 @@ void TrunkPacket::resetNet()
/// </summary> /// </summary>
/// <param name="data">Buffer containing data frame.</param> /// <param name="data">Buffer containing data frame.</param>
/// <param name="len">Length of data frame.</param> /// <param name="len">Length of data frame.</param>
/// <param name="mbtData">Flag indicating the data parameter contains MBT data.</param> /// <param name="blockData">Flag indicating the data parameter contains raw TSBK data.</param>
/// <returns></returns> /// <returns></returns>
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); assert(data != NULL);
@ -167,7 +167,7 @@ bool TrunkPacket::process(uint8_t* data, uint32_t len, bool mbtData)
return false; return false;
uint8_t duid = 0U; uint8_t duid = 0U;
if (!mbtData) { if (!blockData) {
// Decode the NID // Decode the NID
bool valid = m_p25->m_nid.decode(data + 2U); bool valid = m_p25->m_nid.decode(data + 2U);

@ -61,7 +61,7 @@ namespace p25
void resetNet(); void resetNet();
/// <summary>Process a data frame from the RF interface.</summary> /// <summary>Process a data frame from the RF interface.</summary>
bool process(uint8_t* data, uint32_t len, bool mbtData = false); bool process(uint8_t* data, uint32_t len, bool blockData = false);
/// <summary>Process a data frame from the network.</summary> /// <summary>Process a data frame from the network.</summary>
bool processNetwork(uint8_t* data, uint32_t len, lc::LC& control, data::LowSpeedData& lsd, uint8_t& duid); bool processNetwork(uint8_t* data, uint32_t len, lc::LC& control, data::LowSpeedData& lsd, uint8_t& duid);

@ -139,6 +139,9 @@ bool DataBlock::decode(const uint8_t* data, const DataHeader header)
m_data[i] = buffer[i]; // Payload Data m_data[i] = buffer[i]; // Payload Data
} }
} }
else if (m_fmt == PDU_FMT_AMBT) {
// ignore AMBT this is handled else where
}
else { else {
LogError(LOG_P25, "unknown FMT value in P25_DUID_PDU, fmt = $%02X", m_fmt); 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); m_trellis.encode12(buffer, data);
} }
else if (m_fmt == PDU_FMT_AMBT) {
// ignore AMBT this is handled else where
}
else { else {
LogError(LOG_P25, "unknown FMT value in P25_DUID_PDU, fmt = $%02X", m_fmt); LogError(LOG_P25, "unknown FMT value in P25_DUID_PDU, fmt = $%02X", m_fmt);
return; 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)) { if ((m_fmt == PDU_FMT_CONFIRMED) || (m_fmt == PDU_FMT_RSP && m_confirmed)) {
::memcpy(m_data, buffer, P25_PDU_CONFIRMED_DATA_LENGTH_BYTES); ::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); ::memcpy(m_data, buffer, P25_PDU_UNCONFIRMED_LENGTH_BYTES);
} }
else { else {
@ -255,7 +261,7 @@ uint32_t DataBlock::getData(uint8_t* buffer) const
::memcpy(buffer, m_data, P25_PDU_CONFIRMED_DATA_LENGTH_BYTES); ::memcpy(buffer, m_data, P25_PDU_CONFIRMED_DATA_LENGTH_BYTES);
return 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); ::memcpy(buffer, m_data, P25_PDU_UNCONFIRMED_LENGTH_BYTES);
return P25_PDU_UNCONFIRMED_LENGTH_BYTES; return P25_PDU_UNCONFIRMED_LENGTH_BYTES;
} }

@ -127,6 +127,9 @@ bool DataHeader::decode(const uint8_t* data)
m_n = 0U; m_n = 0U;
m_seqNo = 0U; m_seqNo = 0U;
m_headerOffset = 0U; m_headerOffset = 0U;
m_ambtField8 = header[8U]; // AMBT Field 8
m_ambtField9 = header[9U]; // AMBT Field 9
} }
else { else {
m_sync = (header[8U] & 0x80U) == 0x80U; // Re-synchronize Flag 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) { if (m_fmt == PDU_FMT_AMBT) {
header[7U] = (m_ambtOpcode & 0x3FU); // AMBT Opcode header[7U] = (m_ambtOpcode & 0x3FU); // AMBT Opcode
header[8U] = m_ambtField8; // AMBT Field 8
header[9U] = m_ambtField9; // AMBT Field 9
} }
else { else {
header[7U] = (m_padCount & 0x1FU); // Pad Count header[7U] = (m_padCount & 0x1FU); // Pad Count

@ -91,8 +91,13 @@ namespace p25
__PROPERTY(uint8_t, seqNo, SeqNo); __PROPERTY(uint8_t, seqNo, SeqNo);
/// <summary>Offset of the header.</summary> /// <summary>Offset of the header.</summary>
__PROPERTY(uint8_t, headerOffset, HeaderOffset); __PROPERTY(uint8_t, headerOffset, HeaderOffset);
/// <summary>Alternate Trunking Block Opcode</summary> /// <summary>Alternate Trunking Block Opcode</summary>
__PROPERTY(uint8_t, ambtOpcode, AMBTOpcode); __PROPERTY(uint8_t, ambtOpcode, AMBTOpcode);
/// <summary>Alternate Trunking Block Field 8</summary>
__PROPERTY(uint8_t, ambtField8, AMBTField8);
/// <summary>Alternate Trunking Block Field 9</summary>
__PROPERTY(uint8_t, ambtField9, AMBTField9);
private: private:
edac::Trellis m_trellis; edac::Trellis m_trellis;

Loading…
Cancel
Save

Powered by TurnKey Linux.