From 4760f7aa6452b5f330b7934759266b68b64f1741 Mon Sep 17 00:00:00 2001 From: Jonathan Naylor Date: Tue, 15 Mar 2016 22:46:36 +0000 Subject: [PATCH] More work on DMR Data Header block counts. --- DMRDataHeader.cpp | 1 + DMRSlot.cpp | 65 +++++++++-------------------------------------- 2 files changed, 13 insertions(+), 53 deletions(-) diff --git a/DMRDataHeader.cpp b/DMRDataHeader.cpp index bc436c8..ed8dbc1 100644 --- a/DMRDataHeader.cpp +++ b/DMRDataHeader.cpp @@ -116,6 +116,7 @@ bool CDMRDataHeader::put(const unsigned char* bytes) case DPF_UDT: CUtils::dump(1U, "Unified Data Transport Header", m_data, 12U); + m_blocks = m_data[8U] & 0x03U; break; default: diff --git a/DMRSlot.cpp b/DMRSlot.cpp index 549fb65..fb28845 100644 --- a/DMRSlot.cpp +++ b/DMRSlot.cpp @@ -226,13 +226,18 @@ void CDMRSlot::writeModem(unsigned char *data) return; } + m_rfFrames = dataHeader.getBlocks(); + if (m_rfFrames == 0U) { + LogMessage("DMR Slot %u, unknown RF data header type, no block count information found", m_slotNo); + return; + } + m_rfDataHeader = dataHeader; bool gi = dataHeader.getGI(); unsigned int srcId = dataHeader.getSrcId(); unsigned int dstId = dataHeader.getDstId(); - m_rfFrames = dataHeader.getBlocks(); m_rfSeqNo = 0U; m_rfLC = new CDMRLC(gi ? FLCO_GROUP : FLCO_USER_USER, srcId, dstId); @@ -262,31 +267,6 @@ void CDMRSlot::writeModem(unsigned char *data) } LogMessage("DMR Slot %u, received RF data header from %u to %s%u, %u blocks", m_slotNo, srcId, gi ? "TG ": "", dstId, m_rfFrames); - - if (m_rfFrames == 0U) { - LogMessage("DMR Slot %u, ended RF data transmission", m_slotNo); - - if (m_duplex) { - unsigned char bytes[DMR_FRAME_LENGTH_BYTES + 2U]; - - CSync::addDMRDataSync(bytes + 2U); - - CDMRSlotType slotType; - slotType.setDataType(DT_TERMINATOR_WITH_LC); - slotType.setColorCode(m_colorCode); - slotType.getData(bytes + 2U); - - m_rfDataHeader.getTerminator(bytes + 2U); - - bytes[0U] = TAG_DATA; - bytes[1U] = 0x00U; - - for (unsigned int i = 0U; i < 5U; i++) - writeQueueRF(bytes); - } - - writeEndRF(); - } } else if (dataType == DT_CSBK) { CDMRCSBK csbk; bool valid = csbk.put(data + 2U); @@ -790,14 +770,18 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData) return; } + m_netFrames = dataHeader.getBlocks(); + if (m_netFrames == 0U) { + LogMessage("DMR Slot %u, unknown network data header type, no block count information found", m_slotNo); + return; + } + m_netDataHeader = dataHeader; bool gi = dataHeader.getGI(); unsigned int srcId = dataHeader.getSrcId(); unsigned int dstId = dataHeader.getDstId(); - m_netFrames = dataHeader.getBlocks(); - m_netLC = new CDMRLC(gi ? FLCO_GROUP : FLCO_USER_USER, srcId, dstId); // Regenerate the data header @@ -828,31 +812,6 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData) m_display->writeDMR(m_slotNo, dmrData.getSrcId(), gi, dmrData.getDstId(), "N"); LogMessage("DMR Slot %u, received network data header from %u to %s%u, %u blocks", m_slotNo, dmrData.getSrcId(), gi ? "TG ": "", dmrData.getDstId(), m_netFrames); - - if (m_netFrames == 0U) { - LogMessage("DMR Slot %u, ended network data transmission", m_slotNo); - - if (m_duplex) { - unsigned char bytes[DMR_FRAME_LENGTH_BYTES + 2U]; - - CSync::addDMRDataSync(bytes + 2U); - - CDMRSlotType slotType; - slotType.setDataType(DT_TERMINATOR_WITH_LC); - slotType.setColorCode(m_colorCode); - slotType.getData(bytes + 2U); - - m_netDataHeader.getTerminator(bytes + 2U); - - bytes[0U] = TAG_DATA; - bytes[1U] = 0x00U; - - for (unsigned int i = 0U; i < 5U; i++) - writeQueueNet(bytes); - } - - writeEndNet(); - } } else if (dataType == DT_VOICE_SYNC) { if (m_netState == RS_NET_IDLE) { m_netLC = new CDMRLC(dmrData.getFLCO(), dmrData.getSrcId(), dmrData.getDstId());