mbed-os github

Dependencies:   ADS1015 Faulhaber HTU21D_mod MS5837_potless Sensor_Head_RevB_3 USBDevice_dfu Utilsdfu beep

Fork of ARNSRS_testDFU by POTLESS

Committer:
POTLESS_2
Date:
Mon Apr 09 06:52:00 2018 +0000
Revision:
42:3591ec9903b4
Parent:
41:51ba69648f9d
Child:
43:5ae8baf28e32
modifs

Who changed what in which revision?

UserRevisionLine numberNew contents of line
potless 1:bef7856b5c0a 1 #include "mbed.h"
potless 2:4a8bf1d53439 2 #include <string>
POTLESS_2 7:ad15c386e960 3 #include "Sensor_head_revB.h"
POTLESS_2 8:a750d531b381 4 #include "HTU21D.h"
POTLESS_2 12:7f3aadd79f89 5 #include "PID.h"
POTLESS_2 19:cac3761a5d0b 6 #include "Faulhaber.h"
POTLESS_2 29:5b822d18bce6 7 #include "Utils.h"
POTLESS_2 4:d84250f67dec 8
POTLESS_2 17:bef8abc445f2 9 //Commandes des servos
POTLESS_2 19:cac3761a5d0b 10 #define PWM_SERVO_POUMON PB_15
POTLESS_2 19:cac3761a5d0b 11 #define nSleep_SERVO_POUMON PC_6
POTLESS_2 19:cac3761a5d0b 12 #define FWD_SERVO_POUMON PB_14
POTLESS_2 19:cac3761a5d0b 13 #define REV_SERVO_POUMON PB_13
POTLESS_2 19:cac3761a5d0b 14 #define Channel_A_SERVO_POUMON PB_1
POTLESS_2 19:cac3761a5d0b 15 #define Channel_B_SERVO_POUMON PB_2
POTLESS_2 19:cac3761a5d0b 16 #define HOME_SERVO_POUMON 0
POTLESS_2 17:bef8abc445f2 17
POTLESS_2 19:cac3761a5d0b 18 #define PWM_SERVO_FUITE PB_10
POTLESS_2 19:cac3761a5d0b 19 #define nSleep_SERVO_FUITE PC_5
POTLESS_2 19:cac3761a5d0b 20 #define FWD_SERVO_FUITE PB_4
POTLESS_2 19:cac3761a5d0b 21 #define REV_SERVO_FUITE PB_5
POTLESS_2 19:cac3761a5d0b 22 #define Channel_A_SERVO_FUITE PB_8
POTLESS_2 19:cac3761a5d0b 23 #define Channel_B_SERVO_FUITE PB_9
POTLESS_2 19:cac3761a5d0b 24 #define HOME_SERVO_FUITE 90
POTLESS_2 17:bef8abc445f2 25
POTLESS_2 17:bef8abc445f2 26 //Ecrit dans le moniteur série de la tablette à 115200 bds si sur 1, penser à mettre NEED_CONSOLE_OUTPUT à 0
POTLESS_2 41:51ba69648f9d 27 #define NEED_ANDROID_OUTPUT 0
POTLESS_2 9:04bfdfc029cb 28
POTLESS_2 17:bef8abc445f2 29 //Mode PID, STD à commenter / décommenter
POTLESS_2 17:bef8abc445f2 30 #define STD_MODE
POTLESS_2 17:bef8abc445f2 31 //#define PID_MODE
POTLESS_2 11:b2feed92584a 32
POTLESS_2 12:7f3aadd79f89 33 #ifdef STD_MODE
POTLESS_2 12:7f3aadd79f89 34 int MODE_FLAG = 0;
POTLESS_2 11:b2feed92584a 35 #endif
POTLESS_2 11:b2feed92584a 36
POTLESS_2 12:7f3aadd79f89 37 #ifdef PID_MODE
POTLESS_2 12:7f3aadd79f89 38 int MODE_FLAG = 2;
POTLESS_2 11:b2feed92584a 39 #endif
POTLESS_2 11:b2feed92584a 40
POTLESS_2 9:04bfdfc029cb 41 #if NEED_ANDROID_OUTPUT
POTLESS_2 9:04bfdfc029cb 42 #define ANDROID(...) { android.printf(__VA_ARGS__); }
POTLESS_2 9:04bfdfc029cb 43 #else
POTLESS_2 9:04bfdfc029cb 44 #define ANDROID(...)
POTLESS_2 9:04bfdfc029cb 45 #endif
POTLESS_2 9:04bfdfc029cb 46
POTLESS_2 33:f5d4bae05f16 47 #if DEBUG_MODE
POTLESS_2 42:3591ec9903b4 48 #define DEBUG(...) { printf(__VA_ARGS__); fflush(stdout);}
POTLESS_2 29:5b822d18bce6 49 #else
POTLESS_2 33:f5d4bae05f16 50 #define DEBUG(...)
POTLESS_2 29:5b822d18bce6 51 #endif
POTLESS_2 29:5b822d18bce6 52
POTLESS_2 34:26f6e3dbefb9 53
POTLESS_2 25:322ef9488e65 54 //PinName pwm, PinName nSleep, PinName fwd, PinName rev, PinName channelA, PinName channelB, int pulsesPerRev, int Rapport, Encoding encoding = X2_ENCODING
POTLESS_2 25:322ef9488e65 55 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);
POTLESS_2 22:555c2930e8e0 56 //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);
POTLESS_2 17:bef8abc445f2 57
POTLESS_2 17:bef8abc445f2 58 //Moniteur série, Serial 2
POTLESS_2 42:3591ec9903b4 59 Serial serialMonit(PC_10,PC_11,115200);
POTLESS_2 10:aca745a66d51 60
POTLESS_2 9:04bfdfc029cb 61 //COM Série vers Android, Serial 3
POTLESS_2 42:3591ec9903b4 62 Serial android(PA_2, PA_3,115200);
POTLESS_2 4:d84250f67dec 63
POTLESS_2 7:ad15c386e960 64 //Init de la lib ARNSRS;
POTLESS_2 7:ad15c386e960 65 SENSOR_HEAD_REV_B sensors;
potless 2:4a8bf1d53439 66
POTLESS_2 34:26f6e3dbefb9 67 //pour Param Venant du PV
POTLESS_2 42:3591ec9903b4 68 const int sizeParam = 50;
POTLESS_2 11:b2feed92584a 69 char param[sizeParam];
POTLESS_2 11:b2feed92584a 70 volatile int indexParam = 0;
POTLESS_2 6:ebed9093d661 71 bool newParamFlag = false;
potless 2:4a8bf1d53439 72
POTLESS_2 9:04bfdfc029cb 73 //pour Commandes Android
POTLESS_2 9:04bfdfc029cb 74 const int sizeAndroid = 20;
POTLESS_2 11:b2feed92584a 75 char Android[sizeAndroid];
POTLESS_2 11:b2feed92584a 76 volatile int indexAndroid = 0;
POTLESS_2 9:04bfdfc029cb 77 bool newAndroidFlag = false;
POTLESS_2 12:7f3aadd79f89 78 char to_android[100];
POTLESS_2 9:04bfdfc029cb 79
POTLESS_2 25:322ef9488e65 80 //Flag pour interrompre l'affichage si on veut...
POTLESS_2 42:3591ec9903b4 81 bool FLAG_FIRST_LOOP = true;
POTLESS_2 42:3591ec9903b4 82
POTLESS_2 42:3591ec9903b4 83 //Flag pour interrompre l'affichage si on veut...
POTLESS_2 42:3591ec9903b4 84 bool FLAG_AFF = false;
POTLESS_2 25:322ef9488e65 85
POTLESS_2 40:32d89e04ead1 86 //Flag pour envoyer à l'app windev...
POTLESS_2 40:32d89e04ead1 87 bool FLAG_WINDEV = false;
POTLESS_2 40:32d89e04ead1 88
POTLESS_2 29:5b822d18bce6 89 //Flag pour interrompre l'enregistrement si on veut...
POTLESS_2 29:5b822d18bce6 90 bool FLAG_REC = true;
POTLESS_2 29:5b822d18bce6 91
POTLESS_2 33:f5d4bae05f16 92 //Flag pour interrompre les demandes O2 en cours ed calibration...
POTLESS_2 33:f5d4bae05f16 93 bool FLAG_O2 = true;
POTLESS_2 33:f5d4bae05f16 94
POTLESS_2 7:ad15c386e960 95 //Variables de stockage des infos capteurs
POTLESS_2 7:ad15c386e960 96 int co2 = 0;
POTLESS_2 7:ad15c386e960 97 float pression = 0;
POTLESS_2 9:04bfdfc029cb 98 float Temp1 = 0;
POTLESS_2 7:ad15c386e960 99 int ppO2 = 0;
POTLESS_2 7:ad15c386e960 100 int CellO2_1 = 0;
POTLESS_2 7:ad15c386e960 101 int CellO2_2 = 0;
POTLESS_2 36:1f5e2247b073 102
POTLESS_2 18:bfd78c05b589 103 //Variables et constantes OTU
POTLESS_2 18:bfd78c05b589 104 float OTU = 0;
POTLESS_2 18:bfd78c05b589 105 float COEF_OTU = 0.83;
POTLESS_2 18:bfd78c05b589 106
POTLESS_2 17:bef8abc445f2 107 //Mesure du temps d'éxecution du loop
POTLESS_2 7:ad15c386e960 108 Timer REAL_RATE;
POTLESS_2 7:ad15c386e960 109 float RATE = 0;
POTLESS_2 11:b2feed92584a 110 float RATE_TRUE = 0;
POTLESS_2 29:5b822d18bce6 111 float Ref_Time = 2.0; //La durée de la boucle désirée...
POTLESS_2 7:ad15c386e960 112
POTLESS_2 17:bef8abc445f2 113 //HTU21D sur l'I2C
POTLESS_2 8:a750d531b381 114 HTU21D temphumid(PB_9, PB_8); //Temp humid sensor || SDA, SCL
POTLESS_2 9:04bfdfc029cb 115 float Temp2;
POTLESS_2 9:04bfdfc029cb 116 int Humid;
POTLESS_2 9:04bfdfc029cb 117
POTLESS_2 9:04bfdfc029cb 118 //Data LOG
POTLESS_2 9:04bfdfc029cb 119 char to_store[50];
POTLESS_2 9:04bfdfc029cb 120 time_t seconds;
POTLESS_2 25:322ef9488e65 121 char Log_File_Name[] = " ";
POTLESS_2 42:3591ec9903b4 122 int count = 0;
POTLESS_2 42:3591ec9903b4 123 int Max_Log_Size = 1800;//1 heure, 1800 lignes donc à multiplier par la fréquence d'enregistrement, Ref_Time, pour voir combien de temps représente un Log...
POTLESS_2 8:a750d531b381 124
POTLESS_2 10:aca745a66d51 125 //Contrôle des servos
POTLESS_2 19:cac3761a5d0b 126 float Consigne_poumon = 0;
POTLESS_2 19:cac3761a5d0b 127 float volet_poumon_Position = 0;
POTLESS_2 19:cac3761a5d0b 128 float Consigne_fuite = 0;
POTLESS_2 19:cac3761a5d0b 129 float volet_fuite_Position = 0;
POTLESS_2 25:322ef9488e65 130 float Volets_Speed = 0.1;
POTLESS_2 26:a2fe19341f92 131 float Volet_DeadBand = 5;
POTLESS_2 10:aca745a66d51 132
POTLESS_2 12:7f3aadd79f89 133 #ifdef PID_MODE
POTLESS_2 12:7f3aadd79f89 134 //Paramètre du PID
POTLESS_2 12:7f3aadd79f89 135 float Kc = 40;
POTLESS_2 12:7f3aadd79f89 136 float Ti = 0;
POTLESS_2 12:7f3aadd79f89 137 float Td = 0;
POTLESS_2 12:7f3aadd79f89 138 float RATE_PID = Ref_Time;
POTLESS_2 12:7f3aadd79f89 139 float Commande_PID;
POTLESS_2 15:efd3b3bf3f37 140 float consigne = 210;
POTLESS_2 15:efd3b3bf3f37 141 float Max_Input = 1000;
POTLESS_2 15:efd3b3bf3f37 142 float Min_Input = 80;
POTLESS_2 19:cac3761a5d0b 143 float Max_Output = 85;//Vérifier la valeur pour angle à laisser ouvert...
POTLESS_2 19:cac3761a5d0b 144 float Min_Output = 5;
POTLESS_2 10:aca745a66d51 145
POTLESS_2 12:7f3aadd79f89 146 //Init PID
POTLESS_2 17:bef8abc445f2 147 PID control_Servo(Kc, Ti, Td, RATE_PID);
POTLESS_2 12:7f3aadd79f89 148 #endif
POTLESS_2 10:aca745a66d51 149
POTLESS_2 19:cac3761a5d0b 150 //Boolean du status de l'appareil, en mode SECU ou nominal
POTLESS_2 19:cac3761a5d0b 151 bool EN_MODE_SECU = false;
POTLESS_2 31:231a96d1d1c8 152
POTLESS_2 31:231a96d1d1c8 153 //Test des alim
POTLESS_2 39:65ff3c4f9675 154 //DigitalIn V_USB(PA_0, PullUp);
POTLESS_2 39:65ff3c4f9675 155
POTLESS_2 31:231a96d1d1c8 156 DigitalIn V_PILES_2(PC_3);
POTLESS_2 31:231a96d1d1c8 157 AnalogIn V_PILES(PA_1);
POTLESS_2 31:231a96d1d1c8 158
POTLESS_2 31:231a96d1d1c8 159 int Vusb = 1;
POTLESS_2 31:231a96d1d1c8 160 int VPiles = 1;
POTLESS_2 31:231a96d1d1c8 161 float VPiles_2 = 1;
POTLESS_2 18:bfd78c05b589 162
POTLESS_2 21:b8900130ca05 163 //Interruption user button
POTLESS_2 21:b8900130ca05 164 InterruptIn button(USER_BUTTON);
potless 38:fe77b68eec37 165 InterruptIn vpile_off_on(PA_0); // TODO mettre un define sur PA_0
POTLESS_2 23:7477dc855fad 166 volatile int GO = 0;
POTLESS_2 21:b8900130ca05 167
POTLESS_2 29:5b822d18bce6 168 void Affichage()
POTLESS_2 29:5b822d18bce6 169 {
POTLESS_2 42:3591ec9903b4 170 NVIC_DisableIRQ(USART3_IRQn);
POTLESS_2 42:3591ec9903b4 171 //serialMonit.printf("\r\n");
POTLESS_2 29:5b822d18bce6 172 serialMonit.printf(" CO2 = %d ppm\r\n" , co2);
POTLESS_2 29:5b822d18bce6 173 serialMonit.printf(" PPO2 = %d mb\r\n", ppO2);
POTLESS_2 31:231a96d1d1c8 174 serialMonit.printf(" OTU = %d \r\n", (int)OTU);
POTLESS_2 29:5b822d18bce6 175 serialMonit.printf(" Pression = %f msw\r\n", pression);
POTLESS_2 29:5b822d18bce6 176 serialMonit.printf(" Temp MS5837 = %f C\r\n", Temp1);
POTLESS_2 29:5b822d18bce6 177 serialMonit.printf(" Temp HTU21D = %f C\n\r", Temp2);
POTLESS_2 29:5b822d18bce6 178 serialMonit.printf(" Humidity = %d %%\n\r", Humid);
POTLESS_2 42:3591ec9903b4 179 //serialMonit.printf("\n\r");
POTLESS_2 29:5b822d18bce6 180 serialMonit.printf(" Cell O2 n 1 = %d\r\n" , CellO2_1);
POTLESS_2 29:5b822d18bce6 181 serialMonit.printf(" Cell O2 n 2 = %d\r\n" , CellO2_2);
POTLESS_2 42:3591ec9903b4 182 //serialMonit.printf("\r\n");
POTLESS_2 29:5b822d18bce6 183 serialMonit.printf(" Volet Poumon = %f\r\n" , volet_poumon_Position);
POTLESS_2 29:5b822d18bce6 184 serialMonit.printf(" Volet Fuite = %f\r\n" , volet_fuite_Position);
POTLESS_2 42:3591ec9903b4 185 //serialMonit.printf("\r\n");
POTLESS_2 42:3591ec9903b4 186 serialMonit.printf(" Temps d execution de la boucle = %f seconde(s)\r\n", (RATE + RATE_TRUE / 1000));
POTLESS_2 42:3591ec9903b4 187 //serialMonit.printf("\r\n");
POTLESS_2 42:3591ec9903b4 188 if (FLAG_REC) serialMonit.printf(" Chaine enregistrée = %s\r\n", to_store);
POTLESS_2 30:7a16a66d76f3 189 else serialMonit.printf(" Pas d'enregistrement en cours.");
POTLESS_2 42:3591ec9903b4 190 //serialMonit.printf("\r\n");
POTLESS_2 42:3591ec9903b4 191 serialMonit.printf(" V_USB = %f\r\n", Vusb);
POTLESS_2 42:3591ec9903b4 192 //serialMonit.printf("\r\n\r\n");
POTLESS_2 29:5b822d18bce6 193 fflush(stdout);
POTLESS_2 42:3591ec9903b4 194 NVIC_EnableIRQ(USART3_IRQn);
POTLESS_2 29:5b822d18bce6 195 }
POTLESS_2 29:5b822d18bce6 196
POTLESS_2 34:26f6e3dbefb9 197 void pressed()
POTLESS_2 34:26f6e3dbefb9 198 {
POTLESS_2 34:26f6e3dbefb9 199 GO = GO + 1;
POTLESS_2 34:26f6e3dbefb9 200 if (GO > 1) NVIC_SystemReset();
POTLESS_2 21:b8900130ca05 201 }
POTLESS_2 21:b8900130ca05 202
POTLESS_2 39:65ff3c4f9675 203 //Pas nécessaire
POTLESS_2 39:65ff3c4f9675 204 /*
potless 38:fe77b68eec37 205 void retour_alim()
potless 38:fe77b68eec37 206 {
potless 38:fe77b68eec37 207 DEBUG("-------------- interruption retour alim en cours ---------------\r\n");
potless 38:fe77b68eec37 208 NVIC_SystemReset();
potless 38:fe77b68eec37 209 }
POTLESS_2 39:65ff3c4f9675 210 */
POTLESS_2 39:65ff3c4f9675 211
potless 38:fe77b68eec37 212
POTLESS_2 19:cac3761a5d0b 213 //Passage en mode SECU
POTLESS_2 19:cac3761a5d0b 214 void Mode_SECU()
POTLESS_2 18:bfd78c05b589 215 {
POTLESS_2 19:cac3761a5d0b 216 #ifdef PID_MODE
POTLESS_2 18:bfd78c05b589 217 //Mise du PID en mode manuel (desactivation...)
POTLESS_2 18:bfd78c05b589 218 control_Servo.setMode(MANUAL_MODE);
POTLESS_2 18:bfd78c05b589 219 #endif
POTLESS_2 19:cac3761a5d0b 220 Consigne_poumon = HOME_SERVO_POUMON;
POTLESS_2 19:cac3761a5d0b 221 Consigne_fuite = HOME_SERVO_FUITE;
POTLESS_2 34:26f6e3dbefb9 222
POTLESS_2 25:322ef9488e65 223 Volets_Speed = 0.1;
POTLESS_2 25:322ef9488e65 224 Volet_DeadBand = 10;
POTLESS_2 25:322ef9488e65 225
POTLESS_2 19:cac3761a5d0b 226 while(1) {
POTLESS_2 25:322ef9488e65 227 wait_ms(100);
POTLESS_2 19:cac3761a5d0b 228 if (Servo_Poumon.Pos_OK() == true) break;
POTLESS_2 19:cac3761a5d0b 229 //if (Servo_Poumon.Pos_OK() == true && Servo_Fuite.Pos_OK() == true) break;
POTLESS_2 19:cac3761a5d0b 230 }
POTLESS_2 33:f5d4bae05f16 231 DEBUG("-------------- Appareil en mode SECU ---------------\r\n");
POTLESS_2 34:26f6e3dbefb9 232
POTLESS_2 25:322ef9488e65 233 wait_ms(100);
POTLESS_2 34:26f6e3dbefb9 234
POTLESS_2 19:cac3761a5d0b 235 EN_MODE_SECU = true;
POTLESS_2 25:322ef9488e65 236 wait_ms(100);
POTLESS_2 19:cac3761a5d0b 237 int Pos = Servo_Poumon.getPulses();
POTLESS_2 42:3591ec9903b4 238 UTILS::Store_A_Val((float)Pos, "Servo_Poumon.sys");
POTLESS_2 33:f5d4bae05f16 239 DEBUG(" position volet poumon sauvegardée = %d pulse(s)\r\n", Pos);
POTLESS_2 19:cac3761a5d0b 240 //Pos = Servo_Fuite.getPulses();
POTLESS_2 19:cac3761a5d0b 241 //UTILS::Store_A_Val((float)Pos, "Servo_Fuite");
POTLESS_2 33:f5d4bae05f16 242 //DEBUG(" position volet fuite sauvegardée = %d pulse(s)\r\n", Pos);
POTLESS_2 23:7477dc855fad 243 Servo_Poumon.Sleep();
POTLESS_2 19:cac3761a5d0b 244 }
POTLESS_2 19:cac3761a5d0b 245
POTLESS_2 19:cac3761a5d0b 246 //Sequence d'arrêt
POTLESS_2 19:cac3761a5d0b 247 void Stop_Sequence()
POTLESS_2 34:26f6e3dbefb9 248 {
POTLESS_2 34:26f6e3dbefb9 249 Mode_SECU();
POTLESS_2 39:65ff3c4f9675 250 //ejection de la flash pour pas crasher le system de fichiers
POTLESS_2 39:65ff3c4f9675 251 UTILS::UnMount_Flash();
POTLESS_2 40:32d89e04ead1 252
POTLESS_2 33:f5d4bae05f16 253 DEBUG("----------------ARRET DE L'APPAREIL--------------------\r\n");
POTLESS_2 40:32d89e04ead1 254
potless 37:f9461c6592f2 255 // préparation deepsleep
POTLESS_2 40:32d89e04ead1 256
potless 37:f9461c6592f2 257 /*
potless 37:f9461c6592f2 258 //première méthode mais je ne sais pas ce que ça consomme et il faut normalement reduire le frequence d'horloge avant
potless 37:f9461c6592f2 259 //il est possible que ça génère un plantage et la rtc ne fonctionnera pas?
potless 37:f9461c6592f2 260 HAL_PWREx_EnableLowPowerRunMode();
potless 37:f9461c6592f2 261 DEBUG("----------------LOW POWER RUN MODE--------------------\r\n");
POTLESS_2 40:32d89e04ead1 262
potless 37:f9461c6592f2 263 bool isDSallowed;
potless 37:f9461c6592f2 264 isDSallowed = sleep_manager_can_deep_sleep();
potless 37:f9461c6592f2 265 DEBUG(" Deep sleep autorisé ? %i\r\n", isDSallowed);
potless 37:f9461c6592f2 266 wait(1.0);
POTLESS_2 34:26f6e3dbefb9 267
potless 37:f9461c6592f2 268 DEBUG("\n\r Deepsleep tentative normale !(bouton bleu pour ressortir)\n");
potless 37:f9461c6592f2 269 wait(0.1);
POTLESS_2 40:32d89e04ead1 270
potless 37:f9461c6592f2 271 sleep_manager_sleep_auto(); // ne marche pas, je ne sais pas pk
potless 37:f9461c6592f2 272 */
POTLESS_2 40:32d89e04ead1 273
POTLESS_2 40:32d89e04ead1 274
potless 37:f9461c6592f2 275 DEBUG("\n\r Deepsleep méthode offensive !\n");
POTLESS_2 40:32d89e04ead1 276
POTLESS_2 39:65ff3c4f9675 277 /*
potless 38:fe77b68eec37 278 HAL_PWR_DisableWakeUpPin(PWR_WAKEUP_PIN2); // pour PC_13
POTLESS_2 40:32d89e04ead1 279 // Clear wake up Flag
POTLESS_2 40:32d89e04ead1 280 __HAL_PWR_CLEAR_FLAG(PWR_FLAG_WUF2);
POTLESS_2 40:32d89e04ead1 281 // Enable wakeup pin WKUP2
potless 38:fe77b68eec37 282 HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN2_LOW); // low parce qu'on veut que ça redémarre avec le user button TODO à passer sur High pour que ça redémarrage avec l'arrivée du hus sur l'USB
POTLESS_2 39:65ff3c4f9675 283 */
POTLESS_2 40:32d89e04ead1 284
potless 38:fe77b68eec37 285 HAL_PWR_DisableWakeUpPin(PWR_WAKEUP_PIN1); // pour PA_0
POTLESS_2 40:32d89e04ead1 286 // Clear wake up Flag
POTLESS_2 40:32d89e04ead1 287 __HAL_PWR_CLEAR_FLAG(PWR_FLAG_WUF1);
POTLESS_2 40:32d89e04ead1 288 // Enable wakeup pin WKUP2
POTLESS_2 39:65ff3c4f9675 289 HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1); // high est la valeur par défaut
POTLESS_2 40:32d89e04ead1 290
POTLESS_2 40:32d89e04ead1 291 // Set RTC back-up register RTC_BKP31R to indicate
POTLESS_2 40:32d89e04ead1 292 //later on that system has entered shutdown mode
potless 37:f9461c6592f2 293 WRITE_REG( RTC->BKP31R, 0x1 );
POTLESS_2 40:32d89e04ead1 294 //Enter shutdown mode
potless 37:f9461c6592f2 295 DEBUG("\n\r Attention c'est du brutal ! bouton bleu pour ressort.... ZZZZZZZ ZZZZZ !!!\n");
POTLESS_2 40:32d89e04ead1 296
potless 37:f9461c6592f2 297 HAL_PWREx_EnterSHUTDOWNMode();
POTLESS_2 18:bfd78c05b589 298 }
POTLESS_2 18:bfd78c05b589 299
POTLESS_2 31:231a96d1d1c8 300 //Fonction test de valeur d'entrée digitale
POTLESS_2 29:5b822d18bce6 301 int Power_Test(DigitalIn& pin)
POTLESS_2 20:5f79fb4565a7 302 {
POTLESS_2 29:5b822d18bce6 303 pin.mode(PullDown);
POTLESS_2 34:26f6e3dbefb9 304
POTLESS_2 34:26f6e3dbefb9 305 if(!pin) {
POTLESS_2 34:26f6e3dbefb9 306 Stop_Sequence();
POTLESS_2 34:26f6e3dbefb9 307 return 0;
POTLESS_2 34:26f6e3dbefb9 308 } else {
POTLESS_2 34:26f6e3dbefb9 309 return 1;
POTLESS_2 34:26f6e3dbefb9 310 }
POTLESS_2 20:5f79fb4565a7 311 }
POTLESS_2 20:5f79fb4565a7 312
POTLESS_2 31:231a96d1d1c8 313 //Fonction test de valeur d'entrée analogique
POTLESS_2 31:231a96d1d1c8 314 float Power_Test(AnalogIn& pin)
POTLESS_2 31:231a96d1d1c8 315 {
POTLESS_2 31:231a96d1d1c8 316 float Val = pin.read();
POTLESS_2 31:231a96d1d1c8 317 return Val;
POTLESS_2 31:231a96d1d1c8 318 }
POTLESS_2 31:231a96d1d1c8 319
POTLESS_2 18:bfd78c05b589 320 //Contrôle du status de l'appareil / des constantes
POTLESS_2 18:bfd78c05b589 321 bool Check()
POTLESS_2 18:bfd78c05b589 322 {
POTLESS_2 18:bfd78c05b589 323 if (ppO2 > 100)
POTLESS_2 19:cac3761a5d0b 324 return true;//Situation OK
POTLESS_2 18:bfd78c05b589 325 else
POTLESS_2 19:cac3761a5d0b 326 return false;//Situation dégradée
POTLESS_2 18:bfd78c05b589 327 }
POTLESS_2 18:bfd78c05b589 328
POTLESS_2 18:bfd78c05b589 329 //Calcul des OTU
POTLESS_2 18:bfd78c05b589 330 float Calcul_OTU()
POTLESS_2 18:bfd78c05b589 331 {
POTLESS_2 18:bfd78c05b589 332 /*
POTLESS_2 18:bfd78c05b589 333 La formule suivante permet de calculer la quantité d' OTU accumulée
POTLESS_2 18:bfd78c05b589 334 OTU = T * (2* PpO2 -1)0,83
POTLESS_2 18:bfd78c05b589 335 avec :
POTLESS_2 18:bfd78c05b589 336 T = temps de plongée en minutes
POTLESS_2 18:bfd78c05b589 337 PpO2 = pression partielle d’ oxygène en bars
POTLESS_2 18:bfd78c05b589 338 */
POTLESS_2 18:bfd78c05b589 339
POTLESS_2 19:cac3761a5d0b 340 if (ppO2 > 500) {
POTLESS_2 18:bfd78c05b589 341 float val = (2 * (float)ppO2/1000 - 1);//je divise par 1000 car la PP est en mb...
POTLESS_2 18:bfd78c05b589 342 OTU += Ref_Time * pow(val, COEF_OTU);
POTLESS_2 19:cac3761a5d0b 343 }
POTLESS_2 18:bfd78c05b589 344 }
POTLESS_2 10:aca745a66d51 345
POTLESS_2 17:bef8abc445f2 346 //Thread d'intérogation des capteurs, positions servo
POTLESS_2 34:26f6e3dbefb9 347 void SENSORS_thread()
POTLESS_2 6:ebed9093d661 348 {
POTLESS_2 7:ad15c386e960 349 while (true) {
POTLESS_2 36:1f5e2247b073 350 //DEEP_DEBUG(" SENSORS_thread\r\n");
POTLESS_2 7:ad15c386e960 351
POTLESS_2 7:ad15c386e960 352 //CO2 sur Cozir
POTLESS_2 7:ad15c386e960 353 co2 = sensors.requestCO2();
POTLESS_2 7:ad15c386e960 354 //P / T sur MS5837
POTLESS_2 7:ad15c386e960 355 pression = sensors.requestPress();
POTLESS_2 9:04bfdfc029cb 356 Temp1 = sensors.requestTemp();
POTLESS_2 7:ad15c386e960 357 //PPO2 sur ADS1015
POTLESS_2 33:f5d4bae05f16 358 if (FLAG_O2) ppO2 = sensors.requestPpO2();
POTLESS_2 7:ad15c386e960 359 //Cell O2 en mV
POTLESS_2 33:f5d4bae05f16 360 if (FLAG_O2) CellO2_1 = sensors.requestCellO2_1();
POTLESS_2 33:f5d4bae05f16 361 if (FLAG_O2) CellO2_2 = sensors.requestCellO2_2();
POTLESS_2 9:04bfdfc029cb 362
POTLESS_2 8:a750d531b381 363 //HTU21D
POTLESS_2 9:04bfdfc029cb 364 Temp2 = temphumid.sample_ctemp();
POTLESS_2 9:04bfdfc029cb 365 Humid = temphumid.sample_humid();
POTLESS_2 9:04bfdfc029cb 366
POTLESS_2 10:aca745a66d51 367 //Retour position des servos
POTLESS_2 17:bef8abc445f2 368 volet_poumon_Position = Servo_Poumon.Get_Position();
POTLESS_2 20:5f79fb4565a7 369 //volet_fuite_Position = Servo_Fuite.Get_Position();
POTLESS_2 34:26f6e3dbefb9 370
POTLESS_2 19:cac3761a5d0b 371 }
POTLESS_2 19:cac3761a5d0b 372 }
POTLESS_2 12:7f3aadd79f89 373
POTLESS_2 19:cac3761a5d0b 374 void GO_TO_thread()
POTLESS_2 19:cac3761a5d0b 375 {
POTLESS_2 19:cac3761a5d0b 376 while (true) {
POTLESS_2 36:1f5e2247b073 377 //DEEP_DEBUG(" GO_TO_Thread\r\n");
POTLESS_2 34:26f6e3dbefb9 378
POTLESS_2 19:cac3761a5d0b 379 //Servo_Poumon.Go_To_Prop(Consigne_poumon);
POTLESS_2 26:a2fe19341f92 380 //Servo_Poumon.Go_To_PID(Consigne_poumon, Volet_DeadBand);
POTLESS_2 34:26f6e3dbefb9 381 Servo_Poumon.Go_To(Consigne_poumon, Volets_Speed, Volet_DeadBand);
POTLESS_2 34:26f6e3dbefb9 382
POTLESS_2 19:cac3761a5d0b 383 //Servo_Fuite.Go_To_Prop(Consigne_fuite);
POTLESS_2 19:cac3761a5d0b 384 //Servo_Fuite.Go_To_PID(Consigne_fuite);
POTLESS_2 29:5b822d18bce6 385 //Servo_Fuite.Go_To(Consigne_fuite, Volets_Speed, Volet_DeadBand );
POTLESS_2 15:efd3b3bf3f37 386 }
potless 2:4a8bf1d53439 387 }
POTLESS_2 4:d84250f67dec 388
POTLESS_2 20:5f79fb4565a7 389 void SECU_thread()
POTLESS_2 20:5f79fb4565a7 390 {
POTLESS_2 34:26f6e3dbefb9 391 while (true) {
POTLESS_2 36:1f5e2247b073 392 //DEEP_DEBUG(" SECU_Thread\r\n");
POTLESS_2 34:26f6e3dbefb9 393
POTLESS_2 20:5f79fb4565a7 394 //Alim USB
POTLESS_2 33:f5d4bae05f16 395 //Vusb = Power_Test(V_USB);
POTLESS_2 33:f5d4bae05f16 396 //VPiles = Power_Test(V_PILES);
POTLESS_2 20:5f79fb4565a7 397 //Divers problèmes à implémenter
POTLESS_2 20:5f79fb4565a7 398 //if(!Check()) Mode_SECU();
POTLESS_2 20:5f79fb4565a7 399 }
POTLESS_2 20:5f79fb4565a7 400 }
POTLESS_2 20:5f79fb4565a7 401
POTLESS_2 11:b2feed92584a 402 //Callback de l'intérruption des envois de commandes depuis le terminal
POTLESS_2 6:ebed9093d661 403 void callbackParam()
POTLESS_2 34:26f6e3dbefb9 404 {
POTLESS_2 40:32d89e04ead1 405
POTLESS_2 40:32d89e04ead1 406
POTLESS_2 34:26f6e3dbefb9 407 while(serialMonit.readable()) {
POTLESS_2 40:32d89e04ead1 408 if ((indexParam == sizeParam) || newParamFlag == true) { //éviter la saturation du buffer
POTLESS_2 42:3591ec9903b4 409 NVIC_DisableIRQ(USART3_IRQn);
POTLESS_2 29:5b822d18bce6 410 char char_flush = serialMonit.getc();
POTLESS_2 42:3591ec9903b4 411 NVIC_EnableIRQ(USART3_IRQn);
POTLESS_2 40:32d89e04ead1 412 } else {
POTLESS_2 42:3591ec9903b4 413 NVIC_DisableIRQ(USART3_IRQn);
POTLESS_2 29:5b822d18bce6 414 param [indexParam ++] = serialMonit.getc();//chargement du buffer dans le message
POTLESS_2 40:32d89e04ead1 415 if ((indexParam == sizeParam) || (param[indexParam - 1] == '\n')) {//le message est complet ou nouvelle ligne ou autre si on veut...
POTLESS_2 40:32d89e04ead1 416 param[indexParam] = 0;
POTLESS_2 40:32d89e04ead1 417 newParamFlag = true;
POTLESS_2 40:32d89e04ead1 418 }
POTLESS_2 42:3591ec9903b4 419 NVIC_EnableIRQ(USART3_IRQn);
POTLESS_2 34:26f6e3dbefb9 420 }
POTLESS_2 34:26f6e3dbefb9 421 }
POTLESS_2 6:ebed9093d661 422 }
POTLESS_2 4:d84250f67dec 423
POTLESS_2 9:04bfdfc029cb 424 //Callback de l'intérruption des envois de commandes depuis Android
POTLESS_2 9:04bfdfc029cb 425 void callbackAndroid()
POTLESS_2 9:04bfdfc029cb 426 {
POTLESS_2 9:04bfdfc029cb 427 while(android.readable()) {
POTLESS_2 9:04bfdfc029cb 428 if (indexAndroid == sizeAndroid) //éviter la saturation du buffer
POTLESS_2 9:04bfdfc029cb 429 android.getc();
POTLESS_2 9:04bfdfc029cb 430 else
POTLESS_2 9:04bfdfc029cb 431 Android [indexAndroid++] = android.getc();//chargement du buffer dans le message
POTLESS_2 9:04bfdfc029cb 432 if ((indexAndroid == sizeAndroid) || (Android[indexAndroid -1] == '\n')) {//le message est complet ou nouvelle ligne ou autre si on veut...
POTLESS_2 9:04bfdfc029cb 433 Android[indexAndroid] = 0;
POTLESS_2 9:04bfdfc029cb 434 newAndroidFlag = true;
POTLESS_2 9:04bfdfc029cb 435 }
POTLESS_2 9:04bfdfc029cb 436 }
POTLESS_2 9:04bfdfc029cb 437 }
POTLESS_2 11:b2feed92584a 438
POTLESS_2 9:04bfdfc029cb 439 void Decoding_Message(char message [])
POTLESS_2 9:04bfdfc029cb 440 {
POTLESS_2 9:04bfdfc029cb 441
POTLESS_2 42:3591ec9903b4 442 char com[20] = "";
POTLESS_2 42:3591ec9903b4 443 char numb[30] = "";
POTLESS_2 36:1f5e2247b073 444
POTLESS_2 34:26f6e3dbefb9 445 sscanf(message,"%s %s",&com , &numb);
POTLESS_2 36:1f5e2247b073 446
POTLESS_2 35:a209a192f431 447 DEEP_DEBUG("\r\n Commande = %s Valeur = %s \r\n\r\n", com, numb);
POTLESS_2 42:3591ec9903b4 448 //serialMonit.printf("\r\n Commande = %s Valeur = %s \r\n\r\n", com, numb);
POTLESS_2 36:1f5e2247b073 449
POTLESS_2 30:7a16a66d76f3 450 if (0 == strcmp(com, "secu")) {
POTLESS_2 19:cac3761a5d0b 451 Mode_SECU();
POTLESS_2 42:3591ec9903b4 452 } else if (0 == strcmp(com, "PING")) {
POTLESS_2 42:3591ec9903b4 453 NVIC_DisableIRQ(USART3_IRQn);
POTLESS_2 42:3591ec9903b4 454 serialMonit.printf("$");
POTLESS_2 42:3591ec9903b4 455 NVIC_EnableIRQ(USART3_IRQn);
POTLESS_2 34:26f6e3dbefb9 456 } else if (0 == strcmp(com, "ARNSRS_ID")) {
POTLESS_2 34:26f6e3dbefb9 457 UTILS::Store_A_Val(atoi(numb), "ARNSRS_ID");
POTLESS_2 40:32d89e04ead1 458 } else if (0 == strcmp(com, "monit")) {
POTLESS_2 40:32d89e04ead1 459 FLAG_AFF = false;
POTLESS_2 40:32d89e04ead1 460 FLAG_WINDEV = true;
POTLESS_2 40:32d89e04ead1 461 } else if (0 == strcmp(com, "debug")) {
POTLESS_2 42:3591ec9903b4 462 FLAG_AFF = false;
POTLESS_2 40:32d89e04ead1 463 FLAG_WINDEV = false;
POTLESS_2 34:26f6e3dbefb9 464 } else if (0 == strcmp(com, "Head_ID")) {
POTLESS_2 34:26f6e3dbefb9 465 //On l'enregistre dans l'eeprom
POTLESS_2 34:26f6e3dbefb9 466 UTILS::write_EEPROM(numb, HEAD_ID);
POTLESS_2 34:26f6e3dbefb9 467 } else if (0 == strcmp(com, "O2_1_ID")) {
POTLESS_2 34:26f6e3dbefb9 468 //On l'enregistre dans l'eeprom
POTLESS_2 34:26f6e3dbefb9 469 UTILS::write_EEPROM(numb, CELL_O2_1_ID);
POTLESS_2 34:26f6e3dbefb9 470 } else if (0 == strcmp(com, "O2_2_ID")) {
POTLESS_2 34:26f6e3dbefb9 471 //On l'enregistre dans l'eeprom
POTLESS_2 34:26f6e3dbefb9 472 UTILS::write_EEPROM(numb, CELL_O2_2_ID);
POTLESS_2 34:26f6e3dbefb9 473 } else if (0 == strcmp(com, "CO2_ID")) {
POTLESS_2 34:26f6e3dbefb9 474 //On l'enregistre dans l'eeprom
POTLESS_2 34:26f6e3dbefb9 475 UTILS::write_EEPROM(numb, CO2_ID);
POTLESS_2 34:26f6e3dbefb9 476 } else if (0 == strcmp(com, "calib_O2")) {
POTLESS_2 33:f5d4bae05f16 477 FLAG_O2 = false;
POTLESS_2 33:f5d4bae05f16 478 wait_ms(100);
POTLESS_2 42:3591ec9903b4 479 float Val = sensors.Calibrate_O2(atoi(numb));
POTLESS_2 42:3591ec9903b4 480 serialMonit.printf(" Calibration O2 dans l'air = %f\r\n", Val);
POTLESS_2 33:f5d4bae05f16 481 wait_ms(100);
POTLESS_2 33:f5d4bae05f16 482 FLAG_O2 = true;
POTLESS_2 41:51ba69648f9d 483 } else if (0 == strcmp(com, "calib_CO2_A")) {
POTLESS_2 42:3591ec9903b4 484 int Val = sensors.Calibrate_CO2();
POTLESS_2 42:3591ec9903b4 485 serialMonit.printf(" Calibration CO2 dans l'air = %d\r\n", Val);
POTLESS_2 34:26f6e3dbefb9 486 } else if (0 == strcmp(com, "flash_i")) {
POTLESS_2 42:3591ec9903b4 487 UTILS::Flash_Infos(&serialMonit);
POTLESS_2 36:1f5e2247b073 488 } else if (0 == strcmp(com, "flash_u")) {
POTLESS_2 36:1f5e2247b073 489 FLAG_REC = false;
POTLESS_2 36:1f5e2247b073 490 UTILS::UnMount_Flash();
POTLESS_2 36:1f5e2247b073 491 } else if (0 == strcmp(com, "flash_m")) {
POTLESS_2 40:32d89e04ead1 492 UTILS::Mount_Flash();
POTLESS_2 35:a209a192f431 493 } else if (0 == strcmp(com, "check_F")) {
POTLESS_2 42:3591ec9903b4 494 serialMonit.printf(" ARNSRS_ID.sys = %d\r\n", (int)UTILS::Read_A_Val("ARNSRS_ID.sys"));
POTLESS_2 42:3591ec9903b4 495 serialMonit.printf(" Servo_Poumon.sys = %d\r\n", (int)UTILS::Read_A_Val("Servo_Poumon.sys"));
POTLESS_2 42:3591ec9903b4 496 //serialMonit.printf("Servo_Fuite.sys = %d\r\n", (int)UTILS::Read_A_Val("Servo_Fuite");
POTLESS_2 35:a209a192f431 497 } else if (0 == strcmp(com, "check_E")) {
POTLESS_2 42:3591ec9903b4 498 sensors.Sensor_head_check(&serialMonit);
POTLESS_2 34:26f6e3dbefb9 499 } else if (0 == strcmp(com, "rec")) {
POTLESS_2 34:26f6e3dbefb9 500 if (FLAG_REC) {
POTLESS_2 34:26f6e3dbefb9 501 FLAG_REC = false;
POTLESS_2 42:3591ec9903b4 502 serialMonit.printf(" Arrêt du Data Logging.\r\n");
POTLESS_2 34:26f6e3dbefb9 503 } else {
POTLESS_2 34:26f6e3dbefb9 504 FLAG_REC = true;
POTLESS_2 42:3591ec9903b4 505 serialMonit.printf(" Démarrage Data Logging dans %s\r\n", Log_File_Name);
POTLESS_2 34:26f6e3dbefb9 506 }
POTLESS_2 34:26f6e3dbefb9 507 } else if (0 == strcmp(com, "help")) {
POTLESS_2 29:5b822d18bce6 508 FLAG_AFF = false;
POTLESS_2 42:3591ec9903b4 509 UTILS::Help(&serialMonit);
POTLESS_2 34:26f6e3dbefb9 510 } else if (0 == strcmp(com, "start")) {
POTLESS_2 29:5b822d18bce6 511 FLAG_AFF = true;
POTLESS_2 34:26f6e3dbefb9 512 } else if (0 == strcmp(com, "stop")) {
POTLESS_2 29:5b822d18bce6 513 FLAG_AFF = false;
POTLESS_2 40:32d89e04ead1 514 //UTILS::Help();
POTLESS_2 36:1f5e2247b073 515 } else if (0 == strcmp(com, "flash_c")) {
POTLESS_2 29:5b822d18bce6 516 FLAG_REC = false;
POTLESS_2 42:3591ec9903b4 517 //serialMonit.printf("$");
POTLESS_2 29:5b822d18bce6 518 UTILS::Clean_Flash();
POTLESS_2 42:3591ec9903b4 519 } else if (0 == strcmp(com, "flash_f")) {
POTLESS_2 34:26f6e3dbefb9 520 FLAG_REC = false;
POTLESS_2 42:3591ec9903b4 521 //serialMonit.printf("$");
POTLESS_2 42:3591ec9903b4 522 UTILS::Clean_Flash_All();
POTLESS_2 42:3591ec9903b4 523 } else if (0 == strcmp(com, "dir")) {
POTLESS_2 42:3591ec9903b4 524 UTILS::Dir_Flash(&serialMonit);
POTLESS_2 42:3591ec9903b4 525 } else if (0 == strcmp(com, "get")) {
POTLESS_2 42:3591ec9903b4 526 int mark = 0;
POTLESS_2 29:5b822d18bce6 527 wait_ms(100);
POTLESS_2 42:3591ec9903b4 528 char filename[20];
POTLESS_2 42:3591ec9903b4 529 UTILS::Read_Flash_File(&serialMonit, numb);
POTLESS_2 42:3591ec9903b4 530 wait_ms(100);
POTLESS_2 34:26f6e3dbefb9 531 } else if (0 == strcmp(com, "del")) {
POTLESS_2 29:5b822d18bce6 532 FLAG_REC = false;
POTLESS_2 29:5b822d18bce6 533 char filename[20];
POTLESS_2 42:3591ec9903b4 534 UTILS::Delete_Flash_File(numb);
POTLESS_2 42:3591ec9903b4 535 //UTILS::Dir_Flash(&serialMonit);
POTLESS_2 31:231a96d1d1c8 536 FLAG_REC = true;
POTLESS_2 34:26f6e3dbefb9 537 } else if (0 == strcmp(com, "file_s")) {
POTLESS_2 31:231a96d1d1c8 538 char filename[20];
POTLESS_2 42:3591ec9903b4 539 UTILS::Get_File_Size(&serialMonit, numb);
POTLESS_2 29:5b822d18bce6 540 } else if (0 == strcmp(com, "calib_p")) {
POTLESS_2 20:5f79fb4565a7 541 Consigne_poumon = 0;
POTLESS_2 20:5f79fb4565a7 542 volet_poumon_Position = 0;
POTLESS_2 19:cac3761a5d0b 543 Servo_Poumon.reset();
POTLESS_2 29:5b822d18bce6 544 } else if (0 == strcmp(com, "calib_f")) {
POTLESS_2 29:5b822d18bce6 545 Consigne_fuite = 0;
POTLESS_2 29:5b822d18bce6 546 volet_fuite_Position = 0;
POTLESS_2 34:26f6e3dbefb9 547 //Servo_Fuite.reset();
POTLESS_2 29:5b822d18bce6 548 } else if (0 == strcmp(com, "sleep")) {
POTLESS_2 19:cac3761a5d0b 549 Stop_Sequence();
POTLESS_2 29:5b822d18bce6 550 } else if (0 == strcmp(com, "time")) {//Depuis terminal MAC taper : " date +%s "
POTLESS_2 34:26f6e3dbefb9 551 set_time(atoi(numb));
POTLESS_2 42:3591ec9903b4 552 serialMonit.printf(" La RTC a été mise à l'heure.\r\n");
POTLESS_2 29:5b822d18bce6 553 } else if (0 == strcmp(com, "c_pou")) {
POTLESS_2 41:51ba69648f9d 554 Consigne_poumon += atof(numb);
POTLESS_2 33:f5d4bae05f16 555 DEBUG(" Servo Poumon = %f\r\n", Consigne_poumon);
POTLESS_2 29:5b822d18bce6 556 } else if (0 == strcmp(com, "c_fui")) {
POTLESS_2 41:51ba69648f9d 557 Consigne_fuite += atof(numb);
POTLESS_2 33:f5d4bae05f16 558 DEBUG(" Servo Fuite = %f\r\n", Consigne_fuite);
POTLESS_2 29:5b822d18bce6 559 } else if (0 == strcmp(com, "reset")) {
POTLESS_2 36:1f5e2247b073 560 UTILS::UnMount_Flash();
POTLESS_2 10:aca745a66d51 561 NVIC_SystemReset();
POTLESS_2 12:7f3aadd79f89 562 } else {
POTLESS_2 9:04bfdfc029cb 563 sensors.cozirSend(message);
POTLESS_2 9:04bfdfc029cb 564 }
POTLESS_2 34:26f6e3dbefb9 565
POTLESS_2 9:04bfdfc029cb 566 strcpy(param," ");
POTLESS_2 9:04bfdfc029cb 567 indexParam = 0;
POTLESS_2 9:04bfdfc029cb 568 newParamFlag = false;
POTLESS_2 9:04bfdfc029cb 569 }
POTLESS_2 9:04bfdfc029cb 570
POTLESS_2 9:04bfdfc029cb 571 void Decoding_Message_Android(char message [])
POTLESS_2 9:04bfdfc029cb 572 {
POTLESS_2 9:04bfdfc029cb 573 char *commande = 0;
POTLESS_2 14:b5e0e882205e 574 float valeur = 0;
POTLESS_2 9:04bfdfc029cb 575
POTLESS_2 14:b5e0e882205e 576 sscanf(message,"%s %f",&commande , &valeur);
POTLESS_2 9:04bfdfc029cb 577
POTLESS_2 9:04bfdfc029cb 578 if ((char)commande == 'T') {
POTLESS_2 9:04bfdfc029cb 579 set_time(valeur);
POTLESS_2 12:7f3aadd79f89 580 } else if ((char)commande == 'I') {
POTLESS_2 17:bef8abc445f2 581 Consigne_poumon = (float)valeur;
POTLESS_2 33:f5d4bae05f16 582 DEBUG(" Servo Poumon = %f\r\n", Consigne_poumon);
POTLESS_2 12:7f3aadd79f89 583 } else if ((char)commande == 'O') {
POTLESS_2 17:bef8abc445f2 584 Consigne_fuite = (float)valeur;
POTLESS_2 33:f5d4bae05f16 585 DEBUG(" Servo Fuite = %f\r\n", Consigne_fuite);
POTLESS_2 12:7f3aadd79f89 586 /////////////////////////////////////////
POTLESS_2 12:7f3aadd79f89 587 //Pour rajouter une commande
POTLESS_2 12:7f3aadd79f89 588 //} else if ((char)commande == 'X') {
POTLESS_2 12:7f3aadd79f89 589 // attribuer à une VARIABLE = valeur;
POTLESS_2 12:7f3aadd79f89 590 // ou une action, avec ou sans valeur
POTLESS_2 12:7f3aadd79f89 591 /////////////////////////////////////////
POTLESS_2 9:04bfdfc029cb 592 } else if ((char)commande == 'R') {
POTLESS_2 9:04bfdfc029cb 593 NVIC_SystemReset();
POTLESS_2 9:04bfdfc029cb 594 }
POTLESS_2 12:7f3aadd79f89 595 #ifdef PID_MODE
POTLESS_2 12:7f3aadd79f89 596 else if ((char)commande == 'p') {
POTLESS_2 12:7f3aadd79f89 597 Kc = (float)valeur;
POTLESS_2 16:917656586772 598 control_Servo.reset();
POTLESS_2 12:7f3aadd79f89 599 control_Servo.setTunings(Kc, Ti, Td);
POTLESS_2 33:f5d4bae05f16 600 DEBUG" UPDATE PID --> Kc = %f Ti = %f Td = %f\r\n\n", Kc, Ti, Td);
POTLESS_2 15:efd3b3bf3f37 601 } else if ((char)commande == 'i') {
POTLESS_2 12:7f3aadd79f89 602 Ti = (float)valeur;
POTLESS_2 16:917656586772 603 control_Servo.reset();
POTLESS_2 12:7f3aadd79f89 604 control_Servo.setTunings(Kc, Ti, Td);
POTLESS_2 33:f5d4bae05f16 605 DEBUG(" UPDATE PID --> Kc = %f Ti = %f Td = %f\r\n\n", Kc, Ti, Td);
POTLESS_2 15:efd3b3bf3f37 606 } else if ((char)commande == 'd') {
POTLESS_2 12:7f3aadd79f89 607 Td = (float)valeur;
POTLESS_2 16:917656586772 608 control_Servo.reset();
POTLESS_2 12:7f3aadd79f89 609 control_Servo.setTunings(Kc, Ti, Td);
POTLESS_2 33:f5d4bae05f16 610 DEBUG(" UPDATE PID --> Kc = %f Ti = %f Td = %f\r\n\n", Kc, Ti, Td);
POTLESS_2 15:efd3b3bf3f37 611 } else if ((char)commande == 'c') {
POTLESS_2 12:7f3aadd79f89 612 consigne = valeur;
POTLESS_2 15:efd3b3bf3f37 613 control_Servo.setSetPoint(consigne);
POTLESS_2 33:f5d4bae05f16 614 DEBUG(" UPDATE CONSIGNE PID --> Consigne = %d\r\n\n", consigne);
POTLESS_2 12:7f3aadd79f89 615 }
POTLESS_2 15:efd3b3bf3f37 616 #endif
POTLESS_2 18:bfd78c05b589 617
POTLESS_2 9:04bfdfc029cb 618 strcpy(Android," ");
POTLESS_2 9:04bfdfc029cb 619 indexAndroid = 0;
POTLESS_2 9:04bfdfc029cb 620 newAndroidFlag = false;
POTLESS_2 9:04bfdfc029cb 621 }
POTLESS_2 9:04bfdfc029cb 622
POTLESS_2 26:a2fe19341f92 623 void Create_File_Name_Date()
POTLESS_2 25:322ef9488e65 624 {
POTLESS_2 25:322ef9488e65 625 //Du nom du fichier Date / heure
POTLESS_2 25:322ef9488e65 626 seconds = time(NULL);
POTLESS_2 25:322ef9488e65 627 char Time[40];
POTLESS_2 25:322ef9488e65 628 strftime(Time, 40, "%a_%d_%m_%Y_%H%M", localtime(&seconds));
POTLESS_2 42:3591ec9903b4 629 sprintf(Log_File_Name, "%s_LOG.csv", Time);
POTLESS_2 42:3591ec9903b4 630 DEBUG(" Nouveau fichier LOG = %s \r\n", Log_File_Name);
POTLESS_2 34:26f6e3dbefb9 631 }
POTLESS_2 34:26f6e3dbefb9 632
POTLESS_2 26:a2fe19341f92 633 void Create_File_Name_Index()
POTLESS_2 26:a2fe19341f92 634 {
POTLESS_2 26:a2fe19341f92 635 //Du nom du fichier par Index
POTLESS_2 42:3591ec9903b4 636 sprintf(Log_File_Name, "LOG_%d.csv", UTILS::File_Index());
POTLESS_2 34:26f6e3dbefb9 637 DEBUG(" Nouveau fichier LOG = %s \r\n", Log_File_Name);
POTLESS_2 34:26f6e3dbefb9 638 }
POTLESS_2 34:26f6e3dbefb9 639
POTLESS_2 4:d84250f67dec 640 int main()
POTLESS_2 12:7f3aadd79f89 641 {
POTLESS_2 40:32d89e04ead1 642
POTLESS_2 40:32d89e04ead1 643 HAL_Init();
POTLESS_2 40:32d89e04ead1 644
POTLESS_2 39:65ff3c4f9675 645 //V_USB.mode(PullDown); // on force à zero tant que l'alim par les piles n'est pas en place
POTLESS_2 34:26f6e3dbefb9 646
POTLESS_2 34:26f6e3dbefb9 647 button.fall(&pressed);
POTLESS_2 39:65ff3c4f9675 648 //vpile_off_on.rise (&retour_alim);
POTLESS_2 40:32d89e04ead1 649
POTLESS_2 40:32d89e04ead1 650 __HAL_RCC_PWR_CLK_ENABLE();
potless 37:f9461c6592f2 651 HAL_PWR_EnableBkUpAccess();
POTLESS_2 40:32d89e04ead1 652
POTLESS_2 34:26f6e3dbefb9 653 int count = 0;
POTLESS_2 12:7f3aadd79f89 654
POTLESS_2 34:26f6e3dbefb9 655 while (1) {
POTLESS_2 42:3591ec9903b4 656
POTLESS_2 42:3591ec9903b4 657 if (count == 0) {
POTLESS_2 42:3591ec9903b4 658 serialMonit.printf("\r\n Appuyez sur le User Button pour commencer...\r\n\r\n");
POTLESS_2 42:3591ec9903b4 659 }
POTLESS_2 34:26f6e3dbefb9 660 count = 1;
POTLESS_2 26:a2fe19341f92 661
POTLESS_2 34:26f6e3dbefb9 662 if (GO == 1) {
POTLESS_2 34:26f6e3dbefb9 663
POTLESS_2 34:26f6e3dbefb9 664 wait(1);
POTLESS_2 34:26f6e3dbefb9 665
POTLESS_2 34:26f6e3dbefb9 666 serialMonit.attach(&callbackParam, Serial::RxIrq);
POTLESS_2 18:bfd78c05b589 667
POTLESS_2 34:26f6e3dbefb9 668 android.attach(&callbackAndroid, Serial::RxIrq);
POTLESS_2 18:bfd78c05b589 669
POTLESS_2 34:26f6e3dbefb9 670 //Ci-dessous commande pour formater une nouvelle carte
POTLESS_2 34:26f6e3dbefb9 671 //UTILS::Format_Flash();
POTLESS_2 18:bfd78c05b589 672
POTLESS_2 34:26f6e3dbefb9 673 //Montage Flash
POTLESS_2 34:26f6e3dbefb9 674 UTILS::Mount_Flash();
POTLESS_2 18:bfd78c05b589 675
POTLESS_2 34:26f6e3dbefb9 676 //Liste des fichiers sur la Flash
POTLESS_2 42:3591ec9903b4 677 //UTILS::Dir_Flash(&serialMonit);
POTLESS_2 18:bfd78c05b589 678
POTLESS_2 42:3591ec9903b4 679 if (UTILS::File_Exist("ARNSRS_ID.sys") == false) {
POTLESS_2 42:3591ec9903b4 680 UTILS::Store_A_Val(000, "ARNSRS_ID.sys");
POTLESS_2 42:3591ec9903b4 681 DEBUG("ARNSRS ID forcée à 000\r\n");
POTLESS_2 42:3591ec9903b4 682 }
POTLESS_2 42:3591ec9903b4 683
POTLESS_2 42:3591ec9903b4 684 serialMonit.printf("\r\n\r\n Démarrage de l'appareil, veuillez patienter...\r\n\r\n");
POTLESS_2 42:3591ec9903b4 685
POTLESS_2 42:3591ec9903b4 686 //Vérification RTC, si on est le 01/01/70, c'est qu'il y a un problème...
POTLESS_2 36:1f5e2247b073 687 seconds = time(NULL);
POTLESS_2 36:1f5e2247b073 688 char YEAR[10];
POTLESS_2 36:1f5e2247b073 689 strftime(YEAR, 10, "%D", localtime(&seconds));
POTLESS_2 36:1f5e2247b073 690 if (0 == strcmp(YEAR, "01/01/70")) serialMonit.printf(" Vous devez régler la RTC...\r\n");
POTLESS_2 42:3591ec9903b4 691
POTLESS_2 42:3591ec9903b4 692
POTLESS_2 42:3591ec9903b4 693 bool calib_O2 = false;
POTLESS_2 42:3591ec9903b4 694 bool calib_CO2 = false;
POTLESS_2 15:efd3b3bf3f37 695
POTLESS_2 34:26f6e3dbefb9 696 /*
POTLESS_2 34:26f6e3dbefb9 697 Par défaut les valeur en cas de calibration sur true sont les suivant
POTLESS_2 15:efd3b3bf3f37 698
POTLESS_2 34:26f6e3dbefb9 699 nbCalibO2 = 5
POTLESS_2 34:26f6e3dbefb9 700 Mode = SPOOLING
POTLESS_2 34:26f6e3dbefb9 701 Filtre = DIGI_FILTER32
POTLESS_2 34:26f6e3dbefb9 702 CalibrationCO2 = "CALIB_AIR"
POTLESS_2 18:bfd78c05b589 703
POTLESS_2 34:26f6e3dbefb9 704 Parfois la calibration du Cozir coince...faire reset et relancer...
POTLESS_2 19:cac3761a5d0b 705
POTLESS_2 34:26f6e3dbefb9 706 Pour calibrer avec ces paramètres :
POTLESS_2 9:04bfdfc029cb 707
POTLESS_2 34:26f6e3dbefb9 708 sensors.Sensors_INIT(true, true);
POTLESS_2 19:cac3761a5d0b 709
POTLESS_2 34:26f6e3dbefb9 710 Pour changer utiliser la syntaxe suivante :
POTLESS_2 20:5f79fb4565a7 711
POTLESS_2 34:26f6e3dbefb9 712 sensors.Sensors_INIT(true, true, true, 5, SPOOLING, DIGI_FILTER32, CALIB_AIR);
POTLESS_2 12:7f3aadd79f89 713
POTLESS_2 34:26f6e3dbefb9 714 */
POTLESS_2 34:26f6e3dbefb9 715
POTLESS_2 34:26f6e3dbefb9 716 sensors.Sensors_INIT(calib_O2, calib_CO2);
POTLESS_2 34:26f6e3dbefb9 717 wait(1);
POTLESS_2 34:26f6e3dbefb9 718
POTLESS_2 34:26f6e3dbefb9 719 //Création du nouveau fichier LOG par index / par date.
POTLESS_2 42:3591ec9903b4 720 //Create_File_Name_Index();
POTLESS_2 42:3591ec9903b4 721 Create_File_Name_Date();
POTLESS_2 36:1f5e2247b073 722
POTLESS_2 34:26f6e3dbefb9 723 //Création et écriture du header du fichier LOG
POTLESS_2 35:a209a192f431 724 sensors.Create_Header(Log_File_Name);
POTLESS_2 36:1f5e2247b073 725
POTLESS_2 42:3591ec9903b4 726 Servo_Poumon.Init("Servo_Poumon.sys");
POTLESS_2 35:a209a192f431 727 //Servo_Fuite.Init("Servo_Fuite");
POTLESS_2 9:04bfdfc029cb 728
POTLESS_2 42:3591ec9903b4 729 serialMonit.printf(" Demarrage des threads...\r\n\r\n");
POTLESS_2 34:26f6e3dbefb9 730
POTLESS_2 34:26f6e3dbefb9 731 /*
POTLESS_2 34:26f6e3dbefb9 732
POTLESS_2 34:26f6e3dbefb9 733 Pour mémoire, les réglage de priorité des thread
POTLESS_2 7:ad15c386e960 734
POTLESS_2 34:26f6e3dbefb9 735 osPriorityIdle = -3, ///< priority: idle (lowest)
POTLESS_2 34:26f6e3dbefb9 736 osPriorityLow = -2, ///< priority: low
POTLESS_2 34:26f6e3dbefb9 737 osPriorityBelowNormal = -1, ///< priority: below normal
POTLESS_2 34:26f6e3dbefb9 738 osPriorityNormal = 0, ///< priority: normal (default)
POTLESS_2 34:26f6e3dbefb9 739 osPriorityAboveNormal = +1, ///< priority: above normal
POTLESS_2 34:26f6e3dbefb9 740 osPriorityHigh = +2, ///< priority: high
POTLESS_2 34:26f6e3dbefb9 741 osPriorityRealtime = +3, ///< priority: realtime (highest)
POTLESS_2 34:26f6e3dbefb9 742 osPriorityError = 0x84 ///< system cannot determine priority or thread has illegal priority
POTLESS_2 34:26f6e3dbefb9 743 */
POTLESS_2 42:3591ec9903b4 744
POTLESS_2 36:1f5e2247b073 745 wait(1);
POTLESS_2 36:1f5e2247b073 746
POTLESS_2 36:1f5e2247b073 747
POTLESS_2 34:26f6e3dbefb9 748 Thread thread_Volets(osPriorityNormal);
POTLESS_2 36:1f5e2247b073 749
POTLESS_2 34:26f6e3dbefb9 750 thread_Volets.start(callback(GO_TO_thread));
POTLESS_2 34:26f6e3dbefb9 751
POTLESS_2 42:3591ec9903b4 752 serialMonit.printf(" Volets thread démarré\r\n\r\n");
POTLESS_2 15:efd3b3bf3f37 753
POTLESS_2 34:26f6e3dbefb9 754 wait(1);
POTLESS_2 36:1f5e2247b073 755
POTLESS_2 34:26f6e3dbefb9 756 Thread thread_Secu(osPriorityNormal);
POTLESS_2 34:26f6e3dbefb9 757
POTLESS_2 34:26f6e3dbefb9 758 thread_Secu.start(callback(SECU_thread));
POTLESS_2 34:26f6e3dbefb9 759
POTLESS_2 42:3591ec9903b4 760 serialMonit.printf(" Secu thread démarré\r\n\r\n");
POTLESS_2 19:cac3761a5d0b 761
POTLESS_2 34:26f6e3dbefb9 762 wait(1);
POTLESS_2 34:26f6e3dbefb9 763
POTLESS_2 34:26f6e3dbefb9 764 Thread thread_Head(osPriorityNormal);
POTLESS_2 36:1f5e2247b073 765
POTLESS_2 34:26f6e3dbefb9 766 thread_Head.start(callback(SENSORS_thread));
POTLESS_2 34:26f6e3dbefb9 767
POTLESS_2 42:3591ec9903b4 768 serialMonit.printf(" Info thread démarré\r\n\r\n");
POTLESS_2 34:26f6e3dbefb9 769
POTLESS_2 34:26f6e3dbefb9 770 wait(1);
POTLESS_2 15:efd3b3bf3f37 771
POTLESS_2 15:efd3b3bf3f37 772
POTLESS_2 15:efd3b3bf3f37 773 #ifdef PID_MODE
POTLESS_2 34:26f6e3dbefb9 774 //Init PID
POTLESS_2 34:26f6e3dbefb9 775 //Entrée PPO2 entre 100 et 1000 mb
POTLESS_2 34:26f6e3dbefb9 776 control_Servo.setInputLimits(Min_Input, Max_Input);
POTLESS_2 34:26f6e3dbefb9 777 //Sortie servo entre 0 et 100 %
POTLESS_2 34:26f6e3dbefb9 778 control_Servo.setOutputLimits(Min_Output, Max_Output);
POTLESS_2 34:26f6e3dbefb9 779 //Mode auto au démarrage
POTLESS_2 34:26f6e3dbefb9 780 control_Servo.setMode(AUTO_MODE);
POTLESS_2 34:26f6e3dbefb9 781 //Consigne à x mb
POTLESS_2 34:26f6e3dbefb9 782 control_Servo.setSetPoint(consigne);
POTLESS_2 12:7f3aadd79f89 783 #endif
POTLESS_2 15:efd3b3bf3f37 784
POTLESS_2 42:3591ec9903b4 785 serialMonit.printf(" Threads démarrés.....\r\n\r\n Cliquez sur le bouton help pour voir la liste des \r\n commandes administrateur disponibles.\r\n$");
POTLESS_2 42:3591ec9903b4 786
POTLESS_2 34:26f6e3dbefb9 787 while (true) {
POTLESS_2 42:3591ec9903b4 788
POTLESS_2 34:26f6e3dbefb9 789 //Démarrage du Timer mesurant le temps d'éxecution du code
POTLESS_2 34:26f6e3dbefb9 790 REAL_RATE.start();
POTLESS_2 34:26f6e3dbefb9 791
POTLESS_2 34:26f6e3dbefb9 792 if (newParamFlag) {
POTLESS_2 42:3591ec9903b4 793 DEEP_DEBUG(" From PC = %s\r\n", param);
POTLESS_2 34:26f6e3dbefb9 794 Decoding_Message(param);
POTLESS_2 34:26f6e3dbefb9 795 }
POTLESS_2 34:26f6e3dbefb9 796
POTLESS_2 34:26f6e3dbefb9 797 if (newAndroidFlag) {
POTLESS_2 42:3591ec9903b4 798 DEEP_DEBUG(" From Android = %s\r\n", Android);
POTLESS_2 34:26f6e3dbefb9 799 Decoding_Message_Android(Android);
POTLESS_2 34:26f6e3dbefb9 800 }
POTLESS_2 34:26f6e3dbefb9 801
POTLESS_2 34:26f6e3dbefb9 802 //Fabrication de la chaine Date / heure
POTLESS_2 34:26f6e3dbefb9 803 seconds = time(NULL);
POTLESS_2 34:26f6e3dbefb9 804 char Time_buf[32];
POTLESS_2 34:26f6e3dbefb9 805 strftime(Time_buf, 32, "%D %I-%M-%S ", localtime(&seconds));
POTLESS_2 12:7f3aadd79f89 806
POTLESS_2 16:917656586772 807 #ifdef PID_MODE
POTLESS_2 34:26f6e3dbefb9 808 //Fabrication de la chaine à enregistrer
POTLESS_2 34:26f6e3dbefb9 809 sprintf(to_store,"%s:%d:%d:%.2f:%.2f:%.2f:%d:%d:%d:%.2f:%.2f:%d:%.3f:%.3f:%.3f:%d",
POTLESS_2 34:26f6e3dbefb9 810 Time_buf,
POTLESS_2 34:26f6e3dbefb9 811 co2,
POTLESS_2 34:26f6e3dbefb9 812 ppO2,
POTLESS_2 34:26f6e3dbefb9 813 pression,
POTLESS_2 34:26f6e3dbefb9 814 Temp1,
POTLESS_2 34:26f6e3dbefb9 815 Temp2,
POTLESS_2 34:26f6e3dbefb9 816 Humid,
POTLESS_2 34:26f6e3dbefb9 817 CellO2_1,
POTLESS_2 34:26f6e3dbefb9 818 CellO2_2,
POTLESS_2 34:26f6e3dbefb9 819 volet_poumon_Position,
POTLESS_2 34:26f6e3dbefb9 820 volet_fuite_Position,
POTLESS_2 34:26f6e3dbefb9 821 MODE_FLAG,
POTLESS_2 34:26f6e3dbefb9 822 Kc,
POTLESS_2 34:26f6e3dbefb9 823 Ti,
POTLESS_2 34:26f6e3dbefb9 824 Td,
POTLESS_2 34:26f6e3dbefb9 825 (int)consigne
POTLESS_2 34:26f6e3dbefb9 826 );
POTLESS_2 34:26f6e3dbefb9 827 #endif
POTLESS_2 34:26f6e3dbefb9 828 #ifndef PID_MODE
POTLESS_2 34:26f6e3dbefb9 829 //Fabrication de la chaine à enregistrer sans les variables du PID
POTLESS_2 42:3591ec9903b4 830 sprintf(to_store,"%s;%d;%d;%.2f;%.2f;%.2f;%d;%d;%d;%.2f;%.2f;%d;%.3f;%.3f;%.3f;%d",
POTLESS_2 34:26f6e3dbefb9 831 Time_buf,
POTLESS_2 34:26f6e3dbefb9 832 co2,
POTLESS_2 34:26f6e3dbefb9 833 ppO2,
POTLESS_2 34:26f6e3dbefb9 834 pression,
POTLESS_2 34:26f6e3dbefb9 835 Temp1,
POTLESS_2 34:26f6e3dbefb9 836 Temp2,
POTLESS_2 34:26f6e3dbefb9 837 Humid,
POTLESS_2 34:26f6e3dbefb9 838 CellO2_1,
POTLESS_2 34:26f6e3dbefb9 839 CellO2_2,
POTLESS_2 34:26f6e3dbefb9 840 volet_poumon_Position,
POTLESS_2 34:26f6e3dbefb9 841 volet_fuite_Position,
POTLESS_2 34:26f6e3dbefb9 842 MODE_FLAG,
POTLESS_2 34:26f6e3dbefb9 843 0.0,
POTLESS_2 34:26f6e3dbefb9 844 0.0,
POTLESS_2 34:26f6e3dbefb9 845 0.0,
POTLESS_2 34:26f6e3dbefb9 846 0
POTLESS_2 34:26f6e3dbefb9 847 );
POTLESS_2 18:bfd78c05b589 848 #endif
POTLESS_2 34:26f6e3dbefb9 849 char to_slave[50];
POTLESS_2 34:26f6e3dbefb9 850 //Fabrication de la chaine pour l'IHM
POTLESS_2 42:3591ec9903b4 851 sprintf(to_slave,"<%d:%d:%d:%.2f:%.2f:%.2f:%d:%d:%d:%.2f:%.2f>\r\n",
POTLESS_2 34:26f6e3dbefb9 852 co2,
POTLESS_2 34:26f6e3dbefb9 853 ppO2,
POTLESS_2 34:26f6e3dbefb9 854 (int)OTU,
POTLESS_2 34:26f6e3dbefb9 855 pression,
POTLESS_2 34:26f6e3dbefb9 856 Temp1,
POTLESS_2 34:26f6e3dbefb9 857 Temp2,
POTLESS_2 34:26f6e3dbefb9 858 Humid,
POTLESS_2 34:26f6e3dbefb9 859 CellO2_1,
POTLESS_2 34:26f6e3dbefb9 860 CellO2_2,
POTLESS_2 34:26f6e3dbefb9 861 volet_poumon_Position,
POTLESS_2 34:26f6e3dbefb9 862 volet_fuite_Position);
POTLESS_2 34:26f6e3dbefb9 863
POTLESS_2 34:26f6e3dbefb9 864 //Pour Android on ajoute < et > pour décoder l'arrivée du message
POTLESS_2 34:26f6e3dbefb9 865 if (NEED_ANDROID_OUTPUT == 1) {
POTLESS_2 34:26f6e3dbefb9 866 //sprintf(to_android,"<%s>",to_store);
POTLESS_2 40:32d89e04ead1 867 //ANDROID(to_slave);
POTLESS_2 40:32d89e04ead1 868 }
POTLESS_2 40:32d89e04ead1 869
POTLESS_2 40:32d89e04ead1 870 //Pour windev la même chose que pour l'écran
POTLESS_2 40:32d89e04ead1 871 if (FLAG_WINDEV) {
POTLESS_2 42:3591ec9903b4 872 NVIC_DisableIRQ(USART3_IRQn);
POTLESS_2 40:32d89e04ead1 873 serialMonit.printf(to_slave);
POTLESS_2 42:3591ec9903b4 874 NVIC_EnableIRQ(USART3_IRQn);
POTLESS_2 34:26f6e3dbefb9 875 }
POTLESS_2 34:26f6e3dbefb9 876
POTLESS_2 34:26f6e3dbefb9 877 //Calcul des OTU
POTLESS_2 34:26f6e3dbefb9 878 Calcul_OTU();
POTLESS_2 34:26f6e3dbefb9 879
POTLESS_2 34:26f6e3dbefb9 880 //Vers le moniteur série
POTLESS_2 42:3591ec9903b4 881 if (FLAG_AFF) {
POTLESS_2 42:3591ec9903b4 882 NVIC_DisableIRQ(USART3_IRQn);
POTLESS_2 42:3591ec9903b4 883 Affichage();
POTLESS_2 42:3591ec9903b4 884 NVIC_EnableIRQ(USART3_IRQn);
POTLESS_2 42:3591ec9903b4 885 }
POTLESS_2 42:3591ec9903b4 886
POTLESS_2 34:26f6e3dbefb9 887 //Enregistrement de la chaine
POTLESS_2 42:3591ec9903b4 888 if (FLAG_REC) {
POTLESS_2 42:3591ec9903b4 889 UTILS::Write_Flash_File(to_store, Log_File_Name);
POTLESS_2 42:3591ec9903b4 890 count ++;
POTLESS_2 42:3591ec9903b4 891 if (count > Max_Log_Size) {
POTLESS_2 42:3591ec9903b4 892 Create_File_Name_Date();
POTLESS_2 42:3591ec9903b4 893 sensors.Create_Header(Log_File_Name);
POTLESS_2 42:3591ec9903b4 894 count = 0;
POTLESS_2 42:3591ec9903b4 895 }
POTLESS_2 42:3591ec9903b4 896 }
POTLESS_2 42:3591ec9903b4 897
POTLESS_2 34:26f6e3dbefb9 898 #ifdef PID_MODE
POTLESS_2 34:26f6e3dbefb9 899 //Update du PID
POTLESS_2 34:26f6e3dbefb9 900 control_Servo.setProcessValue(ppO2);
POTLESS_2 34:26f6e3dbefb9 901 //Nouvelle sortie servo fuite si on est pas en mode SECU
POTLESS_2 34:26f6e3dbefb9 902 if(!EN_MODE_SECU) Consigne_fuite = control_Servo.compute();
POTLESS_2 34:26f6e3dbefb9 903 #endif
POTLESS_2 34:26f6e3dbefb9 904
POTLESS_2 34:26f6e3dbefb9 905 //Arrêt du Timer mesurant le temps d'éxecution du code
POTLESS_2 34:26f6e3dbefb9 906 REAL_RATE.stop();
POTLESS_2 34:26f6e3dbefb9 907 //Définition de la nouvelle valeur du temps d'échantillonage du PID.
POTLESS_2 34:26f6e3dbefb9 908 RATE = REAL_RATE.read();
POTLESS_2 34:26f6e3dbefb9 909 //Reset du Timer
POTLESS_2 34:26f6e3dbefb9 910 REAL_RATE.reset();
POTLESS_2 34:26f6e3dbefb9 911
POTLESS_2 34:26f6e3dbefb9 912 //Pour ralentir le code à Ref_Time seconde fixe quelque soit les intéruptions du loop....
POTLESS_2 34:26f6e3dbefb9 913 if (Ref_Time > RATE) {
POTLESS_2 34:26f6e3dbefb9 914 RATE_TRUE = (Ref_Time - RATE) * 1000;
POTLESS_2 34:26f6e3dbefb9 915 } else {
POTLESS_2 34:26f6e3dbefb9 916 RATE_TRUE = 0;
POTLESS_2 34:26f6e3dbefb9 917 #ifdef PID_MODE
POTLESS_2 34:26f6e3dbefb9 918 control_Servo.setInterval(RATE);
POTLESS_2 34:26f6e3dbefb9 919 #endif
POTLESS_2 40:32d89e04ead1 920 DEEP_DEBUG("Pour ralentir le code, Ref_Time doit être supérieur à %f seconde(s)\r\n\n", RATE);
POTLESS_2 34:26f6e3dbefb9 921 }
POTLESS_2 34:26f6e3dbefb9 922
POTLESS_2 34:26f6e3dbefb9 923 wait_ms(RATE_TRUE);
POTLESS_2 34:26f6e3dbefb9 924 }
POTLESS_2 34:26f6e3dbefb9 925 }
POTLESS_2 34:26f6e3dbefb9 926 }
POTLESS_2 4:d84250f67dec 927 }