Programme carte strategie (disco)

Dependencies:   mbed SerialHalfDuplex SDFileSystem DISCO-F469NI_portrait liaison_Bluetooth ident_crac

Revision:
38:76f886a1c8e6
Parent:
37:fca332b64b42
Child:
40:21bb685b553b
--- a/Strategie/Strategie.cpp	Thu May 03 22:35:27 2018 +0000
+++ b/Strategie/Strategie.cpp	Wed May 09 19:36:20 2018 +0000
@@ -67,6 +67,9 @@
 char counter = 0;
 char check;
 char Jack = 1;
+short SCORE_GLOBAL=10;
+short SCORE_GR=0;
+short SCORE_PR=0;
 
 int flag = 0, flag_strat = 0, flag_timer;
 char Ack_strat = 0;
@@ -108,7 +111,7 @@
 T_etat etat = INIT;
 E_stratGameEtat     gameEtat  = ETAT_CHECK_CARTES;
 E_stratGameEtat     lastEtat  = ETAT_CHECK_CARTES;
-
+E_Stratposdebut etat_pos=RECALAGE_1;
 
 /////////////////DEFINITION DES BOUTONS////////////////////
     Button COTE_VERT(0, 25, 400, 300, "VERT");
@@ -166,15 +169,15 @@
 #ifdef ROBOT_BIG
 
 
-unsigned short id_check[NOMBRE_CARTES]= {CHECK_MOTEUR,CHECK_BALISE,CHECK_ACTIONNEURS_AVANT,CHECK_ACTIONNEURS_ARRIERE};
-unsigned short id_alive[NOMBRE_CARTES]= {ALIVE_MOTEUR,ALIVE_BALISE,ALIVE_ACTIONNEURS_AVANT,ALIVE_ACTIONNEURS_ARRIERE};
+unsigned short id_check[NOMBRE_CARTES]= {CHECK_MOTEUR,CHECK_BALISE};
+unsigned short id_alive[NOMBRE_CARTES]= {ALIVE_MOTEUR,ALIVE_BALISE};
 
 InterruptIn jack(PG_11); //  entrée analogique en interruption pour le jack
 #else
 
 
-unsigned short id_check[NOMBRE_CARTES]= {CHECK_MOTEUR};
-unsigned short id_alive[NOMBRE_CARTES]= {ALIVE_MOTEUR};
+unsigned short id_check[NOMBRE_CARTES]= {CHECK_MOTEUR,CHECK_BALISE};
+unsigned short id_alive[NOMBRE_CARTES]= {ALIVE_MOTEUR,ALIVE_BALISE};
 InterruptIn jack(PG_11); //  entrée analogique en interruption pour le jack
 
 
@@ -293,8 +296,8 @@
         ligne=0;
     char aff[10]="toto";
     sprintf(aff,"%lf ",Var);
-    lcd.DisplayStringAt(120, LINE(5+(ligne)), (uint8_t *)aff, LEFT_MODE);
-    ligne++;
+    lcd.DisplayStringAt(120, LINE(15+(ligne)), (uint8_t *)aff, LEFT_MODE);
+    //ligne++;
     
 }
                
@@ -353,20 +356,7 @@
             lcd.DisplayStringAt(110,650 , (uint8_t *)"Balise", LEFT_MODE);
             ////////////////////////////////////////
             
-            FORCE_LAUNCH.Draw(0xFFFF0000, 0);
-
-            /*while(flag == 0)
-            {
-                ts.GetState(&TS_State); 
-                canProcessRx();
-                if (FORCE_LAUNCH.Touched())
-                {
-                    etat = CHOIX;
-                    gameEtat = ETAT_CONFIG;
-                    flag = 1;
-                    while(FORCE_LAUNCH.Touched());
-                }
-            }*/ 
+            FORCE_LAUNCH.Draw(0xFFFF0000, 0); 
             
             etat=ATT;
             break;
@@ -570,7 +560,7 @@
                         COLOR_ORANGE.Draw(ORANGE,0);
                         COLOR_JAUNE.Draw(JAUNE,0);
                         COLOR_VERT.Draw(VERT,0);
-                        COLOR_BLEU.Draw(VERT,0);
+                        COLOR_BLEU.Draw(BLEU,0);
                         
                         lcd.SetBackColor(LCD_COLOR_WHITE);
                         lcd.SetTextColor(NOIR);
@@ -842,7 +832,6 @@
                 canProcessRx();
                 if(COTE_VERT.Touched()) 
                 {
-                    liaison_Tx.envoyer(0x30,3,"123");
                     Cote = 0x0;
                     InversStrat = Cote;
                     etat = TACTIQUE;
@@ -887,12 +876,12 @@
                 lcd.SetBackColor(VERT);
                 }
             else if (Cote == 1){
-                lcd.Clear(JAUNE);
-                lcd.SetBackColor(JAUNE);
+                lcd.Clear(ORANGE);
+                lcd.SetBackColor(ORANGE);
                 }
             else {
-                lcd.Clear(VERT);
-                lcd.SetBackColor(VERT);
+                lcd.Clear(BLEU);
+                lcd.SetBackColor(BLEU);
                 }
             
             lcd.SetTextColor(LCD_COLOR_BLACK); 
@@ -954,8 +943,8 @@
                 lcd.SetBackColor(VERT);
                 }
             else if (Cote == 1){
-                lcd.Clear(JAUNE);
-                lcd.SetBackColor(JAUNE);
+                lcd.Clear(ORANGE);
+                lcd.SetBackColor(ORANGE);
                 }
             else {
                 lcd.Clear(VERT);
@@ -970,28 +959,43 @@
             break;   
             
         case COMPTEUR: 
-            /*cptf=gameTimer.read();
+            cptf=gameTimer.read();
             lcd.SetTextColor(LCD_COLOR_BLACK);
-            cpt=int(cptf);
+            cpt=(int)cptf;
             if(cpt != cpt1){
                 lcd.Clear(VERT);
-                affichage_compteur(100-cpt);
+               // affichage_compteur(100-cpt);
+                affichage_compteur(SCORE_PR);
+                #ifdef ROBOT_BIG
+                    affichage_var(SCORE_GR);
+                #else 
+                    affichage_var(SCORE_PR);
+                #endif
+                if(liaison_pr.paquet_en_attente()){
+                    PaquetDomotique *paquet=liaison_pr.lire();
+                    if(paquet->identifiant==PAQUET_IDENTIFIANT_AJOUTERSCORE){
+                        SCORE_PR+=convertir_score(paquet);
+                    }
+                    delete paquet;
+                }
             }
             cpt1=cpt;
             flag_timer=0;
 
-            affichage_debug(gameEtat);
+            //affichage_debug(gameEtat);
             lcd.SetBackColor(LCD_COLOR_WHITE);
-            */
+            
             break;
             
         case FIN :
             lcd.Clear (LCD_COLOR_WHITE);
             lcd.SetBackColor(LCD_COLOR_WHITE);
-            lcd.DisplayStringAt(120, 190, (uint8_t *)"LANCEMENT", LEFT_MODE);
-            lcd.SetTextColor(LCD_COLOR_BLACK);
-            lcd.DisplayStringAt(120, 210, (uint8_t *)"REDEMARAGE", LEFT_MODE);
-            lcd.DisplayStringAt(120, 230, (uint8_t *)"NECESSAIRE", LEFT_MODE);
+            #ifdef ROBOT_BIG
+                affichage_compteur(SCORE_GR);
+                liaison_Tx.envoyer_short(PAQUET_IDENTIFIANT_FINMATCH,SCORE_GLOBAL);
+            #else 
+                affichage_compteur(SCORE_PR);
+            #endif
             while(1); // force le redemarage du robot  
             //break;
             
@@ -1056,7 +1060,9 @@
                     printf("all card check, missing %d cards\n",(NOMBRE_CARTES-countAliveCard));
                     if(countAliveCard >= NOMBRE_CARTES) {
                         gameEtat = ETAT_CONFIG;
+                        SendRawId(ECRAN_ALL_CHECK);
                         flag=1;
+                        
                         //tactile_printf("Selection couleur et strategie");
                     } 
                     else {
@@ -1131,29 +1137,142 @@
             jack.mode(PullDown); // désactivation de la résistance interne du jack
             jack.fall(&jack_ISR); // création de l'interrupt attachée au changement d'état (front descendant) sur le jack
          
-#ifdef ROBOT_BIG //le gros robot n'a pas de recalage bordure pour ce placer au début, on lui envoit donc ça position
-            localData2 = POSITION_DEBUT_T;
-            localData3 = POSITION_DEBUT_Y;
-            if(InversStrat == 1) {
-                localData2 = 1800-localData2;//Inversion theta
-                if(localData2 > 1800) localData2 -= 3600;
-                else if(localData2 <= -1800) localData2 += 3600;
-                localData3 = 3000 - POSITION_DEBUT_Y;//Inversion du Y
-            }
-            SetOdometrie(ODOMETRIE_BIG_POSITION, POSITION_DEBUT_X,localData3,localData2);
-#endif 
-#ifdef ROBOT_SMALL
             localData2 = POSITION_DEBUT_T;
             localData3 = POSITION_DEBUT_Y;
             if(InversStrat == 1) {
                 localData2 = -localData2;//Inversion theta
                 localData3 = 3000 - POSITION_DEBUT_Y;//Inversion du Y
             }
-            SetOdometrie(ODOMETRIE_SMALL_POSITION, POSITION_DEBUT_X,localData3,localData2);
-#endif
+            SetOdometrie(ODOMETRIE_SMALL_POSITION, POSITION_DEBUT_X,1800,localData2);
+            
+            instruction = strat_instructions[actual_instruction];
+            //On effectue le traitement de l'instruction 
+            
         break;
         case ETAT_GAME_WAIT_FOR_JACK:
-            //On attend le jack
+            if(instruction.order==POSITION_DEBUT){
+                switch(etat_pos){
+                    case RECALAGE_1:
+                        waitingAckID = ASSERVISSEMENT_RECALAGE;
+                        waitingAckFrom = ACKNOWLEDGE_MOTEUR; 
+                        #ifdef ROBOT_SMALL
+                        GoStraight(3000, 1,MOITIEE_ROBOT-5, 0);  //on se recale contre le mur donc il faut donner la valeur du centre du robot
+                        #else
+                        GoStraight(-3000, 1,MOITIEE_ROBOT, 0);
+                        #endif
+                        while(waitingAckID !=0 && waitingAckFrom !=0)
+                            canProcessRx();
+                        waitingAckID_FIN=ASSERVISSEMENT_RECALAGE;
+                        waitingAckFrom_FIN= INSTRUCTION_END_MOTEUR; 
+                        while(waitingAckID_FIN!=0 && waitingAckFrom_FIN !=0)
+                            canProcessRx();
+                        etat_pos=RECULER_1;
+                        break;
+                    
+                    case RECULER_1:
+                        waitingAckID = ASSERVISSEMENT_RECALAGE;
+                        waitingAckFrom = ACKNOWLEDGE_MOTEUR;
+                        #ifdef ROBOT_SMALL   
+                        GoStraight(-450, 0, 0, 0);
+                        #else 
+                        GoStraight(75, 0, 0, 0);
+                        #endif
+                        while(waitingAckID !=0 && waitingAckFrom !=0)
+                            canProcessRx();
+                        waitingAckID_FIN=ASSERVISSEMENT_RECALAGE;
+                        waitingAckFrom_FIN = INSTRUCTION_END_MOTEUR; 
+                        while(waitingAckID_FIN!=0 && waitingAckFrom_FIN !=0)
+                            canProcessRx();
+                        etat_pos=TOURNER;
+                        break; 
+                        
+                    case TOURNER:
+                        waitingAckID = ASSERVISSEMENT_ROTATION;
+                        waitingAckFrom = ACKNOWLEDGE_MOTEUR; 
+                        if(Cote==0){
+                            localData2 = 900;
+                        }
+                        else{
+                            localData2=-900;
+                        }
+                        Rotate(localData2);
+                        while(waitingAckID !=0 && waitingAckFrom !=0)
+                            canProcessRx();
+                        waitingAckID_FIN=ASSERVISSEMENT_ROTATION;
+                        waitingAckFrom_FIN = INSTRUCTION_END_MOTEUR; 
+                        while(waitingAckID_FIN!=0 && waitingAckFrom_FIN !=0)
+                            canProcessRx();
+                        etat_pos=RECALAGE_2;
+                        break; 
+                        
+                    case RECALAGE_2:
+                        waitingAckID = ASSERVISSEMENT_RECALAGE;
+                        waitingAckFrom = ACKNOWLEDGE_MOTEUR; 
+                        if(Cote==1)
+                            localData3=3000-MOITIEE_ROBOT;    
+                        else
+                            localData3=MOITIEE_ROBOT;
+                        #ifdef ROBOT_SMALL
+                        GoStraight(3000, 2,localData3, 0);  //on se recale contre le mur donc il faut donner la valeur du centre du robot
+                        #else
+                        GoStraight(-3000, 2,localData3, 0);
+                        #endif
+                        while(waitingAckID !=0 && waitingAckFrom !=0)
+                            canProcessRx();
+                        waitingAckID_FIN=ASSERVISSEMENT_RECALAGE;
+                        waitingAckFrom_FIN = INSTRUCTION_END_MOTEUR; 
+                        while(waitingAckID_FIN!=0 && waitingAckFrom_FIN !=0)
+                            canProcessRx();
+                        etat_pos=RECULER_2;
+                        break; 
+                        
+                    case RECULER_2:    
+                        waitingAckID = ASSERVISSEMENT_RECALAGE;
+                        waitingAckFrom = ACKNOWLEDGE_MOTEUR;   
+                        #ifdef ROBOT_SMALL   
+                        GoStraight(-200, 0, 0, 0);
+                        #else 
+                        GoStraight(200, 0, 0, 0);
+                        #endif
+                        while(waitingAckID !=0 && waitingAckFrom !=0)
+                            canProcessRx();
+                        waitingAckID_FIN=ASSERVISSEMENT_RECALAGE;
+                        waitingAckFrom_FIN = INSTRUCTION_END_MOTEUR; 
+                        while(waitingAckID_FIN!=0 && waitingAckFrom_FIN !=0)
+                            canProcessRx();
+                        etat_pos=GOTOPOS;
+                        break;
+                    
+                    case GOTOPOS:
+                        localData1 = -1;
+                        
+                        if(InversStrat == 1 && ingnorInversionOnce == 0) {
+                            localData2 = -instruction.arg3;
+                            localData3 = 3000 - instruction.arg2;//Inversion du Y
+                        } else {
+                            localData3 = instruction.arg2;
+                            localData2 = instruction.arg3;
+                        }
+                        
+                        GoToPosition(instruction.arg1,localData3,localData2,localData1);
+                        waitingAckID = ASSERVISSEMENT_XYT;
+                        waitingAckFrom = ACKNOWLEDGE_MOTEUR;
+                        
+                        while(waitingAckID !=0 && waitingAckFrom !=0)
+                            canProcessRx();
+                        waitingAckID_FIN=ASSERVISSEMENT_XYT;
+                        waitingAckFrom_FIN = INSTRUCTION_END_MOTEUR; 
+                        while(waitingAckID_FIN!=0 && waitingAckFrom_FIN !=0)
+                            canProcessRx();
+                        etat_pos=FIN_POS;
+                        break; 
+                    case FIN_POS:
+                        actual_instruction = instruction.nextLineOK;
+                        break; 
+                }
+            }
+        
+            
         break;
         case ETAT_GAME_START:
             
@@ -1191,7 +1310,7 @@
             Traitement de l'instruction, envoie de la trame CAN
             */
             //debug_Instruction(instruction);
-            affichage_debug(gameEtat);
+            //affichage_debug(gameEtat);
             actionPrecedente = instruction.order;
             switch(instruction.order)
             {
@@ -1215,10 +1334,6 @@
                     if(InversStrat == 1 && ingnorInversionOnce == 0)
                     {
                         localData1 = -localData1;//Inversion de la direction
-                        #ifdef ROBOT_BIG
-                        localData2 = -localData2;
-                        localData1 = -localData1;//Inversion de la direction
-                        #endif
                     }
                     BendRadius(instruction.arg1, localData2, localData1, localData5);
                     
@@ -1245,14 +1360,7 @@
                         } else {
                             localData5 = 0;
                         }
-                    }
-                    #ifdef ROBOT_BIG
-                    if(InversStrat == 1 && ingnorInversionOnce == 0) {
-                            /*if (instruction.direction == FORWARD) instruction.direction = BACKWARD;
-                            else instruction.direction = FORWARD;*/
-                            instruction.direction = ((instruction.direction == FORWARD)?BACKWARD:FORWARD);
-                        }
-                    #endif    
+                    } 
                     localData2 = (((instruction.direction == FORWARD)?1:-1)*instruction.arg1);
                     GoStraight(localData2, 0, 0, localData5);
                     
@@ -1273,29 +1381,9 @@
                         }
                         
                     }
-                    #ifdef ROBOT_SMALL
                     if(InversStrat == 1 && ingnorInversionOnce == 0) {
                             localData2 = -localData2;
-                        }
-                    #endif
-                    #ifdef ROBOT_BIG
-                    if(InversStrat == 1 && ingnorInversionOnce == 0) {
-                        if(instruction.direction == RELATIVE) {
-                            localData2 = instruction.arg3;
-                        } else {//C'est un rotation absolu, il faut la convertir en relative
-                            
-                            localData2 = 1800-instruction.arg3;//Inversion theta
-                            if(localData2 > 1800) localData2 -= 3600;
-                            else if(localData2 <= -1800) localData2 += 3600;
-                            
-                            localData2 = (localData2 - theta_robot)%3600;
-                            if(localData2 > 1800) {
-                                localData2 = localData2-3600;
-                            }
-                            
-                        }
-                    }
-                    #endif  
+                        } 
                     waitingAckID = ASSERVISSEMENT_ROTATION;
                     waitingAckFrom = ACKNOWLEDGE_MOTEUR;
                     Rotate(localData2);
@@ -1317,15 +1405,6 @@
                         localData2 = instruction.arg3;
                     }
                     
-                    #ifdef ROBOT_BIG
-                    if(InversStrat == 1 && ingnorInversionOnce == 0) {
-                         localData1 = -localData1;
-                         localData2 = 1800-instruction.arg3;//Inversion theta
-                         if(localData2 > 1800) localData2 -= 3600;
-                         else if(localData2 <= -1800) localData2 += 3600;
-                    }
-                    #endif
-                    
                     GoToPosition(instruction.arg1,localData3,localData2,localData1);
                     waitingAckID = ASSERVISSEMENT_XYT;
                     waitingAckFrom = ACKNOWLEDGE_MOTEUR;
@@ -1467,6 +1546,7 @@
                     }
                 } 
                 else if(instruction.nextActionType == WAIT) {   ///Actualisation des waiting ack afin d'attendre la fin des actions
+                    SetOdometrie(0x28, x_robot, y_robot, theta_robot);
                      gameEtat = ETAT_GAME_WAIT_END_INSTRUCTION;
                      switch(instruction.order)
                     {
@@ -1591,7 +1671,13 @@
         case ETAT_WARNING_TIMEOUT://Attente de la trame fin de danger ou du timeout de 2s
             if(timeoutWarning.read_ms() >= BALISE_TIMEOUT)//ça fait plus de 2s, il faut changer de stratégie
             {
-                gameEtat = ETAT_EVITEMENT;
+                if(instruction.nextLineOK == instruction.nextLineError)                
+                    gameEtat = ETAT_EVITEMENT;
+                else
+                {
+                    actual_instruction = instruction.nextLineError;
+                    gameEtat = ETAT_GAME_LOAD_NEXT_INSTRUCTION;
+                }
             }
         break;
         case ETAT_WARING_END_BALISE_WAIT://Attente d'une seconde apres la fin d'un End Balise pour etre sur que c'est bon
@@ -1689,28 +1775,32 @@
                         break;
                         
                     case ETAT_ESTIMATION_POSITION :
-                        wait_ms(100);
+                        /*wait_ms(100);
                         Rotate(3600);
                         EvitEtat = ETAT_ESTIMATION_POSITION_ROTATION_ACK;
                         waitingAckID = ASSERVISSEMENT_ROTATION;
+                        waitingAckFrom = ACKNOWLEDGE_MOTEUR;*/
+                        GoToPosition(1400,300,0,1);
+                        waitingAckID = ASSERVISSEMENT_XYT;
                         waitingAckFrom = ACKNOWLEDGE_MOTEUR;
                         break;
                         
                     case ETAT_ESTIMATION_POSITION_ROTATION_ACK:
                         if(waitingAckID == 0 && waitingAckFrom == 0)
+                        {
                             EvitEtat = ETAT_ESTIMATION_POSITION_ROTATION_ACK_END;
+                            waitingAckID_FIN = ASSERVISSEMENT_XYT;
+                            waitingAckFrom_FIN = INSTRUCTION_END_MOTEUR;
+                        }
                         break;
                         
                     case ETAT_ESTIMATION_POSITION_ROTATION_ACK_END:
-                        if(angle_moyen_balise_IR >= 13.5 && angle_moyen_balise_IR <= 14.5)
-                        {
-                            wait_ms(100);
-                            SendRawId(ASSERVISSEMENT_STOP);
-                            EvitEtat = ETAT_FIN_EVITEMENT;
-                        }
+                        if(waitingAckID == 0 && waitingAckFrom == 0)
+                            EvitEtat = ETAT_ESTIMATION_POSITION_ROTATION_ACK_END;
                         break;
                         
                     case ETAT_FIN_EVITEMENT:
+                        gameEtat = ETAT_WARNING_END_LAST_INSTRUCTION;
                         break;
                 }
             }
@@ -1749,7 +1839,6 @@
 void canProcessRx(void)
 {
     static signed char FIFO_occupation=0,FIFO_max_occupation=0;
-    char useless1 = 0;
     char message[10]="toto";
     char message1[10]="toto";
     char message2[10]="toto";
@@ -1804,6 +1893,7 @@
                 if(waitingAckFrom == msgRxBuffer[FIFO_lecture].id) {
                     waitingAckFrom = 0;//C'est la bonne carte qui indique qu'elle est en ligne
                 }
+                flag=1;
             break; 
             
            
@@ -1820,12 +1910,10 @@
             case INSTRUCTION_END_MOTEUR:
             case ACK_FIN_ACTION:
                 if(waitingAckFrom == msgRxBuffer[FIFO_lecture].id && ((unsigned short)msgRxBuffer[FIFO_lecture].data[0]|((unsigned short)(msgRxBuffer[FIFO_lecture].data[1])<<8) == waitingAckID)) {
-                    lcd.DisplayStringAt(0, LINE(16),(unsigned char *)"ACK OK",LEFT_MODE);
                     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;        
                 }
@@ -1841,28 +1929,6 @@
                 theta_robot=msgRxBuffer[FIFO_lecture].data[4]|((signed short)(msgRxBuffer[FIFO_lecture].data[5])<<8);
             break;
     
-            //case SERVO_AX12_SETGOAL:
-                //SendAck(0x114, SERVO_AX12_SETGOAL);
-                //if(AX12_isLocal(msgRxBuffer[FIFO_lecture].data[0]))
-                    //AX12_setGoal(msgRxBuffer[FIFO_lecture].data[0], msgRxBuffer[FIFO_lecture].data[1]|((unsigned short)(msgRxBuffer[FIFO_lecture].data[2])<<8), msgRxBuffer[FIFO_lecture].data[3]|((unsigned short)(msgRxBuffer[FIFO_lecture].data[4])<<8));
-                  
-            //break;
-            
-            /*case SERVO_AX12_PROCESS:
-                SendAck(0x114, SERVO_AX12_PROCESS);
-                //AX12_processChange(1);
-            break;
-            
-            case SERVO_AX12_DONE:
-                SendRawId(POMPE_PWM);
-                //SendAck(0x114, SERVO_AX12_DONE);
-                AX12_notifyCANEnd(((unsigned short)(msgRxBuffer[FIFO_lecture].data[0])));
-                
-                gameEtat = ETAT_GAME_LOAD_NEXT_INSTRUCTION;
-                waitingAckFrom = 0;
-                waitingAckID = 0;*/
-                
-            //break;
             case ACK_ACTION:
                 if(waitingAckID == msgRxBuffer[FIFO_lecture].id) {
                     waitingAckFrom = 0;
@@ -1882,15 +1948,31 @@
                 
                 if(debut_angle_detection > fin_angle_detection)
                 {
-                    angle_moyen_balise_IR = (float)debut_angle_detection + ((15.0-(float)debut_angle_detection)+(float)fin_angle_detection)/2.0;
-                    if(angle_moyen_balise_IR > 15.0)
-                        angle_moyen_balise_IR-=15.0;
+                    angle_moyen_balise_IR = (float)debut_angle_detection + ((15.0f-(float)debut_angle_detection)+(float)fin_angle_detection)/2.0f;
+                    if(angle_moyen_balise_IR > 15.0f)
+                        angle_moyen_balise_IR-=15.0f;
                 }
                 else
                     angle_moyen_balise_IR = debut_angle_detection + (fin_angle_detection-debut_angle_detection)/2;
                 
+                #ifdef ROBOT_BIG
+                float seuil_bas_avant = 12.0;  // >=
+                float seuil_haut_avant = 0.0; // <=
+                float seuil_bas_arriere = 4.0;
+                float seuil_haut_arriere = 8.0;
+                #else
+                float seuil_bas_avant = 13.0;
+                float seuil_haut_avant = 15.0;
+                float seuil_bas_arriere = 5.0;
+                float seuil_haut_arriere = 7.0;
+                #endif
                 
-                if (instruction.order != MV_TURN && instruction.order != ACTION ){ //J'ai rajouté cette ligne mais il faut tester avec et sans pour voir le comportement du robot, 
+                if (instruction.order == MV_LINE && instruction.direction == FORWARD  && angle_moyen_balise_IR >= seuil_bas_avant && angle_moyen_balise_IR <= seuil_haut_avant
+                    || instruction.order == MV_LINE && instruction.direction == BACKWARD && angle_moyen_balise_IR >= seuil_bas_arriere && angle_moyen_balise_IR <= 7
+                    || instruction.order == MV_COURBURE && angle_moyen_balise_IR >= seuil_bas_avant && angle_moyen_balise_IR <= seuil_haut_avant 
+                    || instruction.order == MV_COURBURE && angle_moyen_balise_IR >= seuil_bas_arriere  && angle_moyen_balise_IR <= seuil_haut_arriere
+                    || instruction.order == MV_XYT && angle_moyen_balise_IR >= seuil_bas_avant  && angle_moyen_balise_IR <= seuil_haut_avant
+                    || instruction.order == MV_XYT && angle_moyen_balise_IR >= seuil_bas_arriere  && angle_moyen_balise_IR <= seuil_haut_arriere ){ //J'ai rajouté cette ligne mais il faut tester avec et sans pour voir le comportement du robot, 
                     if(needToStop() != 0 && ingnorBaliseOnce ==0) {
                         if(gameEtat > ETAT_GAME_START && gameEtat != ETAT_WARNING_TIMEOUT)
                         {
@@ -1903,7 +1985,11 @@
                             gameEtat = ETAT_WARNING_TIMEOUT;
                         }
                     }
+                
                 }
+                
+                
+                
                 ingnorBaliseOnce = 0;
             break;
             
@@ -1934,7 +2020,7 @@
             
             case RECEPTION_DATA:
                 telemetreDistance=char_to_short_transformation(msgRxBuffer[FIFO_lecture].data[0], msgRxBuffer[FIFO_lecture].data[1]);
-                telemetreDistance= (float)telemetreDistance*100*35.5+50;
+                telemetreDistance= (float)telemetreDistance*100.0f*35.5f+50.0f;
                 waitingAckFrom = 0;
                 waitingAckID = 0;
                 break;
@@ -2122,11 +2208,15 @@
 
 void affichage_compteur (int nombre)
 {
-    int dizaine=0,unite=0;
+    int dizaine=0,unite=0,centaine=0;
+    centaine=nombre/100;
     dizaine = nombre/10;
     unite = nombre-(10*dizaine);
-    print_segment(unite,0);
-    print_segment(dizaine,200);
+    print_segment(unite,-50);
+    print_segment(dizaine,125);
+    if(centaine!=0){
+        print_segment(centaine,350);
+    }
     
 }
 
@@ -2164,6 +2254,7 @@
         
 void print_segment(int nombre, int decalage)
 {   
+
     switch(nombre)
     {
         case 0: