From e0332c4efa975fa22bbdfeef0c5232f85cfef9f7 Mon Sep 17 00:00:00 2001 From: Andy CA6JAU Date: Sun, 28 Oct 2018 19:03:37 -0300 Subject: [PATCH] Additional checks for overflows and some code cleanup --- DStarRX.cpp | 6 ++++++ DStarRX.h | 4 +++- NXDNDefines.h | 21 +++------------------ NXDNRX.cpp | 16 +++++++--------- NXDNRX.h | 4 +--- YSFDefines.h | 20 ++++++-------------- YSFRX.cpp | 22 ++++++++++------------ YSFRX.h | 4 +--- 8 files changed, 37 insertions(+), 60 deletions(-) diff --git a/DStarRX.cpp b/DStarRX.cpp index cc8411e..dac1841 100644 --- a/DStarRX.cpp +++ b/DStarRX.cpp @@ -330,7 +330,10 @@ void CDStarRX::processHeader(bool bit) m_patternBuffer |= 0x01U; WRITE_BIT2(m_rxBuffer, m_rxBufferBits, bit); + m_rxBufferBits++; + if (m_rxBufferBits > DSTAR_BUFFER_LENGTH_BITS) + reset(); // A full FEC header if (m_rxBufferBits == DSTAR_FEC_SECTION_LENGTH_BITS) { @@ -361,7 +364,10 @@ void CDStarRX::processData(bool bit) m_patternBuffer |= 0x01U; WRITE_BIT2(m_rxBuffer, m_rxBufferBits, bit); + m_rxBufferBits++; + if (m_rxBufferBits > DSTAR_BUFFER_LENGTH_BITS) + reset(); // Fuzzy matching of the end frame sequences if (countBits32((m_patternBuffer & END_SYNC_MASK) ^ END_SYNC_DATA) <= END_SYNC_ERRS) { diff --git a/DStarRX.h b/DStarRX.h index 589914d..e8a4b68 100644 --- a/DStarRX.h +++ b/DStarRX.h @@ -22,6 +22,8 @@ #include "DStarDefines.h" +const uint16_t DSTAR_BUFFER_LENGTH_BITS = 800U; + enum DSRX_STATE { DSRXS_NONE, DSRXS_HEADER, @@ -39,7 +41,7 @@ public: private: DSRX_STATE m_rxState; uint32_t m_patternBuffer; - uint8_t m_rxBuffer[100U]; + uint8_t m_rxBuffer[DSTAR_BUFFER_LENGTH_BITS / 8U]; unsigned int m_rxBufferBits; unsigned int m_dataBits; unsigned int m_mar; diff --git a/NXDNDefines.h b/NXDNDefines.h index a98166f..595cc20 100644 --- a/NXDNDefines.h +++ b/NXDNDefines.h @@ -1,5 +1,6 @@ /* * Copyright (C) 2016,2017,2018 by Jonathan Naylor G4KLX + * Copyright (C) 2018 by Andy Uribe CA6JAU * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -19,16 +20,10 @@ #if !defined(NXDNDEFINES_H) #define NXDNDEFINES_H -const unsigned int NXDN_RADIO_SYMBOL_LENGTH = 10U; // At 24 kHz sample rate - -const unsigned int NXDN_FRAME_LENGTH_BITS = 384U; -const unsigned int NXDN_FRAME_LENGTH_BYTES = NXDN_FRAME_LENGTH_BITS / 8U; -const unsigned int NXDN_FRAME_LENGTH_SYMBOLS = NXDN_FRAME_LENGTH_BITS / 2U; -const unsigned int NXDN_FRAME_LENGTH_SAMPLES = NXDN_FRAME_LENGTH_SYMBOLS * NXDN_RADIO_SYMBOL_LENGTH; +const unsigned int NXDN_FRAME_LENGTH_BITS = 384U; +const unsigned int NXDN_FRAME_LENGTH_BYTES = NXDN_FRAME_LENGTH_BITS / 8U; const unsigned int NXDN_FSW_LENGTH_BITS = 20U; -const unsigned int NXDN_FSW_LENGTH_SYMBOLS = NXDN_FSW_LENGTH_BITS / 2U; -const unsigned int NXDN_FSW_LENGTH_SAMPLES = NXDN_FSW_LENGTH_SYMBOLS * NXDN_RADIO_SYMBOL_LENGTH; const uint8_t NXDN_FSW_BYTES[] = {0xCDU, 0xF5U, 0x90U}; const uint8_t NXDN_FSW_BYTES_MASK[] = {0xFFU, 0xFFU, 0xF0U}; @@ -37,14 +32,4 @@ const uint8_t NXDN_FSW_BYTES_LENGTH = 3U; const uint32_t NXDN_FSW_BITS = 0x000CDF59U; const uint32_t NXDN_FSW_BITS_MASK = 0x000FFFFFU; -// C D F 5 9 -// 11 00 11 01 11 11 01 01 10 01 -// -3 +1 -3 +3 -3 -3 +3 +3 -1 +3 - -const int8_t NXDN_FSW_SYMBOLS_VALUES[] = {-3, +1, -3, +3, -3, -3, +3, +3, -1, +3}; - -const uint16_t NXDN_FSW_SYMBOLS = 0x014DU; -const uint16_t NXDN_FSW_SYMBOLS_MASK = 0x03FFU; - #endif - diff --git a/NXDNRX.cpp b/NXDNRX.cpp index ac9e3c7..3b4dd94 100644 --- a/NXDNRX.cpp +++ b/NXDNRX.cpp @@ -32,7 +32,6 @@ const uint8_t BIT_MASK_TABLE[] = {0x80U, 0x40U, 0x20U, 0x10U, 0x08U, 0x04U, 0x02 #define WRITE_BIT1(p,i,b) p[(i)>>3] = (b) ? (p[(i)>>3] | BIT_MASK_TABLE[(i)&7]) : (p[(i)>>3] & ~BIT_MASK_TABLE[(i)&7]) CNXDNRX::CNXDNRX() : -m_prev(false), m_state(NXDNRXS_NONE), m_bitBuffer(0x00U), m_outBuffer(), @@ -45,7 +44,6 @@ m_lostCount(0U) void CNXDNRX::reset() { - m_prev = false; m_state = NXDNRXS_NONE; m_bitBuffer = 0x00U; m_bufferPtr = 0U; @@ -75,11 +73,10 @@ void CNXDNRX::processNone(bool bit) m_lostCount = MAX_FSW_FRAMES; m_bufferPtr = NXDN_FSW_LENGTH_BITS; m_state = NXDNRXS_DATA; - + io.setDecode(true); - } - + } void CNXDNRX::processData(bool bit) @@ -89,7 +86,10 @@ void CNXDNRX::processData(bool bit) m_bitBuffer |= 0x01U; WRITE_BIT1(m_buffer, m_bufferPtr, bit); + m_bufferPtr++; + if (m_bufferPtr > NXDN_FRAME_LENGTH_BITS) + reset(); // Only search for a sync in the right place +-2 symbols if (m_bufferPtr >= (NXDN_FSW_LENGTH_BITS - 2U) && m_bufferPtr <= (NXDN_FSW_LENGTH_BITS + 2U)) { @@ -108,13 +108,11 @@ void CNXDNRX::processData(bool bit) if (m_lostCount == 0U) { DEBUG1("NXDNRX: sync timed out, lost lock"); io.setDecode(false); - serial.writeNXDNLost(); - - m_state = NXDNRXS_NONE; + reset(); } else { + // Write data to host m_outBuffer[0U] = m_lostCount == (MAX_FSW_FRAMES - 1U) ? 0x01U : 0x00U; - writeRSSIData(m_outBuffer); // Start the next frame diff --git a/NXDNRX.h b/NXDNRX.h index 9b3e1cf..6a33dfb 100644 --- a/NXDNRX.h +++ b/NXDNRX.h @@ -36,7 +36,6 @@ public: void reset(); private: - bool m_prev; NXDNRX_STATE m_state; uint64_t m_bitBuffer; uint8_t m_outBuffer[NXDN_FRAME_LENGTH_BYTES + 3U]; @@ -47,8 +46,7 @@ private: void processNone(bool bit); void processData(bool bit); void writeRSSIData(uint8_t* data); - + }; #endif - diff --git a/YSFDefines.h b/YSFDefines.h index 810ff39..e261fcb 100644 --- a/YSFDefines.h +++ b/YSFDefines.h @@ -1,5 +1,6 @@ /* * Copyright (C) 2009-2015 by Jonathan Naylor G4KLX + * Copyright (C) 2018 by Andy Uribe CA6JAU * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -19,16 +20,13 @@ #if !defined(YSFDEFINES_H) #define YSFDEFINES_H -const unsigned int YSF_FRAME_LENGTH_BYTES = 120U; -const unsigned int YSF_FRAME_LENGTH_BITS = YSF_FRAME_LENGTH_BYTES * 8U; -const unsigned int YSF_FRAME_LENGTH_SYMBOLS = YSF_FRAME_LENGTH_BYTES * 4U; +const unsigned int YSF_FRAME_LENGTH_BYTES = 120U; +const unsigned int YSF_FRAME_LENGTH_BITS = YSF_FRAME_LENGTH_BYTES * 8U; -const unsigned int YSF_SYNC_LENGTH_BYTES = 5U; -const unsigned int YSF_SYNC_LENGTH_BITS = YSF_SYNC_LENGTH_BYTES * 8U; -const unsigned int YSF_SYNC_LENGTH_SYMBOLS = YSF_SYNC_LENGTH_BYTES * 4U; +const unsigned int YSF_SYNC_LENGTH_BYTES = 5U; +const unsigned int YSF_SYNC_LENGTH_BITS = YSF_SYNC_LENGTH_BYTES * 8U; -const unsigned int YSF_FICH_LENGTH_BITS = 200U; -const unsigned int YSF_FICH_LENGTH_SYMBOLS = 100U; +const unsigned int YSF_FICH_LENGTH_BITS = 200U; const uint8_t YSF_SYNC_BYTES[] = {0xD4U, 0x71U, 0xC9U, 0x63U, 0x4DU}; const uint8_t YSF_SYNC_BYTES_LENGTH = 5U; @@ -36,11 +34,5 @@ const uint8_t YSF_SYNC_BYTES_LENGTH = 5U; const uint64_t YSF_SYNC_BITS = 0x000000D471C9634DU; const uint64_t YSF_SYNC_BITS_MASK = 0x000000FFFFFFFFFFU; -// D 4 7 1 C 9 6 3 4 D -// 11 01 01 00 01 11 00 01 11 00 10 01 01 10 00 11 01 00 11 01 -// -3 +3 +3 +1 +3 -3 +1 +3 -3 +1 -1 +3 +3 -1 +3 -3 +3 +1 -3 +3 -const uint32_t YSF_SYNC_SYMBOLS = 0x0007B5ADU; -const uint32_t YSF_SYNC_SYMBOLS_MASK = 0x000FFFFFU; - #endif diff --git a/YSFRX.cpp b/YSFRX.cpp index 0aed910..fa4a659 100644 --- a/YSFRX.cpp +++ b/YSFRX.cpp @@ -1,6 +1,6 @@ /* * Copyright (C) 2009-2017 by Jonathan Naylor G4KLX - * Copyright (C) 2016,2017 by Andy Uribe CA6JAU + * Copyright (C) 2016,2017,2018 by Andy Uribe CA6JAU * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -32,7 +32,6 @@ const uint8_t BIT_MASK_TABLE[] = {0x80U, 0x40U, 0x20U, 0x10U, 0x08U, 0x04U, 0x02 #define WRITE_BIT1(p,i,b) p[(i)>>3] = (b) ? (p[(i)>>3] | BIT_MASK_TABLE[(i)&7]) : (p[(i)>>3] & ~BIT_MASK_TABLE[(i)&7]) CYSFRX::CYSFRX() : -m_prev(false), m_state(YSFRXS_NONE), m_bitBuffer(0x00U), m_outBuffer(), @@ -45,7 +44,6 @@ m_lostCount(0U) void CYSFRX::reset() { - m_prev = false; m_state = YSFRXS_NONE; m_bitBuffer = 0x00U; m_bufferPtr = 0U; @@ -75,9 +73,8 @@ void CYSFRX::processNone(bool bit) m_lostCount = MAX_SYNC_FRAMES; m_bufferPtr = YSF_SYNC_LENGTH_BITS; m_state = YSFRXS_DATA; - + io.setDecode(true); - } } @@ -89,9 +86,12 @@ void CYSFRX::processData(bool bit) m_bitBuffer |= 0x01U; WRITE_BIT1(m_buffer, m_bufferPtr, bit); - m_bufferPtr++; - // Only search for a sync in the right place +-2 symbols + m_bufferPtr++; + if (m_bufferPtr > YSF_FRAME_LENGTH_BITS) + reset(); + + // Only search for a sync in the right place +-2 bits if (m_bufferPtr >= (YSF_SYNC_LENGTH_BITS - 2U) && m_bufferPtr <= (YSF_SYNC_LENGTH_BITS + 2U)) { // Fuzzy matching of the data sync bit sequence if (countBits64((m_bitBuffer & YSF_SYNC_BITS_MASK) ^ YSF_SYNC_BITS) <= SYNC_BIT_RUN_ERRS) { @@ -103,18 +103,16 @@ void CYSFRX::processData(bool bit) // Send a data frame to the host if the required number of bits have been received if (m_bufferPtr == YSF_FRAME_LENGTH_BITS) { - // We've not seen a data sync for too long, signal RXLOST and change to RX_NONE m_lostCount--; + // We've not seen a data sync for too long, signal RXLOST and change to RX_NONE if (m_lostCount == 0U) { DEBUG1("YSFRX: sync timed out, lost lock"); io.setDecode(false); - serial.writeYSFLost(); - - m_state = YSFRXS_NONE; + reset(); } else { + // Write data to host m_outBuffer[0U] = m_lostCount == (MAX_SYNC_FRAMES - 1U) ? 0x01U : 0x00U; - writeRSSIData(m_outBuffer); // Start the next frame diff --git a/YSFRX.h b/YSFRX.h index 435e314..3e2ee8f 100644 --- a/YSFRX.h +++ b/YSFRX.h @@ -36,7 +36,6 @@ public: void reset(); private: - bool m_prev; YSFRX_STATE m_state; uint64_t m_bitBuffer; uint8_t m_outBuffer[YSF_FRAME_LENGTH_BYTES + 3U]; @@ -47,8 +46,7 @@ private: void processNone(bool bit); void processData(bool bit); void writeRSSIData(uint8_t* data); - + }; #endif -