Files
aqhomecontrol/aqhome/nodes/nodedb.c
2023-02-22 21:25:10 +01:00

138 lines
2.9 KiB
C

/****************************************************************************
* 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 <config.h>
#endif
#include "aqhome/nodes/nodedb_p.h"
#include <gwenhywfar/misc.h>
#include <gwenhywfar/debug.h>
AQH_NODE_DB *AQH_NodeDb_new()
{
AQH_NODE_DB *ndb;
GWEN_NEW_OBJECT(AQH_NODE_DB, ndb);
ndb->nodeList=AQH_NodeInfo_List_new();
return ndb;
}
void AQH_NodeDb_free(AQH_NODE_DB *ndb)
{
if (ndb) {
AQH_NodeInfo_List_free(ndb->nodeList);
GWEN_FREE_OBJECT(ndb);
}
}
AQH_NODE_INFO_LIST *AQH_NodeDb_GetAllNodeInfos(AQH_NODE_DB *ndb)
{
return ndb->nodeList;
}
int AQH_NodeDb_AddNodeInfo(AQH_NODE_DB *ndb, AQH_NODE_INFO *ni)
{
uint32_t uid;
uint8_t busAddr;
uid=AQH_NodeInfo_GetUid(ni);
if (uid==0) {
DBG_ERROR(AQH_LOGDOMAIN, "Not adding node without UID");
return GWEN_ERROR_INVALID;
}
if (AQH_NodeDb_GetNodeInfoByUid(ndb, uid)) {
DBG_ERROR(AQH_LOGDOMAIN, "A node with the given UID \"%08x\" already exists", (unsigned int) uid);
return GWEN_ERROR_INVALID;
}
busAddr=AQH_NodeInfo_GetBusAddress(ni);
if (busAddr==0) {
DBG_ERROR(AQH_LOGDOMAIN, "Not adding node without BUSADDR");
return GWEN_ERROR_INVALID;
}
if (AQH_NodeDb_GetNodeInfoByBusAddr(ndb, busAddr)) {
DBG_ERROR(AQH_LOGDOMAIN, "A node with the given BUSADDR \"%02x\" already exists", busAddr);
return GWEN_ERROR_INVALID;
}
DBG_INFO(AQH_LOGDOMAIN, "Adding node UID=%08x BUSADDR=%02x", (unsigned int) uid, busAddr);
AQH_NodeInfo_List_Add(ni, ndb->nodeList);
return 0;
}
AQH_NODE_INFO *AQH_NodeDb_GetNodeInfoByBusAddr(AQH_NODE_DB *ndb, uint8_t busAddr)
{
AQH_NODE_INFO *ni;
ni=AQH_NodeInfo_List_First(ndb->nodeList);
while(ni) {
if (busAddr==0 || busAddr==AQH_NodeInfo_GetBusAddress(ni))
return ni;
ni=AQH_NodeInfo_List_Next(ni);
}
return NULL;
}
AQH_NODE_INFO *AQH_NodeDb_GetNodeInfoByUid(AQH_NODE_DB *ndb, uint32_t uid)
{
AQH_NODE_INFO *ni;
ni=AQH_NodeInfo_List_First(ndb->nodeList);
while(ni) {
if (uid==0 || uid==AQH_NodeInfo_GetUid(ni))
return ni;
ni=AQH_NodeInfo_List_Next(ni);
}
return NULL;
}
AQH_NODE_INFO_LIST *AQH_NodeDb_GetNodeInfosByNodeType(AQH_NODE_DB *ndb, int t)
{
AQH_NODE_INFO_LIST *resultList;
AQH_NODE_INFO *ni;
resultList=AQH_NodeInfo_List_new();
ni=AQH_NodeInfo_List_First(ndb->nodeList);
while(ni) {
if (t==0 || t==AQH_NodeInfo_GetNodeType(ni))
AQH_NodeInfo_List_Add(AQH_NodeInfo_dup(ni), resultList);
ni=AQH_NodeInfo_List_Next(ni);
}
if (AQH_NodeInfo_List_GetCount(resultList)<1) {
AQH_NodeInfo_List_free(resultList);
return NULL;
}
return resultList;
}