gbgfa

Dependencies:   mbed-rtos mbed EthernetInterface WebSocketClient

Revision:
3:889e47988154
Parent:
2:63e05b3b6938
Child:
4:287c3bd0c425
--- a/main.cpp	Mon Feb 13 18:38:48 2017 +0000
+++ b/main.cpp	Mon Feb 13 20:43:20 2017 +0000
@@ -5,7 +5,7 @@
 LocalFileSystem local("local");
 
 DigitalOut led1(LED1);
-DigitalOut led4(LED4);
+DigitalOut ledError(LED4);
 
 DigitalOut reset(p8);
 RawSerial xbee(p13, p14);
@@ -16,12 +16,14 @@
 Thread* processingThread;
 Thread* ledThread;
 Thread* ethernetReceptionThread;
+Thread* errorDisplay;
 
 TCPSocketConnection 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
-     
+                     0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x02, 0x44, 0x30, 0x00, 0x25
+                    }; //Change index 13 & 14 & 18 & 19
+
 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};
@@ -41,120 +43,171 @@
 Queue<message, 25> queue;
 MemoryPool<message, 25> mPool;
 
-char checksum(char array[], char length){
+char checksum(char array[], char length)
+{
     char cs = 0;
-    for (int i = 3;i<length - 1;i++){
+    for (int i = 3; i<length - 1; i++) {
         cs += array[i];
     }
     return 0xFF - cs;
 }
 
-int traitementAcc(char msb, char lsb){
+int traitementAcc(char msb, char lsb)
+{
     int val = msb > 127 ? 0xFFFFF000 | (msb << 4) : msb << 4;
-        
+
     // Ajout des LSB
     val += lsb >> 4;
-    
+
     val = val > 2047 ? 2048 - val : val;
     val = val > 1024 ? 1024 : val;
     val = val < -1024 ? -1024 : val;
-    
+
     return val;
 }
 
-void reception(){
+void reception()
+{
     while(1) {
-        message* msg = mPool.alloc();
-        
-        msg->msg[0] = xbee.getc();
-        
-        if(msg->msg[0] == 0x7E){ 
-            msg->msg[1] = xbee.getc();
-            msg->msg[2] = xbee.getc();
-        
-            for (int i = 3;i < msg->msg[2] + 4;i++){
-                msg->msg[i] = xbee.getc();            
+        if(xbee.readable()) {
+            message* msg = mPool.alloc();
+
+            msg->msg[0] = xbee.getc();
+
+            if(msg->msg[0] == 0x7E) {
+                msg->msg[1] = xbee.getc();
+                msg->msg[2] = xbee.getc();
+
+                for (int i = 3; i < msg->msg[2] + 4; i++) {
+                    msg->msg[i] = xbee.getc();
+                }
+
+                queue.put(msg);
+            } else {
+                mPool.free(msg);
             }
-            
-            queue.put(msg);      
         }
-        
     }
 }
 
-void processing() {
+void processing()
+{
     while(1) {
         message* msg = (message*)queue.get().value.p;
-        
-        if(msg->msg[2] >= 0x0C && msg->msg[3] == 0x90){
-            bool exists = false;
-            
-            for (int i = 0; i< sizeof(addresses);i++){
-                if(addresses[i].ah == msg->msg[12] && addresses[i].al == msg->msg[13]){
-                    exists = true;
-                    break;
+
+        switch(msg->msg[3]) {
+            case 0x88:
+                if (msg->msg[7] != 0x00) {
+                    errorDisplay->signal_set(0x1);
+                    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]);
+                }
+                break;
+            case 0x97:
+                if (msg->msg[17] != 0x00) {
+                    errorDisplay->signal_set(0x1);
+                    printf("%02x - Remote AT command error\r\n", msg->msg[4]);
                 }
-            }
-            
-            if (!exists) {
-                addresses[addressCounter].ah = msg->msg[12];                
-                addresses[addressCounter].al = msg->msg[13];
-                pc.printf("New address: %02x %02x", addresses[addressCounter].ah, addresses[addressCounter].al);
-                addressCounter++;
-            }
-            
-            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];
-            }
-            
-            switch(data[0]){
-                case 0x00:
-                    char response[] = "Etat du bouton:  ";
-                    if (data[1] == 0x00){
-                        response[16] = '0';
-                    } else if (data[1] == 0x01){
-                        response[16] = '1';
+                break;
+            case 0x90:
+                if(msg->msg[2] >= 0x0C) {
+                    bool exists = false;
+
+                    for (int i = 0; i< sizeof(addresses); i++) {
+                        if(addresses[i].ah == msg->msg[12] && addresses[i].al == msg->msg[13]) {
+                            exists = true;
+                            break;
+                        }
+                    }
+
+                    if (!exists) {
+                        pc.printf("----------------------\r\n");
+                        for(int i = 0; i < msg->msg[2] + 4;i++){
+                            pc.printf("%02x ", msg->msg[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);
+                        addressCounter++;
+                    }
+
+                    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];
                     }
-                    sock.send_all(response, 17);
-                    pc.printf("Sending to server: %s\r\n", response);
-                    break;
-                case 0x01:
-                    int x = traitementAcc(data[1], data[2]);
-                    int y = traitementAcc(data[3], data[4]);
-                    int z = traitementAcc(data[5], data[6]);
-                    char out[128];
-                    sprintf(out, "Accelerometre [x: %d, y: %d, z: %d]", x,y,z);
-                
-                    sock.send_all(out, 128);
-                    pc.printf("Sending to server: %s\r\n", out);
-                    break;    
-            }
-            
-            /*
-            for(int i = 0; i < msg->msg[2] + 4;i++){
-                pc.printf("%02x ", msg->msg[i]);                
-            }
-            pc.printf("\r\n");*/
-            
-        }            
+
+                    switch(data[0]) {
+                        case 0x00:
+                            char response[] = "Etat du bouton:  ";
+                            if (data[1] == 0x00) {
+                                response[16] = '0';
+                            } else if (data[1] == 0x01) {
+                                response[16] = '1';
+                            }
+                            sock.send_all(response, 17);
+                            pc.printf("Sending to server: %s\r\n", response);
+                            break;
+                        case 0x01:
+                            int x = traitementAcc(data[1], data[2]);
+                            int y = traitementAcc(data[3], data[4]);
+                            int z = traitementAcc(data[5], data[6]);
+                            char out[128];
+                            sprintf(out, "Accelerometre [x: %d, y: %d, z: %d]", x,y,z);
+
+                            sock.send_all(out, 128);
+                            pc.printf("Sending to server: %s\r\n", out);
+                            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");
+                break;
+        }
+
         mPool.free(msg);
     }
 }
 
-void flashLED() {
+void error_display()
+{
+    while(1) {
+        Thread::signal_wait(0x1);
+        ledError = 1;
+        wait(1);
+        ledError = 0;
+    }
+}
+
+void flashLED()
+{
     bool high = true;
-    while(1){        
+    while(1) {
         Thread::signal_wait(0x1);
-        
-        for (int i = 0; i < addressCounter;i++){            
+
+        for (int i = 0; i < addressCounter; i++) {
             LED_Toggle[13] = addresses[i].ah;
             LED_Toggle[14] = addresses[i].al;
             LED_Toggle[18] = high ? 0x05 : 0x04;
             LED_Toggle[19] = checksum(LED_Toggle, sizeof(LED_Toggle));
-            
-            for (int j = 0; j < sizeof(LED_Toggle);j++){               
+
+            while(!xbee.writeable()) {}
+            for (int j = 0; j < sizeof(LED_Toggle); j++) {
                 xbee.putc(LED_Toggle[j]);
             }
         }
@@ -163,22 +216,25 @@
     }
 }
 
-void LEDSignal(){    
+void LEDSignal()
+{
     ledThread->signal_set(0x1);
 }
 
-void receiveEthernet(){
+void receiveEthernet()
+{
     char reception[256];
     sock.receive_all(reception, 256);
     //pc.printf("Received from server: %s", reception);
 }
 
-int main() {
+int main()
+{
     reset = 0;
     wait(0.4);
     reset = 1;
     wait(1);
-    
+
     int pan;
     char url[128];
 
@@ -186,68 +242,75 @@
     fscanf(f,"%x", &pan);
     fscanf(f,"%s", &url);
     fclose(f);
-    
+
     pc.printf("URL: %s", url);
-    
+
     char buff[2];
     buff[0]=(pan>>8)&0xff;
     buff[1]=(pan)&0xff;
-    
+
     AT_ID[7] = buff[0];
     AT_ID[8] = buff[1];
-    
+
     pc.printf("PAN: %02x%02x", AT_ID[7],AT_ID[8]);
-    
+
     char cs = checksum(AT_ID, sizeof(AT_ID));
-    pc.printf("CS: %02x", cs);
-    
+    pc.printf("CS: %02x\r\n", cs);
+
     AT_ID[9] = cs;
-    
-    for(char i = 0;i<sizeof(AT_ID);i++){
+
+    for(char i = 0; i<sizeof(AT_ID); i++) {
         xbee.putc(AT_ID[i]);
     }
-    
-    for(char i = 0;i<sizeof(AT_WR);i++){
+
+    for(char i = 0; i<sizeof(AT_WR); i++) {
         xbee.putc(AT_WR[i]);
     }
-    
-    for(char i = 0;i<sizeof(AT_AC);i++){
+
+    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)){};
     */
-    
+
+    Thread errorDisplayLocal;
+    errorDisplay = &errorDisplayLocal;
+    errorDisplay->start(&error_display);
+
     Thread localReceptionThread;
     receptionThread = &localReceptionThread;
     receptionThread->start(&reception);
-    
-    addresses[0].ah = 0x8e;
-    addresses[0].al = 0x69;
-    addressCounter++;    
+    Thread localLedThread;
+    ledThread = &localLedThread;
+    ledThread->start(&flashLED);
     
     Ticker horloge;
-    horloge.attach(&LEDSignal, 0.5);
-    
+    horloge.attach(&LEDSignal, 2.5);
+
     Thread localProcessingThread;
     processingThread = &localProcessingThread;
     processingThread->start(&processing);
     
-    Thread localLedThread;
-    ledThread = &localLedThread;
-    ledThread->start(&flashLED);
-    
+    /*
+    addresses[0].ah = 0xf4;
+    addresses[1].al = 0x13;
+    addressCounter++;
+    */
+
+
     Thread localEthernetReceptionThread;
     ethernetReceptionThread = &localEthernetReceptionThread;
     ethernetReceptionThread->start(&receiveEthernet);
-    
+
     while(1) {
+
     }
 }