From eef5d81e2c4b48d821504ade174d87123a2c2c76 Mon Sep 17 00:00:00 2001 From: Andy CA6JAU Date: Sun, 21 May 2017 12:03:10 -0400 Subject: [PATCH] Fixing bits to bytes conversion function in DMR DMO mode (improvement in DMR BER) --- DMRDMORX.cpp | 37 ++++++++++++++++++++++++------------- 1 file changed, 24 insertions(+), 13 deletions(-) diff --git a/DMRDMORX.cpp b/DMRDMORX.cpp index 8b6ec0a..c44293c 100644 --- a/DMRDMORX.cpp +++ b/DMRDMORX.cpp @@ -25,7 +25,7 @@ #include "DMRSlotType.h" #include "Utils.h" -const uint8_t MAX_SYNC_BYTES_ERRS = 1U; +const uint8_t MAX_SYNC_BYTES_ERRS = 3U; const uint8_t MAX_SYNC_LOST_FRAMES = 13U; @@ -206,7 +206,7 @@ void CDMRDMORX::correlateSync() if (m_startPtr >= DMO_BUFFER_LENGTH_BITS) m_startPtr -= DMO_BUFFER_LENGTH_BITS; - m_endPtr = m_dataPtr + DMR_SLOT_TYPE_LENGTH_BITS / 2U + DMR_INFO_LENGTH_BITS / 2U; + m_endPtr = m_dataPtr + DMR_SLOT_TYPE_LENGTH_BITS / 2U + DMR_INFO_LENGTH_BITS / 2U; if (m_endPtr >= DMO_BUFFER_LENGTH_BITS) m_endPtr -= DMO_BUFFER_LENGTH_BITS; @@ -234,17 +234,28 @@ void CDMRDMORX::bitsToBytes(uint16_t start, uint8_t count, uint8_t* buffer) for (uint8_t i = 0U; i < count; i++) { buffer[i] = 0U; - buffer[i] |= ((m_buffer[start + 0U] & 0x01) << 7); - buffer[i] |= ((m_buffer[start + 1U] & 0x01) << 6); - buffer[i] |= ((m_buffer[start + 2U] & 0x01) << 5); - buffer[i] |= ((m_buffer[start + 3U] & 0x01) << 4); - buffer[i] |= ((m_buffer[start + 4U] & 0x01) << 3); - buffer[i] |= ((m_buffer[start + 5U] & 0x01) << 2); - buffer[i] |= ((m_buffer[start + 6U] & 0x01) << 1); - buffer[i] |= ((m_buffer[start + 7U] & 0x01) << 0); - - start += 8U; - + buffer[i] |= ((m_buffer[start++] & 0x01) << 7); + if (start >= DMO_BUFFER_LENGTH_BITS) + start -= DMO_BUFFER_LENGTH_BITS; + buffer[i] |= ((m_buffer[start++] & 0x01) << 6); + if (start >= DMO_BUFFER_LENGTH_BITS) + start -= DMO_BUFFER_LENGTH_BITS; + buffer[i] |= ((m_buffer[start++] & 0x01) << 5); + if (start >= DMO_BUFFER_LENGTH_BITS) + start -= DMO_BUFFER_LENGTH_BITS; + buffer[i] |= ((m_buffer[start++] & 0x01) << 4); + if (start >= DMO_BUFFER_LENGTH_BITS) + start -= DMO_BUFFER_LENGTH_BITS; + buffer[i] |= ((m_buffer[start++] & 0x01) << 3); + if (start >= DMO_BUFFER_LENGTH_BITS) + start -= DMO_BUFFER_LENGTH_BITS; + buffer[i] |= ((m_buffer[start++] & 0x01) << 2); + if (start >= DMO_BUFFER_LENGTH_BITS) + start -= DMO_BUFFER_LENGTH_BITS; + buffer[i] |= ((m_buffer[start++] & 0x01) << 1); + if (start >= DMO_BUFFER_LENGTH_BITS) + start -= DMO_BUFFER_LENGTH_BITS; + buffer[i] |= ((m_buffer[start++] & 0x01) << 0); if (start >= DMO_BUFFER_LENGTH_BITS) start -= DMO_BUFFER_LENGTH_BITS; }