From dabbcd8bcdafd76d4968dcaeebb18b1c0bdd3b3b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20=C3=96ster?= Date: Mon, 1 Sep 2025 22:03:00 +0300 Subject: [PATCH] Make LEAF interlock setting configurable --- Software/USER_SETTINGS.h | 6 ------ Software/src/battery/BATTERIES.cpp | 2 ++ Software/src/battery/BATTERIES.h | 1 + Software/src/battery/NISSAN-LEAF-BATTERY.cpp | 13 +++++++------ Software/src/battery/NISSAN-LEAF-BATTERY.h | 2 ++ Software/src/communication/nvm/comm_nvm.cpp | 1 + Software/src/devboard/utils/types.h | 2 +- .../src/devboard/webserver/settings_html.cpp | 19 +++++++++++++++++-- Software/src/devboard/webserver/webserver.cpp | 2 +- 9 files changed, 32 insertions(+), 16 deletions(-) diff --git a/Software/USER_SETTINGS.h b/Software/USER_SETTINGS.h index 9e8283a0..099842bd 100644 --- a/Software/USER_SETTINGS.h +++ b/Software/USER_SETTINGS.h @@ -15,18 +15,12 @@ /* Shunt/Contactor settings (Optional) */ //#define BMW_SBOX // SBOX relay control & battery current/voltage measurement -/* Select charger used (Optional) */ -//#define CHEVYVOLT_CHARGER //Enable this line to control a Chevrolet Volt charger connected to battery - for example, when generator charging or using an inverter without a charging function. -//#define NISSANLEAF_CHARGER //Enable this line to control a Nissan LEAF PDM connected to battery - for example, when generator charging - /* Automatic Precharge settings (Optional) If you have a battery that expects an external voltage applied before opening contactors (within the battery), configure this section */ //#define PRECHARGE_CONTROL //Enable this line to control a modified HIA4V1 via PWM on the HIA4V1_PIN (see Wiki and HAL for pin definition) //#define INVERTER_DISCONNECT_CONTACTOR_IS_NORMALLY_OPEN //Enable this line if you use a normally open contactor instead of normally closed /* Other options */ //#define EQUIPMENT_STOP_BUTTON // Enable this to allow an equipment stop button connected to the Battery-Emulator to disengage the battery -//#define LFP_CHEMISTRY //Tesla specific setting, enable this line to startup in LFP mode -//#define INTERLOCK_REQUIRED //Nissan LEAF specific setting, if enabled requires both high voltage conenctors to be seated before starting /* CAN options */ //#define CAN_ADDON //Enable this line to activate an isolated secondary CAN Bus using add-on MCP2515 chip (Needed for some inverters / double battery) #define CRYSTAL_FREQUENCY_MHZ 8 //CAN_ADDON option, what is your MCP2515 add-on boards crystal frequency? diff --git a/Software/src/battery/BATTERIES.cpp b/Software/src/battery/BATTERIES.cpp index b24751ab..f4639e26 100644 --- a/Software/src/battery/BATTERIES.cpp +++ b/Software/src/battery/BATTERIES.cpp @@ -279,6 +279,8 @@ void setup_battery() { } } +/* User-selected Nissan LEAF settings */ +bool user_selected_LEAF_interlock_mandatory = false; /* User-selected Tesla settings */ bool user_selected_tesla_digital_HVIL = false; uint16_t user_selected_tesla_GTW_country = 17477; diff --git a/Software/src/battery/BATTERIES.h b/Software/src/battery/BATTERIES.h index 78e55398..22741186 100644 --- a/Software/src/battery/BATTERIES.h +++ b/Software/src/battery/BATTERIES.h @@ -62,6 +62,7 @@ extern uint16_t user_selected_min_pack_voltage_dV; extern uint16_t user_selected_max_cell_voltage_mV; extern uint16_t user_selected_min_cell_voltage_mV; +extern bool user_selected_LEAF_interlock_mandatory; extern bool user_selected_tesla_digital_HVIL; extern uint16_t user_selected_tesla_GTW_country; extern bool user_selected_tesla_GTW_rightHandDrive; diff --git a/Software/src/battery/NISSAN-LEAF-BATTERY.cpp b/Software/src/battery/NISSAN-LEAF-BATTERY.cpp index 17e4f3d3..2bebb92f 100644 --- a/Software/src/battery/NISSAN-LEAF-BATTERY.cpp +++ b/Software/src/battery/NISSAN-LEAF-BATTERY.cpp @@ -150,13 +150,14 @@ void NissanLeafBattery:: clear_event(EVENT_BATTERY_CHG_DISCHG_STOP_REQ); } -#ifdef INTERLOCK_REQUIRED - if (!battery_Interlock) { - set_event(EVENT_HVIL_FAILURE, 0); - } else { - clear_event(EVENT_HVIL_FAILURE); + if (user_selected_LEAF_interlock_mandatory) { + //If user requires both large 80kW and small 6kW interlock to be seated for operation + if (!battery_Interlock) { + set_event(EVENT_HVIL_FAILURE, 0); + } else { + clear_event(EVENT_HVIL_FAILURE); + } } -#endif if (battery_HeatExist) { if (battery_Heating_Stop) { diff --git a/Software/src/battery/NISSAN-LEAF-BATTERY.h b/Software/src/battery/NISSAN-LEAF-BATTERY.h index 99a5691b..c6a5f868 100644 --- a/Software/src/battery/NISSAN-LEAF-BATTERY.h +++ b/Software/src/battery/NISSAN-LEAF-BATTERY.h @@ -6,6 +6,8 @@ #include "CanBattery.h" #include "NISSAN-LEAF-HTML.h" +extern bool user_selected_LEAF_interlock_mandatory; + class NissanLeafBattery : public CanBattery { public: // Use this constructor for the second battery. diff --git a/Software/src/communication/nvm/comm_nvm.cpp b/Software/src/communication/nvm/comm_nvm.cpp index 9e72d8cc..58ca7745 100644 --- a/Software/src/communication/nvm/comm_nvm.cpp +++ b/Software/src/communication/nvm/comm_nvm.cpp @@ -105,6 +105,7 @@ void init_stored_settings() { user_selected_inverter_battery_type = settings.getUInt("INVBTYPE", 0); user_selected_inverter_ignore_contactors = settings.getBool("INVICNT", false); user_selected_can_addon_crystal_frequency_mhz = settings.getUInt("CANFREQ", 8); + user_selected_LEAF_interlock_mandatory = settings.getBool("INTERLOCKREQ", false); user_selected_tesla_digital_HVIL = settings.getBool("DIGITALHVIL", false); user_selected_tesla_GTW_country = settings.getUInt("GTWCOUNTRY", 0); user_selected_tesla_GTW_rightHandDrive = settings.getBool("GTWRHD", false); diff --git a/Software/src/devboard/utils/types.h b/Software/src/devboard/utils/types.h index 846d6c43..fab3d4d9 100644 --- a/Software/src/devboard/utils/types.h +++ b/Software/src/devboard/utils/types.h @@ -9,7 +9,7 @@ using duration = std::chrono::duration>; enum bms_status_enum { STANDBY = 0, INACTIVE = 1, DARKSTART = 2, ACTIVE = 3, FAULT = 4, UPDATING = 5 }; enum real_bms_status_enum { BMS_DISCONNECTED = 0, BMS_STANDBY = 1, BMS_ACTIVE = 2, BMS_FAULT = 3 }; -enum battery_chemistry_enum { NCA = 1, NMC = 2, LFP = 3, Highest }; +enum battery_chemistry_enum { Autodetect = 0, NCA = 1, NMC = 2, LFP = 3, Highest }; enum class comm_interface { Modbus = 1, diff --git a/Software/src/devboard/webserver/settings_html.cpp b/Software/src/devboard/webserver/settings_html.cpp index 7414d53f..0517962b 100644 --- a/Software/src/devboard/webserver/settings_html.cpp +++ b/Software/src/devboard/webserver/settings_html.cpp @@ -203,8 +203,9 @@ String settings_processor(const String& var, BatteryEmulatorSettingsStore& setti name_for_comm_interface); } if (var == "BATTCHEM") { - return options_for_enum((battery_chemistry_enum)settings.getUInt("BATTCHEM", (int)battery_chemistry_enum::NCA), - name_for_chemistry); + return options_for_enum( + (battery_chemistry_enum)settings.getUInt("BATTCHEM", (int)battery_chemistry_enum::Autodetect), + name_for_chemistry); } if (var == "INVTYPE") { return options_for_enum_with_none( @@ -563,6 +564,10 @@ String settings_processor(const String& var, BatteryEmulatorSettingsStore& setti return String(settings.getUInt("PWMHOLD", 250)); } + if (var == "INTERLOCKREQ") { + return settings.getBool("INTERLOCKREQ") ? "checked" : ""; + } + if (var == "DIGITALHVIL") { return settings.getBool("DIGITALHVIL") ? "checked" : ""; } @@ -777,6 +782,11 @@ const char* getCANInterfaceName(CAN_Interface interface) { display: contents; } + form .if-nissan { display: none; } + form[data-battery="21"] .if-nissan { + display: contents; + } + form .if-tesla { display: none; } form[data-battery="32"] .if-tesla, form[data-battery="33"] .if-tesla { display: contents; @@ -841,6 +851,11 @@ const char* getCANInterfaceName(CAN_Interface interface) { %BATTTYPE% +
+ + +
+
diff --git a/Software/src/devboard/webserver/webserver.cpp b/Software/src/devboard/webserver/webserver.cpp index 70c862e4..fe71aa61 100644 --- a/Software/src/devboard/webserver/webserver.cpp +++ b/Software/src/devboard/webserver/webserver.cpp @@ -398,7 +398,7 @@ void init_webserver() { const char* boolSettingNames[] = { "DBLBTR", "CNTCTRL", "CNTCTRLDBL", "PWMCNTCTRL", "PERBMSRESET", "SDLOGENABLED", "REMBMSRESET", "USBENABLED", "CANLOGUSB", "WEBENABLED", "CANFDASCAN", "CANLOGSD", "WIFIAPENABLED", "MQTTENABLED", - "HADISC", "MQTTTOPICS", "INVICNT", "GTWRHD", "DIGITALHVIL", "PERFPROFILE", + "HADISC", "MQTTTOPICS", "INVICNT", "GTWRHD", "DIGITALHVIL", "PERFPROFILE", "INTERLOCKREQ", }; // Handles the form POST from UI to save settings of the common image