mirror of
https://github.com/dalathegreat/Battery-Emulator.git
synced 2025-10-03 17:59:27 +02:00
Add still alive triggering on all known Tesla CAN messages
This commit is contained in:
parent
fedcc29662
commit
627e6aeb26
1 changed files with 29 additions and 7 deletions
|
@ -1052,6 +1052,7 @@ void TeslaBattery::handle_incoming_can_frame(CAN_frame rx_frame) {
|
|||
|
||||
switch (rx_frame.ID) {
|
||||
case 0x352: // 850 BMS_energyStatus newer BMS
|
||||
datalayer.battery.status.CAN_battery_still_alive = CAN_STILL_ALIVE;
|
||||
mux = ((rx_frame.data.u8[0]) & 0x03); //BMS_energyStatusIndex M : 0|2@1+ (1,0) [0|0] "" X
|
||||
if (mux == 0) {
|
||||
battery_nominal_full_pack_energy_m0 =
|
||||
|
@ -1105,6 +1106,7 @@ void TeslaBattery::handle_incoming_can_frame(CAN_frame rx_frame) {
|
|||
((rx_frame.data.u8[7] >> 7) & 0x01); //noYes
|
||||
break;
|
||||
case 0x20A: //522 HVP_contactorState:
|
||||
datalayer.battery.status.CAN_battery_still_alive = CAN_STILL_ALIVE;
|
||||
battery_packContNegativeState =
|
||||
(rx_frame.data.u8[0] & 0x07); //(_d[0] & (0x07U)); 0|3@1+ (1,0) [0|7] //contactorState
|
||||
battery_packContPositiveState =
|
||||
|
@ -1135,6 +1137,7 @@ void TeslaBattery::handle_incoming_can_frame(CAN_frame rx_frame) {
|
|||
battery_fcCtrsResetRequestRequired = ((rx_frame.data.u8[3] >> 2) & (0x01U)); //26|1@1+ (1,0) [0|1] "" Receiver
|
||||
battery_fcLinkAllowedToEnergize = ((rx_frame.data.u8[5] >> 4) & (0x03U)); //44|2@1+ (1,0) [0|2] "" Receiver
|
||||
case 0x212: //530 BMS_status: 8
|
||||
datalayer.battery.status.CAN_battery_still_alive = CAN_STILL_ALIVE;
|
||||
BMS_hvacPowerRequest = (rx_frame.data.u8[0] & (0x01U));
|
||||
BMS_notEnoughPowerForDrive = ((rx_frame.data.u8[0] >> 1) & (0x01U));
|
||||
BMS_notEnoughPowerForSupport = ((rx_frame.data.u8[0] >> 2) & (0x01U));
|
||||
|
@ -1174,6 +1177,7 @@ void TeslaBattery::handle_incoming_can_frame(CAN_frame rx_frame) {
|
|||
BMS_minPackTemperature = (rx_frame.data.u8[7] & (0xFFU)); //56|8@1+ (0.5,-40) [0|0] "DegC
|
||||
break;
|
||||
case 0x224: //548 PCS_dcdcStatus:
|
||||
datalayer.battery.status.CAN_battery_still_alive = CAN_STILL_ALIVE;
|
||||
PCS_dcdcPrechargeStatus = (rx_frame.data.u8[0] & (0x03U)); //0 "IDLE" 1 "ACTIVE" 2 "FAULTED" ;
|
||||
PCS_dcdc12VSupportStatus = ((rx_frame.data.u8[0] >> 2) & (0x03U)); //0 "IDLE" 1 "ACTIVE" 2 "FAULTED"
|
||||
PCS_dcdcHvBusDischargeStatus = ((rx_frame.data.u8[0] >> 4) & (0x03U)); //0 "IDLE" 1 "ACTIVE" 2 "FAULTED"
|
||||
|
@ -1201,6 +1205,7 @@ void TeslaBattery::handle_incoming_can_frame(CAN_frame rx_frame) {
|
|||
(0x1FU)); //0 "PWR_UP_INIT" 1 "STANDBY" 2 "12V_SUPPORT_ACTIVE" 3 "DIS_HVBUS" 4 "PCHG_FAST_DIS_HVBUS" 5 "PCHG_SLOW_DIS_HVBUS" 6 "PCHG_DWELL_CHARGE" 7 "PCHG_DWELL_WAIT" 8 "PCHG_DI_RECOVERY_WAIT" 9 "PCHG_ACTIVE" 10 "PCHG_FLT_FAST_DIS_HVBUS" 11 "SHUTDOWN" 12 "12V_SUPPORT_FAULTED" 13 "DIS_HVBUS_FAULTED" 14 "PCHG_FAULTED" 15 "CLEAR_FAULTS" 16 "FAULTED" 17 "NUM" ;
|
||||
break;
|
||||
case 0x252: //Limit //594 BMS_powerAvailable:
|
||||
datalayer.battery.status.CAN_battery_still_alive = CAN_STILL_ALIVE;
|
||||
BMS_maxRegenPower = ((rx_frame.data.u8[1] << 8) |
|
||||
rx_frame.data.u8[0]); //0|16@1+ (0.01,0) [0|655.35] "kW" //Example 4715 * 0.01 = 47.15kW
|
||||
BMS_maxDischargePower =
|
||||
|
@ -1220,6 +1225,7 @@ void TeslaBattery::handle_incoming_can_frame(CAN_frame rx_frame) {
|
|||
BMS_inverterTQF = ((rx_frame.data.u8[7] >> 4) & (0x03U));
|
||||
break;
|
||||
case 0x132: //battery amps/volts //HVBattAmpVolt
|
||||
datalayer.battery.status.CAN_battery_still_alive = CAN_STILL_ALIVE;
|
||||
battery_volts = ((rx_frame.data.u8[1] << 8) | rx_frame.data.u8[0]) *
|
||||
0.1; //0|16@1+ (0.01,0) [0|655.35] "V" //Example 37030mv * 0.01 = 3703dV
|
||||
battery_amps =
|
||||
|
@ -1237,6 +1243,7 @@ void TeslaBattery::handle_incoming_can_frame(CAN_frame rx_frame) {
|
|||
}
|
||||
break;
|
||||
case 0x3D2: //TotalChargeDischarge:
|
||||
datalayer.battery.status.CAN_battery_still_alive = CAN_STILL_ALIVE;
|
||||
battery_total_discharge = ((rx_frame.data.u8[3] << 24) | (rx_frame.data.u8[2] << 16) |
|
||||
(rx_frame.data.u8[1] << 8) | rx_frame.data.u8[0]);
|
||||
//0|32@1+ (0.001,0) [0|4294970] "kWh"
|
||||
|
@ -1245,6 +1252,7 @@ void TeslaBattery::handle_incoming_can_frame(CAN_frame rx_frame) {
|
|||
//32|32@1+ (0.001,0) [0|4294970] "kWh"
|
||||
break;
|
||||
case 0x332: //min/max hist values //BattBrickMinMax:
|
||||
datalayer.battery.status.CAN_battery_still_alive = CAN_STILL_ALIVE;
|
||||
mux = (rx_frame.data.u8[0] & 0x03); //BattBrickMultiplexer M : 0|2@1+ (1,0) [0|0] ""
|
||||
|
||||
if (mux == 1) //Cell voltages
|
||||
|
@ -1286,6 +1294,7 @@ void TeslaBattery::handle_incoming_can_frame(CAN_frame rx_frame) {
|
|||
}
|
||||
break;
|
||||
case 0x312: // 786 BMS_thermalStatus
|
||||
datalayer.battery.status.CAN_battery_still_alive = CAN_STILL_ALIVE;
|
||||
BMS_powerDissipation =
|
||||
((rx_frame.data.u8[1] & (0x03U)) << 8) | (rx_frame.data.u8[0] & (0xFFU)); //0|10@1+ (0.02,0) [0|0] "kW"
|
||||
BMS_flowRequest = ((rx_frame.data.u8[2] & (0x01U)) << 6) |
|
||||
|
@ -1304,6 +1313,7 @@ void TeslaBattery::handle_incoming_can_frame(CAN_frame rx_frame) {
|
|||
BMS_noFlowRequest = ((rx_frame.data.u8[7] >> 7) & (0x01U)); //63|1@1+ (1,0) [0|0] ""
|
||||
break;
|
||||
case 0x2A4: //676 PCS_thermalStatus
|
||||
datalayer.battery.status.CAN_battery_still_alive = CAN_STILL_ALIVE;
|
||||
PCS_chgPhATemp = (rx_frame.data.u8[0] & 0xFF) | ((rx_frame.data.u8[1] & 0x07) << 8); //0|11@1- (0.1,40) [0|0] "C"
|
||||
PCS_chgPhBTemp =
|
||||
((rx_frame.data.u8[1] & 0xF8) >> 3) | ((rx_frame.data.u8[2] & 0x3F) << 5); //11|11@1- (0.1,40) [0|0] "C"
|
||||
|
@ -1314,6 +1324,7 @@ void TeslaBattery::handle_incoming_can_frame(CAN_frame rx_frame) {
|
|||
PCS_ambientTemp = ((rx_frame.data.u8[5] & 0xF0) >> 4) | (rx_frame.data.u8[6] << 4); //44|11@1- (0.1,40) [0|0] "C"
|
||||
break;
|
||||
case 0x2C4: // 708 PCS_logging: not all frames are listed, just ones relating to dcdc
|
||||
datalayer.battery.status.CAN_battery_still_alive = CAN_STILL_ALIVE;
|
||||
mux = (rx_frame.data.u8[0] & (0x1FU));
|
||||
//PCS_logMessageSelect = (rx_frame.data.u8[0] & (0x1FU)); //0|5@1+ (1,0) [0|0] ""
|
||||
if (mux == 6) {
|
||||
|
@ -1371,6 +1382,7 @@ void TeslaBattery::handle_incoming_can_frame(CAN_frame rx_frame) {
|
|||
}
|
||||
break;
|
||||
case 0x401: // Cell stats //BrickVoltages
|
||||
datalayer.battery.status.CAN_battery_still_alive = CAN_STILL_ALIVE;
|
||||
mux = (rx_frame.data.u8[0]); //MultiplexSelector M : 0|8@1+ (1,0) [0|0] ""
|
||||
//StatusFlags : 8|8@1+ (1,0) [0|0] ""
|
||||
//Brick0 m0 : 16|16@1+ (0.0001,0) [0|0] "V"
|
||||
|
@ -1405,6 +1417,7 @@ void TeslaBattery::handle_incoming_can_frame(CAN_frame rx_frame) {
|
|||
}
|
||||
break;
|
||||
case 0x2d2: //BMSVAlimits:
|
||||
datalayer.battery.status.CAN_battery_still_alive = CAN_STILL_ALIVE;
|
||||
BMS_min_voltage = ((rx_frame.data.u8[1] << 8) |
|
||||
rx_frame.data.u8[0]); //0|16@1+ (0.01,0) [0|430] "V" //Example 24148mv * 0.01 = 241.48 V
|
||||
BMS_max_voltage = ((rx_frame.data.u8[3] << 8) |
|
||||
|
@ -1415,6 +1428,7 @@ void TeslaBattery::handle_incoming_can_frame(CAN_frame rx_frame) {
|
|||
0.128; //48|14@1+ (0.128,0) [0|2096.9] "A" //Example 430? * 0.128 = 55.4?
|
||||
break;
|
||||
case 0x2b4: //PCS_dcdcRailStatus:
|
||||
datalayer.battery.status.CAN_battery_still_alive = CAN_STILL_ALIVE;
|
||||
battery_dcdcLvBusVolt =
|
||||
(((rx_frame.data.u8[1] & 0x03) << 8) | rx_frame.data.u8[0]); //0|10@1+ (0.0390625,0) [0|39.9609] "V"
|
||||
battery_dcdcHvBusVolt = (((rx_frame.data.u8[2] & 0x3F) << 6) |
|
||||
|
@ -1423,7 +1437,7 @@ void TeslaBattery::handle_incoming_can_frame(CAN_frame rx_frame) {
|
|||
(((rx_frame.data.u8[4] & 0x0F) << 8) | rx_frame.data.u8[3]); //24|12@1+ (0.1,0) [0|400] "A"
|
||||
break;
|
||||
case 0x292: //BMS_socStatus
|
||||
datalayer.battery.status.CAN_battery_still_alive = CAN_STILL_ALIVE; //We are getting CAN messages from the BMS
|
||||
datalayer.battery.status.CAN_battery_still_alive = CAN_STILL_ALIVE;
|
||||
battery_beginning_of_life =
|
||||
(((rx_frame.data.u8[6] & 0x03) << 8) | rx_frame.data.u8[5]) * 0.1; //40|10@1+ (0.1,0) [0|102.3] "kWh"
|
||||
battery_soc_min = (((rx_frame.data.u8[1] & 0x03) << 8) | rx_frame.data.u8[0]); //0|10@1+ (0.1,0) [0|102.3] "%"
|
||||
|
@ -1437,6 +1451,7 @@ void TeslaBattery::handle_incoming_can_frame(CAN_frame rx_frame) {
|
|||
(((rx_frame.data.u8[7] & 0x03) << 6) | (rx_frame.data.u8[6] & 0x3F) >> 2); //50|8@1+ (0.4,0) [0|100] "%"
|
||||
break;
|
||||
case 0x392: //BMS_packConfig
|
||||
datalayer.battery.status.CAN_battery_still_alive = CAN_STILL_ALIVE;
|
||||
mux = (rx_frame.data.u8[0] & (0xFF));
|
||||
if (mux == 1) {
|
||||
battery_packConfigMultiplexer = (rx_frame.data.u8[0] & (0xff)); //0|8@1+ (1,0) [0|1] ""
|
||||
|
@ -1454,6 +1469,7 @@ void TeslaBattery::handle_incoming_can_frame(CAN_frame rx_frame) {
|
|||
}
|
||||
break;
|
||||
case 0x7AA: //1962 HVP_debugMessage:
|
||||
datalayer.battery.status.CAN_battery_still_alive = CAN_STILL_ALIVE;
|
||||
mux = (rx_frame.data.u8[0] & (0x0FU));
|
||||
//HVP_debugMessageMultiplexer = (rx_frame.data.u8[0] & (0x0FU)); //0|4@1+ (1,0) [0|6] ""
|
||||
if (mux == 0) {
|
||||
|
@ -1605,6 +1621,7 @@ void TeslaBattery::handle_incoming_can_frame(CAN_frame rx_frame) {
|
|||
battery_shuntThermistorMia = ((rx_frame.data.u8[6] & 0x04) >> 2);
|
||||
break;*/
|
||||
case 0x320: //800 BMS_alertMatrix //BMS_alertMatrix 800 BMS_alertMatrix: 8 VEH
|
||||
datalayer.battery.status.CAN_battery_still_alive = CAN_STILL_ALIVE;
|
||||
mux = (rx_frame.data.u8[0] & (0x0F));
|
||||
if (mux == 0) { //mux0
|
||||
BMS_matrixIndex = (rx_frame.data.u8[0] & (0x0F)); // 0|4@1+ (1,0) [0|0] "" X
|
||||
|
@ -1707,6 +1724,7 @@ void TeslaBattery::handle_incoming_can_frame(CAN_frame rx_frame) {
|
|||
}
|
||||
break;
|
||||
case 0x72A: //BMS_serialNumber
|
||||
datalayer.battery.status.CAN_battery_still_alive = CAN_STILL_ALIVE;
|
||||
//Pack serial number in ASCII: 00 54 47 33 32 31 32 30 (mux 0) .TG32120 + 01 32 30 30 33 41 48 58 (mux 1) .2003AHX = TG321202003AHX
|
||||
if (rx_frame.data.u8[0] == 0x00 && !parsed_battery_serialNumber) { // Serial number 1-7
|
||||
battery_serialNumber[0] = rx_frame.data.u8[1];
|
||||
|
@ -1742,6 +1760,7 @@ void TeslaBattery::handle_incoming_can_frame(CAN_frame rx_frame) {
|
|||
}
|
||||
break;
|
||||
case 0x300: //BMS_info
|
||||
datalayer.battery.status.CAN_battery_still_alive = CAN_STILL_ALIVE;
|
||||
//Display internal BMS info and other build/version data
|
||||
if (rx_frame.data.u8[0] == 0x0A) { // Mux 10: BUILD_HWID_COMPONENTID
|
||||
if (BMS_info_buildConfigId == 0) {
|
||||
|
@ -1775,6 +1794,7 @@ void TeslaBattery::handle_incoming_can_frame(CAN_frame rx_frame) {
|
|||
*/
|
||||
break;
|
||||
case 0x3C4: //PCS_info
|
||||
datalayer.battery.status.CAN_battery_still_alive = CAN_STILL_ALIVE;
|
||||
//Display internal PCS info and other build/version data
|
||||
if (rx_frame.data.u8[0] == 0x0A) { // Mux 10: BUILD_HWID_COMPONENTID
|
||||
if (PCS_info_buildConfigId == 0) {
|
||||
|
@ -1832,6 +1852,7 @@ void TeslaBattery::handle_incoming_can_frame(CAN_frame rx_frame) {
|
|||
}
|
||||
break;
|
||||
case 0x310: //HVP_info
|
||||
datalayer.battery.status.CAN_battery_still_alive = CAN_STILL_ALIVE;
|
||||
//Display internal HVP info and other build/version data
|
||||
if (rx_frame.data.u8[0] == 0x0A) { // Mux 10: BUILD_HWID_COMPONENTID
|
||||
if (HVP_info_buildConfigId == 0) {
|
||||
|
@ -1865,6 +1886,7 @@ void TeslaBattery::handle_incoming_can_frame(CAN_frame rx_frame) {
|
|||
*/
|
||||
break;
|
||||
case 0x612: // CAN UDSs for BMS
|
||||
datalayer.battery.status.CAN_battery_still_alive = CAN_STILL_ALIVE;
|
||||
//BMS Query
|
||||
if (stateMachineBMSQuery != 0xFF && stateMachineBMSReset == 0xFF) {
|
||||
if (memcmp(rx_frame.data.u8, "\x02\x50\x03\xAA\xAA\xAA\xAA\xAA", 8) == 0) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue