gbgfa

Dependencies:   mbed-rtos mbed EthernetInterface WebSocketClient

Revision:
4:287c3bd0c425
Parent:
3:889e47988154
--- a/main.cpp	Mon Feb 13 20:43:20 2017 +0000
+++ b/main.cpp	Sat Mar 11 18:01:54 2017 +0000
@@ -1,10 +1,16 @@
+//BUCA2201
+//GODJ2407
+
 #include "mbed.h"
 #include "rtos.h"
 #include "EthernetInterface.h"
+#include "Websocket.h"
 
 LocalFileSystem local("local");
 
 DigitalOut led1(LED1);
+DigitalOut led2(LED2);
+DigitalOut led3(LED3);
 DigitalOut ledError(LED4);
 
 DigitalOut reset(p8);
@@ -15,15 +21,17 @@
 Thread* receptionThread;
 Thread* processingThread;
 Thread* ledThread;
-Thread* ethernetReceptionThread;
 Thread* errorDisplay;
 
-TCPSocketConnection sock;
+Websocket* sock;
 
-char LED_Toggle[] = {0x7E, 0x00, 0x10, 0x17, 0x01, 0x00, 0x00, 0x00,
-                     0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x02, 0x44, 0x30, 0x00, 0x25
-                    }; //Change index 13 & 14 & 18 & 19
+//Commande AT pour changer la pin0
+char LED_Toggle[] = {0x7E, 0x00, 0x10, 0x17, 0x01,
+ 0x00, 0x13, 0xA2, 0x00, 0x40, 0x8B, 0x41, 0x8B,
+ 0x00, 0x00, 
+ 0x02, 0x44, 0x30, 0x00, 0x25}; 
 
+//Trois commandes pour changer le PAN ID d'un device
 char AT_ID[] = {0x7E, 0x00, 0x06, 0x09, 0x01, 0x49 , 0x44, 0x00, 0x00, 0x00}; // +DATA + CS (7 & 8)
 const char AT_WR[] = {0x7E, 0x00, 0x04, 0x09, 0x01, 0x57, 0x52, 0x4C};
 const char AT_AC[] = {0x7E, 0x00, 0x04, 0x09, 0x01, 0x41, 0x43, 0x71};
@@ -32,9 +40,9 @@
     char msg[25];
 } message;
 
+//Storage des adresses qu'on toggle leur pin0
 typedef struct {
-    char al;
-    char ah;
+    char adr[10];
 } address;
 
 address addresses[2];
@@ -43,6 +51,10 @@
 Queue<message, 25> queue;
 MemoryPool<message, 25> mPool;
 
+//URL du serveur
+char url[128];
+
+//Calcul le checksum d'une trame
 char checksum(char array[], char length)
 {
     char cs = 0;
@@ -52,6 +64,7 @@
     return 0xFF - cs;
 }
 
+//Convertie les donnes de l'acc en donnees lisible
 int traitementAcc(char msb, char lsb)
 {
     int val = msb > 127 ? 0xFFFFF000 | (msb << 4) : msb << 4;
@@ -77,9 +90,13 @@
             if(msg->msg[0] == 0x7E) {
                 msg->msg[1] = xbee.getc();
                 msg->msg[2] = xbee.getc();
-
+                
+                //On assume que la longueur est toujours plus petite que 256
                 for (int i = 3; i < msg->msg[2] + 4; i++) {
                     msg->msg[i] = xbee.getc();
+                    if(msg->msg[i] == 0x7E) {
+                        break;//Erreur de longueur
+                    }
                 }
 
                 queue.put(msg);
@@ -94,55 +111,61 @@
 {
     while(1) {
         message* msg = (message*)queue.get().value.p;
-
+        
         switch(msg->msg[3]) {
             case 0x88:
                 if (msg->msg[7] != 0x00) {
                     errorDisplay->signal_set(0x1);
-                    printf("AT command error\r\n");
+                    pc.printf("AT command error\r\n");
                 }
                 break;
             case 0x8A:
                 if (msg->msg[4] != 0x00 && msg->msg[4] != 0x06) {
                     errorDisplay->signal_set(0x1);
-                    printf("%02x - Modem error\r\n", msg->msg[4]);
+                    pc.printf("%02x - Modem error\r\n", msg->msg[4]);
                 }
                 break;
             case 0x97:
                 if (msg->msg[17] != 0x00) {
                     errorDisplay->signal_set(0x1);
-                    printf("%02x - Remote AT command error\r\n", msg->msg[4]);
+                    pc.printf("%02x - Remote AT command error\r\n", msg->msg[4]);
                 }
                 break;
             case 0x90:
                 if(msg->msg[2] >= 0x0C) {
-                    bool exists = false;
-
+                    char exists = 0;
+                    
+                    //Determine si c'est une nouvelle adresse
                     for (int i = 0; i< sizeof(addresses); i++) {
-                        if(addresses[i].ah == msg->msg[12] && addresses[i].al == msg->msg[13]) {
-                            exists = true;
-                            break;
+                        for(int j = 0; j < 10;j++) {
+                            if(addresses[i].adr[j] == msg->msg[j + 4]){
+                                exists++;
+                            }
                         }
+                        
+                        if(exists == 10){ break;} //Existe deja
+                        exists = 0; //Regarde les autres adresses
                     }
-
-                    if (!exists) {
-                        pc.printf("----------------------\r\n");
-                        for(int i = 0; i < msg->msg[2] + 4;i++){
-                            pc.printf("%02x ", msg->msg[i]);
+                    
+                    if (exists < 10) {                        
+                        pc.printf("New Address: ");
+                        for(int i = 0; i < 10;i++){
+                            addresses[addressCounter].adr[i] = msg->msg[i + 4];
+                            pc.printf("%02x ", addresses[addressCounter].adr[i]);
                         }
-                        pc.printf("\r\n----------------------\r\n");
-                        addresses[addressCounter].ah = msg->msg[12];
-                        addresses[addressCounter].al = msg->msg[13];
-                        pc.printf("New address: %02x %02x\r\n", addresses[addressCounter].ah, addresses[addressCounter].al);
+                        pc.printf("\r\n");
+                        
                         addressCounter++;
                     }
 
+                    //Extraction des donnes pertinentes
                     char data[7];
-                    //pc.printf("%02x ", msg->msg[15]);
                     for(int i = 15; i < msg->msg[2] + 3; i++) {
                         data[i - 15] = msg->msg[i];
                     }
-
+                    
+                    //Lecture du premier char pour connaitre le type
+                    char reception[256];
                     switch(data[0]) {
                         case 0x00:
                             char response[] = "Etat du bouton:  ";
@@ -151,8 +174,12 @@
                             } else if (data[1] == 0x01) {
                                 response[16] = '1';
                             }
-                            sock.send_all(response, 17);
-                            pc.printf("Sending to server: %s\r\n", response);
+                            sock->send(response);
+                            led2 = !led2;
+                            pc.printf("Sending to server: %s\r\n", response);                            
+                            
+                            sock->read(reception);
+                            pc.printf("Received from server: %s\r\n", reception);
                             break;
                         case 0x01:
                             int x = traitementAcc(data[1], data[2]);
@@ -161,25 +188,22 @@
                             char out[128];
                             sprintf(out, "Accelerometre [x: %d, y: %d, z: %d]", x,y,z);
 
-                            sock.send_all(out, 128);
+                            sock->send(out);
+                            led3 = !led3;
+                            
                             pc.printf("Sending to server: %s\r\n", out);
+                        
+                            sock->read(reception);
+                            pc.printf("Received from server: %s\r\n", reception);
                             break;
                     }
-
-                    /*
-                    for(int i = 0; i < msg->msg[2] + 4;i++){
-                        pc.printf("%02x ", msg->msg[i]);
-                    }
-                    pc.printf("\r\n");*/
-
                 }
                 break;
             default:
                 errorDisplay->signal_set(0x1);
-                printf("Invalid command error\r\n");
+                pc.printf("Invalid command error\r\n");
                 break;
         }
-
         mPool.free(msg);
     }
 }
@@ -199,10 +223,13 @@
     bool high = true;
     while(1) {
         Thread::signal_wait(0x1);
-
-        for (int i = 0; i < addressCounter; i++) {
-            LED_Toggle[13] = addresses[i].ah;
-            LED_Toggle[14] = addresses[i].al;
+        
+        //Itteration des adresses qu'on doit faire flasher
+        for (int i = 0; i < addressCounter; i++) {            
+            for (int j = 0; j < 10; j++) {
+                LED_Toggle[j + 5] = addresses[i].adr[j];
+            }
+            
             LED_Toggle[18] = high ? 0x05 : 0x04;
             LED_Toggle[19] = checksum(LED_Toggle, sizeof(LED_Toggle));
 
@@ -221,30 +248,24 @@
     ledThread->signal_set(0x1);
 }
 
-void receiveEthernet()
-{
-    char reception[256];
-    sock.receive_all(reception, 256);
-    //pc.printf("Received from server: %s", reception);
-}
-
 int main()
-{
+{        
     reset = 0;
-    wait(0.4);
+    wait(1);
     reset = 1;
     wait(1);
 
     int pan;
-    char url[128];
-
+    
+    //Lecture de la config
     FILE* f = fopen("/local/coord.cfg", "r");
     fscanf(f,"%x", &pan);
     fscanf(f,"%s", &url);
     fclose(f);
 
-    pc.printf("URL: %s", url);
+    pc.printf("URL: %s | ", url);
 
+    //Convertie le pan ID
     char buff[2];
     buff[0]=(pan>>8)&0xff;
     buff[1]=(pan)&0xff;
@@ -252,13 +273,23 @@
     AT_ID[7] = buff[0];
     AT_ID[8] = buff[1];
 
-    pc.printf("PAN: %02x%02x", AT_ID[7],AT_ID[8]);
+    pc.printf("PAN: %02x%02x\r\n", AT_ID[7],AT_ID[8]);
 
     char cs = checksum(AT_ID, sizeof(AT_ID));
-    pc.printf("CS: %02x\r\n", cs);
 
     AT_ID[9] = cs;
-
+    
+    //Configuration Ethernet
+    EthernetInterface eth;
+    eth.init(); //Use DHCP
+    //eth.init("192.168.0.3", "255.255.255.0", "192.168.0.2");
+    eth.connect();
+    pc.printf("IP Address is %s\r\n", eth.getIPAddress());
+    Websocket ws(url);
+    sock = &ws;
+    while(sock->connect() < 0){}//Attente du serveur
+    
+    //Setup du pan ID
     for(char i = 0; i<sizeof(AT_ID); i++) {
         xbee.putc(AT_ID[i]);
     }
@@ -270,16 +301,7 @@
     for(char i = 0; i<sizeof(AT_AC); i++) {
         xbee.putc(AT_AC[i]);
     }
-
-
-    /*
-    EthernetInterface eth;
-    eth.init(); //Use DHCP
-    eth.connect();
-    printf("IP Address is %s\r\n", eth.getIPAddress());
-
-    while(sock.connect(url, 8000)){};
-    */
+    wait(1);
 
     Thread errorDisplayLocal;
     errorDisplay = &errorDisplayLocal;
@@ -288,29 +310,18 @@
     Thread localReceptionThread;
     receptionThread = &localReceptionThread;
     receptionThread->start(&reception);
+
     Thread localLedThread;
     ledThread = &localLedThread;
     ledThread->start(&flashLED);
-    
+
     Ticker horloge;
-    horloge.attach(&LEDSignal, 2.5);
-
+    horloge.attach(&LEDSignal, 0.5); 
+    
     Thread localProcessingThread;
     processingThread = &localProcessingThread;
     processingThread->start(&processing);
     
-    /*
-    addresses[0].ah = 0xf4;
-    addresses[1].al = 0x13;
-    addressCounter++;
-    */
-
-
-    Thread localEthernetReceptionThread;
-    ethernetReceptionThread = &localEthernetReceptionThread;
-    ethernetReceptionThread->start(&receiveEthernet);
-
     while(1) {
-
     }
 }