diff --git a/Software/src/battery/BATTERIES.cpp b/Software/src/battery/BATTERIES.cpp index de12573b..69fe11ac 100644 --- a/Software/src/battery/BATTERIES.cpp +++ b/Software/src/battery/BATTERIES.cpp @@ -25,7 +25,7 @@ void setup_battery() { #ifdef BMW_I3_BATTERY battery2 = new SELECTED_BATTERY_CLASS(&datalayer.battery2, &datalayer.system.status.battery2_allows_contactor_closing, - nullptr, can_config.battery_double, WUP_PIN2); + can_config.battery_double, WUP_PIN2); #else battery2 = new SELECTED_BATTERY_CLASS(&datalayer.battery2, &datalayer.system.status.battery2_allows_contactor_closing, diff --git a/Software/src/battery/BMW-I3-BATTERY.cpp b/Software/src/battery/BMW-I3-BATTERY.cpp index 1e4bae88..90d47bd5 100644 --- a/Software/src/battery/BMW-I3-BATTERY.cpp +++ b/Software/src/battery/BMW-I3-BATTERY.cpp @@ -307,194 +307,6 @@ void BmwI3Battery::handle_incoming_can_frame(CAN_frame rx_frame) { } } -/*void handle_incoming_can_frame_battery2(CAN_frame rx_frame) { - switch (rx_frame.ID) { - case 0x112: //BMS [10ms] Status Of High-Voltage Battery - 2 - battery2_awake = true; - datalayer.battery2.status.CAN_battery_still_alive = - CAN_STILL_ALIVE; //This message is only sent if 30C (Wakeup pin on battery) is energized with 12V - battery2_current = (rx_frame.data.u8[1] << 8 | rx_frame.data.u8[0]) - 8192; //deciAmps (-819.2 to 819.0A) - battery2_volts = (rx_frame.data.u8[3] << 8 | rx_frame.data.u8[2]); //500.0 V - datalayer.battery2.status.voltage_dV = - battery2_volts; // Update the datalayer as soon as possible with this info, needed for contactor control - battery2_HVBatt_SOC = ((rx_frame.data.u8[5] & 0x0F) << 8 | rx_frame.data.u8[4]); - battery2_request_open_contactors = (rx_frame.data.u8[5] & 0xC0) >> 6; - battery2_request_open_contactors_instantly = (rx_frame.data.u8[6] & 0x03); - battery2_request_open_contactors_fast = (rx_frame.data.u8[6] & 0x0C) >> 2; - battery2_charging_condition_delta = (rx_frame.data.u8[6] & 0xF0) >> 4; - battery2_DC_link_voltage = rx_frame.data.u8[7]; - break; - case 0x1FA: //BMS [1000ms] Status Of High-Voltage Battery - 1 - battery2_status_error_isolation_external_Bordnetz = (rx_frame.data.u8[0] & 0x03); - battery2_status_error_isolation_internal_Bordnetz = (rx_frame.data.u8[0] & 0x0C) >> 2; - battery2_request_cooling = (rx_frame.data.u8[0] & 0x30) >> 4; - battery2_status_valve_cooling = (rx_frame.data.u8[0] & 0xC0) >> 6; - battery2_status_error_locking = (rx_frame.data.u8[1] & 0x03); - battery2_status_precharge_locked = (rx_frame.data.u8[1] & 0x0C) >> 2; - battery2_status_disconnecting_switch = (rx_frame.data.u8[1] & 0x30) >> 4; - battery2_status_emergency_mode = (rx_frame.data.u8[1] & 0xC0) >> 6; - battery2_request_service = (rx_frame.data.u8[2] & 0x03); - battery2_error_emergency_mode = (rx_frame.data.u8[2] & 0x0C) >> 2; - battery2_status_error_disconnecting_switch = (rx_frame.data.u8[2] & 0x30) >> 4; - battery2_status_warning_isolation = (rx_frame.data.u8[2] & 0xC0) >> 6; - battery2_status_cold_shutoff_valve = (rx_frame.data.u8[3] & 0x0F); - battery2_temperature_HV = (rx_frame.data.u8[4] - 50); - battery2_temperature_heat_exchanger = (rx_frame.data.u8[5] - 50); - battery2_temperature_min = (rx_frame.data.u8[6] - 50); - battery2_temperature_max = (rx_frame.data.u8[7] - 50); - break; - case 0x239: //BMS [200ms] - battery2_predicted_energy_charge_condition = (rx_frame.data.u8[2] << 8 | rx_frame.data.u8[1]); //Wh - battery2_predicted_energy_charging_target = ((rx_frame.data.u8[4] << 8 | rx_frame.data.u8[3]) * 0.02); //kWh - break; - case 0x2BD: //BMS [100ms] Status diagnosis high voltage - 1 - battery2_awake = true; - if (!skipCRCCheck_battery2) { - if (calculateCRC(rx_frame, rx_frame.DLC, 0x15) != rx_frame.data.u8[0]) { - // If calculated CRC does not match transmitted CRC, increase CANerror counter - datalayer.battery2.status.CAN_error_counter++; - - // If the CRC check has never passed before, set the flag to skip future checks. Some SMEs have differing CRC checks. - if (!CRCCheckPassedPreviously_battery2) { - skipCRCCheck_battery2 = true; - } - break; - } else { - // If CRC check passes, update the flag - CRCCheckPassedPreviously_battery2 = true; - } - } - - // Process the data since CRC check is either passed or skipped - battery2_status_diagnostics_HV = (rx_frame.data.u8[2] & 0x0F); - break; - case 0x2F5: //BMS [100ms] High-Voltage Battery Charge/Discharge Limitations - battery2_max_charge_voltage = (rx_frame.data.u8[1] << 8 | rx_frame.data.u8[0]); - battery2_max_charge_amperage = (((rx_frame.data.u8[3] << 8) | rx_frame.data.u8[2]) - 819.2); - battery2_min_discharge_voltage = (rx_frame.data.u8[5] << 8 | rx_frame.data.u8[4]); - battery2_max_discharge_amperage = (((rx_frame.data.u8[7] << 8) | rx_frame.data.u8[6]) - 819.2); - break; - case 0x2FF: //BMS [100ms] Status Heating High-Voltage Battery - battery2_awake = true; - battery2_actual_value_power_heating = (rx_frame.data.u8[1] << 4 | rx_frame.data.u8[0] >> 4); - break; - case 0x363: //BMS [1s] Identification High-Voltage Battery - battery2_serial_number = - (rx_frame.data.u8[3] << 24 | rx_frame.data.u8[2] << 16 | rx_frame.data.u8[1] << 8 | rx_frame.data.u8[0]); - break; - case 0x3C2: //BMS (94AH exclusive) - Status diagnostics OBD 2 powertrain - battery2_status_diagnosis_powertrain_maximum_multiplexer = - ((rx_frame.data.u8[1] & 0x03) << 4 | rx_frame.data.u8[0] >> 4); - battery2_status_diagnosis_powertrain_immediate_multiplexer = (rx_frame.data.u8[0] & 0xFC) >> 2; - break; - case 0x3EB: //BMS [1s] Status of charging high-voltage storage - 3 - battery2_available_power_shortterm_charge = (rx_frame.data.u8[1] << 8 | rx_frame.data.u8[0]) * 3; - battery2_available_power_shortterm_discharge = (rx_frame.data.u8[3] << 8 | rx_frame.data.u8[2]) * 3; - battery2_available_power_longterm_charge = (rx_frame.data.u8[5] << 8 | rx_frame.data.u8[4]) * 3; - battery2_available_power_longterm_discharge = (rx_frame.data.u8[7] << 8 | rx_frame.data.u8[6]) * 3; - break; - case 0x40D: //BMS [1s] Charging status of high-voltage storage - 1 - battery2_BEV_available_power_shortterm_charge = (rx_frame.data.u8[1] << 8 | rx_frame.data.u8[0]) * 3; - battery2_BEV_available_power_shortterm_discharge = (rx_frame.data.u8[3] << 8 | rx_frame.data.u8[2]) * 3; - battery2_BEV_available_power_longterm_charge = (rx_frame.data.u8[5] << 8 | rx_frame.data.u8[4]) * 3; - battery2_BEV_available_power_longterm_discharge = (rx_frame.data.u8[7] << 8 | rx_frame.data.u8[6]) * 3; - break; - case 0x41C: //BMS [1s] Operating Mode Status Of Hybrid - 2 - battery2_status_cooling_HV = (rx_frame.data.u8[1] & 0x03); - break; - case 0x430: //BMS [1s] - Charging status of high-voltage battery - 2 - battery2_prediction_voltage_shortterm_charge = (rx_frame.data.u8[1] << 8 | rx_frame.data.u8[0]); - battery2_prediction_voltage_shortterm_discharge = (rx_frame.data.u8[3] << 8 | rx_frame.data.u8[2]); - battery2_prediction_voltage_longterm_charge = (rx_frame.data.u8[5] << 8 | rx_frame.data.u8[4]); - battery2_prediction_voltage_longterm_discharge = (rx_frame.data.u8[7] << 8 | rx_frame.data.u8[6]); - break; - case 0x431: //BMS [200ms] Data High-Voltage Battery Unit - battery2_status_service_disconnection_plug = (rx_frame.data.u8[0] & 0x0F); - battery2_status_measurement_isolation = (rx_frame.data.u8[0] & 0x0C) >> 2; - battery2_request_abort_charging = (rx_frame.data.u8[0] & 0x30) >> 4; - battery2_prediction_duration_charging_minutes = (rx_frame.data.u8[3] << 8 | rx_frame.data.u8[2]); - battery2_prediction_time_end_of_charging_minutes = rx_frame.data.u8[4]; - battery2_energy_content_maximum_Wh = (((rx_frame.data.u8[6] & 0x0F) << 8) | rx_frame.data.u8[5]) * 20; - if (battery2_energy_content_maximum_Wh > 33000) { - detectedBattery2 = BATTERY_120AH; - } else if (battery2_energy_content_maximum_Wh > 20000) { - detectedBattery2 = BATTERY_94AH; - } else { - detectedBattery2 = BATTERY_60AH; - } - break; - case 0x432: //BMS [200ms] SOC% info - battery2_request_operating_mode = (rx_frame.data.u8[0] & 0x03); - battery2_target_voltage_in_CV_mode = ((rx_frame.data.u8[1] << 4 | rx_frame.data.u8[0] >> 4)) / 10; - battery2_request_charging_condition_minimum = (rx_frame.data.u8[2] / 2); - battery2_request_charging_condition_maximum = (rx_frame.data.u8[3] / 2); - battery2_display_SOC = rx_frame.data.u8[4]; - break; - case 0x507: //BMS [640ms] Network Management - 2 - This message is sent on the bus for sleep coordination purposes - break; - case 0x587: //BMS [5s] Services - battery2_ID2 = rx_frame.data.u8[0]; - break; - case 0x607: //BMS - responses to message requests on 0x615 - if ((cmdState == CELL_VOLTAGE_CELLNO || cmdState == CELL_VOLTAGE_CELLNO_LAST) && (rx_frame.data.u8[0] == 0xF4)) { - if (rx_frame.DLC == 6) { - transmit_can_frame(&BMW_6F4_CELL_CONTINUE, - can_interface_double); // tell battery to send the cellvoltage - } - if (rx_frame.DLC == 8) { // We have the full value, map it - datalayer.battery2.status.cell_voltages_mV[current_cell_polled - 1] = - (rx_frame.data.u8[6] << 8 | rx_frame.data.u8[7]); - } - } - - if (rx_frame.DLC > 6 && next_data == 0 && rx_frame.data.u8[0] == 0xf1) { - uint8_t count2 = 6; - while (count2 < rx_frame.DLC && next_data < 49) { - message_data[next_data++] = rx_frame.data.u8[count2++]; - } - transmit_can_frame(&BMW_6F1_CONTINUE, can_interface_double); - - } else if (rx_frame.DLC > 3 && next_data > 0 && rx_frame.data.u8[0] == 0xf1 && - ((rx_frame.data.u8[1] & 0xF0) == 0x20)) { - uint8_t count2 = 2; - while (count2 < rx_frame.DLC && next_data < 49) { - message_data[next_data++] = rx_frame.data.u8[count2++]; - } - - switch (cmdState) { - case CELL_VOLTAGE_MINMAX: - if (next_data >= 4) { - cellvoltage2_temp_mV = (message_data[0] << 8 | message_data[1]); - if (cellvoltage2_temp_mV < 4500) { // Prevents garbage data from being read on bootup - datalayer.battery2.status.cell_min_voltage_mV = cellvoltage2_temp_mV; - } - cellvoltage2_temp_mV = (message_data[2] << 8 | message_data[3]); - if (cellvoltage_temp_mV < 4500) { // Prevents garbage data from being read on bootup - datalayer.battery2.status.cell_max_voltage_mV = cellvoltage2_temp_mV; - } - } - break; - case SOH: - if (next_data >= 4) { - battery2_soh = message_data[3]; - battery2_info_available = true; - } - break; - case SOC: - if (next_data >= 6) { - battery2_soc = (message_data[0] << 8 | message_data[1]); - battery2_soc_hvmax = (message_data[2] << 8 | message_data[3]); - battery2_soc_hvmin = (message_data[4] << 8 | message_data[5]); - } - break; - } - } - break; - default: - break; - } -}*/ - void BmwI3Battery::transmit_can(unsigned long currentMillis) { if (battery_awake) { diff --git a/Software/src/battery/BMW-I3-BATTERY.h b/Software/src/battery/BMW-I3-BATTERY.h index b8949322..58d9ccfe 100644 --- a/Software/src/battery/BMW-I3-BATTERY.h +++ b/Software/src/battery/BMW-I3-BATTERY.h @@ -12,11 +12,9 @@ class BmwI3Battery : public CanBattery { public: // Use this constructor for the second battery. - BmwI3Battery(DATALAYER_BATTERY_TYPE* datalayer_ptr, bool* allows_contactor_closing_ptr, - DATALAYER_INFO_NISSAN_LEAF* extended, int targetCan, int wakeup) { + BmwI3Battery(DATALAYER_BATTERY_TYPE* datalayer_ptr, bool* allows_contactor_closing_ptr, int targetCan, int wakeup) { datalayer_battery = datalayer_ptr; allows_contactor_closing = allows_contactor_closing_ptr; - datalayer_nissan = extended; can_interface = targetCan; wakeup_pin = wakeup; *allows_contactor_closing = true; @@ -29,7 +27,6 @@ class BmwI3Battery : public CanBattery { BmwI3Battery() { datalayer_battery = &datalayer.battery; allows_contactor_closing = &datalayer.system.status.battery_allows_contactor_closing; - datalayer_nissan = &datalayer_extended.nissanleaf; can_interface = can_config.battery; wakeup_pin = WUP_PIN1; } @@ -56,7 +53,6 @@ class BmwI3Battery : public CanBattery { const int NUMBER_OF_CELLS = 96; DATALAYER_BATTERY_TYPE* datalayer_battery; - DATALAYER_INFO_NISSAN_LEAF* datalayer_nissan; bool* allows_contactor_closing; int wakeup_pin;