diff --git a/apps/aqhome-data/c_addvalue.c b/apps/aqhome-data/c_addvalue.c index 3a60fce..67d1fbe 100644 --- a/apps/aqhome-data/c_addvalue.c +++ b/apps/aqhome-data/c_addvalue.c @@ -62,7 +62,9 @@ void AqHomeData_HandleAddValue(AQHOME_DATA *aqh, GWEN_MSG_ENDPOINT *ep, GWEN_MSG AQH_Value_free(recvdValue); } - outMsg=AQH_ResultIpcMsg_new(AQH_MSGTYPE_IPC_DATA_RESULT, resultCode); + outMsg=AQH_ResultIpcMsg_new(AQH_MSGTYPE_IPC_DATA_RESULT, + GWEN_MsgEndpoint_GetNextMessageId(ep), GWEN_IpcMsg_GetMsgId(msg), + resultCode); GWEN_MsgEndpoint_AddSendMessage(ep, outMsg); } diff --git a/apps/aqhome-data/c_connect.c b/apps/aqhome-data/c_connect.c index 0eafa27..3eb1261 100644 --- a/apps/aqhome-data/c_connect.c +++ b/apps/aqhome-data/c_connect.c @@ -83,7 +83,9 @@ void AqHomeData_HandleConnect(AQHOME_DATA *aqh, GWEN_MSG_ENDPOINT *ep, GWEN_MSG free(userId); free(clientId); - outMsg=AQH_ResultIpcMsg_new(AQH_MSGTYPE_IPC_DATA_RESULT, resultCode); + outMsg=AQH_ResultIpcMsg_new(AQH_MSGTYPE_IPC_DATA_RESULT, + GWEN_MsgEndpoint_GetNextMessageId(ep), GWEN_IpcMsg_GetMsgId(msg), + resultCode); GWEN_MsgEndpoint_AddSendMessage(ep, outMsg); } diff --git a/apps/aqhome-data/c_getdatapoints.c b/apps/aqhome-data/c_getdatapoints.c index 75a6881..ebd8912 100644 --- a/apps/aqhome-data/c_getdatapoints.c +++ b/apps/aqhome-data/c_getdatapoints.c @@ -40,11 +40,13 @@ static int _getAndSendDataPoints(AQHOME_DATA *aqh, GWEN_MSG_ENDPOINT *ep, const AQH_VALUE *value, - uint64_t tsBegin, uint64_t tsEnd, uint64_t num); -static int _getAndSendDataPointsNoNum(AQHOME_DATA *aqh, GWEN_MSG_ENDPOINT *ep, const AQH_VALUE *value, uint64_t tsBegin, uint64_t tsEnd); -static int _getAndSendDataPointsWithNum(AQHOME_DATA *aqh, GWEN_MSG_ENDPOINT *ep, const AQH_VALUE *value, uint64_t num); -static void _sendDataPointsResponse(AQHOME_DATA *aqh, GWEN_MSG_ENDPOINT *ep, const AQH_VALUE *value, const uint64_t *tablePtr); -static void _getAndSendLastDatapoint(AQHOME_DATA *aqh, GWEN_MSG_ENDPOINT *ep, const AQH_VALUE *value); + uint64_t tsBegin, uint64_t tsEnd, uint64_t num, uint32_t refMsgId); +static int _getAndSendDataPointsNoNum(AQHOME_DATA *aqh, GWEN_MSG_ENDPOINT *ep, const AQH_VALUE *value, uint64_t tsBegin, uint64_t tsEnd, + uint32_t refMsgId); +static int _getAndSendDataPointsWithNum(AQHOME_DATA *aqh, GWEN_MSG_ENDPOINT *ep, const AQH_VALUE *value, uint64_t num, uint32_t refMsgId); +static void _sendDataPointsResponse(AQHOME_DATA *aqh, GWEN_MSG_ENDPOINT *ep, const AQH_VALUE *value, const uint64_t *tablePtr, + uint32_t refMsgId); +static void _getAndSendLastDatapoint(AQHOME_DATA *aqh, GWEN_MSG_ENDPOINT *ep, const AQH_VALUE *value, uint32_t refMsgId); @@ -74,7 +76,7 @@ void AqHomeData_HandleGetDataPoints(AQHOME_DATA *aqh, GWEN_MSG_ENDPOINT *ep, GWE value=AQH_Storage_GetValueByNameForSystem(aqh->storage, valueName); if (value) { - resultCode=_getAndSendDataPoints(aqh, ep, value, tsBegin, tsEnd, numRequested); + resultCode=_getAndSendDataPoints(aqh, ep, value, tsBegin, tsEnd, numRequested, GWEN_IpcMsg_GetMsgId(recvdMsg)); if (resultCode==AQH_MSG_IPC_SUCCESS) return; } @@ -89,27 +91,31 @@ void AqHomeData_HandleGetDataPoints(AQHOME_DATA *aqh, GWEN_MSG_ENDPOINT *ep, GWE resultCode=AQH_MSG_IPC_ERROR_PERMS; } - outMsg=AQH_ResultIpcMsg_new(AQH_MSGTYPE_IPC_DATA_RESULT, resultCode); + outMsg=AQH_ResultIpcMsg_new(AQH_MSGTYPE_IPC_DATA_RESULT, + GWEN_MsgEndpoint_GetNextMessageId(ep), GWEN_IpcMsg_GetMsgId(recvdMsg), + resultCode); GWEN_MsgEndpoint_AddSendMessage(ep, outMsg); } -int _getAndSendDataPoints(AQHOME_DATA *aqh, GWEN_MSG_ENDPOINT *ep, const AQH_VALUE *value, uint64_t tsBegin, uint64_t tsEnd, uint64_t num) +int _getAndSendDataPoints(AQHOME_DATA *aqh, GWEN_MSG_ENDPOINT *ep, const AQH_VALUE *value, uint64_t tsBegin, uint64_t tsEnd, uint64_t num, + uint32_t refMsgId) { if (num==0) - return _getAndSendDataPointsNoNum(aqh, ep, value, tsBegin, tsEnd); + return _getAndSendDataPointsNoNum(aqh, ep, value, tsBegin, tsEnd, refMsgId); else if (num==1) { - _getAndSendLastDatapoint(aqh, ep, value); + _getAndSendLastDatapoint(aqh, ep, value, refMsgId); return AQH_MSG_IPC_SUCCESS; } else - return _getAndSendDataPointsWithNum(aqh, ep, value, num); + return _getAndSendDataPointsWithNum(aqh, ep, value, num, refMsgId); } -int _getAndSendDataPointsNoNum(AQHOME_DATA *aqh, GWEN_MSG_ENDPOINT *ep, const AQH_VALUE *value, uint64_t tsBegin, uint64_t tsEnd) +int _getAndSendDataPointsNoNum(AQHOME_DATA *aqh, GWEN_MSG_ENDPOINT *ep, const AQH_VALUE *value, uint64_t tsBegin, uint64_t tsEnd, + uint32_t refMsgId) { uint64_t valueId; uint64_t *tablePtr; @@ -117,7 +123,7 @@ int _getAndSendDataPointsNoNum(AQHOME_DATA *aqh, GWEN_MSG_ENDPOINT *ep, const AQ valueId=AQH_Value_GetId(value); tablePtr=AQH_Storage_GetDataPoints(aqh->storage, valueId, tsBegin, tsEnd, AQHOMEDATA_HANDLEGETDATAPOINTS_MAXTABLEENTRIES); if (tablePtr) { - _sendDataPointsResponse(aqh, ep, value, tablePtr); + _sendDataPointsResponse(aqh, ep, value, tablePtr, refMsgId); free(tablePtr); return AQH_MSG_IPC_SUCCESS; } @@ -129,7 +135,7 @@ int _getAndSendDataPointsNoNum(AQHOME_DATA *aqh, GWEN_MSG_ENDPOINT *ep, const AQ -int _getAndSendDataPointsWithNum(AQHOME_DATA *aqh, GWEN_MSG_ENDPOINT *ep, const AQH_VALUE *value, uint64_t num) +int _getAndSendDataPointsWithNum(AQHOME_DATA *aqh, GWEN_MSG_ENDPOINT *ep, const AQH_VALUE *value, uint64_t num, uint32_t refMsgId) { uint64_t valueId; uint64_t *tablePtr; @@ -139,7 +145,7 @@ int _getAndSendDataPointsWithNum(AQHOME_DATA *aqh, GWEN_MSG_ENDPOINT *ep, const valueId=AQH_Value_GetId(value); tablePtr=AQH_Storage_GetLastNDataPoints(aqh->storage, valueId, num); if (tablePtr) { - _sendDataPointsResponse(aqh, ep, value, tablePtr); + _sendDataPointsResponse(aqh, ep, value, tablePtr, refMsgId); free(tablePtr); return AQH_MSG_IPC_SUCCESS; } @@ -151,7 +157,8 @@ int _getAndSendDataPointsWithNum(AQHOME_DATA *aqh, GWEN_MSG_ENDPOINT *ep, const -void _sendDataPointsResponse(AQHOME_DATA *aqh, GWEN_MSG_ENDPOINT *ep, const AQH_VALUE *value, const uint64_t *tablePtr) +void _sendDataPointsResponse(AQHOME_DATA *aqh, GWEN_MSG_ENDPOINT *ep, const AQH_VALUE *value, const uint64_t *tablePtr, + uint32_t refMsgId) { int numTableEntries; int numDataPoints; @@ -159,13 +166,15 @@ void _sendDataPointsResponse(AQHOME_DATA *aqh, GWEN_MSG_ENDPOINT *ep, const AQH_ numTableEntries=(int)(tablePtr[0]); numDataPoints=numTableEntries/2; - outMsg=AQH_MultiDataDataIpcMsg_new(AQH_MSGTYPE_IPC_DATA_GETDATA_RSP, value, &(tablePtr[1]), numDataPoints); + outMsg=AQH_MultiDataDataIpcMsg_new(AQH_MSGTYPE_IPC_DATA_GETDATA_RSP, + GWEN_MsgEndpoint_GetNextMessageId(ep), refMsgId, + value, &(tablePtr[1]), numDataPoints); GWEN_MsgEndpoint_AddSendMessage(ep, outMsg); } -void _getAndSendLastDatapoint(AQHOME_DATA *aqh, GWEN_MSG_ENDPOINT *ep, const AQH_VALUE *value) +void _getAndSendLastDatapoint(AQHOME_DATA *aqh, GWEN_MSG_ENDPOINT *ep, const AQH_VALUE *value, uint32_t refMsgId) { GWEN_MSG *outMsg; int resultCode=AQH_MSG_IPC_SUCCESS; @@ -182,12 +191,16 @@ void _getAndSendLastDatapoint(AQHOME_DATA *aqh, GWEN_MSG_ENDPOINT *ep, const AQH } } else { - outMsg=AQH_MultiDataDataIpcMsg_newForOne(AQH_MSGTYPE_IPC_DATA_GETDATA_RSP, value, timestamp, data); + outMsg=AQH_MultiDataDataIpcMsg_newForOne(AQH_MSGTYPE_IPC_DATA_GETDATA_RSP, + GWEN_MsgEndpoint_GetNextMessageId(ep), refMsgId, + value, timestamp, data); GWEN_MsgEndpoint_AddSendMessage(ep, outMsg); return; } - outMsg=AQH_ResultIpcMsg_new(AQH_MSGTYPE_IPC_DATA_RESULT, resultCode); + outMsg=AQH_ResultIpcMsg_new(AQH_MSGTYPE_IPC_DATA_RESULT, + GWEN_MsgEndpoint_GetNextMessageId(ep), refMsgId, + resultCode); GWEN_MsgEndpoint_AddSendMessage(ep, outMsg); } diff --git a/apps/aqhome-data/c_getdevices.c b/apps/aqhome-data/c_getdevices.c index af192af..8b8ba69 100644 --- a/apps/aqhome-data/c_getdevices.c +++ b/apps/aqhome-data/c_getdevices.c @@ -35,7 +35,7 @@ * ------------------------------------------------------------------------------------------------ */ -static void _sendDeviceList(AQHOME_DATA *aqh, GWEN_MSG_ENDPOINT *ep, const AQH_DEVICE_LIST *vl, uint32_t flags); +static void _sendDeviceList(AQHOME_DATA *aqh, GWEN_MSG_ENDPOINT *ep, const AQH_DEVICE_LIST *vl, uint32_t flags, uint32_t refMsgId); @@ -54,7 +54,7 @@ void AqHomeData_HandleGetDevices(AQHOME_DATA *aqh, GWEN_MSG_ENDPOINT *ep, const DBG_INFO(NULL, "Have a list of %d devices", AQH_Device_List_GetCount(origDeviceList)); if (AQH_Device_List_GetCount(origDeviceList)=AQHOMEDATA_DEVICESPERMSG) { DBG_INFO(NULL, "Sending %d devices", AQH_Device_List_GetCount(tmpDeviceList)); - _sendDeviceList(aqh, ep, tmpDeviceList, next?0:AQH_MSGDATA_DEVICES_FLAGS_LASTMSG); + _sendDeviceList(aqh, ep, tmpDeviceList, next?0:AQH_MSGDATA_DEVICES_FLAGS_LASTMSG, GWEN_IpcMsg_GetMsgId(msg)); AQH_Device_List_Clear(tmpDeviceList); } v=next; } if (AQH_Device_List_GetCount(tmpDeviceList)) { DBG_INFO(NULL, "Sending %d devices", AQH_Device_List_GetCount(tmpDeviceList)); - _sendDeviceList(aqh, ep, tmpDeviceList, AQH_MSGDATA_DEVICES_FLAGS_LASTMSG); /* send remaining */ + _sendDeviceList(aqh, ep, tmpDeviceList, AQH_MSGDATA_DEVICES_FLAGS_LASTMSG, GWEN_IpcMsg_GetMsgId(msg)); /* send remaining */ } AQH_Device_List_free(tmpDeviceList); } } else { /* empty list */ - _sendDeviceList(aqh, ep, NULL, AQH_MSGDATA_DEVICES_FLAGS_LASTMSG); + _sendDeviceList(aqh, ep, NULL, AQH_MSGDATA_DEVICES_FLAGS_LASTMSG, GWEN_IpcMsg_GetMsgId(msg)); } } -void _sendDeviceList(AQHOME_DATA *aqh, GWEN_MSG_ENDPOINT *ep, const AQH_DEVICE_LIST *vl, uint32_t flags) +void _sendDeviceList(AQHOME_DATA *aqh, GWEN_MSG_ENDPOINT *ep, const AQH_DEVICE_LIST *vl, uint32_t flags, uint32_t refMsgId) { GWEN_MSG *msg; - msg=AQH_DevicesDataIpcMsg_new(AQH_MSGTYPE_IPC_DATA_GETDEVICES_RSP, flags, vl); + msg=AQH_DevicesDataIpcMsg_new(AQH_MSGTYPE_IPC_DATA_GETDEVICES_RSP, + GWEN_MsgEndpoint_GetNextMessageId(ep), refMsgId, + flags, vl); GWEN_MsgEndpoint_AddSendMessage(ep, msg); } diff --git a/apps/aqhome-data/c_getlastdatapoint.c b/apps/aqhome-data/c_getlastdatapoint.c index 46013c2..33aac85 100644 --- a/apps/aqhome-data/c_getlastdatapoint.c +++ b/apps/aqhome-data/c_getlastdatapoint.c @@ -73,7 +73,9 @@ void AqHomeData_HandleGetLastDataPoint(AQHOME_DATA *aqh, GWEN_MSG_ENDPOINT *ep, } } else { - outMsg=AQH_MultiDataDataIpcMsg_newForOne(AQH_MSGTYPE_IPC_DATA_GETLASTDATA_RSP, storedValue, timestamp, data); + outMsg=AQH_MultiDataDataIpcMsg_newForOne(AQH_MSGTYPE_IPC_DATA_GETLASTDATA_RSP, + GWEN_MsgEndpoint_GetNextMessageId(ep), GWEN_IpcMsg_GetMsgId(recvdMsg), + storedValue, timestamp, data); GWEN_MsgEndpoint_AddSendMessage(ep, outMsg); free(valueName); return; @@ -95,7 +97,9 @@ void AqHomeData_HandleGetLastDataPoint(AQHOME_DATA *aqh, GWEN_MSG_ENDPOINT *ep, resultCode=AQH_MSG_IPC_ERROR_PERMS; } - outMsg=AQH_ResultIpcMsg_new(AQH_MSGTYPE_IPC_DATA_RESULT, resultCode); + outMsg=AQH_ResultIpcMsg_new(AQH_MSGTYPE_IPC_DATA_RESULT, + GWEN_MsgEndpoint_GetNextMessageId(ep), GWEN_IpcMsg_GetMsgId(recvdMsg), + resultCode); GWEN_MsgEndpoint_AddSendMessage(ep, outMsg); } diff --git a/apps/aqhome-data/c_getvalues.c b/apps/aqhome-data/c_getvalues.c index 3b04121..49bcf16 100644 --- a/apps/aqhome-data/c_getvalues.c +++ b/apps/aqhome-data/c_getvalues.c @@ -35,7 +35,7 @@ * ------------------------------------------------------------------------------------------------ */ -static void _sendValueList(AQHOME_DATA *aqh, GWEN_MSG_ENDPOINT *ep, const AQH_VALUE_LIST *vl, uint32_t flags); +static void _sendValueList(AQHOME_DATA *aqh, GWEN_MSG_ENDPOINT *ep, const AQH_VALUE_LIST *vl, uint32_t flags, uint32_t refMsgId); @@ -54,7 +54,7 @@ void AqHomeData_HandleGetValues(AQHOME_DATA *aqh, GWEN_MSG_ENDPOINT *ep, const G DBG_INFO(NULL, "Have a list of %d values", AQH_Value_List_GetCount(origValueList)); if (AQH_Value_List_GetCount(origValueList)=AQHOMEDATA_VALUESPERMSG) { DBG_INFO(NULL, "Sending %d values", AQH_Value_List_GetCount(tmpValueList)); - _sendValueList(aqh, ep, tmpValueList, next?0:AQH_MSGDATA_VALUES_FLAGS_LASTMSG); + _sendValueList(aqh, ep, tmpValueList, next?0:AQH_MSGDATA_VALUES_FLAGS_LASTMSG, GWEN_IpcMsg_GetMsgId(msg)); AQH_Value_List_Clear(tmpValueList); } v=next; } if (AQH_Value_List_GetCount(tmpValueList)) { DBG_INFO(NULL, "Sending %d values", AQH_Value_List_GetCount(tmpValueList)); - _sendValueList(aqh, ep, tmpValueList, AQH_MSGDATA_VALUES_FLAGS_LASTMSG); /* send remaining */ + _sendValueList(aqh, ep, tmpValueList, AQH_MSGDATA_VALUES_FLAGS_LASTMSG, GWEN_IpcMsg_GetMsgId(msg)); /* send remaining */ } AQH_Value_List_free(tmpValueList); } } else { /* empty list */ - _sendValueList(aqh, ep, NULL, AQH_MSGDATA_VALUES_FLAGS_LASTMSG); + _sendValueList(aqh, ep, NULL, AQH_MSGDATA_VALUES_FLAGS_LASTMSG, GWEN_IpcMsg_GetMsgId(msg)); } } -void _sendValueList(AQHOME_DATA *aqh, GWEN_MSG_ENDPOINT *ep, const AQH_VALUE_LIST *vl, uint32_t flags) +void _sendValueList(AQHOME_DATA *aqh, GWEN_MSG_ENDPOINT *ep, const AQH_VALUE_LIST *vl, uint32_t flags, uint32_t refMsgId) { GWEN_MSG *msg; - msg=AQH_ValuesDataIpcMsg_new(AQH_MSGTYPE_IPC_DATA_GETVALUES_RSP, flags, vl); + msg=AQH_ValuesDataIpcMsg_new(AQH_MSGTYPE_IPC_DATA_GETVALUES_RSP, + GWEN_MsgEndpoint_GetNextMessageId(ep), refMsgId, + flags, vl); GWEN_MsgEndpoint_AddSendMessage(ep, msg); } diff --git a/apps/aqhome-data/c_moddevice.c b/apps/aqhome-data/c_moddevice.c index 9a46d04..0d26117 100644 --- a/apps/aqhome-data/c_moddevice.c +++ b/apps/aqhome-data/c_moddevice.c @@ -104,7 +104,9 @@ void AqHomeData_HandleModDevice(AQHOME_DATA *aqh, GWEN_MSG_ENDPOINT *ep, GWEN_MS resultCode=AQH_MSG_IPC_ERROR_PERMS; } - outMsg=AQH_ResultIpcMsg_new(AQH_MSGTYPE_IPC_DATA_RESULT, resultCode); + outMsg=AQH_ResultIpcMsg_new(AQH_MSGTYPE_IPC_DATA_RESULT, + GWEN_MsgEndpoint_GetNextMessageId(ep), GWEN_IpcMsg_GetMsgId(recvdMsg), + resultCode); GWEN_MsgEndpoint_AddSendMessage(ep, outMsg); } diff --git a/apps/aqhome-data/c_setdata.c b/apps/aqhome-data/c_setdata.c index a9621b9..487ee96 100644 --- a/apps/aqhome-data/c_setdata.c +++ b/apps/aqhome-data/c_setdata.c @@ -14,6 +14,7 @@ #include "./c_setdata.h" #include "./aqhome_data_p.h" #include "./loop.h" +#include "aqhome/aqhome.h" #include "aqhome/ipc/data/ipc_data.h" #include "aqhome/ipc/data/msg_data_set.h" #include "aqhome/ipc/endpoint_ipc.h" @@ -77,7 +78,9 @@ void AqHomeData_HandleSetData(AQHOME_DATA *aqh, GWEN_MSG_ENDPOINT *epSrc, GWEN_M AQH_Value_free(recvdValue); free(valueDataFreeable); - outMsg=AQH_ResultIpcMsg_new(AQH_MSGTYPE_IPC_DATA_RESULT, resultCode); + outMsg=AQH_ResultIpcMsg_new(AQH_MSGTYPE_IPC_DATA_RESULT, + GWEN_MsgEndpoint_GetNextMessageId(epSrc), GWEN_IpcMsg_GetMsgId(recvdMsg), + resultCode); GWEN_MsgEndpoint_AddSendMessage(epSrc, outMsg); } @@ -96,7 +99,9 @@ int _forwardDataToDriver(AQHOME_DATA *aqh, const AQH_VALUE *v, const char *data) GWEN_MSG *driverMsg; DBG_INFO(AQH_LOGDOMAIN, "Sending SETDATA msg to driver endpoint (%s)", GWEN_MsgEndpoint_GetName(ep)); - driverMsg=AQH_SetDataIpcMsg_new(AQH_MSGTYPE_IPC_DATA_SETDATA, v, data); + driverMsg=AQH_SetDataIpcMsg_new(AQH_MSGTYPE_IPC_DATA_SETDATA, + GWEN_MsgEndpoint_GetNextMessageId(ep), 0, + v, data); GWEN_MsgEndpoint_AddSendMessage(ep, driverMsg); return AQH_MSG_IPC_SUCCESS; } diff --git a/apps/aqhome-data/c_updatedata.c b/apps/aqhome-data/c_updatedata.c index cd9165e..f515f24 100644 --- a/apps/aqhome-data/c_updatedata.c +++ b/apps/aqhome-data/c_updatedata.c @@ -87,7 +87,9 @@ void AqHomeData_HandleUpdateData(AQHOME_DATA *aqh, GWEN_MSG_ENDPOINT *ep, GWEN_M } AQH_Value_free(recvdValue); - outMsg=AQH_ResultIpcMsg_new(AQH_MSGTYPE_IPC_DATA_RESULT, resultCode); + outMsg=AQH_ResultIpcMsg_new(AQH_MSGTYPE_IPC_DATA_RESULT, + GWEN_MsgEndpoint_GetNextMessageId(ep), GWEN_IpcMsg_GetMsgId(recvdMsg), + resultCode); GWEN_MsgEndpoint_AddSendMessage(ep, outMsg); } @@ -131,7 +133,9 @@ void _sendDataChangedMsgToAllClients(AQHOME_DATA *aqh, GWEN_MSG_ENDPOINT *epSrc, GWEN_MSG *msg; DBG_DEBUG(AQH_LOGDOMAIN, "Sending update msg to endpoint %s", GWEN_MsgEndpoint_GetName(ep)); - msg=AQH_MultiDataDataIpcMsg_new(AQH_MSGTYPE_IPC_DATA_DATACHANGED, v, dataPoints, numValues); + msg=AQH_MultiDataDataIpcMsg_new(AQH_MSGTYPE_IPC_DATA_DATACHANGED, + GWEN_MsgEndpoint_GetNextMessageId(ep), 0, + v, dataPoints, numValues); GWEN_MsgEndpoint_AddSendMessage(ep, msg); } else { diff --git a/apps/aqhome-mqttlog/loop_mqtt.c b/apps/aqhome-mqttlog/loop_mqtt.c index 2e57c2b..88b0cd7 100644 --- a/apps/aqhome-mqttlog/loop_mqtt.c +++ b/apps/aqhome-mqttlog/loop_mqtt.c @@ -12,6 +12,7 @@ #include "./loop_mqtt.h" #include "./aqhome_mqtt_p.h" +#include "aqhome/aqhome.h" #include "aqhome/mqtt/msg_mqtt_publish.h" #include "aqhome/ipc/data/msg_data_multidata.h" #include "aqhome/ipc/data/msg_data_values.h" @@ -42,7 +43,7 @@ static void _sendMessage(AQHOME_MQTT *aqh, const AQHMQTT_DEVICE *device, const A static void _announceDeviceToBroker(AQHOME_MQTT *aqh, const AQHMQTT_DEVICE *device); static void _sendAnnounceValueMessage(AQHOME_MQTT *aqh, const AQHMQTT_DEVICE *device, const AQHMQTT_VALUE *value); static AQH_VALUE *_mkMessageValue(const AQHMQTT_DEVICE *device, const AQHMQTT_VALUE *value); -static int _mqttValueTypeTessageValueType(int t); +static int _mqttValueTypeMessageValueType(int t); static int _registerNewDeviceForTopic(AQHOME_MQTT *aqh, GWEN_MSG_ENDPOINT *ep, const char *rcvdTopic, const char *rcvdValue); static AQHMQTT_TOPIC *_findMaskMatchingTopic(AQHMQTT_TOPIC_LIST *topicList, const char *rcvdTopic, int dir); static AQHMQTT_TOPIC *_findTopicMatchingTopic(AQHMQTT_TOPIC_LIST *topicList, const char *rcvdTopic, int dir); @@ -277,7 +278,9 @@ void _sendMessage(AQHOME_MQTT *aqh, const AQHMQTT_DEVICE *device, const AQHMQTT_ msgValue=_mkMessageValue(device, value); - pubMsg=AQH_MultiDataDataIpcMsg_new(AQH_MSGTYPE_IPC_DATA_UPDATEDATA, msgValue, arrayToSend, 1); + pubMsg=AQH_MultiDataDataIpcMsg_new(AQH_MSGTYPE_IPC_DATA_UPDATEDATA, + GWEN_MsgEndpoint_GetNextMessageId(aqh->brokerEndpoint), 0, + msgValue, arrayToSend, 1); if (pubMsg) { DBG_INFO(AQH_LOGDOMAIN, "BROKER UPDATE_DATA %s/%s: %f", deviceName?deviceName:"", @@ -326,7 +329,9 @@ void _sendAnnounceValueMessage(AQHOME_MQTT *aqh, const AQHMQTT_DEVICE *device, c AQH_VALUE *msgValue; msgValue=_mkMessageValue(device, value); - pubMsg=AQH_ValuesDataIpcMsg_newForOneValue(AQH_MSGTYPE_IPC_DATA_ANNOUNCEVALUE, 0, msgValue); + pubMsg=AQH_ValuesDataIpcMsg_newForOneValue(AQH_MSGTYPE_IPC_DATA_ANNOUNCEVALUE, + GWEN_MsgEndpoint_GetNextMessageId(aqh->brokerEndpoint), 0, + 0, msgValue); if (pubMsg) { DBG_INFO(AQH_LOGDOMAIN, "BROKER ANNOUNCE_VALUE %s", AQH_Value_GetName(msgValue)); GWEN_MsgEndpoint_AddSendMessage(aqh->brokerEndpoint, pubMsg); @@ -344,21 +349,21 @@ AQH_VALUE *_mkMessageValue(const AQHMQTT_DEVICE *device, const AQHMQTT_VALUE *va AQH_Value_SetDeviceName(msgValue, AQHMQTT_Device_GetId(device)); AQH_Value_SetName(msgValue, AQHMQTT_Value_GetName(value)); AQH_Value_SetValueUnits(msgValue, AQHMQTT_Value_GetValueUnits(value)); - AQH_Value_SetValueType(msgValue, _mqttValueTypeTessageValueType(AQHMQTT_Value_GetValueType(value))); + AQH_Value_SetValueType(msgValue, _mqttValueTypeMessageValueType(AQHMQTT_Value_GetValueType(value))); return msgValue; } -int _mqttValueTypeTessageValueType(int t) +int _mqttValueTypeMessageValueType(int t) { switch(t){ case AQHMQTT_ValueType_Sensor: return AQH_ValueType_Sensor; case AQHMQTT_ValueType_Actor: return AQH_ValueType_Actor; - default: - DBG_ERROR(AQH_LOGDOMAIN, "Invalid mqtt value type %d", t); - return AQH_ValueType_Sensor; + default: break; } + DBG_ERROR(AQH_LOGDOMAIN, "Invalid mqtt value type %d", t); + return AQH_ValueType_Sensor; } diff --git a/apps/aqhome-nodes/0BUILD b/apps/aqhome-nodes/0BUILD index c72ddf6..b1deec1 100644 --- a/apps/aqhome-nodes/0BUILD +++ b/apps/aqhome-nodes/0BUILD @@ -8,6 +8,8 @@ $(gwenhywfar_cflags) -I$(topsrcdir) -I$(topbuilddir) + -I$(topsrcdir)/apps + -I$(topbuilddir)/apps @@ -45,6 +47,8 @@ loop_ipc.h db.h tty_log.h + devicesread.h + devicesdump.h @@ -61,9 +65,12 @@ loop_ipc.c db.c tty_log.c + devicesread.c + devicesdump.c + aqhnodes_types aqhome @@ -72,6 +79,7 @@ + types diff --git a/apps/aqhome-nodes/aqhomed.c b/apps/aqhome-nodes/aqhomed.c index 1649125..0f3de23 100644 --- a/apps/aqhome-nodes/aqhomed.c +++ b/apps/aqhome-nodes/aqhomed.c @@ -51,6 +51,7 @@ AQHOMED *AqHomed_new(void) GWEN_NEW_OBJECT(AQHOMED, aqh); aqh->rootEndpoint=GWEN_MsgEndpoint_new("root", 0); aqh->nodeDb=AQH_NodeDb_new(); + aqh->requestTree=GWEN_MsgRequest_new(); return aqh; } @@ -60,6 +61,7 @@ AQHOMED *AqHomed_new(void) void AqHomed_free(AQHOMED *aqh) { if (aqh) { + GWEN_MsgRequest_free(aqh->requestTree); GWEN_MsgEndpoint_free(aqh->rootEndpoint); aqh->rootEndpoint=NULL; aqh->ttyEndpoint=NULL; @@ -164,5 +166,56 @@ int AqHomed_GetTimeout(const AQHOMED *aqh) +GWEN_MSG_REQUEST *AqHomed_GetRequestTree(const AQHOMED *aqh) +{ + return aqh?aqh->requestTree:NULL; +} + + + +void AqHomed_AddRequestToTree(AQHOMED *aqh, GWEN_MSG_REQUEST *rq) +{ + if (aqh && rq) + GWEN_MsgRequest_Tree2_AddChild(aqh->requestTree, rq); +} + + + +const AQHNODE_DEVICE_LIST *AqHomed_GetDeviceDefList(const AQHOMED *aqh) +{ + return aqh?aqh->deviceDefList:NULL; +} + + + +const AQHNODE_DEVICE *AqHomed_FindDeviceDef(const AQHOMED *aqh, uint32_t manufacturer, uint16_t deviceType, uint16_t deviceVersion) +{ + if (aqh && aqh->deviceDefList) { + const AQHNODE_DEVICE *device; + + device=AQHNODE_Device_List_First(aqh->deviceDefList); + while(device) { + if (AQHNODE_Device_GetManufacturer(device)==manufacturer && + AQHNODE_Device_GetDeviceType(device)==deviceType && + AQHNODE_Device_GetDeviceVersion(device)==(deviceVersion & 0xff00)) + return device; + device=AQHNODE_Device_List_Next(device); + } + } + + return NULL; +} + + + +const AQHNODE_DEVICE *AqHomed_GetDeviceDefByName(const AQHOMED *aqh, const char *name) +{ + if (aqh && aqh->deviceDefList && name) + return AQHNODE_Device_List_GetByName(aqh->deviceDefList, name); + return NULL; +} + + + diff --git a/apps/aqhome-nodes/aqhomed.h b/apps/aqhome-nodes/aqhomed.h index a56033a..3fab417 100644 --- a/apps/aqhome-nodes/aqhomed.h +++ b/apps/aqhome-nodes/aqhomed.h @@ -12,6 +12,7 @@ #include #include +#include #define AQHOME_ENDPOINTGROUP_NODE 1 @@ -21,6 +22,10 @@ typedef struct AQHOMED AQHOMED; + +#include "aqhome-nodes/types/device.h" + + AQHOMED *AqHomed_new(void); void AqHomed_free(AQHOMED *aqh); @@ -41,6 +46,14 @@ void AqHomed_SetDbFile(AQHOMED *aqh, const char *s); int AqHomed_GetTimeout(const AQHOMED *aqh); +GWEN_MSG_REQUEST *AqHomed_GetRequestTree(const AQHOMED *aqh); +void AqHomed_AddRequestToTree(AQHOMED *aqh, GWEN_MSG_REQUEST *rq); + +const AQHNODE_DEVICE_LIST *AqHomed_GetDeviceDefList(const AQHOMED *aqh); +const AQHNODE_DEVICE *AqHomed_FindDeviceDef(const AQHOMED *aqh, uint32_t manufacturer, uint16_t deviceType, uint16_t deviceVersion); +const AQHNODE_DEVICE *AqHomed_GetDeviceDefByName(const AQHOMED *aqh, const char *name); + + #endif diff --git a/apps/aqhome-nodes/aqhomed_p.h b/apps/aqhome-nodes/aqhomed_p.h index 574b9fd..a2d7a31 100644 --- a/apps/aqhome-nodes/aqhomed_p.h +++ b/apps/aqhome-nodes/aqhomed_p.h @@ -34,6 +34,7 @@ struct AQHOMED { GWEN_MSG_ENDPOINT *brokerEndpoint; AQH_NODE_DB *nodeDb; + AQHNODE_DEVICE_LIST *deviceDefList; GWEN_DB_NODE *dbArgs; @@ -44,6 +45,8 @@ struct AQHOMED { int timeout; /* timeout for run e.g. inside valgrind */ int nodeAddress; + + GWEN_MSG_REQUEST *requestTree; }; #endif diff --git a/apps/aqhome-nodes/db.c b/apps/aqhome-nodes/db.c index 12522ef..7da6020 100644 --- a/apps/aqhome-nodes/db.c +++ b/apps/aqhome-nodes/db.c @@ -18,6 +18,7 @@ #include "aqhome/msg/msg_sendstats.h" #include "aqhome/msg/msg_recvstats.h" #include "aqhome/msg/msg_value2.h" +#include "aqhome/msg/msg_value3.h" #include "aqhome/msg/msg_needaddr.h" #include "aqhome/msg/msg_claimaddr.h" #include "aqhome/msg/msg_haveaddr.h" @@ -39,6 +40,7 @@ */ static void _handleMsgValue2(AQHOMED *aqh, const GWEN_MSG *msg); +static void _handleMsgValue3(AQHOMED *aqh, const GWEN_MSG *msg); static void _handleMsgNeedAddress(AQHOMED *aqh, const GWEN_MSG *msg); static void _handleMsgClaimAddress(AQHOMED *aqh, const GWEN_MSG *msg); static void _handleMsgHaveAddress(AQHOMED *aqh, const GWEN_MSG *msg); @@ -49,6 +51,7 @@ static void _handleMsgFlashReady(AQHOMED *aqh, const GWEN_MSG *msg); static AQH_NODE_INFO *_getOrCreateNodeAndUpdateUidAddr(AQHOMED *aqh, const GWEN_MSG *msg, uint32_t uid); static void _updateTimestampLastChange(AQH_NODE_INFO *ni); +static void _assignDeviceId(AQHOMED *aqh, AQH_NODE_INFO *ni, uint32_t uid); @@ -78,6 +81,7 @@ void AqHomed_NodeMsgToDb(AQHOMED *aqh, const GWEN_MSG *msg) case AQH_MSG_TYPE_COMSENDSTATS: _handleMsgComSendStat(aqh, msg); break; case AQH_MSG_TYPE_COMRECVSTATS: _handleMsgComRecvStat(aqh, msg); break; case AQH_MSG_TYPE_VALUE2: _handleMsgValue2(aqh, msg); break; + case AQH_MSG_TYPE_VALUE_REPORT: _handleMsgValue3(aqh, msg); break; case AQH_MSG_TYPE_NEED_ADDRESS: _handleMsgNeedAddress(aqh, msg); break; case AQH_MSG_TYPE_CLAIM_ADDRESS: _handleMsgClaimAddress(aqh, msg); break; case AQH_MSG_TYPE_HAVE_ADDRESS: _handleMsgHaveAddress(aqh, msg); break; @@ -119,6 +123,20 @@ void _handleMsgValue2(AQHOMED *aqh, const GWEN_MSG *msg) +void _handleMsgValue3(AQHOMED *aqh, const GWEN_MSG *msg) +{ + AQH_NODE_INFO *ni; + uint32_t uid; + + uid=AQH_Value3Msg_GetUid(msg); + ni=_getOrCreateNodeAndUpdateUidAddr(aqh, msg, uid); + if (ni==NULL) { + DBG_INFO(AQH_LOGDOMAIN, "Error handling message"); + } +} + + + void _handleMsgNeedAddress(AQHOMED *aqh, const GWEN_MSG *msg) { AQH_NODE_INFO *ni; @@ -207,6 +225,8 @@ void _handleMsgDevice(AQHOMED *aqh, const GWEN_MSG *msg) uid=AQH_DeviceMsg_GetUid(msg); ni=_getOrCreateNodeAndUpdateUidAddr(aqh, msg, uid); if (ni) { + const char *s; + AQH_NodeInfo_SetManufacturer(ni, AQH_DeviceMsg_GetManufacturer(msg)); AQH_NodeInfo_SetDeviceType(ni, AQH_DeviceMsg_GetDeviceType(msg)); AQH_NodeInfo_SetDeviceVersion(ni, (AQH_DeviceMsg_GetDeviceVersion(msg)<<8)+AQH_DeviceMsg_GetDeviceRevision(msg)); @@ -215,6 +235,9 @@ void _handleMsgDevice(AQHOMED *aqh, const GWEN_MSG *msg) (AQH_DeviceMsg_GetFirmwareVersionMajor(msg)<<16) | (AQH_DeviceMsg_GetFirmwareVersionMinor(msg)<<8) | AQH_DeviceMsg_GetFirmwareVersionPatchlevel(msg)); + s=AQH_NodeInfo_GetDeviceId(ni); + if (!(s && *s)) + _assignDeviceId(aqh, ni, uid); _updateTimestampLastChange(ni); AQH_NodeDb_SetModified(aqh->nodeDb); } @@ -233,6 +256,8 @@ void _handleMsgFlashReady(AQHOMED *aqh, const GWEN_MSG *msg) uid=AQH_FlashReadyMsg_GetUid(msg); ni=_getOrCreateNodeAndUpdateUidAddr(aqh, msg, uid); if (ni) { + const char *s; + AQH_NodeInfo_SetManufacturer(ni, AQH_FlashReadyMsg_GetManufacturer(msg)); AQH_NodeInfo_SetDeviceType(ni, AQH_FlashReadyMsg_GetDeviceType(msg)); AQH_NodeInfo_SetDeviceVersion(ni, (AQH_FlashReadyMsg_GetDeviceVersion(msg)<<8)+AQH_FlashReadyMsg_GetDeviceRevision(msg)); @@ -241,6 +266,9 @@ void _handleMsgFlashReady(AQHOMED *aqh, const GWEN_MSG *msg) (AQH_FlashReadyMsg_GetFirmwareVersionMajor(msg)<<16) | (AQH_FlashReadyMsg_GetFirmwareVersionMinor(msg)<<8) | AQH_FlashReadyMsg_GetFirmwareVersionPatchlevel(msg)); + s=AQH_NodeInfo_GetDeviceId(ni); + if (!(s && *s)) + _assignDeviceId(aqh, ni, uid); _updateTimestampLastChange(ni); AQH_NodeDb_SetModified(aqh->nodeDb); } @@ -291,6 +319,32 @@ AQH_NODE_INFO *_getOrCreateNodeAndUpdateUidAddr(AQHOMED *aqh, const GWEN_MSG *ms +void _assignDeviceId(AQHOMED *aqh, AQH_NODE_INFO *ni, uint32_t uid) +{ + const AQHNODE_DEVICE *dev; + + dev=AqHomed_FindDeviceDef(aqh, + AQH_NodeInfo_GetManufacturer(ni), + AQH_NodeInfo_GetDeviceType(ni), + AQH_NodeInfo_GetDeviceVersion(ni)); + if (dev==NULL) { + DBG_ERROR(NULL, + "Unknown NODE device encountered (%08x, %04x, %04x)", + AQH_NodeInfo_GetManufacturer(ni), + AQH_NodeInfo_GetDeviceType(ni), + AQH_NodeInfo_GetDeviceVersion(ni)); + } + else { + const char *s; + + s=AQHNODE_Device_GetName(dev); + DBG_ERROR(NULL, "Found device \"%s\" (%08x)", s?s:"", uid); + AQH_NodeInfo_SetDeviceId(ni, s); + } +} + + + void _updateTimestampLastChange(AQH_NODE_INFO *ni) { GWEN_TIMESTAMP *t; diff --git a/apps/aqhome-nodes/devicesdump.c b/apps/aqhome-nodes/devicesdump.c new file mode 100644 index 0000000..a95eaad --- /dev/null +++ b/apps/aqhome-nodes/devicesdump.c @@ -0,0 +1,125 @@ +/**************************************************************************** + * 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 "./devicesdump.h" +#include "./aqhomed_p.h" +#include "aqhome/aqhome.h" + +#include + + + +/* ------------------------------------------------------------------------------------------------ + * forward declarations + * ------------------------------------------------------------------------------------------------ + */ + +static void _dumpDevice(const AQHNODE_DEVICE *dev, GWEN_BUFFER *dbuf, int indent); +static void _dumpValue(const AQHNODE_VALUE *value, GWEN_BUFFER *dbuf, int indent); + + + +/* ------------------------------------------------------------------------------------------------ + * implementations + * ------------------------------------------------------------------------------------------------ + */ + +void AqHomeNodes_DumpDevices(const AQHNODE_DEVICE_LIST *devList, GWEN_BUFFER *dbuf) +{ + + if (devList && AQHNODE_Device_List_GetCount(devList)) { + const AQHNODE_DEVICE *dev; + + GWEN_Buffer_AppendString(dbuf, "Devices:\n"); + dev=AQHNODE_Device_List_First(devList); + while(dev) { + _dumpDevice(dev, dbuf, 2); + dev=AQHNODE_Device_List_Next(dev); + } + } + +} + + + +void _dumpDevice(const AQHNODE_DEVICE *dev, GWEN_BUFFER *dbuf, int indent) +{ + const char *name; + const char *driver; + uint32_t manufacturer; + uint16_t deviceType; + uint16_t deviceVersion; + const AQHNODE_VALUE_LIST *valueList; + + name=AQHNODE_Device_GetName(dev); + driver=AQHNODE_Device_GetDriver(dev); + manufacturer=AQHNODE_Device_GetManufacturer(dev); + deviceType=AQHNODE_Device_GetDeviceType(dev); + deviceVersion=AQHNODE_Device_GetDeviceVersion(dev); + + GWEN_Buffer_FillWithBytes(dbuf, ' ', indent); + GWEN_Buffer_AppendArgs(dbuf, "Device: %s (%s, %08x, %04x, %04x)\n", + name?name:"", + driver?driver:"", + manufacturer, + deviceType, + deviceVersion); + valueList=AQHNODE_Device_GetValueList(dev); + if (valueList && AQHNODE_Value_List_GetCount(valueList)) { + const AQHNODE_VALUE *value; + + value=AQHNODE_Value_List_First(valueList); + while(value) { + _dumpValue(value, dbuf, indent+2); + value=AQHNODE_Value_List_Next(value); + } + } +} + + + +void _dumpValue(const AQHNODE_VALUE *value, GWEN_BUFFER *dbuf, int indent) +{ + int id; + const char *name; + const char *descr; + int valueType; + int dataType; + int modality; + const char *units; + + id=AQHNODE_Value_GetId(value); + name=AQHNODE_Value_GetName(value); + descr=AQHNODE_Value_GetDescription(value); + valueType=AQHNODE_Value_GetValueType(value); + dataType=AQHNODE_Value_GetDataType(value); + modality=AQHNODE_Value_GetModality(value); + units=AQHNODE_Value_GetValueUnits(value); + + GWEN_Buffer_FillWithBytes(dbuf, ' ', indent); + GWEN_Buffer_AppendArgs(dbuf, "Value: %d[%02x] (%s, %s, %s, %s, %s, %s)\n", + id, id, + name?name:"", + AQH_ValueType_toString(valueType), + AQH_ValueDataType_toString(dataType), + AQH_ValueModality_toString(modality), + units?units:"", + descr?descr:""); +} + + + + + + + diff --git a/apps/aqhome-nodes/devicesdump.h b/apps/aqhome-nodes/devicesdump.h new file mode 100644 index 0000000..2ae750b --- /dev/null +++ b/apps/aqhome-nodes/devicesdump.h @@ -0,0 +1,24 @@ +/**************************************************************************** + * 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. + ****************************************************************************/ + +#ifndef AQHOME_NODES_DEVICESDUMP_H +#define AQHOME_NODES_DEVICESDUMP_H + + +#include "./aqhomed.h" +#include "aqhome-nodes/types/device.h" + + + +void AqHomeNodes_DumpDevices(const AQHNODE_DEVICE_LIST *devList, GWEN_BUFFER *dbuf); + + + +#endif + + diff --git a/apps/aqhome-nodes/devicesread.c b/apps/aqhome-nodes/devicesread.c new file mode 100644 index 0000000..bad63d3 --- /dev/null +++ b/apps/aqhome-nodes/devicesread.c @@ -0,0 +1,396 @@ +/**************************************************************************** + * 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 "./devicesread.h" +#include "./aqhomed_p.h" +#include "aqhome/aqhome.h" + +#include +#include +#include + + + +/* ------------------------------------------------------------------------------------------------ + * defines + * ------------------------------------------------------------------------------------------------ + */ + + + + +/* ------------------------------------------------------------------------------------------------ + * forward declarations + * ------------------------------------------------------------------------------------------------ + */ + +static int _readDeviceFileToList(const char *sFilename, AQHNODE_DEVICE_LIST *deviceList); +static AQHNODE_DEVICE_LIST *_readDeviceFiles(const GWEN_STRINGLIST *sl); +static int _readXmlDevices(GWEN_XMLNODE *deviceListNode, AQHNODE_DEVICE_LIST *deviceList); +static AQHNODE_DEVICE *_readXmlDevice(GWEN_XMLNODE *deviceNode); +static AQHNODE_VALUE_LIST *_readXmlValueList(GWEN_XMLNODE *valuesNode); +static AQHNODE_VALUE *_readXmlValue(GWEN_XMLNODE *valueNode); +static int _readManufacturer(AQHNODE_DEVICE *device, GWEN_XMLNODE *deviceNode); +static int _readDeviceType(AQHNODE_DEVICE *device, GWEN_XMLNODE *deviceNode); +static int _readDeviceVersion(AQHNODE_DEVICE *device, GWEN_XMLNODE *deviceNode); + + + +/* ------------------------------------------------------------------------------------------------ + * implementations + * ------------------------------------------------------------------------------------------------ + */ + +AQHNODE_DEVICE_LIST *AqHomeNodes_ReadDeviceFile(const char *sFilename) +{ + int rv; + + rv=GWEN_Directory_GetPath(sFilename, GWEN_PATH_FLAGS_CHECKROOT | GWEN_PATH_FLAGS_PATHMUSTEXIST | GWEN_PATH_FLAGS_VARIABLE); + if (rv<0) { + DBG_ERROR(NULL, "File \"%s\" does not exists, writing later", sFilename); + return NULL; + } + else { + AQHNODE_DEVICE_LIST *deviceList; + + deviceList=AQHNODE_Device_List_new(); + rv=_readDeviceFileToList(sFilename, deviceList); + if (rv<0) { + DBG_ERROR(NULL, "File \"%s\" not found", sFilename); + AQHNODE_Device_List_free(deviceList); + return NULL; + } + + if (AQHNODE_Device_List_GetCount(deviceList)<1) { + AQHNODE_Device_List_free(deviceList); + return NULL; + } + return deviceList; + } +} + + + +AQHNODE_DEVICE_LIST *AqHomeNodes_ReadDataDeviceFiles() +{ + GWEN_STRINGLIST *sl; + + sl=AQH_GetListOfMatchingDataFiles("aqhome/devices/nodes", "*.xml"); + if (sl) { + AQHNODE_DEVICE_LIST *deviceList; + + deviceList=_readDeviceFiles(sl); + GWEN_StringList_free(sl); + if (deviceList==NULL) { + DBG_INFO(NULL, "Error reading data device files"); + return NULL; + } + return deviceList; + } + else { + DBG_ERROR(NULL, "No data device files"); + return NULL; + } +} + + + +AQHNODE_DEVICE_LIST *_readDeviceFiles(const GWEN_STRINGLIST *sl) +{ + GWEN_STRINGLISTENTRY *se; + AQHNODE_DEVICE_LIST *deviceList; + + deviceList=AQHNODE_Device_List_new(); + se=GWEN_StringList_FirstEntry(sl); + while(se) { + const char *s; + + s=GWEN_StringListEntry_Data(se); + if (s && *s) { + int rv; + + DBG_INFO(NULL, "Reading device file \"%s\"", s); + rv=_readDeviceFileToList(s, deviceList); + if (rv<0 && rv!=GWEN_ERROR_NO_DATA) { + DBG_WARN(NULL, "Error reading device file \"%s\" (%d), ignoring", s, rv); + } + } + se=GWEN_StringListEntry_Next(se); + } + + if (AQHNODE_Device_List_GetCount(deviceList)<1) { + AQHNODE_Device_List_free(deviceList); + return NULL; + } + + return deviceList; +} + + + +int _readDeviceFileToList(const char *sFilename, AQHNODE_DEVICE_LIST *deviceList) +{ + GWEN_XMLNODE *rootNode; + GWEN_XMLNODE *deviceListNode; + int rv; + + rootNode=GWEN_XMLNode_new(GWEN_XMLNodeTypeTag, NULL); + rv=GWEN_XML_ReadFile(rootNode, sFilename, GWEN_XML_FLAGS_DEFAULT); + if (rv<0) { + DBG_ERROR(NULL, "Error reading XML file \"%s\": %d", sFilename, rv); + GWEN_XMLNode_free(rootNode); + return rv; + } + + deviceListNode=GWEN_XMLNode_FindFirstTag(rootNode, "devices", NULL, NULL); + if (deviceListNode==NULL) + deviceListNode=rootNode; + + rv=_readXmlDevices(deviceListNode, deviceList); + if (rv<0 && rv!=GWEN_ERROR_NO_DATA) { + DBG_ERROR(AQH_LOGDOMAIN, "Error reading devices from file \"%s\" (%d)", sFilename, rv); + GWEN_XMLNode_free(rootNode); + return rv; + } + + GWEN_XMLNode_free(rootNode); + return 0; +} + + + +int _readXmlDevices(GWEN_XMLNODE *deviceListNode, AQHNODE_DEVICE_LIST *deviceList) +{ + GWEN_XMLNODE *deviceNode; + + deviceNode=GWEN_XMLNode_FindFirstTag(deviceListNode, "device", NULL, NULL); + if (deviceNode) { + while(deviceNode) { + const char *driverName; + + driverName=GWEN_XMLNode_GetProperty(deviceNode, "driver", NULL); + if (driverName && *driverName && strcasecmp(driverName, "nodes")==0) { + AQHNODE_DEVICE *device; + + device=_readXmlDevice(deviceNode); + if (device==NULL) { + DBG_INFO(NULL, "Error reading device from XML"); + return GWEN_ERROR_BAD_DATA; + } + else { + const char *sDeviceName; + + sDeviceName=AQHNODE_Device_GetName(device); + if (sDeviceName && *sDeviceName) { + DBG_ERROR(NULL, "Adding device type \"%s\" to list", sDeviceName?sDeviceName:""); + AQHNODE_Device_List_Add(device, deviceList); + } + else { + DBG_ERROR(NULL, "Device with no name, not adding"); + AQHNODE_Device_free(device); + } + } + } + else { + DBG_INFO(NULL, "Device is not an NODES device, ignoring"); + } + deviceNode=GWEN_XMLNode_FindNextTag(deviceNode, "device", NULL, NULL); + } /* while */ + return 0; + } + else { + DBG_INFO(NULL, "No element found"); + return GWEN_ERROR_NO_DATA; + } +} + + + +AQHNODE_DEVICE *_readXmlDevice(GWEN_XMLNODE *deviceNode) +{ + AQHNODE_DEVICE *device; + GWEN_XMLNODE *valuesNode; + int rv; + + device=AQHNODE_Device_new(); + AQHNODE_Device_SetName(device, GWEN_XMLNode_GetProperty(deviceNode, "name", NULL)); + AQHNODE_Device_SetDriver(device, GWEN_XMLNode_GetProperty(deviceNode, "driver", NULL)); + rv=_readManufacturer(device, deviceNode); + if (rv<0) { + DBG_INFO(NULL, "here (%d)", rv); + AQHNODE_Device_free(device); + return NULL; + } + rv=_readDeviceType(device, deviceNode); + if (rv<0) { + DBG_INFO(NULL, "here (%d)", rv); + AQHNODE_Device_free(device); + return NULL; + } + rv=_readDeviceVersion(device, deviceNode); + if (rv<0) { + DBG_INFO(NULL, "here (%d)", rv); + AQHNODE_Device_free(device); + return NULL; + } + + /* read values */ + valuesNode=GWEN_XMLNode_FindFirstTag(deviceNode, "values", NULL, NULL); + if (valuesNode) { + 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; + } + + return device; +} + + + +AQHNODE_VALUE_LIST *_readXmlValueList(GWEN_XMLNODE *valuesNode) +{ + AQHNODE_VALUE_LIST *valueList; + GWEN_XMLNODE *node; + + valueList=AQHNODE_Value_List_new(); + node=GWEN_XMLNode_FindFirstTag(valuesNode, "value", NULL, NULL); + while(node) { + AQHNODE_VALUE *value; + + value=_readXmlValue(node); + if (value) + AQHNODE_Value_List_Add(value, valueList); + else { + DBG_INFO(NULL, "Error reading element"); + AQHNODE_Value_List_free(valueList); + return NULL; + } + node=GWEN_XMLNode_FindNextTag(node, "value", NULL, NULL); + } + if (AQHNODE_Value_List_GetCount(valueList)<1) { + DBG_INFO(NULL, "No element in element"); + AQHNODE_Value_List_free(valueList); + return NULL; + } + return valueList; +} + + + +AQHNODE_VALUE *_readXmlValue(GWEN_XMLNODE *valueNode) +{ + AQHNODE_VALUE *value; + + value=AQHNODE_Value_new(); + AQHNODE_Value_SetName(value, GWEN_XMLNode_GetProperty(valueNode, "name", NULL)); + AQHNODE_Value_SetId(value, GWEN_XMLNode_GetIntProperty(valueNode, "id", 0)); + AQHNODE_Value_SetValueUnits(value, GWEN_XMLNode_GetProperty(valueNode, "units", NULL)); + AQHNODE_Value_SetValueType(value, AQH_ValueType_fromString(GWEN_XMLNode_GetProperty(valueNode, "type", NULL))); + AQHNODE_Value_SetDataType(value, AQH_ValueDataType_fromString(GWEN_XMLNode_GetProperty(valueNode, "dataType", NULL))); + AQHNODE_Value_SetModality(value, AQH_ValueModality_fromString(GWEN_XMLNode_GetProperty(valueNode, "modality", NULL))); + + return value; +} + + + +int _readManufacturer(AQHNODE_DEVICE *device, GWEN_XMLNODE *deviceNode) +{ + const char *s; + uint32_t v; + + s=GWEN_XMLNode_GetCharValue(deviceNode, "manufacturer", NULL); + if (!(s && *s)) { + DBG_ERROR(NULL, "Missing manufacturer"); + return GWEN_ERROR_BAD_DATA; + } + + if (strlen(s)>4) { + DBG_ERROR(NULL, "Bad manufacturer string (too long): \"%s\"", s); + return GWEN_ERROR_BAD_DATA; + } + + v=0; + while(*s) { + v<<=8; + v|=*s & 0xff; + s++; + } + v=((v>>24) & 0x000000ffL) | + ((v>>8) & 0x0000ff00L) | + ((v<<8) & 0x00ff0000L) | + ((v<<24) & 0xff000000L); + + AQHNODE_Device_SetManufacturer(device, v); + return 0; +} + + + +int _readDeviceType(AQHNODE_DEVICE *device, GWEN_XMLNODE *deviceNode) +{ + const char *s; + uint16_t v; + + s=GWEN_XMLNode_GetCharValue(deviceNode, "devicetype", NULL); + if (!(s && *s)) { + DBG_ERROR(NULL, "Missing device type"); + return GWEN_ERROR_BAD_DATA; + } + + if (strlen(s)>2) { + DBG_ERROR(NULL, "Bad devicetype string (too long): \"%s\"", s); + return GWEN_ERROR_BAD_DATA; + } + + v=0; + while(*s) { + v<<=8; + v|=*s & 0xff; + s++; + } + + AQHNODE_Device_SetDeviceType(device, v); + return 0; +} + + + +int _readDeviceVersion(AQHNODE_DEVICE *device, GWEN_XMLNODE *deviceNode) +{ + int v; + + v=GWEN_XMLNode_GetIntValue(deviceNode, "deviceversion", -1); + if (v<0) { + DBG_ERROR(NULL, "Missing device version"); + return GWEN_ERROR_BAD_DATA; + } + + AQHNODE_Device_SetDeviceVersion(device, v<<8); + return 0; +} + + + + diff --git a/apps/aqhome-nodes/devicesread.h b/apps/aqhome-nodes/devicesread.h new file mode 100644 index 0000000..ad34040 --- /dev/null +++ b/apps/aqhome-nodes/devicesread.h @@ -0,0 +1,25 @@ +/**************************************************************************** + * 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. + ****************************************************************************/ + +#ifndef AQHOME_NODES_DEVICESREAD_H +#define AQHOME_NODES_DEVICESREAD_H + + +#include "./aqhomed.h" +#include "aqhome-nodes/types/device.h" + + + +AQHNODE_DEVICE_LIST *AqHomeNodes_ReadDeviceFile(const char *sFilename); +AQHNODE_DEVICE_LIST *AqHomeNodes_ReadDataDeviceFiles(void); + + + +#endif + + diff --git a/apps/aqhome-nodes/init.c b/apps/aqhome-nodes/init.c index 9ca74da..a8e30ef 100644 --- a/apps/aqhome-nodes/init.c +++ b/apps/aqhome-nodes/init.c @@ -14,6 +14,8 @@ #include "./init.h" #include "./aqhomed_p.h" #include "./tty_log.h" +#include "./devicesread.h" +#include "./devicesdump.h" #include "aqhome/aqhome.h" #include "aqhome/msg/endpoint_tty.h" @@ -65,6 +67,7 @@ static void _setupBroker(AQHOMED *aqh, GWEN_DB_NODE *dbArgs); static GWEN_MSG_ENDPOINT *_acceptIpcFn(GWEN_MSG_ENDPOINT *ep, GWEN_SOCKET *sk, const GWEN_INETADDRESS *addr, void *data); static void _setupLog(AQHOMED *aqh, GWEN_DB_NODE *dbArgs); static void _setupDb(AQHOMED *aqh, GWEN_DB_NODE *dbArgs); +static int _loadDeviceList(AQHOMED *aqh); static int _readArgs(int argc, char **argv, GWEN_DB_NODE *dbArgs); static int _createPidFile(const char *pidFilename); @@ -113,6 +116,20 @@ int AqHomed_Init(AQHOMED *aqh, int argc, char **argv) aqh->nodeAddress=GWEN_DB_GetIntValue(dbArgs, "nodeAddress", 0, AQHOMED_DEFAULT_NODEADDR); + rv=_loadDeviceList(aqh); + if (rv<0) { + DBG_ERROR(NULL, "Error loading device list(%d)", rv); + return rv; + } + else { + GWEN_BUFFER *dbuf; + + dbuf=GWEN_Buffer_new(0, 256, 0, 1); + AqHomeNodes_DumpDevices(aqh->deviceDefList, dbuf); + fprintf(stdout, "%s\n", GWEN_Buffer_GetStart(dbuf)); + GWEN_Buffer_free(dbuf); + } + _setupDb(aqh, dbArgs); rv=_setupTty(aqh, dbArgs); @@ -220,9 +237,9 @@ void _setupBroker(AQHOMED *aqh, GWEN_DB_NODE *dbArgs) -GWEN_MSG_ENDPOINT *_acceptIpcFn(GWEN_MSG_ENDPOINT *ep, +GWEN_MSG_ENDPOINT *_acceptIpcFn(GWEN_UNUSED GWEN_MSG_ENDPOINT *ep, GWEN_SOCKET *sk, - const GWEN_INETADDRESS *addr, + GWEN_UNUSED const GWEN_INETADDRESS *addr, GWEN_UNUSED void *data) { /* AQHOMED *aqh; @@ -258,7 +275,7 @@ void _setupDb(AQHOMED *aqh, GWEN_DB_NODE *dbArgs) AqHomed_SetDbFile(aqh, s); dbNodeDb=GWEN_DB_Group_new("dbNodes"); - rv=GWEN_DB_ReadFile(dbNodeDb, s, GWEN_DB_FLAGS_DEFAULT); + rv=GWEN_DB_ReadFile(dbNodeDb, s, GWEN_DB_FLAGS_DEFAULT|GWEN_PATH_FLAGS_CREATE_GROUP); if (rv==0) { AQH_NodeDb_fromDb(aqh->nodeDb, dbNodeDb); } @@ -268,6 +285,21 @@ void _setupDb(AQHOMED *aqh, GWEN_DB_NODE *dbArgs) +int _loadDeviceList(AQHOMED *aqh) +{ + AQHNODE_DEVICE_LIST *deviceList; + + deviceList=AqHomeNodes_ReadDataDeviceFiles(); + if (deviceList==NULL) { + DBG_ERROR(NULL, "Error reading device list"); + return GWEN_ERROR_GENERIC; + } + aqh->deviceDefList=deviceList; + return 0; +} + + + int _createPidFile(const char *pidFilename) { FILE *f; diff --git a/apps/aqhome-nodes/loop_broker.c b/apps/aqhome-nodes/loop_broker.c index c01ac7c..f777b3b 100644 --- a/apps/aqhome-nodes/loop_broker.c +++ b/apps/aqhome-nodes/loop_broker.c @@ -13,6 +13,7 @@ #include "./loop_broker.h" #include "./aqhomed_p.h" +#include "./b_setdata.h" #include "./tty_log.h" #include "./db.h" @@ -22,6 +23,7 @@ #include "aqhome/msg/msg_ping.h" #include "aqhome/ipc/endpoint_ipc.h" #include "aqhome/ipc/msg_ipc_result.h" +#include "aqhome/ipc/data/ipc_data.h" #include #include @@ -43,6 +45,9 @@ */ +static void _handleIpcMsg(AQHOMED *aqh, GWEN_MSG_ENDPOINT *ep, GWEN_MSG *msg); + + /* ------------------------------------------------------------------------------------------------ * implementations @@ -62,7 +67,7 @@ void AqHomed_ReadAndHandleBrokerMessages(AQHOMED *aqh) code=GWEN_IpcMsg_GetCode(msg); DBG_DEBUG(AQH_LOGDOMAIN, "Received IPC packet %d (%x)", (int) code, code); - + _handleIpcMsg(aqh, epTcp, msg); GWEN_Msg_free(msg); } } @@ -70,6 +75,24 @@ void AqHomed_ReadAndHandleBrokerMessages(AQHOMED *aqh) +void _handleIpcMsg(AQHOMED *aqh, GWEN_MSG_ENDPOINT *ep, GWEN_MSG *msg) +{ + uint16_t code; + + /* exec IPC message */ + code=GWEN_IpcMsg_GetCode(msg); + DBG_DEBUG(AQH_LOGDOMAIN, "Received IPC packet"); + switch(code) { +// case AQH_MSGTYPE_IPC_DATA_SETDATA: AqHomeNodes_HandleBrokerSetData(aqh, ep, msg); break; + default: break; + } +} + + + + + + diff --git a/apps/aqhome-nodes/loop_broker.h b/apps/aqhome-nodes/loop_broker.h index 2bbded7..7de6eb4 100644 --- a/apps/aqhome-nodes/loop_broker.h +++ b/apps/aqhome-nodes/loop_broker.h @@ -13,7 +13,9 @@ #include "./aqhomed.h" - +/** + * Handle messageexchange with the broker (aqhome-data). + */ void AqHomed_ReadAndHandleBrokerMessages(AQHOMED *aqh); diff --git a/apps/aqhome-nodes/loop_ipc.c b/apps/aqhome-nodes/loop_ipc.c index a20a889..5278953 100644 --- a/apps/aqhome-nodes/loop_ipc.c +++ b/apps/aqhome-nodes/loop_ipc.c @@ -19,6 +19,7 @@ #include "aqhome/msg/endpoint_tty.h" #include "aqhome/msg/msg_node.h" #include "aqhome/msg/msg_value2.h" +#include "aqhome/msg/msg_value3.h" #include "aqhome/msg/msg_ping.h" #include "aqhome/ipc/endpoint_ipc.h" #include "aqhome/ipc/nodes/ipc_nodes.h" @@ -27,6 +28,8 @@ #include "aqhome/ipc/nodes/msg_ipc_ping.h" #include "aqhome/ipc/nodes/msg_ipc_setaccmsggrps.h" #include "aqhome/ipc/nodes/msg_ipc_getdevices_rsp.h" +#include "aqhome/ipc/data/ipc_data.h" +#include "aqhome/ipc/data/msg_data_set.h" #include "aqhome/ipc/msg_ipc_result.h" #include @@ -34,6 +37,8 @@ #include #include +#include + /* ------------------------------------------------------------------------------------------------ @@ -52,11 +57,14 @@ */ static void _handleIpcEndpoint(AQHOMED *aqh, GWEN_MSG_ENDPOINT *ep); -static void _handleIpcMsg(AQHOMED *aqh, GWEN_MSG_ENDPOINT *ep, const GWEN_MSG *msg); +static void _handleIpcMsg(AQHOMED *aqh, GWEN_MSG_ENDPOINT *ep, GWEN_MSG *msg); void _handleIpcMsgPing(AQHOMED *aqh, GWEN_MSG_ENDPOINT *ep, const GWEN_MSG *msg); void _handleIpcMsgSetAccMsgGrps(AQHOMED *aqh, GWEN_MSG_ENDPOINT *ep, const GWEN_MSG *msg); void _handleIpcMsgForward(AQHOMED *aqh, GWEN_MSG_ENDPOINT *ep, const GWEN_MSG *msg); void _handleIpcMsgGetDevicesReq(AQHOMED *aqh, GWEN_MSG_ENDPOINT *ep, const GWEN_MSG *msg); +void _handleIpcMsgSetData(AQHOMED *aqh, GWEN_MSG_ENDPOINT *ep, GWEN_MSG *msg); +static int _readDataFromString(const char *s, uint16_t *pDataVal, uint16_t *pValDenom); +static AQH_NODE_INFO *_getNodeInfoFromValue(AQHOMED *aqh, const AQH_VALUE *value); @@ -93,18 +101,19 @@ void _handleIpcEndpoint(AQHOMED *aqh, GWEN_MSG_ENDPOINT *ep) -void _handleIpcMsg(AQHOMED *aqh, GWEN_MSG_ENDPOINT *ep, const GWEN_MSG *msg) +void _handleIpcMsg(AQHOMED *aqh, GWEN_MSG_ENDPOINT *ep, GWEN_MSG *msg) { uint16_t code; /* exec IPC message */ code=GWEN_IpcMsg_GetCode(msg); - DBG_DEBUG(AQH_LOGDOMAIN, "Received IPC packet"); + DBG_INFO(AQH_LOGDOMAIN, "Received IPC packet (%d, %04x)", code, code); switch(code) { case AQH_MSGTYPE_IPC_NODES_PING: _handleIpcMsgPing(aqh, ep, msg); break; case AQH_MSGTYPE_IPC_NODES_SETACCMSGGRPS: _handleIpcMsgSetAccMsgGrps(aqh, ep, msg); break; case AQH_MSGTYPE_IPC_NODES_FORWARD: _handleIpcMsgForward(aqh, ep, msg); break; case AQH_MSGTYPE_IPC_NODES_GETDEVICES_REQ: _handleIpcMsgGetDevicesReq(aqh, ep, msg); break; + case AQH_MSGTYPE_IPC_DATA_SETDATA: _handleIpcMsgSetData(aqh, ep, msg); break; default: break; } } @@ -128,7 +137,7 @@ void _handleIpcMsgSetAccMsgGrps(AQHOMED *aqh, GWEN_MSG_ENDPOINT *ep, const GWEN_ { uint32_t groups; - DBG_DEBUG(AQH_LOGDOMAIN, "Received IPC SET_ACCEPTED_MSG_GROUPS message"); + DBG_INFO(AQH_LOGDOMAIN, "Received IPC SET_ACCEPTED_MSG_GROUPS message"); groups=AQH_SetAcceptedMsgGroupsIpcMsg_GetMsgGroups(msg); AQH_IpcEndpoint_SetAcceptedMsgGroups(ep, groups); // TODO: send response? @@ -154,7 +163,7 @@ void _handleIpcMsgGetDevicesReq(AQHOMED *aqh, GWEN_MSG_ENDPOINT *ep, const GWEN_ { AQH_NODE_INFO_LIST *nodeInfoList; - DBG_DEBUG(AQH_LOGDOMAIN, "Received IPC GetDevicesRequest message"); + DBG_INFO(AQH_LOGDOMAIN, "Received IPC GetDevicesRequest message"); nodeInfoList=AQH_NodeDb_GetAllNodeInfos(aqh->nodeDb); if (nodeInfoList && AQH_NodeInfo_List_GetCount(nodeInfoList)) { const AQH_NODE_INFO *ni; @@ -166,7 +175,9 @@ void _handleIpcMsgGetDevicesReq(AQHOMED *aqh, GWEN_MSG_ENDPOINT *ep, const GWEN_ niNext=AQH_NodeInfo_List_Next(ni); DBG_INFO(AQH_LOGDOMAIN, "Sending response for node %02x (%08x)", AQH_NodeInfo_GetBusAddress(ni), AQH_NodeInfo_GetUid(ni)); - msgOut=AQH_GetDevicesResponseIpcMsg_new(AQH_MSGTYPE_IPC_NODES_GETDEVICES_RSP, niNext?0:AQH_MSGIPC_GETDEVICES_RSP_FLAGS_LAST, ni); + msgOut=AQH_GetDevicesResponseIpcMsg_new(AQH_MSGTYPE_IPC_NODES_GETDEVICES_RSP, + GWEN_MsgEndpoint_GetNextMessageId(ep), GWEN_IpcMsg_GetMsgId(msg), + niNext?0:AQH_MSGIPC_GETDEVICES_RSP_FLAGS_LAST, ni); GWEN_MsgEndpoint_AddSendMessage(ep, msgOut); ni=niNext; } @@ -175,13 +186,112 @@ void _handleIpcMsgGetDevicesReq(AQHOMED *aqh, GWEN_MSG_ENDPOINT *ep, const GWEN_ GWEN_MSG *msgOut; DBG_INFO(AQH_LOGDOMAIN, "No nodes"); - msgOut=AQH_ResultIpcMsg_new(AQH_MSGTYPE_IPC_NODES_RESULT, AQH_MSG_IPC_ERROR_NODATA); + msgOut=AQH_ResultIpcMsg_new(AQH_MSGTYPE_IPC_NODES_RESULT, + GWEN_MsgEndpoint_GetNextMessageId(ep), GWEN_IpcMsg_GetMsgId(msg), + AQH_MSG_IPC_ERROR_NODATA); GWEN_MsgEndpoint_AddSendMessage(ep, msgOut); } } +void _handleIpcMsgSetData(AQHOMED *aqh, GWEN_MSG_ENDPOINT *ep, GWEN_MSG *msg) +{ + if (aqh->ttyEndpoint && GWEN_MsgEndpoint_GetState(aqh->ttyEndpoint)==GWEN_MSG_ENDPOINT_STATE_CONNECTED) { + AQH_VALUE *value; + + DBG_DEBUG(AQH_LOGDOMAIN, "Received IPC SetDataRequest message"); + AQH_SetDataIpcMsg_Parse(msg, 0); + value=AQH_SetDataIpcMsg_ReadValue(msg); + if (value) { + char *data; + + data=AQH_SetDataIpcMsg_ReadData(msg); + if (data) { + uint16_t dataVal=0; + uint16_t dataDenom=0; + + if (_readDataFromString(data, &dataVal, &dataDenom)==0) { + AQH_NODE_INFO *nodeInfo; + + nodeInfo=_getNodeInfoFromValue(aqh, value); + if (nodeInfo) { + int valueId=0; + const char *s; + + s=AQH_Value_GetName(value); + if (s && *s && 1==sscanf(s, "%d", &valueId)) { + GWEN_MSG *msgOut; + int destAddr; + + destAddr=AQH_NodeInfo_GetBusAddress(nodeInfo); + msgOut=AQH_Value3Msg_new(aqh->nodeAddress, destAddr, AQH_MSG_TYPE_VALUE_SET, 0 /* msgid*/, valueId, dataVal, dataDenom); + GWEN_MsgEndpoint_AddSendMessage(aqh->ttyEndpoint, msgOut); + } + else { + DBG_ERROR(AQH_LOGDOMAIN, "Invalid value id \"%s\"", s); + } + } + else { + DBG_ERROR(AQH_LOGDOMAIN, "No matching node found"); + } + } + free(data); + } + AQH_Value_free(value); + } + else { + DBG_ERROR(AQH_LOGDOMAIN, "Could not read value from message"); + } + } +} + + + +int _readDataFromString(const char *s, uint16_t *pDataVal, uint16_t *pDataDenom) +{ + if (s && *s) { + if (*s=='&') { + unsigned long int v=0; + + s++; + if (1==sscanf(s, "%lx", &v)) { + *pDataVal=(v>>16) & 0xffff; + *pDataDenom=v & 0xffff; + return 0; + } + else { + DBG_ERROR(AQH_LOGDOMAIN, "Bad hex value \"%s\"", s); + } + } + } + + return GWEN_ERROR_GENERIC; +} + + + +AQH_NODE_INFO *_getNodeInfoFromValue(AQHOMED *aqh, const AQH_VALUE *value) +{ + const char *s; + unsigned long int uid; + + s=AQH_Value_GetDeviceName(value); + if (s && *s && 1==sscanf(s, "%lx", &uid)) { + AQH_NODE_INFO *ni; + + ni=AQH_NodeDb_GetNodeInfoByUid(aqh->nodeDb, uid); + if (ni==NULL) { + DBG_INFO(AQH_LOGDOMAIN, "Node \"%08lx\" not found", uid); + return NULL; + } + return ni; + } + return NULL; +} + + + diff --git a/apps/aqhome-nodes/loop_tty_broker.c b/apps/aqhome-nodes/loop_tty_broker.c index 08630ce..30923aa 100644 --- a/apps/aqhome-nodes/loop_tty_broker.c +++ b/apps/aqhome-nodes/loop_tty_broker.c @@ -48,13 +48,11 @@ * ------------------------------------------------------------------------------------------------ */ -static void _processValue2Message(AQHOMED *aqh, const GWEN_MSG *nodeMsg); static void _processValue3Message(AQHOMED *aqh, const GWEN_MSG *nodeMsg); static void _processSendStatsMessage(AQHOMED *aqh, const GWEN_MSG *nodeMsg); static void _processRecvStatsMessage(AQHOMED *aqh, const GWEN_MSG *nodeMsg); -static void _publishInt(AQHOMED *aqh, uint32_t uid, int valueId, const char *valueUnits, const char *valuePath, int v); -static void _publishDouble(AQHOMED *aqh, uint32_t uid, int valueId, const char *valueUnits, const char *valuePath, double v); -static void _setValueNameForDriver(AQH_VALUE *value, int valueId, const char *valuePath); +static void _publishInt(AQHOMED *aqh, uint32_t uid, const char *vPath, int vModality, const char *vUnits, int v); +static void _publishDouble(AQHOMED *aqh, uint32_t uid, const char *vPath, int vType, const char *vUnits, double v); static void _setDeviceName(AQH_VALUE *value, uint32_t uid); @@ -69,9 +67,6 @@ void AqHomed_ForwardTtyMsgToBroker(AQHOMED *aqh, const GWEN_MSG *nodeMsg) if (GWEN_MsgEndpoint_GetState(aqh->brokerEndpoint)==GWEN_MSG_ENDPOINT_STATE_CONNECTED) { DBG_DEBUG(AQH_LOGDOMAIN, "Processing output message"); switch(AQH_NodeMsg_GetMsgType(nodeMsg)) { - case AQH_MSG_TYPE_VALUE2: - _processValue2Message(aqh, nodeMsg); - break; case AQH_MSG_TYPE_VALUE_REPORT: _processValue3Message(aqh, nodeMsg); break; @@ -89,26 +84,39 @@ void AqHomed_ForwardTtyMsgToBroker(AQHOMED *aqh, const GWEN_MSG *nodeMsg) -void _processValue2Message(AQHOMED *aqh, const GWEN_MSG *nodeMsg) -{ - _publishDouble(aqh, - AQH_Value2Msg_GetUid(nodeMsg), - AQH_Value2Msg_GetValueId(nodeMsg), - AQH_Value2Msg_GetValueTypeUnits(nodeMsg), - AQH_Value2Msg_GetValueTypeName(nodeMsg), - AQH_Value2Msg_GetValue(nodeMsg)); -} - - - void _processValue3Message(AQHOMED *aqh, const GWEN_MSG *nodeMsg) { - _publishDouble(aqh, - AQH_Value3Msg_GetUid(nodeMsg), - AQH_Value3Msg_GetValueId(nodeMsg), - AQH_Value3Msg_GetValueTypeUnits(nodeMsg), - AQH_Value3Msg_GetValueTypeName(nodeMsg), - AQH_Value3Msg_GetValue(nodeMsg)); + uint32_t uid; + uint8_t valueId; + AQH_NODE_INFO *ni; + double v; + + uid=AQH_Value3Msg_GetUid(nodeMsg); + valueId=AQH_Value3Msg_GetValueId(nodeMsg); + v=AQH_Value3Msg_GetValue(nodeMsg); + ni=AQH_NodeDb_GetNodeInfoByUid(aqh->nodeDb, uid); + if (ni) { + const char *devName; + + devName=AQH_NodeInfo_GetDeviceId(ni); + if (devName) { + const AQHNODE_DEVICE *devInfo; + + devInfo=AqHomed_GetDeviceDefByName(aqh, devName); + if (devInfo) { + const AQHNODE_VALUE *value; + + value=AQHNODE_Value_List_GetById(AQHNODE_Device_GetValueList(devInfo), valueId); + if (value) { + const char *vname; + + vname=AQHNODE_Value_GetName(value); + if (vname && *vname) + _publishDouble(aqh, uid, vname, AQHNODE_Value_GetModality(value), AQHNODE_Value_GetValueUnits(value), v); + } + } + } + } } @@ -119,12 +127,14 @@ void _processSendStatsMessage(AQHOMED *aqh, const GWEN_MSG *nodeMsg) packetsOutInt=AQH_SendStatsMsg_GetPacketsOut(nodeMsg); if (packetsOutInt) { + uint32_t uid; double packetsOut; double collisions; double busy; double collisionsPercentage=0.0; double busyPercentage=0.0; + uid=AQH_SendStatsMsg_GetUid(nodeMsg); packetsOut=/*(double)*/ packetsOutInt; collisions=/*(double)*/ AQH_SendStatsMsg_GetCollisions(nodeMsg); busy=/*(double)*/ AQH_SendStatsMsg_GetBusyErrors(nodeMsg); @@ -132,10 +142,10 @@ void _processSendStatsMessage(AQHOMED *aqh, const GWEN_MSG *nodeMsg) collisionsPercentage=collisions*100.0/packetsOut; busyPercentage=busy*100.0/packetsOut; - _publishInt(aqh, AQH_SendStatsMsg_GetUid(nodeMsg), 0, NULL, "net/packetsOut", packetsOutInt); - _publishInt(aqh, AQH_SendStatsMsg_GetUid(nodeMsg), 0, NULL, "net/collisions", (int) AQH_SendStatsMsg_GetCollisions(nodeMsg)); - _publishDouble(aqh, AQH_SendStatsMsg_GetUid(nodeMsg), 0, "%", "net/collisionsPercent", collisionsPercentage); - _publishDouble(aqh, AQH_SendStatsMsg_GetUid(nodeMsg), 0, "%", "net/busyPercent", busyPercentage); + _publishInt( aqh, uid, "net/packetsOut", 0, NULL, packetsOutInt); + _publishInt( aqh, uid, "net/collisions", 0, NULL, (int) AQH_SendStatsMsg_GetCollisions(nodeMsg)); + _publishDouble(aqh, uid, "net/collisionsPercent", 0, "%", collisionsPercentage); + _publishDouble(aqh, uid, "net/busyPercent", 0, "%", busyPercentage); } } @@ -147,12 +157,14 @@ void _processRecvStatsMessage(AQHOMED *aqh, const GWEN_MSG *nodeMsg) packetsInInt=AQH_RecvStatsMsg_GetPacketsIn(nodeMsg); if (packetsInInt) { + uint32_t uid; double packetsIn; double crcErrors; double ioErrors; double crcErrorsPercentage=0.0; double ioErrorsPercentage=0.0; + uid=AQH_SendStatsMsg_GetUid(nodeMsg); packetsIn=/*(double)*/ packetsInInt; crcErrors=/*(double)*/AQH_RecvStatsMsg_GetCrcErrors(nodeMsg); ioErrors=/*(double)*/AQH_RecvStatsMsg_GetIoErrors(nodeMsg); @@ -160,24 +172,24 @@ void _processRecvStatsMessage(AQHOMED *aqh, const GWEN_MSG *nodeMsg) crcErrorsPercentage=crcErrors*100.0/packetsIn; ioErrorsPercentage=ioErrors*100.0/packetsIn; - _publishInt(aqh, AQH_RecvStatsMsg_GetUid(nodeMsg), 0, NULL, "net/packetsIn", packetsInInt); - _publishInt(aqh, AQH_RecvStatsMsg_GetUid(nodeMsg), 0, NULL, "net/crcerrors", (int) AQH_RecvStatsMsg_GetCrcErrors(nodeMsg)); - _publishInt(aqh, AQH_RecvStatsMsg_GetUid(nodeMsg), 0, NULL, "net/ioerrors", (int) AQH_RecvStatsMsg_GetIoErrors(nodeMsg)); - _publishDouble(aqh, AQH_RecvStatsMsg_GetUid(nodeMsg), 0, "%", "net/crcerrorsPercent", crcErrorsPercentage); - _publishDouble(aqh, AQH_RecvStatsMsg_GetUid(nodeMsg), 0, "%", "net/ioerrorsPercent", ioErrorsPercentage); + _publishInt( aqh, uid, "net/packetsIn", 0, NULL, packetsInInt); + _publishInt( aqh, uid, "net/crcerrors", 0, NULL, (int) AQH_RecvStatsMsg_GetCrcErrors(nodeMsg)); + _publishInt( aqh, uid, "net/ioerrors", 0, NULL, (int) AQH_RecvStatsMsg_GetIoErrors(nodeMsg)); + _publishDouble(aqh, uid, "net/crcerrorsPercent", 0, "%", crcErrorsPercentage); + _publishDouble(aqh, uid, "net/ioerrorsPercent", 0, "%", ioErrorsPercentage); } } -void _publishInt(AQHOMED *aqh, uint32_t uid, int valueId, const char *valueUnits, const char *valuePath, int v) +void _publishInt(AQHOMED *aqh, uint32_t uid, const char *vPath, int vModality, const char *vUnits, int v) { - _publishDouble(aqh, uid, valueId, valueUnits, valuePath, /*(double)*/ v); + _publishDouble(aqh, uid, vPath, vModality, vUnits, /*(double)*/ v); } -void _publishDouble(AQHOMED *aqh, uint32_t uid, int valueId, const char *valueUnits, const char *valuePath, double v) +void _publishDouble(AQHOMED *aqh, uint32_t uid, const char *vPath, int vModality, const char *vUnits, double v) { GWEN_MSG *pubMsg; union {double f; uint64_t i;} u; @@ -189,12 +201,14 @@ void _publishDouble(AQHOMED *aqh, uint32_t uid, int valueId, const char *valueUn arrayToSend[1]=u.i; value=AQH_Value_new(); - _setValueNameForDriver(value, valueId, valuePath); - AQH_Value_SetValueUnits(value, valueUnits); - AQH_Value_SetValueType(value, 0); _setDeviceName(value, uid); + AQH_Value_SetName(value, vPath); + AQH_Value_SetValueUnits(value, vUnits); + AQH_Value_SetValueType(value, vModality); - pubMsg=AQH_MultiDataDataIpcMsg_new(AQH_MSGTYPE_IPC_DATA_UPDATEDATA, value, arrayToSend, 1); + pubMsg=AQH_MultiDataDataIpcMsg_new(AQH_MSGTYPE_IPC_DATA_UPDATEDATA, + GWEN_MsgEndpoint_GetNextMessageId(aqh->brokerEndpoint), 0, + value, arrayToSend, 1); if (pubMsg) { DBG_INFO(AQH_LOGDOMAIN, "BROKER PUBLISH %s: %f", AQH_Value_GetName(value), v); GWEN_MsgEndpoint_AddSendMessage(aqh->brokerEndpoint, pubMsg); @@ -204,21 +218,6 @@ void _publishDouble(AQHOMED *aqh, uint32_t uid, int valueId, const char *valueUn -void _setValueNameForDriver(AQH_VALUE *value, int valueId, const char *valuePath) -{ - GWEN_BUFFER *buf; - - buf=GWEN_Buffer_new(0, 64, 0, 1); - if (valueId>0) - GWEN_Buffer_AppendArgs(buf, "%d/%s", valueId, valuePath); - else - GWEN_Buffer_AppendArgs(buf, "%s", valuePath); - AQH_Value_SetName(value, GWEN_Buffer_GetStart(buf)); - GWEN_Buffer_free(buf); -} - - - void _setDeviceName(AQH_VALUE *value, uint32_t uid) { GWEN_BUFFER *buf; diff --git a/apps/aqhome-nodes/loop_tty_ipc.c b/apps/aqhome-nodes/loop_tty_ipc.c index 27afb01..081d156 100644 --- a/apps/aqhome-nodes/loop_tty_ipc.c +++ b/apps/aqhome-nodes/loop_tty_ipc.c @@ -93,6 +93,7 @@ void _forwardValue2MsgToIpc(GWEN_MSG_ENDPOINT *ep, const GWEN_MSG *nodeMsg) GWEN_MSG *ipcMsg; ipcMsg=AQH_ValueIpcMsg_new(AQH_MSGTYPE_IPC_NODES_VALUE, + GWEN_MsgEndpoint_GetNextMessageId(ep), 0, AQH_Value2Msg_GetUid(nodeMsg), AQH_Value2Msg_GetValueId(nodeMsg), AQH_Value2Msg_GetValueType(nodeMsg), @@ -107,7 +108,9 @@ void _forwardAnyMsgToIpc(GWEN_MSG_ENDPOINT *ep, const GWEN_MSG *nodeMsg) { GWEN_MSG *ipcMsg; - ipcMsg=AQH_ForwardIpcMsg_new(AQH_MSGTYPE_IPC_NODES_FORWARD, GWEN_Msg_GetConstBuffer(nodeMsg), GWEN_Msg_GetBytesInBuffer(nodeMsg)); + ipcMsg=AQH_ForwardIpcMsg_new(AQH_MSGTYPE_IPC_NODES_FORWARD, + GWEN_MsgEndpoint_GetNextMessageId(ep), 0, + GWEN_Msg_GetConstBuffer(nodeMsg), GWEN_Msg_GetBytesInBuffer(nodeMsg)); GWEN_MsgEndpoint_AddSendMessage(ep, ipcMsg); } diff --git a/apps/aqhome-nodes/types/0BUILD b/apps/aqhome-nodes/types/0BUILD new file mode 100644 index 0000000..fcbe290 --- /dev/null +++ b/apps/aqhome-nodes/types/0BUILD @@ -0,0 +1,73 @@ + + + + + + + + $(gwenhywfar_cflags) + -I$(topsrcdir) + -I$(topbuilddir) + -I$(topsrcdir)/apps + -I$(topbuilddir)/apps + -I$(builddir) + -I$(srcdir) + + + + --include=$(builddir) + --include=$(srcdir) + + + $(visibility_cflags) + + + + + + device.t2d + value.t2d + + + + device.c + value.c + + + + + + + device.h + device_p.h + value.h + value_p.h + + + + + + + $(local/typefiles) + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/aqhome-nodes/types/device.t2d b/apps/aqhome-nodes/types/device.t2d new file mode 100644 index 0000000..bde80e5 --- /dev/null +++ b/apps/aqhome-nodes/types/device.t2d @@ -0,0 +1,87 @@ + + + + + + This object and its objects are used to store registered devices and definitions for possible new devices. + + + AQHNODE_DEVICE + AQHNODE_Device + device + + + with_list1 + with_list2 + + + +
aqhome/api.h
+
aqhome-nodes/types/value.h
+
+ + + + + + +
+ + + + + + + + + + NULL + NULL + public + own with_getbymember + + + + NULL + NULL + public + own + + + + 0 + 0 + public + + + + + 0 + 0 + public + + + + + 0 + 0 + public + + + + + + NULL + NULL + public + own + none + none + + + + +
+ +
+ diff --git a/apps/aqhome-nodes/types/value.t2d b/apps/aqhome-nodes/types/value.t2d new file mode 100644 index 0000000..c26ed60 --- /dev/null +++ b/apps/aqhome-nodes/types/value.t2d @@ -0,0 +1,87 @@ + + + + + + + + AQHNODE_VALUE + AQHNODE_Value + value + + + with_xml + with_db + with_list1 + with_list2 + + + +
aqhome/api.h
+
+ + + + + + +
+ + + + + + 0 + 0 + public + with_getbymember + + + + 0 + 0 + public + own with_getbymember + + + + 0 + 0 + public + own + + + + 0 + 0 + public + + + + + 0 + 0 + public + + + + + 0 + 0 + public + + + + + 0 + 0 + public + own + + + + +
+ +
+ diff --git a/apps/aqhome-react/units/u_valueset.c b/apps/aqhome-react/units/u_valueset.c index ec2ad17..624f60d 100644 --- a/apps/aqhome-react/units/u_valueset.c +++ b/apps/aqhome-react/units/u_valueset.c @@ -37,8 +37,10 @@ */ static void _cbInputData(AQHREACT_UNIT *unit, AQHREACT_PORT *port, const AQHREACT_DATAOBJECT *dataObject); -static GWEN_MSG *_mkSetDataMsgString(const char *sValueName, const AQHREACT_DATAOBJECT *dataObject); -static GWEN_MSG *_mkSetDataMsgDouble(const char *sValueName, const AQHREACT_DATAOBJECT *dataObject); +static GWEN_MSG *_mkSetDataMsgString(GWEN_MSG_ENDPOINT *brokerEndpoint, + const char *sValueName, const AQHREACT_DATAOBJECT *dataObject); +static GWEN_MSG *_mkSetDataMsgDouble(GWEN_MSG_ENDPOINT *brokerEndpoint, + const char *sValueName, const AQHREACT_DATAOBJECT *dataObject); @@ -89,10 +91,10 @@ void _cbInputData(AQHREACT_UNIT *unit, AQHREACT_PORT *port, const AQHREACT_DATAO switch(AQHREACT_DataObject_GetDataType(dataObject)) { case AQHREACT_DATAOBJECTTYPE_DOUBLE: - msgOut=_mkSetDataMsgDouble(sValueName, dataObject); + msgOut=_mkSetDataMsgDouble(brokerEndpoint, sValueName, dataObject); break; case AQHREACT_DATAOBJECTTYPE_STRING: - msgOut=_mkSetDataMsgString(sValueName, dataObject); + msgOut=_mkSetDataMsgString(brokerEndpoint, sValueName, dataObject); break; default: DBG_INFO(NULL, "Unhandled data type (%d)", AQHREACT_DataObject_GetDataType(dataObject)); @@ -120,7 +122,7 @@ void _cbInputData(AQHREACT_UNIT *unit, AQHREACT_PORT *port, const AQHREACT_DATAO } -GWEN_MSG *_mkSetDataMsgString(const char *sValueName, const AQHREACT_DATAOBJECT *dataObject) +GWEN_MSG *_mkSetDataMsgString(GWEN_MSG_ENDPOINT *brokerEndpoint, const char *sValueName, const AQHREACT_DATAOBJECT *dataObject) { GWEN_MSG *msgOut; AQH_VALUE *v; @@ -128,14 +130,16 @@ GWEN_MSG *_mkSetDataMsgString(const char *sValueName, const AQHREACT_DATAOBJECT v=AQH_Value_new(); AQH_Value_SetNameForSystem(v, sValueName); - msgOut=AQH_SetDataIpcMsg_new(AQH_MSGTYPE_IPC_DATA_SETDATA, v, AQHREACT_DataObject_GetStringData(dataObject)); + msgOut=AQH_SetDataIpcMsg_new(AQH_MSGTYPE_IPC_DATA_SETDATA, + GWEN_MsgEndpoint_GetNextMessageId(brokerEndpoint), 0, + v, AQHREACT_DataObject_GetStringData(dataObject)); AQH_Value_free(v); return msgOut; } -GWEN_MSG *_mkSetDataMsgDouble(const char *sValueName, const AQHREACT_DATAOBJECT *dataObject) +GWEN_MSG *_mkSetDataMsgDouble(GWEN_MSG_ENDPOINT *brokerEndpoint, const char *sValueName, const AQHREACT_DATAOBJECT *dataObject) { GWEN_MSG *msgOut; AQH_VALUE *v; @@ -155,7 +159,9 @@ GWEN_MSG *_mkSetDataMsgDouble(const char *sValueName, const AQHREACT_DATAOBJECT return NULL; } - msgOut=AQH_SetDataIpcMsg_new(AQH_MSGTYPE_IPC_DATA_SETDATA, v, GWEN_Buffer_GetStart(buf)); + msgOut=AQH_SetDataIpcMsg_new(AQH_MSGTYPE_IPC_DATA_SETDATA, + GWEN_MsgEndpoint_GetNextMessageId(brokerEndpoint), 0, + v, GWEN_Buffer_GetStart(buf)); GWEN_Buffer_free(buf); AQH_Value_free(v); return msgOut; diff --git a/apps/aqhome-tool/data/adddata.c b/apps/aqhome-tool/data/adddata.c index fc35742..e46bd02 100644 --- a/apps/aqhome-tool/data/adddata.c +++ b/apps/aqhome-tool/data/adddata.c @@ -319,7 +319,9 @@ void _sendCommand(GWEN_MSG_ENDPOINT *epTcp, const char *valueName, const char *v AQH_Value_SetValueUnits(value, valueUnits); AQH_Value_SetDeviceName(value, deviceName); - msgOut=AQH_MultiDataDataIpcMsg_new(AQH_MSGTYPE_IPC_DATA_UPDATEDATA, value, arrayToSend, 1); + msgOut=AQH_MultiDataDataIpcMsg_new(AQH_MSGTYPE_IPC_DATA_UPDATEDATA, + GWEN_MsgEndpoint_GetNextMessageId(epTcp), 0, + value, arrayToSend, 1); AQH_Value_free(value); GWEN_MsgEndpoint_AddSendMessage(epTcp, msgOut); } diff --git a/apps/aqhome-tool/data/addjsondata.c b/apps/aqhome-tool/data/addjsondata.c index a41492b..c3ad390 100644 --- a/apps/aqhome-tool/data/addjsondata.c +++ b/apps/aqhome-tool/data/addjsondata.c @@ -388,7 +388,9 @@ void _sendCommand(GWEN_MSG_ENDPOINT *epTcp, const char *valueName, const char *v AQH_Value_SetValueUnits(value, valueUnits); AQH_Value_SetDeviceName(value, deviceName); - msgOut=AQH_MultiDataDataIpcMsg_new(AQH_MSGTYPE_IPC_DATA_UPDATEDATA, value, arrayToSend, 1); + msgOut=AQH_MultiDataDataIpcMsg_new(AQH_MSGTYPE_IPC_DATA_UPDATEDATA, + GWEN_MsgEndpoint_GetNextMessageId(epTcp), 0, + value, arrayToSend, 1); AQH_Value_free(value); GWEN_MsgEndpoint_AddSendMessage(epTcp, msgOut); } diff --git a/apps/aqhome-tool/data/getdatapoints.c b/apps/aqhome-tool/data/getdatapoints.c index 13ee8e2..a78e92b 100644 --- a/apps/aqhome-tool/data/getdatapoints.c +++ b/apps/aqhome-tool/data/getdatapoints.c @@ -258,7 +258,9 @@ int _doGetDataPoints(GWEN_DB_NODE *dbArgs) } /*fprintf(stdout, "Sending GetDataPoints request\n");*/ - msgOut=AQH_GetDataDataIpcMsg_new(AQH_MSGTYPE_IPC_DATA_GETDATA_REQ, valueName, tsBegin, tsEnd, num); + msgOut=AQH_GetDataDataIpcMsg_new(AQH_MSGTYPE_IPC_DATA_GETDATA_REQ, + GWEN_MsgEndpoint_GetNextMessageId(epTcp), 0, + valueName, tsBegin, tsEnd, num); GWEN_MsgEndpoint_AddSendMessage(epTcp, msgOut); rv=_awaitAndCalcAndPrintResponse(epTcp, timeoutInSeconds, printMean?1:0, printDiff?1:0); diff --git a/apps/aqhome-tool/data/getdevices.c b/apps/aqhome-tool/data/getdevices.c index dcb3810..a95da6c 100644 --- a/apps/aqhome-tool/data/getdevices.c +++ b/apps/aqhome-tool/data/getdevices.c @@ -238,7 +238,9 @@ void _sendCommand(GWEN_MSG_ENDPOINT *epTcp) { GWEN_MSG *msgOut; - msgOut=GWEN_IpcMsg_new(AQH_IPC_PROTOCOL_DATA_ID, AQH_IPC_PROTOCOL_DATA_VERSION, AQH_MSGTYPE_IPC_DATA_GETDEVICES_REQ, 0, NULL); + msgOut=GWEN_IpcMsg_new(AQH_IPC_PROTOCOL_DATA_ID, AQH_IPC_PROTOCOL_DATA_VERSION, AQH_MSGTYPE_IPC_DATA_GETDEVICES_REQ, + GWEN_MsgEndpoint_GetNextMessageId(epTcp), 0, + 0, NULL); GWEN_MsgEndpoint_AddSendMessage(epTcp, msgOut); } diff --git a/apps/aqhome-tool/data/getlastdatapoint.c b/apps/aqhome-tool/data/getlastdatapoint.c index 741d167..286c880 100644 --- a/apps/aqhome-tool/data/getlastdatapoint.c +++ b/apps/aqhome-tool/data/getlastdatapoint.c @@ -211,7 +211,9 @@ void _sendCommand(GWEN_MSG_ENDPOINT *epTcp, const char *valueName) { GWEN_MSG *msgOut; - msgOut=AQH_GetDataDataIpcMsg_new(AQH_MSGTYPE_IPC_DATA_GETLASTDATA_REQ, valueName, 0, 0, 1); + msgOut=AQH_GetDataDataIpcMsg_new(AQH_MSGTYPE_IPC_DATA_GETLASTDATA_REQ, + GWEN_MsgEndpoint_GetNextMessageId(epTcp), 0, + valueName, 0, 0, 1); GWEN_MsgEndpoint_AddSendMessage(epTcp, msgOut); } diff --git a/apps/aqhome-tool/data/getvalues.c b/apps/aqhome-tool/data/getvalues.c index 27a6c9a..cf0f841 100644 --- a/apps/aqhome-tool/data/getvalues.c +++ b/apps/aqhome-tool/data/getvalues.c @@ -236,7 +236,9 @@ void _sendCommand(GWEN_MSG_ENDPOINT *epTcp) { GWEN_MSG *msgOut; - msgOut=GWEN_IpcMsg_new(AQH_IPC_PROTOCOL_DATA_ID, AQH_IPC_PROTOCOL_DATA_VERSION, AQH_MSGTYPE_IPC_DATA_GETVALUES_REQ, 0, NULL); + msgOut=GWEN_IpcMsg_new(AQH_IPC_PROTOCOL_DATA_ID, AQH_IPC_PROTOCOL_DATA_VERSION, AQH_MSGTYPE_IPC_DATA_GETVALUES_REQ, + GWEN_MsgEndpoint_GetNextMessageId(epTcp), 0, + 0, NULL); GWEN_MsgEndpoint_AddSendMessage(epTcp, msgOut); } diff --git a/apps/aqhome-tool/data/moddevice.c b/apps/aqhome-tool/data/moddevice.c index 91bc6fe..7133c35 100644 --- a/apps/aqhome-tool/data/moddevice.c +++ b/apps/aqhome-tool/data/moddevice.c @@ -263,7 +263,9 @@ void _sendCommand(GWEN_MSG_ENDPOINT *epTcp, const AQH_DEVICE *device) { GWEN_MSG *msgOut; - msgOut=AQH_DevicesDataIpcMsg_newForOneDevice(AQH_MSGTYPE_IPC_DATA_MODDEVICE_REQ, AQH_MSGDATA_DEVICES_FLAGS_LASTMSG, device); + msgOut=AQH_DevicesDataIpcMsg_newForOneDevice(AQH_MSGTYPE_IPC_DATA_MODDEVICE_REQ, + GWEN_MsgEndpoint_GetNextMessageId(epTcp), 0, + AQH_MSGDATA_DEVICES_FLAGS_LASTMSG, device); GWEN_MsgEndpoint_AddSendMessage(epTcp, msgOut); } diff --git a/apps/aqhome-tool/data/setdata.c b/apps/aqhome-tool/data/setdata.c index 9c7ec71..afec96b 100644 --- a/apps/aqhome-tool/data/setdata.c +++ b/apps/aqhome-tool/data/setdata.c @@ -263,7 +263,9 @@ void _sendCommand(GWEN_MSG_ENDPOINT *epTcp, const char *valueName, const char *v AQH_Value_SetNameForSystem(v, valueName); AQH_Value_SetValueUnits(v, valueUnits); - msgOut=AQH_SetDataIpcMsg_new(AQH_MSGTYPE_IPC_DATA_SETDATA, v, valueData); + msgOut=AQH_SetDataIpcMsg_new(AQH_MSGTYPE_IPC_DATA_SETDATA, + GWEN_MsgEndpoint_GetNextMessageId(epTcp), 0, + v, valueData); AQH_Value_free(v); GWEN_MsgEndpoint_AddSendMessage(epTcp, msgOut); } diff --git a/apps/aqhome-tool/main.c b/apps/aqhome-tool/main.c index bc2f54b..e6c9619 100644 --- a/apps/aqhome-tool/main.c +++ b/apps/aqhome-tool/main.c @@ -52,6 +52,17 @@ int main(int argc, char **argv) const char *s; const char *cmd; const GWEN_ARGS args[]= { + { + GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ + GWEN_ArgsType_Char, /* type */ + "loglevel", /* name */ + 0, /* minnum */ + 1, /* maxnum */ + "L", /* short option */ + "loglevel", /* long option */ + I18S("Specify loglevel"), /* short description */ + I18S("Specify loglevel") /* long description */ + }, { GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ GWEN_ArgsType_Char, /* type */ @@ -104,8 +115,7 @@ int main(int argc, char **argv) GWEN_Logger_Open(0, "aqhome-tool", 0, GWEN_LoggerType_Console, GWEN_LoggerFacility_User); - GWEN_Logger_SetLevel(0, GWEN_LoggerLevel_Notice); - /*GWEN_Logger_SetLevel(0, GWEN_LoggerLevel_Info);*/ + GWEN_Logger_SetLevel(NULL, GWEN_LoggerLevel_Notice); rv=AQH_Init(); if (rv<0) { @@ -146,6 +156,14 @@ int main(int argc, char **argv) argv+=rv-1; } + s=GWEN_DB_GetCharValue(dbArgs, "loglevel", 0, NULL); + if (s && *s) { + GWEN_LOGGER_LEVEL ll; + + ll=GWEN_Logger_Name2Level(s); + GWEN_Logger_SetLevel(NULL, ll); + } + AQH_MergeConfigFileIntoConfig(dbArgs, "ConfigFile"); s=GWEN_DB_GetCharValue(dbArgs, "charset", 0, NULL); diff --git a/apps/aqhome-tool/nodes/flash.c b/apps/aqhome-tool/nodes/flash.c index 161fb1c..ac299f0 100644 --- a/apps/aqhome-tool/nodes/flash.c +++ b/apps/aqhome-tool/nodes/flash.c @@ -471,7 +471,9 @@ int _sendRebootRequest(GWEN_MSG_ENDPOINT *epTcp, unsigned int uid) return GWEN_ERROR_GENERIC; } - msgOut=AQH_ForwardIpcMsg_new(AQH_MSGTYPE_IPC_NODES_FORWARD, GWEN_Msg_GetConstBuffer(msgNode), GWEN_Msg_GetBytesInBuffer(msgNode)); + msgOut=AQH_ForwardIpcMsg_new(AQH_MSGTYPE_IPC_NODES_FORWARD, + GWEN_MsgEndpoint_GetNextMessageId(epTcp), 0, + GWEN_Msg_GetConstBuffer(msgNode), GWEN_Msg_GetBytesInBuffer(msgNode)); GWEN_MsgEndpoint_AddSendMessage(epTcp, msgOut); GWEN_Msg_free(msgNode); return 0; @@ -490,7 +492,9 @@ int _sendFlashStart(GWEN_MSG_ENDPOINT *epTcp, unsigned int uid) return GWEN_ERROR_GENERIC; } - msgOut=AQH_ForwardIpcMsg_new(AQH_MSGTYPE_IPC_NODES_FORWARD, GWEN_Msg_GetConstBuffer(msgNode), GWEN_Msg_GetBytesInBuffer(msgNode)); + msgOut=AQH_ForwardIpcMsg_new(AQH_MSGTYPE_IPC_NODES_FORWARD, + GWEN_MsgEndpoint_GetNextMessageId(epTcp), 0, + GWEN_Msg_GetConstBuffer(msgNode), GWEN_Msg_GetBytesInBuffer(msgNode)); GWEN_MsgEndpoint_AddSendMessage(epTcp, msgOut); GWEN_Msg_free(msgNode); return 0; @@ -509,7 +513,9 @@ int _sendFlashEnd(GWEN_MSG_ENDPOINT *epTcp, int reason) return GWEN_ERROR_GENERIC; } - msgOut=AQH_ForwardIpcMsg_new(AQH_MSGTYPE_IPC_NODES_FORWARD, GWEN_Msg_GetConstBuffer(msgNode), GWEN_Msg_GetBytesInBuffer(msgNode)); + msgOut=AQH_ForwardIpcMsg_new(AQH_MSGTYPE_IPC_NODES_FORWARD, + GWEN_MsgEndpoint_GetNextMessageId(epTcp), 0, + GWEN_Msg_GetConstBuffer(msgNode), GWEN_Msg_GetBytesInBuffer(msgNode)); GWEN_MsgEndpoint_AddSendMessage(epTcp, msgOut); GWEN_Msg_free(msgNode); return 0; @@ -555,7 +561,9 @@ int _sendFlashRecord(GWEN_MSG_ENDPOINT *epTcp, return GWEN_ERROR_GENERIC; } - msgOut=AQH_ForwardIpcMsg_new(AQH_MSGTYPE_IPC_NODES_FORWARD, GWEN_Msg_GetConstBuffer(msgNode), GWEN_Msg_GetBytesInBuffer(msgNode)); + msgOut=AQH_ForwardIpcMsg_new(AQH_MSGTYPE_IPC_NODES_FORWARD, + GWEN_MsgEndpoint_GetNextMessageId(epTcp), 0, + GWEN_Msg_GetConstBuffer(msgNode), GWEN_Msg_GetBytesInBuffer(msgNode)); GWEN_MsgEndpoint_AddSendMessage(epTcp, msgOut); GWEN_Msg_free(msgNode); diff --git a/apps/aqhome-tool/nodes/getnodes.c b/apps/aqhome-tool/nodes/getnodes.c index 1e21ec9..0c5ea8f 100644 --- a/apps/aqhome-tool/nodes/getnodes.c +++ b/apps/aqhome-tool/nodes/getnodes.c @@ -190,7 +190,7 @@ void _printNodeFromMsg(const GWEN_MSG *msg) uint32_t u; int64_t ts64; GWEN_TIMESTAMP *ts; - + ts64=AQH_GetDevicesResponseIpcMsg_GetTimestamp(msg); ts=GWEN_Timestamp_fromInt64(ts64); /* TODO: fix timestamp */ @@ -254,7 +254,8 @@ int _sendGetDevices(GWEN_MSG_ENDPOINT *epTcp) { GWEN_MSG *msgOut; - msgOut=AQH_GetDevicesRequestIpcMsg_new(AQH_MSGTYPE_IPC_NODES_GETDEVICES_REQ); + msgOut=AQH_GetDevicesRequestIpcMsg_new(AQH_MSGTYPE_IPC_NODES_GETDEVICES_REQ, + GWEN_MsgEndpoint_GetNextMessageId(epTcp), 0); if (msgOut==NULL) { DBG_ERROR(NULL, "Error creating message"); return GWEN_ERROR_GENERIC; diff --git a/apps/aqhome-tool/nodes/ping.c b/apps/aqhome-tool/nodes/ping.c index 2dedbc9..60d0fd1 100644 --- a/apps/aqhome-tool/nodes/ping.c +++ b/apps/aqhome-tool/nodes/ping.c @@ -175,7 +175,7 @@ int _sendPing(GWEN_MSG_ENDPOINT *epTcp, int nodeAddr) { GWEN_MSG *msgOut; - msgOut=AQH_PingIpcMsg_new(AQH_MSGTYPE_IPC_NODES_PING, nodeAddr); + msgOut=AQH_PingIpcMsg_new(AQH_MSGTYPE_IPC_NODES_PING, GWEN_MsgEndpoint_GetNextMessageId(epTcp), 0, nodeAddr); if (msgOut==NULL) { DBG_ERROR(NULL, "Error creating message"); return GWEN_ERROR_GENERIC; diff --git a/apps/aqhome-tool/nodes/setnodevalue.c b/apps/aqhome-tool/nodes/setnodevalue.c index df4cbd9..4b3a2a2 100644 --- a/apps/aqhome-tool/nodes/setnodevalue.c +++ b/apps/aqhome-tool/nodes/setnodevalue.c @@ -212,7 +212,9 @@ int _doSetValue(GWEN_DB_NODE *dbArgs) DBG_ERROR(NULL, "Error creating message"); return GWEN_ERROR_GENERIC; } - msgOut=AQH_ForwardIpcMsg_new(AQH_MSGTYPE_IPC_NODES_FORWARD, GWEN_Msg_GetConstBuffer(msgNode), GWEN_Msg_GetBytesInBuffer(msgNode)); + msgOut=AQH_ForwardIpcMsg_new(AQH_MSGTYPE_IPC_NODES_FORWARD, + GWEN_MsgEndpoint_GetNextMessageId(epTcp), 0, + GWEN_Msg_GetConstBuffer(msgNode), GWEN_Msg_GetBytesInBuffer(msgNode)); if (msgOut==NULL) { DBG_ERROR(NULL, "Error creating message"); return GWEN_ERROR_GENERIC; diff --git a/apps/aqhome-tool/utils.c b/apps/aqhome-tool/utils.c index b4f7cc0..f59376e 100644 --- a/apps/aqhome-tool/utils.c +++ b/apps/aqhome-tool/utils.c @@ -241,7 +241,9 @@ int Utils_SendAcceptedMsgGroups(GWEN_MSG_ENDPOINT *epTcp, uint32_t groups) { GWEN_MSG *msgOut; - msgOut=AQH_SetAcceptedMsgGroupsIpcMsg_new(AQH_MSGTYPE_IPC_NODES_SETACCMSGGRPS, groups); + msgOut=AQH_SetAcceptedMsgGroupsIpcMsg_new(AQH_MSGTYPE_IPC_NODES_SETACCMSGGRPS, + GWEN_MsgEndpoint_GetNextMessageId(epTcp),0, + groups); if (msgOut==NULL) { DBG_ERROR(NULL, "Error creating message"); return GWEN_ERROR_GENERIC; @@ -272,7 +274,9 @@ GWEN_MSG_ENDPOINT *Utils_OpenBrokerConnection(GWEN_DB_NODE *dbArgs, uint32_t fla return NULL; } - msgOut=AQH_ConnectDataIpcMsg_new(AQH_MSGTYPE_IPC_DATA_CONNECT_REQ, clientId, userId, password, flags); + msgOut=AQH_ConnectDataIpcMsg_new(AQH_MSGTYPE_IPC_DATA_CONNECT_REQ, + GWEN_MsgEndpoint_GetNextMessageId(epTcp), 0, + clientId, userId, password, flags); if (msgOut==NULL) { DBG_ERROR(NULL, "Error creating message"); GWEN_MsgEndpoint_free(epTcp); diff --git a/aqhome/0BUILD b/aqhome/0BUILD index 2c1f92a..2516366 100644 --- a/aqhome/0BUILD +++ b/aqhome/0BUILD @@ -70,6 +70,7 @@ hexfile data events + client @@ -81,6 +82,7 @@ aqhhexfile aqhdata aqhevents + aqhclient diff --git a/aqhome/aqhome.c b/aqhome/aqhome.c index 8f039c9..32eed16 100644 --- a/aqhome/aqhome.c +++ b/aqhome/aqhome.c @@ -182,6 +182,93 @@ void AQH_MergeConfigFileIntoConfig(GWEN_DB_NODE *dbArgs, const char *destDbGroup +int AQH_ValueType_fromString(const char *s) +{ + if (s) { + if (strcasecmp(s, "sensor")==0) + return AQH_ValueType_Sensor; + else if (strcasecmp(s, "actor")==0) + return AQH_ValueType_Actor; + } + return AQH_ValueType_Unknown; +} + + + +const char *AQH_ValueType_toString(int i) +{ + switch (i) { + case AQH_ValueType_Sensor: return "sensor"; + case AQH_ValueType_Actor: return "actor"; + case AQH_ValueType_Unknown: + default: return "unknown"; + } +} + + + +int AQH_ValueDataType_fromString(const char *s) +{ + if (s) { + if (strcasecmp(s, "int")==0) + return AQH_ValueDataType_Int; + else if (strcasecmp(s, "dword")==0) + return AQH_ValueDataType_Dword; + else if (strcasecmp(s, "rational")==0) + return AQH_ValueDataType_Rational; + } + return AQH_ValueDataType_Unknown; +} + + + +const char *AQH_ValueDataType_toString(int i) +{ + switch(i) { + case AQH_ValueDataType_Int: return "int"; + case AQH_ValueDataType_Dword: return "dword"; + case AQH_ValueDataType_Rational: return "rational"; + case AQH_ValueDataType_Unknown: + default: return "unknown"; + } +} + + + +int AQH_ValueModality_fromString(const char *s) +{ + if (s) { + if (strcasecmp(s, "temperature")==0) + return AQH_ValueModality_Temperature; + else if (strcasecmp(s, "humidity")==0) + return AQH_ValueModality_Humidity; + else if (strcasecmp(s, "door")==0) + return AQH_ValueModality_Door; + else if (strcasecmp(s, "rgb")==0) + return AQH_ValueModality_RGB; + else if (strcasecmp(s, "rgbw")==0) + return AQH_ValueModality_RGBW; + } + return AQH_ValueModality_Unknown; +} + + + +const char *AQH_ValueModality_toString(int i) +{ + switch(i) { + case AQH_ValueModality_Temperature: return "temperature"; + case AQH_ValueModality_Humidity: return "humidity"; + case AQH_ValueModality_Door: return "door"; + case AQH_ValueModality_RGB: return "rgb"; + case AQH_ValueModality_RGBW: return "rgbw"; + case AQH_ValueModality_Unknown: + default: return "unknown"; + } +} + + + diff --git a/aqhome/aqhome.h b/aqhome/aqhome.h index 13a100e..ccf49ca 100644 --- a/aqhome/aqhome.h +++ b/aqhome/aqhome.h @@ -17,6 +17,31 @@ #include +enum { + AQH_ValueType_Unknown=0, + AQH_ValueType_Sensor, + AQH_ValueType_Actor +}; + + +enum { + AQH_ValueDataType_Unknown=0, + AQH_ValueDataType_Int, + AQH_ValueDataType_Dword, + AQH_ValueDataType_Rational +}; + + +enum { + AQH_ValueModality_Unknown=0, + AQH_ValueModality_Temperature, + AQH_ValueModality_Humidity, + AQH_ValueModality_Door, + AQH_ValueModality_RGB, + AQH_ValueModality_RGBW +}; + + AQHOME_API int AQH_Init(void); AQHOME_API void AQH_Fini(void); @@ -39,6 +64,15 @@ AQHOME_API GWEN_STRINGLIST *AQH_GetGlobalDataDirs(void); AQHOME_API GWEN_STRINGLIST *AQH_GetGlobalSysconfDirs(void); +AQHOME_API int AQH_ValueType_fromString(const char *s); +AQHOME_API const char *AQH_ValueType_toString(int i); + +AQHOME_API int AQH_ValueDataType_fromString(const char *s); +AQHOME_API const char *AQH_ValueDataType_toString(int i); + +AQHOME_API int AQH_ValueModality_fromString(const char *s); +AQHOME_API const char *AQH_ValueModality_toString(int i); + #endif diff --git a/aqhome/data/value.t2d b/aqhome/data/value.t2d index 3e3e172..402a3c4 100644 --- a/aqhome/data/value.t2d +++ b/aqhome/data/value.t2d @@ -30,16 +30,6 @@ - - - sensor - - - actor - - - - diff --git a/aqhome/ipc/data/ipc_data.h b/aqhome/ipc/data/ipc_data.h index 9492823..1bfd893 100644 --- a/aqhome/ipc/data/ipc_data.h +++ b/aqhome/ipc/data/ipc_data.h @@ -24,32 +24,32 @@ #define AQH_IPC_PROTOCOL_DATA_VERSION 1 -#define AQH_MSGTYPE_IPC_DATA_RESULT 0x001 /* AQH_ResultIpcMsg */ +#define AQH_MSGTYPE_IPC_DATA_RESULT 0x0001 /* AQH_ResultIpcMsg */ -#define AQH_MSGTYPE_IPC_DATA_CONNECT_REQ 0x010 /* serviceName, userName, password */ +#define AQH_MSGTYPE_IPC_DATA_CONNECT_REQ 0x0010 /* serviceName, userName, password */ -#define AQH_MSGTYPE_IPC_DATA_UPDATEDATA 0x100 /* AQH_MultiDataDataIpcMsg */ -#define AQH_MSGTYPE_IPC_DATA_DATACHANGED 0x200 /* AQH_MultiDataDataIpcMsg */ +#define AQH_MSGTYPE_IPC_DATA_UPDATEDATA 0x0100 /* AQH_MultiDataDataIpcMsg */ +#define AQH_MSGTYPE_IPC_DATA_DATACHANGED 0x0200 /* AQH_MultiDataDataIpcMsg */ -#define AQH_MSGTYPE_IPC_DATA_SETDATA 0x300 /* AQH_SetDataIpcMsg */ +#define AQH_MSGTYPE_IPC_DATA_SETDATA 0x0300 /* AQH_SetDataIpcMsg */ -#define AQH_MSGTYPE_IPC_DATA_ADDVALUE 0x400 /* AQH_AddValueDataIpcMsg */ +#define AQH_MSGTYPE_IPC_DATA_ADDVALUE 0x0400 /* AQH_AddValueDataIpcMsg */ -#define AQH_MSGTYPE_IPC_DATA_GETDATA_REQ 0x500 /* AQH_GetDataDataIpcMsg */ -#define AQH_MSGTYPE_IPC_DATA_GETDATA_RSP 0x600 /* AQH_MultiDataDataIpcMsg */ +#define AQH_MSGTYPE_IPC_DATA_GETDATA_REQ 0x0500 /* AQH_GetDataDataIpcMsg */ +#define AQH_MSGTYPE_IPC_DATA_GETDATA_RSP 0x0600 /* AQH_MultiDataDataIpcMsg */ -#define AQH_MSGTYPE_IPC_DATA_GETLASTDATA_REQ 0x700 /* AQH_GetDataDataIpcMsg */ -#define AQH_MSGTYPE_IPC_DATA_GETLASTDATA_RSP 0x800 /* AQH_MultiDataDataIpcMsg */ +#define AQH_MSGTYPE_IPC_DATA_GETLASTDATA_REQ 0x0700 /* AQH_GetDataDataIpcMsg */ +#define AQH_MSGTYPE_IPC_DATA_GETLASTDATA_RSP 0x0800 /* AQH_MultiDataDataIpcMsg */ -#define AQH_MSGTYPE_IPC_DATA_GETVALUES_REQ 0x900 /* GWEN_IpcMsg */ -#define AQH_MSGTYPE_IPC_DATA_GETVALUES_RSP 0xa00 /* AQH_ValuesDataIpcMsg */ +#define AQH_MSGTYPE_IPC_DATA_GETVALUES_REQ 0x0900 /* GWEN_IpcMsg */ +#define AQH_MSGTYPE_IPC_DATA_GETVALUES_RSP 0x0a00 /* AQH_ValuesDataIpcMsg */ -#define AQH_MSGTYPE_IPC_DATA_GETDEVICES_REQ 0xb00 /* GWEN_IpcMsg */ -#define AQH_MSGTYPE_IPC_DATA_GETDEVICES_RSP 0xc00 /* AQH_DevicesDataIpcMsg */ +#define AQH_MSGTYPE_IPC_DATA_GETDEVICES_REQ 0x0b00 /* GWEN_IpcMsg */ +#define AQH_MSGTYPE_IPC_DATA_GETDEVICES_RSP 0x0c00 /* AQH_DevicesDataIpcMsg */ -#define AQH_MSGTYPE_IPC_DATA_MODDEVICE_REQ 0xd00 /* AQH_DevicesDataIpcMsg */ +#define AQH_MSGTYPE_IPC_DATA_MODDEVICE_REQ 0x0d00 /* AQH_DevicesDataIpcMsg */ -#define AQH_MSGTYPE_IPC_DATA_ANNOUNCEVALUE 0xe00 /* AQH_ValuesDataIpcMsg */ +#define AQH_MSGTYPE_IPC_DATA_ANNOUNCEVALUE 0x0e00 /* AQH_ValuesDataIpcMsg */ diff --git a/aqhome/ipc/data/msg_data_connect.c b/aqhome/ipc/data/msg_data_connect.c index f38f194..d2e3263 100644 --- a/aqhome/ipc/data/msg_data_connect.c +++ b/aqhome/ipc/data/msg_data_connect.c @@ -27,7 +27,9 @@ -GWEN_MSG *AQH_ConnectDataIpcMsg_new(uint16_t code, const char *clientId, const char *userId, const char *password, uint32_t flags) +GWEN_MSG *AQH_ConnectDataIpcMsg_new(uint16_t code, + uint32_t msgId, uint32_t refMsgId, + const char *clientId, const char *userId, const char *password, uint32_t flags) { GWEN_MSG *msg; GWEN_BUFFER *buf; @@ -41,7 +43,7 @@ GWEN_MSG *AQH_ConnectDataIpcMsg_new(uint16_t code, const char *clientId, const c GWEN_Tag16_WriteStringTagToBuffer(AQH_MSGDATA_CONNECT_TAGS_PASSWORD, password, buf); GWEN_Tag16_WriteUint32TagToBuffer(AQH_MSGDATA_CONNECT_TAGS_FLAGS, flags, buf); - msg=AQH_Tag16IpcMsg_new(AQH_IPC_PROTOCOL_DATA_ID, AQH_IPC_PROTOCOL_DATA_VERSION, code, + msg=AQH_Tag16IpcMsg_new(AQH_IPC_PROTOCOL_DATA_ID, AQH_IPC_PROTOCOL_DATA_VERSION, code, msgId, refMsgId, GWEN_Buffer_GetUsedBytes(buf), (const uint8_t*) GWEN_Buffer_GetStart(buf)); GWEN_Buffer_free(buf); return msg; diff --git a/aqhome/ipc/data/msg_data_connect.h b/aqhome/ipc/data/msg_data_connect.h index c94044a..140da5f 100644 --- a/aqhome/ipc/data/msg_data_connect.h +++ b/aqhome/ipc/data/msg_data_connect.h @@ -31,6 +31,7 @@ AQHOME_API GWEN_MSG *AQH_ConnectDataIpcMsg_new(uint16_t code, + uint32_t msgId, uint32_t refMsgId, const char *clientId, const char *userId, const char *password, uint32_t flags); diff --git a/aqhome/ipc/data/msg_data_datapoints.c b/aqhome/ipc/data/msg_data_datapoints.c index 75718d8..05852e0 100644 --- a/aqhome/ipc/data/msg_data_datapoints.c +++ b/aqhome/ipc/data/msg_data_datapoints.c @@ -34,86 +34,38 @@ -#define AQH_MSGDATA_DATAPOINTS_MINSIZE (GWEN_MSGIPC_OFFS_PAYLOAD+AQH_MSGDATA_DATAPOINTS_OFFS_VALUES) - - -static void _writeQword(uint64_t i64, uint8_t *ptr); +#define AQH_MSGDATA_DATAPOINTS_PAYLOADSIZE (AQH_MSGDATA_DATAPOINTS_OFFS_VALUES) +#define AQH_MSGDATA_DATAPOINTS_MINSIZE (GWEN_MSGIPC_OFFS_PAYLOAD+AQH_MSGDATA_DATAPOINTS_PAYLOADSIZE) -GWEN_MSG *AQH_DataPointsDataIpcMsg_new(uint16_t code, uint32_t flags, +GWEN_MSG *AQH_DataPointsDataIpcMsg_new(uint16_t code, uint32_t msgId, uint32_t refMsgId, uint32_t flags, uint64_t valueId, const char *valueName, const char *units, const uint64_t *i64Ptr, int numOfDataPoints) { GWEN_MSG *msg; - uint8_t *ptr; - int payloadSize; int i; - payloadSize=AQH_MSGDATA_DATAPOINTS_OFFS_VALUES+(numOfDataPoints*16); - - msg=GWEN_IpcMsg_new(AQH_IPC_PROTOCOL_DATA_ID, AQH_IPC_PROTOCOL_DATA_VERSION, code, payloadSize, NULL); - ptr=GWEN_Msg_GetBuffer(msg)+GWEN_MSGIPC_OFFS_PAYLOAD; - *(ptr++)=flags & 0xff; - *(ptr++)=(flags>>8) & 0xff; - *(ptr++)=(flags>>16) & 0xff; - *(ptr++)=(flags>>24) & 0xff; - - *(ptr++)=numOfDataPoints & 0xff; - *(ptr++)=(numOfDataPoints>>8) & 0xff; - *(ptr++)=(numOfDataPoints>>16) & 0xff; - *(ptr++)=(numOfDataPoints>>24) & 0xff; - - _writeQword(valueId, ptr); - ptr+=8; - - - if (valueName) { - strncpy((char*) ptr, valueName, AQH_MSGDATA_DATAPOINTS_SIZE_VALUENAME-1); - ptr[AQH_MSGDATA_DATAPOINTS_SIZE_VALUENAME-1]=0; - } - else - memset(ptr, 0, AQH_MSGDATA_DATAPOINTS_SIZE_VALUENAME); - ptr+=AQH_MSGDATA_DATAPOINTS_SIZE_VALUENAME; - - if (units) { - strncpy((char*) ptr, units, AQH_MSGDATA_DATAPOINTS_SIZE_VALUEUNITS-1); - ptr[AQH_MSGDATA_DATAPOINTS_SIZE_VALUEUNITS-1]=0; - } - else - memset(ptr, 0, AQH_MSGDATA_DATAPOINTS_SIZE_VALUEUNITS); - ptr+=AQH_MSGDATA_DATAPOINTS_SIZE_VALUEUNITS; + msg=GWEN_IpcMsg_new(AQH_IPC_PROTOCOL_DATA_ID, AQH_IPC_PROTOCOL_DATA_VERSION, code, msgId, refMsgId, 0, NULL); + GWEN_Msg_AddUint32(msg, flags); + GWEN_Msg_AddUint32(msg, numOfDataPoints); + GWEN_Msg_AddUint64(msg, valueId); + GWEN_Msg_AddStringWithTrailingNull(msg, valueName, AQH_MSGDATA_DATAPOINTS_SIZE_VALUENAME, 0); + GWEN_Msg_AddStringWithTrailingNull(msg, units, AQH_MSGDATA_DATAPOINTS_SIZE_VALUEUNITS, 0); for (i=0; i>8) & 0xff; - *(ptr++)=(i64>>16) & 0xff; - *(ptr++)=(i64>>24) & 0xff; - *(ptr++)=(i64>>32) & 0xff; - *(ptr++)=(i64>>40) & 0xff; - *(ptr++)=(i64>>48) & 0xff; - *(ptr++)=(i64>>56) & 0xff; -} - - - uint32_t AQH_DataPointsDataIpcMsg_GetFlags(const GWEN_MSG *msg) { return GWEN_Msg_GetUint32At(msg, GWEN_MSGIPC_OFFS_PAYLOAD+AQH_MSGDATA_DATAPOINTS_OFFS_FLAGS, 0); @@ -204,7 +156,8 @@ void AQH_DataPointsDataIpcMsg_DumpToBuffer(const GWEN_MSG *msg, GWEN_BUFFER *dbu valueName=AQH_DataPointsDataIpcMsg_GetValueName(msg); GWEN_Buffer_AppendArgs(dbuf, - "DATAPOINTS (code=%d, proto=%d, proto version=%d, flags=0x%08x, valueName=%s, values=%d)\n", + "DATAPOINTS %s (code=%d, proto=%d, proto version=%d, flags=0x%08x, valueName=%s, values=%d)\n", + sText?sText:"", GWEN_IpcMsg_GetCode(msg), GWEN_IpcMsg_GetProtoId(msg), GWEN_IpcMsg_GetProtoVersion(msg), diff --git a/aqhome/ipc/data/msg_data_datapoints.h b/aqhome/ipc/data/msg_data_datapoints.h index 7d896f4..c21676b 100644 --- a/aqhome/ipc/data/msg_data_datapoints.h +++ b/aqhome/ipc/data/msg_data_datapoints.h @@ -21,7 +21,9 @@ -AQHOME_API GWEN_MSG *AQH_DataPointsDataIpcMsg_new(uint16_t code, uint32_t flags, +AQHOME_API GWEN_MSG *AQH_DataPointsDataIpcMsg_new(uint16_t code, + uint32_t msgId, uint32_t refMsgId, + uint32_t flags, uint64_t valueId, const char *valueName, const char *units, const uint64_t *i64Ptr, int numOfDataPoints); diff --git a/aqhome/ipc/data/msg_data_devices.c b/aqhome/ipc/data/msg_data_devices.c index 16e795e..60bd066 100644 --- a/aqhome/ipc/data/msg_data_devices.c +++ b/aqhome/ipc/data/msg_data_devices.c @@ -41,7 +41,8 @@ * ------------------------------------------------------------------------------------------------ */ -GWEN_MSG *AQH_DevicesDataIpcMsg_new(uint16_t code, uint32_t flags, const AQH_DEVICE_LIST *deviceList) +GWEN_MSG *AQH_DevicesDataIpcMsg_new(uint16_t code, uint32_t msgId, uint32_t refMsgId, + uint32_t flags, const AQH_DEVICE_LIST *deviceList) { GWEN_MSG *msg; GWEN_BUFFER *buf; @@ -56,7 +57,7 @@ GWEN_MSG *AQH_DevicesDataIpcMsg_new(uint16_t code, uint32_t flags, const AQH_DEV return NULL; } - msg=AQH_Tag16IpcMsg_new(AQH_IPC_PROTOCOL_DATA_ID, AQH_IPC_PROTOCOL_DATA_VERSION, code, + msg=AQH_Tag16IpcMsg_new(AQH_IPC_PROTOCOL_DATA_ID, AQH_IPC_PROTOCOL_DATA_VERSION, code, msgId, refMsgId, GWEN_Buffer_GetUsedBytes(buf), (const uint8_t*) GWEN_Buffer_GetStart(buf)); GWEN_Buffer_free(buf); return msg; @@ -64,7 +65,8 @@ GWEN_MSG *AQH_DevicesDataIpcMsg_new(uint16_t code, uint32_t flags, const AQH_DEV -GWEN_MSG *AQH_DevicesDataIpcMsg_newForOneDevice(uint16_t code, uint32_t flags, const AQH_DEVICE *device) +GWEN_MSG *AQH_DevicesDataIpcMsg_newForOneDevice(uint16_t code, uint32_t msgId, uint32_t refMsgId, + uint32_t flags, const AQH_DEVICE *device) { GWEN_MSG *msg; GWEN_BUFFER *buf; @@ -79,7 +81,7 @@ GWEN_MSG *AQH_DevicesDataIpcMsg_newForOneDevice(uint16_t code, uint32_t flags, c return NULL; } - msg=AQH_Tag16IpcMsg_new(AQH_IPC_PROTOCOL_DATA_ID, AQH_IPC_PROTOCOL_DATA_VERSION, code, + msg=AQH_Tag16IpcMsg_new(AQH_IPC_PROTOCOL_DATA_ID, AQH_IPC_PROTOCOL_DATA_VERSION, code, msgId, refMsgId, GWEN_Buffer_GetUsedBytes(buf), (const uint8_t*) GWEN_Buffer_GetStart(buf)); GWEN_Buffer_free(buf); return msg; diff --git a/aqhome/ipc/data/msg_data_devices.h b/aqhome/ipc/data/msg_data_devices.h index 377dfa0..7e4f680 100644 --- a/aqhome/ipc/data/msg_data_devices.h +++ b/aqhome/ipc/data/msg_data_devices.h @@ -27,8 +27,10 @@ #define AQH_MSGDATA_DEVICES_TAGS_DEVICE 0xc2 -AQHOME_API GWEN_MSG *AQH_DevicesDataIpcMsg_new(uint16_t code, uint32_t flags, const AQH_DEVICE_LIST *deviceList); -AQHOME_API GWEN_MSG *AQH_DevicesDataIpcMsg_newForOneDevice(uint16_t code, uint32_t flags, const AQH_DEVICE *device); +AQHOME_API GWEN_MSG *AQH_DevicesDataIpcMsg_new(uint16_t code, uint32_t msgId, uint32_t refMsgId, + uint32_t flags, const AQH_DEVICE_LIST *deviceList); +AQHOME_API GWEN_MSG *AQH_DevicesDataIpcMsg_newForOneDevice(uint16_t code, uint32_t msgId, uint32_t refMsgId, + uint32_t flags, const AQH_DEVICE *device); AQHOME_API void AQH_DevicesDataIpcMsg_Parse(GWEN_MSG *msg, int doCopy); diff --git a/aqhome/ipc/data/msg_data_getdata.c b/aqhome/ipc/data/msg_data_getdata.c index b14dd1a..7e3cbb4 100644 --- a/aqhome/ipc/data/msg_data_getdata.c +++ b/aqhome/ipc/data/msg_data_getdata.c @@ -27,7 +27,9 @@ -GWEN_MSG *AQH_GetDataDataIpcMsg_new(uint16_t code, const char *valueName, uint64_t tsBegin, uint64_t tsEnd, uint64_t num) +GWEN_MSG *AQH_GetDataDataIpcMsg_new(uint16_t code, + uint32_t msgId, uint32_t refMsgId, + const char *valueName, uint64_t tsBegin, uint64_t tsEnd, uint64_t num) { GWEN_MSG *msg; GWEN_BUFFER *buf; @@ -39,7 +41,7 @@ GWEN_MSG *AQH_GetDataDataIpcMsg_new(uint16_t code, const char *valueName, uint64 GWEN_Tag16_WriteUint64TagToBuffer(AQH_MSGDATA_GETDATA_TAGS_END, tsEnd, buf); GWEN_Tag16_WriteUint64TagToBuffer(AQH_MSGDATA_GETDATA_TAGS_NUM, num, buf); - msg=AQH_Tag16IpcMsg_new(AQH_IPC_PROTOCOL_DATA_ID, AQH_IPC_PROTOCOL_DATA_VERSION, code, + msg=AQH_Tag16IpcMsg_new(AQH_IPC_PROTOCOL_DATA_ID, AQH_IPC_PROTOCOL_DATA_VERSION, code, msgId, refMsgId, GWEN_Buffer_GetUsedBytes(buf), (const uint8_t*) GWEN_Buffer_GetStart(buf)); GWEN_Buffer_free(buf); return msg; diff --git a/aqhome/ipc/data/msg_data_getdata.h b/aqhome/ipc/data/msg_data_getdata.h index 48876f3..e55c389 100644 --- a/aqhome/ipc/data/msg_data_getdata.h +++ b/aqhome/ipc/data/msg_data_getdata.h @@ -28,7 +28,9 @@ -AQHOME_API GWEN_MSG *AQH_GetDataDataIpcMsg_new(uint16_t code, const char *valueName, uint64_t tsBegin, uint64_t tsEnd, uint64_t num); +AQHOME_API GWEN_MSG *AQH_GetDataDataIpcMsg_new(uint16_t code, + uint32_t msgId, uint32_t refMsgId, + const char *valueName, uint64_t tsBegin, uint64_t tsEnd, uint64_t num); AQHOME_API void AQH_GetDataDataIpcMsg_Parse(GWEN_MSG *msg, int doCopy); diff --git a/aqhome/ipc/data/msg_data_multidata.c b/aqhome/ipc/data/msg_data_multidata.c index 84845c3..ee12dbc 100644 --- a/aqhome/ipc/data/msg_data_multidata.c +++ b/aqhome/ipc/data/msg_data_multidata.c @@ -27,7 +27,9 @@ -GWEN_MSG *AQH_MultiDataDataIpcMsg_new(uint16_t code, const AQH_VALUE *value, const uint64_t *i64Ptr, int numOfDataPoints) +GWEN_MSG *AQH_MultiDataDataIpcMsg_new(uint16_t code, + uint32_t msgId, uint32_t refMsgId, + const AQH_VALUE *value, const uint64_t *i64Ptr, int numOfDataPoints) { GWEN_MSG *msg; GWEN_BUFFER *buf; @@ -45,7 +47,7 @@ GWEN_MSG *AQH_MultiDataDataIpcMsg_new(uint16_t code, const AQH_VALUE *value, con if (i64Ptr && numOfDataPoints) GWEN_Tag16_WriteTagToBuffer(AQH_MSGDATA_MULTIDATA_TAGS_DATA, (const uint8_t*)i64Ptr, numOfDataPoints*2*sizeof(uint64_t), buf); - msg=AQH_Tag16IpcMsg_new(AQH_IPC_PROTOCOL_DATA_ID, AQH_IPC_PROTOCOL_DATA_VERSION, code, + msg=AQH_Tag16IpcMsg_new(AQH_IPC_PROTOCOL_DATA_ID, AQH_IPC_PROTOCOL_DATA_VERSION, code, msgId, refMsgId, GWEN_Buffer_GetUsedBytes(buf), (const uint8_t*) GWEN_Buffer_GetStart(buf)); GWEN_Buffer_free(buf); return msg; @@ -53,7 +55,9 @@ GWEN_MSG *AQH_MultiDataDataIpcMsg_new(uint16_t code, const AQH_VALUE *value, con -GWEN_MSG *AQH_MultiDataDataIpcMsg_newForOne(uint16_t code, const AQH_VALUE *value, uint64_t timeStamp, double dataPoint) +GWEN_MSG *AQH_MultiDataDataIpcMsg_newForOne(uint16_t code, + uint32_t msgId, uint32_t refMsgId, + const AQH_VALUE *value, uint64_t timeStamp, double dataPoint) { GWEN_MSG *msg; GWEN_BUFFER *buf; @@ -75,7 +79,7 @@ GWEN_MSG *AQH_MultiDataDataIpcMsg_newForOne(uint16_t code, const AQH_VALUE *valu arrayToSend[1]=u.i; GWEN_Tag16_WriteTagToBuffer(AQH_MSGDATA_MULTIDATA_TAGS_DATA, (const uint8_t*) arrayToSend, 2*sizeof(uint64_t), buf); - msg=AQH_Tag16IpcMsg_new(AQH_IPC_PROTOCOL_DATA_ID, AQH_IPC_PROTOCOL_DATA_VERSION, code, + msg=AQH_Tag16IpcMsg_new(AQH_IPC_PROTOCOL_DATA_ID, AQH_IPC_PROTOCOL_DATA_VERSION, code, msgId, refMsgId, GWEN_Buffer_GetUsedBytes(buf), (const uint8_t*) GWEN_Buffer_GetStart(buf)); GWEN_Buffer_free(buf); return msg; diff --git a/aqhome/ipc/data/msg_data_multidata.h b/aqhome/ipc/data/msg_data_multidata.h index 8a476bd..d1b5a6b 100644 --- a/aqhome/ipc/data/msg_data_multidata.h +++ b/aqhome/ipc/data/msg_data_multidata.h @@ -22,8 +22,12 @@ -AQHOME_API GWEN_MSG *AQH_MultiDataDataIpcMsg_new(uint16_t code, const AQH_VALUE *value, const uint64_t *i64Ptr, int numOfDataPoints); -AQHOME_API GWEN_MSG *AQH_MultiDataDataIpcMsg_newForOne(uint16_t code, const AQH_VALUE *value, uint64_t timeStamp, double dataPoint); +AQHOME_API GWEN_MSG *AQH_MultiDataDataIpcMsg_new(uint16_t code, + uint32_t msgId, uint32_t refMsgId, + const AQH_VALUE *value, const uint64_t *i64Ptr, int numOfDataPoints); +AQHOME_API GWEN_MSG *AQH_MultiDataDataIpcMsg_newForOne(uint16_t code, + uint32_t msgId, uint32_t refMsgId, + const AQH_VALUE *value, uint64_t timeStamp, double dataPoint); AQHOME_API void AQH_MultiDataDataIpcMsg_Parse(GWEN_MSG *msg, int doCopy); AQHOME_API AQH_VALUE *AQH_MultiDataDataIpcMsg_ReadValue(const GWEN_MSG *msg); diff --git a/aqhome/ipc/data/msg_data_set.c b/aqhome/ipc/data/msg_data_set.c index 81ca60b..8eec621 100644 --- a/aqhome/ipc/data/msg_data_set.c +++ b/aqhome/ipc/data/msg_data_set.c @@ -41,7 +41,9 @@ * ------------------------------------------------------------------------------------------------ */ -GWEN_MSG *AQH_SetDataIpcMsg_new(uint16_t code, const AQH_VALUE *value, const char *data) +GWEN_MSG *AQH_SetDataIpcMsg_new(uint16_t code, + uint32_t msgId, uint32_t refMsgId, + const AQH_VALUE *value, const char *data) { GWEN_MSG *msg; GWEN_BUFFER *buf; @@ -58,7 +60,7 @@ GWEN_MSG *AQH_SetDataIpcMsg_new(uint16_t code, const AQH_VALUE *value, const cha GWEN_Tag16_WriteStringTagToBuffer(AQH_MSGDATA_SET_TAGS_DATA, data, buf); - msg=AQH_Tag16IpcMsg_new(AQH_IPC_PROTOCOL_DATA_ID, AQH_IPC_PROTOCOL_DATA_VERSION, code, + msg=AQH_Tag16IpcMsg_new(AQH_IPC_PROTOCOL_DATA_ID, AQH_IPC_PROTOCOL_DATA_VERSION, code, msgId, refMsgId, GWEN_Buffer_GetUsedBytes(buf), (const uint8_t*) GWEN_Buffer_GetStart(buf)); GWEN_Buffer_free(buf); return msg; diff --git a/aqhome/ipc/data/msg_data_set.h b/aqhome/ipc/data/msg_data_set.h index 52f8bec..f107477 100644 --- a/aqhome/ipc/data/msg_data_set.h +++ b/aqhome/ipc/data/msg_data_set.h @@ -24,7 +24,9 @@ #define AQH_MSGDATA_SET_TAGS_DATA 0x02 -AQHOME_API GWEN_MSG *AQH_SetDataIpcMsg_new(uint16_t code, const AQH_VALUE *value, const char *data); +AQHOME_API GWEN_MSG *AQH_SetDataIpcMsg_new(uint16_t code, + uint32_t msgId, uint32_t refMsgId, + const AQH_VALUE *value, const char *data); AQHOME_API void AQH_SetDataIpcMsg_Parse(GWEN_MSG *msg, int doCopy); AQHOME_API AQH_VALUE *AQH_SetDataIpcMsg_ReadValue(const GWEN_MSG *msg); AQHOME_API char *AQH_SetDataIpcMsg_ReadData(const GWEN_MSG *msg); diff --git a/aqhome/ipc/data/msg_data_values.c b/aqhome/ipc/data/msg_data_values.c index 6b2b3b8..3477c56 100644 --- a/aqhome/ipc/data/msg_data_values.c +++ b/aqhome/ipc/data/msg_data_values.c @@ -41,7 +41,9 @@ * ------------------------------------------------------------------------------------------------ */ -GWEN_MSG *AQH_ValuesDataIpcMsg_new(uint16_t code, uint32_t flags, const AQH_VALUE_LIST *valueList) +GWEN_MSG *AQH_ValuesDataIpcMsg_new(uint16_t code, + uint32_t msgId, uint32_t refMsgId, + uint32_t flags, const AQH_VALUE_LIST *valueList) { GWEN_MSG *msg; GWEN_BUFFER *buf; @@ -56,7 +58,7 @@ GWEN_MSG *AQH_ValuesDataIpcMsg_new(uint16_t code, uint32_t flags, const AQH_VALU return NULL; } - msg=AQH_Tag16IpcMsg_new(AQH_IPC_PROTOCOL_DATA_ID, AQH_IPC_PROTOCOL_DATA_VERSION, code, + msg=AQH_Tag16IpcMsg_new(AQH_IPC_PROTOCOL_DATA_ID, AQH_IPC_PROTOCOL_DATA_VERSION, code, msgId, refMsgId, GWEN_Buffer_GetUsedBytes(buf), (const uint8_t*) GWEN_Buffer_GetStart(buf)); GWEN_Buffer_free(buf); return msg; @@ -64,7 +66,9 @@ GWEN_MSG *AQH_ValuesDataIpcMsg_new(uint16_t code, uint32_t flags, const AQH_VALU -GWEN_MSG *AQH_ValuesDataIpcMsg_newForOneValue(uint16_t code, uint32_t flags, const AQH_VALUE *value) +GWEN_MSG *AQH_ValuesDataIpcMsg_newForOneValue(uint16_t code, + uint32_t msgId, uint32_t refMsgId, + uint32_t flags, const AQH_VALUE *value) { GWEN_MSG *msg; GWEN_BUFFER *buf; @@ -79,7 +83,7 @@ GWEN_MSG *AQH_ValuesDataIpcMsg_newForOneValue(uint16_t code, uint32_t flags, con return NULL; } - msg=AQH_Tag16IpcMsg_new(AQH_IPC_PROTOCOL_DATA_ID, AQH_IPC_PROTOCOL_DATA_VERSION, code, + msg=AQH_Tag16IpcMsg_new(AQH_IPC_PROTOCOL_DATA_ID, AQH_IPC_PROTOCOL_DATA_VERSION, code, msgId, refMsgId, GWEN_Buffer_GetUsedBytes(buf), (const uint8_t*) GWEN_Buffer_GetStart(buf)); GWEN_Buffer_free(buf); return msg; diff --git a/aqhome/ipc/data/msg_data_values.h b/aqhome/ipc/data/msg_data_values.h index 4fb4b69..038f3ef 100644 --- a/aqhome/ipc/data/msg_data_values.h +++ b/aqhome/ipc/data/msg_data_values.h @@ -27,8 +27,12 @@ #define AQH_MSGDATA_VALUES_TAGS_VALUE 0xc2 -AQHOME_API GWEN_MSG *AQH_ValuesDataIpcMsg_new(uint16_t code, uint32_t flags, const AQH_VALUE_LIST *valueList); -AQHOME_API GWEN_MSG *AQH_ValuesDataIpcMsg_newForOneValue(uint16_t code, uint32_t flags, const AQH_VALUE *value); +AQHOME_API GWEN_MSG *AQH_ValuesDataIpcMsg_new(uint16_t code, + uint32_t msgId, uint32_t refMsgId, + uint32_t flags, const AQH_VALUE_LIST *valueList); +AQHOME_API GWEN_MSG *AQH_ValuesDataIpcMsg_newForOneValue(uint16_t code, + uint32_t msgId, uint32_t refMsgId, + uint32_t flags, const AQH_VALUE *value); AQHOME_API void AQH_ValuesDataIpcMsg_Parse(GWEN_MSG *msg, int doCopy); diff --git a/aqhome/ipc/endpoint_ipcclient.c b/aqhome/ipc/endpoint_ipcclient.c index eef73a9..af58472 100644 --- a/aqhome/ipc/endpoint_ipcclient.c +++ b/aqhome/ipc/endpoint_ipcclient.c @@ -73,6 +73,7 @@ int _startConnect(GWEN_MSG_ENDPOINT *ep, GWEN_MSG_ENDPOINT *epChild) return rv; } msg=AQH_ConnectDataIpcMsg_new(AQH_MSGTYPE_IPC_DATA_CONNECT_REQ, + GWEN_MsgEndpoint_GetNextMessageId(epChild), 0, AQH_IpcEndpoint_GetServiceName(epChild), AQH_IpcEndpoint_GetUserName(epChild), AQH_IpcEndpoint_GetPassword(epChild), diff --git a/aqhome/ipc/msg_ipc_qwords.c b/aqhome/ipc/msg_ipc_qwords.c index 957ed1a..59431bf 100644 --- a/aqhome/ipc/msg_ipc_qwords.c +++ b/aqhome/ipc/msg_ipc_qwords.c @@ -26,61 +26,35 @@ #define AQH_MSGDATA_QWORDS_OFFS_VALUES 8 /* 8 byte */ -#define AQH_MSGDATA_QWORDS_MINSIZE (GWEN_MSGIPC_OFFS_PAYLOAD+AQH_MSGDATA_QWORDS_OFFS_VALUES) - - -static void _writeQword(uint64_t i64, uint8_t *ptr); +#define AQH_MSGDATA_QWORDS_PAYLOADSIZE (AQH_MSGDATA_QWORDS_OFFS_VALUES) +#define AQH_MSGDATA_QWORDS_MINSIZE (GWEN_MSGIPC_OFFS_PAYLOAD+AQH_MSGDATA_QWORDS_PAYLOADSIZE) -GWEN_MSG *AQH_QwordsIpcMsg_new(uint8_t protoId, uint8_t protoVer, uint16_t code, uint32_t flags, const uint64_t *i64Ptr, int count) +GWEN_MSG *AQH_QwordsIpcMsg_new(uint8_t protoId, uint8_t protoVer, uint16_t code, + uint32_t msgId, uint32_t refMsgId, + uint32_t flags, const uint64_t *i64Ptr, int count) { GWEN_MSG *msg; uint8_t *ptr; int payloadSize; int i; - payloadSize=AQH_MSGDATA_QWORDS_OFFS_VALUES+(count*8); + payloadSize=AQH_MSGDATA_QWORDS_PAYLOADSIZE+(count*8); - msg=GWEN_IpcMsg_new(protoId, protoVer, code, payloadSize, NULL); - ptr=GWEN_Msg_GetBuffer(msg)+GWEN_MSGIPC_OFFS_PAYLOAD+AQH_MSGDATA_QWORDS_OFFS_VALUES; + msg=GWEN_IpcMsg_new(protoId, protoVer, code, msgId, refMsgId, payloadSize, NULL); + GWEN_Msg_AddUint32(msg, flags); + GWEN_Msg_AddUint32(msg, count); - *(ptr++)=flags & 0xff; - *(ptr++)=(flags>>8) & 0xff; - *(ptr++)=(flags>>16) & 0xff; - *(ptr++)=(flags>>24) & 0xff; - - *(ptr++)=count & 0xff; - *(ptr++)=(count>>8) & 0xff; - *(ptr++)=(count>>16) & 0xff; - *(ptr++)=(count>>24) & 0xff; - - for(i=0; i>8) & 0xff; - *(ptr++)=(i64>>16) & 0xff; - *(ptr++)=(i64>>24) & 0xff; - *(ptr++)=(i64>>32) & 0xff; - *(ptr++)=(i64>>40) & 0xff; - *(ptr++)=(i64>>48) & 0xff; - *(ptr++)=(i64>>56) & 0xff; -} - - - uint32_t AQH_QwordsIpcMsg_GetFlags(const GWEN_MSG *msg) { return GWEN_Msg_GetUint32At(msg, GWEN_MSGIPC_OFFS_PAYLOAD+AQH_MSGDATA_QWORDS_OFFS_FLAGS, 0); diff --git a/aqhome/ipc/msg_ipc_qwords.h b/aqhome/ipc/msg_ipc_qwords.h index 1765fec..db9dbe9 100644 --- a/aqhome/ipc/msg_ipc_qwords.h +++ b/aqhome/ipc/msg_ipc_qwords.h @@ -19,6 +19,7 @@ AQHOME_API GWEN_MSG *AQH_QwordsIpcMsg_new(uint8_t protoId, uint8_t protoVer, uint16_t code, + uint32_t msgId, uint32_t refMsgId, uint32_t flags, const uint64_t *i64Ptr, int count); AQHOME_API uint32_t AQH_QwordsIpcMsg_GetFlags(const GWEN_MSG *msg); diff --git a/aqhome/ipc/msg_ipc_result.c b/aqhome/ipc/msg_ipc_result.c index 65bc65e..beacc8c 100644 --- a/aqhome/ipc/msg_ipc_result.c +++ b/aqhome/ipc/msg_ipc_result.c @@ -26,24 +26,21 @@ #define AQH_MSGIPC_RESULT_OFFS_RESULTCODE 0 /* 4 bytes */ -//#define AQH_MSGIPC_RESULT_MINSIZE (GWEN_MSGIPC_OFFS_PAYLOAD+AQH_MSGIPC_RESULT_OFFS_RESULTCODE+4) -#define AQH_MSGIPC_RESULT_MINSIZE (AQH_MSGIPC_RESULT_OFFS_RESULTCODE+4) +#define AQH_MSGIPC_RESULT_PAYLOADSIZE (AQH_MSGIPC_RESULT_OFFS_RESULTCODE+4) +#define AQH_MSGIPC_RESULT_MINSIZE (GWEN_MSGIPC_OFFS_PAYLOAD+AQH_MSGIPC_RESULT_PAYLOADSIZE) -GWEN_MSG *AQH_ResultIpcMsg_new(uint16_t code, uint32_t resultCode) +GWEN_MSG *AQH_ResultIpcMsg_new(uint16_t code, uint32_t msgId, uint32_t refMsgId, uint32_t resultCode) { GWEN_MSG *msg; uint8_t *ptr; - msg=GWEN_IpcMsg_new(AQH_IPC_PROTOCOL_RESULT_ID, AQH_IPC_PROTOCOL_RESULT_VERSION, code, AQH_MSGIPC_RESULT_MINSIZE, NULL); - ptr=GWEN_Msg_GetBuffer(msg); - ptr[GWEN_MSGIPC_OFFS_PAYLOAD+AQH_MSGIPC_RESULT_OFFS_RESULTCODE+0]=resultCode & 0xff; - ptr[GWEN_MSGIPC_OFFS_PAYLOAD+AQH_MSGIPC_RESULT_OFFS_RESULTCODE+1]=(resultCode>>8) & 0xff; - ptr[GWEN_MSGIPC_OFFS_PAYLOAD+AQH_MSGIPC_RESULT_OFFS_RESULTCODE+2]=(resultCode>>16) & 0xff; - ptr[GWEN_MSGIPC_OFFS_PAYLOAD+AQH_MSGIPC_RESULT_OFFS_RESULTCODE+3]=(resultCode>>24) & 0xff; - + msg=GWEN_IpcMsg_new(AQH_IPC_PROTOCOL_RESULT_ID, AQH_IPC_PROTOCOL_RESULT_VERSION, code, + msgId, refMsgId, + AQH_MSGIPC_RESULT_PAYLOADSIZE, NULL); + GWEN_Msg_AddUint32(msg, resultCode); return msg; } @@ -62,11 +59,13 @@ void AQH_ResultIpcMsg_DumpToBuffer(const GWEN_MSG *msg, GWEN_BUFFER *dbuf, const { if (GWEN_Msg_GetBytesInBuffer(msg)>=AQH_MSGIPC_RESULT_MINSIZE) { GWEN_Buffer_AppendArgs(dbuf, - "ERROR (code=%d, proto=%d, proto version=%d, error=%d)\n", + "ERROR (code=%d, proto=%d, proto version=%d, error=%d, msgId=%d, refMsgId=%d)\n", GWEN_IpcMsg_GetCode(msg), GWEN_IpcMsg_GetProtoId(msg), GWEN_IpcMsg_GetProtoVersion(msg), - AQH_ResultIpcMsg_GetResultCode(msg)); + AQH_ResultIpcMsg_GetResultCode(msg), + GWEN_IpcMsg_GetMsgId(msg), + GWEN_IpcMsg_GetRefMsgId(msg)); } } diff --git a/aqhome/ipc/msg_ipc_result.h b/aqhome/ipc/msg_ipc_result.h index 91788e5..57557c9 100644 --- a/aqhome/ipc/msg_ipc_result.h +++ b/aqhome/ipc/msg_ipc_result.h @@ -32,7 +32,7 @@ #define AQH_MSG_IPC_ERROR_NOTFOUND 7 -AQHOME_API GWEN_MSG *AQH_ResultIpcMsg_new(uint16_t code, uint32_t resultCode); +AQHOME_API GWEN_MSG *AQH_ResultIpcMsg_new(uint16_t code, uint32_t msgId, uint32_t refMsgId, uint32_t resultCode); AQHOME_API uint32_t AQH_ResultIpcMsg_GetResultCode(const GWEN_MSG *msg); AQHOME_API void AQH_ResultIpcMsg_DumpToBuffer(const GWEN_MSG *msg, GWEN_BUFFER *dbuf, const char *sText); diff --git a/aqhome/ipc/msg_ipc_tag16.c b/aqhome/ipc/msg_ipc_tag16.c index 733971d..d0c9446 100644 --- a/aqhome/ipc/msg_ipc_tag16.c +++ b/aqhome/ipc/msg_ipc_tag16.c @@ -36,11 +36,13 @@ GWEN_INHERIT(GWEN_MSG, AQH_MSG_IPC_TAG16); -GWEN_MSG *AQH_Tag16IpcMsg_new(uint8_t protoId, uint8_t protoVer, uint16_t code, uint32_t payloadLen, const uint8_t *payload) +GWEN_MSG *AQH_Tag16IpcMsg_new(uint8_t protoId, uint8_t protoVer, uint16_t code, + uint32_t msgId, uint32_t refMsgId, + uint32_t payloadLen, const uint8_t *payload) { GWEN_MSG *msg; - msg=GWEN_IpcMsg_new(protoId, protoVer, code, payloadLen, payload); + msg=GWEN_IpcMsg_new(protoId, protoVer, code, msgId, refMsgId, payloadLen, payload); AQH_Tag16IpcMsg_Extend(msg); return msg; } diff --git a/aqhome/ipc/msg_ipc_tag16.h b/aqhome/ipc/msg_ipc_tag16.h index 5e8465f..43c5b1b 100644 --- a/aqhome/ipc/msg_ipc_tag16.h +++ b/aqhome/ipc/msg_ipc_tag16.h @@ -17,7 +17,9 @@ #include -AQHOME_API GWEN_MSG *AQH_Tag16IpcMsg_new(uint8_t protoId, uint8_t protoVer, uint16_t code, uint32_t payloadLen, const uint8_t *payload); +AQHOME_API GWEN_MSG *AQH_Tag16IpcMsg_new(uint8_t protoId, uint8_t protoVer, uint16_t code, + uint32_t msgId, uint32_t refMsgId, + uint32_t payloadLen, const uint8_t *payload); AQHOME_API void AQH_Tag16IpcMsg_ExtendAndParse(GWEN_MSG *msg, int doCopy); AQHOME_API void AQH_Tag16IpcMsg_Extend(GWEN_MSG *msg); diff --git a/aqhome/ipc/nodes/ipc_nodes.h b/aqhome/ipc/nodes/ipc_nodes.h index 2e6e08b..88d60e9 100644 --- a/aqhome/ipc/nodes/ipc_nodes.h +++ b/aqhome/ipc/nodes/ipc_nodes.h @@ -20,14 +20,14 @@ #define AQH_IPC_PROTOCOL_NODES_VERSION 1 -#define AQH_MSGTYPE_IPC_NODES_RESULT 0x001 +#define AQH_MSGTYPE_IPC_NODES_RESULT 0xf001 -#define AQH_MSGTYPE_IPC_NODES_FORWARD 0x100 -#define AQH_MSGTYPE_IPC_NODES_VALUE 0x200 -#define AQH_MSGTYPE_IPC_NODES_PING 0x300 -#define AQH_MSGTYPE_IPC_NODES_SETACCMSGGRPS 0x400 -#define AQH_MSGTYPE_IPC_NODES_GETDEVICES_REQ 0x500 -#define AQH_MSGTYPE_IPC_NODES_GETDEVICES_RSP 0x600 +#define AQH_MSGTYPE_IPC_NODES_FORWARD 0xf100 +#define AQH_MSGTYPE_IPC_NODES_VALUE 0xf200 +#define AQH_MSGTYPE_IPC_NODES_PING 0xf300 +#define AQH_MSGTYPE_IPC_NODES_SETACCMSGGRPS 0xf400 +#define AQH_MSGTYPE_IPC_NODES_GETDEVICES_REQ 0xf500 +#define AQH_MSGTYPE_IPC_NODES_GETDEVICES_RSP 0xf600 diff --git a/aqhome/ipc/nodes/msg_ipc_forward.c b/aqhome/ipc/nodes/msg_ipc_forward.c index fc6bb10..0cbfd54 100644 --- a/aqhome/ipc/nodes/msg_ipc_forward.c +++ b/aqhome/ipc/nodes/msg_ipc_forward.c @@ -30,9 +30,11 @@ -GWEN_MSG *AQH_ForwardIpcMsg_new(uint16_t code, const uint8_t *ptr, uint32_t len) +GWEN_MSG *AQH_ForwardIpcMsg_new(uint16_t code, + uint32_t msgId, uint32_t refMsgId, + const uint8_t *ptr, uint32_t len) { - return GWEN_IpcMsg_new(AQH_IPC_PROTOCOL_NODES_ID, AQH_IPC_PROTOCOL_NODES_VERSION, code, len, ptr); + return GWEN_IpcMsg_new(AQH_IPC_PROTOCOL_NODES_ID, AQH_IPC_PROTOCOL_NODES_VERSION, code, msgId, refMsgId, len, ptr); } diff --git a/aqhome/ipc/nodes/msg_ipc_forward.h b/aqhome/ipc/nodes/msg_ipc_forward.h index db54a35..608920f 100644 --- a/aqhome/ipc/nodes/msg_ipc_forward.h +++ b/aqhome/ipc/nodes/msg_ipc_forward.h @@ -19,7 +19,7 @@ -AQHOME_API GWEN_MSG *AQH_ForwardIpcMsg_new(uint16_t code, const uint8_t *ptr, uint32_t len); +AQHOME_API GWEN_MSG *AQH_ForwardIpcMsg_new(uint16_t code, uint32_t msgId, uint32_t refMsgId, const uint8_t *ptr, uint32_t len); AQHOME_API const uint8_t *AQH_ForwardIpcMsg_GetMsgPtr(const GWEN_MSG *msg); AQHOME_API uint32_t AQH_ForwardIpcMsg_GetMsgLen(const GWEN_MSG *msg); AQHOME_API GWEN_MSG *AQH_ForwardIpcMsg_GetCopyOfNodeMsg(const GWEN_MSG *msg); diff --git a/aqhome/ipc/nodes/msg_ipc_getdevices_req.c b/aqhome/ipc/nodes/msg_ipc_getdevices_req.c index 9d78016..c13e52e 100644 --- a/aqhome/ipc/nodes/msg_ipc_getdevices_req.c +++ b/aqhome/ipc/nodes/msg_ipc_getdevices_req.c @@ -23,14 +23,16 @@ #include -#define AQH_MSGIPC_GETDEVICES_REQ_MINSIZE (GWEN_MSGIPC_OFFS_PAYLOAD) +#define AQH_MSGIPC_GETDEVICES_REQ_PAYLOADSIZE 0 +#define AQH_MSGIPC_GETDEVICES_REQ_MINSIZE (GWEN_MSGIPC_OFFS_PAYLOAD+AQH_MSGIPC_GETDEVICES_REQ_PAYLOADSIZE) -GWEN_MSG *AQH_GetDevicesRequestIpcMsg_new(uint16_t code) +GWEN_MSG *AQH_GetDevicesRequestIpcMsg_new(uint16_t code, uint32_t msgId, uint32_t refMsgId) { - return GWEN_IpcMsg_new(AQH_IPC_PROTOCOL_NODES_ID, AQH_IPC_PROTOCOL_NODES_VERSION, code, AQH_MSGIPC_GETDEVICES_REQ_MINSIZE, NULL); + return GWEN_IpcMsg_new(AQH_IPC_PROTOCOL_NODES_ID, AQH_IPC_PROTOCOL_NODES_VERSION, code, + msgId, refMsgId, AQH_MSGIPC_GETDEVICES_REQ_PAYLOADSIZE, NULL); } @@ -39,10 +41,13 @@ void AQH_GetDevicesRequestIpcMsg_DumpToBuffer(const GWEN_MSG *msg, GWEN_BUFFER * { if (GWEN_Msg_GetBytesInBuffer(msg)>=AQH_MSGIPC_GETDEVICES_REQ_MINSIZE) { GWEN_Buffer_AppendArgs(dbuf, - "GET_DEVICES REQ (code=%d, proto=%d, proto version=%d)\n", + "GET_DEVICES REQ %s (code=%d, proto=%d, proto version=%d, msgId=%d, refMsgId=%d)\n", + sText?sText:"", GWEN_IpcMsg_GetCode(msg), GWEN_IpcMsg_GetProtoId(msg), - GWEN_IpcMsg_GetProtoVersion(msg)); + GWEN_IpcMsg_GetProtoVersion(msg), + GWEN_IpcMsg_GetMsgId(msg), + GWEN_IpcMsg_GetRefMsgId(msg)); } } diff --git a/aqhome/ipc/nodes/msg_ipc_getdevices_req.h b/aqhome/ipc/nodes/msg_ipc_getdevices_req.h index ad9336e..01cf3ed 100644 --- a/aqhome/ipc/nodes/msg_ipc_getdevices_req.h +++ b/aqhome/ipc/nodes/msg_ipc_getdevices_req.h @@ -17,7 +17,7 @@ #include -AQHOME_API GWEN_MSG *AQH_GetDevicesRequestIpcMsg_new(uint16_t code); +AQHOME_API GWEN_MSG *AQH_GetDevicesRequestIpcMsg_new(uint16_t code, uint32_t msgId, uint32_t refMsgId); AQHOME_API void AQH_GetDevicesRequestIpcMsg_DumpToBuffer(const GWEN_MSG *msg, GWEN_BUFFER *dbuf, const char *sText); diff --git a/aqhome/ipc/nodes/msg_ipc_getdevices_rsp.c b/aqhome/ipc/nodes/msg_ipc_getdevices_rsp.c index 322f763..c747cf7 100644 --- a/aqhome/ipc/nodes/msg_ipc_getdevices_rsp.c +++ b/aqhome/ipc/nodes/msg_ipc_getdevices_rsp.c @@ -42,39 +42,31 @@ #define AQH_MSGIPC_GETDEVICES_RSP_MINSIZE (GWEN_MSGIPC_OFFS_PAYLOAD+AQH_MSGIPC_GETDEVICES_RSP_OFFS_IO+2) -static void _addU16t(uint8_t **pPtr, uint16_t i); -static void _addU32t(uint8_t **pPtr, uint32_t i); -static void _addU64t(uint8_t **pPtr, uint64_t i); - - -GWEN_MSG *AQH_GetDevicesResponseIpcMsg_new(uint16_t code, uint8_t flags, const AQH_NODE_INFO *ni) +GWEN_MSG *AQH_GetDevicesResponseIpcMsg_new(uint16_t code, uint32_t msgId, uint32_t refMsgId, uint8_t flags, const AQH_NODE_INFO *ni) { GWEN_MSG *msg; - uint8_t *ptr; const GWEN_TIMESTAMP *t; - msg=GWEN_IpcMsg_new(AQH_IPC_PROTOCOL_NODES_ID, AQH_IPC_PROTOCOL_NODES_VERSION, code, AQH_MSGIPC_GETDEVICES_RSP_MINSIZE, NULL); - ptr=GWEN_Msg_GetBuffer(msg)+GWEN_MSGIPC_OFFS_PAYLOAD; + msg=GWEN_IpcMsg_new(AQH_IPC_PROTOCOL_NODES_ID, AQH_IPC_PROTOCOL_NODES_VERSION, code, msgId, refMsgId, 0, NULL); + GWEN_Msg_AddUint8(msg, flags & 0xff); + GWEN_Msg_AddUint8(msg, AQH_NodeInfo_GetBusAddress(ni)); + GWEN_Msg_AddUint32(msg, AQH_NodeInfo_GetUid(ni)); - *(ptr++)=flags & 0xff; - - *(ptr++)=AQH_NodeInfo_GetBusAddress(ni); - _addU32t(&ptr, AQH_NodeInfo_GetUid(ni)); - - _addU32t(&ptr, AQH_NodeInfo_GetManufacturer(ni)); - _addU16t(&ptr, AQH_NodeInfo_GetDeviceType(ni)); - _addU16t(&ptr, AQH_NodeInfo_GetDeviceVersion(ni)); - _addU32t(&ptr, AQH_NodeInfo_GetFirmwareVersion(ni)); + GWEN_Msg_AddUint32(msg, AQH_NodeInfo_GetManufacturer(ni)); + GWEN_Msg_AddUint16(msg, AQH_NodeInfo_GetDeviceType(ni)); + GWEN_Msg_AddUint16(msg, AQH_NodeInfo_GetDeviceVersion(ni)); + GWEN_Msg_AddUint32(msg, AQH_NodeInfo_GetFirmwareVersion(ni)); t=AQH_NodeInfo_GetTimestampLastChange(ni); - _addU64t(&ptr, t?((uint64_t)GWEN_Timestamp_toInt64(t)):0L); + GWEN_Msg_AddUint64(msg, t?((uint64_t)GWEN_Timestamp_toInt64(t)):0L); - _addU16t(&ptr, AQH_NodeInfo_GetStatsPacketsOut(ni)); - _addU16t(&ptr, AQH_NodeInfo_GetStatsPacketsIn(ni)); - _addU16t(&ptr, AQH_NodeInfo_GetStatsCollisions(ni)); - _addU16t(&ptr, AQH_NodeInfo_GetStatsBusy(ni)); - _addU16t(&ptr, AQH_NodeInfo_GetStatsCrcErrors(ni)); - _addU16t(&ptr, AQH_NodeInfo_GetStatsIoErrors(ni)); + GWEN_Msg_AddUint16(msg, AQH_NodeInfo_GetStatsPacketsOut(ni)); + GWEN_Msg_AddUint16(msg, AQH_NodeInfo_GetStatsPacketsIn(ni)); + GWEN_Msg_AddUint16(msg, AQH_NodeInfo_GetStatsCollisions(ni)); + GWEN_Msg_AddUint16(msg, AQH_NodeInfo_GetStatsBusy(ni)); + GWEN_Msg_AddUint16(msg, AQH_NodeInfo_GetStatsCrcErrors(ni)); + GWEN_Msg_AddUint16(msg, AQH_NodeInfo_GetStatsIoErrors(ni)); + GWEN_IpcMsg_AdjustMsgSize(msg); return msg; } @@ -132,11 +124,7 @@ uint32_t AQH_GetDevicesResponseIpcMsg_GetFirmwareVersion(const GWEN_MSG *msg) int64_t AQH_GetDevicesResponseIpcMsg_GetTimestamp(const GWEN_MSG *msg) { - uint64_t v; - - v=(uint64_t) GWEN_Msg_GetUint32At(msg, GWEN_MSGIPC_OFFS_PAYLOAD+AQH_MSGIPC_GETDEVICES_RSP_OFFS_LASTCHG, 0); - v|=((uint64_t)GWEN_Msg_GetUint32At(msg, GWEN_MSGIPC_OFFS_PAYLOAD+AQH_MSGIPC_GETDEVICES_RSP_OFFS_LASTCHG+4, 0))<<32; - return (int64_t) v; + return GWEN_Msg_GetUint64At(msg, GWEN_MSGIPC_OFFS_PAYLOAD+AQH_MSGIPC_GETDEVICES_RSP_OFFS_LASTCHG, 0); } @@ -199,49 +187,3 @@ void AQH_GetDevicesResponseIpcMsg_DumpToBuffer(const GWEN_MSG *msg, GWEN_BUFFER } - -void _addU16t(uint8_t **pPtr, uint16_t i) -{ - uint8_t *ptr=*pPtr; - - *(ptr++)=i & 0xff; - *(ptr++)=(i>>8) & 0xff; - *pPtr=ptr; -} - - - -void _addU32t(uint8_t **pPtr, uint32_t i) -{ - uint8_t *ptr=*pPtr; - - *(ptr++)=i & 0xff; - *(ptr++)=(i>>8) & 0xff; - *(ptr++)=(i>>16) & 0xff; - *(ptr++)=(i>>24) & 0xff; - *pPtr=ptr; -} - - - -void _addU64t(uint8_t **pPtr, uint64_t i) -{ - uint8_t *ptr=*pPtr; - - *(ptr++)=i & 0xff; - *(ptr++)=(i>>8) & 0xff; - *(ptr++)=(i>>16) & 0xff; - *(ptr++)=(i>>24) & 0xff; - *(ptr++)=(i>>32) & 0xff; - *(ptr++)=(i>>40) & 0xff; - *(ptr++)=(i>>48) & 0xff; - *(ptr++)=(i>>56) & 0xff; - *pPtr=ptr; -} - - - - - - - diff --git a/aqhome/ipc/nodes/msg_ipc_getdevices_rsp.h b/aqhome/ipc/nodes/msg_ipc_getdevices_rsp.h index 1146e0b..0c639d4 100644 --- a/aqhome/ipc/nodes/msg_ipc_getdevices_rsp.h +++ b/aqhome/ipc/nodes/msg_ipc_getdevices_rsp.h @@ -21,7 +21,9 @@ #define AQH_MSGIPC_GETDEVICES_RSP_FLAGS_LAST 0x01 -AQHOME_API GWEN_MSG *AQH_GetDevicesResponseIpcMsg_new(uint16_t code, uint8_t flags, const AQH_NODE_INFO *ni); +AQHOME_API GWEN_MSG *AQH_GetDevicesResponseIpcMsg_new(uint16_t code, + uint32_t msgId, uint32_t refMsgId, + uint8_t flags, const AQH_NODE_INFO *ni); AQHOME_API uint8_t AQH_GetDevicesResponseIpcMsg_GetFlags(const GWEN_MSG *msg); AQHOME_API uint8_t AQH_GetDevicesResponseIpcMsg_GetBusAddress(const GWEN_MSG *msg); diff --git a/aqhome/ipc/nodes/msg_ipc_ping.c b/aqhome/ipc/nodes/msg_ipc_ping.c index f231d90..d268dd3 100644 --- a/aqhome/ipc/nodes/msg_ipc_ping.c +++ b/aqhome/ipc/nodes/msg_ipc_ping.c @@ -25,17 +25,20 @@ #define AQH_MSGIPC_PING_OFFS_DESTADDR 0 /* 1 bytes */ -#define AQH_MSGIPC_PING_MINSIZE (GWEN_MSGIPC_OFFS_PAYLOAD+1) +#define AQH_MSGIPC_PING_PAYLOADSIZE 1 +#define AQH_MSGIPC_PING_MINSIZE (GWEN_MSGIPC_OFFS_PAYLOAD+AQH_MSGIPC_PING_PAYLOADSIZE) -GWEN_MSG *AQH_PingIpcMsg_new(uint16_t code, uint8_t destAddr) +GWEN_MSG *AQH_PingIpcMsg_new(uint16_t code, uint32_t msgId, uint32_t refMsgId, uint8_t destAddr) { GWEN_MSG *msg; uint8_t *ptr; - msg=GWEN_IpcMsg_new(AQH_IPC_PROTOCOL_NODES_ID, AQH_IPC_PROTOCOL_NODES_VERSION, code, AQH_MSGIPC_PING_MINSIZE, NULL); + msg=GWEN_IpcMsg_new(AQH_IPC_PROTOCOL_NODES_ID, AQH_IPC_PROTOCOL_NODES_VERSION, code, + msgId, refMsgId, + AQH_MSGIPC_PING_PAYLOADSIZE, NULL); ptr=GWEN_Msg_GetBuffer(msg); ptr[GWEN_MSGIPC_OFFS_PAYLOAD+AQH_MSGIPC_PING_OFFS_DESTADDR]=destAddr & 0xff; @@ -55,7 +58,8 @@ void AQH_PingIpcMsg_DumpToBuffer(const GWEN_MSG *msg, GWEN_BUFFER *dbuf, const c { if (GWEN_Msg_GetBytesInBuffer(msg)>=AQH_MSGIPC_PING_MINSIZE) { GWEN_Buffer_AppendArgs(dbuf, - "PING (code=%d, proto=%d, proto version=%d, dest addr=%02x)\n", + "PING %s (code=%d, proto=%d, proto version=%d, dest addr=%02x)\n", + sText?sText:"", GWEN_IpcMsg_GetCode(msg), GWEN_IpcMsg_GetProtoId(msg), GWEN_IpcMsg_GetProtoVersion(msg), diff --git a/aqhome/ipc/nodes/msg_ipc_ping.h b/aqhome/ipc/nodes/msg_ipc_ping.h index 568ae40..4c348a2 100644 --- a/aqhome/ipc/nodes/msg_ipc_ping.h +++ b/aqhome/ipc/nodes/msg_ipc_ping.h @@ -17,7 +17,7 @@ #include -AQHOME_API GWEN_MSG *AQH_PingIpcMsg_new(uint16_t code, uint8_t destAddr); +AQHOME_API GWEN_MSG *AQH_PingIpcMsg_new(uint16_t code, uint32_t msgId, uint32_t refMsgId, uint8_t destAddr); AQHOME_API uint8_t AQH_PingIpcMsg_GetDestAddr(const GWEN_MSG *msg); diff --git a/aqhome/ipc/nodes/msg_ipc_setaccmsggrps.c b/aqhome/ipc/nodes/msg_ipc_setaccmsggrps.c index f547751..35f5dec 100644 --- a/aqhome/ipc/nodes/msg_ipc_setaccmsggrps.c +++ b/aqhome/ipc/nodes/msg_ipc_setaccmsggrps.c @@ -25,23 +25,21 @@ #define AQH_MSGIPC_SETACCEPTEDMSGGRPS_OFFS_GROUPS 0 /* 4 bytes */ -#define AQH_MSGIPC_SETACCEPTEDMSGGRPS_MINSIZE (GWEN_MSGIPC_OFFS_PAYLOAD+4) +#define AQH_MSGIPC_SETACCEPTEDMSGGRPS_PAYLOADSIZE (AQH_MSGIPC_SETACCEPTEDMSGGRPS_OFFS_GROUPS+4) +#define AQH_MSGIPC_SETACCEPTEDMSGGRPS_MINSIZE (GWEN_MSGIPC_OFFS_PAYLOAD+AQH_MSGIPC_SETACCEPTEDMSGGRPS_PAYLOADSIZE) -GWEN_MSG *AQH_SetAcceptedMsgGroupsIpcMsg_new(uint16_t code, uint32_t groups) +GWEN_MSG *AQH_SetAcceptedMsgGroupsIpcMsg_new(uint16_t code, uint32_t msgId, uint32_t refMsgId, uint32_t groups) { GWEN_MSG *msg; uint8_t *ptr; - msg=GWEN_IpcMsg_new(AQH_IPC_PROTOCOL_NODES_ID, AQH_IPC_PROTOCOL_NODES_VERSION, code, AQH_MSGIPC_SETACCEPTEDMSGGRPS_MINSIZE, NULL); - ptr=GWEN_Msg_GetBuffer(msg); - ptr[GWEN_MSGIPC_OFFS_PAYLOAD+AQH_MSGIPC_SETACCEPTEDMSGGRPS_OFFS_GROUPS+0]=groups & 0xff; - ptr[GWEN_MSGIPC_OFFS_PAYLOAD+AQH_MSGIPC_SETACCEPTEDMSGGRPS_OFFS_GROUPS+1]=(groups>>8) & 0xff; - ptr[GWEN_MSGIPC_OFFS_PAYLOAD+AQH_MSGIPC_SETACCEPTEDMSGGRPS_OFFS_GROUPS+2]=(groups>>16) & 0xff; - ptr[GWEN_MSGIPC_OFFS_PAYLOAD+AQH_MSGIPC_SETACCEPTEDMSGGRPS_OFFS_GROUPS+3]=(groups>>24) & 0xff; - + msg=GWEN_IpcMsg_new(AQH_IPC_PROTOCOL_NODES_ID, AQH_IPC_PROTOCOL_NODES_VERSION, code, + msgId, refMsgId, + AQH_MSGIPC_SETACCEPTEDMSGGRPS_PAYLOADSIZE, NULL); + GWEN_Msg_AddUint32(msg, groups); return msg; } @@ -68,5 +66,3 @@ void AQH_SetAcceptedMsgGroupsIpcMsg_DumpToBuffer(const GWEN_MSG *msg, GWEN_BUFFE - - diff --git a/aqhome/ipc/nodes/msg_ipc_setaccmsggrps.h b/aqhome/ipc/nodes/msg_ipc_setaccmsggrps.h index f61fdf7..7c4b513 100644 --- a/aqhome/ipc/nodes/msg_ipc_setaccmsggrps.h +++ b/aqhome/ipc/nodes/msg_ipc_setaccmsggrps.h @@ -17,7 +17,7 @@ #include -AQHOME_API GWEN_MSG *AQH_SetAcceptedMsgGroupsIpcMsg_new(uint16_t code, uint32_t groups); +AQHOME_API GWEN_MSG *AQH_SetAcceptedMsgGroupsIpcMsg_new(uint16_t code, uint32_t msgId, uint32_t refMsgId, uint32_t groups); AQHOME_API uint32_t AQH_SetAcceptedMsgGroupsIpcMsg_GetMsgGroups(const GWEN_MSG *msg); diff --git a/aqhome/ipc/nodes/msg_ipc_value.c b/aqhome/ipc/nodes/msg_ipc_value.c index 4fd3047..365f744 100644 --- a/aqhome/ipc/nodes/msg_ipc_value.c +++ b/aqhome/ipc/nodes/msg_ipc_value.c @@ -29,12 +29,13 @@ #define AQH_MSGIPC_VALUE_OFFS_VALUE_NOM 6 /* 2 bytes */ #define AQH_MSGIPC_VALUE_OFFS_VALUE_DENOM 8 /* 2 bytes */ -#define AQH_MSGIPC_VALUE_MINSIZE (GWEN_MSGIPC_OFFS_PAYLOAD+10) +#define AQH_MSGIPC_VALUE_PAYLOADIZE (AQH_MSGIPC_VALUE_OFFS_UID+10) +#define AQH_MSGIPC_VALUE_MINSIZE (GWEN_MSGIPC_OFFS_PAYLOAD+AQH_MSGIPC_VALUE_PAYLOADIZE) -GWEN_MSG *AQH_ValueIpcMsg_new(uint16_t code, +GWEN_MSG *AQH_ValueIpcMsg_new(uint16_t code, uint32_t msgId, uint32_t refMsgId, uint32_t uid, uint8_t valueId, uint8_t valueType, @@ -44,21 +45,13 @@ GWEN_MSG *AQH_ValueIpcMsg_new(uint16_t code, GWEN_MSG *msg; uint8_t *ptr; - msg=GWEN_IpcMsg_new(AQH_IPC_PROTOCOL_NODES_ID, AQH_IPC_PROTOCOL_NODES_VERSION, code, AQH_MSGIPC_VALUE_MINSIZE, NULL); - ptr=GWEN_Msg_GetBuffer(msg); - ptr[GWEN_MSGIPC_OFFS_PAYLOAD+AQH_MSGIPC_VALUE_OFFS_UID+0]=uid & 0xff; - ptr[GWEN_MSGIPC_OFFS_PAYLOAD+AQH_MSGIPC_VALUE_OFFS_UID+1]=(uid>>8) & 0xff; - ptr[GWEN_MSGIPC_OFFS_PAYLOAD+AQH_MSGIPC_VALUE_OFFS_UID+2]=(uid>>16) & 0xff; - ptr[GWEN_MSGIPC_OFFS_PAYLOAD+AQH_MSGIPC_VALUE_OFFS_UID+3]=(uid>>24) & 0xff; - - ptr[GWEN_MSGIPC_OFFS_PAYLOAD+AQH_MSGIPC_VALUE_OFFS_VALUEID]=valueId; - ptr[GWEN_MSGIPC_OFFS_PAYLOAD+AQH_MSGIPC_VALUE_OFFS_VALUETYPE]=valueType; - - ptr[GWEN_MSGIPC_OFFS_PAYLOAD+AQH_MSGIPC_VALUE_OFFS_VALUE_NOM+0]=valueNom & 0xff; - ptr[GWEN_MSGIPC_OFFS_PAYLOAD+AQH_MSGIPC_VALUE_OFFS_VALUE_NOM+1]=(valueNom>>8) & 0xff; - - ptr[GWEN_MSGIPC_OFFS_PAYLOAD+AQH_MSGIPC_VALUE_OFFS_VALUE_DENOM+0]=valueDenom & 0xff; - ptr[GWEN_MSGIPC_OFFS_PAYLOAD+AQH_MSGIPC_VALUE_OFFS_VALUE_DENOM+1]=(valueDenom>>8) & 0xff; + msg=GWEN_IpcMsg_new(AQH_IPC_PROTOCOL_NODES_ID, AQH_IPC_PROTOCOL_NODES_VERSION, code, + msgId, refMsgId, AQH_MSGIPC_VALUE_PAYLOADIZE, NULL); + GWEN_Msg_AddUint32(msg, uid); + GWEN_Msg_AddUint8(msg, valueId); + GWEN_Msg_AddUint8(msg, valueType); + GWEN_Msg_AddUint16(msg, valueNom); + GWEN_Msg_AddUint16(msg, valueDenom); return msg; } diff --git a/aqhome/ipc/nodes/msg_ipc_value.h b/aqhome/ipc/nodes/msg_ipc_value.h index 96112dc..0e5ceb9 100644 --- a/aqhome/ipc/nodes/msg_ipc_value.h +++ b/aqhome/ipc/nodes/msg_ipc_value.h @@ -19,7 +19,7 @@ -AQHOME_API GWEN_MSG *AQH_ValueIpcMsg_new(uint16_t code, +AQHOME_API GWEN_MSG *AQH_ValueIpcMsg_new(uint16_t code, uint32_t msgId, uint32_t refMsgId, uint32_t uid, uint8_t valueId, uint8_t valueType, diff --git a/aqhome/nodes/nodedb.c b/aqhome/nodes/nodedb.c index 3627d2f..51b4462 100644 --- a/aqhome/nodes/nodedb.c +++ b/aqhome/nodes/nodedb.c @@ -141,13 +141,25 @@ void AQH_NodeDb_fromDb(AQH_NODE_DB *ndb, GWEN_DB_NODE *dbDatabase) GWEN_DB_NODE *dbNodeInfo; AQH_NodeInfo_List_Clear(ndb->nodeList); + dbNodeInfo=GWEN_DB_FindFirstGroup(dbDatabase, "nodeinfo"); while(dbNodeInfo) { AQH_NODE_INFO *ni; ni=AQH_NodeInfo_fromDb(dbNodeInfo); - if (ni) + if (ni) { + const char *deviceId; + + deviceId=AQH_NodeInfo_GetDeviceId(ni); + DBG_ERROR(AQH_LOGDOMAIN, + "Adding node %08x (%s, %04x:%02x:%04x)", + AQH_NodeInfo_GetUid(ni), + deviceId?deviceId:"", + AQH_NodeInfo_GetManufacturer(ni), + AQH_NodeInfo_GetDeviceType(ni), + AQH_NodeInfo_GetDeviceVersion(ni)); AQH_NodeInfo_List_Add(ni, ndb->nodeList); + } dbNodeInfo=GWEN_DB_FindNextGroup(dbNodeInfo, "nodeinfo"); } diff --git a/aqhome/nodes/nodeinfo.t2d b/aqhome/nodes/nodeinfo.t2d index dc669ff..be760b0 100644 --- a/aqhome/nodes/nodeinfo.t2d +++ b/aqhome/nodes/nodeinfo.t2d @@ -31,6 +31,13 @@ + + + NULL + NULL + public + own + 0 diff --git a/devices/0BUILD b/devices/0BUILD index 130ecec..ab132ae 100644 --- a/devices/0BUILD +++ b/devices/0BUILD @@ -4,6 +4,7 @@ mqtt + nodes diff --git a/devices/nodes/0BUILD b/devices/nodes/0BUILD new file mode 100644 index 0000000..4de8895 --- /dev/null +++ b/devices/nodes/0BUILD @@ -0,0 +1,9 @@ + + + + + aqua_n11.xml + aqua_n14.xml + + + diff --git a/devices/nodes/aqua_n11.xml b/devices/nodes/aqua_n11.xml new file mode 100644 index 0000000..05af1a0 --- /dev/null +++ b/devices/nodes/aqua_n11.xml @@ -0,0 +1,17 @@ + + + AQUA + N + 11 + + + + + + + + + + + + diff --git a/devices/nodes/aqua_n14.xml b/devices/nodes/aqua_n14.xml new file mode 100644 index 0000000..c06bfbf --- /dev/null +++ b/devices/nodes/aqua_n14.xml @@ -0,0 +1,19 @@ + + + AQUA + N + 14 + + + + + + + + + + + + + +