mirror of
				https://github.com/thelsing/knx.git
				synced 2025-10-26 10:26:25 +01:00 
			
		
		
		
	-add saveLength to SaveRestore
-undo split of Restore from SaveRestore -add some dynamic memory management to memory-class
This commit is contained in:
		
							parent
							
								
									2770f5eaa9
								
							
						
					
					
						commit
						8421279d53
					
				| @ -78,6 +78,7 @@ | ||||
|     <ClInclude Include="..\src\knx\association_table_object.h" /> | ||||
|     <ClInclude Include="..\src\knx\bau.h" /> | ||||
|     <ClInclude Include="..\src\knx\bau07B0.h" /> | ||||
|     <ClInclude Include="..\src\knx\bau27B0.h" /> | ||||
|     <ClInclude Include="..\src\knx\bau57B0.h" /> | ||||
|     <ClInclude Include="..\src\knx\bau_systemB.h" /> | ||||
|     <ClInclude Include="..\src\knx\bits.h" /> | ||||
| @ -98,6 +99,9 @@ | ||||
|     <ClInclude Include="..\src\knx\npdu.h" /> | ||||
|     <ClInclude Include="..\src\knx\platform.h" /> | ||||
|     <ClInclude Include="..\src\knx\property_types.h" /> | ||||
|     <ClInclude Include="..\src\knx\rf_data_link_layer.h" /> | ||||
|     <ClInclude Include="..\src\knx\rf_medium_object.h" /> | ||||
|     <ClInclude Include="..\src\knx\rf_physical_layer.h" /> | ||||
|     <ClInclude Include="..\src\knx\save_restore.h" /> | ||||
|     <ClInclude Include="..\src\knx\table_object.h" /> | ||||
|     <ClInclude Include="..\src\knx\tpdu.h" /> | ||||
| @ -121,6 +125,7 @@ | ||||
|     <ClCompile Include="..\src\knx\association_table_object.cpp" /> | ||||
|     <ClCompile Include="..\src\knx\bau.cpp" /> | ||||
|     <ClCompile Include="..\src\knx\bau07B0.cpp" /> | ||||
|     <ClCompile Include="..\src\knx\bau27B0.cpp" /> | ||||
|     <ClCompile Include="..\src\knx\bau57B0.cpp" /> | ||||
|     <ClCompile Include="..\src\knx\bau_systemB.cpp" /> | ||||
|     <ClCompile Include="..\src\knx\bits.cpp" /> | ||||
| @ -139,6 +144,9 @@ | ||||
|     <ClCompile Include="..\src\knx\network_layer.cpp" /> | ||||
|     <ClCompile Include="..\src\knx\npdu.cpp" /> | ||||
|     <ClCompile Include="..\src\knx\platform.cpp" /> | ||||
|     <ClCompile Include="..\src\knx\rf_data_link_layer.cpp" /> | ||||
|     <ClCompile Include="..\src\knx\rf_medium_object.cpp" /> | ||||
|     <ClCompile Include="..\src\knx\rf_physical_layer.cpp" /> | ||||
|     <ClCompile Include="..\src\knx\table_object.cpp" /> | ||||
|     <ClCompile Include="..\src\knx\tpdu.cpp" /> | ||||
|     <ClCompile Include="..\src\knx\tpuart_data_link_layer.cpp" /> | ||||
|  | ||||
| @ -137,6 +137,18 @@ | ||||
|     <ClInclude Include="..\src\knx\knx_value.h"> | ||||
|       <Filter>Header files\knx</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="..\src\knx\bau27B0.h"> | ||||
|       <Filter>Header files\knx</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="..\src\knx\rf_data_link_layer.h"> | ||||
|       <Filter>Header files\knx</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="..\src\knx\rf_medium_object.h"> | ||||
|       <Filter>Header files\knx</Filter> | ||||
|     </ClInclude> | ||||
|     <ClInclude Include="..\src\knx\rf_physical_layer.h"> | ||||
|       <Filter>Header files\knx</Filter> | ||||
|     </ClInclude> | ||||
|   </ItemGroup> | ||||
|   <ItemGroup> | ||||
|     <ClCompile Include="..\src\knx\address_table_object.cpp"> | ||||
| @ -235,5 +247,17 @@ | ||||
|     <ClCompile Include="..\src\knx\knx_value.cpp"> | ||||
|       <Filter>Source files\knx</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="..\src\knx\bau27B0.cpp"> | ||||
|       <Filter>Source files\knx</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="..\src\knx\rf_data_link_layer.cpp"> | ||||
|       <Filter>Source files\knx</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="..\src\knx\rf_medium_object.cpp"> | ||||
|       <Filter>Source files\knx</Filter> | ||||
|     </ClCompile> | ||||
|     <ClCompile Include="..\src\knx\rf_physical_layer.cpp"> | ||||
|       <Filter>Source files\knx</Filter> | ||||
|     </ClCompile> | ||||
|   </ItemGroup> | ||||
| </Project> | ||||
| @ -50,11 +50,6 @@ uint16_t AddressTableObject::getTsap(uint16_t addr) | ||||
| 
 | ||||
| #pragma region SaveRestore | ||||
| 
 | ||||
| uint8_t* AddressTableObject::save(uint8_t* buffer) | ||||
| { | ||||
|     return TableObject::save(buffer); | ||||
| } | ||||
| 
 | ||||
| uint8_t* AddressTableObject::restore(uint8_t* buffer) | ||||
| { | ||||
|     buffer = TableObject::restore(buffer); | ||||
|  | ||||
| @ -19,8 +19,8 @@ class AddressTableObject : public TableObject | ||||
|      */ | ||||
|     AddressTableObject(Memory& memory); | ||||
|     void readProperty(PropertyID id, uint32_t start, uint32_t& count, uint8_t* data); | ||||
|     uint8_t* save(uint8_t* buffer); | ||||
|     uint8_t* restore(uint8_t* buffer); | ||||
| 
 | ||||
|     /**
 | ||||
|      * returns the number of group addresses of the object. | ||||
|      */ | ||||
|  | ||||
| @ -110,3 +110,7 @@ PropertyDescription* ApplicationProgramObject::propertyDescriptions() | ||||
|     return _propertyDescriptions; | ||||
| } | ||||
| 
 | ||||
| uint16_t ApplicationProgramObject::saveSize() | ||||
| { | ||||
|     return TableObject::saveSize() + 5; | ||||
| } | ||||
| @ -15,6 +15,7 @@ class ApplicationProgramObject : public TableObject | ||||
|     uint32_t getInt(uint32_t addr); | ||||
|     uint8_t* save(uint8_t* buffer); | ||||
|     uint8_t* restore(uint8_t* buffer); | ||||
|     uint16_t saveSize(); | ||||
| 
 | ||||
|   protected: | ||||
|     uint8_t propertyCount(); | ||||
|  | ||||
| @ -44,11 +44,6 @@ uint16_t AssociationTableObject::getASAP(uint16_t idx) | ||||
|     return ntohs(_tableData[2 * idx + 2]); | ||||
| } | ||||
| 
 | ||||
| uint8_t* AssociationTableObject::save(uint8_t* buffer) | ||||
| { | ||||
|     return TableObject::save(buffer); | ||||
| } | ||||
| 
 | ||||
| uint8_t* AssociationTableObject::restore(uint8_t* buffer) | ||||
| { | ||||
|     buffer = TableObject::restore(buffer); | ||||
|  | ||||
| @ -8,7 +8,6 @@ class AssociationTableObject : public TableObject | ||||
|     AssociationTableObject(Memory& memory); | ||||
|     void readProperty(PropertyID id, uint32_t start, uint32_t& count, uint8_t* data); | ||||
| 
 | ||||
|     uint8_t* save(uint8_t* buffer); | ||||
|     uint8_t* restore(uint8_t* buffer); | ||||
| 
 | ||||
|     int32_t translateAsap(uint16_t asap); | ||||
|  | ||||
| @ -11,7 +11,7 @@ enum NmReadSerialNumberType | ||||
|     NM_Read_SerialNumber_By_ManufacturerSpecific = 0xFE, | ||||
| }; | ||||
| 
 | ||||
| BauSystemB::BauSystemB(Platform& platform): _memory(platform), _addrTable(_memory), | ||||
| BauSystemB::BauSystemB(Platform& platform): _memory(platform, _deviceObj), _addrTable(_memory), | ||||
|     _assocTable(_memory), _groupObjTable(_memory), _appProgram(_memory), | ||||
|     _platform(platform), _appLayer(_assocTable, *this), | ||||
|     _transLayer(_appLayer, _addrTable), _netLayer(_transLayer) | ||||
|  | ||||
| @ -295,3 +295,8 @@ PropertyDescription* DeviceObject::propertyDescriptions() | ||||
| { | ||||
|     return _propertyDescriptions; | ||||
| } | ||||
| 
 | ||||
| uint16_t DeviceObject::saveSize() | ||||
| { | ||||
|     return 4; | ||||
| } | ||||
| @ -10,6 +10,7 @@ public: | ||||
|     uint8_t propertySize(PropertyID id); | ||||
|     uint8_t* save(uint8_t* buffer); | ||||
|     uint8_t* restore(uint8_t* buffer); | ||||
|     uint16_t saveSize(); | ||||
|     void readPropertyDescription(uint8_t propertyId, uint8_t& propertyIndex, bool& writeEnable, uint8_t& type, uint16_t& numberOfElements, uint8_t& access); | ||||
| 
 | ||||
| 
 | ||||
|  | ||||
| @ -41,13 +41,6 @@ GroupObject& GroupObjectTableObject::get(uint16_t asap) | ||||
|     return _groupObjects[asap - 1]; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| uint8_t* GroupObjectTableObject::save(uint8_t* buffer) | ||||
| { | ||||
|     return TableObject::save(buffer); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| uint8_t* GroupObjectTableObject::restore(uint8_t* buffer) | ||||
| { | ||||
|     buffer = TableObject::restore(buffer); | ||||
|  | ||||
| @ -16,11 +16,10 @@ class GroupObjectTableObject : public TableObject | ||||
|     GroupObject& nextUpdatedObject(bool& valid); | ||||
|     void groupObjects(GroupObject* objs, uint16_t size); | ||||
| 
 | ||||
|     virtual uint8_t* save(uint8_t* buffer); | ||||
|     virtual uint8_t* restore(uint8_t* buffer); | ||||
|     uint8_t* restore(uint8_t* buffer); | ||||
| 
 | ||||
|   protected: | ||||
|     virtual void beforeStateChange(LoadState& newState); | ||||
|     void beforeStateChange(LoadState& newState); | ||||
|     uint8_t propertyCount(); | ||||
|     PropertyDescription* propertyDescriptions(); | ||||
| 
 | ||||
|  | ||||
| @ -320,4 +320,9 @@ uint8_t IpParameterObject::propertyCount() | ||||
| PropertyDescription* IpParameterObject::propertyDescriptions() | ||||
| { | ||||
|     return _propertyDescriptions; | ||||
| } | ||||
| } | ||||
| 
 | ||||
| uint16_t IpParameterObject::saveSize() | ||||
| { | ||||
|     return 51; | ||||
| } | ||||
|  | ||||
| @ -14,6 +14,7 @@ class IpParameterObject : public InterfaceObject | ||||
| 
 | ||||
|     uint8_t* save(uint8_t* buffer); | ||||
|     uint8_t* restore(uint8_t* buffer); | ||||
|     uint16_t saveSize(); | ||||
| 
 | ||||
|     uint32_t multicastAddress() const; | ||||
|     uint8_t ttl() const { return _ttl; } | ||||
|  | ||||
| @ -1,7 +1,9 @@ | ||||
| #include "memory.h" | ||||
| #include <string.h> | ||||
| #include "bits.h" | ||||
| 
 | ||||
| Memory::Memory(Platform & platform): _platform(platform) | ||||
| Memory::Memory(Platform& platform, DeviceObject& deviceObject) | ||||
|     : _platform(platform), _deviceObject(deviceObject) | ||||
| { | ||||
| } | ||||
| 
 | ||||
| @ -34,18 +36,16 @@ void Memory::readMemory() | ||||
| 
 | ||||
| void Memory::writeMemory() | ||||
| { | ||||
|     _data[0] = 0x00; | ||||
|     _data[1] = 0xAD; | ||||
|     _data[2] = 0xAF; | ||||
|     _data[3] = 0xFE; | ||||
|     uint8_t* buffer = _data; | ||||
|     buffer = pushWord(_deviceObject.manufacturerId(), buffer); | ||||
|     buffer = pushByteArray(_deviceObject.hardwareType(), 6, buffer); | ||||
|     buffer = pushWord(_deviceObject.version(), buffer); | ||||
| 
 | ||||
|     uint8_t* buffer = _data + 4; | ||||
|     int size = _saveCount; | ||||
|     for (int i = 0; i < size; i++) | ||||
|     { | ||||
|         SaveRestore* saveRestore = dynamic_cast<SaveRestore*>(_saveRestores[i]); | ||||
|         if(saveRestore) | ||||
|             buffer = saveRestore->save(buffer); | ||||
|         // TODO: Hande TableObject correctly, i.e. save the size of the buffer somewhere to, so that we can rebuild the usedList and freeList
 | ||||
|         buffer = _saveRestores[i]->save(buffer); | ||||
|     } | ||||
|     _platform.commitToEeprom(); | ||||
|     _modified = false; | ||||
| @ -63,13 +63,71 @@ void Memory::addSaveRestore(SaveRestore * obj) | ||||
| 
 | ||||
| uint8_t* Memory::allocMemory(size_t size) | ||||
| { | ||||
|     return _platform.allocMemory(size); | ||||
|     // always allocate aligned to 32 bit
 | ||||
|     size = (size + 3) & ~0x3; | ||||
|      | ||||
|     MemoryBlock* freeBlock = _freeList; | ||||
|     MemoryBlock* blockToUse = 0; | ||||
|      | ||||
|     // find the smallest possible block that is big enough
 | ||||
|     while (freeBlock) | ||||
|     { | ||||
|         if (freeBlock->size >= size) | ||||
|         { | ||||
|             if (blockToUse != 0 && (blockToUse->size - size) > (freeBlock->size - size)) | ||||
|                 blockToUse = freeBlock; | ||||
|         } | ||||
|         freeBlock = freeBlock->next; | ||||
|     } | ||||
|     if (!blockToUse) | ||||
|     { | ||||
|         println("No available non volatile memory!"); | ||||
|         _platform.fatalError(); | ||||
|     } | ||||
| 
 | ||||
|     if (blockToUse->size == size) | ||||
|     { | ||||
|         // use whole block
 | ||||
|         removeFromFreeList(blockToUse); | ||||
|         addToUsedList(blockToUse); | ||||
|         return blockToUse->address; | ||||
|     } | ||||
|     else | ||||
|     { | ||||
|         // split block
 | ||||
|         MemoryBlock* newBlock = new MemoryBlock(); | ||||
|         newBlock->address = blockToUse->address; | ||||
|         newBlock->size = size; | ||||
|         addToUsedList(newBlock); | ||||
| 
 | ||||
|         blockToUse->address += size; | ||||
|         blockToUse->size -= size; | ||||
| 
 | ||||
|         return newBlock->address; | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| void Memory::freeMemory(uint8_t* ptr) | ||||
| { | ||||
|     return _platform.freeMemory(ptr); | ||||
|     MemoryBlock* block = _usedList; | ||||
|     MemoryBlock* found = 0; | ||||
|     while (_usedList) | ||||
|     { | ||||
|         if (block->address == ptr) | ||||
|         { | ||||
|             found = block; | ||||
|             break; | ||||
|         } | ||||
|         block = block->next; | ||||
|     } | ||||
|     if(!found) | ||||
|     { | ||||
|         println("freeMemory for not used pointer called"); | ||||
|         _platform.fatalError(); | ||||
|     } | ||||
|     removeFromUsedList(block); | ||||
|     addToFreeList(block); | ||||
| } | ||||
| 
 | ||||
| void Memory::writeMemory(uint32_t relativeAddress, size_t size, uint8_t* data) | ||||
| @ -81,11 +139,110 @@ void Memory::writeMemory(uint32_t relativeAddress, size_t size, uint8_t* data) | ||||
| 
 | ||||
| uint8_t* Memory::toAbsolute(uint32_t relativeAddress) | ||||
| { | ||||
|     return _platform.memoryReference() + (ptrdiff_t)relativeAddress; | ||||
|     return _data + (ptrdiff_t)relativeAddress; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| uint32_t Memory::toRelative(uint8_t* absoluteAddress) | ||||
| { | ||||
|     return absoluteAddress - _platform.memoryReference(); | ||||
|     return absoluteAddress - _data; | ||||
| } | ||||
| 
 | ||||
| MemoryBlock* Memory::removeFromList(MemoryBlock* head, MemoryBlock* item) | ||||
| { | ||||
|     if (head == item) | ||||
|     { | ||||
|         MemoryBlock* newHead = head->next; | ||||
|         head->next = 0; | ||||
|         return newHead; | ||||
|     } | ||||
| 
 | ||||
|     if (!head || !item) | ||||
|     { | ||||
|         println("invalid parameters of Memory::removeFromList"); | ||||
|         _platform.fatalError(); | ||||
|     } | ||||
| 
 | ||||
|     bool found = false; | ||||
|     while (head) | ||||
|     { | ||||
|         if (head->next == item) | ||||
|         { | ||||
|             found = true; | ||||
|             head->next = item->next; | ||||
|             break; | ||||
|         } | ||||
|         head = head->next; | ||||
|     } | ||||
| 
 | ||||
|     if (!found) | ||||
|     { | ||||
|         println("tried to remove block from list not in it"); | ||||
|         _platform.fatalError(); | ||||
|     } | ||||
|     item->next = 0; | ||||
|     return head; | ||||
| } | ||||
| 
 | ||||
| void Memory::removeFromFreeList(MemoryBlock* block) | ||||
| { | ||||
|     _freeList = removeFromList(_freeList, block); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| void Memory::removeFromUsedList(MemoryBlock* block) | ||||
| { | ||||
|     _usedList = removeFromList(_usedList, block); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| void Memory::addToUsedList(MemoryBlock* block) | ||||
| { | ||||
|     block->next = _usedList; | ||||
|     _usedList = block; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| void Memory::addToFreeList(MemoryBlock* block) | ||||
| { | ||||
|     if (_freeList == 0) | ||||
|     { | ||||
|         _freeList = block; | ||||
|         return; | ||||
|     } | ||||
| 
 | ||||
|     // first insert free block in list
 | ||||
|     MemoryBlock* current = _freeList; | ||||
|     while (current) | ||||
|     { | ||||
|         if (current->address <= block->address && (block->next == 0 || block->address < current->next->address)) | ||||
|         { | ||||
|             block->next = current->next; | ||||
|             current->next = block; | ||||
|             break; | ||||
|         } | ||||
|         current = current->next; | ||||
|     } | ||||
|     // now check if we can merge the blocks
 | ||||
|     // first current an block
 | ||||
|     if ((current->address + current->size) == block->address) | ||||
|     { | ||||
|         current->size += block->size; | ||||
|         current->next = block->next; | ||||
|         delete block; | ||||
|         // check further if now current can be merged with current->next
 | ||||
|         block = current; | ||||
|     } | ||||
| 
 | ||||
|     // if block is the last one, we are done 
 | ||||
|     if (block->next == 0) | ||||
|         return; | ||||
| 
 | ||||
|     // now check block and block->next
 | ||||
|     if ((block->address + block->size) == block->next->address) | ||||
|     { | ||||
|         block->size += block->next->size; | ||||
|         block->next = block->next->next; | ||||
|         delete block->next; | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -3,13 +3,21 @@ | ||||
| #include <stdint.h> | ||||
| #include "save_restore.h" | ||||
| #include "platform.h" | ||||
| #include "device_object.h" | ||||
| 
 | ||||
| #define MAXSAVE 10 | ||||
| 
 | ||||
| typedef struct _memoryBlock | ||||
| { | ||||
|     uint8_t* address; | ||||
|     size_t size; | ||||
|     struct _memoryBlock* next; | ||||
| } MemoryBlock; | ||||
| 
 | ||||
| class Memory | ||||
| { | ||||
| public: | ||||
|     Memory(Platform& platform); | ||||
|     Memory(Platform& platform, DeviceObject& deviceObject); | ||||
|     void memoryModified(); | ||||
|     bool isMemoryModified(); | ||||
|     void readMemory(); | ||||
| @ -23,9 +31,18 @@ public: | ||||
|     uint32_t toRelative(uint8_t* absoluteAddress); | ||||
| 
 | ||||
|   private: | ||||
|     void removeFromFreeList(MemoryBlock* block); | ||||
|     void addToUsedList(MemoryBlock* block); | ||||
|     void removeFromUsedList(MemoryBlock* block); | ||||
|     void addToFreeList(MemoryBlock* block); | ||||
|     MemoryBlock* removeFromList(MemoryBlock* head, MemoryBlock* item); | ||||
| 
 | ||||
|     Platform& _platform; | ||||
|     DeviceObject& _deviceObject; | ||||
|     bool _modified = false; | ||||
|     Restore* _saveRestores[MAXSAVE] = {0}; | ||||
|     SaveRestore* _saveRestores[MAXSAVE] = {0}; | ||||
|     int _saveCount = 0; | ||||
|     uint8_t* _data = 0; | ||||
|     MemoryBlock* _freeList = 0; | ||||
|     MemoryBlock* _usedList = 0; | ||||
| }; | ||||
|  | ||||
| @ -8,19 +8,23 @@ class Platform | ||||
| { | ||||
|   public: | ||||
|     Platform(); | ||||
|     // ip config
 | ||||
|     virtual uint32_t currentIpAddress() = 0; | ||||
|     virtual uint32_t currentSubnetMask() = 0; | ||||
|     virtual uint32_t currentDefaultGateway() = 0; | ||||
|     virtual void macAddress(uint8_t* data) = 0; | ||||
| 
 | ||||
|     // basic stuff
 | ||||
|     virtual void restart() = 0; | ||||
|     virtual void fatalError() = 0; | ||||
| 
 | ||||
|     //multicast socket
 | ||||
|     virtual void setupMultiCast(uint32_t addr, uint16_t port) = 0; | ||||
|     virtual void closeMultiCast() = 0; | ||||
|     virtual bool sendBytes(uint8_t* buffer, uint16_t len) = 0; | ||||
|     virtual int readBytes(uint8_t* buffer, uint16_t maxLen) = 0; | ||||
| 
 | ||||
|      | ||||
|     //UART
 | ||||
|     virtual void setupUart() = 0; | ||||
|     virtual void closeUart() = 0; | ||||
|     virtual int uartAvailable() = 0; | ||||
| @ -29,10 +33,19 @@ class Platform | ||||
|     virtual int readUart() = 0; | ||||
|     virtual size_t readBytesUart(uint8_t* buffer, size_t length) = 0; | ||||
| 
 | ||||
|     // SPI
 | ||||
|     virtual void setupSpi() = 0; | ||||
|     virtual void closeSpi() = 0; | ||||
|     virtual int readWriteSpi (uint8_t *data, size_t len) = 0; | ||||
| 
 | ||||
| #if 0 | ||||
|     // Flash memory
 | ||||
|     virtual size_t flashEraseBlockSize(); // in pages
 | ||||
|     virtual size_t flashPageSize();       // in bytes
 | ||||
|     virtual uint8_t* userFlashStart();   // start of user flash aligned to start of an erase block
 | ||||
|     virtual size_t userFlashSizeEraseBlocks(); // in eraseBlocks
 | ||||
|     virtual void flashErase(uint16_t eraseBlockNum); //relativ to userFlashStart
 | ||||
|     virtual void flashWritePage(uint16_t pageNumber, uint8_t* data); //write a single page to flash (pageNumber relative to userFashStart
 | ||||
| #endif | ||||
|     virtual uint8_t* getEepromBuffer(uint16_t size) = 0; | ||||
|     virtual void commitToEeprom() = 0; | ||||
| 
 | ||||
|  | ||||
| @ -1,21 +0,0 @@ | ||||
| #pragma once | ||||
| 
 | ||||
| #pragma once | ||||
| #include <stdint.h> | ||||
| 
 | ||||
| /**
 | ||||
|  * Interface for classes that can restore data from a buffer.  | ||||
|  */ | ||||
| class Restore | ||||
| { | ||||
|   public: | ||||
|     /**
 | ||||
|      * This method is called when the object should restore its state from the buffer. | ||||
|      *   | ||||
|      * @param buffer The buffer the object should restore its state from. | ||||
|      *  | ||||
|      * @return The buffer plus the size of the object state. The next object will use this value as  | ||||
|      * the start of its buffer. | ||||
|      */ | ||||
|     virtual uint8_t* restore(uint8_t* buffer) = 0; | ||||
| }; | ||||
| @ -98,6 +98,11 @@ uint8_t* RfMediumObject::restore(uint8_t* buffer) | ||||
|     return buffer; | ||||
| } | ||||
| 
 | ||||
| uint16_t RfMediumObject::saveSize() | ||||
| { | ||||
|     return 6; | ||||
| } | ||||
| 
 | ||||
| uint8_t* RfMediumObject::rfDomainAddress() | ||||
| { | ||||
|     return _rfDomainAddress; | ||||
|  | ||||
| @ -10,6 +10,7 @@ public: | ||||
|     uint8_t propertySize(PropertyID id); | ||||
|     uint8_t* save(uint8_t* buffer); | ||||
|     uint8_t* restore(uint8_t* buffer); | ||||
|     uint16_t saveSize(); | ||||
|     void readPropertyDescription(uint8_t propertyId, uint8_t& propertyIndex, bool& writeEnable, uint8_t& type, uint16_t& numberOfElements, uint8_t& access); | ||||
| 
 | ||||
|     uint8_t* rfDomainAddress(); | ||||
| @ -22,6 +23,4 @@ private: | ||||
|     uint8_t _rfDomainAddress[6] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; // see KNX RF S-Mode AN160 p.11
 | ||||
|     uint8_t _rfDiagSourceAddressFilterTable[24] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,}; | ||||
|     uint8_t _rfDiagLinkBudgetTable[24] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,}; | ||||
| 
 | ||||
| 
 | ||||
| }; | ||||
| @ -1,11 +1,10 @@ | ||||
| #pragma once | ||||
| #include <stdint.h> | ||||
| #include "restore.h" | ||||
| 
 | ||||
| /**
 | ||||
|  * Interface for classes that can save and restore data from a buffer.  | ||||
|  */ | ||||
| class SaveRestore : public Restore | ||||
| class SaveRestore | ||||
| { | ||||
|   public: | ||||
|     /**
 | ||||
| @ -17,4 +16,17 @@ class SaveRestore : public Restore | ||||
|      * the start of its buffer. | ||||
|      */ | ||||
|     virtual uint8_t* save(uint8_t* buffer) = 0; | ||||
|     /**
 | ||||
|      * This method is called when the object should restore its state from the buffer. | ||||
|      *   | ||||
|      * @param buffer The buffer the object should restore its state from. | ||||
|      *  | ||||
|      * @return The buffer plus the size of the object state. The next object will use this value as  | ||||
|      * the start of its buffer. | ||||
|      */ | ||||
|     virtual uint8_t* restore(uint8_t* buffer) = 0; | ||||
|     /**
 | ||||
|      * @return The number of byte the object needs to save its state.  | ||||
|      */ | ||||
|     virtual uint16_t saveSize() = 0; | ||||
| }; | ||||
| @ -86,8 +86,11 @@ uint8_t* TableObject::save(uint8_t* buffer) | ||||
| { | ||||
|     buffer = pushByte(_state, buffer); | ||||
|     buffer = pushByte(_errorCode, buffer); | ||||
|     buffer = pushInt(_size, buffer); | ||||
|     buffer = pushByteArray(_data, _size, buffer); | ||||
| 
 | ||||
|     if (_data) | ||||
|         buffer = pushInt(_memory.toRelative(_data), buffer); | ||||
|     else | ||||
|         buffer = pushInt(0, buffer); | ||||
| 
 | ||||
|     return buffer; | ||||
| } | ||||
| @ -102,18 +105,14 @@ uint8_t* TableObject::restore(uint8_t* buffer) | ||||
|     _state = (LoadState)state; | ||||
|     _errorCode = (ErrorCode)errorCode; | ||||
| 
 | ||||
|     buffer = popInt(_size, buffer); | ||||
|     uint32_t relativeAddress = 0; | ||||
|     buffer = popInt(relativeAddress, buffer); | ||||
| 
 | ||||
|     if (_data) | ||||
|         _memory.freeMemory(_data); | ||||
| 
 | ||||
|     if (_size > 0) | ||||
|         _data = _memory.allocMemory(_size); | ||||
|     if (relativeAddress != 0) | ||||
|         _data = _memory.toAbsolute(relativeAddress); | ||||
|     else | ||||
|         _data = 0; | ||||
| 
 | ||||
|     buffer = popByteArray(_data, _size, buffer); | ||||
| 
 | ||||
|     return buffer; | ||||
| } | ||||
| 
 | ||||
| @ -128,7 +127,6 @@ bool TableObject::allocTable(uint32_t size, bool doFill, uint8_t fillByte) | ||||
|     { | ||||
|         _memory.freeMemory(_data); | ||||
|         _data = 0; | ||||
|         _size = 0; | ||||
|     } | ||||
| 
 | ||||
|     if (size == 0) | ||||
| @ -138,8 +136,6 @@ bool TableObject::allocTable(uint32_t size, bool doFill, uint8_t fillByte) | ||||
|     if (!_data) | ||||
|         return false; | ||||
| 
 | ||||
|     _size = size; | ||||
| 
 | ||||
|     if (doFill) | ||||
|         memset(_data, fillByte, size); | ||||
| 
 | ||||
| @ -277,12 +273,12 @@ uint8_t* TableObject::data() | ||||
|     return _data; | ||||
| } | ||||
| 
 | ||||
| uint32_t TableObject::size() | ||||
| { | ||||
|     return _size; | ||||
| } | ||||
| 
 | ||||
| void TableObject::errorCode(ErrorCode errorCode) | ||||
| { | ||||
|     _errorCode = errorCode; | ||||
| } | ||||
| } | ||||
| 
 | ||||
| uint16_t TableObject::saveSize() | ||||
| { | ||||
|     return 6; | ||||
| } | ||||
|  | ||||
| @ -27,6 +27,7 @@ public: | ||||
|     LoadState loadState(); | ||||
|     virtual uint8_t* save(uint8_t* buffer); | ||||
|     virtual uint8_t* restore(uint8_t* buffer); | ||||
|     uint16_t saveSize(); | ||||
| protected: | ||||
|     /**
 | ||||
|      * This method is called before the interface object enters a new ::LoadState. | ||||
| @ -40,10 +41,6 @@ protected: | ||||
|      * must not be freed. | ||||
|      */ | ||||
|     uint8_t* data(); | ||||
|     /**
 | ||||
|      * returns the size of the internal data of the interface object int byte. | ||||
|      */ | ||||
|     uint32_t size(); | ||||
|     /**
 | ||||
|      * Set the reason for a state change failure. | ||||
|      */ | ||||
| @ -69,6 +66,5 @@ protected: | ||||
|     LoadState _state = LS_UNLOADED; | ||||
|     Memory& _memory; | ||||
|     uint8_t *_data = 0; | ||||
|     uint32_t _size = 0; | ||||
|     ErrorCode _errorCode = E_NO_FAULT; | ||||
| }; | ||||
|  | ||||
| @ -285,6 +285,7 @@ template <class P, class B> class KnxFacade : private SaveRestore | ||||
|     saveRestoreCallback _restoreCallback = 0; | ||||
|     bool _toogleProgMode = false; | ||||
|     bool _progLedState = false; | ||||
|     uint16_t _saveSize = 0; | ||||
| 
 | ||||
|     uint8_t* save(uint8_t* buffer) | ||||
|     { | ||||
| @ -301,6 +302,16 @@ template <class P, class B> class KnxFacade : private SaveRestore | ||||
| 
 | ||||
|         return buffer; | ||||
|     } | ||||
| 
 | ||||
|     uint16_t saveSize() | ||||
|     { | ||||
|         return _saveSize; | ||||
|     } | ||||
| 
 | ||||
|     void saveSize(uint16_t size) | ||||
|     { | ||||
|         _saveSize = size; | ||||
|     } | ||||
| }; | ||||
| 
 | ||||
| #ifdef ARDUINO_ARCH_SAMD | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user