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:
Thu Jul 12 10:01:34 2018 +0000
Revision:
68:7f4ab9c03b32
Parent:
65:c7d09a1fbef3
Child:
69:9afe54d53bb0
commande save_os et option traceur arduino, thread au lieu d'interruption sur le d?branchage USB

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