mbed-os github

Dependencies:   ADS1015 Faulhaber HTU21D_mod MS5837_potless Sensor_Head_RevB_3 USBDevice_dfu Utilsdfu beep

Fork of ARNSRS_testDFU by POTLESS

Revision:
29:5b822d18bce6
Parent:
27:1b1fd20a2793
Child:
30:7a16a66d76f3
diff -r 59b416b8e4ac -r 5b822d18bce6 main.cpp
--- a/main.cpp	Tue Feb 13 16:57:47 2018 +0000
+++ b/main.cpp	Tue Feb 20 16:52:22 2018 +0000
@@ -1,65 +1,10 @@
-/*
-
-Câblage complet STM32L476RG :
-
-- Port SPI carte SD :
-
-MOSI        ->      PA_7
-MISO        ->      PA_6
-SCK         ->      PA_5
-CS          ->      PB_6
-
-- Sensor Head :
-
-Alim en 3.3v
-
-SCL         ->      PB_8
-SDA         ->      PB_9
-TX          ->      PC_12
-RX          ->      PD_2
-AlertRdy    ->      PA_11
-
-
-- HC_06 :
-
-Alim en 3.3v ou 5v
-
-TX          ->      PC_10
-RX          ->      PC_11
-
-- STM32L476RG sur carte alim AQL :
-
-Reférence drv8839 : http://www.ti.com/lit/ds/symlink/drv8839.pdf
-
-Volet Fuite :
-PWM     ->      PA_8        ->      Jump_4 & Jump_5
-FWD     ->      PB_4        ->      Jump_2
-REV     ->      PB_5        ->      Jump_1
-nSleep  ->      PC_5        ->      Jump_3
-Ch_A    ->      PB_9        ->      Codeur1 2
-Ch_B    ->      PB_8        ->      Codeur1 1
-
-Volet Poumon :
-PWM     ->      PB_1        ->      Jump_4 & Jump_5
-FWD     ->      PB_14       ->      Jump_2
-REV     ->      PB_13       ->      Jump_1
-nSleep  ->      PC_6        ->      Jump_3
-Ch_A    ->      PB_2        ->      Codeur2 2    
-Ch_B    ->      PB_1        ->      Codeur2 1
-
-Test POWER :
-
-V_usb    ->      PC_4        ->      MCU 1
-V_pile   ->      PA_10       ->      MCU 2
-
-*/
-
 #include "mbed.h"
 #include <string>
 #include "Sensor_head_revB.h"
 #include "HTU21D.h"
 #include "PID.h"
 #include "Faulhaber.h"
+#include "Utils.h"
 
 //Commandes  des servos
 #define PWM_SERVO_POUMON PB_15
@@ -78,6 +23,9 @@
 #define Channel_B_SERVO_FUITE PB_9
 #define HOME_SERVO_FUITE 90
 
+//Un peu plus ou un peu moins de sortie moniteurs pour du debug.... 
+#define DEBUG_MAIN 0
+
 //Ecrit dans le moniteur série de la tablette à 115200 bds si sur 1, penser à mettre NEED_CONSOLE_OUTPUT à 0
 #define NEED_ANDROID_OUTPUT 1
 
@@ -99,6 +47,13 @@
 #define ANDROID(...)
 #endif
 
+#if DEBUG_MAIN
+#define DEBUG_M(...) { serialMonit.printf(__VA_ARGS__); fflush(stdout);}
+#else
+#define DEBUG_M(...)
+#endif
+
+       
 //PinName pwm, PinName nSleep, PinName fwd, PinName rev, PinName channelA, PinName channelB, int pulsesPerRev, int Rapport, Encoding encoding = X2_ENCODING
 Faulhaber Servo_Poumon("Servo_Poumon", PWM_SERVO_POUMON, nSleep_SERVO_POUMON, FWD_SERVO_POUMON, REV_SERVO_POUMON, Channel_A_SERVO_POUMON, Channel_B_SERVO_POUMON, 16, 207, Faulhaber::X2_ENCODING);
 //Faulhaber Servo_Fuite("Servo_Fuite", PWM_SERVO_FUITE, nSleep_SERVO_FUITE, FWD_SERVO_FUITE, REV_SERVO_FUITE, 1, Channel_A_SERVO_FUITE, Channel_B_SERVO_FUITE, 16, 207, Faulhaber::X2_ENCODING);
@@ -128,6 +83,9 @@
 //Flag pour interrompre l'affichage si on veut...
 bool FLAG_AFF = true;
 
+//Flag pour interrompre l'enregistrement si on veut...
+bool FLAG_REC = true;
+
 //Variables de stockage des infos capteurs
 int co2 = 0;
 float pression = 0;
@@ -144,7 +102,7 @@
 Timer REAL_RATE;
 float RATE = 0;
 float RATE_TRUE = 0;
-float Ref_Time = 1.0; //La durée de la boucle désirée...
+float Ref_Time = 2.0; //La durée de la boucle désirée...
 
 //HTU21D sur l'I2C
 HTU21D temphumid(PB_9, PB_8); //Temp humid sensor || SDA, SCL
@@ -188,15 +146,41 @@
 
 //Boolean du status de l'appareil, en mode SECU ou nominal
 bool EN_MODE_SECU = false;
-AnalogIn V_USB(PC_4);
+DigitalIn V_USB(PA_0);
 float Vusb = 1;
 
 //Interruption user button
 InterruptIn button(USER_BUTTON);
 volatile int  GO = 0;
 
+void Affichage()
+{
+
+    serialMonit.printf("\r\n");
+    serialMonit.printf("  CO2             = %d ppm\r\n"  , co2);
+    serialMonit.printf("  PPO2            = %d mb\r\n", ppO2);
+    serialMonit.printf("  OTU             = %d \r\n", OTU);
+    serialMonit.printf("  Pression        = %f msw\r\n", pression);
+    serialMonit.printf("  Temp MS5837     = %f C\r\n", Temp1);
+    serialMonit.printf("  Temp HTU21D     = %f C\n\r", Temp2);
+    serialMonit.printf("  Humidity        = %d %%\n\r", Humid);
+    serialMonit.printf("\n\r");
+    serialMonit.printf("  Cell O2 n 1     = %d\r\n"  , CellO2_1);
+    serialMonit.printf("  Cell O2 n 2     = %d\r\n"  , CellO2_2);
+    serialMonit.printf("\r\n");
+    serialMonit.printf("  Volet Poumon    = %f\r\n"  , volet_poumon_Position);
+    serialMonit.printf("  Volet Fuite     = %f\r\n"  , volet_fuite_Position);
+    serialMonit.printf("\r\n");
+    serialMonit.printf("  Temps d execution de la boucle = %f seconde(s)\n", (RATE + RATE_TRUE / 1000));
+    serialMonit.printf("\r\n");
+    serialMonit.printf("  A enregistrer = %s\n", to_store);
+    serialMonit.printf("\r\n");
+    serialMonit.printf("  V_USB = %f", Vusb);
+    serialMonit.printf("\r\n\r\n");
+    fflush(stdout);
+}
+
 void pressed() {
- 
   GO = GO + 1;
   if (GO > 1) NVIC_SystemReset(); 
 }
@@ -219,45 +203,44 @@
         if (Servo_Poumon.Pos_OK() == true) break;
         //if (Servo_Poumon.Pos_OK() == true && Servo_Fuite.Pos_OK() == true) break;
     }
-    printf("-------------- Appareil en mode SECU ---------------\r\n");
+    DEBUG_M("-------------- Appareil en mode SECU ---------------\r\n");
     
     wait_ms(100);
-    Consigne_poumon = 90;
-    
-    while(1) {
-        wait_ms(100);
-        if (Servo_Poumon.Pos_OK() == true) break;
-        //if (Servo_Poumon.Pos_OK() == true && Servo_Fuite.Pos_OK() == true) break;
-    }
-    printf("-------------- Appareil en mode SECU ---------------\r\n");
-    
     
     EN_MODE_SECU = true;
     wait_ms(100);
     int Pos = Servo_Poumon.getPulses();
     UTILS::Store_A_Val((float)Pos, "Servo_Poumon");
-    printf("  position volet poumon sauvegardée = %d pulse(s)\r\n", Pos);
+    DEBUG_M("  position volet poumon sauvegardée = %d pulse(s)\r\n", Pos);
     //Pos = Servo_Fuite.getPulses();
     //UTILS::Store_A_Val((float)Pos, "Servo_Fuite");
-    //printf("  position volet fuite sauvegardée = %d pulse(s)\r\n", Pos);
-    UTILS::UnMount_SD();
+    //DEBUG_M("  position volet fuite sauvegardée = %d pulse(s)\r\n", Pos);
+    UTILS::UnMount_Flash();
     Servo_Poumon.Sleep();
 }
 
 //Sequence d'arrêt
 void Stop_Sequence()
-{
+{   
     Mode_SECU();  
-    printf("----------------ARRET DE L'APPAREIL--------------------\r\n");
-    deepsleep();
+    DEBUG_M("----------------ARRET DE L'APPAREIL--------------------\r\n");
+    
+    DEBUG_M("  Deep sleep autorisé : %i\r\n", sleep_manager_can_deep_sleep());
+    wait(1.0);
+    sleep_manager_sleep_auto();
 }
 
 //Fonction test de valeur d'entrée convertie en Hight / Low
-float Power_Test(AnalogIn& pin)
+int Power_Test(DigitalIn& pin)
 {
-    float Val = pin.read();
-    if(Val < 0.2) Stop_Sequence();
-    return Val;
+    pin.mode(PullDown);
+    
+    if(!pin){
+         Stop_Sequence();
+         return 0;
+    }else{
+         return 1;
+    }          
 }
 
 //Contrôle du status de l'appareil / des constantes
@@ -322,6 +305,7 @@
         
         //Servo_Fuite.Go_To_Prop(Consigne_fuite);
         //Servo_Fuite.Go_To_PID(Consigne_fuite);
+        //Servo_Fuite.Go_To(Consigne_fuite, Volets_Speed, Volet_DeadBand );
     }
 }
 
@@ -335,47 +319,21 @@
     }
 }
 
-void Affichage_moniteur()
-{
-
-    printf("\r\n");
-    printf("  CO2             = %d ppm\r\n"  , co2);
-    printf("  PPO2            = %d mb\r\n", ppO2);
-    printf("  OTU             = %d \r\n", OTU);
-    printf("  Pression        = %f msw\r\n", pression);
-    printf("  Temp MS5837     = %f C\r\n", Temp1);
-    printf("  Temp HTU21D     = %f C\n\r", Temp2);
-    printf("  Humidity        = %d %%\n\r", Humid);
-    printf("\n\r");
-    printf("  Cell O2 n 1     = %d\r\n"  , CellO2_1);
-    printf("  Cell O2 n 2     = %d\r\n"  , CellO2_2);
-    printf("\r\n");
-    printf("\n");
-    printf("  Volet Poumon    = %f\r\n"  , volet_poumon_Position);
-    printf("  Volet Fuite     = %f\r\n"  , volet_fuite_Position);
-    printf("\r\n");
-    printf("Temps d execution de la boucle = %f seconde(s)\n", (RATE + RATE_TRUE / 1000));
-    printf("\r\n");
-    printf("A enregistrer = %s\n", to_store);
-    printf("\r\n");
-    printf("V_USB = %f", Vusb);
-    printf("\r\n");
-    
-}
-
 //Callback de l'intérruption des envois de commandes depuis le terminal
 void callbackParam()
-{
-    while(serialMonit.readable()) {
-        if (indexParam  == sizeParam) //éviter la saturation du buffer
-            serialMonit.getc();
-        else
-            param [indexParam++] = serialMonit.getc();//chargement du buffer dans le message
-        if ((indexParam == sizeParam) || (param[indexParam -1] == '\n')) {//le message est complet ou nouvelle ligne ou autre si on veut...
-            param[indexParam] = 0;
-            newParamFlag  = true;
-        }
-    }
+{    
+    while(serialMonit.readable())
+     {
+       if ((indexParam  == sizeParam) || newParamFlag  == true) //éviter la saturation du buffer
+            char char_flush = serialMonit.getc();
+        else 
+            param [indexParam ++] = serialMonit.getc();//chargement du buffer dans le message
+       
+       if ((indexParam == sizeParam) || (param[indexParam - 1] == '\n')) {//le message est complet ou nouvelle ligne ou autre si on veut...
+       param[indexParam] = 0;
+       newParamFlag  = true;
+      }
+   }  
 }
 
 //Callback de l'intérruption des envois de commandes depuis Android
@@ -395,34 +353,66 @@
 
 void Decoding_Message(char message [])
 {
-    char *commande = 0;
-    float valeur = 0;
 
-    sscanf(message,"%s %f",&commande , &valeur);
+    char com[sizeParam] = "";
+    float val = 0.0;
+    
+    sscanf(message,"%s %f",&com , &val);
+        
+    DEBUG_M("\r\n  Commande = %s       Valeur = %f \r\n\r\n", com, val);
 
-    if ((char)commande == 'S') {
+    if (0 == strcmp(com, "secu-")) {
         Mode_SECU();
-    }else if ((char)commande == 'D') {
-        UTILS::Dir_SD();
-    }else if ((char)commande == 'U') {
+    }else if (0 == strcmp(com, "help")) {
+        FLAG_AFF = false;
+        UTILS::Help();    
+    }else if (0 == strcmp(com, "start")) {
+        FLAG_AFF = true;
+    }else if (0 == strcmp(com, "stop")) {
+        FLAG_AFF = false;
+        UTILS::Help();       
+    }else if (0 == strcmp(com, "clean")) {
+        //Enregistrement de la chaine
+        FLAG_REC = false;
+        UTILS::Clean_Flash();
+    }else if (0 == strcmp(com, "dir")) {
+        FLAG_REC = false;
+        UTILS::Dir_Flash();
+        FLAG_REC = true;
+    }else if (0 == strcmp(com, "get")) {
+        FLAG_REC = false;        
+        wait_ms(100);
         char filename[20];
-        sprintf(filename, "LOG_%d.txt", (int)valeur);
-        UTILS::Read_SD_File(filename);    
-    } else if ((char)commande == 'r') {
+        sprintf(filename, "LOG_%d.txt", (int)val);
+        UTILS::Read_Flash_File(filename);
+        wait_ms(100);
+        FLAG_REC = true;
+    }else if (0 == strcmp(com, "del")) {
+        FLAG_REC = false;
+        char filename[20];
+        sprintf(filename, "LOG_%d.txt", (int)val);
+        UTILS::Delete_Flash_File(filename);
+        UTILS::Dir_Flash();
+        FLAG_REC = true;           
+    } else if (0 == strcmp(com, "calib_p")) {
         Consigne_poumon = 0;
         volet_poumon_Position = 0;
         Servo_Poumon.reset();
-    } else if ((char)commande == 'Q') {
+    } else if (0 == strcmp(com, "calib_f")) {
+        Consigne_fuite = 0;
+        volet_fuite_Position = 0;
+        //Servo_Fuite.reset();    
+    } else if (0 == strcmp(com, "sleep")) {
         Stop_Sequence();
-    } else if ((char)commande == 'T') {
-        set_time(valeur);
-    } else if ((char)commande == 'I') {
-        Consigne_poumon = (float)valeur;
-        printf("  Servo Poumon    = %f\r\n", Consigne_poumon);
-    } else if ((char)commande == 'O') {
-        Consigne_fuite = (float)valeur;
-        printf("  Servo Fuite     =  %f\r\n", Consigne_fuite);
-    } else if ((char)commande == 'R') {
+    } else if (0 == strcmp(com, "time")) {//Depuis terminal MAC taper : " date +%s "
+        set_time(val);
+    } else if (0 == strcmp(com, "c_pou")) {
+        Consigne_poumon = (float)val;
+        DEBUG_M("  Servo Poumon    = %f\r\n", Consigne_poumon);
+    } else if (0 == strcmp(com, "c_fui")) {
+        Consigne_fuite = (float)val;
+        DEBUG_M("  Servo Fuite     =  %f\r\n", Consigne_fuite);
+    } else if (0 == strcmp(com, "reset")) {
         NVIC_SystemReset();
         /////////////////////////////////////////
         //Pour rajouter une commande
@@ -433,7 +423,7 @@
     } else {
         sensors.cozirSend(message);
     }
-
+    
     strcpy(param," ");
     indexParam = 0;
     newParamFlag = false;
@@ -450,10 +440,10 @@
         set_time(valeur);
     } else if ((char)commande == 'I') {
         Consigne_poumon = (float)valeur;
-        printf("  Servo Poumon    = %f\r\n", Consigne_poumon);
+        DEBUG_M("  Servo Poumon    = %f\r\n", Consigne_poumon);
     } else if ((char)commande == 'O') {
         Consigne_fuite = (float)valeur;
-        printf("  Servo Fuite     =  %f\r\n", Consigne_fuite);
+        DEBUG_M("  Servo Fuite     =  %f\r\n", Consigne_fuite);
         /////////////////////////////////////////
         //Pour rajouter une commande
         //} else if ((char)commande == 'X') {
@@ -468,21 +458,21 @@
         Kc = (float)valeur;
         control_Servo.reset();
         control_Servo.setTunings(Kc, Ti, Td);
-        printf("  UPDATE PID -->  Kc = %f   Ti = %f   Td = %f\r\n\n", Kc, Ti, Td);
+        DEBUG_M"  UPDATE PID -->  Kc = %f   Ti = %f   Td = %f\r\n\n", Kc, Ti, Td);
     } else if ((char)commande == 'i') {
         Ti = (float)valeur;
         control_Servo.reset();
         control_Servo.setTunings(Kc, Ti, Td);
-        printf("  UPDATE PID -->  Kc = %f   Ti = %f   Td = %f\r\n\n", Kc, Ti, Td);
+        DEBUG_M("  UPDATE PID -->  Kc = %f   Ti = %f   Td = %f\r\n\n", Kc, Ti, Td);
     } else if ((char)commande == 'd') {
         Td = (float)valeur;
         control_Servo.reset();
         control_Servo.setTunings(Kc, Ti, Td);
-        printf("  UPDATE PID -->  Kc = %f   Ti = %f   Td = %f\r\n\n", Kc, Ti, Td);
+        DEBUG_M("  UPDATE PID -->  Kc = %f   Ti = %f   Td = %f\r\n\n", Kc, Ti, Td);
     } else if ((char)commande == 'c') {
         consigne = valeur;
         control_Servo.setSetPoint(consigne);
-        printf("  UPDATE CONSIGNE PID -->  Consigne = %d\r\n\n", consigne);
+        DEBUG_M("  UPDATE CONSIGNE PID -->  Consigne = %d\r\n\n", consigne);
     }
 #endif
 
@@ -498,25 +488,26 @@
     char Time[40];
     strftime(Time, 40, "%a_%d_%m_%Y_%H%M", localtime(&seconds));
     sprintf(Log_File_Name, "%s_LOG.txt", Time);
-    printf("Nouveau fichier LOG = %s \r\n", Log_File_Name);
-    
+    DEBUG_M("Nouveau fichier LOG = %s \r\n", Log_File_Name);   
     }
     
 void Create_File_Name_Index()
 {
     //Du nom du fichier par Index
     sprintf(Log_File_Name, "LOG_%d.txt", UTILS::File_Index());
-    printf("  Nouveau fichier LOG = %s \r\n", Log_File_Name);    
+    DEBUG_M("  Nouveau fichier LOG = %s \r\n", Log_File_Name);    
     }
     
 int main()
 {
+    
    button.fall(&pressed);
+   
    int count = 0;
     
    while (1) { 
    
-   if (count == 0) serialMonit.printf("\r\nAppuyez sur le User Button pour commencer...\r\n");
+   if (count == 0) serialMonit.printf("\r\nAppuyez sur le User Button pour commencer...\r\n\r\n");
    
    count = 1;
    
@@ -529,13 +520,13 @@
     android.attach(&callbackAndroid, Serial::RxIrq);
 
     //Ci-dessous commande pour formater une nouvelle carte
-    UTILS::Format_SD();
+    //UTILS::Format_Flash();
 
-    //Montage carte SD 
-    UTILS::Mount_SD();
+    //Montage Flash 
+    UTILS::Mount_Flash();
     
-    //Liste des fichiers sur la carte sd
-    UTILS::Dir_SD();
+    //Liste des fichiers sur la Flash
+    UTILS::Dir_Flash();
     
     bool calib_O2 = false;
     bool calib_CO2 = false;
@@ -565,13 +556,13 @@
     wait(1);
     
     Servo_Poumon.Init("Servo_Poumon");
-    //Servo_Fuite.Init();
+    //Servo_Fuite.Init("Servo_Fuite");
      
     //Création du nouveau fichier LOG par index / par date.
     Create_File_Name_Index();
     //Create_File_Name_Date()
     
-    serialMonit.printf("  Demarrage des threads...\r\n\r\n");
+    DEBUG_M("  Demarrage des threads...\r\n\r\n");
 
     /*
 
@@ -617,20 +608,20 @@
     control_Servo.setSetPoint(consigne);
 #endif
     
-    serialMonit.printf("  Threads démmarés.....Entrez les comandes COZIR si besoin :\r\n");
-     
+    DEBUG_M("  Threads démmarés.....\r\n\r\n  Tapez help pour voir la liste des commandes disponibles.\r\n ");
+         
     while (true) {
         
         //Démarrage du Timer mesurant le temps d'éxecution du code
         REAL_RATE.start();
 
         if (newParamFlag) {
-            serialMonit.printf("Param = %s\r\n", param);
+            DEBUG_M("  From PC = %s\r\n", param);
             Decoding_Message(param);
         }
 
         if (newAndroidFlag) {
-            serialMonit.printf("Android = %s\r\n", Android);
+            DEBUG_M("  From Android = %s\r\n", Android);
             Decoding_Message_Android(Android);
         }
 
@@ -682,12 +673,9 @@
                );
 #endif
 
-        //Enregistrement de la chaine
-        UTILS::Write_SD_File(to_store, Log_File_Name);
-
         //Pour Android on ajoute < et > pour décoder l'arrivée du message
         if (NEED_ANDROID_OUTPUT == 1) {
-            //sprintf(to_android,"<%s>",to_store);
+            sprintf(to_android,"<%s>",to_store);
             ANDROID(to_android);
         }
 
@@ -695,7 +683,10 @@
         Calcul_OTU();
 
         //Vers le moniteur série
-        if (FLAG_AFF) Affichage_moniteur();
+        if (FLAG_AFF) Affichage();
+        
+        //Enregistrement de la chaine
+        if (FLAG_REC) UTILS::Write_Flash_File(to_store, Log_File_Name);
 
 
 #ifdef PID_MODE
@@ -720,7 +711,7 @@
 #ifdef PID_MODE
             control_Servo.setInterval(RATE);
 #endif
-            printf("Pour ralentir le code, Ref_Time doit être supérieur à %f seconde(s)\r\n\n", RATE);
+            DEBUG_M("Pour ralentir le code, Ref_Time doit être supérieur à %f seconde(s)\r\n\n", RATE);
         }
 
         wait_ms(RATE_TRUE);