XBee API mode library

Committer:
yamaguch
Date:
Tue Jan 29 13:46:41 2013 +0000
Revision:
8:776b8dc51932
Parent:
4:c05dc188f177
Child:
10:3da24a020e67
rtos support

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
yamaguch 8:776b8dc51932 25 #ifndef XBEE_RTOS
yamaguch 8:776b8dc51932 26 #define LOCK() NVIC_DisableIRQ(UARTx_IRQn[_serial.index])
yamaguch 8:776b8dc51932 27 #define UNLOCK() NVIC_EnableIRQ(UARTx_IRQn[_serial.index])
yamaguch 0:0232a97b3883 28 const IRQn_Type UARTx_IRQn[] = {UART0_IRQn, UART1_IRQn, UART2_IRQn, UART3_IRQn};
yamaguch 8:776b8dc51932 29 #else
yamaguch 8:776b8dc51932 30 #define LOCK() mutex.lock()
yamaguch 8:776b8dc51932 31 #define UNLOCK() mutex.unlock();
yamaguch 8:776b8dc51932 32 #endif
yamaguch 0:0232a97b3883 33
yamaguch 8:776b8dc51932 34 XBee::FrameType XBee::receive(float timeout)
yamaguch 8:776b8dc51932 35 {
yamaguch 0:0232a97b3883 36 flush();
yamaguch 8:776b8dc51932 37
yamaguch 0:0232a97b3883 38 while (true) {
yamaguch 8:776b8dc51932 39 LOCK();
yamaguch 8:776b8dc51932 40 //::printf(">receive()\n");
yamaguch 0:0232a97b3883 41 if (out != in || free == 0) {
yamaguch 0:0232a97b3883 42 FrameType type = getFrameType(buf[INDEX(out + 2)]);
yamaguch 0:0232a97b3883 43 if (type != None) {
yamaguch 0:0232a97b3883 44 received = out;
yamaguch 8:776b8dc51932 45 //::printf("<receive()1\n");
yamaguch 8:776b8dc51932 46 UNLOCK();
yamaguch 0:0232a97b3883 47 return type;
yamaguch 0:0232a97b3883 48 }
yamaguch 0:0232a97b3883 49 int size = SIZE(buf, out);
yamaguch 0:0232a97b3883 50 out = INDEX(out + 2 + size);
yamaguch 0:0232a97b3883 51 free += (2 + size);
yamaguch 8:776b8dc51932 52 //::printf("<receive()2\n");
yamaguch 8:776b8dc51932 53 UNLOCK();
yamaguch 0:0232a97b3883 54 continue;
yamaguch 0:0232a97b3883 55 } else if (timeout <= 0) {
yamaguch 8:776b8dc51932 56 //::printf("<receive()3\n");
yamaguch 8:776b8dc51932 57 UNLOCK();
yamaguch 0:0232a97b3883 58 return None;
yamaguch 0:0232a97b3883 59 }
yamaguch 8:776b8dc51932 60 //::printf("<receive()4\n");
yamaguch 8:776b8dc51932 61 UNLOCK();
yamaguch 8:776b8dc51932 62
yamaguch 8:776b8dc51932 63 #ifndef XBEE_RTOS
yamaguch 0:0232a97b3883 64 wait(0.001);
yamaguch 0:0232a97b3883 65 timeout -= 0.001;
yamaguch 8:776b8dc51932 66 #else
yamaguch 8:776b8dc51932 67 Thread::wait(50);
yamaguch 8:776b8dc51932 68 timeout -= 0.05;
yamaguch 8:776b8dc51932 69 #endif
yamaguch 0:0232a97b3883 70 }
yamaguch 0:0232a97b3883 71 }
yamaguch 0:0232a97b3883 72
yamaguch 0:0232a97b3883 73 /*
yamaguch 0:0232a97b3883 74 * function seekFor() -
yamaguch 0:0232a97b3883 75 *
yamaguch 3:8453df14bd30 76 * searches buf[] in range between the index out and in for a frame of specified type and id.
yamaguch 0:0232a97b3883 77 * if the frame is found before timeout, returns the index of the packet, otherwise -1.
yamaguch 0:0232a97b3883 78 *
yamaguch 0:0232a97b3883 79 */
yamaguch 8:776b8dc51932 80 int XBee::seekFor(FrameType type, char id, float timeout)
yamaguch 8:776b8dc51932 81 {
yamaguch 0:0232a97b3883 82 int index = out;
yamaguch 0:0232a97b3883 83 while (true) {
yamaguch 0:0232a97b3883 84 if (index != in) {
yamaguch 3:8453df14bd30 85 if (getFrameType(buf[INDEX(index + 2)]) == type && (id == 0 || buf[INDEX(index + 3)] == id))
yamaguch 0:0232a97b3883 86 return index;
yamaguch 0:0232a97b3883 87 int size = SIZE(buf, index);
yamaguch 0:0232a97b3883 88 index = INDEX(index + 2 + size);
yamaguch 0:0232a97b3883 89 continue;
yamaguch 0:0232a97b3883 90 } else if (timeout <= 0) {
yamaguch 0:0232a97b3883 91 return -1;
yamaguch 0:0232a97b3883 92 }
yamaguch 8:776b8dc51932 93 #ifndef XBEE_RTOS
yamaguch 0:0232a97b3883 94 wait(0.001);
yamaguch 0:0232a97b3883 95 timeout -= 0.001;
yamaguch 8:776b8dc51932 96 #else
yamaguch 8:776b8dc51932 97 Thread::wait(10);
yamaguch 8:776b8dc51932 98 timeout -= 0.01;
yamaguch 8:776b8dc51932 99 #endif
yamaguch 0:0232a97b3883 100 }
yamaguch 0:0232a97b3883 101 }
yamaguch 0:0232a97b3883 102
yamaguch 8:776b8dc51932 103 XBee::FrameType XBee::getFrameType(char c)
yamaguch 8:776b8dc51932 104 {
yamaguch 0:0232a97b3883 105 switch (c) {
yamaguch 0:0232a97b3883 106 case 0x00:
yamaguch 0:0232a97b3883 107 return None;
yamaguch 0:0232a97b3883 108 case 0x88:
yamaguch 0:0232a97b3883 109 return ATCommandResponse;
yamaguch 0:0232a97b3883 110 case 0x8A:
yamaguch 0:0232a97b3883 111 return ModemStatus;
yamaguch 0:0232a97b3883 112 case 0x8B:
yamaguch 0:0232a97b3883 113 return ZigBeeTransmitStatus;
yamaguch 0:0232a97b3883 114 case 0x90:
yamaguch 0:0232a97b3883 115 return ZigBeeReceivePacket;
yamaguch 0:0232a97b3883 116 case 0x91:
yamaguch 0:0232a97b3883 117 return ZigBeeExplicitRxIndicator;
yamaguch 0:0232a97b3883 118 case 0x92:
yamaguch 0:0232a97b3883 119 return ZigBeeIODataSampleRxIndicator;
yamaguch 0:0232a97b3883 120 case 0x94:
yamaguch 0:0232a97b3883 121 return XBeeSensorReadIndicator;
yamaguch 0:0232a97b3883 122 case 0x95:
yamaguch 0:0232a97b3883 123 return NodeIdentificationIndicator;
yamaguch 0:0232a97b3883 124 case 0x97:
yamaguch 0:0232a97b3883 125 return RemoteCommandResponse;
yamaguch 0:0232a97b3883 126 default:
yamaguch 0:0232a97b3883 127 return Other;
yamaguch 0:0232a97b3883 128 }
yamaguch 0:0232a97b3883 129 }
yamaguch 0:0232a97b3883 130
yamaguch 8:776b8dc51932 131 void XBee::flush()
yamaguch 8:776b8dc51932 132 {
yamaguch 8:776b8dc51932 133 LOCK();
yamaguch 0:0232a97b3883 134 if (received == out) {
yamaguch 0:0232a97b3883 135 do {
yamaguch 0:0232a97b3883 136 int size = SIZE(buf, out);
yamaguch 0:0232a97b3883 137 out = INDEX(out + 2 + size);
yamaguch 0:0232a97b3883 138 free += 2 + size;
yamaguch 0:0232a97b3883 139 } while (out != in && getFrameType(buf[INDEX(out + 2)]) == None);
yamaguch 0:0232a97b3883 140 if (debug) leds = leds & 12; //**LEDS=xx00
yamaguch 0:0232a97b3883 141 }
yamaguch 8:776b8dc51932 142 UNLOCK();
yamaguch 0:0232a97b3883 143 }
yamaguch 0:0232a97b3883 144
yamaguch 8:776b8dc51932 145 #ifndef XBEE_RTOS
yamaguch 8:776b8dc51932 146 void XBee::rxInterruptHandler()
yamaguch 8:776b8dc51932 147 {
yamaguch 8:776b8dc51932 148 static bool escaped = false;
yamaguch 8:776b8dc51932 149
yamaguch 0:0232a97b3883 150 if (debug) leds = leds ^ 4; //**LEDS=x@xx
yamaguch 0:0232a97b3883 151
yamaguch 0:0232a97b3883 152 while (readable()) {
yamaguch 0:0232a97b3883 153 char c = getc() & 255;
yamaguch 8:776b8dc51932 154
yamaguch 8:776b8dc51932 155 if (apiMode == 2) {
yamaguch 8:776b8dc51932 156 if (escaped) {
yamaguch 8:776b8dc51932 157 c ^= 0x20;
yamaguch 8:776b8dc51932 158 escaped = false;
yamaguch 8:776b8dc51932 159 } else if (c == ESCAPE) {
yamaguch 8:776b8dc51932 160 escaped = true;
yamaguch 8:776b8dc51932 161 continue;
yamaguch 8:776b8dc51932 162 }
yamaguch 8:776b8dc51932 163 }
yamaguch 8:776b8dc51932 164
yamaguch 0:0232a97b3883 165 switch (state) {
yamaguch 0:0232a97b3883 166 case LENGTH1:
yamaguch 0:0232a97b3883 167 cur = in;
yamaguch 0:0232a97b3883 168 buf[cur] = c;
yamaguch 0:0232a97b3883 169 state = LENGTH2;
yamaguch 0:0232a97b3883 170 break;
yamaguch 0:0232a97b3883 171 case LENGTH2:
yamaguch 0:0232a97b3883 172 if ((buf[cur] << 8 | c) + 2 < BUFSIZE) {
yamaguch 0:0232a97b3883 173 state = DATA;
yamaguch 0:0232a97b3883 174 while (free < (buf[cur] << 8 | c) + 2) {
yamaguch 0:0232a97b3883 175 int size = SIZE(buf, out);
yamaguch 0:0232a97b3883 176 out = INDEX(out + 2 + size);
yamaguch 0:0232a97b3883 177 free += size + 2;
yamaguch 0:0232a97b3883 178 }
yamaguch 0:0232a97b3883 179 buf[INDEX(cur + 1)] = c;
yamaguch 0:0232a97b3883 180 cur = INDEX(cur + 2);
yamaguch 0:0232a97b3883 181 if (debug) leds = (leds & 12) | 1; //**LEDS=xx01
yamaguch 0:0232a97b3883 182 } else {
yamaguch 0:0232a97b3883 183 state = UNKNOWN;
yamaguch 0:0232a97b3883 184 if (debug) leds = leds & 12; //**LEDS=xx00
yamaguch 0:0232a97b3883 185 }
yamaguch 0:0232a97b3883 186 break;
yamaguch 0:0232a97b3883 187 case DATA:
yamaguch 0:0232a97b3883 188 buf[cur] = c;
yamaguch 0:0232a97b3883 189 cur = INDEX(cur + 1);
yamaguch 0:0232a97b3883 190 if (debug) leds = (leds & 12) | (cur & 3); //**LEDS=xx@@
yamaguch 0:0232a97b3883 191 if (cur == INDEX(in + 2 + SIZE(buf, in))) state = SUMCHECK;
yamaguch 0:0232a97b3883 192 break;
yamaguch 0:0232a97b3883 193 case SUMCHECK:
yamaguch 0:0232a97b3883 194 for (int i = INDEX(in + 2); i != cur; i = INDEX(i + 1)) {
yamaguch 0:0232a97b3883 195 c += buf[i];
yamaguch 0:0232a97b3883 196 }
yamaguch 0:0232a97b3883 197 if (c == 255) {
yamaguch 0:0232a97b3883 198 if (debug) leds = (leds & 12) | 3; //**LEDS=xx11
yamaguch 0:0232a97b3883 199 in = cur;
yamaguch 8:776b8dc51932 200 free = in < out ? out - in : BUFSIZE + out - in;
yamaguch 0:0232a97b3883 201 }
yamaguch 0:0232a97b3883 202 state = UNKNOWN;
yamaguch 0:0232a97b3883 203 break;
yamaguch 0:0232a97b3883 204 default:
yamaguch 0:0232a97b3883 205 if (c == PREAMBLE) state = LENGTH1;
yamaguch 0:0232a97b3883 206 if (debug) leds = (leds & 12) | 1; //**LEDS=xx01
yamaguch 0:0232a97b3883 207 }
yamaguch 0:0232a97b3883 208 }
yamaguch 0:0232a97b3883 209 }
yamaguch 8:776b8dc51932 210 #else
yamaguch 8:776b8dc51932 211 void XBee::rxISR()
yamaguch 8:776b8dc51932 212 {
yamaguch 8:776b8dc51932 213 int c = -1;
yamaguch 8:776b8dc51932 214 switch (_serial.index) {
yamaguch 8:776b8dc51932 215 case 0: {
yamaguch 8:776b8dc51932 216 uint32_t UART_0_IIR = LPC_UART0->IIR;
yamaguch 8:776b8dc51932 217 if (readable()) c = LPC_UART0->RBR;
yamaguch 8:776b8dc51932 218 }
yamaguch 8:776b8dc51932 219 break;
yamaguch 8:776b8dc51932 220 case 1: {
yamaguch 8:776b8dc51932 221 uint32_t UART_1_IIR = LPC_UART1->IIR;
yamaguch 8:776b8dc51932 222 if (readable()) c = LPC_UART1->RBR;
yamaguch 8:776b8dc51932 223 }
yamaguch 8:776b8dc51932 224 break;
yamaguch 8:776b8dc51932 225 case 2: {
yamaguch 8:776b8dc51932 226 uint32_t UART_2_IIR = LPC_UART2->IIR;
yamaguch 8:776b8dc51932 227 if (readable()) c = LPC_UART2->RBR;
yamaguch 8:776b8dc51932 228 }
yamaguch 8:776b8dc51932 229 break;
yamaguch 8:776b8dc51932 230 case 3: {
yamaguch 8:776b8dc51932 231 uint32_t UART_3_IIR = LPC_UART3->IIR;
yamaguch 8:776b8dc51932 232 if (readable()) c = LPC_UART3->RBR;
yamaguch 8:776b8dc51932 233 }
yamaguch 8:776b8dc51932 234 break;
yamaguch 8:776b8dc51932 235 }
yamaguch 8:776b8dc51932 236
yamaguch 8:776b8dc51932 237 if (c != -1) {
yamaguch 8:776b8dc51932 238 rxBuf = c;
yamaguch 8:776b8dc51932 239 signal();
yamaguch 8:776b8dc51932 240 }
yamaguch 8:776b8dc51932 241 }
yamaguch 0:0232a97b3883 242
yamaguch 8:776b8dc51932 243 void XBee::run()
yamaguch 8:776b8dc51932 244 {
yamaguch 8:776b8dc51932 245 bool escaped = false;
yamaguch 0:0232a97b3883 246
yamaguch 8:776b8dc51932 247 while (true) {
yamaguch 8:776b8dc51932 248 signalWait();
yamaguch 8:776b8dc51932 249 mutex.lock();
yamaguch 8:776b8dc51932 250 if (debug && rxBuf.readable()) leds = leds ^ 4; // x@xx
yamaguch 0:0232a97b3883 251
yamaguch 8:776b8dc51932 252 while (rxBuf.readable()) {
yamaguch 8:776b8dc51932 253 char c = rxBuf.getc() & 255;
yamaguch 8:776b8dc51932 254 //::printf("getc = %02X\n", c);
yamaguch 8:776b8dc51932 255 if (apiMode == 2) {
yamaguch 8:776b8dc51932 256 if (escaped) {
yamaguch 8:776b8dc51932 257 c ^= 0x20;
yamaguch 8:776b8dc51932 258 escaped = false;
yamaguch 8:776b8dc51932 259 } else if (c == ESCAPE) {
yamaguch 8:776b8dc51932 260 escaped = true;
yamaguch 8:776b8dc51932 261 continue;
yamaguch 8:776b8dc51932 262 }
yamaguch 8:776b8dc51932 263 }
yamaguch 0:0232a97b3883 264
yamaguch 8:776b8dc51932 265 switch (state) {
yamaguch 8:776b8dc51932 266 case LENGTH1:
yamaguch 8:776b8dc51932 267 cur = in;
yamaguch 8:776b8dc51932 268 buf[cur] = c;
yamaguch 8:776b8dc51932 269 state = LENGTH2;
yamaguch 8:776b8dc51932 270 break;
yamaguch 8:776b8dc51932 271 case LENGTH2:
yamaguch 8:776b8dc51932 272 //::printf(">length2 in = %04X, out = %04X, free = %d\n", in, out, free);
yamaguch 8:776b8dc51932 273 if ((buf[cur] << 8 | c) + 2 < BUFSIZE) {
yamaguch 8:776b8dc51932 274 state = DATA;
yamaguch 8:776b8dc51932 275 while (free < (buf[cur] << 8 | c) + 2) {
yamaguch 8:776b8dc51932 276 int size = SIZE(buf, out);
yamaguch 8:776b8dc51932 277 out = INDEX(out + size + 2);
yamaguch 8:776b8dc51932 278 free += (size + 2);
yamaguch 8:776b8dc51932 279 }
yamaguch 8:776b8dc51932 280 buf[INDEX(cur + 1)] = c;
yamaguch 8:776b8dc51932 281 cur = INDEX(cur + 2);
yamaguch 8:776b8dc51932 282 if (debug) leds = (leds & 12) | 2; // xx10
yamaguch 8:776b8dc51932 283 } else {
yamaguch 8:776b8dc51932 284 state = UNKNOWN;
yamaguch 8:776b8dc51932 285 leds = leds & 12; //** update leds
yamaguch 8:776b8dc51932 286 }
yamaguch 8:776b8dc51932 287 //::printf("<length2 in = %04X, out = %04X, free = %d\n", in, out, free);
yamaguch 8:776b8dc51932 288 break;
yamaguch 8:776b8dc51932 289 case DATA:
yamaguch 8:776b8dc51932 290 buf[cur] = c;
yamaguch 8:776b8dc51932 291 cur = INDEX(cur + 1);
yamaguch 8:776b8dc51932 292 if (debug) leds = (leds & 12) | (cur & 3); //**LEDS=xx@@
yamaguch 8:776b8dc51932 293 if (cur == INDEX(in + 2 + SIZE(buf, in))) state = SUMCHECK;
yamaguch 8:776b8dc51932 294 break;
yamaguch 8:776b8dc51932 295 case SUMCHECK:
yamaguch 8:776b8dc51932 296 for (int i = INDEX(in + 2); i != cur; i = INDEX(i + 1)) {
yamaguch 8:776b8dc51932 297 c += buf[i];
yamaguch 8:776b8dc51932 298 }
yamaguch 8:776b8dc51932 299 if (c == 255) {
yamaguch 8:776b8dc51932 300 if (debug) leds = (leds & 12) | 3; //**LEDS=xx11
yamaguch 8:776b8dc51932 301 in = cur;
yamaguch 8:776b8dc51932 302 free = in <= out ? out - in : BUFSIZE + out - in; // maybe in == out, then free == 0, but != BUFSIZE
yamaguch 0:0232a97b3883 303 }
yamaguch 0:0232a97b3883 304 state = UNKNOWN;
yamaguch 8:776b8dc51932 305 break;
yamaguch 8:776b8dc51932 306 default:
yamaguch 8:776b8dc51932 307 if (c == PREAMBLE) state = LENGTH1;
yamaguch 8:776b8dc51932 308 if (debug) leds = (leds & 12) | 1; //**LEDS=xx01
yamaguch 8:776b8dc51932 309 }
yamaguch 8:776b8dc51932 310 }
yamaguch 8:776b8dc51932 311 mutex.unlock();
yamaguch 8:776b8dc51932 312 }
yamaguch 8:776b8dc51932 313 }
yamaguch 8:776b8dc51932 314 #endif
yamaguch 8:776b8dc51932 315 #if 0
yamaguch 8:776b8dc51932 316 void XBee::rxHandler(void const *args)
yamaguch 8:776b8dc51932 317 {
yamaguch 8:776b8dc51932 318 bool escaped = false;
yamaguch 8:776b8dc51932 319
yamaguch 8:776b8dc51932 320 XBee& self = *((XBee *) args);
yamaguch 8:776b8dc51932 321 BusOut& leds = self.leds;
yamaguch 8:776b8dc51932 322 int& apiMode = self.apiMode;
yamaguch 8:776b8dc51932 323 volatile int& cur = self.cur;
yamaguch 8:776b8dc51932 324 volatile int& in = self.in;
yamaguch 8:776b8dc51932 325 volatile int& out = self.out;
yamaguch 8:776b8dc51932 326 volatile int& free = self.free;
yamaguch 8:776b8dc51932 327 bool& debug = self.debug;
yamaguch 8:776b8dc51932 328 Mutex& mutex = self.mutex;
yamaguch 8:776b8dc51932 329
yamaguch 8:776b8dc51932 330 //int prevFree = free;
yamaguch 8:776b8dc51932 331
yamaguch 8:776b8dc51932 332 while (true) {
yamaguch 8:776b8dc51932 333 mutex.lock();
yamaguch 8:776b8dc51932 334 //if (prevFree != free) {
yamaguch 8:776b8dc51932 335 //::printf("rx in = %04X, out = %04X, free = %d -> %d\n", in, out, prevFree, free);
yamaguch 8:776b8dc51932 336 //prevFree = free;
yamaguch 8:776b8dc51932 337 //}
yamaguch 8:776b8dc51932 338 if (debug && self.readable()) leds = leds ^ 4; // x@xx
yamaguch 8:776b8dc51932 339
yamaguch 8:776b8dc51932 340 while (self.readable()) {
yamaguch 8:776b8dc51932 341 //if (prevFree != free) {
yamaguch 8:776b8dc51932 342 //::printf("length2 in = %04X, out = %04X, free = %d -> %d\n", in, out, prevFree, free);
yamaguch 8:776b8dc51932 343 //prevFree = free;
yamaguch 8:776b8dc51932 344 //}
yamaguch 8:776b8dc51932 345 char c = self.getc() & 255;
yamaguch 8:776b8dc51932 346
yamaguch 8:776b8dc51932 347 if (apiMode == 2) {
yamaguch 8:776b8dc51932 348 if (escaped) {
yamaguch 8:776b8dc51932 349 c ^= 0x20;
yamaguch 8:776b8dc51932 350 escaped = false;
yamaguch 8:776b8dc51932 351 } else if (c == ESCAPE) {
yamaguch 8:776b8dc51932 352 escaped = true;
yamaguch 8:776b8dc51932 353 continue;
yamaguch 0:0232a97b3883 354 }
yamaguch 8:776b8dc51932 355 }
yamaguch 8:776b8dc51932 356
yamaguch 8:776b8dc51932 357 switch (self.state) {
yamaguch 8:776b8dc51932 358 case LENGTH1:
yamaguch 8:776b8dc51932 359 cur = in;
yamaguch 8:776b8dc51932 360 self.buf[cur] = c;
yamaguch 8:776b8dc51932 361 self.state = LENGTH2;
yamaguch 8:776b8dc51932 362 break;
yamaguch 8:776b8dc51932 363 case LENGTH2:
yamaguch 8:776b8dc51932 364 //::printf(">length2 in = %04X, out = %04X, free = %d\n", in, out, free);
yamaguch 8:776b8dc51932 365 if ((self.buf[cur] << 8 | c) + 2 < BUFSIZE) {
yamaguch 8:776b8dc51932 366 self.state = DATA;
yamaguch 8:776b8dc51932 367 while (free < (self.buf[cur] << 8 | c) + 2) {
yamaguch 8:776b8dc51932 368 int size = SIZE(self.buf, out);
yamaguch 8:776b8dc51932 369 out = INDEX(out + size + 2);
yamaguch 8:776b8dc51932 370 free += (size + 2);
yamaguch 8:776b8dc51932 371 }
yamaguch 8:776b8dc51932 372 self.buf[INDEX(cur + 1)] = c;
yamaguch 8:776b8dc51932 373 cur = INDEX(cur + 2);
yamaguch 8:776b8dc51932 374 if (debug) leds = (leds & 12) | 2; // xx10
yamaguch 8:776b8dc51932 375 //::printf("<length2 in = %04X, out = %04X, free = %d\n", in, out, free);
yamaguch 8:776b8dc51932 376 } else {
yamaguch 8:776b8dc51932 377 self.state = UNKNOWN;
yamaguch 8:776b8dc51932 378 leds = leds & 12; //** update leds
yamaguch 8:776b8dc51932 379 }
yamaguch 8:776b8dc51932 380 break;
yamaguch 8:776b8dc51932 381 case DATA:
yamaguch 8:776b8dc51932 382 self.buf[cur] = c;
yamaguch 8:776b8dc51932 383 cur = INDEX(cur + 1);
yamaguch 8:776b8dc51932 384 if (debug) leds = (leds & 12) | (cur & 3); //**LEDS=xx@@
yamaguch 8:776b8dc51932 385 if (cur == INDEX(in + 2 + SIZE(self.buf, in))) self.state = SUMCHECK;
yamaguch 8:776b8dc51932 386 break;
yamaguch 8:776b8dc51932 387 case SUMCHECK:
yamaguch 8:776b8dc51932 388 //::printf(">sumcheck in = %04X, out = %04X, free = %d\n", in, out, free);
yamaguch 8:776b8dc51932 389 for (int i = INDEX(in + 2); i != cur; i = INDEX(i + 1)) {
yamaguch 8:776b8dc51932 390 c += self.buf[i];
yamaguch 8:776b8dc51932 391 }
yamaguch 8:776b8dc51932 392 if (c == 255) {
yamaguch 8:776b8dc51932 393 if (debug) leds = (leds & 12) | 3; //**LEDS=xx11
yamaguch 8:776b8dc51932 394 in = cur;
yamaguch 8:776b8dc51932 395 free = in <= out ? out - in : BUFSIZE + out - in; // maybe in == out then free == 0, but != BUFSIZE
yamaguch 8:776b8dc51932 396 }
yamaguch 8:776b8dc51932 397 self.state = UNKNOWN;
yamaguch 8:776b8dc51932 398 //::printf("<sumcheck in = %04X, out = %04X, free = %d\n", in, out, free);
yamaguch 8:776b8dc51932 399 break;
yamaguch 8:776b8dc51932 400 default:
yamaguch 8:776b8dc51932 401 if (c == PREAMBLE) self.state = LENGTH1;
yamaguch 8:776b8dc51932 402 if (debug) leds = (leds & 12) | 1; //**LEDS=xx01
yamaguch 8:776b8dc51932 403 }
yamaguch 0:0232a97b3883 404 }
yamaguch 8:776b8dc51932 405 mutex.unlock();
yamaguch 8:776b8dc51932 406 Thread::wait(1);
yamaguch 0:0232a97b3883 407 }
yamaguch 8:776b8dc51932 408 }
yamaguch 8:776b8dc51932 409 #endif