carte esclave pompe 2020 V1

Dependencies:   mbed ident_crac

main.cpp

Committer:
marwanesaich
Date:
2019-05-06
Revision:
0:84a8c24e29ae
Child:
1:8a55f1d5cb26

File content as of revision 0:84a8c24e29ae:

#include "mbed.h"
#include "class_ventouse.h"
#include "ident_CRAC.h"
#include "def.h"

#define SIZE_FIFO 50

CAN can(PB_8,PB_9,1000000);
Serial pc(USBTX,USBRX);
Ticker tick;

CANMessage msgRxBuffer[SIZE_FIFO];
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

Ventouse* ventouse[8];
char end_game = 0;


void get_etat_ventouses();
void isr_pression();

//ajouter ticker pour isr_presison

/*********************************************************************************************************/
/* FUNCTION NAME: canRx_ISR                                                                              */
/* DESCRIPTION  : lit les messages sur le can et les stocke dans la FIFO                                 */
/*********************************************************************************************************/
void canRx_ISR (void)
{
    if (can.read(msgRxBuffer[FIFO_ecriture]))
        FIFO_ecriture=(FIFO_ecriture+1)%SIZE_FIFO;
}


/*********************************************************************************************************/
/* FUNCTION NAME: canProcessRx                                                                           */
/* DESCRIPTION  : Fonction de traitement des messages CAN                                                */
/*********************************************************************************************************/
void canProcessRx(void){
    static signed char FIFO_occupation=0,FIFO_max_occupation=0;
    CANMessage msgTx=CANMessage();
    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) {
    int identifiant=msgRxBuffer[FIFO_lecture].id;
    int BRAS = msgRxBuffer[FIFO_lecture].data[0];
        switch(identifiant){
            
            #ifdef ROBOT_SMALL
            case HACHEUR_GET_ATOM:
                pc.printf("HACHEUR_GET_ATOM bras %d\n", int(BRAS));
                ventouse[BRAS]->attraper();
                break;
            
            case HACHEUR_RELEASE_ATOM:
                pc.printf("HACHEUR_RELEASE_ATOM\n");
                ventouse[BRAS]->relacher(); 
                break;              
            
            case HACHEUR_GET_DISTRIB_AR:
                pc.printf("HACHEUR_GET_DISTRIB_AR\n");            
                ventouse[AR_GAUCHE]->attraper();
                ventouse[AR_CENTRE]->attraper();
                ventouse[AR_DROIT]->attraper();
                break;
            
            case HACHEUR_GET_DISTRIB_AV:
                //SendAck();
                pc.printf("HACHEUR_GET_DISTRIB_AV\n"); 
                ventouse[AV_GAUCHE]->relacher();
                ventouse[AV_CENTRE]->relacher();
                ventouse[AV_DROIT]->relacher();
                break;
            
            case HACHEUR_STATUT_VENTOUSES:
                pc.printf("HACHEUR_GET_STATUS\n");
                get_etat_ventouses();
                break;
            
            case GLOBAL_GAME_END:
                end_game = 1;
                break;
            #endif

            #ifdef ROBOT_BIG
            
            #endif
        }
        FIFO_lecture=(FIFO_lecture+1)%SIZE_FIFO;
    }
}

int main() {
    
    char i =0;

    pc.printf("Hello World");
    can.attach(&canRx_ISR); // création de l'interrupt attachée à la réception sur le CAN
    //tick.attach(&isr_pression, 0.5);
    wait(1);
   // #ifdef ROBOT_SMALL
    //DEFINITION DES VENTOUSES
    ventouse[AV_GAUCHE] = new Ventouse(PC_9, PA_8, PB_0);
    ventouse[AV_CENTRE] = new Ventouse(PA_9, PA_10,  PB_1);
    ventouse[AV_DROIT]  = new Ventouse(PA_11, PA_15, PC_1);
    ventouse[AV_BAS]    = new Ventouse(PB_7, PB_6, PC_0);
    
    ventouse[AR_GAUCHE] = new Ventouse(PC_7,PC_8 , PC_5);
    ventouse[AR_CENTRE] = new Ventouse(PB_10, PB_2, PC_4);
    ventouse[AR_DROIT]  = new Ventouse(PA_6, PA_5, PA_7);
    ventouse[AR_BAS]    = new Ventouse(PA_0, PA_1, PA_4);
    

   // #endif
    
    while(1) {
        canProcessRx();
        pc.printf("%d\n",i);
        i++;
        wait_ms(10);
        //isr_pression();
        if(end_game){
            for(int i=0; i<8;i++){
                ventouse[i]->setPompe(0.0);
                ventouse[i]->setElectrovanne(0.0);
            }
            while(1){;}
        }
    }
}




void get_etat_ventouses()
{   
    CANMessage etat_ventouses = CANMessage();
    etat_ventouses.id=HACHEUR_STATUT_VENTOUSES;      
    etat_ventouses.len=2;
    etat_ventouses.format=CANStandard;
    etat_ventouses.type=CANData;
    for(int i=7; i>=0; i--){
        etat_ventouses.data[0] = (etat_ventouses.data[0]<<1) + ventouse[i]->getPompe();
        etat_ventouses.data[1] = (etat_ventouses.data[1]<<1) + ventouse[i]->getPression();       
    }
    can.write(etat_ventouses);

}

void isr_pression()
{   
    static char i = 1;
    can.write(CANMessage(100,&i,1));
    i++;
    /*
    static char new_pression = 0;
    static char old_pression = 0;
    
    for(int i=7; i>=0; i--){
        new_pression = (new_pression<<1) + ventouse[i]->getPression();
    }
    
    if(old_pression^new_pression){
        CANMessage chgt_pression = CANMessage();
        chgt_pression.id=HACHEUR_ISR_PRESSION ;      
        chgt_pression.len=2;
        chgt_pression.format=CANStandard;
        chgt_pression.type=CANData;
        chgt_pression.data[0] = old_pression^new_pression ;
        chgt_pression.data[1] = new_pression;
        can.write(chgt_pression);
    }
    
    new_pression = old_pression; 
    */
    

}