demo project
Dependencies: AX-12A Dynamixel mbed iothub_client EthernetInterface NTPClient ConfigFile SDFileSystem iothub_amqp_transport mbed-rtos proton-c-mbed wolfSSL
SafeCircBuf.h@4:36a4eceb1b7f, 2015-12-23 (annotated)
- Committer:
- henryrawas
- Date:
- Wed Dec 23 18:34:06 2015 +0000
- Revision:
- 4:36a4eceb1b7f
RobotArm plus publish IoTHub status
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
henryrawas | 4:36a4eceb1b7f | 1 | /* |
henryrawas | 4:36a4eceb1b7f | 2 | Copyright (c) 2015 Jonathan Pickett & Microsoft. Some appropriate open source license. |
henryrawas | 4:36a4eceb1b7f | 3 | */ |
henryrawas | 4:36a4eceb1b7f | 4 | |
henryrawas | 4:36a4eceb1b7f | 5 | #ifndef __SAFECIRCBUF_H__ |
henryrawas | 4:36a4eceb1b7f | 6 | #define __SAFECIRCBUF_H__ |
henryrawas | 4:36a4eceb1b7f | 7 | |
henryrawas | 4:36a4eceb1b7f | 8 | #include "mbed.h" |
henryrawas | 4:36a4eceb1b7f | 9 | #include "rtos.h" |
henryrawas | 4:36a4eceb1b7f | 10 | |
henryrawas | 4:36a4eceb1b7f | 11 | #include <CircularBuffer.h> |
henryrawas | 4:36a4eceb1b7f | 12 | |
henryrawas | 4:36a4eceb1b7f | 13 | template<typename T, uint32_t BufferSize, typename CounterType = uint32_t> |
henryrawas | 4:36a4eceb1b7f | 14 | class SafeCircBuf |
henryrawas | 4:36a4eceb1b7f | 15 | { |
henryrawas | 4:36a4eceb1b7f | 16 | public: |
henryrawas | 4:36a4eceb1b7f | 17 | SafeCircBuf() { |
henryrawas | 4:36a4eceb1b7f | 18 | } |
henryrawas | 4:36a4eceb1b7f | 19 | |
henryrawas | 4:36a4eceb1b7f | 20 | ~SafeCircBuf() { |
henryrawas | 4:36a4eceb1b7f | 21 | } |
henryrawas | 4:36a4eceb1b7f | 22 | |
henryrawas | 4:36a4eceb1b7f | 23 | /** Push the transaction to the buffer. This overwrites the buffer if it's |
henryrawas | 4:36a4eceb1b7f | 24 | * full |
henryrawas | 4:36a4eceb1b7f | 25 | * |
henryrawas | 4:36a4eceb1b7f | 26 | * @param data Data to be pushed to the buffer |
henryrawas | 4:36a4eceb1b7f | 27 | */ |
henryrawas | 4:36a4eceb1b7f | 28 | void push(const T& data) { |
henryrawas | 4:36a4eceb1b7f | 29 | _mutex.lock(); |
henryrawas | 4:36a4eceb1b7f | 30 | _circBuf.push(data); |
henryrawas | 4:36a4eceb1b7f | 31 | _mutex.unlock(); |
henryrawas | 4:36a4eceb1b7f | 32 | } |
henryrawas | 4:36a4eceb1b7f | 33 | |
henryrawas | 4:36a4eceb1b7f | 34 | /** Pop the transaction from the buffer |
henryrawas | 4:36a4eceb1b7f | 35 | * |
henryrawas | 4:36a4eceb1b7f | 36 | * @param data Data to be pushed to the buffer |
henryrawas | 4:36a4eceb1b7f | 37 | * @return True if the buffer is not empty and data contains a transaction, false otherwise |
henryrawas | 4:36a4eceb1b7f | 38 | */ |
henryrawas | 4:36a4eceb1b7f | 39 | bool pop(T& data) { |
henryrawas | 4:36a4eceb1b7f | 40 | bool rc; |
henryrawas | 4:36a4eceb1b7f | 41 | _mutex.lock(); |
henryrawas | 4:36a4eceb1b7f | 42 | rc = _circBuf.pop(data); |
henryrawas | 4:36a4eceb1b7f | 43 | _mutex.unlock(); |
henryrawas | 4:36a4eceb1b7f | 44 | return rc; |
henryrawas | 4:36a4eceb1b7f | 45 | } |
henryrawas | 4:36a4eceb1b7f | 46 | |
henryrawas | 4:36a4eceb1b7f | 47 | /** Check if the buffer is empty |
henryrawas | 4:36a4eceb1b7f | 48 | * |
henryrawas | 4:36a4eceb1b7f | 49 | * @return True if the buffer is empty, false if not |
henryrawas | 4:36a4eceb1b7f | 50 | */ |
henryrawas | 4:36a4eceb1b7f | 51 | bool empty() { |
henryrawas | 4:36a4eceb1b7f | 52 | bool rc; |
henryrawas | 4:36a4eceb1b7f | 53 | _mutex.lock(); |
henryrawas | 4:36a4eceb1b7f | 54 | rc = _circBuf.empty(); |
henryrawas | 4:36a4eceb1b7f | 55 | _mutex.unlock(); |
henryrawas | 4:36a4eceb1b7f | 56 | return rc; |
henryrawas | 4:36a4eceb1b7f | 57 | } |
henryrawas | 4:36a4eceb1b7f | 58 | |
henryrawas | 4:36a4eceb1b7f | 59 | /** Check if the buffer is full |
henryrawas | 4:36a4eceb1b7f | 60 | * |
henryrawas | 4:36a4eceb1b7f | 61 | * @return True if the buffer is full, false if not |
henryrawas | 4:36a4eceb1b7f | 62 | */ |
henryrawas | 4:36a4eceb1b7f | 63 | bool full() { |
henryrawas | 4:36a4eceb1b7f | 64 | bool rc; |
henryrawas | 4:36a4eceb1b7f | 65 | _mutex.lock(); |
henryrawas | 4:36a4eceb1b7f | 66 | rc = _circBuf.full(); |
henryrawas | 4:36a4eceb1b7f | 67 | _mutex.unlock(); |
henryrawas | 4:36a4eceb1b7f | 68 | return rc; |
henryrawas | 4:36a4eceb1b7f | 69 | } |
henryrawas | 4:36a4eceb1b7f | 70 | |
henryrawas | 4:36a4eceb1b7f | 71 | /** Reset the buffer |
henryrawas | 4:36a4eceb1b7f | 72 | * |
henryrawas | 4:36a4eceb1b7f | 73 | */ |
henryrawas | 4:36a4eceb1b7f | 74 | void reset() { |
henryrawas | 4:36a4eceb1b7f | 75 | _mutex.lock(); |
henryrawas | 4:36a4eceb1b7f | 76 | _circBuf.reset(); |
henryrawas | 4:36a4eceb1b7f | 77 | _mutex.unlock(); |
henryrawas | 4:36a4eceb1b7f | 78 | } |
henryrawas | 4:36a4eceb1b7f | 79 | |
henryrawas | 4:36a4eceb1b7f | 80 | private: |
henryrawas | 4:36a4eceb1b7f | 81 | Mutex _mutex; |
henryrawas | 4:36a4eceb1b7f | 82 | CircularBuffer<T, BufferSize, CounterType> _circBuf; |
henryrawas | 4:36a4eceb1b7f | 83 | }; |
henryrawas | 4:36a4eceb1b7f | 84 | |
henryrawas | 4:36a4eceb1b7f | 85 | #endif |