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.

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?

UserRevisionLine numberNew 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