Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
src/Helium.cpp@7:e6743e01b7cb, 2017-07-05 (annotated)
- 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?
| User | Revision | Line number | New 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 | } |