From 05775f0bfa018dc0b2b9f0dca5a429e35296f1ca Mon Sep 17 00:00:00 2001 From: Geoffrey Merck Date: Sat, 9 May 2020 10:57:16 +0200 Subject: [PATCH] Add RingBuffer Template --- FM.cpp | 3 ++ FM.h | 6 +-- FMDownsampleRB.cpp | 101 ----------------------------------------- FMDownsampleRB.h | 68 ---------------------------- FMDownsampler.cpp | 13 +++++- FMDownsampler.h | 8 ++-- FMRB.cpp | 110 --------------------------------------------- FMRB.h | 72 ----------------------------- 8 files changed, 22 insertions(+), 359 deletions(-) delete mode 100644 FMDownsampleRB.cpp delete mode 100644 FMDownsampleRB.h delete mode 100644 FMRB.cpp delete mode 100644 FMRB.h diff --git a/FM.cpp b/FM.cpp index 3d47941..16a80c0 100644 --- a/FM.cpp +++ b/FM.cpp @@ -187,6 +187,9 @@ void CFM::reset() m_timeoutTone.stop(); m_outputRFRB.reset(); + m_inputExtRB.reset(); + + m_downsampler.reset(); } uint8_t CFM::setCallsign(const char* callsign, uint8_t speed, uint16_t frequency, uint8_t time, uint8_t holdoff, uint8_t highLevel, uint8_t lowLevel, bool callsignAtStart, bool callsignAtEnd, bool callsignAtLatch) diff --git a/FM.h b/FM.h index 3e68e28..eb1c84a 100644 --- a/FM.h +++ b/FM.h @@ -27,7 +27,7 @@ #include "FMTimeout.h" #include "FMKeyer.h" #include "FMTimer.h" -#include "FMRB.h" +#include "RingBuffer.h" #include "FMDirectForm1.h" #include "FMDownsampler.h" @@ -95,8 +95,8 @@ private: CFMDownsampler m_downsampler; bool m_extEnabled; q15_t m_rxLevel; - CFMRB m_outputRFRB; - CFMRB m_inputExtRB; + CRingBuffer m_outputRFRB; + CRingBuffer m_inputExtRB; void stateMachine(bool validRFSignal, bool validExtSignal); void listeningState(bool validRFSignal, bool validExtSignal); diff --git a/FMDownsampleRB.cpp b/FMDownsampleRB.cpp deleted file mode 100644 index 7d2cc2a..0000000 --- a/FMDownsampleRB.cpp +++ /dev/null @@ -1,101 +0,0 @@ -/* - * Copyright (C) 2020 by Jonathan Naylor G4KLX - * - * 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 - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - - -#include "FMDownsampleRB.h" - -CFMDownsampleRB::CFMDownsampleRB(uint16_t length) : -m_length(length), -m_head(0U), -m_tail(0U), -m_full(false), -m_overflow(false) -{ - m_samples = new uint8_t[length]; -} - -uint16_t CFMDownsampleRB::getSpace() const -{ - uint16_t n = 0U; - - if (m_tail == m_head) - n = m_full ? 0U : m_length; - else if (m_tail < m_head) - n = m_length - m_head + m_tail; - else - n = m_tail - m_head; - - if (n > m_length) - n = 0U; - - return n; -} - -uint16_t CFMDownsampleRB::getData() const -{ - if (m_tail == m_head) - return m_full ? m_length : 0U; - else if (m_tail < m_head) - return m_head - m_tail; - else - return m_length - m_tail + m_head; -} - -bool CFMDownsampleRB::put(uint8_t sample) -{ - if (m_full) { - m_overflow = true; - return false; - } - - m_samples[m_head] = sample; - - m_head++; - if (m_head >= m_length) - m_head = 0U; - - if (m_head == m_tail) - m_full = true; - - return true; -} - -bool CFMDownsampleRB::get(uint8_t& sample) -{ - if (m_head == m_tail && !m_full) - return false; - - sample = m_samples[m_tail]; - - m_full = false; - - m_tail++; - if (m_tail >= m_length) - m_tail = 0U; - - return true; -} - -bool CFMDownsampleRB::hasOverflowed() -{ - bool overflow = m_overflow; - - m_overflow = false; - - return overflow; -} diff --git a/FMDownsampleRB.h b/FMDownsampleRB.h deleted file mode 100644 index df60daf..0000000 --- a/FMDownsampleRB.h +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright (C) 2020 by Jonathan Naylor G4KLX - * - * 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 - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#if !defined(FMDOWNSAMPLERB_H) -#define FMDOWNSAMPLERB_H - -#if defined(STM32F4XX) -#include "stm32f4xx.h" -#elif defined(STM32F7XX) -#include "stm32f7xx.h" -#elif defined(STM32F105xC) -#include "stm32f1xx.h" -#include -#else -#include -#endif - -#if defined(__SAM3X8E__) || defined(STM32F105xC) -#define ARM_MATH_CM3 -#elif defined(STM32F7XX) -#define ARM_MATH_CM7 -#elif defined(STM32F4XX) || defined(__MK20DX256__) || defined(__MK64FX512__) || defined(__MK66FX1M0__) -#define ARM_MATH_CM4 -#else -#error "Unknown processor type" -#endif - -#include - -class CFMDownsampleRB { -public: - CFMDownsampleRB(uint16_t length); - - uint16_t getSpace() const; - - uint16_t getData() const; - - bool put(uint8_t sample); - - bool get(uint8_t& sample); - - bool hasOverflowed(); - -private: - uint16_t m_length; - volatile uint8_t* m_samples; - volatile uint16_t m_head; - volatile uint16_t m_tail; - volatile bool m_full; - bool m_overflow; -}; - -#endif diff --git a/FMDownsampler.cpp b/FMDownsampler.cpp index 381d2f4..c2c3635 100644 --- a/FMDownsampler.cpp +++ b/FMDownsampler.cpp @@ -22,7 +22,7 @@ CFMDownsampler::CFMDownsampler(uint16_t length) : -m_ringBuffer(length),//length might need tweaking +m_ringBuffer(length), m_samplePack(0U), m_samplePackPointer(NULL), m_packIndex(0U), @@ -62,4 +62,15 @@ void CFMDownsampler::addSample(q15_t sample) m_downSampleIndex++; if(m_downSampleIndex >= 3U) m_downSampleIndex = 0U; +} + +bool CFMDownsampler::getPackedData(uint8_t& data) +{ + return m_ringBuffer.get(data); +} + +void CFMDownsampler::reset() +{ + m_downSampleIndex = 0; + m_packIndex = 0; } \ No newline at end of file diff --git a/FMDownsampler.h b/FMDownsampler.h index 6c5fd03..9b576c4 100644 --- a/FMDownsampler.h +++ b/FMDownsampler.h @@ -21,17 +21,17 @@ #define FMDOWNSAMPLER_H #include "Config.h" -#include "FMDownsampleRB.h" +#include "RingBuffer.h" class CFMDownsampler { public: CFMDownsampler(uint16_t length); void addSample(q15_t sample); - inline bool getPackedData(uint8_t& data){ return m_ringBuffer.get(data); }; - inline bool hasOverflowed() { return m_ringBuffer.hasOverflowed(); }; + bool getPackedData(uint8_t& data); + void reset(); private: - CFMDownsampleRB m_ringBuffer; + CRingBuffer m_ringBuffer; uint32_t m_samplePack; uint32_t *m_samplePackPointer; diff --git a/FMRB.cpp b/FMRB.cpp deleted file mode 100644 index 0d8c6ef..0000000 --- a/FMRB.cpp +++ /dev/null @@ -1,110 +0,0 @@ -/* -TX fifo control - Copyright (C) KI6ZUM 2015 -Copyright (C) 2015,2016,2020 by Jonathan Naylor G4KLX - -This library is free software; you can redistribute it and/or -modify it under the terms of the GNU Library General Public -License as published by the Free Software Foundation; either -version 2 of the License, or (at your option) any later version. - -This library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -Library General Public License for more details. - -You should have received a copy of the GNU Library General Public -License along with this library; if not, write to the -Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, -Boston, MA 02110-1301, USA. -*/ - -#include "FMRB.h" - -CFMRB::CFMRB(uint16_t length) : -m_length(length), -m_head(0U), -m_tail(0U), -m_full(false), -m_overflow(false) -{ - m_samples = new q15_t[length]; -} - -uint16_t CFMRB::getSpace() const -{ - uint16_t n = 0U; - - if (m_tail == m_head) - n = m_full ? 0U : m_length; - else if (m_tail < m_head) - n = m_length - m_head + m_tail; - else - n = m_tail - m_head; - - if (n > m_length) - n = 0U; - - return n; -} - -uint16_t CFMRB::getData() const -{ - if (m_tail == m_head) - return m_full ? m_length : 0U; - else if (m_tail < m_head) - return m_head - m_tail; - else - return m_length - m_tail + m_head; -} - -bool CFMRB::put(q15_t sample) -{ - if (m_full) { - m_overflow = true; - return false; - } - - m_samples[m_head] = sample; - - m_head++; - if (m_head >= m_length) - m_head = 0U; - - if (m_head == m_tail) - m_full = true; - - return true; -} - -bool CFMRB::get(q15_t& sample) -{ - if (m_head == m_tail && !m_full) - return false; - - sample = m_samples[m_tail]; - - m_full = false; - - m_tail++; - if (m_tail >= m_length) - m_tail = 0U; - - return true; -} - -bool CFMRB::hasOverflowed() -{ - bool overflow = m_overflow; - - m_overflow = false; - - return overflow; -} - -void CFMRB::reset() -{ - m_head = 0U; - m_tail = 0U; - m_full = false; - m_overflow = false; -} diff --git a/FMRB.h b/FMRB.h deleted file mode 100644 index 7cf6cf4..0000000 --- a/FMRB.h +++ /dev/null @@ -1,72 +0,0 @@ -/* -Serial fifo control - Copyright (C) KI6ZUM 2015 -Copyright (C) 2015,2016,2020 by Jonathan Naylor G4KLX - -This library is free software; you can redistribute it and/or -modify it under the terms of the GNU Library General Public -License as published by the Free Software Foundation; either -version 2 of the License, or (at your option) any later version. - -This library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -Library General Public License for more details. - -You should have received a copy of the GNU Library General Public -License along with this library; if not, write to the -Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, -Boston, MA 02110-1301, USA. -*/ - -#if !defined(FMRB_H) -#define FMRB_H - -#if defined(STM32F4XX) -#include "stm32f4xx.h" -#elif defined(STM32F7XX) -#include "stm32f7xx.h" -#elif defined(STM32F105xC) -#include "stm32f1xx.h" -#include -#else -#include -#endif - -#if defined(__SAM3X8E__) || defined(STM32F105xC) -#define ARM_MATH_CM3 -#elif defined(STM32F7XX) -#define ARM_MATH_CM7 -#elif defined(STM32F4XX) || defined(__MK20DX256__) || defined(__MK64FX512__) || defined(__MK66FX1M0__) -#define ARM_MATH_CM4 -#else -#error "Unknown processor type" -#endif - -#include - -class CFMRB { -public: - CFMRB(uint16_t length); - - uint16_t getSpace() const; - - uint16_t getData() const; - - bool put(q15_t sample); - - bool get(q15_t& sample); - - bool hasOverflowed(); - - void reset(); - -private: - uint16_t m_length; - volatile q15_t* m_samples; - volatile uint16_t m_head; - volatile uint16_t m_tail; - volatile bool m_full; - bool m_overflow; -}; - -#endif