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 Jun 28 16:31:46 2017 -0700
Revision:
3:475fae677f2d
Child:
14:af7682f4e610
updating to helium-client

Who changed what in which revision?

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