diff --git a/apps/aqhome-data/main.c b/apps/aqhome-data/main.c index 5f36068..b397bca 100644 --- a/apps/aqhome-data/main.c +++ b/apps/aqhome-data/main.c @@ -146,7 +146,7 @@ void _runService(AQH_OBJECT *aqh, AQH_EVENT_LOOP *eventLoop) while(!stopService) { time_t now; - DBG_ERROR(NULL, "Next loop (%d clients)", AqHomeDataServer_GetClientNum(aqh)); + DBG_INFO(NULL, "Next loop (%d clients)", AqHomeDataServer_GetClientNum(aqh)); AQH_EventLoop_Run(eventLoop, 2000); AqHomeDataServer_HandleClientMsgs(aqh); diff --git a/apps/aqhome-data/s_addvalue.c b/apps/aqhome-data/s_addvalue.c index 6583fd2..dca76f0 100644 --- a/apps/aqhome-data/s_addvalue.c +++ b/apps/aqhome-data/s_addvalue.c @@ -29,30 +29,24 @@ * ------------------------------------------------------------------------------------------------ */ -void AqHomeDataServer_HandleAddValue(AQH_OBJECT *o, AQH_OBJECT *ep, const AQH_MESSAGE *msg) +void AqHomeDataServer_HandleAddValue(AQH_OBJECT *o, AQH_OBJECT *ep, const AQH_MESSAGE *msg, const GWEN_TAG16_LIST *tagList) { AQHOME_SERVER *xo; xo=AqHomeDataServer_GetServerData(o); if (xo) { AQH_MESSAGE *outMsg; - GWEN_TAG16_LIST *tagList; int resultCode=AQH_MSGDATA_RESULT_SUCCESS; + AQH_VALUE *recvdValue; - tagList=AQH_IpcMessageTag16_ParsePayload(msg, 0); - if (tagList) { - AQH_VALUE *recvdValue; + recvdValue=AQH_IpcdMessageValues_ReadFirstValue(tagList); + if (recvdValue) { + AQH_VALUE *value; - recvdValue=AQH_IpcdMessageValues_ReadFirstValue(tagList); - if (recvdValue) { - AQH_VALUE *value; - - value=AqHomeDataServer_GetOrCreateValueForDriverWithTemplate(o, ep, recvdValue); - if (value==NULL) - resultCode=AQH_MSGDATA_RESULT_ERROR_PERMS; - AQH_Value_free(recvdValue); - } - GWEN_Tag16_List_free(tagList); + value=AqHomeDataServer_GetOrCreateValueForDriverWithTemplate(o, ep, recvdValue); + if (value==NULL) + resultCode=AQH_MSGDATA_RESULT_ERROR_PERMS; + AQH_Value_free(recvdValue); } else resultCode=AQH_MSGDATA_RESULT_ERROR_BADDATA; diff --git a/apps/aqhome-data/s_addvalue.h b/apps/aqhome-data/s_addvalue.h index aa1033b..8fb72ef 100644 --- a/apps/aqhome-data/s_addvalue.h +++ b/apps/aqhome-data/s_addvalue.h @@ -12,8 +12,10 @@ #include "./server.h" +#include -void AqHomeDataServer_HandleAddValue(AQH_OBJECT *o, AQH_OBJECT *ep, const AQH_MESSAGE *msg); + +void AqHomeDataServer_HandleAddValue(AQH_OBJECT *o, AQH_OBJECT *ep, const AQH_MESSAGE *msg, const GWEN_TAG16_LIST *tagList); diff --git a/apps/aqhome-data/s_annvalue.c b/apps/aqhome-data/s_annvalue.c index a3074e4..8cebbda 100644 --- a/apps/aqhome-data/s_annvalue.c +++ b/apps/aqhome-data/s_annvalue.c @@ -29,24 +29,18 @@ * ------------------------------------------------------------------------------------------------ */ -void AqHomeDataServer_HandleAnnounceValue(AQH_OBJECT *o, AQH_OBJECT *ep, const AQH_MESSAGE *msg) +void AqHomeDataServer_HandleAnnounceValue(AQH_OBJECT *o, AQH_OBJECT *ep, const AQH_MESSAGE *msg, const GWEN_TAG16_LIST *tagList) { AQHOME_SERVER *xo; xo=AqHomeDataServer_GetServerData(o); if (xo) { - GWEN_TAG16_LIST *tagList; + AQH_VALUE *recvdValue; - tagList=AQH_IpcMessageTag16_ParsePayload(msg, 0); - if (tagList) { - AQH_VALUE *recvdValue; - - recvdValue=AQH_IpcdMessageValues_ReadFirstValue(tagList); - if (recvdValue) { - AqHomeDataServer_GetOrCreateValueForDriverWithTemplate(o, ep, recvdValue); - AQH_Value_free(recvdValue); - } - GWEN_Tag16_List_free(tagList); + recvdValue=AQH_IpcdMessageValues_ReadFirstValue(tagList); + if (recvdValue) { + AqHomeDataServer_GetOrCreateValueForDriverWithTemplate(o, ep, recvdValue); + AQH_Value_free(recvdValue); } } } diff --git a/apps/aqhome-data/s_annvalue.h b/apps/aqhome-data/s_annvalue.h index b5bbf77..5f852a1 100644 --- a/apps/aqhome-data/s_annvalue.h +++ b/apps/aqhome-data/s_annvalue.h @@ -12,8 +12,10 @@ #include "./server.h" +#include -void AqHomeDataServer_HandleAnnounceValue(AQH_OBJECT *o, AQH_OBJECT *ep, const AQH_MESSAGE *msg); + +void AqHomeDataServer_HandleAnnounceValue(AQH_OBJECT *o, AQH_OBJECT *ep, const AQH_MESSAGE *msg, const GWEN_TAG16_LIST *tagList); diff --git a/apps/aqhome-data/s_connect.c b/apps/aqhome-data/s_connect.c index 8486d39..2a8b74c 100644 --- a/apps/aqhome-data/s_connect.c +++ b/apps/aqhome-data/s_connect.c @@ -29,9 +29,8 @@ * ------------------------------------------------------------------------------------------------ */ -void AqHomeDataServer_HandleConnect(GWEN_UNUSED AQH_OBJECT *o, AQH_OBJECT *ep, const AQH_MESSAGE *msg) +void AqHomeDataServer_HandleConnect(GWEN_UNUSED AQH_OBJECT *o, AQH_OBJECT *ep, const AQH_MESSAGE *msg, const GWEN_TAG16_LIST *tagList) { - GWEN_TAG16_LIST *tagList; AQH_MESSAGE *outMsg; int resultCode=AQH_MSGDATA_RESULT_SUCCESS; char *clientId=NULL; @@ -39,7 +38,6 @@ void AqHomeDataServer_HandleConnect(GWEN_UNUSED AQH_OBJECT *o, AQH_OBJECT *ep, c char *passw=NULL; uint32_t flags; - tagList=AQH_IpcMessageTag16_ParsePayload(msg, 0); clientId=AQH_Tag16_GetTagDataAsNewString(tagList, AQH_MSG_CONNECT_TAGS_CLIENTID, NULL); userId=AQH_Tag16_GetTagDataAsNewString(tagList, AQH_MSG_CONNECT_TAGS_USERID, NULL); flags=AQH_Tag16_GetTagDataAsUint32(tagList, AQH_MSG_CONNECT_TAGS_FLAGS, 0); diff --git a/apps/aqhome-data/s_connect.h b/apps/aqhome-data/s_connect.h index 5a005aa..cf460e3 100644 --- a/apps/aqhome-data/s_connect.h +++ b/apps/aqhome-data/s_connect.h @@ -12,8 +12,10 @@ #include "./server.h" +#include -void AqHomeDataServer_HandleConnect(AQH_OBJECT *o, AQH_OBJECT *ep, const AQH_MESSAGE *msg); + +void AqHomeDataServer_HandleConnect(AQH_OBJECT *o, AQH_OBJECT *ep, const AQH_MESSAGE *msg, const GWEN_TAG16_LIST *tagList); diff --git a/apps/aqhome-data/s_getdatapoints.c b/apps/aqhome-data/s_getdatapoints.c index 795cbbd..e88eb2d 100644 --- a/apps/aqhome-data/s_getdatapoints.c +++ b/apps/aqhome-data/s_getdatapoints.c @@ -60,7 +60,7 @@ static void _getAndSendLastDatapoint(AQH_STORAGE *storage, AQH_OBJECT *ep, const */ -void AqHomeDataServer_HandleGetDataPoints(AQH_OBJECT *o, AQH_OBJECT *ep, const AQH_MESSAGE *recvdMsg) +void AqHomeDataServer_HandleGetDataPoints(AQH_OBJECT *o, AQH_OBJECT *ep, const AQH_MESSAGE *recvdMsg, const GWEN_TAG16_LIST *tagList) { AQHOME_SERVER *xo; @@ -70,44 +70,34 @@ void AqHomeDataServer_HandleGetDataPoints(AQH_OBJECT *o, AQH_OBJECT *ep, const A refMsgId=AQH_IpcMessage_GetMsgId(recvdMsg); if (AQH_Endpoint_GetPermissions(ep) & AQH_ENDPOINT_PERMS_READDATA) { - GWEN_TAG16_LIST *tagList; + char *valueName; - tagList=AQH_IpcMessageTag16_ParsePayload(recvdMsg, 0); - if (tagList) { - char *valueName; + valueName=AQH_Tag16_GetTagDataAsNewString(tagList, AQH_MSGDATA_GETDATA_TAGS_NAME, NULL); + if (valueName && *valueName) { + AQH_VALUE *value; + uint64_t tsBegin; + uint64_t tsEnd; + uint64_t numRequested; - valueName=AQH_Tag16_GetTagDataAsNewString(tagList, AQH_MSGDATA_GETDATA_TAGS_NAME, NULL); - if (valueName && *valueName) { - AQH_VALUE *value; - uint64_t tsBegin; - uint64_t tsEnd; - uint64_t numRequested; + tsBegin=AQH_Tag16_GetTagDataAsUint64(tagList, AQH_MSGDATA_GETDATA_TAGS_BEGIN, 0); + tsEnd=AQH_Tag16_GetTagDataAsUint64(tagList, AQH_MSGDATA_GETDATA_TAGS_END, 0); + numRequested=AQH_Tag16_GetTagDataAsUint64(tagList, AQH_MSGDATA_GETDATA_TAGS_NUM, 0); - tsBegin=AQH_Tag16_GetTagDataAsUint64(tagList, AQH_MSGDATA_GETDATA_TAGS_BEGIN, 0); - tsEnd=AQH_Tag16_GetTagDataAsUint64(tagList, AQH_MSGDATA_GETDATA_TAGS_END, 0); - numRequested=AQH_Tag16_GetTagDataAsUint64(tagList, AQH_MSGDATA_GETDATA_TAGS_NUM, 0); + value=AQH_Storage_GetValueByNameForSystem(xo->storage, valueName); + if (value) { + int resultCode; - value=AQH_Storage_GetValueByNameForSystem(xo->storage, valueName); - if (value) { - int resultCode; - - resultCode=_getAndSendDataPoints(xo->storage, ep, value, tsBegin, tsEnd, numRequested, refMsgId); - AqHomeDataServer_SendResponseResultToEndpoint(ep, refMsgId, resultCode); - } - else { - DBG_INFO(NULL, "Value \"%s\" does not exist", valueName); - AqHomeDataServer_SendResponseResultToEndpoint(ep, refMsgId, AQH_MSGDATA_RESULT_ERROR_NOTFOUND); - } - free(valueName); + resultCode=_getAndSendDataPoints(xo->storage, ep, value, tsBegin, tsEnd, numRequested, refMsgId); + AqHomeDataServer_SendResponseResultToEndpoint(ep, refMsgId, resultCode); } else { - DBG_INFO(NULL, "Missing value name"); - AqHomeDataServer_SendResponseResultToEndpoint(ep, refMsgId, AQH_MSGDATA_RESULT_ERROR_BADDATA); + DBG_INFO(NULL, "Value \"%s\" does not exist", valueName); + AqHomeDataServer_SendResponseResultToEndpoint(ep, refMsgId, AQH_MSGDATA_RESULT_ERROR_NOTFOUND); } - GWEN_Tag16_List_free(tagList); + free(valueName); } else { - DBG_ERROR(AQH_LOGDOMAIN, "No value"); + DBG_INFO(NULL, "Missing value name"); AqHomeDataServer_SendResponseResultToEndpoint(ep, refMsgId, AQH_MSGDATA_RESULT_ERROR_BADDATA); } } diff --git a/apps/aqhome-data/s_getdatapoints.h b/apps/aqhome-data/s_getdatapoints.h index a47c69f..82cec9a 100644 --- a/apps/aqhome-data/s_getdatapoints.h +++ b/apps/aqhome-data/s_getdatapoints.h @@ -12,8 +12,10 @@ #include "./server.h" +#include -void AqHomeDataServer_HandleGetDataPoints(AQH_OBJECT *o, AQH_OBJECT *ep, const AQH_MESSAGE *recvdMsg); + +void AqHomeDataServer_HandleGetDataPoints(AQH_OBJECT *o, AQH_OBJECT *ep, const AQH_MESSAGE *recvdMsg, const GWEN_TAG16_LIST *tagList); diff --git a/apps/aqhome-data/s_getdevices.c b/apps/aqhome-data/s_getdevices.c index 27deb48..0830aeb 100644 --- a/apps/aqhome-data/s_getdevices.c +++ b/apps/aqhome-data/s_getdevices.c @@ -47,7 +47,7 @@ static void _sendDeviceList(AQH_OBJECT *ep, const AQH_DEVICE_LIST *vl, uint32_t * ------------------------------------------------------------------------------------------------ */ -void AqHomeDataServer_HandleGetDevices(AQH_OBJECT *o, AQH_OBJECT *ep, const AQH_MESSAGE *msg) +void AqHomeDataServer_HandleGetDevices(AQH_OBJECT *o, AQH_OBJECT *ep, const AQH_MESSAGE *msg, const GWEN_TAG16_LIST *tagList) { AQHOME_SERVER *xo; diff --git a/apps/aqhome-data/s_getdevices.h b/apps/aqhome-data/s_getdevices.h index 3216188..2f052fe 100644 --- a/apps/aqhome-data/s_getdevices.h +++ b/apps/aqhome-data/s_getdevices.h @@ -12,8 +12,10 @@ #include "./server.h" +#include -void AqHomeDataServer_HandleGetDevices(AQH_OBJECT *o, AQH_OBJECT *ep, const AQH_MESSAGE *msg); + +void AqHomeDataServer_HandleGetDevices(AQH_OBJECT *o, AQH_OBJECT *ep, const AQH_MESSAGE *msg, const GWEN_TAG16_LIST *tagList); diff --git a/apps/aqhome-data/s_getvalues.c b/apps/aqhome-data/s_getvalues.c index ca2796d..8fe4477 100644 --- a/apps/aqhome-data/s_getvalues.c +++ b/apps/aqhome-data/s_getvalues.c @@ -47,7 +47,7 @@ static void _sendValueList(AQH_OBJECT *ep, const AQH_VALUE_LIST *vl, uint32_t fl * ------------------------------------------------------------------------------------------------ */ -void AqHomeDataServer_HandleGetValues(AQH_OBJECT *o, AQH_OBJECT *ep, const AQH_MESSAGE *msg) +void AqHomeDataServer_HandleGetValues(AQH_OBJECT *o, AQH_OBJECT *ep, const AQH_MESSAGE *msg, const GWEN_TAG16_LIST *tagList) { AQHOME_SERVER *xo; diff --git a/apps/aqhome-data/s_getvalues.h b/apps/aqhome-data/s_getvalues.h index f606606..d39f6e5 100644 --- a/apps/aqhome-data/s_getvalues.h +++ b/apps/aqhome-data/s_getvalues.h @@ -12,8 +12,10 @@ #include "./server.h" +#include -void AqHomeDataServer_HandleGetValues(AQH_OBJECT *o, AQH_OBJECT *ep, const AQH_MESSAGE *msg); + +void AqHomeDataServer_HandleGetValues(AQH_OBJECT *o, AQH_OBJECT *ep, const AQH_MESSAGE *msg, const GWEN_TAG16_LIST *tagList); diff --git a/apps/aqhome-data/s_moddevice.c b/apps/aqhome-data/s_moddevice.c index 2b5c85f..26fc19f 100644 --- a/apps/aqhome-data/s_moddevice.c +++ b/apps/aqhome-data/s_moddevice.c @@ -34,7 +34,7 @@ */ -void AqHomeDataServer_HandleModDevice(AQH_OBJECT *o, AQH_OBJECT *ep, const AQH_MESSAGE *recvdMsg) +void AqHomeDataServer_HandleModDevice(AQH_OBJECT *o, AQH_OBJECT *ep, const AQH_MESSAGE *recvdMsg, const GWEN_TAG16_LIST *tagList) { AQHOME_SERVER *xo; @@ -43,61 +43,52 @@ void AqHomeDataServer_HandleModDevice(AQH_OBJECT *o, AQH_OBJECT *ep, const AQH_M int resultCode=AQH_MSGDATA_RESULT_SUCCESS; if (AQH_Endpoint_GetPermissions(ep) & AQH_ENDPOINT_PERMS_MODDEVICE) { - GWEN_TAG16_LIST *tagList; + AQH_DEVICE *device; - tagList=AQH_IpcMessageTag16_ParsePayload(recvdMsg, 0); - if (tagList) { - AQH_DEVICE *device; + device=AQH_IpcdMessageDevices_ReadFirstDevice(tagList); + if (device) { + const char *deviceNameForSystem; - device=AQH_IpcdMessageDevices_ReadFirstDevice(tagList); - if (device) { - const char *deviceNameForSystem; + deviceNameForSystem=AQH_Device_GetNameForSystem(device); + if (deviceNameForSystem && *deviceNameForSystem) { + AQH_DEVICE *storedDevice; - deviceNameForSystem=AQH_Device_GetNameForSystem(device); - if (deviceNameForSystem && *deviceNameForSystem) { - AQH_DEVICE *storedDevice; + storedDevice=AQH_Storage_GetDeviceByNameForSystem(xo->storage, deviceNameForSystem); + if (storedDevice) { + const char *s; - storedDevice=AQH_Storage_GetDeviceByNameForSystem(xo->storage, deviceNameForSystem); - if (storedDevice) { - const char *s; + s=AQH_Device_GetNameForGui(device); + if (s && *s) + AQH_Device_SetNameForGui(storedDevice, s); - s=AQH_Device_GetNameForGui(device); - if (s && *s) - AQH_Device_SetNameForGui(storedDevice, s); + s=AQH_Device_GetRoomName(device); + if (s && *s) + AQH_Device_SetRoomName(storedDevice, s); - s=AQH_Device_GetRoomName(device); - if (s && *s) - AQH_Device_SetRoomName(storedDevice, s); + s=AQH_Device_GetLocation(device); + if (s && *s) + AQH_Device_SetLocation(storedDevice, s); - s=AQH_Device_GetLocation(device); - if (s && *s) - AQH_Device_SetLocation(storedDevice, s); + s=AQH_Device_GetDescription(device); + if (s && *s) + AQH_Device_SetDescription(storedDevice, s); - s=AQH_Device_GetDescription(device); - if (s && *s) - AQH_Device_SetDescription(storedDevice, s); - - AQH_Storage_AddRuntimeFlags(xo->storage, AQH_STORAGE_RTFLAGS_MODIFIED); - resultCode=AQH_MSGDATA_RESULT_SUCCESS; - } - else { - DBG_INFO(NULL, "Device \"%s\" not found", deviceNameForSystem); - resultCode=AQH_MSGDATA_RESULT_ERROR_NOTFOUND; - } + AQH_Storage_AddRuntimeFlags(xo->storage, AQH_STORAGE_RTFLAGS_MODIFIED); + resultCode=AQH_MSGDATA_RESULT_SUCCESS; } else { - DBG_INFO(NULL, "No name for value"); + DBG_INFO(NULL, "Device \"%s\" not found", deviceNameForSystem); resultCode=AQH_MSGDATA_RESULT_ERROR_NOTFOUND; } } else { - DBG_INFO(NULL, "No device info in message"); - resultCode=AQH_MSGDATA_RESULT_ERROR_INVALID; + DBG_INFO(NULL, "No name for value"); + resultCode=AQH_MSGDATA_RESULT_ERROR_NOTFOUND; } } else { - DBG_INFO(NULL, "No tag16 list in message"); - resultCode=AQH_MSGDATA_RESULT_ERROR_BADDATA; + DBG_INFO(NULL, "No device info in message"); + resultCode=AQH_MSGDATA_RESULT_ERROR_INVALID; } } else { diff --git a/apps/aqhome-data/s_moddevice.h b/apps/aqhome-data/s_moddevice.h index c359915..c89d28d 100644 --- a/apps/aqhome-data/s_moddevice.h +++ b/apps/aqhome-data/s_moddevice.h @@ -12,8 +12,10 @@ #include "./server.h" +#include -void AqHomeDataServer_HandleModDevice(AQH_OBJECT *o, AQH_OBJECT *ep, const AQH_MESSAGE *recvdMsg); + +void AqHomeDataServer_HandleModDevice(AQH_OBJECT *o, AQH_OBJECT *ep, const AQH_MESSAGE *recvdMsg, const GWEN_TAG16_LIST *tagList); diff --git a/apps/aqhome-data/s_setdata.c b/apps/aqhome-data/s_setdata.c index ebffd39..f129818 100644 --- a/apps/aqhome-data/s_setdata.c +++ b/apps/aqhome-data/s_setdata.c @@ -60,75 +60,69 @@ static void _subRqAbort(AQH_MSG_REQUEST *rq, int reason); * ------------------------------------------------------------------------------------------------ */ -void AqHomeDataServer_HandleSetData(AQH_OBJECT *o, AQH_OBJECT *epSrc, const AQH_MESSAGE *recvdMsg) +void AqHomeDataServer_HandleSetData(AQH_OBJECT *o, AQH_OBJECT *epSrc, const AQH_MESSAGE *recvdMsg, const GWEN_TAG16_LIST *tagList) { AQHOME_SERVER *xo; xo=AqHomeDataServer_GetServerData(o); if (xo) { uint32_t msgId; - GWEN_TAG16_LIST *tagList; + AQH_VALUE *recvdValue; msgId=AQH_IpcMessage_GetMsgId(recvdMsg); DBG_INFO(NULL, "Received IPC SetDataRequest message (msgId=%d)", msgId); - tagList=AQH_IpcMessageTag16_ParsePayload(recvdMsg, 0); - if (tagList) { - AQH_VALUE *recvdValue; + recvdValue=AQH_IpcdMessageSetData_ReadValue(tagList); + if (recvdValue) { + const char *valueName; + char *valueDataFreeable; + AQH_VALUE *systemValue; - recvdValue=AQH_IpcdMessageSetData_ReadValue(tagList); - if (recvdValue) { - const char *valueName; - char *valueDataFreeable; - AQH_VALUE *systemValue; + valueName=AQH_Value_GetNameForSystem(recvdValue); + valueDataFreeable=AQH_IpcdMessageSetData_ReadData(tagList); - valueName=AQH_Value_GetNameForSystem(recvdValue); - valueDataFreeable=AQH_IpcdMessageSetData_ReadData(tagList); + systemValue=AQH_Storage_GetValueByNameForSystem(xo->storage, valueName); + if (systemValue) { + if (AQH_Value_GetValueType(systemValue)==AQH_ValueType_Actor) { + const char *driverName; - systemValue=AQH_Storage_GetValueByNameForSystem(xo->storage, valueName); - if (systemValue) { - if (AQH_Value_GetValueType(systemValue)==AQH_ValueType_Actor) { - const char *driverName; + driverName=AQH_Value_GetDriver(systemValue); + if (driverName && *driverName) { + AQH_OBJECT *epDriver; - driverName=AQH_Value_GetDriver(systemValue); - if (driverName && *driverName) { - AQH_OBJECT *epDriver; + epDriver=AqHomeDataServer_GetIpcEndpointByServiceName(o, driverName); + if (epDriver) { + AQH_MSG_REQUEST *rq; - epDriver=AqHomeDataServer_GetIpcEndpointByServiceName(o, driverName); - if (epDriver) { - AQH_MSG_REQUEST *rq; - - DBG_ERROR(NULL, "Creating SETDATA request for driver endpoint (%s)", AQH_Endpoint_GetServiceName(epDriver)); - rq=_mkRequest_SetData(o, epSrc, msgId, epDriver, systemValue, valueDataFreeable); - AqHomeDataServer_AddRequestToTree(o, rq); - } - else { - DBG_ERROR(NULL, "Driver \"%s\" not available", driverName); - AqHomeDataServer_SendResponseResultToEndpoint(epSrc, msgId, AQH_MSGDATA_RESULT_ERROR_GENERIC); - } + DBG_ERROR(NULL, "Creating SETDATA request for driver endpoint (%s)", AQH_Endpoint_GetServiceName(epDriver)); + rq=_mkRequest_SetData(o, epSrc, msgId, epDriver, systemValue, valueDataFreeable); + AqHomeDataServer_AddRequestToTree(o, rq); } else { - DBG_ERROR(NULL, "No driver name"); + DBG_ERROR(NULL, "Driver \"%s\" not available", driverName); AqHomeDataServer_SendResponseResultToEndpoint(epSrc, msgId, AQH_MSGDATA_RESULT_ERROR_GENERIC); } - } /* if actor */ - else { - DBG_ERROR(NULL, "Value \"%s\" is not an actor", valueName); - AqHomeDataServer_SendResponseResultToEndpoint(epSrc, msgId, AQH_MSGDATA_RESULT_ERROR_INVALID); } - } + else { + DBG_ERROR(NULL, "No driver name"); + AqHomeDataServer_SendResponseResultToEndpoint(epSrc, msgId, AQH_MSGDATA_RESULT_ERROR_GENERIC); + } + } /* if actor */ else { - DBG_ERROR(NULL, "Unknown value \"%s\"", valueName); - AqHomeDataServer_SendResponseResultToEndpoint(epSrc, msgId, AQH_MSGDATA_RESULT_ERROR_NOTFOUND); + DBG_ERROR(NULL, "Value \"%s\" is not an actor", valueName); + AqHomeDataServer_SendResponseResultToEndpoint(epSrc, msgId, AQH_MSGDATA_RESULT_ERROR_INVALID); } - AQH_Value_free(recvdValue); - free(valueDataFreeable); - } /* if recvdValue */ - else { - DBG_ERROR(NULL, "No value in message"); - AqHomeDataServer_SendResponseResultToEndpoint(epSrc, msgId, AQH_MSGDATA_RESULT_ERROR_BADDATA); } - GWEN_Tag16_List_free(tagList); + else { + DBG_ERROR(NULL, "Unknown value \"%s\"", valueName); + AqHomeDataServer_SendResponseResultToEndpoint(epSrc, msgId, AQH_MSGDATA_RESULT_ERROR_NOTFOUND); + } + AQH_Value_free(recvdValue); + free(valueDataFreeable); + } /* if recvdValue */ + else { + DBG_ERROR(NULL, "No value in message"); + AqHomeDataServer_SendResponseResultToEndpoint(epSrc, msgId, AQH_MSGDATA_RESULT_ERROR_BADDATA); } } } diff --git a/apps/aqhome-data/s_setdata.h b/apps/aqhome-data/s_setdata.h index 40c62ca..c0a289e 100644 --- a/apps/aqhome-data/s_setdata.h +++ b/apps/aqhome-data/s_setdata.h @@ -12,8 +12,10 @@ #include "./server.h" +#include -void AqHomeDataServer_HandleSetData(AQH_OBJECT *o, AQH_OBJECT *epSrc, const AQH_MESSAGE *recvdMsg); + +void AqHomeDataServer_HandleSetData(AQH_OBJECT *o, AQH_OBJECT *epSrc, const AQH_MESSAGE *recvdMsg, const GWEN_TAG16_LIST *tagList); diff --git a/apps/aqhome-data/s_updatedata.c b/apps/aqhome-data/s_updatedata.c index dff447c..701507f 100644 --- a/apps/aqhome-data/s_updatedata.c +++ b/apps/aqhome-data/s_updatedata.c @@ -51,59 +51,53 @@ static void _sendDataChangedMsgToAllClients(AQHOME_SERVER *xo, AQH_OBJECT *epSrc * ------------------------------------------------------------------------------------------------ */ -void AqHomeDataServer_HandleUpdateData(AQH_OBJECT *o, AQH_OBJECT *ep, const AQH_MESSAGE *msg) +void AqHomeDataServer_HandleUpdateData(AQH_OBJECT *o, AQH_OBJECT *ep, const AQH_MESSAGE *msg, const GWEN_TAG16_LIST *tagList) { AQHOME_SERVER *xo; xo=AqHomeDataServer_GetServerData(o); if (xo) { AQH_MESSAGE *outMsg; - GWEN_TAG16_LIST *tagList; int resultCode=AQH_MSGDATA_RESULT_SUCCESS; + AQH_VALUE *recvdValue; - tagList=AQH_IpcMessageTag16_ParsePayload(msg, 0); - if (tagList) { - AQH_VALUE *recvdValue; + recvdValue=AQH_IpcdMessageMultiData_ReadValue(tagList); + if (recvdValue) { + const char *valueName; + const uint64_t *dataPoints=NULL; + uint64_t numberOfPoints=0; - recvdValue=AQH_IpcdMessageMultiData_ReadValue(tagList); - if (recvdValue) { - const char *valueName; - const uint64_t *dataPoints=NULL; - uint64_t numberOfPoints=0; + valueName=recvdValue?AQH_Value_GetName(recvdValue):NULL; + AQH_IpcdMessageMultiData_ReadDatapoints(tagList, &dataPoints, &numberOfPoints); + if (numberOfPoints>0) { + AQH_VALUE *value; - valueName=recvdValue?AQH_Value_GetName(recvdValue):NULL; - AQH_IpcdMessageMultiData_ReadDatapoints(tagList, &dataPoints, &numberOfPoints); - if (numberOfPoints>0) { - AQH_VALUE *value; - - value=AqHomeDataServer_GetOrCreateValueForDriverWithTemplate(o, ep, recvdValue); - if (value) { - if (AQH_Endpoint_GetPermissions(ep) & AQH_ENDPOINT_PERMS_ADDDATA) { - resultCode=_storeDataPoints(xo, value, dataPoints, numberOfPoints); - if (resultCode==AQH_MSGDATA_RESULT_SUCCESS) - _sendDataChangedMsgToAllClients(xo, ep, value, dataPoints, numberOfPoints); - } - else { - DBG_INFO(NULL, "No permissions to add data to value \"%s\"", valueName); - resultCode=AQH_MSGDATA_RESULT_ERROR_PERMS; - } + value=AqHomeDataServer_GetOrCreateValueForDriverWithTemplate(o, ep, recvdValue); + if (value) { + if (AQH_Endpoint_GetPermissions(ep) & AQH_ENDPOINT_PERMS_ADDDATA) { + resultCode=_storeDataPoints(xo, value, dataPoints, numberOfPoints); + if (resultCode==AQH_MSGDATA_RESULT_SUCCESS) + _sendDataChangedMsgToAllClients(xo, ep, value, dataPoints, numberOfPoints); } else { - DBG_INFO(NULL, "No permissions to add/create value \"%s\"", valueName); + DBG_INFO(NULL, "No permissions to add data to value \"%s\"", valueName); resultCode=AQH_MSGDATA_RESULT_ERROR_PERMS; } } else { - DBG_INFO(NULL, "No datapoints"); - resultCode=AQH_MSGDATA_RESULT_ERROR_INVALID; + DBG_INFO(NULL, "No permissions to add/create value \"%s\"", valueName); + resultCode=AQH_MSGDATA_RESULT_ERROR_PERMS; } - AQH_Value_free(recvdValue); } else { - DBG_INFO(NULL, "No value"); + DBG_INFO(NULL, "No datapoints"); resultCode=AQH_MSGDATA_RESULT_ERROR_INVALID; } - GWEN_Tag16_List_free(tagList); + AQH_Value_free(recvdValue); + } + else { + DBG_INFO(NULL, "No value"); + resultCode=AQH_MSGDATA_RESULT_ERROR_INVALID; } outMsg=AQH_IpcMessageResult_new(AQH_IPC_PROTOCOL_DATA_ID, diff --git a/apps/aqhome-data/s_updatedata.h b/apps/aqhome-data/s_updatedata.h index 888155a..e701eef 100644 --- a/apps/aqhome-data/s_updatedata.h +++ b/apps/aqhome-data/s_updatedata.h @@ -12,8 +12,10 @@ #include "./server.h" +#include -void AqHomeDataServer_HandleUpdateData(AQH_OBJECT *o, AQH_OBJECT *ep, const AQH_MESSAGE *msg); + +void AqHomeDataServer_HandleUpdateData(AQH_OBJECT *o, AQH_OBJECT *ep, const AQH_MESSAGE *msg, const GWEN_TAG16_LIST *tagList); diff --git a/apps/aqhome-data/server.c b/apps/aqhome-data/server.c index 246f18b..ed8e037 100644 --- a/apps/aqhome-data/server.c +++ b/apps/aqhome-data/server.c @@ -27,6 +27,7 @@ #include #include #include +#include #include #include @@ -77,7 +78,7 @@ static int _handleSignal(AQH_OBJECT *o, uint32_t slotId, AQH_OBJECT *senderObjec static int _handleNewClient(AQH_OBJECT *o, AQH_OBJECT *clientEndpoint); static int _handleClientDown(AQH_OBJECT *o, AQH_OBJECT *clientEndpoint); static void _handleMsgsFromClient(AQH_OBJECT *o, AQHOME_SERVER *xo, AQH_OBJECT *ep); -static void _handleMsgFromClient(AQH_OBJECT *o, AQH_OBJECT *ep, AQH_MESSAGE *msg); +static void _handleMsgFromClient(AQH_OBJECT *o, AQH_OBJECT *ep, const AQH_MESSAGE *msg); static AQH_DEVICE *_getOrCreateDeviceForDriver(AQHOME_SERVER *xo, AQH_OBJECT *epDriver, const char *deviceName); static int _createPidFile(const char *pidFilename); static int _readArgs(int argc, char **argv, GWEN_DB_NODE *dbArgs); @@ -418,31 +419,36 @@ void _handleMsgsFromClient(AQH_OBJECT *o, AQHOME_SERVER *xo, AQH_OBJECT *ep) -void _handleMsgFromClient(AQH_OBJECT *o, AQH_OBJECT *ep, AQH_MESSAGE *msg) +void _handleMsgFromClient(AQH_OBJECT *o, AQH_OBJECT *ep, const AQH_MESSAGE *msg) { - uint16_t code; - uint8_t protoId; + GWEN_TAG16_LIST *tagList; - /* exec IPC message */ - code=AQH_IpcMessage_GetCode(msg); - protoId=AQH_IpcMessage_GetProtoId(msg); - if (protoId==AQH_IPC_PROTOCOL_DATA_ID) { - DBG_ERROR(NULL, "Received IPC packet %d (%x)", (int) code, code); - switch(code) { - case AQH_MSGTYPE_IPC_DATA_CONNECT_REQ: AqHomeDataServer_HandleConnect(o, ep, msg); break; - case AQH_MSGTYPE_IPC_DATA_UPDATEDATA: AqHomeDataServer_HandleUpdateData(o, ep, msg); break; - case AQH_MSGTYPE_IPC_DATA_GETVALUES_REQ: AqHomeDataServer_HandleGetValues(o, ep, msg); break; - case AQH_MSGTYPE_IPC_DATA_GETDATA_REQ: AqHomeDataServer_HandleGetDataPoints(o, ep, msg); break; - case AQH_MSGTYPE_IPC_DATA_SETDATA: AqHomeDataServer_HandleSetData(o, ep, msg); break; - case AQH_MSGTYPE_IPC_DATA_ADDVALUE: AqHomeDataServer_HandleAddValue(o, ep, msg); break; - case AQH_MSGTYPE_IPC_DATA_ANNOUNCEVALUE: AqHomeDataServer_HandleAnnounceValue(o, ep, msg); break; - case AQH_MSGTYPE_IPC_DATA_GETDEVICES_REQ: AqHomeDataServer_HandleGetDevices(o, ep, msg); break; - case AQH_MSGTYPE_IPC_DATA_MODDEVICE_REQ: AqHomeDataServer_HandleModDevice(o, ep, msg); break; - default: break; + tagList=AQH_IpcMessageTag16_ParsePayload(msg, 0); + if (tagList) { + uint16_t code; + uint8_t protoId; + + code=AQH_IpcMessage_GetCode(msg); + protoId=AQH_IpcMessage_GetProtoId(msg); + if (protoId==AQH_IPC_PROTOCOL_DATA_ID) { + DBG_INFO(NULL, "Received IPC packet %d (%x)", (int) code, code); + switch(code) { + case AQH_MSGTYPE_IPC_DATA_CONNECT_REQ: AqHomeDataServer_HandleConnect(o, ep, msg, tagList); break; + case AQH_MSGTYPE_IPC_DATA_UPDATEDATA: AqHomeDataServer_HandleUpdateData(o, ep, msg, tagList); break; + case AQH_MSGTYPE_IPC_DATA_GETVALUES_REQ: AqHomeDataServer_HandleGetValues(o, ep, msg, tagList); break; + case AQH_MSGTYPE_IPC_DATA_GETDATA_REQ: AqHomeDataServer_HandleGetDataPoints(o, ep, msg, tagList); break; + case AQH_MSGTYPE_IPC_DATA_SETDATA: AqHomeDataServer_HandleSetData(o, ep, msg, tagList); break; + case AQH_MSGTYPE_IPC_DATA_ADDVALUE: AqHomeDataServer_HandleAddValue(o, ep, msg, tagList); break; + case AQH_MSGTYPE_IPC_DATA_ANNOUNCEVALUE: AqHomeDataServer_HandleAnnounceValue(o, ep, msg, tagList); break; + case AQH_MSGTYPE_IPC_DATA_GETDEVICES_REQ: AqHomeDataServer_HandleGetDevices(o, ep, msg, tagList); break; + case AQH_MSGTYPE_IPC_DATA_MODDEVICE_REQ: AqHomeDataServer_HandleModDevice(o, ep, msg, tagList); break; + default: break; + } } - } - else { - DBG_ERROR(NULL, "Invalid IPC protocol %d (%02x)", protoId, protoId); + else { + DBG_ERROR(NULL, "Invalid IPC protocol %d (%02x)", protoId, protoId); + } + GWEN_Tag16_List_free(tagList); } } diff --git a/apps/aqhome-mqttlog/0BUILD b/apps/aqhome-mqttlog/0BUILD index 5775c86..1626956 100644 --- a/apps/aqhome-mqttlog/0BUILD +++ b/apps/aqhome-mqttlog/0BUILD @@ -43,6 +43,7 @@ server.h server_p.h s_publish.h + s_setdata.h @@ -54,6 +55,7 @@ c_setdata.c server.c s_publish.c + s_setdata.c diff --git a/apps/aqhome-mqttlog/main.c b/apps/aqhome-mqttlog/main.c index f692151..a9b3f06 100644 --- a/apps/aqhome-mqttlog/main.c +++ b/apps/aqhome-mqttlog/main.c @@ -191,7 +191,7 @@ void _runService(AQH_OBJECT *aqh, AQH_EVENT_LOOP *eventLoop) break; } } /* while */ - + DBG_ERROR(NULL, "Leaving server"); rv=AQH_MqttLogServer_SaveRuntimeDeviceFiles(aqh); if (rv<0) { diff --git a/apps/aqhome-mqttlog/s_publish.c b/apps/aqhome-mqttlog/s_publish.c index cf55aff..dfe2eb1 100644 --- a/apps/aqhome-mqttlog/s_publish.c +++ b/apps/aqhome-mqttlog/s_publish.c @@ -214,19 +214,27 @@ void _sendMessage(AQH_MQTTLOG_SERVER *xo, const AQHMQTT_DEVICE *device, const AQ DBG_ERROR(NULL, "Invalid value received from MQTT server (%s)", rcvdValue?rcvdValue:""); } else { - AQH_MESSAGE *pubMsg; uint64_t now; AQH_VALUE *msgValue; now=(uint64_t) time(NULL); msgValue=_mkMessageValue(device, value); - pubMsg=AQH_IpcdMessageMultiData_newForOne(AQH_MSGTYPE_IPC_DATA_UPDATEDATA, - AQH_Endpoint_GetNextMessageId(xo->brokerEndpoint), 0, - msgValue, now, f); - DBG_INFO(AQH_LOGDOMAIN, "BROKER UPDATE_DATA %s/%s: %f", - deviceName?deviceName:"", - AQH_Value_GetName(msgValue), f); - AQH_Endpoint_AddMsgOut(xo->brokerEndpoint, pubMsg); + if (xo->brokerEndpoint) { + AQH_MESSAGE *pubMsg; + + pubMsg=AQH_IpcdMessageMultiData_newForOne(AQH_MSGTYPE_IPC_DATA_UPDATEDATA, + AQH_Endpoint_GetNextMessageId(xo->brokerEndpoint), 0, + msgValue, now, f); + DBG_INFO(AQH_LOGDOMAIN, "BROKER UPDATE_DATA %s/%s: %f", + deviceName?deviceName:"", + AQH_Value_GetName(msgValue), f); + AQH_Endpoint_AddMsgOut(xo->brokerEndpoint, pubMsg); + } + else { + DBG_INFO(AQH_LOGDOMAIN, "Skipping BROKER UPDATE_DATA %s/%s: %f", + deviceName?deviceName:"", + AQH_Value_GetName(msgValue), f); + } AQH_Value_free(msgValue); } } @@ -269,14 +277,19 @@ void _sendAnnounceValueMessage(AQH_MQTTLOG_SERVER *xo, const AQHMQTT_DEVICE *dev AQH_VALUE *msgValue; msgValue=_mkMessageValue(device, value); - pubMsg=AQH_IpcdMessageValues_newForOne(AQH_MSGTYPE_IPC_DATA_ANNOUNCEVALUE, - AQH_Endpoint_GetNextMessageId(xo->brokerEndpoint), 0, - 0, msgValue); - if (pubMsg) { - DBG_INFO(AQH_LOGDOMAIN, "BROKER ANNOUNCE_VALUE %s", AQH_Value_GetName(msgValue)); - AQH_Endpoint_AddMsgOut(xo->brokerEndpoint, pubMsg); + if (xo->brokerEndpoint) { + pubMsg=AQH_IpcdMessageValues_newForOne(AQH_MSGTYPE_IPC_DATA_ANNOUNCEVALUE, + AQH_Endpoint_GetNextMessageId(xo->brokerEndpoint), 0, + 0, msgValue); + if (pubMsg) { + DBG_INFO(AQH_LOGDOMAIN, "BROKER ANNOUNCE_VALUE %s", AQH_Value_GetName(msgValue)); + AQH_Endpoint_AddMsgOut(xo->brokerEndpoint, pubMsg); + } + AQH_Value_free(msgValue); + } + else { + DBG_INFO(AQH_LOGDOMAIN, "Ignoring BROKER ANNOUNCE_VALUE %s", AQH_Value_GetName(msgValue)); } - AQH_Value_free(msgValue); } diff --git a/apps/aqhome-mqttlog/s_setdata.c b/apps/aqhome-mqttlog/s_setdata.c new file mode 100644 index 0000000..83b6b90 --- /dev/null +++ b/apps/aqhome-mqttlog/s_setdata.c @@ -0,0 +1,171 @@ +/**************************************************************************** + * This file is part of the project AqHome. + * AqHome (c) by 2025 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 "./s_setdata.h" +#include "./server_p.h" +#include "aqhome/data/value.h" +#include "aqhome/msg/ipc/data/m_ipcd_setdata.h" +#include "aqhome/msg/mqtt/m_mqtt_publish.h" +#include "aqhome/ipc2/endpoint.h" + +#include + + + +/* ------------------------------------------------------------------------------------------------ + * forward declarations + * ------------------------------------------------------------------------------------------------ + */ + +static void _sendDataForDevice(AQH_MQTTLOG_SERVER *xo, const AQHMQTT_DEVICE *device, + const char *valueName, const char *valueData); +static void _sendValueToMqtt(AQH_MQTTLOG_SERVER *xo, const char *deviceId, + const AQHMQTT_TOPIC *topic, const char *valueData); +static GWEN_BUFFER *_createBufferForTopic(const char *deviceId, const AQHMQTT_TOPIC *topic); + + + +/* ------------------------------------------------------------------------------------------------ + * implementations + * ------------------------------------------------------------------------------------------------ + */ + +void AQH_MqttLogServer_HandleSetData(AQH_OBJECT *o, + const AQH_MESSAGE *msg, + const GWEN_TAG16_LIST *tagList) +{ + if (o && msg) { + AQH_MQTTLOG_SERVER *xo; + + xo=AQH_MqttLogServer_GetServerData(o); + if (xo) { + AQH_VALUE *recvdValue; + + DBG_ERROR(NULL, "Received SETDATA request"); + recvdValue=AQH_IpcdMessageSetData_ReadValue(tagList); + if (recvdValue) { + const char *valueName; + const char *deviceName; + + valueName=recvdValue?AQH_Value_GetName(recvdValue):NULL; + deviceName=recvdValue?AQH_Value_GetDeviceName(recvdValue):NULL; + if (valueName && deviceName) { + AQHMQTT_DEVICE *device; + + device=AQH_MqttLogServer_FindRegisteredDevice(o, deviceName); + if (device) { + char *valueDataFreeable; + + DBG_ERROR(NULL, "Sending data to value \"%s\" of device \"%s\"", valueName, deviceName); + valueDataFreeable=AQH_IpcdMessageSetData_ReadData(tagList); + _sendDataForDevice(xo, device, valueName, valueDataFreeable); + free(valueDataFreeable); + } + else { + DBG_ERROR(NULL, "Device \"%s\" not found", deviceName); + AQH_MqttLogServer_DumpRegisteredDevices(o); + } + } + else { + DBG_ERROR(NULL, "Either value name or device name missing in request"); + } + AQH_Value_free(recvdValue); + } + else { + DBG_ERROR(NULL, "Request does not contain a value object"); + } + } + } +} + + + +void _sendDataForDevice(AQH_MQTTLOG_SERVER *xo, + const AQHMQTT_DEVICE *device, + const char *valueName, const char *valueData) +{ + const char *deviceId; + + deviceId=AQHMQTT_Device_GetId(device); + if (deviceId && *deviceId) { + AQHMQTT_TOPIC_LIST *topicList; + + topicList=AQHMQTT_Device_GetTopicList(device); + if (topicList) { + AQHMQTT_TOPIC *topic; + + topic=AQHMQTT_Topic_List_First(topicList); + while(topic) { + if (AQHMQTT_Topic_GetDirection(topic)==AQHMQTT_TopicDir_Out) { + AQHMQTT_VALUE_LIST *valueList; + AQHMQTT_VALUE *value; + + valueList=AQHMQTT_Topic_GetValueList(topic); + value=valueList?AQHMQTT_Value_List_GetByName(valueList, valueName):NULL; + if (value) { + /* found value, create publish msg, send */ + DBG_ERROR(NULL, "Topic \"%s\" contains value \"%s\"", AQHMQTT_Topic_GetName(topic), valueName); + _sendValueToMqtt(xo, deviceId, topic, valueData); + } + } /* if out */ + topic=AQHMQTT_Topic_List_Next(topic); + } /* while topic */ + } + } + else { + DBG_ERROR(NULL, "Device has no id"); + } +} + + + +void _sendValueToMqtt(AQH_MQTTLOG_SERVER *xo, const char *deviceId, const AQHMQTT_TOPIC *topic, const char *valueData) +{ + GWEN_BUFFER *buf; + AQH_MESSAGE *msgOut; + + buf=_createBufferForTopic(deviceId, topic); + DBG_ERROR(NULL, "MQTT PUBLISH: %s = %s", GWEN_Buffer_GetStart(buf), valueData?valueData:""); + msgOut=AQH_MqttMessagePublish_new(0, 0, GWEN_Buffer_GetStart(buf), + (const uint8_t*) (valueData?valueData:NULL), + valueData?strlen(valueData):0); + if (msgOut) + AQH_Endpoint_AddMsgOut(xo->mqttEndpoint, msgOut); + else { + DBG_ERROR(NULL, "Error creating message"); + } + GWEN_Buffer_free(buf); +} + + + +GWEN_BUFFER *_createBufferForTopic(const char *deviceId, const AQHMQTT_TOPIC *topic) +{ + GWEN_BUFFER *buf; + const char *s; + + buf=GWEN_Buffer_new(0, 256, 0, 1); + s=AQHMQTT_Topic_GetBeforeId(topic); + if (s && *s) + GWEN_Buffer_AppendString(buf, s); + GWEN_Buffer_AppendString(buf, deviceId); + s=AQHMQTT_Topic_GetAfterId(topic); + if (s && *s) + GWEN_Buffer_AppendString(buf, s); + return buf; +} + + + + + + diff --git a/apps/aqhome-mqttlog/s_setdata.h b/apps/aqhome-mqttlog/s_setdata.h new file mode 100644 index 0000000..bb55b65 --- /dev/null +++ b/apps/aqhome-mqttlog/s_setdata.h @@ -0,0 +1,27 @@ +/**************************************************************************** + * This file is part of the project AqHome. + * AqHome (c) by 2025 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. + ****************************************************************************/ + +#ifndef AQHOMEMQTT_S_SETDATA_H +#define AQHOMEMQTT_S_SETDATA_H + + +#include "./aqhome_mqtt.h" + +#include +#include + +#include + + +void AQH_MqttLogServer_HandleSetData(AQH_OBJECT *o, const AQH_MESSAGE *recvdMsg, const GWEN_TAG16_LIST *tagList); + + + +#endif + + diff --git a/apps/aqhome-mqttlog/server.c b/apps/aqhome-mqttlog/server.c index 9c06bab..b783a1a 100644 --- a/apps/aqhome-mqttlog/server.c +++ b/apps/aqhome-mqttlog/server.c @@ -12,6 +12,7 @@ #include "./server_p.h" #include "./s_publish.h" +#include "./s_setdata.h" #include "./xmlread.h" #include "./xmlwrite.h" @@ -25,6 +26,7 @@ #include #include #include +#include #include #include #include @@ -657,21 +659,26 @@ void AQH_MqttLogServer_HandleBrokerMsgs(AQH_OBJECT *o) void _handleMsgFromBroker(AQH_OBJECT *o, AQH_OBJECT *ep, const AQH_MESSAGE *msg) { - uint16_t code; - uint8_t protoId; + GWEN_TAG16_LIST *tagList; - /* exec IPC message */ - code=AQH_IpcMessage_GetCode(msg); - protoId=AQH_IpcMessage_GetProtoId(msg); - if (protoId==AQH_IPC_PROTOCOL_DATA_ID) { - DBG_ERROR(NULL, "Received IPC packet %d (%x)", (int) code, code); - switch(code) { -// case AQH_MSGTYPE_IPC_DATA_SETDATA: AQH_MqttLogServer_HandleSetData(o, ep, msg); break; - default: break; + tagList=AQH_IpcMessageTag16_ParsePayload(msg, 0); + if (tagList) { + uint16_t code; + uint8_t protoId; + + code=AQH_IpcMessage_GetCode(msg); + protoId=AQH_IpcMessage_GetProtoId(msg); + if (protoId==AQH_IPC_PROTOCOL_DATA_ID) { + DBG_ERROR(NULL, "Received IPC packet %d (%x)", (int) code, code); + switch(code) { + case AQH_MSGTYPE_IPC_DATA_SETDATA: AQH_MqttLogServer_HandleSetData(o, msg, tagList); break; + default: break; + } } - } - else { - DBG_ERROR(NULL, "Invalid IPC protocol %d (%02x)", protoId, protoId); + else { + DBG_ERROR(NULL, "Invalid IPC protocol %d (%02x)", protoId, protoId); + } + GWEN_Tag16_List_free(tagList); } } diff --git a/apps/aqhome-nodes/server.c b/apps/aqhome-nodes/server.c index d63c190..5d5f010 100644 --- a/apps/aqhome-nodes/server.c +++ b/apps/aqhome-nodes/server.c @@ -567,6 +567,7 @@ int _startBroker(AQH_OBJECT *o, AQH_NODE_SERVER *xo) AQH_Endpoint_SetServiceName(ep, xo->brokerClientId); AQH_Object_AddLink(ep, AQH_ENDPOINT_SIGNAL_CLOSED, AQH_NODE_SERVER_SLOT_BROKERCLOSED, o); AQH_Object_Enable(ep); + xo->brokerEndpoint=ep; rv=_exchangeConnect(o, xo, 0); if (rv!=0) { @@ -574,7 +575,6 @@ int _startBroker(AQH_OBJECT *o, AQH_NODE_SERVER *xo) return (rv<0)?rv:GWEN_ERROR_PERMISSIONS; } DBG_ERROR(NULL, "Connected to broker at %s:%d", xo->brokerAddress, xo->brokerPort); - xo->brokerEndpoint=ep; return 0; } else { @@ -907,7 +907,6 @@ void _publishInt(AQH_NODE_SERVER *xo, uint32_t uid, const char *vPath, int vModa void _publishDouble(AQH_NODE_SERVER *xo, uint32_t uid, const char *vPath, int vModality, const char *vUnits, double v) { - AQH_MESSAGE *pubMsg; union {double f; uint64_t i;} u; uint64_t arrayToSend[2]; AQH_VALUE *value; @@ -923,17 +922,29 @@ void _publishDouble(AQH_NODE_SERVER *xo, uint32_t uid, const char *vPath, int vM AQH_Value_SetValueType(value, AQH_ValueType_Sensor); AQH_Value_SetModality(value, vModality); - pubMsg=AQH_IpcdMessageMultiData_new(AQH_MSGTYPE_IPC_DATA_UPDATEDATA, - AQH_Endpoint_GetNextMessageId(xo->brokerEndpoint), 0, - value, arrayToSend, 1); - if (pubMsg) { + if (xo->brokerEndpoint) { + AQH_MESSAGE *pubMsg; + + pubMsg=AQH_IpcdMessageMultiData_new(AQH_MSGTYPE_IPC_DATA_UPDATEDATA, + AQH_Endpoint_GetNextMessageId(xo->brokerEndpoint), 0, + value, arrayToSend, 1); + if (pubMsg) { + DBG_ERROR(AQH_LOGDOMAIN, + "BROKER PUBLISH %s(%s/%s): %f", + AQH_Value_GetName(value), + AQH_Value_GetDeviceName(value), + AQH_Value_GetName(value), + v); + AQH_Endpoint_AddMsgOut(xo->brokerEndpoint, pubMsg); + } + } + else { DBG_ERROR(AQH_LOGDOMAIN, - "BROKER PUBLISH %s(%s/%s): %f", + "Skipping BROKER PUBLISH %s(%s/%s): %f (no broker connection)", AQH_Value_GetName(value), AQH_Value_GetDeviceName(value), AQH_Value_GetName(value), v); - AQH_Endpoint_AddMsgOut(xo->brokerEndpoint, pubMsg); } AQH_Value_free(value); } diff --git a/aqhome/events2/fdobject.c b/aqhome/events2/fdobject.c index 573e6cf..211706a 100644 --- a/aqhome/events2/fdobject.c +++ b/aqhome/events2/fdobject.c @@ -169,7 +169,7 @@ int AQH_FdObject_Read(AQH_OBJECT *o, uint8_t *ptrBuffer, uint32_t lenBuffer) } else if (rv>0) { /* data received */ - DBG_INFO(AQH_LOGDOMAIN, "Received %d bytes", (int) rv); + DBG_DEBUG(AQH_LOGDOMAIN, "Received %d bytes", (int) rv); return (int) rv; } else { diff --git a/aqhome/ipc2/endpoint.c b/aqhome/ipc2/endpoint.c index 1891adc..4e25306 100644 --- a/aqhome/ipc2/endpoint.c +++ b/aqhome/ipc2/endpoint.c @@ -390,6 +390,7 @@ AQH_MESSAGE *AQH_Endpoint_GetNextMsgOut(AQH_OBJECT *o) void AQH_Endpoint_AddMsgOut(AQH_OBJECT *o, AQH_MESSAGE *msg) { + assert(o); if (o && msg) { AQH_ENDPOINT *xo; @@ -456,7 +457,7 @@ void AQH_Endpoint_AddMsgIn(AQH_OBJECT *o, AQH_MESSAGE *msg) xo=GWEN_INHERIT_GETDATA(AQH_OBJECT, AQH_ENDPOINT, o); if (xo) { AQH_Message_List_Add(msg, xo->msgInList); - DBG_INFO(AQH_LOGDOMAIN, "now %d msgs in list", AQH_Message_List_GetCount(xo->msgInList)); + DBG_DEBUG(AQH_LOGDOMAIN, "now %d msgs in list", AQH_Message_List_GetCount(xo->msgInList)); } } } @@ -510,7 +511,7 @@ int _handleMsgRecvd(AQH_OBJECT *o, int msgLen, const uint8_t *msgPtr) { AQH_MESSAGE *msg; - DBG_INFO(AQH_LOGDOMAIN, "Msg received:"); + DBG_DEBUG(AQH_LOGDOMAIN, "Msg received:"); /*GWEN_Text_LogString((const char*) msgPtr, msgLen, AQH_LOGDOMAIN, GWEN_LoggerLevel_Error);*/ msg=AQH_NodeMessage_fromBuffer(msgPtr, msgLen); AQH_Endpoint_AddMsgIn(o, msg); @@ -522,7 +523,7 @@ int _handleMsgRecvd(AQH_OBJECT *o, int msgLen, const uint8_t *msgPtr) int _handleMsgSent(AQH_OBJECT *o) { - DBG_INFO(AQH_LOGDOMAIN, "Msg sent"); + DBG_DEBUG(AQH_LOGDOMAIN, "Msg sent"); if (o) { AQH_ENDPOINT *xo; @@ -540,7 +541,7 @@ int _handleMsgSent(AQH_OBJECT *o) /* get next message in list */ msg=AQH_Message_List_First(xo->msgOutList); if (msg) { - DBG_INFO(AQH_LOGDOMAIN, "Sending next message"); + DBG_DEBUG(AQH_LOGDOMAIN, "Sending next message"); AQH_MsgWriter_SendMsg(xo->msgWriter, AQH_Message_GetMsgPointer(msg), AQH_Message_GetUsedSize(msg)); } else { diff --git a/aqhome/ipc2/ipcmsgreader.c b/aqhome/ipc2/ipcmsgreader.c index 33e76a1..5bb9a8e 100644 --- a/aqhome/ipc2/ipcmsgreader.c +++ b/aqhome/ipc2/ipcmsgreader.c @@ -64,7 +64,7 @@ int _readMsg(AQH_OBJECT *o) int rv; if (xo->bytesReceivedbytesReceived>=AQH_MSG_READER_HEADER_SIZE) { - DBG_INFO(AQH_LOGDOMAIN, "Reading body"); + DBG_DEBUG(AQH_LOGDOMAIN, "Reading body"); /* reading remainder of msg directly into allocated buffer */ rv=AQH_MsgReader_ReadRemainderFromRingbuffer(o); if (rv<0) { @@ -122,7 +122,7 @@ int _readHeaderFromRingbuffer(AQH_MSG_READER *xo) xferSize=remaining; rv=GWEN_RingBuffer_ReadBytes(xo->ringBuffer, (char*) (xo->headerBuffer+xo->bytesReceived), &xferSize); if (rv<0) { - DBG_INFO(AQH_LOGDOMAIN, "Ringbuffer empty"); + DBG_DEBUG(AQH_LOGDOMAIN, "Ringbuffer empty"); return 0; } if (xferSizeflags=f; } } @@ -123,7 +122,6 @@ void AQH_MsgReader_AddFlags(AQH_OBJECT *o, uint32_t f) xo=GWEN_INHERIT_GETDATA(AQH_OBJECT, AQH_MSG_READER, o); if (xo) { - DBG_ERROR(AQH_LOGDOMAIN, "Adding flags: %08x", f); xo->flags|=f; } } @@ -136,7 +134,6 @@ void AQH_MsgReader_SubFlags(AQH_OBJECT *o, uint32_t f) xo=GWEN_INHERIT_GETDATA(AQH_OBJECT, AQH_MSG_READER, o); if (xo) { - DBG_ERROR(AQH_LOGDOMAIN, "Clearing flags: %08x", f); xo->flags&=~f; } } @@ -207,7 +204,7 @@ int _handleSocketReady(AQH_OBJECT *o, AQH_OBJECT *fdObject) { AQH_MSG_READER *xo; - DBG_INFO(AQH_LOGDOMAIN, "Socket ready"); + DBG_DEBUG(AQH_LOGDOMAIN, "Socket ready"); xo=GWEN_INHERIT_GETDATA(AQH_OBJECT, AQH_MSG_READER, o); if (xo) { int rv; @@ -314,7 +311,7 @@ int _fillRingbuffer(AQH_OBJECT *o, AQH_MSG_READER *xo, AQH_OBJECT *fdObject) rv=AQH_FdObject_Read(fdObject, (uint8_t*) GWEN_RingBuffer_GetWritePointer(xo->ringBuffer), len); if (rv<0) { if (rv!=GWEN_ERROR_TRY_AGAIN) { - DBG_ERROR(AQH_LOGDOMAIN, "here (%d)", rv); + DBG_INFO(AQH_LOGDOMAIN, "here (%d)", rv); } return rv; } @@ -330,8 +327,7 @@ int _fillRingbuffer(AQH_OBJECT *o, AQH_MSG_READER *xo, AQH_OBJECT *fdObject) } } else { - DBG_INFO(AQH_LOGDOMAIN, "Ringbuffer full"); - /*return GWEN_ERROR_BUFFER_OVERFLOW;*/ + DBG_DEBUG(AQH_LOGDOMAIN, "Ringbuffer full"); return 0; } } @@ -347,7 +343,7 @@ int AQH_MsgReader_ReadRemainderFromRingbuffer(AQH_OBJECT *o) if (xo) { if (xo->bytesLeft==0) { /* msg finished */ - DBG_INFO(AQH_LOGDOMAIN, "Message complete"); + DBG_DEBUG(AQH_LOGDOMAIN, "Message complete"); return 1; } else { @@ -367,7 +363,7 @@ int AQH_MsgReader_ReadRemainderFromRingbuffer(AQH_OBJECT *o) xferSize=bytesToRead; rv=GWEN_RingBuffer_ReadBytes(xo->ringBuffer, (char*) (xo->currentMsgBuf+xo->bytesReceived), &xferSize); if (rv<0) { - DBG_INFO(AQH_LOGDOMAIN, "Ringbuffer empty"); + DBG_DEBUG(AQH_LOGDOMAIN, "Ringbuffer empty"); return 0; } if (xferSizebytesLeft-=xferSize; if (xo->bytesLeft==0) { /* msg finished */ - DBG_INFO(AQH_LOGDOMAIN, "Message complete"); + DBG_DEBUG(AQH_LOGDOMAIN, "Message complete"); return 1; } } diff --git a/aqhome/ipc2/msgwriter.c b/aqhome/ipc2/msgwriter.c index 60121b7..1c87c8b 100644 --- a/aqhome/ipc2/msgwriter.c +++ b/aqhome/ipc2/msgwriter.c @@ -129,7 +129,7 @@ int _handleSocketReady(AQH_OBJECT *o, AQH_OBJECT *fdObject) { AQH_MSG_WRITER *xo; - DBG_INFO(AQH_LOGDOMAIN, "Socket ready"); + DBG_DEBUG(AQH_LOGDOMAIN, "Socket ready"); xo=GWEN_INHERIT_GETDATA(AQH_OBJECT, AQH_MSG_WRITER, o); if (xo) { int rv;