Code APP3
Dependencies: mbed EthernetInterface WebSocketClient mbed-rtos BufferedSerial
Fork of APP3_Lab by
Diff: xbee.cpp
- Revision:
- 17:8abdbfa6019c
- Parent:
- 15:c4d17caf0709
- Child:
- 21:04fae6a95131
- Child:
- 22:7edae38d0758
--- a/xbee.cpp Sun Oct 01 20:31:58 2017 +0000 +++ b/xbee.cpp Mon Oct 02 15:01:34 2017 +0000 @@ -9,22 +9,46 @@ DigitalOut xbee_receive_led(LED2); DigitalOut xbee_reset(p8); -Serial xbee(p13, p14); // tx, rx +BufferedSerial xbee(p13, p14); // tx, rx +Serial pc_usb(USBTX, USBRX); +void Rx_interrupt(); + +#define BUFFER_SIZE 2048 + +char TransmitBuffer[BUFFER_SIZE] = {0}; +char ReceiveBuffer[BUFFER_SIZE] = {0}; -char TransmitBuffer[2048] = {0}; -char ReceiveBuffer[2048] = {0}; - +volatile int rx_in = 0; +volatile int rx_out = 0; +/* +void Rx_interrupt() +{ + // Loop just in case more than one character is in UART's receive FIFO buffer + // Stop if buffer full + while ((xbee.readable()) && (((rx_in + 1) % BUFFER_SIZE) != rx_out)) { + + xbee_receive_led= !xbee_receive_led; + ReceiveBuffer[rx_in] = xbee.getc(); + // Uncomment to Echo to USB serial to watch data flow + pc_usb.putc(ReceiveBuffer[rx_in]); + rx_in = (rx_in + 1) % BUFFER_SIZE; + } + return; +} +*/ void xbee_init() { + // Setup a serial interrupt function to receive data xbee_receive_led = 0; + //xbee.attach(&Rx_interrupt, Serial::RxIrq); + + xbee_reset = 0; wait_ms(400); xbee_reset = 1; wait_ms(5000); - - //xbee_receive_led = 1; } void build_api_frame_header(int frame_data_size) @@ -264,9 +288,74 @@ bool receive(frame_t* out_frame, int max_length) { - if (xbee.readable()) + + //NVIC_DisableIRQ(UART1_IRQn); + /* + static int curr_length = 0; + static frame_recv_state_t recv_state = wait_delimiter; + static char checksum = 0xFF; + + bool finished_frame = false; + + while(rx_out != rx_in && !finished_frame) { - //Serial pc(USBTX, USBRX); // tx, rx + char current = ReceiveBuffer[rx_out]; + switch(recv_state) + { + case wait_delimiter: + { + if (current == ZIGBEE_DELIMITER) + { + curr_length = 0; + recv_state = read_length_msb; + out_frame->length = 0; + } + break; + } + case read_length_msb: + { + out_frame->length = (current << 8); + recv_state = read_length_lsb; + break; + } + case read_length_lsb: + { + out_frame->length |= current; + //pc.printf("\n\rFrame length = %u", out_frame->length); + checksum = 0xFF; + recv_state = read_frame_specific; + break; + } + case read_frame_specific: + { + //pc.printf(":: read_frame_specific x%x", current); + out_frame->buffer[curr_length++] = current; + checksum -= current; + if (curr_length >= out_frame->length) + { + recv_state = read_checksum; + } + break; + } + case read_checksum: + { + // pc.printf(":: read_checksum x%x", current); + recv_state = wait_delimiter; + if (checksum == current) + { + finished_frame = true; + } + break; + } + } + rx_out = (rx_out + 1) % BUFFER_SIZE; + } + + NVIC_EnableIRQ(UART1_IRQn); + + return finished_frame; */ + if (xbee.readable()) + { static int curr_length = 0; frame_recv_state_t recv_state = wait_delimiter;