1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188
| void Mouvement(char *chaine_entrante){
printf("Entrer dans mouvement\n");
/***************************initialisation des variables******************************************************/
int ret_rs_open = 0;
unsigned char buffer_methode[5];
unsigned char buffer[46];
char *pointeur;
int time_mvt =0, num_axe = 0;
int compteur_axe = 0;
int i = 0, j = 0;
int vit_X = 0, vit_Y = 0, vit_Z = 0,vit_Z_retour = 0;
char quel_axe;
char methode = ' ';
struct sigaction act;
act.sa_handler = arret;
signal(SIGINT,arret); /*Interception des signaux ctrl^c et ctrl^z*/
signal(SIGTSTP,arret);
ret_rs_open = RS_open("USB1",9600,8,1,'N',1);
printf("Test avant if");
if( ( ret_rs_open)!= -1){ /*On test si la liaison à été effectuée, si 'ret_rs_open' est égale à -1 cela veut dire que la liaison n'a pas fonctionner */
/* On utilise la méthode strtok pour isoler les coordonnées et la méthode */
/*Premier appel du strtok*/
pointeur = strtok( chaine_entrante, " " );
if(strcmp(pointeur,"@0A") == 0){
buffer[i] = 0x40;
i++;
buffer[i] = 0x30; //Deplacement relatif
i++;
buffer[i] = 0x41;
i++;
buffer[i] = 0x20;
i++;
methode = 'R';
}
else if(strcmp(pointeur,"@0M") == 0){
buffer[i] = 0x40;
i++;
buffer[i] = 0x30; //Deplacement absolue
i++;
buffer[i] = 0x4D;
i++;
buffer[i] = 0x20;
i++;
methode = 'A';
}
else{
printf("Erreur de méthode de déplacement \n");
close(ret_rs_open);
exit(-1);
}
while( pointeur != NULL ){
pointeur = strtok( NULL, ","); /* puis on cherche les autres séparateur */
printf("Pointeur : %s \n",pointeur);
compteur_axe++;
/*Test de dépassement de l'espace de travail */
switch(compteur_axe){
case '1' : quel_axe = 'X';
X = *pointeur;
case '2' : quel_axe = 'X';
vit_X = *pointeur;
case '3' : quel_axe = 'Y';
Y = *pointeur;
case '4' : quel_axe = 'Y';
vit_Y = *pointeur;
case '5' : quel_axe = 'Z';
Z = *pointeur;
case '6' : quel_axe = 'Z';
vit_Z = *pointeur;
case '7' : quel_axe = 'Z';
Z_retour = *pointeur;
case '8' : quel_axe = 'Z';
vit_Z_retour = *pointeur;
default : printf("Default compteur axe");
}
if(methode == 'A'){ /*Test si la methode est absolue*/
if( ( (*pointeur > 25000) && (compteur_axe == 1 || 2 ) ) || ( (*pointeur > 40000) && (compteur_axe == 3 || 4) ) || ( (*pointeur > 10000) && ( compteur_axe == 5) ) || ( (*pointeur< -10000) && (compteur_axe == 6 ) ) ){
printf("Erreur :: espace de travail de l'axe %c dépasser",quel_axe);
close(ret_rs_open);
exit(-1);
}
}
else if(methode == 'R'){ /*Ou relatif*/
if( ( ((*pointeur + X) > 25000) && (compteur_axe == 1 || 2 ) ) || ( (*pointeur > 40000) && (compteur_axe == 3 || 4) ) || ( (*pointeur > 10000) && ( compteur_axe == 5) ) || ( (*pointeur< -10000) && (compteur_axe == 6 ) ) ){
printf("Erreur :: espace de travail de l'axe %c dépasser",quel_axe);
close(ret_rs_open);
exit(-1);
}
}
/*On lit les caractère scinder par strtok dans pointeur et on les entres dans le buffer pour l'envoie*/
for(j = 0; j > sizeof(&pointeur ); j++){
if( *pointeur+j == '0')buffer[i] = 0x30;
else if(*pointeur+j == '1')buffer[i] = 0x31;
else if(*pointeur+j == '2')buffer[i] = 0x32;
else if(*pointeur+j == '3')buffer[i] = 0x33;
else if(*pointeur+j == '4')buffer[i] = 0x34;
else if(*pointeur+j == '5')buffer[i] = 0x35;
else if(*pointeur+j == '6')buffer[i] = 0x36;
else if(*pointeur+j == '7')buffer[i] = 0x37;
else if(*pointeur+j == '8')buffer[i] = 0x38;
else if(*pointeur+j == '9')buffer[i] = 0x39;
else if(*pointeur+j == '-')buffer[i] = 0x2D;
else{
printf("Erreur Caractère non connue");
close(ret_rs_open);
exit(-1);
}
i++;
}
buffer[i] = 0x2C;
i++;
}
/********************************************on entre la configuration des axes**************************************************/
/****On l'entre en dernier car pour connaitre le nombre d'axe il faut avoir finit le comptage d'axe grace a la methode strtok****/
buffer_methode[0] = 0x40;
buffer_methode[1] = 0x30;
switch(num_axe){ /* Test de num_axe, l'entier caluler grâce au strtok qui definie le nom_axe */
case '1' : buffer_methode[2] = 0x31;
case '3' : buffer_methode[2] = 0x33;
case '7' :
default : buffer_methode[2] = 0x37;
}
buffer_methode[3] = 0x0D;
RS_write(buffer_methode,4,ret_rs_open); /* On envoie sur la liaison le contenu du buffer*/
RS_write(buffer,i,ret_rs_open);
/************************Calcul du temps de déplacement pour faire le mouvement******************************/
if( (num_axe == '1') || (num_axe == '3') ){
time_mvt = 0;
time_mvt = (X/vit_X) + (Y/vit_Y);
}
if( (num_axe == '7') ){
if( X > Y ) /*Si la distance X est plus grande que Y */
{
time_mvt = 0;
time_mvt = X/vit_X; /*on calcule en seconde le temps que mais le charlyrobot pour aller en pos X a la vitesse vit_X*/
}
else /*Si la distance Y est plus grande que X */
{
time_mvt = 0;
time_mvt = Y/vit_Y;
}
}
}
else
{
printf("Erreur d'ouverture liaison \n");
exit(-1);
}
sleep(time_mvt);
printf("Fermeture de la liaison \n");
close(ret_rs_open);
} |
Partager