aqhome-react: enable network loading.

This application has now basic functionality.
This commit is contained in:
Martin Preuss
2024-04-12 21:29:40 +02:00
parent 2ac4887f01
commit a479538743
25 changed files with 648 additions and 76 deletions

View File

@@ -39,11 +39,12 @@ static GWEN_XMLNODE *_readNetworkFromSysconfIntoXml(AQHOME_REACT *aqh, const cha
static AQHREACT_UNIT_NET *_readUnitNetFromXml(AQHOME_REACT *aqh, GWEN_XMLNODE *unitNetNode);
static GWEN_XMLNODE *_readUnitNetFileToXml(AQHOME_REACT *aqh, const char *sFilename);
static void _readNetParamDefsWithList(AQHREACT_PARAM_LIST *paramList, GWEN_XMLNODE *unitNetNode);
static int _readUnits(AQHOME_REACT *aqh, AQHREACT_UNIT_NET *unitNet, GWEN_XMLNODE *unitNetNode);
static int _readUnits(AQHOME_REACT *aqh, AQHREACT_UNIT_NET *unitNet, GWEN_XMLNODE *unitNetNode, GWEN_DB_NODE *dbNetParams);
static int _readLinks(AQHOME_REACT *aqh, AQHREACT_UNIT_NET *unitNet, GWEN_XMLNODE *unitNetNode);
static AQHREACT_UNIT *_readUnit(AQHOME_REACT *aqh, GWEN_XMLNODE *unitNode);
static int _readParamValuesForList(const AQHREACT_PARAM_LIST *paramList, GWEN_XMLNODE *parentNode);
static int _readParamValueForList(const AQHREACT_PARAM_LIST *paramList, GWEN_XMLNODE *paramNode);
static AQHREACT_UNIT *_readUnit(AQHOME_REACT *aqh, GWEN_XMLNODE *unitNode, GWEN_DB_NODE *dbNetParams);
static int _readParamValuesForList(const AQHREACT_PARAM_LIST *paramList, GWEN_XMLNODE *parentNode, GWEN_DB_NODE *dbNetParams);
static int _readParamValueForList(const AQHREACT_PARAM_LIST *paramList, GWEN_XMLNODE *paramNode, GWEN_DB_NODE *dbNetParams);
static int _setParamDataFromString(AQHREACT_PARAM *param, const char *value);
static AQHREACT_PARAM *_readNetParamDef(GWEN_XMLNODE *paramNode);
static int _readLink(AQHOME_REACT *aqh, AQHREACT_UNIT_NET *unitNet, GWEN_XMLNODE *linkNode);
static int _setParamDoubleValueFromString(AQHREACT_PARAM *param, const char *s);
@@ -239,6 +240,7 @@ AQHREACT_UNIT_NET *_readUnitNetFromXml(AQHOME_REACT *aqh, GWEN_XMLNODE *unitNetN
AQHREACT_UNIT_NET *unitNet;
const char *s;
int rv;
GWEN_DB_NODE *dbNetParams=NULL;
unitNet=AQHREACT_UnitNet_new();
s=GWEN_XMLNode_GetProperty(unitNetNode, "id", NULL);
@@ -259,7 +261,7 @@ AQHREACT_UNIT_NET *_readUnitNetFromXml(AQHOME_REACT *aqh, GWEN_XMLNODE *unitNetN
_readNetParamDefsWithList(AQHREACT_UnitNet_GetParamList(unitNet), baseNetXml);
/* also read netParams from this file (after reading from template) */
rv=_readParamValuesForList(AQHREACT_UnitNet_GetParamList(unitNet), unitNetNode);
rv=_readParamValuesForList(AQHREACT_UnitNet_GetParamList(unitNet), unitNetNode, NULL);
if (rv<0) {
DBG_INFO(NULL, "here (%d)", rv);
AQHREACT_UnitNet_free(unitNet);
@@ -267,9 +269,20 @@ AQHREACT_UNIT_NET *_readUnitNetFromXml(AQHOME_REACT *aqh, GWEN_XMLNODE *unitNetN
return NULL;
}
rv=_readUnits(aqh, unitNet, baseNetXml);
dbNetParams=GWEN_DB_Group_new("params");
rv=AQHREACT_Param_List_WriteIntoDb(AQHREACT_UnitNet_GetParamList(unitNet), dbNetParams, GWEN_DB_FLAGS_OVERWRITE_VARS);
if (rv<0) {
DBG_INFO(NULL, "here (%d)", rv);
GWEN_DB_Group_free(dbNetParams);
AQHREACT_UnitNet_free(unitNet);
GWEN_XMLNode_free(baseNetXml);
return NULL;
}
rv=_readUnits(aqh, unitNet, baseNetXml, dbNetParams);
if (rv<0) {
DBG_INFO(NULL, "here (%d)", rv);
GWEN_DB_Group_free(dbNetParams);
AQHREACT_UnitNet_free(unitNet);
GWEN_XMLNode_free(baseNetXml);
return NULL;
@@ -278,19 +291,31 @@ AQHREACT_UNIT_NET *_readUnitNetFromXml(AQHOME_REACT *aqh, GWEN_XMLNODE *unitNetN
rv=_readLinks(aqh, unitNet, baseNetXml);
if (rv<0) {
DBG_INFO(NULL, "here (%d)", rv);
GWEN_DB_Group_free(dbNetParams);
AQHREACT_UnitNet_free(unitNet);
GWEN_XMLNode_free(baseNetXml);
return NULL;
}
GWEN_DB_Group_free(dbNetParams);
GWEN_XMLNode_free(baseNetXml);
}
else {
/* just directly read network from given XML node (no need to load a template file) */
_readNetParamDefsWithList(AQHREACT_UnitNet_GetParamList(unitNet), unitNetNode);
rv=_readUnits(aqh, unitNet, unitNetNode);
dbNetParams=GWEN_DB_Group_new("params");
rv=AQHREACT_Param_List_WriteIntoDb(AQHREACT_UnitNet_GetParamList(unitNet), dbNetParams, GWEN_DB_FLAGS_OVERWRITE_VARS);
if (rv<0) {
DBG_INFO(NULL, "here (%d)", rv);
GWEN_DB_Group_free(dbNetParams);
AQHREACT_UnitNet_free(unitNet);
return NULL;
}
rv=_readUnits(aqh, unitNet, unitNetNode, dbNetParams);
if (rv<0) {
DBG_INFO(NULL, "here (%d)", rv);
GWEN_DB_Group_free(dbNetParams);
AQHREACT_UnitNet_free(unitNet);
return NULL;
}
@@ -298,9 +323,11 @@ AQHREACT_UNIT_NET *_readUnitNetFromXml(AQHOME_REACT *aqh, GWEN_XMLNODE *unitNetN
rv=_readLinks(aqh, unitNet, unitNetNode);
if (rv<0) {
DBG_INFO(NULL, "here (%d)", rv);
GWEN_DB_Group_free(dbNetParams);
AQHREACT_UnitNet_free(unitNet);
return NULL;
}
GWEN_DB_Group_free(dbNetParams);
}
return unitNet;
@@ -336,7 +363,7 @@ GWEN_XMLNODE *_readUnitNetFileToXml(AQHOME_REACT *aqh, const char *sFilename)
int _readUnits(AQHOME_REACT *aqh, AQHREACT_UNIT_NET *unitNet, GWEN_XMLNODE *unitNetNode)
int _readUnits(AQHOME_REACT *aqh, AQHREACT_UNIT_NET *unitNet, GWEN_XMLNODE *unitNetNode, GWEN_DB_NODE *dbNetParams)
{
GWEN_XMLNODE *nGroup;
@@ -348,7 +375,7 @@ int _readUnits(AQHOME_REACT *aqh, AQHREACT_UNIT_NET *unitNet, GWEN_XMLNODE *unit
while(n) {
AQHREACT_UNIT *unit;
unit=_readUnit(aqh, n);
unit=_readUnit(aqh, n, dbNetParams);
if (unit)
AQHREACT_UnitNet_AddUnit(unitNet, unit);
else {
@@ -389,7 +416,7 @@ int _readLinks(AQHOME_REACT *aqh, AQHREACT_UNIT_NET *unitNet, GWEN_XMLNODE *unit
AQHREACT_UNIT *_readUnit(AQHOME_REACT *aqh, GWEN_XMLNODE *unitNode)
AQHREACT_UNIT *_readUnit(AQHOME_REACT *aqh, GWEN_XMLNODE *unitNode, GWEN_DB_NODE *dbNetParams)
{
AQHREACT_UNIT *unit;
const char *unitType;
@@ -406,7 +433,7 @@ AQHREACT_UNIT *_readUnit(AQHOME_REACT *aqh, GWEN_XMLNODE *unitNode)
unitId=GWEN_XMLNode_GetProperty(unitNode, "id", NULL);
AQHREACT_Unit_SetId(unit, unitId);
rv=_readParamValuesForList(AQHREACT_Unit_GetParamList(unit), unitNode);
rv=_readParamValuesForList(AQHREACT_Unit_GetParamList(unit), unitNode, dbNetParams);
if (rv<0) {
DBG_INFO(NULL, "here (%d)", rv);
AQHREACT_Unit_free(unit);
@@ -418,7 +445,7 @@ AQHREACT_UNIT *_readUnit(AQHOME_REACT *aqh, GWEN_XMLNODE *unitNode)
int _readParamValuesForList(const AQHREACT_PARAM_LIST *paramList, GWEN_XMLNODE *parentNode)
int _readParamValuesForList(const AQHREACT_PARAM_LIST *paramList, GWEN_XMLNODE *parentNode, GWEN_DB_NODE *dbNetParams)
{
GWEN_XMLNODE *nGroup;
@@ -430,7 +457,7 @@ int _readParamValuesForList(const AQHREACT_PARAM_LIST *paramList, GWEN_XMLNODE *
while(n) {
int rv;
rv=_readParamValueForList(paramList, n);
rv=_readParamValueForList(paramList, n, dbNetParams);
if (rv<0) {
DBG_INFO(NULL, "here (%d)", rv);
return rv;
@@ -443,7 +470,7 @@ int _readParamValuesForList(const AQHREACT_PARAM_LIST *paramList, GWEN_XMLNODE *
int _readParamValueForList(const AQHREACT_PARAM_LIST *paramList, GWEN_XMLNODE *paramNode)
int _readParamValueForList(const AQHREACT_PARAM_LIST *paramList, GWEN_XMLNODE *paramNode, GWEN_DB_NODE *dbNetParams)
{
const char *paramName;
@@ -457,29 +484,35 @@ int _readParamValueForList(const AQHREACT_PARAM_LIST *paramList, GWEN_XMLNODE *p
value=GWEN_XMLNode_GetCharValue(paramNode, NULL, NULL);
if (value && *value) {
int dataType;
dataType=AQHREACT_Param_GetDataType(param);
switch(dataType) {
case AQHREACT_DATAOBJECTTYPE_DOUBLE:
{
int rv;
double valueAsDouble;
rv=GWEN_Text_StringToDouble(value, &valueAsDouble);
if (rv<0) {
DBG_ERROR(NULL, "Not a DOUBLE value for param %s in list [%s]", paramName, value);
return rv;
}
AQHREACT_Param_SetDoubleValue(param, valueAsDouble);
break;
if (dbNetParams) {
GWEN_BUFFER *buf;
int rv;
buf=GWEN_Buffer_new(0, 64, 0, 1);
rv=GWEN_DB_ReplaceVars(dbNetParams, value, buf);
if (rv<0) {
DBG_ERROR(NULL, "Error replacing vars for param \"%s\" (%d)", paramName, rv);
GWEN_Buffer_free(buf);
return rv;
}
case AQHREACT_DATAOBJECTTYPE_STRING:
default:
AQHREACT_Param_SetStringValue(param, value);
break;
rv=_setParamDataFromString(param, GWEN_Buffer_GetStart(buf));
if (rv<0) {
DBG_ERROR(NULL, "Error setting param data for param \"%s\" (%d)", paramName, rv);
GWEN_Buffer_free(buf);
return rv;
}
GWEN_Buffer_free(buf);
}
}
else {
int rv;
rv=_setParamDataFromString(param, value);
if (rv<0) {
DBG_ERROR(NULL, "Error setting param data for param \"%s\" (%d)", paramName, rv);
return rv;
}
}
} /* if value */
}
else {
DBG_ERROR(NULL, "No param name \"%s\" in list", paramName);
@@ -492,6 +525,37 @@ int _readParamValueForList(const AQHREACT_PARAM_LIST *paramList, GWEN_XMLNODE *p
int _setParamDataFromString(AQHREACT_PARAM *param, const char *value)
{
if (value && *value) {
int dataType;
dataType=AQHREACT_Param_GetDataType(param);
switch(dataType) {
case AQHREACT_DATAOBJECTTYPE_DOUBLE:
{
int rv;
double valueAsDouble;
rv=GWEN_Text_StringToDouble(value, &valueAsDouble);
if (rv<0) {
DBG_ERROR(NULL, "Not a DOUBLE value for param \"%s\" [%s]", AQHREACT_Param_GetName(param), value);
return rv;
}
AQHREACT_Param_SetDoubleValue(param, valueAsDouble);
break;
}
case AQHREACT_DATAOBJECTTYPE_STRING:
default:
AQHREACT_Param_SetStringValue(param, value);
break;
}
}
return 0;
}
void _readNetParamDefsWithList(AQHREACT_PARAM_LIST *paramList, GWEN_XMLNODE *unitNetNode)
{
GWEN_XMLNODE *nGroup;