Skip to content

Commit

Permalink
New implementation of Uninitialized state for group object
Browse files Browse the repository at this point in the history
- old implementation is still there for compatibility reasons
- new implementation reflects the case "uninitialized while transmitting"
- Just states "Updated", "WriteRequest" and "Ok" remove uninitialized state
  • Loading branch information
Waldemar Porscha authored and cornelius-koepp committed Feb 12, 2024
1 parent 57b5b05 commit e43325e
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 11 deletions.
29 changes: 20 additions & 9 deletions src/knx/group_object.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,8 @@ GroupObjectTableObject* GroupObject::_table = 0;
GroupObject::GroupObject()
{
_data = 0;
_commFlag = Uninitialized;
_commFlagEx.uninitialized = true;
_commFlagEx.commFlag = Uninitialized;
_dataLength = 0;
#ifndef SMALL_GROUPOBJECT
_updateHandler = 0;
Expand All @@ -22,7 +23,7 @@ GroupObject::GroupObject()
GroupObject::GroupObject(const GroupObject& other)
{
_data = new uint8_t[other._dataLength];
_commFlag = other._commFlag;
_commFlagEx = other._commFlagEx;
_dataLength = other._dataLength;
_asap = other._asap;
#ifndef SMALL_GROUPOBJECT
Expand Down Expand Up @@ -75,7 +76,7 @@ bool GroupObject::readEnable()
return false;

// we forbid reading of new (uninitialized) go
if (_commFlag == Uninitialized)
if (_commFlagEx.uninitialized)
return false;

return bitRead(ntohs(_table->_tableData[_asap]), 11) > 0;
Expand Down Expand Up @@ -157,22 +158,29 @@ size_t GroupObject::asapValueSize(uint8_t code)

ComFlag GroupObject::commFlag()
{
return _commFlag;
return _commFlagEx.commFlag;
}

void GroupObject::commFlag(ComFlag value)
{
_commFlag = value;
_commFlagEx.commFlag = value;
if (value == WriteRequest || value == Updated || value == Ok)
_commFlagEx.uninitialized = false;
}

bool GroupObject::initialized()
{
return !_commFlagEx.uninitialized;
}

void GroupObject::requestObjectRead()
{
_commFlag = ReadRequest;
_commFlagEx.commFlag = ReadRequest;
}

void GroupObject::objectWritten()
{
_commFlag = WriteRequest;
_commFlagEx.commFlag = WriteRequest;
}

size_t GroupObject::valueSize()
Expand Down Expand Up @@ -274,8 +282,11 @@ void GroupObject::valueNoSend(const KNXValue& value)

void GroupObject::valueNoSend(const KNXValue& value, const Dpt& type)
{
if (_commFlag == Uninitialized)
_commFlag = Ok;
if (_commFlagEx.uninitialized)
{
_commFlagEx.commFlag = Ok;
_commFlagEx.uninitialized = false;
}

KNX_Encode_Value(value, _data, _dataLength, type);
}
Expand Down
19 changes: 17 additions & 2 deletions src/knx/group_object.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@

class GroupObjectTableObject;

enum ComFlag
enum ComFlag : uint8_t
{
Updated = 0, //!< Group object was updated
ReadRequest = 1, //!< Read was requested but was not processed
Expand All @@ -18,6 +18,16 @@ enum ComFlag
Uninitialized = 6 //!< uninitialized Group Object, its value is not valid
};

// extended ComFlag: Uninitialized it not handled correctly as ComFlag
// it might be in state Transmitting during a ReadRequest on startup while value is still not valid
// we use MSB to store Uninitialized and keep the size of GroupObject the same saving memory ressources
// the old Uninitialized handling is still there for compatibility reasons.
struct ComFlagEx
{
bool uninitialized : 1;
ComFlag commFlag : 7;
};

class GroupObject;

#ifndef HAS_FUNCTIONAL
Expand Down Expand Up @@ -96,6 +106,11 @@ class GroupObject
*/
void commFlag(ComFlag value);

/**
* Check if the group object contains a valid value assigned from bus or from application program
*/
bool initialized();

/**
* Request the read of a communication object. Calling this function triggers the
* sending of a read-group-value telegram, to read the value of the communication
Expand Down Expand Up @@ -249,7 +264,7 @@ class GroupObject
size_t asapValueSize(uint8_t code);
size_t goSize();
uint16_t _asap = 0;
ComFlag _commFlag = Uninitialized;
ComFlagEx _commFlagEx;
uint8_t* _data = 0;
uint8_t _dataLength = 0;
#ifndef SMALL_GROUPOBJECT
Expand Down

0 comments on commit e43325e

Please sign in to comment.