mirror of
https://github.com/thelsing/knx.git
synced 2024-12-18 19:08:18 +01:00
delegate memory management for knx tables to Platform class. Preallocate memory for them on linux.
This commit is contained in:
parent
bdaca43642
commit
bd93aa12fa
@ -5,7 +5,7 @@ cmake_minimum_required(VERSION 2.7)
|
|||||||
project(knx)
|
project(knx)
|
||||||
|
|
||||||
set(LIBRARIES_FROM_REFERENCES "")
|
set(LIBRARIES_FROM_REFERENCES "")
|
||||||
add_library(knx SHARED ../src/knx/address_table_object.cpp ../src/knx/apdu.cpp ../src/knx/application_layer.cpp ../src/knx/application_program_object.cpp ../src/knx/association_table_object.cpp ../src/knx/bau.cpp ../src/knx/bau07B0.cpp ../src/knx/bau57B0.cpp ../src/knx/bau_systemB.cpp ../src/knx/bits.cpp ../src/knx/cemi_frame.cpp ../src/knx/datapoint_types.cpp ../src/knx/data_link_layer.cpp ../src/knx/device_object.cpp ../src/knx/group_object.cpp ../src/knx/group_object_table_object.cpp ../src/knx/interface_object.cpp ../src/knx/ip_data_link_layer.cpp ../src/knx/ip_parameter_object.cpp ../src/knx/memory.cpp ../src/knx/network_layer.cpp ../src/knx/npdu.cpp ../src/knx/table_object.cpp ../src/knx/tpdu.cpp ../src/knx/tpuart_data_link_layer.cpp ../src/knx/transport_layer.cpp ../src/linux_platform.cpp knxmodule.cpp)
|
add_library(knx SHARED ../src/knx/address_table_object.cpp ../src/knx/apdu.cpp ../src/knx/application_layer.cpp ../src/knx/application_program_object.cpp ../src/knx/association_table_object.cpp ../src/knx/bau.cpp ../src/knx/bau07B0.cpp ../src/knx/bau57B0.cpp ../src/knx/bau_systemB.cpp ../src/knx/bits.cpp ../src/knx/cemi_frame.cpp ../src/knx/datapoint_types.cpp ../src/knx/data_link_layer.cpp ../src/knx/device_object.cpp ../src/knx/group_object.cpp ../src/knx/group_object_table_object.cpp ../src/knx/interface_object.cpp ../src/knx/ip_data_link_layer.cpp ../src/knx/ip_parameter_object.cpp ../src/knx/memory.cpp ../src/knx/network_layer.cpp ../src/knx/npdu.cpp ../src/knx/platform.cpp ../src/knx/table_object.cpp ../src/knx/tpdu.cpp ../src/knx/tpuart_data_link_layer.cpp ../src/knx/transport_layer.cpp ../src/linux_platform.cpp knxmodule.cpp)
|
||||||
target_link_libraries(knx python3.5m "${LIBRARIES_FROM_REFERENCES}")
|
target_link_libraries(knx python3.5m "${LIBRARIES_FROM_REFERENCES}")
|
||||||
include_directories(/usr/include/python3.5m ../src)
|
include_directories(/usr/include/python3.5m ../src)
|
||||||
SET_TARGET_PROPERTIES(knx PROPERTIES PREFIX "")
|
SET_TARGET_PROPERTIES(knx PROPERTIES PREFIX "")
|
||||||
|
@ -7,5 +7,5 @@ project(knx)
|
|||||||
set(LIBRARIES_FROM_REFERENCES "")
|
set(LIBRARIES_FROM_REFERENCES "")
|
||||||
add_library(knx SHARED ../src/knx/address_table_object.cpp ../src/knx/apdu.cpp ../src/knx/application_layer.cpp ../src/knx/application_program_object.cpp ../src/knx/association_table_object.cpp ../src/knx/bau.cpp ../src/knx/bau07B0.cpp ../src/knx/bau57B0.cpp ../src/knx/bau_systemB.cpp ../src/knx/bits.cpp ../src/knx/cemi_frame.cpp ../src/knx/datapoint_types.cpp ../src/knx/data_link_layer.cpp ../src/knx/device_object.cpp ../src/knx/group_object.cpp ../src/knx/group_object_table_object.cpp ../src/knx/interface_object.cpp ../src/knx/ip_data_link_layer.cpp ../src/knx/ip_parameter_object.cpp ../src/knx/memory.cpp ../src/knx/network_layer.cpp ../src/knx/npdu.cpp ../src/knx/table_object.cpp ../src/knx/tpdu.cpp ../src/knx/tpuart_data_link_layer.cpp ../src/knx/transport_layer.cpp ../src/linux_platform.cpp knxmodule.cpp)
|
add_library(knx SHARED ../src/knx/address_table_object.cpp ../src/knx/apdu.cpp ../src/knx/application_layer.cpp ../src/knx/application_program_object.cpp ../src/knx/association_table_object.cpp ../src/knx/bau.cpp ../src/knx/bau07B0.cpp ../src/knx/bau57B0.cpp ../src/knx/bau_systemB.cpp ../src/knx/bits.cpp ../src/knx/cemi_frame.cpp ../src/knx/datapoint_types.cpp ../src/knx/data_link_layer.cpp ../src/knx/device_object.cpp ../src/knx/group_object.cpp ../src/knx/group_object_table_object.cpp ../src/knx/interface_object.cpp ../src/knx/ip_data_link_layer.cpp ../src/knx/ip_parameter_object.cpp ../src/knx/memory.cpp ../src/knx/network_layer.cpp ../src/knx/npdu.cpp ../src/knx/table_object.cpp ../src/knx/tpdu.cpp ../src/knx/tpuart_data_link_layer.cpp ../src/knx/transport_layer.cpp ../src/linux_platform.cpp knxmodule.cpp)
|
||||||
target_link_libraries(knx python3.5m "${LIBRARIES_FROM_REFERENCES}")
|
target_link_libraries(knx python3.5m "${LIBRARIES_FROM_REFERENCES}")
|
||||||
include_directories(/usr/include/python3.5m)
|
include_directories(/usr/include/python3.5m ../src)
|
||||||
SET_TARGET_PROPERTIES(knx PROPERTIES PREFIX "")
|
SET_TARGET_PROPERTIES(knx PROPERTIES PREFIX "")
|
||||||
|
@ -128,6 +128,7 @@
|
|||||||
<ClCompile Include="..\src\knx\memory.cpp" />
|
<ClCompile Include="..\src\knx\memory.cpp" />
|
||||||
<ClCompile Include="..\src\knx\network_layer.cpp" />
|
<ClCompile Include="..\src\knx\network_layer.cpp" />
|
||||||
<ClCompile Include="..\src\knx\npdu.cpp" />
|
<ClCompile Include="..\src\knx\npdu.cpp" />
|
||||||
|
<ClCompile Include="..\src\knx\platform.cpp" />
|
||||||
<ClCompile Include="..\src\knx\table_object.cpp" />
|
<ClCompile Include="..\src\knx\table_object.cpp" />
|
||||||
<ClCompile Include="..\src\knx\tpdu.cpp" />
|
<ClCompile Include="..\src\knx\tpdu.cpp" />
|
||||||
<ClCompile Include="..\src\knx\tpuart_data_link_layer.cpp" />
|
<ClCompile Include="..\src\knx\tpuart_data_link_layer.cpp" />
|
||||||
|
@ -122,6 +122,9 @@
|
|||||||
<ClCompile Include="..\src\knx\transport_layer.cpp">
|
<ClCompile Include="..\src\knx\transport_layer.cpp">
|
||||||
<Filter>Source files\knx</Filter>
|
<Filter>Source files\knx</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\src\knx\platform.cpp">
|
||||||
|
<Filter>Source files\knx</Filter>
|
||||||
|
</ClCompile>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClInclude Include="..\src\linux_platform.h">
|
<ClInclude Include="..\src\linux_platform.h">
|
||||||
|
@ -6,7 +6,8 @@
|
|||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
|
|
||||||
AddressTableObject::AddressTableObject(uint8_t* memoryReference): TableObject(memoryReference)
|
AddressTableObject::AddressTableObject(Platform& platform)
|
||||||
|
: TableObject(platform)
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -5,11 +5,8 @@
|
|||||||
class AddressTableObject: public TableObject
|
class AddressTableObject: public TableObject
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
AddressTableObject(uint8_t* memoryReference);
|
AddressTableObject(Platform& platform);
|
||||||
#pragma GCC diagnostic push
|
|
||||||
#pragma GCC diagnostic ignored "-Woverloaded-virtual"
|
|
||||||
void readProperty(PropertyID id, uint32_t start, uint32_t& count, uint8_t* data);
|
void readProperty(PropertyID id, uint32_t start, uint32_t& count, uint8_t* data);
|
||||||
#pragma GCC diagnostic pop
|
|
||||||
uint16_t entryCount();
|
uint16_t entryCount();
|
||||||
uint16_t getGa(uint16_t tsap);
|
uint16_t getGa(uint16_t tsap);
|
||||||
uint16_t getTsap(uint16_t ga);
|
uint16_t getTsap(uint16_t ga);
|
||||||
|
@ -1,7 +1,8 @@
|
|||||||
#include "application_program_object.h"
|
#include "application_program_object.h"
|
||||||
#include "bits.h"
|
#include "bits.h"
|
||||||
|
|
||||||
ApplicationProgramObject::ApplicationProgramObject(uint8_t* memoryReference): TableObject(memoryReference)
|
ApplicationProgramObject::ApplicationProgramObject(Platform& platform)
|
||||||
|
: TableObject(platform)
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -5,11 +5,8 @@
|
|||||||
class ApplicationProgramObject: public TableObject
|
class ApplicationProgramObject: public TableObject
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
ApplicationProgramObject(uint8_t* memoryReference);
|
ApplicationProgramObject(Platform& platform);
|
||||||
#pragma GCC diagnostic push
|
|
||||||
#pragma GCC diagnostic ignored "-Woverloaded-virtual"
|
|
||||||
void readProperty(PropertyID id, uint32_t start, uint32_t& count, uint8_t* data);
|
void readProperty(PropertyID id, uint32_t start, uint32_t& count, uint8_t* data);
|
||||||
#pragma GCC diagnostic pop
|
|
||||||
void writeProperty(PropertyID id, uint8_t start, uint8_t* data, uint8_t count);
|
void writeProperty(PropertyID id, uint8_t start, uint8_t* data, uint8_t count);
|
||||||
uint8_t propertySize(PropertyID id);
|
uint8_t propertySize(PropertyID id);
|
||||||
uint8_t* data(uint32_t addr);
|
uint8_t* data(uint32_t addr);
|
||||||
|
@ -6,7 +6,8 @@
|
|||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
|
|
||||||
AssociationTableObject::AssociationTableObject(uint8_t* memoryReference): TableObject(memoryReference)
|
AssociationTableObject::AssociationTableObject(Platform& platform)
|
||||||
|
: TableObject(platform)
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -5,11 +5,8 @@
|
|||||||
class AssociationTableObject: public TableObject
|
class AssociationTableObject: public TableObject
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
AssociationTableObject(uint8_t* memoryReference);
|
AssociationTableObject(Platform& platform);
|
||||||
#pragma GCC diagnostic push
|
|
||||||
#pragma GCC diagnostic ignored "-Woverloaded-virtual"
|
|
||||||
void readProperty(PropertyID id, uint32_t start, uint32_t& count, uint8_t* data);
|
void readProperty(PropertyID id, uint32_t start, uint32_t& count, uint8_t* data);
|
||||||
#pragma GCC diagnostic pop
|
|
||||||
uint16_t entryCount();
|
uint16_t entryCount();
|
||||||
uint16_t operator[](uint16_t idx);
|
uint16_t operator[](uint16_t idx);
|
||||||
uint8_t* save(uint8_t* buffer);
|
uint8_t* save(uint8_t* buffer);
|
||||||
|
@ -2,8 +2,8 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
BauSystemB::BauSystemB(Platform& platform): _memoryReference((uint8_t*)&_deviceObj), _memory(platform), _addrTable(_memoryReference),
|
BauSystemB::BauSystemB(Platform& platform): _memory(platform), _addrTable(platform),
|
||||||
_assocTable(_memoryReference), _groupObjTable(_memoryReference), _appProgram(_memoryReference),
|
_assocTable(platform), _groupObjTable(platform), _appProgram(platform),
|
||||||
_platform(platform), _appLayer(_assocTable, *this),
|
_platform(platform), _appLayer(_assocTable, *this),
|
||||||
_transLayer(_appLayer, _addrTable, _platform), _netLayer(_transLayer)
|
_transLayer(_appLayer, _addrTable, _platform), _netLayer(_transLayer)
|
||||||
{
|
{
|
||||||
@ -138,7 +138,7 @@ void BauSystemB::deviceDescriptorReadIndication(Priority priority, HopCountType
|
|||||||
void BauSystemB::memoryWriteIndication(Priority priority, HopCountType hopType, uint16_t asap, uint8_t number,
|
void BauSystemB::memoryWriteIndication(Priority priority, HopCountType hopType, uint16_t asap, uint8_t number,
|
||||||
uint16_t memoryAddress, uint8_t * data)
|
uint16_t memoryAddress, uint8_t * data)
|
||||||
{
|
{
|
||||||
memcpy(_memoryReference + memoryAddress, data, number);
|
memcpy(_platform.memoryReference() + memoryAddress, data, number);
|
||||||
_memory.memoryModified();
|
_memory.memoryModified();
|
||||||
|
|
||||||
if (_deviceObj.verifyMode())
|
if (_deviceObj.verifyMode())
|
||||||
@ -149,7 +149,7 @@ void BauSystemB::memoryReadIndication(Priority priority, HopCountType hopType, u
|
|||||||
uint16_t memoryAddress)
|
uint16_t memoryAddress)
|
||||||
{
|
{
|
||||||
_appLayer.memoryReadResponse(AckRequested, priority, hopType, asap, number, memoryAddress,
|
_appLayer.memoryReadResponse(AckRequested, priority, hopType, asap, number, memoryAddress,
|
||||||
_memoryReference + memoryAddress);
|
_platform.memoryReference() + memoryAddress);
|
||||||
}
|
}
|
||||||
|
|
||||||
void BauSystemB::restartRequestIndication(Priority priority, HopCountType hopType, uint16_t asap)
|
void BauSystemB::restartRequestIndication(Priority priority, HopCountType hopType, uint16_t asap)
|
||||||
@ -160,6 +160,7 @@ void BauSystemB::restartRequestIndication(Priority priority, HopCountType hopTyp
|
|||||||
_platform.restart();
|
_platform.restart();
|
||||||
|
|
||||||
// for platforms that don't really restart
|
// for platforms that don't really restart
|
||||||
|
_memory.readMemory();
|
||||||
_deviceObj.progMode(false);
|
_deviceObj.progMode(false);
|
||||||
_configured = true;
|
_configured = true;
|
||||||
}
|
}
|
||||||
@ -172,12 +173,12 @@ void BauSystemB::authorizeIndication(Priority priority, HopCountType hopType, ui
|
|||||||
void BauSystemB::userMemoryReadIndication(Priority priority, HopCountType hopType, uint16_t asap, uint8_t number, uint32_t memoryAddress)
|
void BauSystemB::userMemoryReadIndication(Priority priority, HopCountType hopType, uint16_t asap, uint8_t number, uint32_t memoryAddress)
|
||||||
{
|
{
|
||||||
_appLayer.userMemoryReadResponse(AckRequested, priority, hopType, asap, number, memoryAddress,
|
_appLayer.userMemoryReadResponse(AckRequested, priority, hopType, asap, number, memoryAddress,
|
||||||
_memoryReference + memoryAddress);
|
_platform.memoryReference() + memoryAddress);
|
||||||
}
|
}
|
||||||
|
|
||||||
void BauSystemB::userMemoryWriteIndication(Priority priority, HopCountType hopType, uint16_t asap, uint8_t number, uint32_t memoryAddress, uint8_t* data)
|
void BauSystemB::userMemoryWriteIndication(Priority priority, HopCountType hopType, uint16_t asap, uint8_t number, uint32_t memoryAddress, uint8_t* data)
|
||||||
{
|
{
|
||||||
memcpy(_memoryReference + memoryAddress, data, number);
|
memcpy(_platform.memoryReference() + memoryAddress, data, number);
|
||||||
_memory.memoryModified();
|
_memory.memoryModified();
|
||||||
|
|
||||||
if (_deviceObj.verifyMode())
|
if (_deviceObj.verifyMode())
|
||||||
|
@ -62,9 +62,6 @@ protected:
|
|||||||
void updateGroupObject(GroupObject& go, uint8_t* data, uint8_t length);
|
void updateGroupObject(GroupObject& go, uint8_t* data, uint8_t length);
|
||||||
|
|
||||||
DeviceObject _deviceObj;
|
DeviceObject _deviceObj;
|
||||||
// pointer to first private variable as reference to memory read/write commands
|
|
||||||
// addesses are to big for memory read/write calls on 64bit systems otherwise
|
|
||||||
uint8_t* _memoryReference;
|
|
||||||
Memory _memory;
|
Memory _memory;
|
||||||
AddressTableObject _addrTable;
|
AddressTableObject _addrTable;
|
||||||
AssociationTableObject _assocTable;
|
AssociationTableObject _assocTable;
|
||||||
|
@ -4,7 +4,8 @@
|
|||||||
#include "group_object.h"
|
#include "group_object.h"
|
||||||
#include "bits.h"
|
#include "bits.h"
|
||||||
|
|
||||||
GroupObjectTableObject::GroupObjectTableObject(uint8_t* memoryReference): TableObject(memoryReference)
|
GroupObjectTableObject::GroupObjectTableObject(Platform& platform)
|
||||||
|
: TableObject(platform)
|
||||||
{
|
{
|
||||||
_groupObjects = 0;
|
_groupObjects = 0;
|
||||||
_groupObjectCount = 0;
|
_groupObjectCount = 0;
|
||||||
|
@ -8,11 +8,8 @@ class GroupObjectTableObject: public TableObject
|
|||||||
friend class GroupObject;
|
friend class GroupObject;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
GroupObjectTableObject(uint8_t* memoryReference);
|
GroupObjectTableObject(Platform& platform);
|
||||||
#pragma GCC diagnostic push
|
|
||||||
#pragma GCC diagnostic ignored "-Woverloaded-virtual"
|
|
||||||
void readProperty(PropertyID id, uint32_t start, uint32_t& count, uint8_t* data);
|
void readProperty(PropertyID id, uint32_t start, uint32_t& count, uint8_t* data);
|
||||||
#pragma GCC diagnostic pop
|
|
||||||
uint16_t entryCount();
|
uint16_t entryCount();
|
||||||
GroupObject& get(uint16_t asap);
|
GroupObject& get(uint16_t asap);
|
||||||
GroupObject& nextUpdatedObject(bool& valid);
|
GroupObject& nextUpdatedObject(bool& valid);
|
||||||
|
23
src/knx/platform.cpp
Normal file
23
src/knx/platform.cpp
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
#include "platform.h"
|
||||||
|
|
||||||
|
#include <cstdlib>
|
||||||
|
|
||||||
|
uint8_t* Platform::memoryReference()
|
||||||
|
{
|
||||||
|
return _memoryReference;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
uint8_t* Platform::allocMemory(size_t size)
|
||||||
|
{
|
||||||
|
uint8_t* address = (uint8_t*)malloc(size);
|
||||||
|
if (_memoryReference == 0)
|
||||||
|
_memoryReference = address;
|
||||||
|
|
||||||
|
return address;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Platform::freeMemory(uint8_t* ptr)
|
||||||
|
{
|
||||||
|
free(ptr);
|
||||||
|
}
|
@ -32,4 +32,10 @@ public:
|
|||||||
|
|
||||||
virtual uint8_t* getEepromBuffer(uint16_t size) = 0;
|
virtual uint8_t* getEepromBuffer(uint16_t size) = 0;
|
||||||
virtual void commitToEeprom() = 0;
|
virtual void commitToEeprom() = 0;
|
||||||
|
|
||||||
|
virtual uint8_t* memoryReference();
|
||||||
|
virtual uint8_t* allocMemory(size_t size);
|
||||||
|
virtual void freeMemory(uint8_t* ptr);
|
||||||
|
protected:
|
||||||
|
uint8_t* _memoryReference = 0;
|
||||||
};
|
};
|
@ -1,10 +1,9 @@
|
|||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include "table_object.h"
|
#include "table_object.h"
|
||||||
#include "bits.h"
|
#include "bits.h"
|
||||||
|
|
||||||
TableObject::TableObject(uint8_t* memoryReference): _memoryReference(memoryReference)
|
TableObject::TableObject(Platform& platform): _platform(platform)
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -61,7 +60,7 @@ uint8_t TableObject::propertySize(PropertyID id)
|
|||||||
TableObject::~TableObject()
|
TableObject::~TableObject()
|
||||||
{
|
{
|
||||||
if (_data != 0)
|
if (_data != 0)
|
||||||
free(_data);
|
_platform.freeMemory(_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
LoadState TableObject::loadState()
|
LoadState TableObject::loadState()
|
||||||
@ -101,9 +100,9 @@ uint8_t* TableObject::restore(uint8_t* buffer)
|
|||||||
buffer = popInt(_size, buffer);
|
buffer = popInt(_size, buffer);
|
||||||
|
|
||||||
if (_data)
|
if (_data)
|
||||||
free(_data);
|
_platform.freeMemory(_data);
|
||||||
|
|
||||||
_data = (uint8_t*) malloc(_size);
|
_data = _platform.allocMemory(_size);
|
||||||
|
|
||||||
buffer = popByteArray(_data, _size, buffer);
|
buffer = popByteArray(_data, _size, buffer);
|
||||||
|
|
||||||
@ -112,21 +111,22 @@ uint8_t* TableObject::restore(uint8_t* buffer)
|
|||||||
|
|
||||||
uint32_t TableObject::tableReference()
|
uint32_t TableObject::tableReference()
|
||||||
{
|
{
|
||||||
return (uint32_t)(_data - _memoryReference);
|
return (uint32_t)(_data - _platform.memoryReference());
|
||||||
}
|
}
|
||||||
|
|
||||||
bool TableObject::allocTable(uint32_t size, bool doFill, uint8_t fillByte)
|
bool TableObject::allocTable(uint32_t size, bool doFill, uint8_t fillByte)
|
||||||
{
|
{
|
||||||
if (_data)
|
if (_data)
|
||||||
{
|
{
|
||||||
free(_data);
|
_platform.freeMemory(_data);
|
||||||
|
_data = 0;
|
||||||
_size = 0;
|
_size = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (size == 0)
|
if (size == 0)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
_data = (uint8_t*)malloc(size);
|
_data = _platform.allocMemory(size);
|
||||||
if (!_data)
|
if (!_data)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
@ -1,11 +1,12 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "interface_object.h"
|
#include "interface_object.h"
|
||||||
|
#include "platform.h"
|
||||||
|
|
||||||
class TableObject: public InterfaceObject
|
class TableObject: public InterfaceObject
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
TableObject(uint8_t* memoryReference);
|
TableObject(Platform& platform);
|
||||||
virtual void readProperty(PropertyID id, uint32_t start, uint32_t count, uint8_t* data);
|
virtual void readProperty(PropertyID id, uint32_t start, uint32_t count, uint8_t* data);
|
||||||
virtual void writeProperty(PropertyID id, uint8_t start, uint8_t* data, uint8_t count);
|
virtual void writeProperty(PropertyID id, uint8_t start, uint8_t* data, uint8_t count);
|
||||||
virtual uint8_t propertySize(PropertyID id);
|
virtual uint8_t propertySize(PropertyID id);
|
||||||
@ -29,5 +30,5 @@ private:
|
|||||||
void additionalLoadControls(uint8_t* data);
|
void additionalLoadControls(uint8_t* data);
|
||||||
void loadState(LoadState newState);
|
void loadState(LoadState newState);
|
||||||
LoadState _state = LS_UNLOADED;
|
LoadState _state = LS_UNLOADED;
|
||||||
uint8_t* _memoryReference;
|
Platform& _platform;
|
||||||
};
|
};
|
||||||
|
@ -1,13 +1,16 @@
|
|||||||
#include "linux_platform.h"
|
#include "linux_platform.h"
|
||||||
#ifdef __linux__
|
#ifdef __linux__
|
||||||
#include <stdio.h>
|
#include <cstdio>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <string.h>
|
#include <cstring>
|
||||||
|
#include <cstdlib>
|
||||||
|
#include <stdexcept>
|
||||||
|
#include <cmath>
|
||||||
|
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
#include <sys/mman.h>
|
#include <sys/mman.h>
|
||||||
#include <math.h>
|
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <sys/socket.h>
|
#include <sys/socket.h>
|
||||||
#include <netinet/in.h>
|
#include <netinet/in.h>
|
||||||
@ -23,9 +26,13 @@
|
|||||||
#include "knx/application_program_object.h"
|
#include "knx/application_program_object.h"
|
||||||
#include "knx/ip_parameter_object.h"
|
#include "knx/ip_parameter_object.h"
|
||||||
|
|
||||||
|
#define MAX_MEM 4096
|
||||||
|
|
||||||
LinuxPlatform::LinuxPlatform()
|
LinuxPlatform::LinuxPlatform()
|
||||||
{
|
{
|
||||||
doMemoryMapping();
|
doMemoryMapping();
|
||||||
|
Platform::_memoryReference = (uint8_t*)malloc(MAX_MEM);
|
||||||
|
_currentMaxMem = Platform::_memoryReference;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t LinuxPlatform::currentIpAddress()
|
uint32_t LinuxPlatform::currentIpAddress()
|
||||||
@ -72,7 +79,13 @@ void LinuxPlatform::macAddress(uint8_t* data)
|
|||||||
|
|
||||||
void LinuxPlatform::restart()
|
void LinuxPlatform::restart()
|
||||||
{
|
{
|
||||||
// do nothing
|
// clear alocated memory
|
||||||
|
if(_memoryReference != 0)
|
||||||
|
{
|
||||||
|
free(_memoryReference);
|
||||||
|
Platform::_memoryReference = (uint8_t*)malloc(MAX_MEM);
|
||||||
|
_currentMaxMem = Platform::_memoryReference;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void LinuxPlatform::fatalError()
|
void LinuxPlatform::fatalError()
|
||||||
@ -276,4 +289,23 @@ void LinuxPlatform::closeUart()
|
|||||||
void LinuxPlatform::setupUart()
|
void LinuxPlatform::setupUart()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* On linux the memory addresses from malloc may be to big for usermermory_write.
|
||||||
|
* So we allocate some memory at the beginning and use it for address table, group object table etc.
|
||||||
|
*
|
||||||
|
**/
|
||||||
|
uint8_t* LinuxPlatform::allocMemory(size_t size)
|
||||||
|
{
|
||||||
|
uint8_t* addr = _currentMaxMem;
|
||||||
|
_currentMaxMem += size;
|
||||||
|
if ((_currentMaxMem - Platform::_memoryReference) > MAX_MEM)
|
||||||
|
throw std::overflow_error("MAX_MEM was to small");
|
||||||
|
return addr;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
void LinuxPlatform::freeMemory(uint8_t* ptr)
|
||||||
|
{
|
||||||
|
/* do nothing. Memory is freed on restart()*/
|
||||||
|
}
|
||||||
|
@ -6,6 +6,7 @@
|
|||||||
|
|
||||||
class LinuxPlatform: public Platform
|
class LinuxPlatform: public Platform
|
||||||
{
|
{
|
||||||
|
using Platform::_memoryReference;
|
||||||
public:
|
public:
|
||||||
LinuxPlatform();
|
LinuxPlatform();
|
||||||
|
|
||||||
@ -39,6 +40,8 @@ public:
|
|||||||
//memory
|
//memory
|
||||||
uint8_t* getEepromBuffer(uint16_t size);
|
uint8_t* getEepromBuffer(uint16_t size);
|
||||||
void commitToEeprom();
|
void commitToEeprom();
|
||||||
|
uint8_t* allocMemory(size_t size);
|
||||||
|
void freeMemory(uint8_t* ptr);
|
||||||
private:
|
private:
|
||||||
uint32_t _multicastAddr;
|
uint32_t _multicastAddr;
|
||||||
uint16_t _port;
|
uint16_t _port;
|
||||||
@ -46,6 +49,7 @@ private:
|
|||||||
void doMemoryMapping();
|
void doMemoryMapping();
|
||||||
uint8_t* _mappedFile;
|
uint8_t* _mappedFile;
|
||||||
int _fd;
|
int _fd;
|
||||||
|
uint8_t* _currentMaxMem = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
@ -153,5 +153,4 @@ size_t SamdPlatform::readBytesUart(uint8_t *buffer, size_t length)
|
|||||||
//printHex("p>", buffer, length);
|
//printHex("p>", buffer, length);
|
||||||
return length;
|
return length;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
Loading…
Reference in New Issue
Block a user