![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
mbed-os github
Dependencies: ADS1015 Faulhaber HTU21D_mod MS5837_potless Sensor_Head_RevB_3 USBDevice_dfu Utilsdfu beep
Fork of ARNSRS_testDFU by
Diff: main.cpp
- Revision:
- 62:891379d80b1b
- Parent:
- 60:e2922f9e309c
- Child:
- 63:69f6d600807e
diff -r e2922f9e309c -r 891379d80b1b main.cpp --- a/main.cpp Sat Jun 30 01:18:40 2018 +0000 +++ b/main.cpp Tue Jul 03 16:24:59 2018 +0000 @@ -37,11 +37,6 @@ #define OUTPUT(...) { serialMonit.printf(__VA_ARGS__); fflush(stdout);} #define IHM(...) { NVIC_DisableIRQ(USART3_IRQn); display.printf(__VA_ARGS__); fflush(stdout);NVIC_EnableIRQ(USART3_IRQn);} -//PinName pwm, PinName nSleep, PinName fwd, PinName rev, PinName channelA, PinName channelB, int pulsesPerRev, int Rapport, Encoding encoding = X2_ENCODING -//Angle 0 -> tuyau fermé, Angle 90 -> tuyau ouvert -Faulhaber Servo_Poumon(VOLET_POUMON_ADDR, PWM_SERVO_POUMON, nSleep_SERVO_POUMON, FWD_SERVO_POUMON, REV_SERVO_POUMON, Channel_A_SERVO_POUMON, Channel_B_SERVO_POUMON, 16, 1257, Faulhaber::X2_ENCODING); -Faulhaber Servo_Fuite(VOLET_FUITE_ADDR, PWM_SERVO_FUITE, nSleep_SERVO_FUITE, FWD_SERVO_FUITE, REV_SERVO_FUITE, Channel_A_SERVO_FUITE, Channel_B_SERVO_FUITE, 16, 207, Faulhaber::X2_ENCODING); - //Communication USB, OTG_FS USBSerial serialMonit(0x0483, 0x5740, 0x0001, false); //USBSerial serialMonit;//Pour pilotes windows Olivier @@ -52,6 +47,11 @@ //Communication avec l'IHM, Serial 3 Serial display(PC_4, PC_5, 115200); +//PinName pwm, PinName nSleep, PinName fwd, PinName rev, PinName channelA, PinName channelB, int pulsesPerRev, int Rapport, Encoding encoding = X2_ENCODING +//Angle 0 -> tuyau fermé, Angle 90 -> tuyau ouvert +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); +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); + //Init de la lib ARNSRS; SENSOR_HEAD_REV_B sensors; @@ -119,10 +119,12 @@ //Contrôle des servos float Consigne_poumon = HOME_SERVO_POUMON; float volet_poumon_Position; + float Consigne_fuite = HOME_SERVO_FUITE; float volet_fuite_Position; + float Volets_Speed = 1; -float Volet_DeadBand = 10; +float Volet_DeadBand = 5; //Paramètre du PID float Kc = 40; @@ -171,26 +173,11 @@ //Pin du Buzzer Beep buzzer(PC_8); - -/* - -Pour mémoire, les réglage de priorité des thread - - osPriorityIdle = -3, ///< priority: idle (lowest) - osPriorityLow = -2, ///< priority: low - osPriorityBelowNormal = -1, ///< priority: below normal - osPriorityNormal = 0, ///< priority: normal (default) - osPriorityAboveNormal = +1, ///< priority: above normal - osPriorityHigh = +2, ///< priority: high - osPriorityRealtime = +3, ///< priority: realtime (highest) - osPriorityError = 0x84 ///< system cannot determine priority or thread has illegal priority -*/ - //Déclaration des Threads -Thread thread_Secu(osPriorityLow); -Thread thread_Head(osPriorityLow); -Thread thread_Volets_POUMON(osPriorityLow); -Thread thread_Volets_FUITE(osPriorityLow); +Thread thread_Secu; +Thread thread_Head; +Thread thread_Volets_POUMON; +Thread thread_Volets_FUITE; void sleepDemande() { @@ -207,11 +194,13 @@ IHM("<0 0 ;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;%d>\r\n", Commande_IHM); FLAG_DISPLAY = false; Commande_IHM = 0; + // mise à zero UART IHM pour éviter son redémarrage intempestif (le tx suffirait) HAL_PWREx_EnableGPIOPullDown(PWR_GPIO_C, PWR_GPIO_BIT_4); HAL_PWREx_EnableGPIOPullDown(PWR_GPIO_C, PWR_GPIO_BIT_5); E5V = 0; + UTILS::EffacePage(2, 29, 1); UTILS::Write(DFU_ADDR, 0xBABEFACE); @@ -231,13 +220,14 @@ HAL_PWREx_EnterSHUTDOWNMode(); } - // gestion du cas où le sleep est demandé volontairement // et où l'utilisateur coupe ensuite l'alimentation en débranchant ou interrupteur sur off // on refait un shutdown mais avec un wake up sur le branchement du cable + interrupteur sur ON void flagSleep(){ if ((int) UTILS::Read(DFU_ADDR) == 0xBABEFACE ) { + DEBUG(" Re démarrage BABEFACE.\n"); + /* Commande_IHM = 1; IHM("<0 0 ;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;%d>\r\n", Commande_IHM); FLAG_DISPLAY = false; @@ -245,11 +235,17 @@ HAL_PWREx_EnableGPIOPullDown(PWR_GPIO_C, PWR_GPIO_BIT_4); HAL_PWREx_EnableGPIOPullDown(PWR_GPIO_C, PWR_GPIO_BIT_5); + buzzer.beep(1000,0.1); wait_ms(100); buzzer.beep(1000,0.1); wait(1); + */ + + E5V = 0; + UTILS::EffacePage(2, 29, 1); + HAL_PWREx_EnablePullUpPullDownConfig() ; HAL_PWREx_EnableGPIOPullDown(PWR_GPIO_A, PWR_GPIO_BIT_0); HAL_PWR_DisableWakeUpPin(PWR_WAKEUP_PIN1); // pour PA_0 @@ -275,8 +271,11 @@ buzzer.beep(1000,0.3); wait_ms(500); buzzer.beep(1000,0.3); + wait(1); + E5V = 0; + //Arrêt des enregistrements FLAG_REC = false; @@ -306,7 +305,7 @@ //Mise en veille version cable arraché DEBUG(" Mise en veille...\r\n"); //wait(1); - //Mise en veille + //Mise en veille HAL_PWREx_EnablePullUpPullDownConfig() ; HAL_PWREx_EnableGPIOPullDown(PWR_GPIO_A, PWR_GPIO_BIT_0); HAL_PWR_DisableWakeUpPin(PWR_WAKEUP_PIN1); // pour PA_0 @@ -392,7 +391,8 @@ { //Mise du PID en mode manuel (desactivation...) - control_Servo.setMode(MANUAL_MODE); + //control_Servo.setMode(MANUAL_MODE); + FLAG_PID = 0; Consigne_poumon = HOME_SERVO_POUMON; Consigne_fuite = HOME_SERVO_FUITE; @@ -400,13 +400,12 @@ Volets_Speed = 1; Volet_DeadBand = 10; - while(1) { wait_ms(100); if (Servo_Poumon.Pos_OK() == true && Servo_Fuite.Pos_OK() == true) break; } - - + + OUTPUT(" Appareil en mode SECU\r\n"); wait_ms(100); @@ -415,17 +414,6 @@ wait_ms(100); - /* - int Pos_P = Servo_Poumon.getPulses(); - UTILS::Store_A_Val((float)Pos_P, "Servo_Poumon.sys"); - DEBUG(" position volet poumon sauvegardée = %d pulse(s)\r\n", Pos_P); - OUTPUT(" Volet poumon en sécu\r\n"); - - int Pos_F = Servo_Fuite.getPulses(); - UTILS::Store_A_Val((float)Pos_F, "Servo_Fuite.sys"); - DEBUG(" position volet fuite sauvegardée = %d pulse(s)\r\n", Pos_F); - OUTPUT(" Volet fuite en sécu\r\n"); - */ UTILS::EffacePage(2, 31, 1); //Enregistrement position des servos en sécu pour plus de précision uint64_t Pos_P = Servo_Poumon.getPulses(); @@ -544,10 +532,11 @@ { while (true) { //DEEP_DEBUG(" GO_TO_Thread_POUMON\r\n"); - + //Servo_Poumon.Go_To_Prop(Consigne_poumon); - //Servo_Poumon.Go_To_PID(Consigne_poumon, Volet_DeadBand); + //Servo_Poumon.Go_To_PID(Consigne_poumon, Volet_DeadBand);//Nécessite de déclarer un dernier terme true dans l'init du moteur Servo_Poumon.Go_To(Consigne_poumon, Volets_Speed, Volet_DeadBand); + } } @@ -559,6 +548,7 @@ //Servo_Fuite.Go_To_Prop(Consigne_fuite); //Servo_Fuite.Go_To_PID(Consigne_fuite, Volet_DeadBand); Servo_Fuite.Go_To(Consigne_fuite, Volets_Speed, Volet_DeadBand); + } } @@ -788,11 +778,9 @@ NVIC_SystemReset(); } else if (0 == strcmp(com, "PID")) { if (FLAG_PID == 1) { - //control_Servo.setMode(MANUAL_MODE); OUTPUT(" PID OFF\r\n"); FLAG_PID = 0; } else if (FLAG_PID == 0) { - //control_Servo.setMode(AUTO_MODE); OUTPUT(" PID ON\r\n"); FLAG_PID = 1; } @@ -853,12 +841,14 @@ int main() { + flagSleep(); // on vérifie si la demande de sleep n'est pas active (permet de redémarrer sur un front haut) HAL_Init(); __HAL_RCC_PWR_CLK_ENABLE(); HAL_PWR_EnableBkUpAccess(); UTILS::DFU(); + flagSleep(); // on vérifie si la demande de sleep n'est pas active (permet de redémarrer sur un front haut) E5V = 1; @@ -876,12 +866,14 @@ //Montage Flash UTILS::Mount_Flash(); + /* if (UTILS::File_Exist("ARNSRS_ID.sys") == false) { UTILS::Store_A_Val(000, "ARNSRS_ID.sys"); DEBUG("ARNSRS ID forcée à 000\r\n"); } */ + //pour le premier lancement quand l'appareil n'a pas d'ID. //int ID = 0; //UTILS::Write(ADRESSE_ID, ID); @@ -899,7 +891,7 @@ bool calib_O2 = false; bool calib_CO2 = false; - //sensors.Sensors_INIT(calib_O2, calib_CO2); + sensors.Sensors_INIT(calib_O2, calib_CO2); wait(1); @@ -919,28 +911,53 @@ */ DEBUG(" Demarrage des threads...\r\n\r\n"); - - wait(1); - - thread_Secu.start(callback(SECU_thread)); - - DEBUG(" Contrôle des paramètres de sécu démarré\r\n\r\n"); - + + /* + + Pour mémoire, les réglage de priorité des thread + + osPriorityIdle = -3, ///< priority: idle (lowest) + osPriorityLow = -2, ///< priority: low + osPriorityBelowNormal = -1, ///< priority: below normal + osPriorityNormal = 0, ///< priority: normal (default) + osPriorityAboveNormal = +1, ///< priority: above normal + osPriorityHigh = +2, ///< priority: high + osPriorityRealtime = +3, ///< priority: realtime (highest) + osPriorityError = 0x84 ///< system cannot determine priority or thread has illegal priority + */ + + thread_Volets_POUMON.set_priority(osPriorityHigh); + + thread_Volets_POUMON.start(callback(GO_TO_thread_POUMON)); + + DEBUG(" Contrôle volet Poumon démarré\r\n\r\n"); + wait(1); + thread_Volets_FUITE.set_priority(osPriorityHigh); + + thread_Volets_FUITE.start(callback(GO_TO_thread_FUITE)); + + DEBUG(" Contrôle volet Fuite démarré\r\n\r\n"); + + wait(1); + + thread_Secu.set_priority(osPriorityNormal); + + thread_Secu.start(callback(SECU_thread)); + + DEBUG(" Contrôle des paramètres de sécu démarré\r\n\r\n"); + + wait(1); + + thread_Head.set_priority(osPriorityNormal); + thread_Head.start(callback(SENSORS_thread)); - + DEBUG(" Tête capteurs démarrée\r\n\r\n"); - + wait(1); - thread_Volets_POUMON.start(callback(GO_TO_thread_POUMON)); - - wait(1); - - thread_Volets_FUITE.start(callback(GO_TO_thread_FUITE)); - - DEBUG(" Contrôle des volets démarré\r\n\r\n"); //Init PID //Entrée PPO2 entre 100 et 1000 mb