#include "RdsPiBuffer.hpp" RdsPiBuffer::RdsPiBuffer() { this->clear(); } RdsPiBuffer::State RdsPiBuffer::add(uint16_t value, bool error) { this->pos = (this->pos + 1) % BUFF_SIZE; this->buff[this->pos] = value; const uint8_t errorPos = this->pos / 8; const uint8_t errorBitPos = this->pos % 8; if (error) this->errorBuff[errorPos] |= (1 << errorBitPos); else this->errorBuff[errorPos] &= ~(1 << errorBitPos); if (this->fill < BUFF_SIZE) this->fill++; return this->getState(value); } void RdsPiBuffer::clear() { this->fill = 0; this->pos = (uint8_t)-1; } RdsPiBuffer::State RdsPiBuffer::getState(uint16_t value) { uint8_t count = 0; uint8_t correctCount = 0; for (uint8_t i = 0; i < this->fill; i++) { if (this->buff[i] == value) { count++; if ((this->errorBuff[i / 8] & (1 << (i % 8))) == 0) correctCount++; } } if (correctCount >= 2) return STATE_CORRECT; else if (count >= 2 && correctCount) return STATE_VERY_LIKELY; else if (count >= 3) return STATE_LIKELY; else if (count == 2 || correctCount) return STATE_UNLIKELY; return STATE_INVALID; }