diff --git a/aqhome/ipc/0BUILD b/aqhome/ipc/0BUILD index 0ee4359..f9ca1f6 100644 --- a/aqhome/ipc/0BUILD +++ b/aqhome/ipc/0BUILD @@ -53,6 +53,7 @@ msg_ipc_forward.h msg_ipc_value.h msg_ipc_ping.h + msg_ipc_setaccmsggrps.h @@ -70,6 +71,7 @@ msg_ipc_forward.c msg_ipc_value.c msg_ipc_ping.c + msg_ipc_setaccmsggrps.c diff --git a/aqhome/ipc/endpoint_node_ipc.c b/aqhome/ipc/endpoint_node_ipc.c index 4160d7c..68544f8 100644 --- a/aqhome/ipc/endpoint_node_ipc.c +++ b/aqhome/ipc/endpoint_node_ipc.c @@ -44,7 +44,7 @@ GWEN_MSG_ENDPOINT *AQH_IpcNodeEndpoint_new(const char *name, int groupId) AQH_NodeEndpoint_Extend(ep); GWEN_MsgEndpoint_SetProcessOutMsgFn(ep, _processOutMessage); - AQH_NodeEndpoint_SetAcceptedMsgGroups(ep, AQH_MSG_TYPEGROUP_ALL); +// AQH_NodeEndpoint_SetAcceptedMsgGroups(ep, AQH_MSG_TYPEGROUP_ALL); return ep; } diff --git a/aqhome/ipc/msg_ipc.h b/aqhome/ipc/msg_ipc.h index 81091d7..4c7790d 100644 --- a/aqhome/ipc/msg_ipc.h +++ b/aqhome/ipc/msg_ipc.h @@ -20,9 +20,10 @@ #define AQH_IPC_PROTOCOL_VERSION 1 -#define AQH_MSGTYPE_IPC_FORWARD 0x100 -#define AQH_MSGTYPE_IPC_VALUE 0x200 -#define AQH_MSGTYPE_IPC_PING 0x300 +#define AQH_MSGTYPE_IPC_FORWARD 0x100 +#define AQH_MSGTYPE_IPC_VALUE 0x200 +#define AQH_MSGTYPE_IPC_PING 0x300 +#define AQH_MSGTYPE_IPC_SETACCMSGGRPS 0x400 diff --git a/aqhome/ipc/msg_ipc_ping.h b/aqhome/ipc/msg_ipc_ping.h index 2b1665e..a7178c4 100644 --- a/aqhome/ipc/msg_ipc_ping.h +++ b/aqhome/ipc/msg_ipc_ping.h @@ -27,5 +27,3 @@ AQHOME_API void AQH_PingIpcMsg_DumpToBuffer(const GWEN_MSG *msg, GWEN_BUFFER *db #endif - - diff --git a/aqhome/ipc/msg_ipc_setaccmsggrps.c b/aqhome/ipc/msg_ipc_setaccmsggrps.c new file mode 100644 index 0000000..59fd207 --- /dev/null +++ b/aqhome/ipc/msg_ipc_setaccmsggrps.c @@ -0,0 +1,72 @@ +/**************************************************************************** + * This file is part of the project AqHome. + * AqHome (c) by 2023 Martin Preuss, all rights reserved. + * + * The license for this file can be found in the file COPYING which you + * should have received along with this file. + ****************************************************************************/ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include + +#include +#include + +#include +#include +#include +#include +#include +#include + + +#define AQH_MSGIPC_SETACCEPTEDMSGGRPS_OFFS_GROUPS 0 /* 4 bytes */ + +#define AQH_MSGIPC_SETACCEPTEDMSGGRPS_MINSIZE (GWEN_MSGIPC_OFFS_PAYLOAD+4) + + + + +GWEN_MSG *AQH_SetAcceptedMsgGroupsIpcMsg_new(uint16_t code, uint32_t groups) +{ + GWEN_MSG *msg; + uint8_t *ptr; + + msg=GWEN_IpcMsg_new(AQH_IPC_PROTOCOL_ID, AQH_IPC_PROTOCOL_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; + + return msg; +} + + + +uint32_t AQH_SetAcceptedMsgGroupsIpcMsg_GetMsgGroups(const GWEN_MSG *msg) +{ + return GWEN_Msg_GetUint32At(msg, GWEN_MSGIPC_OFFS_PAYLOAD+AQH_MSGIPC_SETACCEPTEDMSGGRPS_OFFS_GROUPS, 0); +} + + + +void AQH_SetAcceptedMsgGroupsIpcMsg_DumpToBuffer(const GWEN_MSG *msg, GWEN_BUFFER *dbuf, const char *sText) +{ + if (GWEN_Msg_GetBytesInBuffer(msg)>=AQH_MSGIPC_SETACCEPTEDMSGGRPS_MINSIZE) { + GWEN_Buffer_AppendArgs(dbuf, + "SET_ACCEPTED_MSG_GROUPS (code=%d, proto=%d, proto version=%d, groups=%08x)\n", + GWEN_IpcMsg_GetCode(msg), + GWEN_IpcMsg_GetProtoId(msg), + GWEN_IpcMsg_GetProtoVersion(msg), + AQH_SetAcceptedMsgGroupsIpcMsg_GetMsgGroups(msg)); + } +} + + + + + diff --git a/aqhome/ipc/msg_ipc_setaccmsggrps.h b/aqhome/ipc/msg_ipc_setaccmsggrps.h new file mode 100644 index 0000000..f1e4867 --- /dev/null +++ b/aqhome/ipc/msg_ipc_setaccmsggrps.h @@ -0,0 +1,29 @@ +/**************************************************************************** + * This file is part of the project AqHome. + * AqHome (c) by 2023 Martin Preuss, all rights reserved. + * + * The license for this file can be found in the file COPYING which you + * should have received along with this file. + ****************************************************************************/ + +#ifndef AQH_MSGIPC_SETACCEPTEDMSGGRPS_H +#define AQH_MSGIPC_SETACCEPTEDMSGGRPS_H + + +#include +#include + +#include +#include + + +AQHOME_API GWEN_MSG *AQH_SetAcceptedMsgGroupsIpcMsg_new(uint16_t code, uint32_t groups); + +AQHOME_API uint32_t AQH_SetAcceptedMsgGroupsIpcMsg_GetMsgGroups(const GWEN_MSG *msg); + +AQHOME_API void AQH_SetAcceptedMsgGroupsIpcMsg_DumpToBuffer(const GWEN_MSG *msg, GWEN_BUFFER *dbuf, const char *sText); + + + +#endif + diff --git a/aqhome/libtest.c b/aqhome/libtest.c index 77a429d..32b7d14 100644 --- a/aqhome/libtest.c +++ b/aqhome/libtest.c @@ -12,6 +12,7 @@ #include "aqhome/ipc/endpoint_ipc_tcpc.h" #include "aqhome/ipc/msg_ipc_ping.h" #include "aqhome/ipc/msg_ipc_forward.h" +#include "aqhome/ipc/msg_ipc_setaccmsggrps.h" #include "aqhome/mqtt/endpoint_mqttc.h" #include "aqhome/mqtt/msg_mqtt_connect.h" #include "aqhome/mqtt/msg_mqtt_connack.h" @@ -289,8 +290,17 @@ int testIpcConnection() } GWEN_MsgEndpointMgr_AddEndpoint(emgr, epTcp); + fprintf(stdout, "Sending SET_ACCEPTABLE_MSG_GROUPS\n"); + msgOut=AQH_SetAcceptedMsgGroupsIpcMsg_new(AQH_MSGTYPE_IPC_SETACCMSGGRPS, AQH_MSG_TYPEGROUP_ALL); + if (msgOut==NULL) { + DBG_ERROR(NULL, "Error creating message"); + return 2; + } + GWEN_MsgEndpoint_AddSendMessage(epTcp, msgOut); + + fprintf(stdout, "Sending PING\n"); - msgOut=AQH_PingIpcMsg_new(AQH_MSGTYPE_IPC_PING, 1); + msgOut=AQH_PingIpcMsg_new(AQH_MSGTYPE_IPC_PING, 2); if (msgOut==NULL) { DBG_ERROR(NULL, "Error creating message"); return 2; diff --git a/aqhome/msgmanager.c b/aqhome/msgmanager.c index e561133..14b6299 100644 --- a/aqhome/msgmanager.c +++ b/aqhome/msgmanager.c @@ -23,9 +23,11 @@ #include "aqhome/msg/msg_device.h" #include "aqhome/msg/msg_ping.h" #include "aqhome/msg/endpoint_tty.h" +#include "aqhome/msg/endpoint_node.h" #include "aqhome/mqtt/endpoint_mqttc.h" #include "aqhome/ipc/msg_ipc.h" #include "aqhome/ipc/msg_ipc_ping.h" +#include "aqhome/ipc/msg_ipc_setaccmsggrps.h" #include #include @@ -53,6 +55,7 @@ static void _handleMsgComRecvStat(GWEN_MSG_ENDPOINT_MGR *emgr, GWEN_MSG_ENDPOINT static void _handleMsgDevice(GWEN_MSG_ENDPOINT_MGR *emgr, GWEN_MSG_ENDPOINT *ep, const GWEN_MSG *msg); static void _handleIpcMsgPing(GWEN_MSG_ENDPOINT_MGR *emgr, GWEN_MSG_ENDPOINT *ep, const GWEN_MSG *msg); +static void _handleIpcMsgSetAccMsgGrps(GWEN_MSG_ENDPOINT_MGR *emgr, GWEN_MSG_ENDPOINT *ep, const GWEN_MSG *msg); static AQH_NODE_INFO *_getOrCreateNodeAndUpdateUidAddr(GWEN_MSG_ENDPOINT_MGR *emgr, const GWEN_MSG *msg, uint32_t uid); @@ -237,7 +240,8 @@ void _handleIpcMsg(GWEN_MSG_ENDPOINT_MGR *emgr, GWEN_MSG_ENDPOINT *ep, const GWE code=GWEN_IpcMsg_GetCode(msg); DBG_ERROR(AQH_LOGDOMAIN, "Received IPC packet"); switch(code) { - case AQH_MSGTYPE_IPC_PING: _handleIpcMsgPing(emgr, ep, msg); break; + case AQH_MSGTYPE_IPC_PING: _handleIpcMsgPing(emgr, ep, msg); break; + case AQH_MSGTYPE_IPC_SETACCMSGGRPS: _handleIpcMsgSetAccMsgGrps(emgr, ep, msg); break; default: break; } } @@ -265,6 +269,18 @@ void _handleIpcMsgPing(GWEN_MSG_ENDPOINT_MGR *emgr, GWEN_MSG_ENDPOINT *ep, const +void _handleIpcMsgSetAccMsgGrps(GWEN_MSG_ENDPOINT_MGR *emgr, GWEN_MSG_ENDPOINT *ep, const GWEN_MSG *msg) +{ + uint32_t groups; + + DBG_ERROR(AQH_LOGDOMAIN, "Received IPC SET_ACCEPTED_MSG_GROUPS message"); + groups=AQH_SetAcceptedMsgGroupsIpcMsg_GetMsgGroups(msg); + AQH_NodeEndpoint_SetAcceptedMsgGroups(ep, groups); + // TODO: send response? +} + + + void _handleMsgValue2(GWEN_MSG_ENDPOINT_MGR *emgr, GWEN_MSG_ENDPOINT *ep, const GWEN_MSG *msg) { AQH_MSG_MANAGER *xmgr;