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

String \0 terminated in group objects #25

Merged
merged 3 commits into from
Jul 20, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 3 additions & 5 deletions src/knx/dptconvert.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -517,15 +517,13 @@ int busValueToAccess(const uint8_t* payload, size_t payload_length, const Dpt& d
int busValueToString(const uint8_t* payload, size_t payload_length, const Dpt& datatype, KNXValue& value)
{
ASSERT_PAYLOAD(14);
char strValue[15];
strValue[14] = '\0';
for (int n = 0; n < 14; ++n)
{
strValue[n] = signed8FromPayload(payload, n);
if (!datatype.subGroup && (strValue[n] & 0x80))
auto value = signed8FromPayload(payload, n);
if (!datatype.subGroup && (value & 0x80))
return false;
}
value = strValue;
value = (const char*) payload;
return true;
}

Expand Down
27 changes: 13 additions & 14 deletions src/knx/group_object.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -20,18 +20,6 @@ GroupObject::GroupObject()
#endif
}

GroupObject::GroupObject(const GroupObject& other)
{
_data = new uint8_t[other._dataLength];
_commFlagEx = other._commFlagEx;
_dataLength = other._dataLength;
_asap = other._asap;
#ifndef SMALL_GROUPOBJECT
_updateHandler = other._updateHandler;
#endif
memcpy(_data, other._data, _dataLength);
}

GroupObject::~GroupObject()
{
if (_data)
Expand Down Expand Up @@ -114,12 +102,12 @@ size_t GroupObject::goSize()
size_t size = sizeInTelegram();
if (size == 0)
return 1;

return size;
}

// see knxspec 3.5.1 p. 178
size_t GroupObject::asapValueSize(uint8_t code)
size_t GroupObject::asapValueSize(uint8_t code) const
{
if (code < 7)
return 0;
Expand Down Expand Up @@ -194,6 +182,17 @@ size_t GroupObject::sizeInTelegram()
return asapValueSize(code);
}

size_t GroupObject::sizeInMemory() const
{
uint8_t code = lowByte(ntohs(_table->_tableData[_asap]));
size_t result = asapValueSize(code);
if (code == 0)
return 1;
if (code == 14)
return 14 + 1;
return result;
}

#ifdef SMALL_GROUPOBJECT
GroupObjectUpdatedHandler GroupObject::classCallback()
{
Expand Down
11 changes: 6 additions & 5 deletions src/knx/group_object.h
Original file line number Diff line number Diff line change
Expand Up @@ -57,10 +57,6 @@ class GroupObject
* The constructor.
*/
GroupObject();
/**
* The copy constructor.
*/
GroupObject(const GroupObject& other);
/**
* The destructor.
*/
Expand Down Expand Up @@ -139,6 +135,11 @@ class GroupObject
* will return 0.
*/
size_t sizeInTelegram();
/**
* returns the size of the group object in the heap memory of the group object. The function returns the same value as goSize(),
* exept fot the 14 byte string type to reserve one byte of a \0 terminator character.
*/
size_t sizeInMemory() const;
/**
* returns the pointer to the value of the group object. This can be used if a datapoint type is not supported or if you want do
* your own conversion.
Expand Down Expand Up @@ -274,7 +275,7 @@ class GroupObject
static GroupObjectUpdatedHandler _updateHandlerStatic;
#endif

size_t asapValueSize(uint8_t code);
size_t asapValueSize(uint8_t code) const;
size_t goSize();
uint16_t _asap = 0;
ComFlagEx _commFlagEx;
Expand Down
7 changes: 4 additions & 3 deletions src/knx/group_object_table_object.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -107,10 +107,11 @@ bool GroupObjectTableObject::initGroupObjects()
GroupObject& go = _groupObjects[asap - 1];
go._asap = asap;
go._table = this;

go._dataLength = go.goSize();
go._data = new uint8_t[go._dataLength];
memset(go._data, 0, go._dataLength);
size_t sizeInMemory = go.sizeInMemory();
go._data = new uint8_t[sizeInMemory];
memset(go._data, 0, sizeInMemory);

if (go.valueReadOnInit())
go.requestObjectRead();
Expand Down
Loading