From 5a007e5352377ba40b31db8e966c23c59e87d08f Mon Sep 17 00:00:00 2001 From: Bernhard Kirchen Date: Sat, 1 Jun 2024 17:22:04 +0200 Subject: [PATCH] fix: make SDM power meter use serial port manager instead of hard-coding the use of hardware UART 2, the SDM power meter instance now asks for a free hardware serial port to use and instanciates the respective HardwareSerial object using said port. --- include/PowerMeter.h | 2 ++ src/PowerMeter.cpp | 11 +++++++++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/include/PowerMeter.h b/include/PowerMeter.h index 0ce38f61b..5b3d8f31f 100644 --- a/include/PowerMeter.h +++ b/include/PowerMeter.h @@ -60,6 +60,8 @@ class PowerMeterClass { 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 63cce4216..56582d005 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();