/**************************************************************************** * This file is part of the project AqHome. * AqHome (c) by 2024 Martin Preuss, all rights reserved. * * The license for this file can be found in the file COPYING which you * should have received along with this file. ****************************************************************************/ #ifdef HAVE_CONFIG_H # include #endif #include "./loop.h" #include "./aqhome_react_p.h" #include "aqhome/ipc/data/ipc_data.h" #include "aqhome/ipc/data/msg_data_multidata.h" #include "aqhome/ipc/msg_ipc_tag16.h" #include #include /* ------------------------------------------------------------------------------------------------ * defines * ------------------------------------------------------------------------------------------------ */ /* ------------------------------------------------------------------------------------------------ * forward declarations * ------------------------------------------------------------------------------------------------ */ static void _handleDataResponse(GWEN_MSG *msg); /* ------------------------------------------------------------------------------------------------ * implementations * ------------------------------------------------------------------------------------------------ */ void AqHomeReact_Loop(AQHOME_REACT *aqh, int timeoutInMilliSecs) { GWEN_MSG *msg; GWEN_MsgEndpoint_IoLoop(aqh->brokerEndpoint, timeoutInMilliSecs); msg=GWEN_MsgEndpoint_TakeFirstReceivedMessage(aqh->brokerEndpoint); if (msg) { uint16_t code; code=GWEN_IpcMsg_GetCode(msg); if (code==AQH_MSGTYPE_IPC_DATA_DATACHANGED) { DBG_INFO(NULL, "Received expected IPC message"); _handleDataResponse(msg); } else if (code==AQH_MSGTYPE_IPC_DATA_RESULT) { DBG_INFO(NULL, "Received IPC result message, ignoring"); } else { DBG_INFO(NULL, "Received unexpected message %d (%x)", code, code); } GWEN_Msg_free(msg); } } void _handleDataResponse(GWEN_MSG *msg) { AQH_VALUE *value; const GWEN_TAG16 *tag; unsigned int numberOfPoints; const uint64_t *dataPoints; AQH_MultiDataDataIpcMsg_Parse(msg, 0); value=AQH_MultiDataDataIpcMsg_ReadValue(msg); tag=AQH_Tag16IpcMsg_FindFirstTagByType(msg, AQH_MSGDATA_MULTIDATA_TAGS_DATA); numberOfPoints=(tag?GWEN_Tag16_GetTagLength(tag):0)/(2*sizeof(uint64_t)); dataPoints=tag?((const uint64_t*) GWEN_Tag16_GetTagData(tag)):NULL; if (numberOfPoints>0 && dataPoints) { uint32_t i; for(i=0; i