Simulated product dispenser

Dependencies:   HTS221

Fork of mbed-cloud-workshop-connect-HTS221 by Jim Carver

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers MyBuffer.h Source File

MyBuffer.h

00001 
00002 /**
00003  * @file    Buffer.h
00004  * @brief   Software Buffer - Templated Ring Buffer for most data types
00005  * @author  sam grove
00006  * @version 1.0
00007  * @see
00008  *
00009  * Copyright (c) 2013
00010  *
00011  * Licensed under the Apache License, Version 2.0 (the "License");
00012  * you may not use this file except in compliance with the License.
00013  * You may obtain a copy of the License at
00014  *
00015  *     http://www.apache.org/licenses/LICENSE-2.0
00016  *
00017  * Unless required by applicable law or agreed to in writing, software
00018  * distributed under the License is distributed on an "AS IS" BASIS,
00019  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
00020  * See the License for the specific language governing permissions and
00021  * limitations under the License.
00022  */
00023 
00024 #ifndef MYBUFFER_H
00025 #define MYBUFFER_H
00026 
00027 #include <stdint.h>
00028 #include <string.h>
00029 
00030 /** A templated software ring buffer
00031  *
00032  * Example:
00033  * @code
00034  *  #include "mbed.h"
00035  *  #include "MyBuffer.h"
00036  *
00037  *  MyBuffer <char> buf;
00038  *
00039  *  int main()
00040  *  {
00041  *      buf = 'a';
00042  *      buf.put('b');
00043  *      char *head = buf.head();
00044  *      puts(head);
00045  *
00046  *      char whats_in_there[2] = {0};
00047  *      int pos = 0;
00048  *
00049  *      while(buf.available())
00050  *      {
00051  *          whats_in_there[pos++] = buf;
00052  *      }
00053  *      printf("%c %c\n", whats_in_there[0], whats_in_there[1]);
00054  *      buf.clear();
00055  *      error("done\n\n\n");
00056  *  }
00057  * @endcode
00058  */
00059 
00060 template <typename T>
00061 class MyBuffer {
00062 private:
00063     T   *_buf;
00064     volatile uint32_t   _wloc;
00065     volatile uint32_t   _rloc;
00066     uint32_t            _size;
00067 
00068 public:
00069     /** Create a Buffer and allocate memory for it
00070      *  @param size The size of the buffer
00071      */
00072     MyBuffer(uint32_t size = 0x100);
00073 
00074     /** Get the size of the ring buffer
00075      * @return the size of the ring buffer
00076      */
00077     uint32_t getSize();
00078     uint32_t getNbAvailable();
00079 
00080     /** Destry a Buffer and release it's allocated memory
00081      */
00082     ~MyBuffer();
00083 
00084     /** Add a data element into the buffer
00085      *  @param data Something to add to the buffer
00086      */
00087     void put(T data);
00088 
00089     /** Remove a data element from the buffer
00090      *  @return Pull the oldest element from the buffer
00091      */
00092     T get(void);
00093 
00094     /** Get the address to the head of the buffer
00095      *  @return The address of element 0 in the buffer
00096      */
00097     T *head(void);
00098 
00099     /** Reset the buffer to 0. Useful if using head() to parse packeted data
00100      */
00101     void clear(void);
00102 
00103     /** Determine if anything is readable in the buffer
00104      *  @return 1 if something can be read, 0 otherwise
00105      */
00106     uint32_t available(void);
00107 
00108     /** Overloaded operator for writing to the buffer
00109      *  @param data Something to put in the buffer
00110      *  @return
00111      */
00112     MyBuffer &operator= (T data)
00113     {
00114         put(data);
00115         return *this;
00116     }
00117 
00118     /** Overloaded operator for reading from the buffer
00119      *  @return Pull the oldest element from the buffer
00120      */
00121     operator int(void)
00122     {
00123         return get();
00124     }
00125 
00126     uint32_t peek(char c);
00127 
00128 };
00129 
00130 template <class T>
00131 inline void MyBuffer<T>::put(T data)
00132 {
00133     _buf[_wloc++] = data;
00134     _wloc %= (_size - 1);
00135 
00136     return;
00137 }
00138 
00139 template <class T>
00140 inline T MyBuffer<T>::get(void)
00141 {
00142     T data_pos = _buf[_rloc++];
00143     _rloc %= (_size - 1);
00144 
00145     return data_pos;
00146 }
00147 
00148 template <class T>
00149 inline T *MyBuffer<T>::head(void)
00150 {
00151     T *data_pos = &_buf[0];
00152 
00153     return data_pos;
00154 }
00155 
00156 template <class T>
00157 inline uint32_t MyBuffer<T>::available(void)
00158 {
00159     return (_wloc == _rloc) ? 0 : 1;
00160     //return 1;
00161 }
00162 
00163 #endif
00164