70class StateWearLevelingSector :
public StateStorageInterface {
72 enum class State : uint8_t {
80 explicit StateWearLevelingSector(Storage *storage,
83 uint32_t availableSize);
84 ~StateWearLevelingSector();
86 bool loadPreambles(uint32_t storageStartingOffset, uint16_t size)
override;
87 void initSectionPreamble(SectionPreamble *preamble)
override;
88 bool writeSectionPreamble()
override;
89 bool initFromStorage()
override;
90 void deleteAll()
override;
91 bool prepareSaveState()
override;
92 bool prepareSizeCheck()
override;
93 bool prepareLoadState()
override;
94 bool readState(
unsigned char *,
int)
override;
95 bool writeState(
const unsigned char *,
int)
override;
96 bool finalizeSaveState()
override;
97 bool finalizeSizeCheck()
override;
98 bool finalizeLoadState()
override;
99 void notifyUpdate()
override;
102 virtual uint16_t getSectorSize()
const;
105 uint16_t getSizeValue(uint16_t availableSize)
override;
106 bool tryLoadPreamblesFrom(uint32_t offset);
107 bool isDataDifferent(uint32_t address,
const uint8_t *data, uint32_t size);
108 int getSlotSize()
const;
109 uint32_t getFirstSlotAddress()
const;
110 uint32_t getNextSlotAddress(uint32_t slotAddress)
const;
111 uint16_t slotSize()
const;
112 uint32_t updateStateEntryAddress();
113 uint32_t sectionOffset = 0;
114 uint32_t availableSize;
115 uint16_t elementStateSize = 0xFFFF;
116 uint16_t stateSlotNewSize = 0;
117 uint32_t currentStateBufferOffset = 0;
119 bool elementStateCrcCValid =
false;
120 bool storageStateOk =
false;
121 bool initDone =
false;
122 int repeatBeforeSwitchToAnotherSlot = 0;
124 uint32_t currentSlotAddress = 0;
125 uint32_t lastStoredSlotAddress = 0;
126 uint32_t lastValidAddress = 0;
127 uint8_t *dataBuffer =
nullptr;
129 State state = State::NONE;