Code APP3

Dependencies:   mbed EthernetInterface WebSocketClient mbed-rtos BufferedSerial

Fork of APP3_Lab by Jean-Philippe Fournier

Files at this revision

API Documentation at this revision

Comitter:
Cheroukee
Date:
Sat Sep 30 20:07:23 2017 +0000
Parent:
7:b054ce191070
Child:
9:3631d3685cfa
Commit message:
Fixed Platform IO compiling with new ACCEL lib, added new packet receiving

Changed in this revision

main.cpp Show annotated file Show diff for this revision Revisions of this file
sensors.h Show annotated file Show diff for this revision Revisions of this file
xbee.cpp Show annotated file Show diff for this revision Revisions of this file
xbee.h Show annotated file Show diff for this revision Revisions of this file
--- a/main.cpp	Sat Sep 30 20:02:08 2017 +0000
+++ b/main.cpp	Sat Sep 30 20:07:23 2017 +0000
@@ -21,7 +21,7 @@
 
     char hello_world[12] = "Hello world";
 
-
+    frame_t* current_frame;
 #if IS_COORDINATOR
 
 #else
@@ -38,14 +38,14 @@
             //pc.putc(c);         
         }*/
 
-        int recv_len = receive(recv_buff, 2048);
+        bool finished_packet = receive(current_frame, 2048);
 
-        if (recv_len > 0)
+        if (finished_packet)
         {
-            pc.printf("DATA RECEIVED : ");
-            for (int i = 0; i < recv_len; i++)
+            pc.printf("DATA RECEIVED : Data count = %u", current_frame->length);
+            for (int i = 0; i < current_frame->length; i++)
             {
-                pc.putc(recv_buff[i]);            
+                pc.putc(current_frame->buffer[i]);            
             }
             pc.printf("\n\r");
         }
--- a/sensors.h	Sat Sep 30 20:02:08 2017 +0000
+++ b/sensors.h	Sat Sep 30 20:07:23 2017 +0000
@@ -1,5 +1,5 @@
 #include "mbed.h"
-#include "MMA8452Q.h"
+#include "MMA8452Q/MMA8452Q.h"
 
 // Accelerometer - SDA, SCL, and I2C address
 MMA8452Q accel(p9, p10, 0x1D);
--- 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
--- a/xbee.h	Sat Sep 30 20:02:08 2017 +0000
+++ b/xbee.h	Sat Sep 30 20:07:23 2017 +0000
@@ -50,6 +50,18 @@
     char addr_lsb;
 } zigbee_addr_16_t;
 
+typedef struct {
+    int length;
+    char buffer[2048];
+} frame_t;
+
+typedef enum {
+    wait_delimiter,
+    read_length_msb,
+    read_length_lsb,
+    read_frame_specific,
+    read_checksum
+} frame_recv_state_t;
 
 // Position du frame delimiter
 #define FRAME_DELIMITER_POS 0
@@ -135,4 +147,4 @@
 bool transmit_request(char* buffer, int data_length, char options, zigbee_addr_64_t destination64, zigbee_addr_16_t destination16);
 
 void transmit(int packet_length);
-int receive(char* buffer, int max_length);
+bool receive(frame_t* buffer, int max_length);