test des capteurs/actionneurs petit robot

Fork of mbed_tes_cpt by CRAC Team

Committer:
matthieuvignon
Date:
Thu May 25 06:35:22 2017 +0000
Revision:
5:7e1c328c5d50
Parent:
3:43843ab8af47
Version Gatien Nuit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
matthieuvignon 2:9d280856a536 1 #include "all_includes.h"
matthieuvignon 2:9d280856a536 2
matthieuvignon 2:9d280856a536 3 extern CANMessage msgRxBuffer[SIZE_FIFO];
matthieuvignon 2:9d280856a536 4 extern CAN can;
matthieuvignon 2:9d280856a536 5 extern DigitalOut led2;
matthieuvignon 2:9d280856a536 6 extern void GetPositionAx12(void);
matthieuvignon 2:9d280856a536 7
matthieuvignon 2:9d280856a536 8 unsigned char FIFO_ecriture=0; //Position du fifo pour la reception CAN
matthieuvignon 2:9d280856a536 9 signed char FIFO_lecture=0;//Position du fifo de lecture des messages CAN
matthieuvignon 2:9d280856a536 10
matthieuvignon 2:9d280856a536 11 unsigned char FlagAx12 = 0;
matthieuvignon 2:9d280856a536 12
matthieuvignon 2:9d280856a536 13
matthieuvignon 2:9d280856a536 14 /*********************************************************************************************************/
matthieuvignon 2:9d280856a536 15 /* FUNCTION NAME: SendRawId */
matthieuvignon 2:9d280856a536 16 /* DESCRIPTION : Envoie un message sans donnée, c'est-à-dire contenant uniquement un ID, sur le bus CAN */
matthieuvignon 2:9d280856a536 17 /*********************************************************************************************************/
matthieuvignon 2:9d280856a536 18 void SendRawId (unsigned short id)
matthieuvignon 2:9d280856a536 19 {
matthieuvignon 2:9d280856a536 20 CANMessage msgTx=CANMessage();
matthieuvignon 2:9d280856a536 21 msgTx.id=id;
matthieuvignon 2:9d280856a536 22 msgTx.len=0;
matthieuvignon 2:9d280856a536 23 can.write(msgTx);
matthieuvignon 2:9d280856a536 24 wait_us(50);
matthieuvignon 2:9d280856a536 25 }
matthieuvignon 2:9d280856a536 26
matthieuvignon 2:9d280856a536 27
matthieuvignon 2:9d280856a536 28 /*********************************************************************************************************/
matthieuvignon 2:9d280856a536 29 /* FUNCTION NAME: canRx_ISR */
matthieuvignon 2:9d280856a536 30 /* DESCRIPTION : lit les messages sur le can et les stocke dans la FIFO */
matthieuvignon 2:9d280856a536 31 /*********************************************************************************************************/
matthieuvignon 2:9d280856a536 32 void canRx_ISR (void)
matthieuvignon 2:9d280856a536 33 {
matthieuvignon 2:9d280856a536 34 if (can.read(msgRxBuffer[FIFO_ecriture]))
matthieuvignon 2:9d280856a536 35 FIFO_ecriture=(FIFO_ecriture+1)%SIZE_FIFO;
matthieuvignon 2:9d280856a536 36 }
matthieuvignon 2:9d280856a536 37
matthieuvignon 2:9d280856a536 38
matthieuvignon 2:9d280856a536 39
matthieuvignon 2:9d280856a536 40 /****************************************************************************************/
matthieuvignon 2:9d280856a536 41 /* FUNCTION NAME: canProcessRx */
matthieuvignon 2:9d280856a536 42 /* DESCRIPTION : Fonction de traitement des messages CAN */
matthieuvignon 2:9d280856a536 43 /****************************************************************************************/
matthieuvignon 2:9d280856a536 44 void canProcessRx(void){
matthieuvignon 2:9d280856a536 45 static signed char FIFO_occupation=0,FIFO_max_occupation=0;
matthieuvignon 2:9d280856a536 46 CANMessage msgTx=CANMessage();
matthieuvignon 2:9d280856a536 47 FIFO_occupation=FIFO_ecriture-FIFO_lecture;
matthieuvignon 2:9d280856a536 48 if(FIFO_occupation<0)
matthieuvignon 2:9d280856a536 49 FIFO_occupation=FIFO_occupation+SIZE_FIFO;
matthieuvignon 2:9d280856a536 50 if(FIFO_max_occupation<FIFO_occupation)
matthieuvignon 2:9d280856a536 51 FIFO_max_occupation=FIFO_occupation;
matthieuvignon 2:9d280856a536 52 if(FIFO_occupation!=0) {
matthieuvignon 2:9d280856a536 53
matthieuvignon 2:9d280856a536 54 switch(msgRxBuffer[FIFO_lecture].id) {
matthieuvignon 5:7e1c328c5d50 55 #ifdef ARRIERE
matthieuvignon 5:7e1c328c5d50 56 case ACKNOWLEDGE_GLOBAL_JACK:
matthieuvignon 5:7e1c328c5d50 57 jack.fall(NULL);
matthieuvignon 5:7e1c328c5d50 58 EnvoieJack=0;
matthieuvignon 5:7e1c328c5d50 59 TimeJack.stop();
matthieuvignon 5:7e1c328c5d50 60 break;
matthieuvignon 5:7e1c328c5d50 61 #endif
matthieuvignon 5:7e1c328c5d50 62 #ifdef AVANT
matthieuvignon 5:7e1c328c5d50 63 case CHECK_CARTE_AVANT:
matthieuvignon 5:7e1c328c5d50 64 EtatCarteAvant = 1;
matthieuvignon 5:7e1c328c5d50 65 Cote = 1; //Avant
matthieuvignon 5:7e1c328c5d50 66 //ACK de reception des actions a effectuer
matthieuvignon 5:7e1c328c5d50 67 msgTx.id = 0x73;
matthieuvignon 5:7e1c328c5d50 68 msgTx.len = 0;
matthieuvignon 5:7e1c328c5d50 69 can.write(msgTx);
matthieuvignon 5:7e1c328c5d50 70 wait_us(50);
matthieuvignon 5:7e1c328c5d50 71 break;
matthieuvignon 5:7e1c328c5d50 72 #endif
matthieuvignon 5:7e1c328c5d50 73
matthieuvignon 5:7e1c328c5d50 74 #ifdef ARRIERE
matthieuvignon 5:7e1c328c5d50 75 case CHECK_CARTE_ARRIERE:
matthieuvignon 5:7e1c328c5d50 76 EtatCarteArriere = 1;
matthieuvignon 5:7e1c328c5d50 77 Cote = 2; //Arriere
matthieuvignon 5:7e1c328c5d50 78 //ACK de reception des actions a effectuer
matthieuvignon 5:7e1c328c5d50 79 msgTx.id = 0x74;
matthieuvignon 5:7e1c328c5d50 80 msgTx.len = 0;
matthieuvignon 5:7e1c328c5d50 81 can.write(msgTx);
matthieuvignon 5:7e1c328c5d50 82 wait_us(50);
matthieuvignon 5:7e1c328c5d50 83 break;
matthieuvignon 5:7e1c328c5d50 84 #endif
matthieuvignon 5:7e1c328c5d50 85
matthieuvignon 5:7e1c328c5d50 86 case GLOBAL_GAME_END:
matthieuvignon 5:7e1c328c5d50 87 EtatGameEnd = 1;
matthieuvignon 5:7e1c328c5d50 88 break;
matthieuvignon 5:7e1c328c5d50 89
matthieuvignon 5:7e1c328c5d50 90 case GLOBAL_FUNNY_ACTION:
matthieuvignon 5:7e1c328c5d50 91 EtatFunnyAction = msgRxBuffer[FIFO_lecture].data[0];
matthieuvignon 5:7e1c328c5d50 92 Cote = msgRxBuffer[FIFO_lecture].data[1];
matthieuvignon 5:7e1c328c5d50 93 break;
matthieuvignon 2:9d280856a536 94
matthieuvignon 3:43843ab8af47 95 case ELECTROVANNE:
matthieuvignon 3:43843ab8af47 96 EtatElectroVanne = msgRxBuffer[FIFO_lecture].data[0];
matthieuvignon 3:43843ab8af47 97 Cote = msgRxBuffer[FIFO_lecture].data[1];
matthieuvignon 2:9d280856a536 98 break;
matthieuvignon 3:43843ab8af47 99
matthieuvignon 3:43843ab8af47 100 case POMPE:
matthieuvignon 2:9d280856a536 101 ActionPompe = 1;
matthieuvignon 3:43843ab8af47 102 EtatPompe = msgRxBuffer[FIFO_lecture].data[0];
matthieuvignon 3:43843ab8af47 103 Cote = msgRxBuffer[FIFO_lecture].data[1];
matthieuvignon 5:7e1c328c5d50 104
matthieuvignon 5:7e1c328c5d50 105 msgTx.id = ACKNOWLEDGE_POMPES;
matthieuvignon 5:7e1c328c5d50 106 msgTx.len = 1;
matthieuvignon 5:7e1c328c5d50 107 msgTx.data[0] = POMPE_PWM;
matthieuvignon 5:7e1c328c5d50 108 can.write(msgTx);
matthieuvignon 5:7e1c328c5d50 109 wait_us(50);
matthieuvignon 2:9d280856a536 110 break;
matthieuvignon 2:9d280856a536 111
matthieuvignon 2:9d280856a536 112 case TURBINE:
matthieuvignon 2:9d280856a536 113 EtatTurbine = msgRxBuffer[FIFO_lecture].data[0];
matthieuvignon 3:43843ab8af47 114 Cote = msgRxBuffer[FIFO_lecture].data[1];
matthieuvignon 5:7e1c328c5d50 115
matthieuvignon 5:7e1c328c5d50 116 msgTx.id = SERVO_AX12_ACK;
matthieuvignon 5:7e1c328c5d50 117 msgTx.len = 1;
matthieuvignon 5:7e1c328c5d50 118 msgTx.data[0] = msgRxBuffer[FIFO_lecture].data[0];
matthieuvignon 5:7e1c328c5d50 119 can.write(msgTx);
matthieuvignon 2:9d280856a536 120 break;
matthieuvignon 2:9d280856a536 121
matthieuvignon 2:9d280856a536 122 case LANCEUR:
matthieuvignon 2:9d280856a536 123 EtatLanceur = msgRxBuffer[FIFO_lecture].data[0];
matthieuvignon 3:43843ab8af47 124 Cote = msgRxBuffer[FIFO_lecture].data[1];
matthieuvignon 2:9d280856a536 125 break;
matthieuvignon 2:9d280856a536 126
matthieuvignon 2:9d280856a536 127 case CHECK_AX12:
matthieuvignon 2:9d280856a536 128 SendRawId(ALIVE_AX12);
matthieuvignon 2:9d280856a536 129 FlagAx12 = 1;
matthieuvignon 2:9d280856a536 130 break;
matthieuvignon 2:9d280856a536 131
matthieuvignon 2:9d280856a536 132 case SERVO_AX12_ACTION :
matthieuvignon 2:9d280856a536 133
matthieuvignon 2:9d280856a536 134 ActionAx12=1;
matthieuvignon 2:9d280856a536 135 EtatAx12 = msgRxBuffer[FIFO_lecture].data[0];
matthieuvignon 3:43843ab8af47 136 Cote = msgRxBuffer[FIFO_lecture].data[1];
matthieuvignon 2:9d280856a536 137
matthieuvignon 2:9d280856a536 138 //ACK de reception des actions a effectuer
matthieuvignon 2:9d280856a536 139 msgTx.id = SERVO_AX12_ACK;
matthieuvignon 2:9d280856a536 140 msgTx.len = 1;
matthieuvignon 2:9d280856a536 141 msgTx.data[0] = msgRxBuffer[FIFO_lecture].data[0];
matthieuvignon 2:9d280856a536 142 can.write(msgTx);
matthieuvignon 2:9d280856a536 143 break;
matthieuvignon 2:9d280856a536 144
matthieuvignon 2:9d280856a536 145 case 0x123:
matthieuvignon 2:9d280856a536 146 SendRawId(100);
matthieuvignon 2:9d280856a536 147 GetPositionAx12();
matthieuvignon 2:9d280856a536 148 break;
matthieuvignon 2:9d280856a536 149
matthieuvignon 5:7e1c328c5d50 150
matthieuvignon 2:9d280856a536 151 }
matthieuvignon 2:9d280856a536 152 action_a_effectuer=1;
matthieuvignon 2:9d280856a536 153 FIFO_lecture=(FIFO_lecture+1)%SIZE_FIFO;
matthieuvignon 2:9d280856a536 154 }
matthieuvignon 2:9d280856a536 155 }
matthieuvignon 2:9d280856a536 156
matthieuvignon 2:9d280856a536 157
matthieuvignon 2:9d280856a536 158
matthieuvignon 2:9d280856a536 159
matthieuvignon 2:9d280856a536 160 void CAN2_wrFilter (uint32_t id) {
matthieuvignon 2:9d280856a536 161 static int CAN_std_cnt = 0;
matthieuvignon 2:9d280856a536 162 uint32_t buf0, buf1;
matthieuvignon 2:9d280856a536 163 int cnt1, cnt2, bound1;
matthieuvignon 2:9d280856a536 164
matthieuvignon 2:9d280856a536 165 /* Acceptance Filter Memory full */
matthieuvignon 2:9d280856a536 166 if (((CAN_std_cnt + 1) >> 1) >= 512)
matthieuvignon 2:9d280856a536 167 return; /* error: objects full */
matthieuvignon 2:9d280856a536 168
matthieuvignon 2:9d280856a536 169 /* Setup Acceptance Filter Configuration
matthieuvignon 2:9d280856a536 170 Acceptance Filter Mode Register = Off */
matthieuvignon 2:9d280856a536 171 LPC_CANAF->AFMR = 0x00000001;
matthieuvignon 2:9d280856a536 172
matthieuvignon 2:9d280856a536 173 id |= 1 << 13; /* Add controller number(2) */
matthieuvignon 2:9d280856a536 174 id &= 0x0000F7FF; /* Mask out 16-bits of ID */
matthieuvignon 2:9d280856a536 175
matthieuvignon 2:9d280856a536 176 if (CAN_std_cnt == 0) { /* For entering first ID */
matthieuvignon 2:9d280856a536 177 LPC_CANAF_RAM->mask[0] = 0x0000FFFF | (id << 16);
matthieuvignon 2:9d280856a536 178 } else if (CAN_std_cnt == 1) { /* For entering second ID */
matthieuvignon 2:9d280856a536 179 if ((LPC_CANAF_RAM->mask[0] >> 16) > id)
matthieuvignon 2:9d280856a536 180 LPC_CANAF_RAM->mask[0] = (LPC_CANAF_RAM->mask[0] >> 16) | (id << 16);
matthieuvignon 2:9d280856a536 181 else
matthieuvignon 2:9d280856a536 182 LPC_CANAF_RAM->mask[0] = (LPC_CANAF_RAM->mask[0] & 0xFFFF0000) | id;
matthieuvignon 2:9d280856a536 183 } else {
matthieuvignon 2:9d280856a536 184 /* Find where to insert new ID */
matthieuvignon 2:9d280856a536 185 cnt1 = 0;
matthieuvignon 2:9d280856a536 186 cnt2 = CAN_std_cnt;
matthieuvignon 2:9d280856a536 187 bound1 = (CAN_std_cnt - 1) >> 1;
matthieuvignon 2:9d280856a536 188 while (cnt1 <= bound1) { /* Loop through standard existing IDs */
matthieuvignon 2:9d280856a536 189 if ((LPC_CANAF_RAM->mask[cnt1] >> 16) > id) {
matthieuvignon 2:9d280856a536 190 cnt2 = cnt1 * 2;
matthieuvignon 2:9d280856a536 191 break;
matthieuvignon 2:9d280856a536 192 }
matthieuvignon 2:9d280856a536 193 if ((LPC_CANAF_RAM->mask[cnt1] & 0x0000FFFF) > id) {
matthieuvignon 2:9d280856a536 194 cnt2 = cnt1 * 2 + 1;
matthieuvignon 2:9d280856a536 195 break;
matthieuvignon 2:9d280856a536 196 }
matthieuvignon 2:9d280856a536 197 cnt1++; /* cnt1 = U32 where to insert new ID */
matthieuvignon 2:9d280856a536 198 } /* cnt2 = U16 where to insert new ID */
matthieuvignon 2:9d280856a536 199
matthieuvignon 2:9d280856a536 200 if (cnt1 > bound1) { /* Adding ID as last entry */
matthieuvignon 2:9d280856a536 201 if ((CAN_std_cnt & 0x0001) == 0) /* Even number of IDs exists */
matthieuvignon 2:9d280856a536 202 LPC_CANAF_RAM->mask[cnt1] = 0x0000FFFF | (id << 16);
matthieuvignon 2:9d280856a536 203 else /* Odd number of IDs exists */
matthieuvignon 2:9d280856a536 204 LPC_CANAF_RAM->mask[cnt1] = (LPC_CANAF_RAM->mask[cnt1] & 0xFFFF0000) | id;
matthieuvignon 2:9d280856a536 205 } else {
matthieuvignon 2:9d280856a536 206 buf0 = LPC_CANAF_RAM->mask[cnt1]; /* Remember current entry */
matthieuvignon 2:9d280856a536 207 if ((cnt2 & 0x0001) == 0) /* Insert new mask to even address */
matthieuvignon 2:9d280856a536 208 buf1 = (id << 16) | (buf0 >> 16);
matthieuvignon 2:9d280856a536 209 else /* Insert new mask to odd address */
matthieuvignon 2:9d280856a536 210 buf1 = (buf0 & 0xFFFF0000) | id;
matthieuvignon 2:9d280856a536 211
matthieuvignon 2:9d280856a536 212 LPC_CANAF_RAM->mask[cnt1] = buf1; /* Insert mask */
matthieuvignon 2:9d280856a536 213
matthieuvignon 2:9d280856a536 214 bound1 = CAN_std_cnt >> 1;
matthieuvignon 2:9d280856a536 215 /* Move all remaining standard mask entries one place up */
matthieuvignon 2:9d280856a536 216 while (cnt1 < bound1) {
matthieuvignon 2:9d280856a536 217 cnt1++;
matthieuvignon 2:9d280856a536 218 buf1 = LPC_CANAF_RAM->mask[cnt1];
matthieuvignon 2:9d280856a536 219 LPC_CANAF_RAM->mask[cnt1] = (buf1 >> 16) | (buf0 << 16);
matthieuvignon 2:9d280856a536 220 buf0 = buf1;
matthieuvignon 2:9d280856a536 221 }
matthieuvignon 2:9d280856a536 222
matthieuvignon 2:9d280856a536 223 if ((CAN_std_cnt & 0x0001) == 0) /* Even number of IDs exists */
matthieuvignon 2:9d280856a536 224 LPC_CANAF_RAM->mask[cnt1] = (LPC_CANAF_RAM->mask[cnt1] & 0xFFFF0000) | (0x0000FFFF);
matthieuvignon 2:9d280856a536 225 }
matthieuvignon 2:9d280856a536 226 }
matthieuvignon 2:9d280856a536 227 CAN_std_cnt++;
matthieuvignon 2:9d280856a536 228
matthieuvignon 2:9d280856a536 229 /* Calculate std ID start address (buf0) and ext ID start address <- none (buf1) */
matthieuvignon 2:9d280856a536 230 buf0 = ((CAN_std_cnt + 1) >> 1) << 2;
matthieuvignon 2:9d280856a536 231 buf1 = buf0;
matthieuvignon 2:9d280856a536 232
matthieuvignon 2:9d280856a536 233 /* Setup acceptance filter pointers */
matthieuvignon 2:9d280856a536 234 LPC_CANAF->SFF_sa = 0;
matthieuvignon 2:9d280856a536 235 LPC_CANAF->SFF_GRP_sa = buf0;
matthieuvignon 2:9d280856a536 236 LPC_CANAF->EFF_sa = buf0;
matthieuvignon 2:9d280856a536 237 LPC_CANAF->EFF_GRP_sa = buf1;
matthieuvignon 2:9d280856a536 238 LPC_CANAF->ENDofTable = buf1;
matthieuvignon 2:9d280856a536 239
matthieuvignon 2:9d280856a536 240 LPC_CANAF->AFMR = 0x00000000; /* Use acceptance filter */
matthieuvignon 2:9d280856a536 241 } // CAN2_wrFilter