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:
Tue Sep 05 13:56:03 2017 -0700
Revision:
23:cc2c1d1ed159
Parent:
20:d55e9eb828d4
Add configuration API support

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 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 }