From c4e911cecf81eb5145a9868bfefcbbe60c85c704 Mon Sep 17 00:00:00 2001 From: Thomas Basler Date: Thu, 30 Jun 2022 21:14:58 +0200 Subject: [PATCH] Add very simple method differ between requests The last request is required to use the right parser for the received payload as the package type is not encoded in the received data --- lib/Hoymiles/src/inverters/HM_Abstract.cpp | 1 + .../src/inverters/InverterAbstract.cpp | 27 +++++++++++++------ lib/Hoymiles/src/inverters/InverterAbstract.h | 10 +++++++ 3 files changed, 30 insertions(+), 8 deletions(-) diff --git a/lib/Hoymiles/src/inverters/HM_Abstract.cpp b/lib/Hoymiles/src/inverters/HM_Abstract.cpp index 6520500..0b7c255 100644 --- a/lib/Hoymiles/src/inverters/HM_Abstract.cpp +++ b/lib/Hoymiles/src/inverters/HM_Abstract.cpp @@ -37,5 +37,6 @@ bool HM_Abstract::sendStatsRequest(HoymilesRadio* radio) clearRxFragmentBuffer(); radio->enqueTransaction(&payload); + setLastRequest(RequestType::Stats); return true; } \ No newline at end of file diff --git a/lib/Hoymiles/src/inverters/InverterAbstract.cpp b/lib/Hoymiles/src/inverters/InverterAbstract.cpp index dd61076..195308f 100644 --- a/lib/Hoymiles/src/inverters/InverterAbstract.cpp +++ b/lib/Hoymiles/src/inverters/InverterAbstract.cpp @@ -104,15 +104,16 @@ uint8_t InverterAbstract::verifyAllFragments() return FRAGMENT_CRC_ERROR; } - // todo: hier muss noch ein check bzgl. packet type usw rein (ist ja nicht alles statistik) - // Move all fragments into target buffer - memset(_payloadStats, 0, MAX_RF_FRAGMENT_COUNT * MAX_RF_PAYLOAD_SIZE); - uint8_t offs = 0; - for (uint8_t i = 0; i < _rxFragmentMaxPacketId; i++) { - memcpy(&_payloadStats[offs], _rxFragmentBuffer[i].fragment, _rxFragmentBuffer[i].len); - offs += (_rxFragmentBuffer[i].len); + if (getLastRequest() == RequestType::Stats) { + // Move all fragments into target buffer + memset(_payloadStats, 0, MAX_RF_FRAGMENT_COUNT * MAX_RF_PAYLOAD_SIZE); + uint8_t offs = 0; + for (uint8_t i = 0; i < _rxFragmentMaxPacketId; i++) { + memcpy(&_payloadStats[offs], _rxFragmentBuffer[i].fragment, _rxFragmentBuffer[i].len); + offs += (_rxFragmentBuffer[i].len); + } + _lastStatsUpdate = millis(); } - _lastStatsUpdate = millis(); return FRAGMENT_OK; } @@ -122,6 +123,16 @@ uint32_t InverterAbstract::getLastStatsUpdate() return _lastStatsUpdate; } +void InverterAbstract::setLastRequest(RequestType request) +{ + _lastRequest = request; +} + +RequestType InverterAbstract::getLastRequest() +{ + return _lastRequest; +} + uint8_t InverterAbstract::getChannelCount() { const byteAssign_t* b = getByteAssignment(); diff --git a/lib/Hoymiles/src/inverters/InverterAbstract.h b/lib/Hoymiles/src/inverters/InverterAbstract.h index 023c567..e16c74f 100644 --- a/lib/Hoymiles/src/inverters/InverterAbstract.h +++ b/lib/Hoymiles/src/inverters/InverterAbstract.h @@ -66,6 +66,10 @@ enum { FRAGMENT_OK = 0 }; +enum class RequestType { + Stats +}; + typedef struct { uint8_t fieldId; // field id uint8_t unitId; // uint id @@ -130,6 +134,10 @@ public: virtual bool sendStatsRequest(HoymilesRadio* radio) = 0; uint32_t getLastStatsUpdate(); +protected: + void setLastRequest(RequestType request); + RequestType getLastRequest(); + private: serial_u _serial; char _name[MAX_NAME_LENGTH]; @@ -141,4 +149,6 @@ private: uint8_t _payloadStats[MAX_RF_FRAGMENT_COUNT * MAX_RF_PAYLOAD_SIZE]; uint32_t _lastStatsUpdate = 0; uint16_t _chanMaxPower[CH4]; + + RequestType _lastRequest; }; \ No newline at end of file