#include <stdio.h>
#include "pico/stdio.h"
#include "pico/error.h"
#include "pico/multicore.h"
#include "hardware/i2c.h"
#include "Commande_vitesse.h"
#include "i2c_annexe.h"
#include "i2c_maitre.h"
#include "Evitement.h"
#include "Geometrie.h"
#include "Geometrie_robot.h"
#include "Asser_Moteurs.h"
#include "Localisation.h"
#include "Robot_config.h"
#include "Strategie_2024_plante.h"
#include "Strategie_2024_pots.h"
#include "Strategie.h"
#include "Trajectoire.h"
#include "QEI.h"
#include "gyro.h"
#include "Moteurs.h"


int test_calcul_position_pot(void);
int test_calage_debut(void);
int test_attrape_pot(void);
int test_aller_a_plante(void);
int test_attrape_plante(void);
int test_aller_zone_plante();
int test_pseudo_homologation(void);
int test_attrape_1_pot(void);
int test_echange_pot(void);
void affichage_test_strategie_2024(void);

int test_strategie_2024(){
    printf("A - Position groupes pot.\n");
    printf("B - Calage debut.\n");
    printf("C - Attrape pot.\n");
    printf("D - Aller  a plante.\n");
    printf("E - Attrape plante.\n");
    printf("F - Aller zone plante.\n");
    printf("G - Pseudo homologation.\n");
    printf("H - reglage pots.\n");
    printf("I - echange pots.\n");
    
    int lettre;
    do{
        lettre = getchar_timeout_us(0);
    }while(lettre == PICO_ERROR_TIMEOUT || lettre == 0);
    switch(lettre){
        case 'a':
        case 'A':
            while(test_calcul_position_pot());
            break;

        case 'b':
        case 'B':
            while(test_calage_debut());
            break;

        case 'c':
        case 'C':
            while(test_attrape_pot());
            break;

        case 'd':
        case 'D':
            while(test_aller_a_plante());
            break;

        case 'e':
        case 'E':
            while(test_attrape_plante());
            break;

        case 'f':
        case 'F':
            while(test_aller_zone_plante());
            break;

        case 'g':
        case 'G':
            while(test_pseudo_homologation());
            break;

        case 'h':
        case 'H':
            while(test_attrape_1_pot());
            break;

        case 'i':
        case 'I':
            while(test_echange_pot());
            break;
            

        case 'q':
        case 'Q':
            return 0;

    }
}


void print_position(struct position_t position){
    printf("x_mm: %.2f, y_mm: %.2f, angle: %.2f\n", position.x_mm, position.y_mm, position.angle_radian/DEGRE_EN_RADIAN);
}

int test_calcul_position_pot(){
    printf("\ngroupe: GROUPE_POT_B1, pot: 5 \n");
    print_position(groupe_pot_get_pot(GROUPE_POT_B1, POT_5));

    printf("\ngroupe: GROUPE_POT_B2, pot: 1 \n");
    print_position(groupe_pot_get_pot(GROUPE_POT_B2, POT_1));

    printf("\ngroupe: GROUPE_POT_L1, pot: 1 \n");
    print_position(groupe_pot_get_pot(GROUPE_POT_L1, POT_1));

    printf("\ngroupe: GROUPE_POT_L2, pot: 1 \n");
    print_position(groupe_pot_get_pot(GROUPE_POT_L2, POT_1));

    printf("\ngroupe: GROUPE_POT_R1, pot: 1 \n");
    print_position(groupe_pot_get_pot(GROUPE_POT_R1, POT_1));

    printf("\ngroupe: GROUPE_POT_R2, pot: 1 \n");
    print_position(groupe_pot_get_pot(GROUPE_POT_R2, POT_1));

    printf("\ngroupe: GROUPE_POT_L1, pot: 1 \n");
    print_position(groupe_pot_get_pot(GROUPE_POT_L1, POT_1));

    printf("\ngroupe: GROUPE_POT_L1, pot: 2 \n");
    print_position(groupe_pot_get_pot(GROUPE_POT_L1, POT_2));

    printf("\ngroupe: GROUPE_POT_L1, pot: 3 \n");
    print_position(groupe_pot_get_pot(GROUPE_POT_L1, POT_3));

    printf("\ngroupe: GROUPE_POT_L1, pot: 4 \n");
    print_position(groupe_pot_get_pot(GROUPE_POT_L1, POT_4));

    printf("\ngroupe: GROUPE_POT_L1, pot: 5 \n");
    print_position(groupe_pot_get_pot(GROUPE_POT_L1, POT_5));

    return 0;

}


int test_calage_debut(){
    int lettre, _step_ms = 1, temps_ms=0, _step_ms_gyro=2,temps_ms_init;
    struct trajectoire_t trajectoire;
    enum evitement_t evitement;
    enum etat_action_t etat_action;
    printf("test_calage_debut\n");


    i2c_maitre_init();
    Trajet_init();
    Balise_VL53L1X_init();
    Localisation_set(250,250,0);

    
    set_position_avec_gyroscope(0);
    if(get_position_avec_gyroscope()){
        printf("Init gyroscope\n");
        Gyro_Init();
    }

    stdio_flush();
    Trajet_config(100, 500);

    multicore_launch_core1(affichage_test_strategie_2024);


    temps_ms = Temps_get_temps_ms();
    temps_ms_init = temps_ms;
    do{
        i2c_gestion(i2c0);
        i2c_annexe_gestion();
        Balise_VL53L1X_gestion();
        
        // Routines à 1 ms
        if(temps_ms != Temps_get_temps_ms()){
            temps_ms = Temps_get_temps_ms();
            QEI_update();
            Localisation_gestion();
            AsserMoteur_Gestion(_step_ms);
            Evitement_gestion(_step_ms);

            // Routine à 2 ms
            if(temps_ms % _step_ms_gyro == 0){
                if(get_position_avec_gyroscope()){
                    Gyro_Read(_step_ms_gyro);
                }
            }

            etat_action = Strategie_calage_debut(COULEUR_BLEU, _step_ms);

        }
        lettre = getchar_timeout_us(0);
    //}while((lettre == PICO_ERROR_TIMEOUT) || (lettre == 0));
    }while(etat_action == ACTION_EN_COURS);
    Moteur_Stop();
    
    return 0;

}

int test_attrape_plante(){
    int lettre, _step_ms = 1, temps_ms=0, _step_ms_gyro=2,temps_ms_init;
    struct trajectoire_t trajectoire;
    enum evitement_t evitement;
    enum etat_action_t etat_action=ACTION_EN_COURS;

    printf("test_aller_a_plante\n");

    i2c_maitre_init();
    Trajet_init();
    Balise_VL53L1X_init();

    
    set_position_avec_gyroscope(0);
    if(get_position_avec_gyroscope()){
        printf("Init gyroscope\n");
        Gyro_Init();
    }

    stdio_flush();

    multicore_launch_core1(affichage_test_strategie_2024);


    temps_ms = Temps_get_temps_ms();
    temps_ms_init = temps_ms;
    do{
        i2c_gestion(i2c0);
        i2c_annexe_gestion();
        Balise_VL53L1X_gestion();
        
        // Routines à 1 ms
        if(temps_ms != Temps_get_temps_ms()){
            temps_ms = Temps_get_temps_ms();
            QEI_update();
            Localisation_gestion();
            AsserMoteur_Gestion(_step_ms);
            Evitement_gestion(_step_ms);

            // Routine à 2 ms
            if(temps_ms % _step_ms_gyro == 0){
                if(get_position_avec_gyroscope()){
                    Gyro_Read(_step_ms_gyro);
                }
            }

            etat_action = Strat_2024_plante_dans_pot(_step_ms, PLANTE_BRAS_6, ZONE_PLANTE_3);


        }
        lettre = getchar_timeout_us(0);
    //}while((lettre == PICO_ERROR_TIMEOUT) || (lettre == 0));
    }while(etat_action == ACTION_EN_COURS);
    Moteur_Stop();
    
    return 0;

}

int test_aller_a_plante(){
    int lettre, _step_ms = 1, temps_ms=0, _step_ms_gyro=2,temps_ms_init;
    struct trajectoire_t trajectoire;
    enum evitement_t evitement;
    enum etat_action_t etat_action=ACTION_EN_COURS;

    printf("test_aller_a_plante\n");

    i2c_maitre_init();
    Trajet_init();
    Balise_VL53L1X_init();

    
    set_position_avec_gyroscope(0);
    if(get_position_avec_gyroscope()){
        printf("Init gyroscope\n");
        Gyro_Init();
    }

    stdio_flush();

    multicore_launch_core1(affichage_test_strategie_2024);


    temps_ms = Temps_get_temps_ms();
    temps_ms_init = temps_ms;
    do{
        i2c_gestion(i2c0);
        i2c_annexe_gestion();
        Balise_VL53L1X_gestion();
        
        // Routines à 1 ms
        if(temps_ms != Temps_get_temps_ms()){
            temps_ms = Temps_get_temps_ms();
            QEI_update();
            Localisation_gestion();
            AsserMoteur_Gestion(_step_ms);
            Evitement_gestion(_step_ms);

            // Routine à 2 ms
            if(temps_ms % _step_ms_gyro == 0){
                if(get_position_avec_gyroscope()){
                    Gyro_Read(_step_ms_gyro);
                }
            }

            etat_action = Strat_2024_aller_a_plante(ZONE_PLANTE_AUCUNE);


        }
        lettre = getchar_timeout_us(0);
    //}while((lettre == PICO_ERROR_TIMEOUT) || (lettre == 0));
    }while(etat_action == ACTION_EN_COURS);
    Moteur_Stop();
    
    return 0;

}



int test_aller_zone_plante(){
    int lettre, _step_ms = 1, temps_ms=0, _step_ms_gyro=2,temps_ms_init;
    struct trajectoire_t trajectoire;
    enum evitement_t evitement;
    enum etat_action_t etat_action=ACTION_EN_COURS;

    printf("test_aller_a_plante\n");

    i2c_maitre_init();
    Trajet_init();
    Balise_VL53L1X_init();

    
    set_position_avec_gyroscope(0);
    if(get_position_avec_gyroscope()){
        printf("Init gyroscope\n");
        Gyro_Init();
    }

    stdio_flush();

    multicore_launch_core1(affichage_test_strategie_2024);

    Localisation_set(800, 200, 0);


    temps_ms = Temps_get_temps_ms();
    temps_ms_init = temps_ms;
    do{
        i2c_gestion(i2c0);
        i2c_annexe_gestion();
        Balise_VL53L1X_gestion();
        
        // Routines à 1 ms
        if(temps_ms != Temps_get_temps_ms()){
            temps_ms = Temps_get_temps_ms();
            QEI_update();
            Localisation_gestion();
            AsserMoteur_Gestion(_step_ms);
            Evitement_gestion(_step_ms);

            // Routine à 2 ms
            if(temps_ms % _step_ms_gyro == 0){
                if(get_position_avec_gyroscope()){
                    Gyro_Read(_step_ms_gyro);
                }
            }

            etat_action = Strat_2024_aller_zone_plante(ZONE_PLANTE_3, _step_ms);


        }
        lettre = getchar_timeout_us(0);
    //}while((lettre == PICO_ERROR_TIMEOUT) || (lettre == 0));
    }while(etat_action == ACTION_EN_COURS);
    Moteur_Stop();
    
    return 0;

}


int test_attrape_pot(){
    int lettre, _step_ms = 1, temps_ms=0, _step_ms_gyro=2,temps_ms_init;
    struct trajectoire_t trajectoire;
    enum evitement_t evitement;
    enum etat_action_t etat_action=ACTION_EN_COURS;

    enum {
        TAP_CALAGE,
        TAP_POT
    } etat_test = TAP_CALAGE;

    printf("test_attrape_pot\n");


    i2c_maitre_init();
    Trajet_init();
    Balise_VL53L1X_init();
    Localisation_set(250, 250, (45. * DEGRE_EN_RADIAN) - ANGLE_PINCE);

    
    set_position_avec_gyroscope(1);
    if(get_position_avec_gyroscope()){
        printf("Init gyroscope\n");
        Gyro_Init();
    }

    stdio_flush();
    Trajet_config(TRAJECT_CONFIG_STD);

    multicore_launch_core1(affichage_test_strategie_2024);


    temps_ms = Temps_get_temps_ms();
    temps_ms_init = temps_ms;
    do{
        i2c_gestion(i2c0);
        i2c_annexe_gestion();
        Balise_VL53L1X_gestion();
        
        // Routines à 1 ms
        if(temps_ms != Temps_get_temps_ms()){
            temps_ms = Temps_get_temps_ms();
            QEI_update();
            Localisation_gestion();
            AsserMoteur_Gestion(_step_ms);
            Evitement_gestion(_step_ms);

            // Routine à 2 ms
            if(temps_ms % _step_ms_gyro == 0){
                if(get_position_avec_gyroscope()){
                    Gyro_Read(_step_ms_gyro);
                }
            }
            switch(etat_test){
                case TAP_CALAGE:
                    if(Strategie_calage_debut_manuel(COULEUR_BLEU, _step_ms) == ACTION_TERMINEE){
                        etat_test=TAP_POT;
                    }
                    break;
                case TAP_POT:
                    etat_action = Strat_2024_attrape_pot(GROUPE_POT_B1, _step_ms);
                    break;
            }

        }
        lettre = getchar_timeout_us(0);
    //}while((lettre == PICO_ERROR_TIMEOUT) || (lettre == 0));
    }while(etat_action == ACTION_EN_COURS);
    printf("STRATEGIE_LOOP_2\n");
    printf("Lettre : %d; %c\n", lettre, lettre);

    while(1){Moteur_Stop();}
    
    if(lettre == 'q' && lettre == 'Q'){
        return 0;
    }
    return 0;

}

int test_pseudo_homologation(){
    int lettre, _step_ms = 1, temps_ms=0, _step_ms_gyro=2,temps_ms_init;
    struct trajectoire_t trajectoire;
    enum evitement_t evitement;
    enum etat_action_t etat_action=ACTION_EN_COURS;
    static int tempo_ms;

    enum {
        TAP_CALAGE,
        TAP_POT,
        TAP_PLANTE_ORIENTATION,
        TAP_PLANTE_ATTRAPE_1,
        TAP_PLANTE_ATTRAPE_2,
        TAP_RENTRE,
        TAP_DEPOSE
    } etat_test = TAP_CALAGE;

    printf("test_pseudo_homologation\n");


    i2c_maitre_init();
    Trajet_init();
    Balise_VL53L1X_init();
    Localisation_set(250, 250, (45. * DEGRE_EN_RADIAN) - ANGLE_PINCE);

    
    set_position_avec_gyroscope(1);
    if(get_position_avec_gyroscope()){
        printf("Init gyroscope\n");
        Gyro_Init();
    }

    stdio_flush();
    Trajet_config(TRAJECT_CONFIG_STD);

    multicore_launch_core1(affichage_test_strategie_2024);


    temps_ms = Temps_get_temps_ms();
    temps_ms_init = temps_ms;
    do{
        i2c_gestion(i2c0);
        i2c_annexe_gestion();
        Balise_VL53L1X_gestion();
        
        // Routines à 1 ms
        if(temps_ms != Temps_get_temps_ms()){
            temps_ms = Temps_get_temps_ms();
            QEI_update();
            Localisation_gestion();
            AsserMoteur_Gestion(_step_ms);
            Evitement_gestion(_step_ms);

            // Routine à 2 ms
            if(temps_ms % _step_ms_gyro == 0){
                if(get_position_avec_gyroscope()){
                    Gyro_Read(_step_ms_gyro);
                }
            }
            switch(etat_test){
                case TAP_CALAGE:
                    if(Strategie_calage_debut_manuel(COULEUR_BLEU, _step_ms) == ACTION_TERMINEE){
                        etat_test=TAP_POT;
                    }
                    break;
                case TAP_POT:
                    if(Strat_2024_attrape_pot(GROUPE_POT_B1, _step_ms) == ACTION_TERMINEE){
                        etat_test=TAP_PLANTE_ORIENTATION;
                    }
                    break;

                case TAP_PLANTE_ORIENTATION:
                    if(Strat_2024_aller_zone_plante(ZONE_PLANTE_3, _step_ms) == ACTION_TERMINEE){
                        etat_test=TAP_PLANTE_ATTRAPE_1;
                    }
                    break;

                case TAP_PLANTE_ATTRAPE_1:
                    etat_action = Strat_2024_plante_dans_pot(_step_ms, PLANTE_BRAS_1, ZONE_PLANTE_3);
                    if( etat_action == ACTION_TERMINEE){
                        etat_test=TAP_PLANTE_ATTRAPE_2;
                        etat_action = ACTION_EN_COURS;
                    }else if( etat_action == ACTION_ECHEC){
                        etat_test=TAP_RENTRE;
                        etat_action = ACTION_EN_COURS;
                    }
                    break;
                
                case TAP_PLANTE_ATTRAPE_2:
                    etat_action = Strat_2024_plante_dans_pot(_step_ms, PLANTE_BRAS_6, ZONE_PLANTE_3);
                    if( etat_action == ACTION_TERMINEE){
                        etat_test=TAP_RENTRE;
                        etat_action = ACTION_EN_COURS;
                    }else if( etat_action == ACTION_ECHEC){
                        etat_test=TAP_RENTRE;
                        etat_action = ACTION_EN_COURS;
                    }
                    break;

                case TAP_RENTRE:
                    float angle_destination;
                    angle_destination = 15 * DEGRE_EN_RADIAN;
                    Trajet_config(TRAJECT_CONFIG_AVANCE_ET_TOURNE);
                    if(Strategie_tourner_et_aller_a(450, 450, angle_destination, EVITEMENT_PAUSE_DEVANT_OBSTACLE, _step_ms) == ACTION_TERMINEE){
                        etat_test=TAP_DEPOSE;
                        i2c_annexe_actionneur_pot(0, BRAS_POT_SOL, DOIGT_TIENT);
                        i2c_annexe_actionneur_pot(5, BRAS_POT_SOL, DOIGT_TIENT);
                        tempo_ms=500;
                    }
                    break;
                
                case TAP_DEPOSE:
                    tempo_ms--;
                    commande_vitesse_stop();
                    if(tempo_ms<= 0){
                        i2c_annexe_actionneur_pot(0, BRAS_POT_SOL, DOIGT_LACHE);
                        i2c_annexe_actionneur_pot(5, BRAS_POT_SOL, DOIGT_LACHE);
                    }
                    break;

            }

        }
        lettre = getchar_timeout_us(0);
    //}while((lettre == PICO_ERROR_TIMEOUT) || (lettre == 0));
    }while(etat_action == ACTION_EN_COURS);
    printf("STRATEGIE_LOOP_2\n");
    printf("Lettre : %d; %c\n", lettre, lettre);

    while(1){Moteur_Stop();}
    
    if(lettre == 'q' && lettre == 'Q'){
        return 0;
    }
    return 0;

}

extern float abscisse;
void affichage_test_strategie_2024(){
    uint32_t temps;
    enum validite_vl53l8_t validite_vl53l8;
    float angle, distance;
    
    while(true){
        temps = time_us_32()/1000;
        //temps_cycle_display();
        printf(">V_consigne_A:%ld:%f\n>V_consigne_B:%ld:%f\n>V_consigne_C:%ld:%f\n", temps, AsserMoteur_getConsigne_mm_s(MOTEUR_A), temps, AsserMoteur_getConsigne_mm_s(MOTEUR_B), temps, AsserMoteur_getConsigne_mm_s(MOTEUR_C));
        printf(">pos_x:%ld:%f\n", temps, Localisation_get().x_mm);
        printf(">pos_y:%ld:%f\n", temps, Localisation_get().y_mm);
        printf(">pos_angle:%ld:%f\n", temps, (Localisation_get().angle_radian + ANGLE_PINCE)/ DEGRE_EN_RADIAN );

        printf(">c_pos_x:%ld:%f\n", temps, Trajet_get_consigne().x_mm);
        printf(">c_pos_y:%ld:%f\n", temps, Trajet_get_consigne().y_mm);
        printf(">c_pos_angle:%ld:%f\n", temps, (Trajet_get_consigne().angle_radian+ ANGLE_PINCE) / DEGRE_EN_RADIAN);

        printf(">abscisse:%ld:%f\n", temps, abscisse);

        printf(">tirette:%ld:%d\n", temps, attente_tirette());

        printf(">distance_obstacle:%ld:%f\n", temps, Trajet_get_obstacle_mm());
        printf(">angle_avance:%ld:%f\n", temps, Trajet_get_orientation_avance());

        i2c_annexe_get_VL53L8(&validite_vl53l8, &angle, &distance);
        printf(">v:%d\n", validite_vl53l8);
        switch(validite_vl53l8){
            case VL53L8_BORDURE:
                printf(">b_angle:%.2f\n>b_distance:%.2f\n", angle, distance);
                break;
            case VL53L8_PLANTE:
                printf(">p_angle:%.2f\n>p_distance:%.2f\n", angle, distance);
                break;
            case VL53L8_DISTANCE_LOIN:
                printf("\n>v_distance:%.2f\n", distance);
                break;
        }
        
        sleep_ms(10);
    }
}

/// @brief Fonction abandonnée - pour le réglage des bras un par un 
/// @param  
/// @return 
int test_attrape_1_pot(void){
    int lettre, _step_ms = 1, temps_ms=0, _step_ms_gyro=2,temps_ms_init;
    struct trajectoire_t trajectoire;
    enum evitement_t evitement;
    enum etat_action_t etat_action=ACTION_EN_COURS;
    int32_t tempo_ms;

    enum {
        TAP_CALAGE,
        TAP_APPROCHE_POT,
        TAP_TOURNE_POT,
        TAP_ATTRAPE_POT,
        TAP_ATTRAPE_TEMPO
    } etat_test = TAP_CALAGE;

    printf("test_attrape_1_pot\n");


    i2c_maitre_init();
    Trajet_init();
    Balise_VL53L1X_init();
    Localisation_set(250, 250, (45. * DEGRE_EN_RADIAN) - ANGLE_PINCE);

    
    set_position_avec_gyroscope(1);
    if(get_position_avec_gyroscope()){
        printf("Init gyroscope\n");
        Gyro_Init();
    }

    stdio_flush();
    Trajet_config(TRAJECT_CONFIG_STD);

    multicore_launch_core1(affichage_test_strategie_2024);

    float angle_bras[6] =
    {
        180 * DEGRE_EN_RADIAN,
        120 * DEGRE_EN_RADIAN,
        60 * DEGRE_EN_RADIAN,
        0,
        -60 * DEGRE_EN_RADIAN,
        -120 * DEGRE_EN_RADIAN
    };

    float angle_bras_correction[6] =
    {
        11 * DEGRE_EN_RADIAN,
        0 * DEGRE_EN_RADIAN,
        0 * DEGRE_EN_RADIAN,
        0,
        0 * DEGRE_EN_RADIAN,
        13 * DEGRE_EN_RADIAN
    };


    temps_ms = Temps_get_temps_ms();
    temps_ms_init = temps_ms;
    static struct position_t position_pot, position_approche_pot, position_attrape_pot;
    position_pot = groupe_pot_get_pot(GROUPE_POT_B1, POT_5);
    position_approche_pot = Geometrie_deplace(position_pot, -DISTANCE_APPROCHE_POT_MM);
    position_attrape_pot = Geometrie_deplace(position_pot, -DISTANCE_ATTRAPE_POT_MM);

    int bras = BRAS_1;

    do{
        i2c_gestion(i2c0);
        i2c_annexe_gestion();
        Balise_VL53L1X_gestion();
        
        // Routines à 1 ms
        if(temps_ms != Temps_get_temps_ms()){
            temps_ms = Temps_get_temps_ms();
            QEI_update();
            Localisation_gestion();
            AsserMoteur_Gestion(_step_ms);
            Evitement_gestion(_step_ms);

            // Routine à 2 ms
            if(temps_ms % _step_ms_gyro == 0){
                if(get_position_avec_gyroscope()){
                    Gyro_Read(_step_ms_gyro);
                }
            }
            switch(etat_test){
                case TAP_CALAGE:
                    if(Strategie_calage_debut(COULEUR_BLEU, _step_ms) == ACTION_TERMINEE){
                        etat_test=TAP_APPROCHE_POT;
                    }
                    break;
                case TAP_APPROCHE_POT:
                    Trajet_config(TRAJECT_CONFIG_AVANCE_ET_TOURNE);
                    if(Strategie_aller_a(position_approche_pot.x_mm, position_approche_pot.y_mm, _step_ms) == ACTION_TERMINEE){
                        etat_test=TAP_TOURNE_POT;
                    }
                    break;

                case TAP_TOURNE_POT:
                    if( Strategie_tourner_a(position_approche_pot.angle_radian - angle_bras[bras] + angle_bras_correction[bras], _step_ms) == ACTION_TERMINEE){
                        etat_test=TAP_ATTRAPE_POT;
                    }
                    break;
                
                case TAP_ATTRAPE_POT:
                    Trajet_config(TRAJECT_CONFIG_AVANCE_ET_TOURNE);
                    i2c_annexe_actionneur_pot(bras, BRAS_POT_SOL, DOIGT_TIENT);
                    if( Strategie_tourner_et_aller_a(
                            position_attrape_pot.x_mm, position_attrape_pot.y_mm, position_attrape_pot.angle_radian - angle_bras[bras] + angle_bras_correction[bras],
                            EVITEMENT_SANS_EVITEMENT, _step_ms) == ACTION_TERMINEE){
                        i2c_annexe_actionneur_pot(bras, BRAS_HAUT, DOIGT_TIENT);
                        tempo_ms = 2000;
                        etat_test = TAP_ATTRAPE_TEMPO;
                    }
                    break;
                
                case TAP_ATTRAPE_TEMPO:
                    tempo_ms--;
                    if(tempo_ms < 0){
                        etat_action = ACTION_TERMINEE;
                    }
                    break;
            }

        }
        lettre = getchar_timeout_us(0);
    //}while((lettre == PICO_ERROR_TIMEOUT) || (lettre == 0));
    }while(etat_action == ACTION_EN_COURS);
    printf("STRATEGIE_LOOP_2\n");
    printf("Lettre : %d; %c\n", lettre, lettre);

    while(1){Moteur_Stop();}
    
    if(lettre == 'q' && lettre == 'Q'){
        return 0;
    }
    return 0;

}


int test_echange_pot(){
    int lettre, _step_ms = 1, temps_ms=0, _step_ms_gyro=2,temps_ms_init;
    struct trajectoire_t trajectoire;
    enum evitement_t evitement;
    enum etat_action_t etat_action=ACTION_EN_COURS;
    static int tempo_ms;

    static enum {
        TEP_INIT,
        TEP_ACTION,
    } etat_echange_pot = TEP_INIT;

    printf("test_echange_pot\n");

    i2c_maitre_init();
    Trajet_init();
    Balise_VL53L1X_init();

    
    set_position_avec_gyroscope(1);
    if(get_position_avec_gyroscope()){
        printf("Init gyroscope\n");
        Gyro_Init();
    }

    stdio_flush();

    multicore_launch_core1(affichage_test_strategie_2024);


    temps_ms = Temps_get_temps_ms();
    temps_ms_init = temps_ms;
    do{
        i2c_gestion(i2c0);
        i2c_annexe_gestion();
        Balise_VL53L1X_gestion();
        
        // Routines à 1 ms
        if(temps_ms != Temps_get_temps_ms()){
            temps_ms = Temps_get_temps_ms();
            QEI_update();
            Localisation_gestion();
            AsserMoteur_Gestion(_step_ms);
            Evitement_gestion(_step_ms);

            // Routine à 2 ms
            if(temps_ms % _step_ms_gyro == 0){
                if(get_position_avec_gyroscope()){
                    Gyro_Read(_step_ms_gyro);
                }
            }

            switch(etat_echange_pot){
                case TEP_INIT:
                    i2c_annexe_actionneur_pot(0, BRAS_POT_SOL, DOIGT_TIENT);
                    i2c_annexe_actionneur_pot(1, BRAS_HAUT, DOIGT_TIENT);
                    i2c_annexe_actionneur_pot(2, BRAS_POT_SOL, DOIGT_TIENT);
                    i2c_annexe_actionneur_pot(3, BRAS_POT_SOL, DOIGT_TIENT);
                    i2c_annexe_actionneur_pot(4, BRAS_HAUT, DOIGT_TIENT);
                    i2c_annexe_actionneur_pot(5, BRAS_POT_SOL, DOIGT_TIENT);
                    tempo_ms=3000;
                    etat_echange_pot = TEP_ACTION;
                    break;

                case TEP_ACTION:
                    tempo_ms--;
                    if (tempo_ms <= 0)
                    {
                        etat_action = Strat_2024_echange_pot_avant_arriere(_step_ms);
                    }
                    break;


            }

        }
        lettre = getchar_timeout_us(0);
    //}while((lettre == PICO_ERROR_TIMEOUT) || (lettre == 0));
    }while(etat_action == ACTION_EN_COURS);
    Moteur_Stop();
    
    return 0;

}