code avec modifs, programme mit dans les robots pour les derniers matchs

Dependencies:   mbed SerialHalfDuplex SDFileSystem liaison_Bluetooth ident_crac DISCO-F469NI_portrait

Files at this revision

API Documentation at this revision

Comitter:
gabrieltetar
Date:
Thu Jan 30 16:48:59 2020 +0000
Parent:
0:41cc45429aba
Child:
2:8fcdc11bd693
Commit message:
start

Changed in this revision

Conv_data_CAN/conv_data.cpp Show annotated file Show diff for this revision Revisions of this file
Conv_data_CAN/conv_data.h Show annotated file Show diff for this revision Revisions of this file
Evitement/Evitement.cpp Show annotated file Show diff for this revision Revisions of this file
Evitement/Evitement.h Show annotated file Show diff for this revision Revisions of this file
Globals/constantes.h Show annotated file Show diff for this revision Revisions of this file
Globals/global.h Show annotated file Show diff for this revision Revisions of this file
Globals/ident_crac.lib Show annotated file Show diff for this revision Revisions of this file
Globals/ident_crac_2.h Show annotated file Show diff for this revision Revisions of this file
Instruction/Instruction.cpp Show annotated file Show diff for this revision Revisions of this file
Instruction/Instruction.h Show annotated file Show diff for this revision Revisions of this file
Instruction/lecture_repertoire.cpp Show annotated file Show diff for this revision Revisions of this file
Instruction/lecture_repertoire.h Show annotated file Show diff for this revision Revisions of this file
Robots/Config_big.h Show annotated file Show diff for this revision Revisions of this file
Robots/StrategieManager.h Show annotated file Show diff for this revision Revisions of this file
Robots/Strategie_big.cpp Show annotated file Show diff for this revision Revisions of this file
Robots/Strategie_small.cpp Show annotated file Show diff for this revision Revisions of this file
SDFileSystem.lib Show annotated file Show diff for this revision Revisions of this file
SerialHalfDuplex.lib Show annotated file Show diff for this revision Revisions of this file
Strategie/DISCO-F469NI_portrait.lib Show annotated file Show diff for this revision Revisions of this file
Strategie/Strategie.cpp Show annotated file Show diff for this revision Revisions of this file
Strategie/Strategie.h Show annotated file Show diff for this revision Revisions of this file
Strategie/liaison_Bluetooth.lib Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Conv_data_CAN/conv_data.cpp	Thu Jan 30 16:48:59 2020 +0000
@@ -0,0 +1,19 @@
+#include "global.h"
+
+short char_to_short_transformation(char input1, char input2)
+{
+    short output = 0;
+    
+    output = input2<<8;
+    output += input1;
+    
+    return output;
+}
+
+void short_to_char_transformation(char* output1, char* output2, short input)
+{
+    *output1 = input & 0x00FF;
+    
+    *output2 = (input & 0xFF00)>>8;
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Conv_data_CAN/conv_data.h	Thu Jan 30 16:48:59 2020 +0000
@@ -0,0 +1,2 @@
+short char_to_short_transformation(char input1, char input2);
+void short_to_char_transformation(char* output1, char* output2, short input);
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Evitement/Evitement.cpp	Thu Jan 30 16:48:59 2020 +0000
@@ -0,0 +1,136 @@
+/*********************************************\
+|             Dodge algorithm                 |
+|           for CRAC Team  2020               |
+|             by Gabriel Tetar                |
+\*********************************************/
+
+//        TABLE
+   /*******************************************************\----> Y 0;3000
+   |        |                                     |        |
+   | JAUNE  |                                     | VIOLET |
+   |        |                                     |        |
+   |        |                                     |        |
+   |        |-------------------------------------|        | X 0;2000
+   |        |                                     |        |
+   |        |                                     |        |
+   |        |                                     |        |
+   |        |                                     |        |
+   O*******************************************************/
+
+
+#include "global.h"
+#include <math.h>
+#define M_PI 3.14159265358979323846f
+/****************************************************************************************/
+/* FUNCTION NAME: Balise Danger                                                         */
+/* DESCRIPTION  : FIFO -> BALISE_DANGER                                                 */
+/****************************************************************************************/
+unsigned short balise_danger(void){ 
+    SendSpeed(150);
+    return(0);
+}
+/****************************************************************************************/
+/* FUNCTION NAME: Balise Stop                                                           */
+/* DESCRIPTION  : FIFO -> BALISE_STOP                                                   */
+/****************************************************************************************/
+unsigned short balise_stop(signed char FIFO_lecture){ 
+    
+    signed char fin_angle_detection;
+    signed char debut_angle_detection;
+    float angle_moyen_balise_IR = 0.0;
+    
+    //on recupere l'info d'angle de detection--------------------------------------
+    if(msgRxBuffer[FIFO_lecture].data[0]!=0) { //data balise Petit Robot Detecte
+        fin_angle_detection = msgRxBuffer[FIFO_lecture].data[0] & 0x0F;
+        debut_angle_detection = (msgRxBuffer[FIFO_lecture].data[0] & 0xF0) >> 4;
+    } else { //data balise Gros Robot Detecte
+        fin_angle_detection = msgRxBuffer[FIFO_lecture].data[2] & 0x0F;
+        debut_angle_detection = (msgRxBuffer[FIFO_lecture].data[2] & 0xF0) >> 4;
+    }
+    //on moyenne l'angle------------------------------------------------------------
+    if(debut_angle_detection > fin_angle_detection) {
+        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 = 15.0;
+    float seuil_bas_arriere = 5.0;
+    float seuil_haut_arriere = 7.0;
+    #else 
+    float seuil_bas_arriere = 12.0; 
+    float seuil_haut_arriere = 15.0;
+    float seuil_bas_avant = 4.0;
+    float seuil_haut_avant = 7.0;
+    #endif 
+    if((angle_moyen_balise_IR>=seuil_bas_avant && angle_moyen_balise_IR<=seuil_haut_avant)) // || (angle_moyen_balise_IR>=seuil_bas_arriere && angle_moyen_balise_IR<=seuil_haut_arriere))
+        SendRawId(ASSERVISSEMENT_STOP);
+    return(0);
+}
+/****************************************************************************************/
+/* FUNCTION NAME: Balise end Danger                                                     */
+/* DESCRIPTION  : FIFO -> BALISE_END_DANGER                                             */
+/****************************************************************************************/
+unsigned short balise_end_danger(S_Instruction* instruction,S_Dodge_queue* dodgeq, E_stratGameEtat* gameEtat, signed short target_x_robot, signed short target_y_robot, signed short target_theta_robot, signed short theta_robot,signed short x_robot,signed short y_robot){
+    switch(instruction->order){
+        case MV_LINE:
+            *gameEtat=ETAT_GAME_PROCESS_INSTRUCTION;
+            instruction->order = MV_XYT;
+            instruction->arg1 = target_x_robot;// X
+            instruction->arg2 = target_y_robot;// Y
+            instruction->arg3 = target_theta_robot;// T
+        break;
+        case MV_TURN:
+            *gameEtat=ETAT_GAME_PROCESS_INSTRUCTION;
+            instruction->order = MV_XYT;
+            instruction->arg1 = target_x_robot;// X
+            instruction->arg2 = target_y_robot;// Y
+            instruction->arg3 = target_theta_robot;// T
+        break;
+        case MV_XYT:
+            *gameEtat=ETAT_GAME_PROCESS_INSTRUCTION;
+        break;
+        case MV_COURBURE:
+            unsigned short alpha;
+            *gameEtat=ETAT_GAME_PROCESS_INSTRUCTION;
+            instruction->order=MV_XYT;
+            if(instruction->direction==LEFT) alpha=(dodgeq->inst[0].arg3-theta_robot);
+            else alpha=(theta_robot-dodgeq->inst[0].arg3);   
+            if(alpha<450){
+                dodgeq->nb=0;
+                instruction->arg1=dodgeq->inst[0].arg1;//x
+                instruction->arg2=dodgeq->inst[0].arg2;//y
+                instruction->arg3=dodgeq->inst[0].arg3;//t
+            } else if(alpha<900){ 
+                dodgeq->nb=1;
+                instruction->arg1=dodgeq->inst[1].arg1;//x
+                instruction->arg2=dodgeq->inst[1].arg2;//y
+                instruction->arg3=dodgeq->inst[1].arg3;//t
+            } else if(alpha<1350){ 
+                dodgeq->nb=2;
+                instruction->arg1=dodgeq->inst[2].arg1;//x
+                instruction->arg2=dodgeq->inst[2].arg2;//y
+                instruction->arg3=dodgeq->inst[2].arg3;//t
+            } else if(alpha<1800){ 
+                dodgeq->nb=3;
+                instruction->arg1=dodgeq->inst[3].arg1;//x
+                instruction->arg2=dodgeq->inst[3].arg2;//y
+                instruction->arg3=dodgeq->inst[3].arg3;//t
+            } else if(alpha<2250){ 
+                dodgeq->nb=4;
+                instruction->arg1=dodgeq->inst[4].arg1;//x
+                instruction->arg2=dodgeq->inst[4].arg2;//y
+                instruction->arg3=dodgeq->inst[4].arg3;//t
+            } else { 
+                dodgeq->nb=5;
+                instruction->arg1=dodgeq->inst[5].arg1;//x
+                instruction->arg2=dodgeq->inst[5].arg2;//y
+                instruction->arg3=dodgeq->inst[5].arg3;//t
+            } 
+        break;
+        }
+    SendSpeed(300);
+    return(0);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Evitement/Evitement.h	Thu Jan 30 16:48:59 2020 +0000
@@ -0,0 +1,21 @@
+/*********************************************\
+|             Dodge algorithm                 |
+|           for CRAC Team  2020               |
+|             by Gabriel Tetar                |
+\*********************************************/
+#ifndef CRAC_EVITEMENT
+#define CRAC_EVITEMENT
+
+#define T_X 2000
+#define T_Y 3000
+
+unsigned short balise_danger(void);
+unsigned short balise_stop(signed char FIFO_lecture);
+unsigned short balise_end_danger(S_Instruction* instruction,S_Dodge_queue* dodgeq, E_stratGameEtat* gameEtat, signed short target_x_robot, signed short target_y_robot, signed short target_theta_robot, signed short theta_robot,signed short x_robot,signed short y_robot);
+
+
+
+
+
+#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Globals/constantes.h	Thu Jan 30 16:48:59 2020 +0000
@@ -0,0 +1,60 @@
+#ifndef CRAC_CONSTANTES
+#define CRAC_CONSTANTES
+// ****************************************************************************************
+// * CONSTANTES SYMBOLIQUES                                                               *
+// ****************************************************************************************
+#define ESPACE_INTER_TELEMETRE 149.98//PR 2019
+
+
+#define SIZE_FIFO               50 //Taille du buffer pour le bus CAN
+
+#define SIZE                    750 //Taille d'une ligne du fichier
+#define SIZE_BUFFER_FILE        150 //Taille du buffer d'instruction 
+
+
+/****
+** Variable à modifier en fonction du robot
+***/
+
+//------------------------------------sellection Robot---------------------
+//
+#define ROBOT_BIG //Si commenté Petit Robot,  si Décommenter Gros Robot
+
+#ifndef ROBOT_BIG       //  !!!!!!!! ne pas commenter
+    #define ROBOT_SMALL //  !!!!!!!! ne pas commenter
+#endif                  //  !!!!!!!! ne pas commenter
+ 
+//-------------------------------------------------------------------------
+
+
+#ifdef ROBOT_BIG
+
+    #define NOMBRE_CARTES           2//Le nombre de carte présente sur le gros robot
+    //#define POSITION_DEBUT_X 1830
+    //#define POSITION_DEBUT_Y 900
+    //#define POSITION_DEBUT_T 180
+    
+    #define POSITION_DEBUT_X 200
+    #define POSITION_DEBUT_Y 880
+    #define POSITION_DEBUT_T 0
+    #define MOITIEE_ROBOT    61
+    //#define POSITION_DEBUT_X 0
+    //#define POSITION_DEBUT_Y 0
+    //#define POSITION_DEBUT_T 0
+    
+    #define BALISE_TIMEOUT 5000
+    
+#else
+
+    #define NOMBRE_CARTES           2//Le nombre de carte présente sur le petit robot
+    #define POSITION_DEBUT_X 210
+    #define POSITION_DEBUT_Y 285
+    #define POSITION_DEBUT_T 0
+    #define MOITIEE_ROBOT 90
+    #define BALISE_TIMEOUT 2000
+    
+#endif
+
+
+
+#endif
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Globals/global.h	Thu Jan 30 16:48:59 2020 +0000
@@ -0,0 +1,69 @@
+#ifndef GLOBAL_H
+#define GLOBAL_H
+
+#include "mbed.h"
+#include "ident_crac.h"
+
+
+#include <CAN.h>
+#include <DirHandle.h>
+#include "SDFileSystem.h"
+#include "conv_data.h"
+#include "Config_big.h"
+#include "constantes.h"
+#include "Instruction.h"
+#include "Strategie.h"
+#include "lecture_repertoire.h"
+#include "StrategieManager.h"
+#include "SerialHalfDuplex.h"
+#include "debug.h"
+#include "Asservissement.h"
+#include "TS_DISCO_F469NI.h"
+#include "LCD_DISCO_F469NI.h"
+#include "fonts.h"
+#include "F469_GUI.hpp"
+#include "Config_big.h"
+#include "LiaisonBluetooth.h"
+#include "Evitement.h"
+
+//#include "peripheriques.h"
+extern Serial pc;
+extern Serial rn42_Tx;
+extern Serial rn42_Rx;
+extern Serial rn42_pr;
+extern LiaisonBluetooth liaison_Tx;
+extern LiaisonBluetooth liaison_Rx;
+extern LiaisonBluetooth liaison_pr;
+
+extern CAN can1;
+extern CAN can2;
+extern CANMessage msgRxBuffer[SIZE_FIFO];
+extern unsigned char FIFO_ecriture;
+extern char strat_sd[10][SIZE+8];
+extern char PATH[10][SIZE+8];
+
+extern signed char Strategie;
+
+extern int ack_bluetooth;
+
+extern DigitalOut led1,led2,led3,led4;
+extern LCD_DISCO_F469NI lcd;
+extern char cheminFileStart[SIZE+8]; //Le chemin du fichier de strat, utiliser strcpy(cheminFileStart,"/local/strat.txt");
+extern short SCORE_GLOBAL;
+extern short SCORE_PR, SCORE_GR;
+
+extern struct S_Instruction strat_instructions[SIZE_BUFFER_FILE]; //La liste des instruction chargé en mémoire
+extern unsigned char nb_instructions; //Le nombre d'instruction dans le fichier de strategie
+extern unsigned char actual_instruction;//La ligne de l'instruction en cours d'execution
+
+extern unsigned short telemetreDistance;
+extern char couleur1, couleur2, couleur3;
+extern unsigned char InversStrat;//Si à 1, indique que l'on part de l'autre cote de la table(inversion des Y)
+
+extern unsigned short waitingAckID;//L'id du ack attendu
+extern unsigned short waitingAckFrom;//La provenance du ack attendu
+extern char modeTelemetre; // Si à 1, indique que l'on attend une reponse du telemetre 
+extern unsigned short waitingId;
+
+extern unsigned char isStopEnable;
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Globals/ident_crac.lib	Thu Jan 30 16:48:59 2020 +0000
@@ -0,0 +1,1 @@
+https://os.mbed.com/teams/CRAC-Team/code/ident_crac/#f0b20feb32ba
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Globals/ident_crac_2.h	Thu Jan 30 16:48:59 2020 +0000
@@ -0,0 +1,233 @@
+#ifndef CRAC_IDENTH
+#define CRAC_IDENTH
+
+#define GLOBAL_GAME_END 0x004  // Stop fin du match
+#define GLOBAL_START 0x002  // Start
+#define GLOBAL_END_INIT_POSITION 0x005  // Fin positionnement robot avant depart
+#define GLOBAL_FUNNY_ACTION 0x007  // Funny action start  (0: start, 1: stop)
+#define GLOBAL_JACK 0x008
+#define ACKNOWLEDGE_JACK 0X009
+
+//#define BALISE_STOP 0x003  // Trame stop
+
+#define BALISE_DANGER 0xA  // Trame danger
+
+#define BALISE_END_DANGER 0xB  // Trame fin de danger
+
+
+#define ASSERVISSEMENT_STOP 0x001  // Stop moteur
+#define ASSERVISSEMENT_SPEED_DANGER 0x006  // Vitesse de danger
+
+#define ASSERVISSEMENT_XYT 0x020  // Asservissement (x,y,theta)  (0 : au choix 1 : avant -1 : arrière)
+#define ASSERVISSEMENT_XYT_ROTATE 0x030//premiere rotation durant xy theta
+#define ASSERVISSEMENT_XYT_LINE 0x040//ligne droite durant xy theta
+
+
+#define ASSERVISSEMENT_COURBURE 0x021  // Asservissement rayon de courbure  (+ gauche, - droite , sens : 1avt , -1arr; enchainement => 1 oui, 0 => non, 2=>derniére instruction de l'enchainement)
+#define ASSERVISSEMENT_CONFIG 0x022  // Asservissement paramètre  (définir les valeurs de vitesse max et d'eccélération max)
+#define ASSERVISSEMENT_ROTATION 0x023  // Asservissement rotation
+#define ASSERVISSEMENT_RECALAGE 0x024  // Moteur tout droit  (recalage : 0 mouvement seul, 1 x, 2y valeur : coordonnée à laquelle est recalé x/y; enchainement => 1 oui, 0 => non)
+#define ACTION_BIG_DEMARRAGE 0x025  // Action de départ du GR  (Lancement de la trajectoire de départ du GR)
+#define ODOMETRIE_BIG_POSITION 0x026  // Odométrie position robot  (Position actuel du robot)
+#define ODOMETRIE_BIG_VITESSE 0x027  // Odométrie vitesse  (Indication sur l'état actuel)
+#define ODOMETRIE_SMALL_POSITION 0x028  // Odométrie position robot  (Position actuel du robot)
+#define ODOMETRIE_SMALL_VITESSE 0x029  // Odométrie vitesse  (Indication sur l'état actuel)
+
+
+
+#define ASSERVISSEMENT_CONFIG_DECEL 0x019 // Asservissement paramètre  (définir les valeurs de vitesse max et de decélération max)
+
+
+//////////////////////////////////////////////////////////RESETS///////////////////////////////////////////////////
+#define RESET_BALISE 0x030  // Reset balise
+#define RESET_MOTEUR 0x031  // Reset moteur
+#define RESET_IHM 0x032  // Reset écran tactile
+#define RESET_ACTIONNEURS 0x033  // Reset actionneurs
+#define RESET_POMPES 0x034  // Reset pompes
+#define RESET_AX12 0x035  // Reset AX12
+#define RESET_TELEMETRE 0x036 // Reset telemetre
+
+
+
+#define RESET_STRAT 0x3A  // Reset stratégie
+
+//////////////////////////////////////////////////////////CHECK CARTES/////////////////////////////////////////////////
+#define CHECK_BALISE 0x060  // Check balise
+#define CHECK_MOTEUR 0x061  // Check moteur
+#define CHECK_IHM 0x062  // Check écran tactile
+#define CHECK_ACTIONNEURS_AVANT 0x063  // Check actionneurs
+#define CHECK_ACTIONNEURS_ARRIERE 0x064  // Check pompes
+#define CHECK_AX12 0x065  // Check AX12
+#define CHECK_OK_TELEMETRE 0x066 // Check telemetre
+
+//////////////////////////////////////////////////////////ACK CARTES///////////////////////////////////////////////////
+#define ALIVE_BALISE 0x070  // Alive balise
+#define ALIVE_MOTEUR 0x071  // Alive moteur
+#define ALIVE_IHM 0x072  // Alive écran tactile
+#define ALIVE_ACTIONNEURS_AVANT 0x073  // Alive actionneurs
+#define ALIVE_ACTIONNEURS_ARRIERE 0x074  // Alive pompes
+#define ALIVE_HERKULEX 0x075  // Alive AX12
+#define ALIVE_TELEMETRE 0x076 // Alive telemetre
+
+
+/////////////////////////////////////////////////////ACTIONS COMPLEXES/////////////////////////////////////////////////
+#define MONTER_IMMEUBLE_DOUBLE 0x090  // Monte deux immeubles selon un code couleur
+#define MONTER_IMMEUBLE 0x091
+#define ACK_ACTION 0x99 //autre action possible via les herkulex, ne peut pas passer en sendrawid
+
+
+
+/////////////////////////////////////////////////////////ACKS////////////////////////////////////////////////////////////
+#define ACKNOWLEDGE_BALISE 0x100  // Acknowledge balise
+#define ACKNOWLEDGE_MOTEUR 0x101  // Acknowledge moteur
+#define ACKNOWLEDGE_IHM 0x102  // Acknowledge ecran tactile
+#define ACKNOWLEDGE_ACTIONNEURS 0x103  // Acknowledge actionneurs
+#define ACKNOWLEDGE_POMPES 0x104  // Acknowledge pompes
+#define ACKNOWLEDGE_TELEMETRE 0x105 // Acknowledge telemetre
+#define ACKNOWLEDGE_HERKULEX 0x106 // Ack ax12
+#define ACKNOWLEDGE_STRAT 0x10A  // Acknowledge pompes
+#define ACKNOWLEDGE_CAMERA 0x108 //Acknowledge couleur caméra
+
+
+#define INSTRUCTION_END_BALISE 0x110  // Fin instruction balise  (Indique que l'instruction est terminée)
+#define INSTRUCTION_END_MOTEUR 0x111  // Fin instruction moteur  (Indique que l'instruction est terminée)
+#define INSTRUCTION_END_IHM 0x112  // Fin instruction ecran tactile  (Indique que l'instruction est terminée)
+#define INSTRUCTION_END_ACTIONNEURS 0x113  // Fin instruction actionneurs  (Indique que l'instruction est terminée)
+#define ACK_FIN_ACTION 0x116
+
+
+
+/////////////////////////////////////////////////////////ERREURS////////////////////////////////////////////////////////
+#define ERROR_OVERFLOW_BALISE 0x040  // Overflow odométrie
+#define ERROR_OVERFLOW_MOTEUR 0x041  // Overflow asservissement
+#define ERROR_OVERFLOW_IHM 0x042  // Overflow balise
+#define ERROR_OVERFLOW_STRAT 0x043  // Overflow stratégie
+#define ERROR_BALISE 0x785  // Bug balise
+#define ERROR_RTC 0x786  // Bug RTC
+#define ERROR_MOTEUR 0x787  // Bug moteur
+#define ERROR_TELEMETRIE 0x788  // Bug télémètre
+#define ERROR_STRATEGIE 0x789  // Bug stratégie
+
+
+
+/////////////////////////////////////////////////ACTIONS SIMPLES DU ROBOT/////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+//#define BAISSER_ATTRAPE_BLOC 0x220
+#define RELEVER_ATTRAPE_BLOC 0x221
+
+#define GABARIT_PETIT_ROBOT 0x200
+
+#define PRESENTOIR_AVANT 0x201
+#define PRESENTOIR_ARRIERE 0x202
+
+#define BALANCE_AVANT 0x203
+#define BALANCE_ARRIERE 0x204
+
+#define ACCELERATEUR_AVANT 0x205
+#define ACCELERATEUR_ARRIERE 0x206
+
+#define GOLDENIUM_AVANT 0x207
+#define GOLDENIUM_ARRIERE 0x208
+
+#define SOL_AVANT 0x209
+#define SOL_ARRIERE 0x210
+
+#define SOL_AVANT_RELACHE 0x211
+#define SOL_ARRIERE_RELACHE 0x212
+
+#define AVANT_RELACHE 0x213
+#define ARRIERE_RELACHE 0x214
+
+#define RECROQUEVILLER 0x215
+
+#define VENTOUSE_AV_CENTRE_BALANCE 0x216
+#define VENTOUSE_AR_CENTRE_BALANCE 0x217
+
+#define ACCELERATEUR_INSERTION_AVANT_GAUCHE 0X218
+#define ACCELERATEUR_INSERTION_DERRIERE_GAUCHE 0X219
+
+//commande pompe
+#define HACHEUR_GET_ATOM            0x520
+#define HACHEUR_GET_ATOM_ACK        0x521
+
+#define HACHEUR_RELEASE_ATOM 0x522
+#define HACHEUR_RELEASE_ATOM_ACK 0x523
+
+#define HACHEUR_GET_PRESENTOIR_AV   0x524
+#define HACHEUR_RELEASE_AV          0x525
+
+#define HACHEUR_GET_PRESENTOIR_AR   0x526
+#define HACHEUR_RELEASE_AR          0x527
+
+#define HACHEUR_STATUT_VENTOUSES    0x528
+
+//#define BAISSER_ATTRAPE_BLOC_AvG 0x222
+#define RELEVER_ATTRAPE_BLOC_AvG 0x223
+
+#define BAISSER_ATTRAPE_BLOC_AvD 0x224
+#define RELEVER_ATTRAPE_BLOC_AvD 0x225
+
+#define INTER_BAISSER_ATTRAPE_BLOC_AvG 0x226
+#define INTER_BAISSER_ATTRAPE_BLOC_AvD 0x227
+
+#define RANGER_ATTRAPE_BLOC_AvD 0x228
+#define RANGER_ATTRAPE_BLOC_AvG 0x229
+
+#define BRAS_VENTOUSE_1 0x22A
+#define BRAS_VENTOUSE_2 0x22B
+
+#define BRAS_ABEILLE_UP 0x202
+#define BRAS_ABEILLE_DOWN 0x203
+#define INCLINAISON_CHATEAU 0x204
+#define INCLINAISON_EPURATION 0x205
+#define ALLUMER_PANNEAU_UP 0x206
+#define ALLUMER_PANNEAU_DOWN 0x207
+#define BLOCAGE_BALLE 0x208
+#define LANCEMENT_MOTEUR_TIR_ON 0x209
+#define LANCEMENT_MOTEUR_TIR_OFF 0x20A
+#define AIGUILLEUR_CENTRE 0x20B
+#define AIGUILLEUR_GAUCHE 0x20C
+#define AIGUILLEUR_DROITE 0x20D
+#define TRI_BALLE 0x20E
+#define NO_BLOC 0x20F
+
+///////////////////////////////////////////CAPTEURS///////////////////////////////////////////////////////////////////
+#define DATA_TELEMETRE 0x310        // Demande sa valeur à un télémètre parmis les 
+#define RECEPTION_DATA 0x311        // envoi de la valeur d'un des télémètres
+#define TELEMETRE_OBJET 0x312
+#define OBJET_SUR_TABLE 0x313
+#define RECEPTION_RECALAGE 0x315    //Valeur des télémètres 
+#define DATA_RECALAGE 0x316         //Demande de la valeur de tous les télémètres afin de procèder au récalage
+#define LIRE_PANNEAU 0x317
+#define VIBRO 0x318
+
+
+#define DATA_TELEMETRE_LOGIQUE 0x319
+#define RECEPTION_TELEMETRE_LOGIQUE 0x320
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+///////////////////////////////////////////////////ENVOI DE PARAMETRES//////////////////////////////////////////////////
+#define CHOICE_COLOR 0x602  // Couleur  (0->VERT;1->ORANGE)
+#define RECEPTION_COULEUR 0x603 //Code Couleur
+#define ECRAN_ALL_CHECK 0x620  // Carte all check  (Si provient de carte strat => toutes les cartes sont en ligne, Si provient IHM => forcer le lancement)
+
+///////////////////////////////////////////////////////////DEBUGS///////////////////////////////////////////////////////
+#define DEBUG_STRATEGIE_AUTOMATE 0x760  // Etat automate stratégie  (Permet de savoir l'etat de l'automate)
+#define DEBUG_FAKE_JAKE 0x761  // Fake jack  (Permet d'outre passerr le JACk du robot)
+#define DEBUG_ASSERV 0x762  // Info debug carte moteur
+
+
+
+#define POMPE_PWM 0x9A  // pwm des pompes  (pwm entre 0 et 100)
+
+
+#define ASSERVISSEMENT_INFO_CONSIGNE 0x1F0  // Info Consigne et Commande moteur
+#define ASSERVISSEMENT_CONFIG_KPP_DROITE 0x1F1  // Config coef KPP_Droit
+#define ASSERVISSEMENT_CONFIG_KPI_DROITE 0x1F2  // Config coef KPI_Droit
+#define ASSERVISSEMENT_CONFIG_KPD_DROITE 0x1F3  // Config coef KPD_Droit
+#define ASSERVISSEMENT_CONFIG_KPP_GAUCHE 0x1F4  // Config coef KPP_Gauche
+#define ASSERVISSEMENT_CONFIG_KPI_GAUCHE 0x1F5  // Config coef KPI_Gauche
+#define ASSERVISSEMENT_CONFIG_KPD_GAUCHE 0x1F6  // Config coef KPD_Gauche
+#define ASSERVISSEMENT_ENABLE 0x1F7  // Activation asservissement  (0 : désactivation, 1 : activation)
+    
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Instruction/Instruction.cpp	Thu Jan 30 16:48:59 2020 +0000
@@ -0,0 +1,175 @@
+#include "global.h"
+
+
+
+
+
+
+SDFileSystem sd(PB_15, PB_14,PD_3,PH_6,"sd");
+
+enum E_InstructionType charToInstructionType(char type)
+{
+    switch(type)
+    {
+        case 'B': return MV_BEZIER;
+        case 'C': return MV_COURBURE;
+        case 'L': return MV_LINE;
+        case 'T': return MV_TURN;
+        case 'X': return MV_XYT;
+        case 'R': return MV_RECALAGE;
+        case 'A': return ACTION;
+        case 'P': return POSITION_DEBUT;
+        default:  return UNKNOWN;
+    }    
+}
+
+enum E_InstructionDirection charToInstructionDirection(char type)
+{
+    switch(type)
+    {
+        case 'B': return BACKWARD;
+        case 'F': return FORWARD;
+        case 'R': return RELATIVE;
+        case 'A': return ABSOLUTE;
+        case 'L': return LEFT;
+        default:  return NODIRECTION;
+    } 
+}
+
+enum E_InstructionPrecisionOuRecalage charToInstructionPrecisionOuRecalage(char type)
+{
+    switch(type)
+    {
+        case 'P': return PRECISION;
+        case 'X': return RECALAGE_X;
+        case 'Y': return RECALAGE_Y;
+        case 'T': return RECALAGE_T;
+        default:  return NOPRECISION;
+    } 
+}
+
+enum E_InstructionNextActionType charToInstructionNextActionType(char type)
+{
+    switch(type)
+    {
+        case 'J': return JUMP;
+        case 'W': return WAIT;
+        case 'E': return ENCHAINEMENT;
+        case 'M': return MECANIQUE;
+        case 'C': return CAPTEUR;
+        default:  return NONEXTACTION;
+    } 
+}
+
+enum E_InstructionNextActionJumpType charToInstructionNextActionJumpType(char type)
+{
+    switch(type)
+    {
+        case 'T': return JUMP_TIME;
+        case 'P': return JUMP_POSITION;
+        default:  return NONEXTACTIONJUMPTYPE;
+    } 
+}
+
+/****************************************************************************************/
+/* FUNCTION NAME: stringToInstruction                                                   */
+/* DESCRIPTION  : Conversion d'une ligne du fichier de strat en instruction             */
+/****************************************************************************************/
+struct S_Instruction stringToInstruction(char line[]) {
+    struct S_Instruction instruction;
+    
+    char instructionOrder;
+    char instructionDirection;
+    char instructionPrecision;
+    char instructionNextActionType;
+    char instructionJumpAction;
+    int errorCode = 0;
+    /*
+    Info sur la fonction sscanf
+    %d -> Entier signé
+    %u -> Entié non signé
+    %c -> char
+    */
+  errorCode = sscanf(line, "%hd,%c,%c,%hu,%hu,%hd,%c,%c,%c,%hu,%hu,%hd,%hd,%hu,%hu,%hd",
+        &instruction.lineNumber,
+        &instructionOrder,
+        &instructionDirection,
+        &instruction.arg1,
+        &instruction.arg2,
+        &instruction.arg3,
+        &instructionPrecision,
+        &instructionNextActionType,
+        &instructionJumpAction,
+        &instruction.JumpTimeOrX,
+        &instruction.JumpY,
+        &instruction.nextLineOK,
+        &instruction.nextLineError,
+        &instruction.arg4,
+        &instruction.arg5,
+        &instruction.arg6
+    );
+    /*
+    if(errorCode != 13) {
+        errorInstructionLoop();//L'instruction est pas bonne !!  
+    }*/
+    
+    instruction.order           = charToInstructionType(instructionOrder);
+    instruction.direction       = charToInstructionDirection(instructionDirection);
+    instruction.precision       = charToInstructionPrecisionOuRecalage(instructionPrecision);
+    instruction.nextActionType  = charToInstructionNextActionType(instructionNextActionType);
+    instruction.jumpAction      = charToInstructionNextActionJumpType(instructionJumpAction);
+    
+    
+    return instruction;
+}
+
+/****************************************************************************************/
+/* FUNCTION NAME: loadAllInstruction                                                    */
+/* DESCRIPTION  : Charger toutes les instructions du fichier de stratégie               */
+/*  Il faut utiliser strcpy(cheminFileStart,"/local/strat.txt");                        */
+/*   pour indiquer le fichier à utiliser                                                */
+/****************************************************************************************/
+void loadAllInstruction( signed char Strategie) {
+    
+    struct S_Instruction instruction;
+    char LineBuffer[SIZE];
+    printf("Reading file : ");
+    printf(strat_sd[Strategie]);
+    printf("\n");
+    strcpy(PATH[Strategie],"/sd/");
+    strcat(PATH[Strategie],strat_sd[Strategie]);
+    strcat(PATH[Strategie],".txt");
+    FILE *testFile = fopen(PATH[Strategie], "rt"); //Ouverture du fichier en mode lecture seul au format string
+    
+    nb_instructions = 0;
+    while (fgets(LineBuffer, SIZE, testFile) != NULL)  {
+        instruction = stringToInstruction(LineBuffer);
+        strat_instructions[nb_instructions] = instruction;
+        if(strat_instructions[nb_instructions].order == UNKNOWN) {
+            Button STRAT_1 (0, 30, 190, 110, PATH[Strategie]);
+            STRAT_1.Draw(0xFFF0F0F0, 0);
+            errorInstructionLoop();//L'instruction est pas bonne !!   
+        }
+        //printf(LineBuffer);
+        //debug_Instruction(instruction);
+        nb_instructions++;
+    }
+    printf("nb instruction = %d\n",nb_instructions);
+    fclose(testFile);
+    
+}
+
+/****************************************************************************************/
+/* FUNCTION NAME: FileExists                                                            */
+/* DESCRIPTION  : Permet de vérifier si un fichier existe                               */
+/****************************************************************************************/
+int FileExists(const char *fname)
+{
+    FILE *file;
+    if (file == fopen(fname, "r"))
+    {
+        fclose(file);
+        return 1;
+    }
+    return 0;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Instruction/Instruction.h	Thu Jan 30 16:48:59 2020 +0000
@@ -0,0 +1,126 @@
+#ifndef CRAC_INSTRUCTION
+#define CRAC_INSTRUCTION
+
+#define caca 40
+
+enum E_InstructionType
+{
+    MV_BEZIER,
+    MV_COURBURE,    // C -> Courbure
+    MV_LINE,        // L -> Ligne droite
+    MV_TURN,        // T -> Rotation sur place
+    MV_XYT,         // X -> Aller à
+    MV_RECALAGE,    // R -> Recalage bordure
+    ACTION,         // A -> Action
+    UNKNOWN,        // Erreur, instruction inconnue
+    POSITION_DEBUT  // P
+};
+enum E_InstructionDirection
+{
+    NODIRECTION,     // N -> Parametre absent
+    BACKWARD,
+    FORWARD,
+    RELATIVE,
+    ABSOLUTE,
+    LEFT,
+    RIGHT
+};
+enum E_InstructionPrecisionOuRecalage
+{
+    NOPRECISION,// N -> Parametre absent
+    PRECISION,  // P -> Precision, verifier la position à la fin du mouvement et refaire un XYT si erreur > 1cm
+    RECALAGE_X, // X -> Recalage en X, indique un recalage sur l'axe X
+    RECALAGE_Y,  // Y -> Recalage en Y, indique un recalage sur l'axe Y
+    RECALAGE_T
+};
+enum E_InstructionNextActionType
+{
+    NONEXTACTION,    // N -> Parametre absent
+    JUMP, 
+    WAIT,
+    ENCHAINEMENT,
+    MECANIQUE,
+    CAPTEUR
+};
+enum E_InstructionNextActionJumpType
+{
+    NONEXTACTIONJUMPTYPE,    // N -> Parametre absent
+    JUMP_TIME,
+    JUMP_POSITION
+};
+struct S_Instruction
+{
+    short lineNumber;//Numéro de la ligne
+    enum E_InstructionType order; //Type de l'instruction
+    enum E_InstructionDirection direction; //BackWard ou Forward || Relative ou Absolu
+    
+    unsigned short  arg1;
+    unsigned short  arg2;
+    signed   short  arg3;
+    
+    enum E_InstructionPrecisionOuRecalage    precision;
+    enum E_InstructionNextActionType         nextActionType;
+    enum E_InstructionNextActionJumpType     jumpAction;
+    unsigned short JumpTimeOrX;
+    unsigned short JumpY;
+    unsigned short nextLineOK;
+    unsigned short nextLineError;
+    
+    unsigned short  arg4;
+    unsigned short  arg5;
+    signed   short  arg6;
+};
+
+struct S_Dodge_queue
+{
+    unsigned short nb;//Nombre d action en file dattente [0,9]
+    struct S_Instruction inst[10];
+};
+
+/**
+* Convertir un char en type d'instruction
+**/
+enum E_InstructionType charToInstructionType(char type);
+
+/**
+* 
+**/
+enum E_InstructionDirection charToInstructionDirection(char type);
+
+/**
+* Convertir un char 
+**/
+enum E_InstructionPrecisionOuRecalage charToInstructionPrecisionOuRecalage(char type);
+
+/**
+* 
+**/
+enum E_InstructionNextActionType charToInstructionNextActionType(char type);
+
+/**
+* 
+**/
+enum E_InstructionNextActionJumpType charToInstructionNextActionJumpType(char type);
+
+/****************************************************************************************/
+/* FUNCTION NAME: stringToInstruction                                                   */
+/* DESCRIPTION  : Conversion d'une ligne du fichier de strat en instruction             */
+/****************************************************************************************/
+struct S_Instruction stringToInstruction(char line[]);
+
+/****************************************************************************************/
+/* FUNCTION NAME: loadAllInstruction                                                    */
+/* DESCRIPTION  : Charger toutes les instructions du fichier de stratégie               */
+/*  Il faut utiliser strcpy(cheminFileStart,"/local/strat.txt");                        */
+/*   pour indiquer le fichier à utiliser                                                */
+/****************************************************************************************/
+void loadAllInstruction( signed char Strategie);
+
+/****************************************************************************************/
+/* FUNCTION NAME: FileExists                                                            */
+/* DESCRIPTION  : Permet de vérifier si un fichier existe                               */
+/****************************************************************************************/
+int FileExists(const char *fname);
+
+
+#endif
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Instruction/lecture_repertoire.cpp	Thu Jan 30 16:48:59 2020 +0000
@@ -0,0 +1,38 @@
+#include "global.h"
+
+
+struct dirent* files_name[10];
+char *rest;
+
+
+void lecture_fichier(void){
+    short i,j;
+
+    DIR* rep = NULL;
+
+    mkdir("/sd", 0777);
+    strcpy(cheminFileStart,"/sd");
+    rep=opendir("/sd");
+    
+    for(i=0;i<20;i++){
+        files_name[i]= readdir(rep);  
+                
+        if(files_name[i]->d_name==""){
+            i=20;
+        }
+        else{
+            strcpy(strat_sd[i-j],files_name[i]->d_name);
+            rest=strstr(strat_sd[i-j],".txt");
+            
+            if(rest==NULL){
+                strcpy(strat_sd[i-j],"");
+                j++;
+            }
+            else{
+                strcpy(strat_sd[i-j],strtok(strat_sd[i-j],"."));
+            }
+            
+        }
+    }
+}
+        
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Instruction/lecture_repertoire.h	Thu Jan 30 16:48:59 2020 +0000
@@ -0,0 +1,3 @@
+
+
+void lecture_fichier(void);
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Robots/Config_big.h	Thu Jan 30 16:48:59 2020 +0000
@@ -0,0 +1,61 @@
+#ifndef CRAC_CONFIG_BIG
+#define CRAC_CONFIG_BIG
+/**
+Fichier de configuration des action specifique au gros robot
+**/
+#define BRAS_AVANT 1
+#define BRAS_ARRIERE  2
+
+#define INV 1
+
+#define AX12_MODULE_AV 0x0C
+#define AX12_MODULE_AV_INV 0x0E
+
+#define AX12_MODULE_AR 0x20Z
+#define AX12_MODULE_AR_INV 0x22
+
+
+#define AX12_ID_PINCE_ARRIERE_HAUTE_GAUCHE  18
+#define AX12_ID_PINCE_ARRIERE_HAUTE_DROITE  15
+#define AX12_ID_PINCE_ARRIERE_BASSE_GAUCHE  13
+#define AX12_ID_PINCE_ARRIERE_BASSE_DROITE  14
+#define AX12_ID_PORTE_ARRIERE_DROITE        4
+#define AX12_ID_PORTE_ARRIERE_GAUCHE        5
+#define AX12_ID_FUNNY_ACTION                1
+#define AX12_ID_CHARIOT                     2
+#define AX12_ID_PEIGNE                      3
+#define AX12_ID_PORTE_AVANT_DROITE          11
+#define AX12_ID_PORTE_AVANT_GAUCHE          6
+#define AX12_ID_VENTOUSE                    8
+#define AX12_ID_CONE                        7
+
+#define AX12_ANGLE_FUNNY_ACTION_CLOSE       150
+#define AX12_ANGLE_FUNNY_ACTION_OPEN        95
+
+
+
+#define AX12_ANGLE_PORTE_AVANT_GAUCHE_OUVERTE   18
+#define AX12_ANGLE_PORTE_AVANT_GAUCHE_FERMER    120
+#define AX12_ANGLE_PORTE_AVANT_DROITE_OUVERTE   280
+#define AX12_ANGLE_PORTE_AVANT_DROITE_FERMER    183
+
+#define AX12_ANGLE_PEIGNE_UP 60
+#define AX12_ANGLE_PEIGNE_DOWN 120
+
+#define AX12_ANGLE_VENTOUSE_UP      150
+#define AX12_ANGLE_VENTOUSE_DOWN    130
+
+#define AX12_ANGLE_CONE_INSIDE  45
+#define AX12_ANGLE_CONE_OUTSIDE 155
+
+
+
+#define AX12_SPEED_FUNNY_ACTION             100
+#define AX12_SPEED_VENTOUSE                 100
+#define AX12_SPEED_PEIGNE                   500
+
+#define POMPES_PWM 100
+
+
+
+#endif
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Robots/StrategieManager.h	Thu Jan 30 16:48:59 2020 +0000
@@ -0,0 +1,55 @@
+#ifndef CRAC_STRATEGIE_BIG
+#define CRAC_STRATEGIE_BIG
+
+#include "global.h"
+
+/****************************************************************************************/
+/* FUNCTION NAME: doFunnyAction                                                         */
+/* DESCRIPTION  : Permet de faire la funny action en fin de partie                      */
+/****************************************************************************************/
+void doFunnyAction(void);
+
+/****************************************************************************************/
+/* FUNCTION NAME: doAction                                                              */
+/* DESCRIPTION  : Effectuer une action specifique                                       */
+/****************************************************************************************/
+unsigned char doAction(unsigned char id, unsigned short speed, short angle);
+
+/****************************************************************************************/
+/* FUNCTION NAME: initRobot                                                             */
+/* DESCRIPTION  : initialiser le robot                                                  */
+/****************************************************************************************/
+//void initRobot(void);
+
+/****************************************************************************************/
+/* FUNCTION NAME: initRobotActionneur                                                   */
+/* DESCRIPTION  : Initialiser la position des actionneurs du robot                      */
+/****************************************************************************************/
+//void initRobotActionneur(void);
+
+/****************************************************************************************/
+/* FUNCTION NAME: runTest                                                               */
+/* DESCRIPTION  : tester l'ensemble des actionneurs du robot                            */
+/****************************************************************************************/
+void runRobotTest(void);
+
+/****************************************************************************************/
+/* FUNCTION NAME: SelectStrategy                                                        */
+/* DESCRIPTION  : Charger le fichier de stratégie correspondante à un id                */
+/* RETURN       : 0=> Erreur, 1=> OK si le fichier existe                               */
+/****************************************************************************************/
+int SelectStrategy(unsigned char id);
+
+/****************************************************************************************/
+/* FUNCTION NAME: needToStop                                                            */
+/* DESCRIPTION  : Savoir si il faut autoriser le stop du robot via balise               */
+/****************************************************************************************/
+unsigned char needToStop(void);
+
+/****************************************************************************************/
+/* FUNCTION NAME: doBeforeEndAction                                                     */
+/* DESCRIPTION  : Terminer les actions du robot 1s avant la fin du match                */
+/****************************************************************************************/
+void doBeforeEndAction(void);
+
+#endif
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Robots/Strategie_big.cpp	Thu Jan 30 16:48:59 2020 +0000
@@ -0,0 +1,305 @@
+#include "global.h"
+#ifdef ROBOT_BIG
+
+unsigned short x;
+unsigned short y;
+unsigned char isStopEnable = 1;//Permet de savoir si il faut autoriser le stop via les balises
+
+/****************************************************************************************/
+/* FUNCTION NAME: doFunnyAction                                                         */
+/* DESCRIPTION  : Permet de faire la funny action en fin de partie                      */
+/****************************************************************************************/
+void doFunnyAction(void)
+{
+    //envoie de la funny action
+    // 0x007, 01, 01
+    CANMessage msgTx=CANMessage();
+    msgTx.id=GLOBAL_FUNNY_ACTION;
+    msgTx.format=CANStandard;
+    msgTx.type=CANData;
+    msgTx.len=2;
+    msgTx.data[0]=0x01;
+    msgTx.data[1]=0x01;
+    can1.write(msgTx);
+}
+
+/****************************************************************************************/
+/* FUNCTION NAME: doAction                                                              */
+/* DESCRIPTION  : Effectuer une action specifique                                       */
+/****************************************************************************************/
+unsigned char doAction(unsigned char id, unsigned short var1, short var2)
+{
+    CANMessage msgTx=CANMessage();
+    msgTx.format=CANStandard;
+    msgTx.type=CANData;
+    //affichage_debug(id);
+
+    switch(id) {
+        /////////////////////////////////////////////////////////100 à 108 : ACTIONS HERKULEX/////////////////////////////////////////////
+        case 118:
+            SendRawId(VENTOUSE_AV_CENTRE_BALANCE);
+            break;
+
+        case 201:
+            unsigned char var_tempo;
+            var_tempo = (unsigned char)var1;//0auto 1forceon 2 forceoff
+            SendMsgCan(ASCENSEUR, &var_tempo,1);
+            waitingAckFrom = 0;
+            waitingAckID =0;
+            break;
+
+        case 202:
+            msgTx.id=VIDER_CONVOYEUR;
+            msgTx.len=1;
+            msgTx.data[0]=(unsigned char)var1; //
+            can2.write(msgTx);
+            break;
+
+        case 203:
+            x = var1;
+            if(InversStrat == 1) {
+                y = 3000 - var2;
+            } else {
+                y = var2;
+            }
+            Send2Short(GOLDENIUM_AVANT, x, y);
+            break;
+
+        case 204:
+            unsigned char arg_tempo;
+            if(InversStrat == 1) {
+                switch(var1) {
+                    case AV_DROIT:
+                        arg_tempo = AV_GAUCHE;
+                        break;
+                    case AV_GAUCHE:
+                        arg_tempo = AV_DROIT;
+                        break;
+                    default :
+                        arg_tempo =(unsigned char)var1;
+                        break;
+                }
+
+            } else arg_tempo =(unsigned char)var1;
+            SendMsgCan(HACHEUR_RELEASE_ATOM, &arg_tempo,1);
+            waitingAckFrom = 0;
+            waitingAckID =0;
+            break;
+
+        case 205:
+            SendRawId(PRESENTOIR_AVANT);
+            break;
+            
+        case 206:
+            SendMsgCan(RATEAU, (unsigned char*)&var1,1);
+            break;
+
+
+        case 150:
+            SCORE_GR+=var1;
+            SCORE_GLOBAL=SCORE_GR+SCORE_PR;
+            //liaison_Tx.envoyer_short(0x30,SCORE_GLOBAL);
+            waitingAckFrom = 0;
+            waitingAckID = 0;
+            break;
+
+
+        case 11://0 Désactiver le stop,1 Activer le stop saut de strat,2 Activer le stop avec evitement
+            isStopEnable =(unsigned char) var1;
+            // SendMsgCan(0x5BC, &isStopEnable,1);
+            waitingAckFrom = 0;
+            waitingAckID =0;
+            break;
+
+        case 20://Désactiver l'asservissement
+            setAsservissementEtat(0);
+            break;
+
+        case 21://Activer l'asservissement
+            setAsservissementEtat(1);
+            break;
+
+        case 22://Changer la vitesse du robot
+            SendSpeed(var1);
+            waitingAckFrom = 0;
+            waitingAckID = 0;
+            wait(0.2);
+            break;
+
+        case 23:
+            SendAccel((unsigned short)var1,(unsigned short)var2);//,(unsigned short)arg2, (unsigned short)arg2);
+            wait_us(200);
+            waitingAckFrom = 0;
+            waitingAckID = 0;
+            break;
+
+        case 30://Action tempo
+            wait_ms(var1);
+            waitingAckFrom = 0;
+            waitingAckID = 0;
+            break;
+
+
+
+        default:
+            return 0;//L'action n'existe pas, il faut utiliser le CAN
+
+    }
+    return 1;//L'action est spécifique.
+
+}
+
+/****************************************************************************************/
+/* FUNCTION NAME: initRobot                                                             */
+/* DESCRIPTION  : initialiser le robot                                                  */
+/****************************************************************************************/
+void initRobot(void)
+{
+    //Enregistrement de tous les AX12 présent sur la carte
+    /*AX12_register(5,  AX12_SERIAL2);
+    AX12_register(18, AX12_SERIAL2);
+    AX12_register(13, AX12_SERIAL2);
+    AX12_register(1,  AX12_SERIAL1);
+    AX12_register(11,  AX12_SERIAL1);
+    AX12_register(8,  AX12_SERIAL1);
+    AX12_register(7,  AX12_SERIAL2);*/
+
+    //AX12_setGoal(AX12_ID_FUNNY_ACTION, AX12_ANGLE_FUNNY_ACTION_CLOSE,AX12_SPEED_FUNNY_ACTION);
+    //AX12_processChange();
+    //runRobotTest();
+
+}
+
+/****************************************************************************************/
+/* FUNCTION NAME: initRobotActionneur                                                   */
+/* DESCRIPTION  : Initialiser la position des actionneurs du robot                      */
+/****************************************************************************************/
+void initRobotActionneur(void)
+{
+    /*doAction(100,1,0);
+    doAction(100,2,0);
+    doAction(110,0,0);
+    doAction(120,0,0);
+    doAction(131,0,0);*/
+
+}
+
+/****************************************************************************************/
+/* FUNCTION NAME: runTest                                                               */
+/* DESCRIPTION  : tester l'ensemble des actionneurs du robot                            */
+/****************************************************************************************/
+void runRobotTest(void)
+{
+    /*
+    int waitTime = 500;
+
+    //Test des AX12 dans l'ordre
+    doAction(111,0,0);//Fermeture pince arrière haute
+    wait_ms(waitTime);
+    doAction(110,0,0);//Ouverture pince arrière haute
+    wait_ms(waitTime);
+    doAction(113,0,0);//Fermeture pince arrière basse
+    wait_ms(waitTime);
+    doAction(112,0,0);//Ouverture pince arrière basse
+    wait_ms(waitTime);
+    doAction(115,0,0);//Fermeture porte arrière
+    wait_ms(waitTime);
+    doAction(114,0,0);//Ouverture porte arrière
+    wait_ms(waitTime);
+    doAction(101,0,0);//Fermer les portes avant
+    wait_ms(waitTime);
+    doAction(100,0,0);//Ouvrir les portes avant
+    wait_ms(waitTime);
+    doAction(103,0,0);//Descendre le peigne
+    wait_ms(waitTime);
+    doAction(102,0,0);//Remonter le peigne*/
+}
+
+/****************************************************************************************/
+/* FUNCTION NAME: SelectStrategy                                                        */
+/* DESCRIPTION  : Charger le fichier de stratégie correspondante à un id                */
+/* RETURN       : 0=> Erreur, 1=> OK si le fichier existe                               */
+/****************************************************************************************/
+/*int SelectStrategy(unsigned char id)
+{
+    switch(id)
+    {
+        // strat de match
+        case 1:
+            strcpy(cheminFileStart,"/local/strat1.txt");
+            return FileExists(cheminFileStart);
+        case 2:
+            strcpy(cheminFileStart,"/local/strat2.txt");
+            return FileExists(cheminFileStart);
+        case 3:
+            strcpy(cheminFileStart,"/local/strat3.txt");
+            return FileExists(cheminFileStart);
+        case 4:
+            strcpy(cheminFileStart,"/local/strat4.txt");
+            return FileExists(cheminFileStart);
+        case 5:
+            strcpy(cheminFileStart,"/local/strat5.txt");
+            return FileExists(cheminFileStart);
+        case 6:
+            strcpy(cheminFileStart,"/local/strat6.txt");
+            return FileExists(cheminFileStart);
+        case 7:
+            strcpy(cheminFileStart,"/local/strat7.txt");
+            return FileExists(cheminFileStart);
+        case 8:
+            strcpy(cheminFileStart,"/local/strat8.txt");
+            return FileExists(cheminFileStart);
+        case 9:
+            strcpy(cheminFileStart,"/local/strat9.txt");
+            return FileExists(cheminFileStart);
+        case 10:
+            strcpy(cheminFileStart,"/local/strat10.txt");
+            return FileExists(cheminFileStart);
+
+        // strat de demo
+        case 0x10:
+            strcpy(cheminFileStart,"/local/moteur.txt");
+            return FileExists(cheminFileStart);
+        case 0x11:
+#ifdef ROBOT_BIG
+            strcpy(cheminFileStart,"/local/bras.txt");
+#else
+            strcpy(cheminFileStart,"/local/porteAvant.txt");
+#endif
+            return FileExists(cheminFileStart);
+        case 0x12:
+#ifdef ROBOT_BIG
+            strcpy(cheminFileStart,"/local/balancier.txt");
+#else
+            strcpy(cheminFileStart,"/local/mainTourneuse.txt");
+#endif
+            return FileExists(cheminFileStart);
+        default:
+            strcpy(cheminFileStart,"/local/strat1.txt");
+            return 0;
+    }
+}*/
+
+/****************************************************************************************/
+/* FUNCTION NAME: needToStop                                                            */
+/* DESCRIPTION  : Savoir si il faut autoriser le stop du robot via balise               */
+/****************************************************************************************/
+unsigned char needToStop(void)
+{
+    return isStopEnable;
+}
+
+/****************************************************************************************/
+/* FUNCTION NAME: doBeforeEndAction                                                     */
+/* DESCRIPTION  : Terminer les actions du robot 1s avant la fin du match                */
+/****************************************************************************************/
+void doBeforeEndAction(void)
+{
+    doAction(110,0,0);//Ouverture pince arrière haute
+    doAction(112,0,0);//Ouverture pince arrière basse
+    doAction(114,0,0);//Ouverture porte arrière
+    doAction(100,0,0);//Ouvrir les portes avant
+    doAction(102,0,0);//Remonter le peigne
+}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Robots/Strategie_small.cpp	Thu Jan 30 16:48:59 2020 +0000
@@ -0,0 +1,235 @@
+#include "global.h"
+
+#ifdef ROBOT_SMALL
+
+unsigned short distance_recalage;
+unsigned short distance_revenir;
+
+unsigned short x;
+unsigned short y;
+unsigned char isStopEnable = 1;//Permet de savoir si il faut autoriser le stop via les balises
+//unsigned short telemetreDistance;
+
+
+/****************************************************************************************/
+/* FUNCTION NAME: doFunnyAction                                                         */
+/* DESCRIPTION  : Permet de faire la funny action en fin de partie                      */
+/****************************************************************************************/
+void doFunnyAction(void)
+{
+
+
+}
+
+
+/*************************************************************************************************/
+/* FUNCTION NAME: doAction                                                                       */
+/* DESCRIPTION  : Effectuer une action specifique correspondant au numéro dans le fichier strat  */
+/*************************************************************************************************/
+unsigned char doAction(unsigned char id, unsigned short arg1, short arg2)
+{
+    int retour = 1;
+    CANMessage msgTx=CANMessage();
+    msgTx.format=CANStandard;
+    msgTx.type=CANData;
+    //SendMsgCan(0x5BB, &id,1);
+    switch(id) {
+        case 101: //bras gabarit
+            SendRawId(GABARIT_PETIT_ROBOT);
+            break;
+        case 102: //attraper presentoir avant
+            SendRawId(PRESENTOIR_AVANT);
+            break;
+        case 103: //attraper presentoir arriere
+            SendRawId(PRESENTOIR_ARRIERE);
+            break;
+        case 104: //balance avant
+            SendRawId(BALANCE_AVANT);
+            break;
+        case 105: //balance arriere
+            SendRawId(BALANCE_ARRIERE);
+            break;
+        case 106: //accelerateur avant
+            //SendRawId(ACCELERATEUR_AVANT);
+            distance_recalage=arg1;
+            distance_revenir=arg2;
+            Send2Short(ACCELERATEUR_AVANT, distance_recalage,distance_revenir);
+            break;
+        case 107: //accelerateur arriere
+            distance_recalage=arg1;
+            distance_revenir=arg2;
+            Send2Short(ACCELERATEUR_ARRIERE, distance_recalage,distance_revenir);
+            break;
+        case 108: //goldenium avant
+            //SendRawId(GOLDENIUM_AVANT);
+            x = arg1;
+            if(InversStrat == 1) {
+                y = 3000 - arg2;
+            } else {
+                y = arg2;
+            }
+            Send2Short(GOLDENIUM_AVANT, x, y);
+            break;
+        case 109: //goldenium arriere
+            x=arg1;
+            y=arg2;
+            Send2Short(GOLDENIUM_ARRIERE, x,y);
+            break;
+        case 110: //sol avant
+            SendRawId(SOL_AVANT);
+            break;
+        case 111: //sol arriere
+            SendRawId(SOL_ARRIERE);
+            break;
+        case 112: //sol avant relache
+            SendRawId(SOL_AVANT_RELACHE);
+            break;
+        case 113: //sol arriere relache
+            SendRawId(SOL_ARRIERE_RELACHE);
+            break;
+        case 114://relache les 3 ventouses avants
+            SendRawId(AVANT_RELACHE);
+            break;
+
+        case 115://relache les 3 ventouses arrieres
+            SendRawId(ARRIERE_RELACHE);
+            break;
+
+        case 116://relache une pompe
+            unsigned char arg_tempo;
+            if(InversStrat == 1) {
+                switch(arg1) {
+                    case AV_DROIT:
+                        arg_tempo = AV_GAUCHE;
+                        break;
+                    case AV_GAUCHE:
+                        arg_tempo = AV_DROIT;
+                        break;
+                    case AR_DROIT:
+                        arg_tempo = AR_GAUCHE;
+                        break;
+                    case AR_GAUCHE:
+                        arg_tempo = AR_DROIT;
+                        break;
+                    default :
+                        arg_tempo =(unsigned char)arg1;
+                        break;
+                }
+
+            } else arg_tempo =(unsigned char)arg1;
+            SendMsgCan(HACHEUR_RELEASE_ATOM, &arg_tempo,1);
+            waitingAckFrom = 0;
+            waitingAckID =0;
+            break;
+        case 117:
+            SendRawId(RECROQUEVILLER);
+            break;
+        case 118:
+            SendRawId(VENTOUSE_AV_CENTRE_BALANCE);
+            break;
+        case 119:
+            SendRawId(VENTOUSE_AR_CENTRE_BALANCE);
+            break;
+        case 120:
+            SendRawId(ACCELERATEUR_INSERTION_AVANT_GAUCHE);
+            break;
+
+        case 121:
+            SendRawId(ACCELERATEUR_INSERTION_ARRIERE_GAUCHE);
+            break;
+
+        case 150:
+            SCORE_PR+=arg1;
+            liaison_Tx.envoyer_short(0x30,SCORE_PR);
+            waitingAckFrom = 0;
+            waitingAckID = 0;
+            break;
+
+
+        case 200 :
+            SendRawId(DATA_TELEMETRE);
+            /*telemetreDistance = dataTelemetre();
+            wait_ms(1);
+            telemetreDistance = dataTelemetre();
+            telemetreDistance = telemetreDistance - 170;*/
+            break;
+
+        case 201 :
+            SendRawId(0x99);//
+            retour = 2;
+            break;
+
+
+        case 11://0 Désactiver le stop,1 Activer le stop saut de strat,2 Activer le stop avec evitement
+            isStopEnable =(unsigned char) arg1;
+            // SendMsgCan(0x5BC, &isStopEnable,1);
+            waitingAckFrom = 0;
+            waitingAckID =0;
+            break;
+
+
+
+        case 20://Désactiver l'asservissement
+            setAsservissementEtat(0);
+            break;
+
+        case 21://Activer l'asservissement
+            setAsservissementEtat(1);
+            break;
+
+        case 22://Changer la vitesse du robot
+            SendSpeed(arg1);//,(unsigned short)arg2, (unsigned short)arg2);
+            wait_us(200);
+            waitingAckFrom = 0;
+            waitingAckID = 0;
+            break;
+        case 23:
+            SendAccel(arg1,(unsigned short)arg2);//,(unsigned short)arg2, (unsigned short)arg2);
+            wait_us(200);
+            waitingAckFrom = 0;
+            waitingAckID = 0;
+            break;
+
+
+        case 19: // CHANGER LA VITESSE + DECELERATION
+            //SendSpeedDecel(arg1,(unsigned short) arg2);
+            wait_us(200);
+            waitingAckFrom = 0;
+            waitingAckID =0;
+            break;
+
+        case 30://Action tempo
+            wait_ms(arg1);
+            waitingAckFrom = 0;
+            waitingAckID = 0;
+            break;
+
+        default:
+            retour = 0;//L'action n'existe pas, il faut utiliser le CAN
+
+    }
+    return retour;//L'action est spécifique.
+
+}
+
+
+
+/****************************************************************************************/
+/* FUNCTION NAME: needToStop                                                            */
+/* DESCRIPTION  : Savoir si il faut autoriser le stop du robot via balise               */
+/****************************************************************************************/
+unsigned char needToStop(void)
+{
+    return isStopEnable;
+}
+
+/****************************************************************************************/
+/* FUNCTION NAME: doBeforeEndAction                                                     */
+/* DESCRIPTION  : Terminer les actions du robot 1s avant la fin du match                */
+/****************************************************************************************/
+void doBeforeEndAction(void)
+{
+
+}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/SDFileSystem.lib	Thu Jan 30 16:48:59 2020 +0000
@@ -0,0 +1,1 @@
+https://os.mbed.com/teams/CRAC-Team/code/SDFileSystem/#2cf33501d9c5
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/SerialHalfDuplex.lib	Thu Jan 30 16:48:59 2020 +0000
@@ -0,0 +1,1 @@
+https://os.mbed.com/teams/CRAC-Team/code/SerialHalfDuplex/#8fd1fa67565e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Strategie/DISCO-F469NI_portrait.lib	Thu Jan 30 16:48:59 2020 +0000
@@ -0,0 +1,1 @@
+http://os.mbed.com/teams/CRAC-Team/code/DISCO-F469NI_portrait/#d84fc295915e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Strategie/Strategie.cpp	Thu Jan 30 16:48:59 2020 +0000
@@ -0,0 +1,2389 @@
+#include "global.h"
+#include <string.h>
+#include <sstream>
+#include <math.h>
+#include <vector>
+//#include "StrategieManager.h"
+
+
+
+#define M_PI 3.14159265358979323846
+#define VERT 0xFF00FF00
+#define ROUGE 0xFFFF0000
+#define BLEU 0xFF0000FF
+#define JAUNE 0xFFFDD835//FEFE00
+#define BLANC 0xFF000000
+#define ORANGE 0xFFFFA500
+#define NOIR 0xFF000000
+#define DIY_GREY 0xFFDFDFDF
+#define VIOLET 0xFF4527A0
+
+char tableau_aff[10][50];
+char tableau_etat[22][50]= {
+    "Check_carte_screen",
+    "Check_carte_screen_wait_ack",
+    "Check_cartes",
+    "Check_cartes_wait_ack",
+    "Wait_force",
+    "Config",
+    "Game_init",
+    "Game_wait_for_jack",
+    "Game_start",
+    "Game_next_instruction",
+    "Game_instruction",
+    "Game_wait_ack",
+    "Game_jump_time",
+    "Game_jump_config",
+    "Game_jump_position",
+    "Game_wait_end_instruction",
+    "Warning_timeout",
+    "Waring_end_balise_wait",
+    "Warning_end_last_instruction",
+    "Warning_switch_strategie",
+    "End",
+    "End_loop",
+};
+
+int waitingAckID_FIN;
+int waitingAckFrom_FIN;
+
+Ticker ticker;
+TS_DISCO_F469NI ts;
+LCD_DISCO_F469NI lcd;
+
+TS_StateTypeDef TS_State;
+
+Ticker chrono;
+Timeout AffTime;
+Timer timer;
+Timer cartesCheker;//Le timer pour le timeout de la vérification des cartes
+Timer gameTimer;
+Timer debugetatTimer;
+Timer timeoutWarning;
+Timer timeoutWarningWaitEnd;
+Timeout chronoEnd;//permet d'envoyer la trame CAN pour la fin
+
+unsigned char screenChecktry = 0;
+unsigned char test[32] = {32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32};
+
+char counter = 0;
+char check;
+char Jack = 1;
+short SCORE_GLOBAL=0;
+short SCORE_GR=0;
+short SCORE_PR=0;
+
+int flag = 0, flag_strat = 0, flag_timer;
+int flagReceptionTelemetres = 0, flagNonRepriseErrorMot = 0;
+char Ack_strat = 0;
+signed char Strat = 0;
+signed char FIFO_lecture=0;//Position du fifo de lecture des messages CAN
+
+signed short x_robot,y_robot,theta_robot;//La position du robot
+signed short target_x_robot, target_y_robot, target_theta_robot;
+E_InstructionType actionPrecedente;
+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 -> JAUNE | 1 -> VIOLET
+unsigned short angleRecalage = 0;
+unsigned char checkCurrent = 0;
+unsigned char countAliveCard = 0;
+unsigned char ligne=0;
+
+
+int Fevitement=0;
+int EvitEtat= 0;
+int stop_evitement=0;
+
+
+
+
+
+signed char Strategie = 0; //N° de la strategie (1-10)
+
+unsigned char ModeDemo = 0; // Si à 1, indique que l'on est dans le mode demo
+
+unsigned char countRobotNear = 0;//Le nombre de robot à proximité
+
+unsigned char ingnorBaliseOnce = 0;//une fois détecté réinitialise
+unsigned char ingnorBalise = 0;//0:balise ignore 1:on ecoute la balise
+short direction;
+
+unsigned char ingnorInversionOnce = 0;//Pour ignorer l'inversion des instruction une fois
+
+struct S_Instruction instruction;
+struct S_Dodge_queue dodgeq;
+
+char couleur1, couleur2, couleur3;
+float cptf;
+int cpt,cpt1;
+
+typedef enum {INIT, ATT, CHOIX, DEMO, TEST_TELEMETRE, TEST_CAPTEURS, TEST_SERVO, TEST_TIR, DEMO_IMMEUBLE,DEMO_TRIEUR, SELECT_SIDE, TACTIQUE, DETAILS,LECTURE, LAUNCH, AFF_WAIT_JACK, WAIT_JACK, COMPTEUR, FIN} T_etat;
+T_etat etat = INIT;
+E_stratGameEtat     gameEtat  = ETAT_CHECK_CARTES;
+E_stratGameEtat     memGameEtat= gameEtat;
+E_stratGameEtat     lastEtat  = ETAT_CHECK_CARTES;
+E_Stratposdebut etat_pos=RECALAGE_1;
+
+/////////////////DEFINITION DES BOUTONS////////////////////
+Button COTE_VERT(0, 25, 400, 300, "JAUNE");
+Button COTE_ORANGE(0, 350, 400, 300, "VIOLET");
+Button COTE_JAUNE(0, 25, 400, 300, "JAUNE");
+Button COTE_VIOLET(0, 350, 400, 300, "VIOLET");
+Button RETOUR  (0, 680, 400, 110, "--Precedent--");
+Button LANCER  (0, 200, 400, 200, "--LANCER--");
+Button CHECK (0, 420, 400, 200, "Valider");
+Button MATCH (0, 50, 400, 320, "Match");
+Button DEMONSTRATION (0, 400, 400, 320, "Demo");
+Button TEST_HERKULEX(0, 25, 400, 100, "Test servos");
+Button TEST_LASER(0, 135, 400, 100, "Test telemetre");
+Button TEST_COULEURS(0,245,400,100,"Test capteurs");
+Button TEST_TIR_BALLE(0,355,400,100,"Test Lanceur");
+Button TEST_IMMEUBLE(0,465,400,100,"Test immeuble");
+Button TEST_TRIEUR(0,575,400,100,"Test aiguilleur");
+Button TIR_CHATEAU(0, 25, 400, 100, "Tir chateau");
+Button EPURATION(0, 150, 400, 100, "epuration");
+Button LANCEUR_ON(0,275,400,100,"allumer le lanceur");
+Button LANCEUR_OFF(0,400,400,100,"eteindre le lanceur");
+Button ABAISSE_BLOC(0, 25, 400, 100, "Ramasser blocs");
+Button RELEVE_BLOC(0, 135, 400, 100, "lacher blocs");
+Button BRAS_ABEILLE_ON(0,245,400,100,"bras abeille");
+Button BRAS_ABEILLE_OFF(0,355,400,100,"baisser bras abeille");
+Button INTERRUPTEUR_ON(0,465,400,100,"baisser bras interrupt");
+Button INTERRUPTEUR_OFF(0,575,400,100,"baisser bras interrupt");
+Button FORCE_LAUNCH(0, 50, 400, 320, "Force Launch");
+Button TRI(0, 25, 400, 100, "Test tri");
+Button AIGUILLEUR_D(0, 150, 400, 100, "aiguilleur droite");
+Button AIGUILLEUR_G(0,275,400,100,"aiguilleur gauche");
+Button AIGUILLEUR_CTRE(0,400,400,100,"aiguilleur centre");
+Button SUIVANT(0,380,200,100,"Suivant");
+Button COLOR_ORANGE (0, 230, 190, 110,"");
+Button COLOR_JAUNE (210, 230, 190, 110,"");
+Button COLOR_VERT (0, 350, 190, 110,"");
+Button COLOR_BLEU (210, 350, 190, 110,"");
+Button COLOR_NOIR (105, 470, 190, 110,"");
+////////////////////////////////////////////////////////////
+
+void SendRawId (unsigned short id);
+void SelectionStrat (unsigned char numeroStrat);
+void Setflag(void);
+void can2Rx_ISR(void);
+signed char Bouton_Strat (void);
+signed char blocage_balise;
+void print_segment(int nombre, int decalage);
+void affichage_compteur (int nombre);
+void effacer_segment(long couleur);
+
+unsigned short telemetreDistance=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;
+
+unsigned char DT_AVD_interrupt=0;
+unsigned char DT_AVG_interrupt=0;
+unsigned char DT_ARD_interrupt=0;
+unsigned char DT_ARG_interrupt=0;
+
+
+#ifdef ROBOT_BIG
+
+
+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 numerique en interruption pour le jack
+#else
+
+
+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 numerique en interruption pour le jack
+
+
+#endif
+
+
+
+
+
+
+/****************************************************************************************/
+/* FUNCTION NAME: chronometre_ISR                                                       */
+/* DESCRIPTION  : Interruption à la fin des 90s du match                                */
+/****************************************************************************************/
+void chronometre_ISR (void)
+{
+    SendRawId(ASSERVISSEMENT_STOP);//On stope les moteurs
+    SendRawId(GLOBAL_GAME_END);//Indication fin de match
+    etat=FIN;
+    gameTimer.stop();//Arret du timer
+
+    while(1);//On bloque la programme dans l'interruption
+}
+
+
+
+/****************************************************************************************/
+/* FUNCTION NAME: jack_ISR                                                              */
+/* DESCRIPTION  : Interruption en changement d'état sur le Jack                         */
+/****************************************************************************************/
+void jack_ISR (void)
+{
+    if(gameEtat == ETAT_GAME_WAIT_FOR_JACK) {
+        gameEtat = ETAT_GAME_START;//On débute le match
+        //etat=COMPTEUR;
+        blocage_balise=1;
+    }
+}
+
+/****************************************************************************************/
+/* FUNCTION NAME: SelectionStrat                                                        */
+/* DESCRIPTION  : Affiche la Stratégie sélectionnée sur l'ihm                           */
+/****************************************************************************************/
+
+
+void SelectionStrat (unsigned char Strategie)
+{
+    lcd.SetBackColor(LCD_COLOR_WHITE);
+    lcd.SetTextColor(LCD_COLOR_BLACK);
+
+    switch (Strategie+1) {
+        case 0x1 :
+            //description de Strategie n°1
+            lcd.DisplayStringAt(150, 0, (uint8_t *)strat_sd[Strategie], LEFT_MODE);
+            break;
+
+        case 0x2 :
+            //description de Strategie n°2
+            lcd.DisplayStringAt(150,0, (uint8_t *)strat_sd[Strategie], LEFT_MODE);
+            break;
+
+        case 0x3 :
+            //description de Strategie n°3
+            lcd.DisplayStringAt(150,0, (uint8_t *)strat_sd[Strategie], LEFT_MODE);
+            break;
+
+        case 0x4 :
+            //description de Strategie n°4
+            lcd.DisplayStringAt(150,0, (uint8_t *)strat_sd[Strategie], LEFT_MODE);
+            break;
+
+        case 0x5 :
+            //description de Strategie n°5
+            lcd.DisplayStringAt(150,0, (uint8_t *)strat_sd[Strategie], LEFT_MODE);
+            break;
+
+        case 0x6 :
+            //description de Strategie n°5
+            lcd.DisplayStringAt(150,0, (uint8_t *)strat_sd[Strategie], LEFT_MODE);
+            break;
+
+        case 0x7 :
+            //description de Strategie n°5
+            lcd.DisplayStringAt(150,0, (uint8_t *)strat_sd[Strategie], LEFT_MODE);
+            break;
+
+        case 0x8 :
+            //description de Strategie n°5
+            lcd.DisplayStringAt(150,0, (uint8_t *)strat_sd[Strategie], LEFT_MODE);
+            break;
+
+        case 0x9 :
+            //description de Strategie n°5
+            lcd.DisplayStringAt(150,0, (uint8_t *)strat_sd[Strategie], LEFT_MODE);
+            break;
+
+        case 0xA :
+            //description de Strategie n°5
+            lcd.DisplayStringAt(150,0, (uint8_t *)strat_sd[Strategie], LEFT_MODE);
+            break;
+    }
+}
+
+void Setflag(void)
+{
+    flagSendCan = 1;
+}
+
+
+//Affiche une variable sur l'écran tactile//
+void affichage_var(double Var)
+{
+    if(ligne==7)
+        ligne=0;
+    char aff[10]="toto";
+    sprintf(aff,"%lf ",Var);
+    lcd.DisplayStringAt(120, LINE(20+(ligne)), (uint8_t *)aff, LEFT_MODE);
+    //ligne++;
+
+}
+
+
+/****************************************************************************************/
+/* FUNCTION NAME: affichage_debug                                                       */
+/* DESCRIPTION  : Affiche l'état de gameEtat sur l'écran lcd                            */
+/****************************************************************************************/
+void affichage_debug(int Var)
+{
+    int i;
+    int conv=(int)Var;
+    SUIVANT.Draw(ROUGE, 0);
+    for(i=0; i<9; i++) {
+        strcpy(tableau_aff[i],"");
+        strcpy(tableau_aff[i],tableau_aff[i+1]);
+    }
+    strcpy(tableau_aff[9],tableau_etat[conv]);
+    
+    for(i=0; i<10; i++) {
+        lcd.SetBackColor(VERT);
+        lcd.DisplayStringAt(0, LINE(20+i), (uint8_t *)tableau_aff[i], LEFT_MODE);
+    }
+    /*while(!ack_bluetooth){    // mode pas à pas en bluetooth ou via écran
+        //liaison_bluetooth();
+    }
+    ack_bluetooth=0;*/
+    /*while(SUIVANT.Touched()==0);
+    while(SUIVANT.Touched());*/
+}
+
+/****************************************************************************************/
+/* FUNCTION NAME: automate_etat_ihm                                                     */
+/* DESCRIPTION  : Automate de gestion de l'affichage                                    */
+/****************************************************************************************/
+void automate_etat_ihm(void)
+{
+    int j;
+    if (j==0) {
+        ts.Init(lcd.GetXSize(), lcd.GetYSize());
+        j++;
+    }
+    ts.GetState(&TS_State);
+    switch (etat) {
+        case INIT : //intialise l'écran et passe à l'attente d'initialisation des cartes
+            ts.GetState(&TS_State);
+            canProcessRx();
+            lcd.SetBackColor(LCD_COLOR_WHITE);
+            lcd.SetTextColor(LCD_COLOR_BLACK);
+            lcd.Clear (LCD_COLOR_WHITE);
+            wait(0.15);
+            lcd.DisplayStringAt(0, 10, (uint8_t *)"Verification des cartes", LEFT_MODE);
+            //cartes non verifiées////////////////
+            lcd.SetTextColor(DIY_GREY);
+            lcd.FillRect(0,400,400,150); //carte moteur
+            lcd.FillRect(0,600,400,150); //Balise
+            lcd.SetTextColor(LCD_COLOR_BLACK);
+            lcd.SetBackColor(DIY_GREY);
+            lcd.DisplayStringAt(80, 450, (uint8_t *)"Carte Moteur", LEFT_MODE);
+            lcd.DisplayStringAt(110,650, (uint8_t *)"Balise", LEFT_MODE);
+            ////////////////////////////////////////
+            FORCE_LAUNCH.Draw(0xFFFF0000, 0);
+
+            etat=ATT;
+            break;
+
+        case ATT :  //Si les cartes sont présentes passe directement à choix sinon attente de force Launch (cette partie est encore buggée mais les cartes affichent bien leur présence donc faut juste force launch tout le temps...)
+            if (flag==1) {
+                etat = CHOIX;
+                gameEtat = ETAT_CONFIG;
+            } else if (FORCE_LAUNCH.Touched()) {
+                etat = CHOIX;
+                gameEtat = ETAT_CONFIG;
+                while(FORCE_LAUNCH.Touched());
+            }
+
+            break;
+
+
+        case CHOIX :    //Match ou DEMO
+            lcd.SetBackColor(LCD_COLOR_WHITE);
+            lcd.SetTextColor(LCD_COLOR_BLACK);
+            lcd.Clear (LCD_COLOR_WHITE);
+            lcd.DisplayStringAt(0, LINE(0), (uint8_t *)"Match ou demonstration ?", LEFT_MODE);
+            DEMONSTRATION.Draw(LCD_COLOR_LIGHTGREEN, 0);
+            MATCH.Draw(0xFFF01010, 0);
+            while(etat == CHOIX) {
+                canProcessRx();
+                if(DEMONSTRATION.Touched()) {
+                    etat = DEMO;
+                    while(DEMONSTRATION.Touched());
+                }
+
+                if(MATCH.Touched()) {
+                    etat = SELECT_SIDE;
+                    while(MATCH.Touched());
+                }
+
+            }
+            break;
+
+        case DEMO :
+            lcd.Clear(LCD_COLOR_WHITE);
+            RETOUR.Draw(0xFFFF0000, 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
+            }
+            while (etat == DEMO) {      ////////////////////////////LISTE DES DIFFERENTES DEMOS POSSIBLES///////////////////////////////////////////
+                canProcessRx();
+                if(TEST_HERKULEX.Touched()) {
+                    //Strat = 0x10;
+                    while(TEST_HERKULEX.Touched());
+                    CANMessage trame_Tx = CANMessage();
+                    trame_Tx.len = 1;
+                    trame_Tx.format = CANStandard;
+                    trame_Tx.type = CANData;
+                    trame_Tx.id=CHOICE_COLOR;
+                    trame_Tx.data[0]=0x2;
+                    can2.write(trame_Tx);
+                    TEST_HERKULEX.Draw(0xFFF0F0F0, 0);
+                    etat = TEST_SERVO;
+                    lcd.Clear(LCD_COLOR_WHITE);
+                    ModeDemo=1;
+                } else if(TEST_LASER.Touched()) {
+                    //Strat = 0x11;
+                    while(TEST_LASER.Touched());
+                    TEST_LASER.Draw(0xFFF0F0F0, 0);
+                    etat = TEST_TELEMETRE;
+                } else if (TEST_COULEURS.Touched()) {
+                    while(TEST_COULEURS.Touched());
+                    TEST_LASER.Draw(0xFFF0F0F0, 0);
+                    etat =TEST_CAPTEURS ;
+                }
+
+                else if (TEST_TIR_BALLE.Touched()) {
+                    while(TEST_TIR_BALLE.Touched());
+                    while(1) {
+                        TEST_TIR_BALLE.Draw(0xFFF0F0F0, 0);
+                        // rn42_Tx.printf("A");//experience
+#ifdef ROBOT_SMALL
+                        liaison_Tx.envoyer_short(0x30,666);
+                        pc.printf("data\r");
+#else
+
+                        // lire();
+                        /*  if (bluetooth.readable())
+                              pc.putc(bluetooth.getc());
+
+                          if (pc.readable()) {
+                              char c = pc.getc();
+                              if (c == 'A') {
+                                  liaison.envoyer_short(PAQUET_IDENTIFIANT_RAFRAICHIRSCORE, 20);
+                                  pc.printf("rafraichir\n");
+                              }
+                          }*/
+#endif
+                    }
+                    //ModeDemo=1;
+                } else if(TEST_IMMEUBLE.Touched()) {
+                    while(TEST_IMMEUBLE.Touched());
+                    TEST_IMMEUBLE.Draw(0xFFF0F0F0, 0);
+                    etat =DEMO_IMMEUBLE;
+                    lcd.Clear(LCD_COLOR_WHITE);
+                } else if(TEST_TRIEUR.Touched()) {
+                    while(TEST_TRIEUR.Touched());
+                    etat=DEMO_TRIEUR;
+                    lcd.Clear(LCD_COLOR_WHITE);
+                }
+                if(RETOUR.Touched()) {
+                    etat = CHOIX;
+                    while(RETOUR.Touched());
+
+                }
+                if(gameEtat == ETAT_CONFIG) {//C'est bon on a le droit de modifier les config
+                    Ack_strat = 1;
+                    wait_ms(10);
+                }
+            }
+            break;
+
+
+        case TEST_SERVO:        //TEST DU RESTE DES SERVOS DISPO HORS TIR
+            lcd.SetBackColor(LCD_COLOR_WHITE);
+            lcd.DisplayStringAt(20, LINE(2), (uint8_t *)"DEMONSTRATION COURS", LEFT_MODE);
+            ABAISSE_BLOC.Draw(VERT, 0);
+            RELEVE_BLOC.Draw(VERT, 0);
+            BRAS_ABEILLE_ON.Draw(VERT, 0);
+            BRAS_ABEILLE_OFF.Draw(VERT, 0);
+            INTERRUPTEUR_ON.Draw(VERT, 0);
+            INTERRUPTEUR_OFF.Draw(VERT, 0);
+            RETOUR.Draw(0xFFFF0000,0);
+            while(etat==TEST_SERVO) {
+                if(RETOUR.Touched()) {
+                    while (RETOUR.Touched());
+                    etat=DEMO;
+                } else if(ABAISSE_BLOC.Touched()) {
+                    while (ABAISSE_BLOC.Touched());
+                    SendRawId(GABARIT_PETIT_ROBOT);
+                    break;
+                } else if(RELEVE_BLOC.Touched()) {
+                    while (RELEVE_BLOC.Touched());
+                    SendRawId(PRESENTOIR_AVANT);
+                    break;
+                } else if(BRAS_ABEILLE_ON.Touched()) {
+                    while (BRAS_ABEILLE_ON.Touched());
+                    //SendRawId(BRAS_ABEILLE_UP);
+                    break;
+
+                } else if(BRAS_ABEILLE_OFF.Touched()) {
+                    while (BRAS_ABEILLE_OFF.Touched());
+                    //SendRawId(BRAS_ABEILLE_DOWN);
+                    break;
+                } else if(INTERRUPTEUR_ON.Touched()) {
+                    while (INTERRUPTEUR_ON.Touched());
+                    //SendRawId(ALLUMER_PANNEAU_UP);
+                    break;
+                } else if(INTERRUPTEUR_OFF.Touched()) {
+                    while (INTERRUPTEUR_OFF.Touched());
+                    //SendRawId(ALLUMER_PANNEAU_DOWN);
+                    break;
+                }
+            }
+            break;
+
+        case TEST_TIR:  // TEST DES FONCTIONS LIEES AUX TIRS
+            lcd.SetBackColor(LCD_COLOR_WHITE);
+            lcd.DisplayStringAt(20, LINE(2), (uint8_t *)"DEMONSTRATION COURS", LEFT_MODE);
+            TIR_CHATEAU.Draw(VERT, 0);
+            EPURATION.Draw(VERT, 0);
+            LANCEUR_ON.Draw(VERT, 0);
+            LANCEUR_OFF.Draw(VERT, 0);
+            RETOUR.Draw(ROUGE, 0);
+
+            etat=DEMO;
+
+            break;
+
+
+
+        case TEST_TELEMETRE:    //AFFICHAGE DE LA VALEUR LUE PAR LES 4 TELEMETRES
+            ModeDemo=1;
+            lcd.Clear(LCD_COLOR_WHITE);
+            lcd.SetBackColor(LCD_COLOR_WHITE);
+            lcd.DisplayStringAt(20, LINE(2), (uint8_t *)"DEMONSTRATION COURS", LEFT_MODE);
+            RETOUR.Draw(0xFFFF0000, 0);
+            while(etat==TEST_TELEMETRE) {
+                SendRawId(DATA_RECALAGE);
+                SendRawId(DATA_TELEMETRE_LOGIQUE);
+                wait_ms(100);
+                canProcessRx();
+                if(RETOUR.Touched()) {
+                    while( RETOUR.Touched());
+                    etat=DEMO;
+                    lcd.Clear(LCD_COLOR_WHITE);
+                }
+            }
+            break;      ///////////////////////////////////////////FIN DES DEMOS/////////////////////////////////////////////////
+
+
+        case SELECT_SIDE :      // CHOIX DU COTE DU TERRAIN + INVERSION DE LA STRAT SI COTE ORANGE+ ENVOI DU COTE A LA CARTE CAPTEUR/ACTIONNEURS
+            lcd.Clear(LCD_COLOR_WHITE);
+            lcd.SetBackColor(LCD_COLOR_WHITE);
+            lcd.SetTextColor(LCD_COLOR_BLACK);
+
+            lcd.DisplayStringAt(70, LINE(0), (uint8_t *)"Choisir le cote", LEFT_MODE);
+            COTE_JAUNE.Draw(JAUNE, 0);
+            COTE_VIOLET.Draw(VIOLET, 0);
+            RETOUR.Draw(LCD_COLOR_RED, 0);
+
+
+            while (etat == SELECT_SIDE) {
+                canProcessRx();
+                if(COTE_JAUNE.Touched()) {
+                    Cote = 0x0;
+                    InversStrat = Cote;
+                    etat = TACTIQUE;
+                    CANMessage trame_Tx = CANMessage();
+                    trame_Tx.len = 1;
+                    trame_Tx.format = CANStandard;
+                    trame_Tx.type = CANData;
+                    trame_Tx.id=CHOICE_COLOR;
+                    trame_Tx.data[0]=Cote;
+                    can2.write(trame_Tx);
+                    while(COTE_JAUNE.Touched());
+
+                }
+
+                if(COTE_VIOLET.Touched()) {
+                    Cote = 0x1;
+                    InversStrat= Cote;
+                    etat = TACTIQUE;
+                    CANMessage trame_Tx = CANMessage();
+                    trame_Tx.len = 1;
+                    trame_Tx.format = CANStandard;
+                    trame_Tx.type = CANData;
+                    trame_Tx.id=CHOICE_COLOR;
+                    trame_Tx.data[0]=Cote;
+                    can2.write(trame_Tx);
+                    while(COTE_VIOLET.Touched());
+                }
+
+                if(RETOUR.Touched()) {
+                    etat = CHOIX;
+                    while(RETOUR.Touched());
+                }
+            }
+
+            break;
+
+        case TACTIQUE : //AFFICHE LA LISTE DES STRATS AFIN DE SELECTIONNER CELLE VOULUE
+            if (Cote == 0) {
+                lcd.Clear(JAUNE);
+                lcd.SetBackColor(JAUNE);
+            } else if (Cote == 1) {
+                lcd.Clear(VIOLET);
+                lcd.SetBackColor(VIOLET);
+            } else {
+                lcd.Clear(BLEU);
+                lcd.SetBackColor(BLEU);
+            }
+
+            lcd.SetTextColor(LCD_COLOR_BLACK);
+
+            lcd.DisplayStringAt(20, LINE(0), (uint8_t *)"Choisir une strategie", LEFT_MODE);
+
+            Strategie = Bouton_Strat(); // retourne valeur de Strategie si bouton strat renvoi -1 on reviens en arriere
+            if (Strategie == -1) {
+                etat = SELECT_SIDE;
+            } else {
+                etat = DETAILS;
+            }
+            wait(0.1);
+            break;
+
+        case DETAILS :  //SECONDE VALIDATION DE LA STRAT
+            lcd.Clear(LCD_COLOR_WHITE);
+            lcd.SetBackColor(LCD_COLOR_WHITE);
+            lcd.SetTextColor(LCD_COLOR_BLACK);
+            CHECK.Draw(VERT);
+            RETOUR.Draw(LCD_COLOR_RED);
+
+            SelectionStrat(Strategie); //affiche la stratégie selectionnée
+
+            while (etat == DETAILS) {
+                canProcessRx();
+                if (CHECK.Touched()) {
+                    if(gameEtat == ETAT_CONFIG) {
+                        gameEtat = ETAT_GAME_INIT;
+                        etat=LECTURE;
+
+                    }
+                    while(CHECK.Touched());
+                }
+
+                if(RETOUR.Touched()) {
+                    etat = TACTIQUE;
+                    while(RETOUR.Touched());
+                }
+            }
+            break;
+
+
+        case LECTURE :
+            break;
+        case AFF_WAIT_JACK : //FONCTIONS D'AFFICHAGE DE L'ATTENTE DU JACK
+            lcd.Clear(BLANC);
+            lcd.SetBackColor(LCD_COLOR_WHITE);
+            lcd.SetTextColor(LCD_COLOR_BLACK);
+
+            if (Cote == 0) {
+                lcd.Clear(VERT);
+                lcd.SetBackColor(VERT);
+            } else if (Cote == 1) {
+                lcd.Clear(ORANGE);
+                lcd.SetBackColor(ORANGE);
+            } else {
+                lcd.Clear(VERT);
+                lcd.SetBackColor(VERT);
+            }
+            canProcessRx();
+            lcd.DisplayStringAt(0, LINE(0), (uint8_t *)"En attente du Jack", CENTER_MODE);
+            etat=WAIT_JACK;
+            break;
+
+        case WAIT_JACK: //VERITABLE ATTENTE DU JACK
+            break;
+
+        case COMPTEUR:  //PEUT AFFICHER UN COMPTEUR DU TEMPS RESTANT AVANT LA FIN DE LA PARTIE OU BIEN TRES UTILE POUR PRINT DES VARIABLES CHAQUE SEC EX: gameEtat
+            cptf=gameTimer.read();
+            lcd.SetTextColor(LCD_COLOR_BLACK);
+            cpt=(int)cptf;
+            if(cpt != cpt1) {
+                lcd.Clear(VERT);
+                // 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);
+            lcd.SetBackColor(LCD_COLOR_WHITE);
+
+            break;
+
+        case FIN :  //AFFICHAGE DE FIN AVEC LE SCORE FINAL
+            lcd.Clear (LCD_COLOR_WHITE);
+            lcd.SetBackColor(LCD_COLOR_WHITE);
+#ifdef ROBOT_BIG
+            // affichage_compteur(SCORE_GR);
+            affichage_var(SCORE_GR);
+            //liaison_Tx.envoyer_short(PAQUET_IDENTIFIANT_FINMATCH,SCORE_GLOBAL);
+#else
+            //affichage_compteur(SCORE_PR);
+            affichage_var(SCORE_PR);
+#endif
+            while(1); // force le redemarage du robot
+            //break;
+
+    }
+}
+
+
+
+/****************************************************************************************/
+/* FUNCTION NAME: automate_process                                                      */
+/* DESCRIPTION  : Automate de gestion de la stratégie du robot                          */
+/****************************************************************************************/
+void automate_process(void)
+{
+    static unsigned char AX12_enchainement = 0;
+    static unsigned char MV_enchainement = 0;
+    signed char localData1 = 0;
+    signed short localData2 = 0;
+    unsigned short localData3 = 0;
+    //signed short localData4 = 0;
+    unsigned char localData5 = 0;
+
+
+    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
+        etat=FIN;
+    }
+
+    if(lastEtat != gameEtat || debugetatTimer.read_ms() >= 1000) {
+        lastEtat = gameEtat;
+        debugetatTimer.reset();
+        sendStratEtat((unsigned char)gameEtat, (unsigned char)actual_instruction);
+    }
+
+    
+    
+    switch(gameEtat) {
+
+        case ETAT_CHECK_CARTES:
+            /*
+            Il faut faire une boucle pour verifier toutes les cartes les une apres les autres
+            */
+            waitingAckFrom = id_alive[checkCurrent];//On indique que l'on attend un ack de la carte IHM
+            SendRawId(id_check[checkCurrent]);//On demande à la carte d'indiquer ça présence
+
+            screenChecktry++;//On incrèment le conteur de tentative de 1
+            cartesCheker.reset();//On reset le timeOut
+            cartesCheker.start();//On lance le timer pour le timeout
+            gameEtat = ETAT_CHECK_CARTES_WAIT_ACK;
+            break;
+
+        case ETAT_CHECK_CARTES_WAIT_ACK:
+            /*
+            On attend l'ack de la carte en cours de vérification
+            */
+            //printf("cartesCheker = %d waitingAckFrom = %d\n",cartesCheker.read_ms(), waitingAckFrom);
+            if(waitingAckFrom == 0) {//C'est bon la carte est en ligne
+                cartesCheker.stop();
+                screenChecktry = 0;
+                countAliveCard++;
+                checkCurrent++;
+                if(checkCurrent >= NOMBRE_CARTES) {
+                    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 {
+                        gameEtat = ETAT_WAIT_FORCE;//Passage en attente de forçage du lancement
+                        waitingAckFrom = ECRAN_ALL_CHECK;
+                    }
+                } else
+                    gameEtat = ETAT_CHECK_CARTES;
+            } else if(cartesCheker.read_ms () > 100) {
+                cartesCheker.stop();
+                if(screenChecktry >=3) {
+                    //printf("missing card %d\n",id_check[checkCurrent]);
+                    screenChecktry = 0;
+                    checkCurrent++;
+
+                    if(checkCurrent >= NOMBRE_CARTES) {
+                        if(countAliveCard == NOMBRE_CARTES) {
+                            gameEtat = ETAT_CONFIG;
+                            flag=1;
+                        } else {
+                            gameEtat = ETAT_WAIT_FORCE;
+                            waitingAckFrom = ECRAN_ALL_CHECK;
+                        }
+                    } else
+                        gameEtat = ETAT_CHECK_CARTES;
+
+                } else
+                    gameEtat = ETAT_CHECK_CARTES;
+
+            }
+            break;
+        case ETAT_WAIT_FORCE:
+            /*
+            Attente du forçage de la part de la carte IHM
+            */
+            if(waitingAckFrom == 0) {
+                gameEtat = ETAT_CONFIG;
+            }
+            break;
+        case ETAT_CONFIG:
+            /*
+            Attente de l'odre de choix de mode,
+            Il est possible de modifier la couleur et l'id de la stratégie
+            Il est aussi possible d'envoyer les ordres de debug
+            */
+            modeTelemetre = 0;
+            break;
+        case ETAT_GAME_INIT:
+            //On charge la liste des instructions
+
+            loadAllInstruction(Strategie);//Mise en cache de toute les instructions
+            led3=1;
+
+            SendRawId(GLOBAL_START);
+
+            gameEtat = ETAT_GAME_WAIT_FOR_JACK;
+            if (etat == TEST_TELEMETRE|| etat ==TEST_CAPTEURS || etat == TEST_SERVO || etat ==TEST_TIR || etat == DEMO_IMMEUBLE) {
+                SendRawId(DEBUG_FAKE_JAKE);
+            } else {
+                etat = AFF_WAIT_JACK;
+            }
+            //tactile_printf("Attente du JACK.");
+            setAsservissementEtat(1);//On réactive l'asservissement
+            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
+
+            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,1800,localData2);
+
+            instruction = strat_instructions[actual_instruction];
+            //On effectue le traitement de l'instruction
+
+            break;
+        case ETAT_GAME_WAIT_FOR_JACK:
+            if(instruction.order==POSITION_DEBUT) {
+                switch(etat_pos) {      // AUTOMATE PERMETTANT AU ROBOT DE SE POSITIONNER TOUT SEUL AU DEBUT DE LA PARTIE (Ne PAS RETIRER LE JACK PENDANT CE TEMPS !!!)
+                    case RECALAGE_1:
+                        SendRawId(RECALAGE_START);
+                        waitingAckID = ASSERVISSEMENT_RECALAGE;
+                        waitingAckFrom = ACKNOWLEDGE_MOTEUR;
+#ifdef ROBOT_SMALL
+                        GoStraight(3000, 1,MOITIEE_ROBOT, 0);  //on se recale contre le mur donc il faut donner la valeur du centre du robot (les -5 qui trainent sont dus au tables pourraves sur place)
+#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(-100, 0, 0, 0);//-450
+#else
+                        GoStraight(250, 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(-100, 0, 0, 0);
+#else
+                        GoStraight(250, 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:
+
+            gameEtat = ETAT_GAME_LOAD_NEXT_INSTRUCTION;
+
+            if (ModeDemo == 0) {
+                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);
+            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;
+        case ETAT_GAME_LOAD_NEXT_INSTRUCTION:
+            flagNonRepriseErrorMot = 0;
+            /*
+            Chargement de l'instruction suivante ou arret du robot si il n'y a plus d'instruction
+            */
+            //printf("load next instruction\n");
+            if(dodgeq.nb > 0){//dodge q
+                instruction.order=dodgeq.inst[dodgeq.nb-1].order;
+                instruction.arg1=dodgeq.inst[dodgeq.nb-1].arg1;
+                instruction.arg2=dodgeq.inst[dodgeq.nb-1].arg2;
+                instruction.arg3=dodgeq.inst[dodgeq.nb-1].arg3;
+                gameEtat=ETAT_GAME_PROCESS_INSTRUCTION;
+                dodgeq.nb--;
+            }//end dodge q
+            else{// no dodge q
+            if(actual_instruction >= nb_instructions || actual_instruction == 255) {
+                gameEtat = ETAT_END;
+                //Il n'y a plus d'instruction, fin du jeu
+            } else {
+                instruction = strat_instructions[actual_instruction];
+                //On effectue le traitement de l'instruction
+                gameEtat = ETAT_GAME_PROCESS_INSTRUCTION;
+            }
+            }//end no dodge q
+            screenChecktry = 0;
+            ingnorInversionOnce = 0;
+            break;
+        case ETAT_GAME_PROCESS_INSTRUCTION:
+            /*
+            Traitement de l'instruction, envoie de la trame CAN
+            */
+            //debug_Instruction(instruction);
+            //affichage_debug(gameEtat);
+            //rn42_Tx.printf("A");//lance l'electron
+            actionPrecedente = instruction.order;
+            switch(instruction.order) {
+                case MV_BEZIER: {
+                    static vector< vector<short> >P1;
+                    static vector< vector<short> >C1;
+                    static vector< vector<short> >C2;
+                    static int i = 0;
+
+                    //Ajoute une ligne aux tableaux pour chaques courbes de la trajectoire
+                    P1.push_back(vector<short>());    //Nouvelle ligne
+                    C1.push_back(vector<short>());    //Nouvelle ligne
+                    C2.push_back(vector<short>());    //Nouvelle ligne
+
+                    P1[i].push_back(instruction.arg1);   //Nouvelle colonne X
+                    C1[i].push_back(instruction.arg3);   //Nouvelle colonne X
+                    C2[i].push_back(instruction.arg5);   //Nouvelle colonne X
+
+                    if(InversStrat == 1 && ingnorInversionOnce == 0) {
+                        P1[i].push_back(3000-instruction.arg2);   //Nouvelle colonne Y
+                        C1[i].push_back(3000-instruction.arg4);   //Nouvelle colonne Y
+                        C2[i].push_back(3000-instruction.arg6);   //Nouvelle colonne Y
+                    } else {
+                        P1[i].push_back(instruction.arg2);   //Nouvelle colonne Y
+                        C1[i].push_back(instruction.arg4);   //Nouvelle colonne Y
+                        C2[i].push_back(instruction.arg6);   //Nouvelle colonne Y
+                    }
+
+                    i++;
+
+                    if(instruction.nextActionType == WAIT) { //Si il n'y a qu'une seule courbe ou que c'est la dernière courbe de la trajectoire
+                        //Passage des points dans des variables temporaires pour pouvoir clear les vector avant d'être bloqué dans l'attente de l'ack
+                        //Empeche les vector de ne pas être reset si l'ack n'est pas reçu avant la fin du match
+                        int nbCourbes = P1.size();
+                        short P1_temp[nbCourbes][2];
+                        short C1_temp[nbCourbes][2];
+                        short C2_temp[nbCourbes][2];
+
+                        for(int j=0; j<nbCourbes; j++) {
+                            for(int i=0; i<2; i++) {
+                                P1_temp[j][i] = P1[j][i];
+                                C1_temp[j][i] = C1[j][i];
+                                C2_temp[j][i] = C2[j][i];
+                            }
+                        }
+
+                        //Clear des tableaux de points pour la prochaine trajectoire
+                        P1.clear();
+                        C1.clear();
+                        C2.clear();
+                        i = 0;
+
+                        //Calcul de la courbe et envoi des valeurs
+                        if(instruction.direction == FORWARD) {
+                            courbeBezier(nbCourbes, P1_temp, C1_temp, C2_temp, 0);
+                        } else if(instruction.direction == BACKWARD) {
+                            courbeBezier(nbCourbes, P1_temp, C1_temp, C2_temp, 1);
+                        }
+
+                        waitingAckID = ASSERVISSEMENT_BEZIER;
+                        waitingAckFrom = ACKNOWLEDGE_MOTEUR;
+                    }
+                    break;
+                }
+                case MV_COURBURE://C'est un rayon de courbure
+                    float alpha=0, theta=0;
+                    unsigned short alph=0;
+                    actionPrecedente = MV_COURBURE;
+                    waitingAckID = ASSERVISSEMENT_COURBURE;
+                    waitingAckFrom = ACKNOWLEDGE_MOTEUR;
+                    if(instruction.nextActionType == ENCHAINEMENT) {
+                        MV_enchainement++;
+                        localData5 = 1;
+                    } else {
+                        if(MV_enchainement > 0) {
+                            localData5 = 2;
+                            MV_enchainement = 0;
+                        } else {
+                            localData5 = 0;
+                        }
+                    }
+                    if(InversStrat == 1 && ingnorInversionOnce == 0) {
+                        if(instruction.direction == LEFT) instruction.direction = RIGHT;
+                        else instruction.direction = LEFT;
+                    }
+
+                    localData1 = ((instruction.direction == LEFT)?1:-1);
+                    localData2 =  instruction.arg3;
+                    /*if(InversStrat == 1 && ingnorInversionOnce == 0) {
+                        localData1 = -localData1;//Inversion de la direction
+                    }*/
+
+                    BendRadius(instruction.arg1, localData2, localData1, localData5);
+#ifdef ROBOT_SMALL
+                    if(localData2>0) {
+                        direction=1;
+                    } else {
+                        direction=-1;
+                    }
+#else
+                    if(localData2>0) {
+                        direction=-1;
+                    } else {
+                        direction=1;
+                    }
+#endif
+                    if(localData2>0)alph=localData2;
+                    else alph=-localData2;
+                    alpha = localData2*M_PI/1800.0f;
+                    theta = theta_robot*M_PI/1800.0f;
+                    
+                    if(instruction.direction == LEFT) {  //-------------LEFT
+                        if(alph<450){ // 1 XYT
+                            dodgeq.inst[0].order = MV_XYT;
+                            dodgeq.inst[0].arg1 = x_robot + instruction.arg1*(sin(alpha+theta)-sin(theta));// X
+                            dodgeq.inst[0].arg2 = y_robot + instruction.arg1*(cos(theta)-cos(alpha+theta));// Y
+                            dodgeq.inst[0].arg3 = theta_robot + alph;// T
+                        }
+                        else if(alph<900){
+                            for(int c=0;c<2;c++){ // 2 points de passages
+                                dodgeq.inst[c].order = MV_XYT;
+                                dodgeq.inst[c].arg1 = x_robot + instruction.arg1*(sin(alpha+theta)-sin(theta));// X
+                                dodgeq.inst[c].arg2 = y_robot + instruction.arg1*(cos(theta)-cos(alpha+theta));// Y
+                                dodgeq.inst[c].arg3 = theta_robot + alph;// T
+                                alpha-=alpha/2.0f;
+                                alph-=alph/2;
+                            }
+                        }
+                        else if(alph<1350){
+                            for(int c=0;c<3;c++){ // 3 points de passages
+                                dodgeq.inst[c].order = MV_XYT;
+                                dodgeq.inst[c].arg1 = x_robot + instruction.arg1*(sin(alpha+theta)-sin(theta));// X
+                                dodgeq.inst[c].arg2 = y_robot + instruction.arg1*(cos(theta)-cos(alpha+theta));// Y
+                                dodgeq.inst[c].arg3 = theta_robot + alph;// T
+                                alpha-=alpha/3.0f;
+                                alph-=alph/3;
+                            }
+                        }
+                        else if(alph<1800){
+                            for(int c=0;c<4;c++){ // 4 points de passages
+                                dodgeq.inst[c].order = MV_XYT;
+                                dodgeq.inst[c].arg1 = x_robot + instruction.arg1*(sin(alpha+theta)-sin(theta));// X
+                                dodgeq.inst[c].arg2 = y_robot + instruction.arg1*(cos(theta)-cos(alpha+theta));// Y
+                                dodgeq.inst[c].arg3 = theta_robot + alph;// T
+                                alpha-=alpha/4.0f;
+                                alph-=alph/4;
+                            }
+                        }
+                        else if(alph<2250){
+                            for(int c=0;c<5;c++){ // 5 points de passages
+                                dodgeq.inst[c].order = MV_XYT;
+                                dodgeq.inst[c].arg1 = x_robot + instruction.arg1*(sin(alpha+theta)-sin(theta));// X
+                                dodgeq.inst[c].arg2 = y_robot + instruction.arg1*(cos(theta)-cos(alpha+theta));// Y
+                                dodgeq.inst[c].arg3 = theta_robot + alph;// T
+                                alpha-=alpha/5.0f;
+                                alph-=alph/5;
+                            }
+                        }
+                        else {
+                            for(int c=0;c<6;c++){ // 6 points de passages
+                                dodgeq.inst[c].order = MV_XYT;
+                                dodgeq.inst[c].arg1 = x_robot + instruction.arg1*(sin(alpha+theta)-sin(theta));// X
+                                dodgeq.inst[c].arg2 = y_robot + instruction.arg1*(cos(theta)-cos(alpha+theta));// Y
+                                dodgeq.inst[c].arg3 = theta_robot + alph;// T
+                                alpha-=alpha/6.0f;
+                                alph-=alph/6;
+                            }
+                        }
+                    } else { //-----------------------------------------RIGHT
+                        if(alph<450){ // 1 XYT
+                            dodgeq.inst[0].order = MV_XYT;
+                            dodgeq.inst[0].arg1 = x_robot + instruction.arg1*(sin(alpha-theta)+sin(theta));// X
+                            dodgeq.inst[0].arg2 = y_robot + instruction.arg1*(cos(alpha-theta)-cos(theta));// Y
+                            dodgeq.inst[0].arg3 = theta_robot - alph;// T
+                        }
+                        else if(alph<900){
+                            for(int c=0;c<2;c++){ // 2 points de passages
+                                dodgeq.inst[c].order = MV_XYT;
+                                dodgeq.inst[c].arg1 = x_robot + instruction.arg1*(sin(alpha-theta)+sin(theta));// X
+                                dodgeq.inst[c].arg2 = y_robot + instruction.arg1*(cos(alpha-theta)-cos(theta));// Y
+                                dodgeq.inst[c].arg3 = theta_robot - alph;// T
+                                alpha-=alpha/2.0f;
+                            }
+                        }
+                        else if(alph<1350){
+                            for(int c=0;c<3;c++){ // 3 points de passages
+                                dodgeq.inst[c].order = MV_XYT;
+                                dodgeq.inst[c].arg1 = x_robot + instruction.arg1*(sin(alpha-theta)+sin(theta));// X
+                                dodgeq.inst[c].arg2 = y_robot + instruction.arg1*(cos(alpha-theta)-cos(theta));// Y
+                                dodgeq.inst[c].arg3 = theta_robot - alph;// T
+                                alpha-=alpha/3.0f;
+                            }
+                        }
+                        else if(alph<1800){
+                            for(int c=0;c<4;c++){ // 4 points de passages
+                                dodgeq.inst[c].order = MV_XYT;
+                                dodgeq.inst[c].arg1 = x_robot + instruction.arg1*(sin(alpha-theta)+sin(theta));// X
+                                dodgeq.inst[c].arg2 = y_robot + instruction.arg1*(cos(alpha-theta)-cos(theta));// Y
+                                dodgeq.inst[c].arg3 = theta_robot - alph;// T
+                                alpha-=alpha/4.0f;
+                            }
+                        }
+                        else if(alph<2250){
+                            for(int c=0;c<5;c++){ // 5 points de passages
+                                dodgeq.inst[c].order = MV_XYT;
+                                dodgeq.inst[c].arg1 = x_robot + instruction.arg1*(sin(alpha-theta)+sin(theta));// X
+                                dodgeq.inst[c].arg2 = y_robot + instruction.arg1*(cos(alpha-theta)-cos(theta));// Y
+                                dodgeq.inst[c].arg3 = theta_robot - alph;// T
+                                alpha-=alpha/5.0f;
+                            }
+                        }
+                        else {
+                            for(int c=0;c<6;c++){ // 6 points de passages
+                                dodgeq.inst[c].order = MV_XYT;
+                                dodgeq.inst[c].arg1 = x_robot + instruction.arg1*(sin(alpha-theta)+sin(theta));// X
+                                dodgeq.inst[c].arg2 = y_robot + instruction.arg1*(cos(alpha-theta)-cos(theta));// Y
+                                dodgeq.inst[c].arg3 = theta_robot - alph;// T
+                                alpha-=alpha/6.0f;
+                            }
+                        }
+                    }
+                    break;
+
+
+
+                case MV_LINE://Ligne droite
+                    waitingAckID = ASSERVISSEMENT_RECALAGE;
+                    waitingAckFrom = ACKNOWLEDGE_MOTEUR;
+                    if(instruction.nextActionType == ENCHAINEMENT) {
+                        MV_enchainement++;
+                        localData5 = 1;
+                    } else {
+                        if(MV_enchainement > 0) {//Utilisé en cas d'enchainement,
+                            localData5 = 2;
+                            MV_enchainement = 0;
+                        } else {
+                            localData5 = 0;
+                        }
+                    }
+                    localData2 = (((instruction.direction == FORWARD)?1:-1)*instruction.arg1);
+                    GoStraight(localData2, 0, 0, localData5);
+
+                    target_x_robot = x_robot + localData2*cos((double)theta_robot*M_PI/1800);
+                    target_y_robot = y_robot + localData2*sin((double)theta_robot*M_PI/1800);
+                    target_theta_robot = theta_robot;
+
+                    break;
+                case MV_TURN: //Rotation sur place
+                    target_x_robot = x_robot;
+                    target_y_robot = y_robot;
+                    target_theta_robot = theta_robot + localData2;
+                    localData2 = instruction.arg3;
+
+                    if(InversStrat == 1 && ingnorInversionOnce == 0) {
+                        localData2 = -localData2;
+                    }
+
+
+                    if(instruction.direction == ABSOLUTE) {
+                        //C'est un rotation absolu, il faut la convertir en relative
+
+                        localData2 = (localData2 - theta_robot)%3600;
+                        if(localData2 > 1800) localData2 = localData2-3600;
+
+                        else if(localData2 <-1800) localData2 = localData2+3600;
+                    }
+
+
+                    waitingAckID = ASSERVISSEMENT_ROTATION;
+                    waitingAckFrom = ACKNOWLEDGE_MOTEUR;
+                    Rotate(localData2);
+
+                    break;
+                case MV_XYT:
+                    if(instruction.direction == BACKWARD) {
+                        localData1 = -1;
+                    } else {
+                        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;
+
+                    target_x_robot = instruction.arg1;
+                    target_y_robot = localData3;
+                    target_theta_robot = localData2;
+
+                    break;
+                case MV_RECALAGE:
+                    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;
+                        }
+                        GoStraight(localData2, localData5, localData3, 0);
+                    } else { //CAPTEUR
+                        SendRawId(DATA_RECALAGE);
+                        waitingAckID = RECEPTION_RECALAGE;
+                        waitingAckFrom = ACKNOWLEDGE_TELEMETRE;
+
+                        // On attend que les variables soient actualisé
+                        while(!(waitingAckID == 0 && waitingAckFrom == 0))
+                            canProcessRx();
+                        while(!(waitingAckID_FIN==0 && waitingAckFrom_FIN==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)
+                            SetOdometrie(ODOMETRIE_SMALL_POSITION, x_robot, recalageDistanceY(), theta_robot);
+                        } else if(instruction.precision == RECALAGE_X) {
+                            SetOdometrie(ODOMETRIE_SMALL_POSITION, recalageDistanceX(), y_robot, theta_robot);
+                        } else if(instruction.precision == RECALAGE_T) {
+                            SetOdometrie(ODOMETRIE_SMALL_POSITION, x_robot, y_robot, recalageAngulaireCapteur() );
+                        }
+                    }
+                    break;
+
+                case ACTION:
+                
+                    waitingAckID_FIN = 0;
+                    waitingAckFrom_FIN = 0;
+
+                    int tempo = 0;
+                    waitingAckID= ACK_ACTION;       //On veut un ack de type action
+                    waitingAckFrom = ACKNOWLEDGE_HERKULEX; //de la part des herkulex
+                    tempo = doAction(instruction.arg1,instruction.arg2,instruction.arg3);
+                    //  unsigned char test=(unsigned char) tempo;
+                    // SendMsgCan(0x5BD, &test,1);
+                    if(tempo == 1) {
+                        //L'action est spécifique
+                        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;
+                        } else {
+                            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;*/
+#endif
+                        return;
+#ifdef ROBOT_SMALL
+                    } else if (tempo == 2) {
+                        // on est dans le cas de l'avance selon le telemetre
+                        waitingAckID = ASSERVISSEMENT_RECALAGE;
+                        waitingAckFrom = ACKNOWLEDGE_MOTEUR;
+
+                        localData2 = (((instruction.direction == FORWARD)?1:-1)*instruction.arg1);
+                        GoStraight(telemetreDistance, 0, 0, 0);
+                        // on reset la distance du telemetre à 0
+                        telemetreDistance = 5000;
+#endif
+                    } else {
+                        //C'est un AX12 qu'il faut bouger
+                        //AX12_setGoal(instruction.arg1,instruction.arg3/10,instruction.arg2);
+                        //AX12_enchainement++;
+
+                    }
+                    break;
+                default:
+                    //Instruction inconnue, on l'ignore
+                    break;
+            }
+
+            if(instruction.nextActionType == JUMP || instruction.nextActionType == WAIT) {
+                gameEtat = ETAT_GAME_WAIT_ACK;//Il faut attendre que la carte est bien reçu l'acknowledge
+                screenChecktry++;//On incrèment le conteur de tentative de 1
+                cartesCheker.reset();//On reset le timeOut
+                cartesCheker.start();
+                if(AX12_enchainement > 0) {
+                    //AX12_processChange();//Il faut lancer le déplacement des AX12
+                    //AX12_enchainement = 0;
+                }
+            } else { //C'est un enchainement
+                if(instruction.order == MV_LINE) {
+                    gameEtat =  ETAT_GAME_WAIT_ACK;
+                } else {
+                    actual_instruction = instruction.nextLineOK;//On indique que l'on va charger l'instruction suivante
+                    gameEtat = ETAT_GAME_LOAD_NEXT_INSTRUCTION;//C'est un enchainement, on charge directement l'instruction suivante
+                }
+            }
+
+            break;
+        case ETAT_GAME_WAIT_ACK:
+            canProcessRx();
+            //SendSpeed(200);//--------------------------------------------------MODE RALENTI !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+            if(waitingAckID == 0 && waitingAckFrom == 0) {//Les ack ont été reset, c'est bon on continue
+                //if(true) {
+                cartesCheker.stop();
+                if(instruction.nextActionType == JUMP) {
+                    if(instruction.jumpAction == JUMP_POSITION) {
+                        gameEtat = ETAT_GAME_JUMP_POSITION;
+                    } else { //Pour eviter les erreurs, on dit que c'est par défaut un jump time
+                        gameEtat = ETAT_GAME_JUMP_TIME;
+                        cartesCheker.reset();//On reset le timeOut
+                        cartesCheker.start();
+                    }
+                } else if(instruction.nextActionType == WAIT) { ///Actualisation des waiting ack afin d'attendre la fin des actions
+                    /*wait_ms(200);
+                    #ifdef ROBOT_BIG
+                        SetOdometrie(ODOMETRIE_BIG_POSITION, x_robot, y_robot, theta_robot);
+                    #else
+                        SetOdometrie(ODOMETRIE_SMALL_POSITION, x_robot, y_robot, theta_robot);
+                    #endif
+                    wait_ms(200);*/
+
+                    gameEtat = ETAT_GAME_WAIT_END_INSTRUCTION;
+                    switch(instruction.order) {
+                        case MV_BEZIER:
+                            waitingAckID_FIN = ASSERVISSEMENT_BEZIER;
+                            waitingAckFrom_FIN = INSTRUCTION_END_MOTEUR;
+                            break;
+                        case MV_COURBURE:
+                            waitingAckID_FIN = ASSERVISSEMENT_COURBURE;
+                            waitingAckFrom_FIN = INSTRUCTION_END_MOTEUR;
+                            break;
+                        case MV_LINE:
+                            waitingAckID_FIN = ASSERVISSEMENT_RECALAGE;
+                            waitingAckFrom_FIN = INSTRUCTION_END_MOTEUR;
+                            break;
+                        case MV_TURN:
+                            waitingAckID_FIN = ASSERVISSEMENT_ROTATION;
+                            waitingAckFrom_FIN = INSTRUCTION_END_MOTEUR;
+                            break;
+                        case MV_XYT:
+                            waitingAckID_FIN = ASSERVISSEMENT_XYT;
+                            waitingAckFrom_FIN = INSTRUCTION_END_MOTEUR;
+                            break;
+                        case MV_RECALAGE:
+                            waitingAckID_FIN = ASSERVISSEMENT_RECALAGE;
+                            waitingAckFrom_FIN = INSTRUCTION_END_MOTEUR;
+                            break;
+                        case ACTION:
+
+                            if (modeTelemetre == 0) {
+                                if (telemetreDistance == 0) {
+                                    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_FIN = ASSERVISSEMENT_RECALAGE;
+                                    //waitingAckFrom_FIN = INSTRUCTION_END_MOTEUR;
+                                    telemetreDistance = 0;
+                                }
+                            } else { // si on attend la reponse du telemetre
+                                //modeTelemetre = 1;
+                                waitingAckID_FIN = OBJET_SUR_TABLE;
+                                waitingAckFrom_FIN = 0;
+                            }
+                            break;
+                        default:
+                            break;
+                    }
+                } else {
+                    gameEtat = ETAT_GAME_LOAD_NEXT_INSTRUCTION;
+                    actual_instruction = instruction.nextLineOK;//On indique que l'on va charger l'instruction suivante
+                }
+            } else if(cartesCheker.read_ms () > 1000) {
+                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
+                }
+            }
+            break;
+
+        case ETAT_GAME_JUMP_TIME:
+            if(cartesCheker.read_ms () >= instruction.JumpTimeOrX) {
+                cartesCheker.stop();//On arrete le timer
+                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;
+
+        case ETAT_GAME_JUMP_CONFIG:
+            signed int depasX = 1, depasY = 1;  // servent à indiquer le sens de dépassement des coordonnées
+            //  1 si l'instruction est plus grande que la position du robot
+            // -1 si l'instruction est plus petite que la position du robot
+            //  0 si l'instruction et position du robot sont proche de moins de 1cm
+            if (abs(x_robot-instruction.JumpTimeOrX)<10) {
+                depasX = 0;
+            } else if(x_robot > instruction.JumpTimeOrX) {
+                depasX = -1;
+            }
+
+            if(abs(y_robot-instruction.JumpY)<10) {
+                depasY = 0;
+            } else if(y_robot > instruction.JumpY) {
+                depasY = -1;
+            }
+
+            gameEtat = ETAT_GAME_JUMP_POSITION;
+            break;
+        case ETAT_GAME_JUMP_POSITION:
+            bool Xok = false, Yok = false;
+
+            if (depasX == 0) {
+                Xok = true;
+            } else if ((instruction.JumpTimeOrX - x_robot)*depasX < -5) {
+                Xok = true;
+            }
+
+            if (depasY == 0) {
+                Yok = true;
+            } else if ((instruction.JumpY - y_robot)*depasY < -5) {
+                Yok = true;
+            }
+
+            // on teste si les deux coordonnées ont été dépassées, si oui on lance l'instruction suivante
+            if (Xok && Yok) {
+                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;
+        case ETAT_GAME_WAIT_END_INSTRUCTION:
+            canProcessRx();
+            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;
+        
+        case ETAT_END:
+            if (ModeDemo) {
+                gameEtat = ETAT_CHECK_CARTE_SCREEN;
+                ModeDemo = 1;
+            } else {
+                gameEtat = ETAT_END_LOOP;
+            }
+            break;
+        case ETAT_END_LOOP:
+            //Rien, on tourne en rond
+
+            break;
+        default:
+
+            break;
+    }
+}
+
+
+
+
+
+/****************************************************************************************/
+/* FUNCTION NAME: canProcessRx                                                          */
+/* DESCRIPTION  : Fait évoluer l'automate de l'IHM en fonction des receptions sur le CAN*/
+/****************************************************************************************/
+void canProcessRx(void)
+{
+    static signed char FIFO_occupation=0,FIFO_max_occupation=0;
+    char message[10]="toto";
+    char message1[10]="toto";
+    char message2[10]="toto";
+    char message3[10]="toto";
+    char message4[10]="toto";
+    FIFO_occupation=FIFO_ecriture-FIFO_lecture;
+
+    if(FIFO_occupation<0)
+        FIFO_occupation=FIFO_occupation+SIZE_FIFO;
+
+    if(FIFO_max_occupation<FIFO_occupation) {
+        FIFO_max_occupation=FIFO_occupation;
+        //SendRawId(
+    }
+
+    if(FIFO_occupation!=0) {
+        int identifiant=msgRxBuffer[FIFO_lecture].id;
+
+        if (waitingId == identifiant) waitingId = 0;
+        switch(identifiant) {
+
+            case ALIVE_MOTEUR:
+                if (etat == ATT) {
+
+                    lcd.SetTextColor(LCD_COLOR_LIGHTGREEN);
+                    lcd.FillRect(0,400,400,150);
+                    lcd.SetTextColor(LCD_COLOR_BLACK);
+                    lcd.SetBackColor(LCD_COLOR_LIGHTGREEN);
+                    lcd.DisplayStringAt(80, 450, (uint8_t *)"Carte Moteur", LEFT_MODE);
+                }
+                break;
+
+            case ALIVE_BALISE:
+                if (etat == ATT) {
+
+                    lcd.SetTextColor(LCD_COLOR_LIGHTGREEN);
+                    lcd.FillRect(0,600,400,150); //carte AX12
+                    lcd.SetTextColor(LCD_COLOR_BLACK);
+                    lcd.SetBackColor(LCD_COLOR_LIGHTGREEN);
+                    lcd.DisplayStringAt(110, 650, (uint8_t *)"Balise", LEFT_MODE);
+                }
+                break;
+
+            case RESET_IHM:
+                etat = CHOIX;
+                break;
+
+            case DEBUG_FAKE_JAKE://Permet de lancer le match à distance
+            case GLOBAL_JACK:
+                if(gameEtat == ETAT_GAME_WAIT_FOR_JACK) {
+                    gameEtat = ETAT_GAME_START;
+                    SendRawId(ACKNOWLEDGE_JACK);
+                }
+                break;
+
+            case ALIVE_ACTIONNEURS_AVANT:    //pas de break donc passe directement dans ECRAN_ALL_CHECK mais conserve l'ident initial
+            case ALIVE_ACTIONNEURS_ARRIERE:
+            case ALIVE_HERKULEX:
+            case ECRAN_ALL_CHECK:
+                if(waitingAckFrom == msgRxBuffer[FIFO_lecture].id) {
+                    waitingAckFrom = 0;//C'est la bonne carte qui indique qu'elle est en ligne
+                }
+                flag=1;
+                break;
+
+            case ASSERVISSEMENT_ERROR_MOTEUR://erreur asservissement
+            {
+                
+                unsigned short recieveAckID;// = (unsigned short)msgRxBuffer[FIFO_lecture].data[0]  | ( ((unsigned short)msgRxBuffer[FIFO_lecture].data[1]) <<8);
+                memcpy(&recieveAckID, msgRxBuffer[FIFO_lecture].data, 2);
+                if(recieveAckID == waitingAckID_FIN && waitingAckFrom_FIN == INSTRUCTION_END_MOTEUR)
+                { 
+                    if(flagNonRepriseErrorMot) {
+                        actual_instruction = instruction.nextLineError;
+                        gameEtat = ETAT_GAME_LOAD_NEXT_INSTRUCTION;
+                        flagNonRepriseErrorMot = 0;
+                    } else {
+                        flagNonRepriseErrorMot = 1;
+                        timeoutWarningWaitEnd.reset();
+                        timeoutWarningWaitEnd.start();
+                        //gameEtat = ETAT_WARING_END_BALISE_WAIT;
+                    }
+                }
+                /*
+                if(flagNonRepriseErrorMot) {
+                    actual_instruction = instruction.nextLineError;
+                    gameEtat = ETAT_GAME_LOAD_NEXT_INSTRUCTION;
+                    flagNonRepriseErrorMot = 0;
+                } else {
+                    flagNonRepriseErrorMot = 1;
+                    gameEtat = ETAT_WARNING_END_LAST_INSTRUCTION;
+                }*/
+               } break;
+
+            /////////////////////////////////////Acknowledges de Reception de la demande d'action////////////////////////////////////////
+            case ACKNOWLEDGE_HERKULEX:
+            case ACKNOWLEDGE_BALISE:    //pas de break donc passe directement dans ACK_FIN_ACTION mais conserve l'ident initial
+
+            case ACKNOWLEDGE_TELEMETRE:
+            /////////////////////////////////////////////Acknowledges de la fin d'action/////////////////////////////////////////////////
+            case ACKNOWLEDGE_MOTEUR:
+            case INSTRUCTION_END_BALISE:
+            case ACK_FIN_ACTION:
+            case INSTRUCTION_END_MOTEUR:
+                unsigned short recieveAckID;// = (unsigned short)msgRxBuffer[FIFO_lecture].data[0]  | ( ((unsigned short)msgRxBuffer[FIFO_lecture].data[1]) <<8);
+                memcpy(&recieveAckID, msgRxBuffer[FIFO_lecture].data, 2);
+                /*
+//on desactive la balise dans les rotations XYT
+                if(msgRxBuffer[FIFO_lecture].id==ACKNOWLEDGE_MOTEUR && ASSERVISSEMENT_XYT==recieveAckID)ingnorBalise=1;
+                if(msgRxBuffer[FIFO_lecture].id==INSTRUCTION_END_MOTEUR && ASSERVISSEMENT_XYT_ROTATE==recieveAckID)ingnorBalise=0;
+
+//on desactive la balise dans les rotations
+                if(msgRxBuffer[FIFO_lecture].id==ACKNOWLEDGE_MOTEUR && ASSERVISSEMENT_ROTATION==recieveAckID)ingnorBalise=1;
+                if(msgRxBuffer[FIFO_lecture].id==INSTRUCTION_END_MOTEUR && ASSERVISSEMENT_ROTATION==recieveAckID)ingnorBalise=0;
+                */
+
+                // SendMsgCan(0x666,&ingnorBalise,1);
+
+                if( waitingAckFrom == msgRxBuffer[FIFO_lecture].id && recieveAckID == waitingAckID ) {
+                    waitingAckFrom = 0;
+                    waitingAckID = 0;
+                }
+                if( waitingAckFrom_FIN == msgRxBuffer[FIFO_lecture].id && recieveAckID == waitingAckID_FIN ) {
+                    waitingAckFrom_FIN = 0;
+                    waitingAckID_FIN = 0;
+                }
+
+                /*
+                               if((waitingAckFrom == msgRxBuffer[FIFO_lecture].id) &&
+                               ((unsigned short)msgRxBuffer[FIFO_lecture].data[0]  |  (((unsigned short)msgRxBuffer[FIFO_lecture].data[1])<<8) == waitingAckID)  )
+                               {
+                                   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))
+                               {
+                                   waitingAckFrom_FIN = 0;
+                                   waitingAckID_FIN = 0;
+                               }
+                     */
+                break;
+
+
+#ifdef ROBOT_BIG
+#define point_balance 12
+#define point_accelerateur 10
+            case NB_PALETS_BLEU: //nb de palets bleu mis dans l'accelerateur
+                unsigned short palets_bleu=(unsigned short)msgRxBuffer[FIFO_lecture].data[0];
+                SCORE_GR+=palets_bleu*point_balance;
+                //SCORE_GLOBAL=SCORE_GR+SCORE_PR;
+                //liaison_Tx.envoyer_short(0x30,SCORE_GLOBAL);
+                break;
+
+            case NB_PALETS_VERTS://nb de palets vert/rouge mis dans l'accelerateur
+                unsigned short palets_verts=(unsigned short)msgRxBuffer[FIFO_lecture].data[0];
+                SCORE_GR+=palets_verts*point_accelerateur;
+                //SCORE_GLOBAL=SCORE_GR+SCORE_PR;
+                //liaison_Tx.envoyer_short(0x30,SCORE_GLOBAL);
+                break;
+#endif
+            case ODOMETRIE_BIG_POSITION:
+            case ODOMETRIE_SMALL_POSITION:
+
+                x_robot=msgRxBuffer[FIFO_lecture].data[0]|((unsigned short)(msgRxBuffer[FIFO_lecture].data[1])<<8);
+                y_robot=msgRxBuffer[FIFO_lecture].data[2]|((unsigned short)(msgRxBuffer[FIFO_lecture].data[3])<<8);
+                theta_robot=msgRxBuffer[FIFO_lecture].data[4]|((signed short)(msgRxBuffer[FIFO_lecture].data[5])<<8);
+                break;
+
+            case ACK_ACTION:
+                if(waitingAckID == msgRxBuffer[FIFO_lecture].id) {
+                    waitingAckFrom = 0;
+                    waitingAckID = 0;
+                }
+                break;
+
+            case BALISE_DANGER :
+                SendAck(ACKNOWLEDGE_BALISE, BALISE_END_DANGER);
+                balise_danger();
+                break;
+
+            case BALISE_STOP:
+                SendAck(ACKNOWLEDGE_BALISE, BALISE_STOP);       
+                balise_stop(FIFO_lecture);
+                break;
+
+            case BALISE_END_DANGER:
+                SendAck(ACKNOWLEDGE_BALISE, BALISE_END_DANGER);
+                balise_end_danger(&instruction,&dodgeq,&gameEtat,target_x_robot,target_y_robot,target_theta_robot, theta_robot,x_robot,y_robot);
+            break;
+
+            case RECEPTION_DATA:
+                telemetreDistance=char_to_short_transformation(msgRxBuffer[FIFO_lecture].data[0], msgRxBuffer[FIFO_lecture].data[1]);
+                telemetreDistance= (float)telemetreDistance*100.0f*35.5f+50.0f;
+                waitingAckFrom = 0;
+                waitingAckID = 0;
+                break;
+
+            case RECEPTION_RECALAGE:
+                wait_us(150);
+                flagReceptionTelemetres = 1;
+                // telemetreDistance_avant_droite = char_to_short_transformation(msgRxBuffer[FIFO_lecture].data[0], msgRxBuffer[FIFO_lecture].data[1]); //on récupère la distance traité par l'autre micro
+                memcpy(&telemetreDistance_avant_droite,msgRxBuffer[FIFO_lecture].data,2);
+                telemetreDistance_avant_gauche   = 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_arriere_droite   = char_to_short_transformation(msgRxBuffer[FIFO_lecture].data[6], msgRxBuffer[FIFO_lecture].data[7]);
+
+
+                if(ModeDemo==1) {
+                    sprintf(message,"%04dmm L:%d",telemetreDistance_avant_droite,DT_AVD_interrupt);
+                    lcd.SetBackColor(LCD_COLOR_WHITE);
+                    lcd.DisplayStringAt(0, LINE(8),(unsigned char *)"LASER AVD : ",LEFT_MODE);
+                    lcd.DisplayStringAt(200, LINE(8),(unsigned char *)message, LEFT_MODE);
+
+                    sprintf(message1,"%04dmm L:%d",telemetreDistance_avant_gauche,DT_AVG_interrupt);
+                    lcd.SetBackColor(LCD_COLOR_WHITE);
+                    lcd.DisplayStringAt(0, LINE(10),(unsigned char *)"LASER AVG : ",LEFT_MODE);
+                    lcd.DisplayStringAt(200, LINE(10),(unsigned char *)message1, LEFT_MODE);
+
+
+                    sprintf(message4,"%04d",theta_robot);
+                    lcd.SetBackColor(LCD_COLOR_WHITE);
+                    lcd.DisplayStringAt(0, LINE(13),(unsigned char *)"THETA: ",LEFT_MODE);
+                    lcd.DisplayStringAt(200, LINE(13),(unsigned char *)message4, LEFT_MODE);
+
+
+                    sprintf(message2,"%04dmm L:%d",telemetreDistance_arriere_gauche,DT_ARG_interrupt);
+                    lcd.SetBackColor(LCD_COLOR_WHITE);
+                    lcd.DisplayStringAt(0, LINE(16),(unsigned char *)"LASER ARG : ",LEFT_MODE);
+                    lcd.DisplayStringAt(200, LINE(16),(unsigned char *)message2, LEFT_MODE);
+
+                    sprintf(message3,"%04dmm L:%d",telemetreDistance_arriere_droite,DT_ARD_interrupt);
+                    lcd.SetBackColor(LCD_COLOR_WHITE);
+                    lcd.DisplayStringAt(0, LINE(18),(unsigned char *)"LASER ARD : ",LEFT_MODE);
+                    lcd.DisplayStringAt(200, LINE(18),(unsigned char *)message3, LEFT_MODE);
+                }
+                break;
+            case RECEPTION_TELEMETRE_LOGIQUE:
+
+                DT_AVD_interrupt=msgRxBuffer[FIFO_lecture].data[0];
+                DT_AVG_interrupt=msgRxBuffer[FIFO_lecture].data[1];
+                DT_ARG_interrupt=msgRxBuffer[FIFO_lecture].data[2];
+                DT_ARD_interrupt=msgRxBuffer[FIFO_lecture].data[3];
+
+                break;
+            case RECEPTION_COULEUR:
+                if (blocage_balise==0) {
+                    couleur1=msgRxBuffer[FIFO_lecture].data[0];
+                    couleur2=msgRxBuffer[FIFO_lecture].data[1];
+                    couleur3=msgRxBuffer[FIFO_lecture].data[2];
+
+                    /*lcd.DisplayStringAt(0,LINE(16),(unsigned char *)couleur1+'0',LEFT_MODE);
+                    lcd.DisplayStringAt(0,LINE(16+1),(unsigned char *)couleur2+'0',LEFT_MODE);
+                    lcd.DisplayStringAt(0,LINE(16+2),(unsigned char *)couleur3+'0',LEFT_MODE);*/
+                }
+
+                break;
+                /*
+                            case NO_BLOC: //il n'y a pas de bloc, on saute les étapes liées à l'attrape bloc
+                                actual_instruction = instruction.nextLineError;
+                                gameEtat = ETAT_GAME_LOAD_NEXT_INSTRUCTION;
+                               // waitingAckID_FIN=0;
+                               // waitingAckFrom_FIN=0;
+                                SendRawId(0x40);
+                                break;*/
+        }
+        FIFO_lecture=(FIFO_lecture+1)%SIZE_FIFO;
+    }
+}
+
+
+
+
+
+/****************************************************************************************/
+/* FUNCTION NAME: Bouton_Strat                                                          */
+/* DESCRIPTION  : Sélection de la strat sur le lcd puis envoie sur CAN (à modifier!)    */
+/****************************************************************************************/
+signed char Bouton_Strat (void)
+{
+    Button STRAT_1 (0, 30, 190, 110, strat_sd[0]);
+    Button STRAT_2 (210, 30, 190, 110, strat_sd[1]);
+    Button STRAT_3 (0, 150, 190, 110, strat_sd[2]);
+    Button STRAT_4 (210, 150, 190, 110, strat_sd[3]);
+    Button STRAT_5 (0, 270, 190, 110,strat_sd[4]);
+    Button STRAT_6 (210, 270, 190, 110, strat_sd[5]);
+    Button STRAT_7 (0, 390, 190, 110, strat_sd[6]);
+    Button STRAT_8 (210, 390, 190, 110, strat_sd[7]);
+    Button STRAT_9 (0, 510, 190, 110, strat_sd[8]);
+    Button STRAT_10 (210, 510, 190, 110, strat_sd[9]);
+    Button RETOUR  (0, 680, 400, 110, "--Precedent--");
+    //Definition des boutons
+
+    Ack_strat = 0;
+    Strat = 0;
+    STRAT_1.Draw(0xFFF0F0F0, 0);
+    STRAT_2.Draw(0xFFF0F0F0, 0);
+    STRAT_3.Draw(0xFFF0F0F0, 0);
+    STRAT_4.Draw(0xFFF0F0F0, 0);
+    STRAT_5.Draw(0xFFF0F0F0, 0);
+    STRAT_6.Draw(0xFFF0F0F0, 0);
+    STRAT_7.Draw(0xFFF0F0F0, 0);
+    STRAT_8.Draw(0xFFF0F0F0, 0);
+    STRAT_9.Draw(0xFFF0F0F0, 0);
+    STRAT_10.Draw(0xFFF0F0F0, 0);
+    RETOUR.Draw(0xFFFF0000, 0);
+
+    while(Ack_strat == 0) {
+        canProcessRx();
+        CANMessage msgTx=CANMessage();
+        //msgTx.id=ECRAN_CHOICE_STRAT;
+        if (RETOUR.Touched())
+            return -1;
+        while(RETOUR.Touched());
+        //////////////////////////////STRATEGIE N°1
+        if (STRAT_1.Touched()) {
+            Strat = 0;
+            //msgTx.data[0] = 0x1;
+            //can2.write(msgTx);
+            while(STRAT_1.Touched());
+            Ack_strat =1;
+        }
+        /////////////////////////////STRATEGIE N°2
+        if (STRAT_2.Touched()) {
+            Strat = 1;
+            //msgTx.data[0] = 0x2;
+            //can2.write(msgTx);
+            while(STRAT_2.Touched());
+            Ack_strat =1;
+        }
+        //////////////////////////////STRATEGIE N°3
+        if (STRAT_3.Touched()) {
+            Strat = 2;
+            //msgTx.data[0] = 0x3;
+            //can2.write(msgTx);
+            while(STRAT_3.Touched());
+            Ack_strat =1;
+        }
+        /////////////////////////////STRATEGIE N°4
+        if (STRAT_4.Touched()) {
+            Strat = 3;
+            //msgTx.data[0] = 0x4;
+            //can2.write(msgTx);
+            while(STRAT_4.Touched());
+            Ack_strat =1;
+        }
+        ///////////////////////////////STRATEGIE N°5
+        if (STRAT_5.Touched()) {
+            Strat = 4;
+            //msgTx.data[0] = 0x5;
+            //can2.write(msgTx);
+            while(STRAT_5.Touched());
+            Ack_strat =1;
+        }
+        ////////////////////////////////STRATEGIE N°6
+        if (STRAT_6.Touched()) {
+            Strat = 5;
+            //msgTx.data[0] = 0x6;
+            //can2.write(msgTx);
+            while(STRAT_6.Touched());
+            Ack_strat =1;
+        }
+        /////////////////////////////////STRATEGIE N°7
+        if (STRAT_7.Touched()) {
+            Strat = 6;
+            //msgTx.data[0] = 0x7;
+            //can2.write(msgTx);
+            while(STRAT_7.Touched());
+            Ack_strat =1;
+        }
+        /////////////////////////////////STRATEGIE N°8
+        if (STRAT_8.Touched()) {
+            Strat = 7;
+            //msgTx.data[0] = 0x8;
+            //can2.write(msgTx);
+            while(STRAT_8.Touched());
+            Ack_strat =1;
+        }
+        /////////////////////////////////STRATEGIE N°9
+        if (STRAT_9.Touched()) {
+            Strat = 8;
+            //msgTx.data[0] = 0x9;
+            //can2.write(msgTx);
+            while(STRAT_9.Touched());
+            Ack_strat =1;
+        }
+        ///////////////////////////////////STRATEGIE N°10
+        if (STRAT_10.Touched()) {
+            Strat = 9;
+            //msgTx.data[0] = 0xA;
+            //can2.write(msgTx);
+            while(STRAT_10.Touched());
+            Ack_strat =1;
+        }
+
+    }
+    return Strat;
+
+}
+
+void affichage_compteur (int nombre)
+{
+    int dizaine=0,unite=0,centaine=0;
+    centaine = nombre/100;
+    dizaine = nombre/10;
+    unite = nombre-(10*dizaine);
+    print_segment(unite,-50);
+    print_segment(dizaine,100);
+    if(centaine!=0) {
+        print_segment(centaine,350);
+    }
+
+}
+
+
+//****print_segment***
+//Dessine en 7 segment le nombre en parametre
+//        A
+//      =====
+//     |     |
+//   B |  G  | E
+//     |=====|
+//   C |     | F
+//     |     |
+//      =====
+//        D
+/*
+position pour le chiffre des unites
+lcd.FillRect(460,75,120,25);//    A
+lcd.FillRect(435,100,25,120);//   B
+lcd.FillRect(435,245,25,120);//   C
+lcd.FillRect(460,365,120,25);//   D
+lcd.FillRect(580,100,25,120);//   E
+lcd.FillRect(580,245,25,120);//   F
+lcd.FillRect(460,220,120,25);//   G
+
+position pour le chiffre des dizaines
+lcd.FillRect(260,75,120,25);//    A
+lcd.FillRect(235,100,25,120);//   B
+lcd.FillRect(235,245,25,120);//   C
+lcd.FillRect(260,365,120,25);//   D
+lcd.FillRect(380,100,25,120);//   E
+lcd.FillRect(380,245,25,120);//   F
+lcd.FillRect(260,220,120,25);//   G
+*/
+
+void print_segment(int nombre, int decalage)
+{
+
+    switch(nombre) {
+        case 0:
+            lcd.FillRect(240-decalage,75,120,25);
+            lcd.FillRect(215-decalage,100,25,120);
+            lcd.FillRect(215-decalage,245,25,120);
+            lcd.FillRect(360-decalage,245,25,120);
+            lcd.FillRect(360-decalage,100,25,120);
+            lcd.FillRect(240-decalage,365,120,25);
+            break;
+
+        case 1:
+            lcd.FillRect(360-decalage,100,25,120);//   E
+            lcd.FillRect(360-decalage,245,25,120);//   F
+            break;
+
+        case 2:
+            lcd.FillRect(240-decalage,75,120,25);//    A
+            lcd.FillRect(215-decalage,245,25,120);//   C
+            lcd.FillRect(240-decalage,365,120,25);//   D
+            lcd.FillRect(360-decalage,100,25,120);//   E
+            lcd.FillRect(240-decalage,220,120,25);//   G
+            break;
+
+        case 3:
+            lcd.FillRect(240-decalage,75,120,25);//    A
+            lcd.FillRect(360-decalage,100,25,120);//   E
+            lcd.FillRect(240-decalage,220,120,25);//   G
+            lcd.FillRect(240-decalage,365,120,25);//   D
+            lcd.FillRect(360-decalage,245,25,120);//   F
+            break;
+
+        case 4:
+            lcd.FillRect(215-decalage,100,25,120);//   B
+            lcd.FillRect(360-decalage,100,25,120);//   E
+            lcd.FillRect(360-decalage,245,25,120);//   F
+            lcd.FillRect(240-decalage,220,120,25);//   G
+            break;
+
+        case 5:
+            lcd.FillRect(240-decalage,75,120,25);//    A
+            lcd.FillRect(215-decalage,100,25,120);//   B
+            lcd.FillRect(240-decalage,220,120,25);//   G
+            lcd.FillRect(240-decalage,365,120,25);//   D
+            lcd.FillRect(360-decalage,245,25,120);//   F
+            break;
+
+        case 6:
+            lcd.FillRect(240-decalage,75,120,25);//    A
+            lcd.FillRect(215-decalage,100,25,120);//   B
+            lcd.FillRect(215-decalage,245,25,120);//   C
+            lcd.FillRect(240-decalage,365,120,25);//   D
+            lcd.FillRect(360-decalage,245,25,120);//   F
+            lcd.FillRect(240-decalage,220,120,25);//   G
+            break;
+
+        case 7:
+            lcd.FillRect(240-decalage,75,120,25);//    A
+            lcd.FillRect(360-decalage,100,25,120);//   E
+            lcd.FillRect(360-decalage,245,25,120);//   F
+            break;
+
+        case 8:
+            lcd.FillRect(240-decalage,75,120,25); //    A
+            lcd.FillRect(215-decalage,100,25,120);
+            lcd.FillRect(215-decalage,245,25,120);
+            lcd.FillRect(360-decalage,245,25,120);//...
+            lcd.FillRect(360-decalage,100,25,120);
+            lcd.FillRect(240-decalage,365,120,25);
+            lcd.FillRect(240-decalage,220,120,25);//   G
+            break;
+
+        case 9:
+            lcd.FillRect(240-decalage,75,120,25);//    A
+            lcd.FillRect(215-decalage,100,25,120);//   B
+            lcd.FillRect(240-decalage,365,120,25);//   D
+            lcd.FillRect(360-decalage,100,25,120);//   E
+            lcd.FillRect(360-decalage,245,25,120);//   F
+            lcd.FillRect(240-decalage,220,120,25);//   G
+            break;
+    }
+}
+
+void effacer_segment(long couleur)
+{
+    lcd.SetTextColor(couleur);
+    lcd.FillRect(240-200,75,120,25); //    A
+    lcd.FillRect(215-200,100,25,120);
+    lcd.FillRect(215-200,245,25,120);
+    lcd.FillRect(360-200,245,25,120);//...
+    lcd.FillRect(360-200,100,25,120);
+    lcd.FillRect(240-200,365,120,25);
+    lcd.FillRect(240-200,220,120,25);//   G
+
+    lcd.FillRect(240,75,120,25); //    A
+    lcd.FillRect(215,100,25,120);
+    lcd.FillRect(215,245,25,120);
+    lcd.FillRect(360,245,25,120);//...
+    lcd.FillRect(360,100,25,120);
+    lcd.FillRect(240,365,120,25);
+    lcd.FillRect(240,220,120,25);//   G
+}
+
+short recalageAngulaireCapteur(void)
+{
+    unsigned char nombresDeMesuresAuxTelemetresQuiSontCoherentes         = 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 tempo= telemetreDistance_arriere_gauche;
+    telemetreDistance_arriere_gauche=telemetreDistance_arriere_droite;
+    telemetreDistance_arriere_droite=tempo;
+
+
+
+    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))?0:3000) + (((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))?0:3000) + (((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)?0:2000) + ((theta_robot < 900 && theta_robot > -900)?1:-1)*telemetreDistance_arriere_gauche;
+        position_arriere_droite = ((theta_robot < 900 && theta_robot > -900)?0:2000) + ((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 * atan2((double)(telemetreDistance_arriere_droite-telemetreDistance_arriere_gauche), (double)ESPACE_INTER_TELEMETRE ))/M_PI;
+                else
+                    angleArriere =(1800 * atan2( (double) ESPACE_INTER_TELEMETRE,(double) (telemetreDistance_arriere_gauche-telemetreDistance_arriere_droite) ))/M_PI;
+
+                nombresDeMesuresAuxTelemetresQuiSontCoherentes++;
+                moyennageTelemetre += angleArriere;
+            }
+        }
+    } else if(orientationArrondie == 0 || orientationArrondie == 180) { // Si il est en axe X
+        if(position_arriere_droite >= x_robot-instruction.arg1 && position_arriere_droite <= x_robot+instruction.arg1) { // Et que les mesures sont cohérentes
+            if(position_arriere_gauche >= x_robot-instruction.arg1 && position_arriere_gauche <= x_robot+instruction.arg1) {
+                if(telemetreDistance_arriere_droite > telemetreDistance_arriere_gauche)
+                    angleArriere =900+(1800 * atan2( (double) (telemetreDistance_arriere_droite-telemetreDistance_arriere_gauche), (double) ESPACE_INTER_TELEMETRE ))/M_PI;
+                else
+                    angleArriere =(1800 * atan2( (double) ESPACE_INTER_TELEMETRE,(double) (telemetreDistance_arriere_gauche-telemetreDistance_arriere_droite) ))/M_PI;
+
+                nombresDeMesuresAuxTelemetresQuiSontCoherentes++;
+                moyennageTelemetre += angleArriere;
+            }
+        }
+    }
+
+    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 = (1800 * atan2( (double) ESPACE_INTER_TELEMETRE,(double) (telemetreDistance_avant_droite-telemetreDistance_avant_gauche) ))/M_PI;
+                else
+                    angleAvant = 900 + (1800 * atan2( (double)( telemetreDistance_avant_gauche-telemetreDistance_avant_droite),(double) ESPACE_INTER_TELEMETRE ))/M_PI;
+
+                nombresDeMesuresAuxTelemetresQuiSontCoherentes++;
+                moyennageTelemetre += angleAvant;
+            }
+        }
+    } else if(orientationArrondie == 0 || orientationArrondie == 180) { // Si il est en axe X
+        if(position_avant_droite >= x_robot-instruction.arg1 && position_avant_droite <= x_robot+instruction.arg1) { // Et que les mesures sont cohérentes
+            if(position_avant_gauche >= x_robot-instruction.arg1 && position_avant_gauche <= x_robot+instruction.arg1) {
+                if(telemetreDistance_avant_droite > telemetreDistance_avant_gauche)
+                    angleAvant = (1800 * atan2((double) ESPACE_INTER_TELEMETRE, (double) (telemetreDistance_avant_droite-telemetreDistance_avant_gauche) ))/M_PI;
+                else
+                    angleAvant = 900 + (1800 * atan2( (double) (telemetreDistance_avant_gauche-telemetreDistance_avant_droite),(double) ESPACE_INTER_TELEMETRE ))/M_PI;
+
+                nombresDeMesuresAuxTelemetresQuiSontCoherentes++;
+                moyennageTelemetre += angleAvant;
+            }
+        }
+    }
+
+    angleRecalage = moyennageTelemetre/nombresDeMesuresAuxTelemetresQuiSontCoherentes;
+
+    if(nombresDeMesuresAuxTelemetresQuiSontCoherentes) {
+        if(orientationArrondie == 0) {
+            angleRecalage -= 900;
+
+            /*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 += 900;
+        } else if(orientationArrondie == 270) {
+            angleRecalage += 1800;
+        }
+    }
+
+    return (nombresDeMesuresAuxTelemetresQuiSontCoherentes && (angleAvant-angleArriere<80 && angleAvant-angleArriere>-80)) ? angleRecalage : theta_robot;
+}
+
+short recalageDistanceX(void)
+{
+    unsigned char nombresDeMesuresAuxTelemetresQuiSontCoherentes         = 0;
+    unsigned int  moyennageTelemetre                                    = 0;
+
+    unsigned short tempo= telemetreDistance_arriere_gauche;
+    telemetreDistance_arriere_gauche=telemetreDistance_arriere_droite;
+    telemetreDistance_arriere_droite=tempo;
+
+    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)?0:2000) + ((theta_robot < 900 && theta_robot > -900)?1:-1)*telemetreDistance_arriere_gauche;
+    telemetreDistance_arriere_droite = ((theta_robot < 900 && theta_robot > -900)?0:2000) + ((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) {
+        nombresDeMesuresAuxTelemetresQuiSontCoherentes++;
+        moyennageTelemetre += telemetreDistance_avant_gauche;
+    }
+    if(telemetreDistance_avant_droite >= x_robot-instruction.arg1 && telemetreDistance_avant_droite <= x_robot+instruction.arg1) {
+        nombresDeMesuresAuxTelemetresQuiSontCoherentes++;
+        moyennageTelemetre += telemetreDistance_avant_droite;
+    }
+    if(telemetreDistance_arriere_gauche >= x_robot-instruction.arg1 && telemetreDistance_arriere_gauche <= x_robot+instruction.arg1) {
+        nombresDeMesuresAuxTelemetresQuiSontCoherentes++;
+        moyennageTelemetre += telemetreDistance_arriere_gauche;
+    }
+    if(telemetreDistance_arriere_droite >= x_robot-instruction.arg1 && telemetreDistance_arriere_droite <= x_robot+instruction.arg1) {
+        nombresDeMesuresAuxTelemetresQuiSontCoherentes++;
+        moyennageTelemetre += telemetreDistance_arriere_droite;
+    }
+
+    moyennageTelemetre /= nombresDeMesuresAuxTelemetresQuiSontCoherentes;
+
+    return (nombresDeMesuresAuxTelemetresQuiSontCoherentes)? moyennageTelemetre : x_robot; //SetOdometrie(ODOMETRIE_SMALL_POSITION, moyennageTelemetre, y_robot, theta_robot);
+}
+
+short recalageDistanceY(void)
+{
+    unsigned char   nombresDeMesuresAuxTelemetresQuiSontCoherentes        = 0;
+    unsigned int    moyennageTelemetre                                    = 0;
+
+    unsigned short tempo= telemetreDistance_arriere_gauche;
+    telemetreDistance_arriere_gauche=telemetreDistance_arriere_droite;
+    telemetreDistance_arriere_droite=tempo;
+
+    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))?0:3000) + (((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))?0:3000) + (((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) {
+        nombresDeMesuresAuxTelemetresQuiSontCoherentes++;
+        moyennageTelemetre += telemetreDistance_avant_gauche;
+    }
+    if(telemetreDistance_avant_droite >= y_robot-instruction.arg1 && telemetreDistance_avant_droite <= y_robot+instruction.arg1) {
+        nombresDeMesuresAuxTelemetresQuiSontCoherentes++;
+        moyennageTelemetre += telemetreDistance_avant_droite;
+    }
+    if(telemetreDistance_arriere_gauche >= y_robot-instruction.arg1 && telemetreDistance_arriere_gauche <= y_robot+instruction.arg1) {
+        nombresDeMesuresAuxTelemetresQuiSontCoherentes++;
+        moyennageTelemetre += telemetreDistance_arriere_gauche;
+    }
+    if(telemetreDistance_arriere_droite >= y_robot-instruction.arg1 && telemetreDistance_arriere_droite <= y_robot+instruction.arg1) {
+        nombresDeMesuresAuxTelemetresQuiSontCoherentes++;
+        moyennageTelemetre += telemetreDistance_arriere_droite;
+    }
+
+    moyennageTelemetre /= nombresDeMesuresAuxTelemetresQuiSontCoherentes;
+
+    return (nombresDeMesuresAuxTelemetresQuiSontCoherentes)? moyennageTelemetre : y_robot ; // SetOdometrie(ODOMETRIE_SMALL_POSITION, x_robot, moyennageTelemetre, theta_robot);
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Strategie/Strategie.h	Thu Jan 30 16:48:59 2020 +0000
@@ -0,0 +1,81 @@
+#ifndef CRAC_STRATEGIE
+#define CRAC_STRATEGIE
+
+// codeur droit A maron bleu, B maron
+typedef enum
+{
+    RECALAGE_1,
+    RECULER_1,
+    TOURNER,
+    RECALAGE_2,
+    RECULER_2,
+    GOTOPOS,
+    FIN_POS,
+}E_Stratposdebut;
+    
+typedef enum
+{
+    ETAT_CHECK_CARTE_SCREEN, //Envoie check carte screen
+    ETAT_CHECK_CARTE_SCREEN_WAIT_ACK, //Time out de 1s si erreur clignotement des led et fin prog
+    ETAT_CHECK_CARTES, //Envoie check toutes les carte
+    ETAT_CHECK_CARTES_WAIT_ACK, //Time out de 1s
+    ETAT_WAIT_FORCE,//Attente du forçage du lancement
+    ETAT_CONFIG, //attente reception du choix du mode( debug ou game)
+    
+    ETAT_GAME_INIT,//Mise en mémoire du fichier de stratégie
+    ETAT_GAME_WAIT_FOR_JACK,//Attente du retrait du jack
+    ETAT_GAME_START,//Lancement du timer 90s
+    ETAT_GAME_LOAD_NEXT_INSTRUCTION,
+    ETAT_GAME_PROCESS_INSTRUCTION,
+    ETAT_GAME_WAIT_ACK,
+    ETAT_GAME_JUMP_TIME,
+    ETAT_GAME_JUMP_CONFIG,
+    ETAT_GAME_JUMP_POSITION,
+    ETAT_GAME_WAIT_END_INSTRUCTION,
+    
+    /* A CHIER SERIEUX C NAZE
+    
+    ETAT_WARNING_TIMEOUT,//Attente de la trame fin de danger ou du timeout de 2s
+    ETAT_WARING_END_BALISE_WAIT,//Attente d'une seconde apres la fin d'un End Balise pour etre sur que c'est bon
+    ETAT_WARNING_END_LAST_INSTRUCTION,//trouver le meilleur moyen de reprendre l'instruction en cours
+    ETAT_WARNING_SWITCH_STRATEGIE,//Si à la fin du timeout il y a toujours un robot, passer à l'instruction d'erreur
+    
+    ETAT_TELEMETRE_BALANCE,
+    */
+
+    
+    ETAT_END,
+    ETAT_END_LOOP,
+    
+} E_stratGameEtat;
+
+/*
+typedef enum
+{
+    ETAT_INIT_EVITEMENT,
+    ETAT_ESTIMATION_POSITION,
+    ETAT_ESTIMATION_POSITION_ROTATION_ACK,
+    ETAT_ESTIMATION_POSITION_ROTATION_ACK_END,
+    ETAT_CALCUL_CHEMIN,
+    ETAT_FIN_EVITEMENT
+
+} E_Evitement;
+*/
+
+
+/****************************************************************************************/
+/* FUNCTION NAME: canProcessRx                                                          */
+/* DESCRIPTION  : Fonction de traitement des messages CAN                               */
+/****************************************************************************************/
+void canProcessRx(void);
+void automate_process(void);
+void automate_etat_ihm(void);
+void init_lcd(void);
+
+void affichage_debug(int var);
+
+short recalageAngulaireCapteur(void);
+short recalageDistanceX(void);
+short recalageDistanceY(void);
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Strategie/liaison_Bluetooth.lib	Thu Jan 30 16:48:59 2020 +0000
@@ -0,0 +1,1 @@
+http://os.mbed.com/teams/CRAC-Team/code/liaison_Bluetooth/#1c3ff1ff1bc0
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Thu Jan 30 16:48:59 2020 +0000
@@ -0,0 +1,101 @@
+#include "mbed.h"
+#include "global.h"
+#include <CAN.h>
+
+CAN can1(PB_8,PB_9); // Rx&Tx pour le CAN
+CAN can2(PB_5, PB_13);
+
+void bluetooth_init(void);
+DigitalIn choix_robot(PG_12);
+CANMessage msgRxBuffer[SIZE_FIFO];
+unsigned char FIFO_ecriture;
+char strat_sd[10][SIZE+8];
+char PATH[10][SIZE+8];
+
+Serial rn42_pr(PG_14, PG_9);
+//Serial rn42(PA_1,PA_2);
+Serial rn42_Tx(PA_2,NC);
+Serial rn42_Rx(NC,PA_1);
+
+Serial pc(USBTX,USBRX);
+LiaisonBluetooth liaison_Rx(&rn42_Rx,&pc);
+LiaisonBluetooth liaison_Tx(&rn42_Tx,&pc);
+LiaisonBluetooth liaison_pr(&rn42_pr,&pc);
+
+char cheminFileStart[SIZE+8]; //Le chemin du fichier de strat, utiliser strcpy(cheminFileStart,"/local/strat.txt");
+struct S_Instruction strat_instructions[SIZE_BUFFER_FILE]; //La liste des instruction chargé en mémoire
+unsigned char nb_instructions; //Le nombre d'instruction dans le fichier de strategie
+unsigned char actual_instruction;//La ligne de l'instruction en cours d'execution
+
+
+
+unsigned char InversStrat = 1;//Si à 1, indique que l'on part de l'autre cote de la table(inversion des Y)
+
+
+unsigned short waitingAckID=0;//L'id du ack attendu
+unsigned short waitingAckFrom=0;//La provenance du ack attendu
+unsigned short waitingId=0;
+char modeTelemetre; // Si à 1, indique que l'on attend une reponse du telemetre
+
+DigitalOut led1(LED1);//Led d'indication de problème, si elle clignote, c'est pas bon
+DigitalOut led2(LED2);//Led d'indication de problème, si elle clignote, c'est pas bon
+DigitalOut led3(LED3);//Led d'indication de problème, si elle clignote, c'est pas bon
+DigitalOut led4(LED4);//Led d'indication de problème, si elle clignote, c'est pas bon
+
+/****************************************************************************************/
+/* FUNCTION NAME: canRx_ISR                                                             */
+/* DESCRIPTION  : Interruption en réception sur le CAN                                  */
+/****************************************************************************************/
+void canRx_ISR (void)
+{
+    if (can2.read(msgRxBuffer[FIFO_ecriture])) {
+        //if(msgRxBuffer[FIFO_ecriture].id==RESET_STRAT) mbed_reset();
+        /*else*/ FIFO_ecriture=(FIFO_ecriture+1)%SIZE_FIFO;
+        //canProcessRx();
+    }
+}
+
+
+
+
+/**********************************************************************************/
+/* FUNCTION NAME: main                                                            */
+/* DESCRIPTION  : Fonction principal du programme                                 */
+/**********************************************************************************/
+int main() {
+    can1.frequency(1000000); // fréquence de travail 1Mbit/s
+    can2.attach(&canRx_ISR); // création de l'interrupt attachée à la réception sur le CAN
+    can2.frequency(1000000);
+#ifdef ROBOT_BIG
+    lcd.DisplayStringAt(0, 0,(uint8_t *)"Initialisation gros robot", LEFT_MODE);
+#else
+    lcd.DisplayStringAt(0, 0,(uint8_t *)"Initialisation petit robot", LEFT_MODE);
+#endif
+    led1 = 1;
+    bluetooth_init();
+    lecture_fichier(); //bloquant si pas de carte SD
+    led1 = 0;
+    wait_ms(2000);//Attente pour que toutes les cartes se lancent et surtout le CANBlue
+    while(true) {
+        automate_etat_ihm();
+        automate_process();//Boucle dans l'automate principal
+        canProcessRx();
+    }
+}
+
+void bluetooth_init(void){
+    rn42_Tx.baud(115200);
+    rn42_Rx.baud(115200);
+    rn42_pr.baud(115200);
+    pc.baud(115200);
+    pc.printf("ok1");
+    /*while(1){ // sert au paramètrage des module RN42
+        while(pc.readable()){
+            rn42_Tx.putc(pc.getc());
+            
+        }
+        while(rn42_Rx.readable()){
+            pc.putc(rn42_Rx.getc());
+        }
+    }*/
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Thu Jan 30 16:48:59 2020 +0000
@@ -0,0 +1,1 @@
+https://os.mbed.com/users/mbed_official/code/mbed/builds/e7ca05fa8600
\ No newline at end of file