scania 124L dashboard for ETS2

Dependencies:   FastPWM mbed

Committer:
arcannae
Date:
Sun Feb 18 10:53:44 2018 +0000
Revision:
0:bf6a96c707f6
ETS2 plugin for dashboard scania 124L

Who changed what in which revision?

UserRevisionLine numberNew contents of line
arcannae 0:bf6a96c707f6 1 #include "mbed.h"
arcannae 0:bf6a96c707f6 2 #include "FastPWM.h"
arcannae 0:bf6a96c707f6 3
arcannae 0:bf6a96c707f6 4 Serial COM(USBTX, USBRX);
arcannae 0:bf6a96c707f6 5
arcannae 0:bf6a96c707f6 6 DigitalOut batterie (D4);
arcannae 0:bf6a96c707f6 7 DigitalOut air_brake (D5);
arcannae 0:bf6a96c707f6 8 DigitalOut parking_brake (D6);
arcannae 0:bf6a96c707f6 9 DigitalOut oil (D7);
arcannae 0:bf6a96c707f6 10
arcannae 0:bf6a96c707f6 11 DigitalOut dash_on (A0);
arcannae 0:bf6a96c707f6 12 DigitalOut light_on (A1);
arcannae 0:bf6a96c707f6 13 DigitalOut spliter_light (A2);
arcannae 0:bf6a96c707f6 14 DigitalOut blinkers (A3);
arcannae 0:bf6a96c707f6 15 DigitalOut retarder_light (A4);
arcannae 0:bf6a96c707f6 16 DigitalOut high_beam_light (A5);
arcannae 0:bf6a96c707f6 17
arcannae 0:bf6a96c707f6 18 FastPWM fuel_pwm (PA_11);
arcannae 0:bf6a96c707f6 19 FastPWM water_pwm (D2);
arcannae 0:bf6a96c707f6 20 FastPWM air_pwm (D3);
arcannae 0:bf6a96c707f6 21 FastPWM oil_pwm (D8);
arcannae 0:bf6a96c707f6 22 FastPWM speed_pulse (D9);
arcannae 0:bf6a96c707f6 23 FastPWM batterie_neg (D10);
arcannae 0:bf6a96c707f6 24 FastPWM batterie_pos (D11);
arcannae 0:bf6a96c707f6 25 FastPWM buzzer (D13);
arcannae 0:bf6a96c707f6 26 FastPWM rpm_pulse (D14);
arcannae 0:bf6a96c707f6 27
arcannae 0:bf6a96c707f6 28 int serial_byte;
arcannae 0:bf6a96c707f6 29 int prev_rpm;
arcannae 0:bf6a96c707f6 30 float prev_speed;
arcannae 0:bf6a96c707f6 31
arcannae 0:bf6a96c707f6 32 float map(float x, float in_min, float in_max, float out_min, float out_max)
arcannae 0:bf6a96c707f6 33 {
arcannae 0:bf6a96c707f6 34 return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
arcannae 0:bf6a96c707f6 35 }
arcannae 0:bf6a96c707f6 36
arcannae 0:bf6a96c707f6 37 int Serial_data[41];
arcannae 0:bf6a96c707f6 38 bool OCTET0[8];
arcannae 0:bf6a96c707f6 39 bool OCTET1[8];
arcannae 0:bf6a96c707f6 40 bool OCTET2[8];
arcannae 0:bf6a96c707f6 41
arcannae 0:bf6a96c707f6 42 enum OCTET0{brake_air_press_warning, park_brake, high_beam, low_beam, right_blinker, left_blinker, light_parking};
arcannae 0:bf6a96c707f6 43 enum OCTET1{water_temperature_warning, oil_pressure_warning, batterie_voltage_warning, fuel_warning, brake_air_emergency, motor_brake, light_reverse};
arcannae 0:bf6a96c707f6 44 enum OCTET2{engine_enabled, electric_enabled, left_blinker_state, right_blinker_state, NOK1, light_brake, trailer_connected};
arcannae 0:bf6a96c707f6 45 enum Serial_data {speed_ms, LSB_rpm, MSB_rpm, air_pressure, fuel_int, oil_pressure_int, oil_temperature_int, water_temperature_int, batterie_voltage_int, average_cosumption_int, adblue, engine_gear, effective_throttle, LSB_Fuel_liters, MSB_Fuel_liters, odometer_split_1,
arcannae 0:bf6a96c707f6 46 odometer_split_2, odometer_split_3, odometer_split_4, game_time_split_1, game_time_split_2, game_time_split_3, game_time_split_4, next_rest_stop_split_1, next_rest_stop_split_2, next_rest_stop_split_3, next_rest_stop_split_4, cruise_control,
arcannae 0:bf6a96c707f6 47 retarder_steps, decimal_oil_pressure, decimal_battery_voltage, decimal_average_consumption, speed_ms_decimal, decimal_fuel_liters, decimal_odometer, decimal_water_temperature, decimal_fuel, decimal_engine_rpm, OCTET_0, OCTET_1, OCTET_2};
arcannae 0:bf6a96c707f6 48
arcannae 0:bf6a96c707f6 49 float fuel_level_needle[100] ={0.97,0.9652,0.9604,0.9556,0.9508,0.946,0.9412,0.9364,0.9316,0.9268,0.922,0.9172,0.9124,0.9076,0.9028,0.898,0.8932,0.8884,0.8836,0.8788,0.874,0.8692,0.8644,0.8596,0.85,0.8448,0.8396,0.8344,0.8292,0.824,0.8188,0.8136,0.8084,0.8032,0.798,0.7928,0.7876,0.7824,0.7772,0.772,0.7668,0.7616,0.7564,0.7512,0.746,0.7408,0.7356,0.7304,0.7252,0.72,0.7168,0.7136,0.7104,0.7072,0.704,0.7008,0.6976,0.6944,0.6912,0.688,0.6848,0.6816,0.6784,0.6752,0.672,0.6688,0.6656,0.6624,0.6592,0.656,0.6528,0.6496,0.6464,0.6432,0.64,0.6384,0.6368,0.6352,0.6336,0.632,0.6304,0.6288,0.6272,0.6256,0.624,0.6224,0.6208,0.6192,0.6176,0.616,0.6144,0.6128,0.6112,0.6096,0.608,0.6064,0.6048,0.6032,0.6016,0.6};
arcannae 0:bf6a96c707f6 50 float air_pressure_needle[150] ={0.95,0.9424,0.9348,0.9272,0.9196,0.912,0.9044,0.8968,0.8892,0.8816,0.874,0.8664,0.8588,0.8512,0.8436,0.836,0.8284,0.8208,0.8132,0.8056,0.798,0.7904,0.7828,0.7752,0.76,0.7541,0.7482,0.7423,0.7364,0.7305,0.7246,0.7187,0.7128,0.7069,0.701,0.6951,0.6892,0.6833,0.6774,0.6715,0.6656,0.6597,0.6538,0.6479,0.642,0.6361,0.6302,0.63,0.6267,0.6234,0.6201,0.6168,0.6135,0.6102,0.6069,0.6036,0.6003,0.597,0.5937,0.5904,0.5871,0.5838,0.5805,0.5772,0.5739,0.5706,0.5673,0.564,0.5607,0.5574,0.5541,0.55,0.5484,0.5468,0.5452,0.5436,0.542,0.5404,0.5388,0.5372,0.5356,0.534,0.5324,0.5308,0.5292,0.5276,0.526,0.5244,0.5228,0.5212,0.5196,0.518,0.5164,0.5148,0.5132,0.51,0.50917,0.50834,0.50751,0.50668,0.50585,0.50502,0.50419,0.50336,0.50253,0.5017,0.50087,0.50004,0.49921,0.49838,0.49755,0.49672,0.49589,0.49506,0.49423,0.4934,0.49257,0.49174,0.49091,0.49,0.48917,0.48834,0.48751,0.48668,0.48585,0.48502,0.48419,0.48336,0.48253,0.4817,0.48087,0.48004,0.47921,0.47838,0.47755,0.47672,0.47589,0.47506,0.47423,0.4734,0.47257,0.47174,0.47091,0.47,0.47,0.47,0.47,0.47,0.47,0.47};
arcannae 0:bf6a96c707f6 51 float water_temperature_needle[120] ={0.7,0.705,0.71,0.715,0.72,0.725,0.73,0.735,0.74,0.745,0.75,0.755,0.76,0.765,0.77,0.775,0.78,0.785,0.79,0.795,0.8,0.805,0.81,0.815,0.82,0.825,0.83,0.835,0.84,0.845,0.85,0.855,0.86,0.865,0.87,0.875,0.88,0.885,0.89,0.9,0.901,0.902,0.903,0.904,0.905,0.906,0.907,0.908,0.909,0.91,0.911,0.912,0.913,0.914,0.915,0.916,0.917,0.918,0.919,0.92,0.921,0.922,0.923,0.924,0.925,0.926,0.927,0.928,0.929,0.93,0.931,0.932,0.933,0.934,0.935,0.936,0.937,0.938,0.939,0.94,0.94135,0.9427,0.94405,0.9454,0.94675,0.9481,0.94945,0.9508,0.95215,0.9535,0.95485,0.9562,0.95755,0.9589,0.96025,0.9616,0.96295,0.9643,0.96565,0.967,0.968,0.969,0.97,0.971,0.972,0.973,0.974,0.975,0.976,0.977,0.978,0.979,0.98,0.981,0.982,0.983,0.984,0.985,0.986,0.987};
arcannae 0:bf6a96c707f6 52 float oil_pressure_needle[86] ={0.97,0.9637,0.9574,0.9511,0.9448,0.9385,0.9322,0.9259,0.9196,0.9133,0.9,0.8928,0.8856,0.8784,0.8712,0.864,0.8568,0.8496,0.8424,0.8352,0.828,0.82,0.8145,0.809,0.8035,0.798,0.7925,0.787,0.7815,0.776,0.7705,0.765,0.76,0.7563,0.7526,0.7489,0.7452,0.7415,0.7378,0.7341,0.7304,0.7267,0.723,0.72,0.7168,0.7136,0.7104,0.7072,0.704,0.7008,0.6976,0.6944,0.6912,0.688,0.685,0.6828,0.6806,0.6784,0.6762,0.674,0.6718,0.6696,0.6674,0.6652,0.663,0.6608,0.6586,0.6564,0.6542,0.652,0.6498,0.6476,0.6454,0.6432,0.641,0.6388,0.6366,0.6344,0.6322,0.63,0.63,0.63,0.63,0.63,0.63,0.63};
arcannae 0:bf6a96c707f6 53
arcannae 0:bf6a96c707f6 54 int main()
arcannae 0:bf6a96c707f6 55 {
arcannae 0:bf6a96c707f6 56 COM.baud(115200);
arcannae 0:bf6a96c707f6 57 COM.format(8, SerialBase::None, 1);
arcannae 0:bf6a96c707f6 58
arcannae 0:bf6a96c707f6 59 //initialisation...
arcannae 0:bf6a96c707f6 60 dash_on = 1;
arcannae 0:bf6a96c707f6 61 light_on = 0;
arcannae 0:bf6a96c707f6 62 batterie = 0;
arcannae 0:bf6a96c707f6 63 oil = 0;
arcannae 0:bf6a96c707f6 64 parking_brake = 0;
arcannae 0:bf6a96c707f6 65 air_brake = 0;
arcannae 0:bf6a96c707f6 66 blinkers = 0;
arcannae 0:bf6a96c707f6 67 retarder_light = 0;
arcannae 0:bf6a96c707f6 68 high_beam_light = 0;
arcannae 0:bf6a96c707f6 69 spliter_light = 0;
arcannae 0:bf6a96c707f6 70
arcannae 0:bf6a96c707f6 71 //speed set at 0KM/H
arcannae 0:bf6a96c707f6 72 speed_pulse.period_us (200000);
arcannae 0:bf6a96c707f6 73 speed_pulse.write (0.50f);
arcannae 0:bf6a96c707f6 74
arcannae 0:bf6a96c707f6 75 //set water, baterie(-), oil PWM frequency at 887Hz (timer1 linked)
arcannae 0:bf6a96c707f6 76 water_pwm.period_us (200); // 887Hz
arcannae 0:bf6a96c707f6 77 water_pwm.write (0.30f);
arcannae 0:bf6a96c707f6 78 oil_pwm.write (0.97f);
arcannae 0:bf6a96c707f6 79
arcannae 0:bf6a96c707f6 80 //buzzer configuration...frequency set for air,fuel, buzzer PWM (timer2 linked)
arcannae 0:bf6a96c707f6 81 buzzer.period_us (2257); // 887Hz
arcannae 0:bf6a96c707f6 82 buzzer.write (0.0f);
arcannae 0:bf6a96c707f6 83
arcannae 0:bf6a96c707f6 84 fuel_pwm.write (0.97f);
arcannae 0:bf6a96c707f6 85 air_pwm.write (0.95f);
arcannae 0:bf6a96c707f6 86
arcannae 0:bf6a96c707f6 87 while(1) {
arcannae 0:bf6a96c707f6 88
arcannae 0:bf6a96c707f6 89
arcannae 0:bf6a96c707f6 90 if(COM.readable()) {
arcannae 0:bf6a96c707f6 91
arcannae 0:bf6a96c707f6 92 serial_byte = COM.getc();
arcannae 0:bf6a96c707f6 93
arcannae 0:bf6a96c707f6 94 if(serial_byte != 0xFF) {
arcannae 0:bf6a96c707f6 95 return;
arcannae 0:bf6a96c707f6 96 }
arcannae 0:bf6a96c707f6 97
arcannae 0:bf6a96c707f6 98 serial_byte = COM.getc();
arcannae 0:bf6a96c707f6 99
arcannae 0:bf6a96c707f6 100 if(serial_byte != 0x02) {
arcannae 0:bf6a96c707f6 101 return;
arcannae 0:bf6a96c707f6 102 }
arcannae 0:bf6a96c707f6 103
arcannae 0:bf6a96c707f6 104 for (int i = 0; i<41; i++)
arcannae 0:bf6a96c707f6 105 {
arcannae 0:bf6a96c707f6 106 Serial_data[i] = COM.getc();
arcannae 0:bf6a96c707f6 107 }
arcannae 0:bf6a96c707f6 108
arcannae 0:bf6a96c707f6 109 for(int i = 0; i < 8; i ++)
arcannae 0:bf6a96c707f6 110 {
arcannae 0:bf6a96c707f6 111 OCTET0[i] = ((int (Serial_data[OCTET_0]) >> i) & 0x01);
arcannae 0:bf6a96c707f6 112 OCTET1[i] = ((int (Serial_data[OCTET_1]) >> i) & 0x01);
arcannae 0:bf6a96c707f6 113 OCTET2[i] = ((int (Serial_data[OCTET_2]) >> i) & 0x01);
arcannae 0:bf6a96c707f6 114 }
arcannae 0:bf6a96c707f6 115
arcannae 0:bf6a96c707f6 116
arcannae 0:bf6a96c707f6 117 float rpm = ((Serial_data[MSB_rpm] << 8) + Serial_data[LSB_rpm]) + (decimal_engine_rpm);
arcannae 0:bf6a96c707f6 118 float speed_kph = (Serial_data[speed_ms] + (Serial_data[speed_ms_decimal] / 100.0))*3.60f;
arcannae 0:bf6a96c707f6 119
arcannae 0:bf6a96c707f6 120 if (Serial_data[retarder_steps] > 1)
arcannae 0:bf6a96c707f6 121 Serial_data[retarder_steps] = 1;
arcannae 0:bf6a96c707f6 122
arcannae 0:bf6a96c707f6 123
arcannae 0:bf6a96c707f6 124
arcannae 0:bf6a96c707f6 125 //-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
arcannae 0:bf6a96c707f6 126
arcannae 0:bf6a96c707f6 127 light_on = OCTET0[light_parking];
arcannae 0:bf6a96c707f6 128 dash_on = OCTET2[electric_enabled];
arcannae 0:bf6a96c707f6 129 batterie = OCTET1[batterie_voltage_warning];
arcannae 0:bf6a96c707f6 130 oil = OCTET1[oil_pressure_warning];
arcannae 0:bf6a96c707f6 131 parking_brake = OCTET0[park_brake];
arcannae 0:bf6a96c707f6 132 air_brake = OCTET0[brake_air_press_warning];
arcannae 0:bf6a96c707f6 133 blinkers = (OCTET0[left_blinker] || OCTET0[right_blinker]);
arcannae 0:bf6a96c707f6 134 retarder_light = Serial_data[retarder_steps];
arcannae 0:bf6a96c707f6 135 high_beam_light = OCTET0[high_beam];
arcannae 0:bf6a96c707f6 136 spliter_light = (Serial_data[engine_gear] & 0x01);
arcannae 0:bf6a96c707f6 137
arcannae 0:bf6a96c707f6 138 if(OCTET0[brake_air_press_warning] == 1){
arcannae 0:bf6a96c707f6 139 buzzer.write(0.50f);
arcannae 0:bf6a96c707f6 140 }else{
arcannae 0:bf6a96c707f6 141 buzzer.write(0);
arcannae 0:bf6a96c707f6 142 }
arcannae 0:bf6a96c707f6 143
arcannae 0:bf6a96c707f6 144 oil_pwm.write (oil_pressure_needle[Serial_data[oil_pressure_int]]);
arcannae 0:bf6a96c707f6 145 air_pwm.write (air_pressure_needle[Serial_data[air_pressure]]);
arcannae 0:bf6a96c707f6 146 fuel_pwm.write (fuel_level_needle[Serial_data[fuel_int]]);
arcannae 0:bf6a96c707f6 147 water_pwm.write (water_temperature_needle[Serial_data[water_temperature_int]]);
arcannae 0:bf6a96c707f6 148 batterie_neg.write (0);
arcannae 0:bf6a96c707f6 149 batterie_pos.write (map(Serial_data[batterie_voltage_int], 0.0, 25.0, 0.00, 1.00) && OCTET2[electric_enabled]);
arcannae 0:bf6a96c707f6 150
arcannae 0:bf6a96c707f6 151 float period;
arcannae 0:bf6a96c707f6 152
arcannae 0:bf6a96c707f6 153 if ((rpm > 200) && (rpm != prev_rpm)){
arcannae 0:bf6a96c707f6 154 prev_rpm = rpm;
arcannae 0:bf6a96c707f6 155 rpm = map(rpm, 200.0, 3000.0, 20.0, 1030.0);
arcannae 0:bf6a96c707f6 156 period = (1.000000f/rpm);
arcannae 0:bf6a96c707f6 157 rpm_pulse.period_us(double(period)*1000000);
arcannae 0:bf6a96c707f6 158 rpm_pulse.write(0.50f);
arcannae 0:bf6a96c707f6 159
arcannae 0:bf6a96c707f6 160 }
arcannae 0:bf6a96c707f6 161
arcannae 0:bf6a96c707f6 162 if(engine_gear == 13 || engine_gear == 14){
arcannae 0:bf6a96c707f6 163 speed_kph = 0.0f;
arcannae 0:bf6a96c707f6 164 }
arcannae 0:bf6a96c707f6 165
arcannae 0:bf6a96c707f6 166 if(speed_kph != prev_speed){
arcannae 0:bf6a96c707f6 167 prev_speed = speed_kph;
arcannae 0:bf6a96c707f6 168 speed_kph = map(speed_kph, 0, 120, 5, 160);
arcannae 0:bf6a96c707f6 169 period = (1.000000f/speed_kph);
arcannae 0:bf6a96c707f6 170 speed_pulse.period_us(double(period)*1000000);
arcannae 0:bf6a96c707f6 171 speed_pulse.write(0.50f);
arcannae 0:bf6a96c707f6 172 }
arcannae 0:bf6a96c707f6 173
arcannae 0:bf6a96c707f6 174
arcannae 0:bf6a96c707f6 175 }
arcannae 0:bf6a96c707f6 176 }
arcannae 0:bf6a96c707f6 177 }