XBee API mode library

Committer:
yamaguch
Date:
Wed Mar 20 00:28:27 2013 +0000
Revision:
16:cdfcb63b2c4b
Parent:
10:3da24a020e67
Child:
17:2f728fd13bc0
non rtos version

Who changed what in which revision?

UserRevisionLine numberNew contents of line
yamaguch 0:0232a97b3883 1 /*
yamaguch 8:776b8dc51932 2 Copyright (c) 2013, Senio Networks, Inc.
yamaguch 0:0232a97b3883 3
yamaguch 0:0232a97b3883 4 Permission is hereby granted, free of charge, to any person obtaining a copy
yamaguch 0:0232a97b3883 5 of this software and associated documentation files (the "Software"), to deal
yamaguch 0:0232a97b3883 6 in the Software without restriction, including without limitation the rights
yamaguch 0:0232a97b3883 7 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
yamaguch 0:0232a97b3883 8 copies of the Software, and to permit persons to whom the Software is
yamaguch 0:0232a97b3883 9 furnished to do so, subject to the following conditions:
yamaguch 0:0232a97b3883 10
yamaguch 0:0232a97b3883 11 The above copyright notice and this permission notice shall be included in
yamaguch 0:0232a97b3883 12 all copies or substantial portions of the Software.
yamaguch 0:0232a97b3883 13
yamaguch 0:0232a97b3883 14 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
yamaguch 0:0232a97b3883 15 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
yamaguch 0:0232a97b3883 16 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
yamaguch 0:0232a97b3883 17 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
yamaguch 0:0232a97b3883 18 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
yamaguch 0:0232a97b3883 19 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
yamaguch 0:0232a97b3883 20 THE SOFTWARE.
yamaguch 0:0232a97b3883 21 */
yamaguch 0:0232a97b3883 22
yamaguch 0:0232a97b3883 23 #include "XBee.h"
yamaguch 0:0232a97b3883 24 #include <stdarg.h>
yamaguch 0:0232a97b3883 25
yamaguch 16:cdfcb63b2c4b 26 #define LOCK() NVIC_DisableIRQ(UARTx_IRQn[_serial.index])
yamaguch 16:cdfcb63b2c4b 27 #define UNLOCK() NVIC_EnableIRQ(UARTx_IRQn[_serial.index])
yamaguch 16:cdfcb63b2c4b 28 const IRQn_Type UARTx_IRQn[] = {UART0_IRQn, UART1_IRQn, UART2_IRQn, UART3_IRQn};
yamaguch 16:cdfcb63b2c4b 29
yamaguch 0:0232a97b3883 30 void XBee::sendCommand(const char *command, int8_t param, bool queue) {
yamaguch 0:0232a97b3883 31 sendCommand(command, (uint64_t) param, queue);
yamaguch 0:0232a97b3883 32 }
yamaguch 0:0232a97b3883 33
yamaguch 0:0232a97b3883 34 void XBee::sendCommand(const char *command, int16_t param, bool queue) {
yamaguch 0:0232a97b3883 35 sendCommand(command, (uint64_t) param, queue);
yamaguch 0:0232a97b3883 36 }
yamaguch 0:0232a97b3883 37
yamaguch 0:0232a97b3883 38 void XBee::sendCommand(const char *command, int32_t param, bool queue) {
yamaguch 0:0232a97b3883 39 sendCommand(command, (uint64_t) param, queue);
yamaguch 0:0232a97b3883 40 }
yamaguch 0:0232a97b3883 41
yamaguch 0:0232a97b3883 42 void XBee::sendCommand(const char *command, int64_t param, bool queue) {
yamaguch 0:0232a97b3883 43 sendCommand(command, (uint64_t) param, queue);
yamaguch 0:0232a97b3883 44 }
yamaguch 0:0232a97b3883 45
yamaguch 0:0232a97b3883 46 void XBee::sendCommand(const char *command, uint8_t param, bool queue) {
yamaguch 0:0232a97b3883 47 sendCommand(command, (uint64_t) param, queue);
yamaguch 0:0232a97b3883 48 }
yamaguch 0:0232a97b3883 49
yamaguch 0:0232a97b3883 50 void XBee::sendCommand(const char *command, uint16_t param, bool queue) {
yamaguch 0:0232a97b3883 51 sendCommand(command, (uint64_t) param, queue);
yamaguch 0:0232a97b3883 52 }
yamaguch 0:0232a97b3883 53
yamaguch 0:0232a97b3883 54 void XBee::sendCommand(const char *command, uint32_t param, bool queue) {
yamaguch 0:0232a97b3883 55 sendCommand(command, (uint64_t) param, queue);
yamaguch 0:0232a97b3883 56 }
yamaguch 0:0232a97b3883 57
yamaguch 0:0232a97b3883 58 void XBee::sendCommand(const char *command, uint64_t param, bool queue) {
yamaguch 0:0232a97b3883 59 uint8_t param_buf[8] = {
yamaguch 0:0232a97b3883 60 (uint8_t) (param >> 56), (uint8_t) (param >> 48),
yamaguch 0:0232a97b3883 61 (uint8_t) (param >> 40), (uint8_t) (param >> 32),
yamaguch 0:0232a97b3883 62 (uint8_t) (param >> 24), (uint8_t) (param >> 16),
yamaguch 0:0232a97b3883 63 (uint8_t) (param >> 8), (uint8_t) param
yamaguch 0:0232a97b3883 64 };
yamaguch 0:0232a97b3883 65
yamaguch 0:0232a97b3883 66 int n = 0;
yamaguch 0:0232a97b3883 67 while (n < 7 && param_buf[n] == 0) n++;
yamaguch 0:0232a97b3883 68
yamaguch 0:0232a97b3883 69 sendCommand(command, param_buf + n, 8 - n, queue);
yamaguch 0:0232a97b3883 70 }
yamaguch 0:0232a97b3883 71
yamaguch 0:0232a97b3883 72 void XBee::sendCommand(const char *command, const char *param, bool queue) {
yamaguch 0:0232a97b3883 73 sendCommand(command, (uint8_t *) param, strlen(param), queue);
yamaguch 0:0232a97b3883 74 }
yamaguch 0:0232a97b3883 75
yamaguch 0:0232a97b3883 76 void XBee::sendCommand(const char *command, const uint8_t *param, int param_length, bool queue) {
yamaguch 0:0232a97b3883 77 char buf[param_length + 4];
yamaguch 0:0232a97b3883 78
yamaguch 0:0232a97b3883 79 createAtRequest(frame_id, command, param, param_length, queue, buf, sizeof(buf));
yamaguch 0:0232a97b3883 80 sendFrame(buf, param_length + 4);
yamaguch 0:0232a97b3883 81 frame_id = frame_id % 255 + 1;
yamaguch 0:0232a97b3883 82 }
yamaguch 0:0232a97b3883 83
yamaguch 0:0232a97b3883 84 void XBee::sendRemoteCommand(const char *command, int8_t param) {
yamaguch 0:0232a97b3883 85 sendRemoteCommand(command, (uint64_t) param);
yamaguch 0:0232a97b3883 86 }
yamaguch 0:0232a97b3883 87
yamaguch 0:0232a97b3883 88 void XBee::sendRemoteCommand(const char *command, int16_t param) {
yamaguch 0:0232a97b3883 89 sendRemoteCommand(command, (uint64_t) param);
yamaguch 0:0232a97b3883 90 }
yamaguch 0:0232a97b3883 91
yamaguch 0:0232a97b3883 92 void XBee::sendRemoteCommand(const char *command, int32_t param) {
yamaguch 0:0232a97b3883 93 sendRemoteCommand(command, (uint64_t) param);
yamaguch 0:0232a97b3883 94 }
yamaguch 0:0232a97b3883 95
yamaguch 0:0232a97b3883 96 void XBee::sendRemoteCommand(const char *command, int64_t param) {
yamaguch 0:0232a97b3883 97 sendRemoteCommand(command, (uint64_t) param);
yamaguch 0:0232a97b3883 98 }
yamaguch 0:0232a97b3883 99
yamaguch 0:0232a97b3883 100 void XBee::sendRemoteCommand(const char *command, uint8_t param) {
yamaguch 0:0232a97b3883 101 sendRemoteCommand(command, (uint64_t) param);
yamaguch 0:0232a97b3883 102 }
yamaguch 0:0232a97b3883 103
yamaguch 0:0232a97b3883 104 void XBee::sendRemoteCommand(const char *command, uint16_t param) {
yamaguch 0:0232a97b3883 105 sendRemoteCommand(command, (uint64_t) param);
yamaguch 0:0232a97b3883 106 }
yamaguch 0:0232a97b3883 107
yamaguch 0:0232a97b3883 108 void XBee::sendRemoteCommand(const char *command, uint32_t param) {
yamaguch 0:0232a97b3883 109 sendRemoteCommand(command, (uint64_t) param);
yamaguch 0:0232a97b3883 110 }
yamaguch 0:0232a97b3883 111
yamaguch 0:0232a97b3883 112 void XBee::sendRemoteCommand(const char *command, uint64_t param) {
yamaguch 0:0232a97b3883 113 uint8_t param_buf[8] = {
yamaguch 0:0232a97b3883 114 (uint8_t) (param >> 56), (uint8_t) (param >> 48),
yamaguch 0:0232a97b3883 115 (uint8_t) (param >> 40), (uint8_t) (param >> 32),
yamaguch 0:0232a97b3883 116 (uint8_t) (param >> 24), (uint8_t) (param >> 16),
yamaguch 0:0232a97b3883 117 (uint8_t) (param >> 8), (uint8_t) param
yamaguch 0:0232a97b3883 118 };
yamaguch 0:0232a97b3883 119
yamaguch 0:0232a97b3883 120 int n = 0;
yamaguch 0:0232a97b3883 121 while (n < 7 && param_buf[n] == 0) n++;
yamaguch 0:0232a97b3883 122
yamaguch 0:0232a97b3883 123 sendRemoteCommand(command, param_buf + n, 8 - n);
yamaguch 0:0232a97b3883 124 }
yamaguch 0:0232a97b3883 125
yamaguch 0:0232a97b3883 126 void XBee::sendRemoteCommand(const char *command, const char *param) {
yamaguch 0:0232a97b3883 127 sendRemoteCommand(command, (uint8_t *) param, strlen(param));
yamaguch 0:0232a97b3883 128 }
yamaguch 0:0232a97b3883 129
yamaguch 0:0232a97b3883 130 void XBee::sendRemoteCommand(const char *command, const uint8_t *param, int param_length, char options) {
yamaguch 0:0232a97b3883 131 char buf[param_length + 15];
yamaguch 0:0232a97b3883 132
yamaguch 0:0232a97b3883 133 createRemoteAtRequest(frame_id, command, param, param_length, options, buf, sizeof(buf));
yamaguch 0:0232a97b3883 134 sendFrame(buf, param_length + 15);
yamaguch 0:0232a97b3883 135 frame_id = frame_id % 255 + 1;
yamaguch 0:0232a97b3883 136 }
yamaguch 0:0232a97b3883 137
yamaguch 10:3da24a020e67 138 bool XBee::send(const char *data, int length) {
yamaguch 10:3da24a020e67 139 return send(data, length, sendConfirmation);
yamaguch 10:3da24a020e67 140 }
yamaguch 10:3da24a020e67 141
yamaguch 10:3da24a020e67 142 bool XBee::send(const char *data, int length, float timeout) {
yamaguch 0:0232a97b3883 143 if (length == 0)
yamaguch 0:0232a97b3883 144 length = strlen(data);
yamaguch 0:0232a97b3883 145
yamaguch 0:0232a97b3883 146 char buf[length + 14];
yamaguch 0:0232a97b3883 147
yamaguch 0:0232a97b3883 148 createTxRequest(frame_id, data, length, buf, sizeof(buf));
yamaguch 0:0232a97b3883 149 sendFrame(buf, length + 14);
yamaguch 3:8453df14bd30 150
yamaguch 16:cdfcb63b2c4b 151 bool ret = true;
yamaguch 10:3da24a020e67 152 if (timeout > 0) {
yamaguch 10:3da24a020e67 153 int index = seekFor(ZigBeeTransmitStatus, frame_id, timeout);
yamaguch 0:0232a97b3883 154 if (index != -1) {
yamaguch 0:0232a97b3883 155 char delivery;
yamaguch 0:0232a97b3883 156 scan(index, DeliveryStatus, &delivery);
yamaguch 16:cdfcb63b2c4b 157 this->buf[INDEX(index + 2)] = None;
yamaguch 16:cdfcb63b2c4b 158 //::printf("index = %02X, out = %02X, in = %02X\n", index, out, in);
yamaguch 16:cdfcb63b2c4b 159 if (index == out) {
yamaguch 16:cdfcb63b2c4b 160 LOCK();
yamaguch 16:cdfcb63b2c4b 161 int size = SIZE(this->buf, out);
yamaguch 16:cdfcb63b2c4b 162 out = INDEX(out + 2 + size);
yamaguch 16:cdfcb63b2c4b 163 free += (2 + size);
yamaguch 16:cdfcb63b2c4b 164 UNLOCK();
yamaguch 16:cdfcb63b2c4b 165 }
yamaguch 16:cdfcb63b2c4b 166 ret = (delivery == 0);
yamaguch 10:3da24a020e67 167 } else
yamaguch 16:cdfcb63b2c4b 168 ret = false;
yamaguch 0:0232a97b3883 169 }
yamaguch 16:cdfcb63b2c4b 170
yamaguch 16:cdfcb63b2c4b 171 frame_id = frame_id % 255 + 1;
yamaguch 16:cdfcb63b2c4b 172 return ret;
yamaguch 0:0232a97b3883 173 }
yamaguch 0:0232a97b3883 174
yamaguch 10:3da24a020e67 175 void XBee::setSendConfirmation(float sendConfirmation) {
yamaguch 10:3da24a020e67 176 this->sendConfirmation = sendConfirmation;
yamaguch 0:0232a97b3883 177 }
yamaguch 0:0232a97b3883 178
yamaguch 0:0232a97b3883 179 int XBee::printf(const char *format, ...) {
yamaguch 0:0232a97b3883 180 va_list argv;
yamaguch 0:0232a97b3883 181 va_start(argv, format);
yamaguch 0:0232a97b3883 182 char buf[256];
yamaguch 0:0232a97b3883 183 int length = vsnprintf(buf, sizeof buf, format, argv);
yamaguch 10:3da24a020e67 184 return length > 0 && send(buf, length) ? length : -1;
yamaguch 0:0232a97b3883 185 }
yamaguch 0:0232a97b3883 186
yamaguch 0:0232a97b3883 187 void XBee::send(char c) {
yamaguch 10:3da24a020e67 188 while (!writeable()) wait(0.001);
yamaguch 0:0232a97b3883 189 putc(c);
yamaguch 0:0232a97b3883 190 }
yamaguch 0:0232a97b3883 191
yamaguch 0:0232a97b3883 192 void XBee::send2(char c) {
yamaguch 0:0232a97b3883 193 switch (c) {
yamaguch 0:0232a97b3883 194 case 0x7E:
yamaguch 0:0232a97b3883 195 case 0x7D:
yamaguch 0:0232a97b3883 196 case 0x11:
yamaguch 0:0232a97b3883 197 case 0x13:
yamaguch 0:0232a97b3883 198 send(ESCAPE);
yamaguch 0:0232a97b3883 199 send(c ^ 0x20);
yamaguch 0:0232a97b3883 200 break;
yamaguch 0:0232a97b3883 201 default:
yamaguch 0:0232a97b3883 202 send(c);
yamaguch 0:0232a97b3883 203 }
yamaguch 0:0232a97b3883 204 }
yamaguch 0:0232a97b3883 205
yamaguch 0:0232a97b3883 206 void XBee::sendFrame(const char *frame, int length) {
yamaguch 0:0232a97b3883 207 char checksum = 255;
yamaguch 0:0232a97b3883 208
yamaguch 0:0232a97b3883 209 send(PREAMBLE);
yamaguch 0:0232a97b3883 210
yamaguch 0:0232a97b3883 211 if (apiMode == 2) {
yamaguch 0:0232a97b3883 212 send2((length >> 8) & 255);
yamaguch 0:0232a97b3883 213 send2(length & 255);
yamaguch 0:0232a97b3883 214 for (int i = 0; i < length; i++) {
yamaguch 0:0232a97b3883 215 send2(frame[i]);
yamaguch 0:0232a97b3883 216 checksum -= frame[i];
yamaguch 0:0232a97b3883 217 }
yamaguch 0:0232a97b3883 218 send2(checksum);
yamaguch 0:0232a97b3883 219 } else {
yamaguch 0:0232a97b3883 220 send((length >> 8) & 255);
yamaguch 0:0232a97b3883 221 send(length & 255);
yamaguch 0:0232a97b3883 222 for (int i = 0; i < length; i++) {
yamaguch 0:0232a97b3883 223 send(frame[i]);
yamaguch 0:0232a97b3883 224 checksum -= frame[i];
yamaguch 0:0232a97b3883 225 }
yamaguch 0:0232a97b3883 226 send(checksum);
yamaguch 0:0232a97b3883 227 }
yamaguch 0:0232a97b3883 228 }
yamaguch 0:0232a97b3883 229
yamaguch 0:0232a97b3883 230 int XBee::createTxRequest(char frame_id, const char *data, int data_length, char *buf, int buf_size) {
yamaguch 0:0232a97b3883 231 if (data_length + 14 > buf_size) return -1;
yamaguch 0:0232a97b3883 232
yamaguch 0:0232a97b3883 233 buf[0] = 0x10; // frame type
yamaguch 0:0232a97b3883 234 buf[1] = frame_id;
yamaguch 0:0232a97b3883 235 for (int i = 0; i < 8; i++) buf[i + 2] = destination64[i];
yamaguch 0:0232a97b3883 236 buf[10] = destination16[0]; // 16 bit dest address
yamaguch 0:0232a97b3883 237 buf[11] = destination16[1]; // 16 bit dest address
yamaguch 0:0232a97b3883 238 buf[12] = 0;
yamaguch 0:0232a97b3883 239 buf[13] = 0;
yamaguch 0:0232a97b3883 240 for (int i = 0; i < data_length; i++) buf[i + 14] = data[i];
yamaguch 0:0232a97b3883 241
yamaguch 0:0232a97b3883 242 return data_length + 14;
yamaguch 0:0232a97b3883 243 }
yamaguch 0:0232a97b3883 244
yamaguch 0:0232a97b3883 245 int XBee::createAtRequest(char frame_id, const char *command, const uint8_t *param, int param_length, bool queue, char *buf, int buf_size) {
yamaguch 0:0232a97b3883 246 if (param_length + 4 > buf_size) return -1;
yamaguch 0:0232a97b3883 247
yamaguch 0:0232a97b3883 248 buf[0] = queue ? 0x09 : 0x08; // frame type
yamaguch 0:0232a97b3883 249 buf[1] = frame_id;
yamaguch 0:0232a97b3883 250 buf[2] = command[0];
yamaguch 0:0232a97b3883 251 buf[3] = command[1];
yamaguch 0:0232a97b3883 252 for (int i = 0; i < param_length; i++) buf[i + 4] = param[i];
yamaguch 0:0232a97b3883 253
yamaguch 0:0232a97b3883 254 return param_length + 4;
yamaguch 0:0232a97b3883 255 }
yamaguch 0:0232a97b3883 256
yamaguch 0:0232a97b3883 257 int XBee::createRemoteAtRequest(char frame_id, const char *command, const uint8_t *param, int param_length, char options, char *buf, int buf_size) {
yamaguch 0:0232a97b3883 258 if (param_length + 4 > buf_size) return -1;
yamaguch 0:0232a97b3883 259
yamaguch 0:0232a97b3883 260 buf[0] = 0x17; // frame type
yamaguch 0:0232a97b3883 261 buf[1] = frame_id;
yamaguch 0:0232a97b3883 262 memcpy(buf + 2, destination64, 8);
yamaguch 0:0232a97b3883 263 buf[10] = destination16[0];
yamaguch 0:0232a97b3883 264 buf[11] = destination16[1];
yamaguch 0:0232a97b3883 265 buf[12] = options;
yamaguch 0:0232a97b3883 266 buf[13] = command[0];
yamaguch 0:0232a97b3883 267 buf[14] = command[1];
yamaguch 0:0232a97b3883 268 for (int i = 0; i < param_length; i++) buf[i + 15] = param[i];
yamaguch 0:0232a97b3883 269
yamaguch 0:0232a97b3883 270 return param_length + 15;
yamaguch 0:0232a97b3883 271 }