#include #include #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 message_disponible(){ return (index_message != 0); } /// @brief Renvoi un message à traiter, à n'appeler que si message_disponible() renvoie 1 /// @return Message struct message_t get_message(){ index_message = index_message - 1; return message_liste[index_message]; } void put_message(struct message_t message){ if(index_message < NB_MAX_MESSAGE-1){ message_liste[index_message] = message; index_message = index_message + 1; } } /// @brief Remplit chaine_texte avec les données du message présentées en ascii /// @param message structure de transfert entre les cartes /// @param chaine_texte doit être allouée, prévoir 64 octets. Attention ce ne sera pas suffisant dans tous les cas /// @return 0 si tout s'est bien passé, 1 sinon char message_to_string(struct message_t message, char * chaine_texte){ if(message.type == 'r' || message.type == 'w' || message.type == 'd'){ sprintf(chaine_texte, "%c: id_carte: %d, registre: %d, taille: %d", message.type, message.id_carte, message.adresse_registre, message.taille_donnees); if(message.type == 'r' || message.type == 'w' ){ char value[5]; strcat(chaine_texte, ", données: "); for(int i=0; i< message.taille_donnees; i++){ sprintf(value, "%d ", message.donnees[i]); strcat(chaine_texte, value); } } strcat(chaine_texte, "\n"); return 0; } if(message.type == '>'){ chaine_texte[0] = '>'; chaine_texte[1] = '\0'; strcat(chaine_texte, message.donnees); strcat(chaine_texte, "\n"); return 0; } return 1; } /// @brief remplit la mémoire message_binaire pour les données du message en usb /// @param message /// @param message_binaire /// @return nombre d'octet à envoyer uint16_t message_prepare_for_usb(struct message_t message, uint8_t * message_binaire){ switch (message.type) { case 'r': message_binaire[0] = message.type; message_binaire[1] = message.id_carte; message_binaire[2] = message.adresse_registre; message_binaire[3] = message.taille_donnees; for(int i=0; i < message.taille_donnees; i++){ message_binaire[4+i] = message.donnees[i]; } message_binaire[4+message.taille_donnees] = 0; return (4 + message.taille_donnees + 1); break; case 'd': message_binaire[0] = message.type; message_binaire[1] = message.id_carte; message_binaire[2] = message.adresse_registre; message_binaire[3] = message.taille_donnees; message_binaire[4] = 0; return 5; case 'w': message_binaire[0] = message.type; message_binaire[1] = message.id_carte; message_binaire[2] = message.adresse_registre; message_binaire[3] = message.taille_donnees; for(int i=0; i < message.taille_donnees; i++){ message_binaire[4+i] = message.donnees[i]; } message_binaire[4+message.taille_donnees] = 0; return (4 + message.taille_donnees); default: break; } }