diff --git a/Software/Software.ino b/Software/Software.ino
index 58f6a378..28c91046 100644
--- a/Software/Software.ino
+++ b/Software/Software.ino
@@ -102,10 +102,7 @@ void setup() {
#endif // PRECHARGE_CONTROL
setup_charger();
-
-#if defined(CAN_INVERTER_SELECTED) || defined(MODBUS_INVERTER_SELECTED) || defined(RS485_INVERTER_SELECTED)
setup_inverter();
-#endif
setup_battery();
init_rs485();
@@ -512,15 +509,9 @@ void update_calculated_values() {
}
void update_values_inverter() {
-#ifdef SELECTED_INVERTER_CLASS
if (inverter) {
inverter->update_values();
}
-#else
-#ifdef CAN_INVERTER_SELECTED
- update_values_can_inverter();
-#endif // CAN_INVERTER_SELECTED
-#endif
}
void check_reset_reason() {
diff --git a/Software/src/devboard/webserver/settings_html.cpp b/Software/src/devboard/webserver/settings_html.cpp
index 832e6546..359e80da 100644
--- a/Software/src/devboard/webserver/settings_html.cpp
+++ b/Software/src/devboard/webserver/settings_html.cpp
@@ -39,13 +39,10 @@ String settings_processor(const String& var) {
String(getCANInterfaceName(can_config.battery_double)) + "";
#endif // DOUBLE_BATTERY
-#ifdef CAN_INVERTER_SELECTED
- content += "
Inverter interface: " +
- String(getCANInterfaceName(can_config.inverter)) + "
";
-#endif //CAN_INVERTER_SELECTED
-#ifdef MODBUS_INVERTER_SELECTED
- content += "Inverter interface: RS485
";
-#endif
+ if (inverter) {
+ content += "Inverter interface: " +
+ String(inverter->interface_name()) + "
";
+ }
#ifdef CAN_SHUNT_SELECTED
content += "Shunt Interface: " +
diff --git a/Software/src/inverter/CanInverterProtocol.h b/Software/src/inverter/CanInverterProtocol.h
index 32904602..68f9b400 100644
--- a/Software/src/inverter/CanInverterProtocol.h
+++ b/Software/src/inverter/CanInverterProtocol.h
@@ -7,6 +7,7 @@
class CanInverterProtocol : public InverterProtocol {
public:
+ virtual const char* interface_name() { return getCANInterfaceName(can_config.inverter); }
virtual void transmit_can(unsigned long currentMillis) = 0;
virtual void map_can_frame_to_variable(CAN_frame rx_frame) = 0;
};
diff --git a/Software/src/inverter/INVERTERS.cpp b/Software/src/inverter/INVERTERS.cpp
index cb5faa47..b454504b 100644
--- a/Software/src/inverter/INVERTERS.cpp
+++ b/Software/src/inverter/INVERTERS.cpp
@@ -3,9 +3,7 @@
// These functions adapt the old C-style global functions inverter-API to the
// object-oriented inverter protocol API.
-#ifdef SELECTED_INVERTER_CLASS
-
-InverterProtocol* inverter;
+InverterProtocol* inverter = nullptr;
#ifdef CAN_INVERTER_SELECTED
CanInverterProtocol* can_inverter;
@@ -30,7 +28,9 @@ void setup_inverter() {
inverter = new SELECTED_INVERTER_CLASS();
#endif
- inverter->setup();
+ if (inverter) {
+ inverter->setup();
+ }
}
#ifdef CAN_INVERTER_SELECTED
@@ -52,5 +52,3 @@ void receive_RS485() {
((Rs485InverterProtocol*)inverter)->receive_RS485();
}
#endif
-
-#endif
diff --git a/Software/src/inverter/INVERTERS.h b/Software/src/inverter/INVERTERS.h
index 399806b8..9996fb03 100644
--- a/Software/src/inverter/INVERTERS.h
+++ b/Software/src/inverter/INVERTERS.h
@@ -30,6 +30,7 @@ extern InverterProtocol* inverter;
#include "SOLAX-CAN.h"
#include "SUNGROW-CAN.h"
+// Call to initialize the build-time selected inverter. Safe to call even though inverter was not selected.
void setup_inverter();
#ifdef CAN_INVERTER_SELECTED
diff --git a/Software/src/inverter/InverterProtocol.h b/Software/src/inverter/InverterProtocol.h
index 00e0df5d..65e2b2e9 100644
--- a/Software/src/inverter/InverterProtocol.h
+++ b/Software/src/inverter/InverterProtocol.h
@@ -5,6 +5,7 @@
class InverterProtocol {
public:
virtual void setup() = 0;
+ virtual const char* interface_name() = 0;
// This function maps all the values fetched from battery to the correct battery emulator data structures
virtual void update_values() = 0;
diff --git a/Software/src/inverter/ModbusInverterProtocol.h b/Software/src/inverter/ModbusInverterProtocol.h
index 695891d7..5b83b3a6 100644
--- a/Software/src/inverter/ModbusInverterProtocol.h
+++ b/Software/src/inverter/ModbusInverterProtocol.h
@@ -10,6 +10,8 @@ extern uint16_t mbPV[];
// The abstract base class for all Modbus inverter protocols
class ModbusInverterProtocol : public InverterProtocol {
+ virtual const char* interface_name() { return "RS485 / Modbus"; }
+
protected:
// Create a ModbusRTU server instance with 2000ms timeout
ModbusInverterProtocol() : MBserver(2000) { mbPV = ::mbPV; }
diff --git a/Software/src/inverter/Rs485InverterProtocol.h b/Software/src/inverter/Rs485InverterProtocol.h
index f09fe87a..19a6d30e 100644
--- a/Software/src/inverter/Rs485InverterProtocol.h
+++ b/Software/src/inverter/Rs485InverterProtocol.h
@@ -5,6 +5,7 @@
class Rs485InverterProtocol : public InverterProtocol {
public:
+ virtual const char* interface_name() { return "RS485"; }
virtual void receive_RS485() = 0;
virtual int baud_rate() = 0;
};