carte esclave pompe 2020 V1

Dependencies:   mbed ident_crac

Committer:
maximilienlv
Date:
Mon Jul 13 11:31:08 2020 +0000
Revision:
23:7f62f27c028f
Parent:
22:f104afbecb98
Child:
24:3fb41d2b91af
version pompe normalement final 2020

Who changed what in which revision?

UserRevisionLine numberNew contents of line
marwanesaich 4:82c90657da4a 1 #include "extern.h"
kyxstark 8:a25a9c22ba91 2 #define SIZE_FIFO 50
marwanesaich 1:8a55f1d5cb26 3
kyxstark 8:a25a9c22ba91 4
marwanesaich 0:84a8c24e29ae 5 CANMessage msgRxBuffer[SIZE_FIFO];
marwanesaich 0:84a8c24e29ae 6 unsigned char FIFO_ecriture=0; //Position du fifo pour la reception CAN
marwanesaich 0:84a8c24e29ae 7 signed char FIFO_lecture=0;//Position du fifo de lecture des messages CAN
kyxstark 8:a25a9c22ba91 8 char end_game = 0;
marwanesaich 0:84a8c24e29ae 9
kyxstark 8:a25a9c22ba91 10 Ventouse* ventouse[NB_VENTOUSES];
kyxstark 8:a25a9c22ba91 11
kyxstark 17:fcfdd7de9039 12 BusIn contacts(PC_11, PC_12, PB_4, PB_5, PC_13, PC_14, PC_2, PC_3);
kyxstark 17:fcfdd7de9039 13 DigitalIn Contact1(PC_11, PullNone);
kyxstark 17:fcfdd7de9039 14 DigitalIn Contact2(PC_12, PullNone);
kyxstark 17:fcfdd7de9039 15 DigitalIn Contact3(PB_4, PullNone);
kyxstark 17:fcfdd7de9039 16 DigitalIn Contact4(PB_5, PullNone);
kyxstark 17:fcfdd7de9039 17 DigitalIn Contact5(PC_13, PullNone);
kyxstark 17:fcfdd7de9039 18 DigitalIn Contact6(PC_14, PullNone);
kyxstark 17:fcfdd7de9039 19 DigitalIn Contact7(PC_2, PullNone);
kyxstark 17:fcfdd7de9039 20 DigitalIn Contact8(PC_3, PullNone);
kyxstark 17:fcfdd7de9039 21
kyxstark 17:fcfdd7de9039 22 void lecture_contacts(void);
marwanesaich 0:84a8c24e29ae 23 void get_etat_ventouses();
marwanesaich 0:84a8c24e29ae 24
kyxstark 8:a25a9c22ba91 25
marwanesaich 2:4cc8fa2f64be 26 CAN can(PB_8,PB_9,1000000);
marwanesaich 2:4cc8fa2f64be 27 Serial pc(USBTX,USBRX);
marwanesaich 0:84a8c24e29ae 28
marwanesaich 0:84a8c24e29ae 29 /*********************************************************************************************************/
marwanesaich 0:84a8c24e29ae 30 /* FUNCTION NAME: canRx_ISR */
marwanesaich 0:84a8c24e29ae 31 /* DESCRIPTION : lit les messages sur le can et les stocke dans la FIFO */
marwanesaich 0:84a8c24e29ae 32 /*********************************************************************************************************/
marwanesaich 0:84a8c24e29ae 33 void canRx_ISR (void)
marwanesaich 0:84a8c24e29ae 34 {
marwanesaich 0:84a8c24e29ae 35 if (can.read(msgRxBuffer[FIFO_ecriture]))
marwanesaich 0:84a8c24e29ae 36 FIFO_ecriture=(FIFO_ecriture+1)%SIZE_FIFO;
marwanesaich 0:84a8c24e29ae 37 }
marwanesaich 0:84a8c24e29ae 38
marwanesaich 0:84a8c24e29ae 39
marwanesaich 0:84a8c24e29ae 40 /*********************************************************************************************************/
marwanesaich 0:84a8c24e29ae 41 /* FUNCTION NAME: canProcessRx */
marwanesaich 0:84a8c24e29ae 42 /* DESCRIPTION : Fonction de traitement des messages CAN */
marwanesaich 0:84a8c24e29ae 43 /*********************************************************************************************************/
maximilienlv 23:7f62f27c028f 44 void canProcessRx(void)
maximilienlv 23:7f62f27c028f 45 {
marwanesaich 0:84a8c24e29ae 46 static signed char FIFO_occupation=0,FIFO_max_occupation=0;
marwanesaich 0:84a8c24e29ae 47 CANMessage msgTx=CANMessage();
marwanesaich 0:84a8c24e29ae 48 FIFO_occupation=FIFO_ecriture-FIFO_lecture;
marwanesaich 0:84a8c24e29ae 49 if(FIFO_occupation<0)
marwanesaich 0:84a8c24e29ae 50 FIFO_occupation=FIFO_occupation+SIZE_FIFO;
marwanesaich 0:84a8c24e29ae 51 if(FIFO_max_occupation<FIFO_occupation)
marwanesaich 0:84a8c24e29ae 52 FIFO_max_occupation=FIFO_occupation;
marwanesaich 0:84a8c24e29ae 53 if(FIFO_occupation!=0) {
marwanesaich 0:84a8c24e29ae 54 int identifiant=msgRxBuffer[FIFO_lecture].id;
maximilienlv 23:7f62f27c028f 55 char BRAS_VENTOUSE = 0;
marwanesaich 1:8a55f1d5cb26 56
maximilienlv 20:677dcf689523 57 switch(identifiant)
maximilienlv 23:7f62f27c028f 58 {
maximilienlv 23:7f62f27c028f 59
maximilienlv 23:7f62f27c028f 60 case VENT_AT:
maximilienlv 23:7f62f27c028f 61 BRAS_VENTOUSE = msgRxBuffer[FIFO_lecture].data[0];
maximilienlv 23:7f62f27c028f 62 ventouse[BRAS_VENTOUSE]->action(1);
marwanesaich 0:84a8c24e29ae 63 break;
kyxstark 8:a25a9c22ba91 64
maximilienlv 23:7f62f27c028f 65 case VENT_RE:
maximilienlv 23:7f62f27c028f 66 BRAS_VENTOUSE = msgRxBuffer[FIFO_lecture].data[0];
maximilienlv 23:7f62f27c028f 67 ventouse[BRAS_VENTOUSE]->action(0);
kyxstark 8:a25a9c22ba91 68 break;
kyxstark 8:a25a9c22ba91 69
maximilienlv 23:7f62f27c028f 70 case VENT_ETAT:
kyxstark 8:a25a9c22ba91 71 get_etat_ventouses();
maximilienlv 23:7f62f27c028f 72 break;
kyxstark 8:a25a9c22ba91 73
kyxstark 8:a25a9c22ba91 74 case GLOBAL_GAME_END:
kyxstark 8:a25a9c22ba91 75 end_game = 1;
kyxstark 8:a25a9c22ba91 76 break;
kyxstark 17:fcfdd7de9039 77
maximilienlv 21:42d6cead9cc2 78 case TEST_VENT_1_ON:
maximilienlv 21:42d6cead9cc2 79 ventouse[AV_DROIT]->action(1);
maximilienlv 23:7f62f27c028f 80 ventouse[AV_CENTRE]->action(1);
maximilienlv 23:7f62f27c028f 81 ventouse[AV_GAUCHE]->action(1);
maximilienlv 23:7f62f27c028f 82 ventouse[AR_DROIT]->action(1);
maximilienlv 23:7f62f27c028f 83 ventouse[AR_CENTRE]->action(1);
maximilienlv 23:7f62f27c028f 84 ventouse[AR_GAUCHE]->action(1);
maximilienlv 21:42d6cead9cc2 85 break;
maximilienlv 21:42d6cead9cc2 86
maximilienlv 21:42d6cead9cc2 87 case TEST_VENT_1_OFF:
maximilienlv 23:7f62f27c028f 88 ventouse[AV_CENTRE]->action(0);
maximilienlv 21:42d6cead9cc2 89 ventouse[AV_GAUCHE]->action(0);
maximilienlv 23:7f62f27c028f 90 ventouse[AR_DROIT]->action(0);
maximilienlv 23:7f62f27c028f 91 ventouse[AR_CENTRE]->action(0);
maximilienlv 23:7f62f27c028f 92 ventouse[AR_GAUCHE]->action(0);
maximilienlv 23:7f62f27c028f 93 ventouse[AV_DROIT]->action(0);
maximilienlv 23:7f62f27c028f 94 break;
maximilienlv 22:f104afbecb98 95 default:
maximilienlv 21:42d6cead9cc2 96 break;
maximilienlv 21:42d6cead9cc2 97
maximilienlv 20:677dcf689523 98 }
marwanesaich 0:84a8c24e29ae 99 FIFO_lecture=(FIFO_lecture+1)%SIZE_FIFO;
marwanesaich 0:84a8c24e29ae 100 }
marwanesaich 0:84a8c24e29ae 101 }
marwanesaich 0:84a8c24e29ae 102
marwanesaich 0:84a8c24e29ae 103 int main() {
marwanesaich 0:84a8c24e29ae 104
marwanesaich 0:84a8c24e29ae 105 can.attach(&canRx_ISR); // création de l'interrupt attachée à la réception sur le CAN
maximilienlv 22:f104afbecb98 106 wait_ms(100);
maximilienlv 19:952208276c63 107
maximilienlv 23:7f62f27c028f 108 ventouse[AR_DROIT] = new Ventouse(PB_7, PB_6, PC_0, AR_DROIT);
marwanesaich 2:4cc8fa2f64be 109 ventouse[AR_CENTRE] = new Ventouse(PC_9, PA_8, PB_0, AR_CENTRE);
maximilienlv 21:42d6cead9cc2 110 ventouse[AR_GAUCHE] = new Ventouse(PA_9, PA_10, PB_1, AR_GAUCHE);
marwanesaich 0:84a8c24e29ae 111
maximilienlv 23:7f62f27c028f 112 ventouse[AV_DROIT] = new Ventouse(PA_0, PA_1, PA_4, AV_DROIT); //PA_6, PA_5, PA_7,
maximilienlv 23:7f62f27c028f 113 ventouse[AV_CENTRE] = new Ventouse(PB_10, PB_2, PC_4, AV_CENTRE);
maximilienlv 21:42d6cead9cc2 114 ventouse[AV_GAUCHE] = new Ventouse(PC_7,PC_8 , PC_5, AV_GAUCHE);
kyxstark 8:a25a9c22ba91 115
maximilienlv 22:f104afbecb98 116 pc.printf("Launched carte ventouse");
maximilienlv 23:7f62f27c028f 117 //on force les ventouses à être éteintes au début
maximilienlv 21:42d6cead9cc2 118 ventouse[AV_DROIT]->action(0);
maximilienlv 21:42d6cead9cc2 119 ventouse[AV_CENTRE]->action(0);
maximilienlv 21:42d6cead9cc2 120 ventouse[AV_GAUCHE]->action(0);
maximilienlv 21:42d6cead9cc2 121 ventouse[AR_DROIT]->action(0);
maximilienlv 21:42d6cead9cc2 122 ventouse[AR_CENTRE]->action(0);
maximilienlv 21:42d6cead9cc2 123 ventouse[AR_GAUCHE]->action(0);
maximilienlv 21:42d6cead9cc2 124 while(1)
maximilienlv 21:42d6cead9cc2 125 {
marwanesaich 0:84a8c24e29ae 126 canProcessRx();
maximilienlv 22:f104afbecb98 127 for(int i=0; i<NB_VENTOUSES; i++)
maximilienlv 22:f104afbecb98 128 {
marwanesaich 2:4cc8fa2f64be 129 ventouse[i]->automate();
kyxstark 17:fcfdd7de9039 130 }
maximilienlv 23:7f62f27c028f 131 //lecture_contacts();
maximilienlv 22:f104afbecb98 132 if(end_game)
maximilienlv 22:f104afbecb98 133 {
maximilienlv 22:f104afbecb98 134 for(int i=0; i<NB_VENTOUSES;i++)
maximilienlv 22:f104afbecb98 135 {
marwanesaich 0:84a8c24e29ae 136 ventouse[i]->setPompe(0.0);
kyxstark 8:a25a9c22ba91 137 ventouse[i]->setElectrovanne(0);
marwanesaich 0:84a8c24e29ae 138 }
maximilienlv 22:f104afbecb98 139 while(1);
marwanesaich 0:84a8c24e29ae 140 }
marwanesaich 0:84a8c24e29ae 141 }
marwanesaich 0:84a8c24e29ae 142 }
marwanesaich 0:84a8c24e29ae 143
kyxstark 17:fcfdd7de9039 144 void lecture_contacts(void)
kyxstark 17:fcfdd7de9039 145 {
maximilienlv 22:f104afbecb98 146 static char prev_contacts = contacts;
kyxstark 17:fcfdd7de9039 147 if(contacts != prev_contacts)
kyxstark 17:fcfdd7de9039 148 {
kyxstark 17:fcfdd7de9039 149 prev_contacts = contacts;
kyxstark 17:fcfdd7de9039 150 }
kyxstark 17:fcfdd7de9039 151 }
kyxstark 8:a25a9c22ba91 152
marwanesaich 0:84a8c24e29ae 153 void get_etat_ventouses()
marwanesaich 0:84a8c24e29ae 154 {
maximilienlv 22:f104afbecb98 155 CANMessage etat_ventouses = CANMessage();
marwanesaich 0:84a8c24e29ae 156 etat_ventouses.len=2;
marwanesaich 0:84a8c24e29ae 157 etat_ventouses.format=CANStandard;
marwanesaich 0:84a8c24e29ae 158 etat_ventouses.type=CANData;
marwanesaich 2:4cc8fa2f64be 159 etat_ventouses.data[0]=0;
marwanesaich 2:4cc8fa2f64be 160 etat_ventouses.data[0]=1;
maximilienlv 23:7f62f27c028f 161 for(int i = (NB_VENTOUSES - 1); i >= 0; i--)
maximilienlv 23:7f62f27c028f 162 {
marwanesaich 0:84a8c24e29ae 163 etat_ventouses.data[0] = (etat_ventouses.data[0]<<1) + ventouse[i]->getPompe();
marwanesaich 0:84a8c24e29ae 164 etat_ventouses.data[1] = (etat_ventouses.data[1]<<1) + ventouse[i]->getPression();
marwanesaich 0:84a8c24e29ae 165 }
marwanesaich 0:84a8c24e29ae 166 can.write(etat_ventouses);
maximilienlv 22:f104afbecb98 167 }