XBee API mode library

Committer:
yamaguch
Date:
Thu Sep 20 10:50:00 2012 +0000
Revision:
3:8453df14bd30
Parent:
0:0232a97b3883
Child:
8:776b8dc51932
fixed confirm transmit status bug

Who changed what in which revision?

UserRevisionLine numberNew contents of line
yamaguch 0:0232a97b3883 1 /*
yamaguch 0:0232a97b3883 2 Copyright (c) 2011, 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 0:0232a97b3883 26 void XBee::sendCommand(const char *command, int8_t param, bool queue) {
yamaguch 0:0232a97b3883 27 sendCommand(command, (uint64_t) param, queue);
yamaguch 0:0232a97b3883 28 }
yamaguch 0:0232a97b3883 29
yamaguch 0:0232a97b3883 30 void XBee::sendCommand(const char *command, int16_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, int32_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, int64_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, uint8_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, uint16_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, uint32_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, uint64_t param, bool queue) {
yamaguch 0:0232a97b3883 55 uint8_t param_buf[8] = {
yamaguch 0:0232a97b3883 56 (uint8_t) (param >> 56), (uint8_t) (param >> 48),
yamaguch 0:0232a97b3883 57 (uint8_t) (param >> 40), (uint8_t) (param >> 32),
yamaguch 0:0232a97b3883 58 (uint8_t) (param >> 24), (uint8_t) (param >> 16),
yamaguch 0:0232a97b3883 59 (uint8_t) (param >> 8), (uint8_t) param
yamaguch 0:0232a97b3883 60 };
yamaguch 0:0232a97b3883 61
yamaguch 0:0232a97b3883 62 int n = 0;
yamaguch 0:0232a97b3883 63 while (n < 7 && param_buf[n] == 0) n++;
yamaguch 0:0232a97b3883 64
yamaguch 0:0232a97b3883 65 sendCommand(command, param_buf + n, 8 - n, queue);
yamaguch 0:0232a97b3883 66 }
yamaguch 0:0232a97b3883 67
yamaguch 0:0232a97b3883 68 void XBee::sendCommand(const char *command, const char *param, bool queue) {
yamaguch 0:0232a97b3883 69 sendCommand(command, (uint8_t *) param, strlen(param), queue);
yamaguch 0:0232a97b3883 70 }
yamaguch 0:0232a97b3883 71
yamaguch 0:0232a97b3883 72 void XBee::sendCommand(const char *command, const uint8_t *param, int param_length, bool queue) {
yamaguch 0:0232a97b3883 73 char buf[param_length + 4];
yamaguch 0:0232a97b3883 74
yamaguch 0:0232a97b3883 75 createAtRequest(frame_id, command, param, param_length, queue, buf, sizeof(buf));
yamaguch 0:0232a97b3883 76 sendFrame(buf, param_length + 4);
yamaguch 0:0232a97b3883 77 frame_id = frame_id % 255 + 1;
yamaguch 0:0232a97b3883 78 }
yamaguch 0:0232a97b3883 79
yamaguch 0:0232a97b3883 80 void XBee::sendRemoteCommand(const char *command, int8_t param) {
yamaguch 0:0232a97b3883 81 sendRemoteCommand(command, (uint64_t) param);
yamaguch 0:0232a97b3883 82 }
yamaguch 0:0232a97b3883 83
yamaguch 0:0232a97b3883 84 void XBee::sendRemoteCommand(const char *command, int16_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, int32_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, int64_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, uint8_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, uint16_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, uint32_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, uint64_t param) {
yamaguch 0:0232a97b3883 109 uint8_t param_buf[8] = {
yamaguch 0:0232a97b3883 110 (uint8_t) (param >> 56), (uint8_t) (param >> 48),
yamaguch 0:0232a97b3883 111 (uint8_t) (param >> 40), (uint8_t) (param >> 32),
yamaguch 0:0232a97b3883 112 (uint8_t) (param >> 24), (uint8_t) (param >> 16),
yamaguch 0:0232a97b3883 113 (uint8_t) (param >> 8), (uint8_t) param
yamaguch 0:0232a97b3883 114 };
yamaguch 0:0232a97b3883 115
yamaguch 0:0232a97b3883 116 int n = 0;
yamaguch 0:0232a97b3883 117 while (n < 7 && param_buf[n] == 0) n++;
yamaguch 0:0232a97b3883 118
yamaguch 0:0232a97b3883 119 sendRemoteCommand(command, param_buf + n, 8 - n);
yamaguch 0:0232a97b3883 120 }
yamaguch 0:0232a97b3883 121
yamaguch 0:0232a97b3883 122 void XBee::sendRemoteCommand(const char *command, const char *param) {
yamaguch 0:0232a97b3883 123 sendRemoteCommand(command, (uint8_t *) param, strlen(param));
yamaguch 0:0232a97b3883 124 }
yamaguch 0:0232a97b3883 125
yamaguch 0:0232a97b3883 126 void XBee::sendRemoteCommand(const char *command, const uint8_t *param, int param_length, char options) {
yamaguch 0:0232a97b3883 127 char buf[param_length + 15];
yamaguch 0:0232a97b3883 128
yamaguch 0:0232a97b3883 129 createRemoteAtRequest(frame_id, command, param, param_length, options, buf, sizeof(buf));
yamaguch 0:0232a97b3883 130 sendFrame(buf, param_length + 15);
yamaguch 0:0232a97b3883 131 frame_id = frame_id % 255 + 1;
yamaguch 0:0232a97b3883 132 }
yamaguch 0:0232a97b3883 133
yamaguch 0:0232a97b3883 134 bool XBee::send(const char *data, int length, bool confirm = true) {
yamaguch 0:0232a97b3883 135 if (length == 0)
yamaguch 0:0232a97b3883 136 length = strlen(data);
yamaguch 0:0232a97b3883 137
yamaguch 0:0232a97b3883 138 char buf[length + 14];
yamaguch 0:0232a97b3883 139
yamaguch 0:0232a97b3883 140 createTxRequest(frame_id, data, length, buf, sizeof(buf));
yamaguch 0:0232a97b3883 141 sendFrame(buf, length + 14);
yamaguch 3:8453df14bd30 142
yamaguch 0:0232a97b3883 143 if (confirm) {
yamaguch 3:8453df14bd30 144 int index = seekFor(ZigBeeTransmitStatus, frame_id, 3.0);
yamaguch 0:0232a97b3883 145 if (index != -1) {
yamaguch 0:0232a97b3883 146 char delivery;
yamaguch 0:0232a97b3883 147 scan(index, DeliveryStatus, &delivery);
yamaguch 0:0232a97b3883 148 buf[INDEX(index + 2)] = 0x00;
yamaguch 3:8453df14bd30 149 frame_id = frame_id % 255 + 1;
yamaguch 3:8453df14bd30 150
yamaguch 0:0232a97b3883 151 return delivery == 0;
yamaguch 0:0232a97b3883 152 }
yamaguch 0:0232a97b3883 153 }
yamaguch 0:0232a97b3883 154
yamaguch 3:8453df14bd30 155 frame_id = frame_id % 255 + 1;
yamaguch 3:8453df14bd30 156
yamaguch 0:0232a97b3883 157 return false;
yamaguch 0:0232a97b3883 158 }
yamaguch 0:0232a97b3883 159
yamaguch 0:0232a97b3883 160 bool XBee::sendConfirm(const char *data, int length) {
yamaguch 0:0232a97b3883 161 return send(data, length, true);
yamaguch 0:0232a97b3883 162 }
yamaguch 0:0232a97b3883 163
yamaguch 0:0232a97b3883 164 int XBee::printf(const char *format, ...) {
yamaguch 0:0232a97b3883 165 va_list argv;
yamaguch 0:0232a97b3883 166 va_start(argv, format);
yamaguch 0:0232a97b3883 167 char buf[256];
yamaguch 0:0232a97b3883 168 int length = vsnprintf(buf, sizeof buf, format, argv);
yamaguch 0:0232a97b3883 169 return length > 0 && sendConfirm(buf, length) ? length : -1;
yamaguch 0:0232a97b3883 170 }
yamaguch 0:0232a97b3883 171
yamaguch 0:0232a97b3883 172 void XBee::send(char c) {
yamaguch 0:0232a97b3883 173 while (!writeable()) wait_us(100);
yamaguch 0:0232a97b3883 174 putc(c);
yamaguch 0:0232a97b3883 175 }
yamaguch 0:0232a97b3883 176
yamaguch 0:0232a97b3883 177 void XBee::send2(char c) {
yamaguch 0:0232a97b3883 178 switch (c) {
yamaguch 0:0232a97b3883 179 case 0x7E:
yamaguch 0:0232a97b3883 180 case 0x7D:
yamaguch 0:0232a97b3883 181 case 0x11:
yamaguch 0:0232a97b3883 182 case 0x13:
yamaguch 0:0232a97b3883 183 send(ESCAPE);
yamaguch 0:0232a97b3883 184 send(c ^ 0x20);
yamaguch 0:0232a97b3883 185 break;
yamaguch 0:0232a97b3883 186 default:
yamaguch 0:0232a97b3883 187 send(c);
yamaguch 0:0232a97b3883 188 }
yamaguch 0:0232a97b3883 189 }
yamaguch 0:0232a97b3883 190
yamaguch 0:0232a97b3883 191 void XBee::sendFrame(const char *frame, int length) {
yamaguch 0:0232a97b3883 192 char checksum = 255;
yamaguch 0:0232a97b3883 193 if (debug) leds = leds | 8; //**LEDS=1xxx
yamaguch 0:0232a97b3883 194
yamaguch 0:0232a97b3883 195 send(PREAMBLE);
yamaguch 0:0232a97b3883 196
yamaguch 0:0232a97b3883 197 if (apiMode == 2) {
yamaguch 0:0232a97b3883 198 send2((length >> 8) & 255);
yamaguch 0:0232a97b3883 199 send2(length & 255);
yamaguch 0:0232a97b3883 200 for (int i = 0; i < length; i++) {
yamaguch 0:0232a97b3883 201 send2(frame[i]);
yamaguch 0:0232a97b3883 202 checksum -= frame[i];
yamaguch 0:0232a97b3883 203 }
yamaguch 0:0232a97b3883 204 send2(checksum);
yamaguch 0:0232a97b3883 205 } else {
yamaguch 0:0232a97b3883 206 send((length >> 8) & 255);
yamaguch 0:0232a97b3883 207 send(length & 255);
yamaguch 0:0232a97b3883 208 for (int i = 0; i < length; i++) {
yamaguch 0:0232a97b3883 209 send(frame[i]);
yamaguch 0:0232a97b3883 210 checksum -= frame[i];
yamaguch 0:0232a97b3883 211 }
yamaguch 0:0232a97b3883 212 send(checksum);
yamaguch 0:0232a97b3883 213 }
yamaguch 0:0232a97b3883 214 if (debug) leds = leds & 7; //**LEDS=0xxx
yamaguch 0:0232a97b3883 215 }
yamaguch 0:0232a97b3883 216
yamaguch 0:0232a97b3883 217 int XBee::createTxRequest(char frame_id, const char *data, int data_length, char *buf, int buf_size) {
yamaguch 0:0232a97b3883 218 if (data_length + 14 > buf_size) return -1;
yamaguch 0:0232a97b3883 219
yamaguch 0:0232a97b3883 220 buf[0] = 0x10; // frame type
yamaguch 0:0232a97b3883 221 buf[1] = frame_id;
yamaguch 0:0232a97b3883 222 for (int i = 0; i < 8; i++) buf[i + 2] = destination64[i];
yamaguch 0:0232a97b3883 223 buf[10] = destination16[0]; // 16 bit dest address
yamaguch 0:0232a97b3883 224 buf[11] = destination16[1]; // 16 bit dest address
yamaguch 0:0232a97b3883 225 buf[12] = 0;
yamaguch 0:0232a97b3883 226 buf[13] = 0;
yamaguch 0:0232a97b3883 227 for (int i = 0; i < data_length; i++) buf[i + 14] = data[i];
yamaguch 0:0232a97b3883 228
yamaguch 0:0232a97b3883 229 return data_length + 14;
yamaguch 0:0232a97b3883 230 }
yamaguch 0:0232a97b3883 231
yamaguch 0:0232a97b3883 232 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 233 if (param_length + 4 > buf_size) return -1;
yamaguch 0:0232a97b3883 234
yamaguch 0:0232a97b3883 235 buf[0] = queue ? 0x09 : 0x08; // frame type
yamaguch 0:0232a97b3883 236 buf[1] = frame_id;
yamaguch 0:0232a97b3883 237 buf[2] = command[0];
yamaguch 0:0232a97b3883 238 buf[3] = command[1];
yamaguch 0:0232a97b3883 239 for (int i = 0; i < param_length; i++) buf[i + 4] = param[i];
yamaguch 0:0232a97b3883 240
yamaguch 0:0232a97b3883 241 return param_length + 4;
yamaguch 0:0232a97b3883 242 }
yamaguch 0:0232a97b3883 243
yamaguch 0:0232a97b3883 244 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 245 if (param_length + 4 > buf_size) return -1;
yamaguch 0:0232a97b3883 246
yamaguch 0:0232a97b3883 247 buf[0] = 0x17; // frame type
yamaguch 0:0232a97b3883 248 buf[1] = frame_id;
yamaguch 0:0232a97b3883 249 memcpy(buf + 2, destination64, 8);
yamaguch 0:0232a97b3883 250 buf[10] = destination16[0];
yamaguch 0:0232a97b3883 251 buf[11] = destination16[1];
yamaguch 0:0232a97b3883 252 buf[12] = options;
yamaguch 0:0232a97b3883 253 buf[13] = command[0];
yamaguch 0:0232a97b3883 254 buf[14] = command[1];
yamaguch 0:0232a97b3883 255 for (int i = 0; i < param_length; i++) buf[i + 15] = param[i];
yamaguch 0:0232a97b3883 256
yamaguch 0:0232a97b3883 257 return param_length + 15;
yamaguch 0:0232a97b3883 258 }