Code APP3
Dependencies: mbed EthernetInterface WebSocketClient mbed-rtos BufferedSerial
Fork of APP3_Lab by
Diff: xbee.cpp
- Revision:
- 23:c3f25b511448
- Parent:
- 22:7edae38d0758
- Parent:
- 21:04fae6a95131
- Child:
- 24:29ec42daa82e
diff -r 7edae38d0758 -r c3f25b511448 xbee.cpp --- a/xbee.cpp Mon Oct 02 16:02:27 2017 +0000 +++ b/xbee.cpp Mon Oct 02 16:59:26 2017 +0000 @@ -371,71 +371,67 @@ NVIC_EnableIRQ(UART1_IRQn); return finished_frame; */ - if (xbee.readable()) + static int curr_length = 0; + + frame_recv_state_t recv_state = wait_delimiter; + frame_t* frame = out_frame; + static char checksum = 0xFF; + + bool finished_frame = false; + + xbee_receive_led = !xbee_receive_led; + while(curr_length < max_length && !finished_frame) { - static int curr_length = 0; - - frame_recv_state_t recv_state = wait_delimiter; - frame_t* frame = out_frame; - static char checksum = 0xFF; - - bool finished_frame = false; - - xbee_receive_led = !xbee_receive_led; - while(curr_length < max_length && !finished_frame) + char current = xbee.getc(); + switch(recv_state) { - char current = xbee.getc(); - switch(recv_state) + case wait_delimiter: { - case wait_delimiter: + //pc.printf(":: delimiter x%x", current); + if (current == ZIGBEE_DELIMITER) { - //pc.printf(":: delimiter x%x", current); - if (current == ZIGBEE_DELIMITER) - { - curr_length = 0; - recv_state = read_length_msb; - frame->length = 0; - } - break; - } - case read_length_msb: + curr_length = 0; + recv_state = read_length_msb; + frame->length = 0; + } + break; + } + case read_length_msb: + { + frame->length = (current << 8); + recv_state = read_length_lsb; + break; + } + case read_length_lsb: + { + frame->length |= current; + //pc.printf("\n\rFrame length = %u", frame->length); + checksum = 0xFF; + recv_state = read_frame_specific; + break; + } + case read_frame_specific: + { + //pc.printf(":: read_frame_specific x%x", current); + frame->buffer[curr_length++] = current; + checksum -= current; + if (curr_length >= frame->length) { - frame->length = (current << 8); - recv_state = read_length_lsb; - break; + recv_state = read_checksum; } - case read_length_lsb: - { - frame->length |= current; - //pc.printf("\n\rFrame length = %u", frame->length); - checksum = 0xFF; - recv_state = read_frame_specific; - break; - } - case read_frame_specific: + break; + } + case read_checksum: + { + // pc.printf(":: read_checksum x%x", current); + recv_state = wait_delimiter; + if (checksum == current) { - //pc.printf(":: read_frame_specific x%x", current); - frame->buffer[curr_length++] = current; - checksum -= current; - if (curr_length >= frame->length) - { - recv_state = read_checksum; - } - break; + finished_frame = true; } - case read_checksum: - { - // pc.printf(":: read_checksum x%x", current); - recv_state = wait_delimiter; - if (checksum == current) - { - finished_frame = true; - } - break; - } - } - } - return finished_frame; + break; + } + } } - return false; + return finished_frame; }