mirror of
https://github.com/thelsing/knx.git
synced 2026-04-06 03:21:49 +02:00
convert CallbackProperty to template
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user