Communication v2 fonctionnelle

This commit is contained in:
Samuel 2025-12-30 21:18:16 +01:00
parent 11c278e368
commit e20a8a0a7e
5 changed files with 74 additions and 47 deletions

2
.vscode/tasks.json vendored
View File

@ -17,7 +17,7 @@
"problemMatcher": [], "problemMatcher": [],
"group": { "group": {
"kind": "build", "kind": "build",
"isDefault": true "isDefault": false
} }
} }
], ],

View File

@ -50,7 +50,7 @@ void communication_reception_message(){
// Si un caractère est reçu, ajout du caractère au tampon tournant // Si un caractère est reçu, ajout du caractère au tampon tournant
/// TODO: Tester le code suivant à la place de while get_char(); /// TODO: Tester le code suivant à la place de while get_char();
/*
char nb_recu=0; char nb_recu=0;
if(tud_cdc_available()){ if(tud_cdc_available()){
char tampon_usb[128]; char tampon_usb[128];
@ -64,8 +64,9 @@ void communication_reception_message(){
} }
com_reception_buffer.tampon[com_reception_buffer.index_tampon_ecriture] = input_char; com_reception_buffer.tampon[com_reception_buffer.index_tampon_ecriture] = input_char;
} }
} }*/
/*
input_char = stdio_getchar_timeout_us(0);
while(input_char != PICO_ERROR_TIMEOUT){ while(input_char != PICO_ERROR_TIMEOUT){
com_reception_buffer.index_tampon_ecriture++; com_reception_buffer.index_tampon_ecriture++;
if(com_reception_buffer.index_tampon_ecriture >= TAMPON_TAILLE){ if(com_reception_buffer.index_tampon_ecriture >= TAMPON_TAILLE){
@ -76,7 +77,6 @@ void communication_reception_message(){
// Caractère suivant ? // Caractère suivant ?
input_char = stdio_getchar_timeout_us(0); input_char = stdio_getchar_timeout_us(0);
} }
*/
// Copie du tampon tournant dans une chaine // Copie du tampon tournant dans une chaine
// Parce que c'est plus simple à traiter // Parce que c'est plus simple à traiter
@ -100,30 +100,33 @@ void communication_reception_message(){
int fin_message = 0; int fin_message = 0;
for(int i=0; i<index_chaine_recue; i++){ for(int i=0; i<index_chaine_recue; i++){
int index_fin_message = 0; int index_fin_message = 0;
if(chaîne_octets_reçus[i] == 'r' || chaîne_octets_reçus[i] == 'w'){ // Com v2
if(i+3 < index_chaine_recue){ // OxFF OxFF <taille> ... ... <fin (0x00)>
message.taille_donnees = chaîne_octets_reçus[i+3]; if(i + 2 < index_chaine_recue){
} // Test début message
if(chaîne_octets_reçus[i] == 0xFF && chaîne_octets_reçus[i+1] == 0xFF){
index_fin_message = i+4 + message.taille_donnees; //printf("Debut message: 0xFF 0xFF\n");
if(index_fin_message < index_chaine_recue){ // Taille du message (sans l'entête)
if(chaîne_octets_reçus[index_fin_message] == 0){ uint8_t offset = chaîne_octets_reçus[i+2];
message.type = chaîne_octets_reçus[i]; if(i + 2 + offset < index_chaine_recue){
message.id_carte = chaîne_octets_reçus[i+1]; // printf("Message totalement reçu, taille %d\n", offset);
message.adresse_registre = chaîne_octets_reçus[i+2]; // Test fin message
message.taille_donnees = chaîne_octets_reçus[i+3]; if(chaîne_octets_reçus[i + 2 + offset] == 0x00){
for(int index_donnees=0; index_donnees<message.taille_donnees; index_donnees++){ // printf("Fin message OK\n");
message.donnees[index_donnees] = chaîne_octets_reçus[i + 4 + index_donnees]; // Lecture du message
message.type = 'b'; // Message binaire (par opposition à un message Texte)
message.taille_donnees = offset - 1;
for(int index_donnees = 0; index_donnees < message.taille_donnees; index_donnees++){
message.donnees[index_donnees] = chaîne_octets_reçus[index_donnees + i + 3];
}
fin_message = i + 2 + offset;
messagerie_put_message(message);
}else{
// printf("Fin message NOK, attendu 0x00, recu %x\n", chaîne_octets_reçus[i + 2 + offset]);
} }
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] == '>'){ if(chaîne_octets_reçus[i] == '>'){
message.type = chaîne_octets_reçus[i]; message.type = chaîne_octets_reçus[i];
message.taille_donnees=0; message.taille_donnees=0;

View File

@ -1,3 +1,3 @@
void communication_reception_message(); void communication_reception_message(void);
void communication_init(); void communication_init(void);

61
main.c
View File

@ -30,12 +30,20 @@ void envoie_donnees(char * donnees, uint16_t length){
void envoie_structure(const void * donnees, size_t size){ void envoie_structure(const void * donnees, size_t size){
const unsigned char *byte; const unsigned char *byte;
// Entête du message : debut
putchar(0xFF);
putchar(0xFF);
putchar(size + 1);
// Entête du message : fin
// Données
for ( byte = donnees; size--; ++byte ) for ( byte = donnees; size--; ++byte )
{ {
putchar(*byte); putchar(*byte);
//printf("%2X ", *byte); //printf("%2X ", *byte);
} }
//printf("\n"); // Caractère de fin
putchar(0x00);
printf("\n");
} }
void main(void) void main(void)
@ -48,11 +56,10 @@ void main(void)
struct message_requete_t message_requete_detection; struct message_requete_t message_requete_detection;
unsigned char message_binaire[100]; unsigned char message_binaire[100];
message_requete_detection.type = 'd'; message_requete_detection.commande = '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;
message_requete_detection.fin_de_message = 0;
message_binaire[0]='r'; message_binaire[0]='r';
@ -90,6 +97,8 @@ void main(void)
gpio_put(PICO_DEFAULT_LED_PIN, 0); gpio_put(PICO_DEFAULT_LED_PIN, 0);
temps_message_detection = get_absolute_time(); temps_message_detection = get_absolute_time();
unsigned int temps_ms;
temps_ms = get_absolute_time() / 1000.;
communication_init(); communication_init();
@ -106,31 +115,47 @@ void main(void)
start_time_us = get_absolute_time(); start_time_us = get_absolute_time();
communication_reception_message(); communication_reception_message();
if(messagerie_message_disponible()){ if(messagerie_message_disponible()){
uint8_t id_carte, registre;
while(messagerie_message_disponible()){ while(messagerie_message_disponible()){
message = messagerie_get_message(); message = messagerie_get_message();
nb_message++; nb_message++;
if(message.type == 'r'){
if(message.id_carte == 'D'){ if(message.type == 'b'){
temps_message_detection = get_absolute_time(); switch(message.donnees[0]){
if(message.donnees[0] > 0 && message.donnees[0] < 30){ case 'r': // réception de données
//printf(">LED ON\n"); // Reception de données
gpio_put(PICO_DEFAULT_LED_PIN, 1); // données[0]: commande ('r' ici)
}else{ // données[1]: id de la carte
//printf(">LED OFF\n"); // données[2]: 1er registre
gpio_put(PICO_DEFAULT_LED_PIN, 0); // données[3 à tailles_données -1]: valeurs
} id_carte = message.donnees[1];
registre = message.donnees[2];
if(id_carte == 'D'){
temps_message_detection = get_absolute_time();
if(message.donnees[4] > 0 && message.donnees[4] < 30){
//printf(">LED ON\n");
gpio_put(PICO_DEFAULT_LED_PIN, 1);
}else{
//printf(">LED OFF\n");
gpio_put(PICO_DEFAULT_LED_PIN, 0);
}
}
break;
} }
} }
} }
current_time_us = get_absolute_time();
//printf(">temps_reception:%lld\n", current_time_us - start_time_us);
//printf(">nb_message:%u\n",nb_message);
} }
current_time_us = get_absolute_time();
//printf(">temps_reception:%lld\n", current_time_us - start_time_us);
printf(">nb_message:%u\n",nb_message);
if(get_absolute_time() / 1000. - temps_ms > 100){
temps_ms = get_absolute_time() / 1000.;
printf(">nb_message:%u\n", nb_message);
}
} }
} }

View File

@ -11,11 +11,10 @@ struct message_t{
}; };
struct message_requete_t{ struct message_requete_t{
uint8_t type; uint8_t commande;
uint8_t id_carte; // Identifiant de la carte (on reprend les adresses I2C) uint8_t id_carte; // Identifiant de la carte (on reprend les adresses I2C)
uint8_t adresse_registre; // Adresse du registre lu uint8_t adresse_registre; // Adresse du registre lu
uint8_t taille_donnees; uint8_t taille_donnees;
uint8_t fin_de_message;
}; };