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 += "

Current: " + String(currentFloat, 1) + " A

"; content += formatPowerValue("Power", powerFloat, "", 1); content += formatPowerValue("Total capacity", datalayer.battery2.info.total_capacity_Wh, "h", 0); - content += formatPowerValue("Remaining capacity", datalayer.battery2.status.remaining_capacity_Wh, "h", 1); + content += formatPowerValue("Real Remaining capacity", datalayer.battery2.status.remaining_capacity_Wh, "h", 1); + content += + formatPowerValue("Scaled Remaining capacity", datalayer.battery2.status.reported_remaining_capacity_Wh, "h", 1); content += formatPowerValue("Max discharge power", datalayer.battery2.status.max_discharge_power_W, "", 1); content += formatPowerValue("Max charge power", datalayer.battery2.status.max_charge_power_W, "", 1); content += "

Cell max: " + String(datalayer.battery2.status.cell_max_voltage_mV) + " mV

"; @@ -827,6 +829,11 @@ String processor(const String& var) { content += ""; } + if (emulator_pause_status == NORMAL) + content += "

Power status: " + String(get_emulator_pause_status().c_str()) + "

"; + else + content += "

Power status: " + String(get_emulator_pause_status().c_str()) + "

"; + #ifdef CONTACTOR_CONTROL content += "

Contactors controlled by Battery-Emulator: "; if (datalayer.system.status.contactor_control_closed) { @@ -835,12 +842,28 @@ String processor(const String& var) { content += "OFF"; } content += "

"; -#endif - if (emulator_pause_status == NORMAL) - content += "

Pause status: " + String(get_emulator_pause_status().c_str()) + "

"; - else - content += "

Pause status: " + String(get_emulator_pause_status().c_str()) + "

"; + content += "

Pre Charge: "; + if (digitalRead(PRECHARGE_PIN) == HIGH) { + content += ""; + } else { + content += ""; + } + content += " Cont. Neg.: "; + if (digitalRead(NEGATIVE_CONTACTOR_PIN) == HIGH) { + content += ""; + } else { + content += ""; + } + + content += " Cont. Pos.: "; + if (digitalRead(POSITIVE_CONTACTOR_PIN) == HIGH) { + content += ""; + } else { + content += ""; + } + content += "

"; +#endif content += ""; content += "";