Konacan kod

Dependencies:   BSP_DISCO_F469NIa LCD_DISCO_F469NIa SD_DISCO_F469NI mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers CAN_library.cpp Source File

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 };