convert CallbackProperty to template

This commit is contained in:
Thomas Kunze
2019-12-12 01:42:56 +01:00
parent 71448efdad
commit e128debabb
12 changed files with 150 additions and 216 deletions

View File

@@ -2,6 +2,8 @@
#include "device_object.h"
#include "platform.h"
#include "bits.h"
#include "data_property.h"
#include "callback_property.h"
//224.0.23.12
#define DEFAULT_MULTICAST_ADDR 0xE000170C
@@ -11,27 +13,41 @@ IpParameterObject::IpParameterObject(DeviceObject& deviceObject, Platform& platf
{
Property* properties[] =
{
new DataProperty(PID_OBJECT_TYPE, false, PDT_UNSIGNED_INT, 1, ReadLv3 | WriteLv0)
new DataProperty(PID_OBJECT_TYPE, false, PDT_UNSIGNED_INT, 1, ReadLv3 | WriteLv0, OT_IP_PARAMETER),
new DataProperty(PID_PROJECT_INSTALLATION_ID, true, PDT_UNSIGNED_INT, 1, ReadLv3 | WriteLv3),
new CallbackProperty<IpParameterObject>(this, PID_KNX_INDIVIDUAL_ADDRESS, true, PDT_UNSIGNED_INT, 1, ReadLv3 | WriteLv3,
[](IpParameterObject* io, uint16_t start, uint8_t count, uint8_t* data) -> uint8_t
{
pushWord(io->_deviceObject.induvidualAddress(), data);
return 1;
},
[](IpParameterObject* io, uint16_t start, uint8_t count, uint8_t* data) -> uint8_t
{
io->_deviceObject.induvidualAddress(getWord(data));
return 1;
}),
//55 PID_IP_ASSIGNMENT_METHOD 3 / 3
//56 PID_IP_CAPABILITIES 3 / 1
//57 PID_CURRENT_IP_ADDRESS 3 / x
//58 PID_CURRENT_SUBNET_MASK 3 / x
//59 PID_CURRENT_DEFAULT_GATEWAY 3 / x
//60 PID_IP_ADDRESS 3 / 3
//61 PID_SUBNET_MASK 3 / 3
//62 PID_DEFAULT_GATEWAY 3 / 3
//64 PID_MAC_ADDRESS 3 / x
//65 PID_SYSTEM_SETUP_MULTICAST_ADDRESS 3 / x
//66 PID_ROUTING_MULTICAST_ADDRESS 3 / 3
//67 PID_TTL 3 / 3
//68 PID_KNXNETIP_DEVICE_CAPABILITIES 3 / x
//76 PID_FRIENDLY_NAME 3 / 3
};
initializeProperties(sizeof(properties), properties);
initializeProperties(sizeof(properties), properties);
}
void IpParameterObject::readProperty(PropertyID propertyId, uint16_t start, uint8_t& count, uint8_t* data)
{
switch (propertyId)
{
case PID_LOAD_STATE_CONTROL:
data[0] = _state;
break;
case PID_OBJECT_TYPE:
pushWord(OT_IP_PARAMETER, data);
break;
case PID_PROJECT_INSTALLATION_ID:
pushWord(_projectInstallationId, data);
break;
case PID_KNX_INDIVIDUAL_ADDRESS:
pushWord(_deviceObject.induvidualAddress(), data);
break;
case PID_IP_ASSIGNMENT_METHOD:
data[0] = _ipAssignmentMethod;
break;
@@ -80,7 +96,7 @@ void IpParameterObject::readProperty(PropertyID propertyId, uint16_t start, uint
data[i-start] = _friendlyName[i-1];
break;
default:
count = 0;
InterfaceObject::readProperty(propertyId, start, count, data);
break;
}
}
@@ -89,15 +105,6 @@ void IpParameterObject::writeProperty(PropertyID id, uint16_t start, uint8_t* da
{
switch (id)
{
case PID_LOAD_STATE_CONTROL:
loadEvent(data);
break;
case PID_PROJECT_INSTALLATION_ID:
_projectInstallationId = getWord(data);
break;
case PID_KNX_INDIVIDUAL_ADDRESS:
_deviceObject.induvidualAddress(getWord(data));
break;
case PID_IP_ASSIGNMENT_METHOD:
_ipAssignmentMethod = data[0];
break;
@@ -121,7 +128,7 @@ void IpParameterObject::writeProperty(PropertyID id, uint16_t start, uint8_t* da
_friendlyName[i-1] = data[i - start];
break;
default:
count = 0;
InterfaceObject::writeProperty(id, start, data, count);
break;
}
}
@@ -137,8 +144,6 @@ uint8_t IpParameterObject::propertySize(PropertyID id)
case PID_KNXNETIP_DEVICE_CAPABILITIES:
case PID_FRIENDLY_NAME:
return 1;
case PID_OBJECT_TYPE:
case PID_PROJECT_INSTALLATION_ID:
case PID_KNX_INDIVIDUAL_ADDRESS:
return 2;
case PID_CURRENT_IP_ADDRESS:
@@ -153,7 +158,7 @@ uint8_t IpParameterObject::propertySize(PropertyID id)
case PID_MAC_ADDRESS:
return 6;
}
return 0;
return InterfaceObject::propertySize(id);
}
uint8_t* IpParameterObject::save(uint8_t* buffer)
@@ -194,125 +199,6 @@ uint32_t IpParameterObject::multicastAddress() const
return _multicastAddress;
}
void IpParameterObject::loadEvent(uint8_t* data)
{
switch (_state)
{
case LS_UNLOADED:
loadEventUnloaded(data);
break;
case LS_LOADING:
loadEventLoading(data);
break;
case LS_LOADED:
loadEventLoaded(data);
break;
case LS_ERROR:
loadEventError(data);
break;
}
}
void IpParameterObject::loadState(LoadState newState)
{
if (newState == _state)
return;
//beforeStateChange(newState);
_state = newState;
}
void IpParameterObject::loadEventUnloaded(uint8_t* data)
{
uint8_t event = data[0];
switch (event)
{
case LE_NOOP:
case LE_LOAD_COMPLETED:
case LE_ADDITIONAL_LOAD_CONTROLS:
case LE_UNLOAD:
break;
case LE_START_LOADING:
loadState(LS_LOADING);
break;
default:
loadState(LS_ERROR);
_errorCode = E_GOT_UNDEF_LOAD_CMD;
}
}
void IpParameterObject::loadEventLoading(uint8_t* data)
{
uint8_t event = data[0];
switch (event)
{
case LE_NOOP:
case LE_START_LOADING:
break;
case LE_LOAD_COMPLETED:
loadState(LS_LOADED);
break;
case LE_UNLOAD:
loadState(LS_UNLOADED);
break;
case LE_ADDITIONAL_LOAD_CONTROLS:
additionalLoadControls(data);
break;
default:
loadState(LS_ERROR);
_errorCode = E_GOT_UNDEF_LOAD_CMD;
}
}
void IpParameterObject::loadEventLoaded(uint8_t* data)
{
uint8_t event = data[0];
switch (event)
{
case LE_NOOP:
case LE_LOAD_COMPLETED:
break;
case LE_START_LOADING:
loadState(LS_LOADING);
break;
case LE_UNLOAD:
loadState(LS_UNLOADED);
break;
case LE_ADDITIONAL_LOAD_CONTROLS:
loadState(LS_ERROR);
_errorCode = E_INVALID_OPCODE;
break;
default:
loadState(LS_ERROR);
_errorCode = E_GOT_UNDEF_LOAD_CMD;
}
}
void IpParameterObject::loadEventError(uint8_t* data)
{
uint8_t event = data[0];
switch (event)
{
case LE_NOOP:
case LE_LOAD_COMPLETED:
case LE_ADDITIONAL_LOAD_CONTROLS:
case LE_START_LOADING:
break;
case LE_UNLOAD:
loadState(LS_UNLOADED);
break;
default:
loadState(LS_ERROR);
_errorCode = E_GOT_UNDEF_LOAD_CMD;
}
}
void IpParameterObject::additionalLoadControls(uint8_t* data)
{
loadState(LS_ERROR);
_errorCode = E_INVALID_OPCODE;
return;
}
static PropertyDescription _propertyDescriptions[] =
{
{ PID_OBJECT_TYPE, false, PDT_UNSIGNED_INT, 1, ReadLv3 | WriteLv0 },
@@ -334,4 +220,4 @@ PropertyDescription* IpParameterObject::propertyDescriptions()
uint16_t IpParameterObject::saveSize()
{
return 51;
}
}