diff --git a/Software/Software.ino b/Software/Software.ino index 588aa5e0..588f28cf 100644 --- a/Software/Software.ino +++ b/Software/Software.ino @@ -860,6 +860,8 @@ void update_scaled_values() { * Before we use real_soc, we must make sure that it's within the range of min_percentage and max_percentage. */ uint32_t calc_soc; + uint32_t calc_max_capacity; + uint32_t calc_reserved_capacity; // Make sure that the SOC starts out between min and max percentages calc_soc = CONSTRAIN(datalayer.battery.status.real_soc, datalayer.battery.settings.min_percentage, datalayer.battery.settings.max_percentage); @@ -870,8 +872,6 @@ void update_scaled_values() { // Calculate the scaled remaining capacity in Wh if (datalayer.battery.info.total_capacity_Wh > 0 && datalayer.battery.status.real_soc > 0) { - uint32_t calc_max_capacity; - uint32_t calc_reserved_capacity; calc_max_capacity = (datalayer.battery.status.remaining_capacity_Wh * 10000 / datalayer.battery.status.real_soc); calc_reserved_capacity = calc_max_capacity * datalayer.battery.settings.min_percentage / 10000; // remove % capacity reserved in min_percentage to total_capacity_Wh @@ -881,9 +881,28 @@ void update_scaled_values() { datalayer.battery.status.reported_remaining_capacity_Wh = datalayer.battery.status.remaining_capacity_Wh; } +#ifdef DOUBLE_BATTERY + + // Calculate the scaled remaining capacity in Wh + if (datalayer.battery2.info.total_capacity_Wh > 0 && datalayer.battery2.status.real_soc > 0) { + calc_max_capacity = + (datalayer.battery2.status.remaining_capacity_Wh * 10000 / datalayer.battery2.status.real_soc); + calc_reserved_capacity = calc_max_capacity * datalayer.battery2.settings.min_percentage / 10000; + // remove % capacity reserved in min_percentage to total_capacity_Wh + datalayer.battery2.status.reported_remaining_capacity_Wh = + datalayer.battery2.status.remaining_capacity_Wh - calc_reserved_capacity; + } else { + datalayer.battery2.status.reported_remaining_capacity_Wh = datalayer.battery2.status.remaining_capacity_Wh; + } +#endif + } else { // No SOC window wanted. Set scaled to same as real. datalayer.battery.status.reported_soc = datalayer.battery.status.real_soc; datalayer.battery.status.reported_remaining_capacity_Wh = datalayer.battery.status.remaining_capacity_Wh; +#ifdef DOUBLE_BATTERY + datalayer.battery2.status.reported_soc = datalayer.battery2.status.real_soc; + datalayer.battery2.status.reported_remaining_capacity_Wh = datalayer.battery2.status.remaining_capacity_Wh; +#endif } #ifdef DOUBLE_BATTERY // Perform extra SOC sanity checks on double battery setups diff --git a/Software/src/battery/TEST-FAKE-BATTERY.cpp b/Software/src/battery/TEST-FAKE-BATTERY.cpp index 6e52bd70..630fa536 100644 --- a/Software/src/battery/TEST-FAKE-BATTERY.cpp +++ b/Software/src/battery/TEST-FAKE-BATTERY.cpp @@ -22,6 +22,8 @@ void print_units(char* header, int value, char* units) { void update_values_battery() { /* This function puts fake values onto the parameters sent towards the inverter */ + datalayer.battery.info.number_of_cells = 96; + datalayer.battery.status.real_soc = 5000; // 50.00% datalayer.battery.status.soh_pptt = 9900; // 99.00% @@ -49,7 +51,7 @@ void update_values_battery() { /* This function puts fake values onto the parame datalayer.battery.status.max_charge_power_W = 5000; // 5kW for (int i = 0; i < 97; ++i) { - datalayer.battery.status.cell_voltages_mV[i] = 3500 + i; + datalayer.battery.status.cell_voltages_mV[i] = 3700 + random(-20, 21); } //Fake that we get CAN messages @@ -75,6 +77,8 @@ void update_values_battery() { /* This function puts fake values onto the parame void update_values_battery2() { // Handle the values coming in from battery #2 + datalayer.battery2.info.number_of_cells = 96; + datalayer.battery2.status.real_soc = 5000; // 50.00% datalayer.battery2.status.soh_pptt = 9900; // 99.00% @@ -102,7 +106,7 @@ void update_values_battery2() { // Handle the values coming in from battery #2 datalayer.battery2.status.max_charge_power_W = 5000; // 5kW for (int i = 0; i < 97; ++i) { - datalayer.battery2.status.cell_voltages_mV[i] = 3500 + i; + datalayer.battery2.status.cell_voltages_mV[i] = 3700 + random(-20, 21); } //Fake that we get CAN messages @@ -167,6 +171,8 @@ void send_can_battery() { } void setup_battery(void) { // Performs one time setup at startup + randomSeed(analogRead(0)); + #ifdef DEBUG_VIA_USB Serial.println("Test mode with fake battery selected"); #endif diff --git a/Software/src/devboard/webserver/webserver.cpp b/Software/src/devboard/webserver/webserver.cpp index 274f2bf0..3f6bfbf5 100644 --- a/Software/src/devboard/webserver/webserver.cpp +++ b/Software/src/devboard/webserver/webserver.cpp @@ -785,7 +785,9 @@ String processor(const String& var) { content += "