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>
<LineNumber>48</LineNumber>
<EnabledFlag>1</EnabledFlag>
<Address>134218244</Address>
<Address>134219720</Address>
<ByteObject>0</ByteObject>
<HtxType>0</HtxType>
<ManyObjects>0</ManyObjects>
@ -550,6 +550,18 @@
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</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>
@ -560,7 +572,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>9</FileNumber>
<FileNumber>10</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -572,7 +584,7 @@
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>10</FileNumber>
<FileNumber>11</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -584,7 +596,7 @@
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>11</FileNumber>
<FileNumber>12</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -596,7 +608,7 @@
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>12</FileNumber>
<FileNumber>13</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -608,7 +620,7 @@
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>13</FileNumber>
<FileNumber>14</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -636,7 +648,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>5</GroupNumber>
<FileNumber>14</FileNumber>
<FileNumber>15</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@ -656,7 +668,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>6</GroupNumber>
<FileNumber>15</FileNumber>
<FileNumber>16</FileNumber>
<FileType>2</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -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; 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(){
@ -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){
@ -57,5 +152,19 @@ void EnvoiExceptionnel(char * msgAlarme){
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 EnvoyerCaractere(void);
void ConfTransmission(void);
#endif

View file

@ -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.

View file

@ -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 <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
* @retval None
*/
void Background(){
void Task100ms(){
//Voiles
int allure = RecupAllure(); //on recupere l'allulre via la girouette
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
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<6F>e par la t<>l<EFBFBD>commande
CommanderMoteur(commande); //On commande le moteur pour aller <20> 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 <20> 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 <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(){
@ -102,37 +91,16 @@ int main(){
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();
}
}

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