librairie actions gros robot carte esclave

Dependents:   carte_esclave201_petit_rob carte_esclave2019 carte_esclave_PETIT_ROBOT_2019

actions_Gr.cpp

Committer:
kyxstark
Date:
2019-05-23
Revision:
3:a630a1ccf5f0
Parent:
2:33583329d6c8
Child:
4:8ac0f7c17ac7

File content as of revision 3:a630a1ccf5f0:

#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


char status_pompe=0;
bool flag_ascenseur = 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;


DigitalIn couleur_haut[3] = {PA_9,PA_10,PA_11}; //GC1
DigitalIn couleur_bas[3] = {PB_12,PB_13,PB_14}; //GC2
DigitalIn presence_droit(PB_5);
DigitalIn presence_gauche(PB_4);


char buffer_couleur_bas[SIZE_FIFO];
unsigned char FIFO_couleur_ecriture=0;
signed char FIFO_couleur_lecture=0;





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


    int speed=100;

    deverouillage_torque();
    positionControl_Mul_ensemble_complex(2,speed,servos_av_centre, pos_av_centre,2);

}


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) {
                buffer_couleur_bas[FIFO_couleur_ecriture] = etat_cap; //1 = bleu, 2 = rouge/ vert
                flag_ascenseur = 1;
                if(FIFO_couleur_ecriture == FIFO_couleur_lecture) {
                    if(buffer_couleur_bas[FIFO_couleur_ecriture] == 1) {
                        positionControl(doigt,384,10,BLED_ON,2);   //position herkulex stockage bleu
                    } else {
                        positionControl(doigt,640,10,GLED_ON,2);   //position herkulex stockage rouge/vert
                    }
                }
                //pc.printf("fifo ecriture %d\n", buffer_couleur_bas[FIFO_couleur_ecriture]);
                FIFO_couleur_ecriture=(FIFO_couleur_ecriture+1)%SIZE_FIFO;
                etat = tmp;
            }
            break;

        case atome : //on stocke dans la fifo la couleur de l'atome
            buffer_couleur_bas[FIFO_couleur_ecriture] = etat_cap; //1 = bleu, 2 = rouge/ vert
            flag_ascenseur = 1;
            /*if(buffer_couleur_bas[FIFO_couleur_ecriture] == 1) {
                    positionControl(doigt,384,1,BLED_ON,2);   //position herkulex stockage bleu
                } else {
                    positionControl(doigt,640,1,GLED_ON,2);   //position herkulex stockage rouge/vert
                }*/
            //pc.printf("fifo ecriture %d\n", 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_sortie = 0;
    switch(etat) {
        case init :
            //on attend le premier atome et place le herkulex en fonction
            if(flag_ascenseur) {
                /*if(buffer_couleur_bas[FIFO_couleur_lecture] == 1) {
                    positionControl(doigt,384,1,BLED_ON,2);   //position herkulex stockage bleu
                } else {
                    positionControl(doigt,640,1,GLED_ON,2);   //position herkulex stockage rouge/vert
                }*/
                etat = atome;
            }
            break;

        case atome :
            //on attend que l'atome soit présent devant le capteur haut et qu'il corresponde à la FIFO
            if(buffer_couleur_bas[FIFO_couleur_lecture] != 0) {
                if(buffer_couleur_bas[FIFO_couleur_lecture] == etat_cap) {
                    /*if(flag_sortie) {
                        if(buffer_couleur_bas[FIFO_couleur_lecture] == 1) {//position herkulex stockage bleu
                            positionControl(doigt,384,10,BLED_ON,2);
                        } else if (buffer_couleur_bas[FIFO_couleur_lecture] == 2) {//position herkulex stockage rouge/vert
                            positionControl(doigt,640,10,GLED_ON,2);
                        }
                        flag_sortie = 0;
                    }
                    pc.printf("--fifo lecture %d\n", buffer_couleur_bas[FIFO_couleur_lecture]);
                    //on change la position du herkulex si le prochain atome est différent
                    if(buffer_couleur_bas[FIFO_couleur_lecture] != buffer_couleur_bas[FIFO_couleur_lecture+1] ) {
                        flag_sortie = 1;
                    }*/
                 if(buffer_couleur_bas[FIFO_couleur_lecture] == 1) {//position herkulex stockage bleu
                        positionControl(doigt,384,10,BLED_ON,2);
                    } else if (buffer_couleur_bas[FIFO_couleur_lecture] == 2) {//position herkulex stockage rouge/vert
                        positionControl(doigt,640,10,GLED_ON,2);
                    }
                    etat = tmp;
                } else if(etat_cap !=  0) {
                    //pc.printf("--fifo lecture %d --- vu : %d\n", buffer_couleur_bas[FIFO_couleur_lecture], etat_cap);
                    etat = tmp;
                }
            }
            break;

        case tmp :
            //on attend que le capteur soit totalement passé pour déplacer le pointeur de lecture
            if(etat_cap == 0) {
                //pc.printf("\t\tfifo + 1\n");
                FIFO_couleur_lecture=(FIFO_couleur_lecture+1)%SIZE_FIFO;
                etat = atome;
            }
            break;
    }
}

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)
{

}

void automate_ventouse_goldenium_avant (void)
{
}

void accelerateur_avant(void)
{
}

void automate_ventouse_accelerateur_avant(void)
{

}
#endif