XBee API mode library

Committer:
yamaguch
Date:
Thu Jul 26 10:33:11 2012 +0000
Revision:
0:0232a97b3883
Child:
3:8453df14bd30
[mbed] converted /XBeeExamples/XBee

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
yamaguch 0:0232a97b3883 25 #define disableIRQ() NVIC_DisableIRQ(UARTx_IRQn[_uidx])
yamaguch 0:0232a97b3883 26 #define enableIRQ() NVIC_EnableIRQ(UARTx_IRQn[_uidx])
yamaguch 0:0232a97b3883 27
yamaguch 0:0232a97b3883 28 const IRQn_Type UARTx_IRQn[] = {UART0_IRQn, UART1_IRQn, UART2_IRQn, UART3_IRQn};
yamaguch 0:0232a97b3883 29
yamaguch 0:0232a97b3883 30 XBee::FrameType XBee::receive(float timeout) {
yamaguch 0:0232a97b3883 31 flush();
yamaguch 0:0232a97b3883 32 while (true) {
yamaguch 0:0232a97b3883 33 disableIRQ();
yamaguch 0:0232a97b3883 34 if (out != in || free == 0) {
yamaguch 0:0232a97b3883 35 FrameType type = getFrameType(buf[INDEX(out + 2)]);
yamaguch 0:0232a97b3883 36 if (type != None) {
yamaguch 0:0232a97b3883 37 received = out;
yamaguch 0:0232a97b3883 38 enableIRQ();
yamaguch 0:0232a97b3883 39 return type;
yamaguch 0:0232a97b3883 40 }
yamaguch 0:0232a97b3883 41 int size = SIZE(buf, out);
yamaguch 0:0232a97b3883 42 out = INDEX(out + 2 + size);
yamaguch 0:0232a97b3883 43 free += (2 + size);
yamaguch 0:0232a97b3883 44 enableIRQ();
yamaguch 0:0232a97b3883 45 continue;
yamaguch 0:0232a97b3883 46 } else if (timeout <= 0) {
yamaguch 0:0232a97b3883 47 enableIRQ();
yamaguch 0:0232a97b3883 48 return None;
yamaguch 0:0232a97b3883 49 }
yamaguch 0:0232a97b3883 50 enableIRQ();
yamaguch 0:0232a97b3883 51 wait(0.001);
yamaguch 0:0232a97b3883 52 timeout -= 0.001;
yamaguch 0:0232a97b3883 53 }
yamaguch 0:0232a97b3883 54 }
yamaguch 0:0232a97b3883 55
yamaguch 0:0232a97b3883 56 /*
yamaguch 0:0232a97b3883 57 * function seekFor() -
yamaguch 0:0232a97b3883 58 *
yamaguch 0:0232a97b3883 59 * searches buf[] in range between the index out and in for a specified frametype packet.
yamaguch 0:0232a97b3883 60 * if the frame is found before timeout, returns the index of the packet, otherwise -1.
yamaguch 0:0232a97b3883 61 *
yamaguch 0:0232a97b3883 62 */
yamaguch 0:0232a97b3883 63 int XBee::seekFor(FrameType type, float timeout) {
yamaguch 0:0232a97b3883 64 int index = out;
yamaguch 0:0232a97b3883 65 while (true) {
yamaguch 0:0232a97b3883 66 if (index != in) {
yamaguch 0:0232a97b3883 67 if (getFrameType(buf[INDEX(index + 2)]) == type)
yamaguch 0:0232a97b3883 68 return index;
yamaguch 0:0232a97b3883 69 int size = SIZE(buf, index);
yamaguch 0:0232a97b3883 70 index = INDEX(index + 2 + size);
yamaguch 0:0232a97b3883 71 continue;
yamaguch 0:0232a97b3883 72 } else if (timeout <= 0) {
yamaguch 0:0232a97b3883 73 return -1;
yamaguch 0:0232a97b3883 74 }
yamaguch 0:0232a97b3883 75 wait(0.001);
yamaguch 0:0232a97b3883 76 timeout -= 0.001;
yamaguch 0:0232a97b3883 77 }
yamaguch 0:0232a97b3883 78 }
yamaguch 0:0232a97b3883 79
yamaguch 0:0232a97b3883 80 XBee::FrameType XBee::getFrameType(char c) {
yamaguch 0:0232a97b3883 81 switch (c) {
yamaguch 0:0232a97b3883 82 case 0x00:
yamaguch 0:0232a97b3883 83 return None;
yamaguch 0:0232a97b3883 84 case 0x88:
yamaguch 0:0232a97b3883 85 return ATCommandResponse;
yamaguch 0:0232a97b3883 86 case 0x8A:
yamaguch 0:0232a97b3883 87 return ModemStatus;
yamaguch 0:0232a97b3883 88 case 0x8B:
yamaguch 0:0232a97b3883 89 return ZigBeeTransmitStatus;
yamaguch 0:0232a97b3883 90 case 0x90:
yamaguch 0:0232a97b3883 91 return ZigBeeReceivePacket;
yamaguch 0:0232a97b3883 92 case 0x91:
yamaguch 0:0232a97b3883 93 return ZigBeeExplicitRxIndicator;
yamaguch 0:0232a97b3883 94 case 0x92:
yamaguch 0:0232a97b3883 95 return ZigBeeIODataSampleRxIndicator;
yamaguch 0:0232a97b3883 96 case 0x94:
yamaguch 0:0232a97b3883 97 return XBeeSensorReadIndicator;
yamaguch 0:0232a97b3883 98 case 0x95:
yamaguch 0:0232a97b3883 99 return NodeIdentificationIndicator;
yamaguch 0:0232a97b3883 100 case 0x97:
yamaguch 0:0232a97b3883 101 return RemoteCommandResponse;
yamaguch 0:0232a97b3883 102 default:
yamaguch 0:0232a97b3883 103 return Other;
yamaguch 0:0232a97b3883 104 }
yamaguch 0:0232a97b3883 105 }
yamaguch 0:0232a97b3883 106
yamaguch 0:0232a97b3883 107 void XBee::flush() {
yamaguch 0:0232a97b3883 108 disableIRQ();
yamaguch 0:0232a97b3883 109 if (received == out) {
yamaguch 0:0232a97b3883 110 do {
yamaguch 0:0232a97b3883 111 int size = SIZE(buf, out);
yamaguch 0:0232a97b3883 112 out = INDEX(out + 2 + size);
yamaguch 0:0232a97b3883 113 free += 2 + size;
yamaguch 0:0232a97b3883 114 } while (out != in && getFrameType(buf[INDEX(out + 2)]) == None);
yamaguch 0:0232a97b3883 115 if (debug) leds = leds & 12; //**LEDS=xx00
yamaguch 0:0232a97b3883 116 }
yamaguch 0:0232a97b3883 117 enableIRQ();
yamaguch 0:0232a97b3883 118 }
yamaguch 0:0232a97b3883 119
yamaguch 0:0232a97b3883 120 void XBee::rxInterruptHandler() {
yamaguch 0:0232a97b3883 121 if (debug) leds = leds ^ 4; //**LEDS=x@xx
yamaguch 0:0232a97b3883 122
yamaguch 0:0232a97b3883 123 while (readable()) {
yamaguch 0:0232a97b3883 124 char c = getc() & 255;
yamaguch 0:0232a97b3883 125 switch (state) {
yamaguch 0:0232a97b3883 126 case LENGTH1:
yamaguch 0:0232a97b3883 127 cur = in;
yamaguch 0:0232a97b3883 128 buf[cur] = c;
yamaguch 0:0232a97b3883 129 state = LENGTH2;
yamaguch 0:0232a97b3883 130 break;
yamaguch 0:0232a97b3883 131 case LENGTH2:
yamaguch 0:0232a97b3883 132 if ((buf[cur] << 8 | c) + 2 < BUFSIZE) {
yamaguch 0:0232a97b3883 133 state = DATA;
yamaguch 0:0232a97b3883 134 while (free < (buf[cur] << 8 | c) + 2) {
yamaguch 0:0232a97b3883 135 int size = SIZE(buf, out);
yamaguch 0:0232a97b3883 136 out = INDEX(out + 2 + size);
yamaguch 0:0232a97b3883 137 free += size + 2;
yamaguch 0:0232a97b3883 138 }
yamaguch 0:0232a97b3883 139 buf[INDEX(cur + 1)] = c;
yamaguch 0:0232a97b3883 140 cur = INDEX(cur + 2);
yamaguch 0:0232a97b3883 141 if (debug) leds = (leds & 12) | 1; //**LEDS=xx01
yamaguch 0:0232a97b3883 142 } else {
yamaguch 0:0232a97b3883 143 state = UNKNOWN;
yamaguch 0:0232a97b3883 144 if (debug) leds = leds & 12; //**LEDS=xx00
yamaguch 0:0232a97b3883 145 }
yamaguch 0:0232a97b3883 146 break;
yamaguch 0:0232a97b3883 147 case DATA:
yamaguch 0:0232a97b3883 148 buf[cur] = c;
yamaguch 0:0232a97b3883 149 cur = INDEX(cur + 1);
yamaguch 0:0232a97b3883 150 if (debug) leds = (leds & 12) | (cur & 3); //**LEDS=xx@@
yamaguch 0:0232a97b3883 151 if (cur == INDEX(in + 2 + SIZE(buf, in))) state = SUMCHECK;
yamaguch 0:0232a97b3883 152 break;
yamaguch 0:0232a97b3883 153 case SUMCHECK:
yamaguch 0:0232a97b3883 154 for (int i = INDEX(in + 2); i != cur; i = INDEX(i + 1)) {
yamaguch 0:0232a97b3883 155 c += buf[i];
yamaguch 0:0232a97b3883 156 }
yamaguch 0:0232a97b3883 157 if (c == 255) {
yamaguch 0:0232a97b3883 158 if (debug) leds = (leds & 12) | 3; //**LEDS=xx11
yamaguch 0:0232a97b3883 159 in = cur;
yamaguch 0:0232a97b3883 160 free = in <= out ? out - in : BUFSIZE + out - in;
yamaguch 0:0232a97b3883 161 }
yamaguch 0:0232a97b3883 162 state = UNKNOWN;
yamaguch 0:0232a97b3883 163 break;
yamaguch 0:0232a97b3883 164 default:
yamaguch 0:0232a97b3883 165 if (c == PREAMBLE) state = LENGTH1;
yamaguch 0:0232a97b3883 166 if (debug) leds = (leds & 12) | 1; //**LEDS=xx01
yamaguch 0:0232a97b3883 167 }
yamaguch 0:0232a97b3883 168 }
yamaguch 0:0232a97b3883 169 }
yamaguch 0:0232a97b3883 170
yamaguch 0:0232a97b3883 171 void XBee::rxInterruptHandler2() {
yamaguch 0:0232a97b3883 172 static bool escaped = false;
yamaguch 0:0232a97b3883 173
yamaguch 0:0232a97b3883 174 if (debug) leds = leds ^ 4; // x@xx
yamaguch 0:0232a97b3883 175
yamaguch 0:0232a97b3883 176 while (readable()) {
yamaguch 0:0232a97b3883 177 char c = getc() & 255;
yamaguch 0:0232a97b3883 178
yamaguch 0:0232a97b3883 179 if (escaped) {
yamaguch 0:0232a97b3883 180 c ^= 0x20;
yamaguch 0:0232a97b3883 181 escaped = false;
yamaguch 0:0232a97b3883 182 } else if (c == ESCAPE) {
yamaguch 0:0232a97b3883 183 escaped = true;
yamaguch 0:0232a97b3883 184 continue;
yamaguch 0:0232a97b3883 185 }
yamaguch 0:0232a97b3883 186
yamaguch 0:0232a97b3883 187 switch (state) {
yamaguch 0:0232a97b3883 188 case LENGTH1:
yamaguch 0:0232a97b3883 189 cur = in;
yamaguch 0:0232a97b3883 190 buf[cur] = c;
yamaguch 0:0232a97b3883 191 state = LENGTH2;
yamaguch 0:0232a97b3883 192 break;
yamaguch 0:0232a97b3883 193 case LENGTH2:
yamaguch 0:0232a97b3883 194 if ((buf[cur] << 8 | c) + 2 < BUFSIZE) {
yamaguch 0:0232a97b3883 195 state = DATA;
yamaguch 0:0232a97b3883 196 while (free < (buf[cur] << 8 | c) + 2) {
yamaguch 0:0232a97b3883 197 int size = SIZE(buf, out);
yamaguch 0:0232a97b3883 198 out = INDEX(out + size + 2);
yamaguch 0:0232a97b3883 199 free += (size + 2);
yamaguch 0:0232a97b3883 200 }
yamaguch 0:0232a97b3883 201 buf[INDEX(cur + 1)] = c;
yamaguch 0:0232a97b3883 202 cur = INDEX(cur + 2);
yamaguch 0:0232a97b3883 203 if (debug) leds = (leds & 12) | 2; // xx10
yamaguch 0:0232a97b3883 204 } else {
yamaguch 0:0232a97b3883 205 state = UNKNOWN;
yamaguch 0:0232a97b3883 206 leds = leds & 12; //** update leds
yamaguch 0:0232a97b3883 207 }
yamaguch 0:0232a97b3883 208 break;
yamaguch 0:0232a97b3883 209 case DATA:
yamaguch 0:0232a97b3883 210 buf[cur] = c;
yamaguch 0:0232a97b3883 211 cur = INDEX(cur + 1);
yamaguch 0:0232a97b3883 212 if (debug) leds = (leds & 12) | (cur & 3); //**LEDS=xx@@
yamaguch 0:0232a97b3883 213 if (cur == INDEX(in + 2 + SIZE(buf, in))) state = SUMCHECK;
yamaguch 0:0232a97b3883 214 break;
yamaguch 0:0232a97b3883 215 case SUMCHECK:
yamaguch 0:0232a97b3883 216 for (int i = INDEX(in + 2); i != cur; i = INDEX(i + 1)) {
yamaguch 0:0232a97b3883 217 c += buf[i];
yamaguch 0:0232a97b3883 218 }
yamaguch 0:0232a97b3883 219 if (c == 255) {
yamaguch 0:0232a97b3883 220 if (debug) leds = (leds & 12) | 3; //**LEDS=xx11
yamaguch 0:0232a97b3883 221 in = cur;
yamaguch 0:0232a97b3883 222 free = in <= out ? out - in : BUFSIZE + out - in;
yamaguch 0:0232a97b3883 223 }
yamaguch 0:0232a97b3883 224 state = UNKNOWN;
yamaguch 0:0232a97b3883 225 break;
yamaguch 0:0232a97b3883 226 default:
yamaguch 0:0232a97b3883 227 if (c == PREAMBLE) state = LENGTH1;
yamaguch 0:0232a97b3883 228 if (debug) leds = (leds & 12) | 1; //**LEDS=xx01
yamaguch 0:0232a97b3883 229 }
yamaguch 0:0232a97b3883 230 }
yamaguch 0:0232a97b3883 231 }