une 30aine passés sans pb entre les trames

Dependencies:   ADS1015 ARNSRS_SENSORS DmTftLibrary MS5803_14BA SDFileSystem mbed

Fork of ARNSRS_SERVOS_USB_TFT by POTLESS

Revision:
14:e6686a44db84
Parent:
13:aa620707126d
Child:
15:c9205e490740
--- a/main.cpp	Mon May 08 13:15:35 2017 +0000
+++ b/main.cpp	Mon May 08 16:01:53 2017 +0000
@@ -15,12 +15,12 @@
 #include "SDFileSystem.h"
 #include "ARNSRS_SENSORS.h"
 #include "ble/BLE.h"
- 
+
 #include "ble/services/UARTService.h"
 #include <string>
 
 //Ecrit dans le moniteur série de l'ordi à 9600 bds
-#define DEBUG(...) { printf(__VA_ARGS__); }
+#define DEBUG(...) { serialMonit.printf(__VA_ARGS__); }
 
 //Init BLE
 BLEDevice  ble;
@@ -33,7 +33,7 @@
 bool FLAG_SIMPLE_TIME = false;
 
 //COM Série vers l'ordi, Serial 2 par défaut
-Serial serialMonit (USBTX,USBRX); 
+Serial serialMonit (USBTX,USBRX);
 
 //Variable des capteurs
 int co2 = 0;
@@ -52,16 +52,19 @@
 int points = 1;
 
 //Fonction pour créer et envoyer la chaine d'in en BLE
-void build_send_Message(int co2, int ppo2, float press){
-    char buf[50];        
-    sprintf(buf,"%d %d %f\r\n", ppo2, co2, press);
-    uartServicePtr->writeString(buf);      
-    }
+//On balance tout en float, même pour des int...Qu peut le plus peut le moins...
+//3 par 3 ça passe juste avec un décimal....Sinon faire deux par deux ???
+void build_send_Message(string com, float A, float B, float C)
+{
+    char buf[50];
+    sprintf(buf,"%s %.1f %.1f %.1f\r\n", com, A, B, C);
+    uartServicePtr->writeString(buf);
+}
 
 void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *params)
 {
-    DEBUG("Disconnected!\n\r");
-    DEBUG("Restarting the advertising process\n\r");
+    //DEBUG("Disconnected!\n\r");
+    //DEBUG("Restarting the advertising process\n\r");
     ble.startAdvertising();
 }
 
@@ -69,29 +72,70 @@
 {
     if ((uartServicePtr != NULL) && (params->handle == uartServicePtr->getTXCharacteristicHandle())) {
         uint16_t bytesRead = params->len;
-        
-        // chaine reçue de l'app android (à dimensionner selon besoin)        
-        char commande [bytesRead] ; 
-        
+        /*
+        // les chaines de réponse
+        /uint8_t press_mb_ToSend[14];
+        uint8_t co2_ppm_ToSend[14];
+        uint8_t o2_mb_ToSend[14];
+
+        // fabrication des chaines de réponse
+        // on suppose que chaque donnee peut être représentée par 5 digits
+        char s_press_mb [50];
+        sprintf(s_press_mb,"PRESS %i mb    ",press_mb);  // mef ! laisser les espaces de la fin
+
+        char s_co2_ppm [50];
+        sprintf(s_co2_ppm,"CO2 %i ppm     ",co2_ppm);
+
+        char s_o2_mb [50];
+        sprintf(s_o2_mb,"O2 %i mb        ",o2_mb);
+
+        // convertir les chaines en uint8_t
+        for(int j=0;j<sizeof(s_press_mb);j++){ // hypothèse : les chaines press, co2, o2 ont la même longeur
+            press_mb_ToSend[j]=s_press_mb[j];
+            co2_ppm_ToSend[j]=s_co2_ppm[j];
+            o2_mb_ToSend[j]=s_o2_mb[j];
+        }
+        */
+        // chaine reçue de l'app android (à dimensionner selon besoin)
+        char commande [bytesRead] ;
+
         // conversion de la commande uint8_t en chaine pour permettre comparaison avec commandes connues
-        for (int j=0;j<bytesRead;j++) {
-        commande [j] = (*((params->data)+j));
+        for (int j=0; j<bytesRead; j++) {
+            commande [j] = (*((params->data)+j));
         }
-                
+
+/*
         DEBUG("received %u bytes => ", bytesRead);
         DEBUG("commande recue -%s-\r\n",commande);
         DEBUG ( "comparaison a commande 'p' vaut %d\r\n",strcmp(commande, "p"));
         DEBUG ( "comparaison a commande 'o' vaut %d\r\n",strcmp(commande, "o"));
         DEBUG ( "comparaison a commande 'c' vaut %d\r\n",strcmp(commande, "c"));
-        
-        
-        DEBUG("Tous les capteurs = %d %d %d\r\n", ppO2, co2, pression);
-        build_send_Message(ppO2, co2, pression);
-            
-       } 
-    
+        DEBUG ( "comparaison a commande 't' vaut %d\r\n",strcmp(commande, "t"));
+        DEBUG ( "comparaison a commande 'u' vaut %d\r\n",strcmp(commande, "t"));
+
+        // envoi des réponses en fonction de la commande recue
+        if (strcmp(commande, "p") == 0) {
+            DEBUG("s_press_mb %s +++> data to send %s \r\n",s_press_mb,press_mb_ToSend);
+            ble.updateCharacteristicValue(uartServicePtr->getRXCharacteristicHandle(), press_mb_ToSend, sizeof(press_mb_ToSend));
+            }
+        if (strcmp(commande, "c") == 0) {
+            DEBUG("s_co2_ppm %s +++> data to send %s \r\n",s_co2_ppm,co2_ppm_ToSend);
+            ble.updateCharacteristicValue(uartServicePtr->getRXCharacteristicHandle(), co2_ppm_ToSend, sizeof(co2_ppm_ToSend));
+            }
+        if (strcmp(commande, "o") == 0) {
+            DEBUG("s_o2_mb %s +++> data to send %s \r\n",s_o2_mb,o2_mb_ToSend);
+            ble.updateCharacteristicValue(uartServicePtr->getRXCharacteristicHandle(), o2_mb_ToSend, sizeof(o2_mb_ToSend));
+            }
+        else */
+        if (strcmp(commande, "t") == 0) {
+            build_send_Message("t", ppO2, co2, pression);
+        }else
+        if (strcmp(commande, "u") == 0) {
+            build_send_Message("u", Temp1, Temp2, Humi);
+        }
+    }
 }
-    
+
 //Fonction qui change le nom du fichier ouvert pour le LOG
 FILE *nextLogFile(void)
 {
@@ -105,46 +149,49 @@
     } while (filePtr != NULL);
     return fopen( fileName,"w");
 }
-void SetTime() {
-  //Reglage date / heure depuis le terminal
+void SetTime()
+{
+    //Reglage date / heure depuis le terminal
     struct tm t;
-    printf("Entrer la date et l'heure :\n");
-    printf("YYYY MM DD HH MM SS [enter]\n");    
+    DEBUG("Entrer la date et l'heure :\n");
+    DEBUG("YYYY MM DD HH MM SS [enter]\n");
     scanf("%d %d %d %d %d %d", &t.tm_year, &t.tm_mon, &t.tm_mday
-                             , &t.tm_hour, &t.tm_min, &t.tm_sec);
+          , &t.tm_hour, &t.tm_min, &t.tm_sec);
     t.tm_year = t.tm_year - 1900;
     t.tm_mon = t.tm_mon - 1;
-    
+
     // set the time
-    set_time(mktime(&t));   
+    set_time(mktime(&t));
 }
 
-void init_DATALOG(){
+void init_DATALOG()
+{
     //Initialisation DATA LOG
-    serialMonit.printf("Initialisation SD card\r\n");
+    DEBUG("Initialisation SD card\r\n");
     fp = nextLogFile();
-    
-    if (!fp) {       
-    serialMonit.printf("Probleme SD card...Fin du programme...\r\n");
-    //exit(0); 
-    }else{
-    serialMonit.printf("Nouveau fichier LOG cree  =  %s\r\n", fileName);
-    serialMonit.printf("\r\n", "");    
-    }   
+
+    if (!fp) {
+        DEBUG("Probleme SD card...Fin du programme...\r\n");
+        //exit(0);
+    } else {
+        DEBUG("Nouveau fichier LOG cree  =  %s\r\n", fileName);
+        DEBUG("\r\n", "");
     }
- 
-void DATA_LOG(){
+}
+
+void DATA_LOG()
+{
     time_t seconds = time(NULL);
     if (fp) {
-        fprintf(fp, "%s,%d,%d,%f,%f,%f,%f\r\n", ctime(&seconds), co2 , ppO2, pression, Temp1, Temp2, Humi);       
-        serialMonit.printf("  Enregistrement d'un point sur la carte SD\r\n");
-        serialMonit.printf("  Nombre de points                      = %d\r\n", points);
-        serialMonit.printf("\r\n", "");
-        points++; 
-        }else{
-        serialMonit.printf("  Probleme carte SD\r\n");    
-        }
-    }        
+        fprintf(fp, "%s,%d,%d,%f,%f,%f,%f\r\n", ctime(&seconds), co2 , ppO2, pression, Temp1, Temp2, Humi);
+        DEBUG("  Enregistrement d'un point sur la carte SD\r\n");
+        DEBUG("  Nombre de points                      = %d\r\n", points);
+        DEBUG("\r\n", "");
+        points++;
+    } else {
+        DEBUG("  Probleme carte SD\r\n");
+    }
+}
 ///////////////////////////////////
 // fonction initialisation    /////
 ///////////////////////////////////
@@ -152,9 +199,9 @@
 {
     //Réglage de l'heure
     SetTime();
-    
+
     init_DATALOG();
-    
+
     //Initialisation capteurs
     arnsrs.Sensors_INIT(false, 5, SPOOLING, DIGI_FILTER32, CALIB_AIR);
 }
@@ -167,11 +214,11 @@
 {
     setup();
 
-DEBUG("Initialising....\n\r");
+    //DEBUG("Initialising....\n\r");
     ble.init();
     ble.onDisconnection(disconnectionCallback);
     ble.onDataWritten(onDataWritten);
- 
+
     /* setup advertising */
     ble.accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED);
     ble.setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
@@ -179,32 +226,30 @@
                                      (const uint8_t *)"BLE UART", sizeof("BLE UART") - 1);
     ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_128BIT_SERVICE_IDS,
                                      (const uint8_t *)UARTServiceUUID_reversed, sizeof(UARTServiceUUID_reversed));
- 
+
     ble.setAdvertisingInterval(1000); /* 1000ms; in multiples of 0.625ms. */
     ble.startAdvertising();
- 
+
     UARTService uartService(ble);
     uartServicePtr = &uartService;
-    
-    while (true) {
-        
-    ble.waitForEvent();
-    
-    
+
+
     while (1) {
 
-        wait(2);
-        
+        ble.waitForEvent();
+
+        wait_ms(500);
+
         //RTC
         time_t seconds = time(NULL);
-        
-        printf("  Date / Heure = %s\r\n", ctime(&seconds));
-        
+
+        DEBUG("  Date / Heure = %s\r\n", ctime(&seconds));
+
         //CO2 / H / T sur Cozir
         co2 = arnsrs.requestCO2();
         Humi = arnsrs.requestHUMI();
-        Temp1 = arnsrs.requestTEMP(); 
-        
+        Temp1 = arnsrs.requestTEMP();
+
         //P / T sur MS5803_14BA
         pression = arnsrs.requestPress();
         Temp2 =  arnsrs.requestTemp();
@@ -213,20 +258,18 @@
         ppO2 = arnsrs.requestPpO2(false);
 
         //Affichage sur moniteur série
-        serialMonit.printf("  CO2           = %d\r\n"  , co2);   
-        serialMonit.printf("  Humidité      = %f\r\n"  , Humi); 
-        serialMonit.printf("  Température   = %f\r\n"  ,Temp1);
+        DEBUG("  CO2           = %d\r\n"  , co2);
+        DEBUG("  Humidité      = %f\r\n"  , Humi);
+        DEBUG("  Température   = %f\r\n"  ,Temp1);
         //P / T sur MS5803
-        serialMonit.printf("  Pression      = %f\r\n", pression);
-        serialMonit.printf("  Température   = %f\r\n", Temp2);
+        DEBUG("  Pression      = %f\r\n", pression);
+        DEBUG("  Température   = %f\r\n", Temp2);
         //PPO2 sur ADS1015
-        serialMonit.printf("  PPO2          = %d\r\n", ppO2);
-        serialMonit.printf("\r\n", "");
+        DEBUG("  PPO2          = %d\r\n", ppO2);
+        DEBUG("\r\n", "");
 
         //Data LOG
         DATA_LOG();
-               
-    }
-    
+
     }
 }