From 864cd1fbbbe48fe2fe984c2d3d52ac6e2fbc88c2 Mon Sep 17 00:00:00 2001 From: Gunnar Skjold Date: Tue, 2 Apr 2024 11:35:37 +0200 Subject: [PATCH] Fixed breaking data --- lib/AmsDataStorage/include/AmsDataStorage.h | 26 +++++++++-- lib/AmsDataStorage/src/AmsDataStorage.cpp | 51 ++++++++++++++------- 2 files changed, 57 insertions(+), 20 deletions(-) diff --git a/lib/AmsDataStorage/include/AmsDataStorage.h b/lib/AmsDataStorage/include/AmsDataStorage.h index 99e59433..556ce6e5 100644 --- a/lib/AmsDataStorage/include/AmsDataStorage.h +++ b/lib/AmsDataStorage/include/AmsDataStorage.h @@ -11,14 +11,34 @@ #include "RemoteDebug.h" #include "Timezone.h" +struct DayDataPoints5 { + uint8_t version; + uint16_t hImport[24]; + time_t lastMeterReadTime; + uint32_t activeImport; + uint32_t activeExport; + uint16_t hExport[24]; + uint8_t accuracy; +}; + +struct MonthDataPoints6 { + uint8_t version; + uint16_t dImport[31]; + time_t lastMeterReadTime; + uint32_t activeImport; + uint32_t activeExport; + uint16_t dExport[31]; + uint8_t accuracy; +}; + struct DayDataPoints { uint8_t version; uint16_t hImport[24]; time_t lastMeterReadTime; uint64_t activeImport; + uint64_t activeExport; uint16_t hExport[24]; uint8_t accuracy; - uint64_t activeExport; }; struct MonthDataPoints { @@ -26,10 +46,10 @@ struct MonthDataPoints { uint16_t dImport[31]; time_t lastMeterReadTime; uint64_t activeImport; + uint64_t activeExport; uint16_t dExport[31]; uint8_t accuracy; - uint64_t activeExport; -}; // 142 bytes +}; class AmsDataStorage { public: diff --git a/lib/AmsDataStorage/src/AmsDataStorage.cpp b/lib/AmsDataStorage/src/AmsDataStorage.cpp index 05375e87..2602ff85 100644 --- a/lib/AmsDataStorage/src/AmsDataStorage.cpp +++ b/lib/AmsDataStorage/src/AmsDataStorage.cpp @@ -380,18 +380,48 @@ bool AmsDataStorage::load() { File file = LittleFS.open(FILE_DAYPLOT, "r"); char buf[file.size()]; file.readBytes(buf, file.size()); - DayDataPoints* day = (DayDataPoints*) buf; + if(buf[0] > 5) { + DayDataPoints* day = (DayDataPoints*) buf; + ret = setDayData(*day); + } else { + DayDataPoints5* old = (DayDataPoints5*) buf; + DayDataPoints day = { old->version }; + day.lastMeterReadTime = old->lastMeterReadTime; + day.activeImport = old->activeImport; + day.activeExport = old->activeExport; + day.accuracy = old->accuracy; + for(uint8_t i = 0; i < 24; i++) { + day.hImport[i] = old->hImport[i]; + day.hExport[i] = old->hExport[i]; + } + + ret = setDayData(day); + } file.close(); - ret = setDayData(*day); } if(LittleFS.exists(FILE_MONTHPLOT)) { File file = LittleFS.open(FILE_MONTHPLOT, "r"); char buf[file.size()]; file.readBytes(buf, file.size()); - MonthDataPoints* month = (MonthDataPoints*) buf; + if(buf[0] > 6) { + MonthDataPoints* month = (MonthDataPoints*) buf; + ret &= setMonthData(*month); + } else { + MonthDataPoints6* old = (MonthDataPoints6*) buf; + MonthDataPoints month = { old->version }; + month.lastMeterReadTime = old->lastMeterReadTime; + month.activeImport = old->activeImport; + month.activeExport = old->activeExport; + month.accuracy = old->accuracy; + for(uint8_t i = 0; i < 31; i++) { + month.dImport[i] = old->dImport[i]; + month.dExport[i] = old->dExport[i]; + } + + ret &= setMonthData(month); + } file.close(); - ret = ret && setMonthData(*month); } return ret; @@ -431,12 +461,6 @@ MonthDataPoints AmsDataStorage::getMonthData() { } bool AmsDataStorage::setDayData(DayDataPoints& day) { - if(day.version > 2 && day.version < 6) { - uint32_t counters[2]; - memcpy((uint8_t*) counters, (uint8_t*) &day.activeImport, 8); - day.activeImport = counters[0]; - day.activeExport = counters[1]; - } if(day.version == 5 || day.version == 6) { this->day = day; this->day.version = 6; @@ -457,13 +481,6 @@ bool AmsDataStorage::setDayData(DayDataPoints& day) { } bool AmsDataStorage::setMonthData(MonthDataPoints& month) { - if(month.version > 3 && month.version < 7) { - uint32_t counters[2]; - memcpy((uint8_t*) counters, (uint8_t*) &month.activeImport, 8); - month.activeImport = counters[0]; - month.activeExport = counters[1]; - } - if(month.version == 6 || month.version == 7) { this->month = month; this->month.version = 7;