An mbed wrapper around the helium-client to communicate with the Helium Atom
Helium for ARM mbed
This code repository exposes an mbed library for the Helium Atom module. The Helium Atom makes it easy to securely connect IoT devices and applications to back-end IoT services.
Getting Started
See a getting started guide on the Helium site.
Supported Boards
The Helium mbed client should work with any mbed board with an available serial port.
Example Setup
Example applications can be found in the mbed Helium team.
Getting Help
If you have any questions or ideas about how to use this code - or any part of Helium - head over to the Helium Community Slack. We're standing by to help.
Contributing
Want to contribute to helium-mbed? That's awesome!
Please see CONTRIBUTING.md in this repository for details.
src/RingBuffer.h@23:cc2c1d1ed159, 2017-09-05 (annotated)
- Committer:
- Marc Nijdam
- Date:
- Tue Sep 05 13:56:03 2017 -0700
- Revision:
- 23:cc2c1d1ed159
- Parent:
- 14:af7682f4e610
Add configuration API support
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Marc Nijdam |
9:fa0d965ca34f | 1 | /** |
Marc Nijdam |
9:fa0d965ca34f | 2 | * \copyright Copyright 2017, Helium Systems, Inc. |
Marc Nijdam |
12:07a4782fe9f2 | 3 | * All Rights Reserved. See LICENSE.txt for license information |
Marc Nijdam |
9:fa0d965ca34f | 4 | */ |
Marc Nijdam |
9:fa0d965ca34f | 5 | |
Marc Nijdam |
9:fa0d965ca34f | 6 | #ifndef RINGBUFFER_H |
Marc Nijdam |
9:fa0d965ca34f | 7 | #define RINGBUFFER_H |
Marc Nijdam |
9:fa0d965ca34f | 8 | |
Marc Nijdam |
9:fa0d965ca34f | 9 | #include <stdlib.h> |
Marc Nijdam |
9:fa0d965ca34f | 10 | |
Marc Nijdam |
9:fa0d965ca34f | 11 | /* |
Marc Nijdam |
9:fa0d965ca34f | 12 | * \class RingBuffer |
Marc Nijdam |
9:fa0d965ca34f | 13 | * |
Marc Nijdam |
9:fa0d965ca34f | 14 | * \brief A simple circular buffer. |
Marc Nijdam |
9:fa0d965ca34f | 15 | * |
Marc Nijdam |
9:fa0d965ca34f | 16 | * This class implements a simple templated circular buffer. The |
Marc Nijdam |
9:fa0d965ca34f | 17 | * template variables are the type of the data in the buffer and the |
Marc Nijdam |
9:fa0d965ca34f | 18 | * size of the circular buffer. |
Marc Nijdam |
9:fa0d965ca34f | 19 | */ |
Marc Nijdam |
9:fa0d965ca34f | 20 | template <typename BufferType, size_t BufferSize> |
Marc Nijdam |
9:fa0d965ca34f | 21 | class RingBuffer |
Marc Nijdam |
9:fa0d965ca34f | 22 | { |
Marc Nijdam |
9:fa0d965ca34f | 23 | public: |
Marc Nijdam |
9:fa0d965ca34f | 24 | /** Create a RingBuffer */ |
Marc Nijdam |
9:fa0d965ca34f | 25 | RingBuffer() |
Marc Nijdam |
9:fa0d965ca34f | 26 | { |
Marc Nijdam |
9:fa0d965ca34f | 27 | clear(); |
Marc Nijdam |
9:fa0d965ca34f | 28 | } |
Marc Nijdam |
9:fa0d965ca34f | 29 | |
Marc Nijdam |
9:fa0d965ca34f | 30 | /** Push a value into the circular buffer |
Marc Nijdam |
9:fa0d965ca34f | 31 | * |
Marc Nijdam |
9:fa0d965ca34f | 32 | * @param value The value to push |
Marc Nijdam |
9:fa0d965ca34f | 33 | * @return true if pushed, false if the buffer is full |
Marc Nijdam |
9:fa0d965ca34f | 34 | */ |
Marc Nijdam |
9:fa0d965ca34f | 35 | bool push(BufferType value) |
Marc Nijdam |
9:fa0d965ca34f | 36 | { |
Marc Nijdam |
9:fa0d965ca34f | 37 | // Add char to buffer |
Marc Nijdam |
9:fa0d965ca34f | 38 | uint16_t newhead = head + 1; |
Marc Nijdam |
9:fa0d965ca34f | 39 | if (newhead >= BufferSize) |
Marc Nijdam |
9:fa0d965ca34f | 40 | { |
Marc Nijdam |
9:fa0d965ca34f | 41 | newhead = 0; |
Marc Nijdam |
9:fa0d965ca34f | 42 | } |
Marc Nijdam |
9:fa0d965ca34f | 43 | else if (newhead == tail) |
Marc Nijdam |
9:fa0d965ca34f | 44 | { |
Marc Nijdam |
9:fa0d965ca34f | 45 | // Buffer full |
Marc Nijdam |
9:fa0d965ca34f | 46 | return false; |
Marc Nijdam |
9:fa0d965ca34f | 47 | } |
Marc Nijdam |
9:fa0d965ca34f | 48 | |
Marc Nijdam |
9:fa0d965ca34f | 49 | buf[head] = value; |
Marc Nijdam |
9:fa0d965ca34f | 50 | head = newhead; |
Marc Nijdam |
9:fa0d965ca34f | 51 | |
Marc Nijdam |
9:fa0d965ca34f | 52 | return true; |
Marc Nijdam |
9:fa0d965ca34f | 53 | } |
Marc Nijdam |
9:fa0d965ca34f | 54 | |
Marc Nijdam |
9:fa0d965ca34f | 55 | /** Pop a value from the buffer. |
Marc Nijdam |
9:fa0d965ca34f | 56 | * |
Marc Nijdam |
14:af7682f4e610 | 57 | * @param[out] value A pointer to the value to populate with the popped item |
Marc Nijdam |
9:fa0d965ca34f | 58 | * @return true if the pop succeeded, false if the buffer is empty. |
Marc Nijdam |
9:fa0d965ca34f | 59 | */ |
Marc Nijdam |
9:fa0d965ca34f | 60 | bool pop(BufferType * value) |
Marc Nijdam |
9:fa0d965ca34f | 61 | { |
Marc Nijdam |
9:fa0d965ca34f | 62 | uint16_t newtail = tail; |
Marc Nijdam |
9:fa0d965ca34f | 63 | if (newtail == head) |
Marc Nijdam |
9:fa0d965ca34f | 64 | { |
Marc Nijdam |
9:fa0d965ca34f | 65 | return false; |
Marc Nijdam |
9:fa0d965ca34f | 66 | } |
Marc Nijdam |
9:fa0d965ca34f | 67 | |
Marc Nijdam |
9:fa0d965ca34f | 68 | *value = buf[newtail++]; |
Marc Nijdam |
9:fa0d965ca34f | 69 | tail = newtail >= BufferSize ? 0 : newtail; |
Marc Nijdam |
9:fa0d965ca34f | 70 | return true; |
Marc Nijdam |
9:fa0d965ca34f | 71 | } |
Marc Nijdam |
9:fa0d965ca34f | 72 | |
Marc Nijdam |
9:fa0d965ca34f | 73 | /** Get the number of available items in the buffer |
Marc Nijdam |
9:fa0d965ca34f | 74 | * |
Marc Nijdam |
9:fa0d965ca34f | 75 | * @return The number of items that can be popped from the buffer |
Marc Nijdam |
9:fa0d965ca34f | 76 | */ |
Marc Nijdam |
9:fa0d965ca34f | 77 | uint16_t available() const |
Marc Nijdam |
9:fa0d965ca34f | 78 | { |
Marc Nijdam |
9:fa0d965ca34f | 79 | int16_t count = head - tail; |
Marc Nijdam |
9:fa0d965ca34f | 80 | return count < 0 ? count + BufferSize : count; |
Marc Nijdam |
9:fa0d965ca34f | 81 | } |
Marc Nijdam |
9:fa0d965ca34f | 82 | |
Marc Nijdam |
9:fa0d965ca34f | 83 | /** Clear the buffer */ |
Marc Nijdam |
9:fa0d965ca34f | 84 | void clear() |
Marc Nijdam |
9:fa0d965ca34f | 85 | { |
Marc Nijdam |
9:fa0d965ca34f | 86 | head = tail = 0; |
Marc Nijdam |
9:fa0d965ca34f | 87 | } |
Marc Nijdam |
9:fa0d965ca34f | 88 | |
Marc Nijdam |
9:fa0d965ca34f | 89 | private: |
Marc Nijdam |
9:fa0d965ca34f | 90 | volatile uint16_t head; |
Marc Nijdam |
9:fa0d965ca34f | 91 | volatile uint16_t tail; |
Marc Nijdam |
9:fa0d965ca34f | 92 | BufferType buf[BufferSize]; |
Marc Nijdam |
9:fa0d965ca34f | 93 | }; |
Marc Nijdam |
9:fa0d965ca34f | 94 | |
Marc Nijdam |
9:fa0d965ca34f | 95 | #endif |