Demande et reception du message de la balise de detection. La led s'allume en fonction de la distance mesurée
This commit is contained in:
parent
0b492e91af
commit
a069a4e8d0
126
communication.c
Normal file
126
communication.c
Normal file
@ -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<index_chaine_recue; i++){
|
||||||
|
int index_fin_message = 0;
|
||||||
|
if(chaîne_octets_reçus[i] == 'r' || chaîne_octets_reçus[i] == 'w'){
|
||||||
|
if(i+3 < index_chaine_recue){
|
||||||
|
message.taille_donnees = chaîne_octets_reçus[i+3];
|
||||||
|
}
|
||||||
|
for(int z=0; z<=4 + message.taille_donnees; z++ ){
|
||||||
|
printf("%d ", chaîne_octets_reçus[i+z]);
|
||||||
|
}
|
||||||
|
printf("\n");
|
||||||
|
index_fin_message = i+4 + message.taille_donnees;
|
||||||
|
if(index_fin_message < index_chaine_recue){
|
||||||
|
if(chaîne_octets_reçus[index_fin_message] == 0){
|
||||||
|
message.type = chaîne_octets_reçus[i];
|
||||||
|
message.id_carte = chaîne_octets_reçus[i+1];
|
||||||
|
message.adresse_registre = chaîne_octets_reçus[i+2];
|
||||||
|
message.taille_donnees = chaîne_octets_reçus[i+3];
|
||||||
|
for(int index_donnees=0; index_donnees<message.taille_donnees; index_donnees++){
|
||||||
|
message.donnees[index_donnees] = chaîne_octets_reçus[i + 4 + index_donnees];
|
||||||
|
}
|
||||||
|
i = index_fin_message;
|
||||||
|
fin_message = index_fin_message;
|
||||||
|
index_fin_message = i;
|
||||||
|
messagerie_put_message(message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(chaîne_octets_reçus[i] == 'd'){
|
||||||
|
}
|
||||||
|
if(chaîne_octets_reçus[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);
|
||||||
|
|
||||||
|
}
|
||||||
3
communication.h
Normal file
3
communication.h
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
|
||||||
|
void communication_reception_message();
|
||||||
|
void communication_init();
|
||||||
20
main.c
20
main.c
@ -29,9 +29,10 @@ void envoie_structure(const void * donnees, size_t size){
|
|||||||
const unsigned char *byte;
|
const unsigned char *byte;
|
||||||
for ( byte = donnees; size--; ++byte )
|
for ( byte = donnees; size--; ++byte )
|
||||||
{
|
{
|
||||||
printf("%02X ", *byte);
|
putchar(*byte);
|
||||||
|
//printf("%2X ", *byte);
|
||||||
}
|
}
|
||||||
putchar('\n');
|
//printf("\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
void main(void)
|
void main(void)
|
||||||
@ -43,9 +44,8 @@ void main(void)
|
|||||||
struct message_t message;
|
struct message_t message;
|
||||||
struct message_requete_t message_requete_detection;
|
struct message_requete_t message_requete_detection;
|
||||||
unsigned char message_binaire[100];
|
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.id_carte = 'D';
|
||||||
message_requete_detection.adresse_registre = 0;
|
message_requete_detection.adresse_registre = 0;
|
||||||
message_requete_detection.taille_donnees = 19;
|
message_requete_detection.taille_donnees = 19;
|
||||||
@ -84,17 +84,19 @@ void main(void)
|
|||||||
|
|
||||||
temps_message_detection = get_absolute_time();
|
temps_message_detection = get_absolute_time();
|
||||||
|
|
||||||
|
communication_init();
|
||||||
|
|
||||||
while(1){
|
while(1){
|
||||||
|
|
||||||
if(get_absolute_time() - temps_message_detection > MESSAGE_TIMEOUT_US){
|
if(get_absolute_time() - temps_message_detection > MESSAGE_TIMEOUT_US){
|
||||||
envoie_structure(&message_requete_detection, sizeof(message_requete_detection) );
|
envoie_structure(&message_requete_detection, sizeof(message_requete_detection) );
|
||||||
temps_message_detection = get_absolute_time();
|
temps_message_detection = get_absolute_time();
|
||||||
}
|
}
|
||||||
|
|
||||||
start_time_us = 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();
|
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();
|
start_time_us = get_absolute_time();
|
||||||
communication_reception_message();
|
communication_reception_message();
|
||||||
@ -102,6 +104,7 @@ void main(void)
|
|||||||
message = messagerie_get_message();
|
message = messagerie_get_message();
|
||||||
if(message.type == 'r'){
|
if(message.type == 'r'){
|
||||||
if(message.id_carte == 'D'){
|
if(message.id_carte == 'D'){
|
||||||
|
temps_message_detection = get_absolute_time();
|
||||||
if(message.donnees[1] > 0 && message.donnees[1] < 30){
|
if(message.donnees[1] > 0 && message.donnees[1] < 30){
|
||||||
gpio_put(PICO_DEFAULT_LED_PIN, 1);
|
gpio_put(PICO_DEFAULT_LED_PIN, 1);
|
||||||
}else{
|
}else{
|
||||||
@ -115,8 +118,7 @@ void main(void)
|
|||||||
putchar('\n');
|
putchar('\n');
|
||||||
printf(">temps:%lld\n", current_time_us - start_time_us);
|
printf(">temps:%lld\n", current_time_us - start_time_us);
|
||||||
sleep_ms(50);
|
sleep_ms(50);
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
26
messagerie.c
Normal file
26
messagerie.c
Normal file
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
24
messagerie.h
Normal file
24
messagerie.h
Normal file
@ -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);
|
||||||
Loading…
Reference in New Issue
Block a user