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:
Fri Jun 29 09:40:02 2018 +0000
Revision:
58:694d4d00407c
Parent:
57:a0827fa46b03
Child:
59:fd64ca9dae27
avec motif OTU, motif ?mulation EEPROM avec flash, DFU natif

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