diff --git a/DMRDataHeader.cpp b/DMRDataHeader.cpp index ef0922d..246ba4e 100644 --- a/DMRDataHeader.cpp +++ b/DMRDataHeader.cpp @@ -29,6 +29,8 @@ #include #include +const unsigned char UDTF_NMEA = 0x05U; + CDMRDataHeader::CDMRDataHeader() : m_data(NULL), m_GI(false), @@ -78,13 +80,13 @@ bool CDMRDataHeader::put(const unsigned char* bytes) switch (dpf) { case DPF_UNCONFIRMED_DATA: - CUtils::dump(1U, "Unconfirmed Data Header", m_data, 12U); + CUtils::dump(1U, "DMR, Unconfirmed Data Header", m_data, 12U); m_F = (m_data[8U] & 0x80U) == 0x80U; m_blocks = m_data[8U] & 0x7FU; break; case DPF_CONFIRMED_DATA: - CUtils::dump(1U, "Confirmed Data Header", m_data, 12U); + CUtils::dump(1U, "DMR, Confirmed Data Header", m_data, 12U); m_F = (m_data[8U] & 0x80U) == 0x80U; m_blocks = m_data[8U] & 0x7FU; m_S = (m_data[9U] & 0x80U) == 0x80U; @@ -92,38 +94,46 @@ bool CDMRDataHeader::put(const unsigned char* bytes) break; case DPF_RESPONSE: - CUtils::dump(1U, "Response Data Header", m_data, 12U); + CUtils::dump(1U, "DMR, Response Data Header", m_data, 12U); m_blocks = m_data[8U] & 0x7FU; break; case DPF_PROPRIETARY: - CUtils::dump(1U, "Proprietary Data Header", m_data, 12U); + CUtils::dump(1U, "DMR, Proprietary Data Header", m_data, 12U); break; case DPF_DEFINED_RAW: - CUtils::dump(1U, "Raw or Status/Precoded Short Data Header", m_data, 12U); + CUtils::dump(1U, "DMR, Raw or Status/Precoded Short Data Header", m_data, 12U); m_blocks = (m_data[0U] & 0x30U) + (m_data[1U] & 0x0FU); m_F = (m_data[8U] & 0x01U) == 0x01U; m_S = (m_data[8U] & 0x02U) == 0x02U; break; case DPF_DEFINED_SHORT: - CUtils::dump(1U, "Defined Short Data Header", m_data, 12U); + CUtils::dump(1U, "DMR, Defined Short Data Header", m_data, 12U); m_blocks = (m_data[0U] & 0x30U) + (m_data[1U] & 0x0FU); m_F = (m_data[8U] & 0x01U) == 0x01U; m_S = (m_data[8U] & 0x02U) == 0x02U; break; case DPF_UDT: - CUtils::dump(1U, "Unified Data Transport Header", m_data, 12U); + CUtils::dump(1U, "DMR, Unified Data Transport Header", m_data, 12U); m_blocks = m_data[8U] & 0x03U; break; default: - CUtils::dump("Unknown Data Header", m_data, 12U); + CUtils::dump("DMR, Unknown Data Header", m_data, 12U); break; } + if (dpf == DPF_UDT && m_blocks == 0U) { + unsigned char format = m_data[1U] & 0x0FU; + if (format == UDTF_NMEA) { + LogDebug("DMR, fixing broken Tytera MD-390 GPS data block count"); + m_blocks = 2U; + } + } + return true; }