Helium / helium
Committer:
Marc Nijdam
Date:
Wed Jul 05 09:20:25 2017 -0700
Revision:
7:e6743e01b7cb
This updates Helium to work on mbed using interrupt handlers for serial reading

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Marc Nijdam 7:e6743e01b7cb 1 /*
Marc Nijdam 7:e6743e01b7cb 2 * Copyright 2017, Helium Systems, Inc.
Marc Nijdam 7:e6743e01b7cb 3 * All Rights Reserved. See LICENCE.txt for license information
Marc Nijdam 7:e6743e01b7cb 4 */
Marc Nijdam 7:e6743e01b7cb 5
Marc Nijdam 7:e6743e01b7cb 6 #include "Helium.h"
Marc Nijdam 7:e6743e01b7cb 7 #include "helium-client/helium-client.h"
Marc Nijdam 7:e6743e01b7cb 8
Marc Nijdam 7:e6743e01b7cb 9 bool
Marc Nijdam 7:e6743e01b7cb 10 helium_serial_readable(void * param)
Marc Nijdam 7:e6743e01b7cb 11 {
Marc Nijdam 7:e6743e01b7cb 12 Helium * helium = (Helium *)param;
Marc Nijdam 7:e6743e01b7cb 13 return helium->serial.readable();
Marc Nijdam 7:e6743e01b7cb 14 }
Marc Nijdam 7:e6743e01b7cb 15
Marc Nijdam 7:e6743e01b7cb 16 bool
Marc Nijdam 7:e6743e01b7cb 17 helium_serial_getc(void * param, uint8_t * ch)
Marc Nijdam 7:e6743e01b7cb 18 {
Marc Nijdam 7:e6743e01b7cb 19 Helium * helium = (Helium *)param;
Marc Nijdam 7:e6743e01b7cb 20 int val = helium->serial.getc();
Marc Nijdam 7:e6743e01b7cb 21 *ch = val;
Marc Nijdam 7:e6743e01b7cb 22 return val >= 0;
Marc Nijdam 7:e6743e01b7cb 23 }
Marc Nijdam 7:e6743e01b7cb 24
Marc Nijdam 7:e6743e01b7cb 25 bool
Marc Nijdam 7:e6743e01b7cb 26 helium_serial_putc(void * param, uint8_t ch)
Marc Nijdam 7:e6743e01b7cb 27 {
Marc Nijdam 7:e6743e01b7cb 28 Helium * helium = (Helium *)param;
Marc Nijdam 7:e6743e01b7cb 29 helium->serial.putc(ch);
Marc Nijdam 7:e6743e01b7cb 30 return true;
Marc Nijdam 7:e6743e01b7cb 31 }
Marc Nijdam 7:e6743e01b7cb 32
Marc Nijdam 7:e6743e01b7cb 33 void
Marc Nijdam 7:e6743e01b7cb 34 helium_wait_us(void * param, uint32_t us)
Marc Nijdam 7:e6743e01b7cb 35 {
Marc Nijdam 7:e6743e01b7cb 36 (void)param;
Marc Nijdam 7:e6743e01b7cb 37 wait_us(us);
Marc Nijdam 7:e6743e01b7cb 38 }
Marc Nijdam 7:e6743e01b7cb 39
Marc Nijdam 7:e6743e01b7cb 40 Helium::Helium(PinName tx, PinName rx) : serial(tx, rx)
Marc Nijdam 7:e6743e01b7cb 41 {
Marc Nijdam 7:e6743e01b7cb 42 helium_init(&_ctx, (void *)this);
Marc Nijdam 7:e6743e01b7cb 43 }
Marc Nijdam 7:e6743e01b7cb 44
Marc Nijdam 7:e6743e01b7cb 45
Marc Nijdam 7:e6743e01b7cb 46 int
Marc Nijdam 7:e6743e01b7cb 47 Helium::baud(enum helium_baud baud)
Marc Nijdam 7:e6743e01b7cb 48 {
Marc Nijdam 7:e6743e01b7cb 49 int result = helium_baud(&_ctx, baud);
Marc Nijdam 7:e6743e01b7cb 50
Marc Nijdam 7:e6743e01b7cb 51 uint32_t serial_baud = 9600;
Marc Nijdam 7:e6743e01b7cb 52 switch (baud)
Marc Nijdam 7:e6743e01b7cb 53 {
Marc Nijdam 7:e6743e01b7cb 54 case helium_baud_b9600:
Marc Nijdam 7:e6743e01b7cb 55 serial_baud = 9600;
Marc Nijdam 7:e6743e01b7cb 56 break;
Marc Nijdam 7:e6743e01b7cb 57 case helium_baud_b14400:
Marc Nijdam 7:e6743e01b7cb 58 serial_baud = 14400;
Marc Nijdam 7:e6743e01b7cb 59 break;
Marc Nijdam 7:e6743e01b7cb 60 case helium_baud_b19200:
Marc Nijdam 7:e6743e01b7cb 61 serial_baud = 19200;
Marc Nijdam 7:e6743e01b7cb 62 break;
Marc Nijdam 7:e6743e01b7cb 63 case helium_baud_b38400:
Marc Nijdam 7:e6743e01b7cb 64 serial_baud = 38400;
Marc Nijdam 7:e6743e01b7cb 65 break;
Marc Nijdam 7:e6743e01b7cb 66 case helium_baud_b57600:
Marc Nijdam 7:e6743e01b7cb 67 serial_baud = 57600;
Marc Nijdam 7:e6743e01b7cb 68 break;
Marc Nijdam 7:e6743e01b7cb 69 case helium_baud_b115200:
Marc Nijdam 7:e6743e01b7cb 70 serial_baud = 115200;
Marc Nijdam 7:e6743e01b7cb 71 break;
Marc Nijdam 7:e6743e01b7cb 72 }
Marc Nijdam 7:e6743e01b7cb 73 serial.baud(serial_baud);
Marc Nijdam 7:e6743e01b7cb 74 return result;
Marc Nijdam 7:e6743e01b7cb 75 }
Marc Nijdam 7:e6743e01b7cb 76
Marc Nijdam 7:e6743e01b7cb 77 int
Marc Nijdam 7:e6743e01b7cb 78 Helium::info(struct helium_info * info)
Marc Nijdam 7:e6743e01b7cb 79 {
Marc Nijdam 7:e6743e01b7cb 80 int status = helium_info(&_ctx, info);
Marc Nijdam 7:e6743e01b7cb 81 return status;
Marc Nijdam 7:e6743e01b7cb 82 }
Marc Nijdam 7:e6743e01b7cb 83
Marc Nijdam 7:e6743e01b7cb 84 int
Marc Nijdam 7:e6743e01b7cb 85 Helium::connect(struct connection * connection, uint32_t retries)
Marc Nijdam 7:e6743e01b7cb 86 {
Marc Nijdam 7:e6743e01b7cb 87 return helium_connect(&_ctx, connection, retries);
Marc Nijdam 7:e6743e01b7cb 88 }
Marc Nijdam 7:e6743e01b7cb 89
Marc Nijdam 7:e6743e01b7cb 90
Marc Nijdam 7:e6743e01b7cb 91 bool
Marc Nijdam 7:e6743e01b7cb 92 Helium::connected()
Marc Nijdam 7:e6743e01b7cb 93 {
Marc Nijdam 7:e6743e01b7cb 94 return helium_connected(&_ctx) == helium_connected_CONNECTED;
Marc Nijdam 7:e6743e01b7cb 95 }
Marc Nijdam 7:e6743e01b7cb 96
Marc Nijdam 7:e6743e01b7cb 97 int
Marc Nijdam 7:e6743e01b7cb 98 Helium::sleep(struct connection * connection)
Marc Nijdam 7:e6743e01b7cb 99 {
Marc Nijdam 7:e6743e01b7cb 100 return helium_sleep(&_ctx, connection);
Marc Nijdam 7:e6743e01b7cb 101 }
Marc Nijdam 7:e6743e01b7cb 102
Marc Nijdam 7:e6743e01b7cb 103 //
Marc Nijdam 7:e6743e01b7cb 104 // Channel
Marc Nijdam 7:e6743e01b7cb 105 //
Marc Nijdam 7:e6743e01b7cb 106
Marc Nijdam 7:e6743e01b7cb 107 Channel::Channel(Helium * helium)
Marc Nijdam 7:e6743e01b7cb 108 {
Marc Nijdam 7:e6743e01b7cb 109 _helium = helium;
Marc Nijdam 7:e6743e01b7cb 110 }
Marc Nijdam 7:e6743e01b7cb 111
Marc Nijdam 7:e6743e01b7cb 112 int
Marc Nijdam 7:e6743e01b7cb 113 Channel::begin(const char * name, uint16_t * token)
Marc Nijdam 7:e6743e01b7cb 114 {
Marc Nijdam 7:e6743e01b7cb 115 return helium_channel_create(&_helium->_ctx, name, strlen(name), token);
Marc Nijdam 7:e6743e01b7cb 116 }
Marc Nijdam 7:e6743e01b7cb 117
Marc Nijdam 7:e6743e01b7cb 118 int
Marc Nijdam 7:e6743e01b7cb 119 Channel::begin(const char * name, int8_t * result)
Marc Nijdam 7:e6743e01b7cb 120 {
Marc Nijdam 7:e6743e01b7cb 121 uint16_t token;
Marc Nijdam 7:e6743e01b7cb 122 int status = begin(name, &token);
Marc Nijdam 7:e6743e01b7cb 123 _channel_id = -1;
Marc Nijdam 7:e6743e01b7cb 124 if (helium_status_OK == status)
Marc Nijdam 7:e6743e01b7cb 125 {
Marc Nijdam 7:e6743e01b7cb 126 status = poll(token, &_channel_id, HELIUM_POLL_RETRIES_5S);
Marc Nijdam 7:e6743e01b7cb 127 }
Marc Nijdam 7:e6743e01b7cb 128
Marc Nijdam 7:e6743e01b7cb 129 if (result)
Marc Nijdam 7:e6743e01b7cb 130 {
Marc Nijdam 7:e6743e01b7cb 131 *result =
Marc Nijdam 7:e6743e01b7cb 132 status == helium_status_OK && _channel_id > 0 ? 0 : _channel_id;
Marc Nijdam 7:e6743e01b7cb 133 }
Marc Nijdam 7:e6743e01b7cb 134
Marc Nijdam 7:e6743e01b7cb 135 return status;
Marc Nijdam 7:e6743e01b7cb 136 }
Marc Nijdam 7:e6743e01b7cb 137
Marc Nijdam 7:e6743e01b7cb 138 int
Marc Nijdam 7:e6743e01b7cb 139 Channel::send(void const * data, size_t len, uint16_t * token)
Marc Nijdam 7:e6743e01b7cb 140 {
Marc Nijdam 7:e6743e01b7cb 141 return helium_channel_send(&_helium->_ctx, _channel_id, data, len, token);
Marc Nijdam 7:e6743e01b7cb 142 }
Marc Nijdam 7:e6743e01b7cb 143
Marc Nijdam 7:e6743e01b7cb 144
Marc Nijdam 7:e6743e01b7cb 145 int
Marc Nijdam 7:e6743e01b7cb 146 Channel::send(void const * data, size_t len, int8_t * result)
Marc Nijdam 7:e6743e01b7cb 147 {
Marc Nijdam 7:e6743e01b7cb 148 uint16_t token;
Marc Nijdam 7:e6743e01b7cb 149 int status = send(data, len, &token);
Marc Nijdam 7:e6743e01b7cb 150 if (helium_status_OK == status)
Marc Nijdam 7:e6743e01b7cb 151 {
Marc Nijdam 7:e6743e01b7cb 152 status = poll(token, result, HELIUM_POLL_RETRIES_5S);
Marc Nijdam 7:e6743e01b7cb 153 }
Marc Nijdam 7:e6743e01b7cb 154 return status;
Marc Nijdam 7:e6743e01b7cb 155 }
Marc Nijdam 7:e6743e01b7cb 156
Marc Nijdam 7:e6743e01b7cb 157 int
Marc Nijdam 7:e6743e01b7cb 158 Channel::poll(uint16_t token, int8_t * result, uint32_t retries)
Marc Nijdam 7:e6743e01b7cb 159 {
Marc Nijdam 7:e6743e01b7cb 160 return helium_channel_poll_result(&_helium->_ctx, token, result, retries);
Marc Nijdam 7:e6743e01b7cb 161 }