Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed ident_crac
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 }
Generated on Thu Jul 28 2022 00:11:33 by
