From 605d78a2b71ac5463d966e2e1284129e542d35c2 Mon Sep 17 00:00:00 2001 From: Martin Preuss Date: Mon, 26 Feb 2024 21:22:42 +0100 Subject: [PATCH] aqhome-react: More work on units. --- apps/aqhome-react/0BUILD | 2 + apps/aqhome-react/types/0BUILD | 12 + apps/aqhome-react/types/inputslot.c | 39 +++ apps/aqhome-react/types/inputslot.h | 8 + apps/aqhome-react/types/inputslot_p.h | 3 + apps/aqhome-react/types/link.c | 93 +++++++ apps/aqhome-react/types/link.h | 38 +++ apps/aqhome-react/types/link_p.h | 27 ++ apps/aqhome-react/types/outputslot.c | 149 +++++++++++ apps/aqhome-react/types/outputslot.h | 49 ++++ apps/aqhome-react/types/outputslot_p.h | 29 +++ apps/aqhome-react/types/param.c | 162 ++++++++++++ apps/aqhome-react/types/param.h | 48 ++++ apps/aqhome-react/types/param_p.h | 30 +++ apps/aqhome-react/types/unit.c | 335 +++++++++++++++++++++++++ apps/aqhome-react/types/unit.h | 84 +++++++ apps/aqhome-react/types/unit_p.h | 37 +++ 17 files changed, 1145 insertions(+) create mode 100644 apps/aqhome-react/types/link.c create mode 100644 apps/aqhome-react/types/link.h create mode 100644 apps/aqhome-react/types/link_p.h create mode 100644 apps/aqhome-react/types/outputslot.c create mode 100644 apps/aqhome-react/types/outputslot.h create mode 100644 apps/aqhome-react/types/outputslot_p.h create mode 100644 apps/aqhome-react/types/param.c create mode 100644 apps/aqhome-react/types/param.h create mode 100644 apps/aqhome-react/types/param_p.h create mode 100644 apps/aqhome-react/types/unit.c create mode 100644 apps/aqhome-react/types/unit.h create mode 100644 apps/aqhome-react/types/unit_p.h 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 +