Arduino_STM32/STM32F3/libraries/ringbuffer/ringbuffer.h

156 lines
5.0 KiB
C++

/******************************************************************************
* The MIT License
*
* Copyright (c) 2015 Frank-Michael Krause
*
* Permission is hereby granted, free of charge, to any person
* obtaining a copy of this software and associated documentation
* files (the "Software"), to deal in the Software without
* restriction, including without limitation the rights to use, copy,
* modify, merge, publish, distribute, sublicense, and/or sell copies
* of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*****************************************************************************/
#ifndef RINGBUFFER_H_
#define RINGBUFFER_H_
class RingBuffer {
public:
int size; // muss ZweierPotenz sein
int *values; // Pointer auf Speicher für Werte
unsigned long *timeStamps; // optional Pointer auf Speicher für ms timestamps
int rdIdx; // Leseindex - Benutzung optional
int wrIdx; // Schreibindex
int mask;
int anz; // Aktuelle Anzahl an Werten im Puffer
int lastRead; // wird auf eins gesetz, wenn letzter vorhandener Wert gelesen wurde
RingBuffer(int _size, int *_values, unsigned long *_timeStamps);
/*
* fügt einen Wert zum Ringpuffer hinzu und erzeugt einen zugehörigen Timestamp
* wenn timeStamps != NULL ist
*/
void addValue(int val);
/*
* setzt rdIdx auf distance Werte vor den letzten Wert (wrPtr-1)
* Mit getValue können die letzten Werte bis zum letzten wert abgefragt werden
*
* gibt 1 zurück, wenn genügend Werte im Puffer sind
* gibt 0 zurück, wenn noch nicht genügend Werte im Puffer sind oder distance
* größer als die Pufferlänge ist
*/
int setReadIdx(int distance);
/*
* Setzt rdIdx auf den ersten Wert, für den der zugehörige timeStamp mindestens <ms> zurückliegt,
* Es wird das Alter des betreffenden Wertes in ms zurückgegeben
* = wird zurückgegeben, wenn kein Wert mindestens so alt wie gefordert ist oder keine timestamps vorhanden sind
*/
int setReadIdxDt(int ms);
/*
* gibt Wert für rdIdx zurück und incrementiert rdIdx, solange rdIdx < wrIdx
* ACHTUNG: wird wrPtr erreicht, so wird immer wieder der letzte Wert zurückgegeben!
*/
int getValue();
/*
* gibt Wert für rdIdx zurück, trägt den zugehörigen timestamp
* in time ein und incrementiert rdIdx, solange rdIdx < wrIdx
* ACHTUNG: wird wrPtr erreicht, so wird immer wieder der letzte Wert zurückgegeben!
*/
int getValue(unsigned long *time);
/*
* gibt 1 zurück, wenn rdPtr != wrPtr
* gibt 0 zurück, wenn rdPtr == wrPtr
*
* --> funktioniert nur, wenn zuvor SetReadIdx() aufgerufen wurde
*/
int valueAvailable();
/*
* Setzt den Ringbuffer zurück
*/
void reset();
/*
`* decrementiert rdPtr und gibt den zugehörigen Wert zurück
*/
int getPreviousValue();
int getPreviousValue(unsigned long *time);
/*
`* decrementiert rdPtr und gibt den zugehörigen Wert zurück
* schreibt Zeiitdifferenz zur aktuellen Zeit in dt
*/
int getPreviousValueDt(unsigned long *dt);
/*
* gibt eins zurück, sobald der älteste Wert mit einer PreviousValue-Funktion
* gelesen wurde
* wird durch jeden Aufruf einer SetReadIdx-Funktion zurückgesetzt
*/
int lastValueRead();
/*
* Diese Funktion erlaubt den Zugriff auf den Ringbuffer wie auf ein Array.
* Der älteste Wert hat immer den Index 0, der aktuellste Wert den Index size-1
* Der rdIdx des Puffers wird nicht verändert.
*/
int getValueAt(int idx);
int getValueAt(int idx, unsigned long *time);
/*
* Diese Funktion erlaubt den Zugriff auf den Ringbuffer wie auf ein Array.
* Der neueste Wert hat immer den Index 0, der älteste Wert den Index size-1
* Der rdIdx des Puffers wird nicht verändert.
*/
int getPreviousValueAt(int idx);
int getPreviousValueAt(int idx, unsigned long *time);
};
class RingBufferAverage : public RingBuffer
{
public:
int averageSize;
int averageSum;
RingBufferAverage(int _size, int *_values, unsigned long *_timeStamps, int _averageSize);
void setAverageLen(int len);
void addValue(int val);
void reset();
int getAverage();
int getAverageSum();
};
#endif /* RINGBUFFER_H_ */