From a73707380f24cbd2945257868c28d6fa48bee32c Mon Sep 17 00:00:00 2001 From: Thomas Basler Date: Tue, 2 Aug 2022 21:14:41 +0200 Subject: [PATCH] RequestFrameCommand can now be configured individually for each command If the return value equals nullptr, a retransmit is not performed --- lib/Hoymiles/src/HoymilesRadio.cpp | 11 ++++++----- lib/Hoymiles/src/commands/CommandAbstract.cpp | 6 ++++++ lib/Hoymiles/src/commands/CommandAbstract.h | 2 ++ lib/Hoymiles/src/commands/MultiDataCommand.cpp | 8 ++++++++ lib/Hoymiles/src/commands/MultiDataCommand.h | 5 +++++ lib/Hoymiles/src/commands/SingleDataCommand.cpp | 1 + 6 files changed, 28 insertions(+), 5 deletions(-) diff --git a/lib/Hoymiles/src/HoymilesRadio.cpp b/lib/Hoymiles/src/HoymilesRadio.cpp index d264669..e3b9bc2 100644 --- a/lib/Hoymiles/src/HoymilesRadio.cpp +++ b/lib/Hoymiles/src/HoymilesRadio.cpp @@ -243,12 +243,13 @@ void HoymilesRadio::sendEsbPacket(CommandAbstract* cmd) void HoymilesRadio::sendRetransmitPacket(uint8_t fragment_id) { - RequestFrameCommand cmd( - _commandQueue.front().get()->getTargetAddress(), - DtuSerial().u64, - fragment_id); + CommandAbstract* cmd = _commandQueue.front().get(); - sendEsbPacket(&cmd); + CommandAbstract* requestCmd = cmd->getRequestFrameCommand(fragment_id); + + if (requestCmd != nullptr) { + sendEsbPacket(requestCmd); + } } void HoymilesRadio::sendLastPacketAgain() diff --git a/lib/Hoymiles/src/commands/CommandAbstract.cpp b/lib/Hoymiles/src/commands/CommandAbstract.cpp index 5b7f93d..db7c6d3 100644 --- a/lib/Hoymiles/src/commands/CommandAbstract.cpp +++ b/lib/Hoymiles/src/commands/CommandAbstract.cpp @@ -10,6 +10,7 @@ CommandAbstract::CommandAbstract(uint64_t target_address, uint64_t router_addres setTargetAddress(target_address); setRouterAddress(router_address); setSendCount(0); + setTimeout(0); } template @@ -85,6 +86,11 @@ uint8_t CommandAbstract::incrementSendCount() return _sendCount++; } +CommandAbstract* CommandAbstract::getRequestFrameCommand(uint8_t frame_no) +{ + return nullptr; +} + void CommandAbstract::convertSerialToPacketId(uint8_t buffer[], uint64_t serial) { serial_u s; diff --git a/lib/Hoymiles/src/commands/CommandAbstract.h b/lib/Hoymiles/src/commands/CommandAbstract.h index 3786779..09b8b09 100644 --- a/lib/Hoymiles/src/commands/CommandAbstract.h +++ b/lib/Hoymiles/src/commands/CommandAbstract.h @@ -32,6 +32,8 @@ public: uint8_t getSendCount(); uint8_t incrementSendCount(); + virtual CommandAbstract* getRequestFrameCommand(uint8_t frame_no); + virtual RequestType getRequestType() = 0; protected: diff --git a/lib/Hoymiles/src/commands/MultiDataCommand.cpp b/lib/Hoymiles/src/commands/MultiDataCommand.cpp index 563e36d..800c355 100644 --- a/lib/Hoymiles/src/commands/MultiDataCommand.cpp +++ b/lib/Hoymiles/src/commands/MultiDataCommand.cpp @@ -50,6 +50,14 @@ time_t MultiDataCommand::getTime() | (time_t)(_payload[15]); } +CommandAbstract* MultiDataCommand::getRequestFrameCommand(uint8_t frame_no) +{ + _cmdRequestFrame.setTargetAddress(getTargetAddress()); + _cmdRequestFrame.setFrameNo(frame_no); + + return &_cmdRequestFrame; +} + void MultiDataCommand::udpateCRC() { uint16_t crc = crc16(&_payload[10], 14); // From data_type till password diff --git a/lib/Hoymiles/src/commands/MultiDataCommand.h b/lib/Hoymiles/src/commands/MultiDataCommand.h index 5d68abb..339830f 100644 --- a/lib/Hoymiles/src/commands/MultiDataCommand.h +++ b/lib/Hoymiles/src/commands/MultiDataCommand.h @@ -1,6 +1,7 @@ #pragma once #include "CommandAbstract.h" +#include "RequestFrameCommand.h" #include class MultiDataCommand : public CommandAbstract { @@ -10,8 +11,12 @@ public: void setTime(time_t time); time_t getTime(); + CommandAbstract* getRequestFrameCommand(uint8_t frame_no); + protected: void setDataType(uint8_t data_type); uint8_t getDataType(); void udpateCRC(); + + RequestFrameCommand _cmdRequestFrame; }; \ No newline at end of file diff --git a/lib/Hoymiles/src/commands/SingleDataCommand.cpp b/lib/Hoymiles/src/commands/SingleDataCommand.cpp index 9e3f985..5d6cb5d 100644 --- a/lib/Hoymiles/src/commands/SingleDataCommand.cpp +++ b/lib/Hoymiles/src/commands/SingleDataCommand.cpp @@ -4,4 +4,5 @@ SingleDataCommand::SingleDataCommand(uint64_t target_address, uint64_t router_ad : CommandAbstract(target_address, router_address) { _payload[0] = 0x15; + setTimeout(100); }