Konacan kod

Dependencies:   BSP_DISCO_F469NIa LCD_DISCO_F469NIa SD_DISCO_F469NI mbed

Revision:
0:38c3afd99aeb
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/CAN_library.cpp	Wed May 16 14:48:37 2018 +0000
@@ -0,0 +1,244 @@
+#include "CAN_library.h"
+
+extern CAN can;
+extern Serial pc;
+extern CANMessage msgDTA1, msgDTA2, msgDTA3, msgDTA4, msgDTA5, msgDTA6, msgLVDTFront, msgLVDTRear, msgBrakes;
+extern uint16_t rx_flag;
+extern uint8_t lvdtref;
+
+extern uint16_t Rpm0, Speed0, Gear0, Water_Temp0, Oil_Temp0, TPS0, Brakes0, Oil_P0, MAP0, Air_Temp0, Lambda0, Volts0, Crank0;
+extern uint16_t Rpm,  Speed,  Gear,  Water_Temp,  Oil_Temp,  TPS,  Brakes,  Oil_P,  MAP,  Air_Temp,  Lambda,  Volts,  Crank;
+extern int FL_LVDT0, FR_LVDT0, RL_LVDT0, RR_LVDT0, FL_LVDT,  FR_LVDT,  RL_LVDT,  RR_LVDT;
+extern int FL_LVDT_Ref,FR_LVDT_Ref,RL_LVDT_Ref,RR_LVDT_Ref;
+int LVDT_Max=150;
+
+void CANMsgReceive(){                     // CAN RX Interrupt Function
+    CANMessage tmpMsg;
+    if (can.read(tmpMsg)) {                 //Detect message
+        //pc.printf("%x\n",tmpMsg.id);       
+        switch(tmpMsg.id){                  //Find which DTA message is received 
+            case(0):
+                rx_flag|=(1<<0);
+                msgDTA1=tmpMsg;
+                break;
+            case(1):
+                rx_flag|=(1<<1);
+                msgDTA2=tmpMsg;
+                //pc.printf("rx_flag=%x\n",rx_flag);
+                break;
+            case(2):
+                rx_flag|=(1<<2);
+                msgDTA3=tmpMsg;
+                break;
+            case(3):
+                rx_flag|=(1<<3);
+                msgDTA4=tmpMsg;
+                break;
+            case(4):
+                rx_flag|=(1<<4);
+                msgDTA5=tmpMsg;
+                break;
+            case(5):
+                rx_flag|=(1<<5);
+                msgDTA6=tmpMsg;
+                break;
+            case(6):
+                rx_flag|=(1<<6);
+                msgLVDTFront=tmpMsg;
+                break;
+            case(7):
+                rx_flag|=(1<<7);
+                msgLVDTRear=tmpMsg;
+                break;
+            case(8):
+                rx_flag|=(1<<8);
+                msgBrakes=tmpMsg;
+                break;
+        };
+        //pc.printf("rx_flag=%d\n",rx_flag);
+    };
+};
+
+void UpdateInfo(){                          // Update info for DTA values
+    int noID=9;
+    uint16_t *newData;
+    for (int i=0;i<noID;i++){               //For loop goes trough Message IDs
+        uint16_t flagBit;
+        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.
+        if (flagBit) {                      // =/=0, there is a message, =0, there is no message                      
+            switch(i){
+                case(0):
+                    newData=AllocData(msgDTA1);     //Allocate message to a receiver
+                    UpdateInfoDTA1(newData);        //Update variables
+                    rx_flag = rx_flag ^ (1<<0);     //Set flag of adequate bit to 0
+                    break;
+                case(1):
+                    newData=AllocData(msgDTA2);
+                    UpdateInfoDTA2(newData);
+                    rx_flag = rx_flag ^ (1<<1);
+                    break;
+                case(2):
+                    newData=AllocData(msgDTA3);
+                    UpdateInfoDTA3(newData);
+                    rx_flag = rx_flag ^ (1<<2);
+                    break;
+                case(3):
+                    newData=AllocData(msgDTA4);
+                    UpdateInfoDTA4(newData);
+                    rx_flag = rx_flag ^ (1<<3);
+                    break;
+                case(4):
+                    newData=AllocData(msgDTA5);
+                    UpdateInfoDTA5(newData);
+                    rx_flag = rx_flag ^ (1<<4);
+                    break;
+                case(5):
+                    newData=AllocData(msgDTA6);
+                    UpdateInfoDTA6(newData);
+                    rx_flag = rx_flag ^ (1<<5);
+                    break;
+                case(6):
+                    newData=AllocData(msgLVDTFront);
+                    UpdateInfoLVDTFront(newData);
+                    rx_flag = rx_flag ^ (1<<6);
+                    break;
+                case(7):
+                    newData=AllocData(msgLVDTRear);
+                    UpdateInfoLVDTRear(newData);
+                    rx_flag = rx_flag ^ (1<<7);
+                    break;
+                case(8):
+                    newData=AllocData(msgBrakes);
+                    UpdateInfoBrakes(newData);
+                    rx_flag = rx_flag ^ (1<<8);
+                    break;
+                // for each new id add new case statement
+            };
+        };
+    };
+};
+
+uint16_t * AllocData(CANMessage msg){                   //Unpack CAN message 
+    uint16_t newData[4];
+    newData[0]=(msg.data[1]<<8) | msg.data[0];
+    newData[1]=(msg.data[3]<<8) | msg.data[2];
+    newData[2]=(msg.data[5]<<8) | msg.data[4];
+    newData[3]=(msg.data[7]<<8) | msg.data[6];
+    return newData;
+};
+
+void UpdateInfoDTA1(uint16_t newData[4]){                //Update values for DTA1 message
+    Rpm0=Rpm;
+    Rpm=newData[0];
+    TPS0=TPS;
+    TPS=newData[1];
+    Water_Temp0=Water_Temp;
+    Water_Temp=newData[2];
+    Air_Temp0=Air_Temp;
+    Air_Temp=newData[3];
+};
+
+void UpdateInfoDTA2(uint16_t newData[4]){                //Update values for DTA2 message
+    MAP0=MAP;
+    MAP=newData[0];
+    Lambda0=Lambda;
+    Lambda=newData[1];
+    Speed0=Speed;
+    Speed=newData[2];
+    Oil_P0=Oil_P;
+    Oil_P=newData[3];
+    //pc.printf("MAP=%d, Lambda=%d, Speed=%d, Oil_P=%d\n",MAP,Lambda,Speed,Oil_P);
+};
+
+void UpdateInfoDTA3(uint16_t newData[4]){                //Update values for DTA3 message
+    Oil_Temp0=Oil_Temp;
+    Oil_Temp=newData[1];
+    Volts0=Volts;
+    Volts=newData[2];
+};
+
+void UpdateInfoDTA4(uint16_t newData[4]){                //Update values for DTA4 message
+    Gear0=Gear;
+    Gear=newData[0];
+};
+
+void UpdateInfoDTA5(uint16_t newData[4]){                //Update values for DTA5 message
+};
+
+void UpdateInfoDTA6(uint16_t newData[4]){                //Update values for DTA6 message
+    Crank0=Crank;
+    Crank=newData[2];
+};
+
+void UpdateInfoLVDTFront(uint16_t newData[4]){           //Update values for LVDTFront message
+    FL_LVDT0=FL_LVDT;                                    //LVDTs are firstly written their voltage value, then overwritten by calculated pertentage value.
+    FL_LVDT=newData[0];
+    FR_LVDT0=FR_LVDT;
+    FR_LVDT=newData[1];
+    if(!(lvdtref & (1<<3))){                             //Check if its the first time LVDT value is received. If yes than store it as Referrent value.
+        if (FL_LVDT>FL_LVDT_Ref){
+            FL_LVDT=(FL_LVDT-FL_LVDT_Ref)*100/(LVDT_Max-FL_LVDT_Ref);
+        }else{
+            FL_LVDT=(FL_LVDT-FL_LVDT_Ref)*100/FL_LVDT_Ref;
+        };
+        pc.printf("Im in 1\n");
+    }else{    
+        FL_LVDT_Ref=FL_LVDT;
+        FL_LVDT=0;
+        lvdtref=lvdtref^(1<<3);
+        pc.printf("Ref=%d\n",FL_LVDT_Ref);
+    };
+    pc.printf("FL_LVDT=%d, FL_LVDT0=%d\n",abs(FL_LVDT),abs(FL_LVDT0));
+    pc.printf("FR_LVDT=%d, FR_LVDT0=%d\n",abs(FR_LVDT),abs(FR_LVDT0)); 
+        
+    if(!(lvdtref & (1<<2))){
+        if (FR_LVDT>FR_LVDT_Ref){
+            FR_LVDT=(FR_LVDT-FR_LVDT_Ref)*100/(LVDT_Max-FR_LVDT_Ref);
+        }else{
+            FR_LVDT=(FR_LVDT-FR_LVDT_Ref)*100/FR_LVDT_Ref;
+        };
+    }else{    
+        FR_LVDT_Ref=FR_LVDT;
+        FR_LVDT=0;
+        lvdtref=lvdtref^(1<<2);
+    };
+    //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);
+};
+
+void UpdateInfoLVDTRear(uint16_t newData[4]){            //Update values for LVDTRear message
+    RL_LVDT0=RL_LVDT;
+    RL_LVDT=newData[0];
+    RR_LVDT0=RR_LVDT;
+    RR_LVDT=newData[1];
+    if(!(lvdtref & (1<<1))){
+        if (RL_LVDT>RL_LVDT_Ref){
+            RL_LVDT=(RL_LVDT-RL_LVDT_Ref)*100/(LVDT_Max-RL_LVDT_Ref);
+        }else{
+            RL_LVDT=(RL_LVDT-RL_LVDT_Ref)*100/RL_LVDT_Ref;
+        };
+    }else{    
+        RL_LVDT_Ref=RL_LVDT;
+        RL_LVDT=0;
+        lvdtref=lvdtref^(1<<1);
+    };   
+        
+    if(!(lvdtref & (1<<0))){
+        if (RR_LVDT>RR_LVDT_Ref){
+            RR_LVDT=(RR_LVDT-RR_LVDT_Ref)*100/(LVDT_Max-RR_LVDT_Ref);
+        }else{
+            RR_LVDT=(RR_LVDT-RR_LVDT_Ref)*100/RR_LVDT_Ref;
+        };
+    }else{    
+        RR_LVDT_Ref=RR_LVDT;
+        RR_LVDT=0;
+        lvdtref=lvdtref^(1<<0);
+    };
+    pc.printf("RL_LVDT=%d, RL_LVDT0=%d\n",abs(RL_LVDT),abs(RL_LVDT0)); 
+    pc.printf("RR_LVDT=%d, RR_LVDT0=%d\n",abs(RR_LVDT),abs(RR_LVDT0));    
+    
+};
+
+void UpdateInfoBrakes(uint16_t newData[4]){              //Update values for Brakes message
+    Brakes0=Brakes;
+    Brakes=newData[0];
+};
\ No newline at end of file