Version Compilable : Orchestration de tous les éléments faite (TAF -> Tester)

This commit is contained in:
Paul Faure 2020-11-15 11:41:05 +01:00
parent 73b655d977
commit fd12f4c92b
12 changed files with 216 additions and 96 deletions

View file

@ -344,7 +344,7 @@
<Type>0</Type> <Type>0</Type>
<LineNumber>48</LineNumber> <LineNumber>48</LineNumber>
<EnabledFlag>1</EnabledFlag> <EnabledFlag>1</EnabledFlag>
<Address>134218244</Address> <Address>134219720</Address>
<ByteObject>0</ByteObject> <ByteObject>0</ByteObject>
<HtxType>0</HtxType> <HtxType>0</HtxType>
<ManyObjects>0</ManyObjects> <ManyObjects>0</ManyObjects>
@ -550,6 +550,18 @@
<RteFlg>0</RteFlg> <RteFlg>0</RteFlg>
<bShared>0</bShared> <bShared>0</bShared>
</File> </File>
<File>
<GroupNumber>2</GroupNumber>
<FileNumber>9</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\Src\string.c</PathWithFileName>
<FilenameWithoutPath>string.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
</Group> </Group>
<Group> <Group>
@ -560,7 +572,7 @@
<RteFlg>0</RteFlg> <RteFlg>0</RteFlg>
<File> <File>
<GroupNumber>3</GroupNumber> <GroupNumber>3</GroupNumber>
<FileNumber>9</FileNumber> <FileNumber>10</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@ -572,7 +584,7 @@
</File> </File>
<File> <File>
<GroupNumber>3</GroupNumber> <GroupNumber>3</GroupNumber>
<FileNumber>10</FileNumber> <FileNumber>11</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@ -584,7 +596,7 @@
</File> </File>
<File> <File>
<GroupNumber>3</GroupNumber> <GroupNumber>3</GroupNumber>
<FileNumber>11</FileNumber> <FileNumber>12</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@ -596,7 +608,7 @@
</File> </File>
<File> <File>
<GroupNumber>3</GroupNumber> <GroupNumber>3</GroupNumber>
<FileNumber>12</FileNumber> <FileNumber>13</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@ -608,7 +620,7 @@
</File> </File>
<File> <File>
<GroupNumber>3</GroupNumber> <GroupNumber>3</GroupNumber>
<FileNumber>13</FileNumber> <FileNumber>14</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@ -636,7 +648,7 @@
<RteFlg>0</RteFlg> <RteFlg>0</RteFlg>
<File> <File>
<GroupNumber>5</GroupNumber> <GroupNumber>5</GroupNumber>
<FileNumber>14</FileNumber> <FileNumber>15</FileNumber>
<FileType>1</FileType> <FileType>1</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>
@ -656,7 +668,7 @@
<RteFlg>0</RteFlg> <RteFlg>0</RteFlg>
<File> <File>
<GroupNumber>6</GroupNumber> <GroupNumber>6</GroupNumber>
<FileNumber>15</FileNumber> <FileNumber>16</FileNumber>
<FileType>2</FileType> <FileType>2</FileType>
<tvExp>0</tvExp> <tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg> <tvExpOptDlg>0</tvExpOptDlg>

View file

@ -427,6 +427,11 @@
<FileType>1</FileType> <FileType>1</FileType>
<FilePath>..\Src\Securite.c</FilePath> <FilePath>..\Src\Securite.c</FilePath>
</File> </File>
<File>
<FileName>string.c</FileName>
<FileType>1</FileType>
<FilePath>..\Src\string.c</FilePath>
</File>
</Files> </Files>
</Group> </Group>
<Group> <Group>
@ -908,6 +913,11 @@
<FileType>1</FileType> <FileType>1</FileType>
<FilePath>..\Src\Securite.c</FilePath> <FilePath>..\Src\Securite.c</FilePath>
</File> </File>
<File>
<FileName>string.c</FileName>
<FileType>1</FileType>
<FilePath>..\Src\string.c</FilePath>
</File>
</Files> </Files>
</Group> </Group>
<Group> <Group>

View file

@ -93,6 +93,10 @@ char * AllureToString(int alpha) {
} }
} }
int GirouetteInitialisee(void) {
return initialized;
}
void EXTI9_5_IRQHandler(void) { void EXTI9_5_IRQHandler(void) {
LL_TIM_SetCounter(TIM3, 0); LL_TIM_SetCounter(TIM3, 0);
initialized = 1; initialized = 1;

View file

@ -38,4 +38,6 @@ int RecupAllure(void);
*/ */
char * AllureToString(int alpha); char * AllureToString(int alpha);
int GirouetteInitialisee(void);
#endif #endif

View file

@ -99,14 +99,14 @@ int RecupNiveauBatterie(void){
* @param un entier representant le niveau de batterie en pourcentage * @param un entier representant le niveau de batterie en pourcentage
* @retval * @retval
*/ */
void CalculDangerNiveauBatterie(int niveau){ int CalculerDangerNiveauBatterie(int niveau){
if ( niveau <= Seuil) if ( niveau <= Seuil)
{ {
drapeauDangerBatterie = 1; return 1;
} }
else else
{ {
drapeauDangerBatterie = 0 ; return 1;
} }
} }
@ -117,15 +117,14 @@ void CalculDangerNiveauBatterie(int niveau){
* @param un entier representant l angle de rouli * @param un entier representant l angle de rouli
* @retval NONE * @retval NONE
*/ */
void CalculerDangerChavirement(int gamma){ int CalculerDangerChavirement(int gamma){
if ( gamma >= SeuilAngle) if ( gamma >= SeuilAngle)
{ {
drapeauDangerRouli = 1; return 1;
TendreVoile(90); //On lache les voiles si danger de chavirement
} }
else else
{ {
drapeauDangerRouli = 0 ; return 1;
} }
} }

View file

@ -7,7 +7,7 @@
* @param * @param
* @retval * @retval
*/ */
void CalculerDangerChavirement(int gamma); int CalculerDangerChavirement(int gamma);
/** /**
* @brief * @brief
@ -40,6 +40,6 @@ void ConfSecurite(void);
* @param * @param
* @retval * @retval
*/ */
void CalculDangerNiveauBatterie(int niveau); int CalculerDangerNiveauBatterie(int niveau);
#endif #endif

View file

@ -6,8 +6,38 @@
#include "stm32f1xx_ll_system.h" // utile dans la fonction SystemClock_Config #include "stm32f1xx_ll_system.h" // utile dans la fonction SystemClock_Config
#include "Allure.h" #include "Allure.h"
#include "Voile.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; i<TAILLE_MESSAGE_MAX; i++) {
transmission->message[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(){ void ConfTransmission(){
@ -22,11 +52,46 @@ void ConfTransmission(){
LL_GPIO_SetPinMode(GPIOA,LL_GPIO_PIN_11,LL_GPIO_MODE_OUTPUT); LL_GPIO_SetPinMode(GPIOA,LL_GPIO_PIN_11,LL_GPIO_MODE_OUTPUT);
LL_GPIO_SetPinOutputType(GPIOA,LL_GPIO_PIN_11,LL_GPIO_OUTPUT_PUSHPULL); LL_GPIO_SetPinOutputType(GPIOA,LL_GPIO_PIN_11,LL_GPIO_OUTPUT_PUSHPULL);
init_t_transmission(&transmission);
} }
void EnvoiRegulier(char * Allure, char * tension){ 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 tailleAllure = sizeof(Allure);
int tailleTension = 8; //ATTENTION TAILLE int tailleTension = 8; //ATTENTION TAILLE
int index = 0; int index = 0;
@ -44,11 +109,41 @@ void EnvoiRegulier(char * Allure, char * tension){
} }
} }
LL_GPIO_ResetOutputPin(GPIOA,LL_GPIO_PIN_11); LL_GPIO_ResetOutputPin(GPIOA,LL_GPIO_PIN_11);
} }*/
void EnvoiExceptionnel(char * msgAlarme){ 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 tailleMessage = sizeof(msgAlarme);
int index = 0; int index = 0;
while(index < tailleMessage){ while(index < tailleMessage){
@ -57,5 +152,19 @@ void EnvoiExceptionnel(char * msgAlarme){
index++; 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;
}
}
}
} }

View file

@ -5,6 +5,8 @@ void EnvoiRegulier(char * Allure, char * tension);
void EnvoiExceptionnel(char * msgAlarme); void EnvoiExceptionnel(char * msgAlarme);
void EnvoyerCaractere(void);
void ConfTransmission(void); void ConfTransmission(void);
#endif #endif

View file

@ -1,8 +1,5 @@
#include "Voile.h" #include "Voile.h"
#include "stm32f1xx_ll_gpio.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_tim.h"
#include "stm32f1xx_ll_bus.h" #include "stm32f1xx_ll_bus.h"
#include "maths.h" //Remplacer par maths.h quand on va tout faire marcher. #include "maths.h" //Remplacer par maths.h quand on va tout faire marcher.

View file

@ -11,30 +11,12 @@
void SystemClock_Config(void); 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 void ConfSysTick(void){
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);
SysTick_Config(7200000); SysTick_Config(7200000);
} }
void SysTick_Handler(void) { /* SysTick interrupt Handler. */ void SysTickEnableIT(void) {
static int msTicks = 0; NVIC_EnableIRQ(SysTick_IRQn);
msTicks++;
if (msTicks % 30 == 0){
drapeauTransmission = 1;
}
if (msTicks % 90 == 0) {
drapeauRecupSecurite = 1;
msTicks = 0;
}
} }
/** /**
@ -45,21 +27,16 @@ void SysTick_Handler(void) { /* SysTick interrupt
* @retval None * @retval None
*/ */
void Setup(){ void Setup(){
ConfSecurite(); ConfSecurite();
ConfAllure(); ConfAllure();
ConfVoile(); ConfVoile();
ConfGouvernail(); ConfGouvernail();
ConfTransmission(); ConfTransmission();
ConfSysTick(); 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 * @brief
* @note * @note
@ -67,33 +44,45 @@ void Setup(){
* @retval * @retval
*/ */
void Envoi3s(){ void Envoi3s(){
EnvoiRegulier(AllureToString(RecupAllure()), TensionVoileToString(RecupTensionVoile()));
} }
/** /**
* @brief tache qui va fonctionner en fond qui gere l'orientation * @brief tache qui va fonctionner en fond qui gere l'orientation
des voiles, le gouvernail et aussi le systeme anti-chavirement des voiles, le gouvernail et aussi le systeme anti-chavirement
* @note relacher les voiles <=> tendre les voiles avec un angle <EFBFBD> 90<EFBFBD> * @note Le temps d'exécution de cette tache a é mesuré à environ 3.14ms,
on peut donc largement la lancer toutes les 100ms en interruption sans risque de trop mobiliser le CPU
* @param None * @param None
* @retval None * @retval None
*/ */
void Background(){ void Task100ms(){
//Voiles //Voiles
int allure = RecupAllure(); //on recupere l'allulre via la girouette TendreVoile(CalculerTension(RecupAllure())); //on tend la voile grace à la tension obtenue a partir du calcul et de l'allure lue
int tensionVoile = CalculerTension(allure); //grace <20> l'allure on peut calculer la tension <20> appliquer sur la voile
TendreVoile(CalculerTension(RecupAllure())); //on tend la voile gr<67>ce <20> la tension obtenue
//Gouvernail //Gouvernail
int commande = LireTelecommande(); //on lit la valeur renvoy<6F>e par la t<>l<EFBFBD>commande CommanderMoteur(LireTelecommande()); //On commande le moteur pour aller à la vitesse lue a la télécommande
CommanderMoteur(commande); //On commande le moteur pour aller <20> la vitesse voulue
//Anti-Chavirement //Anti-Chavirement
/*int rouli = RecupRouli(); if(CalculerDangerChavirement(RecupRouli())){//renvoi boolean : int à 0 si faux et 1 si vrai
int danger = CalculerDanger(rouli);//renvoi boolean : int <20> 0 si faux et 1 si vrai
if(danger){
TendreVoile(90); //si il y a danger on relache les voiles (relacher les voiles = les mettre <20> 90) TendreVoile(90); //si il y a danger on relache les voiles (relacher les voiles = les mettre <20> 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(){ int main(){
@ -102,37 +91,16 @@ int main(){
Setup(); Setup();
EnvoiExceptionnel("Veuillez faire tourner la girouette SVP.");
while(!GirouetteInitialisee()) {
EnvoyerCaractere();
}
SysTickEnableIT();
while(1){ while(1){
int level ; EnvoyerCaractere();
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;
}
} }
} }

11
Src/string.c Normal file
View file

@ -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;
}
}

6
Src/string.h Normal file
View file

@ -0,0 +1,6 @@
#ifndef STRING_H
#define STRING_H
int Concatenate(char * chaine1, char * chaine2, int sizechaine1, int sizechaine2, int sizemax);
#endif