From a069a4e8d08696285d175e883a85cd71e8a7ed03 Mon Sep 17 00:00:00 2001 From: Samuel Date: Sun, 14 Sep 2025 12:06:28 +0200 Subject: [PATCH] =?UTF-8?q?Demande=20et=20reception=20du=20message=20de=20?= =?UTF-8?q?la=20balise=20de=20detection.=20La=20led=20s'allume=20en=20fonc?= =?UTF-8?q?tion=20de=20la=20distance=20mesur=C3=A9e?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- communication.c | 126 ++++++++++++++++++++++++++++++++++++++++++++++++ communication.h | 3 ++ main.c | 20 ++++---- messagerie.c | 26 ++++++++++ messagerie.h | 24 +++++++++ 5 files changed, 190 insertions(+), 9 deletions(-) create mode 100644 communication.c create mode 100644 communication.h create mode 100644 messagerie.c create mode 100644 messagerie.h diff --git a/communication.c b/communication.c new file mode 100644 index 0000000..bf05529 --- /dev/null +++ b/communication.c @@ -0,0 +1,126 @@ +#include "pico/error.h" +#include "pico/stdio.h" +#include "communication.h" +#include "messagerie.h" + +#define TAMPON_TAILLE 1020 + +struct com_reception_buffer_t{ + char tampon[TAMPON_TAILLE]; // Tampon tournant - 1er niveau de tampon + unsigned int index_tampon_ecriture, index_tampon_lecture; +}; + +struct com_reception_buffer_t com_reception_buffer; + + +void communication_init(){ + com_reception_buffer.index_tampon_ecriture=0; + com_reception_buffer.index_tampon_lecture=0; +} + +/// @brief Incrémente l'index du tampon tournant +/// @param index +/// @return +void increment_index(unsigned int *index){ + *index = 1 + *index ; + if((*index) >= TAMPON_TAILLE){ + *index = 0; + } +} + +/// @brief augmente la position l'index du tampon tournant +/// @param index +/// @return +void augmente_index(unsigned int *index, unsigned int offset){ + *index = offset + *index ; + if((*index) >= TAMPON_TAILLE){ + *index -= TAMPON_TAILLE; + } +} + +/// @brief Vérifie si des caractères ont été reçu par la liaison série +/// et analyse si un message valide a été reçu. +void communication_reception_message(){ + int input_char; + int chaîne_octets_reçus[TAMPON_TAILLE]; + unsigned int index_chaine_recue; + unsigned int index_tampon; + struct message_t message; + // Si un caractère est reçu, ajout du caractère au tampon tournant + input_char = stdio_getchar_timeout_us(0); + while(input_char != PICO_ERROR_TIMEOUT){ + com_reception_buffer.index_tampon_ecriture++; + if(com_reception_buffer.index_tampon_ecriture >= TAMPON_TAILLE){ + com_reception_buffer.index_tampon_ecriture = 0; + } + com_reception_buffer.tampon[com_reception_buffer.index_tampon_ecriture] = input_char; + + // Caractère suivant ? + input_char = stdio_getchar_timeout_us(0); + } + + // Copie du tampon tournant dans une chaine + // Parce que c'est plus simple à traiter + index_chaine_recue = 0; + index_tampon = com_reception_buffer.index_tampon_lecture; + while(index_tampon != com_reception_buffer.index_tampon_ecriture){ + chaîne_octets_reçus[index_chaine_recue] = com_reception_buffer.tampon[index_tampon]; + index_chaine_recue++; + increment_index(&index_tampon); + } + + // Traitement + // Si on trouve le début du message + // Si on trouve la taille du message + // Si le caractère de fin est bien à la fin du message + int fin_message = 0; + for(int i=0; i'){ + message.type = chaîne_octets_reçus[i]; + message.taille_donnees=0; + while(message.taille_donnees + i < index_chaine_recue){ + message.donnees[message.taille_donnees] = chaîne_octets_reçus[i+message.taille_donnees]; + if(message.donnees[message.taille_donnees] == '\n'){ + i = i + message.taille_donnees; + message.taille_donnees++; + message.donnees[message.taille_donnees] = '\0'; + messagerie_put_message (message); + fin_message = i; + break; + } + } + } + } + + // Mettre à jour l'index de lecture du tampon tournant + augmente_index(&(com_reception_buffer.index_tampon_lecture), fin_message); + +} diff --git a/communication.h b/communication.h new file mode 100644 index 0000000..76c84bd --- /dev/null +++ b/communication.h @@ -0,0 +1,3 @@ + +void communication_reception_message(); +void communication_init(); diff --git a/main.c b/main.c index 8bba1ac..bd89b7e 100644 --- a/main.c +++ b/main.c @@ -29,9 +29,10 @@ void envoie_structure(const void * donnees, size_t size){ const unsigned char *byte; for ( byte = donnees; size--; ++byte ) { - printf("%02X ", *byte); + putchar(*byte); + //printf("%2X ", *byte); } - putchar('\n'); + //printf("\n"); } void main(void) @@ -43,9 +44,8 @@ void main(void) struct message_t message; struct message_requete_t message_requete_detection; unsigned char message_binaire[100]; - unsigned char message_requete_detection[10]; - message_requete_detection.type = 'r'; + message_requete_detection.type = 'd'; message_requete_detection.id_carte = 'D'; message_requete_detection.adresse_registre = 0; message_requete_detection.taille_donnees = 19; @@ -84,17 +84,19 @@ void main(void) temps_message_detection = get_absolute_time(); + communication_init(); + while(1){ if(get_absolute_time() - temps_message_detection > MESSAGE_TIMEOUT_US){ envoie_structure(&message_requete_detection, sizeof(message_requete_detection) ); temps_message_detection = get_absolute_time(); } - + start_time_us = get_absolute_time(); - envoie_donnees(message_binaire, 10); + //envoie_donnees(message_binaire, 10); current_time_us = get_absolute_time(); - printf(">temps:%lld\n", current_time_us - start_time_us); + //printf(">temps:%lld\n", current_time_us - start_time_us); start_time_us = get_absolute_time(); communication_reception_message(); @@ -102,6 +104,7 @@ void main(void) message = messagerie_get_message(); if(message.type == 'r'){ if(message.id_carte == 'D'){ + temps_message_detection = get_absolute_time(); if(message.donnees[1] > 0 && message.donnees[1] < 30){ gpio_put(PICO_DEFAULT_LED_PIN, 1); }else{ @@ -115,8 +118,7 @@ void main(void) putchar('\n'); printf(">temps:%lld\n", current_time_us - start_time_us); sleep_ms(50); - - + } } diff --git a/messagerie.c b/messagerie.c new file mode 100644 index 0000000..df64305 --- /dev/null +++ b/messagerie.c @@ -0,0 +1,26 @@ +#include "messagerie.h" + +#define NB_MAX_MESSAGE 30 + +int index_message=0; +struct message_t message_liste[NB_MAX_MESSAGE]; + +/// @brief Renvoi 1 si des message sont disponibles +/// @return +bool messagerie_message_disponible(){ + return (index_message != 0); +} + +/// @brief Renvoi un message à traiter, à n'appeler que si message_disponible() renvoie 1 +/// @return Message +struct message_t messagerie_get_message(){ + index_message = index_message - 1; + return message_liste[index_message]; +} + +void messagerie_put_message(struct message_t message){ + if(index_message < NB_MAX_MESSAGE-1){ + message_liste[index_message] = message; + index_message = index_message + 1; + } +} \ No newline at end of file diff --git a/messagerie.h b/messagerie.h new file mode 100644 index 0000000..158898e --- /dev/null +++ b/messagerie.h @@ -0,0 +1,24 @@ +#include "pico/stdlib.h" + +#define MESSAGE_TIMEOUT_US 10000 + +struct message_t{ + uint8_t type; // 'd' pour demande, 'r' pour une réception de données, 'w' pour écrire des données, '>' pour des logs + uint8_t id_carte; // Identifiant de la carte (on reprend les adresses I2C) + uint8_t adresse_registre; // Adresse du registre lu + uint8_t taille_donnees; + uint8_t donnees[255]; +}; + +struct message_requete_t{ + uint8_t type; + uint8_t id_carte; // Identifiant de la carte (on reprend les adresses I2C) + uint8_t adresse_registre; // Adresse du registre lu + uint8_t taille_donnees; + uint8_t fin_de_message; +}; + + +bool messagerie_message_disponible(); +struct message_t messagerie_get_message(); +void messagerie_put_message(struct message_t message);