#include #include "pico/platform/panic.h" #include "pico/stdlib.h" #include "messagerie.h" #include "com_usb.h" #include #define TAMPON_TAILLE 1020 struct log_buffer_t log_buffer[NB_MAX_CDC_CONNEXION]; /// @brief Affecte l'id de la carte à une connexion CDC. /// @param idx /// @param carte_id void set_carte_id(uint8_t idx, uint8_t carte_id){ struct log_buffer_t * p_log_bufffer; p_log_bufffer = get_buffer(idx); p_log_bufffer->carte_id = carte_id; } /// @brief Obtient la connexion CDC à partir de l'id de la carte. /// @param id_carte /// @return idx pour établir la connexion CDC, INVALID_ID si non trouvé. uint8_t get_carte_idx(uint8_t id_carte){ for(int i=0; iidx = INVALID_ID; printf("Destruction: idx: %d\n", idx); } /// @brief Ajoute les données reçu au tampon tournant /// @param idx Numéro de la liaison CDC /// @param buffer Pointeur vers les données /// @param buffer_size Taille des données void log_add(const char idx, const char * buffer, uint16_t buffer_size){ struct log_buffer_t * log_buffer; log_buffer = get_buffer(idx); for(int i=0; iindex_tampon_ecriture = log_buffer->index_tampon_ecriture+1; if(log_buffer->index_tampon_ecriture >= TAMPON_TAILLE){ log_buffer->index_tampon_ecriture = 0; } log_buffer->tampon[log_buffer->index_tampon_ecriture] = buffer[i]; } } /// @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; } } void log_analyse(const char idx){ //printf("log_analyse %d\n", idx); static absolute_time_t current_time_us, start_time_us=0; current_time_us = get_absolute_time(); //printf(">a:%lld\n", current_time_us-start_time_us); start_time_us = current_time_us; // Les données sont dans le tampon tournant // Nous les copions dans une seconde mémoire pour les analyser. // Si un message est trouvé : // - Celui-ci est ajouté à la liste des message à traiter // - Nous avançons l'index de lecture du tampon cyclique // Si nous arrivons à la fin du tampon cyclique, il n'y a plus rien à récupérer. enum etat_message_t{ ETAT_MESSAGE_DEBUT, ETAT_MESSAGE_TEXTE, ETAT_MESSAGE_VALIDE }etat_message; struct log_buffer_t * p_log_bufffer; char chaine[TAMPON_TAILLE]; char affiche_message[TAMPON_TAILLE]; struct message_t message; unsigned int index, index_chaine; p_log_bufffer = get_buffer(idx); index = p_log_bufffer->index_tampon_lecture; index_chaine = 0; // Copie des données if(index != p_log_bufffer->index_tampon_ecriture){ while(index != p_log_bufffer->index_tampon_ecriture){ chaine[index_chaine] = p_log_bufffer->tampon[index]; index_chaine++; increment_index(&index); } chaine[index_chaine] = p_log_bufffer->tampon[index]; index_chaine++; increment_index(&index); } // Lecture du message message.type = 0; message.idx = idx; unsigned int fin_message = 0; for(int i=0; i< index_chaine; i++){ unsigned int index_fin_message; switch(etat_message){ case ETAT_MESSAGE_DEBUT: if(chaine[i] == '>'){ message.type = '>'; message.taille_donnees = 0; etat_message = ETAT_MESSAGE_TEXTE; } if(chaine[i] == 'd'){ // Est-ce que nous avons reçu le message en entier ? if(i + 4 < index_chaine){ if(chaine[i+4] == 0){ // Message valide message.type = 'd'; message.id_carte = chaine[i+1]; message.adresse_registre = chaine[i+2]; message.taille_donnees = chaine[i+3]; i = i + 4; // On se met à la fin du message fin_message = i; put_message(message); } } } if(chaine[i] == 'r'){ // Est-ce que nous avons reçu l'entête du message ? if(i + 4 < index_chaine){ message.type = 'r'; message.id_carte = chaine[i+1]; message.adresse_registre = chaine[i+2]; message.taille_donnees = chaine[i+3]; index_fin_message = i + message.taille_donnees + 4; if(index_fin_message < index_chaine){ if(chaine[index_fin_message] == 0){ // Message valide for(int index_donnees=0; index_donneesindex_tampon_lecture), fin_message); //printf("Fin log_analyse %d\n", idx); }