Code APP3

Dependencies:   mbed EthernetInterface WebSocketClient mbed-rtos BufferedSerial

Fork of APP3_Lab by Jean-Philippe Fournier

Revision:
27:3baf4701a047
Parent:
26:cbf539141bfe
--- a/main.cpp	Mon Oct 02 19:29:21 2017 +0000
+++ b/main.cpp	Mon Oct 02 21:47:53 2017 +0000
@@ -1,45 +1,59 @@
+
+#define IS_COORDINATOR 0
+
 #include "mbed.h"
 
 #include "rtos.h"
-
-#include "EthernetInterface.h"
-#include "Websocket.h"
-
+// Communication avec les Zigbee
 #include "xbee.h"
+// Lecture de fichier de config
 #include "parser.h"
-#include "sensors.h"
+    
+#if IS_COORDINATOR
+    // Pour la connection ethernet du coordinateur
+    #include "EthernetInterface.h"
+    #include "Websocket.h"
+#else
+    // Les capteurs des routeurs
+    #include "sensors.h"
+#endif
 
-#define IS_COORDINATOR 1
-
-#define PAN_ID 0xC0FFEE
-
-#define BUFFER_SIZE 64
-
-char recv_buff[BUFFER_SIZE] = {0};
+// Loop led qui permet de verifier l'opération correcte du module
 DigitalOut loop_led(LED4);
 
-Ticker flipper;
+// Pour les fonctionnalites de synchro
+Ticker ticker;
+
+// A la reception d'un message de transmission non reussie, on demarre un ticker qui ferme
+// la DEL3 apres une seconde, pour permettre d'indiquer la presence d'erreur
 Ticker error_ticker;
-void display_error();
 DigitalOut error_led(LED3);
+void error_display();
 
+// Thread du coordinateur qui permet l'envoi au serveur distant a l'aide de websocket
 Thread ws_send;
 void send_to_ws();
+// Structure servant de message pour la mailbox
 typedef struct {
     char buffer[64];
 } ws_message_t;
 Mail<ws_message_t, 32> messages_box;
 
+// Envoie un remote AT command vers le noeud a l'addresse fournie
 void set_remote_xbee_dio4(bool set, zigbee_addr_64_t addr);
 
+// Set le pan ID du reseau pour le noeud courant a l'aide de AT Command
 void set_pan_id(long pan_id);
 
+// Liste de noeuds decouvert a la reception de messages
 zigbee_addr_64_t addr_64[255];
+// Index actuel dans la liste de devices
 volatile int last_addr_64_index = 0;
-
+// Analyse un frame de data
 int process_frame(frame_t* frame);
-
+// Envois a tout les devices connus dans la liste d'addresse
 void send_del_to_all();
+// Prends les valeurs des capteurs et les envois au coordinateur
 void get_all_sensors();
 
 #if IS_COORDINATOR   
@@ -62,18 +76,23 @@
 #if IS_COORDINATOR
 void coordinator()
 {    
+    // Lecture de la configuration du coordinateur
     coordinator_config_t config = read_coordinator_config();
     
+    // On set le pan ID du device adequatement dans le fichier de configuration
     set_pan_id(config.pan_id);
-
+    
+    // Demarrage du thread qui s'occupe d'envoyer au web server
+    ws_send.start(callback(send_to_ws));
+    // Ticker qui envoi a tout les noeuds une commande de clignotement
+    ticker.attach(&send_del_to_all, 1.0); 
+    
     frame_t current_frame;
-    
-    ws_send.start(callback(send_to_ws));
-    flipper.attach(&send_del_to_all, 1.0); 
     while(1)
     {
-        bool finished_packet = receive(&current_frame, BUFFER_SIZE);
-        
+        // Reception
+        bool finished_packet = receive(&current_frame);
+        // Si un packet complet est recu, on le traite
         if (finished_packet)
         {            
             process_frame(&current_frame);
@@ -84,28 +103,35 @@
 #else
 void routeur()
 {    
+    // Lecture de la configuration du routeur
     router_config_t config = read_router_config();
     
+    // On set le pan ID du device adequatement dans le fichier de configuration
     set_pan_id(config.pan_id);
     
+    // Init les capteurs qui seront captures par le noeud
     initialize_sensors();
 
-    flipper.attach(&get_all_sensors, config.refresh_freq);
+    // Appel de la fonction de mesure des donnes de capteurs a tout les 
+    // temps donnes par config.refresh_freq
+    ticker.attach(&get_all_sensors, config.refresh_freq);
     
-    frame_t current_frame;
+    frame_t current_frame;    
     while(1)
     {        
-        bool finished_packet = receive(&current_frame, BUFFER_SIZE);
-        
+        // Reception
+        bool finished_packet = receive(&current_frame);
+        // Si un packet complet est recu, on le traite
         if (finished_packet)
         {            
             process_frame(&current_frame);                       
         }   
-        wait_ms(1);
+        wait_ms(10);
     }
 }
 #endif
 
+// Cree un pan id a l'aide du long en parametre, et envoi la commande at de configuration du PAN ID
 void set_pan_id(long pan_id)
 {
     char pan_id_buffer[8] = {0};
@@ -116,6 +142,7 @@
     at_command_set('I', 'D', pan_id_buffer, 8);
 }
 
+// Analyse du frame recu, et prise de decisions
 int process_frame(frame_t* frame)
 {
     Serial pc(USBTX, USBRX); // tx, rx
@@ -129,7 +156,7 @@
         if(frame->buffer[5] != 0x00)
         {
             error_led = 1;
-            error_ticker.attach(&display_error, 1.0);    
+            error_ticker.attach(&error_display, 1.0);    
         }
         return 2;
     }
@@ -180,15 +207,18 @@
     return 0;
 }
 
-
+#if IS_COORDINATOR
+// Fonction du thread d'envoi au web server par websocket
 void send_to_ws()
 {
     coordinator_config_t config = read_coordinator_config();
     
+    // Interface Ethernet 
     EthernetInterface eth;
-    eth.init("192.168.3.3", "255.255.255.0", "192.168.3.2"); //Use DHCP
+    eth.init(/*"192.168.3.3", "255.255.255.0", "192.168.3.2"*/); //Use DHCP
     eth.connect();
     
+    // Creation du WebSocket
     Websocket ws(config.server_url);
     ws.connect();
     osEvent evt;
@@ -202,7 +232,7 @@
         evt = messages_box.get();
         if (evt.status == osEventMail) {
             ws_message_t* mail = (ws_message_t*)evt.value.p;
-            //ws.send(mail->buffer);
+            ws.send(mail->buffer);
             Thread::wait(500);
             messages_box.free(mail);
         }
@@ -212,7 +242,9 @@
         }
     }
 }
+#endif
 
+// Envoi a tout les noeuds la commande at remote pour changer l'etat de la DEL
 void send_del_to_all()
 {
     loop_led = !loop_led;
@@ -224,6 +256,7 @@
     }
 }
 
+// Envoi la commande remote at pour setter la sortie de DIO4
 void set_remote_xbee_dio4(bool set, zigbee_addr_64_t addr)
 {
     if (set)
@@ -238,6 +271,9 @@
     }
 }
 
+#if !IS_COORDINATOR
+// Effecture une mesure sur tout les capteurs connus dans le tableau de fct puis
+// envoi les resultats au coordinateur
 void get_all_sensors()
 {
     loop_led = !loop_led;
@@ -261,8 +297,10 @@
         }
     }     
 }
+#endif
 
-void display_error()
+// Ferme la DEL d'erreur et detach le ticker
+void error_display()
 {
     error_led = 0;
     error_ticker.detach();