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
Add configuration API support

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Marc Nijdam 23:cc2c1d1ed159 1 /*
Marc Nijdam 23:cc2c1d1ed159 2 * Copyright 2017, Helium Systems, Inc.
Marc Nijdam 23:cc2c1d1ed159 3 * All Rights Reserved. See LICENCE.txt for license information
Marc Nijdam 23:cc2c1d1ed159 4 */
Marc Nijdam 23:cc2c1d1ed159 5
Marc Nijdam 23:cc2c1d1ed159 6 #include "mbed.h"
Marc Nijdam 23:cc2c1d1ed159 7 #include "HeliumUtil.h"
Marc Nijdam 23:cc2c1d1ed159 8
Marc Nijdam 23:cc2c1d1ed159 9 int
Marc Nijdam 23:cc2c1d1ed159 10 report_status(int status, int result)
Marc Nijdam 23:cc2c1d1ed159 11 {
Marc Nijdam 23:cc2c1d1ed159 12 if (helium_status_OK == status)
Marc Nijdam 23:cc2c1d1ed159 13 {
Marc Nijdam 23:cc2c1d1ed159 14 if (result == 0)
Marc Nijdam 23:cc2c1d1ed159 15 {
Marc Nijdam 23:cc2c1d1ed159 16 DBG_PRINTF("Succeeded\n");
Marc Nijdam 23:cc2c1d1ed159 17 }
Marc Nijdam 23:cc2c1d1ed159 18 else
Marc Nijdam 23:cc2c1d1ed159 19 {
Marc Nijdam 23:cc2c1d1ed159 20 DBG_PRINTF("Failed - %d\n", result);
Marc Nijdam 23:cc2c1d1ed159 21 }
Marc Nijdam 23:cc2c1d1ed159 22 }
Marc Nijdam 23:cc2c1d1ed159 23 else
Marc Nijdam 23:cc2c1d1ed159 24 {
Marc Nijdam 23:cc2c1d1ed159 25 DBG_PRINTF("Failed\n");
Marc Nijdam 23:cc2c1d1ed159 26 }
Marc Nijdam 23:cc2c1d1ed159 27 return status;
Marc Nijdam 23:cc2c1d1ed159 28 }
Marc Nijdam 23:cc2c1d1ed159 29
Marc Nijdam 23:cc2c1d1ed159 30
Marc Nijdam 23:cc2c1d1ed159 31 void
Marc Nijdam 23:cc2c1d1ed159 32 helium_connect(Helium * helium)
Marc Nijdam 23:cc2c1d1ed159 33 {
Marc Nijdam 23:cc2c1d1ed159 34 while (!helium->connected())
Marc Nijdam 23:cc2c1d1ed159 35 {
Marc Nijdam 23:cc2c1d1ed159 36 DBG_PRINTF("Connecting - ");
Marc Nijdam 23:cc2c1d1ed159 37 int status = helium->connect();
Marc Nijdam 23:cc2c1d1ed159 38 if (report_status(status) != helium_status_OK)
Marc Nijdam 23:cc2c1d1ed159 39 {
Marc Nijdam 23:cc2c1d1ed159 40 wait_ms(1000);
Marc Nijdam 23:cc2c1d1ed159 41 }
Marc Nijdam 23:cc2c1d1ed159 42 }
Marc Nijdam 23:cc2c1d1ed159 43 }
Marc Nijdam 23:cc2c1d1ed159 44
Marc Nijdam 23:cc2c1d1ed159 45 void
Marc Nijdam 23:cc2c1d1ed159 46 channel_create(Channel * channel, const char * channel_name)
Marc Nijdam 23:cc2c1d1ed159 47 {
Marc Nijdam 23:cc2c1d1ed159 48 int8_t result;
Marc Nijdam 23:cc2c1d1ed159 49 int status;
Marc Nijdam 23:cc2c1d1ed159 50 do
Marc Nijdam 23:cc2c1d1ed159 51 {
Marc Nijdam 23:cc2c1d1ed159 52 // Ensure we're connected
Marc Nijdam 23:cc2c1d1ed159 53 helium_connect(channel->helium);
Marc Nijdam 23:cc2c1d1ed159 54 DBG_PRINTF("Creating Channel - ");
Marc Nijdam 23:cc2c1d1ed159 55 status = channel->begin(channel_name, &result);
Marc Nijdam 23:cc2c1d1ed159 56 // Print status and result
Marc Nijdam 23:cc2c1d1ed159 57 if (report_status(status, result) != helium_status_OK)
Marc Nijdam 23:cc2c1d1ed159 58 {
Marc Nijdam 23:cc2c1d1ed159 59 wait_ms(1000);
Marc Nijdam 23:cc2c1d1ed159 60 }
Marc Nijdam 23:cc2c1d1ed159 61 } while (helium_status_OK != status || result != 0);
Marc Nijdam 23:cc2c1d1ed159 62 }
Marc Nijdam 23:cc2c1d1ed159 63
Marc Nijdam 23:cc2c1d1ed159 64 void
Marc Nijdam 23:cc2c1d1ed159 65 channel_send(Channel * channel,
Marc Nijdam 23:cc2c1d1ed159 66 const char * channel_name,
Marc Nijdam 23:cc2c1d1ed159 67 void const * data,
Marc Nijdam 23:cc2c1d1ed159 68 size_t len)
Marc Nijdam 23:cc2c1d1ed159 69 {
Marc Nijdam 23:cc2c1d1ed159 70 int status;
Marc Nijdam 23:cc2c1d1ed159 71 int8_t result;
Marc Nijdam 23:cc2c1d1ed159 72
Marc Nijdam 23:cc2c1d1ed159 73 do
Marc Nijdam 23:cc2c1d1ed159 74 {
Marc Nijdam 23:cc2c1d1ed159 75 // Try to send
Marc Nijdam 23:cc2c1d1ed159 76 DBG_PRINTF("Sending - ");
Marc Nijdam 23:cc2c1d1ed159 77 status = channel->send(data, len, &result);
Marc Nijdam 23:cc2c1d1ed159 78 report_status(status, result);
Marc Nijdam 23:cc2c1d1ed159 79 // Create the channel if any service errors are returned
Marc Nijdam 23:cc2c1d1ed159 80 if (status == helium_status_OK && result != 0)
Marc Nijdam 23:cc2c1d1ed159 81 {
Marc Nijdam 23:cc2c1d1ed159 82 channel_create(channel, channel_name);
Marc Nijdam 23:cc2c1d1ed159 83 }
Marc Nijdam 23:cc2c1d1ed159 84 else if (status != helium_status_OK)
Marc Nijdam 23:cc2c1d1ed159 85 {
Marc Nijdam 23:cc2c1d1ed159 86 wait_ms(1000);
Marc Nijdam 23:cc2c1d1ed159 87 }
Marc Nijdam 23:cc2c1d1ed159 88 } while (helium_status_OK != status || result != 0);
Marc Nijdam 23:cc2c1d1ed159 89 }