03.04.2019. revision - preliminary version with important notes.

Dependencies:   mbed LCD_DISCO_F469NIa CANlibrary SD_DISCO_F469NI BSP_DISCO_F469NIa EEPROM_DISCO_F469NI

Committer:
Stefan_Sofijanic
Date:
Wed Apr 03 11:27:45 2019 +0000
Revision:
0:e72467972ec9
03.04.2019. revision - preliminary version with important notes.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Stefan_Sofijanic 0:e72467972ec9 1 #include "CANlibrary.h"
Stefan_Sofijanic 0:e72467972ec9 2 #include "CANadressID.h"
Stefan_Sofijanic 0:e72467972ec9 3 #include "screen_library.h"
Stefan_Sofijanic 0:e72467972ec9 4 #include "EEPROM_DISCO_F469NI.h"
Stefan_Sofijanic 0:e72467972ec9 5
Stefan_Sofijanic 0:e72467972ec9 6 LCD_DISCO_F469NI lcd; //Initialize LCD Display
Stefan_Sofijanic 0:e72467972ec9 7 SD_DISCO_F469NI sd; //Initialize SD Card
Stefan_Sofijanic 0:e72467972ec9 8 //EEPROM_DISCO_F469NI eep; //Initialize EEPROM Internal memory
Stefan_Sofijanic 0:e72467972ec9 9 Serial pc(USBTX, USBRX); //Initialize Serial. This is used only while debuging code.
Stefan_Sofijanic 0:e72467972ec9 10 CAN can(PB_5, PB_13, 100000); //Initialize CAN. // Should be PB_8, PB_9 but because of the PCB shield changed to last years default.
Stefan_Sofijanic 0:e72467972ec9 11 I2C i2c(D14, D15); //Remove (comment) when testing CAN, along with LED and RPM functions.
Stefan_Sofijanic 0:e72467972ec9 12 DigitalOut reset(D8);
Stefan_Sofijanic 0:e72467972ec9 13 InterruptIn change_screen_input(D0); //Initialize Digital input for Change screen button
Stefan_Sofijanic 0:e72467972ec9 14 Timer t_int,t_store;
Stefan_Sofijanic 0:e72467972ec9 15
Stefan_Sofijanic 0:e72467972ec9 16 // Variables received from DTA, LVDTs and brakes
Stefan_Sofijanic 0:e72467972ec9 17 uint16_t Rpm0=0,Speed0=0,Gear0=0,Water_Temp0=0,Oil_Temp0=0,TPS0=0,Brakes0=0,Oil_P0=0,MAP0=0,Air_Temp0=0,Lambda0=0,Volts0=0,Crank0=0;
Stefan_Sofijanic 0:e72467972ec9 18 uint16_t Rpm=0,Speed=0,Gear=0,Water_Temp=0,Oil_Temp=0,TPS=0,Brakes=0,Oil_P=0,MAP=0,Air_Temp=0,Lambda=0,Volts=0,Crank=0;
Stefan_Sofijanic 0:e72467972ec9 19 int FL_LVDT0=0,FR_LVDT0=0,RL_LVDT0=0,RR_LVDT0=0,FL_LVDT=0,FR_LVDT=0,RL_LVDT=0,RR_LVDT=0;
Stefan_Sofijanic 0:e72467972ec9 20 //Referrent LVDT values. First received value is referrent.
Stefan_Sofijanic 0:e72467972ec9 21 int FL_LVDT_Ref,FR_LVDT_Ref,RL_LVDT_Ref,RR_LVDT_Ref;
Stefan_Sofijanic 0:e72467972ec9 22 //float Meter_counter=0,Meter_counter0=0;
Stefan_Sofijanic 0:e72467972ec9 23
Stefan_Sofijanic 0:e72467972ec9 24 uint8_t change_flag=0;
Stefan_Sofijanic 0:e72467972ec9 25 uint16_t rx_flag=0x0000; // Receive specific CAN data message
Stefan_Sofijanic 0:e72467972ec9 26 uint8_t distance_flag=0;
Stefan_Sofijanic 0:e72467972ec9 27 uint8_t lvdtref=0x0F; // Flag if refferent LVDT value is received (first received LVDT value, 1=no, 0=yes). From highest to lowest bit: LL,LR,RL,RR.
Stefan_Sofijanic 0:e72467972ec9 28 uint8_t screen_flag=0x01; // Current screen flag. 1=Main, 2=First Aux, 3=Second Aux.
Stefan_Sofijanic 0:e72467972ec9 29 uint8_t ft_main_flag=1; // Detect first time Main screne in loop
Stefan_Sofijanic 0:e72467972ec9 30 uint8_t ft_2aux_flag=1; // Detect first time Second Aux screne in loop
Stefan_Sofijanic 0:e72467972ec9 31
Stefan_Sofijanic 0:e72467972ec9 32 // CAN Message variables, one variable for each ID
Stefan_Sofijanic 0:e72467972ec9 33 // If new IDs are added, add variables for them
Stefan_Sofijanic 0:e72467972ec9 34 CANMessage msgDTA1; // RPM, TPS %, Water temp C, Air temp C
Stefan_Sofijanic 0:e72467972ec9 35 CANMessage msgDTA2; // MAP Kpa, Lambda x1000, KPH x10, Oil P Kpa
Stefan_Sofijanic 0:e72467972ec9 36 CANMessage msgDTA3; // Fuel P Kpa, Oil temp C, Volts x10, Fuel Con. L/Hr x10
Stefan_Sofijanic 0:e72467972ec9 37 CANMessage msgDTA4; // Gear, Advance Deg x10, Injection ms x100, Fuel Con L/100km x10
Stefan_Sofijanic 0:e72467972ec9 38 CANMessage msgDTA5; // Ana1 mV, Ana2 mV, Ana3 mV, Cam Advance x10
Stefan_Sofijanic 0:e72467972ec9 39 CANMessage msgDTA6; // Cam Targ x10, Cam PWM x10, Crank Errors, Cam Errors
Stefan_Sofijanic 0:e72467972ec9 40 CANMessage msgLVDTFront; // Left, Right, Steering Wheel
Stefan_Sofijanic 0:e72467972ec9 41 CANMessage msgLVDTRear; // Left, Right
Stefan_Sofijanic 0:e72467972ec9 42 CANMessage msgBrakes; // Brake system preassure, Braking On/Off
Stefan_Sofijanic 0:e72467972ec9 43 CANMessage msgDistance; // Total distance
Stefan_Sofijanic 0:e72467972ec9 44
Stefan_Sofijanic 0:e72467972ec9 45 // LED Bar for RPM
Stefan_Sofijanic 0:e72467972ec9 46
Stefan_Sofijanic 0:e72467972ec9 47 char cmd[3];
Stefan_Sofijanic 0:e72467972ec9 48 int addr = 0x74<<1;
Stefan_Sofijanic 0:e72467972ec9 49
Stefan_Sofijanic 0:e72467972ec9 50 void LEDInitialize(){
Stefan_Sofijanic 0:e72467972ec9 51 reset.write(1);
Stefan_Sofijanic 0:e72467972ec9 52 // set port as output
Stefan_Sofijanic 0:e72467972ec9 53 cmd[0]=0x06;
Stefan_Sofijanic 0:e72467972ec9 54 cmd[1]=0x00;
Stefan_Sofijanic 0:e72467972ec9 55 cmd[2]=0x00;
Stefan_Sofijanic 0:e72467972ec9 56 i2c.write(addr,cmd,3);
Stefan_Sofijanic 0:e72467972ec9 57 }
Stefan_Sofijanic 0:e72467972ec9 58
Stefan_Sofijanic 0:e72467972ec9 59 void showLedRpm(int RPM){
Stefan_Sofijanic 0:e72467972ec9 60 pc.printf("%d\n",RPM);
Stefan_Sofijanic 0:e72467972ec9 61 if(RPM<1000) {
Stefan_Sofijanic 0:e72467972ec9 62 cmd[1]=0xFF;
Stefan_Sofijanic 0:e72467972ec9 63 cmd[2]=0xFF;
Stefan_Sofijanic 0:e72467972ec9 64 }
Stefan_Sofijanic 0:e72467972ec9 65 else if (RPM<2000) {
Stefan_Sofijanic 0:e72467972ec9 66 cmd[1]=0xFF;
Stefan_Sofijanic 0:e72467972ec9 67 cmd[2]=0xDF;
Stefan_Sofijanic 0:e72467972ec9 68 }
Stefan_Sofijanic 0:e72467972ec9 69 else if (RPM <3000) {
Stefan_Sofijanic 0:e72467972ec9 70 cmd[1]=0xFF;
Stefan_Sofijanic 0:e72467972ec9 71 cmd[2]=0xCF;
Stefan_Sofijanic 0:e72467972ec9 72 }
Stefan_Sofijanic 0:e72467972ec9 73 else if (RPM <4000) {
Stefan_Sofijanic 0:e72467972ec9 74 cmd[1]=0xFF;
Stefan_Sofijanic 0:e72467972ec9 75 cmd[2]=0xC7;
Stefan_Sofijanic 0:e72467972ec9 76 }
Stefan_Sofijanic 0:e72467972ec9 77 else if (RPM <5000) {
Stefan_Sofijanic 0:e72467972ec9 78 cmd[1]=0xFF;
Stefan_Sofijanic 0:e72467972ec9 79 cmd[2]=0xC3;
Stefan_Sofijanic 0:e72467972ec9 80 }
Stefan_Sofijanic 0:e72467972ec9 81 else if (RPM <6000) {
Stefan_Sofijanic 0:e72467972ec9 82 cmd[1]=0xFF;
Stefan_Sofijanic 0:e72467972ec9 83 cmd[2]=0xC1;
Stefan_Sofijanic 0:e72467972ec9 84 }
Stefan_Sofijanic 0:e72467972ec9 85 else if (RPM <7000) {
Stefan_Sofijanic 0:e72467972ec9 86 cmd[1]=0xFF;
Stefan_Sofijanic 0:e72467972ec9 87 cmd[2]=0xC0;
Stefan_Sofijanic 0:e72467972ec9 88 }
Stefan_Sofijanic 0:e72467972ec9 89 else if (RPM <8000) {
Stefan_Sofijanic 0:e72467972ec9 90 cmd[1]=0xBF;
Stefan_Sofijanic 0:e72467972ec9 91 cmd[2]=0xC0;
Stefan_Sofijanic 0:e72467972ec9 92 }
Stefan_Sofijanic 0:e72467972ec9 93 else if (RPM <9000) {
Stefan_Sofijanic 0:e72467972ec9 94 cmd[1]=0x9F;
Stefan_Sofijanic 0:e72467972ec9 95 cmd[2]=0xC0;
Stefan_Sofijanic 0:e72467972ec9 96 }
Stefan_Sofijanic 0:e72467972ec9 97 else if (RPM <10000) {
Stefan_Sofijanic 0:e72467972ec9 98 cmd[1]=0x8F;
Stefan_Sofijanic 0:e72467972ec9 99 cmd[2]=0xC0;
Stefan_Sofijanic 0:e72467972ec9 100 }
Stefan_Sofijanic 0:e72467972ec9 101 else if (RPM <11000) {
Stefan_Sofijanic 0:e72467972ec9 102 cmd[1]=0x87;
Stefan_Sofijanic 0:e72467972ec9 103 cmd[2]=0xC0;
Stefan_Sofijanic 0:e72467972ec9 104 }
Stefan_Sofijanic 0:e72467972ec9 105 else if (RPM <12000) {
Stefan_Sofijanic 0:e72467972ec9 106 cmd[1]=0x83;
Stefan_Sofijanic 0:e72467972ec9 107 cmd[2]=0xC0;
Stefan_Sofijanic 0:e72467972ec9 108 }
Stefan_Sofijanic 0:e72467972ec9 109 else if (RPM <13000) {
Stefan_Sofijanic 0:e72467972ec9 110 cmd[1]=0x81;
Stefan_Sofijanic 0:e72467972ec9 111 cmd[2]=0xC0;
Stefan_Sofijanic 0:e72467972ec9 112 }
Stefan_Sofijanic 0:e72467972ec9 113 else {
Stefan_Sofijanic 0:e72467972ec9 114 cmd[1]=0x80;
Stefan_Sofijanic 0:e72467972ec9 115 cmd[2]=0xC0;
Stefan_Sofijanic 0:e72467972ec9 116 }
Stefan_Sofijanic 0:e72467972ec9 117 cmd[0]=0x02;
Stefan_Sofijanic 0:e72467972ec9 118 i2c.write(addr, cmd, 3);
Stefan_Sofijanic 0:e72467972ec9 119 }
Stefan_Sofijanic 0:e72467972ec9 120
Stefan_Sofijanic 0:e72467972ec9 121 void UpdateInfo(){ // Update info for DTA values
Stefan_Sofijanic 0:e72467972ec9 122 if(check_flag(0)){
Stefan_Sofijanic 0:e72467972ec9 123 Rpm0=Rpm;
Stefan_Sofijanic 0:e72467972ec9 124 Rpm=get_data(DTA1_RPM);
Stefan_Sofijanic 0:e72467972ec9 125 TPS0=TPS;
Stefan_Sofijanic 0:e72467972ec9 126 TPS=get_data(DTA1_TPS);
Stefan_Sofijanic 0:e72467972ec9 127 Water_Temp0=Water_Temp;
Stefan_Sofijanic 0:e72467972ec9 128 Water_Temp=get_data(DTA1_WaterTemp);
Stefan_Sofijanic 0:e72467972ec9 129 Air_Temp0=Air_Temp;
Stefan_Sofijanic 0:e72467972ec9 130 Air_Temp=get_data(DTA1_AirTemp);
Stefan_Sofijanic 0:e72467972ec9 131 }
Stefan_Sofijanic 0:e72467972ec9 132
Stefan_Sofijanic 0:e72467972ec9 133 if(check_flag(1)){
Stefan_Sofijanic 0:e72467972ec9 134 MAP0=MAP;
Stefan_Sofijanic 0:e72467972ec9 135 MAP=get_data(DTA2_MAP);
Stefan_Sofijanic 0:e72467972ec9 136 Lambda0=Lambda;
Stefan_Sofijanic 0:e72467972ec9 137 Lambda=get_data(DTA2_Lambda);
Stefan_Sofijanic 0:e72467972ec9 138 Speed0=Speed;
Stefan_Sofijanic 0:e72467972ec9 139 Speed=get_data(DTA2_Speed);
Stefan_Sofijanic 0:e72467972ec9 140 Oil_P0=Oil_P;
Stefan_Sofijanic 0:e72467972ec9 141 Oil_P=get_data(DTA2_OilPres);
Stefan_Sofijanic 0:e72467972ec9 142 }
Stefan_Sofijanic 0:e72467972ec9 143
Stefan_Sofijanic 0:e72467972ec9 144 if(check_flag(2)){
Stefan_Sofijanic 0:e72467972ec9 145 Oil_Temp0=Oil_Temp;
Stefan_Sofijanic 0:e72467972ec9 146 Oil_Temp=get_data(DTA3_OilTemp);
Stefan_Sofijanic 0:e72467972ec9 147 Volts0=Volts;
Stefan_Sofijanic 0:e72467972ec9 148 Volts=get_data(DTA3_Volts);
Stefan_Sofijanic 0:e72467972ec9 149 }
Stefan_Sofijanic 0:e72467972ec9 150
Stefan_Sofijanic 0:e72467972ec9 151 if(check_flag(3)){
Stefan_Sofijanic 0:e72467972ec9 152 Gear0=Gear;
Stefan_Sofijanic 0:e72467972ec9 153 Gear=get_data(DTA4_Gear);
Stefan_Sofijanic 0:e72467972ec9 154 }
Stefan_Sofijanic 0:e72467972ec9 155
Stefan_Sofijanic 0:e72467972ec9 156 if(check_flag(5)){
Stefan_Sofijanic 0:e72467972ec9 157 Crank0=Crank;
Stefan_Sofijanic 0:e72467972ec9 158 Crank=get_data(DTA6_Crank);
Stefan_Sofijanic 0:e72467972ec9 159 }
Stefan_Sofijanic 0:e72467972ec9 160
Stefan_Sofijanic 0:e72467972ec9 161 };
Stefan_Sofijanic 0:e72467972ec9 162
Stefan_Sofijanic 0:e72467972ec9 163 int main(){
Stefan_Sofijanic 0:e72467972ec9 164 LEDInitialize(); // Remove (comment) when testing CAN, along with LED and RPM functions.
Stefan_Sofijanic 0:e72467972ec9 165 can_initRX(); // Attach interrupt function to CAN RX
Stefan_Sofijanic 0:e72467972ec9 166 change_screen_input.rise(&ChangeCommand); // Attach interrupt function to rising edge of DigitalIn for changing screen.
Stefan_Sofijanic 0:e72467972ec9 167 SetIntro(); // Display logo when starting display
Stefan_Sofijanic 0:e72467972ec9 168 SetMain(); // First screen is main by default
Stefan_Sofijanic 0:e72467972ec9 169 sd.Init();
Stefan_Sofijanic 0:e72467972ec9 170
Stefan_Sofijanic 0:e72467972ec9 171 while(1){
Stefan_Sofijanic 0:e72467972ec9 172 if(change_flag){ // Check if screen is changed
Stefan_Sofijanic 0:e72467972ec9 173 ChangeScreen();
Stefan_Sofijanic 0:e72467972ec9 174 };
Stefan_Sofijanic 0:e72467972ec9 175 UpdateInfo(); // Update info for DTA values in every iteration
Stefan_Sofijanic 0:e72467972ec9 176 switch(screen_flag){ // Display only changes visible on current screen
Stefan_Sofijanic 0:e72467972ec9 177 case(1):
Stefan_Sofijanic 0:e72467972ec9 178 MainUpdate();
Stefan_Sofijanic 0:e72467972ec9 179 break;
Stefan_Sofijanic 0:e72467972ec9 180 case(2):
Stefan_Sofijanic 0:e72467972ec9 181 FirstAuxUpdate();
Stefan_Sofijanic 0:e72467972ec9 182 break;
Stefan_Sofijanic 0:e72467972ec9 183 case(3):
Stefan_Sofijanic 0:e72467972ec9 184 SecondAuxUpdate();
Stefan_Sofijanic 0:e72467972ec9 185 break;
Stefan_Sofijanic 0:e72467972ec9 186 };
Stefan_Sofijanic 0:e72467972ec9 187 };
Stefan_Sofijanic 0:e72467972ec9 188 };