/**************************************************************************** * This file is part of the project AqHome. * AqHome (c) by 2023 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 "./c_connect.h" #include "./c_updatedata.h" #include "./c_getdatapoints.h" #include "./c_getlastdatapoint.h" #include "./c_getvalues.h" #include "./c_setdata.h" #include "./aqhome_data_p.h" #include "aqhome/ipc/data/ipc_data.h" #include "aqhome/ipc/data/msg_data_values.h" #include "aqhome/ipc/data/msg_data_datapoints.h" #include "aqhome/ipc/msg_ipc_result.h" #include #include #include #include #include /* ------------------------------------------------------------------------------------------------ * defines * ------------------------------------------------------------------------------------------------ */ /* ------------------------------------------------------------------------------------------------ * forward declarations * ------------------------------------------------------------------------------------------------ */ static void _readAndHandleIpcMessages(AQHOME_DATA *aqh); static void _handleIpcEndpoint(AQHOME_DATA *aqh, GWEN_MSG_ENDPOINT *ep); static void _handleIpcMsg(AQHOME_DATA *aqh, GWEN_MSG_ENDPOINT *ep, const GWEN_MSG *msg); /* ------------------------------------------------------------------------------------------------ * implementations * ------------------------------------------------------------------------------------------------ */ void AqHomeData_Loop(AQHOME_DATA *aqh, int timeoutInMsecs) { if (aqh) { GWEN_MsgEndpoint_IoLoop(aqh->ipcdEndpoint, timeoutInMsecs); _readAndHandleIpcMessages(aqh); } } int AqHomeData_WriteStorageIfChanged(AQHOME_DATA *aqh) { if (AQH_Storage_GetRuntimeFlags(aqh->storage) & AQH_STORAGE_RTFLAGS_MODIFIED) { int rv; DBG_INFO(NULL, "Storage modified, writing statefile"); rv=AqHomeData_LockStorage(aqh); if (rv<0) { DBG_INFO(NULL, "Error locking storage (%d)", rv); return rv; } rv=AQH_Storage_WriteState(aqh->storage); if (rv<0) { DBG_INFO(NULL, "Error writing state file (%d)", rv); AqHomeData_UnlockStorage(aqh); return rv; } rv=AqHomeData_UnlockStorage(aqh); if (rv<0) { DBG_INFO(NULL, "Error unlocking storage (%d)", rv); return rv; } } return 0; } void _readAndHandleIpcMessages(AQHOME_DATA *aqh) { if (aqh->ipcdEndpoint) { GWEN_MSG_ENDPOINT *ep; ep=GWEN_MsgEndpoint_Tree2_GetFirstChild(aqh->ipcdEndpoint); while(ep) { _handleIpcEndpoint(aqh, ep); ep=GWEN_MsgEndpoint_Tree2_GetNext(ep); } } } void _handleIpcEndpoint(AQHOME_DATA *aqh, GWEN_MSG_ENDPOINT *ep) { GWEN_MSG *msg; while( (msg=GWEN_MsgEndpoint_TakeFirstReceivedMessage(ep)) ) { _handleIpcMsg(aqh, ep, msg); GWEN_Msg_free(msg); } } void _handleIpcMsg(AQHOME_DATA *aqh, GWEN_MSG_ENDPOINT *ep, const GWEN_MSG *msg) { uint16_t code; /* exec IPC message */ code=GWEN_IpcMsg_GetCode(msg); DBG_ERROR(AQH_LOGDOMAIN, "Received IPC packet %d", (int) code); switch(code) { case AQH_MSGTYPE_IPC_DATA_CONNECT_REQ: AqHomeData_HandleConnect(aqh, ep, msg); break; case AQH_MSGTYPE_IPC_DATA_UPDATEDATA: AqHomeData_HandleUpdateData(aqh, ep, msg); break; case AQH_MSGTYPE_IPC_DATA_GETVALUES_REQ: AqHomeData_HandleGetValues(aqh, ep, msg); break; case AQH_MSGTYPE_IPC_DATA_GETDATA_REQ: AqHomeData_HandleGetDataPoints(aqh, ep, msg); break; case AQH_MSGTYPE_IPC_DATA_GETLASTDATA_REQ: AqHomeData_HandleGetLastDataPoint(aqh, ep, msg); break; case AQH_MSGTYPE_IPC_DATA_SETDATA: AqHomeData_HandleSetData(aqh, ep, msg); break; default: break; } }