blynk & neopixelring & w7500

Fork of WIZwiki-7500_Blynk by IOP

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers BlynkFifo.h Source File

BlynkFifo.h

Go to the documentation of this file.
00001 /**
00002  * @file       BlynkFifo.h
00003  * @author     Volodymyr Shymanskyy
00004  * @license    This project is released under the MIT License (MIT)
00005  * @copyright  Copyright (c) 2015 Volodymyr Shymanskyy
00006  * @date       Feb 2015
00007  * @brief      FIFO implementation
00008  *
00009  */
00010 
00011 #ifndef BlynkFifo_h
00012 #define BlynkFifo_h
00013 
00014 #include <utility/BlynkUtility.h>
00015 
00016 template<typename T, unsigned SIZE>
00017 class BlynkFifo {
00018 
00019     BlynkFifo(const BlynkFifo<T, SIZE> & rb);
00020 
00021 public:
00022 
00023     BlynkFifo() : fst(0), lst(0), flag(0) {}
00024     ~BlynkFifo() {}
00025 
00026     void clear() {
00027         fst = 0;
00028         lst = 0;
00029         flag = 0;
00030     }
00031 
00032     size_t write(const T* data, size_t n)
00033     {
00034         if ((n = BlynkMin(n, getFree()))) {
00035             const size_t ch1 = BlynkMin(n, SIZE - lst);
00036             memcpy(buffer + lst, data, ch1 * sizeof(T));
00037             lst = (lst + ch1) % SIZE;
00038 
00039             if (ch1 < n) {
00040                 const size_t ch2 = n - ch1;
00041                 memcpy(buffer + lst, data + ch1, ch2 * sizeof(T));
00042                 lst = (lst + ch2) % SIZE;
00043             }
00044 
00045             if (fst == lst) {
00046                 flag = 1;
00047             }
00048         }
00049         return n;
00050     }
00051 
00052     size_t read(T* dest, size_t n)
00053     {
00054         if ((n = BlynkMin(n, getOccupied()))) {
00055             flag = 0;
00056 
00057             const size_t ch1 = BlynkMin(n, SIZE - fst);
00058             memcpy(dest, buffer + fst, ch1 * sizeof(T));
00059             fst = (fst + ch1) % SIZE;
00060 
00061             if (ch1 < n) {
00062                 const size_t ch2 = n - ch1;
00063                 memcpy(dest + ch1, buffer + fst, ch2 * sizeof(T));
00064                 fst = (fst + ch2) % SIZE;
00065             }
00066         }
00067         return n;
00068     }
00069 
00070     bool push(const T& data) {
00071         return write(&data, 1) == 1;
00072     }
00073 
00074     size_t getOccupied() const {
00075         if (lst == fst) {
00076             return flag ? SIZE : 0;
00077         } else if (lst > fst) {
00078             return lst - fst;
00079         } else {
00080             return SIZE + lst - fst;
00081         }
00082     }
00083 
00084     size_t getFree() const {
00085         return SIZE - getOccupied();
00086     }
00087 
00088 private:
00089     T buffer[SIZE];
00090     size_t fst;
00091     size_t lst;
00092     uint8_t flag;
00093 };
00094 
00095 #endif