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
Date:
Wed Jul 18 17:20:04 2018 +0000
Revision:
73:2bbea82bf1e5
Parent:
72:6d5590dbe13e
Child:
74:f4704f312116
correction test mise ? l heure n?cessaire; correction sens action moteur en PID

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