/**************************************************************************** * 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 "aqhome/msg/endpointmgr_p.h" #include "aqhome/msg/msg_node.h" #include "aqhome/msg/endpoint_node.h" #include #include GWEN_INHERIT(GWEN_MSG_ENDPOINT_MGR, AQH_MSG_ENDPOINT_MGR); static void GWENHYWFAR_CB _freeData(void *bp, void *p); static void _handleEndpoint(GWEN_MSG_ENDPOINT_MGR *emgr, GWEN_MSG_ENDPOINT *ep); static void _handleNodeEndpoint(GWEN_MSG_ENDPOINT_MGR *emgr, GWEN_MSG_ENDPOINT *ep); static void _distributeMsgFromNodeEndpoint(GWEN_MSG_ENDPOINT_MGR *emgr, GWEN_MSG_ENDPOINT *srcEp, const GWEN_MSG *msg); GWEN_MSG_ENDPOINT_MGR *AQH_MsgEndpointMgr_new(uint8_t busAddr) { GWEN_MSG_ENDPOINT_MGR *mgr; AQH_MSG_ENDPOINT_MGR *xmgr; mgr=GWEN_MsgEndpointMgr_new(); GWEN_NEW_OBJECT(AQH_MSG_ENDPOINT_MGR, xmgr); GWEN_INHERIT_SETDATA(GWEN_MSG_ENDPOINT_MGR, AQH_MSG_ENDPOINT_MGR, mgr, xmgr, _freeData); xmgr->busAddr=busAddr; return mgr; } void _freeData(void *bp, void *p) { AQH_MSG_ENDPOINT_MGR *xmgr; xmgr=(AQH_MSG_ENDPOINT_MGR*) p; GWEN_FREE_OBJECT(xmgr); } int AQH_MsgEndpointMgr_LoopOnce(GWEN_MSG_ENDPOINT_MGR *emgr, int groupId) { int rv; rv=GWEN_MsgEndpointMgr_IoLoopOnce(emgr); AQH_MsgEndpointMgr_LoopOnceOverNodeEndpoints(emgr, groupId); GWEN_MsgEndpointMgr_RunAllEndpoints(emgr); return rv; } void AQH_MsgEndpointMgr_LoopOnceOverNodeEndpoints(GWEN_MSG_ENDPOINT_MGR *emgr, int groupId) { GWEN_MSG_ENDPOINT_LIST *endpointList; DBG_DEBUG(AQH_LOGDOMAIN, "Handle endpoint messages"); endpointList=GWEN_MsgEndpointMgr_GetEndpointList(emgr); if (endpointList) { GWEN_MSG_ENDPOINT *ep; ep=GWEN_MsgEndpoint_List_First(endpointList); while(ep) { DBG_DEBUG(AQH_LOGDOMAIN, "- endpoint(%s)", GWEN_MsgEndpoint_GetName(ep)); if (GWEN_MsgEndpoint_GetGroupId(ep)==groupId) _handleNodeEndpoint(emgr, ep); ep=GWEN_MsgEndpoint_List_Next(ep); } } } void _handleNodeEndpoint(GWEN_MSG_ENDPOINT_MGR *emgr, GWEN_MSG_ENDPOINT *ep) { GWEN_MSG *msg; while( (msg=GWEN_MsgEndpoint_TakeFirstReceivedMessage(ep)) ) { DBG_INFO(AQH_LOGDOMAIN, " - msg %d from %d to %d", AQH_NodeMsg_GetMsgType(msg), AQH_NodeMsg_GetSourceAddress(msg), AQH_NodeMsg_GetDestAddress(msg)); _distributeMsgFromNodeEndpoint(emgr, ep, msg); GWEN_Msg_free(msg); } } void _distributeMsgFromNodeEndpoint(GWEN_MSG_ENDPOINT_MGR *emgr, GWEN_MSG_ENDPOINT *srcEp, const GWEN_MSG *msg) { GWEN_MSG_ENDPOINT_LIST *endpointList; endpointList=GWEN_MsgEndpointMgr_GetEndpointList(emgr); if (endpointList) { GWEN_MSG_ENDPOINT *ep; int srcGroupId; uint32_t msgGroup; msgGroup=AQH_NodeMsg_GetMsgGroup(AQH_NodeMsg_GetMsgType(msg)); srcGroupId=GWEN_MsgEndpoint_GetGroupId(srcEp); ep=GWEN_MsgEndpoint_List_First(endpointList); while(ep) { if (ep!=srcEp) { uint32_t acceptedMsgGroups; acceptedMsgGroups=AQH_NodeEndpoint_GetAcceptedMsgGroups(ep); DBG_DEBUG(AQH_LOGDOMAIN, "- checking endpoint %s (msgGroup=%08x, accept: %08x, flags: %08x)", GWEN_MsgEndpoint_GetName(ep), msgGroup, acceptedMsgGroups, GWEN_MsgEndpoint_GetFlags(ep)); if ( !(GWEN_MsgEndpoint_GetFlags(ep) & AQH_MSGEP_NODE_FLAGS_NOMESSAGES) && (msgGroup & acceptedMsgGroups) ) { /* endpoint accepts this message */ DBG_DEBUG(AQH_LOGDOMAIN, " - endpoint %s accepts message", GWEN_MsgEndpoint_GetName(ep)); GWEN_MsgEndpoint_ProcessOutMessage(ep, GWEN_Msg_dup(msg)); } else { DBG_DEBUG(AQH_LOGDOMAIN, " - endpoint %s does not accept message", GWEN_MsgEndpoint_GetName(ep)); } } ep=GWEN_MsgEndpoint_List_Next(ep); } } }