Konacan kod
Dependencies: BSP_DISCO_F469NIa LCD_DISCO_F469NIa SD_DISCO_F469NI mbed
CAN_library.cpp
00001 #include "CAN_library.h" 00002 00003 extern CAN can; 00004 extern Serial pc; 00005 extern CANMessage msgDTA1, msgDTA2, msgDTA3, msgDTA4, msgDTA5, msgDTA6, msgLVDTFront, msgLVDTRear, msgBrakes; 00006 extern uint16_t rx_flag; 00007 extern uint8_t lvdtref; 00008 00009 extern uint16_t Rpm0, Speed0, Gear0, Water_Temp0, Oil_Temp0, TPS0, Brakes0, Oil_P0, MAP0, Air_Temp0, Lambda0, Volts0, Crank0; 00010 extern uint16_t Rpm, Speed, Gear, Water_Temp, Oil_Temp, TPS, Brakes, Oil_P, MAP, Air_Temp, Lambda, Volts, Crank; 00011 extern int FL_LVDT0, FR_LVDT0, RL_LVDT0, RR_LVDT0, FL_LVDT, FR_LVDT, RL_LVDT, RR_LVDT; 00012 extern int FL_LVDT_Ref,FR_LVDT_Ref,RL_LVDT_Ref,RR_LVDT_Ref; 00013 int LVDT_Max=150; 00014 00015 void CANMsgReceive(){ // CAN RX Interrupt Function 00016 CANMessage tmpMsg; 00017 if (can.read(tmpMsg)) { //Detect message 00018 //pc.printf("%x\n",tmpMsg.id); 00019 switch(tmpMsg.id){ //Find which DTA message is received 00020 case(0): 00021 rx_flag|=(1<<0); 00022 msgDTA1=tmpMsg; 00023 break; 00024 case(1): 00025 rx_flag|=(1<<1); 00026 msgDTA2=tmpMsg; 00027 //pc.printf("rx_flag=%x\n",rx_flag); 00028 break; 00029 case(2): 00030 rx_flag|=(1<<2); 00031 msgDTA3=tmpMsg; 00032 break; 00033 case(3): 00034 rx_flag|=(1<<3); 00035 msgDTA4=tmpMsg; 00036 break; 00037 case(4): 00038 rx_flag|=(1<<4); 00039 msgDTA5=tmpMsg; 00040 break; 00041 case(5): 00042 rx_flag|=(1<<5); 00043 msgDTA6=tmpMsg; 00044 break; 00045 case(6): 00046 rx_flag|=(1<<6); 00047 msgLVDTFront=tmpMsg; 00048 break; 00049 case(7): 00050 rx_flag|=(1<<7); 00051 msgLVDTRear=tmpMsg; 00052 break; 00053 case(8): 00054 rx_flag|=(1<<8); 00055 msgBrakes=tmpMsg; 00056 break; 00057 }; 00058 //pc.printf("rx_flag=%d\n",rx_flag); 00059 }; 00060 }; 00061 00062 void UpdateInfo(){ // Update info for DTA values 00063 int noID=9; 00064 uint16_t *newData; 00065 for (int i=0;i<noID;i++){ //For loop goes trough Message IDs 00066 uint16_t flagBit; 00067 flagBit = rx_flag & (1<<i); //Set flag bit for adequate message. If there is a message waiting to be stored, flagBit will be different than 0. 00068 if (flagBit) { // =/=0, there is a message, =0, there is no message 00069 switch(i){ 00070 case(0): 00071 newData=AllocData(msgDTA1); //Allocate message to a receiver 00072 UpdateInfoDTA1(newData); //Update variables 00073 rx_flag = rx_flag ^ (1<<0); //Set flag of adequate bit to 0 00074 break; 00075 case(1): 00076 newData=AllocData(msgDTA2); 00077 UpdateInfoDTA2(newData); 00078 rx_flag = rx_flag ^ (1<<1); 00079 break; 00080 case(2): 00081 newData=AllocData(msgDTA3); 00082 UpdateInfoDTA3(newData); 00083 rx_flag = rx_flag ^ (1<<2); 00084 break; 00085 case(3): 00086 newData=AllocData(msgDTA4); 00087 UpdateInfoDTA4(newData); 00088 rx_flag = rx_flag ^ (1<<3); 00089 break; 00090 case(4): 00091 newData=AllocData(msgDTA5); 00092 UpdateInfoDTA5(newData); 00093 rx_flag = rx_flag ^ (1<<4); 00094 break; 00095 case(5): 00096 newData=AllocData(msgDTA6); 00097 UpdateInfoDTA6(newData); 00098 rx_flag = rx_flag ^ (1<<5); 00099 break; 00100 case(6): 00101 newData=AllocData(msgLVDTFront); 00102 UpdateInfoLVDTFront(newData); 00103 rx_flag = rx_flag ^ (1<<6); 00104 break; 00105 case(7): 00106 newData=AllocData(msgLVDTRear); 00107 UpdateInfoLVDTRear(newData); 00108 rx_flag = rx_flag ^ (1<<7); 00109 break; 00110 case(8): 00111 newData=AllocData(msgBrakes); 00112 UpdateInfoBrakes(newData); 00113 rx_flag = rx_flag ^ (1<<8); 00114 break; 00115 // for each new id add new case statement 00116 }; 00117 }; 00118 }; 00119 }; 00120 00121 uint16_t * AllocData(CANMessage msg){ //Unpack CAN message 00122 uint16_t newData[4]; 00123 newData[0]=(msg.data[1]<<8) | msg.data[0]; 00124 newData[1]=(msg.data[3]<<8) | msg.data[2]; 00125 newData[2]=(msg.data[5]<<8) | msg.data[4]; 00126 newData[3]=(msg.data[7]<<8) | msg.data[6]; 00127 return newData; 00128 }; 00129 00130 void UpdateInfoDTA1(uint16_t newData[4]){ //Update values for DTA1 message 00131 Rpm0=Rpm; 00132 Rpm=newData[0]; 00133 TPS0=TPS; 00134 TPS=newData[1]; 00135 Water_Temp0=Water_Temp; 00136 Water_Temp=newData[2]; 00137 Air_Temp0=Air_Temp; 00138 Air_Temp=newData[3]; 00139 }; 00140 00141 void UpdateInfoDTA2(uint16_t newData[4]){ //Update values for DTA2 message 00142 MAP0=MAP; 00143 MAP=newData[0]; 00144 Lambda0=Lambda; 00145 Lambda=newData[1]; 00146 Speed0=Speed; 00147 Speed=newData[2]; 00148 Oil_P0=Oil_P; 00149 Oil_P=newData[3]; 00150 //pc.printf("MAP=%d, Lambda=%d, Speed=%d, Oil_P=%d\n",MAP,Lambda,Speed,Oil_P); 00151 }; 00152 00153 void UpdateInfoDTA3(uint16_t newData[4]){ //Update values for DTA3 message 00154 Oil_Temp0=Oil_Temp; 00155 Oil_Temp=newData[1]; 00156 Volts0=Volts; 00157 Volts=newData[2]; 00158 }; 00159 00160 void UpdateInfoDTA4(uint16_t newData[4]){ //Update values for DTA4 message 00161 Gear0=Gear; 00162 Gear=newData[0]; 00163 }; 00164 00165 void UpdateInfoDTA5(uint16_t newData[4]){ //Update values for DTA5 message 00166 }; 00167 00168 void UpdateInfoDTA6(uint16_t newData[4]){ //Update values for DTA6 message 00169 Crank0=Crank; 00170 Crank=newData[2]; 00171 }; 00172 00173 void UpdateInfoLVDTFront(uint16_t newData[4]){ //Update values for LVDTFront message 00174 FL_LVDT0=FL_LVDT; //LVDTs are firstly written their voltage value, then overwritten by calculated pertentage value. 00175 FL_LVDT=newData[0]; 00176 FR_LVDT0=FR_LVDT; 00177 FR_LVDT=newData[1]; 00178 if(!(lvdtref & (1<<3))){ //Check if its the first time LVDT value is received. If yes than store it as Referrent value. 00179 if (FL_LVDT>FL_LVDT_Ref){ 00180 FL_LVDT=(FL_LVDT-FL_LVDT_Ref)*100/(LVDT_Max-FL_LVDT_Ref); 00181 }else{ 00182 FL_LVDT=(FL_LVDT-FL_LVDT_Ref)*100/FL_LVDT_Ref; 00183 }; 00184 pc.printf("Im in 1\n"); 00185 }else{ 00186 FL_LVDT_Ref=FL_LVDT; 00187 FL_LVDT=0; 00188 lvdtref=lvdtref^(1<<3); 00189 pc.printf("Ref=%d\n",FL_LVDT_Ref); 00190 }; 00191 pc.printf("FL_LVDT=%d, FL_LVDT0=%d\n",abs(FL_LVDT),abs(FL_LVDT0)); 00192 pc.printf("FR_LVDT=%d, FR_LVDT0=%d\n",abs(FR_LVDT),abs(FR_LVDT0)); 00193 00194 if(!(lvdtref & (1<<2))){ 00195 if (FR_LVDT>FR_LVDT_Ref){ 00196 FR_LVDT=(FR_LVDT-FR_LVDT_Ref)*100/(LVDT_Max-FR_LVDT_Ref); 00197 }else{ 00198 FR_LVDT=(FR_LVDT-FR_LVDT_Ref)*100/FR_LVDT_Ref; 00199 }; 00200 }else{ 00201 FR_LVDT_Ref=FR_LVDT; 00202 FR_LVDT=0; 00203 lvdtref=lvdtref^(1<<2); 00204 }; 00205 //printf("FL_Ref=%d, FR_Ref=%d, RL_Ref=%d, RR_Ref=%d\n",FL_LVDT_Dpos,FR_LVDT_Dpos,RL_LVDT_Dpos,RR_LVDT_Dpos); 00206 }; 00207 00208 void UpdateInfoLVDTRear(uint16_t newData[4]){ //Update values for LVDTRear message 00209 RL_LVDT0=RL_LVDT; 00210 RL_LVDT=newData[0]; 00211 RR_LVDT0=RR_LVDT; 00212 RR_LVDT=newData[1]; 00213 if(!(lvdtref & (1<<1))){ 00214 if (RL_LVDT>RL_LVDT_Ref){ 00215 RL_LVDT=(RL_LVDT-RL_LVDT_Ref)*100/(LVDT_Max-RL_LVDT_Ref); 00216 }else{ 00217 RL_LVDT=(RL_LVDT-RL_LVDT_Ref)*100/RL_LVDT_Ref; 00218 }; 00219 }else{ 00220 RL_LVDT_Ref=RL_LVDT; 00221 RL_LVDT=0; 00222 lvdtref=lvdtref^(1<<1); 00223 }; 00224 00225 if(!(lvdtref & (1<<0))){ 00226 if (RR_LVDT>RR_LVDT_Ref){ 00227 RR_LVDT=(RR_LVDT-RR_LVDT_Ref)*100/(LVDT_Max-RR_LVDT_Ref); 00228 }else{ 00229 RR_LVDT=(RR_LVDT-RR_LVDT_Ref)*100/RR_LVDT_Ref; 00230 }; 00231 }else{ 00232 RR_LVDT_Ref=RR_LVDT; 00233 RR_LVDT=0; 00234 lvdtref=lvdtref^(1<<0); 00235 }; 00236 pc.printf("RL_LVDT=%d, RL_LVDT0=%d\n",abs(RL_LVDT),abs(RL_LVDT0)); 00237 pc.printf("RR_LVDT=%d, RR_LVDT0=%d\n",abs(RR_LVDT),abs(RR_LVDT0)); 00238 00239 }; 00240 00241 void UpdateInfoBrakes(uint16_t newData[4]){ //Update values for Brakes message 00242 Brakes0=Brakes; 00243 Brakes=newData[0]; 00244 };
Generated on Thu Jul 14 2022 09:25:33 by 1.7.2