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; };