Hiroshi Yamaguchi / XBee 1.0
Committer:
yamaguch
Date:
Thu Apr 12 10:20:17 2012 +0000
Revision:
3:48f7780963e2
Parent:
0:ea8459db49ef
1.0

Who changed what in which revision?

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