⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 communication.c.svn-base

📁 A simple protocol using CRC error check.
💻 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 + -