knx
ETS configurable knx-stack
memory.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include <stdint.h>
4 #include "save_restore.h"
5 #include "platform.h"
6 #include "device_object.h"
7 #include "table_object.h"
8 
9 #define MAXSAVE 5
10 #define MAXTABLEOBJ 4
11 
12 #ifndef KNX_FLASH_SIZE
13  #define KNX_FLASH_SIZE 1024
14 #endif
15 
17 {
18  public:
20  MemoryBlock(uint8_t* address, size_t size)
21  : address(address), size(size) {}
22  uint8_t* address = nullptr;
23  size_t size = 0;
24  MemoryBlock* next = nullptr;
25 };
26 
28 {
31  FlashValid = 2
32 };
33 
34 typedef VersionCheckResult (*VersionCheckCallback)(uint16_t manufacturerId, uint8_t* hardwareType, uint16_t version);
35 
36 class Memory
37 {
38  friend class TableObject;
39 
40  public:
41  Memory(Platform& platform, DeviceObject& deviceObject);
42  virtual ~Memory();
43  void readMemory();
44  void writeMemory();
45  void saveMemory();
46  void clearMemory();
47  void addSaveRestore(SaveRestore* obj);
48  void addSaveRestore(TableObject* obj);
49  void loop();
50 
51  uint8_t* allocMemory(size_t size);
52  void freeMemory(uint8_t* ptr);
53  void writeMemory(uint32_t relativeAddress, size_t size, uint8_t* data);
54  void readMemory(uint32_t relativeAddress, size_t size, uint8_t* data);
55  uint8_t* toAbsolute(uint32_t relativeAddress);
56  uint32_t toRelative(uint8_t* absoluteAddress);
57 
60 
61  private:
62  void removeFromFreeList(MemoryBlock* block);
63  void addToUsedList(MemoryBlock* block);
64  void removeFromUsedList(MemoryBlock* block);
65  void addToFreeList(MemoryBlock* block);
66  uint16_t alignToPageSize(size_t size);
67  MemoryBlock* removeFromList(MemoryBlock* head, MemoryBlock* item);
68  MemoryBlock* findBlockInList(MemoryBlock* head, uint8_t* address);
69  void addNewUsedBlock(uint8_t* address, size_t size);
70 
71  void readEraseBlockToBuffer(uint32_t blockNum);
72  uint8_t* eraseBlockStart(uint32_t blockNum);
73  uint8_t* eraseBlockEnd(uint32_t blockNum);
74  void saveBufferdEraseBlock();
75 
76  VersionCheckCallback _versionCheckCallback = 0;
77  Platform& _platform;
78  DeviceObject& _deviceObject;
79  SaveRestore* _saveRestores[MAXSAVE] = {0};
80  TableObject* _tableObjects[MAXTABLEOBJ] = {0};
81  uint8_t _saveCount = 0;
82  uint8_t _tableObjCount = 0;
83  MemoryBlock* _freeList = nullptr;
84  MemoryBlock* _usedList = nullptr;
85  uint16_t _metadataSize = 6 + LEN_HARDWARE_TYPE; // accounting for 3x pushWord and pushByteArray of length LEN_HARDWARE_TYPE
86  unsigned long _saveTimeout = 0;
87 };
size_t size
Definition: memory.h:23
uint8_t * address
Definition: memory.h:22
MemoryBlock * next
Definition: memory.h:24
MemoryBlock()
Definition: memory.h:19
MemoryBlock(uint8_t *address, size_t size)
Definition: memory.h:20
Definition: memory.h:37
void clearMemory()
Definition: memory.cpp:203
virtual ~Memory()
Definition: memory.cpp:11
void freeMemory(uint8_t *ptr)
Definition: memory.cpp:279
uint8_t * toAbsolute(uint32_t relativeAddress)
Definition: memory.cpp:326
void loop()
Definition: memory.cpp:554
uint32_t toRelative(uint8_t *absoluteAddress)
Definition: memory.cpp:332
void saveMemory()
Definition: memory.cpp:198
VersionCheckCallback versionCheckCallback()
Definition: memory.cpp:549
void addSaveRestore(SaveRestore *obj)
Definition: memory.cpp:209
uint8_t * allocMemory(size_t size)
Definition: memory.cpp:230
void readMemory()
Definition: memory.cpp:14
Memory(Platform &platform, DeviceObject &deviceObject)
Definition: memory.cpp:7
void writeMemory()
Definition: memory.cpp:137
Interface for classes that can save and restore data from a buffer.
Definition: save_restore.h:8
This class provides common functionality for interface objects that are configured by ETS with MemorW...
Definition: table_object.h:13
uint8_t * data()
returns the internal data of the interface object.
VersionCheckResult
Definition: memory.h:28
@ FlashTablesInvalid
All table objects are invalid for this firmware, device object and saveRestores are OK.
Definition: memory.h:30
@ FlashAllInvalid
All flash content is not valid for this firmware, we delete it.
Definition: memory.h:29
@ FlashValid
Flash content is valid and will be used.
Definition: memory.h:31
VersionCheckResult(* VersionCheckCallback)(uint16_t manufacturerId, uint8_t *hardwareType, uint16_t version)
Definition: memory.h:34