code de la carte à tout faire / carte strat

Dependencies:   mbed

main.cpp

Committer:
ClementBreteau
Date:
2017-05-10
Revision:
0:76bc3ed27822

File content as of revision 0:76bc3ed27822:

#include "global.h"

/****************************************************************************************/
/* FUNCTION NAME: automate_process                                                      */
/* DESCRIPTION  : Automate de gestion de la stratégie du robot                          */
/****************************************************************************************/
void automate_process(void);

/****************************************************************************************/
/* FUNCTION NAME: canProcessRx                                                          */
/* DESCRIPTION  : Fonction de traitement des messages CAN                               */
/****************************************************************************************/
void canProcessRx(void);

/*********************************************************************************************************/
/* FUNCTION NAME: SendRawId                                                                              */
/* DESCRIPTION  : Envoie un message sans donnée, c'est-à-dire contenant uniquement un ID, sur le bus CAN */
/*********************************************************************************************************/
void SendRawId (unsigned short id);

DigitalOut led(LED1);
Serial pc(SERIAL_TX, SERIAL_RX);
/*DigitalIn IO1(PB_7);
DigitalIn IO2(PB_6);
DigitalIn IO3(PF_1);
DigitalIn IO4(PA_8);

DigitalIn A_in1(PB_7);
DigitalIn A_in2(PA_6);
DigitalIn A_in3(PA_4);
DigitalIn A_in4(PA_1);
DigitalIn A_in5(PA_0); 

DigitalOut AX12(PA_9);
*/

AnalogIn cptGauche(PA_1);
AnalogIn cptDroit(PA_0);
DigitalIn pressionGauche(PA_8);
DigitalIn pressionDroit(PB_7);
    



CAN can1(PA_11,PA_12); // Rx&Tx pour le CAN
CANMessage msgRxBuffer[SIZE_FIFO]; // buffer en réception pour le CAN
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

extern "C" void mbed_reset();//Pour pouvoir reset la carte

E_GameEtat carte_etat = ETAT_ATTENTE;
E_Couleur couleurSelect = BLEU;

AX12 *myAX12;




void canRx_ISR (void)
{
    if (can1.read(msgRxBuffer[FIFO_ecriture])) {
        /*if(msgRxBuffer[FIFO_ecriture].id==RESET_ACTIONNEURS) mbed_reset();
        else FIFO_ecriture=(FIFO_ecriture+1)%SIZE_FIFO;*/
        FIFO_ecriture=(FIFO_ecriture+1)%SIZE_FIFO;
    }
}
int main() {
    char truc = 0;
    
    can1.frequency(1000000); // fréquence de travail 1Mbit/s
    can1.attach(&canRx_ISR); // création de l'interrupt attachée à la réception sur le CAN
    
    CANMessage msgTx=CANMessage();
    
    myAX12-> Set_Goal_speed(vitesse);
    myAX12-> Set_Mode(0);        
    
    pc.printf("Hello World\n"); 
    while(1) {
        
        led = ((led == 1)?0:1);
        
        automate_process();
        canProcessRx();
        //SendRawId(cpt); 
        wait(0.5);   
    }
}




int action;
char localAX12 = AX12_POSIOTION_BASSE;
/****************************************************************************************/
/* FUNCTION NAME: automate_process                                                      */
/* DESCRIPTION  : Automate de gestion de la stratégie du robot                          */
/****************************************************************************************/
void automate_process(void){
    SendRawId(carte_etat);
    switch(carte_etat){
        case ETAT_ATTENTE:
        break;
        
        case ETAT_TRAITEMENT_ACTION_AX12:
            switch(action){
                #define ACTION_TOURNER_MODULE_GAUCHE 0x10
                #define ACTION_TOURNER_MODULE_DROIT  0x11
                case ACTION_TOURNER_MODULE_GAUCHE:
                        carte_etat = ETAT_BAISSER_MAIN_GAUCHE;
                break;
                case ACTION_TOURNER_MODULE_DROIT:
                        carte_etat = ETAT_BAISSER_MAIN_DROITE;
                break;
                default:
                    carte_etat = ETAT_ATTENTE;
                }
        break;
    
        case ETAT_BAISSER_MAIN_GAUCHE:
            if(pressionGauche.read() == ENFONCER){
                carte_etat = ETAT_CHECK_COULEUR;
            } else{
                // 
                localAX12 = AX12BaisserMainGauche(localAX12);
            }             
        break;
        
        case ETAT_BAISSER_MAIN_DROITE:
            if(pressionDroit.read() == ENFONCER){
                carte_etat = ETAT_CHECK_COULEUR;
            }else{
                // 
                localAX12 = AX12BaisserMainDroite(localAX12);
            }
        break;
        
        case ETAT_CHECK_COULEUR:
            //if (((unsigned short)cptGauche.read()&(unsigned short)cptDroit.read()) == 0){
            if ((unsigned short)cptDroit.read() == 0){
                carte_etat = ETAT_ATTENTE;
            }else{
                // on active les moteurs
                localAX12 = AX12BaisserMainGauche(localAX12);    
            }
        break;
        
        case ETAT_TURBINE:
            carte_etat = ETAT_ATTENTE;
            turbineWritePWM(50);
        break;
        
        case ETAT_POMPES:
            carte_etat = ETAT_ATTENTE;
            pompeWritePWM(50);
        break;
        
        
        
        default:
            pc.printf("etat non identifie");
        }
    }
    
    
/*********************************************************************************************************/
/* FUNCTION NAME: SendRawId                                                                              */
/* DESCRIPTION  : Envoie un message sans donnée, c'est-à-dire contenant uniquement un ID, sur le bus CAN */
/*********************************************************************************************************/
void SendRawId (unsigned short id)
{
    CANMessage msgTx=CANMessage();
    msgTx.id=id;
    msgTx.len=0;
    can1.write(msgTx);
    wait_us(200);
}


/****************************************************************************************/
/* 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) {
        
        switch(msgRxBuffer[FIFO_lecture].id) {
            case CHECK_ACTIONNEURS:
                SendRawId(ALIVE_ACTIONNEURS);
            break;
            
            case SERVO_AX12_ACTION : 
                carte_etat = ETAT_TRAITEMENT_ACTION_AX12;
                
                action = msgRxBuffer[FIFO_lecture].data[0];
                couleurSelect = (E_Couleur)msgRxBuffer[FIFO_lecture].data[1];
                //ACK de reception des actions a effectuer
                msgTx.id = ACKNOWLEDGE_AX12;
                msgTx.len = 1;
                msgTx.data[0] = msgRxBuffer[FIFO_lecture].data[0];
                can1.write(msgTx);
            break;
            
            case POMPE_PWM:
                carte_etat = ETAT_POMPES;
            
                msgTx.id = ACKNOWLEDGE_POMPES;
                msgTx.len = 1;
                msgTx.data[0] = msgRxBuffer[FIFO_lecture].data[0];
                can1.write(msgTx);
            break;
            
            #define TURBINE_PWM 0xa1
            #define ACKNOWLEDGE_TURBINE 0x107
            case TURBINE_PWM:
                carte_etat = ETAT_TURBINE;
            
                msgTx.id = ACKNOWLEDGE_TURBINE;
                msgTx.len = 1;
                msgTx.data[0] = msgRxBuffer[FIFO_lecture].data[0];
                can1.write(msgTx);
            break;  
            
        }
        FIFO_lecture=(FIFO_lecture+1)%SIZE_FIFO;
    }
    }