From 081b19f9fbdc490a3b19c1da03ba5165f7d3355c Mon Sep 17 00:00:00 2001 From: Thomas Basler Date: Wed, 3 Aug 2022 19:13:31 +0200 Subject: [PATCH] Allow fragments without payload This is required for several DevControl commands --- lib/Hoymiles/src/inverters/InverterAbstract.cpp | 5 +++-- lib/Hoymiles/src/types.h | 1 + 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/Hoymiles/src/inverters/InverterAbstract.cpp b/lib/Hoymiles/src/inverters/InverterAbstract.cpp index d50ee86..6ed8212 100644 --- a/lib/Hoymiles/src/inverters/InverterAbstract.cpp +++ b/lib/Hoymiles/src/inverters/InverterAbstract.cpp @@ -58,7 +58,7 @@ void InverterAbstract::clearRxFragmentBuffer() void InverterAbstract::addRxFragment(uint8_t fragment[], uint8_t len) { - if (len < 11 + 1) { + if (len < 11) { Serial.printf("FATAL: (%s, %d) fragment too short\n", __FILE__, __LINE__); return; } @@ -78,6 +78,7 @@ void InverterAbstract::addRxFragment(uint8_t fragment[], uint8_t len) // Packets with 0x81 will be seen as 1 memcpy(_rxFragmentBuffer[(fragmentCount & 0b01111111) - 1].fragment, &fragment[10], len - 11); _rxFragmentBuffer[(fragmentCount & 0b01111111) - 1].len = len - 11; + _rxFragmentBuffer[(fragmentCount & 0b01111111) - 1].wasReceived = true; if ((fragmentCount & 0b01111111) > _rxFragmentLastPacketId) { _rxFragmentLastPacketId = fragmentCount & 0b01111111; @@ -111,7 +112,7 @@ uint8_t InverterAbstract::verifyAllFragments(CommandAbstract* cmd) // Middle fragment is missing for (uint8_t i = 0; i < _rxFragmentMaxPacketId - 1; i++) { - if (_rxFragmentBuffer[i].len == 0) { + if (!_rxFragmentBuffer[i].wasReceived) { Serial.println(F("Middle missing")); if (_rxFragmentRetransmitCnt++ < MAX_RETRANSMIT_COUNT) { return i + 1; diff --git a/lib/Hoymiles/src/types.h b/lib/Hoymiles/src/types.h index 4cc4c9a..e598910 100644 --- a/lib/Hoymiles/src/types.h +++ b/lib/Hoymiles/src/types.h @@ -13,4 +13,5 @@ union serial_u { typedef struct { uint8_t fragment[MAX_RF_PAYLOAD_SIZE]; uint8_t len; + bool wasReceived; } fragment_t;