CRAC Team / Mbed 2 deprecated Carte_Pompe_V1_2020

Dependencies:   mbed ident_crac

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 #include "extern.h"
00002 #define SIZE_FIFO 50
00003 
00004 
00005 CANMessage msgRxBuffer[SIZE_FIFO];
00006 unsigned char FIFO_ecriture=0; //Position du fifo pour la reception CAN
00007 signed char FIFO_lecture=0;//Position du fifo de lecture des messages CAN
00008 char end_game = 0;
00009 
00010 Ventouse* ventouse[NB_VENTOUSES];
00011 
00012 BusIn contacts(PC_11, PC_12, PB_4, PB_5, PC_13, PC_14, PC_2, PC_3); 
00013 DigitalIn Contact1(PC_11, PullNone);
00014 DigitalIn Contact2(PC_12, PullNone);
00015 DigitalIn Contact3(PB_4, PullNone);
00016 DigitalIn Contact4(PB_5, PullNone);
00017 DigitalIn Contact5(PC_13, PullNone);
00018 DigitalIn Contact6(PC_14, PullNone);
00019 DigitalIn Contact7(PC_2, PullNone);
00020 DigitalIn Contact8(PC_3, PullNone);
00021 
00022 void lecture_contacts(void);
00023 void get_etat_ventouses();
00024 
00025 
00026 CAN can(PB_8,PB_9,1000000);
00027 Serial pc(USBTX,USBRX);
00028 
00029 /*********************************************************************************************************/
00030 /* FUNCTION NAME: canRx_ISR                                                                              */
00031 /* DESCRIPTION  : lit les messages sur le can et les stocke dans la FIFO                                 */
00032 /*********************************************************************************************************/
00033 void canRx_ISR (void)
00034 {
00035     if (can.read(msgRxBuffer[FIFO_ecriture]))
00036         FIFO_ecriture=(FIFO_ecriture+1)%SIZE_FIFO;
00037 }
00038 
00039 
00040 /*********************************************************************************************************/
00041 /* FUNCTION NAME: canProcessRx                                                                           */
00042 /* DESCRIPTION  : Fonction de traitement des messages CAN                                                */
00043 /*********************************************************************************************************/
00044 void canProcessRx(void)
00045 {
00046     static signed char FIFO_occupation=0,FIFO_max_occupation=0;
00047     CANMessage msgTx=CANMessage();
00048     FIFO_occupation=FIFO_ecriture-FIFO_lecture;
00049     if(FIFO_occupation<0)
00050         FIFO_occupation=FIFO_occupation+SIZE_FIFO;
00051     if(FIFO_max_occupation<FIFO_occupation)
00052         FIFO_max_occupation=FIFO_occupation;
00053     if(FIFO_occupation!=0) {
00054     int identifiant=msgRxBuffer[FIFO_lecture].id;
00055     char BRAS_VENTOUSE = 0;
00056     
00057         switch(identifiant)
00058         {  
00059              
00060             case VENT_AT:
00061                 BRAS_VENTOUSE = msgRxBuffer[FIFO_lecture].data[0];
00062                 ventouse[BRAS_VENTOUSE]->action(1);
00063                 break;
00064                 
00065             case VENT_RE:
00066                 BRAS_VENTOUSE = msgRxBuffer[FIFO_lecture].data[0];
00067                 ventouse[BRAS_VENTOUSE]->action(0);
00068                 break;   
00069             
00070             case VENT_ETAT:
00071                 get_etat_ventouses();
00072                 break;
00073             
00074             case GLOBAL_GAME_END:
00075                 end_game = 1;
00076                 break;
00077                 
00078             case TEST_VENT_1_ON:
00079                 ventouse[AV_DROIT]->action(1);
00080                 ventouse[AV_CENTRE]->action(1);
00081                 ventouse[AV_GAUCHE]->action(1);
00082                 ventouse[AR_DROIT]->action(1);
00083                 ventouse[AR_CENTRE]->action(1);
00084                 ventouse[AR_GAUCHE]->action(1);
00085                 break;
00086             
00087             case TEST_VENT_1_OFF:
00088                 ventouse[AV_CENTRE]->action(0);
00089                 ventouse[AV_GAUCHE]->action(0);
00090                 ventouse[AR_DROIT]->action(0);
00091                 ventouse[AR_CENTRE]->action(0);
00092                 ventouse[AR_GAUCHE]->action(0);
00093                 ventouse[AV_DROIT]->action(0);
00094                 break;
00095             default:
00096                 break;
00097                       
00098             }
00099         FIFO_lecture=(FIFO_lecture+1)%SIZE_FIFO;
00100     }
00101 }
00102 
00103 int main() {
00104     
00105     can.attach(&canRx_ISR); // création de l'interrupt attachée à la réception sur le CAN
00106     wait_ms(100);
00107     
00108     ventouse[AV_DROIT] = new Ventouse(PB_7, PB_6, PC_0, AR_DROIT);
00109     ventouse[AV_GAUCHE] = new Ventouse(PC_9, PA_8, PB_0, AR_CENTRE);
00110     ventouse[AV_CENTRE] = new Ventouse(PA_9, PA_10,  PB_1, AR_GAUCHE);
00111     
00112     ventouse[AR_DROIT] = new Ventouse(PA_0, PA_1, PA_4, AV_DROIT);
00113     ventouse[AR_CENTRE] = new Ventouse(PB_10, PB_2, PC_4, AV_CENTRE);
00114     ventouse[AR_GAUCHE] = new Ventouse(PC_7,PC_8 , PC_5, AV_GAUCHE);
00115     
00116     pc.printf("Launched carte ventouse");
00117     //on force les ventouses à être éteintes au début
00118     ventouse[AV_DROIT]->action(0);
00119     ventouse[AV_CENTRE]->action(0);
00120     ventouse[AV_GAUCHE]->action(0);
00121     ventouse[AR_DROIT]->action(0);
00122     ventouse[AR_CENTRE]->action(0);
00123     ventouse[AR_GAUCHE]->action(0);
00124     while(1) 
00125     {
00126         canProcessRx();
00127         for(int i=0; i<NB_VENTOUSES; i++)
00128         {
00129             ventouse[i]->automate();
00130         }            
00131         //lecture_contacts();
00132         if(end_game)
00133         {
00134             for(int i=0; i<NB_VENTOUSES;i++)
00135             {
00136                 ventouse[i]->setPompe(0.0);
00137                 ventouse[i]->setElectrovanne(0);
00138             }
00139             while(1);
00140         }
00141     }
00142 }
00143 
00144 void lecture_contacts(void)
00145 {
00146     static char prev_contacts = contacts;  
00147     if(contacts != prev_contacts)
00148     {
00149         prev_contacts = contacts;
00150     }
00151 }
00152 
00153 void get_etat_ventouses()
00154 {   
00155     CANMessage etat_ventouses = CANMessage();      
00156     etat_ventouses.len=2;
00157     etat_ventouses.format=CANStandard;
00158     etat_ventouses.type=CANData;
00159     etat_ventouses.data[0]=0;
00160     etat_ventouses.data[0]=1;
00161     for(int i = (NB_VENTOUSES - 1); i >= 0; i--)
00162     {
00163         etat_ventouses.data[0] = (etat_ventouses.data[0]<<1) + ventouse[i]->getPompe();
00164         etat_ventouses.data[1] = (etat_ventouses.data[1]<<1) + ventouse[i]->getPression();       
00165     }
00166     can.write(etat_ventouses);
00167 }