From 6117ce5cad9ad68253a33a215b5ec76aa3598541 Mon Sep 17 00:00:00 2001 From: Martin Preuss Date: Mon, 1 Jun 2026 15:56:38 +0200 Subject: [PATCH] nodes: improved handling of memstat messages. --- apps/aqhome-nodes/db.c | 27 ++++++++++++++ apps/aqhome-nodes/devicesread.c | 13 +------ apps/aqhome-nodes/server.c | 9 ++++- apps/aqhome-tool/nodes/getnodes.c | 8 ++-- aqhome/dataclient/client.c | 25 +++++++++++++ aqhome/dataclient/client.h | 1 + aqhome/msg/ipc/m_ipc_tag16.c | 61 ++++++++++++++++++++++++------- aqhome/nodes/nodeinfo.t2d | 50 +++++++++++++++++++++++++ 8 files changed, 165 insertions(+), 29 deletions(-) diff --git a/apps/aqhome-nodes/db.c b/apps/aqhome-nodes/db.c index 01152b7..eed2350 100644 --- a/apps/aqhome-nodes/db.c +++ b/apps/aqhome-nodes/db.c @@ -18,6 +18,7 @@ #include "aqhome/msg/node/m_node.h" #include "aqhome/msg/node/m_sendstats.h" #include "aqhome/msg/node/m_recvstats.h" +#include "aqhome/msg/node/m_memstats.h" #include "aqhome/msg/node/m_value.h" #include "aqhome/msg/node/m_addr.h" #include "aqhome/msg/node/m_device.h" @@ -44,6 +45,7 @@ static void _handleMsgValue(AQH_NODE_SERVER *xo, const AQH_MESSAGE *msg); static void _handleAddressMsg(AQH_NODE_SERVER *xo, const AQH_MESSAGE *msg); static void _handleMsgComSendStat(AQH_NODE_SERVER *xo, const AQH_MESSAGE *msg); static void _handleMsgComRecvStat(AQH_NODE_SERVER *xo, const AQH_MESSAGE *msg); +static void _handleMsgMemStat(AQH_NODE_SERVER *xo, const AQH_MESSAGE *msg); static void _handleMsgDevice(AQH_OBJECT *o, AQH_NODE_SERVER *xo, const AQH_MESSAGE *msg); static void _handleMsgFlashReady(AQH_OBJECT *o, AQH_NODE_SERVER *xo, const AQH_MESSAGE *msg); @@ -76,6 +78,7 @@ void AQH_NodeServer_NodeMsgToDb(AQH_OBJECT *o, const AQH_MESSAGE *msg) switch(msgType) { case AQH_MSG_TYPE_COMSENDSTATS: _handleMsgComSendStat(xo, msg); break; case AQH_MSG_TYPE_COMRECVSTATS: _handleMsgComRecvStat(xo, msg); break; + case AQH_MSG_TYPE_MEMSTATS: _handleMsgMemStat(xo, msg); break; case AQH_MSG_TYPE_VALUE_REPORT: _handleMsgValue(xo, msg); break; case AQH_MSG_TYPE_NEED_ADDRESS: _handleAddressMsg(xo, msg); break; case AQH_MSG_TYPE_CLAIM_ADDRESS: _handleAddressMsg(xo, msg); break; @@ -195,6 +198,30 @@ void _handleMsgComRecvStat(AQH_NODE_SERVER *xo, const AQH_MESSAGE *msg) +void _handleMsgMemStat(AQH_NODE_SERVER *xo, const AQH_MESSAGE *msg) +{ + AQH_NODE_INFO *ni; + uint32_t uid; + + uid=AQH_MemStatsMessage_GetUid(msg); + ni=_getOrCreateNodeAndUpdateUidAddr(xo, msg, uid); + if (ni==NULL) { + DBG_INFO(AQH_LOGDOMAIN, "Error handling message"); + } + AQH_NodeInfo_SetStatsStackUsed(ni, AQH_MemStatsMessage_GetStackUsage(msg)); + AQH_NodeInfo_SetStatsBuffersUsed(ni, AQH_MemStatsMessage_GetBuffersUsed(msg)); + AQH_NodeInfo_SetStatsMaxBuffersUsed(ni, AQH_MemStatsMessage_GetMaxBuffersUsed(msg)); + AQH_NodeInfo_SetStatsRecvNoBuffer(ni, AQH_MemStatsMessage_GetRecvNoBufferErrors(msg)); + AQH_NodeInfo_SetStatsHeapUsed(ni, AQH_MemStatsMessage_GetHeapUsed(msg)); + AQH_NodeInfo_SetStatsHeapFree(ni, AQH_MemStatsMessage_GetHeapFree(msg)); + AQH_NodeInfo_SetStatsXramSize(ni, AQH_MemStatsMessage_GetXramSize(msg)); + + AQH_NodeDb_SetModified(xo->nodeDb); + _updateTimestampLastChange(ni); +} + + + void _handleMsgDevice(AQH_OBJECT *o, AQH_NODE_SERVER *xo, const AQH_MESSAGE *msg) { AQH_NODE_INFO *ni; diff --git a/apps/aqhome-nodes/devicesread.c b/apps/aqhome-nodes/devicesread.c index 5713f34..6bc5d08 100644 --- a/apps/aqhome-nodes/devicesread.c +++ b/apps/aqhome-nodes/devicesread.c @@ -250,17 +250,8 @@ AQHNODE_DEVICE *_readXmlDevice(GWEN_XMLNODE *deviceNode) AQHNODE_VALUE_LIST *valueList; valueList=_readXmlValueList(valuesNode); - if (valueList==NULL) { - DBG_INFO(NULL, "here"); - AQHNODE_Device_free(device); - return NULL; - } - AQHNODE_Device_SetValueList(device, valueList); - } - else { - DBG_INFO(NULL, "No element"); - AQHNODE_Device_free(device); - return NULL; + if (valueList) + AQHNODE_Device_SetValueList(device, valueList); } return device; diff --git a/apps/aqhome-nodes/server.c b/apps/aqhome-nodes/server.c index 5c57ef5..83c4058 100644 --- a/apps/aqhome-nodes/server.c +++ b/apps/aqhome-nodes/server.c @@ -983,8 +983,13 @@ void _forwardDataFromMemStatsMsgToBroker(AQH_NODE_SERVER *xo, const AQH_MESSAGE uid=AQH_MemStatsMessage_GetUid(msg); - _publishInt( xo, uid, "mem/buffersUsed", AQH_ValueModality_Stats, NULL, AQH_MemStatsMessage_GetBuffersUsed(msg)); - _publishInt( xo, uid, "mem/maxBuffersUsed", AQH_ValueModality_Stats, NULL, AQH_MemStatsMessage_GetMaxBuffersUsed(msg)); + _publishInt(xo, uid, "mem/buffersUsed", AQH_ValueModality_Stats, NULL, AQH_MemStatsMessage_GetBuffersUsed(msg)); + _publishInt(xo, uid, "mem/maxBuffersUsed", AQH_ValueModality_Stats, NULL, AQH_MemStatsMessage_GetMaxBuffersUsed(msg)); + _publishInt(xo, uid, "mem/stackused", AQH_ValueModality_Stats, NULL, AQH_MemStatsMessage_GetStackUsage(msg)); + _publishInt(xo, uid, "mem/buffersused", AQH_ValueModality_Stats, NULL, AQH_MemStatsMessage_GetBuffersUsed(msg)); + _publishInt(xo, uid, "mem/heapused", AQH_ValueModality_Stats, NULL, AQH_MemStatsMessage_GetHeapUsed(msg)); + _publishInt(xo, uid, "mem/heapfree", AQH_ValueModality_Stats, NULL, AQH_MemStatsMessage_GetHeapFree(msg)); + _publishInt(xo, uid, "mem/xramsize", AQH_ValueModality_Stats, NULL, AQH_MemStatsMessage_GetXramSize(msg)); } diff --git a/apps/aqhome-tool/nodes/getnodes.c b/apps/aqhome-tool/nodes/getnodes.c index 8cacc6e..a4114c7 100644 --- a/apps/aqhome-tool/nodes/getnodes.c +++ b/apps/aqhome-tool/nodes/getnodes.c @@ -176,13 +176,15 @@ void _printNode(const AQH_NODE_INFO *ni, int printAll) GWEN_Timestamp_GetHour(ts), GWEN_Timestamp_GetMinute(ts), GWEN_Timestamp_GetSecond(ts)); - fprintf(stdout, "pkg out: %d, pkg in: %d, collisions: %d, busy: %d, crc: %d, io: %d\n", + fprintf(stdout, "pkg out: %d, pkg in: %d, busy: %d, crc: %d, io: %d, heap used: %d, heap free: %d, xram: %d\n", AQH_NodeInfo_GetStatsPacketsOut(ni), AQH_NodeInfo_GetStatsPacketsIn(ni), - AQH_NodeInfo_GetStatsCollisions(ni), AQH_NodeInfo_GetStatsBusy(ni), AQH_NodeInfo_GetStatsCrcErrors(ni), - AQH_NodeInfo_GetStatsIoErrors(ni)); + AQH_NodeInfo_GetStatsIoErrors(ni), + AQH_NodeInfo_GetStatsHeapUsed(ni), + AQH_NodeInfo_GetStatsHeapFree(ni), + AQH_NodeInfo_GetStatsXramSize(ni)); } } diff --git a/aqhome/dataclient/client.c b/aqhome/dataclient/client.c index c335a8b..0c4a0ac 100644 --- a/aqhome/dataclient/client.c +++ b/aqhome/dataclient/client.c @@ -248,6 +248,31 @@ AQH_DEVICE_LIST *AQH_DataClient_GetDevices(AQH_DATACLIENT *dc, const char *devic +AQH_DEVICE *AQH_DataClient_GetDeviceByName(AQH_DATACLIENT *dc, const char *deviceName) +{ + if (deviceName && *deviceName) { + AQH_DEVICE_LIST *deviceList; + + deviceList=AQH_DataClient_GetDevices(dc, deviceName); + if (deviceList) { + AQH_DEVICE *device; + + device=AQH_Device_List_First(deviceList); + if (device) { + AQH_Device_List_Del(device); + AQH_Device_List_free(deviceList); + return device; + } + AQH_Device_List_free(deviceList); + } + } + + return NULL; +} + + + + AQH_VALUE_LIST *AQH_DataClient_GetValues(AQH_DATACLIENT *dc, const char *deviceName, int modality) { if (dc) { diff --git a/aqhome/dataclient/client.h b/aqhome/dataclient/client.h index 99f8266..f05a04a 100644 --- a/aqhome/dataclient/client.h +++ b/aqhome/dataclient/client.h @@ -35,6 +35,7 @@ AQHOME_API int AQH_DataClient_Disconnect(AQH_DATACLIENT *dc); AQHOME_API AQH_DEVICE_LIST *AQH_DataClient_GetDevices(AQH_DATACLIENT *dc, const char *deviceName); +AQHOME_API AQH_DEVICE *AQH_DataClient_GetDeviceByName(AQH_DATACLIENT *dc, const char *deviceName); AQHOME_API AQH_VALUE_LIST *AQH_DataClient_GetValues(AQH_DATACLIENT *dc, const char *deviceName, int modality); AQHOME_API uint64_t AQH_DataClient_GetFirstData(AQH_DATACLIENT *dc, const char *valueName, uint64_t *dataPtr, uint64_t maxNum); diff --git a/aqhome/msg/ipc/m_ipc_tag16.c b/aqhome/msg/ipc/m_ipc_tag16.c index f151e75..d5726f1 100644 --- a/aqhome/msg/ipc/m_ipc_tag16.c +++ b/aqhome/msg/ipc/m_ipc_tag16.c @@ -49,19 +49,26 @@ #define AQH_IPCDATA_DEVICE_TAGS_MANUFACTURER 0x0a #define AQH_IPCDATA_DEVICE_TAGS_TIMEOFCREATION 0x0b -#define AQH_IPCDATA_NODE_TAGS_BUSADDR 0x01 /* uint8_t */ -#define AQH_IPCDATA_NODE_TAGS_UID 0x02 /* uint32_t */ -#define AQH_IPCDATA_NODE_TAGS_MANUFACTURER 0x03 /* uint32_t */ -#define AQH_IPCDATA_NODE_TAGS_DEVICETYPE 0x04 /* uint16_t */ -#define AQH_IPCDATA_NODE_TAGS_DEVICEVERSION 0x05 /* uint16_t */ -#define AQH_IPCDATA_NODE_TAGS_FIRMWAREVERSION 0x06 /* uint32_t */ -#define AQH_IPCDATA_NODE_TAGS_LASTCHANGE 0x07 /* uint64_t */ -#define AQH_IPCDATA_NODE_TAGS_STATSPACKETSOUT 0x08 /* uint16_t */ -#define AQH_IPCDATA_NODE_TAGS_STATSPACKETSIN 0x09 /* uint16_t */ -#define AQH_IPCDATA_NODE_TAGS_STATSCOLLISIONS 0x0a /* uint16_t */ -#define AQH_IPCDATA_NODE_TAGS_STATSBUSY 0x0b /* uint16_t */ -#define AQH_IPCDATA_NODE_TAGS_STATSCRCERRORS 0x0c /* uint16_t */ -#define AQH_IPCDATA_NODE_TAGS_STATSIOERRORS 0x0d /* uint16_t */ +#define AQH_IPCDATA_NODE_TAGS_BUSADDR 0x01 /* uint8_t */ +#define AQH_IPCDATA_NODE_TAGS_UID 0x02 /* uint32_t */ +#define AQH_IPCDATA_NODE_TAGS_MANUFACTURER 0x03 /* uint32_t */ +#define AQH_IPCDATA_NODE_TAGS_DEVICETYPE 0x04 /* uint16_t */ +#define AQH_IPCDATA_NODE_TAGS_DEVICEVERSION 0x05 /* uint16_t */ +#define AQH_IPCDATA_NODE_TAGS_FIRMWAREVERSION 0x06 /* uint32_t */ +#define AQH_IPCDATA_NODE_TAGS_LASTCHANGE 0x07 /* uint64_t */ +#define AQH_IPCDATA_NODE_TAGS_STATSPACKETSOUT 0x08 /* uint16_t */ +#define AQH_IPCDATA_NODE_TAGS_STATSPACKETSIN 0x09 /* uint16_t */ +#define AQH_IPCDATA_NODE_TAGS_STATSCOLLISIONS 0x0a /* uint16_t */ +#define AQH_IPCDATA_NODE_TAGS_STATSBUSY 0x0b /* uint16_t */ +#define AQH_IPCDATA_NODE_TAGS_STATSCRCERRORS 0x0c /* uint16_t */ +#define AQH_IPCDATA_NODE_TAGS_STATSIOERRORS 0x0d /* uint16_t */ +#define AQH_IPCDATA_NODE_TAGS_STATSSTACKUSED 0x0e /* uint16_t */ +#define AQH_IPCDATA_NODE_TAGS_STATSBUFFERSUSED 0x0f /* uint16_t */ +#define AQH_IPCDATA_NODE_TAGS_STATSMAXBUFFERSUSED 0x10 /* uint16_t */ +#define AQH_IPCDATA_NODE_TAGS_STATSRECVNOBUFFER 0x11 /* uint16_t */ +#define AQH_IPCDATA_NODE_TAGS_STATSHEAPUSED 0x12 /* uint16_t */ +#define AQH_IPCDATA_NODE_TAGS_STATSHEAPFREE 0x13 /* uint16_t */ +#define AQH_IPCDATA_NODE_TAGS_STATSXRAM 0x14 /* uint16_t */ @@ -675,6 +682,13 @@ void _writeNodeInfoFieldsAsTagsToBuffer(const AQH_NODE_INFO *ni, GWEN_BUFFER *bu GWEN_Tag16_WriteUint16TagToBuffer(AQH_IPCDATA_NODE_TAGS_STATSBUSY, AQH_NodeInfo_GetStatsBusy(ni), buf); GWEN_Tag16_WriteUint16TagToBuffer(AQH_IPCDATA_NODE_TAGS_STATSCRCERRORS, AQH_NodeInfo_GetStatsCrcErrors(ni), buf); GWEN_Tag16_WriteUint16TagToBuffer(AQH_IPCDATA_NODE_TAGS_STATSIOERRORS, AQH_NodeInfo_GetStatsIoErrors(ni), buf); + GWEN_Tag16_WriteUint16TagToBuffer(AQH_IPCDATA_NODE_TAGS_STATSSTACKUSED, AQH_NodeInfo_GetStatsStackUsed(ni), buf); + GWEN_Tag16_WriteUint16TagToBuffer(AQH_IPCDATA_NODE_TAGS_STATSBUFFERSUSED, AQH_NodeInfo_GetStatsBuffersUsed(ni), buf); + GWEN_Tag16_WriteUint16TagToBuffer(AQH_IPCDATA_NODE_TAGS_STATSMAXBUFFERSUSED, AQH_NodeInfo_GetStatsMaxBuffersUsed(ni), buf); + GWEN_Tag16_WriteUint16TagToBuffer(AQH_IPCDATA_NODE_TAGS_STATSRECVNOBUFFER, AQH_NodeInfo_GetStatsRecvNoBuffer(ni), buf); + GWEN_Tag16_WriteUint16TagToBuffer(AQH_IPCDATA_NODE_TAGS_STATSHEAPUSED, AQH_NodeInfo_GetStatsHeapUsed(ni), buf); + GWEN_Tag16_WriteUint16TagToBuffer(AQH_IPCDATA_NODE_TAGS_STATSHEAPFREE, AQH_NodeInfo_GetStatsHeapFree(ni), buf); + GWEN_Tag16_WriteUint16TagToBuffer(AQH_IPCDATA_NODE_TAGS_STATSXRAM, AQH_NodeInfo_GetStatsXramSize(ni), buf); } @@ -789,6 +803,27 @@ AQH_NODE_INFO *_readNodeInfoFromTag(const uint8_t *ptr, uint32_t len) case AQH_IPCDATA_NODE_TAGS_STATSIOERRORS: AQH_NodeInfo_SetStatsIoErrors(ni, GWEN_Tag16_GetTagDataAsUint16(tag, 0)); break; + case AQH_IPCDATA_NODE_TAGS_STATSSTACKUSED: + AQH_NodeInfo_SetStatsStackUsed(ni, GWEN_Tag16_GetTagDataAsUint16(tag, 0)); + break; + case AQH_IPCDATA_NODE_TAGS_STATSBUFFERSUSED: + AQH_NodeInfo_SetStatsBuffersUsed(ni, GWEN_Tag16_GetTagDataAsUint16(tag, 0)); + break; + case AQH_IPCDATA_NODE_TAGS_STATSMAXBUFFERSUSED: + AQH_NodeInfo_SetStatsMaxBuffersUsed(ni, GWEN_Tag16_GetTagDataAsUint16(tag, 0)); + break; + case AQH_IPCDATA_NODE_TAGS_STATSRECVNOBUFFER: + AQH_NodeInfo_SetStatsRecvNoBuffer(ni, GWEN_Tag16_GetTagDataAsUint16(tag, 0)); + break; + case AQH_IPCDATA_NODE_TAGS_STATSHEAPUSED: + AQH_NodeInfo_SetStatsHeapUsed(ni, GWEN_Tag16_GetTagDataAsUint16(tag, 0)); + break; + case AQH_IPCDATA_NODE_TAGS_STATSHEAPFREE: + AQH_NodeInfo_SetStatsHeapFree(ni, GWEN_Tag16_GetTagDataAsUint16(tag, 0)); + break; + case AQH_IPCDATA_NODE_TAGS_STATSXRAM: + AQH_NodeInfo_SetStatsXramSize(ni, GWEN_Tag16_GetTagDataAsUint16(tag, 0)); + break; default: DBG_INFO(AQH_LOGDOMAIN, "Unhandled tag typ %d (%02x)", tagType, tagType); break; diff --git a/aqhome/nodes/nodeinfo.t2d b/aqhome/nodes/nodeinfo.t2d index be760b0..24b4f90 100644 --- a/aqhome/nodes/nodeinfo.t2d +++ b/aqhome/nodes/nodeinfo.t2d @@ -134,6 +134,56 @@ + + 0 + 0 + public + + + + + 0 + 0 + public + + + + + 0 + 0 + public + + + + + 0 + 0 + public + + + + + 0 + 0 + public + + + + + 0 + 0 + public + + + + + 0 + 0 + public + + + + NULL NULL