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
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 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 "Helium.h"
Marc Nijdam 7:e6743e01b7cb 7 #include "helium-client/helium-client.h"
Marc Nijdam 7:e6743e01b7cb 8
Marc Nijdam 7:e6743e01b7cb 9 bool
Marc Nijdam 7:e6743e01b7cb 10 helium_serial_readable(void * param)
Marc Nijdam 7:e6743e01b7cb 11 {
Marc Nijdam 7:e6743e01b7cb 12 Helium * helium = (Helium *)param;
Marc Nijdam 7:e6743e01b7cb 13 return helium->serial.readable();
Marc Nijdam 7:e6743e01b7cb 14 }
Marc Nijdam 7:e6743e01b7cb 15
Marc Nijdam 7:e6743e01b7cb 16 bool
Marc Nijdam 7:e6743e01b7cb 17 helium_serial_getc(void * param, uint8_t * ch)
Marc Nijdam 7:e6743e01b7cb 18 {
Marc Nijdam 7:e6743e01b7cb 19 Helium * helium = (Helium *)param;
Marc Nijdam 7:e6743e01b7cb 20 int val = helium->serial.getc();
Marc Nijdam 7:e6743e01b7cb 21 *ch = val;
Marc Nijdam 7:e6743e01b7cb 22 return val >= 0;
Marc Nijdam 7:e6743e01b7cb 23 }
Marc Nijdam 7:e6743e01b7cb 24
Marc Nijdam 7:e6743e01b7cb 25 bool
Marc Nijdam 7:e6743e01b7cb 26 helium_serial_putc(void * param, uint8_t ch)
Marc Nijdam 7:e6743e01b7cb 27 {
Marc Nijdam 7:e6743e01b7cb 28 Helium * helium = (Helium *)param;
Marc Nijdam 7:e6743e01b7cb 29 helium->serial.putc(ch);
Marc Nijdam 7:e6743e01b7cb 30 return true;
Marc Nijdam 7:e6743e01b7cb 31 }
Marc Nijdam 7:e6743e01b7cb 32
Marc Nijdam 7:e6743e01b7cb 33 void
Marc Nijdam 7:e6743e01b7cb 34 helium_wait_us(void * param, uint32_t us)
Marc Nijdam 7:e6743e01b7cb 35 {
Marc Nijdam 7:e6743e01b7cb 36 (void)param;
Marc Nijdam 7:e6743e01b7cb 37 wait_us(us);
Marc Nijdam 7:e6743e01b7cb 38 }
Marc Nijdam 7:e6743e01b7cb 39
Marc Nijdam 7:e6743e01b7cb 40 Helium::Helium(PinName tx, PinName rx) : serial(tx, rx)
Marc Nijdam 7:e6743e01b7cb 41 {
Marc Nijdam 7:e6743e01b7cb 42 helium_init(&_ctx, (void *)this);
Marc Nijdam 7:e6743e01b7cb 43 }
Marc Nijdam 7:e6743e01b7cb 44
Marc Nijdam 7:e6743e01b7cb 45
Marc Nijdam 7:e6743e01b7cb 46 int
Marc Nijdam 7:e6743e01b7cb 47 Helium::baud(enum helium_baud baud)
Marc Nijdam 7:e6743e01b7cb 48 {
Marc Nijdam 7:e6743e01b7cb 49 int result = helium_baud(&_ctx, baud);
Marc Nijdam 7:e6743e01b7cb 50
Marc Nijdam 7:e6743e01b7cb 51 uint32_t serial_baud = 9600;
Marc Nijdam 7:e6743e01b7cb 52 switch (baud)
Marc Nijdam 7:e6743e01b7cb 53 {
Marc Nijdam 7:e6743e01b7cb 54 case helium_baud_b9600:
Marc Nijdam 7:e6743e01b7cb 55 serial_baud = 9600;
Marc Nijdam 7:e6743e01b7cb 56 break;
Marc Nijdam 7:e6743e01b7cb 57 case helium_baud_b14400:
Marc Nijdam 7:e6743e01b7cb 58 serial_baud = 14400;
Marc Nijdam 7:e6743e01b7cb 59 break;
Marc Nijdam 7:e6743e01b7cb 60 case helium_baud_b19200:
Marc Nijdam 7:e6743e01b7cb 61 serial_baud = 19200;
Marc Nijdam 7:e6743e01b7cb 62 break;
Marc Nijdam 7:e6743e01b7cb 63 case helium_baud_b38400:
Marc Nijdam 7:e6743e01b7cb 64 serial_baud = 38400;
Marc Nijdam 7:e6743e01b7cb 65 break;
Marc Nijdam 7:e6743e01b7cb 66 case helium_baud_b57600:
Marc Nijdam 7:e6743e01b7cb 67 serial_baud = 57600;
Marc Nijdam 7:e6743e01b7cb 68 break;
Marc Nijdam 7:e6743e01b7cb 69 case helium_baud_b115200:
Marc Nijdam 7:e6743e01b7cb 70 serial_baud = 115200;
Marc Nijdam 7:e6743e01b7cb 71 break;
Marc Nijdam 7:e6743e01b7cb 72 }
Marc Nijdam 7:e6743e01b7cb 73 serial.baud(serial_baud);
Marc Nijdam 7:e6743e01b7cb 74 return result;
Marc Nijdam 7:e6743e01b7cb 75 }
Marc Nijdam 7:e6743e01b7cb 76
Marc Nijdam 7:e6743e01b7cb 77 int
Marc Nijdam 7:e6743e01b7cb 78 Helium::info(struct helium_info * info)
Marc Nijdam 7:e6743e01b7cb 79 {
Marc Nijdam 7:e6743e01b7cb 80 int status = helium_info(&_ctx, info);
Marc Nijdam 7:e6743e01b7cb 81 return status;
Marc Nijdam 7:e6743e01b7cb 82 }
Marc Nijdam 7:e6743e01b7cb 83
Marc Nijdam 7:e6743e01b7cb 84 int
Marc Nijdam 7:e6743e01b7cb 85 Helium::connect(struct connection * connection, uint32_t retries)
Marc Nijdam 7:e6743e01b7cb 86 {
Marc Nijdam 7:e6743e01b7cb 87 return helium_connect(&_ctx, connection, retries);
Marc Nijdam 7:e6743e01b7cb 88 }
Marc Nijdam 7:e6743e01b7cb 89
Marc Nijdam 7:e6743e01b7cb 90
Marc Nijdam 7:e6743e01b7cb 91 bool
Marc Nijdam 7:e6743e01b7cb 92 Helium::connected()
Marc Nijdam 7:e6743e01b7cb 93 {
Marc Nijdam 7:e6743e01b7cb 94 return helium_connected(&_ctx) == helium_connected_CONNECTED;
Marc Nijdam 7:e6743e01b7cb 95 }
Marc Nijdam 7:e6743e01b7cb 96
Marc Nijdam 7:e6743e01b7cb 97 int
Marc Nijdam 7:e6743e01b7cb 98 Helium::sleep(struct connection * connection)
Marc Nijdam 7:e6743e01b7cb 99 {
Marc Nijdam 7:e6743e01b7cb 100 return helium_sleep(&_ctx, connection);
Marc Nijdam 7:e6743e01b7cb 101 }
Marc Nijdam 7:e6743e01b7cb 102
Marc Nijdam 7:e6743e01b7cb 103 //
Marc Nijdam 7:e6743e01b7cb 104 // Channel
Marc Nijdam 7:e6743e01b7cb 105 //
Marc Nijdam 7:e6743e01b7cb 106
Marc Nijdam 7:e6743e01b7cb 107 Channel::Channel(Helium * helium)
Marc Nijdam 7:e6743e01b7cb 108 {
Marc Nijdam 7:e6743e01b7cb 109 _helium = helium;
Marc Nijdam 7:e6743e01b7cb 110 }
Marc Nijdam 7:e6743e01b7cb 111
Marc Nijdam 7:e6743e01b7cb 112 int
Marc Nijdam 7:e6743e01b7cb 113 Channel::begin(const char * name, uint16_t * token)
Marc Nijdam 7:e6743e01b7cb 114 {
Marc Nijdam 7:e6743e01b7cb 115 return helium_channel_create(&_helium->_ctx, name, strlen(name), token);
Marc Nijdam 7:e6743e01b7cb 116 }
Marc Nijdam 7:e6743e01b7cb 117
Marc Nijdam 7:e6743e01b7cb 118 int
Marc Nijdam 7:e6743e01b7cb 119 Channel::begin(const char * name, int8_t * result)
Marc Nijdam 7:e6743e01b7cb 120 {
Marc Nijdam 7:e6743e01b7cb 121 uint16_t token;
Marc Nijdam 7:e6743e01b7cb 122 int status = begin(name, &token);
Marc Nijdam 7:e6743e01b7cb 123 _channel_id = -1;
Marc Nijdam 7:e6743e01b7cb 124 if (helium_status_OK == status)
Marc Nijdam 7:e6743e01b7cb 125 {
Marc Nijdam 7:e6743e01b7cb 126 status = poll(token, &_channel_id, HELIUM_POLL_RETRIES_5S);
Marc Nijdam 7:e6743e01b7cb 127 }
Marc Nijdam 7:e6743e01b7cb 128
Marc Nijdam 7:e6743e01b7cb 129 if (result)
Marc Nijdam 7:e6743e01b7cb 130 {
Marc Nijdam 7:e6743e01b7cb 131 *result =
Marc Nijdam 7:e6743e01b7cb 132 status == helium_status_OK && _channel_id > 0 ? 0 : _channel_id;
Marc Nijdam 7:e6743e01b7cb 133 }
Marc Nijdam 7:e6743e01b7cb 134
Marc Nijdam 7:e6743e01b7cb 135 return status;
Marc Nijdam 7:e6743e01b7cb 136 }
Marc Nijdam 7:e6743e01b7cb 137
Marc Nijdam 7:e6743e01b7cb 138 int
Marc Nijdam 7:e6743e01b7cb 139 Channel::send(void const * data, size_t len, uint16_t * token)
Marc Nijdam 7:e6743e01b7cb 140 {
Marc Nijdam 7:e6743e01b7cb 141 return helium_channel_send(&_helium->_ctx, _channel_id, data, len, token);
Marc Nijdam 7:e6743e01b7cb 142 }
Marc Nijdam 7:e6743e01b7cb 143
Marc Nijdam 7:e6743e01b7cb 144
Marc Nijdam 7:e6743e01b7cb 145 int
Marc Nijdam 7:e6743e01b7cb 146 Channel::send(void const * data, size_t len, int8_t * result)
Marc Nijdam 7:e6743e01b7cb 147 {
Marc Nijdam 7:e6743e01b7cb 148 uint16_t token;
Marc Nijdam 7:e6743e01b7cb 149 int status = send(data, len, &token);
Marc Nijdam 7:e6743e01b7cb 150 if (helium_status_OK == status)
Marc Nijdam 7:e6743e01b7cb 151 {
Marc Nijdam 7:e6743e01b7cb 152 status = poll(token, result, HELIUM_POLL_RETRIES_5S);
Marc Nijdam 7:e6743e01b7cb 153 }
Marc Nijdam 7:e6743e01b7cb 154 return status;
Marc Nijdam 7:e6743e01b7cb 155 }
Marc Nijdam 7:e6743e01b7cb 156
Marc Nijdam 7:e6743e01b7cb 157 int
Marc Nijdam 7:e6743e01b7cb 158 Channel::poll(uint16_t token, int8_t * result, uint32_t retries)
Marc Nijdam 7:e6743e01b7cb 159 {
Marc Nijdam 7:e6743e01b7cb 160 return helium_channel_poll_result(&_helium->_ctx, token, result, retries);
Marc Nijdam 7:e6743e01b7cb 161 }