From 61a69d85366636f4bf01488c9fe29f56d05f8066 Mon Sep 17 00:00:00 2001 From: Geoffrey Merck Date: Sat, 9 May 2020 11:01:28 +0200 Subject: [PATCH] Add missing file --- RingBuffer.cpp | 119 +++++++++++++++++++++++++++++++++++++++++++++++++ RingBuffer.h | 77 ++++++++++++++++++++++++++++++++ 2 files changed, 196 insertions(+) create mode 100644 RingBuffer.cpp create mode 100644 RingBuffer.h diff --git a/RingBuffer.cpp b/RingBuffer.cpp new file mode 100644 index 0000000..f350023 --- /dev/null +++ b/RingBuffer.cpp @@ -0,0 +1,119 @@ +/* + * Copyright (C) 2020 by Jonathan Naylor G4KLX + * Copyright (C) 2020 by Geoffrey Merck F4FXL - KC3FRA + * + * 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 "RingBuffer.h" + +template CRingBuffer::CRingBuffer(uint16_t length) : +m_length(length), +m_head(0U), +m_tail(0U), +m_full(false), +m_overflow(false) +{ + m_buffer = new TDATATYPE[length]; +} + +template uint16_t CRingBuffer::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; +} + +template uint16_t CRingBuffer::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; +} + +template bool CRingBuffer::put(TDATATYPE sample) +{ + if (m_full) { + m_overflow = true; + return false; + } + + m_buffer[m_head] = sample; + + m_head++; + if (m_head >= m_length) + m_head = 0U; + + if (m_head == m_tail) + m_full = true; + + return true; +} + +template TDATATYPE CRingBuffer::peek() const +{ + return m_buffer[m_tail]; +} + +template bool CRingBuffer::get(TDATATYPE& sample) +{ + if (m_head == m_tail && !m_full) + return false; + + sample = m_buffer[m_tail]; + + m_full = false; + + m_tail++; + if (m_tail >= m_length) + m_tail = 0U; + + return true; +} + +template bool CRingBuffer::hasOverflowed() +{ + bool overflow = m_overflow; + + m_overflow = false; + + return overflow; +} + +template void CRingBuffer::reset() +{ + m_head = 0U; + m_tail = 0U; + m_full = false; + m_overflow = false; +} + +//Add here any declarations you need +template class CRingBuffer; +template class CRingBuffer; +template class CRingBuffer; \ No newline at end of file diff --git a/RingBuffer.h b/RingBuffer.h new file mode 100644 index 0000000..cfb8d53 --- /dev/null +++ b/RingBuffer.h @@ -0,0 +1,77 @@ +/* + * Copyright (C) 2020 by Jonathan Naylor G4KLX + * Copyright (C) 2020 by Geoffrey Merck F4FXL - KC3FRA + * + * 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(RINGBUFFER_H) +#define RINGBUFFER_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 + +template +class CRingBuffer { +public: + CRingBuffer(uint16_t length); + + uint16_t getSpace() const; + + uint16_t getData() const; + + bool put(TDATATYPE sample); + + bool get(TDATATYPE& sample); + + TDATATYPE peek() const; + + bool hasOverflowed(); + + void reset(); + +private: + uint16_t m_length; + volatile TDATATYPE* m_buffer; + volatile uint16_t m_head; + volatile uint16_t m_tail; + volatile bool m_full; + bool m_overflow; +}; + + + +#endif \ No newline at end of file