From 6a1b70c5580cef160e6446a0a152028a29d4bdc5 Mon Sep 17 00:00:00 2001 From: Ing-Dom Date: Fri, 20 Jan 2023 15:18:41 +0100 Subject: [PATCH] add commitNonVolatileMemory overload to batch write chars n times to flash --- src/knx/platform.cpp | 31 +++++++++++++++++++++++++++++++ src/knx/platform.h | 1 + 2 files changed, 32 insertions(+) diff --git a/src/knx/platform.cpp b/src/knx/platform.cpp index 3c2a74e..241dd14 100644 --- a/src/knx/platform.cpp +++ b/src/knx/platform.cpp @@ -201,6 +201,37 @@ uint32_t Platform::writeNonVolatileMemory(uint32_t relativeAddress, uint8_t* buf } } +// writes value repeat times into flash starting at relativeAddress +// returns next free relativeAddress +uint32_t Platform::writeNonVolatileMemory(uint32_t relativeAddress, uint8_t value, size_t repeat) +{ + if(_memoryType == Flash) + { + while (repeat > 0) + { + loadEraseblockContaining(relativeAddress); + uint32_t start = _bufferedEraseblockNumber * (flashEraseBlockSize() * flashPageSize()); + uint32_t end = start + (flashEraseBlockSize() * flashPageSize()); + + uint32_t offset = relativeAddress - start; + uint32_t length = end - relativeAddress; + if(length > repeat) + length = repeat; + memset(_eraseblockBuffer + offset, value, length); + _bufferedEraseblockDirty = true; + + relativeAddress += length; + repeat -= length; + } + return relativeAddress; + } + else + { + memset(getEepromBuffer(KNX_FLASH_SIZE)+relativeAddress, value, repeat); + return relativeAddress+repeat; + } +} + void Platform::loadEraseblockContaining(uint32_t relativeAddress) { int32_t blockNum = getEraseBlockNumberOf(relativeAddress); diff --git a/src/knx/platform.h b/src/knx/platform.h index 21a2867..304e351 100644 --- a/src/knx/platform.h +++ b/src/knx/platform.h @@ -70,6 +70,7 @@ class Platform virtual void commitNonVolatileMemory(); // address is relative to start of nonvolatile memory virtual uint32_t writeNonVolatileMemory(uint32_t relativeAddress, uint8_t* buffer, size_t size); + virtual uint32_t writeNonVolatileMemory(uint32_t relativeAddress, uint8_t value, size_t repeat); NvMemoryType NonVolatileMemoryType(); void NonVolatileMemoryType(NvMemoryType type);