Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed EthernetInterface WebSocketClient mbed-rtos BufferedSerial
Fork of APP3_Lab by
Revision 29:56b6c15904e6, committed 2017-10-02
- Comitter:
- JayMcGee
- Date:
- Mon Oct 02 21:54:52 2017 +0000
- Parent:
- 28:322985c7e428
- Parent:
- 27:3baf4701a047
- Commit message:
- Merge
Changed in this revision
--- a/main.cpp Mon Oct 02 21:53:40 2017 +0000
+++ b/main.cpp Mon Oct 02 21:54:52 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();
--- a/xbee.cpp Mon Oct 02 21:53:40 2017 +0000
+++ b/xbee.cpp Mon Oct 02 21:54:52 2017 +0000
@@ -301,7 +301,7 @@
xbee_transmit_led = !xbee_transmit_led;
}
-bool receive(frame_t* out_frame, int max_length)
+bool receive(frame_t* out_frame)
{
static int curr_length = 0;
@@ -311,7 +311,7 @@
bool finished_frame = false;
xbee_receive_led = !xbee_receive_led;
- while(xbee.readable() && curr_length < max_length && !finished_frame)
+ while(xbee.readable() && curr_length < MAX_FRAME_SIZE && !finished_frame)
{
char current = xbee.getc();
switch(recv_state)
--- a/xbee.h Mon Oct 02 21:53:40 2017 +0000
+++ b/xbee.h Mon Oct 02 21:54:52 2017 +0000
@@ -51,9 +51,11 @@
char addr_lsb;
} zigbee_addr_16_t;
+#define MAX_FRAME_SIZE 64
+
typedef struct {
int length;
- char buffer[2048];
+ char buffer[MAX_FRAME_SIZE];
} frame_t;
typedef enum {
@@ -161,5 +163,5 @@
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);
+bool receive(frame_t* buffer);
