Code APP3
Dependencies: mbed EthernetInterface WebSocketClient mbed-rtos BufferedSerial
Fork of APP3_Lab by
Diff: main.cpp
- 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(¤t_frame, BUFFER_SIZE); - + // Reception + bool finished_packet = receive(¤t_frame); + // Si un packet complet est recu, on le traite if (finished_packet) { process_frame(¤t_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(¤t_frame, BUFFER_SIZE); - + // Reception + bool finished_packet = receive(¤t_frame); + // Si un packet complet est recu, on le traite if (finished_packet) { process_frame(¤t_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();