diff --git a/include/PowerMeter.h b/include/PowerMeter.h index 0ce38f61..5b3d8f31 100644 --- a/include/PowerMeter.h +++ b/include/PowerMeter.h @@ -60,6 +60,8 @@ private: mutable std::mutex _mutex; + static char constexpr _sdmSerialPortOwner[] = "SDM power meter"; + std::unique_ptr _upSdmSerial = nullptr; std::unique_ptr _upSdm = nullptr; std::unique_ptr _upSmlSerial = nullptr; diff --git a/src/PowerMeter.cpp b/src/PowerMeter.cpp index 63cce421..56582d00 100644 --- a/src/PowerMeter.cpp +++ b/src/PowerMeter.cpp @@ -9,6 +9,7 @@ #include "MqttSettings.h" #include "NetworkSettings.h" #include "MessageOutput.h" +#include "SerialPortManager.h" #include #include @@ -57,16 +58,22 @@ void PowerMeterClass::init(Scheduler& scheduler) } case Source::SDM1PH: - case Source::SDM3PH: + case Source::SDM3PH: { if (pin.powermeter_rx < 0 || pin.powermeter_tx < 0) { MessageOutput.println("[PowerMeter] invalid pin config for SDM power meter (RX and TX pins must be defined)"); return; } - _upSdm = std::make_unique(Serial2, 9600, pin.powermeter_dere, + auto oHwSerialPort = SerialPortManager.allocatePort(_sdmSerialPortOwner); + if (!oHwSerialPort) { return; } + + _upSdmSerial = std::make_unique(*oHwSerialPort); + _upSdmSerial->end(); // make sure the UART will be re-initialized + _upSdm = std::make_unique(*_upSdmSerial, 9600, pin.powermeter_dere, SERIAL_8N1, pin.powermeter_rx, pin.powermeter_tx); _upSdm->begin(); break; + } case Source::HTTP: HttpPowerMeter.init();