Simplified IPC code to use less different IPC messages. Share more code. More qork on MQTT code.

This commit is contained in:
Martin Preuss
2023-10-01 21:31:02 +02:00
parent 0f896c1729
commit 1e27223dfa
50 changed files with 1326 additions and 698 deletions

View File

@@ -291,12 +291,18 @@ void _sendCommand(GWEN_MSG_ENDPOINT *epTcp, const char *valueName, const char *v
GWEN_MSG *msgOut;
union {double f; uint64_t i;} u;
uint64_t arrayToSend[2];
AQH_VALUE *value;
u.f=dataToSend;
arrayToSend[0]=timestampToSend;
arrayToSend[1]=u.i;
msgOut=AQH_MultiDataDataIpcMsg_new(AQH_MSGTYPE_IPC_DATA_UPDATEDATA, valueName, valueUnits, 0, arrayToSend, 1);
value=AQH_Value_new();
AQH_Value_SetNameForDriver(value, valueName);
AQH_Value_SetValueUnits(value, valueUnits);
msgOut=AQH_MultiDataDataIpcMsg_new(AQH_MSGTYPE_IPC_DATA_UPDATEDATA, value, arrayToSend, 1);
AQH_Value_free(value);
GWEN_MsgEndpoint_AddSendMessage(epTcp, msgOut);
}

View File

@@ -15,8 +15,8 @@
#include "aqhome/msg/msg_node.h"
#include "aqhome/ipc/msg_ipc_result.h"
#include "aqhome/ipc/data/msg_data_value.h"
#include "aqhome/ipc/data/msg_data_singledata.h"
#include "aqhome/ipc/data/msg_data_getdata.h"
#include "aqhome/ipc/data/msg_data_multidata.h"
#include "aqhome/ipc/data/ipc_data.h"
#include "aqhome/ipc/msg_ipc_tag16.h"
@@ -41,7 +41,7 @@
static int _doGetLastDataPoint(GWEN_DB_NODE *dbArgs);
static void _sendCommand(GWEN_MSG_ENDPOINT *epTcp, const char *valueName);
static int _awaitAndHandleResponse(GWEN_MSG_ENDPOINT *epTcp, int timeoutInSeconds);
static int _handleDataResponse(const GWEN_MSG *msg);
static int _handleDataResponse(GWEN_MSG *msg);
@@ -208,7 +208,7 @@ void _sendCommand(GWEN_MSG_ENDPOINT *epTcp, const char *valueName)
{
GWEN_MSG *msgOut;
msgOut=AQH_ValueDataIpcMsg_new(AQH_MSGTYPE_IPC_DATA_GETLASTDATA_REQ, valueName, NULL, 0);
msgOut=AQH_GetDataDataIpcMsg_new(AQH_MSGTYPE_IPC_DATA_GETLASTDATA_REQ, valueName, 0, 0);
GWEN_MsgEndpoint_AddSendMessage(epTcp, msgOut);
}
@@ -251,35 +251,32 @@ int _awaitAndHandleResponse(GWEN_MSG_ENDPOINT *epTcp, int timeoutInSeconds)
int _handleDataResponse(const GWEN_MSG *msg)
int _handleDataResponse(GWEN_MSG *msg)
{
GWEN_TAG16_LIST *tagList;
AQH_VALUE *value;
const GWEN_TAG16 *tag;
const char *valueUnits;
unsigned int numberOfPoints;
const uint64_t *dataPoints;
tagList=AQH_Tag16IpcMsg_ParseTags(msg, 0);
if (tagList) {
const GWEN_TAG16 *tag;
char *valueUnits;
AQH_MultiDataDataIpcMsg_Parse(msg, 0);
value=AQH_MultiDataDataIpcMsg_ReadValue(msg);
valueUnits=value?AQH_Value_GetValueUnits(value):NULL;
tag=AQH_Tag16IpcMsg_FindFirstTagByType(msg, AQH_MSGDATA_MULTIDATA_TAGS_DATA);
numberOfPoints=(tag?GWEN_Tag16_GetTagLength(tag):0)/(2*sizeof(uint64_t));
dataPoints=tag?((const uint64_t*) GWEN_Tag16_GetTagData(tag)):NULL;
if (numberOfPoints>0 && dataPoints) {
uint64_t timestamp;
union {double f; uint64_t i;} u;
tag=GWEN_Tag16_List_FindFirstByTagType(tagList, AQH_MSGDATA_SINGLEDATA_TAGS_UNITS);
valueUnits=tag?GWEN_Tag16_GetTagDataAsNewString(tag, NULL):NULL;
tag=GWEN_Tag16_List_FindFirstByTagType(tagList, AQH_MSGDATA_SINGLEDATA_TAGS_TIME);
timestamp=tag?GWEN_Tag16_GetTagDataAsUint64(tag, 0):0;
tag=GWEN_Tag16_List_FindFirstByTagType(tagList, AQH_MSGDATA_SINGLEDATA_TAGS_DATA);
u.i=tag?GWEN_Tag16_GetTagDataAsUint64(tag, 0):0;
timestamp=dataPoints[0];
u.i=dataPoints[1];
Utils_PrintSingleDataPoint(timestamp, u.f, valueUnits);
}
free(valueUnits);
return 0;
}
else {
DBG_ERROR(NULL, "Invalid message received");
return 3;
}
AQH_Value_free(value);
return 0;
}

View File

@@ -176,34 +176,36 @@ int _doGetValues(GWEN_DB_NODE *dbArgs)
}
code=GWEN_IpcMsg_GetCode(msg);
if (code==AQH_MSGTYPE_IPC_DATA_GETVALUES_RSP) {
if (AQH_ValuesDataIpcMsg_IsValid(msg)) {
uint32_t numValues;
uint32_t i;
AQH_VALUE_LIST *valueList;
numValues=AQH_ValuesDataIpcMsg_GetNumValues(msg);
for(i=0; i<numValues; i++) {
AQH_ValuesDataIpcMsg_Parse(msg, 0);
valueList=AQH_ValuesDataIpcMsg_ReadValueList(msg);
if (valueList) {
AQH_VALUE *v;
v=AQH_Value_List_First(valueList);
while(v) {
uint64_t valueId;
const char *valueName;
const char *valueUnits;
valueId=AQH_ValuesDataIpcMsg_GetValueId(msg, i);
valueName=AQH_ValuesDataIpcMsg_GetValueName(msg, i);
valueUnits=AQH_ValuesDataIpcMsg_GetValueUnits(msg, i);
valueId=AQH_Value_GetId(v);
valueName=AQH_Value_GetNameForSystem(v);
valueUnits=AQH_Value_GetValueUnits(v);
fprintf(stdout, "%lu\t%s\t%s\n",
(unsigned long int) valueId,
valueName?valueName:"",
valueUnits?valueUnits:"");
v=AQH_Value_List_Next(v);
}
if (AQH_ValuesDataIpcMsg_GetFlags(msg) & AQH_MSGDATA_VALUES_FLAGS_LASTMSG) {
DBG_INFO(NULL, "Last message received");
break;
}
AQH_Value_List_free(valueList);
}
else {
DBG_ERROR(NULL, "Invalid message received");
GWEN_MsgEndpoint_free(epTcp);
return 3;
if (AQH_ValuesDataIpcMsg_GetFlags(msg) & AQH_MSGDATA_VALUES_FLAGS_LASTMSG) {
DBG_INFO(NULL, "Last message received");
break;
}
}
else if (code==AQH_MSGTYPE_IPC_DATA_RESULT) {

View File

@@ -263,7 +263,7 @@ void _sendCommand(GWEN_MSG_ENDPOINT *epTcp, const char *valueName, const char *v
{
GWEN_MSG *msgOut;
msgOut=AQH_SingleDataDataIpcMsg_new(AQH_MSGTYPE_IPC_DATA_SETDATA, valueName, valueUnits, 0, 0, dataToSend);
msgOut=AQH_SingleDataDataIpcMsg_new(AQH_MSGTYPE_IPC_DATA_SETDATA, valueName, valueUnits, NULL, 0, 0, dataToSend);
GWEN_MsgEndpoint_AddSendMessage(epTcp, msgOut);
}