blynk & neopixelring & w7500
Fork of WIZwiki-7500_Blynk by
Embed:
(wiki syntax)
Show/hide line numbers
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
Generated on Thu Jul 14 2022 00:21:50 by 1.7.2