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:
Tue Jun 12 10:42:12 2018 +0000
Revision:
56:61b0f4d6a890
Parent:
55:6536e02d729e
Child:
57:a0827fa46b03
derniere

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