code de la carte à tout faire / carte strat

Dependencies:   mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 #include "global.h"
00002 
00003 /****************************************************************************************/
00004 /* FUNCTION NAME: automate_process                                                      */
00005 /* DESCRIPTION  : Automate de gestion de la stratégie du robot                          */
00006 /****************************************************************************************/
00007 void automate_process(void);
00008 
00009 /****************************************************************************************/
00010 /* FUNCTION NAME: canProcessRx                                                          */
00011 /* DESCRIPTION  : Fonction de traitement des messages CAN                               */
00012 /****************************************************************************************/
00013 void canProcessRx(void);
00014 
00015 /*********************************************************************************************************/
00016 /* FUNCTION NAME: SendRawId                                                                              */
00017 /* DESCRIPTION  : Envoie un message sans donnée, c'est-à-dire contenant uniquement un ID, sur le bus CAN */
00018 /*********************************************************************************************************/
00019 void SendRawId (unsigned short id);
00020 
00021 DigitalOut led(LED1);
00022 Serial pc(SERIAL_TX, SERIAL_RX);
00023 /*DigitalIn IO1(PB_7);
00024 DigitalIn IO2(PB_6);
00025 DigitalIn IO3(PF_1);
00026 DigitalIn IO4(PA_8);
00027 
00028 DigitalIn A_in1(PB_7);
00029 DigitalIn A_in2(PA_6);
00030 DigitalIn A_in3(PA_4);
00031 DigitalIn A_in4(PA_1);
00032 DigitalIn A_in5(PA_0); 
00033 
00034 DigitalOut AX12(PA_9);
00035 */
00036 
00037 AnalogIn cptGauche(PA_1);
00038 AnalogIn cptDroit(PA_0);
00039 DigitalIn pressionGauche(PA_8);
00040 DigitalIn pressionDroit(PB_7);
00041     
00042 
00043 
00044 
00045 CAN can1(PA_11,PA_12); // Rx&Tx pour le CAN
00046 CANMessage msgRxBuffer[SIZE_FIFO]; // buffer en réception pour le CAN
00047 unsigned char FIFO_ecriture=0; //Position du fifo pour la reception CAN
00048 
00049 signed char FIFO_lecture=0;//Position du fifo de lecture des messages CAN
00050 
00051 extern "C" void mbed_reset();//Pour pouvoir reset la carte
00052 
00053 E_GameEtat carte_etat = ETAT_ATTENTE;
00054 E_Couleur couleurSelect = BLEU;
00055 
00056 AX12 *myAX12;
00057 
00058 
00059 
00060 
00061 void canRx_ISR (void)
00062 {
00063     if (can1.read(msgRxBuffer[FIFO_ecriture])) {
00064         /*if(msgRxBuffer[FIFO_ecriture].id==RESET_ACTIONNEURS) mbed_reset();
00065         else FIFO_ecriture=(FIFO_ecriture+1)%SIZE_FIFO;*/
00066         FIFO_ecriture=(FIFO_ecriture+1)%SIZE_FIFO;
00067     }
00068 }
00069 int main() {
00070     char truc = 0;
00071     
00072     can1.frequency(1000000); // fréquence de travail 1Mbit/s
00073     can1.attach(&canRx_ISR); // création de l'interrupt attachée à la réception sur le CAN
00074     
00075     CANMessage msgTx=CANMessage();
00076     
00077     myAX12-> Set_Goal_speed(vitesse);
00078     myAX12-> Set_Mode(0);        
00079     
00080     pc.printf("Hello World\n"); 
00081     while(1) {
00082         
00083         led = ((led == 1)?0:1);
00084         
00085         automate_process();
00086         canProcessRx();
00087         //SendRawId(cpt); 
00088         wait(0.5);   
00089     }
00090 }
00091 
00092 
00093 
00094 
00095 int action;
00096 char localAX12 = AX12_POSIOTION_BASSE;
00097 /****************************************************************************************/
00098 /* FUNCTION NAME: automate_process                                                      */
00099 /* DESCRIPTION  : Automate de gestion de la stratégie du robot                          */
00100 /****************************************************************************************/
00101 void automate_process(void){
00102     SendRawId(carte_etat);
00103     switch(carte_etat){
00104         case ETAT_ATTENTE:
00105         break;
00106         
00107         case ETAT_TRAITEMENT_ACTION_AX12:
00108             switch(action){
00109                 #define ACTION_TOURNER_MODULE_GAUCHE 0x10
00110                 #define ACTION_TOURNER_MODULE_DROIT  0x11
00111                 case ACTION_TOURNER_MODULE_GAUCHE:
00112                         carte_etat = ETAT_BAISSER_MAIN_GAUCHE;
00113                 break;
00114                 case ACTION_TOURNER_MODULE_DROIT:
00115                         carte_etat = ETAT_BAISSER_MAIN_DROITE;
00116                 break;
00117                 default:
00118                     carte_etat = ETAT_ATTENTE;
00119                 }
00120         break;
00121     
00122         case ETAT_BAISSER_MAIN_GAUCHE:
00123             if(pressionGauche.read() == ENFONCER){
00124                 carte_etat = ETAT_CHECK_COULEUR;
00125             } else{
00126                 // 
00127                 localAX12 = AX12BaisserMainGauche(localAX12);
00128             }             
00129         break;
00130         
00131         case ETAT_BAISSER_MAIN_DROITE:
00132             if(pressionDroit.read() == ENFONCER){
00133                 carte_etat = ETAT_CHECK_COULEUR;
00134             }else{
00135                 // 
00136                 localAX12 = AX12BaisserMainDroite(localAX12);
00137             }
00138         break;
00139         
00140         case ETAT_CHECK_COULEUR:
00141             //if (((unsigned short)cptGauche.read()&(unsigned short)cptDroit.read()) == 0){
00142             if ((unsigned short)cptDroit.read() == 0){
00143                 carte_etat = ETAT_ATTENTE;
00144             }else{
00145                 // on active les moteurs
00146                 localAX12 = AX12BaisserMainGauche(localAX12);    
00147             }
00148         break;
00149         
00150         case ETAT_TURBINE:
00151             carte_etat = ETAT_ATTENTE;
00152             turbineWritePWM(50);
00153         break;
00154         
00155         case ETAT_POMPES:
00156             carte_etat = ETAT_ATTENTE;
00157             pompeWritePWM(50);
00158         break;
00159         
00160         
00161         
00162         default:
00163             pc.printf("etat non identifie");
00164         }
00165     }
00166     
00167     
00168 /*********************************************************************************************************/
00169 /* FUNCTION NAME: SendRawId                                                                              */
00170 /* DESCRIPTION  : Envoie un message sans donnée, c'est-à-dire contenant uniquement un ID, sur le bus CAN */
00171 /*********************************************************************************************************/
00172 void SendRawId (unsigned short id)
00173 {
00174     CANMessage msgTx=CANMessage();
00175     msgTx.id=id;
00176     msgTx.len=0;
00177     can1.write(msgTx);
00178     wait_us(200);
00179 }
00180 
00181 
00182 /****************************************************************************************/
00183 /* FUNCTION NAME: canProcessRx                                                          */
00184 /* DESCRIPTION  : Fonction de traitement des messages CAN                               */
00185 /****************************************************************************************/
00186 void canProcessRx(void){
00187     static signed char FIFO_occupation=0,FIFO_max_occupation=0;
00188     CANMessage msgTx=CANMessage();
00189     FIFO_occupation=FIFO_ecriture-FIFO_lecture;
00190     if(FIFO_occupation<0)
00191         FIFO_occupation=FIFO_occupation+SIZE_FIFO;
00192     if(FIFO_max_occupation<FIFO_occupation)
00193         FIFO_max_occupation=FIFO_occupation;
00194     if(FIFO_occupation!=0) {
00195         
00196         switch(msgRxBuffer[FIFO_lecture].id) {
00197             case CHECK_ACTIONNEURS:
00198                 SendRawId(ALIVE_ACTIONNEURS);
00199             break;
00200             
00201             case SERVO_AX12_ACTION : 
00202                 carte_etat = ETAT_TRAITEMENT_ACTION_AX12;
00203                 
00204                 action = msgRxBuffer[FIFO_lecture].data[0];
00205                 couleurSelect = (E_Couleur)msgRxBuffer[FIFO_lecture].data[1];
00206                 //ACK de reception des actions a effectuer
00207                 msgTx.id = ACKNOWLEDGE_AX12;
00208                 msgTx.len = 1;
00209                 msgTx.data[0] = msgRxBuffer[FIFO_lecture].data[0];
00210                 can1.write(msgTx);
00211             break;
00212             
00213             case POMPE_PWM:
00214                 carte_etat = ETAT_POMPES;
00215             
00216                 msgTx.id = ACKNOWLEDGE_POMPES;
00217                 msgTx.len = 1;
00218                 msgTx.data[0] = msgRxBuffer[FIFO_lecture].data[0];
00219                 can1.write(msgTx);
00220             break;
00221             
00222             #define TURBINE_PWM 0xa1
00223             #define ACKNOWLEDGE_TURBINE 0x107
00224             case TURBINE_PWM:
00225                 carte_etat = ETAT_TURBINE;
00226             
00227                 msgTx.id = ACKNOWLEDGE_TURBINE;
00228                 msgTx.len = 1;
00229                 msgTx.data[0] = msgRxBuffer[FIFO_lecture].data[0];
00230                 can1.write(msgTx);
00231             break;  
00232             
00233         }
00234         FIFO_lecture=(FIFO_lecture+1)%SIZE_FIFO;
00235     }
00236     }
00237