Programme carte strategie (disco)

Dependencies:   mbed SerialHalfDuplex SDFileSystem DISCO-F469NI_portrait liaison_Bluetooth ident_crac

Revision:
34:6aa4b46b102e
Parent:
33:388aa0bf6af4
Child:
35:742dc6b200b0
diff -r 388aa0bf6af4 -r 6aa4b46b102e Strategie/Strategie.cpp
--- a/Strategie/Strategie.cpp	Wed Apr 25 12:42:50 2018 +0000
+++ b/Strategie/Strategie.cpp	Thu Apr 26 20:14:18 2018 +0000
@@ -6,9 +6,9 @@
 
 
 #define M_PI 3.14159265358979323846
-#define BLEU 0xFF1467E5
+#define VERT 0xFF1467E5
 #define ROUGE 0xFFFF0000
-#define VERT 0xFF00FF00
+#define BLEU 0xFF00FF00
 #define JAUNE 0xFFFEFE00
 #define BLANC 0xFF000000
 #define ORANGE 0xFFFFA500
@@ -42,7 +42,8 @@
     "End_loop",
 };
 
-
+int waitingAckID_FIN;
+int waitingAckFrom_FIN;
 
 Ticker ticker;
 TS_DISCO_F469NI ts;
@@ -78,7 +79,7 @@
 signed short start_move_x,start_move_y,start_move_theta;//La position du robot lors du début d'un mouvement, utilisé pour reprendre le mouvement apres stop balise
 //unsigned char FIFO_ecriture=0; //Position du fifo pour la reception CAN
 int flagSendCan=1;
-unsigned char Cote = 0; //0 -> bleu | 1 -> jaune
+unsigned char Cote = 0; //0 -> VERT | 1 -> jaune
 
 unsigned char checkCurrent = 0;
 unsigned char countAliveCard = 0; 
@@ -106,8 +107,8 @@
 
 
 /////////////////DEFINITION DES BOUTONS////////////////////
-    Button COTE_BLEU(0, 25, 400, 300, "Bleu");
-    Button COTE_JAUNE(0, 350, 400, 300, "Jaune");
+    Button COTE_VERT(0, 25, 400, 300, "VERT");
+    Button COTE_ORANGE(0, 350, 400, 300, "ORANGE");
     Button RETOUR  (0, 680, 400, 110, "--Precedent--");
     Button LANCER  (0, 200, 400, 200, "--LANCER--");
     Button CHECK (0, 420, 400, 200, "Valider");
@@ -137,8 +138,8 @@
     Button SUIVANT(0,380,200,100,"Suivant");
     Button COLOR_ORANGE (0, 230, 190, 110,"");
     Button COLOR_JAUNE (210, 230, 190, 110,"");
-    Button COLOR_BLEU (0, 350, 190, 110,"");
-    Button COLOR_VERT (210, 350, 190, 110,"");
+    Button COLOR_VERT (0, 350, 190, 110,"");
+    Button COLOR_BLEU (210, 350, 190, 110,"");
     Button COLOR_NOIR (105, 470, 190, 110,"");
     ////////////////////////////////////////////////////////////
 
@@ -153,9 +154,10 @@
 void effacer_segment(long couleur);
 
 unsigned short telemetreDistance=0;
-unsigned short telemetreDistance1=0;
-unsigned short telemetreDistance2=0;
-unsigned short telemetreDistance3=0;
+unsigned short telemetreDistance_avant_gauche=0;
+unsigned short telemetreDistance_avant_droite=0;
+unsigned short telemetreDistance_arriere_gauche=0;
+unsigned short telemetreDistance_arriere_droite=0;
 
 #ifdef ROBOT_BIG
 
@@ -292,7 +294,7 @@
     }
     strcpy(tableau_aff[9],tableau_etat[conv]);
     for(i=0;i<10;i++){
-        lcd.SetBackColor(BLEU);
+        lcd.SetBackColor(VERT);
         lcd.DisplayStringAt(0, LINE(20+i), (uint8_t *)tableau_aff[i], LEFT_MODE);
     }  
     /*while(!ack_bluetooth){
@@ -397,12 +399,12 @@
         case DEMO :                                  
             lcd.Clear(LCD_COLOR_WHITE);
             RETOUR.Draw(0xFFFF0000, 0);
-            TEST_HERKULEX.Draw(BLEU, 0);
-            TEST_LASER.Draw(BLEU, 0);
-            TEST_COULEURS.Draw(BLEU, 0);
-            TEST_TIR_BALLE.Draw(BLEU, 0);
-            TEST_IMMEUBLE.Draw(BLEU,0);
-            TEST_TRIEUR.Draw(BLEU,0);
+            TEST_HERKULEX.Draw(VERT, 0);
+            TEST_LASER.Draw(VERT, 0);
+            TEST_COULEURS.Draw(VERT, 0);
+            TEST_TIR_BALLE.Draw(VERT, 0);
+            TEST_IMMEUBLE.Draw(VERT,0);
+            TEST_TRIEUR.Draw(VERT,0);
             if(gameEtat == ETAT_CONFIG) {//C'est bon on a le droit de modifier les config                                     //
                 InversStrat = 0;//Pas d'inversion de la couleur                                 // A changer , discussion avec l'ihm
             }
@@ -553,8 +555,8 @@
                         COLOR_NOIR.Draw(NOIR,1);
                         COLOR_ORANGE.Draw(ORANGE,0);
                         COLOR_JAUNE.Draw(JAUNE,0);
-                        COLOR_BLEU.Draw(BLEU,0);
                         COLOR_VERT.Draw(VERT,0);
+                        COLOR_BLEU.Draw(VERT,0);
                         
                         lcd.SetBackColor(LCD_COLOR_WHITE);
                         lcd.SetTextColor(NOIR);
@@ -809,15 +811,15 @@
             lcd.SetTextColor(LCD_COLOR_BLACK);
              
             lcd.DisplayStringAt(70, LINE(0), (uint8_t *)"Choisir le cote", LEFT_MODE);
-            COTE_BLEU.Draw(BLEU, 0);
-            COTE_JAUNE.Draw(JAUNE, 0);
+            COTE_VERT.Draw(VERT, 0);
+            COTE_ORANGE.Draw(ORANGE, 0);
             RETOUR.Draw(LCD_COLOR_RED, 0);
             
                 
             while (etat == SELECT_SIDE) 
             {
                 canProcessRx();
-                if(COTE_BLEU.Touched()) 
+                if(COTE_VERT.Touched()) 
                 {
                     liaison_Tx.envoyer(0x30,3,"123");
                     Cote = 0x0;
@@ -830,11 +832,11 @@
                     trame_Tx.id=CHOICE_COLOR;
                     trame_Tx.data[0]=Cote;
                     can2.write(trame_Tx);
-                    while(COTE_BLEU.Touched());
+                    while(COTE_VERT.Touched());
                     
                 }
                 
-                if(COTE_JAUNE.Touched())
+                if(COTE_ORANGE.Touched())
                 {
                     Cote = 0x1;
                     InversStrat= Cote;
@@ -846,7 +848,7 @@
                     trame_Tx.id=CHOICE_COLOR;
                     trame_Tx.data[0]=Cote;
                     can2.write(trame_Tx);
-                    while(COTE_JAUNE.Touched());
+                    while(COTE_ORANGE.Touched());
                 }
                 
                 if(RETOUR.Touched())
@@ -860,16 +862,16 @@
                 
         case TACTIQUE :
             if (Cote == 0){
-                lcd.Clear(BLEU);
-                lcd.SetBackColor(BLEU);
+                lcd.Clear(VERT);
+                lcd.SetBackColor(VERT);
                 }
             else if (Cote == 1){
                 lcd.Clear(JAUNE);
                 lcd.SetBackColor(JAUNE);
                 }
             else {
-                lcd.Clear(BLEU);
-                lcd.SetBackColor(BLEU);
+                lcd.Clear(VERT);
+                lcd.SetBackColor(VERT);
                 }
             
             lcd.SetTextColor(LCD_COLOR_BLACK); 
@@ -927,16 +929,16 @@
             lcd.SetTextColor(LCD_COLOR_BLACK);
              
             if (Cote == 0){
-                lcd.Clear(BLEU);
-                lcd.SetBackColor(BLEU);
+                lcd.Clear(VERT);
+                lcd.SetBackColor(VERT);
                 }
             else if (Cote == 1){
                 lcd.Clear(JAUNE);
                 lcd.SetBackColor(JAUNE);
                 }
             else {
-                lcd.Clear(BLEU);
-                lcd.SetBackColor(BLEU);
+                lcd.Clear(VERT);
+                lcd.SetBackColor(VERT);
             }
             canProcessRx();
             lcd.DisplayStringAt(0, LINE(0), (uint8_t *)"En attente du Jack", CENTER_MODE); 
@@ -951,14 +953,24 @@
             lcd.SetTextColor(LCD_COLOR_BLACK);
             cpt=int(cptf);
             if(cpt != cpt1){
-                lcd.Clear(BLEU);
-                affichage_compteur(90-cpt);
+                lcd.Clear(VERT);
+                affichage_compteur(100-cpt);
             }
             cpt1=cpt;
             flag_timer=0;
 
-            affichage_debug(gameEtat);
+            //affichage_debug(gameEtat);
+            lcd.SetBackColor(LCD_COLOR_WHITE);
+            char position_x[10]="toto";
+            char position_y[10]="toto";
+            char position_theta[10]="toto";
+            sprintf(position_x,"%d ",x_robot);
+            sprintf(position_y,"%d",y_robot);
+            sprintf(position_theta,"%d ",theta_robot);
             
+            lcd.DisplayStringAt(120, LINE(18), (uint8_t *)position_x, LEFT_MODE);
+            lcd.DisplayStringAt(120, LINE(20), (uint8_t *)position_y, LEFT_MODE);
+            lcd.DisplayStringAt(120, LINE(22), (uint8_t *)position_theta, LEFT_MODE);
             
             break;
             
@@ -990,7 +1002,7 @@
     //signed short localData4 = 0;
     unsigned char localData5 = 0;
     
-    if(gameTimer.read_ms() >= 89000) {//Fin du match (On autorise 2s pour déposer des éléments
+    if(gameTimer.read_ms() >= 99000) {//Fin du match (On autorise 2s pour déposer des éléments
         gameTimer.stop();
         gameTimer.reset();
         gameEtat = ETAT_END;//Fin du temps
@@ -1135,12 +1147,12 @@
             gameEtat = ETAT_GAME_LOAD_NEXT_INSTRUCTION;
             
             if (ModeDemo == 0){
-                chronoEnd.attach(&chronometre_ISR,90);//On lance le chrono de 90s
+                chronoEnd.attach(&chronometre_ISR,100);//On lance le chrono de 90s
                 gameTimer.start();
             } 
             gameTimer.reset();
             jack.fall(NULL);//On désactive l'interruption du jack
-            SendRawId(GLOBAL_START);  
+            //SendRawId(GLOBAL_START);  
             Jack=0;                                          //à envoyer sur le CAN et en direct pour l'automate de l'ihm ou sur CANV
             //tactile_printf("Start");//Pas vraiment utile mais bon
         break;
@@ -1271,9 +1283,10 @@
                         }
                     }
                     #endif  
-                    Rotate(localData2);
                     waitingAckID = ASSERVISSEMENT_ROTATION;
                     waitingAckFrom = ACKNOWLEDGE_MOTEUR;
+                    Rotate(localData2);
+                    
                       
                 break;
                 case MV_XYT:
@@ -1310,25 +1323,242 @@
                     
                 break;
                 case MV_RECALAGE:
-                    waitingAckID = ASSERVISSEMENT_RECALAGE;
-                    waitingAckFrom = ACKNOWLEDGE_MOTEUR;
-                    instruction.nextActionType = WAIT;
-                    localData2 = (((instruction.direction == FORWARD)?1:-1)*3000);//On indique une distance de 3000 pour etre sur que le robot va ce recaler
-                    
-                    if(instruction.precision == RECALAGE_Y) {
-                        localData5 = 2;
-                        if(InversStrat == 1 && ingnorInversionOnce == 0) {
-                            localData3 = 3000 - instruction.arg1;//Inversion du Y
+                    if(instruction.nextActionType == MECANIQUE)
+                    {
+                        instruction.nextActionType = WAIT;
+                        
+                        waitingAckID = ASSERVISSEMENT_RECALAGE;
+                        waitingAckFrom = ACKNOWLEDGE_MOTEUR;
+                        
+                        localData2 = (((instruction.direction == FORWARD)?1:-1)*3000);//On indique une distance de 3000 pour etre sur que le robot va ce recaler
+                        
+                        if(instruction.precision == RECALAGE_Y) {
+                            localData5 = 2;
+                            if(InversStrat == 1 && ingnorInversionOnce == 0) {
+                                localData3 = 3000 - instruction.arg1;//Inversion du Y
+                            } else {
+                                localData3 = instruction.arg1;
+                            }
                         } else {
+                            localData5 = 1;
                             localData3 = instruction.arg1;
                         }
-                    } else {
-                        localData5 = 1;
-                        localData3 = instruction.arg1;
+                        GoStraight(localData2, localData5, localData3, 0);
                     }
-                    
-                    GoStraight(localData2, localData5, localData3, 0);
+                    else //CAPTEUR
+                    {
+                        unsigned char nombresDeMesuresAuxTelemtresQuiSontCoherentes         = 0;
+                        unsigned int  moyennageTelemetre                                    = 0;
+                        unsigned short angleAvant = 0;
+                        unsigned short angleArriere = 0;
+                        unsigned short orientationArrondie = 0;
+                        
+                        unsigned short position_avant_gauche=0;
+                        unsigned short position_avant_droite=0;
+                        unsigned short position_arriere_gauche=0;
+                        unsigned short position_arriere_droite=0;
+                        
+                        unsigned short angleRecalage = 0;
+                        unsigned short distanceRecalage = 0;
+                        
+                        SendRawId(DATA_RECALAGE);
+                        waitingAckID = RECEPTION_RECALAGE;
+                        waitingAckFrom = ACKNOWLEDGE_TELEMETRE;
+                        
+                        // On attend que les variables soient actualisé
+                        while(!(waitingAckID == 0 && waitingAckFrom == 0))
+                            canProcessRx();
+                        
+                        if(instruction.precision == RECALAGE_Y)    // ((theta_robot < 1800 && theta_robot > 0) || (theta_robot < -1800 && theta_robot > -3600))  (theta_robot < 900 && theta_robot > -900)  
+                        {
+                            telemetreDistance_avant_gauche   = (((theta_robot < 1800 && theta_robot > 0) || (theta_robot < -1800 && theta_robot > -3600))?3000:0) + (((theta_robot < 1800 && theta_robot > 0) || (theta_robot < -1800 && theta_robot > -3600))?-1:1)*telemetreDistance_avant_gauche;
+                            telemetreDistance_avant_droite   = (((theta_robot < 1800 && theta_robot > 0) || (theta_robot < -1800 && theta_robot > -3600))?3000:0) + (((theta_robot < 1800 && theta_robot > 0) || (theta_robot < -1800 && theta_robot > -3600))?-1:1)*telemetreDistance_avant_droite;
+                            telemetreDistance_arriere_gauche = (((theta_robot < 1800 && theta_robot > 0) || (theta_robot < -1800 && theta_robot > -3600))?3000:0) + (((theta_robot < 1800 && theta_robot > 0) || (theta_robot < -1800 && theta_robot > -3600))?-1:1)*telemetreDistance_arriere_gauche;
+                            telemetreDistance_arriere_droite = (((theta_robot < 1800 && theta_robot > 0) || (theta_robot < -1800 && theta_robot > -3600))?3000:0) + (((theta_robot < 1800 && theta_robot > 0) || (theta_robot < -1800 && theta_robot > -3600))?-1:1)*telemetreDistance_arriere_droite;
+                            
+                            if(telemetreDistance_avant_gauche >= y_robot-instruction.arg1 && telemetreDistance_avant_gauche <= y_robot+instruction.arg1)
+                            {
+                                nombresDeMesuresAuxTelemtresQuiSontCoherentes++;
+                                moyennageTelemetre += telemetreDistance_avant_gauche;
+                            }
+                            if(telemetreDistance_avant_droite >= y_robot-instruction.arg1 && telemetreDistance_avant_droite <= y_robot+instruction.arg1)
+                            {
+                                nombresDeMesuresAuxTelemtresQuiSontCoherentes++;
+                                moyennageTelemetre += telemetreDistance_avant_droite;
+                            }
+                            if(telemetreDistance_arriere_gauche >= y_robot-instruction.arg1 && telemetreDistance_arriere_gauche <= y_robot+instruction.arg1)
+                            {
+                                nombresDeMesuresAuxTelemtresQuiSontCoherentes++;
+                                moyennageTelemetre += telemetreDistance_arriere_gauche;
+                            }
+                            if(telemetreDistance_arriere_droite >= y_robot-instruction.arg1 && telemetreDistance_arriere_droite <= y_robot+instruction.arg1)
+                            {
+                                nombresDeMesuresAuxTelemtresQuiSontCoherentes++;
+                                moyennageTelemetre += telemetreDistance_arriere_droite;
+                            }
+                            
+                            moyennageTelemetre /= nombresDeMesuresAuxTelemtresQuiSontCoherentes;
+                            
+                            if(nombresDeMesuresAuxTelemtresQuiSontCoherentes)
+                                SetOdometrie(ODOMETRIE_SMALL_POSITION, x_robot, moyennageTelemetre, theta_robot);
+                        }
+                        else if(instruction.precision == RECALAGE_X)
+                        {
+                            telemetreDistance_avant_gauche   = ((theta_robot < 900 && theta_robot > -900)?2000:0) + ((theta_robot < 900 && theta_robot > -900)?-1:1)*telemetreDistance_avant_gauche;
+                            telemetreDistance_avant_droite   = ((theta_robot < 900 && theta_robot > -900)?2000:0) + ((theta_robot < 900 && theta_robot > -900)?-1:1)*telemetreDistance_avant_droite;
+                            telemetreDistance_arriere_gauche = ((theta_robot < 900 && theta_robot > -900)?2000:0) + ((theta_robot < 900 && theta_robot > -900)?-1:1)*telemetreDistance_arriere_gauche;
+                            telemetreDistance_arriere_droite = ((theta_robot < 900 && theta_robot > -900)?2000:0) + ((theta_robot < 900 && theta_robot > -900)?-1:1)*telemetreDistance_arriere_droite;
+                            
+                            if(telemetreDistance_avant_gauche >= x_robot-instruction.arg1 && telemetreDistance_avant_gauche <= x_robot+instruction.arg1)
+                            {
+                                nombresDeMesuresAuxTelemtresQuiSontCoherentes++;
+                                moyennageTelemetre += telemetreDistance_avant_gauche;
+                            }
+                            if(telemetreDistance_avant_droite >= x_robot-instruction.arg1 && telemetreDistance_avant_droite <= x_robot+instruction.arg1)
+                            {
+                                nombresDeMesuresAuxTelemtresQuiSontCoherentes++;
+                                moyennageTelemetre += telemetreDistance_avant_droite;
+                            }
+                            if(telemetreDistance_arriere_gauche >= x_robot-instruction.arg1 && telemetreDistance_arriere_gauche <= x_robot+instruction.arg1)
+                            {
+                                nombresDeMesuresAuxTelemtresQuiSontCoherentes++;
+                                moyennageTelemetre += telemetreDistance_arriere_gauche;
+                            }
+                            if(telemetreDistance_arriere_droite >= x_robot-instruction.arg1 && telemetreDistance_arriere_droite <= x_robot+instruction.arg1)
+                            {
+                                nombresDeMesuresAuxTelemtresQuiSontCoherentes++;
+                                moyennageTelemetre += telemetreDistance_arriere_droite;
+                            }
+                            
+                            moyennageTelemetre /= nombresDeMesuresAuxTelemtresQuiSontCoherentes;
+                            
+                            if(nombresDeMesuresAuxTelemtresQuiSontCoherentes)
+                                SetOdometrie(ODOMETRIE_SMALL_POSITION, moyennageTelemetre, y_robot, theta_robot);
+                        }
+                        /*else if(instruction.precision == RECALAGE_T)
+                        {
+                            // On arrondie l'angle pour simplifier les conditions
+                            if(theta_robot >= 450 && theta_robot <= 1350)
+                                orientationArrondie = 90; 
+                            else if(theta_robot <= -450 && theta_robot >= -1350)
+                                orientationArrondie = 270;
+                            else if(theta_robot <= 450 && theta_robot >= -450)
+                                orientationArrondie = 0;
+                            else if(theta_robot >= 1350 && theta_robot <= -1350)
+                                orientationArrondie = 180;
+                            
+                            // Calcul de position pour faire la vérification de cohérence
+                            if(orientationArrondie == 90 || orientationArrondie == 270)
+                            {
+                                position_avant_gauche   = (((theta_robot < 1800 && theta_robot > 0) || (theta_robot < -1800 && theta_robot > -3600))?3000:0) + (((theta_robot < 1800 && theta_robot > 0) || (theta_robot < -1800 && theta_robot > -3600))?-1:1)*telemetreDistance_avant_gauche;
+                                position_avant_droite   = (((theta_robot < 1800 && theta_robot > 0) || (theta_robot < -1800 && theta_robot > -3600))?3000:0) + (((theta_robot < 1800 && theta_robot > 0) || (theta_robot < -1800 && theta_robot > -3600))?-1:1)*telemetreDistance_avant_droite;
+                                position_arriere_gauche = (((theta_robot < 1800 && theta_robot > 0) || (theta_robot < -1800 && theta_robot > -3600))?3000:0) + (((theta_robot < 1800 && theta_robot > 0) || (theta_robot < -1800 && theta_robot > -3600))?-1:1)*telemetreDistance_arriere_gauche;
+                                position_arriere_droite = (((theta_robot < 1800 && theta_robot > 0) || (theta_robot < -1800 && theta_robot > -3600))?3000:0) + (((theta_robot < 1800 && theta_robot > 0) || (theta_robot < -1800 && theta_robot > -3600))?-1:1)*telemetreDistance_arriere_droite;
+                            
+                            }
+                            else if(orientationArrondie == 0 || orientationArrondie == 180)
+                            {
+                                position_avant_gauche   = ((theta_robot < 900 && theta_robot > -900)?2000:0) + ((theta_robot < 900 && theta_robot > -900)?-1:1)*telemetreDistance_avant_gauche;
+                                position_avant_droite   = ((theta_robot < 900 && theta_robot > -900)?2000:0) + ((theta_robot < 900 && theta_robot > -900)?-1:1)*telemetreDistance_avant_droite;
+                                position_arriere_gauche = ((theta_robot < 900 && theta_robot > -900)?2000:0) + ((theta_robot < 900 && theta_robot > -900)?-1:1)*telemetreDistance_arriere_gauche;
+                                position_arriere_droite = ((theta_robot < 900 && theta_robot > -900)?2000:0) + ((theta_robot < 900 && theta_robot > -900)?-1:1)*telemetreDistance_arriere_droite;
+                            }
+                            
+                            
+                            if(orientationArrondie == 90 || orientationArrondie == 270) // Si il est en axe Y
+                            {
+                                if(position_arriere_droite >= y_robot-instruction.arg1 && position_arriere_droite <= y_robot+instruction.arg1) // Et que les mesures sont cohérentes
+                                {
+                                    if(position_arriere_gauche >= y_robot-instruction.arg1 && position_arriere_gauche <= y_robot+instruction.arg1)
+                                    {
+                                        if(telemetreDistance_arriere_droite > telemetreDistance_arriere_gauche)
+                                            angleArriere = 900 + (1800 * atan( (double)( (telemetreDistance_arriere_droite-telemetreDistance_arriere_gauche) / ESPACE_INTER_TELEMETRE )))/M_PI;                   
+                                        else 
+                                            angleArriere = 900 + (1800 * atan( (double)( (telemetreDistance_arriere_droite-telemetreDistance_arriere_gauche) / ESPACE_INTER_TELEMETRE )))/M_PI;
+                                    }
+                                }
+                            }
+                            else if(orientationArrondie == 0 || orientationArrondie == 180) // Si il est en axe X
+                            {
+                                if(telemetreDistance_arriere_droite >= x_robot-instruction.arg1 && telemetreDistance_arriere_droite <= x_robot+instruction.arg1) // Et que les mesures sont cohérentes
+                                {
+                                    if(telemetreDistance_arriere_gauche >= x_robot-instruction.arg1 && telemetreDistance_arriere_gauche <= x_robot+instruction.arg1)
+                                    {
+                                        if(telemetreDistance_arriere_droite > telemetreDistance_arriere_gauche)
+                                            angleArriere = 900 + (1800 * atan( (double)( (telemetreDistance_arriere_droite-telemetreDistance_arriere_gauche) / ESPACE_INTER_TELEMETRE )))/M_PI;                   
+                                        else 
+                                            angleArriere = 900 + (1800 * atan( (double)( (telemetreDistance_arriere_droite-telemetreDistance_arriere_gauche) / ESPACE_INTER_TELEMETRE )))/M_PI;
+                                    }
+                                }
+                            }
+                            
+                            if(orientationArrondie == 90 || orientationArrondie == 270) // Si il est en axe Y
+                            {
+                                if(position_avant_droite >= y_robot-instruction.arg1 && position_avant_droite <= y_robot+instruction.arg1) // Et que les mesures sont cohérentes
+                                {
+                                    if(position_avant_gauche >= y_robot-instruction.arg1 && position_avant_gauche <= y_robot+instruction.arg1)
+                                    {
+                                        if(telemetreDistance_avant_droite > telemetreDistance_avant_gauche)
+                                            angleAvant = 900 + (1800 * atan( (double)( (telemetreDistance_avant_droite-telemetreDistance_avant_gauche) / ESPACE_INTER_TELEMETRE )))/M_PI;                   
+                                        else 
+                                            angleAvant = 900 + (1800 * atan( (double)( (telemetreDistance_avant_droite-telemetreDistance_avant_gauche) / ESPACE_INTER_TELEMETRE )))/M_PI;
+                                            
+                                        nombresDeMesuresAuxTelemtresQuiSontCoherentes++;
+                                        moyennageTelemetre += angleAvant;
+                                    }
+                                }
+                            }
+                            else if(orientationArrondie == 0 || orientationArrondie == 180) // Si il est en axe X
+                            {
+                                if(telemetreDistance_avant_droite >= x_robot-instruction.arg1 && telemetreDistance_avant_droite <= x_robot+instruction.arg1) // Et que les mesures sont cohérentes
+                                {
+                                    if(telemetreDistance_avant_gauche >= x_robot-instruction.arg1 && telemetreDistance_avant_gauche <= x_robot+instruction.arg1)
+                                    {
+                                        if(telemetreDistance_avant_droite > telemetreDistance_avant_gauche)
+                                            angleAvant = 900 + (1800 * atan( (double)( (telemetreDistance_avant_droite-telemetreDistance_avant_gauche) / ESPACE_INTER_TELEMETRE )))/M_PI;                   
+                                        else 
+                                            angleAvant = 900 + (1800 * atan( (double)( (telemetreDistance_avant_droite-telemetreDistance_avant_gauche) / ESPACE_INTER_TELEMETRE )))/M_PI;
+                                            
+                                        nombresDeMesuresAuxTelemtresQuiSontCoherentes++;
+                                        moyennageTelemetre += angleArriere;
+                                    }
+                                }
+                            }
+                            
+                            angleRecalage = moyennageTelemetre/nombresDeMesuresAuxTelemtresQuiSontCoherentes;
+                            
+                            if(nombresDeMesuresAuxTelemtresQuiSontCoherentes)
+                            {
+                                if(orientationArrondie == 0)
+                                {
+                                    angleRecalage -= 90;
+                                    
+                                    if(telemetreDistance_avant_droite > telemetreDistance_avant_gauche)
+                                        distanceRecalage = *);                  
+                                    else 
+                                        distanceRecalage = 900 + (1800 * atan( (double)( (telemetreDistance_avant_droite-telemetreDistance_avant_gauche) / ESPACE_INTER_TELEMETRE )))/M_PI;     
+                                }
+                                else if(orientationArrondie == 90)
+                                {
+                                    angleRecalage += 0; 
+                                }
+                                else if(orientationArrondie == 180)
+                                {
+                                    angleRecalage += 90; 
+                                }
+                                else if(orientationArrondie == 270)
+                                {
+                                    angleRecalage += 180;
+                                }
+                            }
+                            
+                            
+                            if(nombresDeMesuresAuxTelemtresQuiSontCoherentes)
+                                SetOdometrie(ODOMETRIE_SMALL_POSITION, x_robot, y_robot, moyennageTelemetre);
+                        }  */                                             
+                    }
                 break;
+                
                 case ACTION:
                     int tempo = 0;
                     waitingAckID= ACK_ACTION;       //On veut un ack de type action
@@ -1336,7 +1566,7 @@
                     tempo = doAction(instruction.arg1,instruction.arg2,instruction.arg3);
                     if(tempo == 1){
                         //L'action est spécifique
-                        if((waitingAckFrom == 0 && waitingAckID == 0) || instruction.nextActionType == ENCHAINEMENT) {
+                        if((waitingAckFrom == 0 && waitingAckID == 0) && instruction.nextActionType == ENCHAINEMENT) {
                             
                             actual_instruction = instruction.nextLineOK;//On indique que l'on va charger l'instruction suivante
                             gameEtat = ETAT_GAME_LOAD_NEXT_INSTRUCTION;
@@ -1345,8 +1575,8 @@
                             gameEtat = ETAT_GAME_WAIT_ACK;
                         }
                         #ifdef ROBOT_SMALL
-                            actual_instruction = instruction.nextLineOK;//On indique que l'on va charger l'instruction suivante
-                            gameEtat = ETAT_GAME_LOAD_NEXT_INSTRUCTION;
+                            /*actual_instruction = instruction.nextLineOK;//On indique que l'on va charger l'instruction suivante
+                            gameEtat = ETAT_GAME_LOAD_NEXT_INSTRUCTION;*/
                         #endif
                         return;
                      #ifdef ROBOT_SMALL   
@@ -1398,7 +1628,7 @@
             /*
             Attente de l'ack de l'instruction
             */
-            canProcessRx();
+            
             if(waitingAckID == 0 && waitingAckFrom == 0) {//Les ack ont été reset, c'est bon on continue
             //if(true) {
                 cartesCheker.stop();
@@ -1413,45 +1643,45 @@
                     }
                 } 
                 else if(instruction.nextActionType == WAIT) {   ///Actualisation des waiting ack afin d'attendre la fin des actions
-                    gameEtat = ETAT_GAME_WAIT_END_INSTRUCTION;
+                     gameEtat = ETAT_GAME_WAIT_END_INSTRUCTION;
                      switch(instruction.order)
                     {
                         case MV_COURBURE:
-                            waitingAckID = ASSERVISSEMENT_COURBURE;
-                            waitingAckFrom = INSTRUCTION_END_MOTEUR;
+                            waitingAckID_FIN = ASSERVISSEMENT_COURBURE;
+                            waitingAckFrom_FIN = INSTRUCTION_END_MOTEUR;
                         break;
                         case MV_LINE:
-                            waitingAckID = ASSERVISSEMENT_RECALAGE;
-                            waitingAckFrom = INSTRUCTION_END_MOTEUR;
+                            waitingAckID_FIN = ASSERVISSEMENT_RECALAGE;
+                            waitingAckFrom_FIN = INSTRUCTION_END_MOTEUR;
                         break;
                         case MV_TURN:
-                            waitingAckID = ASSERVISSEMENT_ROTATION;
-                            waitingAckFrom = INSTRUCTION_END_MOTEUR;
+                            waitingAckID_FIN = ASSERVISSEMENT_ROTATION;
+                            waitingAckFrom_FIN = INSTRUCTION_END_MOTEUR;
                         break;
                         case MV_XYT:
-                            waitingAckID = ASSERVISSEMENT_XYT;
-                            waitingAckFrom = INSTRUCTION_END_MOTEUR;
+                            waitingAckID_FIN = ASSERVISSEMENT_XYT;
+                            waitingAckFrom_FIN = INSTRUCTION_END_MOTEUR;
                         break;
                         case MV_RECALAGE:
-                            waitingAckID = ASSERVISSEMENT_RECALAGE;
-                            waitingAckFrom = INSTRUCTION_END_MOTEUR;
+                            waitingAckID_FIN = ASSERVISSEMENT_RECALAGE;
+                            waitingAckFrom_FIN = INSTRUCTION_END_MOTEUR;
                         break;
                         case ACTION:
                             
                             if (modeTelemetre == 0){
                                 if (telemetreDistance == 0){
-                                    waitingAckID = ACK_FIN_ACTION;// ack de type action  
-                                    waitingAckFrom = ACKNOWLEDGE_HERKULEX; //de la part des herkulex/actionneurs
+                                    waitingAckID_FIN = ACK_FIN_ACTION;// ack de type action  
+                                    waitingAckFrom_FIN = ACKNOWLEDGE_HERKULEX; //de la part des herkulex/actionneurs
                                 }else if(telemetreDistance == 5000){
                                     // on est dans le cas ou l'on fait une ligne suivant la distance du telemetre
-                                    waitingAckID = ASSERVISSEMENT_RECALAGE;
-                                    waitingAckFrom = INSTRUCTION_END_MOTEUR;
+                                    waitingAckID_FIN = ASSERVISSEMENT_RECALAGE;
+                                    waitingAckFrom_FIN = INSTRUCTION_END_MOTEUR;
                                     telemetreDistance = 0;
                                 }
                             }else{ // si on attend la reponse du telemetre  
                                 //modeTelemetre = 1; 
-                                waitingAckID = OBJET_SUR_TABLE;
-                                waitingAckFrom = 0; 
+                                waitingAckID_FIN = OBJET_SUR_TABLE;
+                                waitingAckFrom_FIN = 0; 
                             }
                         break;
                         default:
@@ -1463,15 +1693,15 @@
                     actual_instruction = instruction.nextLineOK;//On indique que l'on va charger l'instruction suivante
                 }
             } 
-            else if(cartesCheker.read_ms () > 50){
+            else if(cartesCheker.read_ms () > 500){
                 cartesCheker.stop();
                 if(screenChecktry >=2) {//La carte n'a pas reçus l'information, on passe à l'instruction d'erreur
                     actual_instruction = instruction.nextLineError;
                     gameEtat = ETAT_GAME_LOAD_NEXT_INSTRUCTION;
                 } 
                 else {
-                    //gameEtat = ETAT_GAME_PROCESS_INSTRUCTION;//On retourne dans l'etat d'envois de l'instruction
-                    gameEtat=ETAT_GAME_WAIT_END_INSTRUCTION;
+                    gameEtat = ETAT_GAME_PROCESS_INSTRUCTION;//On retourne dans l'etat d'envois de l'instruction
+                    //gameEtat=ETAT_GAME_WAIT_END_INSTRUCTION;
                 }
             }
         break;
@@ -1527,10 +1757,20 @@
         break;
         case ETAT_GAME_WAIT_END_INSTRUCTION:
             canProcessRx();
-            if(waitingAckID == 0 && waitingAckFrom ==0) {//On attend que la carte nous indique que l'instruction est terminée
+            if(instruction.order==MV_XYT && (waitingAckID_FIN == 0 && waitingAckFrom_FIN ==0)){
+                if((x_robot<=target_x_robot-2 || x_robot>=target_x_robot+2)||(y_robot<=target_y_robot-2 || y_robot>=target_y_robot+2)||(theta_robot<=target_theta_robot-2 || theta_robot>=target_theta_robot+2)){
+                    gameEtat=ETAT_GAME_PROCESS_INSTRUCTION;
+                }
+                else {
+                    actual_instruction = instruction.nextLineOK;//On indique que l'on va charger l'instruction suivante
+                    gameEtat = ETAT_GAME_LOAD_NEXT_INSTRUCTION;//On charge l'instruction suivante
+                }
+            }      
+            else if(waitingAckID_FIN == 0 && waitingAckFrom_FIN ==0) {//On attend que la carte nous indique que l'instruction est terminée
                 actual_instruction = instruction.nextLineOK;//On indique que l'on va charger l'instruction suivante
                 gameEtat = ETAT_GAME_LOAD_NEXT_INSTRUCTION;//On charge l'instruction suivante
             }
+            
         break;
         
         
@@ -1671,10 +1911,10 @@
             if (etat == ATT) {
                  
                 lcd.SetTextColor(LCD_COLOR_LIGHTGREEN);
-                lcd.FillRect(0,75,400,150); //carte moteur
+                lcd.FillRect(0,400,400,150);
                 lcd.SetTextColor(LCD_COLOR_BLACK);
                 lcd.SetBackColor(LCD_COLOR_LIGHTGREEN);
-                lcd.DisplayStringAt(80, 135, (uint8_t *)"Carte Moteur", LEFT_MODE);
+                lcd.DisplayStringAt(80, 450, (uint8_t *)"Carte Moteur", LEFT_MODE);
                 }
                 break;
                 
@@ -1682,10 +1922,10 @@
             if (etat == ATT) {
                  
                 lcd.SetTextColor(LCD_COLOR_LIGHTGREEN);
-                lcd.FillRect(0,250,400,150); //carte AX12
+                lcd.FillRect(0,600,400,150); //carte AX12
                 lcd.SetTextColor(LCD_COLOR_BLACK);
                 lcd.SetBackColor(LCD_COLOR_LIGHTGREEN);
-                lcd.DisplayStringAt(110, 310, (uint8_t *)"Balise", LEFT_MODE);
+                lcd.DisplayStringAt(110, 650, (uint8_t *)"Balise", LEFT_MODE);
                 } 
                 break;
 
@@ -1716,9 +1956,10 @@
             /////////////////////////////////////Acknowledges de Reception de la demande d'action////////////////////////////////////////   
             case ACKNOWLEDGE_HERKULEX: 
             case ACKNOWLEDGE_BALISE:    //pas de break donc passe directement dans INSTRUCTION_END_AX12 mais conserve l'ident initial
-            case ACKNOWLEDGE_MOTEUR:
+            
             case ACKNOWLEDGE_TELEMETRE:    
             /////////////////////////////////////////////Acknowledges de la fin d'action/////////////////////////////////////////////////  
+            case ACKNOWLEDGE_MOTEUR:
             case INSTRUCTION_END_BALISE:
             case INSTRUCTION_END_MOTEUR:
             case ACK_FIN_ACTION:
@@ -1727,6 +1968,11 @@
                     waitingAckFrom = 0;
                     waitingAckID = 0;        
                 }
+                if(waitingAckFrom_FIN == msgRxBuffer[FIFO_lecture].id && ((unsigned short)msgRxBuffer[FIFO_lecture].data[0]|((unsigned short)(msgRxBuffer[FIFO_lecture].data[1])<<8) == waitingAckID_FIN)) {
+                    //SendRawId(waitingAckID);
+                    waitingAckFrom_FIN = 0;
+                    waitingAckID_FIN = 0;        
+                }
                 
             break;
 #ifdef ROBOT_BIG
@@ -1824,33 +2070,34 @@
                 break;
                 
             case RECEPTION_RECALAGE:
-                telemetreDistance=char_to_short_transformation(msgRxBuffer[FIFO_lecture].data[0], msgRxBuffer[FIFO_lecture].data[1]);
-                telemetreDistance1=char_to_short_transformation(msgRxBuffer[FIFO_lecture].data[2], msgRxBuffer[FIFO_lecture].data[3]);
-                telemetreDistance2=char_to_short_transformation(msgRxBuffer[FIFO_lecture].data[4], msgRxBuffer[FIFO_lecture].data[5]);
-                telemetreDistance3=char_to_short_transformation(msgRxBuffer[FIFO_lecture].data[6], msgRxBuffer[FIFO_lecture].data[7]);
-                waitingAckFrom = 0;
-                waitingAckID = 0;
-                if(ModeDemo==1){
-                    sprintf(message,"%04d mm",telemetreDistance);
+                telemetreDistance_arriere_droite = char_to_short_transformation(msgRxBuffer[FIFO_lecture].data[0], msgRxBuffer[FIFO_lecture].data[1]); //
+                telemetreDistance_avant_droite   = char_to_short_transformation(msgRxBuffer[FIFO_lecture].data[2], msgRxBuffer[FIFO_lecture].data[3]);
+                telemetreDistance_arriere_gauche = char_to_short_transformation(msgRxBuffer[FIFO_lecture].data[4], msgRxBuffer[FIFO_lecture].data[5]);
+                telemetreDistance_avant_gauche   = char_to_short_transformation(msgRxBuffer[FIFO_lecture].data[6], msgRxBuffer[FIFO_lecture].data[7]);
+                
+                
+                
+                if(ModeDemo==1)
+                {
+                    sprintf(message,"%04d mm",telemetreDistance_arriere_droite);
                     lcd.SetBackColor(LCD_COLOR_WHITE);
                     lcd.DisplayStringAt(0, LINE(10),(unsigned char *)"LASER ARD : ",LEFT_MODE);
                     lcd.DisplayStringAt(200, LINE(10),(unsigned char *)message, LEFT_MODE);
                     
-                    sprintf(message1,"%04d mm",telemetreDistance1);
+                    sprintf(message1,"%04d mm",telemetreDistance_avant_droite);
                     lcd.SetBackColor(LCD_COLOR_WHITE);
                     lcd.DisplayStringAt(0, LINE(12),(unsigned char *)"LASER AVD : ",LEFT_MODE);
                     lcd.DisplayStringAt(200, LINE(12),(unsigned char *)message1, LEFT_MODE);
                     
-                    sprintf(message2,"%04d mm",telemetreDistance2);
+                    sprintf(message2,"%04d mm",telemetreDistance_arriere_gauche);
                     lcd.SetBackColor(LCD_COLOR_WHITE);
                     lcd.DisplayStringAt(0, LINE(14),(unsigned char *)"LASER ARG : ",LEFT_MODE);
                     lcd.DisplayStringAt(200, LINE(14),(unsigned char *)message2, LEFT_MODE);
                     
-                    sprintf(message3,"%04d mm",telemetreDistance3);
+                    sprintf(message3,"%04d mm",telemetreDistance_avant_gauche);
                     lcd.SetBackColor(LCD_COLOR_WHITE);
                     lcd.DisplayStringAt(0, LINE(16),(unsigned char *)"LASER AVG : ",LEFT_MODE);
-                    lcd.DisplayStringAt(200, LINE(16),(unsigned char *)message3, LEFT_MODE);
-                    
+                    lcd.DisplayStringAt(200, LINE(16),(unsigned char *)message3, LEFT_MODE);                    
                 }
                 break;