From 1d93f72b5202b308dd86a0bef91df2f3f6c3fadf Mon Sep 17 00:00:00 2001 From: Jonathan Naylor Date: Tue, 23 Feb 2016 21:01:14 +0000 Subject: [PATCH] Handle sync-less data frames. --- DMRSlot.cpp | 39 +++++++++++++++++++++++++++++++++++---- YSFConvolution.cpp | 2 -- YSFParrot.cpp | 3 ++- 3 files changed, 37 insertions(+), 7 deletions(-) diff --git a/DMRSlot.cpp b/DMRSlot.cpp index 960fb60..1783bf6 100644 --- a/DMRSlot.cpp +++ b/DMRSlot.cpp @@ -245,7 +245,7 @@ void CDMRSlot::writeModem(unsigned char *data) m_state = RS_RELAYING_RF_DATA; - setShortLC(m_slotNo, m_lc->getDstId(), gi ? FLCO_GROUP : FLCO_USER_USER, false); + setShortLC(m_slotNo, dstId, gi ? FLCO_GROUP : FLCO_USER_USER, false); m_display->writeDMR(m_slotNo, srcId, gi, dstId, "RD"); @@ -349,10 +349,38 @@ void CDMRSlot::writeModem(unsigned char *data) m_state = RS_LATE_ENTRY; } } else { - CDMREMB emb; - emb.putData(data + 2U); + if (m_state == RS_RELAYING_RF_DATA) { + CDMRSlotType slotType; + slotType.putData(data + 2U); + + unsigned char dataType = slotType.getDataType(); + + if (dataType == DT_RATE_12_DATA || dataType == DT_RATE_34_DATA || dataType == DT_RATE_1_DATA) { + // Regenerate the Slot Type + slotType.getData(data + 2U); + + m_frames--; + + data[0U] = m_frames == 0U ? TAG_EOT : TAG_DATA; + data[1U] = 0x00U; + + if (m_duplex) + writeQueue(data); + + writeNetwork(data, dataType); + + if (m_frames == 0U) { + LogMessage("DMR Slot %u, ended RF data transmission", m_slotNo); + writeEndOfTransmission(); + } + } else { + // Unhandled data type + LogWarning("DMR Slot %u, unhandled RF data type - 0x%02X", m_slotNo, dataType); + } + } else if (m_state == RS_RELAYING_RF_AUDIO) { + CDMREMB emb; + emb.putData(data + 2U); - if (m_state == RS_RELAYING_RF_AUDIO) { // Regenerate the EMB emb.setColorCode(m_colorCode); emb.getData(data + 2U); @@ -377,6 +405,9 @@ void CDMRSlot::writeModem(unsigned char *data) writeNetwork(data, DT_VOICE); } else if (m_state == RS_LATE_ENTRY) { + CDMREMB emb; + emb.putData(data + 2U); + // If we haven't received an LC yet, then be strict on the color code unsigned char colorCode = emb.getColorCode(); if (colorCode != m_colorCode) diff --git a/YSFConvolution.cpp b/YSFConvolution.cpp index 37e55dd..8de7045 100644 --- a/YSFConvolution.cpp +++ b/YSFConvolution.cpp @@ -22,8 +22,6 @@ #include #include -const unsigned int BUFFER_LENGTH = 200U; - const unsigned char BIT_MASK_TABLE[] = {0x80U, 0x40U, 0x20U, 0x10U, 0x08U, 0x04U, 0x02U, 0x01U}; #define WRITE_BIT1(p,i,b) p[(i)>>3] = (b) ? (p[(i)>>3] | BIT_MASK_TABLE[(i)&7]) : (p[(i)>>3] & ~BIT_MASK_TABLE[(i)&7]) diff --git a/YSFParrot.cpp b/YSFParrot.cpp index c8729ee..f05ce78 100644 --- a/YSFParrot.cpp +++ b/YSFParrot.cpp @@ -56,7 +56,8 @@ bool CYSFParrot::write(const unsigned char* data) void CYSFParrot::end() { - m_timer.start(); + if (m_used > 0U) + m_timer.start(); m_ptr = 0U; }