sdf

Fork of IntegrationCANajnovije by Nenad Djalovic

CAN_library.cpp

Committer:
nemanja1994
Date:
2018-06-24
Revision:
6:f646d685b613
Parent:
5:53d7dbb8503c

File content as of revision 6:f646d685b613:

#include "CAN_library.h"

extern CAN can;
extern Serial pc;
extern CANMessage msgDTA1, msgDTA2, msgDTA3, msgDTA4, msgDTA5, msgDTA6, msgLVDTFront, msgLVDTRear, msgBrakes, msgKm;
extern uint16_t rx_flag;
extern uint8_t lvdtref;
extern Serial tRF;
extern uint16_t Steer0, Rpm0, Speed0, Gear0, Water_Temp0, Oil_Temp0, TPS0, Brakes0, Oil_P0, MAP0, Air_Temp0, Lambda0, Volts0, Crank0,   BF_Oil_P0,   BR_Oil_P0;
extern uint16_t Steer, Rpm,  Speed,  Gear,  Water_Temp,  Oil_Temp,  TPS,  Brakes,  Oil_P,  MAP,  Air_Temp,  Lambda,  Volts,  Crank,    BF_Oil_P,   BR_Oil_P;
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=1024;

void CANMsgReceive(){                     // CAN RX Interrupt Function
    CANMessage tmpMsg;
    if (can.read(tmpMsg)) {                 //Detect message
        //pc.printf("%x\n",tmpMsg.id); 
        //tRF.printf("S%x%x\n",tmpMsg.id,tmpMsg.data);      
        switch(tmpMsg.id){                  //Find which DTA message is received 
            case(0x2000):
                rx_flag|=(1<<0);
                msgDTA1=tmpMsg;
                //tRF.printf("S%x%x\n", tmpMsg.id, tmpMsg.data);
                break;
            case(0x2001):
                rx_flag|=(1<<1);
                msgDTA2=tmpMsg;
                //tRF.printf("S%x%x\n", tmpMsg.id, tmpMsg.data);
                //pc.printf("rx_flag=%x\n",rx_flag);
                break;
            case(0x2002):
                rx_flag|=(1<<2);
                msgDTA3=tmpMsg;
                //tRF.printf("S%x%x\n", tmpMsg.id, tmpMsg.data);
                break;
            case(0x2003):
                rx_flag|=(1<<3);
                msgDTA4=tmpMsg;
                //tRF.printf("S%x%x\n", tmpMsg.id, tmpMsg.data);
                break;
            case(0x2004):
                rx_flag|=(1<<4);
                msgDTA5=tmpMsg;
                //tRF.printf("S%x%x\n", tmpMsg.id, tmpMsg.data);
                break;
            case(0x2005):
                rx_flag|=(1<<5);
                msgDTA6=tmpMsg;
                //tRF.printf("S%x%x\n", tmpMsg.id, tmpMsg.data);
                break;
            case(0x1006):
                rx_flag|=(1<<6);
                msgLVDTFront=tmpMsg;
                //tRF.printf("S%x%x\n", tmpMsg.id, tmpMsg.data);
                break;
            case(0x1007):
                rx_flag|=(1<<7);
                msgLVDTRear=tmpMsg;
                //tRF.printf("S%x%x\n", tmpMsg.id, tmpMsg.data);
                break;
            case(0x1008):
                rx_flag|=(1<<8);
                msgBrakes=tmpMsg;
                //tRF.printf("S%x%x\n", tmpMsg.id, tmpMsg.data);
                break;
            case(0x1009):
                rx_flag|=(1<<9);
                msgKm=tmpMsg;
                //tRF.printf("S%x%x\n", tmpMsg.id, tmpMsg.data);
                break;
        };
        //pc.printf("rx_flag=%d\n",rx_flag);
    };
};

void UpdateInfo(){                          // Update info for DTA values
    //pc.printf("Im in UpdateInfo\n");
    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;
                    //TODO: Resiti primanje KM
                // 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];
    //pc.printf("id=2000, Rpm= %d, TPS= %d, Water_temp= %d, Air_Temp= %d\n",Rpm,TPS,Water_Temp,Air_Temp);
};

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("id=2001, MAP= %d, Lambda= %d, Speed= %d, Oil_P= %d\n",MAP,Lambda,Speed,Oil_P);
    //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];
    //pc.printf("id=2002, Oil_Temp= %d, Volts= %d\n",Oil_Temp,Volts);
};

void UpdateInfoDTA4(uint16_t newData[4]){                //Update values for DTA4 message
    Gear0=Gear;
    Gear=newData[0];
    //pc.printf("id=2003, Gear= %d\n",Gear);
};

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];
   // pc.printf("id=2005, Crank\n",Crank);
};

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];
    Steer0=Steer;
    Steer=newData[2];
    pc.printf("FL_LVDT=%d, FR_LVDT=%d, Steer=%d\n",FL_LVDT,FR_LVDT,Steer);
};

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];
    //pc.printf("RL_LVDT=%d, RL_LVDT0=%d\n",RL_LVDT,RR_LVDT); 
    //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
    BF_Oil_P0=BF_Oil_P;
    BF_Oil_P=newData[0];
    BR_Oil_P0=BR_Oil_P;
    BR_Oil_P=newData[1];
    Brakes0=Brakes;
    Brakes=newData[2];
    //pc.printf("BROILPF=%d, BROILPR=%d\n, BRAKING=%d",BF_Oil_P,BR_Oil_P,Brakes);
};