diff --git a/Software/src/communication/nvm/comm_nvm.cpp b/Software/src/communication/nvm/comm_nvm.cpp index 688d961c..91adc099 100644 --- a/Software/src/communication/nvm/comm_nvm.cpp +++ b/Software/src/communication/nvm/comm_nvm.cpp @@ -96,6 +96,13 @@ void init_stored_settings() { user_selected_min_pack_voltage_dV = settings.getUInt("BATTPVMIN", 0); user_selected_max_cell_voltage_mV = settings.getUInt("BATTCVMAX", 0); user_selected_min_cell_voltage_mV = settings.getUInt("BATTCVMIN", 0); + user_selected_inverter_cells = settings.getUInt("INVCELLS", 0); + user_selected_inverter_modules = settings.getUInt("INVMODULES", 0); + user_selected_inverter_cells_per_module = settings.getUInt("INVCELLSPER", 0); + user_selected_inverter_voltage_level = settings.getUInt("INVVLEVEL", 0); + user_selected_inverter_ah_capacity = settings.getUInt("INVAHCAPACITY", 0); + user_selected_inverter_battery_type = settings.getUInt("INVBTYPE", 0); + user_selected_inverter_ignore_contactors = settings.getBool("INVICNT", false); auto readIf = [](const char* settingName) { auto batt1If = (comm_interface)settings.getUInt(settingName, (int)comm_interface::CanNative); diff --git a/Software/src/devboard/webserver/settings_html.cpp b/Software/src/devboard/webserver/settings_html.cpp index 31936a55..7ca338ce 100644 --- a/Software/src/devboard/webserver/settings_html.cpp +++ b/Software/src/devboard/webserver/settings_html.cpp @@ -472,6 +472,34 @@ String settings_processor(const String& var, BatteryEmulatorSettingsStore& setti return String(settings.getUInt("SOFAR_ID", 0)); } + if (var == "INVCELLS") { + return String(settings.getUInt("INVCELLS", 0)); + } + + if (var == "INVMODULES") { + return String(settings.getUInt("INVMODULES", 0)); + } + + if (var == "INVCELLSPER") { + return String(settings.getUInt("INVCELLSPER", 0)); + } + + if (var == "INVVLEVEL") { + return String(settings.getUInt("INVVLEVEL", 0)); + } + + if (var == "INVCAPACITY") { + return String(settings.getUInt("INVCAPACITY", 0)); + } + + if (var == "INVBTYPE") { + return String(settings.getUInt("INVBTYPE", 0)); + } + + if (var == "INVICNT") { + return settings.getBool("INVICNT") ? "checked" : ""; + } + return String(); } @@ -668,6 +696,16 @@ const char* getCANInterfaceName(CAN_Interface interface) { display: contents; } + form .if-pylonish { display: none; } + form[data-inverter="4"] .if-pylonish, form[data-inverter="10"] .if-pylonish, form[data-inverter="19"] .if-pylonish { + display: contents; + } + + form .if-solax { display: none; } + form[data-inverter="18"] .if-solax { + display: contents; + } + form .if-mqtt { display: none; } form[data-mqttenabled="true"] .if-mqtt { display: contents; @@ -736,6 +774,35 @@ const char* getCANInterfaceName(CAN_Interface interface) { +
+ + +
+ +
+ + +
+ +
+ + + + + + + + +
+ +
+ + + + + +
+ diff --git a/Software/src/devboard/webserver/webserver.cpp b/Software/src/devboard/webserver/webserver.cpp index 498ecc27..cfa65a8a 100644 --- a/Software/src/devboard/webserver/webserver.cpp +++ b/Software/src/devboard/webserver/webserver.cpp @@ -414,7 +414,7 @@ void init_webserver() { const char* boolSettingNames[] = { "DBLBTR", "CNTCTRL", "CNTCTRLDBL", "PWMCNTCTRL", "PERBMSRESET", "REMBMSRESET", - "CANFDASCAN", "WIFIAPENABLED", "MQTTENABLED", "HADISC", "MQTTTOPICS", + "CANFDASCAN", "WIFIAPENABLED", "MQTTENABLED", "HADISC", "MQTTTOPICS", "INVICNT", }; // Handles the form POST from UI to save settings of the common image @@ -497,6 +497,24 @@ void init_webserver() { } else if (p->name() == "SOFAR_ID") { auto type = atoi(p->value().c_str()); settings.saveUInt("SOFAR_ID", type); + } else if (p->name() == "INVCELLS") { + auto type = atoi(p->value().c_str()); + settings.saveUInt("INVCELLS", type); + } else if (p->name() == "INVMODULES") { + auto type = atoi(p->value().c_str()); + settings.saveUInt("INVMODULES", type); + } else if (p->name() == "INVCELLSPER") { + auto type = atoi(p->value().c_str()); + settings.saveUInt("INVCELLSPER", type); + } else if (p->name() == "INVVLEVEL") { + auto type = atoi(p->value().c_str()); + settings.saveUInt("INVVLEVEL", type); + } else if (p->name() == "INVCAPACITY") { + auto type = atoi(p->value().c_str()); + settings.saveUInt("INVCAPACITY", type); + } else if (p->name() == "INVBTYPE") { + auto type = atoi(p->value().c_str()); + settings.saveUInt("INVBTYPE", (int)type); } for (auto& boolSetting : boolSettings) { diff --git a/Software/src/inverter/INVERTERS.cpp b/Software/src/inverter/INVERTERS.cpp index aa762e75..f9b80d88 100644 --- a/Software/src/inverter/INVERTERS.cpp +++ b/Software/src/inverter/INVERTERS.cpp @@ -90,6 +90,15 @@ extern const char* name_for_inverter_type(InverterProtocolType type) { #error "Compile time SELECTED_INVERTER_CLASS should not be defined with COMMON_IMAGE" #endif +// Some settings that can be used by inverters +uint16_t user_selected_inverter_cells = 0; +uint16_t user_selected_inverter_modules = 0; +uint16_t user_selected_inverter_cells_per_module = 0; +uint16_t user_selected_inverter_voltage_level = 0; +uint16_t user_selected_inverter_ah_capacity = 0; +uint16_t user_selected_inverter_battery_type = 0; +bool user_selected_inverter_ignore_contactors = false; + bool setup_inverter() { if (inverter) { return true; diff --git a/Software/src/inverter/INVERTERS.h b/Software/src/inverter/INVERTERS.h index c706c8a9..712b425a 100644 --- a/Software/src/inverter/INVERTERS.h +++ b/Software/src/inverter/INVERTERS.h @@ -36,4 +36,14 @@ extern InverterProtocol* inverter; // Call to initialize the build-time selected inverter. Safe to call even though inverter was not selected. bool setup_inverter(); +#ifdef COMMON_IMAGE +extern uint16_t user_selected_inverter_cells; +extern uint16_t user_selected_inverter_modules; +extern uint16_t user_selected_inverter_cells_per_module; +extern uint16_t user_selected_inverter_voltage_level; +extern uint16_t user_selected_inverter_ah_capacity; +extern uint16_t user_selected_inverter_battery_type; +extern bool user_selected_inverter_ignore_contactors; +#endif + #endif