03.04.2019. revision - preliminary version with important notes.
Dependencies: mbed LCD_DISCO_F469NIa CANlibrary SD_DISCO_F469NI BSP_DISCO_F469NIa EEPROM_DISCO_F469NI
main.cpp@0:e72467972ec9, 2019-04-03 (annotated)
- 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?
User | Revision | Line number | New 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 | }; |