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:
Mon Oct 02 18:46:45 2017 +0000
Parent:
24:29ec42daa82e
Child:
26:cbf539141bfe
Commit message:
Working Ethernet communication with websockets

Changed in this revision

main.cpp 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	Mon Oct 02 17:35:34 2017 +0000
+++ b/main.cpp	Mon Oct 02 18:46:45 2017 +0000
@@ -2,6 +2,9 @@
 
 #include "rtos.h"
 
+#include "EthernetInterface.h"
+#include "Websocket.h"
+
 #include "xbee.h"
 #include "parser.h"
 #include "sensors.h"
@@ -15,15 +18,23 @@
 char recv_buff[BUFFER_SIZE] = {0};
 DigitalOut loop_led(LED4);
 
-void set_remote_xbee_dio4(bool set);
+Ticker flipper;
+Ticker error_ticker;
+void display_error();
+DigitalOut error_led(LED3);
+
+void set_remote_xbee_dio4(bool set, zigbee_addr_64_t addr);
 
 void set_pan_id(long pan_id);
 
 zigbee_addr_64_t addr_64[255];
-int last_addr_64_index = 0;
+volatile int last_addr_64_index = 0;
 
 int process_frame(frame_t* frame);
 
+void send_del_to_all();
+void get_all_sensors();
+
 #if IS_COORDINATOR   
 void coordinator();
 #else
@@ -41,80 +52,56 @@
 #endif
 }
 
-void set_remote_xbee_dio4(bool set)
-{
-    if (set)
-    {
-        remote_at_command_set(AT_COMMAND_DIO4_MSB, AT_COMMAND_DIO4_LSB,
-            AT_COMMAND_DIO_OUT_LOW, 0x02);
-    }
-    else
-    {
-        remote_at_command_set(AT_COMMAND_DIO4_MSB, AT_COMMAND_DIO4_LSB,
-            AT_COMMAND_DIO_OUT_HIGH, 0x02);
-    }
-}
-
 #if IS_COORDINATOR
 void coordinator()
 {    
-
     coordinator_config_t config = read_coordinator_config();
     
+    EthernetInterface eth;
+    eth.init("192.168.3.3", "255.255.255.0", "192.168.3.2"); //Use DHCP
+    eth.connect();
+    
+    Websocket ws(config.server_url);
+    ws.connect();
+        
     set_pan_id(config.pan_id);
 
     frame_t current_frame;
-
-    bool toggle_led = false;
+    
+    flipper.attach(&send_del_to_all, 1.0); 
     while(1)
     {
+        ws.send("Allo");
         bool finished_packet = receive(&current_frame, BUFFER_SIZE);
         
         if (finished_packet)
         {            
             process_frame(&current_frame);                       
         }
-        
-        //set_remote_xbee_dio4(toggle_led);
-        toggle_led = !toggle_led;
-
-        loop_led = !loop_led;
-        wait_ms(100);
+        wait_ms(1);
     }
 }
 #else
 void routeur()
 {    
     router_config_t config = read_router_config();
+    
     set_pan_id(config.pan_id);
-    char sensor_buffer[64] = {};
+    
     initialize_sensors();
-    DECLARE_ADDR64_COORD
-    DECLARE_ADDR16_UNKNOWN_OR_BCAST
 
-    DigitalOut led_3(LED3);
-    led_3 = 1;
+    flipper.attach(&get_all_sensors, config.refresh_freq);
+    
+    frame_t current_frame;
     while(1)
-    {
-        for (int i = 0; i < 2; i++)
-        {
-            sensor_t sensor = (*p[i])();
-            
-            if (sensor.sensor_type == 1)
-            {
-                sprintf(sensor_buffer, "button::%u\n\r", sensor.sensor_result.Bouton.etat != 0 ? 1 : 0);
-                transmit_request(sensor_buffer, 8 + 1 + 2, 0, USE_ADDR64_COORD, USE_ADDR16_UNKNOWN_OR_BCAST);  
-                led_3 = !led_3;
-            }
-            else if (sensor.sensor_type == 2)
-            {
-                sprintf(sensor_buffer, "accel::%3.2f%3.2f%3.2f\n\r", sensor.sensor_result.Accelerometre.x, 
-                                        sensor.sensor_result.Accelerometre.y, sensor.sensor_result.Accelerometre.z);
-                transmit_request(sensor_buffer, 7 + 15 + 2, 0, USE_ADDR64_COORD, USE_ADDR16_UNKNOWN_OR_BCAST);
-            }
-        }        
-        loop_led = !loop_led;
-        wait(config.refresh_freq);
+    {        
+        bool finished_packet = receive(&current_frame, BUFFER_SIZE);
+        
+        if (finished_packet)
+        {            
+            process_frame(&current_frame);                       
+        }   
+        wait_ms(1);
     }
 }
 #endif
@@ -140,7 +127,15 @@
     {
         char current = frame->buffer[i];        
     }    */
-    if (frame->buffer[0] == 0x90)
+    if (frame->buffer[0] == 0x8B)
+    {
+        if(frame->buffer[5] != 0x00)
+        {
+            error_led = 1;
+            error_ticker.attach(&display_error, 1.0);    
+        }
+    }
+    else if (frame->buffer[0] == 0x90)
     {
         // Manage source address
         // Detect the source address and list it dynamically
@@ -179,4 +174,59 @@
         }        
     }    
     return 0;
-}
\ No newline at end of file
+}
+
+void send_del_to_all()
+{
+    loop_led = !loop_led;
+    static bool flip = false;
+    flip = !flip;
+    for (int i = 0; i < last_addr_64_index; i++)
+    {
+        set_remote_xbee_dio4(flip, addr_64[i]); 
+    }
+}
+
+void set_remote_xbee_dio4(bool set, zigbee_addr_64_t addr)
+{
+    if (set)
+    {
+        remote_at_command_set(AT_COMMAND_DIO4_MSB, AT_COMMAND_DIO4_LSB,
+            AT_COMMAND_DIO_OUT_LOW, 0x02, addr);
+    }
+    else
+    {
+        remote_at_command_set(AT_COMMAND_DIO4_MSB, AT_COMMAND_DIO4_LSB,
+            AT_COMMAND_DIO_OUT_HIGH, 0x02, addr);
+    }
+}
+
+void get_all_sensors()
+{
+    loop_led = !loop_led;
+    char sensor_buffer[64] = {};
+    DECLARE_ADDR64_COORD
+    DECLARE_ADDR16_UNKNOWN_OR_BCAST
+    for (int i = 0; i < 2; i++)
+    {
+        sensor_t sensor = (*p[i])();
+        
+        if (sensor.sensor_type == 1)
+        {
+            sprintf(sensor_buffer, "button::%u\n\r", sensor.sensor_result.Bouton.etat != 0 ? 1 : 0);
+            transmit_request(sensor_buffer, 8 + 1 + 2, 0, USE_ADDR64_COORD, USE_ADDR16_UNKNOWN_OR_BCAST);  
+        }
+        else if (sensor.sensor_type == 2)
+        {
+            sprintf(sensor_buffer, "accel::%3.2f%3.2f%3.2f\n\r", sensor.sensor_result.Accelerometre.x, 
+                                    sensor.sensor_result.Accelerometre.y, sensor.sensor_result.Accelerometre.z);
+            transmit_request(sensor_buffer, 7 + 15 + 2, 0, USE_ADDR64_COORD, USE_ADDR16_UNKNOWN_OR_BCAST);
+        }
+    }     
+}
+
+void display_error()
+{
+    error_led = 0;
+    error_ticker.detach();
+}
--- a/xbee.cpp	Mon Oct 02 17:35:34 2017 +0000
+++ b/xbee.cpp	Mon Oct 02 18:46:45 2017 +0000
@@ -210,7 +210,7 @@
     return false;
 }
 
-void remote_at_command_query(char msb, char lsb, char options)
+void remote_at_command_query(char msb, char lsb, char options, zigbee_addr_64_t destination)
 {
     char remote_command[2] = {msb, lsb};
     
@@ -220,9 +220,8 @@
     set_api_frame_id(0x01);
 
     DECLARE_ADDR16_UNKNOWN_OR_BCAST
-    DECLARE_ADDR64_BCAST
 
-    set_64_addr(USE_ADDR64_BCAST);
+    set_64_addr(destination);
     set_16_addr(USE_ADDR16_UNKNOWN_OR_BCAST);
 
     // Set as apply
@@ -235,7 +234,7 @@
     transmit(2 + REMOTE_AT_OVERHEAD_LENGTH); 
 }
 
-void remote_at_command_set(char msb, char lsb, char parameter, char options)
+void remote_at_command_set(char msb, char lsb, char parameter, char options, zigbee_addr_64_t destination)
 {
     char remote_command[3] = {msb, lsb, parameter};
 
@@ -245,9 +244,8 @@
     set_api_frame_id(0x01);
 
     DECLARE_ADDR16_UNKNOWN_OR_BCAST
-    DECLARE_ADDR64_BCAST
 
-    set_64_addr(USE_ADDR64_BCAST);
+    set_64_addr(destination);
     set_16_addr(USE_ADDR16_UNKNOWN_OR_BCAST);
 
     // Set as apply
--- a/xbee.h	Mon Oct 02 17:35:34 2017 +0000
+++ b/xbee.h	Mon Oct 02 18:46:45 2017 +0000
@@ -157,8 +157,8 @@
 void at_command_set(char msb, char lsb, char* parameter, int parameter_length);
 
 // Envoie d'un remote at command (set ou query) en broadcast
-void remote_at_command_query(char msb, char lsb, char options);
-void remote_at_command_set(char msb, char lsb, char parameter, char options);
+void remote_at_command_query(char msb, char lsb, char options, zigbee_addr_64_t destination);
+void remote_at_command_set(char msb, char lsb, char parameter, char options, zigbee_addr_64_t destination);
 
 void transmit(int packet_length);
 bool receive(frame_t* buffer, int max_length);