From c28a532bf10e6cb1e5386e413a2cefb0f836bc34 Mon Sep 17 00:00:00 2001 From: Thomas Basler Date: Sun, 4 Sep 2022 15:58:56 +0200 Subject: [PATCH] Added base classes for SystemConfigPara --- .../src/commands/SystemConfigParaCommand.cpp | 28 +++++++++++++++++++ .../src/commands/SystemConfigParaCommand.h | 10 +++++++ lib/Hoymiles/src/inverters/HM_Abstract.cpp | 18 ++++++++++++ lib/Hoymiles/src/inverters/HM_Abstract.h | 1 + .../src/inverters/InverterAbstract.cpp | 6 ++++ lib/Hoymiles/src/inverters/InverterAbstract.h | 5 +++- .../src/parser/SystemConfigParaParser.cpp | 23 +++++++++++++++ .../src/parser/SystemConfigParaParser.h | 17 +++++++++++ 8 files changed, 107 insertions(+), 1 deletion(-) create mode 100644 lib/Hoymiles/src/commands/SystemConfigParaCommand.cpp create mode 100644 lib/Hoymiles/src/commands/SystemConfigParaCommand.h create mode 100644 lib/Hoymiles/src/parser/SystemConfigParaParser.cpp create mode 100644 lib/Hoymiles/src/parser/SystemConfigParaParser.h diff --git a/lib/Hoymiles/src/commands/SystemConfigParaCommand.cpp b/lib/Hoymiles/src/commands/SystemConfigParaCommand.cpp new file mode 100644 index 0000000..664442b --- /dev/null +++ b/lib/Hoymiles/src/commands/SystemConfigParaCommand.cpp @@ -0,0 +1,28 @@ +#include "SystemConfigParaCommand.h" +#include "inverters/InverterAbstract.h" + +SystemConfigParaCommand::SystemConfigParaCommand(uint64_t target_address, uint64_t router_address, time_t time) + : MultiDataCommand(target_address, router_address) +{ + setTime(time); + setDataType(0x05); + setTimeout(200); +} + +bool SystemConfigParaCommand::handleResponse(InverterAbstract* inverter, fragment_t fragment[], uint8_t max_fragment_id) +{ + // Check CRC of whole payload + if (!MultiDataCommand::handleResponse(inverter, fragment, max_fragment_id)) { + return false; + } + + // Move all fragments into target buffer + uint8_t offs = 0; + inverter->SystemConfigPara()->clearBuffer(); + for (uint8_t i = 0; i < max_fragment_id; i++) { + inverter->SystemConfigPara()->appendFragment(offs, fragment[i].fragment, fragment[i].len); + offs += (fragment[i].len); + } + inverter->SystemConfigPara()->setLastUpdate(millis()); + return true; +} \ No newline at end of file diff --git a/lib/Hoymiles/src/commands/SystemConfigParaCommand.h b/lib/Hoymiles/src/commands/SystemConfigParaCommand.h new file mode 100644 index 0000000..003c1d8 --- /dev/null +++ b/lib/Hoymiles/src/commands/SystemConfigParaCommand.h @@ -0,0 +1,10 @@ +#pragma once + +#include "MultiDataCommand.h" + +class SystemConfigParaCommand : public MultiDataCommand { +public: + SystemConfigParaCommand(uint64_t target_address = 0, uint64_t router_address = 0, time_t time = 0); + + virtual bool handleResponse(InverterAbstract* inverter, fragment_t fragment[], uint8_t max_fragment_id); +}; \ 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 df492f8..0668f91 100644 --- a/lib/Hoymiles/src/inverters/HM_Abstract.cpp +++ b/lib/Hoymiles/src/inverters/HM_Abstract.cpp @@ -4,6 +4,7 @@ #include "commands/DevInfoAllCommand.h" #include "commands/DevInfoSampleCommand.h" #include "commands/RealTimeRunDataCommand.h" +#include "commands/SystemConfigParaCommand.h" HM_Abstract::HM_Abstract(uint64_t serial) : InverterAbstract(serial) {}; @@ -68,5 +69,22 @@ bool HM_Abstract::sendDevInfoRequest(HoymilesRadio* radio) cmdSample->setTime(now); cmdSample->setTargetAddress(serial()); + return true; +} + +bool HM_Abstract::sendSystemConfigParaRequest(HoymilesRadio* radio) +{ + struct tm timeinfo; + if (!getLocalTime(&timeinfo)) { + return false; + } + + time_t now; + time(&now); + + SystemConfigParaCommand* cmd = radio->enqueCommand(); + cmd->setTime(now); + cmd->setTargetAddress(serial()); + return true; } \ No newline at end of file diff --git a/lib/Hoymiles/src/inverters/HM_Abstract.h b/lib/Hoymiles/src/inverters/HM_Abstract.h index bd10be9..b38bad1 100644 --- a/lib/Hoymiles/src/inverters/HM_Abstract.h +++ b/lib/Hoymiles/src/inverters/HM_Abstract.h @@ -8,6 +8,7 @@ public: bool sendStatsRequest(HoymilesRadio* radio); bool sendAlarmLogRequest(HoymilesRadio* radio); bool sendDevInfoRequest(HoymilesRadio* radio); + bool sendSystemConfigParaRequest(HoymilesRadio* radio); private: uint8_t _lastAlarmLogCnt = 0; diff --git a/lib/Hoymiles/src/inverters/InverterAbstract.cpp b/lib/Hoymiles/src/inverters/InverterAbstract.cpp index 4005479..caa2303 100644 --- a/lib/Hoymiles/src/inverters/InverterAbstract.cpp +++ b/lib/Hoymiles/src/inverters/InverterAbstract.cpp @@ -8,6 +8,7 @@ InverterAbstract::InverterAbstract(uint64_t serial) _alarmLogParser.reset(new AlarmLogParser()); _devInfoParser.reset(new DevInfoParser()); _statisticsParser.reset(new StatisticsParser()); + _systemConfigParaParser.reset(new SystemConfigParaParser()); } void InverterAbstract::init() @@ -54,6 +55,11 @@ StatisticsParser* InverterAbstract::Statistics() return _statisticsParser.get(); } +SystemConfigParaParser* InverterAbstract::SystemConfigPara() +{ + return _systemConfigParaParser.get(); +} + void InverterAbstract::clearRxFragmentBuffer() { memset(_rxFragmentBuffer, 0, MAX_RF_FRAGMENT_COUNT * sizeof(fragment_t)); diff --git a/lib/Hoymiles/src/inverters/InverterAbstract.h b/lib/Hoymiles/src/inverters/InverterAbstract.h index d2a75c3..ce93503 100644 --- a/lib/Hoymiles/src/inverters/InverterAbstract.h +++ b/lib/Hoymiles/src/inverters/InverterAbstract.h @@ -1,8 +1,9 @@ #pragma once #include "../parser/AlarmLogParser.h" -#include "../parser/StatisticsParser.h" #include "../parser/DevInfoParser.h" +#include "../parser/StatisticsParser.h" +#include "../parser/SystemConfigParaParser.h" #include "HoymilesRadio.h" #include "types.h" #include @@ -44,6 +45,7 @@ public: AlarmLogParser* EventLog(); DevInfoParser* DevInfo(); StatisticsParser* Statistics(); + SystemConfigParaParser* SystemConfigPara(); private: serial_u _serial; @@ -56,4 +58,5 @@ private: std::unique_ptr _alarmLogParser; std::unique_ptr _devInfoParser; std::unique_ptr _statisticsParser; + std::unique_ptr _systemConfigParaParser; }; \ No newline at end of file diff --git a/lib/Hoymiles/src/parser/SystemConfigParaParser.cpp b/lib/Hoymiles/src/parser/SystemConfigParaParser.cpp new file mode 100644 index 0000000..364feff --- /dev/null +++ b/lib/Hoymiles/src/parser/SystemConfigParaParser.cpp @@ -0,0 +1,23 @@ +#include "SystemConfigParaParser.h" +#include + +void SystemConfigParaParser::clearBuffer() +{ + memset(_payload, 0, SYSTEM_CONFIG_PARA_SIZE); + _payloadLength = 0; +} + +void SystemConfigParaParser::appendFragment(uint8_t offset, uint8_t* payload, uint8_t len) +{ + if (offset + len > (SYSTEM_CONFIG_PARA_SIZE)) { + Serial.printf("FATAL: (%s, %d) stats packet too large for buffer\n", __FILE__, __LINE__); + return; + } + memcpy(&_payload[offset], payload, len); + _payloadLength += len; +} + +float SystemConfigParaParser::getLimitPercent() +{ + return ((((uint16_t)_payload[2]) << 8) | _payload[3]) / 10; +} \ No newline at end of file diff --git a/lib/Hoymiles/src/parser/SystemConfigParaParser.h b/lib/Hoymiles/src/parser/SystemConfigParaParser.h new file mode 100644 index 0000000..2def6c8 --- /dev/null +++ b/lib/Hoymiles/src/parser/SystemConfigParaParser.h @@ -0,0 +1,17 @@ +#pragma once +#include "Parser.h" +#include + +#define SYSTEM_CONFIG_PARA_SIZE 16 + +class SystemConfigParaParser : public Parser { +public: + void clearBuffer(); + void appendFragment(uint8_t offset, uint8_t* payload, uint8_t len); + + float getLimitPercent(); + +private: + uint8_t _payload[SYSTEM_CONFIG_PARA_SIZE]; + uint8_t _payloadLength; +}; \ No newline at end of file