gbgfa

Dependencies:   mbed-rtos mbed EthernetInterface WebSocketClient

Files at this revision

API Documentation at this revision

Comitter:
ABuche
Date:
Sat Mar 11 18:01:54 2017 +0000
Parent:
3:889e47988154
Commit message:
WebSocket

Changed in this revision

WebSocketClient.lib Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/WebSocketClient.lib	Sat Mar 11 18:01:54 2017 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/samux/code/WebSocketClient/#4567996414a5
--- 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) {
-
     }
 }