Code APP3

Dependencies:   mbed EthernetInterface WebSocketClient mbed-rtos BufferedSerial

Fork of APP3_Lab by Jean-Philippe Fournier

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;