Programme carte strategie (disco)

Dependencies:   mbed SerialHalfDuplex SDFileSystem DISCO-F469NI_portrait liaison_Bluetooth ident_crac

Revision:
29:41e02746041d
Parent:
28:acd18776ed2d
Child:
30:a1e37af4bbde
--- a/Strategie/Strategie.cpp	Sat May 27 05:40:26 2017 +0000
+++ b/Strategie/Strategie.cpp	Fri Apr 06 13:47:19 2018 +0000
@@ -1,49 +1,86 @@
- #include "Strategie.h"
- #define M_PI           3.14159265358979323846
+#include "global.h"
+
+//#include "StrategieManager.h"
+
+
+
+#define M_PI 3.14159265358979323846
+#define BLEU 0xFF1467E5
+#define ROUGE 0xFFFF0000
+#define VERT 0xFF00FF00
+#define JAUNE 0xFFFEFE00
+#define BLANC 0xFF000000
+#define DIY_GREY 0xFFDFDFDF 
 
-E_stratGameEtat     gameEtat  = ETAT_CHECK_CARTE_SCREEN;
-E_stratGameEtat     lastEtat  = ETAT_CHECK_CARTE_SCREEN;
-unsigned char screenChecktry = 0;
+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",
+};
+
+
+
+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 fakeJack;
 Timer gameTimer;
 Timer debugetatTimer;
 Timer timeoutWarning;
 Timer timeoutWarningWaitEnd;
 Timeout chronoEnd;//permet d'envoyer la trame CAN pour la fin 
 
-unsigned short waitingAckID = 0;//L'id du ack attendu
-unsigned short waitingAckFrom = 0;//La provenance du ack attendu
-char modeTelemetre; // Si à 1, indique que l'on attend une reponse du telemetre 
-unsigned short telemetreDistance = 0;
+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;
+
+int flag = 0, flag_strat = 0, flag_timer;
+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
-
-#ifdef ROBOT_BIG
-//unsigned short id_check[NOMBRE_CARTES]= {CHECK_BALISE,CHECK_MOTEUR,CHECK_ACTIONNEURS,CHECK_AX12,CHECK_POMPES};
-//unsigned short id_alive[NOMBRE_CARTES]= {ALIVE_BALISE,ALIVE_MOTEUR,ALIVE_ACTIONNEURS,ALIVE_AX12,ALIVE_POMPES};
-
-unsigned short id_check[NOMBRE_CARTES]= {CHECK_MOTEUR,CHECK_BALISE,CHECK_ACTIONNEURS_AVANT,CHECK_ACTIONNEURS_ARRIERE};
-unsigned short id_alive[NOMBRE_CARTES]= {ALIVE_MOTEUR,ALIVE_BALISE,ALIVE_ACTIONNEURS_AVANT,ALIVE_ACTIONNEURS_ARRIERE};
+//unsigned char FIFO_ecriture=0; //Position du fifo pour la reception CAN
+int flagSendCan=1;
+unsigned char Cote = 0; //0 -> bleu | 1 -> jaune
 
-InterruptIn jack(p25); //  entrée analogique en interruption pour le jack
-#else
-//unsigned short id_check[NOMBRE_CARTES]= {CHECK_BALISE,CHECK_MOTEUR,CHECK_ACTIONNEURS};
-//unsigned short id_alive[NOMBRE_CARTES]= {ALIVE_BALISE,ALIVE_MOTEUR,ALIVE_ACTIONNEURS};
-
-unsigned short id_check[NOMBRE_CARTES]= {CHECK_MOTEUR};
-unsigned short id_alive[NOMBRE_CARTES]= {ALIVE_MOTEUR};
-
-InterruptIn jack(p25); //  entrée analogique en interruption pour le jack
-#endif
 unsigned char checkCurrent = 0;
 unsigned char countAliveCard = 0; 
 
-unsigned char InversStrat = 1;//Si à 1, indique que l'on part de l'autre cote de la table(inversion des Y)
+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
 
@@ -55,6 +92,61 @@
 
 struct S_Instruction instruction;
 
+float cptf; 
+int cpt,cpt1;  
+
+typedef enum {INIT, ATT, CHOIX, DEMO, DEMO_EN_COURS, 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     lastEtat  = ETAT_CHECK_CARTES;
+
+
+/////////////////DEFINITION DES BOUTONS////////////////////
+    Button COTE_BLEU(0, 25, 400, 300, "Bleu");
+    Button COTE_JAUNE(0, 350, 400, 300, "Jaune");
+    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_MOTEUR(0, 25, 400, 200, "Moteur");
+    Button TEST_BRAS(0, 250, 400, 200, "Bras");
+    Button FORCE_LAUNCH(0, 50, 400, 320, "Force Launch");
+    Button SUIVANT(0,380,200,100,"Suivant");
+    ////////////////////////////////////////////////////////////
+
+void affichage_debug(char *bug);
+void SendRawId (unsigned short id);
+void SelectionStrat (unsigned char numeroStrat);
+void Setflag(void);
+void can2Rx_ISR(void);
+signed char Bouton_Strat (void);
+
+void print_segment(int nombre, int decalage);
+void affichage_compteur (int nombre);
+void effacer_segment(long couleur);
+
+
+#ifdef ROBOT_BIG
+
+
+unsigned short id_check[NOMBRE_CARTES]= {CHECK_MOTEUR,CHECK_BALISE,CHECK_ACTIONNEURS_AVANT,CHECK_ACTIONNEURS_ARRIERE};
+unsigned short id_alive[NOMBRE_CARTES]= {ALIVE_MOTEUR,ALIVE_BALISE,ALIVE_ACTIONNEURS_AVANT,ALIVE_ACTIONNEURS_ARRIERE};
+
+InterruptIn jack(PA_6); //  entrée analogique en interruption pour le jack
+#else
+
+
+unsigned short id_check[NOMBRE_CARTES]= {CHECK_MOTEUR};
+unsigned short id_alive[NOMBRE_CARTES]= {ALIVE_MOTEUR};
+
+
+#endif
+
+
+    
+    
+
 
 /****************************************************************************************/
 /* FUNCTION NAME: chronometre_ISR                                                       */
@@ -64,6 +156,7 @@
 {
     SendRawId(ASSERVISSEMENT_STOP);//On stope les moteurs
     SendRawId(GLOBAL_GAME_END);//Indication fin de match
+    etat=FIN;
     gameTimer.stop();//Arret du timer
 
 #ifdef ROBOT_BIG
@@ -74,6 +167,8 @@
     while(1);//On bloque la programme dans l'interruption
 }
 
+
+
 /****************************************************************************************/
 /* FUNCTION NAME: jack_ISR                                                              */
 /* DESCRIPTION  : Interruption en changement d'état sur le Jack                         */
@@ -81,17 +176,427 @@
 void jack_ISR (void)
 {
     if(gameEtat == ETAT_GAME_WAIT_FOR_JACK) {
-        led4=1;
         gameEtat = ETAT_GAME_START;//On débute le match
+        etat=COMPTEUR;
     }
 }
 
 /****************************************************************************************/
+/* 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;
+}
+
+void affichage_debug(E_stratGameEtat 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(BLEU);
+        lcd.DisplayStringAt(0, LINE(20+i), (uint8_t *)tableau_aff[i], LEFT_MODE);
+    }  
+    while(!ack_bluetooth){
+        liaison_bluetooth();
+    }
+    ack_bluetooth=0;
+} 
+
+
+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 :
+            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);
+
+            /*while(flag == 0)
+            {
+                ts.GetState(&TS_State); 
+                canProcessRx();
+                if (FORCE_LAUNCH.Touched())
+                {
+                    etat = CHOIX;
+                    gameEtat = ETAT_CONFIG;
+                    flag = 1;
+                    while(FORCE_LAUNCH.Touched());
+                }
+            }*/ 
+            
+            etat=ATT;
+            break;
+            
+        case ATT :
+            if (flag==1){
+                etat = CHOIX;
+                gameEtat = ETAT_CONFIG;
+            }
+            else if (FORCE_LAUNCH.Touched()){
+                etat = CHOIX;
+                gameEtat = ETAT_CONFIG;
+            }
+                
+            break;
+         
+            
+        case CHOIX :
+            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);
+
+            TEST_MOTEUR.Draw(0xFFF0F0F0, 0);
+            TEST_BRAS.Draw(0xFFF0F0F0, 0);
+            RETOUR.Draw(0xFFFF0000, 0);
+            if(gameEtat == ETAT_CONFIG) {//C'est bon on a le droit de modifier les config                                     //
+                InversStrat = 0;//Pas d'inversion de la couleur                                 // A changer , discussion avec l'ihm
+            }
+            while (etat == DEMO)
+            {
+                canProcessRx();
+                if(TEST_MOTEUR.Touched())
+                {
+                    Strat = 0x10;
+                    while(TEST_MOTEUR.Touched());
+                    TEST_MOTEUR.Draw(0xFFF0F0F0, 0);
+                    etat = DEMO_EN_COURS;
+                }
+                
+                if(TEST_BRAS.Touched())
+                {
+                    Strat = 0x11;                        
+                    while(TEST_BRAS.Touched());                 
+                    TEST_MOTEUR.Draw(0xFFF0F0F0, 0);
+                    etat = DEMO_EN_COURS;
+                }
+                
+                if(RETOUR.Touched())
+                {
+                    etat = CHOIX;
+                    while(RETOUR.Touched());
+                }
+                if(gameEtat == ETAT_CONFIG) {//C'est bon on a le droit de modifier les config
+                    if (Strat< 0x10){  // Si la strat est une strat de match, on desactive le mode demo
+                            ModeDemo = 0;
+                    }
+                    else {                                        // sinon, on active le mode demo, utile pour la fin de la demo
+                            ModeDemo = 1;
+                    }
+                    
+                    Ack_strat = 1;
+                    wait_ms(10);
+                    tactile_printf("Strat %d, Asser desactive",Strat);
+                }
+                SelectionStrat(Strategie);
+            }
+            break;
+            
+        case DEMO_EN_COURS:
+            lcd.Clear(LCD_COLOR_WHITE);
+            lcd.SetBackColor(LCD_COLOR_WHITE);
+            lcd.DisplayStringAt(20, LINE(10), (uint8_t *)"DEMONSTRATION EN COURS", LEFT_MODE);
+            
+            
+            while (etat == DEMO_EN_COURS) 
+            {
+                canProcessRx();
+                
+                if (Ack_strat == 1)
+                {
+                    if(gameEtat == ETAT_CONFIG) {
+                        gameEtat = ETAT_GAME_INIT;
+                    }              
+                    while (flag_strat != 1)
+                    {
+                      canProcessRx();
+                    }
+                    etat = DEMO;
+                    flag_strat = 0;  
+                }
+                  
+            }
+            Ack_strat = 0;
+            break;
+            
+        case SELECT_SIDE :
+            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_BLEU.Draw(BLEU, 0);
+            COTE_JAUNE.Draw(JAUNE, 0);
+            RETOUR.Draw(LCD_COLOR_RED, 0);
+            
+                
+            while (etat == SELECT_SIDE) 
+            {
+                canProcessRx();
+                if(COTE_BLEU.Touched()) 
+                {
+                    Cote = 0x0;
+                    InversStrat = Cote;
+                    etat = TACTIQUE;
+                    while(COTE_BLEU.Touched());
+                    envoi_bluetooth(1,'9');
+                }
+                
+                if(COTE_JAUNE.Touched())
+                {
+                    Cote = 0x1;
+                    InversStrat= Cote;
+                    etat = TACTIQUE;
+                    while(COTE_JAUNE.Touched());
+                }
+                
+                if(RETOUR.Touched())
+                {
+                    etat = CHOIX;
+                    while(RETOUR.Touched());
+                }
+            }
+            
+            break;
+                
+        case TACTIQUE :
+            if (Cote == 0){
+                lcd.Clear(BLEU);
+                lcd.SetBackColor(BLEU);
+                }
+            else if (Cote == 1){
+                lcd.Clear(JAUNE);
+                lcd.SetBackColor(JAUNE);
+                }
+            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 :
+            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);
+             
+            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 : 
+            lcd.Clear(BLANC);
+            lcd.SetBackColor(LCD_COLOR_WHITE);
+            lcd.SetTextColor(LCD_COLOR_BLACK);
+             
+            if (Cote == 0){
+                lcd.Clear(BLEU);
+                lcd.SetBackColor(BLEU);
+                }
+            else if (Cote == 1){
+                lcd.Clear(JAUNE);
+                lcd.SetBackColor(JAUNE);
+                }
+            else {
+                lcd.Clear(BLEU);
+                lcd.SetBackColor(BLEU);
+            }
+            canProcessRx();
+            lcd.DisplayStringAt(0, LINE(0), (uint8_t *)"En attente du Jack", CENTER_MODE); 
+            etat=WAIT_JACK;
+            break;
+            
+        case WAIT_JACK:
+            break;   
+            
+        case COMPTEUR: 
+            cptf=gameTimer.read();
+            lcd.SetTextColor(LCD_COLOR_BLACK);
+            cpt=int(cptf);
+            if(cpt != cpt1){
+                lcd.Clear(BLEU);
+                affichage_compteur(90-cpt);
+            }
+            cpt1=cpt;
+            flag_timer=0;
+
+            affichage_debug(gameEtat);
+            
+            
+            break;
+            
+        case FIN :
+            lcd.Clear (LCD_COLOR_WHITE);
+            lcd.SetBackColor(LCD_COLOR_WHITE);
+            lcd.DisplayStringAt(120, 190, (uint8_t *)"LANCEMENT", LEFT_MODE);
+            lcd.SetTextColor(LCD_COLOR_BLACK);
+            lcd.DisplayStringAt(120, 210, (uint8_t *)"REDEMARAGE", LEFT_MODE);
+            lcd.DisplayStringAt(120, 230, (uint8_t *)"NECESSAIRE", LEFT_MODE);
+            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)
-{
+void automate_process(void){
     static unsigned char AX12_enchainement = 0;
     static unsigned char MV_enchainement = 0;
     signed char localData1 = 0;
@@ -104,6 +609,7 @@
         gameTimer.stop();
         gameTimer.reset();
         gameEtat = ETAT_END;//Fin du temps
+        etat=FIN;
     }
     
     if(lastEtat != gameEtat || debugetatTimer.read_ms() >= 1000) {
@@ -114,43 +620,7 @@
     
     switch(gameEtat)
     {
-        case ETAT_CHECK_CARTE_SCREEN:
-            /*
-            Verification de l'état de la carte ecran
-            */
-            waitingAckFrom = ALIVE_IHM;//On indique que l'on attend un ack de la carte IHM
-            SendRawId(CHECK_IHM);//On demande à la carte IHM d'insiquer ç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_CARTE_SCREEN_WAIT_ACK;
-            
-            //gameEtat = ETAT_GAME_START;
-            
-        break;
-        case ETAT_CHECK_CARTE_SCREEN_WAIT_ACK:
-            /*
-            Attente du ALIVE de la carte écran.
-            
-            Si la carte ne répond pas apres 10ms, on retoune dans l'etat ETAT_CHECK_CARTE_SCREEN
-            maximum 3 tentatives
-            Si pas de réponse, clignotement de toutes les leds possible
-            */
-            if(waitingAckFrom == 0) {//C'est bon la carte est en ligne
-                cartesCheker.stop();
-                screenChecktry = 0;
-                gameEtat = ETAT_CHECK_CARTES;
-            } else if(cartesCheker.read_ms () > 100) {
-                cartesCheker.stop();
-                if(screenChecktry >=3) {
-                    errorLoop();//Erreur La carte IHM n'est pas en ligne
-                } else {
-                    gameEtat = ETAT_CHECK_CARTE_SCREEN;
-                }
-            }
-        break;
-        case ETAT_CHECK_CARTES:
+        case ETAT_CHECK_CARTES:                   
             /*
             Il faut faire une boucle pour verifier toutes les cartes les une apres les autres
             */
@@ -161,11 +631,8 @@
             cartesCheker.reset();//On reset le timeOut
             cartesCheker.start();//On lance le timer pour le timeout
             gameEtat = ETAT_CHECK_CARTES_WAIT_ACK;
-            
-            
+            break;
             
-            
-        break;
         case ETAT_CHECK_CARTES_WAIT_ACK:
             /*
             On attend l'ack de la carte en cours de vérification
@@ -177,41 +644,46 @@
                 countAliveCard++;
                 checkCurrent++;
                 if(checkCurrent >= NOMBRE_CARTES) {
-                    //printf("all card check, missing %d cards\n",(NOMBRE_CARTES-countAliveCard));
+                    printf("all card check, missing %d cards\n",(NOMBRE_CARTES-countAliveCard));
                     if(countAliveCard >= NOMBRE_CARTES) {
                         gameEtat = ETAT_CONFIG;
-                        SendRawId(ECRAN_ALL_CHECK);//On dit à l'IHM que toutes les cartes sont en ligne
+                        flag=1;
                         tactile_printf("Selection couleur et strategie");
-                    } else {
+                    } 
+                    else {
                         gameEtat = ETAT_WAIT_FORCE;//Passage en attente de forçage du lancement
                         waitingAckFrom = ECRAN_ALL_CHECK;
                     }
-                } else {
+                } 
+                else
                     gameEtat = ETAT_CHECK_CARTES;
-                }
-            } else if(cartesCheker.read_ms () > 100) {
+            } 
+            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) {
+                    if(checkCurrent >= NOMBRE_CARTES){
+                        if(countAliveCard == NOMBRE_CARTES){
                             gameEtat = ETAT_CONFIG;
-                            SendRawId(ECRAN_ALL_CHECK);//On dit à l'IHM que toutes les cartes sont en ligne
-                        } else {
-                            gameEtat = ETAT_WAIT_FORCE;//Passage en attente de forçage du lancement
+                            flag=1; 
+                        } 
+                        else{
+                            gameEtat = ETAT_WAIT_FORCE;
                             waitingAckFrom = ECRAN_ALL_CHECK;
                         }
-                    } else {
+                    } 
+                    else
                         gameEtat = ETAT_CHECK_CARTES;
-                    }
-                } else {
+                    
+                } 
+                else
                     gameEtat = ETAT_CHECK_CARTES;
-                }
+                
             }
-        break;
+            break;
         case ETAT_WAIT_FORCE:
             /*
             Attente du forçage de la part de la carte IHM
@@ -219,7 +691,7 @@
             if(waitingAckFrom == 0) {
                 gameEtat = ETAT_CONFIG;
             }
-        break;
+            break;
         case ETAT_CONFIG:
             /*
             Attente de l'odre de choix de mode,
@@ -227,13 +699,22 @@
             Il est aussi possible d'envoyer les ordres de debug
             */
             modeTelemetre = 0;
-        break;
+            break;
         case ETAT_GAME_INIT:
             //On charge la liste des instructions
-            loadAllInstruction();//Mise en cache de toute les instructions
+            
+            loadAllInstruction(Strategie);//Mise en cache de toute les instructions
+            led3=1;
             
             gameEtat = ETAT_GAME_WAIT_FOR_JACK;
-            SendRawId(ECRAN_ACK_START_MATCH);
+            if (etat == DEMO_EN_COURS) 
+            {
+                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
@@ -264,6 +745,7 @@
             //On attend le jack
         break;
         case ETAT_GAME_START:
+            
             gameEtat = ETAT_GAME_LOAD_NEXT_INSTRUCTION;
             
             if (ModeDemo == 0){
@@ -272,8 +754,9 @@
             } 
             gameTimer.reset();
             jack.fall(NULL);//On désactive l'interruption du jack
-            SendRawId(GLOBAL_START);
-            tactile_printf("Start");//Pas vraiment util mais bon
+            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:
             /*
@@ -299,7 +782,6 @@
             //debug_Instruction(instruction);
             
             actionPrecedente = instruction.order;
-            
             switch(instruction.order)
             {
                 case MV_COURBURE://C'est un rayon de courbure
@@ -762,24 +1244,79 @@
             
         break;
     }       
-}           
-            
+}          
+
+
+
+
+
 /****************************************************************************************/
 /* FUNCTION NAME: canProcessRx                                                          */
-/* DESCRIPTION  : Fonction de traitement des messages CAN                               */
+/* 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;
-    CANMessage msgTx=CANMessage();
+    char useless1 = 0;
+
     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;
     if(FIFO_occupation!=0) {
-        
-        switch(msgRxBuffer[FIFO_lecture].id) {
+    int identifiant=msgRxBuffer[FIFO_lecture].id;
+        switch(identifiant) {
+            case ECRAN_PRINTF_1:
+                for(useless1 = 0; useless1 <8; useless1++) {
+                    test[useless1] = msgRxBuffer[FIFO_lecture].data[useless1];
+                }
+                break;
+            case ECRAN_PRINTF_2:
+                for(useless1 = 0; useless1 <8; useless1++) {
+                    test[useless1+8] = msgRxBuffer[FIFO_lecture].data[useless1];
+                }
+                break;
+            case ECRAN_PRINTF_3:
+                for(useless1 = 0; useless1 <8; useless1++) {
+                    test[useless1+2*8] = msgRxBuffer[FIFO_lecture].data[useless1];
+                }
+                break;
+            case ECRAN_PRINTF_4:
+                for(useless1 = 0; useless1 <8; useless1++) {
+                    test[useless1+3*8] = msgRxBuffer[FIFO_lecture].data[useless1];
+                }
+                break;
+            case ECRAN_PRINTF_CLEAR:
+                etat = CHOIX;
+                break;
+                
+            case ALIVE_MOTEUR:
+            if (etat == ATT) {
+                 
+                lcd.SetTextColor(LCD_COLOR_LIGHTGREEN);
+                lcd.FillRect(0,75,400,150); //carte moteur
+                lcd.SetTextColor(LCD_COLOR_BLACK);
+                lcd.SetBackColor(LCD_COLOR_LIGHTGREEN);
+                lcd.DisplayStringAt(80, 135, (uint8_t *)"Carte Moteur", LEFT_MODE);
+                }
+                break;
+                
+            case ALIVE_BALISE:
+            if (etat == ATT) {
+                 
+                lcd.SetTextColor(LCD_COLOR_LIGHTGREEN);
+                lcd.FillRect(0,250,400,150); //carte AX12
+                lcd.SetTextColor(LCD_COLOR_BLACK);
+                lcd.SetBackColor(LCD_COLOR_LIGHTGREEN);
+                lcd.DisplayStringAt(110, 310, (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) {
@@ -788,9 +1325,6 @@
                 }
             break;
             
-            case ALIVE_BALISE:
-            case ALIVE_MOTEUR:
-            case ALIVE_IHM:
             case ALIVE_ACTIONNEURS_AVANT:
             case ALIVE_ACTIONNEURS_ARRIERE:
             case ALIVE_AX12:
@@ -802,7 +1336,6 @@
             
             case ACKNOWLEDGE_BALISE:
             case ACKNOWLEDGE_MOTEUR:
-            case ACKNOWLEDGE_IHM:
             case ACKNOWLEDGE_TELEMETRE:
             case ACKNOWLEDGE_AX12:
             case INSTRUCTION_END_BALISE:
@@ -824,12 +1357,7 @@
                 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 ECRAN_START_MATCH:
-                if(gameEtat == ETAT_CONFIG) {
-                    gameEtat = ETAT_GAME_INIT;
-                }
-            break;
+    
             case SERVO_AX12_SETGOAL:
                 //SendAck(0x114, SERVO_AX12_SETGOAL);
                 //if(AX12_isLocal(msgRxBuffer[FIFO_lecture].data[0]))
@@ -852,49 +1380,7 @@
                 waitingAckID = 0;*/
                 
             break;
-            case ECRAN_CHOICE_COLOR://Choix de la couleur
-                if(gameEtat == ETAT_CONFIG) {//C'est bon on a le droit de modifier les config
-                    if(msgRxBuffer[FIFO_lecture].data[0] == 0)
-                        InversStrat = 0;//Pas d'inversion de la couleur
-                    else
-                        InversStrat = 1;//Inversion de la couleur
-                        
-                    msgTx.id=ECRAN_ACK_COLOR; // tx ack de la couleur
-                    msgTx.len=1;
-                    msgTx.format=CANStandard;
-                    msgTx.type=CANData;
-                    // couleur sur 1 octet
-                    msgTx.data[0]=msgRxBuffer[FIFO_lecture].data[0];
-                    can1.write(msgTx);
-                    
-                }
-            break;
-            
-            case ECRAN_CHOICE_STRAT://Choix du fichier de stratégie à utiliser
-                if(gameEtat == ETAT_CONFIG) {//C'est bon on a le droit de modifier les config
-                    msgTx.id=ECRAN_ACK_STRAT; // tx ack de la couleur
-                    msgTx.len=1;
-                    msgTx.format=CANStandard;
-                    msgTx.type=CANData;
-                    if(SelectStrategy(msgRxBuffer[FIFO_lecture].data[0])) {
-                        // id de la stratégie sur 1 octet
-                        if (msgRxBuffer[FIFO_lecture].data[0] < 0x10){  // Si la strat est une strat de match, on desactive le mode demo
-                                ModeDemo = 0;
-                        } else {                                        // sinon, on active le mode demo, utile pour la fin de la demo
-                                ModeDemo = 1;
-                        }
-                        
-                        msgTx.data[0]=msgRxBuffer[FIFO_lecture].data[0];
-                    } else {
-                        //erreur sur 1 octet
-                        msgTx.data[0]=0;
-                    }
-                    can1.write(msgTx);
-                    wait_ms(10);
-                    //setAsservissementEtat(0);//Désactivation de l'asservissement pour repositionner le robot dans le zone de départ
-                    tactile_printf("Strat %d, Asser desactive",msgTx.data[0]);
-                }
-            break;
+    
             case BALISE_DANGER :
                 SendAck(ACKNOWLEDGE_BALISE, BALISE_END_DANGER);
             break;
@@ -954,8 +1440,289 @@
                     }
                 modeTelemetre = 0;
             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;
+    dizaine = nombre/10;
+    unite = nombre-(10*dizaine);
+    print_segment(unite,0);
+    print_segment(dizaine,200);
+    
+}
+
+
+//****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
+}