From fd12f4c92b3e8a2df4c9c4cb449aae18d2b1a7a2 Mon Sep 17 00:00:00 2001 From: pfaure Date: Sun, 15 Nov 2020 11:41:05 +0100 Subject: [PATCH] =?UTF-8?q?Version=20Compilable=20:=20Orchestration=20de?= =?UTF-8?q?=20tous=20les=20=C3=A9l=C3=A9ments=20faite=20(TAF=20->=20Tester?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- MDK-ARM/Project.uvoptx | 28 +++++++--- MDK-ARM/Project.uvprojx | 10 ++++ Src/Allure.c | 4 ++ Src/Allure.h | 2 + Src/Securite.c | 13 ++--- Src/Securite.h | 4 +- Src/Transmission.c | 121 ++++++++++++++++++++++++++++++++++++++-- Src/Transmission.h | 2 + Src/Voile.c | 3 - Src/Voilier.c | 108 +++++++++++++---------------------- Src/string.c | 11 ++++ Src/string.h | 6 ++ 12 files changed, 216 insertions(+), 96 deletions(-) create mode 100644 Src/string.c create mode 100644 Src/string.h diff --git a/MDK-ARM/Project.uvoptx b/MDK-ARM/Project.uvoptx index a3deb64..9d5dd72 100644 --- a/MDK-ARM/Project.uvoptx +++ b/MDK-ARM/Project.uvoptx @@ -344,7 +344,7 @@ 0 48 1 -
134218244
+
134219720
0 0 0 @@ -550,6 +550,18 @@ 0 0 + + 2 + 9 + 1 + 0 + 0 + 0 + ..\Src\string.c + string.c + 0 + 0 + @@ -560,7 +572,7 @@ 0 3 - 9 + 10 1 0 0 @@ -572,7 +584,7 @@ 3 - 10 + 11 1 0 0 @@ -584,7 +596,7 @@ 3 - 11 + 12 1 0 0 @@ -596,7 +608,7 @@ 3 - 12 + 13 1 0 0 @@ -608,7 +620,7 @@ 3 - 13 + 14 1 0 0 @@ -636,7 +648,7 @@ 0 5 - 14 + 15 1 0 0 @@ -656,7 +668,7 @@ 0 6 - 15 + 16 2 0 0 diff --git a/MDK-ARM/Project.uvprojx b/MDK-ARM/Project.uvprojx index 42336c6..0647dd4 100644 --- a/MDK-ARM/Project.uvprojx +++ b/MDK-ARM/Project.uvprojx @@ -427,6 +427,11 @@ 1 ..\Src\Securite.c + + string.c + 1 + ..\Src\string.c + @@ -908,6 +913,11 @@ 1 ..\Src\Securite.c + + string.c + 1 + ..\Src\string.c + diff --git a/Src/Allure.c b/Src/Allure.c index 0925b59..f63304c 100644 --- a/Src/Allure.c +++ b/Src/Allure.c @@ -93,6 +93,10 @@ char * AllureToString(int alpha) { } } +int GirouetteInitialisee(void) { + return initialized; +} + void EXTI9_5_IRQHandler(void) { LL_TIM_SetCounter(TIM3, 0); initialized = 1; diff --git a/Src/Allure.h b/Src/Allure.h index e359520..26c2f2b 100644 --- a/Src/Allure.h +++ b/Src/Allure.h @@ -38,4 +38,6 @@ int RecupAllure(void); */ char * AllureToString(int alpha); +int GirouetteInitialisee(void); + #endif diff --git a/Src/Securite.c b/Src/Securite.c index 116cdb3..d4471c2 100644 --- a/Src/Securite.c +++ b/Src/Securite.c @@ -99,14 +99,14 @@ int RecupNiveauBatterie(void){ * @param un entier representant le niveau de batterie en pourcentage * @retval */ -void CalculDangerNiveauBatterie(int niveau){ +int CalculerDangerNiveauBatterie(int niveau){ if ( niveau <= Seuil) { - drapeauDangerBatterie = 1; + return 1; } else { - drapeauDangerBatterie = 0 ; + return 1; } } @@ -117,15 +117,14 @@ void CalculDangerNiveauBatterie(int niveau){ * @param un entier representant l angle de rouli * @retval NONE */ -void CalculerDangerChavirement(int gamma){ +int CalculerDangerChavirement(int gamma){ if ( gamma >= SeuilAngle) { - drapeauDangerRouli = 1; - TendreVoile(90); //On lache les voiles si danger de chavirement + return 1; } else { - drapeauDangerRouli = 0 ; + return 1; } } diff --git a/Src/Securite.h b/Src/Securite.h index 8c1be6f..f90a498 100644 --- a/Src/Securite.h +++ b/Src/Securite.h @@ -7,7 +7,7 @@ * @param * @retval */ -void CalculerDangerChavirement(int gamma); +int CalculerDangerChavirement(int gamma); /** * @brief @@ -40,6 +40,6 @@ void ConfSecurite(void); * @param * @retval */ -void CalculDangerNiveauBatterie(int niveau); +int CalculerDangerNiveauBatterie(int niveau); #endif diff --git a/Src/Transmission.c b/Src/Transmission.c index 29c7e91..1b5db87 100644 --- a/Src/Transmission.c +++ b/Src/Transmission.c @@ -6,8 +6,38 @@ #include "stm32f1xx_ll_system.h" // utile dans la fonction SystemClock_Config #include "Allure.h" #include "Voile.h" +#include "string.h" -int drapeauTransmission = 1; +#define TAILLE_MESSAGE_MAX 100 + +// Structure pour gérer la transmission du message +struct t_transmission { + char message[TAILLE_MESSAGE_MAX];// Le message lui même + int position;// La position du caractere a envoyer + int taille_message; //On peut envoyer des messages de tailles variables, il faut donc spécifier la taille + char envoyer;// Booléen utilisé comme flag -> vrai on envoie, faux on fait rien + char exceptionnel; //Booléen utilisé comme flag -> vrai on envoie un message excep donc, on ne fait pas l'envoi regulier +}; + +/** + * @brief Initialise une structure t_transmission. + * @note Structure initialisée : (message -> 00:00:00:, end_of_message -> 0x0D, position -> 0, first_appel -> 1) + * @param @ de la structure a initialiser + * @retval None + */ +void init_t_transmission(struct t_transmission * transmission) { + int i; + for (i=0; imessage[i] = '0'; + } + transmission->message[TAILLE_MESSAGE_MAX - 1] = '\0'; + transmission->position = 0; + transmission->taille_message = 0; + transmission->envoyer = 0; + transmission->exceptionnel = 0; +} + +static struct t_transmission transmission; void ConfTransmission(){ @@ -22,11 +52,46 @@ void ConfTransmission(){ LL_GPIO_SetPinMode(GPIOA,LL_GPIO_PIN_11,LL_GPIO_MODE_OUTPUT); LL_GPIO_SetPinOutputType(GPIOA,LL_GPIO_PIN_11,LL_GPIO_OUTPUT_PUSHPULL); + + init_t_transmission(&transmission); } + + void EnvoiRegulier(char * Allure, char * tension){ - LL_GPIO_SetOutputPin(GPIOA,LL_GPIO_PIN_11); + if (!transmission.exceptionnel) { + /* Message de la forme suivante : + _____________________________ + Allure actuelle : xxxxxxxxxxx + Tension des voiles : xxxxxxxx + _____________________________*/ + + static char promptligne1[] = "Allure actuelle : "; + static int promptligne1size = sizeof(promptligne1); + static char promptligne2[] = "Tension des voiles : "; + static int promptligne2size = sizeof(promptligne2); + static char rc[] = "\n"; + static int rcsize = sizeof(rc); + + transmission.message[0] = '\0'; + int current_size = 1; + + current_size = Concatenate(promptligne1, transmission.message, promptligne1size, current_size, TAILLE_MESSAGE_MAX); + current_size = Concatenate(Allure, transmission.message, sizeof(Allure), current_size, TAILLE_MESSAGE_MAX); + current_size = Concatenate(rc, transmission.message, rcsize, current_size, TAILLE_MESSAGE_MAX); + current_size = Concatenate(promptligne2, transmission.message, promptligne2size, current_size, TAILLE_MESSAGE_MAX); + current_size = Concatenate(tension, transmission.message, sizeof(tension), current_size, TAILLE_MESSAGE_MAX); + current_size = Concatenate(rc, transmission.message, rcsize, current_size, TAILLE_MESSAGE_MAX); + current_size = Concatenate(rc, transmission.message, rcsize, current_size, TAILLE_MESSAGE_MAX); + + transmission.envoyer = 1; + transmission.position = 0; + transmission.taille_message = current_size; + } +} + +/*LL_GPIO_SetOutputPin(GPIOA,LL_GPIO_PIN_11); int tailleAllure = sizeof(Allure); int tailleTension = 8; //ATTENTION TAILLE int index = 0; @@ -44,11 +109,41 @@ void EnvoiRegulier(char * Allure, char * tension){ } } LL_GPIO_ResetOutputPin(GPIOA,LL_GPIO_PIN_11); -} +}*/ + + void EnvoiExceptionnel(char * msgAlarme){ - LL_GPIO_SetOutputPin(GPIOA,LL_GPIO_PIN_11); + /* Message de la forme suivante : + _____________________________ + Allure actuelle : xxxxxxxxxxx + Tension des voiles : xxxxxxxx + _____________________________*/ + + static char prompt[] = "WARNING : "; + static int promptsize = sizeof(prompt); + static char rc[] = "\n"; + static int rcsize = sizeof(rc); + + transmission.message[0] = '\0'; + int current_size = 1; + + current_size = Concatenate(rc, transmission.message, rcsize, current_size, TAILLE_MESSAGE_MAX); + current_size = Concatenate(rc, transmission.message, rcsize, current_size, TAILLE_MESSAGE_MAX); + current_size = Concatenate(prompt, transmission.message, promptsize, current_size, TAILLE_MESSAGE_MAX); + current_size = Concatenate(msgAlarme, transmission.message, sizeof(msgAlarme), current_size, TAILLE_MESSAGE_MAX); + current_size = Concatenate(rc, transmission.message, rcsize, current_size, TAILLE_MESSAGE_MAX); + current_size = Concatenate(rc, transmission.message, rcsize, current_size, TAILLE_MESSAGE_MAX); + + transmission.envoyer = 1; + transmission.position = 0; + transmission.taille_message = current_size; + transmission.exceptionnel = 1; + +} + +/*LL_GPIO_SetOutputPin(GPIOA,LL_GPIO_PIN_11); int tailleMessage = sizeof(msgAlarme); int index = 0; while(index < tailleMessage){ @@ -56,6 +151,20 @@ void EnvoiExceptionnel(char * msgAlarme){ LL_USART_TransmitData8(USART1, (uint8_t) msgAlarme[index]); //On envoie le message (8 bits) index++; } - } - + } + LL_GPIO_ResetOutputPin(GPIOA,LL_GPIO_PIN_11); +}*/ + +void EnvoyerCaractere(void) { + if (transmission.envoyer) { + if (LL_USART_IsActiveFlag_TXE(USART1)) {//On regarde si le flag de transmission terminée est actif + if (transmission.position < transmission.taille_message) { + LL_USART_TransmitData8(USART1, (uint8_t)(transmission.message[transmission.position])); + transmission.position += 1; + } else { + transmission.envoyer = 0; + transmission.exceptionnel = 0; + } + } + } } diff --git a/Src/Transmission.h b/Src/Transmission.h index 50b9a8a..9b47f57 100644 --- a/Src/Transmission.h +++ b/Src/Transmission.h @@ -5,6 +5,8 @@ void EnvoiRegulier(char * Allure, char * tension); void EnvoiExceptionnel(char * msgAlarme); +void EnvoyerCaractere(void); + void ConfTransmission(void); #endif diff --git a/Src/Voile.c b/Src/Voile.c index 840d78f..d03c2ec 100644 --- a/Src/Voile.c +++ b/Src/Voile.c @@ -1,8 +1,5 @@ #include "Voile.h" #include "stm32f1xx_ll_gpio.h" -#include "stm32f1xx_ll_rcc.h" // utile dans la fonction SystemClock_Config -#include "stm32f1xx_ll_utils.h" // utile dans la fonction SystemClock_Config -#include "stm32f1xx_ll_system.h" // utile dans la fonction SystemClock_Config #include "stm32f1xx_ll_tim.h" #include "stm32f1xx_ll_bus.h" #include "maths.h" //Remplacer par maths.h quand on va tout faire marcher. diff --git a/Src/Voilier.c b/Src/Voilier.c index 400eddd..990d36b 100644 --- a/Src/Voilier.c +++ b/Src/Voilier.c @@ -11,30 +11,12 @@ void SystemClock_Config(void); -extern int drapeauRecupSecurite; // Flag qui est mis à 1 toute les 10 sec pour recuperer niveau batterie/rouli et envoi régulier -extern int drapeauDangerBatterie; //Flag qui est mis à 1 toute les 10 sec si batterie faible --> envoie message alarme -extern int drapeauDangerRouli; //Flag qui est mis à 1 toute les 10 sec si rouli pas bon --> envoie message alarme -extern int drapeauTransmission; - -void ConfSysTick(){ - NVIC_EnableIRQ(SysTick_IRQn); +void ConfSysTick(void){ SysTick_Config(7200000); } -void SysTick_Handler(void) { /* SysTick interrupt Handler. */ - static int msTicks = 0; - - msTicks++; - - if (msTicks % 30 == 0){ - drapeauTransmission = 1; - } - - if (msTicks % 90 == 0) { - drapeauRecupSecurite = 1; - msTicks = 0; - } - +void SysTickEnableIT(void) { + NVIC_EnableIRQ(SysTick_IRQn); } /** @@ -45,21 +27,16 @@ void SysTick_Handler(void) { /* SysTick interrupt * @retval None */ void Setup(){ + ConfSecurite(); ConfAllure(); ConfVoile(); ConfGouvernail(); ConfTransmission(); ConfSysTick(); - - } -//on utilise EnvoiRegulier de Transmission -//TODO : r�cuperer les valeurs des params de EnvoiRegulier -//Interruption toute les 3s via un Timer qui d�clenche cette fonction qui permet d'envoyer ce qu'il faut - /** * @brief * @note @@ -67,33 +44,45 @@ void Setup(){ * @retval */ void Envoi3s(){ - + EnvoiRegulier(AllureToString(RecupAllure()), TensionVoileToString(RecupTensionVoile())); } /** * @brief tache qui va fonctionner en fond qui gere l'orientation des voiles, le gouvernail et aussi le systeme anti-chavirement - * @note relacher les voiles <=> tendre les voiles avec un angle � 90� + * @note Le temps d'exécution de cette tache a été mesuré à environ 3.14ms, + on peut donc largement la lancer toutes les 100ms en interruption sans risque de trop mobiliser le CPU * @param None * @retval None */ -void Background(){ +void Task100ms(){ //Voiles - int allure = RecupAllure(); //on recupere l'allulre via la girouette - int tensionVoile = CalculerTension(allure); //grace � l'allure on peut calculer la tension � appliquer sur la voile - TendreVoile(CalculerTension(RecupAllure())); //on tend la voile gr�ce � la tension obtenue + TendreVoile(CalculerTension(RecupAllure())); //on tend la voile grace à la tension obtenue a partir du calcul et de l'allure lue //Gouvernail - int commande = LireTelecommande(); //on lit la valeur renvoy�e par la t�l�commande - CommanderMoteur(commande); //On commande le moteur pour aller � la vitesse voulue + CommanderMoteur(LireTelecommande()); //On commande le moteur pour aller à la vitesse lue a la télécommande //Anti-Chavirement - /*int rouli = RecupRouli(); - int danger = CalculerDanger(rouli);//renvoi boolean : int � 0 si faux et 1 si vrai - if(danger){ + if(CalculerDangerChavirement(RecupRouli())){//renvoi boolean : int à 0 si faux et 1 si vrai TendreVoile(90); //si il y a danger on relache les voiles (relacher les voiles = les mettre � 90) - }*/ + EnvoiExceptionnel("Risque de chavirement, voiles choquées");//Et on prévient l'utilisateur + } + + //Anti-Chavirement + if(CalculerDangerNiveauBatterie(RecupNiveauBatterie())){//renvoi boolean : int à 0 si faux et 1 si vrai + EnvoiExceptionnel("Batterie faible");//Et on prévient l'utilisateur + } +} +void SysTick_Handler(void) { /* SysTick interrupt Handler. */ + static int compteur = 0; + compteur++; + if (compteur == 30) { + Envoi3s(); + compteur = 0; + } else { + Task100ms(); + } } int main(){ @@ -101,38 +90,17 @@ int main(){ SystemClock_Config(); Setup(); - + + EnvoiExceptionnel("Veuillez faire tourner la girouette SVP."); + + while(!GirouetteInitialisee()) { + EnvoyerCaractere(); + } + + SysTickEnableIT(); + while(1){ - int level ; - int rouli; - /* Envoi message toute les 3 sec sur l'Allure et la tension voile */ - if (drapeauTransmission){ - EnvoiRegulier(AllureToString(RecupAllure()), TensionVoileToString(RecupTensionVoile())); - drapeauTransmission = 0; - } - - /* Recuperation toute les 10 sec niveau batterie et angle chavirement, puis calcul des dangers */ - if (drapeauRecupSecurite){ - level = RecupNiveauBatterie(); - CalculDangerNiveauBatterie( level ); - rouli = RecupRouli(); - CalculerDangerChavirement(rouli); - drapeauRecupSecurite = 0; - } - - /*Si batterie faible après recup (toute les 10 sec), envoi alerte batterie faible */ - if (drapeauDangerBatterie){ - char * msgBatterie = "Batterie faible"; - EnvoiExceptionnel(msgBatterie); - drapeauDangerBatterie = 0; - } - - /*Si angle chavirement pas bon après recup (toute les 10 sec), envoi alerte chavirement */ - if (drapeauDangerRouli){ - char * msgRouli = "Bateau chavire !"; - EnvoiExceptionnel(msgRouli); - drapeauDangerRouli = 0; - } + EnvoyerCaractere(); } } diff --git a/Src/string.c b/Src/string.c new file mode 100644 index 0000000..ecbbfdc --- /dev/null +++ b/Src/string.c @@ -0,0 +1,11 @@ +int Concatenate(char * chaine1, char * chaine2, int sizechaine1, int sizechaine2, int sizemax) { + if ((sizechaine1 + sizechaine2 - 1) <= sizemax) { + int j; + for (j=0; j < sizechaine1; j++) { + chaine2[(sizechaine2 - 1 )+ j] = chaine1[j]; + } + return sizechaine1 + sizechaine2 - 1; + } else { + return 0; + } +} diff --git a/Src/string.h b/Src/string.h new file mode 100644 index 0000000..8a15a54 --- /dev/null +++ b/Src/string.h @@ -0,0 +1,6 @@ +#ifndef STRING_H +#define STRING_H + +int Concatenate(char * chaine1, char * chaine2, int sizechaine1, int sizechaine2, int sizemax); + +#endif