From bea76da41fe10f2e1a642d22adb6b60f07c00619 Mon Sep 17 00:00:00 2001 From: Jonathan Naylor Date: Sun, 28 Feb 2016 18:22:17 +0000 Subject: [PATCH] Add special data spacer/termination after data transmission. --- DMRDataHeader.cpp | 61 ++++++++++++++++++++++++++++++++---------- DMRDataHeader.h | 7 +++-- DMRSlot.cpp | 67 ++++++++++++++++++++++++++++++++++++++++++++++- DMRSlot.h | 5 +++- 4 files changed, 120 insertions(+), 20 deletions(-) diff --git a/DMRDataHeader.cpp b/DMRDataHeader.cpp index f5df348..70f286e 100644 --- a/DMRDataHeader.cpp +++ b/DMRDataHeader.cpp @@ -20,6 +20,7 @@ #include "DMRDataHeader.h" #include "DMRDefines.h" #include "BPTC19696.h" +#include "RS129.h" #include "Utils.h" #include "CRC.h" #include "Log.h" @@ -74,7 +75,6 @@ bool CDMRDataHeader::put(const unsigned char* bytes) m_dstId = m_data[2U] << 16 | m_data[3U] << 8 | m_data[4U]; m_srcId = m_data[5U] << 16 | m_data[6U] << 8 | m_data[7U]; - // XXX check these, add logging like CSBK? switch (dpf) { case DPF_UNCONFIRMED_DATA: CUtils::dump("Unconfirmed Data Header", m_data, 12U); @@ -136,11 +136,6 @@ bool CDMRDataHeader::getGI() const return m_GI; } -bool CDMRDataHeader::getA() const -{ - return m_A; -} - unsigned int CDMRDataHeader::getSrcId() const { return m_srcId; @@ -156,17 +151,55 @@ unsigned int CDMRDataHeader::getBlocks() const return m_blocks; } -bool CDMRDataHeader::getF() const +void CDMRDataHeader::getTerminator(unsigned char* bytes) const { - return m_F; + assert(bytes != NULL); + + unsigned char payload[12U]; + ::memset(payload, 0x00U, 12U); + + payload[0U] = m_GI ? FLCO_GROUP : FLCO_USER_USER; + + payload[1U] = FID_ETSI; + + payload[2U] = (m_dstId >> 16) & 0xFFU; + payload[3U] = (m_dstId >> 8) & 0xFFU; + payload[4U] = (m_dstId >> 0) & 0xFFU; + + payload[5U] = (m_srcId >> 16) & 0xFFU; + payload[6U] = (m_srcId >> 8) & 0xFFU; + payload[7U] = (m_srcId >> 0) & 0xFFU; + + payload[8U] |= m_GI ? 0x80U : 0x00U; + payload[8U] |= m_A ? 0x40U : 0x00U; + payload[8U] |= m_F ? 0x20U : 0x00U; + payload[8U] |= m_S ? 0x08U : 0x00U; + payload[8U] |= m_Ns & 0x07U; + + unsigned char parity[4U]; + CRS129::encode(payload, 9U, parity); + + payload[9U] = parity[2U] ^ TERMINATOR_WITH_LC_CRC_MASK[0U]; + payload[10U] = parity[1U] ^ TERMINATOR_WITH_LC_CRC_MASK[1U]; + payload[11U] = parity[0U] ^ TERMINATOR_WITH_LC_CRC_MASK[2U]; + + CBPTC19696 bptc; + bptc.encode(payload, bytes); } -bool CDMRDataHeader::getS() const +CDMRDataHeader& CDMRDataHeader::operator=(const CDMRDataHeader& header) { - return m_S; -} + if (&header != this) { + ::memcpy(m_data, header.m_data, 12U); + m_GI = header.m_GI; + m_A = header.m_A; + m_srcId = header.m_srcId; + m_dstId = header.m_dstId; + m_blocks = header.m_blocks; + m_F = header.m_F; + m_S = header.m_S; + m_Ns = header.m_Ns; + } -unsigned char CDMRDataHeader::getNs() const -{ - return m_Ns; + return *this; } diff --git a/DMRDataHeader.h b/DMRDataHeader.h index c9457ba..e381e19 100644 --- a/DMRDataHeader.h +++ b/DMRDataHeader.h @@ -29,17 +29,16 @@ public: void get(unsigned char* bytes) const; + void getTerminator(unsigned char* bytes) const; + bool getGI() const; - bool getA() const; unsigned int getSrcId() const; unsigned int getDstId() const; unsigned int getBlocks() const; - bool getF() const; - bool getS() const; - unsigned char getNs() const; + CDMRDataHeader& operator=(const CDMRDataHeader& header); private: unsigned char* m_data; diff --git a/DMRSlot.cpp b/DMRSlot.cpp index bb1c593..8b49cf9 100644 --- a/DMRSlot.cpp +++ b/DMRSlot.cpp @@ -11,7 +11,6 @@ * GNU General Public License for more details. */ -#include "DMRDataHeader.h" #include "DMRSlotType.h" #include "DMRShortLC.h" #include "DMRFullLC.h" @@ -51,6 +50,8 @@ m_netState(RS_NET_IDLE), m_rfEmbeddedLC(), m_rfLC(NULL), m_netLC(NULL), +m_rfDataHeader(), +m_netDataHeader(), m_rfSeqNo(0U), m_netSeqNo(0U), m_rfN(0U), @@ -218,6 +219,8 @@ void CDMRSlot::writeModem(unsigned char *data) return; } + m_rfDataHeader = dataHeader; + bool gi = dataHeader.getGI(); unsigned int srcId = dataHeader.getSrcId(); unsigned int dstId = dataHeader.getDstId(); @@ -328,6 +331,26 @@ void CDMRSlot::writeModem(unsigned char *data) 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 { @@ -389,6 +412,26 @@ void CDMRSlot::writeModem(unsigned char *data) 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 { @@ -736,6 +779,8 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData) return; } + m_netDataHeader = dataHeader; + bool gi = dataHeader.getGI(); unsigned int srcId = dataHeader.getSrcId(); unsigned int dstId = dataHeader.getDstId(); @@ -964,6 +1009,26 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData) 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++) + writeQueueRF(bytes); + } + writeEndNet(); } } else { diff --git a/DMRSlot.h b/DMRSlot.h index 7e10a0d..ae67e82 100644 --- a/DMRSlot.h +++ b/DMRSlot.h @@ -20,8 +20,9 @@ #define DMRSlot_H #include "DMREmbeddedLC.h" -#include "StopWatch.h" +#include "DMRDataHeader.h" #include "RingBuffer.h" +#include "StopWatch.h" #include "AMBEFEC.h" #include "DMRSlot.h" #include "DMRData.h" @@ -56,6 +57,8 @@ private: CDMREmbeddedLC m_rfEmbeddedLC; CDMRLC* m_rfLC; CDMRLC* m_netLC; + CDMRDataHeader m_rfDataHeader; + CDMRDataHeader m_netDataHeader; unsigned char m_rfSeqNo; unsigned char m_netSeqNo; unsigned char m_netN;