From 3e81d1eb64eb4af9eee86475d77caef722018359 Mon Sep 17 00:00:00 2001 From: Andy CA6JAU Date: Sun, 23 Sep 2018 11:11:44 -0300 Subject: [PATCH] Extend preamble length for network CSBK preamble --- DMRCSBK.cpp | 13 +++++++++++++ DMRCSBK.h | 2 ++ DMRSlot.cpp | 24 +++++++++++++++++++++++- 3 files changed, 38 insertions(+), 1 deletion(-) diff --git a/DMRCSBK.cpp b/DMRCSBK.cpp index 8496ecd..de7320d 100644 --- a/DMRCSBK.cpp +++ b/DMRCSBK.cpp @@ -127,6 +127,14 @@ void CDMRCSBK::get(unsigned char* bytes) const { assert(bytes != NULL); + m_data[10U] ^= CSBK_CRC_MASK[0U]; + m_data[11U] ^= CSBK_CRC_MASK[1U]; + + CCRC::addCCITT162(m_data, 12U); + + m_data[10U] ^= CSBK_CRC_MASK[0U]; + m_data[11U] ^= CSBK_CRC_MASK[1U]; + CBPTC19696 bptc; bptc.encode(m_data, bytes); } @@ -170,3 +178,8 @@ unsigned char CDMRCSBK::getCBF() const { return m_CBF; } + +void CDMRCSBK::setCBF(unsigned char cbf) +{ + m_CBF = m_data[3U] = cbf; +} diff --git a/DMRCSBK.h b/DMRCSBK.h index 69942b4..5dc62a0 100644 --- a/DMRCSBK.h +++ b/DMRCSBK.h @@ -57,6 +57,8 @@ public: bool getDataContent() const; unsigned char getCBF() const; + void setCBF(unsigned char cbf); + private: unsigned char* m_data; CSBKO m_CSBKO; diff --git a/DMRSlot.cpp b/DMRSlot.cpp index 0e536d9..65c6dd8 100644 --- a/DMRSlot.cpp +++ b/DMRSlot.cpp @@ -66,6 +66,7 @@ const unsigned char TALKER_ID_BLOCK3 = 0x08U; const unsigned int NO_HEADERS_SIMPLEX = 8U; const unsigned int NO_HEADERS_DUPLEX = 3U; +const unsigned int NO_PREAMBLE_CSBK = 15U; // #define DUMP_DMR @@ -1565,7 +1566,28 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData) data[0U] = TAG_DATA; data[1U] = 0x00U; - writeQueueNet(data); + if (csbko == CSBKO_PRECCSBK && csbk.getDataContent()) { + unsigned int cbf = NO_PREAMBLE_CSBK + csbk.getCBF() - 1U; + for (unsigned int i = 0U; i < NO_PREAMBLE_CSBK; i++, cbf--) { + // Change blocks to follow + csbk.setCBF(cbf); + + // Regenerate the CSBK data + csbk.get(data + 2U); + + // Regenerate the Slot Type + CDMRSlotType slotType; + slotType.putData(data + 2U); + slotType.setColorCode(m_colorCode); + slotType.getData(data + 2U); + + // Convert the Data Sync to be from the BS or MS as needed + CSync::addDMRDataSync(data + 2U, m_duplex); + + writeQueueNet(data); + } + } else + writeQueueNet(data); #if defined(DUMP_DMR) openFile();