From be09c4052f08e1db88a6baee872a4b5415831538 Mon Sep 17 00:00:00 2001 From: Thomas Basler Date: Wed, 2 Aug 2023 22:41:53 +0200 Subject: [PATCH] Fix: Ensure that only completly assembled packets are put into the command queue --- lib/Hoymiles/src/HoymilesRadio.h | 11 +++++++--- lib/Hoymiles/src/inverters/HMS_Abstract.cpp | 3 ++- lib/Hoymiles/src/inverters/HMT_Abstract.cpp | 3 ++- lib/Hoymiles/src/inverters/HM_Abstract.cpp | 24 ++++++++++++++------- 4 files changed, 28 insertions(+), 13 deletions(-) diff --git a/lib/Hoymiles/src/HoymilesRadio.h b/lib/Hoymiles/src/HoymilesRadio.h index 2147729..76c1c8a 100644 --- a/lib/Hoymiles/src/HoymilesRadio.h +++ b/lib/Hoymiles/src/HoymilesRadio.h @@ -17,10 +17,15 @@ public: bool isInitialized(); template - T* enqueCommand() + void enqueCommand(std::shared_ptr cmd) { - _commandQueue.push(std::make_shared()); - return static_cast(_commandQueue.back().get()); + _commandQueue.push(cmd); + } + + template + std::shared_ptr prepareCommand() + { + return std::make_shared(); } protected: diff --git a/lib/Hoymiles/src/inverters/HMS_Abstract.cpp b/lib/Hoymiles/src/inverters/HMS_Abstract.cpp index 326ac83..f67ff11 100644 --- a/lib/Hoymiles/src/inverters/HMS_Abstract.cpp +++ b/lib/Hoymiles/src/inverters/HMS_Abstract.cpp @@ -18,9 +18,10 @@ bool HMS_Abstract::sendChangeChannelRequest() return false; } - ChannelChangeCommand* cmdChannel = _radio->enqueCommand(); + auto cmdChannel = _radio->prepareCommand(); cmdChannel->setChannel(HoymilesRadio_CMT::getChannelFromFrequency(Hoymiles.getRadioCmt()->getInverterTargetFrequency())); cmdChannel->setTargetAddress(serial()); + _radio->enqueCommand(cmdChannel); return true; }; diff --git a/lib/Hoymiles/src/inverters/HMT_Abstract.cpp b/lib/Hoymiles/src/inverters/HMT_Abstract.cpp index b561ee7..c345be9 100644 --- a/lib/Hoymiles/src/inverters/HMT_Abstract.cpp +++ b/lib/Hoymiles/src/inverters/HMT_Abstract.cpp @@ -20,9 +20,10 @@ bool HMT_Abstract::sendChangeChannelRequest() return false; } - ChannelChangeCommand* cmdChannel = _radio->enqueCommand(); + auto cmdChannel = _radio->prepareCommand(); cmdChannel->setChannel(HoymilesRadio_CMT::getChannelFromFrequency(Hoymiles.getRadioCmt()->getInverterTargetFrequency())); cmdChannel->setTargetAddress(serial()); + _radio->enqueCommand(cmdChannel); return true; }; \ No newline at end of file diff --git a/lib/Hoymiles/src/inverters/HM_Abstract.cpp b/lib/Hoymiles/src/inverters/HM_Abstract.cpp index 097fffe..c40ad44 100644 --- a/lib/Hoymiles/src/inverters/HM_Abstract.cpp +++ b/lib/Hoymiles/src/inverters/HM_Abstract.cpp @@ -29,9 +29,10 @@ bool HM_Abstract::sendStatsRequest() time_t now; time(&now); - RealTimeRunDataCommand* cmd = _radio->enqueCommand(); + auto cmd = _radio->prepareCommand(); cmd->setTime(now); cmd->setTargetAddress(serial()); + _radio->enqueCommand(cmd); return true; } @@ -60,9 +61,10 @@ bool HM_Abstract::sendAlarmLogRequest(bool force) time_t now; time(&now); - AlarmDataCommand* cmd = _radio->enqueCommand(); + auto cmd = _radio->prepareCommand(); cmd->setTime(now); cmd->setTargetAddress(serial()); + _radio->enqueCommand(cmd); EventLog()->setLastAlarmRequestSuccess(CMD_PENDING); return true; @@ -82,13 +84,15 @@ bool HM_Abstract::sendDevInfoRequest() time_t now; time(&now); - DevInfoAllCommand* cmdAll = _radio->enqueCommand(); + auto cmdAll = _radio->prepareCommand(); cmdAll->setTime(now); cmdAll->setTargetAddress(serial()); + _radio->enqueCommand(cmdAll); - DevInfoSimpleCommand* cmdSimple = _radio->enqueCommand(); + auto cmdSimple = _radio->prepareCommand(); cmdSimple->setTime(now); cmdSimple->setTargetAddress(serial()); + _radio->enqueCommand(cmdSimple); return true; } @@ -107,9 +111,10 @@ bool HM_Abstract::sendSystemConfigParaRequest() time_t now; time(&now); - SystemConfigParaCommand* cmd = _radio->enqueCommand(); + auto cmd = _radio->prepareCommand(); cmd->setTime(now); cmd->setTargetAddress(serial()); + _radio->enqueCommand(cmd); SystemConfigPara()->setLastLimitRequestSuccess(CMD_PENDING); return true; @@ -128,9 +133,10 @@ bool HM_Abstract::sendActivePowerControlRequest(float limit, PowerLimitControlTy _activePowerControlLimit = limit; _activePowerControlType = type; - ActivePowerControlCommand* cmd = _radio->enqueCommand(); + auto cmd = _radio->prepareCommand(); cmd->setActivePowerLimit(limit, type); cmd->setTargetAddress(serial()); + _radio->enqueCommand(cmd); SystemConfigPara()->setLastLimitCommandSuccess(CMD_PENDING); return true; @@ -153,9 +159,10 @@ bool HM_Abstract::sendPowerControlRequest(bool turnOn) _powerState = 0; } - PowerControlCommand* cmd = _radio->enqueCommand(); + auto cmd = _radio->prepareCommand(); cmd->setPowerOn(turnOn); cmd->setTargetAddress(serial()); + _radio->enqueCommand(cmd); PowerCommand()->setLastPowerCommandSuccess(CMD_PENDING); return true; @@ -169,9 +176,10 @@ bool HM_Abstract::sendRestartControlRequest() _powerState = 2; - PowerControlCommand* cmd = _radio->enqueCommand(); + auto cmd = _radio->prepareCommand(); cmd->setRestart(); cmd->setTargetAddress(serial()); + _radio->enqueCommand(cmd); PowerCommand()->setLastPowerCommandSuccess(CMD_PENDING); return true;