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:
Wed Jul 11 06:22:10 2018 +0000
Revision:
67:92972b960226
Parent:
64:a85cddb22fff
ajout commande de sauvegarde position

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