111 lines
3.3 KiB
C
111 lines
3.3 KiB
C
#include <string.h>
|
|
#include <stdio.h>
|
|
#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'){
|
|
if(message.type == 'd' || message.type == 'w' ){
|
|
sprintf(chaine_texte, "%c: registre: %d, id_carte: %d, taille: %d", message.type, message.id_carte, message.taille_donnees);
|
|
}else if(message.type == 'r'){
|
|
sprintf(chaine_texte, "%c: registre: %d, taille: %d", message.type, message.adresse_registre, message.taille_donnees);
|
|
}else{
|
|
return 1;
|
|
}
|
|
|
|
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.adresse_registre;
|
|
message_binaire[2] = message.taille_donnees;
|
|
for(int i=0; i < message.taille_donnees; i++){
|
|
message_binaire[3+i] = message.donnees[i];
|
|
}
|
|
message_binaire[3+message.taille_donnees] = 0;
|
|
|
|
return (3 + message.taille_donnees);
|
|
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;
|
|
}
|
|
|
|
}
|
|
|