From e16c27be6183099648e0e6fb831b6af678be9b55 Mon Sep 17 00:00:00 2001 From: Jonathan Naylor Date: Mon, 5 Sep 2016 18:03:23 +0100 Subject: [PATCH] Change the DMR sync bytes when in DMO mode. --- DMRSlot.cpp | 133 ++++++++++++++++++++++++++++++++++++++-------------- Sync.cpp | 20 +++++++- Sync.h | 7 ++- 3 files changed, 121 insertions(+), 39 deletions(-) diff --git a/DMRSlot.cpp b/DMRSlot.cpp index 1bff663..b857316 100644 --- a/DMRSlot.cpp +++ b/DMRSlot.cpp @@ -167,8 +167,11 @@ void CDMRSlot::writeModem(unsigned char *data, unsigned int len) // Regenerate the Slot Type slotType.getData(data + 2U); - // Convert the Data Sync to be from the BS - CSync::addDMRDataSync(data + 2U); + // Convert the Data Sync to be from the BS or MS as needed + if (m_duplex) + CSync::addDMRBSDataSync(data + 2U); + else + CSync::addDMRMSDataSync(data + 2U); data[0U] = TAG_DATA; data[1U] = 0x00U; @@ -209,8 +212,11 @@ void CDMRSlot::writeModem(unsigned char *data, unsigned int len) // Regenerate the Slot Type slotType.getData(data + 2U); - // Convert the Data Sync to be from the BS - CSync::addDMRDataSync(data + 2U); + // Convert the Data Sync to be from the BS or MS as needed + if (m_duplex) + CSync::addDMRBSDataSync(data + 2U); + else + CSync::addDMRMSDataSync(data + 2U); // Regenerate the payload CBPTC19696 bptc; @@ -236,8 +242,11 @@ void CDMRSlot::writeModem(unsigned char *data, unsigned int len) // Regenerate the Slot Type slotType.getData(data + 2U); - // Set the Data Sync to be from the BS - CSync::addDMRDataSync(data + 2U); + // Convert the Data Sync to be from the BS or MS as needed + if (m_duplex) + CSync::addDMRBSDataSync(data + 2U); + else + CSync::addDMRMSDataSync(data + 2U); data[0U] = TAG_EOT; data[1U] = 0x00U; @@ -282,8 +291,11 @@ void CDMRSlot::writeModem(unsigned char *data, unsigned int len) // Regenerate the Slot Type slotType.getData(data + 2U); - // Convert the Data Sync to be from the BS - CSync::addDMRDataSync(data + 2U); + // Convert the Data Sync to be from the BS or MS as needed + if (m_duplex) + CSync::addDMRBSDataSync(data + 2U); + else + CSync::addDMRMSDataSync(data + 2U); data[0U] = m_rfFrames == 0U ? TAG_EOT : TAG_DATA; data[1U] = 0x00U; @@ -329,8 +341,11 @@ void CDMRSlot::writeModem(unsigned char *data, unsigned int len) // Regenerate the Slot Type slotType.getData(data + 2U); - // Convert the Data Sync to be from the BS - CSync::addDMRDataSync(data + 2U); + // Convert the Data Sync to be from the BS or MS as needed + if (m_duplex) + CSync::addDMRBSDataSync(data + 2U); + else + CSync::addDMRMSDataSync(data + 2U); m_rfSeqNo = 0U; @@ -387,8 +402,11 @@ void CDMRSlot::writeModem(unsigned char *data, unsigned int len) // Regenerate the Slot Type slotType.getData(data + 2U); - // Convert the Data Sync to be from the BS - CSync::addDMRDataSync(data + 2U); + // Convert the Data Sync to be from the BS or MS as needed + if (m_duplex) + CSync::addDMRBSDataSync(data + 2U); + else + CSync::addDMRMSDataSync(data + 2U); m_rfFrames--; @@ -405,8 +423,11 @@ void CDMRSlot::writeModem(unsigned char *data, unsigned int len) } } else if (audioSync) { if (m_rfState == RS_RF_AUDIO) { - // Convert the Audio Sync to be from the BS - CSync::addDMRAudioSync(data + 2U); + // Convert the Audio Sync to be from the BS or MS as needed + if (m_duplex) + CSync::addDMRBSAudioSync(data + 2U); + else + CSync::addDMRMSAudioSync(data + 2U); unsigned int errors = 0U; unsigned char fid = m_rfLC->getFID(); @@ -490,7 +511,10 @@ void CDMRSlot::writeModem(unsigned char *data, unsigned int len) // Create a dummy start frame to replace the received frame unsigned char start[DMR_FRAME_LENGTH_BYTES + 2U]; - CSync::addDMRDataSync(data + 2U); + if (m_duplex) + CSync::addDMRBSDataSync(start + 2U); + else + CSync::addDMRMSDataSync(start + 2U); CDMRFullLC fullLC; fullLC.encode(*m_rfLC, start + 2U, DT_VOICE_LC_HEADER); @@ -589,7 +613,10 @@ void CDMRSlot::endOfRFData() if (m_duplex) { unsigned char bytes[DMR_FRAME_LENGTH_BYTES + 2U]; - CSync::addDMRDataSync(bytes + 2U); + if (m_duplex) + CSync::addDMRBSDataSync(bytes + 2U); + else + CSync::addDMRMSDataSync(bytes + 2U); CDMRSlotType slotType; slotType.setDataType(DT_TERMINATOR_WITH_LC); @@ -629,7 +656,10 @@ void CDMRSlot::writeEndRF(bool writeEnd) // Create a dummy start end frame unsigned char data[DMR_FRAME_LENGTH_BYTES + 2U]; - CSync::addDMRDataSync(data + 2U); + if (m_duplex) + CSync::addDMRBSDataSync(data + 2U); + else + CSync::addDMRMSDataSync(data + 2U); CDMRFullLC fullLC; fullLC.encode(*m_rfLC, data + 2U, DT_TERMINATOR_WITH_LC); @@ -658,7 +688,10 @@ void CDMRSlot::endOfNetData() if (m_duplex) { unsigned char bytes[DMR_FRAME_LENGTH_BYTES + 2U]; - CSync::addDMRDataSync(bytes + 2U); + if (m_duplex) + CSync::addDMRBSDataSync(bytes + 2U); + else + CSync::addDMRMSDataSync(bytes + 2U); CDMRSlotType slotType; slotType.setDataType(DT_TERMINATOR_WITH_LC); @@ -702,7 +735,10 @@ void CDMRSlot::writeEndNet(bool writeEnd) // Create a dummy start end frame unsigned char data[DMR_FRAME_LENGTH_BYTES + 2U]; - CSync::addDMRDataSync(data + 2U); + if (m_duplex) + CSync::addDMRBSDataSync(data + 2U); + else + CSync::addDMRMSDataSync(data + 2U); CDMRFullLC fullLC; fullLC.encode(*m_netLC, data + 2U, DT_TERMINATOR_WITH_LC); @@ -772,8 +808,11 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData) slotType.setDataType(DT_VOICE_LC_HEADER); slotType.getData(data + 2U); - // Convert the Data Sync to be from the BS - CSync::addDMRDataSync(data + 2U); + // Convert the Data Sync to be from the BS or MS as needed + if (m_duplex) + CSync::addDMRBSDataSync(data + 2U); + else + CSync::addDMRMSDataSync(data + 2U); data[0U] = TAG_DATA; data[1U] = 0x00U; @@ -831,8 +870,11 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData) slotType.setDataType(DT_VOICE_PI_HEADER); slotType.getData(data + 2U); - // Convert the Data Sync to be from the BS - CSync::addDMRDataSync(data + 2U); + // Convert the Data Sync to be from the BS or MS as needed + if (m_duplex) + CSync::addDMRBSDataSync(data + 2U); + else + CSync::addDMRMSDataSync(data + 2U); // Regenerate the payload CBPTC19696 bptc; @@ -867,8 +909,11 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData) slotType.setDataType(DT_TERMINATOR_WITH_LC); slotType.getData(data + 2U); - // Convert the Data Sync to be from the BS - CSync::addDMRDataSync(data + 2U); + // Convert the Data Sync to be from the BS or MS as needed + if (m_duplex) + CSync::addDMRBSDataSync(data + 2U); + else + CSync::addDMRMSDataSync(data + 2U); data[0U] = TAG_EOT; data[1U] = 0x00U; @@ -920,8 +965,11 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData) slotType.setDataType(DT_DATA_HEADER); slotType.getData(data + 2U); - // Convert the Data Sync to be from the BS - CSync::addDMRDataSync(data + 2U); + // Convert the Data Sync to be from the BS or MS as needed + if (m_duplex) + CSync::addDMRBSDataSync(data + 2U); + else + CSync::addDMRMSDataSync(data + 2U); data[0U] = m_netFrames == 0U ? TAG_EOT : TAG_DATA; data[1U] = 0x00U; @@ -971,7 +1019,10 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData) // Create a dummy start frame unsigned char start[DMR_FRAME_LENGTH_BYTES + 2U]; - CSync::addDMRDataSync(start + 2U); + if (m_duplex) + CSync::addDMRBSDataSync(start + 2U); + else + CSync::addDMRMSDataSync(start + 2U); CDMRFullLC fullLC; fullLC.encode(*m_netLC, start + 2U, DT_VOICE_LC_HEADER); @@ -1017,8 +1068,11 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData) data[0U] = TAG_DATA; data[1U] = 0x00U; - // Convert the Audio Sync to be from the BS - CSync::addDMRAudioSync(data + 2U); + // Convert the Audio Sync to be from the BS or MS as needed + if (m_duplex) + CSync::addDMRBSAudioSync(data + 2U); + else + CSync::addDMRMSAudioSync(data + 2U); // Initialise the lost packet data if (m_netFrames == 0U) { @@ -1124,8 +1178,11 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData) slotType.setColorCode(m_colorCode); slotType.getData(data + 2U); - // Convert the Data Sync to be from the BS - CSync::addDMRDataSync(data + 2U); + // Convert the Data Sync to be from the BS or MS as needed + if (m_duplex) + CSync::addDMRBSDataSync(data + 2U); + else + CSync::addDMRMSDataSync(data + 2U); data[0U] = TAG_DATA; data[1U] = 0x00U; @@ -1182,8 +1239,11 @@ void CDMRSlot::writeNetwork(const CDMRData& dmrData) slotType.setColorCode(m_colorCode); slotType.getData(data + 2U); - // Convert the Data Sync to be from the BS - CSync::addDMRDataSync(data + 2U); + // Convert the Data Sync to be from the BS or MS as needed + if (m_duplex) + CSync::addDMRBSDataSync(data + 2U); + else + CSync::addDMRMSDataSync(data + 2U); m_netFrames--; @@ -1562,7 +1622,10 @@ void CDMRSlot::insertSilence(unsigned int count) } if (n == 0U) { - CSync::addDMRAudioSync(data + 2U); + if (m_duplex) + CSync::addDMRBSAudioSync(data + 2U); + else + CSync::addDMRMSAudioSync(data + 2U); } else { unsigned char lcss = m_netEmbeddedLC.getData(data + 2U, n); diff --git a/Sync.cpp b/Sync.cpp index 648da79..810103b 100644 --- a/Sync.cpp +++ b/Sync.cpp @@ -34,7 +34,7 @@ void CSync::addDStarSync(unsigned char* data) ::memcpy(data + DSTAR_VOICE_FRAME_LENGTH_BYTES, DSTAR_SYNC_BYTES, DSTAR_DATA_FRAME_LENGTH_BYTES); } -void CSync::addDMRDataSync(unsigned char* data) +void CSync::addDMRBSDataSync(unsigned char* data) { assert(data != NULL); @@ -42,7 +42,7 @@ void CSync::addDMRDataSync(unsigned char* data) data[i + 13U] = (data[i + 13U] & ~SYNC_MASK[i]) | BS_SOURCED_DATA_SYNC[i]; } -void CSync::addDMRAudioSync(unsigned char* data) +void CSync::addDMRBSAudioSync(unsigned char* data) { assert(data != NULL); @@ -50,6 +50,22 @@ void CSync::addDMRAudioSync(unsigned char* data) data[i + 13U] = (data[i + 13U] & ~SYNC_MASK[i]) | BS_SOURCED_AUDIO_SYNC[i]; } +void CSync::addDMRMSDataSync(unsigned char* data) +{ + assert(data != NULL); + + for (unsigned int i = 0U; i < 7U; i++) + data[i + 13U] = (data[i + 13U] & ~SYNC_MASK[i]) | MS_SOURCED_DATA_SYNC[i]; +} + +void CSync::addDMRMSAudioSync(unsigned char* data) +{ + assert(data != NULL); + + for (unsigned int i = 0U; i < 7U; i++) + data[i + 13U] = (data[i + 13U] & ~SYNC_MASK[i]) | MS_SOURCED_AUDIO_SYNC[i]; +} + void CSync::addYSFSync(unsigned char* data) { assert(data != NULL); diff --git a/Sync.h b/Sync.h index ac4ac65..dae7bc1 100644 --- a/Sync.h +++ b/Sync.h @@ -24,8 +24,11 @@ class CSync public: static void addDStarSync(unsigned char* data); - static void addDMRDataSync(unsigned char* data); - static void addDMRAudioSync(unsigned char* data); + static void addDMRBSDataSync(unsigned char* data); + static void addDMRBSAudioSync(unsigned char* data); + + static void addDMRMSDataSync(unsigned char* data); + static void addDMRMSAudioSync(unsigned char* data); static void addYSFSync(unsigned char* data);