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@23:cc2c1d1ed159, 2017-09-05 (annotated)
- Committer:
- Marc Nijdam
- Date:
- Tue Sep 05 13:56:03 2017 -0700
- Revision:
- 23:cc2c1d1ed159
- Parent:
- 20:d55e9eb828d4
Add configuration API support
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 |
23:cc2c1d1ed159 | 113 | Channel::Channel(Helium * h) |
Marc Nijdam |
3:475fae677f2d | 114 | { |
Marc Nijdam |
23:cc2c1d1ed159 | 115 | helium = h; |
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 |
23:cc2c1d1ed159 | 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 |
23:cc2c1d1ed159 | 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 |
23:cc2c1d1ed159 | 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 |
20:d55e9eb828d4 | 169 | Channel::poll_data(void * data, |
Marc Nijdam |
17:f38730193da3 | 170 | size_t len, |
Marc Nijdam |
17:f38730193da3 | 171 | size_t * used, |
Marc Nijdam |
17:f38730193da3 | 172 | uint32_t retries) |
Marc Nijdam |
17:f38730193da3 | 173 | { |
Marc Nijdam |
23:cc2c1d1ed159 | 174 | return helium_channel_poll_data(&helium->_ctx, |
Marc Nijdam |
20:d55e9eb828d4 | 175 | _channel_id, |
Marc Nijdam |
17:f38730193da3 | 176 | data, |
Marc Nijdam |
17:f38730193da3 | 177 | len, |
Marc Nijdam |
17:f38730193da3 | 178 | used, |
Marc Nijdam |
17:f38730193da3 | 179 | retries); |
Marc Nijdam |
17:f38730193da3 | 180 | } |
Marc Nijdam |
23:cc2c1d1ed159 | 181 | |
Marc Nijdam |
23:cc2c1d1ed159 | 182 | // |
Marc Nijdam |
23:cc2c1d1ed159 | 183 | // Config |
Marc Nijdam |
23:cc2c1d1ed159 | 184 | // |
Marc Nijdam |
23:cc2c1d1ed159 | 185 | |
Marc Nijdam |
23:cc2c1d1ed159 | 186 | Config::Config(Channel * channel) |
Marc Nijdam |
23:cc2c1d1ed159 | 187 | { |
Marc Nijdam |
23:cc2c1d1ed159 | 188 | _channel = channel; |
Marc Nijdam |
23:cc2c1d1ed159 | 189 | } |
Marc Nijdam |
23:cc2c1d1ed159 | 190 | |
Marc Nijdam |
23:cc2c1d1ed159 | 191 | int |
Marc Nijdam |
23:cc2c1d1ed159 | 192 | Config::get(const char * key, uint16_t * token) |
Marc Nijdam |
23:cc2c1d1ed159 | 193 | { |
Marc Nijdam |
23:cc2c1d1ed159 | 194 | return helium_channel_config_get(&_channel->helium->_ctx, |
Marc Nijdam |
23:cc2c1d1ed159 | 195 | _channel->_channel_id, |
Marc Nijdam |
23:cc2c1d1ed159 | 196 | key, |
Marc Nijdam |
23:cc2c1d1ed159 | 197 | token); |
Marc Nijdam |
23:cc2c1d1ed159 | 198 | } |
Marc Nijdam |
23:cc2c1d1ed159 | 199 | |
Marc Nijdam |
23:cc2c1d1ed159 | 200 | |
Marc Nijdam |
23:cc2c1d1ed159 | 201 | int |
Marc Nijdam |
23:cc2c1d1ed159 | 202 | Config::_get(const char * config_key, |
Marc Nijdam |
23:cc2c1d1ed159 | 203 | enum helium_config_type config_type, |
Marc Nijdam |
23:cc2c1d1ed159 | 204 | void * value, |
Marc Nijdam |
23:cc2c1d1ed159 | 205 | size_t value_len, |
Marc Nijdam |
23:cc2c1d1ed159 | 206 | void * default_value, |
Marc Nijdam |
23:cc2c1d1ed159 | 207 | size_t default_value_len, |
Marc Nijdam |
23:cc2c1d1ed159 | 208 | uint32_t retries) |
Marc Nijdam |
23:cc2c1d1ed159 | 209 | { |
Marc Nijdam |
23:cc2c1d1ed159 | 210 | uint16_t token; |
Marc Nijdam |
23:cc2c1d1ed159 | 211 | int status = get(config_key, &token); |
Marc Nijdam |
23:cc2c1d1ed159 | 212 | int8_t result = 0; |
Marc Nijdam |
23:cc2c1d1ed159 | 213 | if (helium_status_OK == status) |
Marc Nijdam |
23:cc2c1d1ed159 | 214 | { |
Marc Nijdam |
23:cc2c1d1ed159 | 215 | status = poll_get_result(token, |
Marc Nijdam |
23:cc2c1d1ed159 | 216 | config_key, |
Marc Nijdam |
23:cc2c1d1ed159 | 217 | config_type, |
Marc Nijdam |
23:cc2c1d1ed159 | 218 | value, |
Marc Nijdam |
23:cc2c1d1ed159 | 219 | value_len, |
Marc Nijdam |
23:cc2c1d1ed159 | 220 | default_value, |
Marc Nijdam |
23:cc2c1d1ed159 | 221 | default_value_len, |
Marc Nijdam |
23:cc2c1d1ed159 | 222 | &result, |
Marc Nijdam |
23:cc2c1d1ed159 | 223 | retries); |
Marc Nijdam |
23:cc2c1d1ed159 | 224 | } |
Marc Nijdam |
23:cc2c1d1ed159 | 225 | if (helium_status_OK == status && result != 0) |
Marc Nijdam |
23:cc2c1d1ed159 | 226 | { |
Marc Nijdam |
23:cc2c1d1ed159 | 227 | status = helium_status_ERR_COMMUNICATION; |
Marc Nijdam |
23:cc2c1d1ed159 | 228 | } |
Marc Nijdam |
23:cc2c1d1ed159 | 229 | return status; |
Marc Nijdam |
23:cc2c1d1ed159 | 230 | } |
Marc Nijdam |
23:cc2c1d1ed159 | 231 | |
Marc Nijdam |
23:cc2c1d1ed159 | 232 | |
Marc Nijdam |
23:cc2c1d1ed159 | 233 | /** Context for the poll_get handlder |
Marc Nijdam |
23:cc2c1d1ed159 | 234 | * |
Marc Nijdam |
23:cc2c1d1ed159 | 235 | * An instance of this if filled in the #Config::poll_get_result |
Marc Nijdam |
23:cc2c1d1ed159 | 236 | * implementation and the result of the poll handler is returned in |
Marc Nijdam |
23:cc2c1d1ed159 | 237 | * the status field |
Marc Nijdam |
23:cc2c1d1ed159 | 238 | */ |
Marc Nijdam |
23:cc2c1d1ed159 | 239 | struct _poll_get_context |
Marc Nijdam |
23:cc2c1d1ed159 | 240 | { |
Marc Nijdam |
23:cc2c1d1ed159 | 241 | //! The config key to look for |
Marc Nijdam |
23:cc2c1d1ed159 | 242 | const char * filter_key; |
Marc Nijdam |
23:cc2c1d1ed159 | 243 | //! The config type to check for |
Marc Nijdam |
23:cc2c1d1ed159 | 244 | enum helium_config_type filter_type; |
Marc Nijdam |
23:cc2c1d1ed159 | 245 | //! The destination buffer |
Marc Nijdam |
23:cc2c1d1ed159 | 246 | void * dest; |
Marc Nijdam |
23:cc2c1d1ed159 | 247 | //! The length of the destination buffer |
Marc Nijdam |
23:cc2c1d1ed159 | 248 | size_t dest_len; |
Marc Nijdam |
23:cc2c1d1ed159 | 249 | //! The default value. Assumed to be the same type as filter_type |
Marc Nijdam |
23:cc2c1d1ed159 | 250 | void * default_value; |
Marc Nijdam |
23:cc2c1d1ed159 | 251 | //! The length of the default_value |
Marc Nijdam |
23:cc2c1d1ed159 | 252 | size_t default_value_len; |
Marc Nijdam |
23:cc2c1d1ed159 | 253 | //! The result status of the result handler |
Marc Nijdam |
23:cc2c1d1ed159 | 254 | enum config_poll_get_status status; |
Marc Nijdam |
23:cc2c1d1ed159 | 255 | }; |
Marc Nijdam |
23:cc2c1d1ed159 | 256 | |
Marc Nijdam |
23:cc2c1d1ed159 | 257 | |
Marc Nijdam |
23:cc2c1d1ed159 | 258 | static bool |
Marc Nijdam |
23:cc2c1d1ed159 | 259 | _poll_get_result_handler(void * handler_ctx, |
Marc Nijdam |
23:cc2c1d1ed159 | 260 | const char * key, |
Marc Nijdam |
23:cc2c1d1ed159 | 261 | enum helium_config_type value_type, |
Marc Nijdam |
23:cc2c1d1ed159 | 262 | void * value) |
Marc Nijdam |
23:cc2c1d1ed159 | 263 | { |
Marc Nijdam |
23:cc2c1d1ed159 | 264 | struct _poll_get_context * ctx = (struct _poll_get_context *)handler_ctx; |
Marc Nijdam |
23:cc2c1d1ed159 | 265 | size_t len = ctx->dest_len; |
Marc Nijdam |
23:cc2c1d1ed159 | 266 | void * src = value; |
Marc Nijdam |
23:cc2c1d1ed159 | 267 | |
Marc Nijdam |
23:cc2c1d1ed159 | 268 | if (strcmp(ctx->filter_key, key) != 0) |
Marc Nijdam |
23:cc2c1d1ed159 | 269 | { |
Marc Nijdam |
23:cc2c1d1ed159 | 270 | // Not the right key, keep going |
Marc Nijdam |
23:cc2c1d1ed159 | 271 | return true; |
Marc Nijdam |
23:cc2c1d1ed159 | 272 | } |
Marc Nijdam |
23:cc2c1d1ed159 | 273 | if (value_type == ctx->filter_type) |
Marc Nijdam |
23:cc2c1d1ed159 | 274 | { |
Marc Nijdam |
23:cc2c1d1ed159 | 275 | // Found and the right type |
Marc Nijdam |
23:cc2c1d1ed159 | 276 | // Use the given value and the destination buffer size |
Marc Nijdam |
23:cc2c1d1ed159 | 277 | ctx->status = config_status_POLL_FOUND; |
Marc Nijdam |
23:cc2c1d1ed159 | 278 | } |
Marc Nijdam |
23:cc2c1d1ed159 | 279 | else |
Marc Nijdam |
23:cc2c1d1ed159 | 280 | { |
Marc Nijdam |
23:cc2c1d1ed159 | 281 | // Found but not the right type, return an error |
Marc Nijdam |
23:cc2c1d1ed159 | 282 | ctx->status = config_status_POLL_ERR_TYPE; |
Marc Nijdam |
23:cc2c1d1ed159 | 283 | // And use the context's default |
Marc Nijdam |
23:cc2c1d1ed159 | 284 | value_type = ctx->filter_type; |
Marc Nijdam |
23:cc2c1d1ed159 | 285 | // Us the default value as the source |
Marc Nijdam |
23:cc2c1d1ed159 | 286 | src = ctx->default_value; |
Marc Nijdam |
23:cc2c1d1ed159 | 287 | // Check for a shorter default value length (only really valid for |
Marc Nijdam |
23:cc2c1d1ed159 | 288 | // strings) |
Marc Nijdam |
23:cc2c1d1ed159 | 289 | len = len > ctx->default_value_len ? ctx->default_value_len : len; |
Marc Nijdam |
23:cc2c1d1ed159 | 290 | } |
Marc Nijdam |
23:cc2c1d1ed159 | 291 | |
Marc Nijdam |
23:cc2c1d1ed159 | 292 | switch (value_type) |
Marc Nijdam |
23:cc2c1d1ed159 | 293 | { |
Marc Nijdam |
23:cc2c1d1ed159 | 294 | case helium_config_bool: |
Marc Nijdam |
23:cc2c1d1ed159 | 295 | case helium_config_f32: |
Marc Nijdam |
23:cc2c1d1ed159 | 296 | case helium_config_i32: |
Marc Nijdam |
23:cc2c1d1ed159 | 297 | case helium_config_str: |
Marc Nijdam |
23:cc2c1d1ed159 | 298 | break; |
Marc Nijdam |
23:cc2c1d1ed159 | 299 | case helium_config_null: |
Marc Nijdam |
23:cc2c1d1ed159 | 300 | ctx->status = config_status_POLL_FOUND_NULL; |
Marc Nijdam |
23:cc2c1d1ed159 | 301 | len = 0; |
Marc Nijdam |
23:cc2c1d1ed159 | 302 | break; |
Marc Nijdam |
23:cc2c1d1ed159 | 303 | } |
Marc Nijdam |
23:cc2c1d1ed159 | 304 | memcpy(ctx->dest, src, len); |
Marc Nijdam |
23:cc2c1d1ed159 | 305 | return false; |
Marc Nijdam |
23:cc2c1d1ed159 | 306 | } |
Marc Nijdam |
23:cc2c1d1ed159 | 307 | |
Marc Nijdam |
23:cc2c1d1ed159 | 308 | int |
Marc Nijdam |
23:cc2c1d1ed159 | 309 | Config::poll_get_result(uint16_t token, |
Marc Nijdam |
23:cc2c1d1ed159 | 310 | const char * config_key, |
Marc Nijdam |
23:cc2c1d1ed159 | 311 | helium_config_type config_type, |
Marc Nijdam |
23:cc2c1d1ed159 | 312 | void * value, |
Marc Nijdam |
23:cc2c1d1ed159 | 313 | size_t value_len, |
Marc Nijdam |
23:cc2c1d1ed159 | 314 | void * default_value, |
Marc Nijdam |
23:cc2c1d1ed159 | 315 | size_t default_value_len, |
Marc Nijdam |
23:cc2c1d1ed159 | 316 | int8_t * result, |
Marc Nijdam |
23:cc2c1d1ed159 | 317 | uint32_t retries) |
Marc Nijdam |
23:cc2c1d1ed159 | 318 | { |
Marc Nijdam |
23:cc2c1d1ed159 | 319 | struct _poll_get_context handler_ctx = { |
Marc Nijdam |
23:cc2c1d1ed159 | 320 | .filter_key = config_key, |
Marc Nijdam |
23:cc2c1d1ed159 | 321 | .filter_type = config_type, |
Marc Nijdam |
23:cc2c1d1ed159 | 322 | .dest = value, |
Marc Nijdam |
23:cc2c1d1ed159 | 323 | .dest_len = value_len, |
Marc Nijdam |
23:cc2c1d1ed159 | 324 | .default_value = default_value, |
Marc Nijdam |
23:cc2c1d1ed159 | 325 | .default_value_len = default_value_len, |
Marc Nijdam |
23:cc2c1d1ed159 | 326 | .status = config_status_POLL_FOUND_NULL, |
Marc Nijdam |
23:cc2c1d1ed159 | 327 | }; |
Marc Nijdam |
23:cc2c1d1ed159 | 328 | int status = helium_channel_config_get_poll_result(&_channel->helium->_ctx, |
Marc Nijdam |
23:cc2c1d1ed159 | 329 | token, |
Marc Nijdam |
23:cc2c1d1ed159 | 330 | _poll_get_result_handler, |
Marc Nijdam |
23:cc2c1d1ed159 | 331 | &handler_ctx, |
Marc Nijdam |
23:cc2c1d1ed159 | 332 | result, |
Marc Nijdam |
23:cc2c1d1ed159 | 333 | retries); |
Marc Nijdam |
23:cc2c1d1ed159 | 334 | if (helium_status_OK == status) |
Marc Nijdam |
23:cc2c1d1ed159 | 335 | { |
Marc Nijdam |
23:cc2c1d1ed159 | 336 | status = handler_ctx.status; |
Marc Nijdam |
23:cc2c1d1ed159 | 337 | } |
Marc Nijdam |
23:cc2c1d1ed159 | 338 | |
Marc Nijdam |
23:cc2c1d1ed159 | 339 | return status; |
Marc Nijdam |
23:cc2c1d1ed159 | 340 | } |
Marc Nijdam |
23:cc2c1d1ed159 | 341 | |
Marc Nijdam |
23:cc2c1d1ed159 | 342 | int |
Marc Nijdam |
23:cc2c1d1ed159 | 343 | Config::set(const char * config_key, |
Marc Nijdam |
23:cc2c1d1ed159 | 344 | helium_config_type config_type, |
Marc Nijdam |
23:cc2c1d1ed159 | 345 | void * value, |
Marc Nijdam |
23:cc2c1d1ed159 | 346 | uint16_t * token) |
Marc Nijdam |
23:cc2c1d1ed159 | 347 | { |
Marc Nijdam |
23:cc2c1d1ed159 | 348 | return helium_channel_config_set(&_channel->helium->_ctx, |
Marc Nijdam |
23:cc2c1d1ed159 | 349 | _channel->_channel_id, |
Marc Nijdam |
23:cc2c1d1ed159 | 350 | config_key, |
Marc Nijdam |
23:cc2c1d1ed159 | 351 | config_type, |
Marc Nijdam |
23:cc2c1d1ed159 | 352 | value, |
Marc Nijdam |
23:cc2c1d1ed159 | 353 | token); |
Marc Nijdam |
23:cc2c1d1ed159 | 354 | } |
Marc Nijdam |
23:cc2c1d1ed159 | 355 | |
Marc Nijdam |
23:cc2c1d1ed159 | 356 | int |
Marc Nijdam |
23:cc2c1d1ed159 | 357 | Config::poll_set_result(uint16_t token, int8_t * result, uint32_t retries) |
Marc Nijdam |
23:cc2c1d1ed159 | 358 | { |
Marc Nijdam |
23:cc2c1d1ed159 | 359 | return helium_channel_config_set_poll_result(&_channel->helium->_ctx, |
Marc Nijdam |
23:cc2c1d1ed159 | 360 | token, |
Marc Nijdam |
23:cc2c1d1ed159 | 361 | result, |
Marc Nijdam |
23:cc2c1d1ed159 | 362 | retries); |
Marc Nijdam |
23:cc2c1d1ed159 | 363 | } |
Marc Nijdam |
23:cc2c1d1ed159 | 364 | |
Marc Nijdam |
23:cc2c1d1ed159 | 365 | int |
Marc Nijdam |
23:cc2c1d1ed159 | 366 | Config::_set(const char * config_key, |
Marc Nijdam |
23:cc2c1d1ed159 | 367 | enum helium_config_type value_type, |
Marc Nijdam |
23:cc2c1d1ed159 | 368 | void * value, |
Marc Nijdam |
23:cc2c1d1ed159 | 369 | uint32_t retries) |
Marc Nijdam |
23:cc2c1d1ed159 | 370 | { |
Marc Nijdam |
23:cc2c1d1ed159 | 371 | uint16_t token; |
Marc Nijdam |
23:cc2c1d1ed159 | 372 | int status = set(config_key, value_type, value, &token); |
Marc Nijdam |
23:cc2c1d1ed159 | 373 | int8_t result = 0; |
Marc Nijdam |
23:cc2c1d1ed159 | 374 | if (helium_status_OK == status) |
Marc Nijdam |
23:cc2c1d1ed159 | 375 | { |
Marc Nijdam |
23:cc2c1d1ed159 | 376 | status = poll_set_result(token, &result, retries); |
Marc Nijdam |
23:cc2c1d1ed159 | 377 | } |
Marc Nijdam |
23:cc2c1d1ed159 | 378 | if (helium_status_OK == status && result != 0) |
Marc Nijdam |
23:cc2c1d1ed159 | 379 | { |
Marc Nijdam |
23:cc2c1d1ed159 | 380 | status = helium_status_ERR_COMMUNICATION; |
Marc Nijdam |
23:cc2c1d1ed159 | 381 | } |
Marc Nijdam |
23:cc2c1d1ed159 | 382 | return status; |
Marc Nijdam |
23:cc2c1d1ed159 | 383 | } |
Marc Nijdam |
23:cc2c1d1ed159 | 384 | |
Marc Nijdam |
23:cc2c1d1ed159 | 385 | bool |
Marc Nijdam |
23:cc2c1d1ed159 | 386 | Config::is_stale() |
Marc Nijdam |
23:cc2c1d1ed159 | 387 | { |
Marc Nijdam |
23:cc2c1d1ed159 | 388 | bool result = false; |
Marc Nijdam |
23:cc2c1d1ed159 | 389 | helium_channel_config_poll_invalidate(&_channel->helium->_ctx, |
Marc Nijdam |
23:cc2c1d1ed159 | 390 | _channel->_channel_id, |
Marc Nijdam |
23:cc2c1d1ed159 | 391 | &result, |
Marc Nijdam |
23:cc2c1d1ed159 | 392 | 0); |
Marc Nijdam |
23:cc2c1d1ed159 | 393 | return result; |
Marc Nijdam |
23:cc2c1d1ed159 | 394 | } |