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