Code APP3

Dependencies:   mbed EthernetInterface WebSocketClient mbed-rtos BufferedSerial

Fork of APP3_Lab by Jean-Philippe Fournier

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