diff --git a/ADF7021.cpp b/ADF7021.cpp index e1a32ea..5aa548a 100644 --- a/ADF7021.cpp +++ b/ADF7021.cpp @@ -40,7 +40,6 @@ uint32_t ADF7021_RX_REG0; uint32_t ADF7021_TX_REG0; uint32_t ADF7021_REG1; uint32_t div2; -uint8_t m_control; static void Send_AD7021_control_shift() { diff --git a/DMRRX.cpp b/DMRRX.cpp index 2cf2fc8..92fb004 100644 --- a/DMRRX.cpp +++ b/DMRRX.cpp @@ -24,50 +24,39 @@ #include "Globals.h" #include "DMRRX.h" -CDMRRX::CDMRRX() : -m_slot1RX(false), -m_slot2RX(true) +CDMRRX::CDMRRX() { } void CDMRRX::databit(bool bit, const uint8_t control) { - bool dcd1 = false; - bool dcd2 = false; - switch (control) { case MARK_SLOT1: - m_slot1RX.start(); + m_slotRX.start(false); break; case MARK_SLOT2: - m_slot2RX.start(); + m_slotRX.start(true); break; default: break; } - - dcd1 = m_slot1RX.databit(bit); - dcd2 = m_slot2RX.databit(bit); - - io.setDecode(dcd1 || dcd2); + + io.setDecode(m_slotRX.databit(bit)); } void CDMRRX::setColorCode(uint8_t colorCode) { - m_slot1RX.setColorCode(colorCode); - m_slot2RX.setColorCode(colorCode); + m_slotRX.setColorCode(colorCode); } void CDMRRX::setDelay(uint8_t delay) { - m_slot1RX.setDelay(delay); - m_slot2RX.setDelay(delay); + m_slotRX.setDelay(delay); } void CDMRRX::reset() { - m_slot1RX.reset(); - m_slot2RX.reset(); + m_slotRX.reset(); } #endif diff --git a/DMRRX.h b/DMRRX.h index 822cb13..b286cd8 100644 --- a/DMRRX.h +++ b/DMRRX.h @@ -38,8 +38,7 @@ public: void reset(); private: - CDMRSlotRX m_slot1RX; - CDMRSlotRX m_slot2RX; + CDMRSlotRX m_slotRX; }; #endif diff --git a/DMRSlotRX.cpp b/DMRSlotRX.cpp index ae3c9fa..af45adc 100644 --- a/DMRSlotRX.cpp +++ b/DMRSlotRX.cpp @@ -28,9 +28,6 @@ #include "DMRSlotType.h" #include "Utils.h" -const uint16_t SCAN_START = 170U; -const uint16_t SCAN_END = 190U; - const uint8_t MAX_SYNC_BYTES_ERRS = 1U; const uint8_t MAX_SYNC_LOST_FRAMES = 13U; @@ -41,8 +38,8 @@ const uint8_t CONTROL_NONE = 0x00U; const uint8_t CONTROL_VOICE = 0x20U; const uint8_t CONTROL_DATA = 0x40U; -CDMRSlotRX::CDMRSlotRX(bool slot) : -m_slot(slot), +CDMRSlotRX::CDMRSlotRX() : +m_slot(false), m_patternBuffer(0x00U), m_buffer(), m_dataPtr(0U), @@ -60,12 +57,10 @@ m_type(0U) { } -void CDMRSlotRX::start() +void CDMRSlotRX::start(bool slot) { - m_dataPtr = 0U; + m_slot = slot; m_delayPtr = 0U; - m_patternBuffer = 0U; - m_control = CONTROL_NONE; } void CDMRSlotRX::reset() @@ -77,6 +72,7 @@ void CDMRSlotRX::reset() m_syncCount = 0U; m_state = DMRRXS_NONE; m_startPtr = 0U; + m_patternBuffer = 0U; m_endPtr = NOENDPTR; } @@ -86,10 +82,6 @@ bool CDMRSlotRX::databit(bool bit) if (m_delayPtr < m_delay) return m_state != DMRRXS_NONE; - // Ensure that the buffer doesn't overflow - if (m_dataPtr > m_endPtr || m_dataPtr >= 400U) - return m_state != DMRRXS_NONE; - m_buffer[m_dataPtr] = bit; m_patternBuffer <<= 1; @@ -97,17 +89,27 @@ bool CDMRSlotRX::databit(bool bit) m_patternBuffer |= 0x01U; if (m_state == DMRRXS_NONE) { - if (m_dataPtr >= SCAN_START && m_dataPtr <= SCAN_END) - correlateSync(true); + correlateSync(); } else { - uint16_t min = m_syncPtr - 1U; - uint16_t max = m_syncPtr + 1U; - if (m_dataPtr >= min && m_dataPtr <= max) - correlateSync(false); + + uint16_t min = m_syncPtr + DMR_BUFFER_LENGTH_BITS - 2; + uint16_t max = m_syncPtr + 2; + + if (min >= DMR_BUFFER_LENGTH_BITS) + min -= DMR_BUFFER_LENGTH_BITS; + if (max >= DMR_BUFFER_LENGTH_BITS) + max -= DMR_BUFFER_LENGTH_BITS; + + if (min < max) { + if (m_dataPtr >= min && m_dataPtr <= max) + correlateSync(); + } else { + if (m_dataPtr >= min || m_dataPtr <= max) + correlateSync(); + } } if (m_dataPtr == m_endPtr) { - uint8_t frame[DMR_FRAME_LENGTH_BYTES + 3U]; frame[0U] = m_control; bitsToBytes(m_startPtr, DMR_FRAME_LENGTH_BYTES, frame + 1U); @@ -202,30 +204,49 @@ bool CDMRSlotRX::databit(bool bit) } } } + + // End of this slot, reset some items for the next slot. + m_control = CONTROL_NONE; } m_dataPtr++; + if (m_dataPtr >= DMR_BUFFER_LENGTH_BITS) + m_dataPtr = 0U; + return m_state != DMRRXS_NONE; } -void CDMRSlotRX::correlateSync(bool first) +void CDMRSlotRX::correlateSync() { if (countBits64((m_patternBuffer & DMR_SYNC_BITS_MASK) ^ DMR_MS_DATA_SYNC_BITS) <= MAX_SYNC_BYTES_ERRS) { m_control = CONTROL_DATA; m_syncPtr = m_dataPtr; - m_startPtr = m_dataPtr - DMR_SLOT_TYPE_LENGTH_BITS / 2U - DMR_INFO_LENGTH_BITS / 2U - DMR_SYNC_LENGTH_BITS + 1; + + m_startPtr = m_dataPtr + DMR_BUFFER_LENGTH_BITS - DMR_SLOT_TYPE_LENGTH_BITS / 2U - DMR_INFO_LENGTH_BITS / 2U - DMR_SYNC_LENGTH_BITS + 1; + if (m_startPtr >= DMR_BUFFER_LENGTH_BITS) + m_startPtr -= DMR_BUFFER_LENGTH_BITS; + m_endPtr = m_dataPtr + DMR_SLOT_TYPE_LENGTH_BITS / 2U + DMR_INFO_LENGTH_BITS / 2U; - DEBUG4("SYNC corr MS Data found pos/start/end:", m_dataPtr, m_startPtr, m_endPtr); + if (m_endPtr >= DMR_BUFFER_LENGTH_BITS) + m_endPtr -= DMR_BUFFER_LENGTH_BITS; + + //DEBUG4("SYNC corr MS Data found pos/start/end:", m_dataPtr, m_startPtr, m_endPtr); } else if (countBits64((m_patternBuffer & DMR_SYNC_BITS_MASK) ^ DMR_MS_VOICE_SYNC_BITS) <= MAX_SYNC_BYTES_ERRS) { m_control = CONTROL_VOICE; m_syncPtr = m_dataPtr; - m_startPtr = m_dataPtr - DMR_SLOT_TYPE_LENGTH_BITS / 2U - DMR_INFO_LENGTH_BITS / 2U - DMR_SYNC_LENGTH_BITS + 1; + m_startPtr = m_dataPtr + DMR_BUFFER_LENGTH_BITS - DMR_SLOT_TYPE_LENGTH_BITS / 2U - DMR_INFO_LENGTH_BITS / 2U - DMR_SYNC_LENGTH_BITS + 1; + if (m_startPtr >= DMR_BUFFER_LENGTH_BITS) + m_startPtr -= DMR_BUFFER_LENGTH_BITS; + m_endPtr = m_dataPtr + DMR_SLOT_TYPE_LENGTH_BITS / 2U + DMR_INFO_LENGTH_BITS / 2U; - DEBUG4("SYNC corr MS Voice found pos/start/end: ", m_dataPtr, m_startPtr, m_endPtr); + if (m_endPtr >= DMR_BUFFER_LENGTH_BITS) + m_endPtr -= DMR_BUFFER_LENGTH_BITS; + + //DEBUG4("SYNC corr MS Voice found pos/start/end: ", m_dataPtr, m_startPtr, m_endPtr); } } @@ -243,6 +264,9 @@ void CDMRSlotRX::bitsToBytes(uint16_t start, uint8_t count, uint8_t* buffer) buffer[i] |= ((m_buffer[start + 7U] & 0x01) << 0); start += 8U; + + if (start >= DMR_BUFFER_LENGTH_BITS) + start -= DMR_BUFFER_LENGTH_BITS; } } @@ -253,7 +277,7 @@ void CDMRSlotRX::setColorCode(uint8_t colorCode) void CDMRSlotRX::setDelay(uint8_t delay) { - m_delay = delay; + m_delay = delay / 5; } void CDMRSlotRX::writeRSSIData(uint8_t* frame) diff --git a/DMRSlotRX.h b/DMRSlotRX.h index 98138de..9c66848 100644 --- a/DMRSlotRX.h +++ b/DMRSlotRX.h @@ -26,6 +26,8 @@ #include "DMRDefines.h" +const uint16_t DMR_BUFFER_LENGTH_BITS = 576U; + enum DMRRX_STATE { DMRRXS_NONE, DMRRXS_VOICE, @@ -34,9 +36,9 @@ enum DMRRX_STATE { class CDMRSlotRX { public: - CDMRSlotRX(bool slot); + CDMRSlotRX(); - void start(); + void start(bool slot); bool databit(bool bit); @@ -48,7 +50,8 @@ public: private: bool m_slot; uint64_t m_patternBuffer; - uint8_t m_buffer[400U]; + uint8_t m_buffer[DMR_BUFFER_LENGTH_BITS]; + uint8_t frame[DMR_FRAME_LENGTH_BYTES + 3U]; uint16_t m_dataPtr; uint16_t m_syncPtr; uint16_t m_startPtr; @@ -62,7 +65,7 @@ private: uint8_t m_n; uint8_t m_type; - void correlateSync(bool first); + void correlateSync(); void bitsToBytes(uint16_t start, uint8_t count, uint8_t* buffer); void writeRSSIData(uint8_t* frame); }; diff --git a/DMRTX.cpp b/DMRTX.cpp index 4247330..b268eae 100644 --- a/DMRTX.cpp +++ b/DMRTX.cpp @@ -227,12 +227,12 @@ void CDMRTX::writeByte(uint8_t c, uint8_t control) bit = 1U; else bit = 0U; - + control_tmp = MARK_NONE; - if( i == 0U) + if( i == 7U || i == 6U) control_tmp = control; - + io.write(&bit, 1, &control_tmp); } @@ -271,7 +271,7 @@ void CDMRTX::createData(uint8_t slotIndex) void CDMRTX::createCACH(uint8_t txSlotIndex, uint8_t rxSlotIndex) { m_frameCount++; - + if (m_cachPtr >= 12U) m_cachPtr = 0U; diff --git a/Globals.h b/Globals.h index 60c5bf4..3dbf5d6 100644 --- a/Globals.h +++ b/Globals.h @@ -81,6 +81,7 @@ extern CDStarRX dstarRX; extern CDStarTX dstarTX; #if defined(DUPLEX) +extern uint8_t m_control; extern CDMRIdleRX dmrIdleRX; extern CDMRRX dmrRX; extern CDMRTX dmrTX; diff --git a/MMDVM_HS.cpp b/MMDVM_HS.cpp index 3443d2f..981ca45 100644 --- a/MMDVM_HS.cpp +++ b/MMDVM_HS.cpp @@ -43,6 +43,7 @@ CDStarRX dstarRX; CDStarTX dstarTX; #if defined(DUPLEX) +uint8_t m_control; CDMRIdleRX dmrIdleRX; CDMRRX dmrRX; CDMRTX dmrTX; diff --git a/MMDVM_HS.ino b/MMDVM_HS.ino index 060eacf..a521723 100644 --- a/MMDVM_HS.ino +++ b/MMDVM_HS.ino @@ -39,6 +39,7 @@ CDStarRX dstarRX; CDStarTX dstarTX; #if defined(DUPLEX) +uint8_t m_control; CDMRIdleRX dmrIdleRX; CDMRRX dmrRX; CDMRTX dmrTX;