* AM2321的取温度间隔得大于2s,否则,i2c会不工作了 * SimpleTimer有个bug,会导致两次快速的读温度,现在读温度函数里加了保护 * Blynk有个bug,会导致无法把数据传到服务器 * 现在可以正常工作了

Dependencies:   mbed

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     void dump(void)
00071     {
00072         for (int i = fst; i < lst; i++) {
00073             pc.printf("0x%02X ", buffer[i]);
00074             if (i % 16 == 0) {
00075                 pc.printf("\r\n");
00076             }
00077         }
00078     }
00079 
00080     bool push(const T& data) {
00081         return write(&data, 1) == 1;
00082     }
00083 
00084     size_t getOccupied() const {
00085         if (lst == fst) {
00086             return flag ? SIZE : 0;
00087         } else if (lst > fst) {
00088             return lst - fst;
00089         } else {
00090             return SIZE + lst - fst;
00091         }
00092     }
00093 
00094     size_t getFree() const {
00095         return SIZE - getOccupied();
00096     }
00097 
00098 private:
00099     T buffer[SIZE];
00100     size_t fst;
00101     size_t lst;
00102     uint8_t flag;
00103 };
00104 
00105 #endif
00106