mbed-os github
Dependencies: ADS1015 Faulhaber HTU21D_mod MS5837_potless Sensor_Head_RevB_3 USBDevice_dfu Utilsdfu beep
Fork of ARNSRS_testDFU by
Diff: main.cpp
- 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);