/* * 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; }