/**************************************************************************** * 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 "./c_getlastdatapoint.h" #include "./aqhome_data_p.h" #include "aqhome/ipc/data/ipc_data.h" #include "aqhome/ipc/data/msg_data_value.h" #include "aqhome/ipc/data/msg_data_singledata.h" #include "aqhome/ipc/endpoint_ipc.h" #include "aqhome/ipc/msg_ipc_result.h" #include "aqhome/ipc/msg_ipc_tag16.h" #include #include /* ------------------------------------------------------------------------------------------------ * defines * ------------------------------------------------------------------------------------------------ */ /* ------------------------------------------------------------------------------------------------ * forward declarations * ------------------------------------------------------------------------------------------------ */ /* ------------------------------------------------------------------------------------------------ * implementations * ------------------------------------------------------------------------------------------------ */ void AqHomeData_HandleGetLastDataPoint(AQHOME_DATA *aqh, GWEN_MSG_ENDPOINT *ep, const GWEN_MSG *recvdMsg) { GWEN_MSG *outMsg; int resultCode=AQH_MSG_IPC_SUCCESS; if (AQH_IpcEndpoint_GetPermissions(ep) & AQH_IPCENDPOINT_PERMS_READDATA) { GWEN_TAG16_LIST *tagList; const AQH_VALUE *value; char *valueName=NULL; tagList=AQH_Tag16IpcMsg_ParseTags(recvdMsg, 0); if (tagList) { const GWEN_TAG16 *tag; tag=GWEN_Tag16_List_FindFirstByTagType(tagList, AQH_MSGDATA_VALUE_TAGS_NAME); valueName=tag?GWEN_Tag16_GetTagDataAsNewString(tag, NULL):NULL; } value=AQH_Storage_GetValueByNameForSystem(aqh->storage, valueName); if (value) { uint64_t timestamp=0; double data=0.0; int rv; rv=AQH_Storage_GetLastDataPoint(aqh->storage, AQH_Value_GetId(value), ×tamp, &data); if (rv<0) { switch(rv) { case GWEN_ERROR_INVALID: resultCode=AQH_MSG_IPC_ERROR_INVALID; break; case GWEN_ERROR_NO_DATA: resultCode=AQH_MSG_IPC_ERROR_NODATA; break; default: resultCode=AQH_MSG_IPC_ERROR_GENERIC; break; } } else { outMsg=AQH_SingleDataDataIpcMsg_new(AQH_MSGTYPE_IPC_DATA_GETLASTDATA_RSP, AQH_Value_GetNameForSystem(value), AQH_Value_GetValueUnits(value), AQH_Value_GetValueType(value), timestamp, data); GWEN_MsgEndpoint_AddSendMessage(ep, outMsg); free(valueName); return; } } else { DBG_INFO(NULL, "Value \"%s\" not found", valueName); resultCode=AQH_MSG_IPC_ERROR_NOTFOUND; } free(valueName); } else { DBG_ERROR(AQH_LOGDOMAIN, "No permissions to read data"); resultCode=AQH_MSG_IPC_ERROR_PERMS; } outMsg=AQH_ResultIpcMsg_new(AQH_MSGTYPE_IPC_DATA_RESULT, resultCode); GWEN_MsgEndpoint_AddSendMessage(ep, outMsg); }