Reduce double battery define usage

This commit is contained in:
Jaakko Haakana 2025-06-01 11:20:18 +03:00
parent 2b4b86e8ee
commit de552e434e
4 changed files with 248 additions and 244 deletions

View file

@ -319,7 +319,6 @@ void init_serial() {
#endif // DEBUG_VIA_USB #endif // DEBUG_VIA_USB
} }
#ifdef DOUBLE_BATTERY
void check_interconnect_available() { void check_interconnect_available() {
if (datalayer.battery.status.voltage_dV == 0 || datalayer.battery2.status.voltage_dV == 0) { if (datalayer.battery.status.voltage_dV == 0 || datalayer.battery2.status.voltage_dV == 0) {
return; // Both voltage values need to be available to start check return; // Both voltage values need to be available to start check
@ -339,7 +338,6 @@ void check_interconnect_available() {
set_event(EVENT_VOLTAGE_DIFFERENCE, (uint8_t)(voltage_diff / 10)); set_event(EVENT_VOLTAGE_DIFFERENCE, (uint8_t)(voltage_diff / 10));
} }
} }
#endif // DOUBLE_BATTERY
void update_calculated_values() { void update_calculated_values() {
/* Update CPU temperature*/ /* Update CPU temperature*/
@ -399,11 +397,11 @@ void update_calculated_values() {
} }
} }
#ifdef DOUBLE_BATTERY if (battery2) {
/* Calculate active power based on voltage and current for battery 2*/ /* Calculate active power based on voltage and current for battery 2*/
datalayer.battery2.status.active_power_W = datalayer.battery2.status.active_power_W =
(datalayer.battery2.status.current_dA * (datalayer.battery2.status.voltage_dV / 100)); (datalayer.battery2.status.current_dA * (datalayer.battery2.status.voltage_dV / 100));
#endif // DOUBLE_BATTERY }
if (datalayer.battery.settings.soc_scaling_active) { if (datalayer.battery.settings.soc_scaling_active) {
/** SOC Scaling /** SOC Scaling
@ -445,7 +443,7 @@ void update_calculated_values() {
datalayer.battery.status.reported_remaining_capacity_Wh = datalayer.battery.status.remaining_capacity_Wh; datalayer.battery.status.reported_remaining_capacity_Wh = datalayer.battery.status.remaining_capacity_Wh;
} }
#ifdef DOUBLE_BATTERY if (battery2) {
// If battery info is valid // If battery info is valid
if (datalayer.battery2.info.total_capacity_Wh > 0 && datalayer.battery.status.real_soc > 0) { if (datalayer.battery2.info.total_capacity_Wh > 0 && datalayer.battery.status.real_soc > 0) {
@ -462,40 +460,45 @@ void update_calculated_values() {
//Since we are running double battery, the scaled value of battery1 becomes the sum of battery1+battery2 //Since we are running double battery, the scaled value of battery1 becomes the sum of battery1+battery2
//This way the inverter connected to the system sees both batteries as one large battery //This way the inverter connected to the system sees both batteries as one large battery
datalayer.battery.info.reported_total_capacity_Wh += datalayer.battery2.info.reported_total_capacity_Wh; datalayer.battery.info.reported_total_capacity_Wh += datalayer.battery2.info.reported_total_capacity_Wh;
datalayer.battery.status.reported_remaining_capacity_Wh += datalayer.battery2.status.reported_remaining_capacity_Wh; datalayer.battery.status.reported_remaining_capacity_Wh +=
datalayer.battery2.status.reported_remaining_capacity_Wh;
#endif // DOUBLE_BATTERY }
} else { // soc_scaling_active == false. No SOC window wanted. Set scaled to same as real. } else { // soc_scaling_active == false. No SOC window wanted. Set scaled to same as real.
datalayer.battery.status.reported_soc = datalayer.battery.status.real_soc; datalayer.battery.status.reported_soc = datalayer.battery.status.real_soc;
datalayer.battery.status.reported_remaining_capacity_Wh = datalayer.battery.status.remaining_capacity_Wh; datalayer.battery.status.reported_remaining_capacity_Wh = datalayer.battery.status.remaining_capacity_Wh;
datalayer.battery.info.reported_total_capacity_Wh = datalayer.battery.info.total_capacity_Wh; datalayer.battery.info.reported_total_capacity_Wh = datalayer.battery.info.total_capacity_Wh;
#ifdef DOUBLE_BATTERY
if (battery2) {
datalayer.battery2.status.reported_soc = datalayer.battery2.status.real_soc; datalayer.battery2.status.reported_soc = datalayer.battery2.status.real_soc;
datalayer.battery2.status.reported_remaining_capacity_Wh = datalayer.battery2.status.remaining_capacity_Wh; datalayer.battery2.status.reported_remaining_capacity_Wh = datalayer.battery2.status.remaining_capacity_Wh;
datalayer.battery2.info.reported_total_capacity_Wh = datalayer.battery2.info.total_capacity_Wh; datalayer.battery2.info.reported_total_capacity_Wh = datalayer.battery2.info.total_capacity_Wh;
#endif
} }
#ifdef DOUBLE_BATTERY }
if (battery2) {
// Perform extra SOC sanity checks on double battery setups // Perform extra SOC sanity checks on double battery setups
if (datalayer.battery.status.real_soc < 100) { //If this battery is under 1.00%, use this as SOC instead of average if (datalayer.battery.status.real_soc < 100) { //If this battery is under 1.00%, use this as SOC instead of average
datalayer.battery.status.reported_soc = datalayer.battery.status.real_soc; datalayer.battery.status.reported_soc = datalayer.battery.status.real_soc;
datalayer.battery.status.reported_remaining_capacity_Wh = datalayer.battery.status.remaining_capacity_Wh; datalayer.battery.status.reported_remaining_capacity_Wh = datalayer.battery.status.remaining_capacity_Wh;
} }
if (datalayer.battery2.status.real_soc < 100) { //If this battery is under 1.00%, use this as SOC instead of average if (datalayer.battery2.status.real_soc <
100) { //If this battery is under 1.00%, use this as SOC instead of average
datalayer.battery.status.reported_soc = datalayer.battery2.status.real_soc; datalayer.battery.status.reported_soc = datalayer.battery2.status.real_soc;
datalayer.battery.status.reported_remaining_capacity_Wh = datalayer.battery2.status.remaining_capacity_Wh; datalayer.battery.status.reported_remaining_capacity_Wh = datalayer.battery2.status.remaining_capacity_Wh;
} }
if (datalayer.battery.status.real_soc > 9900) { //If this battery is over 99.00%, use this as SOC instead of average if (datalayer.battery.status.real_soc >
9900) { //If this battery is over 99.00%, use this as SOC instead of average
datalayer.battery.status.reported_soc = datalayer.battery.status.real_soc; datalayer.battery.status.reported_soc = datalayer.battery.status.real_soc;
datalayer.battery.status.reported_remaining_capacity_Wh = datalayer.battery.status.remaining_capacity_Wh; datalayer.battery.status.reported_remaining_capacity_Wh = datalayer.battery.status.remaining_capacity_Wh;
} }
if (datalayer.battery2.status.real_soc > 9900) { //If this battery is over 99.00%, use this as SOC instead of average if (datalayer.battery2.status.real_soc >
9900) { //If this battery is over 99.00%, use this as SOC instead of average
datalayer.battery.status.reported_soc = datalayer.battery2.status.real_soc; datalayer.battery.status.reported_soc = datalayer.battery2.status.real_soc;
datalayer.battery.status.reported_remaining_capacity_Wh = datalayer.battery2.status.remaining_capacity_Wh; datalayer.battery.status.reported_remaining_capacity_Wh = datalayer.battery2.status.remaining_capacity_Wh;
} }
#endif // DOUBLE_BATTERY }
// Check if millis has overflowed. Used in events to keep better track of time // Check if millis has overflowed. Used in events to keep better track of time
if (currentMillis < lastMillisOverflowCheck) { // Overflow detected if (currentMillis < lastMillisOverflowCheck) { // Overflow detected
datalayer.system.status.millisrolloverCount++; datalayer.system.status.millisrolloverCount++;

View file

@ -169,9 +169,7 @@ void handle_incoming_can_frame_battery(CAN_frame rx_frame);
void transmit_can_battery(unsigned long currentMillis); void transmit_can_battery(unsigned long currentMillis);
#endif #endif
#ifdef DOUBLE_BATTERY
void update_values_battery2(); void update_values_battery2();
void handle_incoming_can_frame_battery2(CAN_frame rx_frame); void handle_incoming_can_frame_battery2(CAN_frame rx_frame);
#endif
#endif #endif

View file

@ -241,7 +241,8 @@ void update_machineryprotection() {
} }
} }
#ifdef DOUBLE_BATTERY // Additional Double-Battery safeties are checked here // Additional Double-Battery safeties are checked here
if (battery2) {
// Check if the Battery 2 BMS is still sending CAN messages. If we go 60s without messages we raise a warning // Check if the Battery 2 BMS is still sending CAN messages. If we go 60s without messages we raise a warning
// Pause function is on // Pause function is on
@ -297,8 +298,7 @@ void update_machineryprotection() {
clear_event(EVENT_SOH_DIFFERENCE); clear_event(EVENT_SOH_DIFFERENCE);
} }
} }
}
#endif // DOUBLE_BATTERY
//Safeties verified, Zero charge/discharge ampere values incase any safety wrote the W to 0 //Safeties verified, Zero charge/discharge ampere values incase any safety wrote the W to 0
if (datalayer.battery.status.max_discharge_power_W == 0) { if (datalayer.battery.status.max_discharge_power_W == 0) {
@ -357,10 +357,10 @@ void setBatteryPause(bool pause_battery, bool pause_CAN, bool equipment_stop, bo
emulator_pause_status = PAUSING; emulator_pause_status = PAUSING;
datalayer.battery.status.max_discharge_power_W = 0; datalayer.battery.status.max_discharge_power_W = 0;
datalayer.battery.status.max_charge_power_W = 0; datalayer.battery.status.max_charge_power_W = 0;
#ifdef DOUBLE_BATTERY if (battery2) {
datalayer.battery2.status.max_discharge_power_W = 0; datalayer.battery2.status.max_discharge_power_W = 0;
datalayer.battery2.status.max_charge_power_W = 0; datalayer.battery2.status.max_charge_power_W = 0;
#endif }
} else { } else {
clear_event(EVENT_PAUSE_BEGIN); clear_event(EVENT_PAUSE_BEGIN);

View file

@ -16,21 +16,24 @@ String cellmonitor_processor(const String& var) {
content += ".cell { width: 48%; margin: 1%; padding: 10px; border: 1px solid white; text-align: center; }"; content += ".cell { width: 48%; margin: 1%; padding: 10px; border: 1px solid white; text-align: center; }";
content += ".low-voltage { color: red; }"; // Style for low voltage text content += ".low-voltage { color: red; }"; // Style for low voltage text
content += ".voltage-values { margin-bottom: 10px; }"; // Style for voltage values section content += ".voltage-values { margin-bottom: 10px; }"; // Style for voltage values section
#ifdef DOUBLE_BATTERY
if (battery2) {
content += content +=
"#graph, #graph2 {display: flex;align-items: flex-end;height: 200px;border: 1px solid #ccc;position: " "#graph, #graph2 {display: flex;align-items: flex-end;height: 200px;border: 1px solid #ccc;position: "
"relative;}"; "relative;}";
#else } else {
content += "#graph {display: flex;align-items: flex-end;height: 200px;border: 1px solid #ccc;position: relative;}"; content +=
#endif "#graph {display: flex;align-items: flex-end;height: 200px;border: 1px solid #ccc;position: relative;}";
}
content += content +=
".bar {margin: 0 0px;background-color: blue;display: inline-block;position: relative;cursor: pointer;border: " ".bar {margin: 0 0px;background-color: blue;display: inline-block;position: relative;cursor: pointer;border: "
"1px solid white; /* Add this line */}"; "1px solid white; /* Add this line */}";
#ifdef DOUBLE_BATTERY
if (battery2) {
content += "#valueDisplay, #valueDisplay2 {text-align: left;font-weight: bold;margin-top: 10px;}"; content += "#valueDisplay, #valueDisplay2 {text-align: left;font-weight: bold;margin-top: 10px;}";
#else } else {
content += "#valueDisplay {text-align: left;font-weight: bold;margin-top: 10px;}"; content += "#valueDisplay {text-align: left;font-weight: bold;margin-top: 10px;}";
#endif }
content += "</style>"; content += "</style>";
content += "<button onclick='home()'>Back to main page</button>"; content += "<button onclick='home()'>Back to main page</button>";
@ -50,7 +53,7 @@ String cellmonitor_processor(const String& var) {
// Close the block // Close the block
content += "</div>"; content += "</div>";
#ifdef DOUBLE_BATTERY if (battery2) {
// Start a new block with a specific background color // Start a new block with a specific background color
content += "<div style='background-color: #303E41; padding: 10px; margin-bottom: 10px; border-radius: 50px'>"; content += "<div style='background-color: #303E41; padding: 10px; margin-bottom: 10px; border-radius: 50px'>";
@ -67,7 +70,7 @@ String cellmonitor_processor(const String& var) {
content += "</div>"; content += "</div>";
content += "<button onclick='home()'>Back to main page</button>"; content += "<button onclick='home()'>Back to main page</button>";
#endif // DOUBLE_BATTERY }
content += "<script>"; content += "<script>";
// Populate cell data // Populate cell data
@ -184,7 +187,7 @@ String cellmonitor_processor(const String& var) {
"available';"; "available';";
content += "}"; content += "}";
#ifdef DOUBLE_BATTERY if (battery2) {
// Populate cell data // Populate cell data
content += "const data2 = ["; content += "const data2 = [";
for (uint8_t i = 0u; i < datalayer.battery2.info.number_of_cells; i++) { for (uint8_t i = 0u; i < datalayer.battery2.info.number_of_cells; i++) {
@ -293,11 +296,11 @@ String cellmonitor_processor(const String& var) {
content += "}"; content += "}";
content += "else {"; content += "else {";
content += content +=
"document.getElementById('voltageValues2').textContent = 'Cell information not yet fetched, or information not " "document.getElementById('voltageValues2').textContent = 'Cell information not yet fetched, or information "
"not "
"available';"; "available';";
content += "}"; content += "}";
}
#endif //DOUBLE_BATTERY
// Automatic refresh is nice // Automatic refresh is nice
content += "setTimeout(function(){ location.reload(true); }, 20000);"; content += "setTimeout(function(){ location.reload(true); }, 20000);";