librairie actions gros robot carte esclave

Dependents:   carte_esclave201_petit_rob carte_esclave2019 carte_esclave_PETIT_ROBOT_2019

actions_Gr.cpp

Committer:
marwanesaich
Date:
2019-05-31
Revision:
20:109dbdd0230b
Parent:
19:2281a0ef54e4
Child:
21:04ae86f7fdc8

File content as of revision 20:109dbdd0230b:

#include "actions_Gr.h"


#ifdef ROBOT_BIG
#define MASK_PRESENTOIR_AV 0x07
#define MASK_PRESENTOIR_AR 0x70

#define MASK_GOLDENIUM_AV 0x02
#define MASK_GOLDENIUM_AR 0x20

#define MASK_SOL_AV 0x08
#define MASK_SOL_AR 0x80

#define MASK_AV_DROIT 0x01
#define MASK_AR_DROIT 0x10

#define MASK_AV_DROIT_GAUCHE 0x05
#define MASK_AR_DROIT_GAUCHE 0x50

#define MASK_FC_DROIT   0x01
#define MASK_CT_DROIT   0x02

#define MASK_FC_GAUCHE  0x04
#define MASK_CT_GAUCHE  0x08

#define POS_DOIGT_GAUCHE 605
#define POS_DOIGT_DROIT  369
#define POS_DOIGT_GAUCHE_SUIV 535
#define POS_DOIGT_DROIT_SUIV  439

char status_pompe=0;
bool flag_ascenseur = 0, flag_ascenseur_force_on = 0, flag_ascenseur_force_off = 0;

char fpresentoir_avant=0, fpresentoir_arriere=0;
char fgoldenium_avant=0, fgoldenium_arriere=0;
char fsol_avant=0,fsol_arriere=0;
char fsol_avant_relache=0,fsol_arriere_relache=0;
char fbalance_avant=0,fbalance_arriere=0;
char favant_relache=0,farriere_relache=0;
char faccelerateur_avant=0,faccelerateur_arriere=0;

int flag_vide_vert_rouge=0,flag_vide_bleu=0;

DigitalIn couleur_haut[3] = {PA_9,PA_10,PA_11}; //GC1
DigitalIn couleur_bas[3] = {PB_12,PB_13,PB_14}; //GC2

PwmOut PWM_roue_Gauche(PA_15);
PwmOut PWM_roue_Droite(PC_9);

char buffer_couleur_bas[SIZE_FIFO];
unsigned char FIFO_couleur_ecriture=0;
signed char FIFO_couleur_lecture=0;
char status_contact=0;
int nbPaletsVerts = 0, nbPaletsBleus = 0;

Timer timer_bloquer;

Timer timeout;

void rateau(int etat){
    
    uint8_t servos_rateau_on[4] = {GLED_ON, rateau_D,GLED_ON, rateau_G};
    uint16_t pos_rateau_on[2] = {280,774};
    
    uint8_t servos_rateau_off[4] = {GLED_ON, rateau_D, GLED_ON, rateau_G};
    uint16_t pos_rateau_off[2] = {512,512};
    
    
    if( etat == 1){
        positionControl_Mul_ensemble_complex(2,100,servos_rateau_on,pos_rateau_on,3);
    }
    else{
       positionControl_Mul_ensemble_complex(2,100,servos_rateau_off,pos_rateau_off,3);    
    }

        
}
void roue(int allume)
{
    if(cote)
    {
        PWM_roue_Gauche.write(float(allume));// = 1.0;//VIT_ROUE*allume;
        PWM_roue_Droite.write(0);
    }
    else
    {
        PWM_roue_Droite.write(float(allume));// = 1.0;//VIT_ROUE*allume;
        PWM_roue_Gauche.write(0);
    }
}

void convoyeur_gauche_jaune(void)
{

    typedef enum {init, etalonnage, tmp_pret, pret, pousse, tmp,retour, vide, tmp_vide, fin_vide} type_etat ;
    static type_etat etat = init;
    static int16_t pos = 0, consigne_pos, consigne_roue;
    static int16_t previous_pos = getPos(stockage_G,1);
    static int cpt_vider = 0;
    int flag_debut = 0;
    //static int pos_vide[8] = {800, 100, 500, 900, 200, 600, 1000, 400};
    static int pos_vide[11] = {800, 100, 500, 900, 200, 600, 1000, 300, 700, 24, 400};
    /*if(flag_vide_vert_rouge)
    {
         etat = init;
         flag_vide_vert_rouge = 0;
    }*/

    switch(etat) {

        case init :
            velocityControl(stockage_G,-512,BLED_ON,1);
            pos = getPos(stockage_G,1);
            if(previous_pos != pos) {
                etat = etalonnage;
                //pc.printf("ETALONNAGE\n");

            }
            break;

        case etalonnage :
            pos = getPos(stockage_G,1);
            wait_us(500);
            if(   ( (21<pos && pos<260) /*|| (404<pos && pos<812)*/ )  and (status_contact & MASK_FC_GAUCHE)) {
                velocityControl(stockage_G,0,GLED_ON,1);
                wait_ms(300);
                pos = getPos(stockage_G,1) ;
                consigne_pos = pos + 180;
                positionControl(stockage_G,consigne_pos,1,BLED_ON,1);
                etat = tmp_pret;
                //pc.printf("TMP_PRET\n");
            }
            break;

        case tmp_pret :
            pos = getPos(stockage_G,1);
            wait_us(500);
            if(pos> (consigne_pos-5)) {
                //pc.printf("pos pret %d\n", pos);
                etat = pret;
                //pc.printf("PRET\n");

            }
            break;

        case pret :
            if(flag_vide_vert_rouge) {
                flag_vide_vert_rouge =0;
                flag_debut = 0;
                etat = vide;
                SendAck(ACKNOWLEDGE_HERKULEX, ACK_ACTION);
            } else if((status_contact & MASK_CT_GAUCHE)) {
                consigne_pos = (getPos(stockage_G,1)+550);

                //if(consigne_pos>1105) consigne_pos -= 1105;
                //pc.printf("consigne pousse %d\n", consigne_pos);
                deverouillage_torque_convoyeurs_gauche();
                wait_us(500);
                positionControl(stockage_G,consigne_pos,1,BLED_ON,1);
                //compteTour(stockage_G,+1023,0,consigne_pos,BLED_ON,1);
                etat = pousse;
                //pc.printf("POUSSE\n");
            }
            break;

        case pousse :
            pos = getPos(stockage_G,1);
            //pc.printf("%d\n", pos);
            wait_us(500);
            if(pos>(consigne_pos-5) and (status_contact & MASK_CT_GAUCHE)==0) {
                consigne_pos = pos - 550;
                deverouillage_torque_convoyeurs_gauche();
                wait_us(500);
                positionControl(stockage_G,consigne_pos,1,BLED_ON,1);
                etat = retour;
                //pc.printf("RETOUR\n");
            }

            break;
        case retour :
            pos = getPos(stockage_G,1) ;
            wait_us(500);
            if(pos< (consigne_pos+5)) {
                etat = pret;
                //pc.printf("PRET\n");
            }
            break;
        /*   
        case vide:
            pos = getPos(stockage_G,1);
            if(!flag_debut){
                flag_debut =1;
                consigne_pos = (pos+420)%1105;
            }
            else{
                
                consigne_pos = (pos+400)%1105;
            }
            
            pc.printf("\n1 pos : %d   consigne %d\n",pos, consigne_pos);
            //ACTIVERMOTEUR
            roue(1);
            //compteTour(stockage_G,+1023,3,consigne_pos,BLED_ON,1);
            
            if(cpt_vider<7){
                compteTour(stockage_G,+200,0,consigne_pos,BLED_ON,1);
                //positionControl(stockage_G,consigne_pos,1,BLED_ON,1);
                pc.printf("TMP_VIDE\n");
                etat = tmp_vide;
            
            }else{
                //arreter moteurs
                etat = init; 
                cpt_vider = 0;
               roue(0);
                pc.printf("INIT\n");   
            }
            break;
            
        case tmp_vide:
            
            pos = getPos(stockage_G,1) ;
            wait_us(500);
            if(pos< (consigne_pos+5)) {
                cpt_vider +=1;
                consigne_roue = 815;
                positionControl(roue_G,consigne_roue,40,BLED_ON,1);
                etat = fin_vide;
                pc.printf("FIN_VIDE\n");
            }  
            
            break; 
            
        case fin_vide:
            pos = getPos(roue_G,1) ;
            wait_us(500);
            if(pos> (consigne_roue-5)) {
                wait_ms(300.0);
                positionControl(roue_G,780,1,BLED_ON,1);
                pc.printf("VIDE\n");
                wait_ms(300.0);
                etat = vide;
            }

            break;
    }*/
    case vide:
            
            velocityControl(stockage_G, 400, BLED_ON,1);
            wait_ms(200);
            roue(1);
            
            if(cpt_vider<9){
                etat = tmp_vide;
                //pc.printf("TMP_VIDE\n");
            
            }else{
                etat = init; 
                SendAck(ACKNOWLEDGE_HERKULEX, ACK_FIN_ACTION);
                SendCharCan(NB_PALETS_VERTS, nbPaletsVerts);    
                nbPaletsVerts =0;
                cpt_vider = 0;
                roue(0);
                uint8_t servos_roulette_gauche[2] = {GLED_ON, roue_G};
                uint16_t pos_roulette_gauche[1] = {512};
                positionControl_Mul_ensemble_complex(1,100,servos_roulette_gauche,pos_roulette_gauche,1);
    
    

                //pc.printf("INIT\n");   
            }
            break;
            
        case tmp_vide:
            pos = getPos(stockage_G,1); 
            wait_us(100); 
            if(pos >= pos_vide[cpt_vider%11] && pos <= (pos_vide[cpt_vider%11]+20)){  //if(pos == pos_vide[cpt_vider%5])
                velocityControl(stockage_G, 0, BLED_ON,1);
                positionControl(stockage_G,pos-30,1,BLED_ON,1);
                //pc.printf("pos :%d\n", pos);               
                consigne_roue = 840;
                positionControl(roue_G,consigne_roue,1,BLED_ON,1);
                etat = fin_vide;
                timer_bloquer.start();
                timer_bloquer.reset();
            }
        
            break; 
            
        case fin_vide:
            pos = getPos(roue_G,1) ;
            wait_us(500);
            if(pos> (consigne_roue-5)  ||  timer_bloquer>2) {
                positionControl(roue_G,750,50,BLED_ON,1);
                verification();
                cpt_vider ++;
                etat = vide;
            }

            break;
    }
}

void convoyeur_droit_jaune(void)
{

    typedef enum {init, etalonnage, tmp_pret, pret, pousse, retour, vide, fin_vide} type_etat ;
    static type_etat etat = init;
    static int16_t pos = 0, consigne_pos;
    static int16_t previous_pos = getPos(stockage_D,3);
    static int flag_ack = 0;
    int vInit = 512;
    /*
    if(flag_vide_bleu){
        etat = init;
        flag_vide_bleu = 0;
    }*/

    switch(etat) {

        case init :
            velocityControl(stockage_D,vInit,BLED_ON,3);
            wait_us(500);
            pos = getPos(stockage_D,3);
            if(previous_pos != pos) {
                etat = etalonnage;
                //pc.printf("ETALONNAGE\n");
            }
            break;

        case etalonnage :
            pos = getPos(stockage_D,3);
            wait_us(500);
            if(( /*(21<pos && pos<428) || */(572<pos && pos<700) ) and (status_contact & MASK_FC_DROIT)) {
                velocityControl(stockage_D,0,GLED_ON,3);
                wait_ms(300);
                pos = getPos(stockage_D,3) ;
                //pc.printf("pos %d\n", pos);
                //positionControl(stockage_D,pos-2000,1,BLED_ON,3);
                consigne_pos =pos-550;
                if(consigne_pos<0) consigne_pos += 1105;
                //pc.printf("consigne : %d \n",consigne_pos);
                compteTour(stockage_D,-1023,1,consigne_pos,BLED_ON,3);
                //pc.printf("pos fin tour : %d \n",getPos(stockage_D,3));
                wait_us(500);
                etat = tmp_pret;
                //pc.printf("TMP_PRET\n");
            }
            break;

        case tmp_pret :
            pos = getPos(stockage_D,3) ;
            wait_us(500);
            if(pos < (consigne_pos+5)) {

                //pc.printf("pos fin %d\n", pos);
                if(flag_ack){
                    SendAck(ACKNOWLEDGE_HERKULEX, ACK_FIN_ACTION);
                    SendCharCan(NB_PALETS_BLEU, nbPaletsBleus); 
                    nbPaletsBleus = 0;   
                }
                flag_ack = 1;
                etat = pret;
                //pc.printf("PRET\n");
            }
            break;

        case pret :

            if(flag_vide_bleu) {
                flag_vide_bleu =0;
                vInit = 1023;
                etat = init;
                SendAck(ACKNOWLEDGE_HERKULEX, ACK_ACTION);
                //pc.printf("vide\n");
            } else if((status_contact & MASK_CT_DROIT)) {
                ///pc.printf("%d\n",pos);
                consigne_pos = getPos(stockage_D,3)+ 550;
                deverouillage_torque_convoyeurs_droit();
                wait_us(500);
                positionControl(stockage_D,consigne_pos,1,BLED_ON,3);
                wait_us(500);
                etat = pousse;
                //pc.printf("POUSSE\n");
            }
            break;

        case pousse :
            pos = getPos(stockage_D,3);
            wait_us(500);
            if(pos>(consigne_pos-5) and (status_contact & MASK_CT_DROIT)==0) {
                //pc.printf("%d\n",pos);
                consigne_pos = pos - 550;
                deverouillage_torque_convoyeurs_droit();
                wait_us(500);
                positionControl(stockage_D,consigne_pos,1,BLED_ON,3);
                wait_us(500);
                etat = retour;
                //pc.printf("RETOUR\n");
            }

            break;

        case retour :
            pos = getPos(stockage_D,3) ;
            wait_us(500);
            if(pos< (consigne_pos+5)) {
                etat = pret;
                //pc.printf("PRET\n");
            }
            break;
/*
        case vide:
            consigne_pos = getPos(stockage_D,3);
            compteTour(stockage_D,+1023,2,consigne_pos,BLED_ON,3);
            etat = fin_vide;
            break;
        case fin_vide:
            pos = getPos(stockage_D,3) ;
            wait_us(500);
            if(pos> (consigne_pos-5)) {
                etat = init;
                SendAck(ACKNOWLEDGE_HERKULEX, ACK_FIN_ACTION);
                //pc.printf("INIT\n");
            }

            break;*/
    }
}

void convoyeur_gauche_violet(void)
{

    typedef enum {init, etalonnage, tmp_pret, pret, pousse, retour, vide, fin_vide} type_etat ;
    static type_etat etat = init;
    static int16_t pos = 0, consigne_pos, pos_pret;
    static int16_t previous_pos = getPos(stockage_G,1);
    static int vInit = -512;
    static int flag_ack = 0;
    /*
    if(flag_vide_bleu){
        etat = init;
        flag_vide_bleu = 0;
    }*/
    switch(etat) {

        case init :
            velocityControl(stockage_G,vInit,BLED_ON,1);
            wait_us(500);
            pos = getPos(stockage_G,1);
            wait_us(500);
            if(previous_pos != pos) {
                etat = etalonnage;
                // pc.printf("ETALONNAGE\n");
            }
            break;

        case etalonnage :
            pos = getPos(stockage_G,1);
            if(((21<pos && pos<228)/* || (572<pos && pos<980)*/) and (status_contact & MASK_FC_GAUCHE)) { //!!!!!!!!!!!!!changer les bornes
                velocityControl(stockage_G,0,GLED_ON,1);
                wait_ms(500);
                pos = getPos(stockage_G,1) ;
                //pc.printf("pos depart: %d\n",pos);
                wait_us(500);
                pos_pret = pos + 500;
                if(pos_pret >1105) pos_pret -= 1105;
                
                //pc.printf("pos : %d   consigne : %d\n",pos,pos_pret);
                compteTour(stockage_G,1023,1,pos_pret,BLED_ON,1);
                wait_us(500);
                etat = tmp_pret;
                ////pc.printf("TMP_PRET\n");
            }
            break;

        case tmp_pret :
            pos = getPos(stockage_G,1) ;
            wait_us(500);
            if(pos> (pos_pret-5)) {
                etat = pret;
                if(flag_ack){
                    SendAck(ACKNOWLEDGE_HERKULEX, ACK_FIN_ACTION);
                    SendCharCan(NB_PALETS_BLEU, nbPaletsBleus);   
                    nbPaletsBleus = 0; 
                }
                flag_ack = 1;
                //pc.printf("PRET\n");
            }
            break;

        case pret :
            if(flag_vide_bleu) {
                flag_vide_bleu =0;
                vInit = -1023;
                etat = init;
                SendAck(ACKNOWLEDGE_HERKULEX, ACK_ACTION);
            } else if((status_contact & MASK_CT_GAUCHE)) {
                consigne_pos = (pos_pret- 550);
                if(consigne_pos<0)consigne_pos+=1105;
                wait_us(500);
                deverouillage_torque_convoyeurs_gauche();
                wait_us(500);
                //pc.printf("pos:%d  consigne:%d\n",pos, consigne_pos);
                
                //compteTour(stockage_G,-1023,0,consigne_pos,BLED_ON,1);
                positionControl(stockage_G,consigne_pos,1,BLED_ON,1);
                wait_us(500);
                etat = pousse;
                //pc.printf("POUSSE\n");
            }
            break;

        case pousse :
            pos = getPos(stockage_G,1);
            wait_us(500);
            if(pos<(consigne_pos+5) and (status_contact & MASK_CT_GAUCHE)==0) {
                //pc.printf("%d\n",pos);
                deverouillage_torque_convoyeurs_gauche();
                wait_us(500);
                
                //compteTour(stockage_G,1023,0,pos_pret,BLED_ON,1);
                positionControl(stockage_G,pos_pret,1,BLED_ON,1);
                wait_us(500);
                etat = retour;
                //pc.printf("RETOUR\n");
            }

            break;

        case retour :
            pos = getPos(stockage_G,1) ;
            wait_us(500);
            if(pos> (pos_pret-5)) {
                etat = pret;
                //pc.printf("PRET\n");
            }
            break;
/*
        case vide:
            consigne_pos = getPos(stockage_G,1);
            compteTour(stockage_G,-1023,2,consigne_pos,BLED_ON,1);
            etat = fin_vide;
            break;
        case fin_vide:
            pos = getPos(stockage_G,1) ;
            wait_us(500);
            if(pos< (consigne_pos+5)) {
                etat = init;
                SendAck(ACKNOWLEDGE_HERKULEX, ACK_FIN_ACTION);
                SendChar(NB_PALETS_BLEU, nbPaletsVerts);    
                //pc.printf("PRET\n");
            }

            break;*/
    }
}

void convoyeur_droit_violet(void)
{

    typedef enum {init, etalonnage, tmp_pret, pret, pousse, tmp,retour, vide, fin_vide,tmp_vide} type_etat ;
    static type_etat etat = init;
    static int16_t pos = 0, consigne_pos,consigne_roue;
    static int16_t previous_pos = getPos(stockage_D,3);
    static int cpt_vider=0;
    //static int pos_vide[5] = {400, 1000, 600, 200, 800};
    static int pos_vide[11] = {400, 24, 700, 300, 1000, 600, 200, 900, 500, 100, 800};
    /*
    if(flag_vide_vert_rouge){
        etat = init;
        flag_vide_vert_rouge = 0;
    }   */

    switch(etat) {

        case init :
            velocityControl(stockage_D,+512,BLED_ON,3);
            wait_us(500);
            pos = getPos(stockage_D,3);
            wait_us(500);
            if(previous_pos != pos) {
                //pc.printf("ETALONNAGE\n");
                etat = etalonnage;
            }
            break;

        case etalonnage :
            pos = getPos(stockage_D,3);
            wait_us(500);
            //pc.printf("%d\n", pos);
            if(  /*(21<pos && pos<260) ||*/ (754<pos && pos<812) and (status_contact & MASK_FC_DROIT)) { //!!!!!!!!!!!!!changer les bornes
                velocityControl(stockage_D,0,GLED_ON,3);
                wait_ms(500);
                consigne_pos = getPos(stockage_D,3) - 180 ;
                wait_us(500);
                positionControl(stockage_D,consigne_pos,1,BLED_ON,3);
                wait_us(500);
                etat = tmp_pret;
                // pc.printf("TMP_PRET\n");
            }
            break;

        case tmp_pret :
            pos = getPos(stockage_D,3) ;
            wait_us(500);
            if(pos< (consigne_pos+5)) {
                etat = pret;
                //pc.printf("PRET\n");
            }
            break;

        case pret :
            if(flag_vide_vert_rouge) {
                flag_vide_vert_rouge =0;
                etat = vide;
                SendAck(ACKNOWLEDGE_HERKULEX, ACK_ACTION);
            } else if((status_contact & MASK_CT_DROIT)) {
                consigne_pos = getPos(stockage_D,3) - 550;
                wait_us(500);
                deverouillage_torque_convoyeurs_droit();
                wait_us(500);
                //pc.printf("consigne %d", consigne_pos);
                positionControl(stockage_D,consigne_pos,1,BLED_ON,3);
                wait_us(500);
                etat = pousse;
                //pc.printf("POUSSE\n");
            }
            break;

        case pousse :
            pos = getPos(stockage_D,3);
            wait_us(500);
            if(pos<(consigne_pos+5) and (status_contact & MASK_CT_DROIT)==0) {
                consigne_pos = pos + 550;
                //pc.printf("consigne %d", consigne_pos);
                deverouillage_torque_convoyeurs_droit();
                wait_us(500);
                positionControl(stockage_D,consigne_pos,1,BLED_ON,3);
                wait_us(500);
                etat = retour;
                //pc.printf("RETOUR\n");
            }

            break;
        case retour :
            pos = getPos(stockage_D,3) ;
            wait_us(500);
            if(pos> (consigne_pos-5)) {
                etat = pret;
               // pc.printf("PRET\n");
            }
            break;
/*
        case vide:
            consigne_pos = getPos(stockage_D,3);
            //pc.printf("consigne %d",consigne_pos);
            compteTour(stockage_D,-1023,3,consigne_pos,BLED_ON,3);
            etat = fin_vide;
            break;
            
        case fin_vide:
            pos = getPos(stockage_D,3) ;
            //pc.printf("pos %d", pos);
            wait_us(500);
            if(pos< (consigne_pos+5)) {
                etat = init;
                //pc.printf("PRET\n");
            }

            break;
        */
        case vide:
            
            velocityControl(stockage_D, -400, BLED_ON,3);
            wait_ms(200);
            roue(1);
            
            if(cpt_vider<9){
                etat = tmp_vide;
                //pc.printf("TMP_VIDE\n");
            
            }else{
                etat = init; 
                SendAck(ACKNOWLEDGE_HERKULEX, ACK_FIN_ACTION);
                SendCharCan(NB_PALETS_VERTS, nbPaletsVerts);    
                nbPaletsVerts =0;
                cpt_vider = 0;
                roue(0);
                uint8_t servos_roulette_droit[2] = {GLED_ON, roue_D};
                uint16_t pos_roulette_droit[1] = {512};
                positionControl_Mul_ensemble_complex(1,100,servos_roulette_droit,pos_roulette_droit,3);
                //pc.printf("INIT\n");   
            }
            break;
            
        case tmp_vide:
            pos = getPos(stockage_D,3); 
            wait_us(100); 
            if(pos <= pos_vide[cpt_vider%11] && pos >= (pos_vide[cpt_vider%5]-20)){  //if(pos == pos_vide[cpt_vider%5])
                velocityControl(stockage_D, 0, BLED_ON,3);
                positionControl(stockage_D,pos+30,1,BLED_ON,3);
                //pc.printf("pos :%d\n", pos);               
                consigne_roue = 225;
                positionControl(roue_D,consigne_roue,1,BLED_ON,3);
                etat = fin_vide;
                timer_bloquer.start();
                timer_bloquer.reset();
            }
        
            break; 
            
        case fin_vide:
            pos = getPos(roue_D,3) ;
            wait_us(500);
            if(pos> (consigne_roue+5)  ||  timer_bloquer>2) {
                positionControl(roue_D,374,50,BLED_ON,3);
                verification();
                cpt_vider ++;
                etat = vide;
            }
            break;
    }
}
void gabarit_robot(void)
{
    uint8_t servos_av_centre[4] = {GLED_ON, AV_EP_C, GLED_ON, AV_poigne_C};

    uint16_t pos_av_centre[2] = {550,550};//470,350

    uint8_t servos_roulette_gauche[2] = {GLED_ON, roue_G};
    uint16_t pos_roulette_gauche[1] = {512};
    
    uint8_t servos_roulette_droit[2] = {GLED_ON, roue_D};
    uint16_t pos_roulette_droit[1] = {512};
      
        
   
    PWM_roue_Gauche.period(0.00005);
    PWM_roue_Droite.period(0.00005);
    
    int speed=100;
    roue(0);
    deverouillage_torque();
    positionControl_Mul_ensemble_complex(2,speed,servos_av_centre, pos_av_centre,2);
    positionControl_Mul_ensemble_complex(1,speed,servos_roulette_droit,pos_roulette_droit,3);
    positionControl_Mul_ensemble_complex(1,speed,servos_roulette_gauche,pos_roulette_gauche,1);

    rateau(0);
    
    SendRawId(HACHEUR_ETAT_CONTACTS);
    
}


void fifo_couleur(void)
{

    typedef enum {n_atome, atome, tmp} type_etat ;
    static type_etat etat = n_atome;

    int etat_cap = !couleur_bas[0] + !couleur_bas[1]*2 + !couleur_bas[2]*2;
    switch(etat) {
        case n_atome : //on attend qu'un atome soit sous le capteur pour lancer la FIFO
            if(etat_cap && !flag_ascenseur_force_off) {
                buffer_couleur_bas[FIFO_couleur_ecriture] = etat_cap; //1 = bleu, 2 = rouge/ vert
                flag_ascenseur = 1;
                SendCharCan(HACHEUR_ID_COUROIES,1);
                if(FIFO_couleur_ecriture == FIFO_couleur_lecture) {
                    oriente_doigt(buffer_couleur_bas[FIFO_couleur_ecriture]);
                }

                FIFO_couleur_ecriture=(FIFO_couleur_ecriture+1)%SIZE_FIFO;
                etat = tmp;
            }
            break;

        case tmp : //on attend que l'atome traité soit totalement passé
            if(!etat_cap) {
                etat = n_atome;
            }
            break;

    }

}


void ascenseur(void)
{
    typedef enum {init, atome, tmp} type_etat;
    static type_etat etat = init;

    int etat_cap = !couleur_haut[0] + !couleur_haut[1]*2 + !couleur_haut[2]*2;
    static int flag_dernier = 0, flag_suivant = 0;
    static long  cpt, cpt_bloquer = 0;
    static char memo_FIFO_couleur_lecture;
    
    if(flag_ascenseur_force_off)etat = init;
    
    switch(etat) {
        case init :
            //on attend le premier atome et place le herkulex en fonction
            if( (flag_ascenseur || flag_ascenseur_force_on) && !flag_ascenseur_force_off ) {
                SendCharCan(HACHEUR_ID_COUROIES,1);
                /*timer_bloquer.start();
                timer_bloquer.reset();*/
                etat = atome;
            }
            break;

        case atome :
            //on attend que l'atome soit présent devant le capteur haut et qu'il corresponde à la FIFO
            cpt++;
            /*if( (timer_bloquer.read() > 3.0) && (FIFO_couleur_lecture != FIFO_couleur_ecriture)){
                flag_ascenseur_force_off = 1;
                SendCharCan(HACHEUR_ID_COUROIES,0);
                etat = init;
            }
            else*/ if( ((cpt > 30000)&& flag_dernier) )
            {
                flag_dernier = 0;
                oriente_doigt_suiv(buffer_couleur_bas[memo_FIFO_couleur_lecture]);
                
                flag_ascenseur = 0;
                    
                /*
                if(buffer_couleur_bas[memo_FIFO_couleur_lecture] == 1)
                    oriente_doigt(2);
                else if(buffer_couleur_bas[memo_FIFO_couleur_lecture] == 2)
                    oriente_doigt(1);*/
            
            }else if((cpt > 5000)&& flag_suivant){
                flag_suivant =0;
                oriente_doigt_suiv(buffer_couleur_bas[memo_FIFO_couleur_lecture]);
                
                
            }else if( (cpt>60000) && !flag_ascenseur && !flag_ascenseur_force_on){
                SendCharCan(HACHEUR_ID_COUROIES,0);
                etat = init;
            }
            
            if(etat_cap != 0) {
                cpt = 0;
                if(etat_cap == 1)nbPaletsBleus ++;
                else if(etat_cap == 2) nbPaletsVerts ++;
                oriente_doigt(etat_cap);
                //timer_bloquer.reset();
                etat = tmp;
            }
            
            /*else if(FIFO_couleur_lecture == FIFO_couleur_ecriture)
            {
                oriente_doigt((FIFO_couleur_lecture-1)%SIZE_FIFO);
            }*/
            break;

        case tmp :
            //on attend que le capteur soit totalement passé pour déplacer le pointeur de lecture
            /*if( (timer_bloquer.read() > 5.0) && (FIFO_couleur_lecture != FIFO_couleur_ecriture)){
                flag_ascenseur_force_off = 1;
                SendCharCan(HACHEUR_ID_COUROIES,0);
                etat = init;
            }*/
            if(etat_cap == 0) {
                //timer_bloquer.reset();
                memo_FIFO_couleur_lecture = FIFO_couleur_lecture;
                
                FIFO_couleur_lecture=(FIFO_couleur_lecture+1)%SIZE_FIFO;
                if(FIFO_couleur_lecture == FIFO_couleur_ecriture) {
                    //pc.printf("Fifo vide\n");
                    flag_dernier = 1;/*
                    if(buffer_couleur_bas[memo_FIFO_couleur_lecture] == 1)
                        oriente_doigt(2);
                    else if(buffer_couleur_bas[memo_FIFO_couleur_lecture] == 2)
                        oriente_doigt(1);*/
                }else{
                    flag_suivant = 1;
                    /*if(buffer_couleur_bas[memo_FIFO_couleur_lecture] == 1)
                        oriente_doigt(2);
                    else if(buffer_couleur_bas[memo_FIFO_couleur_lecture] == 2)
                        oriente_doigt(1);*/
                }
                etat = atome;
            }
            break;
    }
}

void oriente_doigt(int palet)
{
    if(cote) {
        if(palet == 1) {//position herkulex stockage bleu
            SendCharCan(HACHEUR_ID_COUROIES,2);
            positionControl(doigt,POS_DOIGT_GAUCHE,20,BLED_ON,2);
        } else if (palet == 2) {//position herkulex stockage rouge/vert
            SendCharCan(HACHEUR_ID_COUROIES,1);
            positionControl(doigt,POS_DOIGT_DROIT,20,GLED_ON,2);

        }else 
            positionControl(doigt,512,20,GLED_ON,2);
    } else {
        if(palet== 1) {//position herkulex stockage bleu
            SendCharCan(HACHEUR_ID_COUROIES,2);
            positionControl(doigt,POS_DOIGT_DROIT,10,BLED_ON,2);
        } else if (palet== 2) {//position herkulex stockage rouge/vert
            SendCharCan(HACHEUR_ID_COUROIES,1);
            positionControl(doigt,POS_DOIGT_GAUCHE,10,GLED_ON,2);
        }else 
            positionControl(doigt,512,20,GLED_ON,2);
    }
}

void oriente_doigt_suiv(int palet)
{
    if(cote) {
        if(palet == 1) {//position herkulex stockage bleu
            SendCharCan(HACHEUR_ID_COUROIES,2);
            positionControl(doigt,POS_DOIGT_GAUCHE_SUIV,20,BLED_ON,2);
        } else if (palet == 2) {//position herkulex stockage rouge/vert
            SendCharCan(HACHEUR_ID_COUROIES,1);
            positionControl(doigt,POS_DOIGT_DROIT_SUIV,20,GLED_ON,2);

        }else 
            positionControl(doigt,512,20,GLED_ON,2);
    } else {
        if(palet== 1) {//position herkulex stockage bleu
            SendCharCan(HACHEUR_ID_COUROIES,2);
            positionControl(doigt,POS_DOIGT_DROIT_SUIV,10,BLED_ON,2);
        } else if (palet== 2) {//position herkulex stockage rouge/vert
            SendCharCan(HACHEUR_ID_COUROIES,1);
            positionControl(doigt,POS_DOIGT_GAUCHE_SUIV,10,GLED_ON,2);
        }else 
            positionControl(doigt,512,20,GLED_ON,2);
    }
}
void presentoir_avant(void)
{
    uint8_t servos_av_centre[4] = {GLED_ON, AV_EP_C, GLED_ON, AV_poigne_C};

    uint16_t pos_av_centre[2] = {512,512};

    int speed=1;

    positionControl_Mul_ensemble_complex(2,speed,servos_av_centre, pos_av_centre,2);
    verification();
}


void automate_ventouse_presentoir_avant(void)
{
    typedef enum {init,envoi_instruction,attente_ack_ventouse} type_etat;
    static type_etat etat = init;

    switch(etat) {
        case init: //attente d'initialisation
            if(fpresentoir_avant)
                etat=envoi_instruction;
            break;

        case envoi_instruction://envoi instruction
            SendAck(ACKNOWLEDGE_HERKULEX, ACK_ACTION);
            presentoir_avant();
            SendRawId(HACHEUR_GET_PRESENTOIR_AV);
            SendRawId(HACHEUR_STATUT_VENTOUSES);
            etat = attente_ack_ventouse;
            break;

        case attente_ack_ventouse:
            if((status_pompe&MASK_PRESENTOIR_AV)==MASK_PRESENTOIR_AV) {
                fpresentoir_avant=0;
                SendAck(ACKNOWLEDGE_HERKULEX, ACK_FIN_ACTION);
                etat = init;
            }
            break;

    }
}

void automate_ventouse_relache_avant(void)
{

    typedef enum {init,envoi_instruction,attente_ack_ventouse} type_etat;
    static type_etat etat = init;

    switch(etat) {
        case init: //attente d'initialisation
            if(favant_relache)
                etat=envoi_instruction;
            break;

        case envoi_instruction://envoi instruction
            SendAck(ACKNOWLEDGE_HERKULEX, ACK_ACTION);
            SendRawId(HACHEUR_STATUT_VENTOUSES);
            etat = attente_ack_ventouse;
            break;

        case attente_ack_ventouse:
            SendRawId(HACHEUR_RELEASE_AV);
            if((status_pompe&MASK_PRESENTOIR_AV)== 0) {
                favant_relache=0;
                SendAck(ACKNOWLEDGE_HERKULEX, ACK_FIN_ACTION);
                etat = init;
            }
            break;

    }

}

void goldenium_avant(void)
{
    uint8_t servos_av_centre[4] = {GLED_ON, AV_EP_C, GLED_ON,  AV_poigne_C};
    uint16_t pos_av_centre[2] = {165,165};
    int speed=25;

    positionControl_Mul_ensemble_complex(2,speed,servos_av_centre, pos_av_centre,2);
    verification();
}


void automate_ventouse_goldenium_avant (void)
{

    typedef enum {init,envoi_instruction,attente_ack_ventouse,reculer,xyt, fin} type_etat;
    static type_etat etat = init;

    switch(etat) {
        case init: //attente d'initialisation
            if(fgoldenium_avant)
                etat = envoi_instruction;
            break;

        case envoi_instruction://envoi instruction
            SendAck(ACKNOWLEDGE_HERKULEX, ACK_ACTION);
            wait_us(50);
            SendRawId(HACHEUR_STATUT_VENTOUSES);
            wait_us(50);
            goldenium_avant();
            char pompe = AV_CENTRE;
            SendSpeed(VITESSE_RALENTI,ACCELERATION_RALENTI,DECELERATION_RALENTI);
            wait_us(50);
            GoStraight(200,0,0,0);//on avance vers le goldenium
            wait_us(50);
            can.write(CANMessage(HACHEUR_GET_ATOM, &pompe,1));
            wait_us(50);
            timeout.start();
            timeout.reset();
            etat = attente_ack_ventouse;
            break;

        case attente_ack_ventouse://auotmate ack carte pompe merde, renvoi ack goldenium saisi de temps en temps
            if (ackFinAction == ASSERVISSEMENT_ERROR_MOTEUR || ackFinAction == ASSERVISSEMENT_RECALAGE ) //((status_pompe&MASK_GOLDENIUM_AV)== MASK_GOLDENIUM_AV) //dès qu'il est saisi on attend pour etre sur
            {   
                wait(0.1);
                
                ackFinAction = 0;
                //(ASSERVISSEMENT_STOP);
                SendRawId(0x710);//on s'arrete 
                timeout.reset();       
                etat = reculer;
            } else if(timeout.read_ms()>5000  &&  0) {
                ackFinAction = 0;
                //SendRawId(ASSERVISSEMENT_STOP);
                SendRawId(0x711);//on s'arrete 
                timeout.reset();
                etat = reculer;
            }
            break;

        case reculer:
            if( ackFinAction == ASSERVISSEMENT_STOP || ackFinAction == ASSERVISSEMENT_ERROR_MOTEUR || ackFinAction == ASSERVISSEMENT_STOP || 1 )
            {
                ackFinAction = 0;
                GoStraight(-40,0,0,0);//on recule en x donné par la strat  
                wait(0.1);
                positionControl(AV_poigne_C,450,150,BLED_ON,2);//forklift
                fgoldenium_avant=0;
                etat = xyt;
            }
            break;
        
        case xyt:
            if(ackFinAction == ASSERVISSEMENT_RECALAGE)
            {
                ackFinAction = 0;
                SendSpeed(VITESSE_NORMAL,ACCELERATION,DECELERATION);
                GoToPosition( x_goldenium,y_goldenium,1800,-1);//x et y donné par la strat ,theta constant,-1 marche arriere
                etat = fin;
            }
            break;
        case fin :
            if(ackFinAction == ASSERVISSEMENT_XYT)
            {
                ackFinAction = 0;
                SendAck(ACKNOWLEDGE_HERKULEX, ACK_FIN_ACTION);
                etat = init;
            }
            break;
    }
}


void accelerateur_avant(void)
{
}

void automate_ventouse_accelerateur_avant(void)
{

}
#endif