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.
src/Helium.cpp@19:be9553194a4e, 2017-07-10 (annotated)
- Committer:
- Marc Nijdam
- Date:
- Mon Jul 10 14:54:06 2017 -0700
- Revision:
- 19:be9553194a4e
- Parent:
- 18:c735140666d1
- Child:
- 20:d55e9eb828d4
Add needs_reset
Who changed what in which revision?
User | Revision | Line number | New 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 | bool |
Marc Nijdam |
3:475fae677f2d | 85 | Helium::connected() |
Marc Nijdam |
3:475fae677f2d | 86 | { |
Marc Nijdam |
3:475fae677f2d | 87 | return helium_connected(&_ctx) == helium_connected_CONNECTED; |
Marc Nijdam |
3:475fae677f2d | 88 | } |
Marc Nijdam |
3:475fae677f2d | 89 | |
Marc Nijdam |
3:475fae677f2d | 90 | int |
Marc Nijdam |
3:475fae677f2d | 91 | Helium::sleep(struct connection * connection) |
Marc Nijdam |
3:475fae677f2d | 92 | { |
Marc Nijdam |
3:475fae677f2d | 93 | return helium_sleep(&_ctx, connection); |
Marc Nijdam |
3:475fae677f2d | 94 | } |
Marc Nijdam |
3:475fae677f2d | 95 | |
Marc Nijdam |
19:be9553194a4e | 96 | bool |
Marc Nijdam |
19:be9553194a4e | 97 | Helium::needs_reset() |
Marc Nijdam |
19:be9553194a4e | 98 | { |
Marc Nijdam |
19:be9553194a4e | 99 | return helium_needs_reset(&_ctx); |
Marc Nijdam |
19:be9553194a4e | 100 | } |
Marc Nijdam |
19:be9553194a4e | 101 | |
Marc Nijdam |
18:c735140666d1 | 102 | int |
Marc Nijdam |
18:c735140666d1 | 103 | Helium::reset() |
Marc Nijdam |
18:c735140666d1 | 104 | { |
Marc Nijdam |
18:c735140666d1 | 105 | return helium_reset(&_ctx); |
Marc Nijdam |
18:c735140666d1 | 106 | } |
Marc Nijdam |
18:c735140666d1 | 107 | |
Marc Nijdam |
18:c735140666d1 | 108 | |
Marc Nijdam |
3:475fae677f2d | 109 | // |
Marc Nijdam |
3:475fae677f2d | 110 | // Channel |
Marc Nijdam |
3:475fae677f2d | 111 | // |
Marc Nijdam |
3:475fae677f2d | 112 | |
Marc Nijdam |
3:475fae677f2d | 113 | Channel::Channel(Helium * helium) |
Marc Nijdam |
3:475fae677f2d | 114 | { |
Marc Nijdam |
3:475fae677f2d | 115 | _helium = helium; |
Marc Nijdam |
3:475fae677f2d | 116 | } |
Marc Nijdam |
3:475fae677f2d | 117 | |
Marc Nijdam |
3:475fae677f2d | 118 | int |
Marc Nijdam |
3:475fae677f2d | 119 | Channel::begin(const char * name, uint16_t * token) |
Marc Nijdam |
3:475fae677f2d | 120 | { |
Marc Nijdam |
3:475fae677f2d | 121 | return helium_channel_create(&_helium->_ctx, name, strlen(name), token); |
Marc Nijdam |
3:475fae677f2d | 122 | } |
Marc Nijdam |
3:475fae677f2d | 123 | |
Marc Nijdam |
3:475fae677f2d | 124 | int |
Marc Nijdam |
3:475fae677f2d | 125 | Channel::begin(const char * name, int8_t * result) |
Marc Nijdam |
3:475fae677f2d | 126 | { |
Marc Nijdam |
3:475fae677f2d | 127 | uint16_t token; |
Marc Nijdam |
3:475fae677f2d | 128 | int status = begin(name, &token); |
Marc Nijdam |
3:475fae677f2d | 129 | _channel_id = -1; |
Marc Nijdam |
3:475fae677f2d | 130 | if (helium_status_OK == status) |
Marc Nijdam |
3:475fae677f2d | 131 | { |
Marc Nijdam |
17:f38730193da3 | 132 | status = poll_result(token, &_channel_id); |
Marc Nijdam |
3:475fae677f2d | 133 | } |
Marc Nijdam |
3:475fae677f2d | 134 | |
Marc Nijdam |
3:475fae677f2d | 135 | if (result) |
Marc Nijdam |
3:475fae677f2d | 136 | { |
Marc Nijdam |
17:f38730193da3 | 137 | *result = status == helium_status_OK && _channel_id > 0 ? 0 : _channel_id; |
Marc Nijdam |
3:475fae677f2d | 138 | } |
Marc Nijdam |
3:475fae677f2d | 139 | |
Marc Nijdam |
3:475fae677f2d | 140 | return status; |
Marc Nijdam |
3:475fae677f2d | 141 | } |
Marc Nijdam |
3:475fae677f2d | 142 | |
Marc Nijdam |
3:475fae677f2d | 143 | int |
Marc Nijdam |
3:475fae677f2d | 144 | Channel::send(void const * data, size_t len, uint16_t * token) |
Marc Nijdam |
3:475fae677f2d | 145 | { |
Marc Nijdam |
3:475fae677f2d | 146 | return helium_channel_send(&_helium->_ctx, _channel_id, data, len, token); |
Marc Nijdam |
3:475fae677f2d | 147 | } |
Marc Nijdam |
3:475fae677f2d | 148 | |
Marc Nijdam |
3:475fae677f2d | 149 | |
Marc Nijdam |
3:475fae677f2d | 150 | int |
Marc Nijdam |
3:475fae677f2d | 151 | Channel::send(void const * data, size_t len, int8_t * result) |
Marc Nijdam |
3:475fae677f2d | 152 | { |
Marc Nijdam |
3:475fae677f2d | 153 | uint16_t token; |
Marc Nijdam |
3:475fae677f2d | 154 | int status = send(data, len, &token); |
Marc Nijdam |
3:475fae677f2d | 155 | if (helium_status_OK == status) |
Marc Nijdam |
3:475fae677f2d | 156 | { |
Marc Nijdam |
17:f38730193da3 | 157 | status = poll_result(token, result); |
Marc Nijdam |
3:475fae677f2d | 158 | } |
Marc Nijdam |
3:475fae677f2d | 159 | return status; |
Marc Nijdam |
3:475fae677f2d | 160 | } |
Marc Nijdam |
3:475fae677f2d | 161 | |
Marc Nijdam |
3:475fae677f2d | 162 | int |
Marc Nijdam |
17:f38730193da3 | 163 | Channel::poll_result(uint16_t token, int8_t * result, uint32_t retries) |
Marc Nijdam |
3:475fae677f2d | 164 | { |
Marc Nijdam |
3:475fae677f2d | 165 | return helium_channel_poll_result(&_helium->_ctx, token, result, retries); |
Marc Nijdam |
3:475fae677f2d | 166 | } |
Marc Nijdam |
17:f38730193da3 | 167 | |
Marc Nijdam |
17:f38730193da3 | 168 | int |
Marc Nijdam |
17:f38730193da3 | 169 | Channel::poll_data(uint16_t channel_id, |
Marc Nijdam |
17:f38730193da3 | 170 | void * data, |
Marc Nijdam |
17:f38730193da3 | 171 | size_t len, |
Marc Nijdam |
17:f38730193da3 | 172 | size_t * used, |
Marc Nijdam |
17:f38730193da3 | 173 | uint32_t retries) |
Marc Nijdam |
17:f38730193da3 | 174 | { |
Marc Nijdam |
17:f38730193da3 | 175 | return helium_channel_poll_data(&_helium->_ctx, |
Marc Nijdam |
17:f38730193da3 | 176 | channel_id, |
Marc Nijdam |
17:f38730193da3 | 177 | data, |
Marc Nijdam |
17:f38730193da3 | 178 | len, |
Marc Nijdam |
17:f38730193da3 | 179 | used, |
Marc Nijdam |
17:f38730193da3 | 180 | retries); |
Marc Nijdam |
17:f38730193da3 | 181 | } |