carte esclave pompe 2020 V1
Dependencies: mbed ident_crac
main.cpp@0:84a8c24e29ae, 2019-05-06 (annotated)
- Committer:
- marwanesaich
- Date:
- Mon May 06 07:53:34 2019 +0000
- Revision:
- 0:84a8c24e29ae
- Child:
- 1:8a55f1d5cb26
Code petit robot sans ISR capteurs pompes
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
marwanesaich | 0:84a8c24e29ae | 1 | #include "mbed.h" |
marwanesaich | 0:84a8c24e29ae | 2 | #include "class_ventouse.h" |
marwanesaich | 0:84a8c24e29ae | 3 | #include "ident_CRAC.h" |
marwanesaich | 0:84a8c24e29ae | 4 | #include "def.h" |
marwanesaich | 0:84a8c24e29ae | 5 | |
marwanesaich | 0:84a8c24e29ae | 6 | #define SIZE_FIFO 50 |
marwanesaich | 0:84a8c24e29ae | 7 | |
marwanesaich | 0:84a8c24e29ae | 8 | CAN can(PB_8,PB_9,1000000); |
marwanesaich | 0:84a8c24e29ae | 9 | Serial pc(USBTX,USBRX); |
marwanesaich | 0:84a8c24e29ae | 10 | Ticker tick; |
marwanesaich | 0:84a8c24e29ae | 11 | |
marwanesaich | 0:84a8c24e29ae | 12 | CANMessage msgRxBuffer[SIZE_FIFO]; |
marwanesaich | 0:84a8c24e29ae | 13 | unsigned char FIFO_ecriture=0; //Position du fifo pour la reception CAN |
marwanesaich | 0:84a8c24e29ae | 14 | signed char FIFO_lecture=0;//Position du fifo de lecture des messages CAN |
marwanesaich | 0:84a8c24e29ae | 15 | |
marwanesaich | 0:84a8c24e29ae | 16 | Ventouse* ventouse[8]; |
marwanesaich | 0:84a8c24e29ae | 17 | char end_game = 0; |
marwanesaich | 0:84a8c24e29ae | 18 | |
marwanesaich | 0:84a8c24e29ae | 19 | |
marwanesaich | 0:84a8c24e29ae | 20 | void get_etat_ventouses(); |
marwanesaich | 0:84a8c24e29ae | 21 | void isr_pression(); |
marwanesaich | 0:84a8c24e29ae | 22 | |
marwanesaich | 0:84a8c24e29ae | 23 | //ajouter ticker pour isr_presison |
marwanesaich | 0:84a8c24e29ae | 24 | |
marwanesaich | 0:84a8c24e29ae | 25 | /*********************************************************************************************************/ |
marwanesaich | 0:84a8c24e29ae | 26 | /* FUNCTION NAME: canRx_ISR */ |
marwanesaich | 0:84a8c24e29ae | 27 | /* DESCRIPTION : lit les messages sur le can et les stocke dans la FIFO */ |
marwanesaich | 0:84a8c24e29ae | 28 | /*********************************************************************************************************/ |
marwanesaich | 0:84a8c24e29ae | 29 | void canRx_ISR (void) |
marwanesaich | 0:84a8c24e29ae | 30 | { |
marwanesaich | 0:84a8c24e29ae | 31 | if (can.read(msgRxBuffer[FIFO_ecriture])) |
marwanesaich | 0:84a8c24e29ae | 32 | FIFO_ecriture=(FIFO_ecriture+1)%SIZE_FIFO; |
marwanesaich | 0:84a8c24e29ae | 33 | } |
marwanesaich | 0:84a8c24e29ae | 34 | |
marwanesaich | 0:84a8c24e29ae | 35 | |
marwanesaich | 0:84a8c24e29ae | 36 | /*********************************************************************************************************/ |
marwanesaich | 0:84a8c24e29ae | 37 | /* FUNCTION NAME: canProcessRx */ |
marwanesaich | 0:84a8c24e29ae | 38 | /* DESCRIPTION : Fonction de traitement des messages CAN */ |
marwanesaich | 0:84a8c24e29ae | 39 | /*********************************************************************************************************/ |
marwanesaich | 0:84a8c24e29ae | 40 | void canProcessRx(void){ |
marwanesaich | 0:84a8c24e29ae | 41 | static signed char FIFO_occupation=0,FIFO_max_occupation=0; |
marwanesaich | 0:84a8c24e29ae | 42 | CANMessage msgTx=CANMessage(); |
marwanesaich | 0:84a8c24e29ae | 43 | FIFO_occupation=FIFO_ecriture-FIFO_lecture; |
marwanesaich | 0:84a8c24e29ae | 44 | if(FIFO_occupation<0) |
marwanesaich | 0:84a8c24e29ae | 45 | FIFO_occupation=FIFO_occupation+SIZE_FIFO; |
marwanesaich | 0:84a8c24e29ae | 46 | if(FIFO_max_occupation<FIFO_occupation) |
marwanesaich | 0:84a8c24e29ae | 47 | FIFO_max_occupation=FIFO_occupation; |
marwanesaich | 0:84a8c24e29ae | 48 | if(FIFO_occupation!=0) { |
marwanesaich | 0:84a8c24e29ae | 49 | int identifiant=msgRxBuffer[FIFO_lecture].id; |
marwanesaich | 0:84a8c24e29ae | 50 | int BRAS = msgRxBuffer[FIFO_lecture].data[0]; |
marwanesaich | 0:84a8c24e29ae | 51 | switch(identifiant){ |
marwanesaich | 0:84a8c24e29ae | 52 | |
marwanesaich | 0:84a8c24e29ae | 53 | #ifdef ROBOT_SMALL |
marwanesaich | 0:84a8c24e29ae | 54 | case HACHEUR_GET_ATOM: |
marwanesaich | 0:84a8c24e29ae | 55 | pc.printf("HACHEUR_GET_ATOM bras %d\n", int(BRAS)); |
marwanesaich | 0:84a8c24e29ae | 56 | ventouse[BRAS]->attraper(); |
marwanesaich | 0:84a8c24e29ae | 57 | break; |
marwanesaich | 0:84a8c24e29ae | 58 | |
marwanesaich | 0:84a8c24e29ae | 59 | case HACHEUR_RELEASE_ATOM: |
marwanesaich | 0:84a8c24e29ae | 60 | pc.printf("HACHEUR_RELEASE_ATOM\n"); |
marwanesaich | 0:84a8c24e29ae | 61 | ventouse[BRAS]->relacher(); |
marwanesaich | 0:84a8c24e29ae | 62 | break; |
marwanesaich | 0:84a8c24e29ae | 63 | |
marwanesaich | 0:84a8c24e29ae | 64 | case HACHEUR_GET_DISTRIB_AR: |
marwanesaich | 0:84a8c24e29ae | 65 | pc.printf("HACHEUR_GET_DISTRIB_AR\n"); |
marwanesaich | 0:84a8c24e29ae | 66 | ventouse[AR_GAUCHE]->attraper(); |
marwanesaich | 0:84a8c24e29ae | 67 | ventouse[AR_CENTRE]->attraper(); |
marwanesaich | 0:84a8c24e29ae | 68 | ventouse[AR_DROIT]->attraper(); |
marwanesaich | 0:84a8c24e29ae | 69 | break; |
marwanesaich | 0:84a8c24e29ae | 70 | |
marwanesaich | 0:84a8c24e29ae | 71 | case HACHEUR_GET_DISTRIB_AV: |
marwanesaich | 0:84a8c24e29ae | 72 | //SendAck(); |
marwanesaich | 0:84a8c24e29ae | 73 | pc.printf("HACHEUR_GET_DISTRIB_AV\n"); |
marwanesaich | 0:84a8c24e29ae | 74 | ventouse[AV_GAUCHE]->relacher(); |
marwanesaich | 0:84a8c24e29ae | 75 | ventouse[AV_CENTRE]->relacher(); |
marwanesaich | 0:84a8c24e29ae | 76 | ventouse[AV_DROIT]->relacher(); |
marwanesaich | 0:84a8c24e29ae | 77 | break; |
marwanesaich | 0:84a8c24e29ae | 78 | |
marwanesaich | 0:84a8c24e29ae | 79 | case HACHEUR_STATUT_VENTOUSES: |
marwanesaich | 0:84a8c24e29ae | 80 | pc.printf("HACHEUR_GET_STATUS\n"); |
marwanesaich | 0:84a8c24e29ae | 81 | get_etat_ventouses(); |
marwanesaich | 0:84a8c24e29ae | 82 | break; |
marwanesaich | 0:84a8c24e29ae | 83 | |
marwanesaich | 0:84a8c24e29ae | 84 | case GLOBAL_GAME_END: |
marwanesaich | 0:84a8c24e29ae | 85 | end_game = 1; |
marwanesaich | 0:84a8c24e29ae | 86 | break; |
marwanesaich | 0:84a8c24e29ae | 87 | #endif |
marwanesaich | 0:84a8c24e29ae | 88 | |
marwanesaich | 0:84a8c24e29ae | 89 | #ifdef ROBOT_BIG |
marwanesaich | 0:84a8c24e29ae | 90 | |
marwanesaich | 0:84a8c24e29ae | 91 | #endif |
marwanesaich | 0:84a8c24e29ae | 92 | } |
marwanesaich | 0:84a8c24e29ae | 93 | FIFO_lecture=(FIFO_lecture+1)%SIZE_FIFO; |
marwanesaich | 0:84a8c24e29ae | 94 | } |
marwanesaich | 0:84a8c24e29ae | 95 | } |
marwanesaich | 0:84a8c24e29ae | 96 | |
marwanesaich | 0:84a8c24e29ae | 97 | int main() { |
marwanesaich | 0:84a8c24e29ae | 98 | |
marwanesaich | 0:84a8c24e29ae | 99 | char i =0; |
marwanesaich | 0:84a8c24e29ae | 100 | |
marwanesaich | 0:84a8c24e29ae | 101 | pc.printf("Hello World"); |
marwanesaich | 0:84a8c24e29ae | 102 | can.attach(&canRx_ISR); // création de l'interrupt attachée à la réception sur le CAN |
marwanesaich | 0:84a8c24e29ae | 103 | //tick.attach(&isr_pression, 0.5); |
marwanesaich | 0:84a8c24e29ae | 104 | wait(1); |
marwanesaich | 0:84a8c24e29ae | 105 | // #ifdef ROBOT_SMALL |
marwanesaich | 0:84a8c24e29ae | 106 | //DEFINITION DES VENTOUSES |
marwanesaich | 0:84a8c24e29ae | 107 | ventouse[AV_GAUCHE] = new Ventouse(PC_9, PA_8, PB_0); |
marwanesaich | 0:84a8c24e29ae | 108 | ventouse[AV_CENTRE] = new Ventouse(PA_9, PA_10, PB_1); |
marwanesaich | 0:84a8c24e29ae | 109 | ventouse[AV_DROIT] = new Ventouse(PA_11, PA_15, PC_1); |
marwanesaich | 0:84a8c24e29ae | 110 | ventouse[AV_BAS] = new Ventouse(PB_7, PB_6, PC_0); |
marwanesaich | 0:84a8c24e29ae | 111 | |
marwanesaich | 0:84a8c24e29ae | 112 | ventouse[AR_GAUCHE] = new Ventouse(PC_7,PC_8 , PC_5); |
marwanesaich | 0:84a8c24e29ae | 113 | ventouse[AR_CENTRE] = new Ventouse(PB_10, PB_2, PC_4); |
marwanesaich | 0:84a8c24e29ae | 114 | ventouse[AR_DROIT] = new Ventouse(PA_6, PA_5, PA_7); |
marwanesaich | 0:84a8c24e29ae | 115 | ventouse[AR_BAS] = new Ventouse(PA_0, PA_1, PA_4); |
marwanesaich | 0:84a8c24e29ae | 116 | |
marwanesaich | 0:84a8c24e29ae | 117 | |
marwanesaich | 0:84a8c24e29ae | 118 | // #endif |
marwanesaich | 0:84a8c24e29ae | 119 | |
marwanesaich | 0:84a8c24e29ae | 120 | while(1) { |
marwanesaich | 0:84a8c24e29ae | 121 | canProcessRx(); |
marwanesaich | 0:84a8c24e29ae | 122 | pc.printf("%d\n",i); |
marwanesaich | 0:84a8c24e29ae | 123 | i++; |
marwanesaich | 0:84a8c24e29ae | 124 | wait_ms(10); |
marwanesaich | 0:84a8c24e29ae | 125 | //isr_pression(); |
marwanesaich | 0:84a8c24e29ae | 126 | if(end_game){ |
marwanesaich | 0:84a8c24e29ae | 127 | for(int i=0; i<8;i++){ |
marwanesaich | 0:84a8c24e29ae | 128 | ventouse[i]->setPompe(0.0); |
marwanesaich | 0:84a8c24e29ae | 129 | ventouse[i]->setElectrovanne(0.0); |
marwanesaich | 0:84a8c24e29ae | 130 | } |
marwanesaich | 0:84a8c24e29ae | 131 | while(1){;} |
marwanesaich | 0:84a8c24e29ae | 132 | } |
marwanesaich | 0:84a8c24e29ae | 133 | } |
marwanesaich | 0:84a8c24e29ae | 134 | } |
marwanesaich | 0:84a8c24e29ae | 135 | |
marwanesaich | 0:84a8c24e29ae | 136 | |
marwanesaich | 0:84a8c24e29ae | 137 | |
marwanesaich | 0:84a8c24e29ae | 138 | |
marwanesaich | 0:84a8c24e29ae | 139 | void get_etat_ventouses() |
marwanesaich | 0:84a8c24e29ae | 140 | { |
marwanesaich | 0:84a8c24e29ae | 141 | CANMessage etat_ventouses = CANMessage(); |
marwanesaich | 0:84a8c24e29ae | 142 | etat_ventouses.id=HACHEUR_STATUT_VENTOUSES; |
marwanesaich | 0:84a8c24e29ae | 143 | etat_ventouses.len=2; |
marwanesaich | 0:84a8c24e29ae | 144 | etat_ventouses.format=CANStandard; |
marwanesaich | 0:84a8c24e29ae | 145 | etat_ventouses.type=CANData; |
marwanesaich | 0:84a8c24e29ae | 146 | for(int i=7; i>=0; i--){ |
marwanesaich | 0:84a8c24e29ae | 147 | etat_ventouses.data[0] = (etat_ventouses.data[0]<<1) + ventouse[i]->getPompe(); |
marwanesaich | 0:84a8c24e29ae | 148 | etat_ventouses.data[1] = (etat_ventouses.data[1]<<1) + ventouse[i]->getPression(); |
marwanesaich | 0:84a8c24e29ae | 149 | } |
marwanesaich | 0:84a8c24e29ae | 150 | can.write(etat_ventouses); |
marwanesaich | 0:84a8c24e29ae | 151 | |
marwanesaich | 0:84a8c24e29ae | 152 | } |
marwanesaich | 0:84a8c24e29ae | 153 | |
marwanesaich | 0:84a8c24e29ae | 154 | void isr_pression() |
marwanesaich | 0:84a8c24e29ae | 155 | { |
marwanesaich | 0:84a8c24e29ae | 156 | static char i = 1; |
marwanesaich | 0:84a8c24e29ae | 157 | can.write(CANMessage(100,&i,1)); |
marwanesaich | 0:84a8c24e29ae | 158 | i++; |
marwanesaich | 0:84a8c24e29ae | 159 | /* |
marwanesaich | 0:84a8c24e29ae | 160 | static char new_pression = 0; |
marwanesaich | 0:84a8c24e29ae | 161 | static char old_pression = 0; |
marwanesaich | 0:84a8c24e29ae | 162 | |
marwanesaich | 0:84a8c24e29ae | 163 | for(int i=7; i>=0; i--){ |
marwanesaich | 0:84a8c24e29ae | 164 | new_pression = (new_pression<<1) + ventouse[i]->getPression(); |
marwanesaich | 0:84a8c24e29ae | 165 | } |
marwanesaich | 0:84a8c24e29ae | 166 | |
marwanesaich | 0:84a8c24e29ae | 167 | if(old_pression^new_pression){ |
marwanesaich | 0:84a8c24e29ae | 168 | CANMessage chgt_pression = CANMessage(); |
marwanesaich | 0:84a8c24e29ae | 169 | chgt_pression.id=HACHEUR_ISR_PRESSION ; |
marwanesaich | 0:84a8c24e29ae | 170 | chgt_pression.len=2; |
marwanesaich | 0:84a8c24e29ae | 171 | chgt_pression.format=CANStandard; |
marwanesaich | 0:84a8c24e29ae | 172 | chgt_pression.type=CANData; |
marwanesaich | 0:84a8c24e29ae | 173 | chgt_pression.data[0] = old_pression^new_pression ; |
marwanesaich | 0:84a8c24e29ae | 174 | chgt_pression.data[1] = new_pression; |
marwanesaich | 0:84a8c24e29ae | 175 | can.write(chgt_pression); |
marwanesaich | 0:84a8c24e29ae | 176 | } |
marwanesaich | 0:84a8c24e29ae | 177 | |
marwanesaich | 0:84a8c24e29ae | 178 | new_pression = old_pression; |
marwanesaich | 0:84a8c24e29ae | 179 | */ |
marwanesaich | 0:84a8c24e29ae | 180 | |
marwanesaich | 0:84a8c24e29ae | 181 | |
marwanesaich | 0:84a8c24e29ae | 182 | } |