From 6b36369b06375a5d29c180e8448af36f12c0dcb5 Mon Sep 17 00:00:00 2001 From: Thomas Basler Date: Sun, 29 Jan 2023 11:46:50 +0100 Subject: [PATCH] Hoymiles Lib: Migrate byteAssign array to std::list --- lib/Hoymiles/src/inverters/HM_1CH.cpp | 9 +-- lib/Hoymiles/src/inverters/HM_1CH.h | 6 +- lib/Hoymiles/src/inverters/HM_2CH.cpp | 9 +-- lib/Hoymiles/src/inverters/HM_2CH.h | 5 +- lib/Hoymiles/src/inverters/HM_4CH.cpp | 9 +-- lib/Hoymiles/src/inverters/HM_4CH.h | 5 +- .../src/inverters/InverterAbstract.cpp | 2 +- lib/Hoymiles/src/inverters/InverterAbstract.h | 4 +- lib/Hoymiles/src/parser/StatisticsParser.cpp | 61 ++++++++----------- lib/Hoymiles/src/parser/StatisticsParser.h | 8 +-- 10 files changed, 45 insertions(+), 73 deletions(-) diff --git a/lib/Hoymiles/src/inverters/HM_1CH.cpp b/lib/Hoymiles/src/inverters/HM_1CH.cpp index 246339c..7154611 100644 --- a/lib/Hoymiles/src/inverters/HM_1CH.cpp +++ b/lib/Hoymiles/src/inverters/HM_1CH.cpp @@ -32,12 +32,7 @@ String HM_1CH::typeName() return F("HM-300, HM-350, HM-400"); } -const byteAssign_t* HM_1CH::getByteAssignment() +const std::list* HM_1CH::getByteAssignment() { - return byteAssignment; -} - -uint8_t HM_1CH::getAssignmentCount() -{ - return sizeof(byteAssignment) / sizeof(byteAssign_t); + return &byteAssignment; } \ No newline at end of file diff --git a/lib/Hoymiles/src/inverters/HM_1CH.h b/lib/Hoymiles/src/inverters/HM_1CH.h index 6fb345f..7599b68 100644 --- a/lib/Hoymiles/src/inverters/HM_1CH.h +++ b/lib/Hoymiles/src/inverters/HM_1CH.h @@ -2,17 +2,17 @@ #pragma once #include "HM_Abstract.h" +#include class HM_1CH : public HM_Abstract { public: explicit HM_1CH(uint64_t serial); static bool isValidSerial(uint64_t serial); String typeName(); - const byteAssign_t* getByteAssignment(); - uint8_t getAssignmentCount(); + const std::list* getByteAssignment(); private: - const byteAssign_t byteAssignment[18] = { + const std::list byteAssignment = { { CH1, FLD_UDC, UNIT_V, 2, 2, 10, false, 1 }, { CH1, FLD_IDC, UNIT_A, 4, 2, 100, false, 2 }, { CH1, FLD_PDC, UNIT_W, 6, 2, 10, false, 1 }, diff --git a/lib/Hoymiles/src/inverters/HM_2CH.cpp b/lib/Hoymiles/src/inverters/HM_2CH.cpp index ef148be..f93746e 100644 --- a/lib/Hoymiles/src/inverters/HM_2CH.cpp +++ b/lib/Hoymiles/src/inverters/HM_2CH.cpp @@ -33,12 +33,7 @@ String HM_2CH::typeName() return F("HM-600, HM-700, HM-800"); } -const byteAssign_t* HM_2CH::getByteAssignment() +const std::list* HM_2CH::getByteAssignment() { - return byteAssignment; -} - -uint8_t HM_2CH::getAssignmentCount() -{ - return sizeof(byteAssignment) / sizeof(byteAssign_t); + return &byteAssignment; } \ No newline at end of file diff --git a/lib/Hoymiles/src/inverters/HM_2CH.h b/lib/Hoymiles/src/inverters/HM_2CH.h index d20d43f..5ff5c06 100644 --- a/lib/Hoymiles/src/inverters/HM_2CH.h +++ b/lib/Hoymiles/src/inverters/HM_2CH.h @@ -8,11 +8,10 @@ public: explicit HM_2CH(uint64_t serial); static bool isValidSerial(uint64_t serial); String typeName(); - const byteAssign_t* getByteAssignment(); - uint8_t getAssignmentCount(); + const std::list* getByteAssignment(); private: - const byteAssign_t byteAssignment[24] = { + const std::list byteAssignment = { { CH1, FLD_UDC, UNIT_V, 2, 2, 10, false, 1 }, { CH1, FLD_IDC, UNIT_A, 4, 2, 100, false, 2 }, { CH1, FLD_PDC, UNIT_W, 6, 2, 10, false, 1 }, diff --git a/lib/Hoymiles/src/inverters/HM_4CH.cpp b/lib/Hoymiles/src/inverters/HM_4CH.cpp index afffbea..9cf5a4a 100644 --- a/lib/Hoymiles/src/inverters/HM_4CH.cpp +++ b/lib/Hoymiles/src/inverters/HM_4CH.cpp @@ -32,12 +32,7 @@ String HM_4CH::typeName() return F("HM-1000, HM-1200, HM-1500"); } -const byteAssign_t* HM_4CH::getByteAssignment() +const std::list* HM_4CH::getByteAssignment() { - return byteAssignment; -} - -uint8_t HM_4CH::getAssignmentCount() -{ - return sizeof(byteAssignment) / sizeof(byteAssign_t); + return &byteAssignment; } \ No newline at end of file diff --git a/lib/Hoymiles/src/inverters/HM_4CH.h b/lib/Hoymiles/src/inverters/HM_4CH.h index 2a950f2..2a511c5 100644 --- a/lib/Hoymiles/src/inverters/HM_4CH.h +++ b/lib/Hoymiles/src/inverters/HM_4CH.h @@ -8,11 +8,10 @@ public: explicit HM_4CH(uint64_t serial); static bool isValidSerial(uint64_t serial); String typeName(); - const byteAssign_t* getByteAssignment(); - uint8_t getAssignmentCount(); + const std::list* getByteAssignment(); private: - const byteAssign_t byteAssignment[36] = { + const std::list byteAssignment = { { CH1, FLD_UDC, UNIT_V, 2, 2, 10, false, 1 }, { CH1, FLD_IDC, UNIT_A, 4, 2, 100, false, 2 }, { CH1, FLD_PDC, UNIT_W, 8, 2, 10, false, 1 }, diff --git a/lib/Hoymiles/src/inverters/InverterAbstract.cpp b/lib/Hoymiles/src/inverters/InverterAbstract.cpp index 30da998..8c0677b 100644 --- a/lib/Hoymiles/src/inverters/InverterAbstract.cpp +++ b/lib/Hoymiles/src/inverters/InverterAbstract.cpp @@ -30,7 +30,7 @@ void InverterAbstract::init() // Not possible in constructor --> virtual function // Not possible in verifyAllFragments --> Because no data if nothing is ever received // It has to be executed because otherwise the getChannelCount method in stats always returns 0 - _statisticsParser.get()->setByteAssignment(getByteAssignment(), getAssignmentCount()); + _statisticsParser.get()->setByteAssignment(getByteAssignment()); } uint64_t InverterAbstract::serial() diff --git a/lib/Hoymiles/src/inverters/InverterAbstract.h b/lib/Hoymiles/src/inverters/InverterAbstract.h index 018e06d..6334c64 100644 --- a/lib/Hoymiles/src/inverters/InverterAbstract.h +++ b/lib/Hoymiles/src/inverters/InverterAbstract.h @@ -11,6 +11,7 @@ #include "types.h" #include #include +#include #define MAX_NAME_LENGTH 32 @@ -38,8 +39,7 @@ public: void setName(const char* name); const char* name(); virtual String typeName() = 0; - virtual const byteAssign_t* getByteAssignment() = 0; - virtual uint8_t getAssignmentCount() = 0; + virtual const std::list* getByteAssignment() = 0; bool isProducing(); bool isReachable(); diff --git a/lib/Hoymiles/src/parser/StatisticsParser.cpp b/lib/Hoymiles/src/parser/StatisticsParser.cpp index be7ce04..117ced3 100644 --- a/lib/Hoymiles/src/parser/StatisticsParser.cpp +++ b/lib/Hoymiles/src/parser/StatisticsParser.cpp @@ -28,10 +28,9 @@ const calcFunc_t calcFunctions[] = { { CALC_IRR_CH, &calcIrradiation } }; -void StatisticsParser::setByteAssignment(const byteAssign_t* byteAssignment, const uint8_t count) +void StatisticsParser::setByteAssignment(const std::list* byteAssignment) { _byteAssignment = byteAssignment; - _byteAssignmentCount = count; } void StatisticsParser::clearBuffer() @@ -50,31 +49,26 @@ void StatisticsParser::appendFragment(uint8_t offset, uint8_t* payload, uint8_t _statisticLength += len; } -uint8_t StatisticsParser::getAssignIdxByChannelField(uint8_t channel, uint8_t fieldId) +const byteAssign_t* StatisticsParser::getAssignmentByChannelField(uint8_t channel, uint8_t fieldId) { - const byteAssign_t* b = _byteAssignment; - - uint8_t pos; - for (pos = 0; pos < _byteAssignmentCount; pos++) { - if (b[pos].ch == channel && b[pos].fieldId == fieldId) { - return pos; + for (auto const& i : *_byteAssignment) { + if (i.ch == channel && i.fieldId == fieldId) { + return &i; } } - return 0xff; + return NULL; } float StatisticsParser::getChannelFieldValue(uint8_t channel, uint8_t fieldId) { - uint8_t pos = getAssignIdxByChannelField(channel, fieldId); - if (pos == 0xff) { + const byteAssign_t* pos = getAssignmentByChannelField(channel, fieldId); + if (pos == NULL) { return 0; } - const byteAssign_t* b = _byteAssignment; - - uint8_t ptr = b[pos].start; - uint8_t end = ptr + b[pos].num; - uint16_t div = b[pos].div; + uint8_t ptr = pos->start; + uint8_t end = ptr + pos->num; + uint16_t div = pos->div; if (CMD_CALC != div) { // Value is a static value @@ -85,9 +79,9 @@ float StatisticsParser::getChannelFieldValue(uint8_t channel, uint8_t fieldId) } while (++ptr != end); float result; - if (b[pos].isSigned && b[pos].num == 2) { + if (pos->isSigned && pos->num == 2) { result = static_cast(static_cast(val)); - } else if (b[pos].isSigned && b[pos].num == 4) { + } else if (pos->isSigned && pos->num == 4) { result = static_cast(static_cast(val)); } else { result = static_cast(val); @@ -97,7 +91,7 @@ float StatisticsParser::getChannelFieldValue(uint8_t channel, uint8_t fieldId) return result; } else { // Value has to be calculated - return calcFunctions[b[pos].start].func(this, b[pos].num); + return calcFunctions[pos->start].func(this, pos->num); } return 0; @@ -105,39 +99,34 @@ float StatisticsParser::getChannelFieldValue(uint8_t channel, uint8_t fieldId) bool StatisticsParser::hasChannelFieldValue(uint8_t channel, uint8_t fieldId) { - uint8_t pos = getAssignIdxByChannelField(channel, fieldId); - return pos != 0xff; + const byteAssign_t* pos = getAssignmentByChannelField(channel, fieldId); + return pos != NULL; } const char* StatisticsParser::getChannelFieldUnit(uint8_t channel, uint8_t fieldId) { - uint8_t pos = getAssignIdxByChannelField(channel, fieldId); - const byteAssign_t* b = _byteAssignment; - - return units[b[pos].unitId]; + const byteAssign_t* pos = getAssignmentByChannelField(channel, fieldId); + return units[pos->unitId]; } const char* StatisticsParser::getChannelFieldName(uint8_t channel, uint8_t fieldId) { - uint8_t pos = getAssignIdxByChannelField(channel, fieldId); - const byteAssign_t* b = _byteAssignment; - - return fields[b[pos].fieldId]; + const byteAssign_t* pos = getAssignmentByChannelField(channel, fieldId); + return fields[pos->fieldId]; } uint8_t StatisticsParser::getChannelFieldDigits(uint8_t channel, uint8_t fieldId) { - uint8_t pos = getAssignIdxByChannelField(channel, fieldId); - return _byteAssignment[pos].digits; + const byteAssign_t* pos = getAssignmentByChannelField(channel, fieldId); + return pos->digits; } uint8_t StatisticsParser::getChannelCount() { - const byteAssign_t* b = _byteAssignment; uint8_t cnt = 0; - for (uint8_t pos = 0; pos < _byteAssignmentCount; pos++) { - if (b[pos].ch > cnt) { - cnt = b[pos].ch; + for (auto const &b: *_byteAssignment) { + if (b.ch > cnt) { + cnt = b.ch; } } diff --git a/lib/Hoymiles/src/parser/StatisticsParser.h b/lib/Hoymiles/src/parser/StatisticsParser.h index e4defc9..cc7cb76 100644 --- a/lib/Hoymiles/src/parser/StatisticsParser.h +++ b/lib/Hoymiles/src/parser/StatisticsParser.h @@ -3,6 +3,7 @@ #include "Parser.h" #include #include +#include #define STATISTIC_PACKET_SIZE (4 * 16) @@ -78,9 +79,9 @@ public: void clearBuffer(); void appendFragment(uint8_t offset, uint8_t* payload, uint8_t len); - void setByteAssignment(const byteAssign_t* byteAssignment, const uint8_t count); + void setByteAssignment(const std::list* byteAssignment); - uint8_t getAssignIdxByChannelField(uint8_t channel, uint8_t fieldId); + const byteAssign_t* getAssignmentByChannelField(uint8_t channel, uint8_t fieldId); float getChannelFieldValue(uint8_t channel, uint8_t fieldId); bool hasChannelFieldValue(uint8_t channel, uint8_t fieldId); const char* getChannelFieldUnit(uint8_t channel, uint8_t fieldId); @@ -101,8 +102,7 @@ private: uint8_t _statisticLength = 0; uint16_t _chanMaxPower[CH4]; - const byteAssign_t* _byteAssignment; - uint8_t _byteAssignmentCount; + const std::list* _byteAssignment; uint32_t _rxFailureCount = 0; }; \ No newline at end of file