mirror of
https://github.com/dalathegreat/Battery-Emulator.git
synced 2025-10-03 01:39:30 +02:00
Fix cellvoltage mapping
This commit is contained in:
parent
ff71cadcb2
commit
380497ad04
1 changed files with 19 additions and 16 deletions
|
@ -21,16 +21,12 @@ void FordMachEBattery::update_values() {
|
||||||
|
|
||||||
datalayer.battery.status.max_charge_power_W;
|
datalayer.battery.status.max_charge_power_W;
|
||||||
|
|
||||||
datalayer.battery.status.cell_max_voltage_mV;
|
|
||||||
|
|
||||||
datalayer.battery.status.cell_min_voltage_mV;
|
|
||||||
|
|
||||||
maximum_cellvoltage_mV = datalayer.battery.status.cell_voltages_mV[0];
|
maximum_cellvoltage_mV = datalayer.battery.status.cell_voltages_mV[0];
|
||||||
minimum_cellvoltage_mV = datalayer.battery.status.cell_voltages_mV[0];
|
minimum_cellvoltage_mV = datalayer.battery.status.cell_voltages_mV[0];
|
||||||
|
|
||||||
// Loop through the array to find min and max cellvoltages, ignoring 0 values
|
// Loop through the array to find min and max cellvoltages, ignoring 0 values
|
||||||
for (uint8_t i = 0; i < MAX_AMOUNT_CELLS; i++) {
|
for (uint8_t i = 0; i < MAX_AMOUNT_CELLS; i++) {
|
||||||
if (datalayer.battery.status.cell_voltages_mV[i] != 0) { // Ignore unavailable values
|
if (datalayer.battery.status.cell_voltages_mV[i] > 1000) { // Ignore unavailable values
|
||||||
if (datalayer.battery.status.cell_voltages_mV[i] < minimum_cellvoltage_mV) {
|
if (datalayer.battery.status.cell_voltages_mV[i] < minimum_cellvoltage_mV) {
|
||||||
minimum_cellvoltage_mV = datalayer.battery.status.cell_voltages_mV[i];
|
minimum_cellvoltage_mV = datalayer.battery.status.cell_voltages_mV[i];
|
||||||
}
|
}
|
||||||
|
@ -40,6 +36,10 @@ void FordMachEBattery::update_values() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
datalayer.battery.status.cell_max_voltage_mV = maximum_cellvoltage_mV;
|
||||||
|
|
||||||
|
datalayer.battery.status.cell_min_voltage_mV = minimum_cellvoltage_mV;
|
||||||
|
|
||||||
// Initialize highest and lowest to the first element
|
// Initialize highest and lowest to the first element
|
||||||
maximum_temperature = cell_temperature[0];
|
maximum_temperature = cell_temperature[0];
|
||||||
minimum_temperature = cell_temperature[0];
|
minimum_temperature = cell_temperature[0];
|
||||||
|
@ -119,22 +119,25 @@ void FordMachEBattery::handle_incoming_can_frame(CAN_frame rx_frame) {
|
||||||
case 0x4a2: {
|
case 0x4a2: {
|
||||||
datalayer.battery.status.CAN_battery_still_alive = CAN_STILL_ALIVE;
|
datalayer.battery.status.CAN_battery_still_alive = CAN_STILL_ALIVE;
|
||||||
|
|
||||||
// Calculate starting cell index: (CAN_ID - 0x490) * 5 (Ends at 0x4A2)
|
|
||||||
const uint8_t start_index = (rx_frame.ID - 0x490) * 5;
|
const uint8_t start_index = (rx_frame.ID - 0x490) * 5;
|
||||||
|
|
||||||
// Each CAN message contains 5 cellvoltages
|
// Process 5 cells per message
|
||||||
for (uint8_t i = 0; i < 5; i++) {
|
for (uint8_t i = 0; i < 5; i++) {
|
||||||
const uint8_t byte_offset = i * 3;
|
uint16_t voltage = 0;
|
||||||
|
|
||||||
if (i % 2 == 0) {
|
if (i == 0) {
|
||||||
// Even indices: bytes 0,1 | 3,4 | 6,7
|
voltage = (rx_frame.data.u8[0] << 4) | (rx_frame.data.u8[1] >> 4);
|
||||||
datalayer.battery.status.cell_voltages_mV[start_index + i] =
|
} else if (i == 1) {
|
||||||
(((rx_frame.data.u8[byte_offset] << 4) | (rx_frame.data.u8[byte_offset + 1] >> 4)) + 1000);
|
voltage = ((rx_frame.data.u8[1] & 0x0F) << 8) | rx_frame.data.u8[2];
|
||||||
} else {
|
} else if (i == 2) {
|
||||||
// Odd indices: bytes 1,2 | 4,5
|
voltage = (rx_frame.data.u8[3] << 4) | (rx_frame.data.u8[4] >> 4);
|
||||||
datalayer.battery.status.cell_voltages_mV[start_index + i] =
|
} else if (i == 3) {
|
||||||
((((rx_frame.data.u8[byte_offset] & 0x0F) << 8) | rx_frame.data.u8[byte_offset + 1]) + 1000);
|
voltage = ((rx_frame.data.u8[4] & 0x0F) << 8) | rx_frame.data.u8[5];
|
||||||
|
} else if (i == 4) {
|
||||||
|
voltage = (rx_frame.data.u8[6] << 4) | (rx_frame.data.u8[7] >> 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
datalayer.battery.status.cell_voltages_mV[start_index + i] = voltage + 1000;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue