mirror of
				https://github.com/thelsing/knx.git
				synced 2025-10-26 10:26:25 +01:00 
			
		
		
		
	String \0 terminated in group objects (#25)
* String \0 terminated in group objects * Remove copy constructor, fix bugs in setting buffer to 0 * Remove copy constructor in GroupObject
This commit is contained in:
		
							parent
							
								
									12fb67cc63
								
							
						
					
					
						commit
						093ae425b0
					
				| @ -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) | int busValueToString(const uint8_t* payload, size_t payload_length, const Dpt& datatype, KNXValue& value) | ||||||
| { | { | ||||||
|     ASSERT_PAYLOAD(14); |     ASSERT_PAYLOAD(14); | ||||||
|     char strValue[15]; |  | ||||||
|     strValue[14] = '\0'; |  | ||||||
|     for (int n = 0; n < 14; ++n) |     for (int n = 0; n < 14; ++n) | ||||||
|     { |     { | ||||||
|         strValue[n] = signed8FromPayload(payload, n); |         auto value = signed8FromPayload(payload, n); | ||||||
|         if (!datatype.subGroup && (strValue[n] & 0x80)) |         if (!datatype.subGroup && (value & 0x80)) | ||||||
|             return false; |             return false; | ||||||
|     } |     } | ||||||
|     value = strValue; |     value = (const char*) payload; | ||||||
|     return true; |     return true; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -20,18 +20,6 @@ GroupObject::GroupObject() | |||||||
| #endif | #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() | GroupObject::~GroupObject() | ||||||
| { | { | ||||||
|     if (_data) |     if (_data) | ||||||
| @ -114,12 +102,12 @@ size_t GroupObject::goSize() | |||||||
|     size_t size = sizeInTelegram(); |     size_t size = sizeInTelegram(); | ||||||
|     if (size == 0) |     if (size == 0) | ||||||
|         return 1; |         return 1; | ||||||
| 
 |   | ||||||
|     return size; |     return size; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // see knxspec 3.5.1 p. 178
 | // 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) |     if (code < 7) | ||||||
|         return 0; |         return 0; | ||||||
| @ -194,6 +182,17 @@ size_t GroupObject::sizeInTelegram() | |||||||
|     return asapValueSize(code); |     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 | #ifdef SMALL_GROUPOBJECT | ||||||
| GroupObjectUpdatedHandler GroupObject::classCallback() | GroupObjectUpdatedHandler GroupObject::classCallback() | ||||||
| { | { | ||||||
|  | |||||||
| @ -57,10 +57,6 @@ class GroupObject | |||||||
|      * The constructor. |      * The constructor. | ||||||
|      */ |      */ | ||||||
|     GroupObject(); |     GroupObject(); | ||||||
|     /**
 |  | ||||||
|      * The copy constructor. |  | ||||||
|      */ |  | ||||||
|     GroupObject(const GroupObject& other); |  | ||||||
|     /**
 |     /**
 | ||||||
|      * The destructor. |      * The destructor. | ||||||
|      */ |      */ | ||||||
| @ -139,6 +135,11 @@ class GroupObject | |||||||
|      * will return 0. |      * will return 0. | ||||||
|      */ |      */ | ||||||
|     size_t sizeInTelegram(); |     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  |      * 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. |      * your own conversion. | ||||||
| @ -274,7 +275,7 @@ class GroupObject | |||||||
|     static GroupObjectUpdatedHandler _updateHandlerStatic; |     static GroupObjectUpdatedHandler _updateHandlerStatic; | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
|     size_t asapValueSize(uint8_t code); |     size_t asapValueSize(uint8_t code) const; | ||||||
|     size_t goSize(); |     size_t goSize(); | ||||||
|     uint16_t _asap = 0; |     uint16_t _asap = 0; | ||||||
|     ComFlagEx _commFlagEx; |     ComFlagEx _commFlagEx; | ||||||
|  | |||||||
| @ -107,10 +107,11 @@ bool GroupObjectTableObject::initGroupObjects() | |||||||
|         GroupObject& go = _groupObjects[asap - 1]; |         GroupObject& go = _groupObjects[asap - 1]; | ||||||
|         go._asap = asap; |         go._asap = asap; | ||||||
|         go._table = this; |         go._table = this; | ||||||
|          |      | ||||||
|         go._dataLength = go.goSize(); |         go._dataLength = go.goSize(); | ||||||
|         go._data = new uint8_t[go._dataLength]; |         size_t sizeInMemory = go.sizeInMemory(); | ||||||
|         memset(go._data, 0, go._dataLength); |         go._data = new uint8_t[sizeInMemory]; | ||||||
|  |         memset(go._data, 0, sizeInMemory); | ||||||
|          |          | ||||||
|         if (go.valueReadOnInit()) |         if (go.valueReadOnInit()) | ||||||
|             go.requestObjectRead(); |             go.requestObjectRead(); | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user