Automate écran capacitif

Dependencies:   BSP_DISCO_F469NI LCD_DISCO_F469NI SeeedStudioTFTv2 TFT_fonts mbed

Fork of DISCO-F469NI_LCD_demo by ST

demo_1.cpp

Committer:
SquirrelGod
Date:
2017-03-31
Revision:
2:2182df2d7810

File content as of revision 2:2182df2d7810:

#include "mbed.h"
#include "TS_DISCO_F469NI.h"
#include "LCD_DISCO_F469NI.h"
#include "F469_GUI.hpp"
#include "ident_crac.h"
#include <CAN.h>
#include "fonts.h"

#define BLEU 0xFF0000FF
#define ROUGE 0xFFFF0000
#define VERT 0xFF7FFF00
#define JAUNE 0xFF8F8F25
#define BLANC 0xFF000000
#define SIZE_FIFO 16 

CAN can1(PB_8, PB_9); //laisser le 1er CAN car probleme sinon
CAN can2(PB_5, PB_13);

CANMessage msgRxBuffer[SIZE_FIFO];

Ticker ticker;
TS_DISCO_F469NI ts;
LCD_DISCO_F469NI lcd;
DigitalOut led1(LED1);
DigitalOut led2(LED2);
Timeout timeout;
Timeout AffTime;
Timer timerAck;
Timer timer;

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 check_cartes = 0, demo_fin = 0;
char Ack_strat = 0;
signed char Strat = 0;

void SendRawId (unsigned short id);
void SelectionStrat (unsigned char numeroStrat);
void Setflag(void);
void canProcessRx(void);
void canRx_ISR(void);
signed char Bouton_Strat (void);
void GoStraight (signed short distance,unsigned char recalage, unsigned short newValue, unsigned char isEnchainement);

typedef enum {ATT, CHOIX, DEMO, DEMO_EN_COURS, SELECT_SIDE, TACTIQUE, DETAILS, LAUNCH, WAIT_JACK, FIN} T_etat;
T_etat etat = ATT;
unsigned char FIFO_ecriture=0; //Position du fifo pour la reception CAN
signed char FIFO_lecture=0;//Position du fifo de lecture des messages CAN
int flagSendCan=1;
unsigned char Cote = 0; //0 -> bleu | 1 -> jaune

int main()
{
    ts.Init(lcd.GetXSize(), lcd.GetYSize());
    TS_StateTypeDef TS_State;
    CANMessage trame_Tx = CANMessage();
    can2.frequency(1000000); // fréquence de travail 1Mbit/s
    can2.attach(&canRx_ISR); //interrutpion can en reception
    int cpt_dizaine,cpt_unite;
    
    //Initialisation CAN
    trame_Tx.len = 1;
    trame_Tx.format = CANStandard;
    trame_Tx.type = CANData;
    
    /////////////////DEFINITION DES BOUTONS////////////////////
    Button COTE_BLEU(20, 25, 755, 200, "Bleu");
    Button COTE_JAUNE(20, 255, 500, 200, "Jaune");
    Button RETOUR  (530, 255, 245, 200, "--Precedent--");
    Button LANCER  (20, 255, 230, 200, "--LANCER--");
    Button CHECK (275, 255, 230, 200, "Valider");
    Button MATCH (10, 25, 780, 200, "Match");
    Button DEMONSTRATION (10, 255, 780, 200, "Demo");
    Button TEST_MOTEUR(20, 25, 200, 200, "Moteur");
    Button TEST_BRAS(240, 25, 200, 200, "Bras");
    Button FORCE_LAUNCH(530, 255, 245, 200, "Force Launch");
    ////////////////////////////////////////////////////////////
    
    signed char Strategie = 0; //N° de la strategie (1-10)
    
    lcd.SetBackColor(LCD_COLOR_WHITE);
    lcd.SetTextColor(LCD_COLOR_BLACK);
    lcd.Clear (LCD_COLOR_WHITE);
    lcd.SetFont(&Font24);
    lcd.DisplayStringAt(0, 200, (uint8_t *)"Verification des cartes ...", CENTER_MODE);
    FORCE_LAUNCH.Draw(0xFFFF0000, 0);
        
    while(1)
    {
        canProcessRx();
        ts.GetState(&TS_State);
        wait(0.1);        
        switch (etat)
        {
            case ATT :
                if(check_cartes == 1)
                {
                    etat = CHOIX;
                    check_cartes = 0;
                    
                    lcd.Clear (LCD_COLOR_WHITE);
                    lcd.DisplayStringAt(0, LINE(0), (uint8_t *)"Match ou demonstration ?", CENTER_MODE);
                    DEMONSTRATION.Draw(LCD_COLOR_LIGHTGREEN, 0);
                    MATCH.Draw(0xFFF01010, 0);
                    //canProcessRx();
                }
                if (FORCE_LAUNCH.Touched())
                {
                    //etat = CHOIX;
                    SendRawId(ECRAN_ALL_CHECK);
                    etat = CHOIX;
                    while(FORCE_LAUNCH.Touched())
                        canProcessRx();
                        
                    lcd.Clear (LCD_COLOR_WHITE);
                    lcd.DisplayStringAt(0, LINE(0), (uint8_t *)"Match ou demonstration ?", CENTER_MODE);
                    DEMONSTRATION.Draw(LCD_COLOR_LIGHTGREEN, 0);
                    MATCH.Draw(0xFFF01010, 0);
                }
                break;
                
            case CHOIX :
                //canProcessRx();
                if(DEMONSTRATION.Touched())
                {
                    etat = DEMO;
                    while(DEMONSTRATION.Touched())
                        canProcessRx();
                        
                    lcd.Clear(LCD_COLOR_WHITE);
                    TEST_MOTEUR.Draw(0xFFF0F0F0, 0);
                    TEST_BRAS.Draw(0xFFF0F0F0, 0);
                    RETOUR.Draw(0xFFFF0000, 0);
                    trame_Tx.id = 0x602;
                    trame_Tx.data[0] = 0;
                    can2.write(trame_Tx);
                }
                    
                if(MATCH.Touched())
                {
                    etat = SELECT_SIDE;
                    while(MATCH.Touched())
                        canProcessRx();
                        
                    lcd.Clear(LCD_COLOR_WHITE);
                    lcd.DisplayStringAt(0, LINE(0), (uint8_t *)"Choisis un cote gros", CENTER_MODE);
                    COTE_BLEU.Draw(0xFF0070FF, 0);
                    COTE_JAUNE.Draw(0xFFFFF000, 0);
                    RETOUR.Draw(0xFFFF0000, 0);
                    trame_Tx.id = 0x602;
                }
                break;
            
            case DEMO :
                
                trame_Tx.id=0x601;
                //canProcessRx();
                if(TEST_MOTEUR.Touched())
                {
                    Strat = 0x10;
                    trame_Tx.data[0] = Strat;
                    while(TEST_MOTEUR.Touched())
                        canProcessRx();
                    can2.write(trame_Tx);
                    TEST_MOTEUR.Draw(0xFFF0F0F0, 0);
                    //etat = DEMO_EN_COURS;
                }
                    
                if(TEST_BRAS.Touched())
                {
                    Strat = 0x11;
                    trame_Tx.data[0] = Strat;
                    while(TEST_BRAS.Touched())
                        canProcessRx();
                    can2.write(trame_Tx);
                    TEST_MOTEUR.Draw(0xFFF0F0F0, 0);
                    //etat = DEMO_EN_COURS;
                }
                    
                if(RETOUR.Touched())
                {
                    etat = CHOIX;
                    while(RETOUR.Touched())
                        canProcessRx();
                        
                    lcd.Clear (LCD_COLOR_WHITE);
                    lcd.DisplayStringAt(0, LINE(0), (uint8_t *)"Match ou demonstration ?", CENTER_MODE);
                    DEMONSTRATION.Draw(LCD_COLOR_LIGHTGREEN, 0);
                    MATCH.Draw(0xFFF01010, 0);
                }
                //SelectionStrat(trame_Tx.data[0]);
                if (Ack_strat == 1)
                {
                    etat = DEMO_EN_COURS;
                    lcd.Clear(LCD_COLOR_WHITE);
                    lcd.SetFont(&Font24);
                    lcd.DisplayStringAt(0, 190, (uint8_t *)"DEMONSTRATION EN COURS", CENTER_MODE);
                    Ack_strat = 0;
                }
                
                break;
                
            case DEMO_EN_COURS:

                if (demo_fin == 1)
                {
                    etat = DEMO;
                    lcd.Clear(LCD_COLOR_WHITE);
                    TEST_MOTEUR.Draw(0xFFF0F0F0, 0);
                    TEST_BRAS.Draw(0xFFF0F0F0, 0);
                    RETOUR.Draw(0xFFFF0000, 0);
                    trame_Tx.id = 0x602;
                    trame_Tx.data[0] = 0;
                    can2.write(trame_Tx);
                }
                Ack_strat = 0;
                
            case SELECT_SIDE :
                    
                //canProcessRx();
                if(COTE_BLEU.Touched()) 
                {
                    Cote = 0x0;
                    trame_Tx.data[0] = Cote;
                    can2.write(trame_Tx);
                    while(COTE_BLEU.Touched())
                        canProcessRx();
                }
                    
                if(COTE_JAUNE.Touched())
                {
                    Cote = 0x1;
                    trame_Tx.data[0] = Cote;
                    can2.write(trame_Tx);
                    while(COTE_JAUNE.Touched())
                        canProcessRx();
                }
                    
                if(RETOUR.Touched())
                {
                    etat = CHOIX;
                    while(RETOUR.Touched())
                        canProcessRx();
                        
                    lcd.Clear (LCD_COLOR_WHITE);
                    lcd.DisplayStringAt(0, LINE(0), (uint8_t *)"Match ou demonstration ?", CENTER_MODE);
                    DEMONSTRATION.Draw(LCD_COLOR_LIGHTGREEN, 0);
                    MATCH.Draw(0xFFF01010, 0);
                }
                break;
                    
            case TACTIQUE :
                if (Cote == 0){
                    lcd.Clear(0xFF0070FF);
                    lcd.SetBackColor(0xFF0070FF);
                    }
                else if (Cote == 1){
                    lcd.Clear(0xFFFFF000);
                    lcd.SetBackColor(0xFFFFF000);
                    }
                else {
                    lcd.Clear(0xFF0070FF);
                    lcd.SetBackColor(0xFF0070FF);
                    }
                
                lcd.SetTextColor(LCD_COLOR_BLACK);    
                lcd.DisplayStringAt(0, LINE(0), (uint8_t *)"Choisis une strat gros", CENTER_MODE);
                
                Strategie = Bouton_Strat(); // retourne valeur de Strategie si bouton strat renvoi -1 on reviens en arriere
                if (Strategie == -1) 
                {
                    etat = SELECT_SIDE;
                    lcd.Clear(LCD_COLOR_WHITE);
                    lcd.SetBackColor(LCD_COLOR_WHITE);
                    lcd.SetTextColor(LCD_COLOR_BLACK);
                    lcd.DisplayStringAt(0, LINE(0), (uint8_t *)"Choisis un cote gros", CENTER_MODE);
                    COTE_BLEU.Draw(0xFF0070FF, 0);
                    COTE_JAUNE.Draw(0xFFFFF000, 0);
                    RETOUR.Draw(0xFFFF0000, 0);
                    trame_Tx.id = 0x602;
                }
                else 
                {
                    etat = DETAILS;
                    lcd.Clear(LCD_COLOR_WHITE);
                    CHECK.Draw(0xFF00FF00);
                    RETOUR.Draw(0xFFFF0000);
                    SelectionStrat(Strategie);
                }  
                
                break;
            
            case DETAILS :
                    //canProcessRx();
                if (CHECK.Touched())
                {
                    SendRawId(ECRAN_START_MATCH);
                    //etat = WAIT_JACK;
                    while(CHECK.Touched())
                        canProcessRx();
                }
                    
                if(RETOUR.Touched())
                {
                    etat = TACTIQUE;
                    while(RETOUR.Touched());
                }
                break;
            
                
            case WAIT_JACK : 
                lcd.SetBackColor(LCD_COLOR_WHITE);
                lcd.SetTextColor(LCD_COLOR_BLACK);
                lcd.Clear(LCD_COLOR_WHITE);
                lcd.SetFont(&Font24);
                if (Cote == 0){
                    lcd.Clear(0xFF0070FF);
                    lcd.SetBackColor(0xFF0070FF);
                    }
                else if (Cote == 1){
                    lcd.Clear(0xFFFFF000);
                    lcd.SetBackColor(0xFFFFF000);
                    }
                else {
                    lcd.Clear(0xFF0070FF);
                    lcd.SetBackColor(0xFF0070FF);
                    }
                SendRawId(DEBUG_FAKE_JAKE); // PERMET DE SIMULER LE RETRAIT DU JACK POUR QUE LE ROBOT DEMARRE APRES LA VALIDATION DE LA STRAT
               /* while (Jack == 1){
                lcd.DisplayStringAt(0, LINE(0), (uint8_t *)"En attente du Jack", CENTER_MODE); 
                }*/  
                cpt_dizaine = 57, cpt_unite = 48;
                while (cpt_dizaine !=47){
                    lcd.DisplayChar(390,190,cpt_dizaine);
                    while (cpt_unite != 47)
                    {
                        lcd.DisplayChar(410,190,cpt_unite);//la fonction affiche un caractere en ASCII d'ou la valeur de cpt
                        cpt_unite--;
                        wait(1);
                    }
                    cpt_dizaine--;
                    cpt_unite = 57;
                }
                lcd.DisplayStringAt(0, 190, (uint8_t *)"FIN DU MATCH", CENTER_MODE);
                wait(5);
                etat = FIN;
                break;
                
            case FIN :
                lcd.Clear (LCD_COLOR_WHITE);
                lcd.SetBackColor(LCD_COLOR_WHITE); 
                lcd.SetFont(&Font24);
                lcd.DisplayStringAt(0, 170, (uint8_t *)"REDEMARAGE", CENTER_MODE);
                lcd.DisplayStringAt(0, 190, (uint8_t *)"NECESSAIRE", CENTER_MODE);
                while(1); // force le redemarage du robot  
                break;
                
        }    
        
    }
}
    

void SendRawId (unsigned short id)
{
    CANMessage msgTx=CANMessage();
    msgTx.id=id;
    msgTx.len=0;
    can2.write(msgTx);
}

void SelectionStrat (unsigned char numeroStrat)
{
    lcd.SetBackColor(LCD_COLOR_WHITE);
    lcd.SetTextColor(LCD_COLOR_BLACK);
    lcd.SetFont(&Font24);
    switch (numeroStrat)
    {
        case 0x1 :
            //description de Strategie n°1
            lcd.DisplayStringAt(20, 100, (uint8_t *)"Strategie 1 :", LEFT_MODE);
            break;
            
        case 0x2 :
            //description de Strategie n°2
            lcd.DisplayStringAt(20, 100, (uint8_t *)"Strategie 2 :", LEFT_MODE);
            break;
            
        case 0x3 :
            //description de Strategie n°3
            lcd.DisplayStringAt(20, 100, (uint8_t *)"Strategie 3 :", LEFT_MODE);
            break;
            
        case 0x4 :
            //description de Strategie n°4
            lcd.DisplayStringAt(20, 100, (uint8_t *)"Strategie 4 :", LEFT_MODE);
            break;
            
        case 0x5 :
            //description de Strategie n°5
            lcd.DisplayStringAt(20, 100, (uint8_t *)"Strategie 5 :", LEFT_MODE);
            break;
            
        case 0x6 :
            //description de Strategie n°5
            lcd.DisplayStringAt(20, 100, (uint8_t *)"Strategie 6 :", LEFT_MODE);
            break;
            
        case 0x7 :
            //description de Strategie n°5
            lcd.DisplayStringAt(20, 100, (uint8_t *)"Strategie 7 :", LEFT_MODE);
            break;
            
        case 0x8 :
            //description de Strategie n°5
            lcd.DisplayStringAt(20, 100, (uint8_t *)"Strategie 8 :", LEFT_MODE);
            break;
            
        case 0x9 :
            //description de Strategie n°5
            lcd.DisplayStringAt(20, 100, (uint8_t *)"Strategie 9 :", LEFT_MODE);
            break;
            
        case 0xA :
            //description de Strategie n°5
            lcd.DisplayStringAt(20, 100, (uint8_t *)"Strategie 10 :", LEFT_MODE);
            break;
            
        case 0x10 :
            lcd.DisplayStringAt(20, 100, (uint8_t *)"Strategie 10 :", LEFT_MODE);
            break;
        }
}

void Setflag(void)
{
    flagSendCan = 1;
}

void canProcessRx(void)
{
    static signed char FIFO_occupation=0,FIFO_max_occupation=0;
    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) {
            case ECRAN_PRINTF_1:
                for(useless1 = 0; useless1 <8; useless1++) {
                    test[useless1] = msgRxBuffer[FIFO_lecture].data[useless1];
                }
                //updateDisplay();
                break;
            case ECRAN_PRINTF_2:
                for(useless1 = 0; useless1 <8; useless1++) {
                    test[useless1+8] = msgRxBuffer[FIFO_lecture].data[useless1];
                }
                //updateDisplay();
                //Ecrire_CANtxt(test);
                break;
            case ECRAN_PRINTF_3:
                for(useless1 = 0; useless1 <8; useless1++) {
                    test[useless1+2*8] = msgRxBuffer[FIFO_lecture].data[useless1];
                }
                //updateDisplay();
                //Ecrire_CANtxt(test);
                break;
            case ECRAN_PRINTF_4:
                for(useless1 = 0; useless1 <8; useless1++) {
                    test[useless1+3*8] = msgRxBuffer[FIFO_lecture].data[useless1];
                }
                //updateDisplay();
                //Ecrire_CANtxt(test);
                break;
            case ECRAN_PRINTF_CLEAR:
                etat = CHOIX;
                break;
            case CHECK_IHM:
                SendRawId(ALIVE_IHM);
                break;
            case RESET_IHM:
                etat = CHOIX;
                break;
            case CHECK_BALISE:
                //Check[1].color = Orange;
                //DrawChecks();
                break;
            case ALIVE_BALISE:
                //Check[1].color = Green;
                //DrawChecks();
                break;
            case CHECK_MOTEUR:
                //Check[2].color = Orange;
                //DrawChecks();
                break;
            case ALIVE_MOTEUR:
                //Check[2].color = Green;
                //DrawChecks();
                break;
            case CHECK_ACTIONNEURS:
                //Check[3].color = Orange;
                //DrawChecks();
                break;
            case ALIVE_ACTIONNEURS:
                //Check[3].color = Green;
                //DrawChecks();
                break;
            case ECRAN_ALL_CHECK:
                check_cartes=1;
                //DrawEcran(1);
                //EcranActuel = 1;
                //menusOnEcranActuel = Liste_ecrans[EcranActuel-1].menus;
                break; 
            case ECRAN_ACK_STRAT:
                if (msgRxBuffer[FIFO_lecture].data[0] == Strat)
                    Ack_strat = 1;
                break;
            case ECRAN_ACK_COLOR:
                if (etat != DEMO)
                    etat = TACTIQUE;
                break;
            case ECRAN_ACK_START_MATCH:
                if (etat == DEMO_EN_COURS) 
                {
                    SendRawId(DEBUG_FAKE_JAKE);
                }
                else
                {
                etat = WAIT_JACK;
                }
                break;
            case GLOBAL_START:
                Jack=0;
                break;
                
            case DEBUG_STRATEGIE_AUTOMATE : 
                    if (msgRxBuffer[FIFO_lecture].data[0] == 19) {
                        demo_fin = 1;
                        }
                    break;
                
            default:
                break;
        }
        FIFO_lecture=(FIFO_lecture+1)%SIZE_FIFO;
    }
}

void canRx_ISR (void)
{
    if (can2.read(msgRxBuffer[FIFO_ecriture])) {
        led2 = !led2;
        if(msgRxBuffer[FIFO_ecriture].id==RESET_IHM)
            lcd.DisplayStringAt(0, LINE(6), (uint8_t *)"Erreur", CENTER_MODE);//mbed_reset();
        else FIFO_ecriture=(FIFO_ecriture+1)%SIZE_FIFO;
    }
}

signed char Bouton_Strat (void)
{   
    CANMessage msgTx=CANMessage();
    msgTx.id=0x601;
    msgTx.len=1;
    
    Button STRAT_1 (20, 10, 150, 150, "Strategie 1");
    Button STRAT_2 (180, 10, 150, 150, "Strategie 2");
    Button STRAT_3 (340, 10, 150, 150, "Strategie 3");
    Button STRAT_4 (20, 165, 150, 150, "Strategie 4");
    Button STRAT_5 (180, 165, 150, 150, "Strategie 5");
    Button STRAT_6 (340, 165, 150, 150, "Strategie 6");
    Button STRAT_7 (20, 320, 150, 150, "Strategie 7");
    Button STRAT_8 (180, 320, 150, 150, "Strategie 8");
    Button STRAT_9 (340, 320, 150, 150, "Strategie 9");
    Button STRAT_10 (530, 25, 245, 200, "Strategie 10");
    Button RETOUR  (530, 255, 245, 200, "--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();
        if (RETOUR.Touched())
        return -1;
        while(RETOUR.Touched());
                   //////////////////////////////STRATEGIE N°1
                    if (STRAT_1.Touched()){
                        Strat = 1;
                        msgTx.data[0] = 0x1;
                        can2.write(msgTx);
                        while(STRAT_1.Touched());
                        }
                    /////////////////////////////STRATEGIE N°2
                     if (STRAT_2.Touched()){
                        Strat = 2;
                        msgTx.data[0] = 0x2;
                        can2.write(msgTx);
                        while(STRAT_2.Touched());
                        }
                    //////////////////////////////STRATEGIE N°3
                     if (STRAT_3.Touched()){
                        Strat = 3;
                        msgTx.data[0] = 0x3;
                        can2.write(msgTx);
                        while(STRAT_3.Touched());
                        }
                    /////////////////////////////STRATEGIE N°4
                     if (STRAT_4.Touched()){
                        Strat = 4;
                        msgTx.data[0] = 0x4;
                        can2.write(msgTx);
                        while(STRAT_4.Touched());
                        }
                    ///////////////////////////////STRATEGIE N°5
                     if (STRAT_5.Touched()){
                        Strat = 5;
                        msgTx.data[0] = 0x5;  
                        can2.write(msgTx);                     
                        while(STRAT_5.Touched());
                        }
                    ////////////////////////////////STRATEGIE N°6
                     if (STRAT_6.Touched()){
                        Strat = 6;
                        msgTx.data[0] = 0x6;
                        can2.write(msgTx);
                        while(STRAT_6.Touched());
                        }
                    /////////////////////////////////STRATEGIE N°7
                     if (STRAT_7.Touched()){
                        Strat = 7;
                        msgTx.data[0] = 0x7;
                        can2.write(msgTx);
                        while(STRAT_7.Touched());
                        }
                    /////////////////////////////////STRATEGIE N°8
                     if (STRAT_8.Touched()){
                        Strat = 8;
                        msgTx.data[0] = 0x8;
                        can2.write(msgTx);
                        while(STRAT_8.Touched());
                        }
                    /////////////////////////////////STRATEGIE N°9
                     if (STRAT_9.Touched()){
                        Strat = 9;
                        msgTx.data[0] = 0x9;
                        can2.write(msgTx);
                        while(STRAT_9.Touched());
                        }
                    ///////////////////////////////////STRATEGIE N°10
                     if (STRAT_10.Touched()){
                        Strat = 10;
                        msgTx.data[0] = 0xA;
                        can2.write(msgTx);
                        while(STRAT_10.Touched());
                        }
    }
    return Strat;
}

//FONCTION DE L'ASSERVISSEMENT POUR LA DEMONSTRATION
void GoStraight (signed short distance,unsigned char recalage, unsigned short newValue, unsigned char isEnchainement)
{
    CANMessage msgTx=CANMessage();
    msgTx.id=ASSERVISSEMENT_RECALAGE;
    msgTx.len=6;
    msgTx.format=CANStandard;
    msgTx.type=CANData;
    // x sur 2 octets
    msgTx.data[0]=(unsigned char)distance;
    msgTx.data[1]=(unsigned char)(distance>>8);
    //Recalage sur 1 octet
    msgTx.data[2]=recalage;
    //Valeur du recalage sur 2 octets
    msgTx.data[3]=(unsigned char)newValue;
    msgTx.data[4]=(unsigned char)(newValue>>8);
    //Enchainement sur 1 octet
    msgTx.data[5]=isEnchainement;

    can1.write(msgTx);
    //wait_ms(500);
}