CAN Receive with STM32 F469NI Discovery LCD display board

Dependencies:   BSP_DISCO_F469NI LCD_DISCO_F469NI mbed

main.cpp

Committer:
formulas
Date:
2018-04-11
Revision:
0:aa6b01316e93

File content as of revision 0:aa6b01316e93:

#include "mbed.h"
#include "LCD_DISCO_F469NI.h"

// define all CAN IDs in the vehicle
// DTA ID are fixed and cannot be changed
#define DTA_1   0x2000
#define DTA_2   0x2001
#define DTA_3   0x2002
#define DTA_4   0x2003
#define DTA_5   0x2004
#define DTA_6   0x2006
// This IDs can be changed as they are our own IDs
#define LVDT_FRONT  0x1000
#define LVDT_REAR   0x1001
#define BRAKES  0x1002
// If we add some other IDs in the vehicle add them here

// Receive Flag
uint32_t rx_flag=0x00000000;

// CAN Message variables, one variable for each ID
// If new IDs are added, add variables for them
CANMessage msgDTA1; // RPM, TPS %, Water temp C, Air temp C
uint8_t msgDTA2[8]; // MAP Kpa, Lambda x1000, KPH x10, Oil P Kpa
uint8_t msgDTA3[8]; // Fuel P Kpa, Oil temp C, Volts x10, Fuel Con. L/Hr x10
uint8_t msgDTA4[8]; // Gear, Advance Deg x10, Injection ms x100, Fuel Con L/100km x10
uint8_t msgDTA5[8]; // Ana1 mV, Ana2 mV, Ana3 mV, Cam Advance x10
uint8_t msgDTA6[8]; // Cam Targ x10, Cam PWM x10, Crank Errors, Cam Errors
uint8_t msgLVDTFront[8]; // Left, Right, Steering Wheel 
uint8_t msgLVDTRear[8]; // Left, Right
uint8_t msgBrakes[8]; // Brake system preassure, Braking On/Off

// CAN Variables
uint16_t rpm,tps,waterTemp, airTemp, map, Lambda, Volts, oilTemp, KPH, oilPress, Gear, lvdtFL, lvdtFR, lvdtRL, lvdtRR, steeringWheel, brakePress, BrakeOn;

// number of different IDs
int noID=9;

// initialize LCD
LCD_DISCO_F469NI lcd;
// initialize internal LEDs
DigitalOut led1(LED1);
DigitalOut led2(LED2);
// initialize CAN object
CAN can1(PB_5, PB_13);

// CAN RX Interrupt Function
void CAN_Msg_Receive(){
    CANMessage tmpMsg;
    if (can1.read(tmpMsg)) { 
    pc.printf("%x\n",tmpMsg.id);      
        switch(tmpMsg.id){
            case(0):
                rx_flag|=(1<<0);
                //for(int k=0;k<8;k++){
                    msgDTA1=tmpMsg;
                //};
                break;
            case(DTA_2):
                rx_flag|=(1<<1);
                for(int k=0;k<8;k++){
                    msgDTA2[k]=tmpMsg.data[k];
                };
                break;
            case(DTA_3):
                rx_flag|=(1<<2);
                for(int k=0;k<8;k++){
                    msgDTA3[k]=tmpMsg.data[k];
                };
                break;
            case(DTA_4):
                rx_flag|=(1<<3);
                for(int k=0;k<8;k++){
                    msgDTA4[k]=tmpMsg.data[k];
                };
                break;
            case(DTA_5):
                rx_flag|=(1<<4);
                for(int k=0;k<8;k++){
                    msgDTA5[k]=tmpMsg.data[k];
                };
                break;
            case(DTA_6):
                rx_flag|=(1<<5);
                for(int k=0;k<8;k++){
                    msgDTA6[k]=tmpMsg.data[k];
                };
                break;
            case(LVDT_FRONT):
                rx_flag|=(1<<6);
                for(int k=0;k<8;k++){
                    msgLVDTFront[k]=tmpMsg.data[k];
                };
                break;
            case(LVDT_REAR):
                rx_flag|=(1<<7);
                for(int k=0;k<8;k++){
                    msgLVDTRear[k]=tmpMsg.data[k];
                };
                break;
            case(BRAKES):
                rx_flag|=(1<<8);
                for(int k=0;k<8;k++){
                    msgBrakes[k]=tmpMsg.data[k];
                };
                break;
        };
        printf("%x\n",rx_flag);
    };
};

void parse_DTA1();
void parse_DTA2();
void parse_DTA3();
void parse_DTA4();
void parse_DTA5();
void parse_DTA6();
void parse_LVDTFRONT();
void parse_LVDTREAR();
void parse_BRAKES();

int main(){
    // attach interrupt function to CAN RX
    can1.attach(&CAN_Msg_Receive,CAN::RxIrq);
    lcd.DisplayStringAt(0,50,(uint8_t*)"Initialised",LEFT_MODE);
    while(1){
        // the code which checks the CAN RX Flags, and call appropriate data handler function
        for (int i=0;i<noID;i++){
            uint8_t flagBit;
            flagBit = rx_flag & (1<<i);
            //printf("i=%d\n",i);
            if (flagBit==1) {
                
                switch(i){
                    case(0):
                        parse_DTA1();
                        rx_flag = rx_flag ^ (1<<0);
                        break;
                    case(1):
                        parse_DTA2();
                        rx_flag = rx_flag ^ (1<<1);
                        break;
                    case(2):
                        parse_DTA3();
                        rx_flag = rx_flag ^ (1<<2);
                        break;
                    case(3):
                        parse_DTA4();
                        rx_flag = rx_flag ^ (1<<3);
                        break;
                    case(4):
                        parse_DTA5();
                        rx_flag = rx_flag ^ (1<<4);
                        break;
                    case(5):
                        parse_DTA6();
                        rx_flag = rx_flag ^ (1<<5);
                        break;
                    case(6):
                        parse_LVDTFRONT();
                        rx_flag = rx_flag ^ (1<<6);
                        break;
                    case(7):
                        parse_LVDTREAR();
                        rx_flag = rx_flag ^ (1<<7);
                        break;
                    case(8):
                        parse_BRAKES();
                        rx_flag = rx_flag ^ (1<<8);
                        break;
                    // for each new id add new case statement
                    
                }
            }
        }

    }
};

void parse_DTA1(){
    rpm=(msgDTA1.data[1]<<8) | msgDTA1.data[0];
    tps=(msgDTA1.data[3]<<8) | msgDTA1.data[2];
    waterTemp=(msgDTA1.data[5]<<8) | msgDTA1.data[4];
    airTemp=(msgDTA1.data[7]<<8) | msgDTA1.data[6];
    lcd.DisplayStringAt(0,0,(uint8_t*)"DTA1",LEFT_MODE);
    printf("rpm=%x%x, tps=%x%x, waterTemp=%x%x, airTemp=%x%x\n",msgDTA1.data[1],msgDTA1.data[0],msgDTA1.data[3],msgDTA1.data[2],msgDTA1.data[5],msgDTA1.data[4],msgDTA1.data[7],msgDTA1.data[6]);
};

void parse_DTA2(){
    printf("DTA2\n");
};

void parse_DTA3(){
    oilTemp=(msgDTA3[3]<<8) | msgDTA3[2];
    Volts=(msgDTA3[5]<<8) | msgDTA3[4];
    lcd.DisplayStringAt(0,0,(uint8_t*)"DTA3",LEFT_MODE);
    printf("oilTemp=%d, Volts=%d\n",oilTemp,Volts);
};

void parse_DTA4(){
    printf("DTA4\n");
};

void parse_DTA5(){
    printf("DTA5\n");
};

void parse_DTA6(){
    printf("DTA6\n");
};

void parse_LVDTFRONT(){
    // add function which parses the received data
};

void parse_LVDTREAR(){
    // add function which parses the received data
};

void parse_BRAKES(){
    // add function which parses the received data
};