diff --git a/aqhome/msgmanager.c b/aqhome/msgmanager.c index 63be9ca..853d51e 100644 --- a/aqhome/msgmanager.c +++ b/aqhome/msgmanager.c @@ -11,19 +11,38 @@ #endif -#include "aqhome/msgmanager.h" +#include "aqhome/msgmanager_p.h" #include "aqhome/msg/endpointmgr.h" #include "aqhome/msg/msg_node.h" +#include "aqhome/msg/msg_sendstats.h" +#include "aqhome/msg/msg_recvstats.h" +#include "aqhome/msg/msg_value2.h" +#include "aqhome/msg/msg_needaddr.h" +#include "aqhome/msg/msg_claimaddr.h" +#include "aqhome/msg/msg_haveaddr.h" +#include "aqhome/msg/msg_device.h" #include #include +GWEN_INHERIT(GWEN_MSG_ENDPOINT_MGR, AQH_MSG_MANAGER) + + +static void GWENHYWFAR_CB _freeData(void *bp, void *p); static void _loopOnceOverEndpoints(GWEN_MSG_ENDPOINT_MGR *emgr); static void _handleEndpoint(GWEN_MSG_ENDPOINT_MGR *emgr, GWEN_MSG_ENDPOINT *ep); static void _handleNodeMsg(GWEN_MSG_ENDPOINT_MGR *emgr, GWEN_MSG_ENDPOINT *ep, const GWEN_MSG *msg); static void _handleIpcMsg(GWEN_MSG_ENDPOINT_MGR *emgr, GWEN_MSG_ENDPOINT *ep, const GWEN_MSG *msg); +static void _handleMsgValue2(GWEN_MSG_ENDPOINT_MGR *emgr, GWEN_MSG_ENDPOINT *ep, const GWEN_MSG *msg); +static void _handleMsgNeedAddress(GWEN_MSG_ENDPOINT_MGR *emgr, GWEN_MSG_ENDPOINT *ep, const GWEN_MSG *msg); +static void _handleMsgClaimAddress(GWEN_MSG_ENDPOINT_MGR *emgr, GWEN_MSG_ENDPOINT *ep, const GWEN_MSG *msg); +static void _handleMsgHaveAddress(GWEN_MSG_ENDPOINT_MGR *emgr, GWEN_MSG_ENDPOINT *ep, const GWEN_MSG *msg); +static void _handleMsgComSendStat(GWEN_MSG_ENDPOINT_MGR *emgr, GWEN_MSG_ENDPOINT *ep, const GWEN_MSG *msg); +static void _handleMsgComRecvStat(GWEN_MSG_ENDPOINT_MGR *emgr, GWEN_MSG_ENDPOINT *ep, const GWEN_MSG *msg); +static void _handleMsgDevice(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); @@ -31,7 +50,26 @@ static void _handleIpcMsg(GWEN_MSG_ENDPOINT_MGR *emgr, GWEN_MSG_ENDPOINT *ep, co GWEN_MSG_ENDPOINT_MGR *AQH_MsgManager_new(uint8_t busAddr) { - return AQH_MsgEndpointMgr_new(busAddr); + GWEN_MSG_ENDPOINT_MGR *mgr; + AQH_MSG_MANAGER *xmgr; + + mgr=AQH_MsgEndpointMgr_new(busAddr); + GWEN_NEW_OBJECT(AQH_MSG_MANAGER, xmgr); + GWEN_INHERIT_SETDATA(GWEN_MSG_ENDPOINT_MGR, AQH_MSG_MANAGER, mgr, xmgr, _freeData); + xmgr->nodeDb=AQH_NodeDb_new(); + + return mgr; +} + + + +void _freeData(void *bp, void *p) +{ + AQH_MSG_MANAGER *xmgr; + + xmgr=(AQH_MSG_MANAGER*) p; + AQH_NodeDb_free(xmgr->nodeDb); + GWEN_FREE_OBJECT(xmgr); } @@ -50,9 +88,11 @@ int AQH_MsgManager_LoopOnce(GWEN_MSG_ENDPOINT_MGR *emgr) void _loopOnceOverEndpoints(GWEN_MSG_ENDPOINT_MGR *emgr) { + AQH_MSG_MANAGER *xmgr; GWEN_MSG_ENDPOINT_LIST *endpointList; DBG_DEBUG(AQH_LOGDOMAIN, "Handle endpoint messages"); + xmgr=GWEN_INHERIT_GETDATA(GWEN_MSG_ENDPOINT_MGR, AQH_MSG_MANAGER, emgr); endpointList=GWEN_MsgEndpointMgr_GetEndpointList(emgr); if (endpointList) { GWEN_MSG_ENDPOINT *ep; @@ -63,6 +103,15 @@ void _loopOnceOverEndpoints(GWEN_MSG_ENDPOINT_MGR *emgr) ep=GWEN_MsgEndpoint_List_Next(ep); } /* while */ } + + if (AQH_NodeDb_IsModified(xmgr->nodeDb)) { + GWEN_DB_NODE *dbNodeDb; + + dbNodeDb=GWEN_DB_Group_new("nodeDb"); + AQH_NodeDb_toDb(xmgr->nodeDb, dbNodeDb); + GWEN_DB_WriteFile(dbNodeDb, "nodedb.db", GWEN_DB_FLAGS_DEFAULT); + GWEN_DB_Group_free(dbNodeDb); + } } @@ -91,11 +140,31 @@ void _handleEndpoint(GWEN_MSG_ENDPOINT_MGR *emgr, GWEN_MSG_ENDPOINT *ep) void _handleNodeMsg(GWEN_MSG_ENDPOINT_MGR *emgr, GWEN_MSG_ENDPOINT *ep, const GWEN_MSG *msg) { + int msgIsValid; + uint8_t msgType; + DBG_INFO(AQH_LOGDOMAIN, " - msg %d from %d to %d", AQH_NodeMsg_GetMsgType(msg), AQH_NodeMsg_GetSourceAddress(msg), AQH_NodeMsg_GetDestAddress(msg)); + AQH_MsgEndpointMgr_DistributeMsgFromNodeEndpoint(emgr, ep, msg, AQH_MSGMGR_ENDPOINTGROUP_NODE); + + msgIsValid=(AQH_NodeMsg_IsChecksumValid(msg) && AQH_NodeMsg_IsMsgComplete(msg)); + msgType=AQH_NodeMsg_GetMsgType(msg); + + if (msgIsValid) { + switch(msgType) { + case AQH_MSG_TYPE_COMSENDSTATS: _handleMsgComSendStat(emgr, ep, msg); break; + case AQH_MSG_TYPE_COMRECVSTATS: _handleMsgComRecvStat(emgr, ep, msg); break; + case AQH_MSG_TYPE_VALUE2: _handleMsgValue2(emgr, ep, msg); break; + case AQH_MSG_TYPE_NEED_ADDRESS: _handleMsgNeedAddress(emgr, ep, msg); break; + case AQH_MSG_TYPE_CLAIM_ADDRESS: _handleMsgClaimAddress(emgr, ep, msg); break; + case AQH_MSG_TYPE_HAVE_ADDRESS: _handleMsgHaveAddress(emgr, ep, msg); break; + case AQH_MSG_TYPE_DEVICE: _handleMsgDevice(emgr, ep, msg); break; + default: break; + } + } } @@ -107,5 +176,198 @@ void _handleIpcMsg(GWEN_MSG_ENDPOINT_MGR *emgr, GWEN_MSG_ENDPOINT *ep, const GWE +void _handleMsgValue2(GWEN_MSG_ENDPOINT_MGR *emgr, GWEN_MSG_ENDPOINT *ep, const GWEN_MSG *msg) +{ + AQH_MSG_MANAGER *xmgr; + + xmgr=GWEN_INHERIT_GETDATA(GWEN_MSG_ENDPOINT_MGR, AQH_MSG_MANAGER, emgr); + if (xmgr) { + AQH_NODE_INFO *ni; + uint32_t uid; + + uid=AQH_Value2Msg_GetUid(msg); + ni=_getOrCreateNodeAndUpdateUidAddr(emgr, msg, uid); + if (ni==NULL) { + DBG_INFO(AQH_LOGDOMAIN, "Error handling message"); + } + } +} + + + +void _handleMsgNeedAddress(GWEN_MSG_ENDPOINT_MGR *emgr, GWEN_MSG_ENDPOINT *ep, const GWEN_MSG *msg) +{ + AQH_MSG_MANAGER *xmgr; + + xmgr=GWEN_INHERIT_GETDATA(GWEN_MSG_ENDPOINT_MGR, AQH_MSG_MANAGER, emgr); + if (xmgr) { + AQH_NODE_INFO *ni; + uint32_t uid; + + uid=AQH_NeedAddrMsg_GetUid(msg); + ni=_getOrCreateNodeAndUpdateUidAddr(emgr, msg, uid); + if (ni==NULL) { + DBG_INFO(AQH_LOGDOMAIN, "Error handling message"); + } + } +} + + + +void _handleMsgClaimAddress(GWEN_MSG_ENDPOINT_MGR *emgr, GWEN_MSG_ENDPOINT *ep, const GWEN_MSG *msg) +{ + AQH_MSG_MANAGER *xmgr; + + xmgr=GWEN_INHERIT_GETDATA(GWEN_MSG_ENDPOINT_MGR, AQH_MSG_MANAGER, emgr); + if (xmgr) { + AQH_NODE_INFO *ni; + uint32_t uid; + + uid=AQH_ClaimAddrMsg_GetUid(msg); + ni=_getOrCreateNodeAndUpdateUidAddr(emgr, msg, uid); + if (ni==NULL) { + DBG_INFO(AQH_LOGDOMAIN, "Error handling message"); + } + } +} + + + +void _handleMsgHaveAddress(GWEN_MSG_ENDPOINT_MGR *emgr, GWEN_MSG_ENDPOINT *ep, const GWEN_MSG *msg) +{ + AQH_MSG_MANAGER *xmgr; + + xmgr=GWEN_INHERIT_GETDATA(GWEN_MSG_ENDPOINT_MGR, AQH_MSG_MANAGER, emgr); + if (xmgr) { + AQH_NODE_INFO *ni; + uint32_t uid; + + uid=AQH_HaveAddrMsg_GetUid(msg); + ni=_getOrCreateNodeAndUpdateUidAddr(emgr, msg, uid); + if (ni==NULL) { + DBG_INFO(AQH_LOGDOMAIN, "Error handling message"); + } + } +} + + + +void _handleMsgComSendStat(GWEN_MSG_ENDPOINT_MGR *emgr, GWEN_MSG_ENDPOINT *ep, const GWEN_MSG *msg) +{ + AQH_MSG_MANAGER *xmgr; + + xmgr=GWEN_INHERIT_GETDATA(GWEN_MSG_ENDPOINT_MGR, AQH_MSG_MANAGER, emgr); + if (xmgr) { + AQH_NODE_INFO *ni; + uint32_t uid; + + uid=AQH_SendStatsMsg_GetUid(msg); + ni=_getOrCreateNodeAndUpdateUidAddr(emgr, msg, uid); + if (ni==NULL) { + DBG_INFO(AQH_LOGDOMAIN, "Error handling message"); + } + AQH_NodeInfo_SetStatsPacketsOut(ni, AQH_SendStatsMsg_GetPacketsOut(msg)); + AQH_NodeInfo_SetStatsCollisions(ni, AQH_SendStatsMsg_GetCollisions(msg)); + AQH_NodeInfo_SetStatsAborted(ni, AQH_SendStatsMsg_GetAborted(msg)); + AQH_NodeDb_SetModified(xmgr->nodeDb); + } +} + + + +void _handleMsgComRecvStat(GWEN_MSG_ENDPOINT_MGR *emgr, GWEN_MSG_ENDPOINT *ep, const GWEN_MSG *msg) +{ + AQH_MSG_MANAGER *xmgr; + + xmgr=GWEN_INHERIT_GETDATA(GWEN_MSG_ENDPOINT_MGR, AQH_MSG_MANAGER, emgr); + if (xmgr) { + AQH_NODE_INFO *ni; + uint32_t uid; + + uid=AQH_RecvStatsMsg_GetUid(msg); + ni=_getOrCreateNodeAndUpdateUidAddr(emgr, msg, uid); + if (ni==NULL) { + DBG_INFO(AQH_LOGDOMAIN, "Error handling message"); + } + AQH_NodeInfo_SetStatsPacketsIn(ni, AQH_RecvStatsMsg_GetPacketsIn(msg)); + AQH_NodeInfo_SetStatsErrors(ni, AQH_RecvStatsMsg_GetErrors(msg)); + AQH_NodeInfo_SetStatsHandled(ni, AQH_RecvStatsMsg_GetHandled(msg)); + AQH_NodeDb_SetModified(xmgr->nodeDb); + } +} + + + +void _handleMsgDevice(GWEN_MSG_ENDPOINT_MGR *emgr, GWEN_MSG_ENDPOINT *ep, const GWEN_MSG *msg) +{ + AQH_MSG_MANAGER *xmgr; + + xmgr=GWEN_INHERIT_GETDATA(GWEN_MSG_ENDPOINT_MGR, AQH_MSG_MANAGER, emgr); + if (xmgr) { + AQH_NODE_INFO *ni; + uint32_t uid; + + uid=AQH_DeviceMsg_GetUid(msg); + ni=_getOrCreateNodeAndUpdateUidAddr(emgr, msg, uid); + if (ni) { + AQH_NodeInfo_SetFirmwareType(ni, AQH_DeviceMsg_GetFirmwareType(msg)); + AQH_NodeInfo_SetFirmwareVersion(ni, (AQH_DeviceMsg_GetFirmwareHigh(msg)<<8) | AQH_DeviceMsg_GetFirmwareLow(msg)); + AQH_NodeInfo_SetModules(ni, (AQH_DeviceMsg_GetModuleMaskHigh(msg)<<8) | AQH_DeviceMsg_GetModuleMaskLow(msg)); + AQH_NodeDb_SetModified(xmgr->nodeDb); + } + else { + DBG_INFO(AQH_LOGDOMAIN, "Error handling message"); + } + } +} + + + +AQH_NODE_INFO *_getOrCreateNodeAndUpdateUidAddr(GWEN_MSG_ENDPOINT_MGR *emgr, const GWEN_MSG *msg, uint32_t uid) +{ + AQH_MSG_MANAGER *xmgr; + + xmgr=GWEN_INHERIT_GETDATA(GWEN_MSG_ENDPOINT_MGR, AQH_MSG_MANAGER, emgr); + if (xmgr) { + uint8_t busAddr; + AQH_NODE_INFO *ni; + + busAddr=AQH_NodeMsg_GetSourceAddress(msg); + ni=AQH_NodeDb_GetNodeInfoByUid(xmgr->nodeDb, uid); + if (ni) { + uint8_t storedBusAddr; + + storedBusAddr=AQH_NodeInfo_GetBusAddress(ni); + if (busAddr!=0 && storedBusAddr!=busAddr) { + DBG_INFO(AQH_LOGDOMAIN, "Changed busaddr for %08x from %02x to %02x", uid, storedBusAddr, busAddr); + AQH_NodeInfo_SetBusAddress(ni, busAddr); + AQH_NodeDb_SetModified(xmgr->nodeDb); + } + } + else { + int rv; + + ni=AQH_NodeInfo_new(); + AQH_NodeInfo_SetBusAddress(ni, busAddr); + AQH_NodeInfo_SetUid(ni, uid); + rv=AQH_NodeDb_AddNodeInfo(xmgr->nodeDb, ni); + if (rv<0) { + DBG_INFO(AQH_LOGDOMAIN, "here (%d)", rv); + AQH_NodeInfo_free(ni); + return NULL; + } + else { + DBG_INFO(AQH_LOGDOMAIN, "Added node %08x (%02x)", uid, busAddr); + } + } + return ni; + } + return NULL; +} + + + + + diff --git a/aqhome/msgmanager_p.h b/aqhome/msgmanager_p.h new file mode 100644 index 0000000..bbd77f2 --- /dev/null +++ b/aqhome/msgmanager_p.h @@ -0,0 +1,28 @@ +/**************************************************************************** + * 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_MSG_MANAGER_P_H +#define AQH_MSG_MANAGER_P_H + + +#include + +#include +#include + + + +typedef struct AQH_MSG_MANAGER AQH_MSG_MANAGER; +struct AQH_MSG_MANAGER { + AQH_NODE_DB *nodeDb; +}; + + + + +#endif diff --git a/aqhome/nodes/nodedb.c b/aqhome/nodes/nodedb.c index 0be6d72..c8e51cf 100644 --- a/aqhome/nodes/nodedb.c +++ b/aqhome/nodes/nodedb.c @@ -39,6 +39,27 @@ void AQH_NodeDb_free(AQH_NODE_DB *ndb) +void AQH_NodeDb_SetModified(AQH_NODE_DB *ndb) +{ + ndb->modified=1; +} + + + +void AQH_NodeDb_ClearModified(AQH_NODE_DB *ndb) +{ + ndb->modified=0; +} + + + +int AQH_NodeDb_IsModified(const AQH_NODE_DB *ndb) +{ + return ndb->modified; +} + + + AQH_NODE_INFO_LIST *AQH_NodeDb_GetAllNodeInfos(AQH_NODE_DB *ndb) { return ndb->nodeList; @@ -62,6 +83,7 @@ int AQH_NodeDb_AddNodeInfo(AQH_NODE_DB *ndb, AQH_NODE_INFO *ni) } busAddr=AQH_NodeInfo_GetBusAddress(ni); +#if 0 if (busAddr==0) { DBG_ERROR(AQH_LOGDOMAIN, "Not adding node without BUSADDR"); return GWEN_ERROR_INVALID; @@ -70,9 +92,11 @@ int AQH_NodeDb_AddNodeInfo(AQH_NODE_DB *ndb, AQH_NODE_INFO *ni) DBG_ERROR(AQH_LOGDOMAIN, "A node with the given BUSADDR \"%02x\" already exists", busAddr); return GWEN_ERROR_INVALID; } +#endif DBG_INFO(AQH_LOGDOMAIN, "Adding node UID=%08x BUSADDR=%02x", (unsigned int) uid, busAddr); AQH_NodeInfo_List_Add(ni, ndb->nodeList); + AQH_NodeDb_SetModified(ndb); return 0; } @@ -92,7 +116,7 @@ AQH_NODE_INFO *AQH_NodeDb_GetNodeInfoByUid(AQH_NODE_DB *ndb, uint32_t uid) -AQH_NODE_INFO_LIST *AQH_NodeDb_GetNodeInfosByNodeType(AQH_NODE_DB *ndb, int t) +AQH_NODE_INFO_LIST *AQH_NodeDb_GetNodeInfosByFirmwareType(AQH_NODE_DB *ndb, int t) { AQH_NODE_INFO_LIST *resultList; AQH_NODE_INFO *ni; @@ -100,7 +124,7 @@ AQH_NODE_INFO_LIST *AQH_NodeDb_GetNodeInfosByNodeType(AQH_NODE_DB *ndb, int t) resultList=AQH_NodeInfo_List_new(); ni=AQH_NodeInfo_List_First(ndb->nodeList); while(ni) { - if (t==0 || t==AQH_NodeInfo_GetNodeType(ni)) + if (t==0 || t==AQH_NodeInfo_GetFirmwareType(ni)) AQH_NodeInfo_List_Add(AQH_NodeInfo_dup(ni), resultList); ni=AQH_NodeInfo_List_Next(ni); } @@ -115,5 +139,43 @@ AQH_NODE_INFO_LIST *AQH_NodeDb_GetNodeInfosByNodeType(AQH_NODE_DB *ndb, int t) +void AQH_NodeDb_toDb(AQH_NODE_DB *ndb, GWEN_DB_NODE *dbDatabase) +{ + if (ndb->nodeList) { + AQH_NODE_INFO *ni; + + ni=AQH_NodeInfo_List_First(ndb->nodeList); + while(ni) { + GWEN_DB_NODE *dbNodeInfo; + + dbNodeInfo=GWEN_DB_Group_new("nodeInfo"); + AQH_NodeInfo_toDb(ni, dbNodeInfo); + GWEN_DB_AddGroup(dbDatabase, dbNodeInfo); + + ni=AQH_NodeInfo_List_Next(ni); + } + } +} + + + +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) + AQH_NodeInfo_List_Add(ni, ndb->nodeList); + + dbNodeInfo=GWEN_DB_FindNextGroup(dbNodeInfo, "nodeinfo"); + } + AQH_NodeDb_ClearModified(ndb); +} + diff --git a/aqhome/nodes/nodedb.h b/aqhome/nodes/nodedb.h index 5076548..0c52613 100644 --- a/aqhome/nodes/nodedb.h +++ b/aqhome/nodes/nodedb.h @@ -13,6 +13,8 @@ #include #include +#include + #include @@ -27,9 +29,14 @@ AQHOME_API int AQH_NodeDb_AddNodeInfo(AQH_NODE_DB *ndb, AQH_NODE_INFO *ni); AQHOME_API AQH_NODE_INFO *AQH_NodeDb_GetNodeInfoByBusAddr(AQH_NODE_DB *ndb, uint8_t busAddr); AQHOME_API AQH_NODE_INFO *AQH_NodeDb_GetNodeInfoByUid(AQH_NODE_DB *ndb, uint32_t uid); -AQHOME_API AQH_NODE_INFO_LIST *AQH_NodeDb_GetNodeInfosByNodeType(AQH_NODE_DB *ndb, int t); +AQHOME_API AQH_NODE_INFO_LIST *AQH_NodeDb_GetNodeInfosByFirmwareType(AQH_NODE_DB *ndb, int t); +AQHOME_API void AQH_NodeDb_toDb(AQH_NODE_DB *ndb, GWEN_DB_NODE *dbDatabase); +AQHOME_API void AQH_NodeDb_fromDb(AQH_NODE_DB *ndb, GWEN_DB_NODE *dbDatabase); +AQHOME_API void AQH_NodeDb_SetModified(AQH_NODE_DB *ndb); +AQHOME_API void AQH_NodeDb_ClearModified(AQH_NODE_DB *ndb); +AQHOME_API int AQH_NodeDb_IsModified(const AQH_NODE_DB *ndb); #endif diff --git a/aqhome/nodes/nodedb_p.h b/aqhome/nodes/nodedb_p.h index ab678e1..3c75cce 100644 --- a/aqhome/nodes/nodedb_p.h +++ b/aqhome/nodes/nodedb_p.h @@ -15,7 +15,7 @@ struct AQH_NODE_DB { AQH_NODE_INFO_LIST *nodeList; - + int modified; }; diff --git a/aqhome/nodes/nodeinfo.t2d b/aqhome/nodes/nodeinfo.t2d index cc86835..25ea277 100644 --- a/aqhome/nodes/nodeinfo.t2d +++ b/aqhome/nodes/nodeinfo.t2d @@ -22,106 +22,6 @@ - - - - - - $(api) int $(struct_prefix)_AddModule($(struct_type) *t, uint8_t v); - - - - - - - - int $(struct_prefix)_AddModule($(struct_type) *t, uint8_t v) { - int i; - - assert(t); - - for(i=0; i < $(modules.maxlen); i++) { - if (t->modules[i]==0) { - t->modules[i]=v; - return 0; - } - } - DBG_ERROR(AQH_LOGDOMAIN, "Too many module entries"); - return GWEN_ERROR_BUFFER_OVERFLOW; - } - - - - - - - - - $(api) int $(struct_prefix)_HasModule(const $(struct_type) *t, uint8_t v); - - - - - - - - int $(struct_prefix)_HasModule(const $(struct_type) *t, uint8_t v) { - int i; - - assert(t); - for (i=0; i<$(modules.maxlen); i++) { - if (t->modules[i]==v) - return 1; - } - return 0; - } - - - - - - - - - $(api) int $(struct_prefix)_GetMaxModuleCount(void); - - - - - - - - int $(struct_prefix)_GetMaxModuleCount(void) { - return $(modules.maxlen); - } - - - - - - - - - $(api) void $(struct_prefix)_ClearModules($(struct_type) *t); - - - - - - - - void $(struct_prefix)_ClearModules($(struct_type) *t) { - int i; - - assert(t); - for (i=0; i<$(modules.maxlen); i++) { - t->modules[i]=0; - } - } - - - - @@ -145,39 +45,71 @@ with_getbymember - + 0 0 public - + 0 0 public - + 0 0 public - - - - - omit - const - const - public - This array contains one entry for every module the node contains (0 for empty entries). - Call $(struct_prefix)_GetMaxModuleCount() to get the size of this array. + + 0 + 0 + public + + + + + 0 + 0 + public + + + + + 0 + 0 + public + + + + + 0 + 0 + public + + + + + 0 + 0 + public + + + + + 0 + 0 + public + + +