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:
Mon Sep 17 13:01:59 2018 +0000
Revision:
88:8965483d35c9
Parent:
87:314231bfaf8f
avec mbed-os de github

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