Skip to content

Commit

Permalink
meters: Use more Config::Enum for better range validation
Browse files Browse the repository at this point in the history
  • Loading branch information
photron committed Jan 7, 2025
1 parent 97a7f14 commit 03df9eb
Show file tree
Hide file tree
Showing 3 changed files with 26 additions and 24 deletions.
2 changes: 2 additions & 0 deletions software/src/modules/meters/prepare.py
Original file line number Diff line number Diff line change
Expand Up @@ -195,8 +195,10 @@ def sanitize(s):
f.write('#include <stdint.h>\n')
f.write('#include <stddef.h>\n\n')
f.write('enum class MeterValueID {\n')
f.write(' _min = 0,\n')
f.write(' NotSupported = 0,\n')
f.write(''.join(value_id_enum))
f.write(f' _max = {last_id},\n')
f.write('};\n\n')
f.write('const char *getMeterValueName(MeterValueID id);\n\n')

Expand Down
46 changes: 23 additions & 23 deletions software/src/modules/meters_modbus_tcp/meters_modbus_tcp.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -37,88 +37,88 @@ void MetersModbusTCP::pre_setup()
table_prototypes.push_back({MeterModbusTCPTableID::None, *Config::Null()});

table_custom_registers_prototype = Config::Object({
{"rtype", Config::Uint8(static_cast<uint8_t>(ModbusRegisterType::HoldingRegister))},
{"rtype", Config::Enum(ModbusRegisterType::HoldingRegister)},
{"addr", Config::Uint16(0)},
{"vtype", Config::Uint8(static_cast<uint8_t>(ModbusValueType::U16))},
{"vtype", Config::Enum(ModbusValueType::U16)},
{"off", Config::Float(0.0f)},
{"scale", Config::Float(1.0f)},
{"id", Config::Uint16(static_cast<uint8_t>(MeterValueID::NotSupported))},
{"id", Config::Enum(MeterValueID::NotSupported)},
});

table_prototypes.push_back({MeterModbusTCPTableID::Custom, Config::Object({
{"device_address", Config::Uint(1, 1, 247)},
{"register_address_mode", Config::Uint8(static_cast<uint8_t>(ModbusRegisterAddressMode::Address))},
{"register_address_mode", Config::Enum(ModbusRegisterAddressMode::Address)},
{"registers", Config::Array({},
&table_custom_registers_prototype,
0, METERS_MODBUS_TCP_MAX_CUSTOM_REGISTERS, Config::type_id<Config::ConfObject>()
)}
})});

table_prototypes.push_back({MeterModbusTCPTableID::SungrowHybridInverter, Config::Object({
{"virtual_meter", Config::Uint8(static_cast<uint8_t>(SungrowHybridInverterVirtualMeter::None))},
{"virtual_meter", Config::Enum(SungrowHybridInverterVirtualMeter::None)},
{"device_address", Config::Uint(1, 1, 247)},
})});

table_prototypes.push_back({MeterModbusTCPTableID::SungrowStringInverter, Config::Object({
{"virtual_meter", Config::Uint8(static_cast<uint8_t>(SungrowStringInverterVirtualMeter::None))},
{"virtual_meter", Config::Enum(SungrowStringInverterVirtualMeter::None)},
{"device_address", Config::Uint(1, 1, 247)},
})});

table_prototypes.push_back({MeterModbusTCPTableID::SolarmaxMaxStorage, Config::Object({
{"virtual_meter", Config::Uint8(static_cast<uint8_t>(SolarmaxMaxStorageVirtualMeter::None))},
{"virtual_meter", Config::Enum(SolarmaxMaxStorageVirtualMeter::None)},
{"device_address", Config::Uint(1, 1, 247)},
})});

table_prototypes.push_back({MeterModbusTCPTableID::VictronEnergyGX, Config::Object({
{"virtual_meter", Config::Uint8(static_cast<uint8_t>(VictronEnergyGXVirtualMeter::None))},
{"virtual_meter", Config::Enum(VictronEnergyGXVirtualMeter::None)},
{"device_address", Config::Uint(100, 1, 247)},
})});

table_prototypes.push_back({MeterModbusTCPTableID::DeyeHybridInverter, Config::Object({
{"virtual_meter", Config::Uint8(static_cast<uint8_t>(DeyeHybridInverterVirtualMeter::None))},
{"virtual_meter", Config::Enum(DeyeHybridInverterVirtualMeter::None)},
{"device_address", Config::Uint(1, 1, 247)},
})});

table_prototypes.push_back({MeterModbusTCPTableID::AlphaESSHybridInverter, Config::Object({
{"virtual_meter", Config::Uint8(static_cast<uint8_t>(AlphaESSHybridInverterVirtualMeter::None))},
{"virtual_meter", Config::Enum(AlphaESSHybridInverterVirtualMeter::None)},
{"device_address", Config::Uint(85, 1, 247)},
})});

table_prototypes.push_back({MeterModbusTCPTableID::ShellyProEM, Config::Object({
{"device_address", Config::Uint(1, 1, 247)},
{"monophase_channel", Config::Uint8(static_cast<uint8_t>(ShellyEMMonophaseChannel::None))},
{"monophase_mapping", Config::Uint8(static_cast<uint8_t>(ShellyEMMonophaseMapping::None))},
{"monophase_channel", Config::Enum(ShellyEMMonophaseChannel::None)},
{"monophase_mapping", Config::Enum(ShellyEMMonophaseMapping::None)},
})});

table_prototypes.push_back({MeterModbusTCPTableID::ShellyPro3EM, Config::Object({
{"device_address", Config::Uint(1, 1, 247)},
{"device_profile", Config::Uint8(static_cast<uint8_t>(ShellyPro3EMDeviceProfile::Triphase))},
{"monophase_channel", Config::Uint8(static_cast<uint8_t>(ShellyEMMonophaseChannel::None))},
{"monophase_mapping", Config::Uint8(static_cast<uint8_t>(ShellyEMMonophaseMapping::None))},
{"device_profile", Config::Enum(ShellyPro3EMDeviceProfile::Triphase)},
{"monophase_channel", Config::Enum(ShellyEMMonophaseChannel::None)},
{"monophase_mapping", Config::Enum(ShellyEMMonophaseMapping::None)},
})});

table_prototypes.push_back({MeterModbusTCPTableID::GoodweHybridInverter, Config::Object({
{"virtual_meter", Config::Uint8(static_cast<uint8_t>(GoodweHybridInverterVirtualMeter::None))},
{"virtual_meter", Config::Enum(GoodweHybridInverterVirtualMeter::None)},
{"device_address", Config::Uint(247, 1, 247)},
})});

table_prototypes.push_back({MeterModbusTCPTableID::SolaxHybridInverter, Config::Object({
{"virtual_meter", Config::Uint8(static_cast<uint8_t>(SolaxHybridInverterVirtualMeter::None))},
{"virtual_meter", Config::Enum(SolaxHybridInverterVirtualMeter::None)},
{"device_address", Config::Uint(1, 1, 247)},
})});

table_prototypes.push_back({MeterModbusTCPTableID::FroniusGEN24PlusHybridInverter, Config::Object({
{"virtual_meter", Config::Uint8(static_cast<uint8_t>(FroniusGEN24PlusHybridInverterVirtualMeter::None))},
{"virtual_meter", Config::Enum(FroniusGEN24PlusHybridInverterVirtualMeter::None)},
{"device_address", Config::Uint(1, 1, 247)},
})});

table_prototypes.push_back({MeterModbusTCPTableID::HaileiHybridInverter, Config::Object({
{"virtual_meter", Config::Uint8(static_cast<uint8_t>(HaileiHybridInverterVirtualMeter::None))},
{"virtual_meter", Config::Enum(HaileiHybridInverterVirtualMeter::None)},
{"device_address", Config::Uint(85, 1, 247)},
})});

table_prototypes.push_back({MeterModbusTCPTableID::FoxESSH3HybridInverter, Config::Object({
{"virtual_meter", Config::Uint8(static_cast<uint8_t>(FoxESSH3HybridInverterVirtualMeter::None))},
{"virtual_meter", Config::Enum(FoxESSH3HybridInverterVirtualMeter::None)},
{"device_address", Config::Uint(247, 1, 247)},
})});

Expand All @@ -139,7 +139,7 @@ void MetersModbusTCP::pre_setup()

Config carlo_gavazzi_single_phase = Config::Object({
{"device_address", Config::Uint(1, 1, 247)},
{"phase", Config::Uint8(static_cast<uint8_t>(CarloGavazziPhase::None))},
{"phase", Config::Enum(CarloGavazziPhase::None)},
});

table_prototypes.push_back({MeterModbusTCPTableID::CarloGavazziEM24DIN, carlo_gavazzi});
Expand All @@ -149,12 +149,12 @@ void MetersModbusTCP::pre_setup()
table_prototypes.push_back({MeterModbusTCPTableID::CarloGavazziEM210, carlo_gavazzi});

table_prototypes.push_back({MeterModbusTCPTableID::CarloGavazziEM270, Config::Object({
{"virtual_meter", Config::Uint8(static_cast<uint8_t>(CarloGavazziEM270VirtualMeter::None))},
{"virtual_meter", Config::Enum(CarloGavazziEM270VirtualMeter::None)},
{"device_address", Config::Uint(1, 1, 247)},
})});

table_prototypes.push_back({MeterModbusTCPTableID::CarloGavazziEM280, Config::Object({
{"virtual_meter", Config::Uint8(static_cast<uint8_t>(CarloGavazziEM280VirtualMeter::None))},
{"virtual_meter", Config::Enum(CarloGavazziEM280VirtualMeter::None)},
{"device_address", Config::Uint(1, 1, 247)},
})});

Expand Down
2 changes: 1 addition & 1 deletion software/src/modules/meters_rct_power/meters_rct_power.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ void MetersRCTPower::pre_setup()
{"display_name", Config::Str("", 0, 32)},
{"host", Config::Str("", 0, 64)},
{"port", Config::Uint16(8899)},
{"virtual_meter", Config::Uint8(static_cast<uint8_t>(VirtualMeter::None))},
{"virtual_meter", Config::Enum(VirtualMeter::None)},
});

errors_prototype = Config::Object({
Expand Down

0 comments on commit 03df9eb

Please sign in to comment.