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:
Fri Jul 07 21:34:49 2017 -0700
Revision:
17:f38730193da3
Parent:
14:af7682f4e610
Child:
18:c735140666d1
Add Channel::poll_data

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