Code APP3
Dependencies: mbed EthernetInterface WebSocketClient mbed-rtos BufferedSerial
Fork of APP3_Lab by
Diff: xbee.cpp
- Revision:
- 8:5955af1ee445
- Parent:
- 6:9ed8153f1328
- Child:
- 11:ecf5776b950a
--- a/xbee.cpp Sat Sep 30 20:02:08 2017 +0000 +++ b/xbee.cpp Sat Sep 30 20:07:23 2017 +0000 @@ -190,14 +190,77 @@ xbee_transmit_led = !xbee_transmit_led; } -int receive(char* buffer, int max_length) +bool receive(frame_t* out_frame, int max_length) { - int length = 0; - - while(xbee.readable() && length < max_length) + static int curr_length = 0; + + static frame_recv_state_t recv_state = wait_delimiter; + static frame_t frame; + static char checksum = 0xFF; + + bool finished_frame = false; + + while(xbee.readable() && curr_length < max_length && !finished_frame) { - buffer[length++] = xbee.getc(); - } - xbee_receive_led = !xbee_receive_led; - return length; + switch(recv_state) + { + case wait_delimiter: + { + if (xbee.getc() == ZIGBEE_DELIMITER) + { + recv_state = read_length_msb; + } + break; + } + case read_length_msb: + { + frame.length = (xbee.getc() << 8); + recv_state = read_length_lsb; + break; + } + case read_length_lsb: + { + frame.length |= xbee.getc(); + checksum = 0xFF; + recv_state = read_frame_specific; + break; + } + case read_frame_specific: + { + frame.buffer[curr_length] = xbee.getc(); + checksum -= frame.buffer[curr_length++]; + if (curr_length >= frame.length) + { + recv_state = read_checksum; + } + break; + } + case read_checksum: + { + recv_state = wait_delimiter; + xbee_receive_led = !xbee_receive_led; + if (checksum == xbee.getc()) + { + out_frame = &frame; + finished_frame = true; + } + break; + } + } + } + + return finished_frame; } + + +/** + * + * // Calculate checksum + char checksum = 0xFF; + for (int i = 3; i < FRAME_CHEKSUM_POS; i++) + { + checksum -= TransmitBuffer[i]; + } + + // Insert checksum into buffer + TransmitBuffer[FRAME_CHEKSUM_POS] = checksum;*/ \ No newline at end of file