Blynk library for embedded hardware. Works with Arduino, ESP8266, Raspberry Pi, Intel Edison/Galileo, LinkIt ONE, Particle Core/Photon, Energia, ARM mbed, etc. http://www.blynk.cc/

Dependents:   Blynk_RBL_BLE_Nano Blynk_MicroBit Blynk_Serial Blynk_RBL_BLE_Nano

Committer:
Volodymyr Shymanskyy
Date:
Fri Dec 15 00:17:41 2017 +0200
Revision:
19:bae78e167b11
Parent:
0:58b20b438383
Update version

Who changed what in which revision?

UserRevisionLine numberNew contents of line
vshymanskyy 0:58b20b438383 1 /**
vshymanskyy 0:58b20b438383 2 * @file BlynkFifo.h
vshymanskyy 0:58b20b438383 3 * @author Volodymyr Shymanskyy
vshymanskyy 0:58b20b438383 4 * @license This project is released under the MIT License (MIT)
vshymanskyy 0:58b20b438383 5 * @copyright Copyright (c) 2015 Volodymyr Shymanskyy
vshymanskyy 0:58b20b438383 6 * @date Feb 2015
vshymanskyy 0:58b20b438383 7 * @brief FIFO implementation
vshymanskyy 0:58b20b438383 8 *
vshymanskyy 0:58b20b438383 9 */
vshymanskyy 0:58b20b438383 10
vshymanskyy 0:58b20b438383 11 #ifndef BlynkFifo_h
vshymanskyy 0:58b20b438383 12 #define BlynkFifo_h
vshymanskyy 0:58b20b438383 13
vshymanskyy 0:58b20b438383 14 #include <utility/BlynkUtility.h>
vshymanskyy 0:58b20b438383 15
Volodymyr Shymanskyy 19:bae78e167b11 16 template <class T, unsigned N>
Volodymyr Shymanskyy 19:bae78e167b11 17 class BlynkFifo
Volodymyr Shymanskyy 19:bae78e167b11 18 {
Volodymyr Shymanskyy 19:bae78e167b11 19 public:
Volodymyr Shymanskyy 19:bae78e167b11 20 BlynkFifo()
Volodymyr Shymanskyy 19:bae78e167b11 21 {
Volodymyr Shymanskyy 19:bae78e167b11 22 clear();
Volodymyr Shymanskyy 19:bae78e167b11 23 }
vshymanskyy 0:58b20b438383 24
Volodymyr Shymanskyy 19:bae78e167b11 25 void clear()
Volodymyr Shymanskyy 19:bae78e167b11 26 {
Volodymyr Shymanskyy 19:bae78e167b11 27 _r = 0;
Volodymyr Shymanskyy 19:bae78e167b11 28 _w = 0;
Volodymyr Shymanskyy 19:bae78e167b11 29 }
vshymanskyy 0:58b20b438383 30
Volodymyr Shymanskyy 19:bae78e167b11 31 ~BlynkFifo(void)
Volodymyr Shymanskyy 19:bae78e167b11 32 {}
Volodymyr Shymanskyy 19:bae78e167b11 33
Volodymyr Shymanskyy 19:bae78e167b11 34 // writing thread/context API
Volodymyr Shymanskyy 19:bae78e167b11 35 //-------------------------------------------------------------
vshymanskyy 0:58b20b438383 36
Volodymyr Shymanskyy 19:bae78e167b11 37 bool writeable(void)
Volodymyr Shymanskyy 19:bae78e167b11 38 {
Volodymyr Shymanskyy 19:bae78e167b11 39 return free() > 0;
Volodymyr Shymanskyy 19:bae78e167b11 40 }
vshymanskyy 0:58b20b438383 41
Volodymyr Shymanskyy 19:bae78e167b11 42 int free(void)
Volodymyr Shymanskyy 19:bae78e167b11 43 {
Volodymyr Shymanskyy 19:bae78e167b11 44 int s = _r - _w;
Volodymyr Shymanskyy 19:bae78e167b11 45 if (s <= 0)
Volodymyr Shymanskyy 19:bae78e167b11 46 s += N;
Volodymyr Shymanskyy 19:bae78e167b11 47 return s - 1;
Volodymyr Shymanskyy 19:bae78e167b11 48 }
Volodymyr Shymanskyy 19:bae78e167b11 49
Volodymyr Shymanskyy 19:bae78e167b11 50 T put(const T& c)
Volodymyr Shymanskyy 19:bae78e167b11 51 {
Volodymyr Shymanskyy 19:bae78e167b11 52 int i = _w;
Volodymyr Shymanskyy 19:bae78e167b11 53 int j = i;
Volodymyr Shymanskyy 19:bae78e167b11 54 i = _inc(i);
Volodymyr Shymanskyy 19:bae78e167b11 55 while (i == _r) // = !writeable()
Volodymyr Shymanskyy 19:bae78e167b11 56 /* nothing / just wait */;
Volodymyr Shymanskyy 19:bae78e167b11 57 _b[j] = c;
Volodymyr Shymanskyy 19:bae78e167b11 58 _w = i;
Volodymyr Shymanskyy 19:bae78e167b11 59 return c;
vshymanskyy 0:58b20b438383 60 }
vshymanskyy 0:58b20b438383 61
Volodymyr Shymanskyy 19:bae78e167b11 62 int put(const T* p, int n, bool blocking = false)
vshymanskyy 0:58b20b438383 63 {
Volodymyr Shymanskyy 19:bae78e167b11 64 int c = n;
Volodymyr Shymanskyy 19:bae78e167b11 65 while (c)
Volodymyr Shymanskyy 19:bae78e167b11 66 {
Volodymyr Shymanskyy 19:bae78e167b11 67 int f;
Volodymyr Shymanskyy 19:bae78e167b11 68 while ((f = free()) == 0) // wait for space
Volodymyr Shymanskyy 19:bae78e167b11 69 {
Volodymyr Shymanskyy 19:bae78e167b11 70 if (!blocking) return n - c; // no more space and not blocking
Volodymyr Shymanskyy 19:bae78e167b11 71 /* nothing / just wait */;
Volodymyr Shymanskyy 19:bae78e167b11 72 }
Volodymyr Shymanskyy 19:bae78e167b11 73 // check free space
Volodymyr Shymanskyy 19:bae78e167b11 74 if (c < f) f = c;
Volodymyr Shymanskyy 19:bae78e167b11 75 int w = _w;
Volodymyr Shymanskyy 19:bae78e167b11 76 int m = N - w;
Volodymyr Shymanskyy 19:bae78e167b11 77 // check wrap
Volodymyr Shymanskyy 19:bae78e167b11 78 if (f > m) f = m;
Volodymyr Shymanskyy 19:bae78e167b11 79 memcpy(&_b[w], p, f);
Volodymyr Shymanskyy 19:bae78e167b11 80 _w = _inc(w, f);
Volodymyr Shymanskyy 19:bae78e167b11 81 c -= f;
Volodymyr Shymanskyy 19:bae78e167b11 82 p += f;
Volodymyr Shymanskyy 19:bae78e167b11 83 }
Volodymyr Shymanskyy 19:bae78e167b11 84 return n - c;
Volodymyr Shymanskyy 19:bae78e167b11 85 }
vshymanskyy 0:58b20b438383 86
Volodymyr Shymanskyy 19:bae78e167b11 87 // reading thread/context API
Volodymyr Shymanskyy 19:bae78e167b11 88 // --------------------------------------------------------
vshymanskyy 0:58b20b438383 89
Volodymyr Shymanskyy 19:bae78e167b11 90 bool readable(void)
Volodymyr Shymanskyy 19:bae78e167b11 91 {
Volodymyr Shymanskyy 19:bae78e167b11 92 return (_r != _w);
Volodymyr Shymanskyy 19:bae78e167b11 93 }
Volodymyr Shymanskyy 19:bae78e167b11 94
Volodymyr Shymanskyy 19:bae78e167b11 95 size_t size(void)
Volodymyr Shymanskyy 19:bae78e167b11 96 {
Volodymyr Shymanskyy 19:bae78e167b11 97 int s = _w - _r;
Volodymyr Shymanskyy 19:bae78e167b11 98 if (s < 0)
Volodymyr Shymanskyy 19:bae78e167b11 99 s += N;
Volodymyr Shymanskyy 19:bae78e167b11 100 return s;
vshymanskyy 0:58b20b438383 101 }
vshymanskyy 0:58b20b438383 102
Volodymyr Shymanskyy 19:bae78e167b11 103 T get(void)
vshymanskyy 0:58b20b438383 104 {
Volodymyr Shymanskyy 19:bae78e167b11 105 int r = _r;
Volodymyr Shymanskyy 19:bae78e167b11 106 while (r == _w) // = !readable()
Volodymyr Shymanskyy 19:bae78e167b11 107 /* nothing / just wait */;
Volodymyr Shymanskyy 19:bae78e167b11 108 T t = _b[r];
Volodymyr Shymanskyy 19:bae78e167b11 109 _r = _inc(r);
Volodymyr Shymanskyy 19:bae78e167b11 110 return t;
Volodymyr Shymanskyy 19:bae78e167b11 111 }
vshymanskyy 0:58b20b438383 112
Volodymyr Shymanskyy 19:bae78e167b11 113 T peek(void)
Volodymyr Shymanskyy 19:bae78e167b11 114 {
Volodymyr Shymanskyy 19:bae78e167b11 115 int r = _r;
Volodymyr Shymanskyy 19:bae78e167b11 116 while (r == _w);
Volodymyr Shymanskyy 19:bae78e167b11 117 return _b[r];
vshymanskyy 0:58b20b438383 118 }
vshymanskyy 0:58b20b438383 119
Volodymyr Shymanskyy 19:bae78e167b11 120 int get(T* p, int n, bool blocking = false)
Volodymyr Shymanskyy 19:bae78e167b11 121 {
Volodymyr Shymanskyy 19:bae78e167b11 122 int c = n;
Volodymyr Shymanskyy 19:bae78e167b11 123 while (c)
Volodymyr Shymanskyy 19:bae78e167b11 124 {
Volodymyr Shymanskyy 19:bae78e167b11 125 int f;
Volodymyr Shymanskyy 19:bae78e167b11 126 for (;;) // wait for data
Volodymyr Shymanskyy 19:bae78e167b11 127 {
Volodymyr Shymanskyy 19:bae78e167b11 128 f = size();
Volodymyr Shymanskyy 19:bae78e167b11 129 if (f) break; // free space
Volodymyr Shymanskyy 19:bae78e167b11 130 if (!blocking) return n - c; // no space and not blocking
Volodymyr Shymanskyy 19:bae78e167b11 131 /* nothing / just wait */;
Volodymyr Shymanskyy 19:bae78e167b11 132 }
Volodymyr Shymanskyy 19:bae78e167b11 133 // check available data
Volodymyr Shymanskyy 19:bae78e167b11 134 if (c < f) f = c;
Volodymyr Shymanskyy 19:bae78e167b11 135 int r = _r;
Volodymyr Shymanskyy 19:bae78e167b11 136 int m = N - r;
Volodymyr Shymanskyy 19:bae78e167b11 137 // check wrap
Volodymyr Shymanskyy 19:bae78e167b11 138 if (f > m) f = m;
Volodymyr Shymanskyy 19:bae78e167b11 139 memcpy(p, &_b[r], f);
Volodymyr Shymanskyy 19:bae78e167b11 140 _r = _inc(r, f);
Volodymyr Shymanskyy 19:bae78e167b11 141 c -= f;
Volodymyr Shymanskyy 19:bae78e167b11 142 p += f;
vshymanskyy 0:58b20b438383 143 }
Volodymyr Shymanskyy 19:bae78e167b11 144 return n - c;
vshymanskyy 0:58b20b438383 145 }
vshymanskyy 0:58b20b438383 146
vshymanskyy 0:58b20b438383 147 private:
Volodymyr Shymanskyy 19:bae78e167b11 148 int _inc(int i, int n = 1)
Volodymyr Shymanskyy 19:bae78e167b11 149 {
Volodymyr Shymanskyy 19:bae78e167b11 150 return (i + n) % N;
Volodymyr Shymanskyy 19:bae78e167b11 151 }
Volodymyr Shymanskyy 19:bae78e167b11 152
Volodymyr Shymanskyy 19:bae78e167b11 153 T _b[N];
Volodymyr Shymanskyy 19:bae78e167b11 154 volatile int _w;
Volodymyr Shymanskyy 19:bae78e167b11 155 volatile int _r;
vshymanskyy 0:58b20b438383 156 };
vshymanskyy 0:58b20b438383 157
vshymanskyy 0:58b20b438383 158 #endif