mirror of https://github.com/lumapu/ahoy.git
				
				
			
				 14 changed files with 238 additions and 553 deletions
			
			
		| @ -1,161 +0,0 @@ | |||
| /*
 | |||
|     CircularBuffer - An Arduino circular buffering library for arbitrary types. | |||
| 
 | |||
|     Created by Ivo Pullens, Emmission, 2014 -- www.emmission.nl | |||
| 
 | |||
|     This library is free software; you can redistribute it and/or | |||
|     modify it under the terms of the GNU Lesser General Public | |||
|     License as published by the Free Software Foundation; either | |||
|     version 2.1 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 | |||
|     Lesser General Public License for more details. | |||
| 
 | |||
|     You should have received a copy of the GNU Lesser 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 | |||
| */ | |||
| 
 | |||
| #ifndef CircularBuffer_h | |||
| #define CircularBuffer_h | |||
| 
 | |||
| #if defined(ESP8266) || defined(ESP32) | |||
| #define DISABLE_IRQ noInterrupts() | |||
| #define RESTORE_IRQ interrupts() | |||
| #else | |||
| #define DISABLE_IRQ       \ | |||
|     uint8_t sreg = SREG;    \ | |||
|     cli(); | |||
| 
 | |||
| #define RESTORE_IRQ        \ | |||
|     SREG = sreg; | |||
| #endif | |||
| 
 | |||
| template <class BUFFERTYPE, uint8_t BUFFERSIZE> | |||
| class CircularBuffer { | |||
| 
 | |||
|     typedef BUFFERTYPE BufferType; | |||
|     BufferType Buffer[BUFFERSIZE]; | |||
| 
 | |||
|     public: | |||
|         CircularBuffer() : m_buff(Buffer) { | |||
|             m_size = BUFFERSIZE; | |||
|             clear(); | |||
|         } | |||
| 
 | |||
|         /** Clear all entries in the circular buffer. */ | |||
|         void clear(void) | |||
|         { | |||
|             m_front = 0; | |||
|             m_fill  = 0; | |||
|         } | |||
| 
 | |||
|         /** Test if the circular buffer is empty */ | |||
|         inline bool empty(void) const | |||
|         { | |||
|             return !m_fill; | |||
|         } | |||
| 
 | |||
|         /** Return the number of records stored in the buffer */ | |||
|         inline uint8_t available(void) const | |||
|         { | |||
|             return m_fill; | |||
|         } | |||
| 
 | |||
|         /** Test if the circular buffer is full */ | |||
|         inline bool full(void) const | |||
|         { | |||
|             return m_fill == m_size; | |||
|         } | |||
| 
 | |||
|         inline uint8_t getFill(void) const { | |||
|             return m_fill; | |||
|         } | |||
| 
 | |||
|         /** Aquire record on front of the buffer, for writing.
 | |||
|          * After filling the record, it has to be pushed to actually | |||
|          * add it to the buffer. | |||
|          * @return Pointer to record, or NULL when buffer is full. | |||
|          */ | |||
|         BUFFERTYPE* getFront(void) const | |||
|         { | |||
|             DISABLE_IRQ; | |||
|             BUFFERTYPE* f = NULL; | |||
|             if (!full()) | |||
|                 f = get(m_front); | |||
|             RESTORE_IRQ; | |||
|             return f; | |||
|         } | |||
| 
 | |||
|         /** Push record to front of the buffer
 | |||
|          * @param record   Record to push. If record was aquired previously (using getFront) its | |||
|          *                 data will not be copied as it is already present in the buffer. | |||
|          * @return True, when record was pushed successfully. | |||
|          */ | |||
|         bool pushFront(BUFFERTYPE* record) | |||
|         { | |||
|             bool ok = false; | |||
|             DISABLE_IRQ; | |||
|             if (!full()) | |||
|             { | |||
|                 BUFFERTYPE* f = get(m_front); | |||
|                 if (f != record) | |||
|                     *f = *record; | |||
|                 m_front = (m_front+1) % m_size; | |||
|                 m_fill++; | |||
|                 ok = true; | |||
|             } | |||
|             RESTORE_IRQ; | |||
|             return ok; | |||
|         } | |||
| 
 | |||
|         /** Aquire record on back of the buffer, for reading.
 | |||
|          * After reading the record, it has to be pop'ed to actually | |||
|          * remove it from the buffer. | |||
|          * @return Pointer to record, or NULL when buffer is empty. | |||
|          */ | |||
|         BUFFERTYPE* getBack(void) const | |||
|         { | |||
|             BUFFERTYPE* b = NULL; | |||
|             DISABLE_IRQ; | |||
|             if (!empty()) | |||
|                 b = get(back()); | |||
|             RESTORE_IRQ; | |||
|             return b; | |||
|         } | |||
| 
 | |||
|         /** Remove record from back of the buffer.
 | |||
|          * @return True, when record was pop'ed successfully. | |||
|          */ | |||
|         bool popBack(void) | |||
|         { | |||
|             bool ok = false; | |||
|             DISABLE_IRQ; | |||
|             if (!empty()) | |||
|             { | |||
|                 m_fill--; | |||
|                 ok = true; | |||
|             } | |||
|             RESTORE_IRQ; | |||
|             return ok; | |||
|         } | |||
| 
 | |||
|     protected: | |||
|         inline BUFFERTYPE * get(const uint8_t idx) const | |||
|         { | |||
|             return &(m_buff[idx]); | |||
|         } | |||
|         inline uint8_t back(void) const | |||
|         { | |||
|             return (m_front - m_fill + m_size) % m_size; | |||
|         } | |||
| 
 | |||
|         uint8_t          m_size;     // Total number of records that can be stored in the buffer.
 | |||
|         BUFFERTYPE* const m_buff; | |||
|         volatile uint8_t m_front;    // Index of front element (not pushed yet).
 | |||
|         volatile uint8_t m_fill;     // Amount of records currently pushed.
 | |||
| }; | |||
| 
 | |||
| #endif // CircularBuffer_h
 | |||
| @ -1,27 +0,0 @@ | |||
| //-----------------------------------------------------------------------------
 | |||
| // 2022 Ahoy, https://ahoydtu.de
 | |||
| // Creative Commons - http://creativecommons.org/licenses/by-nc-sa/3.0/de/
 | |||
| //-----------------------------------------------------------------------------
 | |||
| 
 | |||
| #ifndef __AHOY_TIMER_H__ | |||
| #define __AHOY_TIMER_H__ | |||
| 
 | |||
| #include <Arduino.h> | |||
| 
 | |||
| namespace ah { | |||
|     inline bool checkTicker(uint32_t *ticker, uint32_t interval) { | |||
|         uint32_t mil = millis(); | |||
|         if(mil >= *ticker) { | |||
|             *ticker = mil + interval; | |||
|             return true; | |||
|         } | |||
|         else if((mil + interval) < (*ticker)) { | |||
|             *ticker = mil + interval; | |||
|             return true; | |||
|         } | |||
| 
 | |||
|         return false; | |||
|     } | |||
| } | |||
| 
 | |||
| #endif /*__AHOY_TIMER_H__*/ | |||
					Loading…
					
					
				
		Reference in new issue