Buffer for general purpose use. Templated for most datatypes
Dependents: BufferedSoftSerial 09_PT1000 10_PT1000 11_PT1000 ... more
Example
#include "mbed.h" #include "Buffer.h" Buffer <char> buf; int main() { buf = 'a'; buf.put('b'); char *head = buf.head(); puts(head); char whats_in_there[2] = {0}; int pos = 0; while(buf.available()) { whats_in_there[pos++] = buf; } printf("%c %c\n", whats_in_there[0], whats_in_there[1]); buf.clear(); error("done\n\n\n"); }
Diff: Buffer.h
- Revision:
- 1:490224f41c09
- Parent:
- 0:5e4bca1bd5f7
- Child:
- 2:d13a72146516
- Child:
- 3:c2de0ddfe65b
--- a/Buffer.h Fri May 10 18:34:16 2013 +0000 +++ b/Buffer.h Thu May 23 19:26:31 2013 +0000 @@ -1,32 +1,125 @@ +/** + * @file Buffer.h + * @brief Software Buffer - Templated Ring Buffer for most data types + * @author sam grove + * @version 1.0 + * @see + * + * Copyright (c) 2013 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + #ifndef BUFFER_H #define BUFFER_H #include <stdint.h> #include <string.h> +/** A templated software ring buffer + * + * Example: + * @code + * #include "mbed.h" + * #include "Buffer.h" + * + * Buffer <char> buf; + * + * int main() + * { + * buf = 'a'; + * buf.put('b'); + * char *head = buf.head(); + * puts(head); + * + * char whats_in_there[2] = {0}; + * int pos = 0; + * + * while(buf.available()) + * { + * whats_in_there[pos++] = buf; + * } + * printf("%c %c\n", whats_in_there[0], whats_in_there[1]); + * buf.clear(); + * error("done\n\n\n"); + * } + * @endcode + */ + template <typename T> class Buffer { private: - T *_buf; - uint32_t _wloc; - uint32_t _rloc; - uint32_t _size; + T *_buf; + volatile uint32_t _wloc; + volatile uint32_t _rloc; + uint32_t _size; enum BUFFER_SIZE{SMALL = 0x100, MEDIUM = 0x400, LARGE = 0x1000}; public: + /** Create a Buffer and allocate memory for it + * @param size An enum from BUFFER_SIZE. + */ Buffer(BUFFER_SIZE size = Buffer::SMALL); + + /** Destry a Buffer and release it's allocated memory + */ ~Buffer(); + /** Add a data element into the buffer + * @param data Something to add to the buffer + */ void put(T data); + + /** Remove a data element from the buffer + * @return Pull the oldest element from the buffer + */ T get(void); + + /** Get the address to the head of the buffer + * @return The address of element 0 in the buffer + */ T *head(void); + + /** Reset the buffer to 0. Useful if using head() to parse packeted data + */ void clear(void); - Buffer &operator= (T data){put(data);return *this;} + + /** Determine if anything is readable in the buffer + * @return 1 if something can be read, 0 otherwise + */ uint32_t available(void); + /** Overloaded operator for writing to the buffer + * @param data Something to put in the buffer + * @return + */ + Buffer &operator= (T data) + { + put(data); + return *this; + } + + /** Overloaded operator for reading from the buffer + * @return Pull the oldest element from the buffer + */ + operator int(void) + { + return get(); + } + }; #endif