Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix Sending Wrong Values on Failed Conversion to DPT (v1dev) #31

Closed
wants to merge 7 commits into from
45 changes: 29 additions & 16 deletions src/knx/group_object.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -224,10 +224,15 @@ GroupObjectUpdatedHandler GroupObject::callback()
}
#endif

void GroupObject::value(const KNXValue& value, const Dpt& type)
bool GroupObject::value(const KNXValue& value, const Dpt& type)
{
valueNoSend(value, type);
objectWritten();
if (valueNoSend(value, type))
{
// write on successful conversion/setting value only
objectWritten();
return true;
}
return false;
}


Expand Down Expand Up @@ -262,9 +267,9 @@ bool GroupObject::tryValue(KNXValue& value)
}


void GroupObject::value(const KNXValue& value)
bool GroupObject::value(const KNXValue& value)
{
this->value(value, _datapointType);
return this->value(value, _datapointType);
}


Expand All @@ -274,34 +279,42 @@ KNXValue GroupObject::value()
}


void GroupObject::valueNoSend(const KNXValue& value)
bool GroupObject::valueNoSend(const KNXValue& value)
{
valueNoSend(value, _datapointType);
return valueNoSend(value, _datapointType);
}
#endif

void GroupObject::valueNoSend(const KNXValue& value, const Dpt& type)
bool GroupObject::valueNoSend(const KNXValue& value, const Dpt& type)
{
if (_commFlagEx.uninitialized)
const bool encodingDone = KNX_Encode_Value(value, _data, _dataLength, type);

// initialize on succesful conversion only
if (encodingDone && _commFlagEx.uninitialized)
commFlag(Ok);

KNX_Encode_Value(value, _data, _dataLength, type);
return encodingDone;
}

bool GroupObject::valueNoSendCompare(const KNXValue& value, const Dpt& type)
{
if (_commFlagEx.uninitialized)
{
// always set first value
this->valueNoSend(value, type);
return true;
return valueNoSend(value, type);
}
else
{
// convert new value to given dtp
// convert new value to given DPT
uint8_t newData[_dataLength];
memset(newData, 0, _dataLength);
KNX_Encode_Value(value, newData, _dataLength, type);
const bool encodingDone = KNX_Encode_Value(value, newData, _dataLength, type);
if (!encodingDone)
{
// value conversion to DPT failed
// do NOT update the value of the KO!
return false;
}

// check for change in converted value / update value on change only
const bool dataChanged = memcmp(_data, newData, _dataLength);
Expand All @@ -316,8 +329,8 @@ bool GroupObject::valueCompare(const KNXValue& value, const Dpt& type)
{
if (valueNoSendCompare(value, type))
{
objectWritten();
return true;
objectWritten();
return true;
}
return false;
}
24 changes: 16 additions & 8 deletions src/knx/group_object.h
Original file line number Diff line number Diff line change
Expand Up @@ -171,8 +171,10 @@ class GroupObject
* @param type the datapoint type used for the conversion.
*
* The parameters must fit the group object. Otherwise it will stay unchanged.
*
* @returns true if the value was converted successfully to the datapoint type and the group object was updated.
*/
void value(const KNXValue& value, const Dpt& type);
bool value(const KNXValue& value, const Dpt& type);

/**
* Check if the value (after conversion to dpt) will differ from current value of the group object and changes the state of the group object to ::WriteRequest if different.
Expand All @@ -182,18 +184,20 @@ class GroupObject
*
* The parameters must fit the group object. Otherwise it will stay unchanged.
*
* @returns true if the value of the group object has changed
* @returns true if the value of the group object has changed, false if conversion results in same value as stored in group object or failed.
*/
bool valueCompare(const KNXValue& value, const Dpt& type);

/**
* set the current value of the group object.
* set the current value of the group object and show success.
* @param value the value the group object is set to
* @param type the datapoint type used for the conversion.
*
* The parameters must fit the group object. Otherwise it will stay unchanged.
*
* @returns true if value was converted successfully to the datapoint type and the group object was updated.
*/
void valueNoSend(const KNXValue& value, const Dpt& type);
bool valueNoSend(const KNXValue& value, const Dpt& type);

/**
* Check if the value (after conversion to dpt) will differ from current value of the group object and update if necessary.
Expand All @@ -203,7 +207,7 @@ class GroupObject
*
* The parameters must fit the group object. Otherwise it will stay unchanged.
*
* @returns true if the value of the group object has changed
* @returns true if the value of the group object has changed, false if conversion results in same value as stored in group object or failed.
*/
bool valueNoSendCompare(const KNXValue& value, const Dpt& type);

Expand All @@ -229,15 +233,19 @@ class GroupObject
* @param value the value the group object is set to
*
* The parameters must fit the group object and dhe datapoint type must be set with dataPointType(). Otherwise it will stay unchanged.
*
* @returns true if the value was converted successfully to the datapoint type and the group object was updated.
*/
void value(const KNXValue& value);
bool value(const KNXValue& value);
/**
* set the current value of the group object.
* @param value the value the group object is set to
*
* The parameters must fit the group object and dhe datapoint type must be set with dataPointType(). Otherwise it will stay unchanged.
* The parameters must fit the group object and the datapoint type must be set with dataPointType(). Otherwise it will stay unchanged.
*
* @returns true if the value was converted successfully to the datapoint type and the group object was updated.
*/
void valueNoSend(const KNXValue& value);
bool valueNoSend(const KNXValue& value);
/**
* set the current value of the group object.
* @param value the value the group object is set to
Expand Down
Loading