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:
Wed Jul 05 12:44:35 2017 -0700
Revision:
12:07a4782fe9f2
Parent:
9:fa0d965ca34f
Child:
14:af7682f4e610
native spelling of license

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 #include "Ringbuffer.h"
Marc Nijdam 9:fa0d965ca34f 7 #include "mbed.h"
Marc Nijdam 9:fa0d965ca34f 8
Marc Nijdam 9:fa0d965ca34f 9 #ifndef BUFFEREDSERIAL_H
Marc Nijdam 9:fa0d965ca34f 10 #define BUFFEREDSERIAL_H
Marc Nijdam 9:fa0d965ca34f 11
Marc Nijdam 9:fa0d965ca34f 12 /**
Marc Nijdam 9:fa0d965ca34f 13 * \class BufferedSerial
Marc Nijdam 9:fa0d965ca34f 14 *
Marc Nijdam 9:fa0d965ca34f 15 * \brief Implements a buffered serial port
Marc Nijdam 9:fa0d965ca34f 16 *
Marc Nijdam 9:fa0d965ca34f 17 * This is a simple buffered serial port to work around `readable`
Marc Nijdam 9:fa0d965ca34f 18 * issues on a number of mbed implementations. Receiving on the serial
Marc Nijdam 9:fa0d965ca34f 19 * port is buffered through an interrupt handler.
Marc Nijdam 9:fa0d965ca34f 20 *
Marc Nijdam 9:fa0d965ca34f 21 * Note that writing is not buffered at this time since writing to the
Marc Nijdam 9:fa0d965ca34f 22 * serial port at speed had not been an issue so far.
Marc Nijdam 9:fa0d965ca34f 23 */
Marc Nijdam 9:fa0d965ca34f 24 template <size_t BufferSize>
Marc Nijdam 9:fa0d965ca34f 25 class BufferedSerial : RawSerial
Marc Nijdam 9:fa0d965ca34f 26 {
Marc Nijdam 9:fa0d965ca34f 27 private:
Marc Nijdam 9:fa0d965ca34f 28 RingBuffer<uint8_t, BufferSize> _rx_buffer;
Marc Nijdam 9:fa0d965ca34f 29 void _rx_interrupt()
Marc Nijdam 9:fa0d965ca34f 30 {
Marc Nijdam 9:fa0d965ca34f 31 _rx_buffer.push(serial_getc(&_serial));
Marc Nijdam 9:fa0d965ca34f 32 }
Marc Nijdam 9:fa0d965ca34f 33
Marc Nijdam 9:fa0d965ca34f 34 public:
Marc Nijdam 9:fa0d965ca34f 35 /** Crete a buffered serial port.
Marc Nijdam 9:fa0d965ca34f 36 *
Marc Nijdam 9:fa0d965ca34f 37 * @param tx Serial port tx pin to use
Marc Nijdam 9:fa0d965ca34f 38 * @param rx Serial port rx pin to use
Marc Nijdam 9:fa0d965ca34f 39 * @param baud The baud rate to use. Defaults to the default for the current board
Marc Nijdam 9:fa0d965ca34f 40 */
Marc Nijdam 9:fa0d965ca34f 41 BufferedSerial(PinName tx,
Marc Nijdam 9:fa0d965ca34f 42 PinName rx,
Marc Nijdam 9:fa0d965ca34f 43 int baud = MBED_CONF_PLATFORM_DEFAULT_SERIAL_BAUD_RATE)
Marc Nijdam 9:fa0d965ca34f 44 : RawSerial(tx, rx, baud)
Marc Nijdam 9:fa0d965ca34f 45 {
Marc Nijdam 9:fa0d965ca34f 46 this->attach(callback(this, &BufferedSerial::_rx_interrupt),
Marc Nijdam 9:fa0d965ca34f 47 Serial::RxIrq);
Marc Nijdam 9:fa0d965ca34f 48 }
Marc Nijdam 9:fa0d965ca34f 49
Marc Nijdam 9:fa0d965ca34f 50 /** Destructor */
Marc Nijdam 9:fa0d965ca34f 51 ~BufferedSerial()
Marc Nijdam 9:fa0d965ca34f 52 {
Marc Nijdam 9:fa0d965ca34f 53 this->attach(NULL, Serial::RxIrq);
Marc Nijdam 9:fa0d965ca34f 54 }
Marc Nijdam 9:fa0d965ca34f 55
Marc Nijdam 9:fa0d965ca34f 56
Marc Nijdam 9:fa0d965ca34f 57 /** Sets the baud rate for the serial port
Marc Nijdam 9:fa0d965ca34f 58 *
Marc Nijdam 9:fa0d965ca34f 59 * @param baud The baud rate to set on the serial port
Marc Nijdam 9:fa0d965ca34f 60 */
Marc Nijdam 9:fa0d965ca34f 61 void baud(int baud)
Marc Nijdam 9:fa0d965ca34f 62 {
Marc Nijdam 9:fa0d965ca34f 63 serial_baud(&_serial, baud);
Marc Nijdam 9:fa0d965ca34f 64 }
Marc Nijdam 9:fa0d965ca34f 65
Marc Nijdam 9:fa0d965ca34f 66 /** Get a byte from the serial port buffer.
Marc Nijdam 9:fa0d965ca34f 67 *
Marc Nijdam 9:fa0d965ca34f 68 * @return a buffered byte or -1 if no bytes are available
Marc Nijdam 9:fa0d965ca34f 69 */
Marc Nijdam 9:fa0d965ca34f 70 int getc()
Marc Nijdam 9:fa0d965ca34f 71 {
Marc Nijdam 9:fa0d965ca34f 72 uint8_t ch;
Marc Nijdam 9:fa0d965ca34f 73 if (_rx_buffer.pop(&ch))
Marc Nijdam 9:fa0d965ca34f 74 {
Marc Nijdam 9:fa0d965ca34f 75 return ch;
Marc Nijdam 9:fa0d965ca34f 76 }
Marc Nijdam 9:fa0d965ca34f 77 return -1;
Marc Nijdam 9:fa0d965ca34f 78 };
Marc Nijdam 9:fa0d965ca34f 79
Marc Nijdam 9:fa0d965ca34f 80 /** Write a byte to the serial port
Marc Nijdam 9:fa0d965ca34f 81 *
Marc Nijdam 9:fa0d965ca34f 82 * @param ch The byte to write
Marc Nijdam 9:fa0d965ca34f 83 * @return the byte that was written
Marc Nijdam 9:fa0d965ca34f 84 */
Marc Nijdam 9:fa0d965ca34f 85 int putc(int ch)
Marc Nijdam 9:fa0d965ca34f 86 {
Marc Nijdam 9:fa0d965ca34f 87 serial_putc(&_serial, ch);
Marc Nijdam 9:fa0d965ca34f 88 return ch;
Marc Nijdam 9:fa0d965ca34f 89 }
Marc Nijdam 9:fa0d965ca34f 90
Marc Nijdam 9:fa0d965ca34f 91 /** Check if there are bytes to read.
Marc Nijdam 9:fa0d965ca34f 92 *
Marc Nijdam 9:fa0d965ca34f 93 * @return 1 if bytes are available, 0 otherwise
Marc Nijdam 9:fa0d965ca34f 94 */
Marc Nijdam 9:fa0d965ca34f 95 int readable()
Marc Nijdam 9:fa0d965ca34f 96 {
Marc Nijdam 9:fa0d965ca34f 97 return _rx_buffer.available() > 0;
Marc Nijdam 9:fa0d965ca34f 98 };
Marc Nijdam 9:fa0d965ca34f 99 };
Marc Nijdam 9:fa0d965ca34f 100
Marc Nijdam 9:fa0d965ca34f 101
Marc Nijdam 9:fa0d965ca34f 102
Marc Nijdam 9:fa0d965ca34f 103 #endif