RP20240_Device_USB/communication.c

129 lines
4.7 KiB
C

#include "pico/error.h"
#include <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;
if(index_tampon != com_reception_buffer.index_tampon_ecriture){
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);
}
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];
}
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);
}