diff --git a/apps/aqhome-react/0BUILD b/apps/aqhome-react/0BUILD
index a32b4e2..374c643 100644
--- a/apps/aqhome-react/0BUILD
+++ b/apps/aqhome-react/0BUILD
@@ -37,6 +37,8 @@
+ aqhome_react.h
+ aqhome_react_p.h
diff --git a/apps/aqhome-react/types/0BUILD b/apps/aqhome-react/types/0BUILD
index e777361..a4e2451 100644
--- a/apps/aqhome-react/types/0BUILD
+++ b/apps/aqhome-react/types/0BUILD
@@ -41,12 +41,24 @@
dataobject_p.h
inputslot.h
inputslot_p.h
+ outputslot.h
+ outputslot_p.h
+ link.h
+ link_p.h
+ param.h
+ param_p.h
+ unit.h
+ unit_p.h
$(local/typefiles)
dataobject.c
inputslot.c
+ outputslot.c
+ link.c
+ param.c
+ unit.c
diff --git a/apps/aqhome-react/types/inputslot.c b/apps/aqhome-react/types/inputslot.c
index dc03c25..dbcf5dd 100644
--- a/apps/aqhome-react/types/inputslot.c
+++ b/apps/aqhome-react/types/inputslot.c
@@ -17,6 +17,8 @@
#include
+GWEN_LIST_FUNCTIONS(AQHREACT_INPUT_SLOT, AQHREACT_InputSlot);
+
AQHREACT_INPUT_SLOT *AQHREACT_InputSlot_new()
@@ -24,6 +26,7 @@ AQHREACT_INPUT_SLOT *AQHREACT_InputSlot_new()
AQHREACT_INPUT_SLOT *inSlot;
GWEN_NEW_OBJECT(AQHREACT_INPUT_SLOT, inSlot);
+ GWEN_LIST_INIT(AQHREACT_INPUT_SLOT, inSlot);
return inSlot;
}
@@ -32,6 +35,7 @@ AQHREACT_INPUT_SLOT *AQHREACT_InputSlot_new()
void AQHREACT_InputSlot_free(AQHREACT_INPUT_SLOT *inSlot)
{
if (inSlot) {
+ GWEN_LIST_FINI(AQHREACT_INPUT_SLOT, inSlot);
free(inSlot->name);
free(inSlot->description);
AQHREACT_DataObject_free(inSlot->currentDataObject);
@@ -41,6 +45,26 @@ void AQHREACT_InputSlot_free(AQHREACT_INPUT_SLOT *inSlot)
+AQHREACT_INPUT_SLOT *AQHREACT_InputSlot_dup(const AQHREACT_INPUT_SLOT *origSlot)
+{
+ if (origSlot) {
+ AQHREACT_INPUT_SLOT *inSlot;
+
+ inSlot=AQHREACT_InputSlot_new();
+ AQHREACT_InputSlot_SetName(inSlot, origSlot->name);
+ AQHREACT_InputSlot_SetDescription(inSlot, origSlot->description);
+ inSlot->idForUnit=origSlot->idForUnit;
+ inSlot->flags=origSlot->flags;
+ inSlot->acceptedDataType=origSlot->acceptedDataType;
+ /* don't copy current dataObject */
+ return inSlot;
+ }
+
+ return NULL;
+}
+
+
+
const char *AQHREACT_InputSlot_GetName(const AQHREACT_INPUT_SLOT *inSlot)
{
return inSlot?inSlot->name:NULL;
@@ -75,6 +99,21 @@ void AQHREACT_InputSlot_SetDescription(AQHREACT_INPUT_SLOT *inSlot, const char *
+int AQHREACT_InputSlot_GetIdForUnit(const AQHREACT_INPUT_SLOT *inSlot)
+{
+ return inSlot?inSlot->idForUnit:0;
+}
+
+
+
+void AQHREACT_InputSlot_SetIdForUnit(AQHREACT_INPUT_SLOT *inSlot, int i)
+{
+ if (inSlot)
+ inSlot->idForUnit=i;
+}
+
+
+
uint32_t AQHREACT_InputSlot_GetFlags(const AQHREACT_INPUT_SLOT *inSlot)
{
return inSlot?inSlot->flags:0;
diff --git a/apps/aqhome-react/types/inputslot.h b/apps/aqhome-react/types/inputslot.h
index ce44fdc..065f465 100644
--- a/apps/aqhome-react/types/inputslot.h
+++ b/apps/aqhome-react/types/inputslot.h
@@ -12,13 +12,18 @@
#include "aqhome-react/aqhome_react.h"
+#include
+
+
typedef struct AQHREACT_INPUT_SLOT AQHREACT_INPUT_SLOT;
+GWEN_LIST_FUNCTION_DEFS(AQHREACT_INPUT_SLOT, AQHREACT_InputSlot)
#include "aqhome-react/types/dataobject.h"
AQHREACT_INPUT_SLOT *AQHREACT_InputSlot_new();
+AQHREACT_INPUT_SLOT *AQHREACT_InputSlot_dup(const AQHREACT_INPUT_SLOT *origSlot);
void AQHREACT_InputSlot_free(AQHREACT_INPUT_SLOT *inSlot);
const char *AQHREACT_InputSlot_GetName(const AQHREACT_INPUT_SLOT *inSlot);
@@ -27,6 +32,9 @@ void AQHREACT_InputSlot_SetName(AQHREACT_INPUT_SLOT *inSlot, const char *s);
const char *AQHREACT_InputSlot_GetDescription(const AQHREACT_INPUT_SLOT *inSlot);
void AQHREACT_InputSlot_SetDescription(AQHREACT_INPUT_SLOT *inSlot, const char *s);
+int AQHREACT_InputSlot_GetIdForUnit(const AQHREACT_INPUT_SLOT *inSlot);
+void AQHREACT_InputSlot_SetIdForUnit(AQHREACT_INPUT_SLOT *inSlot, int i);
+
uint32_t AQHREACT_InputSlot_GetFlags(const AQHREACT_INPUT_SLOT *inSlot);
void AQHREACT_InputSlot_SetFlags(AQHREACT_INPUT_SLOT *inSlot, uint32_t i);
void AQHREACT_InputSlot_AddFlags(AQHREACT_INPUT_SLOT *inSlot, uint32_t i);
diff --git a/apps/aqhome-react/types/inputslot_p.h b/apps/aqhome-react/types/inputslot_p.h
index 6a19baa..b34de74 100644
--- a/apps/aqhome-react/types/inputslot_p.h
+++ b/apps/aqhome-react/types/inputslot_p.h
@@ -14,8 +14,11 @@
struct AQHREACT_INPUT_SLOT {
+ GWEN_LIST_ELEMENT(AQHREACT_INPUT_SLOT)
+
char *name;
char *description;
+ int idForUnit;
uint32_t flags;
int acceptedDataType;
AQHREACT_DATAOBJECT *currentDataObject;
diff --git a/apps/aqhome-react/types/link.c b/apps/aqhome-react/types/link.c
new file mode 100644
index 0000000..33b3019
--- /dev/null
+++ b/apps/aqhome-react/types/link.c
@@ -0,0 +1,93 @@
+/****************************************************************************
+ * This file is part of the project AqHome.
+ * AqHome (c) by 2024 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 "./link_p.h"
+
+#include
+
+
+GWEN_LIST_FUNCTIONS(AQHREACT_LINK, AQHREACT_Link)
+
+
+AQHREACT_LINK *AQHREACT_Link_new()
+{
+ AQHREACT_LINK *lnk;
+
+ GWEN_NEW_OBJECT(AQHREACT_LINK, lnk);
+ GWEN_LIST_INIT(AQHREACT_LINK, lnk);
+ lnk->targetInputSlotIdx=-1;
+
+ return lnk;
+}
+
+
+
+void AQHREACT_Link_free(AQHREACT_LINK *lnk)
+{
+ if (lnk) {
+ GWEN_LIST_FINI(AQHREACT_LINK, lnk);
+ free(lnk->targetUnitId);
+ GWEN_FREE_OBJECT(lnk);
+ }
+}
+
+
+
+const char *AQHREACT_Link_GetTargetUnitId(const AQHREACT_LINK *lnk)
+{
+ return lnk?lnk->targetUnitId:NULL;
+}
+
+
+
+void AQHREACT_Link_SetTargetUnitId(AQHREACT_LINK *lnk, const char *s)
+{
+ if (lnk) {
+ free(lnk->targetUnitId);
+ lnk->targetUnitId=s?strdup(s):NULL;
+ }
+}
+
+
+
+int AQHREACT_Link_GetTargetInputSlotIdx(const AQHREACT_LINK *lnk)
+{
+ return lnk?lnk->targetInputSlotIdx:-1;
+}
+
+
+
+void AQHREACT_Link_SetTargetInputSlotIdx(AQHREACT_LINK *lnk, int i)
+{
+ if (lnk)
+ lnk->targetInputSlotIdx=i;;
+}
+
+
+
+AQHREACT_UNIT *AQHREACT_Link_GetTargetUnit(const AQHREACT_LINK *lnk)
+{
+ return lnk?lnk->targetUnit:NULL;
+}
+
+
+
+void AQHREACT_Link_SetTargetUnit(AQHREACT_LINK *lnk, AQHREACT_UNIT *unit)
+{
+ if (lnk)
+ lnk->targetUnit=unit;
+}
+
+
+
+
diff --git a/apps/aqhome-react/types/link.h b/apps/aqhome-react/types/link.h
new file mode 100644
index 0000000..1de37b1
--- /dev/null
+++ b/apps/aqhome-react/types/link.h
@@ -0,0 +1,38 @@
+/****************************************************************************
+ * This file is part of the project AqHome.
+ * AqHome (c) by 2024 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 AQHOME_REACT_LINK_H
+#define AQHOME_REACT_LINK_H
+
+
+#include
+
+
+typedef struct AQHREACT_LINK AQHREACT_LINK;
+GWEN_LIST_FUNCTION_DEFS(AQHREACT_LINK, AQHREACT_Link)
+
+
+#include "aqhome-react/types/unit.h"
+
+
+AQHREACT_LINK *AQHREACT_Link_new();
+void AQHREACT_Link_free(AQHREACT_LINK *lnk);
+
+
+const char *AQHREACT_Link_GetTargetUnitId(const AQHREACT_LINK *lnk);
+void AQHREACT_Link_SetTargetUnitId(AQHREACT_LINK *lnk, const char *s);
+
+int AQHREACT_Link_GetTargetInputSlotIdx(const AQHREACT_LINK *lnk);
+void AQHREACT_Link_SetTargetInputSlotIdx(AQHREACT_LINK *lnk, int i);
+
+AQHREACT_UNIT *AQHREACT_Link_GetTargetUnit(const AQHREACT_LINK *lnk);
+void AQHREACT_Link_SetTargetUnit(AQHREACT_LINK *lnk, AQHREACT_UNIT *unit);
+
+
+#endif
+
diff --git a/apps/aqhome-react/types/link_p.h b/apps/aqhome-react/types/link_p.h
new file mode 100644
index 0000000..19bd55e
--- /dev/null
+++ b/apps/aqhome-react/types/link_p.h
@@ -0,0 +1,27 @@
+/****************************************************************************
+ * This file is part of the project AqHome.
+ * AqHome (c) by 2024 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 AQHOME_REACT_LINK_P_H
+#define AQHOME_REACT_LINK_P_H
+
+
+#include "aqhome-react/types/link.h"
+
+
+struct AQHREACT_LINK {
+ GWEN_LIST_ELEMENT(AQHREACT_LINK)
+
+ char *targetUnitId;
+ int targetInputSlotIdx;
+
+ AQHREACT_UNIT *targetUnit;
+};
+
+
+#endif
+
diff --git a/apps/aqhome-react/types/outputslot.c b/apps/aqhome-react/types/outputslot.c
new file mode 100644
index 0000000..3cd58c9
--- /dev/null
+++ b/apps/aqhome-react/types/outputslot.c
@@ -0,0 +1,149 @@
+/****************************************************************************
+ * This file is part of the project AqHome.
+ * AqHome (c) by 2024 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 "./outputslot_p.h"
+#include "aqhome-react/types/dataobject.h"
+
+#include
+
+
+
+GWEN_LIST_FUNCTIONS(AQHREACT_OUTPUT_SLOT, AQHREACT_OutputSlot)
+
+
+AQHREACT_OUTPUT_SLOT *AQHREACT_OutputSlot_new()
+{
+ AQHREACT_OUTPUT_SLOT *outSlot;
+
+ GWEN_NEW_OBJECT(AQHREACT_OUTPUT_SLOT, outSlot);
+ GWEN_LIST_INIT(AQHREACT_OUTPUT_SLOT, outSlot);
+ outSlot->linkList=AQHREACT_Link_List_new();
+ return outSlot;
+}
+
+
+
+void AQHREACT_OutputSlot_free(AQHREACT_OUTPUT_SLOT *outSlot)
+{
+ if (outSlot) {
+ GWEN_LIST_FINI(AQHREACT_OUTPUT_SLOT, outSlot);
+ free(outSlot->name);
+ free(outSlot->description);
+ AQHREACT_Link_List_free(outSlot->linkList);
+ GWEN_FREE_OBJECT(outSlot);
+ }
+}
+
+
+
+const char *AQHREACT_OutputSlot_GetName(const AQHREACT_OUTPUT_SLOT *outSlot)
+{
+ return outSlot?outSlot->name:NULL;
+}
+
+
+
+void AQHREACT_OutputSlot_SetName(AQHREACT_OUTPUT_SLOT *outSlot, const char *s)
+{
+ if (outSlot) {
+ free(outSlot->name);
+ outSlot->name=s?strdup(s):NULL;
+ }
+}
+
+
+
+const char *AQHREACT_OutputSlot_GetDescription(const AQHREACT_OUTPUT_SLOT *outSlot)
+{
+ return outSlot?outSlot->description:NULL;
+}
+
+
+
+void AQHREACT_OutputSlot_SetDescription(AQHREACT_OUTPUT_SLOT *outSlot, const char *s)
+{
+ if (outSlot) {
+ free(outSlot->description);
+ outSlot->description=s?strdup(s):NULL;
+ }
+}
+
+
+
+uint32_t AQHREACT_OutputSlot_GetFlags(const AQHREACT_OUTPUT_SLOT *outSlot)
+{
+ return outSlot?outSlot->flags:0;
+}
+
+
+
+void AQHREACT_OutputSlot_SetFlags(AQHREACT_OUTPUT_SLOT *outSlot, uint32_t f)
+{
+ if (outSlot)
+ outSlot->flags=f;
+}
+
+
+
+void AQHREACT_OutputSlot_AddFlags(AQHREACT_OUTPUT_SLOT *outSlot, uint32_t f)
+{
+ if (outSlot)
+ outSlot->flags|=f;
+}
+
+
+
+void AQHREACT_OutputSlot_SubFlags(AQHREACT_OUTPUT_SLOT *outSlot, uint32_t f)
+{
+ if (outSlot)
+ outSlot->flags&=~f;
+}
+
+
+
+int AQHREACT_OutputSlot_GetEmittedDataType(const AQHREACT_OUTPUT_SLOT *outSlot)
+{
+ return outSlot?outSlot->emittedDataType:AQHREACT_DATAOBJECTTYPE_UNKNOWN;
+}
+
+
+
+void AQHREACT_OutputSlot_SetEmittedDataType(AQHREACT_OUTPUT_SLOT *outSlot, int i)
+{
+ if (outSlot)
+ outSlot->emittedDataType=i;
+}
+
+
+
+AQHREACT_LINK_LIST *AQHREACT_OutputSlot_GetLinkList(const AQHREACT_OUTPUT_SLOT *outSlot)
+{
+ return outSlot?outSlot->linkList:NULL;
+}
+
+
+
+void AQHREACT_OutputSlot_AddLink(AQHREACT_OUTPUT_SLOT *outSlot, AQHREACT_LINK *lnk)
+{
+ if (outSlot)
+ AQHREACT_Link_List_Add(lnk, outSlot->linkList);
+}
+
+
+
+
+
+
+
+
+
diff --git a/apps/aqhome-react/types/outputslot.h b/apps/aqhome-react/types/outputslot.h
new file mode 100644
index 0000000..ed848f5
--- /dev/null
+++ b/apps/aqhome-react/types/outputslot.h
@@ -0,0 +1,49 @@
+/****************************************************************************
+ * This file is part of the project AqHome.
+ * AqHome (c) by 2024 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 AQHOME_REACT_OUTPUTSLOT_H
+#define AQHOME_REACT_OUTPUTSLOT_H
+
+#include "aqhome-react/aqhome_react.h"
+
+#include
+
+
+typedef struct AQHREACT_OUTPUT_SLOT AQHREACT_OUTPUT_SLOT;
+GWEN_LIST_FUNCTION_DEFS(AQHREACT_OUTPUT_SLOT, AQHREACT_OutputSlot)
+
+
+#include "aqhome-react/types/link.h"
+
+
+
+AQHREACT_OUTPUT_SLOT *AQHREACT_OutputSlot_new();
+void AQHREACT_OutputSlot_free(AQHREACT_OUTPUT_SLOT *outSlot);
+
+const char *AQHREACT_OutputSlot_GetName(const AQHREACT_OUTPUT_SLOT *outSlot);
+void AQHREACT_OutputSlot_SetName(AQHREACT_OUTPUT_SLOT *outSlot, const char *s);
+
+const char *AQHREACT_OutputSlot_GetDescription(const AQHREACT_OUTPUT_SLOT *outSlot);
+void AQHREACT_OutputSlot_SetDescription(AQHREACT_OUTPUT_SLOT *outSlot, const char *s);
+
+uint32_t AQHREACT_OutputSlot_GetFlags(const AQHREACT_OUTPUT_SLOT *outSlot);
+void AQHREACT_OutputSlot_SetFlags(AQHREACT_OUTPUT_SLOT *outSlot, uint32_t f);
+void AQHREACT_OutputSlot_AddFlags(AQHREACT_OUTPUT_SLOT *outSlot, uint32_t f);
+void AQHREACT_OutputSlot_SubFlags(AQHREACT_OUTPUT_SLOT *outSlot, uint32_t f);
+
+int AQHREACT_OutputSlot_GetEmittedDataType(const AQHREACT_OUTPUT_SLOT *outSlot);
+void AQHREACT_OutputSlot_SetEmittedDataType(AQHREACT_OUTPUT_SLOT *outSlot, int i);
+
+
+AQHREACT_LINK_LIST *AQHREACT_OutputSlot_GetLinkList(const AQHREACT_OUTPUT_SLOT *outSlot);
+void AQHREACT_OutputSlot_AddLink(AQHREACT_OUTPUT_SLOT *outSlot, AQHREACT_LINK *lnk);
+
+
+
+#endif
+
diff --git a/apps/aqhome-react/types/outputslot_p.h b/apps/aqhome-react/types/outputslot_p.h
new file mode 100644
index 0000000..35b692a
--- /dev/null
+++ b/apps/aqhome-react/types/outputslot_p.h
@@ -0,0 +1,29 @@
+/****************************************************************************
+ * This file is part of the project AqHome.
+ * AqHome (c) by 2024 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 AQHOME_REACT_OUTPUTSLOT_P_H
+#define AQHOME_REACT_OUTPUTSLOT_P_H
+
+
+#include "aqhome-react/types/outputslot.h"
+
+
+struct AQHREACT_OUTPUT_SLOT {
+ GWEN_LIST_ELEMENT(AQHREACT_OUTPUT_SLOT)
+
+ char *name;
+ char *description;
+ uint32_t flags;
+ int emittedDataType;
+
+ AQHREACT_LINK_LIST *linkList;
+};
+
+
+#endif
+
diff --git a/apps/aqhome-react/types/param.c b/apps/aqhome-react/types/param.c
new file mode 100644
index 0000000..e9e2815
--- /dev/null
+++ b/apps/aqhome-react/types/param.c
@@ -0,0 +1,162 @@
+/****************************************************************************
+ * This file is part of the project AqHome.
+ * AqHome (c) by 2024 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 "./param_p.h"
+#include "./dataobject.h"
+
+
+
+GWEN_LIST_FUNCTIONS(AQHREACT_PARAM, AQHREACT_Param)
+
+
+
+AQHREACT_PARAM *AQHREACT_Param_new()
+{
+ AQHREACT_PARAM *param;
+
+ GWEN_NEW_OBJECT(AQHREACT_PARAM, param);
+ GWEN_LIST_INIT(AQHREACT_PARAM, param);
+
+ return param;
+}
+
+
+
+void AQHREACT_Param_free(AQHREACT_PARAM *param)
+{
+ if (param) {
+ GWEN_LIST_FINI(AQHREACT_PARAM, param);
+ free(param->name);
+ free(param->description);
+ free(param->stringValue);
+ GWEN_FREE_OBJECT(param);
+ }
+}
+
+
+
+const char *AQHREACT_Param_GetName(const AQHREACT_PARAM *param)
+{
+ return param?param->name:NULL;
+}
+
+
+
+void AQHREACT_Param_SetName(AQHREACT_PARAM *param, const char *s)
+{
+ if (param) {
+ free(param->name);
+ param->name=s?strdup(s):NULL;
+ }
+}
+
+
+
+const char *AQHREACT_Param_GetDescription(const AQHREACT_PARAM *param)
+{
+ return param?param->description:NULL;
+}
+
+
+
+void AQHREACT_Param_SetDescription(AQHREACT_PARAM *param, const char *s)
+{
+ if (param) {
+ free(param->description);
+ param->description=s?strdup(s):NULL;
+ }
+}
+
+
+
+int AQHREACT_Param_GetDataType(const AQHREACT_PARAM *param)
+{
+ return param?param->dataType:AQHREACT_DATAOBJECTTYPE_UNKNOWN;
+}
+
+
+
+void AQHREACT_Param_SetDataType(AQHREACT_PARAM *param, int i)
+{
+ if (param)
+ param->dataType=i;
+}
+
+
+
+const char *AQHREACT_Param_GetStringValue(const AQHREACT_PARAM *param)
+{
+ return param?param->stringValue:NULL;
+}
+
+
+
+void AQHREACT_Param_SetStringValue(AQHREACT_PARAM *param, const char *s)
+{
+ if (param) {
+ free(param->stringValue);
+ param->stringValue=s?strdup(s):NULL;
+ }
+}
+
+
+
+double AQHREACT_Param_GetDoubleValue(const AQHREACT_PARAM *param)
+{
+ return param?param->doubleValue:0.0;
+}
+
+
+
+void AQHREACT_Param_SetDoubleValue(AQHREACT_PARAM *param, double d)
+{
+ if (param)
+ param->doubleValue=d;
+}
+
+
+
+uint32_t AQHREACT_Param_GetFlags(const AQHREACT_PARAM *param)
+{
+ return param?param->flags:0;
+}
+
+
+
+void AQHREACT_Param_SetFlags(AQHREACT_PARAM *param, uint32_t f)
+{
+ if (param)
+ param->flags=f;
+}
+
+
+
+void AQHREACT_Param_AddFlags(AQHREACT_PARAM *param, uint32_t f)
+{
+ if (param)
+ param->flags|=f;
+}
+
+
+
+void AQHREACT_Param_SubFlags(AQHREACT_PARAM *param, uint32_t f)
+{
+ if (param)
+ param->flags&=~f;
+}
+
+
+
+
+
+
diff --git a/apps/aqhome-react/types/param.h b/apps/aqhome-react/types/param.h
new file mode 100644
index 0000000..b3c9470
--- /dev/null
+++ b/apps/aqhome-react/types/param.h
@@ -0,0 +1,48 @@
+/****************************************************************************
+ * This file is part of the project AqHome.
+ * AqHome (c) by 2024 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 AQHOME_REACT_PARAM_H
+#define AQHOME_REACT_PARAM_H
+
+#include "aqhome-react/aqhome_react.h"
+
+
+#include
+
+
+typedef struct AQHREACT_PARAM AQHREACT_PARAM;
+GWEN_LIST_FUNCTION_DEFS(AQHREACT_PARAM, AQHREACT_Param)
+
+
+AQHREACT_PARAM *AQHREACT_Param_new();
+void AQHREACT_Param_free(AQHREACT_PARAM *param);
+
+const char *AQHREACT_Param_GetName(const AQHREACT_PARAM *param);
+void AQHREACT_Param_SetName(AQHREACT_PARAM *param, const char *s);
+
+const char *AQHREACT_Param_GetDescription(const AQHREACT_PARAM *param);
+void AQHREACT_Param_SetDescription(AQHREACT_PARAM *param, const char *s);
+
+int AQHREACT_Param_GetDataType(const AQHREACT_PARAM *param);
+void AQHREACT_Param_SetDataType(AQHREACT_PARAM *param, int i);
+
+const char *AQHREACT_Param_GetStringValue(const AQHREACT_PARAM *param);
+void AQHREACT_Param_SetStringValue(AQHREACT_PARAM *param, const char *s);
+
+double AQHREACT_Param_GetDoubleValue(const AQHREACT_PARAM *param);
+void AQHREACT_Param_SetDoubleValue(AQHREACT_PARAM *param, double d);
+
+uint32_t AQHREACT_Param_GetFlags(const AQHREACT_PARAM *param);
+void AQHREACT_Param_SetFlags(AQHREACT_PARAM *param, uint32_t f);
+void AQHREACT_Param_AddFlags(AQHREACT_PARAM *param, uint32_t f);
+void AQHREACT_Param_SubFlags(AQHREACT_PARAM *param, uint32_t f);
+
+
+
+#endif
+
diff --git a/apps/aqhome-react/types/param_p.h b/apps/aqhome-react/types/param_p.h
new file mode 100644
index 0000000..27599e0
--- /dev/null
+++ b/apps/aqhome-react/types/param_p.h
@@ -0,0 +1,30 @@
+/****************************************************************************
+ * This file is part of the project AqHome.
+ * AqHome (c) by 2024 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 AQHOME_REACT_PARAM_P_H
+#define AQHOME_REACT_PARAM_P_H
+
+
+#include "aqhome-react/types/param.h"
+
+
+struct AQHREACT_PARAM {
+ GWEN_LIST_ELEMENT(AQHREACT_PARAM)
+
+ char *name;
+ char *description;
+ int dataType;
+ char *stringValue;
+ double doubleValue;
+
+ uint32_t flags;
+};
+
+
+#endif
+
diff --git a/apps/aqhome-react/types/unit.c b/apps/aqhome-react/types/unit.c
new file mode 100644
index 0000000..766956c
--- /dev/null
+++ b/apps/aqhome-react/types/unit.c
@@ -0,0 +1,335 @@
+/****************************************************************************
+ * 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 "./unit_p.h"
+
+#include
+
+
+GWEN_LIST_FUNCTIONS(AQHREACT_UNIT, AQHREACT_Unit)
+GWEN_INHERIT_FUNCTIONS(AQHREACT_UNIT)
+
+
+
+AQHREACT_UNIT *AQHREACT_Unit_new()
+{
+ AQHREACT_UNIT *unit;
+
+ GWEN_NEW_OBJECT(AQHREACT_UNIT, unit);
+ GWEN_INHERIT_INIT(AQHREACT_UNIT, unit);
+ GWEN_LIST_INIT(AQHREACT_UNIT, unit);
+
+ unit->inputSlotList=AQHREACT_InputSlot_List_new();
+ unit->outputSlotList=AQHREACT_OutputSlot_List_new();
+ unit->paramList=AQHREACT_Param_List_new();
+
+ return unit;
+}
+
+
+
+void AQHREACT_Unit_free(AQHREACT_UNIT *unit)
+{
+ if (unit) {
+ GWEN_LIST_FINI(AQHREACT_UNIT, unit);
+ GWEN_INHERIT_FINI(AQHREACT_UNIT, unit);
+ free(unit->name);
+ free(unit->description);
+ AQHREACT_InputSlot_List_free(unit->inputSlotList);
+ AQHREACT_OutputSlot_List_free(unit->outputSlotList);
+ AQHREACT_Param_List_free(unit->paramList);
+ GWEN_FREE_OBJECT(unit);
+ }
+}
+
+
+
+const char *AQHREACT_Unit_GetName(const AQHREACT_UNIT *unit)
+{
+ return unit?unit->name:NULL;
+}
+
+
+
+void AQHREACT_Unit_SetName(AQHREACT_UNIT *unit, const char *s)
+{
+ if (unit) {
+ free(unit->name);
+ unit->name=s?strdup(s):NULL;
+ }
+}
+
+
+
+const char *AQHREACT_Unit_GetDescription(const AQHREACT_UNIT *unit)
+{
+ return unit?unit->description:NULL;
+}
+
+
+
+void AQHREACT_Unit_SetDescription(AQHREACT_UNIT *unit, const char *s)
+{
+ if (unit) {
+ free(unit->description);
+ unit->description=s?strdup(s):NULL;
+ }
+}
+
+
+
+const char *AQHREACT_Unit_GetId(const AQHREACT_UNIT *unit)
+{
+ return unit?unit->id:NULL;
+}
+
+
+
+void AQHREACT_Unit_SetId(AQHREACT_UNIT *unit, const char *s)
+{
+ if (unit) {
+ free(unit->id);
+ unit->id=s?strdup(s):NULL;
+ }
+}
+
+
+
+uint32_t AQHREACT_Unit_GetFlags(const AQHREACT_UNIT *unit)
+{
+ return unit?unit->flags:0;
+}
+
+
+
+void AQHREACT_Unit_SetFlags(AQHREACT_UNIT *unit, uint32_t i)
+{
+ if (unit)
+ unit->flags=i;
+}
+
+
+
+void AQHREACT_Unit_AddFlags(AQHREACT_UNIT *unit, uint32_t i)
+{
+ if (unit)
+ unit->flags|=i;
+}
+
+
+
+void AQHREACT_Unit_SubFlags(AQHREACT_UNIT *unit, uint32_t i)
+{
+ if (unit)
+ unit->flags&=~i;
+}
+
+
+
+AQHREACT_INPUT_SLOT_LIST *AQHREACT_Unit_GetInputSlots(const AQHREACT_UNIT *unit)
+{
+ return unit?unit->inputSlotList:NULL;
+}
+
+
+
+void AQHREACT_Unit_AddInputSlot(AQHREACT_UNIT *unit, AQHREACT_INPUT_SLOT *inSlot)
+{
+ if (unit)
+ AQHREACT_InputSlot_List_Add(inSlot, unit->inputSlotList);
+}
+
+
+
+AQHREACT_OUTPUT_SLOT_LIST *AQHREACT_Unit_GetOutputSlots(const AQHREACT_UNIT *unit)
+{
+ return unit?unit->outputSlotList:NULL;
+}
+
+
+
+void AQHREACT_Unit_AddOutputSlot(AQHREACT_UNIT *unit, AQHREACT_OUTPUT_SLOT *outSlot)
+{
+ if (unit)
+ AQHREACT_OutputSlot_List_Add(outSlot, unit->outputSlotList);
+}
+
+
+
+AQHREACT_PARAM_LIST *AQHREACT_Unit_GetParamList(const AQHREACT_UNIT *unit)
+{
+ return unit?unit->paramList:NULL;
+}
+
+
+
+void AQHREACT_Unit_AddParam(AQHREACT_UNIT *unit, AQHREACT_PARAM *param)
+{
+ if (unit)
+ AQHREACT_Param_List_Add(param, unit->paramList);
+}
+
+
+
+AQHREACT_UNIT_INPUTDATA_FN AQHREACT_Unit_SetInputDataFn(AQHREACT_UNIT *unit, AQHREACT_UNIT_INPUTDATA_FN f)
+{
+ if (unit) {
+ AQHREACT_UNIT_INPUTDATA_FN oldFn;
+
+ oldFn=unit->inputDataFn;
+ unit->inputDataFn=f;
+ return oldFn;
+ }
+ return NULL;
+}
+
+
+
+AQHREACT_UNIT_PROCESS_FN AQHREACT_Unit_SetProcessFn(AQHREACT_UNIT *unit, AQHREACT_UNIT_PROCESS_FN f)
+{
+ if (unit) {
+ AQHREACT_UNIT_PROCESS_FN oldFn;
+
+ oldFn=unit->processFn;
+ unit->processFn=f;
+ return oldFn;
+ }
+ return NULL;
+}
+
+
+
+void AQHREACT_Unit_OutputData(AQHREACT_UNIT *unit, int slotIndex, const AQHREACT_DATAOBJECT *dataObject)
+{
+ if (unit && unit->outputSlotList) {
+ AQHREACT_OUTPUT_SLOT *slot;
+
+ slot=AQHREACT_Unit_GetOutputSlotAt(unit, slotIndex);
+ if (slot) {
+ AQHREACT_LINK_LIST *linkList;
+
+ linkList=AQHREACT_OutputSlot_GetLinkList(slot);
+ if (linkList) {
+ AQHREACT_LINK *lnk;
+
+ lnk=AQHREACT_Link_List_First(linkList);
+ while(lnk) {
+ AQHREACT_UNIT *targetUnit;
+ int idx;
+
+ targetUnit=AQHREACT_Link_GetTargetUnit(lnk);
+ idx=AQHREACT_Link_GetTargetInputSlotIdx(lnk);
+ if (targetUnit && idx>=0)
+ AQHREACT_Unit_InputData(targetUnit, idx, dataObject);
+ lnk=AQHREACT_Link_List_Next(lnk);
+ } /* while */
+ } /* if linkList */
+ } /* if slot */
+ } /* if unit */
+}
+
+
+
+void AQHREACT_Unit_InputData(AQHREACT_UNIT *unit, int slotIndex, const AQHREACT_DATAOBJECT *dataObject)
+{
+ if (unit) {
+ if (unit->inputDataFn)
+ (unit->inputDataFn)(unit, slotIndex, dataObject);
+ else {
+ AQHREACT_Unit_ClearChangeFlagsInUnitAndInputSlots(unit);
+ }
+ }
+ else {
+ DBG_ERROR(NULL, "Nullpointer");
+ }
+}
+
+
+
+int AQHREACT_Unit_Process(AQHREACT_UNIT *unit)
+{
+ if (unit) {
+ if (unit->processFn)
+ return (unit->processFn)(unit);
+ else {
+ AQHREACT_INPUT_SLOT *slot;
+
+ unit->flags&=~AQHREACT_UNIT_FLAGS_CHANGED;
+ slot=AQHREACT_InputSlot_List_First(unit->inputSlotList);
+ while(slot) {
+ AQHREACT_InputSlot_SubFlags(slot, AQHREACT_UNIT_FLAGS_CHANGED);
+ slot=AQHREACT_InputSlot_List_Next(slot);
+ }
+ }
+ }
+
+ return 0;
+}
+
+
+
+AQHREACT_INPUT_SLOT *AQHREACT_Unit_GetInputSlotAt(AQHREACT_UNIT *unit, int idx)
+{
+ if (unit && unit->inputSlotList && idx>=0) {
+ AQHREACT_INPUT_SLOT *slot;
+
+ slot=AQHREACT_InputSlot_List_First(unit->inputSlotList);
+ while(slot && idx) {
+ slot=AQHREACT_InputSlot_List_Next(slot);
+ idx--;
+ }
+
+ return slot;
+ }
+
+ return NULL;
+}
+
+
+
+AQHREACT_OUTPUT_SLOT *AQHREACT_Unit_GetOutputSlotAt(AQHREACT_UNIT *unit, int idx)
+{
+ if (unit && unit->outputSlotList && idx>=0) {
+ AQHREACT_OUTPUT_SLOT *slot;
+
+ slot=AQHREACT_OutputSlot_List_First(unit->outputSlotList);
+ while(slot && idx) {
+ slot=AQHREACT_OutputSlot_List_Next(slot);
+ idx--;
+ }
+ return slot;
+ }
+
+ return NULL;
+}
+
+
+
+void AQHREACT_Unit_ClearChangeFlagsInUnitAndInputSlots(AQHREACT_UNIT *unit)
+{
+ if (unit) {
+ AQHREACT_INPUT_SLOT *slot;
+
+ unit->flags&=~AQHREACT_UNIT_FLAGS_CHANGED;
+ slot=AQHREACT_InputSlot_List_First(unit->inputSlotList);
+ while(slot) {
+ AQHREACT_InputSlot_SubFlags(slot, AQHREACT_UNIT_FLAGS_CHANGED);
+ slot=AQHREACT_InputSlot_List_Next(slot);
+ }
+ }
+}
+
+
+
+
+
diff --git a/apps/aqhome-react/types/unit.h b/apps/aqhome-react/types/unit.h
new file mode 100644
index 0000000..f89a4e7
--- /dev/null
+++ b/apps/aqhome-react/types/unit.h
@@ -0,0 +1,84 @@
+/****************************************************************************
+ * 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 AQHOME_REACT_UNIT_H
+#define AQHOME_REACT_UNIT_H
+
+
+#include "aqhome-react/aqhome_react.h"
+
+#include
+#include
+
+
+typedef struct AQHREACT_UNIT AQHREACT_UNIT;
+GWEN_LIST_FUNCTION_DEFS(AQHREACT_UNIT, AQHREACT_Unit)
+GWEN_INHERIT_FUNCTION_DEFS(AQHREACT_UNIT)
+
+
+#define AQHREACT_UNIT_FLAGS_CHANGED 0x80000000
+#define AQHREACT_UNIT_FLAGS_INUSE 0x40000000
+#define AQHREACT_UNIT_FLAGS_MULTI 0x20000000
+
+
+#include "aqhome-react/types/inputslot.h"
+#include "aqhome-react/types/outputslot.h"
+#include "aqhome-react/types/param.h"
+
+
+typedef void (*AQHREACT_UNIT_INPUTDATA_FN)(AQHREACT_UNIT *unit, int slotIndex, const AQHREACT_DATAOBJECT *dataObject);
+typedef int (*AQHREACT_UNIT_PROCESS_FN)(AQHREACT_UNIT *unit);
+
+
+
+AQHREACT_UNIT *AQHREACT_Unit_new();
+void AQHREACT_Unit_free(AQHREACT_UNIT *unit);
+
+const char *AQHREACT_Unit_GetName(const AQHREACT_UNIT *unit);
+void AQHREACT_Unit_SetName(AQHREACT_UNIT *unit, const char *s);
+
+const char *AQHREACT_Unit_GetDescription(const AQHREACT_UNIT *unit);
+void AQHREACT_Unit_SetDescription(AQHREACT_UNIT *unit, const char *s);
+
+const char *AQHREACT_Unit_GetId(const AQHREACT_UNIT *unit);
+void AQHREACT_Unit_SetId(AQHREACT_UNIT *unit, const char *s);
+
+uint32_t AQHREACT_Unit_GetFlags(const AQHREACT_UNIT *unit);
+void AQHREACT_Unit_SetFlags(AQHREACT_UNIT *unit, uint32_t i);
+void AQHREACT_Unit_AddFlags(AQHREACT_UNIT *unit, uint32_t i);
+void AQHREACT_Unit_SubFlags(AQHREACT_UNIT *unit, uint32_t i);
+
+AQHREACT_INPUT_SLOT_LIST *AQHREACT_Unit_GetInputSlots(const AQHREACT_UNIT *unit);
+void AQHREACT_Unit_AddInputSlot(AQHREACT_UNIT *unit, AQHREACT_INPUT_SLOT *inSlot);
+AQHREACT_INPUT_SLOT *AQHREACT_Unit_GetInputSlotAt(AQHREACT_UNIT *unit, int idx);
+
+AQHREACT_OUTPUT_SLOT_LIST *AQHREACT_Unit_GetOutputSlots(const AQHREACT_UNIT *unit);
+void AQHREACT_Unit_AddOutputSlot(AQHREACT_UNIT *unit, AQHREACT_OUTPUT_SLOT *outSlot);
+AQHREACT_OUTPUT_SLOT *AQHREACT_Unit_GetOutputSlotAt(AQHREACT_UNIT *unit, int idx);
+
+void AQHREACT_Unit_ClearChangeFlagsInUnitAndInputSlots(AQHREACT_UNIT *unit);
+
+
+AQHREACT_PARAM_LIST *AQHREACT_Unit_GetParamList(const AQHREACT_UNIT *unit);
+void AQHREACT_Unit_AddParam(AQHREACT_UNIT *unit, AQHREACT_PARAM *param);
+
+
+void AQHREACT_Unit_OutputData(AQHREACT_UNIT *unit, int slotIndex, const AQHREACT_DATAOBJECT *dataObject);
+
+void AQHREACT_Unit_InputData(AQHREACT_UNIT *unit, int slotIndex, const AQHREACT_DATAOBJECT *dataObject);
+
+int AQHREACT_Unit_Process(AQHREACT_UNIT *unit);
+
+
+AQHREACT_UNIT_INPUTDATA_FN AQHREACT_Unit_SetInputDataFn(AQHREACT_UNIT *unit, AQHREACT_UNIT_INPUTDATA_FN f);
+AQHREACT_UNIT_PROCESS_FN AQHREACT_Unit_SetProcessFn(AQHREACT_UNIT *unit, AQHREACT_UNIT_PROCESS_FN f);
+
+
+
+#endif
+
diff --git a/apps/aqhome-react/types/unit_p.h b/apps/aqhome-react/types/unit_p.h
new file mode 100644
index 0000000..ab82de0
--- /dev/null
+++ b/apps/aqhome-react/types/unit_p.h
@@ -0,0 +1,37 @@
+/****************************************************************************
+ * 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 AQHOME_REACT_UNIT_P_H
+#define AQHOME_REACT_UNIT_P_H
+
+
+#include "aqhome-react/types/unit.h"
+
+
+struct AQHREACT_UNIT {
+ GWEN_INHERIT_ELEMENT(AQHREACT_UNIT)
+ GWEN_LIST_ELEMENT(AQHREACT_UNIT)
+
+ char *name;
+ char *description;
+ char *id;
+
+ uint32_t flags;
+
+ AQHREACT_INPUT_SLOT_LIST *inputSlotList;
+ AQHREACT_OUTPUT_SLOT_LIST *outputSlotList;
+
+ AQHREACT_PARAM_LIST *paramList;
+
+ AQHREACT_UNIT_INPUTDATA_FN inputDataFn;
+ AQHREACT_UNIT_PROCESS_FN processFn;
+};
+
+
+#endif
+