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 09:20:25 2017 -0700
Revision:
7:e6743e01b7cb
Child:
12:07a4782fe9f2
This updates Helium to work on mbed using interrupt handlers for serial reading

Who changed what in which revision?

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