📄 communication.c.svn-base
字号:
/*
* Communication.c
*
* Created on: 19 mars 2009
* Author: Crest
*/
#include "Communication.h"
char checkSumXor(unsigned char* tampon,unsigned char ncount){
//calcule et retourne le checksum Xor
unsigned char L_checksumXor=0 ;
unsigned char L_i ;
for(L_i=0 ; L_i<ncount ; L_i++)
{
L_checksumXor =*(tampon++) ^ (L_checksumXor); //calcul le checksum Xor
}
return (L_checksumXor); // Return le cacul checksum xor CRC
}
trame decoderTrame(char * trameADecoder, trame maTrame){
char message[strlen(trameADecoder) - 2];
char donneeDT[strlen(trameADecoder)- 3];
unsigned char enTete;
char crcMes, crc;
enTete = trameADecoder[0];
printf("DECODER_TRAME : enTete : %c\n", enTete);
crcMes = trameADecoder[strlen(trameADecoder) - 2];
printf("DECODER_TRAME : crcMes : %c\n", crcMes);
strcpy(message, trameADecoder);
strcpy(donneeDT, trameADecoder);
message[strlen(trameADecoder) - 2] = '\0';
printf("DECODER_TRAME : message : %s\n", message);
donneeDT[strlen(trameADecoder) -3] = '\0';
strncpy(donneeDT, &trameADecoder[1], strlen(trameADecoder) - 3);
printf("DECODER_TRAME : donnee : %s\n", donneeDT);
crc = checkSumXor(message, strlen(message));
printf("DECODER_TRAME : crc : %c\n", crc);
if(crc != crcMes){
//demande de renvoyer la trame
maTrame.priorite = 0;
maTrame.type = TRAME_RAPPEL;
sprintf(maTrame.donnee, "%c", crc);
}
else{
lectureEntete(enTete, &maTrame);
strcpy(maTrame.donnee, donneeDT);
printf("DECODER_TRAME : maTrame.donnee : %s, donnee : %s\n", maTrame.donnee, donneeDT);
maTrame.crc = crc;
}
return maTrame;
}
void lectureEntete(unsigned char carac, trame *maTrame)
{
resDiv resultatDivision;
int priorite = 0, type = 0, i, j;
resultatDivision.quotient = (unsigned int) carac;
if(resultatDivision.quotient > 127)
priorite = 1;
for(i = 0; i<6; i++)
{
resultatDivision = divisionEuclidienne(resultatDivision.quotient, 2);
type += resultatDivision.reste*pow(2, i);
}
for(j = 0; j<2; j++)
{
resultatDivision = divisionEuclidienne(resultatDivision.quotient, 2);
priorite += resultatDivision.reste/pow(2, (6-i));
}
maTrame->priorite = priorite;
maTrame->type = type;
}
resDiv divisionEuclidienne(int dividende, int diviseur)
{
resDiv resultat;
resultat.quotient = dividende/diviseur;
resultat.reste = dividende - (resultat.quotient * diviseur);
return resultat;
}
void traitementTrame(File **listeOrdre, char *uneTrame)
{
trame maTrame;
char * messageTT;
maTrame = decoderTrame(uneTrame, maTrame);
fflush(stdout);
messageTT = (char*) malloc(sizeof(char) * 500);
if(messageTT == NULL){
exit(1);
}
printf("TRAITEMENT_TRAME : maTrame.donnee : %s\n", maTrame.donnee);
inserer(listeOrdre, maTrame);
printf("TRAITEMENT_TRAME : (*listeOrdre)->donnee.donnee : %s\n", (*listeOrdre)->donnee.donnee);
switch((*listeOrdre)->donnee.type)
{
case TRAME_RAPPEL: //ToDo : Mettre ici le code de decodage des donnees selon les fonctions a appeller
messageTT = "trame rappel\n";
break;
case TRAME_ODOMETRIE: //ToDo : Mettre ici le code de decodage des donnees selon les fonctions a appeller
messageTT = "trame odometrie\n";
break;
case TRAME_PRESENCE_DISTRIBUTEUR_PALET: //ToDo : Mettre ici le code de decodage des donnees selon les fonctions a appeller
messageTT = "trame palet\n";
break;
case TRAME_CONSIGNE_SERVOMOTEURS: //ToDo : Mettre ici le code de decodage des donnees selon les fonctions a appeller
messageTT = "trame consigne servomoteur\n";
break;
case TRAME_RETOUR_SERVOMOTEURS: //ToDo : Mettre ici le code de decodage des donnees selon les fonctions a appeller
messageTT = "trame retour servomoteur\n";
break;
case TRAME_SERVOPOD: //ToDo : Mettre ici le code de decodage des donnees selon les fonctions a appeller
messageTT = "trame servopod\n";
break;
case TRAME_POSITION: //ToDo : Mettre ici le code de decodage des donnees selon les fonctions a appeller
messageTT = "trame position\n";
break;
default :
messageTT = "trame default\n";
break;//metter en place le rappel de trame
}
printf("MESSAGE %s\n", messageTT);
afficherTrame(retirer(listeOrdre));
free(messageTT);
}
void afficherTrame(trame maTrame)
{
printf("FONCTION AFFICHER \npriorite = %d\ntype = %d\ndonnee = %s\ncrc = %c\n\n\n\n", maTrame.priorite, maTrame.type, maTrame.donnee, maTrame.crc);
}
void inserer(File **p_file, trame donnee)
{
//efface la file si il y a un ordre prioritaire et qu'elle n'est pas vide
if(donnee.priorite == 1 && p_file != NULL){
effacerFile(p_file);
}
//ajoute une trame dans la file
File *p_nouveau = malloc(sizeof( *p_nouveau));
if (p_nouveau != NULL)
{
p_nouveau->suivant = NULL;
p_nouveau->donnee = donnee;
if (*p_file == NULL)
{
*p_file = p_nouveau;
}
else
{
File *p_tmp = *p_file;
while (p_tmp->suivant != NULL)
{
p_tmp = p_tmp->suivant;
}
p_tmp->suivant = p_nouveau;
}
}
}
trame retirer(File **p_file)
{
trame ret;
/* On teste si la file n'est pas nulle */
if (*p_file != NULL)
{
/* Cr閍tion d'un 閘閙ent temporaire pointant vers le second 閘閙ent de la file */
File *p_tmp = (*p_file)->suivant;
/* Valeur
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -