diff --git a/apps/aqhome-mqttlog/0BUILD b/apps/aqhome-mqttlog/0BUILD index 1626956..4d705ac 100644 --- a/apps/aqhome-mqttlog/0BUILD +++ b/apps/aqhome-mqttlog/0BUILD @@ -39,7 +39,6 @@ xmlread.h xmlwrite.h - c_setdata.h server.h server_p.h s_publish.h @@ -48,11 +47,9 @@ $(local/typefiles) - aqhome_mqtt.c main.c xmlread.c xmlwrite.c - c_setdata.c server.c s_publish.c s_setdata.c diff --git a/apps/aqhome-mqttlog/aqhome_mqtt.c b/apps/aqhome-mqttlog/aqhome_mqtt.c deleted file mode 100644 index 13ffaf5..0000000 --- a/apps/aqhome-mqttlog/aqhome_mqtt.c +++ /dev/null @@ -1,189 +0,0 @@ -/**************************************************************************** - * 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 "./aqhome_mqtt_p.h" -#include "aqhome/ipc/endpoint_ipc.h" -#include "aqhome/ipc/endpoint_ipcclient.h" -#include "aqhome/mqtt/endpoint_mqttc.h" -#include "aqhome/mqtt/msg_mqtt_publish.h" - -#include -#include - - - - - -AQHOME_MQTT *AqHomeMqtt_new(void) -{ - AQHOME_MQTT *aqh; - - GWEN_NEW_OBJECT(AQHOME_MQTT, aqh); - - return aqh; -} - - - -void AqHomeMqtt_free(AQHOME_MQTT *aqh) -{ - if (aqh) { - AQHMQTT_Device_List_free(aqh->availableDeviceList); - AQHMQTT_Device_List_free(aqh->registeredDeviceList); - GWEN_MsgEndpoint_free(aqh->rootEndpoint); - GWEN_DB_Group_free(aqh->dbArgs); - free(aqh->pidFile); - - GWEN_FREE_OBJECT(aqh); - } -} - - - -GWEN_MSG_ENDPOINT *AqHomeMqtt_GetBrokerEndpoint(const AQHOME_MQTT *aqh) -{ - return aqh?(aqh->brokerEndpoint):NULL; -} - - - -GWEN_MSG_ENDPOINT *AqHomeMqtt_GetMqttEndpoint(const AQHOME_MQTT *aqh) -{ - return aqh?(aqh->mqttEndpoint):NULL; -} - - - -GWEN_DB_NODE *AqHomeMqtt_GetDbArgs(const AQHOME_MQTT *aqh) -{ - return aqh?(aqh->dbArgs):NULL; -} - - - -const char *AqHomeMqtt_GetPidFile(const AQHOME_MQTT *aqh) -{ - return aqh?aqh->pidFile:NULL; -} - - - -void AqHomeMqtt_SetPidFile(AQHOME_MQTT *aqh, const char *s) -{ - if (aqh) { - free(aqh->pidFile); - aqh->pidFile=s?strdup(s):NULL; - } -} - - - -int AqHomeMqtt_GetTimeout(const AQHOME_MQTT *aqh) -{ - return aqh?aqh->timeout:0; -} - - - -const char *AqHomeMqtt_GetDeviceFile(const AQHOME_MQTT *aqh) -{ - return aqh?aqh->deviceFile:NULL; -} - - - -void AqHomeMqtt_SetDeviceFile(AQHOME_MQTT *aqh, const char *s) -{ - if (aqh) { - free(aqh->deviceFile); - aqh->deviceFile=s?strdup(s):NULL; - } -} - - - -AQHMQTT_DEVICE_LIST *AqHomeMqtt_GetAvailableDeviceList(const AQHOME_MQTT *aqh) -{ - return aqh?aqh->availableDeviceList:NULL; -} - - - -void AqHomeMqtt_SetAvailableDeviceList(AQHOME_MQTT *aqh, AQHMQTT_DEVICE_LIST *dl) -{ - if (aqh) { - AQHMQTT_Device_List_free(aqh->availableDeviceList); - aqh->availableDeviceList=dl; - } -} - - - -void AqHomeMqtt_SetRegisteredDeviceList(AQHOME_MQTT *aqh, AQHMQTT_DEVICE_LIST *dl) -{ - if (aqh) { - AQHMQTT_Device_List_free(aqh->registeredDeviceList); - aqh->registeredDeviceList=dl; - } -} - - - -AQHMQTT_DEVICE *AqHomeMqtt_FindRegisteredDevice(AQHOME_MQTT *aqh, const char *wantedDeviceId) -{ - if (aqh && aqh->registeredDeviceList) { - return AQHMQTT_Device_List_GetById(aqh->registeredDeviceList, wantedDeviceId); - } - else { - DBG_ERROR(NULL, "No registered devices"); - } - - return NULL; -} - - - -void AqHomeMqtt_DumpRegisteredDevices(const AQHOME_MQTT *aqh) -{ - if (aqh && aqh->registeredDeviceList) { - AQHMQTT_DEVICE *device; - - device=AQHMQTT_Device_List_First(aqh->registeredDeviceList); - if (device) { - fprintf(stderr, "Registered Devices:\n"); - while(device) { - const char *sDeviceName; - const char *sDeviceId; - - sDeviceName=AQHMQTT_Device_GetName(device); - sDeviceId=AQHMQTT_Device_GetId(device); - fprintf(stderr, " %s (%s)\n", sDeviceId?sDeviceId:"", sDeviceName?sDeviceName:""); - device=AQHMQTT_Device_List_Next(device); - } - } - else { - fprintf(stderr, "No registered devices\n"); - } - } - else { - fprintf(stderr, "No registered devices\n"); - } -} - - - - - - - - diff --git a/apps/aqhome-mqttlog/aqhome_mqtt.h b/apps/aqhome-mqttlog/aqhome_mqtt.h deleted file mode 100644 index 106347e..0000000 --- a/apps/aqhome-mqttlog/aqhome_mqtt.h +++ /dev/null @@ -1,51 +0,0 @@ -/**************************************************************************** - * 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_MQTT_H -#define AQHOME_MQTT_H - - -//#include "./mqttvalue.h" -//#include "./mqtttopic.h" -#include "aqhome-mqttlog/types/device.h" - - -#include - - - -typedef struct AQHOME_MQTT AQHOME_MQTT; - - -AQHOME_MQTT *AqHomeMqtt_new(void); -void AqHomeMqtt_free(AQHOME_MQTT *aqh); - -GWEN_MSG_ENDPOINT *AqHomeMqtt_GetBrokerEndpoint(const AQHOME_MQTT *aqh); -GWEN_MSG_ENDPOINT *AqHomeMqtt_GetMqttEndpoint(const AQHOME_MQTT *aqh); - -GWEN_DB_NODE *AqHomeMqtt_GetDbArgs(const AQHOME_MQTT *aqh); - -const char *AqHomeMqtt_GetPidFile(const AQHOME_MQTT *aqh); -void AqHomeMqtt_SetPidFile(AQHOME_MQTT *aqh, const char *s); - -int AqHomeMqtt_GetTimeout(const AQHOME_MQTT *aqh); - -const char *AqHomeMqtt_GetDeviceFile(const AQHOME_MQTT *aqh); -void AqHomeMqtt_SetDeviceFile(AQHOME_MQTT *aqh, const char *s); - - -AQHMQTT_DEVICE_LIST *AqHomeMqtt_GetAvailableDeviceList(const AQHOME_MQTT *aqh); -void AqHomeMqtt_SetAvailableDeviceList(AQHOME_MQTT *aqh, AQHMQTT_DEVICE_LIST *dl); - -void AqHomeMqtt_SetRegisteredDeviceList(AQHOME_MQTT *aqh, AQHMQTT_DEVICE_LIST *dl); -AQHMQTT_DEVICE *AqHomeMqtt_FindRegisteredDevice(AQHOME_MQTT *aqh, const char *wantedDeviceId); - -void AqHomeMqtt_DumpRegisteredDevices(const AQHOME_MQTT *aqh); - -#endif - diff --git a/apps/aqhome-mqttlog/aqhome_mqtt_p.h b/apps/aqhome-mqttlog/aqhome_mqtt_p.h deleted file mode 100644 index bcf2788..0000000 --- a/apps/aqhome-mqttlog/aqhome_mqtt_p.h +++ /dev/null @@ -1,45 +0,0 @@ -/**************************************************************************** - * 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_MQTT_P_H -#define AQHOME_MQTT_P_H - - -#include "./aqhome_mqtt.h" - -#include - - -#define AQHOME_MQTT_DEFAULT_PIDFILE "/var/run/aqhome-mqtt.pid" -#define AQHOME_MQTT_DEFAULT_DATADIR "/var/lib/aqhome-mqtt" -#define AQHOME_MQTT_DEFAULT_DEVICEFILE "mqttlog/registereddevices.xml" - -#define AQHOME_MQTT_DEFAULT_BROKER_PORT 1899 -#define AQHOME_MQTT_DEFAULT_BROKER_CLIENTID "mqtt" - - - - -struct AQHOME_MQTT { - GWEN_MSG_ENDPOINT *rootEndpoint; - GWEN_MSG_ENDPOINT *brokerEndpoint; /* do not free (is part of tree pointed to by rootEndpoint) */ - GWEN_MSG_ENDPOINT *mqttEndpoint; /* do not free (is part of tree pointed to by rootEndpoint) */ - - GWEN_DB_NODE *dbArgs; - char *pidFile; - int timeout; /* timeout for run e.g. inside valgrind */ - - AQHMQTT_DEVICE_LIST *availableDeviceList; - AQHMQTT_DEVICE_LIST *registeredDeviceList; - - char *deviceFile; -}; - - -#endif - diff --git a/apps/aqhome-mqttlog/c_setdata.c b/apps/aqhome-mqttlog/c_setdata.c deleted file mode 100644 index 9da96b7..0000000 --- a/apps/aqhome-mqttlog/c_setdata.c +++ /dev/null @@ -1,160 +0,0 @@ -/**************************************************************************** - * 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 "./c_setdata.h" -#include "aqhome/data/value.h" -#include "aqhome/ipc/data/msg_data_set.h" -#include "aqhome/mqtt/msg_mqtt_publish.h" - -#include - - - -/* ------------------------------------------------------------------------------------------------ - * forward declarations - * ------------------------------------------------------------------------------------------------ - */ - -static void _sendDataForDevice(AQHOME_MQTT *aqh, const AQHMQTT_DEVICE *device, const char *valueName, const char *valueData); -static void _sendValueToMqtt(AQHOME_MQTT *aqh, const char *deviceId, const AQHMQTT_TOPIC *topic, const char *valueData); -static GWEN_BUFFER *_createBufferForTopic(const char *deviceId, const AQHMQTT_TOPIC *topic); - - - -/* ------------------------------------------------------------------------------------------------ - * implementations - * ------------------------------------------------------------------------------------------------ - */ - -void AqHomeMqttLog_HandleSetData(AQHOME_MQTT *aqh, GWEN_UNUSED GWEN_MSG_ENDPOINT *ep, GWEN_MSG *recvdMsg) -{ - AQH_VALUE *recvdValue; - - DBG_ERROR(NULL, "Received SETDATA request"); - AQH_SetDataIpcMsg_Parse(recvdMsg, 0); - recvdValue=AQH_SetDataIpcMsg_ReadValue(recvdMsg); - if (recvdValue) { - const char *valueName; - const char *deviceName; - - valueName=recvdValue?AQH_Value_GetName(recvdValue):NULL; - deviceName=recvdValue?AQH_Value_GetDeviceName(recvdValue):NULL; - if (valueName && deviceName) { - AQHMQTT_DEVICE *device; - - device=AqHomeMqtt_FindRegisteredDevice(aqh, deviceName); - if (device) { - char *valueDataFreeable; - - DBG_ERROR(NULL, "Sending data to value \"%s\" of device \"%s\"", valueName, deviceName); - valueDataFreeable=AQH_SetDataIpcMsg_ReadData(recvdMsg); - _sendDataForDevice(aqh, device, valueName, valueDataFreeable); - free(valueDataFreeable); - } - else { - DBG_ERROR(NULL, "Device \"%s\" not found", deviceName); - AqHomeMqtt_DumpRegisteredDevices(aqh); - } - } - else { - DBG_ERROR(NULL, "Either value name or device name missing in request"); - } - AQH_Value_free(recvdValue); - } - else { - DBG_ERROR(NULL, "Request does not contain a value object"); - } -} - - - -void _sendDataForDevice(AQHOME_MQTT *aqh, const AQHMQTT_DEVICE *device, const char *valueName, const char *valueData) -{ - const char *deviceId; - - deviceId=AQHMQTT_Device_GetId(device); - if (deviceId && *deviceId) { - AQHMQTT_TOPIC_LIST *topicList; - - topicList=AQHMQTT_Device_GetTopicList(device); - if (topicList) { - AQHMQTT_TOPIC *topic; - - topic=AQHMQTT_Topic_List_First(topicList); - while(topic) { - if (AQHMQTT_Topic_GetDirection(topic)==AQHMQTT_TopicDir_Out) { - AQHMQTT_VALUE_LIST *valueList; - AQHMQTT_VALUE *value; - - valueList=AQHMQTT_Topic_GetValueList(topic); - value=valueList?AQHMQTT_Value_List_GetByName(valueList, valueName):NULL; - if (value) { - /* found value, create publish msg, send */ - DBG_ERROR(NULL, "Topic \"%s\" contains value \"%s\"", AQHMQTT_Topic_GetName(topic), valueName); - _sendValueToMqtt(aqh, deviceId, topic, valueData); - } - } /* if out */ - topic=AQHMQTT_Topic_List_Next(topic); - } /* while topic */ - } - } - else { - DBG_ERROR(NULL, "Device has no id"); - } -} - - - -void _sendValueToMqtt(AQHOME_MQTT *aqh, const char *deviceId, const AQHMQTT_TOPIC *topic, const char *valueData) -{ - GWEN_MSG_ENDPOINT *ep; - GWEN_BUFFER *buf; - GWEN_MSG *msgOut; - - ep=AqHomeMqtt_GetMqttEndpoint(aqh); - buf=_createBufferForTopic(deviceId, topic); - DBG_ERROR(NULL, "MQTT PUBLISH: %s = %s", GWEN_Buffer_GetStart(buf), valueData?valueData:""); - msgOut=AQH_PublishMqttMsg_new(0, 0, GWEN_Buffer_GetStart(buf), - (const uint8_t*) (valueData?valueData:NULL), - valueData?strlen(valueData):0); - if (msgOut) { - GWEN_MsgEndpoint_AddSendMessage(ep, msgOut); - } - else { - DBG_ERROR(NULL, "Error creating message"); - } - GWEN_Buffer_free(buf); -} - - - -GWEN_BUFFER *_createBufferForTopic(const char *deviceId, const AQHMQTT_TOPIC *topic) -{ - GWEN_BUFFER *buf; - const char *s; - - buf=GWEN_Buffer_new(0, 256, 0, 1); - s=AQHMQTT_Topic_GetBeforeId(topic); - if (s && *s) - GWEN_Buffer_AppendString(buf, s); - GWEN_Buffer_AppendString(buf, deviceId); - s=AQHMQTT_Topic_GetAfterId(topic); - if (s && *s) - GWEN_Buffer_AppendString(buf, s); - return buf; -} - - - - - - diff --git a/apps/aqhome-mqttlog/c_setdata.h b/apps/aqhome-mqttlog/c_setdata.h deleted file mode 100644 index 437a190..0000000 --- a/apps/aqhome-mqttlog/c_setdata.h +++ /dev/null @@ -1,25 +0,0 @@ -/**************************************************************************** - * 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_MQTTLOG_C_SETDATA_H -#define AQHOME_MQTTLOG_C_SETDATA_H - - -#include "./aqhome_mqtt.h" - - -void AqHomeMqttLog_HandleSetData(AQHOME_MQTT *aqh, GWEN_MSG_ENDPOINT *ep, GWEN_MSG *recvdMsg); - - - -#endif - - - - - diff --git a/apps/aqhome-mqttlog/fini.c b/apps/aqhome-mqttlog/fini.c deleted file mode 100644 index 610f8f3..0000000 --- a/apps/aqhome-mqttlog/fini.c +++ /dev/null @@ -1,85 +0,0 @@ -/**************************************************************************** - * 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 "./fini.h" -#include "./aqhome_mqtt_p.h" - -#include -#include -#include -#include - -#include - - - -/* ------------------------------------------------------------------------------------------------ - * defines - * ------------------------------------------------------------------------------------------------ - */ - - - - -/* ------------------------------------------------------------------------------------------------ - * forward declarations - * ------------------------------------------------------------------------------------------------ - */ - -static void _disconnectTree(GWEN_MSG_ENDPOINT *ep); - - - -/* ------------------------------------------------------------------------------------------------ - * implementations - * ------------------------------------------------------------------------------------------------ - */ - -void AqHomeMqtt_Fini(AQHOME_MQTT *aqh) -{ - if (aqh) { - if (aqh->rootEndpoint) - _disconnectTree(aqh->rootEndpoint); - GWEN_MsgEndpoint_free(aqh->rootEndpoint); - aqh->rootEndpoint=NULL; - aqh->brokerEndpoint=NULL; - aqh->mqttEndpoint=NULL; - - AQHMQTT_Device_List_free(aqh->availableDeviceList); - aqh->availableDeviceList=NULL; - AQHMQTT_Device_List_free(aqh->registeredDeviceList); - aqh->registeredDeviceList=NULL; - - if (aqh->pidFile) - remove(aqh->pidFile); - } -} - - - -void _disconnectTree(GWEN_MSG_ENDPOINT *ep) -{ - GWEN_MSG_ENDPOINT *epChild; - - epChild=GWEN_MsgEndpoint_Tree2_GetFirstChild(ep); - while(epChild) { - _disconnectTree(epChild); - epChild=GWEN_MsgEndpoint_Tree2_GetNext(epChild); - } /* while */ - - GWEN_MsgEndpoint_Disconnect(ep); -} - - - - diff --git a/apps/aqhome-mqttlog/fini.h b/apps/aqhome-mqttlog/fini.h deleted file mode 100644 index 7ec8e1f..0000000 --- a/apps/aqhome-mqttlog/fini.h +++ /dev/null @@ -1,23 +0,0 @@ -/**************************************************************************** - * 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 AQHOMEMQTT_FINI_H -#define AQHOMEMQTT_FINI_H - - -#include "./aqhome_mqtt.h" - - - -void AqHomeMqtt_Fini(AQHOME_MQTT *aqh); - - - -#endif - - diff --git a/apps/aqhome-mqttlog/init.c b/apps/aqhome-mqttlog/init.c deleted file mode 100644 index fcc8983..0000000 --- a/apps/aqhome-mqttlog/init.c +++ /dev/null @@ -1,489 +0,0 @@ -/**************************************************************************** - * 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 "./init.h" -#include "./aqhome_mqtt_p.h" -#include "./xmlread.h" -#include "./xmlwrite.h" - -#include "aqhome/aqhome.h" -#include "aqhome/ipc/endpoint_ipc.h" -#include "aqhome/ipc/endpoint_ipcclient.h" -#include "aqhome/mqtt/endpoint_mqttc.h" - -#include -#include -#include - -#include -#include -#include -#include -#include -#include - - - -/* ------------------------------------------------------------------------------------------------ - * defines - * ------------------------------------------------------------------------------------------------ - */ - -#define I18N(msg) msg -#define I18S(msg) msg - - - -/* ------------------------------------------------------------------------------------------------ - * forward declarations - * ------------------------------------------------------------------------------------------------ - */ - -static int _createPidFile(const char *pidFilename); -static int _setupBroker(AQHOME_MQTT *aqh, GWEN_DB_NODE *dbArgs); -static int _setupMqtt(AQHOME_MQTT *aqh, GWEN_DB_NODE *dbArgs); -static int _readArgs(int argc, char **argv, GWEN_DB_NODE *dbArgs); - - - -/* ------------------------------------------------------------------------------------------------ - * implementations - * ------------------------------------------------------------------------------------------------ - */ - -int AqHomeMqtt_Init(AQHOME_MQTT *aqh, int argc, char **argv) -{ - int rv; - GWEN_DB_NODE *dbArgs; - const char *s; - - dbArgs=GWEN_DB_Group_new("args"); - rv=_readArgs(argc, argv, dbArgs); - if (rv<0) { - DBG_ERROR(NULL, "Error reading args (%d)", rv); - return rv; - } - AQH_MergeConfigFileIntoConfig(dbArgs, "ConfigFile"); - aqh->dbArgs=dbArgs; - - s=GWEN_DB_GetCharValue(dbArgs, "loglevel", 0, NULL); - if (s && *s) { - GWEN_LOGGER_LEVEL ll; - - ll=GWEN_Logger_Name2Level(s); - GWEN_Logger_SetLevel(NULL, ll); - } - - aqh->timeout=GWEN_DB_GetIntValue(dbArgs, "timeout", 0, 0); - - s=GWEN_DB_GetCharValue(dbArgs, "pidfile", 0, AQHOME_MQTT_DEFAULT_PIDFILE); - if (s && *s) { - AqHomeMqtt_SetPidFile(aqh, s); - rv=_createPidFile(s); - if (rv<0) { - DBG_ERROR(NULL, "Error creating PID file (%d)", rv); - return rv; - } - } - - s=GWEN_DB_GetCharValue(dbArgs, "devicefile", 0, NULL); - if (s && *s) { - AqHomeMqtt_SetDeviceFile(aqh, s); - } - else { - GWEN_BUFFER *bufFilename; - - bufFilename=AQH_GetRuntimeFilePath(AQHOME_MQTT_DEFAULT_DEVICEFILE); - if (bufFilename) { - AqHomeMqtt_SetDeviceFile(aqh, GWEN_Buffer_GetStart(bufFilename)); - GWEN_Buffer_free(bufFilename); - } - else { - DBG_ERROR(NULL, "Could not setup filename for devices, please specify via command line argument"); - return GWEN_ERROR_GENERIC; - } - } - - aqh->rootEndpoint=GWEN_MsgEndpoint_new("root", 0); - - rv=_setupMqtt(aqh, dbArgs); - if (rv<0) { - DBG_ERROR(NULL, "Error setting up connection to broker (%d)", rv); - return rv; - } - - rv=_setupBroker(aqh, dbArgs); - if (rv<0) { - DBG_ERROR(NULL, "Error setting up connection to broker (%d)", rv); - return rv; - } - - AqHomeMqtt_LoadRuntimeDeviceFiles(aqh); - - AqHomeMqtt_ReloadDeviceFiles(aqh); - - return 0; -} - - - -void AqHomeMqtt_ReloadDeviceFiles(AQHOME_MQTT *aqh) -{ - AQHMQTT_DEVICE_LIST *deviceList; - - DBG_ERROR(NULL, "Loading devices description files"); - deviceList=AqHomeMqttLog_ReadDataDeviceFiles(aqh); - if (deviceList) - AqHomeMqtt_SetAvailableDeviceList(aqh, deviceList); -} - - - -void AqHomeMqtt_LoadRuntimeDeviceFiles(AQHOME_MQTT *aqh) -{ - AQHMQTT_DEVICE_LIST *deviceList; - - DBG_ERROR(NULL, "Loading registered devices from file \"%s\"", aqh->deviceFile); - deviceList=AqHomeMqttLog_ReadDeviceFile(aqh, aqh->deviceFile); - if (deviceList) - AqHomeMqtt_SetRegisteredDeviceList(aqh, deviceList); -} - - - -int AqHomeMqtt_SaveRuntimeDeviceFiles(AQHOME_MQTT *aqh) -{ - int rv; - - rv=AqHomeMqttLog_WriteDevicesFile(aqh, aqh->registeredDeviceList, aqh->deviceFile); - if (rv<0) { - DBG_INFO(NULL, "Error writing devices to \"%s\" (%d)", aqh->deviceFile, rv); - return rv; - } - return 0; -} - - - -int _createPidFile(const char *pidFilename) -{ - FILE *f; - int pidfd; - - if (remove(pidFilename)==0) { - DBG_ERROR(0, "Old PID file existed, removed. (Unclean shutdown?)"); - } - -#ifdef HAVE_SYS_STAT_H - pidfd = open(pidFilename, O_EXCL|O_CREAT|O_WRONLY, S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH); - if (pidfd < 0) { - DBG_ERROR(NULL, "Could not create PID file \"%s\" (%s), aborting.", pidFilename, strerror(errno)); - return GWEN_ERROR_IO; - } - - f = fdopen(pidfd, "w"); -#else /* HAVE_STAT_H */ - f=fopen(pidFilename,"w+"); -#endif /* HAVE_STAT_H */ - - /* write pid */ -#ifdef HAVE_GETPID - fprintf(f,"%d\n",getpid()); -#else - fprintf(f,"-1\n"); -#endif - if (fclose(f)) { - DBG_ERROR(0, "Could not close PID file \"%s\" (%s), aborting.", pidFilename, strerror(errno)); - return GWEN_ERROR_IO; - } - return 0; -} - - - -int _setupBroker(AQHOME_MQTT *aqh, GWEN_DB_NODE *dbArgs) -{ - const char *brokerAddress; - int brokerPort; - const char *brokerClientId; - - brokerAddress=GWEN_DB_GetCharValue(dbArgs, "brokerAddress", 0, NULL); - if (!(brokerAddress && *brokerAddress)) - brokerAddress=GWEN_DB_GetCharValue(dbArgs, "ConfigFile/brokerAddress", 0, "127.0.0.1"); - - brokerPort=GWEN_DB_GetIntValue(dbArgs, "brokerPort", 0, -1); - if (brokerPort<0) - brokerPort=GWEN_DB_GetIntValue(dbArgs, "ConfigFile/brokerPort", 0, AQHOME_MQTT_DEFAULT_BROKER_PORT); - - brokerClientId=GWEN_DB_GetCharValue(dbArgs, "brokerClientId", 0, AQHOME_MQTT_DEFAULT_BROKER_CLIENTID); - - if (brokerAddress && *brokerAddress && brokerPort) { - GWEN_MSG_ENDPOINT *ep; - GWEN_MSG_ENDPOINT *ipcBaseEndpoint; - int rv; - - ep=AQH_ClientIpcEndpoint_new("brokerIpcClient", 0); - ipcBaseEndpoint=AQH_IpcEndpoint_CreateIpcTcpClient(brokerAddress, brokerPort, "brokerPhysEndpoint", 0); - AQH_IpcEndpoint_SetServiceName(ipcBaseEndpoint, brokerClientId); - GWEN_MsgEndpoint_Tree2_AddChild(ep, ipcBaseEndpoint); - - GWEN_MsgEndpoint_Tree2_AddChild(aqh->rootEndpoint, ep); - aqh->brokerEndpoint=ep; - - rv=GWEN_MultilayerEndpoint_StartConnect(ep); - if (rv<0 && rv!=GWEN_ERROR_IN_PROGRESS) { - DBG_ERROR(NULL, "Error connecting to broker server %s:%d (%d), will retry later", brokerAddress, brokerPort, rv); - return rv; - } - } - - return 0; -} - - - -int _setupMqtt(AQHOME_MQTT *aqh, GWEN_DB_NODE *dbArgs) -{ - const char *mqttAddress; - int mqttPort; - const char *mqttClientId; - int mqttKeepAlive; - - mqttAddress=GWEN_DB_GetCharValue(dbArgs, "mqttAddress", 0, NULL); - if (!(mqttAddress && *mqttAddress)) - mqttAddress=GWEN_DB_GetCharValue(dbArgs, "ConfigFile/mqttAddr", 0, "127.0.0.1"); - - mqttPort=GWEN_DB_GetIntValue(dbArgs, "mqttPort", 0, 1883); - if (mqttPort<0) - mqttPort=GWEN_DB_GetIntValue(dbArgs, "ConfigFile/mqttPort", 0, 1883); - - mqttClientId=GWEN_DB_GetCharValue(dbArgs, "mqttClientId", 0, "aqhome-mqttlog"); - if (!(mqttClientId && *mqttClientId)) - mqttClientId=GWEN_DB_GetCharValue(dbArgs, "ConfigFile/mqttClientId", 0, "aqhome-mqttlog"); - - mqttKeepAlive=GWEN_DB_GetIntValue(dbArgs, "mqttKeepAlive", 0, 600); - - if (mqttAddress && *mqttAddress && mqttPort) { - GWEN_MSG_ENDPOINT *epMqtt; - - DBG_INFO(AQH_LOGDOMAIN, "Connecting to %s (port %d)", mqttAddress, mqttPort); - epMqtt=AQH_MqttClientEndpoint_new(mqttClientId, mqttAddress, mqttPort, NULL, 0); - if (epMqtt==NULL) { - DBG_ERROR(AQH_LOGDOMAIN, "Error creating endpoint TCP"); - return GWEN_ERROR_IO; - } - AQH_MqttClientEndpoint_SetKeepAliveTime(epMqtt, mqttKeepAlive); - GWEN_MsgEndpoint_AddFlags(epMqtt, AQH_ENDPOINT2_MQTTCLIENT_FLAGS_SUBSCRIBEALL); - - GWEN_MsgEndpoint_Tree2_AddChild(aqh->rootEndpoint, epMqtt); - aqh->mqttEndpoint=epMqtt; - } - - return 0; -} - - - - - -int _readArgs(int argc, char **argv, GWEN_DB_NODE *dbArgs) -{ - int rv; - const GWEN_ARGS args[]= { - { - GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ - GWEN_ArgsType_Char, /* type */ - "loglevel", /* name */ - 0, /* minnum */ - 1, /* maxnum */ - "L", /* short option */ - "loglevel", /* long option */ - I18S("Specify loglevel"), /* short description */ - I18S("Specify loglevel") /* long description */ - }, - { - GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ - GWEN_ArgsType_Char, /* type */ - "cfgdir", /* name */ - 0, /* minnum */ - 1, /* maxnum */ - "D", /* short option */ - "cfgdir", /* long option */ - I18S("Specify the configuration folder"), - I18S("Specify the configuration folder") - }, - { - GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ - GWEN_ArgsType_Char, /* type */ - "charset", /* name */ - 0, /* minnum */ - 1, /* maxnum */ - 0, /* short option */ - "charset", /* long option */ - I18S("Specify the output character set"), /* short description */ - I18S("Specify the output character set") /* long description */ - }, - { - GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ - GWEN_ArgsType_Char, /* type */ - "brokerAddress", /* name */ - 0, /* minnum */ - 1, /* maxnum */ - "ba", /* short option */ - "brokeraddress", /* long option */ - I18S("Specify the address of the broker server to connect to (disabled if missing)"), - I18S("Specify the address of the broker server to connect to (disabled if missing)") - }, - { - GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ - GWEN_ArgsType_Int, /* type */ - "brokerPort", /* name */ - 0, /* minnum */ - 1, /* maxnum */ - "bp", /* short option */ - "brokerport", /* long option */ - I18S("Specify the port of the broker server (default: 1899)"), - I18S("Specify the port of the broker server (default: 1899)") - }, - { - GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ - GWEN_ArgsType_Char, /* type */ - "brokerClientId", /* name */ - 0, /* minnum */ - 1, /* maxnum */ - NULL, /* short option */ - "brokerclientid", /* long option */ - I18S("Specify client id for the broker server (default: \"nodes\")"), - I18S("Specify client id for the broker server (default: \"nodes\")") - }, - - { - GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ - GWEN_ArgsType_Char, /* type */ - "mqttAddress", /* name */ - 0, /* minnum */ - 1, /* maxnum */ - "ma", /* short option */ - "mqttaddress", /* long option */ - I18S("Specify the address of the MQTT server to connect to (disabled if missing)"), - I18S("Specify the address of the MQTT server to connect to (disabled if missing)") - }, - { - GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ - GWEN_ArgsType_Int, /* type */ - "mqttPort", /* name */ - 0, /* minnum */ - 1, /* maxnum */ - "mp", /* short option */ - "mqttport", /* long option */ - I18S("Specify the port of the MQTT server (default: 1883)"), - I18S("Specify the port of the MQTT server (default: 1883)") - }, - { - GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ - GWEN_ArgsType_Char, /* type */ - "mqttClientId", /* name */ - 0, /* minnum */ - 1, /* maxnum */ - NULL, /* short option */ - "mqttclientid", /* long option */ - I18S("Specify client id for the MQTT server (default: \"aqhomed\")"), - I18S("Specify client id for the MQTT server (default: \"aqhomed\")") - }, - { - GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ - GWEN_ArgsType_Int, /* type */ - "mqttKeepAlive", /* name */ - 0, /* minnum */ - 1, /* maxnum */ - "mk", /* short option */ - "mqttkeepalive", /* long option */ - I18S("Specify keepalive time in seconds (defaults: 600)"), - I18S("Specify keepalive time in seconds (defaults: 600)") - }, - - { - GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ - GWEN_ArgsType_Char, /* type */ - "pidfile", /* name */ - 0, /* minnum */ - 1, /* maxnum */ - "p", /* short option */ - "pidfile", /* long option */ - I18S("Specify the PID file"), - I18S("Specify the PID file") - }, - { - GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ - GWEN_ArgsType_Int, /* type */ - "timeout", /* name */ - 0, /* minnum */ - 1, /* maxnum */ - "T", /* short option */ - "timeout", /* long option */ - I18S("Specify timeout in second (default: no timeout)"), - I18S("Specify timeout in second (default: no timeout)") - }, - { - GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ - GWEN_ArgsType_Char, /* type */ - "devicefile", /* name */ - 0, /* minnum */ - 1, /* maxnum */ - "d", /* short option */ - "devicefile", /* long option */ - I18S("Specify the device file"), - I18S("Specify the device file") - }, - - { - GWEN_ARGS_FLAGS_HELP | GWEN_ARGS_FLAGS_LAST, /* flags */ - GWEN_ArgsType_Int, /* type */ - "help", /* name */ - 0, /* minnum */ - 0, /* maxnum */ - "h", /* short option */ - "help", - I18S("Show this help screen."), - I18S("Show this help screen.") - } - }; - - rv=GWEN_Args_Check(argc, argv, 1, 0, args, dbArgs); - if (rv==GWEN_ARGS_RESULT_ERROR) { - fprintf(stderr, "ERROR: Could not parse arguments main\n"); - return GWEN_ERROR_INVALID; - } - else if (rv==GWEN_ARGS_RESULT_HELP) { - GWEN_BUFFER *ubuf; - - ubuf=GWEN_Buffer_new(0, 1024, 0, 1); - GWEN_Buffer_AppendArgs(ubuf, - I18N("This is version %s.\nUsage: %s [OPTIONS]\n\nOptions:\n"), - AQHOME_VERSION_STRING, - argv[0]); - if (GWEN_Args_Usage(args, ubuf, GWEN_ArgsOutType_Txt)) { - fprintf(stderr, "ERROR: Could not create help string\n"); - return 1; - } - GWEN_Buffer_AppendString(ubuf, "\n"); - - fprintf(stdout, "%s\n", GWEN_Buffer_GetStart(ubuf)); - GWEN_Buffer_free(ubuf); - return GWEN_ERROR_CLOSE; - } - return 0; -} - - - diff --git a/apps/aqhome-mqttlog/init.h b/apps/aqhome-mqttlog/init.h deleted file mode 100644 index ea91e13..0000000 --- a/apps/aqhome-mqttlog/init.h +++ /dev/null @@ -1,27 +0,0 @@ -/**************************************************************************** - * 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 AQHOMEMQTT_INIT_H -#define AQHOMEMQTT_INIT_H - - -#include "./aqhome_mqtt.h" - - - -int AqHomeMqtt_Init(AQHOME_MQTT *aqh, int argc, char **argv); -void AqHomeMqtt_ReloadDeviceFiles(AQHOME_MQTT *aqh); - -void AqHomeMqtt_LoadRuntimeDeviceFiles(AQHOME_MQTT *aqh); -int AqHomeMqtt_SaveRuntimeDeviceFiles(AQHOME_MQTT *aqh); - - - -#endif - - diff --git a/apps/aqhome-mqttlog/loop.c b/apps/aqhome-mqttlog/loop.c deleted file mode 100644 index 8cea000..0000000 --- a/apps/aqhome-mqttlog/loop.c +++ /dev/null @@ -1,57 +0,0 @@ -/**************************************************************************** - * 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 "./loop.h" -#include "./loop_ipc.h" -#include "./loop_mqtt.h" -#include "./c_setdata.h" -#include "./aqhome_mqtt_p.h" - -#include -#include -#include -#include -#include -#include - - -//#define FULL_DEBUG - - -/* ------------------------------------------------------------------------------------------------ - * forward declarations - * ------------------------------------------------------------------------------------------------ - */ - - - -/* ------------------------------------------------------------------------------------------------ - * implementations - * ------------------------------------------------------------------------------------------------ - */ - -void AqHomeMqttLog_Loop(AQHOME_MQTT *aqh, int timeoutInMsecs) -{ - if (aqh) { - GWEN_MsgEndpoint_ChildrenIoLoop(aqh->rootEndpoint, timeoutInMsecs); - AqHomeMqttLog_ReadAndHandleMqttMessages(aqh); - AqHomeMqttLog_ReadAndHandleIpcMessages(aqh); - } -} - - - - - - - - diff --git a/apps/aqhome-mqttlog/loop.h b/apps/aqhome-mqttlog/loop.h deleted file mode 100644 index 28a6679..0000000 --- a/apps/aqhome-mqttlog/loop.h +++ /dev/null @@ -1,26 +0,0 @@ -/**************************************************************************** - * 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 AQHOMEMQTT_LOOP_H -#define AQHOMEMQTT_LOOP_H - - -#include "./aqhome_mqtt.h" - -#include -#include - - - -void AqHomeMqttLog_Loop(AQHOME_MQTT *aqh, int timeoutInMsecs); - - - -#endif - - diff --git a/apps/aqhome-mqttlog/loop_ipc.c b/apps/aqhome-mqttlog/loop_ipc.c deleted file mode 100644 index 852c185..0000000 --- a/apps/aqhome-mqttlog/loop_ipc.c +++ /dev/null @@ -1,87 +0,0 @@ -/**************************************************************************** - * 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 "./loop_ipc.h" -#include "./aqhome_mqtt_p.h" -#include "./c_setdata.h" -#include "aqhome/ipc/data/ipc_data.h" - -#include -#include -#include -#include -#include -#include - - -#define FULL_DEBUG - - -/* ------------------------------------------------------------------------------------------------ - * forward declarations - * ------------------------------------------------------------------------------------------------ - */ - -static void _handleIpcMsg(AQHOME_MQTT *aqh, GWEN_MSG_ENDPOINT *ep, GWEN_MSG *msg); - - - -/* ------------------------------------------------------------------------------------------------ - * implementations - * ------------------------------------------------------------------------------------------------ - */ - - -void AqHomeMqttLog_ReadAndHandleIpcMessages(AQHOME_MQTT *aqh) -{ - GWEN_MSG_ENDPOINT *epTcp; - GWEN_MSG *msg; - - epTcp=aqh->brokerEndpoint; - while( (msg=GWEN_MsgEndpoint_TakeFirstReceivedMessage(epTcp)) ) { - _handleIpcMsg(aqh, epTcp, msg); - GWEN_Msg_free(msg); - } -} - - - -void _handleIpcMsg(AQHOME_MQTT *aqh, GWEN_MSG_ENDPOINT *ep, GWEN_MSG *msg) -{ - uint16_t code; - uint8_t protoId; - - /* exec IPC message */ - code=GWEN_IpcMsg_GetCode(msg); - protoId=GWEN_IpcMsg_GetProtoId(msg); - if (protoId==AQH_IPC_PROTOCOL_DATA_ID) { - DBG_DEBUG(AQH_LOGDOMAIN, "Received IPC packet %d (%x)", (int) code, code); - switch(code) { - case AQH_MSGTYPE_IPC_DATA_SETDATA: AqHomeMqttLog_HandleSetData(aqh, ep, msg); break; - default: break; - } - } - else if (protoId==0 && code==AQH_MSGTYPE_IPC_DATA_RESULT) { - /* result received */ - } - else { - DBG_ERROR(NULL, "Invalid IPC protocol %d (%02x)", protoId, protoId); - } -} - - - - - - - - diff --git a/apps/aqhome-mqttlog/loop_ipc.h b/apps/aqhome-mqttlog/loop_ipc.h deleted file mode 100644 index 657bd65..0000000 --- a/apps/aqhome-mqttlog/loop_ipc.h +++ /dev/null @@ -1,26 +0,0 @@ -/**************************************************************************** - * 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 AQHOMEMQTT_LOOP_IPC_H -#define AQHOMEMQTT_LOOP_IPC_H - - -#include "./aqhome_mqtt.h" - -#include -#include - - - -void AqHomeMqttLog_ReadAndHandleIpcMessages(AQHOME_MQTT *aqh); - - - -#endif - - diff --git a/apps/aqhome-mqttlog/loop_mqtt.c b/apps/aqhome-mqttlog/loop_mqtt.c deleted file mode 100644 index 88b0cd7..0000000 --- a/apps/aqhome-mqttlog/loop_mqtt.c +++ /dev/null @@ -1,501 +0,0 @@ -/**************************************************************************** - * 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 "./loop_mqtt.h" -#include "./aqhome_mqtt_p.h" -#include "aqhome/aqhome.h" -#include "aqhome/mqtt/msg_mqtt_publish.h" -#include "aqhome/ipc/data/msg_data_multidata.h" -#include "aqhome/ipc/data/msg_data_values.h" -#include "aqhome/ipc/data/ipc_data.h" - -#include -#include -#include -#include -#include -#include - - -//#define FULL_DEBUG - - -/* ------------------------------------------------------------------------------------------------ - * forward declarations - * ------------------------------------------------------------------------------------------------ - */ - -static void _handleMqttMsg(AQHOME_MQTT *aqh, GWEN_MSG_ENDPOINT *ep, const GWEN_MSG *msg); -static void _handlePublishMsg(AQHOME_MQTT *aqh, GWEN_MSG_ENDPOINT *ep, const GWEN_MSG *msg); -static int _handlePublish(AQHOME_MQTT *aqh, GWEN_MSG_ENDPOINT *ep, const char *topic, const char *value); -static void _handleNumTopic(AQHOME_MQTT *aqh, GWEN_MSG_ENDPOINT *ep, AQHMQTT_DEVICE *dev, AQHMQTT_TOPIC *t, const char *rcvdValue); -static void _handleJsonTopic(AQHOME_MQTT *aqh, GWEN_MSG_ENDPOINT *ep, AQHMQTT_DEVICE *dev, AQHMQTT_TOPIC *t, const char *rcvdValue); -static void _sendMessage(AQHOME_MQTT *aqh, const AQHMQTT_DEVICE *device, const AQHMQTT_VALUE *value, const char *rcvdValue); -static void _announceDeviceToBroker(AQHOME_MQTT *aqh, const AQHMQTT_DEVICE *device); -static void _sendAnnounceValueMessage(AQHOME_MQTT *aqh, const AQHMQTT_DEVICE *device, const AQHMQTT_VALUE *value); -static AQH_VALUE *_mkMessageValue(const AQHMQTT_DEVICE *device, const AQHMQTT_VALUE *value); -static int _mqttValueTypeMessageValueType(int t); -static int _registerNewDeviceForTopic(AQHOME_MQTT *aqh, GWEN_MSG_ENDPOINT *ep, const char *rcvdTopic, const char *rcvdValue); -static AQHMQTT_TOPIC *_findMaskMatchingTopic(AQHMQTT_TOPIC_LIST *topicList, const char *rcvdTopic, int dir); -static AQHMQTT_TOPIC *_findTopicMatchingTopic(AQHMQTT_TOPIC_LIST *topicList, const char *rcvdTopic, int dir); -static GWEN_BUFFER *_extractDeviceId(const AQHMQTT_TOPIC *topic, const char *rcvdTopic); - - - -/* ------------------------------------------------------------------------------------------------ - * implementations - * ------------------------------------------------------------------------------------------------ - */ - -void AqHomeMqttLog_ReadAndHandleMqttMessages(AQHOME_MQTT *aqh) -{ - GWEN_MSG_ENDPOINT *epTcp; - GWEN_MSG *msg; - - epTcp=aqh->mqttEndpoint; - while( (msg=GWEN_MsgEndpoint_TakeFirstReceivedMessage(epTcp)) ) { -#ifdef FULL_DEBUG - DBG_ERROR(NULL, "Received this message:"); - GWEN_Text_DumpString((const char*) GWEN_Msg_GetConstBuffer(msg), GWEN_Msg_GetBytesInBuffer(msg), 2); -#endif - _handleMqttMsg(aqh, epTcp, msg); - GWEN_Msg_free(msg); - } -} - - - -int AqHomeMqttLog_SendPing(AQHOME_MQTT *aqh) -{ - GWEN_MSG_ENDPOINT *epTcp; - GWEN_MSG *msgOut; - - DBG_INFO(AQH_LOGDOMAIN, "Sending PING"); - epTcp=aqh->mqttEndpoint; - msgOut=GWEN_MqttMsg_new(AQH_MQTTMSG_MSGTYPE_PINGREQ, 0, NULL); - if (msgOut==NULL) { - DBG_ERROR(NULL, "Error creating message"); - return GWEN_ERROR_INTERNAL; - } - GWEN_MsgEndpoint_AddSendMessage(epTcp, msgOut); - - return 0; -} - - - -void _handleMqttMsg(AQHOME_MQTT *aqh, GWEN_MSG_ENDPOINT *ep, const GWEN_MSG *msg) -{ - if ((AQH_MqttMsg_GetMsgTypeAndFlags(msg) & 0xf0)==(AQH_MQTTMSG_MSGTYPE_PUBLISH & 0xf0)) { - DBG_INFO(AQH_LOGDOMAIN, "PUBLISH message received"); -#ifdef FULL_DEBUG - GWEN_BUFFER *buf; - - buf=GWEN_Buffer_new(0, 256, 0, 1); - AQH_PublishMqttMsg_DumpToBuffer(msg, buf, "received"); - fprintf(stdout, "%s\n", GWEN_Buffer_GetStart(buf)); - GWEN_Buffer_free(buf); -#endif - _handlePublishMsg(aqh, ep, msg); - } - else if ((AQH_MqttMsg_GetMsgTypeAndFlags(msg) & 0xf0)==(AQH_MQTTMSG_MSGTYPE_PINGRESP & 0xf0)) { - DBG_INFO(AQH_LOGDOMAIN, "PING response received"); - } - else { -#ifdef FULL_DEBUG - DBG_ERROR(NULL, "Received this message:"); - GWEN_Text_DumpString((const char*) GWEN_Msg_GetConstBuffer(msg), GWEN_Msg_GetBytesInBuffer(msg), 2); -#endif - } -} - - - -void _handlePublishMsg(AQHOME_MQTT *aqh, GWEN_MSG_ENDPOINT *ep, const GWEN_MSG *msg) -{ - char *topic; - char *value; - - topic=AQH_PublishMqttMsg_ExtractTopic(msg); - value=AQH_PublishMqttMsg_ExtractValue(msg); - - if (topic && value) { - int rv; - - rv=_handlePublish(aqh, ep, topic, value); - if (rv!=1) { - DBG_INFO(NULL, "New topic \"%s\", trying to register", topic); - rv=_registerNewDeviceForTopic(aqh, ep, topic, value); - if (rv==1) { - rv=_handlePublish(aqh, ep, topic, value); - if (rv!=1) { - DBG_ERROR(NULL, "Topic \"%s\" still not handled, SNH!", topic); - } - } - } - } - else { - DBG_ERROR(NULL, "Either topic or value missing in PUBLISH msg"); - } - free(value); - free(topic); -} - - - -int _handlePublish(AQHOME_MQTT *aqh, GWEN_MSG_ENDPOINT *ep, const char *rcvdTopic, const char *rcvdValue) -{ - if (rcvdTopic && *rcvdTopic) { - if (aqh->registeredDeviceList) { - AQHMQTT_DEVICE *device; - - device=AQHMQTT_Device_List_First(aqh->registeredDeviceList); - while(device) { - AQHMQTT_TOPIC_LIST *topicList; - const char *sDeviceName; - const char *sDeviceId; - - sDeviceName=AQHMQTT_Device_GetName(device); - sDeviceId=AQHMQTT_Device_GetId(device); - - topicList=AQHMQTT_Device_GetTopicList(device); - if (topicList) { - AQHMQTT_TOPIC *topic; - - topic=_findTopicMatchingTopic(topicList, rcvdTopic, AQHMQTT_TopicDir_In); -#if 0 - if (topic==NULL) { - topic=_findMaskMatchingTopic(topicList, rcvdTopic, AQHMQTT_TopicDir_In); - if (topic) - AQHMQTT_Topic_SetTopic(topic, rcvdTopic); - } -#endif - if (topic) { - DBG_INFO(AQH_LOGDOMAIN, - "Handling topic \"%s\" for device type %s (id: %s)", - rcvdTopic, - sDeviceName, sDeviceId?sDeviceId:""); - if (AQHMQTT_Topic_GetTopicType(topic)==AQHMQTT_TopicType_Json) - _handleJsonTopic(aqh, ep, device, topic, rcvdValue); - else - _handleNumTopic(aqh, ep, device, topic, rcvdValue); - return 1; - } - } - - device=AQHMQTT_Device_List_Next(device); - } - } - DBG_INFO(AQH_LOGDOMAIN, "ignoring topic \"%s\"", rcvdTopic); - } - return 0; -} - - - -void _handleNumTopic(AQHOME_MQTT *aqh, GWEN_MSG_ENDPOINT *ep, AQHMQTT_DEVICE *device, AQHMQTT_TOPIC *topic, const char *rcvdValue) -{ - AQHMQTT_VALUE_LIST *valueList; - - valueList=AQHMQTT_Topic_GetValueList(topic); - if (valueList) - _sendMessage(aqh, device, AQHMQTT_Value_List_First(valueList), rcvdValue); - else { - DBG_INFO(NULL, "No value list in device \"%s\"", AQHMQTT_Device_GetId(device)); - } -} - - - -void _handleJsonTopic(AQHOME_MQTT *aqh, GWEN_MSG_ENDPOINT *ep, AQHMQTT_DEVICE *device, AQHMQTT_TOPIC *topic, const char *rcvdValue) -{ - GWEN_JSON_ELEM *jeRoot; - - jeRoot=GWEN_JsonElement_fromString(rcvdValue); - if (jeRoot==NULL) { - DBG_INFO(NULL, "Could not parse JSON value: %s", rcvdValue); - } - else { - AQHMQTT_VALUE_LIST *valueList; - - valueList=AQHMQTT_Topic_GetValueList(topic); - if (valueList) { - AQHMQTT_VALUE *value; - - value=AQHMQTT_Value_List_First(valueList); - while(value) { - const char *path; - - path=AQHMQTT_Value_GetPath(value); - if (path && *path) { - GWEN_JSON_ELEM *je; - - je=GWEN_JsonElement_GetElementByPath(jeRoot, path, 0); - if (je) { - const char *s; - - s=GWEN_JsonElement_GetData(je); - if (s && *s) - _sendMessage(aqh, device, value, s); - } - } - value=AQHMQTT_Value_List_Next(value); - } /* while */ - } - GWEN_JsonElement_free(jeRoot); - } -} - - - -void _sendMessage(AQHOME_MQTT *aqh, const AQHMQTT_DEVICE *device, const AQHMQTT_VALUE *value, const char *rcvdValue) -{ - int rv; - union {double f; uint64_t i;} u; - const char *deviceName; - - deviceName=AQHMQTT_Device_GetId(device); - rv=GWEN_Text_StringToDouble(rcvdValue, &(u.f)); - if (rv<0) { - DBG_ERROR(NULL, "Invalid value received from MQTT server (%s)", rcvdValue?rcvdValue:""); - } - else { - GWEN_MSG *pubMsg; - uint64_t arrayToSend[2]; - AQH_VALUE *msgValue; - - arrayToSend[0]=(uint64_t) time(NULL); - arrayToSend[1]=u.i; - - msgValue=_mkMessageValue(device, value); - - pubMsg=AQH_MultiDataDataIpcMsg_new(AQH_MSGTYPE_IPC_DATA_UPDATEDATA, - GWEN_MsgEndpoint_GetNextMessageId(aqh->brokerEndpoint), 0, - msgValue, arrayToSend, 1); - if (pubMsg) { - DBG_INFO(AQH_LOGDOMAIN, "BROKER UPDATE_DATA %s/%s: %f", - deviceName?deviceName:"", - AQH_Value_GetName(msgValue), u.f); - GWEN_MsgEndpoint_AddSendMessage(aqh->brokerEndpoint, pubMsg); - } - AQH_Value_free(msgValue); - } -} - - - -void _announceDeviceToBroker(AQHOME_MQTT *aqh, const AQHMQTT_DEVICE *device) -{ - AQHMQTT_TOPIC_LIST *topicList; - - topicList=AQHMQTT_Device_GetTopicList(device); - if (topicList) { - AQHMQTT_TOPIC *topic; - - topic=AQHMQTT_Topic_List_First(topicList); - while(topic) { - AQHMQTT_VALUE_LIST *valueList; - - valueList=AQHMQTT_Topic_GetValueList(topic); - if (valueList) { - const AQHMQTT_VALUE *value; - - value=AQHMQTT_Value_List_First(valueList); - while(value) { - _sendAnnounceValueMessage(aqh, device, value); - value=AQHMQTT_Value_List_Next(value); - } - } - - topic=AQHMQTT_Topic_List_Next(topic); - } - } -} - - - -void _sendAnnounceValueMessage(AQHOME_MQTT *aqh, const AQHMQTT_DEVICE *device, const AQHMQTT_VALUE *value) -{ - GWEN_MSG *pubMsg; - AQH_VALUE *msgValue; - - msgValue=_mkMessageValue(device, value); - pubMsg=AQH_ValuesDataIpcMsg_newForOneValue(AQH_MSGTYPE_IPC_DATA_ANNOUNCEVALUE, - GWEN_MsgEndpoint_GetNextMessageId(aqh->brokerEndpoint), 0, - 0, msgValue); - if (pubMsg) { - DBG_INFO(AQH_LOGDOMAIN, "BROKER ANNOUNCE_VALUE %s", AQH_Value_GetName(msgValue)); - GWEN_MsgEndpoint_AddSendMessage(aqh->brokerEndpoint, pubMsg); - } - AQH_Value_free(msgValue); -} - - - -AQH_VALUE *_mkMessageValue(const AQHMQTT_DEVICE *device, const AQHMQTT_VALUE *value) -{ - AQH_VALUE *msgValue; - - msgValue=AQH_Value_new(); - AQH_Value_SetDeviceName(msgValue, AQHMQTT_Device_GetId(device)); - AQH_Value_SetName(msgValue, AQHMQTT_Value_GetName(value)); - AQH_Value_SetValueUnits(msgValue, AQHMQTT_Value_GetValueUnits(value)); - AQH_Value_SetValueType(msgValue, _mqttValueTypeMessageValueType(AQHMQTT_Value_GetValueType(value))); - return msgValue; -} - - - -int _mqttValueTypeMessageValueType(int t) -{ - switch(t){ - case AQHMQTT_ValueType_Sensor: return AQH_ValueType_Sensor; - case AQHMQTT_ValueType_Actor: return AQH_ValueType_Actor; - default: break; - } - DBG_ERROR(AQH_LOGDOMAIN, "Invalid mqtt value type %d", t); - return AQH_ValueType_Sensor; -} - - - -int _registerNewDeviceForTopic(AQHOME_MQTT *aqh, GWEN_MSG_ENDPOINT *ep, const char *rcvdTopic, const char *rcvdValue) -{ - if (rcvdTopic && *rcvdTopic) { - if (aqh->availableDeviceList) { - AQHMQTT_DEVICE *device; - - device=AQHMQTT_Device_List_First(aqh->availableDeviceList); - while(device) { - AQHMQTT_TOPIC_LIST *topicList; - - topicList=AQHMQTT_Device_GetTopicList(device); - if (topicList) { - AQHMQTT_TOPIC *topic; - - topic=_findMaskMatchingTopic(topicList, rcvdTopic, AQHMQTT_TopicDir_In); - if (topic) { - GWEN_BUFFER *buf; - - buf=_extractDeviceId(topic, rcvdTopic); - if (buf) { - AQHMQTT_DEVICE *newDevice; - - newDevice=AQHMQTT_Device_dup(device); - AQHMQTT_Device_SetId(newDevice, GWEN_Buffer_GetStart(buf)); - topic=_findMaskMatchingTopic(AQHMQTT_Device_GetTopicList(newDevice), rcvdTopic, AQHMQTT_TopicDir_In); - AQHMQTT_Topic_SetTopic(topic, rcvdTopic); - if (aqh->registeredDeviceList==NULL) - aqh->registeredDeviceList=AQHMQTT_Device_List_new(); - DBG_ERROR(NULL, "Registered device \"%s\" (%s)", AQHMQTT_Device_GetId(newDevice), AQHMQTT_Device_GetName(newDevice)); - AQHMQTT_Device_List_Add(newDevice, aqh->registeredDeviceList); - _announceDeviceToBroker(aqh, newDevice); - GWEN_Buffer_free(buf); - return 1; - } - - } - } - - device=AQHMQTT_Device_List_Next(device); - } - } - DBG_INFO(AQH_LOGDOMAIN, "ignoring topic \"%s\"", rcvdTopic); - } - return 0; - -} - - - -AQHMQTT_TOPIC *_findMaskMatchingTopic(AQHMQTT_TOPIC_LIST *topicList, const char *rcvdTopic, int dir) -{ - if (topicList) { - AQHMQTT_TOPIC *topic; - - topic=AQHMQTT_Topic_List_First(topicList); - while(topic) { - if (AQHMQTT_Topic_GetDirection(topic)==dir) { - const char *sMask; - - sMask=AQHMQTT_Topic_GetMask(topic); - if (sMask && *sMask && GWEN_Text_ComparePattern(rcvdTopic, sMask, 0)!=-1) { - /* found a matching topic */ - return topic; - } - } - - topic=AQHMQTT_Topic_List_Next(topic); - } - } - return NULL; -} - - - -AQHMQTT_TOPIC *_findTopicMatchingTopic(AQHMQTT_TOPIC_LIST *topicList, const char *rcvdTopic, int dir) -{ - if (topicList) { - AQHMQTT_TOPIC *topic; - - topic=AQHMQTT_Topic_List_First(topicList); - while(topic) { - if (AQHMQTT_Topic_GetDirection(topic)==dir) { - const char *sTopic; - - sTopic=AQHMQTT_Topic_GetTopic(topic); - if (sTopic && *sTopic && strcasecmp(rcvdTopic, sTopic)==0) { - return topic; - } - } - topic=AQHMQTT_Topic_List_Next(topic); - } - } - return NULL; -} - - - -GWEN_BUFFER *_extractDeviceId(const AQHMQTT_TOPIC *topic, const char *rcvdTopic) -{ - const char *sBefore; - const char *sAfter; - - sBefore=AQHMQTT_Topic_GetBeforeId(topic); - sAfter=AQHMQTT_Topic_GetAfterId(topic); - - if (sBefore && *sBefore && sAfter && *sAfter) { - GWEN_BUFFER *buf; - int rv; - - buf=GWEN_Buffer_new(0, 256, 0, 1); - GWEN_Buffer_AppendString(buf, rcvdTopic); - rv=GWEN_Buffer_KeepTextBetweenStrings(buf, sBefore, sAfter, 1); - if (rv<0) { - DBG_INFO(NULL, "Could not extract id from [%s] (beforeId=%s, afterId=%s)", rcvdTopic, sBefore, sAfter); - GWEN_Buffer_free(buf); - return NULL; - } - - return buf; - } - - return NULL; -} - - - - - - - - diff --git a/apps/aqhome-mqttlog/loop_mqtt.h b/apps/aqhome-mqttlog/loop_mqtt.h deleted file mode 100644 index 4a04337..0000000 --- a/apps/aqhome-mqttlog/loop_mqtt.h +++ /dev/null @@ -1,27 +0,0 @@ -/**************************************************************************** - * 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 AQHOMEMQTT_LOOP_MQTT_H -#define AQHOMEMQTT_LOOP_MQTT_H - - -#include "./aqhome_mqtt.h" - -#include -#include - - - -void AqHomeMqttLog_ReadAndHandleMqttMessages(AQHOME_MQTT *aqh); -int AqHomeMqttLog_SendPing(AQHOME_MQTT *aqh); - - - -#endif - - diff --git a/apps/aqhome-nodes/aqhomed.c b/apps/aqhome-nodes/aqhomed.c deleted file mode 100644 index 0f3de23..0000000 --- a/apps/aqhome-nodes/aqhomed.c +++ /dev/null @@ -1,221 +0,0 @@ -/**************************************************************************** - * 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 "./aqhomed_p.h" -#include "./tty_log.h" - -#include "aqhome/msg/endpoint_tty.h" -#include "aqhome/ipc/endpoint_ipc.h" - -#include -#include - - - -/* ------------------------------------------------------------------------------------------------ - * defines - * ------------------------------------------------------------------------------------------------ - */ - -#define I18N(msg) msg -#define I18S(msg) msg - - - -/* ------------------------------------------------------------------------------------------------ - * forward declarations - * ------------------------------------------------------------------------------------------------ - */ - - - - -/* ------------------------------------------------------------------------------------------------ - * implementations - * ------------------------------------------------------------------------------------------------ - */ - -AQHOMED *AqHomed_new(void) -{ - AQHOMED *aqh; - - GWEN_NEW_OBJECT(AQHOMED, aqh); - aqh->rootEndpoint=GWEN_MsgEndpoint_new("root", 0); - aqh->nodeDb=AQH_NodeDb_new(); - aqh->requestTree=GWEN_MsgRequest_new(); - - return aqh; -} - - - -void AqHomed_free(AQHOMED *aqh) -{ - if (aqh) { - GWEN_MsgRequest_free(aqh->requestTree); - GWEN_MsgEndpoint_free(aqh->rootEndpoint); - aqh->rootEndpoint=NULL; - aqh->ttyEndpoint=NULL; - aqh->ipcdEndpoint=NULL; - aqh->brokerEndpoint=NULL; - GWEN_DB_Group_free(aqh->dbArgs); - AQH_NodeDb_free(aqh->nodeDb); - aqh->dbArgs=NULL; - free(aqh->logFile); - free(aqh->pidFile); - free(aqh->dbFile); - - GWEN_FREE_OBJECT(aqh); - } -} - - - -GWEN_MSG_ENDPOINT *AqHomed_GetTtyEndpoint(const AQHOMED *aqh) -{ - return aqh?aqh->ttyEndpoint:NULL; -} - - - -GWEN_MSG_ENDPOINT *AqHomed_GetIpcdEndpoint(const AQHOMED *aqh) -{ - return aqh?aqh->ipcdEndpoint:NULL; -} - - - -GWEN_MSG_ENDPOINT *AqHomed_GetBrokerEndpoint(const AQHOMED *aqh) -{ - return aqh?aqh->brokerEndpoint:NULL; -} - - - -GWEN_DB_NODE *AqHomed_GetDbArgs(const AQHOMED *aqh) -{ - return aqh?aqh->dbArgs:NULL; -} - - - -const char *AqHomed_GetLogFile(const AQHOMED *aqh) -{ - return aqh?aqh->logFile:NULL; -} - - - -void AqHomed_SetLogFile(AQHOMED *aqh, const char *s) -{ - if (aqh) { - free(aqh->logFile); - aqh->logFile=s?strdup(s):NULL; - } -} - - - -const char *AqHomed_GetPidFile(const AQHOMED *aqh) -{ - return aqh?aqh->pidFile:NULL; -} - - - -void AqHomed_SetPidFile(AQHOMED *aqh, const char *s) -{ - if (aqh) { - free(aqh->pidFile); - aqh->pidFile=s?strdup(s):NULL; - } -} - - - -const char *AqHomed_GetDbFile(const AQHOMED *aqh) -{ - return aqh?aqh->dbFile:NULL; -} - - - -void AqHomed_SetDbFile(AQHOMED *aqh, const char *s) -{ - if (aqh) { - free(aqh->dbFile); - aqh->dbFile=s?strdup(s):NULL; - } -} - - - -int AqHomed_GetTimeout(const AQHOMED *aqh) -{ - return aqh?aqh->timeout:0; -} - - - -GWEN_MSG_REQUEST *AqHomed_GetRequestTree(const AQHOMED *aqh) -{ - return aqh?aqh->requestTree:NULL; -} - - - -void AqHomed_AddRequestToTree(AQHOMED *aqh, GWEN_MSG_REQUEST *rq) -{ - if (aqh && rq) - GWEN_MsgRequest_Tree2_AddChild(aqh->requestTree, rq); -} - - - -const AQHNODE_DEVICE_LIST *AqHomed_GetDeviceDefList(const AQHOMED *aqh) -{ - return aqh?aqh->deviceDefList:NULL; -} - - - -const AQHNODE_DEVICE *AqHomed_FindDeviceDef(const AQHOMED *aqh, uint32_t manufacturer, uint16_t deviceType, uint16_t deviceVersion) -{ - if (aqh && aqh->deviceDefList) { - const AQHNODE_DEVICE *device; - - device=AQHNODE_Device_List_First(aqh->deviceDefList); - while(device) { - if (AQHNODE_Device_GetManufacturer(device)==manufacturer && - AQHNODE_Device_GetDeviceType(device)==deviceType && - AQHNODE_Device_GetDeviceVersion(device)==(deviceVersion & 0xff00)) - return device; - device=AQHNODE_Device_List_Next(device); - } - } - - return NULL; -} - - - -const AQHNODE_DEVICE *AqHomed_GetDeviceDefByName(const AQHOMED *aqh, const char *name) -{ - if (aqh && aqh->deviceDefList && name) - return AQHNODE_Device_List_GetByName(aqh->deviceDefList, name); - return NULL; -} - - - - - diff --git a/apps/aqhome-nodes/aqhomed.h b/apps/aqhome-nodes/aqhomed.h deleted file mode 100644 index 3fab417..0000000 --- a/apps/aqhome-nodes/aqhomed.h +++ /dev/null @@ -1,59 +0,0 @@ -/**************************************************************************** - * 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 AQHOMED_H -#define AQHOMED_H - - -#include -#include -#include - - -#define AQHOME_ENDPOINTGROUP_NODE 1 -#define AQHOME_ENDPOINTGROUP_IPC 2 -#define AQHOME_ENDPOINTGROUP_MQTT 4 - - -typedef struct AQHOMED AQHOMED; - - -#include "aqhome-nodes/types/device.h" - - -AQHOMED *AqHomed_new(void); -void AqHomed_free(AQHOMED *aqh); - -GWEN_MSG_ENDPOINT *AqHomed_GetTtyEndpoint(const AQHOMED *aqh); -GWEN_MSG_ENDPOINT *AqHomed_GetIpcdEndpoint(const AQHOMED *aqh); -GWEN_MSG_ENDPOINT *AqHomed_GetBrokerEndpoint(const AQHOMED *aqh); - -GWEN_DB_NODE *AqHomed_GetDbArgs(const AQHOMED *aqh); - -const char *AqHomed_GetLogFile(const AQHOMED *aqh); -void AqHomed_SetLogFile(AQHOMED *aqh, const char *s); - -const char *AqHomed_GetPidFile(const AQHOMED *aqh); -void AqHomed_SetPidFile(AQHOMED *aqh, const char *s); - -const char *AqHomed_GetDbFile(const AQHOMED *aqh); -void AqHomed_SetDbFile(AQHOMED *aqh, const char *s); - -int AqHomed_GetTimeout(const AQHOMED *aqh); - -GWEN_MSG_REQUEST *AqHomed_GetRequestTree(const AQHOMED *aqh); -void AqHomed_AddRequestToTree(AQHOMED *aqh, GWEN_MSG_REQUEST *rq); - -const AQHNODE_DEVICE_LIST *AqHomed_GetDeviceDefList(const AQHOMED *aqh); -const AQHNODE_DEVICE *AqHomed_FindDeviceDef(const AQHOMED *aqh, uint32_t manufacturer, uint16_t deviceType, uint16_t deviceVersion); -const AQHNODE_DEVICE *AqHomed_GetDeviceDefByName(const AQHOMED *aqh, const char *name); - - -#endif - - diff --git a/apps/aqhome-nodes/aqhomed_p.h b/apps/aqhome-nodes/aqhomed_p.h deleted file mode 100644 index a2d7a31..0000000 --- a/apps/aqhome-nodes/aqhomed_p.h +++ /dev/null @@ -1,53 +0,0 @@ -/**************************************************************************** - * 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 AQHOMED_P_H -#define AQHOMED_P_H - - -#include "./aqhomed.h" - -#include "aqhome/nodes/nodedb.h" - - -/* default values */ -#define AQHOMED_DEFAULT_NODEADDR 240 -#define AQHOMED_DEFAULT_PIDFILE "/var/run/aqhomed-node.pid" -#define AQHOMED_DEFAULT_DEVICE "/dev/ttyUSB0" -#define AQHOMED_DEFAULT_IPC_PORT 45454 -#define AQHOMED_DEFAULT_BROKER_PORT 1899 -#define AQHOMED_DEFAULT_BROKER_CLIENTID "nodes" - - - -struct AQHOMED { - GWEN_MSG_ENDPOINT *rootEndpoint; - - GWEN_MSG_ENDPOINT *ttyEndpoint; - GWEN_MSG_ENDPOINT *ipcdEndpoint; - - GWEN_MSG_ENDPOINT *brokerEndpoint; - - AQH_NODE_DB *nodeDb; - AQHNODE_DEVICE_LIST *deviceDefList; - - GWEN_DB_NODE *dbArgs; - - char *dbFile; - char *logFile; - char *pidFile; - - int timeout; /* timeout for run e.g. inside valgrind */ - - int nodeAddress; - - GWEN_MSG_REQUEST *requestTree; -}; - -#endif - diff --git a/apps/aqhome-nodes/devicesdump.c b/apps/aqhome-nodes/devicesdump.c index c8a7f2b..a18e606 100644 --- a/apps/aqhome-nodes/devicesdump.c +++ b/apps/aqhome-nodes/devicesdump.c @@ -12,7 +12,7 @@ #include "./devicesdump.h" -#include "./aqhomed_p.h" +#include "./server_p.h" #include "aqhome/aqhome.h" #include diff --git a/apps/aqhome-nodes/devicesdump.h b/apps/aqhome-nodes/devicesdump.h index b49fac2..6b0a4db 100644 --- a/apps/aqhome-nodes/devicesdump.h +++ b/apps/aqhome-nodes/devicesdump.h @@ -10,7 +10,7 @@ #define AQHOME_NODES_DEVICESDUMP_H -#include "./aqhomed.h" +#include "./server.h" #include "aqhome-nodes/types/device.h" diff --git a/apps/aqhome-nodes/devicesread.c b/apps/aqhome-nodes/devicesread.c index e147348..5713f34 100644 --- a/apps/aqhome-nodes/devicesread.c +++ b/apps/aqhome-nodes/devicesread.c @@ -12,7 +12,7 @@ #include "./devicesread.h" -#include "./aqhomed_p.h" +#include "./server_p.h" #include "aqhome/aqhome.h" #include diff --git a/apps/aqhome-nodes/devicesread.h b/apps/aqhome-nodes/devicesread.h index 0573df7..94c10b5 100644 --- a/apps/aqhome-nodes/devicesread.h +++ b/apps/aqhome-nodes/devicesread.h @@ -1,6 +1,6 @@ /**************************************************************************** * This file is part of the project AqHome. - * AqHome (c) by 2024 Martin Preuss, all rights reserved. + * AqHome (c) by 2025 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. @@ -10,7 +10,7 @@ #define AQHOME_NODES_DEVICESREAD_H -#include "./aqhomed.h" +#include "./server.h" #include "aqhome-nodes/types/device.h" diff --git a/apps/aqhome-nodes/fini.c b/apps/aqhome-nodes/fini.c deleted file mode 100644 index 9b6411b..0000000 --- a/apps/aqhome-nodes/fini.c +++ /dev/null @@ -1,89 +0,0 @@ -/**************************************************************************** - * 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 "./fini.h" -#include "./db.h" -#include "./aqhomed_p.h" - -#include -#include -#include -#include - - -#include - - - -/* ------------------------------------------------------------------------------------------------ - * defines - * ------------------------------------------------------------------------------------------------ - */ - -#define I18N(msg) msg -#define I18S(msg) msg - - - -/* ------------------------------------------------------------------------------------------------ - * forward declarations - * ------------------------------------------------------------------------------------------------ - */ - -static void _disconnectTree(GWEN_MSG_ENDPOINT *ep); - - - -/* ------------------------------------------------------------------------------------------------ - * implementations - * ------------------------------------------------------------------------------------------------ - */ - -void AqHomed_Fini(AQHOMED *aqh) -{ - if (aqh) { - if (aqh->rootEndpoint) { - _disconnectTree(aqh->rootEndpoint); - GWEN_MsgEndpoint_Disconnect(aqh->rootEndpoint); - } - GWEN_MsgEndpoint_free(aqh->rootEndpoint); - aqh->rootEndpoint=NULL; - aqh->ttyEndpoint=NULL; - aqh->ipcdEndpoint=NULL; - aqh->brokerEndpoint=NULL; - - AqHomed_WriteNodeDb(aqh); - - if (aqh->pidFile) - remove(aqh->pidFile); - } -} - - - -void _disconnectTree(GWEN_MSG_ENDPOINT *ep) -{ - GWEN_MSG_ENDPOINT *epChild; - - epChild=GWEN_MsgEndpoint_Tree2_GetFirstChild(ep); - while(epChild) { - _disconnectTree(epChild); - epChild=GWEN_MsgEndpoint_Tree2_GetNext(epChild); - } /* while */ - - GWEN_MsgEndpoint_Disconnect(ep); -} - - - - diff --git a/apps/aqhome-nodes/fini.h b/apps/aqhome-nodes/fini.h deleted file mode 100644 index 4e41d91..0000000 --- a/apps/aqhome-nodes/fini.h +++ /dev/null @@ -1,23 +0,0 @@ -/**************************************************************************** - * 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 AQHOMED_FINI_H -#define AQHOMED_FINI_H - - -#include "./aqhomed.h" - - - -void AqHomed_Fini(AQHOMED *aqh); - - - -#endif - - diff --git a/apps/aqhome-nodes/init.c b/apps/aqhome-nodes/init.c deleted file mode 100644 index 8409090..0000000 --- a/apps/aqhome-nodes/init.c +++ /dev/null @@ -1,540 +0,0 @@ -/**************************************************************************** - * 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 "./init.h" -#include "./aqhomed_p.h" -#include "./tty_log.h" -#include "./devicesread.h" -#include "./devicesdump.h" - -#include "aqhome/aqhome.h" -#include "aqhome/msg/endpoint_tty.h" -#include "aqhome/ipc/endpoint_ipc.h" -#include "aqhome/ipc/endpoint_ipcclient.h" - -#include -#include -#include -#include -#include - -#ifdef HAVE_SYS_TYPES_H -# include -#endif - -#ifdef HAVE_SYS_STAT_H -# include -#endif - -#include -#include -#include -#include -#include -#include - - - -/* ------------------------------------------------------------------------------------------------ - * defines - * ------------------------------------------------------------------------------------------------ - */ - -#define I18N(msg) msg -#define I18S(msg) msg - - - - -/* ------------------------------------------------------------------------------------------------ - * forward declarations - * ------------------------------------------------------------------------------------------------ - */ - -static int _setupTty(AQHOMED *aqh, GWEN_DB_NODE *dbArgs); -static void _setupIpcd(AQHOMED *aqh, GWEN_DB_NODE *dbArgs); -static void _setupBroker(AQHOMED *aqh, GWEN_DB_NODE *dbArgs); -static GWEN_MSG_ENDPOINT *_acceptIpcFn(GWEN_MSG_ENDPOINT *ep, GWEN_SOCKET *sk, const GWEN_INETADDRESS *addr, void *data); -static void _setupLog(AQHOMED *aqh, GWEN_DB_NODE *dbArgs); -static void _setupDb(AQHOMED *aqh, GWEN_DB_NODE *dbArgs); -static int _loadDeviceList(AQHOMED *aqh); - -static int _readArgs(int argc, char **argv, GWEN_DB_NODE *dbArgs); -static int _createPidFile(const char *pidFilename); - - - -/* ------------------------------------------------------------------------------------------------ - * implementations - * ------------------------------------------------------------------------------------------------ - */ - -int AqHomed_Init(AQHOMED *aqh, int argc, char **argv) -{ - GWEN_DB_NODE *dbArgs; - int rv; - const char *s; - - dbArgs=GWEN_DB_Group_new("args"); - rv=_readArgs(argc, argv, dbArgs); - if (rv<0) { - DBG_ERROR(NULL, "Error reading args (%d)", rv); - return rv; - } - AQH_MergeConfigFileIntoConfig(dbArgs, "ConfigFile"); - aqh->dbArgs=dbArgs; - - s=GWEN_DB_GetCharValue(dbArgs, "loglevel", 0, NULL); - if (s && *s) { - GWEN_LOGGER_LEVEL ll; - - ll=GWEN_Logger_Name2Level(s); - GWEN_Logger_SetLevel(NULL, ll); - } - - s=GWEN_DB_GetCharValue(dbArgs, "pidfile", 0, AQHOMED_DEFAULT_PIDFILE); - if (s && *s) { - AqHomed_SetPidFile(aqh, s); - rv=_createPidFile(s); - if (rv<0) { - DBG_ERROR(NULL, "Error creating PID file (%d)", rv); - return rv; - } - } - - aqh->timeout=GWEN_DB_GetIntValue(dbArgs, "timeout", 0, 0); - - aqh->nodeAddress=GWEN_DB_GetIntValue(dbArgs, "nodeAddress", 0, AQHOMED_DEFAULT_NODEADDR); - - rv=_loadDeviceList(aqh); - if (rv<0) { - DBG_ERROR(NULL, "Error loading device list(%d)", rv); - return rv; - } -#if 0 - else { - GWEN_BUFFER *dbuf; - - dbuf=GWEN_Buffer_new(0, 256, 0, 1); - AqHomeNodes_DumpDevices(aqh->deviceDefList, dbuf); - fprintf(stdout, "%s\n", GWEN_Buffer_GetStart(dbuf)); - GWEN_Buffer_free(dbuf); - } -#endif - - _setupDb(aqh, dbArgs); - - rv=_setupTty(aqh, dbArgs); - if (rv<0) { - DBG_ERROR(NULL, "Error setting up TTY endpoint (%d)", rv); - return rv; - } - - _setupIpcd(aqh, dbArgs); - _setupBroker(aqh, dbArgs); - _setupLog(aqh, dbArgs); - - return 0; -} - - - -int _setupTty(AQHOMED *aqh, GWEN_DB_NODE *dbArgs) -{ - const char *devicePath; - - devicePath=GWEN_DB_GetCharValue(dbArgs, "device", 0, AQHOMED_DEFAULT_DEVICE); - if (devicePath && *devicePath) { - GWEN_MSG_ENDPOINT *epTty; - - epTty=AQH_TtyEndpoint_new(devicePath, AQHOME_ENDPOINTGROUP_NODE); - if (epTty==NULL) { - DBG_ERROR(NULL, "Error creating endpoint TTY"); - return GWEN_ERROR_GENERIC; - } - GWEN_MsgEndpoint_Tree2_AddChild(aqh->rootEndpoint, epTty); - aqh->ttyEndpoint=epTty; - } - else { - DBG_ERROR(NULL, "Missing device path"); - return GWEN_ERROR_GENERIC; - } - - return 0; -} - - - -void _setupIpcd(AQHOMED *aqh, GWEN_DB_NODE *dbArgs) -{ - const char *tcpAddress; - int tcpPort; - - tcpAddress=GWEN_DB_GetCharValue(dbArgs, "tcpAddress", 0, NULL); - if (!(tcpAddress && *tcpAddress)) - tcpAddress=GWEN_DB_GetCharValue(dbArgs, "ConfigFile/nodesAddress", 0, NULL); - - tcpPort=GWEN_DB_GetIntValue(dbArgs, "tcpPort", 0, -1); - if (tcpPort<0) - tcpPort=GWEN_DB_GetIntValue(dbArgs, "ConfigFile/nodesPort", 0, AQHOMED_DEFAULT_IPC_PORT); - - if (tcpAddress && *tcpAddress && tcpPort) { - GWEN_MSG_ENDPOINT *ep; - - ep=GWEN_TcpdEndpoint_new(tcpAddress, tcpPort, NULL, AQHOME_ENDPOINTGROUP_IPC); - GWEN_TcpdEndpoint_SetAcceptFn(ep, _acceptIpcFn, aqh); - - GWEN_MsgEndpoint_Tree2_AddChild(aqh->rootEndpoint, ep); - aqh->ipcdEndpoint=ep; - } -} - - - -void _setupBroker(AQHOMED *aqh, GWEN_DB_NODE *dbArgs) -{ - const char *brokerAddress; - int brokerPort; - const char *brokerClientId; - - brokerAddress=GWEN_DB_GetCharValue(dbArgs, "brokerAddress", 0, NULL); - if (!(brokerAddress && *brokerAddress)) - brokerAddress=GWEN_DB_GetCharValue(dbArgs, "ConfigFile/brokerAddress", 0, "127.0.0.1"); - - brokerPort=GWEN_DB_GetIntValue(dbArgs, "brokerPort", 0, -1); - if (brokerPort<0) - brokerPort=GWEN_DB_GetIntValue(dbArgs, "ConfigFile/brokerPort", 0, AQHOMED_DEFAULT_BROKER_PORT); - - brokerClientId=GWEN_DB_GetCharValue(dbArgs, "brokerClientId", 0, AQHOMED_DEFAULT_BROKER_CLIENTID); - - if (brokerAddress && *brokerAddress && brokerPort) { - GWEN_MSG_ENDPOINT *ep; - GWEN_MSG_ENDPOINT *ipcBaseEndpoint; - int rv; - - ep=AQH_ClientIpcEndpoint_new("brokerIpcClient", 0); - ipcBaseEndpoint=AQH_IpcEndpoint_CreateIpcTcpClient(brokerAddress, brokerPort, "brokerPhysEndpoint", 0); - AQH_IpcEndpoint_SetServiceName(ipcBaseEndpoint, brokerClientId); - GWEN_MsgEndpoint_Tree2_AddChild(ep, ipcBaseEndpoint); - - GWEN_MsgEndpoint_Tree2_AddChild(aqh->rootEndpoint, ep); - aqh->brokerEndpoint=ep; - - rv=GWEN_MultilayerEndpoint_StartConnect(ep); - if (rv<0 && rv!=GWEN_ERROR_IN_PROGRESS) { - DBG_ERROR(NULL, "Error connecting to broker server %s:%d (%d), will retry later", brokerAddress, brokerPort, rv); - } - } -} - - - -GWEN_MSG_ENDPOINT *_acceptIpcFn(GWEN_UNUSED GWEN_MSG_ENDPOINT *ep, - GWEN_SOCKET *sk, - GWEN_UNUSED const GWEN_INETADDRESS *addr, - GWEN_UNUSED void *data) -{ -/* AQHOMED *aqh; - * - * aqh=(AQHOMED*) data; - */ - DBG_INFO(NULL, "Incoming IPC connection"); - return AQH_IpcEndpoint_CreateIpcTcpServiceForSocket(sk, NULL, AQHOME_ENDPOINTGROUP_IPC); -} - - - -void _setupLog(AQHOMED *aqh, GWEN_DB_NODE *dbArgs) -{ - const char *logFile; - - logFile=GWEN_DB_GetCharValue(dbArgs, "logfile", 0, NULL); - if (logFile && *logFile) - AqHomed_SetLogFile(aqh, logFile); -} - - - -void _setupDb(AQHOMED *aqh, GWEN_DB_NODE *dbArgs) -{ - const char *s; - - s=GWEN_DB_GetCharValue(dbArgs, "dbfile", 0, NULL); - if (s && *s) { - GWEN_DB_NODE *dbNodeDb; - int rv; - - AqHomed_SetDbFile(aqh, s); - - dbNodeDb=GWEN_DB_Group_new("dbNodes"); - rv=GWEN_DB_ReadFile(dbNodeDb, s, GWEN_DB_FLAGS_DEFAULT|GWEN_PATH_FLAGS_CREATE_GROUP); - if (rv==0) { - AQH_NodeDb_fromDb(aqh->nodeDb, dbNodeDb); - } - GWEN_DB_Group_free(dbNodeDb); - } -} - - - -int _loadDeviceList(AQHOMED *aqh) -{ - AQHNODE_DEVICE_LIST *deviceList; - - deviceList=AqHomeNodes_ReadDataDeviceFiles(); - if (deviceList==NULL) { - DBG_ERROR(NULL, "Error reading device list"); - return GWEN_ERROR_GENERIC; - } - aqh->deviceDefList=deviceList; - return 0; -} - - - -int _createPidFile(const char *pidFilename) -{ - FILE *f; - int pidfd; - - if (remove(pidFilename)==0) { - DBG_ERROR(0, "Old PID file existed, removed. (Unclean shutdown?)"); - } - -#ifdef HAVE_SYS_STAT_H - pidfd = open(pidFilename, O_EXCL|O_CREAT|O_WRONLY, S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH); - if (pidfd < 0) { - DBG_ERROR(NULL, "Could not create PID file \"%s\" (%s), aborting.", pidFilename, strerror(errno)); - return GWEN_ERROR_IO; - } - - f = fdopen(pidfd, "w"); -#else /* HAVE_STAT_H */ - f=fopen(pidFilename,"w+"); -#endif /* HAVE_STAT_H */ - - /* write pid */ -#ifdef HAVE_GETPID - fprintf(f,"%d\n",getpid()); -#else - fprintf(f,"-1\n"); -#endif - if (fclose(f)) { - DBG_ERROR(0, "Could not close PID file \"%s\" (%s), aborting.", pidFilename, strerror(errno)); - return GWEN_ERROR_IO; - } - return 0; -} - - - -int _readArgs(int argc, char **argv, GWEN_DB_NODE *dbArgs) -{ - int rv; - const GWEN_ARGS args[]= { - { - GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ - GWEN_ArgsType_Char, /* type */ - "loglevel", /* name */ - 0, /* minnum */ - 1, /* maxnum */ - "L", /* short option */ - "loglevel", /* long option */ - I18S("Specify loglevel"), /* short description */ - I18S("Specify loglevel") /* long description */ - }, - { - GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ - GWEN_ArgsType_Char, /* type */ - "cfgdir", /* name */ - 0, /* minnum */ - 1, /* maxnum */ - "D", /* short option */ - "cfgdir", /* long option */ - I18S("Specify the configuration folder"), - I18S("Specify the configuration folder") - }, - { - GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ - GWEN_ArgsType_Char, /* type */ - "charset", /* name */ - 0, /* minnum */ - 1, /* maxnum */ - 0, /* short option */ - "charset", /* long option */ - I18S("Specify the output character set"), /* short description */ - I18S("Specify the output character set") /* long description */ - }, - { - GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ - GWEN_ArgsType_Char, /* type */ - "device", /* name */ - 0, /* minnum */ - 1, /* maxnum */ - "d", /* short option */ - "device", /* long option */ - I18S("Specify the device to communicate with (e.g. /dev/ttyUSB0)"), - I18S("Specify the device to communicate with (e.g. /dev/ttyUSB0)") - }, - { - GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ - GWEN_ArgsType_Int, /* type */ - "nodeAddress", /* name */ - 0, /* minnum */ - 1, /* maxnum */ - "n", /* short option */ - "node", /* long option */ - I18S("Specify the node address for the AqHome node adaptor (default 240)"), - I18S("Specify the node address for the AqHome node adaptor (default 240)") - }, - { - GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ - GWEN_ArgsType_Char, /* type */ - "logFile", /* name */ - 0, /* minnum */ - 1, /* maxnum */ - "l", /* short option */ - "logfile", /* long option */ - I18S("Specify a logfile to log received messages to"), - I18S("Specify a logfile to log received messages to") - }, - { - GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ - GWEN_ArgsType_Char, /* type */ - "tcpAddress", /* name */ - 0, /* minnum */ - 1, /* maxnum */ - "t", /* short option */ - "tcpaddress", /* long option */ - I18S("Specify the TCP address to listen on (disabled if missing)"), - I18S("Specify the TCP address to listen on (disabled if missing)") - }, - { - GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ - GWEN_ArgsType_Int, /* type */ - "tcpPort", /* name */ - 0, /* minnum */ - 1, /* maxnum */ - "P", /* short option */ - "tcpport", /* long option */ - I18S("Specify the TCP port to listen on (default: 45454)"), - I18S("Specify the TCP port to listen on (default: 45454)") - }, - { - GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ - GWEN_ArgsType_Char, /* type */ - "brokerAddress", /* name */ - 0, /* minnum */ - 1, /* maxnum */ - "ba", /* short option */ - "brokeraddress", /* long option */ - I18S("Specify the address of the broker server to connect to (disabled if missing)"), - I18S("Specify the address of the broker server to connect to (disabled if missing)") - }, - { - GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ - GWEN_ArgsType_Int, /* type */ - "brokerPort", /* name */ - 0, /* minnum */ - 1, /* maxnum */ - "bp", /* short option */ - "brokerport", /* long option */ - I18S("Specify the port of the broker server (default: 1899)"), - I18S("Specify the port of the broker server (default: 1899)") - }, - { - GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ - GWEN_ArgsType_Char, /* type */ - "brokerClientId", /* name */ - 0, /* minnum */ - 1, /* maxnum */ - NULL, /* short option */ - "brokerclientid", /* long option */ - I18S("Specify client id for the broker server (default: \"nodes\")"), - I18S("Specify client id for the broker server (default: \"nodes\")") - }, - { - GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ - GWEN_ArgsType_Char, /* type */ - "dbfile", /* name */ - 0, /* minnum */ - 1, /* maxnum */ - "db", /* short option */ - "dbfile", /* long option */ - I18S("Specify DB file to read/write node database"), - I18S("Specify DB file to read/write node database") - }, - { - GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ - GWEN_ArgsType_Char, /* type */ - "pidfile", /* name */ - 0, /* minnum */ - 1, /* maxnum */ - "p", /* short option */ - "pidfile", /* long option */ - I18S("Specify the PID file"), - I18S("Specify the PID file") - }, - { - GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ - GWEN_ArgsType_Int, /* type */ - "timeout", /* name */ - 0, /* minnum */ - 1, /* maxnum */ - "T", /* short option */ - "timeout", /* long option */ - I18S("Specify timeout in second (default: no timeout)"), - I18S("Specify timeout in second (default: no timeout)") - }, - { - GWEN_ARGS_FLAGS_HELP | GWEN_ARGS_FLAGS_LAST, /* flags */ - GWEN_ArgsType_Int, /* type */ - "help", /* name */ - 0, /* minnum */ - 0, /* maxnum */ - "h", /* short option */ - "help", - I18S("Show this help screen."), - I18S("Show this help screen.") - } - }; - - rv=GWEN_Args_Check(argc, argv, 1, 0, args, dbArgs); - if (rv==GWEN_ARGS_RESULT_ERROR) { - fprintf(stderr, "ERROR: Could not parse arguments main\n"); - return GWEN_ERROR_INVALID; - } - else if (rv==GWEN_ARGS_RESULT_HELP) { - GWEN_BUFFER *ubuf; - - ubuf=GWEN_Buffer_new(0, 1024, 0, 1); - GWEN_Buffer_AppendArgs(ubuf, - I18N("This is version %s.\nUsage: %s [OPTIONS]\n\nOptions:\n"), - AQHOME_VERSION_STRING, - argv[0]); - if (GWEN_Args_Usage(args, ubuf, GWEN_ArgsOutType_Txt)) { - fprintf(stderr, "ERROR: Could not create help string\n"); - return 1; - } - GWEN_Buffer_AppendString(ubuf, "\n"); - - fprintf(stdout, "%s\n", GWEN_Buffer_GetStart(ubuf)); - GWEN_Buffer_free(ubuf); - return GWEN_ERROR_CLOSE; - } - return 0; -} - - - - diff --git a/apps/aqhome-nodes/init.h b/apps/aqhome-nodes/init.h deleted file mode 100644 index 8935383..0000000 --- a/apps/aqhome-nodes/init.h +++ /dev/null @@ -1,23 +0,0 @@ -/**************************************************************************** - * 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 AQHOMED_INIT_H -#define AQHOMED_INIT_H - - -#include "./aqhomed.h" - - - -int AqHomed_Init(AQHOMED *aqh, int argc, char **argv); - - - -#endif - - diff --git a/apps/aqhome-nodes/ipc.h b/apps/aqhome-nodes/ipc.h deleted file mode 100644 index 091934b..0000000 --- a/apps/aqhome-nodes/ipc.h +++ /dev/null @@ -1,23 +0,0 @@ -/**************************************************************************** - * 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 AQHOMED_LOOP_IPC_H -#define AQHOMED_LOOP_IPC_H - - -#include "./aqhomed.h" - - - -void AqHomed_ForwardTtyMsgToIpcClients(AQHOMED *aqh, const GWEN_MSG *msg); - - - -#endif - - diff --git a/apps/aqhome-nodes/loop.c b/apps/aqhome-nodes/loop.c deleted file mode 100644 index c89ab45..0000000 --- a/apps/aqhome-nodes/loop.c +++ /dev/null @@ -1,91 +0,0 @@ -/**************************************************************************** - * 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 "./loop.h" -#include "./loop_tty.h" -#include "./loop_ipc.h" -#include "./loop_broker.h" -#include "./aqhomed_p.h" -#include "./tty_log.h" -#include "./db.h" - -#include "aqhome/msg/endpoint_tty.h" -#include "aqhome/msg/msg_node.h" -#include "aqhome/msg/msg_value2.h" -#include "aqhome/ipc/endpoint_ipc.h" -#include "aqhome/ipc/nodes/msg_ipc_forward.h" -#include "aqhome/ipc/nodes/msg_ipc_value.h" -#include "aqhome/ipc/requests.h" - -#include -#include -#include -#include - - - -/* ------------------------------------------------------------------------------------------------ - * defines - * ------------------------------------------------------------------------------------------------ - */ - -#define I18N(msg) msg -#define I18S(msg) msg - - - -/* ------------------------------------------------------------------------------------------------ - * forward declarations - * ------------------------------------------------------------------------------------------------ - */ - - - - -/* ------------------------------------------------------------------------------------------------ - * implementations - * ------------------------------------------------------------------------------------------------ - */ - -void AqHomed_Loop(AQHOMED *aqh, int timeoutInMsecs) -{ - if (aqh) { - GWEN_MsgEndpoint_ChildrenIoLoop(aqh->rootEndpoint, timeoutInMsecs); - AqHomed_ReadAndHandleTtyMessages(aqh); - AqHomed_ReadAndHandleIpcMessages(aqh); - AqHomed_ReadAndHandleBrokerMessages(aqh); - - AQH_Requests_CheckTimeouts(aqh->requestTree); - AQH_Requests_Cleanup(aqh->requestTree); - -#if 0 - DBG_ERROR(NULL, "Messages in TTY queue: %d in, %d out", - GWEN_Msg_List_GetCount(GWEN_MsgEndpoint_GetReceivedMessageList(aqh->ttyEndpoint)), - GWEN_Msg_List_GetCount(GWEN_MsgEndpoint_GetSendMessageList(aqh->ttyEndpoint))); - - DBG_ERROR(NULL, "Messages in IPC queue: %d in, %d out", - GWEN_Msg_List_GetCount(GWEN_MsgEndpoint_GetReceivedMessageList(aqh->ipcdEndpoint)), - GWEN_Msg_List_GetCount(GWEN_MsgEndpoint_GetSendMessageList(aqh->ipcdEndpoint))); - - DBG_ERROR(NULL, "Messages in Broker queue: %d in, %d out", - GWEN_Msg_List_GetCount(GWEN_MsgEndpoint_GetReceivedMessageList(aqh->brokerEndpoint)), - GWEN_Msg_List_GetCount(GWEN_MsgEndpoint_GetSendMessageList(aqh->brokerEndpoint))); -#endif - - if (AQH_NodeDb_IsModified(aqh->nodeDb)) - AqHomed_WriteNodeDb(aqh); - } -} - - - diff --git a/apps/aqhome-nodes/loop.h b/apps/aqhome-nodes/loop.h deleted file mode 100644 index c715173..0000000 --- a/apps/aqhome-nodes/loop.h +++ /dev/null @@ -1,23 +0,0 @@ -/**************************************************************************** - * 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 AQHOMED_LOOP_H -#define AQHOMED_LOOP_H - - -#include "./aqhomed.h" - - - -void AqHomed_Loop(AQHOMED *aqh, int timeoutInMsecs); - - - -#endif - - diff --git a/apps/aqhome-nodes/loop_broker.c b/apps/aqhome-nodes/loop_broker.c deleted file mode 100644 index 9c21554..0000000 --- a/apps/aqhome-nodes/loop_broker.c +++ /dev/null @@ -1,101 +0,0 @@ -/**************************************************************************** - * 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 "./loop_broker.h" -#include "./aqhomed_p.h" -#include "./tty_log.h" -#include "./db.h" -#include "./r_setdata.h" - -#include "aqhome/msg/endpoint_tty.h" -#include "aqhome/msg/msg_node.h" -#include "aqhome/msg/msg_value2.h" -#include "aqhome/msg/msg_ping.h" -#include "aqhome/ipc/endpoint_ipc.h" -#include "aqhome/ipc/msg_ipc_result.h" -#include "aqhome/ipc/data/ipc_data.h" -#include "aqhome/ipc/requests.h" - -#include -#include -#include -#include - - - -/* ------------------------------------------------------------------------------------------------ - * defines - * ------------------------------------------------------------------------------------------------ - */ - - - -/* ------------------------------------------------------------------------------------------------ - * forward declarations - * ------------------------------------------------------------------------------------------------ - */ - - -static void _handleIpcMsg(AQHOMED *aqh, GWEN_MSG_ENDPOINT *ep, GWEN_MSG *msg); - - - -/* ------------------------------------------------------------------------------------------------ - * implementations - * ------------------------------------------------------------------------------------------------ - */ - - -void AqHomed_ReadAndHandleBrokerMessages(AQHOMED *aqh) -{ - if (aqh->brokerEndpoint) { - GWEN_MSG_ENDPOINT *epTcp; - GWEN_MSG *msg; - - epTcp=aqh->brokerEndpoint; - while( (msg=GWEN_MsgEndpoint_TakeFirstReceivedMessage(epTcp)) ) { - uint16_t code; - - code=GWEN_IpcMsg_GetCode(msg); - DBG_DEBUG(AQH_LOGDOMAIN, "Received IPC packet %d (%x)", (int) code, code); - if (AQH_Requests_HandleIpcMsg(aqh->requestTree, epTcp, msg)!=GWEN_MSG_REQUEST_RESULT_HANDLED) - _handleIpcMsg(aqh, epTcp, msg); - GWEN_Msg_free(msg); - } - } -} - - - -void _handleIpcMsg(AQHOMED *aqh, GWEN_MSG_ENDPOINT *ep, GWEN_MSG *msg) -{ - uint16_t code; - - /* exec IPC message */ - code=GWEN_IpcMsg_GetCode(msg); - DBG_DEBUG(AQH_LOGDOMAIN, "Received IPC packet"); - switch(code) { - case AQH_MSGTYPE_IPC_DATA_SETDATA: AqHomeNodes_HandleSetData(aqh, ep, msg); break; - default: break; - } -} - - - - - - - - - - diff --git a/apps/aqhome-nodes/loop_broker.h b/apps/aqhome-nodes/loop_broker.h deleted file mode 100644 index 7de6eb4..0000000 --- a/apps/aqhome-nodes/loop_broker.h +++ /dev/null @@ -1,25 +0,0 @@ -/**************************************************************************** - * 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 AQHOMED_LOOP_BROKER_H -#define AQHOMED_LOOP_BROKER_H - - -#include "./aqhomed.h" - - -/** - * Handle messageexchange with the broker (aqhome-data). - */ -void AqHomed_ReadAndHandleBrokerMessages(AQHOMED *aqh); - - - -#endif - - diff --git a/apps/aqhome-nodes/loop_ipc.c b/apps/aqhome-nodes/loop_ipc.c deleted file mode 100644 index fc3e6cd..0000000 --- a/apps/aqhome-nodes/loop_ipc.c +++ /dev/null @@ -1,197 +0,0 @@ -/**************************************************************************** - * 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 "./loop_ipc.h" -#include "./aqhomed_p.h" -#include "./tty_log.h" -#include "./db.h" -#include "./r_setdata.h" - -#include "aqhome/msg/endpoint_tty.h" -#include "aqhome/msg/msg_node.h" -#include "aqhome/msg/msg_value2.h" -#include "aqhome/msg/msg_value3.h" -#include "aqhome/msg/msg_ping.h" -#include "aqhome/ipc/endpoint_ipc.h" -#include "aqhome/ipc/nodes/ipc_nodes.h" -#include "aqhome/ipc/nodes/msg_ipc_forward.h" -#include "aqhome/ipc/nodes/msg_ipc_value.h" -#include "aqhome/ipc/nodes/msg_ipc_ping.h" -#include "aqhome/ipc/nodes/msg_ipc_setaccmsggrps.h" -#include "aqhome/ipc/nodes/msg_ipc_getdevices_rsp.h" -#include "aqhome/ipc/data/ipc_data.h" -#include "aqhome/ipc/data/msg_data_set.h" -#include "aqhome/ipc/msg_ipc_result.h" -#include "aqhome/ipc/requests.h" - -#include -#include -#include -#include - -#include - - - -/* ------------------------------------------------------------------------------------------------ - * defines - * ------------------------------------------------------------------------------------------------ - */ - -#define I18N(msg) msg -#define I18S(msg) msg - - - -/* ------------------------------------------------------------------------------------------------ - * forward declarations - * ------------------------------------------------------------------------------------------------ - */ - -static void _handleIpcEndpoint(AQHOMED *aqh, GWEN_MSG_ENDPOINT *ep); -static void _handleIpcMsg(AQHOMED *aqh, GWEN_MSG_ENDPOINT *ep, GWEN_MSG *msg); -void _handleIpcMsgPing(AQHOMED *aqh, GWEN_MSG_ENDPOINT *ep, const GWEN_MSG *msg); -void _handleIpcMsgSetAccMsgGrps(AQHOMED *aqh, GWEN_MSG_ENDPOINT *ep, const GWEN_MSG *msg); -void _handleIpcMsgForward(AQHOMED *aqh, GWEN_MSG_ENDPOINT *ep, const GWEN_MSG *msg); -void _handleIpcMsgGetDevicesReq(AQHOMED *aqh, GWEN_MSG_ENDPOINT *ep, const GWEN_MSG *msg); - - - -/* ------------------------------------------------------------------------------------------------ - * implementations - * ------------------------------------------------------------------------------------------------ - */ - - -void AqHomed_ReadAndHandleIpcMessages(AQHOMED *aqh) -{ - if (aqh->ipcdEndpoint) { - GWEN_MSG_ENDPOINT *ep; - - ep=GWEN_MsgEndpoint_Tree2_GetFirstChild(aqh->ipcdEndpoint); - while(ep) { - _handleIpcEndpoint(aqh, ep); - ep=GWEN_MsgEndpoint_Tree2_GetNext(ep); - } - } -} - - - -void _handleIpcEndpoint(AQHOMED *aqh, GWEN_MSG_ENDPOINT *ep) -{ - GWEN_MSG *msg; - - while( (msg=GWEN_MsgEndpoint_TakeFirstReceivedMessage(ep)) ) { - if (AQH_Requests_HandleIpcMsg(aqh->requestTree, ep, msg)!=GWEN_MSG_REQUEST_RESULT_HANDLED) - _handleIpcMsg(aqh, ep, msg); - GWEN_Msg_free(msg); - } -} - - - -void _handleIpcMsg(AQHOMED *aqh, GWEN_MSG_ENDPOINT *ep, GWEN_MSG *msg) -{ - uint16_t code; - - /* exec IPC message */ - code=GWEN_IpcMsg_GetCode(msg); - DBG_INFO(AQH_LOGDOMAIN, "Received IPC packet (%d, %04x)", code, code); - switch(code) { - case AQH_MSGTYPE_IPC_NODES_PING: _handleIpcMsgPing(aqh, ep, msg); break; - case AQH_MSGTYPE_IPC_NODES_SETACCMSGGRPS: _handleIpcMsgSetAccMsgGrps(aqh, ep, msg); break; - case AQH_MSGTYPE_IPC_NODES_FORWARD: _handleIpcMsgForward(aqh, ep, msg); break; - case AQH_MSGTYPE_IPC_NODES_GETDEVICES_REQ: _handleIpcMsgGetDevicesReq(aqh, ep, msg); break; -// case AQH_MSGTYPE_IPC_DATA_SETDATA: AqHomeNodes_HandleNodeSetData(aqh, ep, msg); break; - default: break; - } -} - - - -void _handleIpcMsgPing(AQHOMED *aqh, GWEN_MSG_ENDPOINT *ep, const GWEN_MSG *msg) -{ - if (aqh->ttyEndpoint && GWEN_MsgEndpoint_GetState(aqh->ttyEndpoint)==GWEN_MSG_ENDPOINT_STATE_CONNECTED) { - GWEN_MSG *msgOut; - - DBG_DEBUG(AQH_LOGDOMAIN, "Received IPC PING message"); - msgOut=AQH_PingMsg_new(aqh->nodeAddress, AQH_PingIpcMsg_GetDestAddr(msg), AQH_MSG_TYPE_PING); - GWEN_MsgEndpoint_AddSendMessage(aqh->ttyEndpoint, msgOut); - } -} - - - -void _handleIpcMsgSetAccMsgGrps(AQHOMED *aqh, GWEN_MSG_ENDPOINT *ep, const GWEN_MSG *msg) -{ - uint32_t groups; - - DBG_INFO(AQH_LOGDOMAIN, "Received IPC SET_ACCEPTED_MSG_GROUPS message"); - groups=AQH_SetAcceptedMsgGroupsIpcMsg_GetMsgGroups(msg); - AQH_IpcEndpoint_SetAcceptedMsgGroups(ep, groups); - // TODO: send response? -} - - - -void _handleIpcMsgForward(AQHOMED *aqh, GWEN_MSG_ENDPOINT *ep, const GWEN_MSG *msg) -{ - if (aqh->ttyEndpoint && GWEN_MsgEndpoint_GetState(aqh->ttyEndpoint)==GWEN_MSG_ENDPOINT_STATE_CONNECTED) { - GWEN_MSG *msgOut; - - DBG_DEBUG(AQH_LOGDOMAIN, "Received IPC FORWARD message"); - msgOut=AQH_ForwardIpcMsg_GetCopyOfNodeMsg(msg); - if (msgOut) - GWEN_MsgEndpoint_AddSendMessage(aqh->ttyEndpoint, msgOut); - } -} - - - -void _handleIpcMsgGetDevicesReq(AQHOMED *aqh, GWEN_MSG_ENDPOINT *ep, const GWEN_MSG *msg) -{ - AQH_NODE_INFO_LIST *nodeInfoList; - - DBG_INFO(AQH_LOGDOMAIN, "Received IPC GetDevicesRequest message"); - nodeInfoList=AQH_NodeDb_GetAllNodeInfos(aqh->nodeDb); - if (nodeInfoList && AQH_NodeInfo_List_GetCount(nodeInfoList)) { - const AQH_NODE_INFO *ni; - - ni=AQH_NodeInfo_List_First(nodeInfoList); - while(ni) { - const AQH_NODE_INFO *niNext; - GWEN_MSG *msgOut; - - niNext=AQH_NodeInfo_List_Next(ni); - DBG_INFO(AQH_LOGDOMAIN, "Sending response for node %02x (%08x)", AQH_NodeInfo_GetBusAddress(ni), AQH_NodeInfo_GetUid(ni)); - msgOut=AQH_GetDevicesResponseIpcMsg_new(AQH_MSGTYPE_IPC_NODES_GETDEVICES_RSP, - GWEN_MsgEndpoint_GetNextMessageId(ep), GWEN_IpcMsg_GetMsgId(msg), - niNext?0:AQH_MSGIPC_GETDEVICES_RSP_FLAGS_LAST, ni); - GWEN_MsgEndpoint_AddSendMessage(ep, msgOut); - ni=niNext; - } - } - else { - GWEN_MSG *msgOut; - - DBG_INFO(AQH_LOGDOMAIN, "No nodes"); - msgOut=AQH_ResultIpcMsg_new(AQH_MSGTYPE_IPC_NODES_RESULT, - GWEN_MsgEndpoint_GetNextMessageId(ep), GWEN_IpcMsg_GetMsgId(msg), - AQH_MSG_IPC_ERROR_NODATA); - GWEN_MsgEndpoint_AddSendMessage(ep, msgOut); - } -} - - - diff --git a/apps/aqhome-nodes/loop_ipc.h b/apps/aqhome-nodes/loop_ipc.h deleted file mode 100644 index fab747e..0000000 --- a/apps/aqhome-nodes/loop_ipc.h +++ /dev/null @@ -1,23 +0,0 @@ -/**************************************************************************** - * 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 AQHOMED_LOOP_IPC_H -#define AQHOMED_LOOP_IPC_H - - -#include "./aqhomed.h" - - - -void AqHomed_ReadAndHandleIpcMessages(AQHOMED *aqh); - - - -#endif - - diff --git a/apps/aqhome-nodes/loop_tty.c b/apps/aqhome-nodes/loop_tty.c deleted file mode 100644 index e2a1b5e..0000000 --- a/apps/aqhome-nodes/loop_tty.c +++ /dev/null @@ -1,87 +0,0 @@ -/**************************************************************************** - * 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 "./loop_tty.h" -#include "./loop_tty_ipc.h" -#include "./loop_tty_broker.h" -#include "./aqhomed_p.h" -#include "./tty_log.h" -#include "./db.h" - -#include "aqhome/msg/endpoint_tty.h" -#include "aqhome/msg/msg_node.h" -#include "aqhome/msg/msg_value2.h" -#include "aqhome/ipc/endpoint_ipc.h" -#include "aqhome/ipc/nodes/msg_ipc_forward.h" -#include "aqhome/ipc/nodes/msg_ipc_value.h" -#include "aqhome/ipc/requests.h" - -#include -#include -#include -#include - - - -/* ------------------------------------------------------------------------------------------------ - * defines - * ------------------------------------------------------------------------------------------------ - */ - -#define I18N(msg) msg -#define I18S(msg) msg - - - -/* ------------------------------------------------------------------------------------------------ - * forward declarations - * ------------------------------------------------------------------------------------------------ - */ - -static void _handleTtyMsg(AQHOMED *aqh, const GWEN_MSG *msg); - - - -/* ------------------------------------------------------------------------------------------------ - * implementations - * ------------------------------------------------------------------------------------------------ - */ - - -void AqHomed_ReadAndHandleTtyMessages(AQHOMED *aqh) -{ - GWEN_MSG *msg; - - while( (msg=GWEN_MsgEndpoint_TakeFirstReceivedMessage(aqh->ttyEndpoint)) ) { - _handleTtyMsg(aqh, msg); - AQH_Requests_HandleTtyMsg(aqh->requestTree, aqh->ttyEndpoint, msg); - GWEN_Msg_free(msg); - } -} - - - -void _handleTtyMsg(AQHOMED *aqh, const GWEN_MSG *msg) -{ - if (aqh->logFile) - AqHomed_LogTtyMsg(aqh, msg); - if (aqh->nodeDb) - AqHomed_NodeMsgToDb(aqh, msg); - if (aqh->ipcdEndpoint) - AqHomed_ForwardTtyMsgToIpcClients(aqh, msg); - if (aqh->brokerEndpoint) - AqHomed_ForwardTtyMsgToBroker(aqh, msg); -} - - - diff --git a/apps/aqhome-nodes/loop_tty.h b/apps/aqhome-nodes/loop_tty.h deleted file mode 100644 index f5aac57..0000000 --- a/apps/aqhome-nodes/loop_tty.h +++ /dev/null @@ -1,23 +0,0 @@ -/**************************************************************************** - * 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 AQHOMED_LOOP_TTY_H -#define AQHOMED_LOOP_TTY_H - - -#include "./aqhomed.h" - - - -void AqHomed_ReadAndHandleTtyMessages(AQHOMED *aqh); - - - -#endif - - diff --git a/apps/aqhome-nodes/loop_tty_broker.c b/apps/aqhome-nodes/loop_tty_broker.c deleted file mode 100644 index 0dced0b..0000000 --- a/apps/aqhome-nodes/loop_tty_broker.c +++ /dev/null @@ -1,234 +0,0 @@ -/**************************************************************************** - * 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 "./loop_tty_broker.h" -#include "./aqhomed_p.h" -#include "./tty_log.h" -#include "./db.h" - -#include "aqhome/aqhome.h" -#include "aqhome/msg/endpoint_tty.h" -#include "aqhome/msg/msg_node.h" -#include "aqhome/msg/msg_value2.h" -#include "aqhome/msg/msg_value3.h" -#include "aqhome/msg/msg_sendstats.h" -#include "aqhome/msg/msg_recvstats.h" -#include "aqhome/ipc/endpoint_ipc.h" -#include "aqhome/ipc/data/msg_data_multidata.h" -#include "aqhome/ipc/data/ipc_data.h" - -#include -#include -#include -#include - - - -/* ------------------------------------------------------------------------------------------------ - * defines - * ------------------------------------------------------------------------------------------------ - */ - -#define I18N(msg) msg -#define I18S(msg) msg - - - -/* ------------------------------------------------------------------------------------------------ - * forward declarations - * ------------------------------------------------------------------------------------------------ - */ - -static void _processValue3Message(AQHOMED *aqh, const GWEN_MSG *nodeMsg); -static void _processSendStatsMessage(AQHOMED *aqh, const GWEN_MSG *nodeMsg); -static void _processRecvStatsMessage(AQHOMED *aqh, const GWEN_MSG *nodeMsg); -static void _publishInt(AQHOMED *aqh, uint32_t uid, const char *vPath, int vModality, const char *vUnits, int v); -static void _publishDouble(AQHOMED *aqh, uint32_t uid, const char *vPath, int vType, const char *vUnits, double v); -static void _setDeviceName(AQH_VALUE *value, uint32_t uid); - - - -/* ------------------------------------------------------------------------------------------------ - * implementations - * ------------------------------------------------------------------------------------------------ - */ - -void AqHomed_ForwardTtyMsgToBroker(AQHOMED *aqh, const GWEN_MSG *nodeMsg) -{ - if (GWEN_MsgEndpoint_GetState(aqh->brokerEndpoint)==GWEN_MSG_ENDPOINT_STATE_CONNECTED) { - DBG_DEBUG(AQH_LOGDOMAIN, "Processing output message"); - switch(AQH_NodeMsg_GetMsgType(nodeMsg)) { - case AQH_MSG_TYPE_VALUE_REPORT: - _processValue3Message(aqh, nodeMsg); - break; - case AQH_MSG_TYPE_COMSENDSTATS: - _processSendStatsMessage(aqh, nodeMsg); - break; - case AQH_MSG_TYPE_COMRECVSTATS: - _processRecvStatsMessage(aqh, nodeMsg); - break; - default: - break; - } - } -} - - - -void _processValue3Message(AQHOMED *aqh, const GWEN_MSG *nodeMsg) -{ - uint32_t uid; - uint8_t valueId; - AQH_NODE_INFO *ni; - double v; - - uid=AQH_Value3Msg_GetUid(nodeMsg); - valueId=AQH_Value3Msg_GetValueId(nodeMsg); - v=AQH_Value3Msg_GetValue(nodeMsg); - ni=AQH_NodeDb_GetNodeInfoByUid(aqh->nodeDb, uid); - if (ni) { - const char *devName; - - devName=AQH_NodeInfo_GetDeviceId(ni); - if (devName) { - const AQHNODE_DEVICE *devInfo; - - devInfo=AqHomed_GetDeviceDefByName(aqh, devName); - if (devInfo) { - const AQHNODE_VALUE *value; - - value=AQHNODE_Value_List_GetById(AQHNODE_Device_GetValueList(devInfo), valueId); - if (value) { - const char *vname; - - vname=AQHNODE_Value_GetName(value); - if (vname && *vname) - _publishDouble(aqh, uid, vname, AQHNODE_Value_GetModality(value), AQHNODE_Value_GetValueUnits(value), v); - } - } - } - } -} - - - -void _processSendStatsMessage(AQHOMED *aqh, const GWEN_MSG *nodeMsg) -{ - uint16_t packetsOutInt; - - packetsOutInt=AQH_SendStatsMsg_GetPacketsOut(nodeMsg); - if (packetsOutInt) { - uint32_t uid; - double packetsOut; - double collisions; - double busy; - double collisionsPercentage=0.0; - double busyPercentage=0.0; - - uid=AQH_SendStatsMsg_GetUid(nodeMsg); - packetsOut=/*(double)*/ packetsOutInt; - collisions=/*(double)*/ AQH_SendStatsMsg_GetCollisions(nodeMsg); - busy=/*(double)*/ AQH_SendStatsMsg_GetBusyErrors(nodeMsg); - - collisionsPercentage=collisions*100.0/packetsOut; - busyPercentage=busy*100.0/packetsOut; - - _publishInt( aqh, uid, "net/packetsOut", 0, NULL, packetsOutInt); - _publishInt( aqh, uid, "net/collisions", 0, NULL, (int) AQH_SendStatsMsg_GetCollisions(nodeMsg)); - _publishDouble(aqh, uid, "net/collisionsPercent", 0, "%", collisionsPercentage); - _publishDouble(aqh, uid, "net/busyPercent", 0, "%", busyPercentage); - } -} - - - -void _processRecvStatsMessage(AQHOMED *aqh, const GWEN_MSG *nodeMsg) -{ - uint16_t packetsInInt; - - packetsInInt=AQH_RecvStatsMsg_GetPacketsIn(nodeMsg); - if (packetsInInt) { - uint32_t uid; - double packetsIn; - double crcErrors; - double ioErrors; - double crcErrorsPercentage=0.0; - double ioErrorsPercentage=0.0; - - uid=AQH_SendStatsMsg_GetUid(nodeMsg); - packetsIn=/*(double)*/ packetsInInt; - crcErrors=/*(double)*/AQH_RecvStatsMsg_GetCrcErrors(nodeMsg); - ioErrors=/*(double)*/AQH_RecvStatsMsg_GetIoErrors(nodeMsg); - - crcErrorsPercentage=crcErrors*100.0/packetsIn; - ioErrorsPercentage=ioErrors*100.0/packetsIn; - - _publishInt( aqh, uid, "net/packetsIn", 0, NULL, packetsInInt); - _publishInt( aqh, uid, "net/crcerrors", 0, NULL, (int) AQH_RecvStatsMsg_GetCrcErrors(nodeMsg)); - _publishInt( aqh, uid, "net/ioerrors", 0, NULL, (int) AQH_RecvStatsMsg_GetIoErrors(nodeMsg)); - _publishDouble(aqh, uid, "net/crcerrorsPercent", 0, "%", crcErrorsPercentage); - _publishDouble(aqh, uid, "net/ioerrorsPercent", 0, "%", ioErrorsPercentage); - } -} - - - -void _publishInt(AQHOMED *aqh, uint32_t uid, const char *vPath, int vModality, const char *vUnits, int v) -{ - _publishDouble(aqh, uid, vPath, vModality, vUnits, /*(double)*/ v); -} - - - -void _publishDouble(AQHOMED *aqh, uint32_t uid, const char *vPath, int vModality, const char *vUnits, double v) -{ - GWEN_MSG *pubMsg; - union {double f; uint64_t i;} u; - uint64_t arrayToSend[2]; - AQH_VALUE *value; - - u.f=v; - arrayToSend[0]=(uint64_t) time(NULL); - arrayToSend[1]=u.i; - - value=AQH_Value_new(); - _setDeviceName(value, uid); - AQH_Value_SetName(value, vPath); - AQH_Value_SetValueUnits(value, vUnits); - AQH_Value_SetValueType(value, AQH_ValueType_Sensor); - AQH_Value_SetModality(value, vModality); - - pubMsg=AQH_MultiDataDataIpcMsg_new(AQH_MSGTYPE_IPC_DATA_UPDATEDATA, - GWEN_MsgEndpoint_GetNextMessageId(aqh->brokerEndpoint), 0, - value, arrayToSend, 1); - if (pubMsg) { - DBG_INFO(AQH_LOGDOMAIN, "BROKER PUBLISH %s: %f", AQH_Value_GetName(value), v); - GWEN_MsgEndpoint_AddSendMessage(aqh->brokerEndpoint, pubMsg); - } - AQH_Value_free(value); -} - - - -void _setDeviceName(AQH_VALUE *value, uint32_t uid) -{ - GWEN_BUFFER *buf; - - buf=GWEN_Buffer_new(0, 64, 0, 1); - GWEN_Buffer_AppendArgs(buf, "%08x", uid); - AQH_Value_SetDeviceName(value, GWEN_Buffer_GetStart(buf)); - GWEN_Buffer_free(buf); -} - - - diff --git a/apps/aqhome-nodes/loop_tty_broker.h b/apps/aqhome-nodes/loop_tty_broker.h deleted file mode 100644 index ff08923..0000000 --- a/apps/aqhome-nodes/loop_tty_broker.h +++ /dev/null @@ -1,23 +0,0 @@ -/**************************************************************************** - * 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 AQHOMED_LOOP_TTY_BROKER_H -#define AQHOMED_LOOP_TTY_BROKER_H - - -#include "./aqhomed.h" - - - -void AqHomed_ForwardTtyMsgToBroker(AQHOMED *aqh, const GWEN_MSG *nodeMsg); - - - -#endif - - diff --git a/apps/aqhome-nodes/loop_tty_ipc.c b/apps/aqhome-nodes/loop_tty_ipc.c deleted file mode 100644 index 081d156..0000000 --- a/apps/aqhome-nodes/loop_tty_ipc.c +++ /dev/null @@ -1,120 +0,0 @@ -/**************************************************************************** - * 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 "./loop_tty_ipc.h" -#include "./aqhomed_p.h" -#include "./tty_log.h" -#include "./db.h" - -#include "aqhome/msg/endpoint_tty.h" -#include "aqhome/msg/msg_node.h" -#include "aqhome/msg/msg_value2.h" -#include "aqhome/ipc/endpoint_ipc.h" -#include "aqhome/ipc/nodes/msg_ipc_forward.h" -#include "aqhome/ipc/nodes/msg_ipc_value.h" -#include "aqhome/mqtt/endpoint_mqttc.h" - -#include -#include -#include -#include - - - -/* ------------------------------------------------------------------------------------------------ - * defines - * ------------------------------------------------------------------------------------------------ - */ - -#define I18N(msg) msg -#define I18S(msg) msg - - - -/* ------------------------------------------------------------------------------------------------ - * forward declarations - * ------------------------------------------------------------------------------------------------ - */ - -static void _forwardValue2MsgToIpc(GWEN_MSG_ENDPOINT *ep, const GWEN_MSG *nodeMsg); -static void _forwardAnyMsgToIpc(GWEN_MSG_ENDPOINT *ep, const GWEN_MSG *nodeMsg); - - - -/* ------------------------------------------------------------------------------------------------ - * implementations - * ------------------------------------------------------------------------------------------------ - */ - -void AqHomed_ForwardTtyMsgToIpcClients(AQHOMED *aqh, const GWEN_MSG *msg) -{ - uint32_t msgGroup; - - msgGroup=AQH_NodeMsg_GetMsgGroup(AQH_NodeMsg_GetMsgType(msg)); - if (msgGroup) { - GWEN_MSG_ENDPOINT *ep; - - ep=GWEN_MsgEndpoint_Tree2_GetFirstChild(aqh->ipcdEndpoint); - while(ep) { - if (msgGroup & AQH_IpcEndpoint_GetAcceptedMsgGroups(ep)) { - DBG_INFO(NULL, "Endpoint accepts msg group %d", msgGroup); - switch(AQH_NodeMsg_GetMsgType(msg)) { - case AQH_MSG_TYPE_VALUE2: - _forwardValue2MsgToIpc(ep, msg); - break; - default: - _forwardAnyMsgToIpc(ep, msg); - break; - } - - } - ep=GWEN_MsgEndpoint_Tree2_GetNext(ep); - } - } - else { - DBG_ERROR(NULL, "Message type %d not in any message group, ignoring message", AQH_NodeMsg_GetMsgType(msg)); - } -} - - - -void _forwardValue2MsgToIpc(GWEN_MSG_ENDPOINT *ep, const GWEN_MSG *nodeMsg) -{ - GWEN_MSG *ipcMsg; - - ipcMsg=AQH_ValueIpcMsg_new(AQH_MSGTYPE_IPC_NODES_VALUE, - GWEN_MsgEndpoint_GetNextMessageId(ep), 0, - AQH_Value2Msg_GetUid(nodeMsg), - AQH_Value2Msg_GetValueId(nodeMsg), - AQH_Value2Msg_GetValueType(nodeMsg), - AQH_Value2Msg_GetValueNom(nodeMsg), - AQH_Value2Msg_GetValueDenom(nodeMsg)); - GWEN_MsgEndpoint_AddSendMessage(ep, ipcMsg); -} - - - -void _forwardAnyMsgToIpc(GWEN_MSG_ENDPOINT *ep, const GWEN_MSG *nodeMsg) -{ - GWEN_MSG *ipcMsg; - - ipcMsg=AQH_ForwardIpcMsg_new(AQH_MSGTYPE_IPC_NODES_FORWARD, - GWEN_MsgEndpoint_GetNextMessageId(ep), 0, - GWEN_Msg_GetConstBuffer(nodeMsg), GWEN_Msg_GetBytesInBuffer(nodeMsg)); - GWEN_MsgEndpoint_AddSendMessage(ep, ipcMsg); -} - - - - - diff --git a/apps/aqhome-nodes/loop_tty_ipc.h b/apps/aqhome-nodes/loop_tty_ipc.h deleted file mode 100644 index 39e4c0e..0000000 --- a/apps/aqhome-nodes/loop_tty_ipc.h +++ /dev/null @@ -1,23 +0,0 @@ -/**************************************************************************** - * 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 AQHOMED_LOOP_TTY_IPC_H -#define AQHOMED_LOOP_TTY_IPC_H - - -#include "./aqhomed.h" - - - -void AqHomed_ForwardTtyMsgToIpcClients(AQHOMED *aqh, const GWEN_MSG *msg); - - - -#endif - - diff --git a/apps/aqhome-nodes/loop_tty_mqtt.c b/apps/aqhome-nodes/loop_tty_mqtt.c deleted file mode 100644 index a3bf995..0000000 --- a/apps/aqhome-nodes/loop_tty_mqtt.c +++ /dev/null @@ -1,215 +0,0 @@ -/**************************************************************************** - * 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 "./loop_tty_mqtt.h" -#include "./aqhomed_p.h" -#include "./tty_log.h" -#include "./tty_write.h" -#include "./db.h" - -#include "aqhome/msg/endpoint_tty.h" -#include "aqhome/msg/msg_node.h" -#include "aqhome/msg/msg_value2.h" -#include "aqhome/msg/msg_sendstats.h" -#include "aqhome/msg/msg_recvstats.h" -#include "aqhome/ipc/endpoint_ipc.h" -#include "aqhome/ipc/nodes/msg_ipc_forward.h" -#include "aqhome/ipc/nodes/msg_ipc_value.h" -#include "aqhome/mqtt/endpoint_mqttc.h" -#include "aqhome/mqtt/msg_mqtt_publish.h" - -#include -#include -#include -#include - - - -/* ------------------------------------------------------------------------------------------------ - * defines - * ------------------------------------------------------------------------------------------------ - */ - -#define I18N(msg) msg -#define I18S(msg) msg - - - -/* ------------------------------------------------------------------------------------------------ - * forward declarations - * ------------------------------------------------------------------------------------------------ - */ - -static void _processValue2Message(AQHOMED *aqh, const GWEN_MSG *nodeMsg); -static void _processSendStatsMessage(AQHOMED *aqh, const GWEN_MSG *nodeMsg); -static void _processRecvStatsMessage(AQHOMED *aqh, const GWEN_MSG *nodeMsg); -static void _publishDouble(AQHOMED *aqh, uint32_t uid, int valueId, const char *valuePath, double v); -static void _publishInt(AQHOMED *aqh, uint32_t uid, int valueId, const char *valuePath, int v); -static void _publishString(AQHOMED *aqh, uint32_t uid, int valueId, const char *valuePath, const char *v); - - - - -/* ------------------------------------------------------------------------------------------------ - * implementations - * ------------------------------------------------------------------------------------------------ - */ - - - -void AqHomed_ForwardTtyMsgToMqttServer(AQHOMED *aqh, const GWEN_MSG *nodeMsg) -{ - if (GWEN_MsgEndpoint_GetState(aqh->mqttEndpoint)==GWEN_MSG_ENDPOINT_STATE_CONNECTED) { - DBG_DEBUG(AQH_LOGDOMAIN, "Processing output message"); - switch(AQH_NodeMsg_GetMsgType(nodeMsg)) { - case AQH_MSG_TYPE_VALUE2: - _processValue2Message(aqh, nodeMsg); - break; - case AQH_MSG_TYPE_COMSENDSTATS: - _processSendStatsMessage(aqh, nodeMsg); - break; - case AQH_MSG_TYPE_COMRECVSTATS: - _processRecvStatsMessage(aqh, nodeMsg); - break; - default: - break; - } - } -} - - - -void _processValue2Message(AQHOMED *aqh, const GWEN_MSG *nodeMsg) -{ - if (AQH_Value2Msg_GetValueType(nodeMsg)==AQH_MSG_VALUE2_TYPE_DOOR) - _publishString(aqh, - AQH_Value2Msg_GetUid(nodeMsg), - AQH_Value2Msg_GetValueId(nodeMsg), - AQH_Value2Msg_GetValueTypeName(nodeMsg), - AQH_Value2Msg_GetValueAsWindowStateString(nodeMsg)); - else - _publishDouble(aqh, - AQH_Value2Msg_GetUid(nodeMsg), - AQH_Value2Msg_GetValueId(nodeMsg), - AQH_Value2Msg_GetValueTypeName(nodeMsg), - AQH_Value2Msg_GetValue(nodeMsg)); -} - - - -void _processSendStatsMessage(AQHOMED *aqh, const GWEN_MSG *nodeMsg) -{ - uint16_t packetsOutInt; - - packetsOutInt=AQH_SendStatsMsg_GetPacketsOut(nodeMsg); - if (packetsOutInt) { - double packetsOut; - double collisions; - double busy; - double collisionsPercentage=0.0; - double busyPercentage=0.0; - - packetsOut=(double) packetsOutInt; - collisions=(double)AQH_SendStatsMsg_GetCollisions(nodeMsg); - busy=(double)AQH_SendStatsMsg_GetBusyErrors(nodeMsg); - - collisionsPercentage=collisions*100.0/packetsOut; - busyPercentage=busy*100.0/packetsOut; - - _publishInt(aqh, AQH_SendStatsMsg_GetUid(nodeMsg), 0, "net/packetsOut", packetsOutInt); - _publishInt(aqh, AQH_SendStatsMsg_GetUid(nodeMsg), 0, "net/collisions", (int) AQH_SendStatsMsg_GetCollisions(nodeMsg)); - _publishDouble(aqh, AQH_SendStatsMsg_GetUid(nodeMsg), 0, "net/collisionsPercent", collisionsPercentage); - _publishDouble(aqh, AQH_SendStatsMsg_GetUid(nodeMsg), 0, "net/busyPercent", busyPercentage); - } -} - - - -void _processRecvStatsMessage(AQHOMED *aqh, const GWEN_MSG *nodeMsg) -{ - uint16_t packetsInInt; - - packetsInInt=AQH_RecvStatsMsg_GetPacketsIn(nodeMsg); - if (packetsInInt) { - double packetsIn; - double crcErrors; - double ioErrors; - double crcErrorsPercentage=0.0; - double ioErrorsPercentage=0.0; - - packetsIn=(double) packetsInInt; - crcErrors=(double)AQH_RecvStatsMsg_GetCrcErrors(nodeMsg); - ioErrors=(double)AQH_RecvStatsMsg_GetIoErrors(nodeMsg); - - crcErrorsPercentage=crcErrors*100.0/packetsIn; - ioErrorsPercentage=ioErrors*100.0/packetsIn; - - _publishInt(aqh, AQH_RecvStatsMsg_GetUid(nodeMsg), 0, "net/packetsIn", packetsInInt); - _publishInt(aqh, AQH_RecvStatsMsg_GetUid(nodeMsg), 0, "net/crcerrors", (int) AQH_RecvStatsMsg_GetCrcErrors(nodeMsg)); - _publishInt(aqh, AQH_RecvStatsMsg_GetUid(nodeMsg), 0, "net/ioerrors", (int) AQH_RecvStatsMsg_GetIoErrors(nodeMsg)); - _publishDouble(aqh, AQH_RecvStatsMsg_GetUid(nodeMsg), 0, "net/crcerrorsPercent", crcErrorsPercentage); - _publishDouble(aqh, AQH_RecvStatsMsg_GetUid(nodeMsg), 0, "net/ioerrorsPercent", ioErrorsPercentage); - } -} - - - -void _publishDouble(AQHOMED *aqh, uint32_t uid, int valueId, const char *valuePath, double v) -{ - char numBuf[16]; - - snprintf(numBuf, sizeof(numBuf)-1, "%f", v); - numBuf[sizeof(numBuf)-1]=0; - _publishString(aqh, uid, valueId, valuePath, numBuf); -} - - - -void _publishInt(AQHOMED *aqh, uint32_t uid, int valueId, const char *valuePath, int v) -{ - char numBuf[16]; - - snprintf(numBuf, sizeof(numBuf)-1, "%d", v); - numBuf[sizeof(numBuf)-1]=0; - _publishString(aqh, uid, valueId, valuePath, numBuf); -} - - - -void _publishString(AQHOMED *aqh, uint32_t uid, int valueId, const char *valuePath, const char *v) -{ - GWEN_BUFFER *bufTopic; - GWEN_MSG *pubMsg; - - bufTopic=GWEN_Buffer_new(0, 64, 0, 1); - if (valueId>0) - GWEN_Buffer_AppendArgs(bufTopic, "%s/%08x/%d/%s", - aqh->mqttTopicPrefix, - uid, - valueId, - valuePath); - else - GWEN_Buffer_AppendArgs(bufTopic, "%s/%08x/%s", - aqh->mqttTopicPrefix, - uid, - valuePath); - - pubMsg=AQH_PublishMqttMsg_new(0, 0, GWEN_Buffer_GetStart(bufTopic), (const uint8_t*) v, strlen(v)); - if (pubMsg) { - DBG_INFO(AQH_LOGDOMAIN, "MQTT PUBLISH %s: %s", GWEN_Buffer_GetStart(bufTopic), v); - GWEN_MsgEndpoint_AddSendMessage(aqh->mqttEndpoint, pubMsg); - } - GWEN_Buffer_free(bufTopic); -} - - diff --git a/apps/aqhome-nodes/loop_tty_mqtt.h b/apps/aqhome-nodes/loop_tty_mqtt.h deleted file mode 100644 index ab62bd2..0000000 --- a/apps/aqhome-nodes/loop_tty_mqtt.h +++ /dev/null @@ -1,23 +0,0 @@ -/**************************************************************************** - * 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 AQHOMED_LOOP_TTY_MQTT_H -#define AQHOMED_LOOP_TTY_MQTT_H - - -#include "./aqhomed.h" - - - -void AqHomed_ForwardTtyMsgToMqttServer(AQHOMED *aqh, const GWEN_MSG *msg); - - - -#endif - - diff --git a/apps/aqhomed/0BUILD b/apps/aqhomed/0BUILD deleted file mode 100644 index 63e6a6e..0000000 --- a/apps/aqhomed/0BUILD +++ /dev/null @@ -1,85 +0,0 @@ - - - - - - - - $(gwenhywfar_cflags) - -I$(topsrcdir) - -I$(topbuilddir) - - - - --include=$(builddir) - --include=$(srcdir) - - - $(visibility_cflags) - - - - - - - - - - - - - - - - - - aqhomed.h - aqhomed_p.h - init.h - fini.h - loop.h - loop_tty.h - loop_tty_ipc.h - loop_tty_mqtt.h - loop_ipc.h - db.h - tty_log.h - tty_write.h - - - - $(local/typefiles) - main.c - aqhomed.c - init.c - fini.c - loop.c - loop_tty.c - loop_tty_ipc.c - loop_tty_mqtt.c - loop_ipc.c - db.c - tty_log.c - tty_write.c - - - - aqhome - - - - $(gwenhywfar_libs) - - - - - - - - - - - - - - diff --git a/apps/aqhomed/aqhomed.c b/apps/aqhomed/aqhomed.c deleted file mode 100644 index cf8e975..0000000 --- a/apps/aqhomed/aqhomed.c +++ /dev/null @@ -1,198 +0,0 @@ -/**************************************************************************** - * 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 "./aqhomed_p.h" -#include "./tty_log.h" -#include "./tty_write.h" - -#include "aqhome/msg/endpoint_tty.h" -#include "aqhome/ipc/endpoint_ipc.h" -#include "aqhome/mqtt/endpoint_mqttc.h" - -#include -#include - - - -/* ------------------------------------------------------------------------------------------------ - * defines - * ------------------------------------------------------------------------------------------------ - */ - -#define I18N(msg) msg -#define I18S(msg) msg - - - -/* ------------------------------------------------------------------------------------------------ - * forward declarations - * ------------------------------------------------------------------------------------------------ - */ - - - - -/* ------------------------------------------------------------------------------------------------ - * implementations - * ------------------------------------------------------------------------------------------------ - */ - -AQHOMED *AqHomed_new(void) -{ - AQHOMED *aqh; - - GWEN_NEW_OBJECT(AQHOMED, aqh); - aqh->rootEndpoint=GWEN_MsgEndpoint_new("root", 0); - aqh->nodeDb=AQH_NodeDb_new(); - - return aqh; -} - - - -void AqHomed_free(AQHOMED *aqh) -{ - if (aqh) { - GWEN_MsgEndpoint_free(aqh->rootEndpoint); - aqh->rootEndpoint=NULL; - aqh->ttyEndpoint=NULL; - aqh->ipcdEndpoint=NULL; - aqh->mqttEndpoint=NULL; - GWEN_DB_Group_free(aqh->dbArgs); - AQH_NodeDb_free(aqh->nodeDb); - aqh->dbArgs=NULL; - free(aqh->logFile); - free(aqh->writeFolder); - free(aqh->pidFile); - free(aqh->dbFile); - free(aqh->mqttTopicPrefix); - - GWEN_FREE_OBJECT(aqh); - } -} - - - -GWEN_MSG_ENDPOINT *AqHomed_GetTtyEndpoint(const AQHOMED *aqh) -{ - return aqh?aqh->ttyEndpoint:NULL; -} - - - -GWEN_MSG_ENDPOINT *AqHomed_GetIpcdEndpoint(const AQHOMED *aqh) -{ - return aqh?aqh->ipcdEndpoint:NULL; -} - - - -GWEN_MSG_ENDPOINT *AqHomed_GetMqttEndpoint(const AQHOMED *aqh) -{ - return aqh?aqh->mqttEndpoint:NULL; -} - - - -GWEN_DB_NODE *AqHomed_GetDbArgs(const AQHOMED *aqh) -{ - return aqh?aqh->dbArgs:NULL; -} - - - -const char *AqHomed_GetLogFile(const AQHOMED *aqh) -{ - return aqh?aqh->logFile:NULL; -} - - - -void AqHomed_SetLogFile(AQHOMED *aqh, const char *s) -{ - if (aqh) { - free(aqh->logFile); - aqh->logFile=s?strdup(s):NULL; - } -} - - - -const char *AqHomed_GetWriteFolder(const AQHOMED *aqh) -{ - return aqh?aqh->writeFolder:NULL; -} - - - -void AqHomed_SetWriteFolder(AQHOMED *aqh, const char *s) -{ - if (aqh) { - free(aqh->writeFolder); - aqh->writeFolder=s?strdup(s):NULL; - } -} - - - -const char *AqHomed_GetPidFile(const AQHOMED *aqh) -{ - return aqh?aqh->pidFile:NULL; -} - - - -void AqHomed_SetPidFile(AQHOMED *aqh, const char *s) -{ - if (aqh) { - free(aqh->pidFile); - aqh->pidFile=s?strdup(s):NULL; - } -} - - - -const char *AqHomed_GetDbFile(const AQHOMED *aqh) -{ - return aqh?aqh->dbFile:NULL; -} - - - -void AqHomed_SetDbFile(AQHOMED *aqh, const char *s) -{ - if (aqh) { - free(aqh->dbFile); - aqh->dbFile=s?strdup(s):NULL; - } -} - - - -const char *AqHomed_GetMqttTopicPrefix(const AQHOMED *aqh) -{ - return aqh?aqh->mqttTopicPrefix:NULL; -} - - - -void AqHomed_SetMqttTopicPrefix(AQHOMED *aqh, const char *s) -{ - if (aqh) { - free(aqh->mqttTopicPrefix); - aqh->mqttTopicPrefix=s?strdup(s):NULL; - } -} - - - - diff --git a/apps/aqhomed/aqhomed.h b/apps/aqhomed/aqhomed.h deleted file mode 100644 index 1739991..0000000 --- a/apps/aqhomed/aqhomed.h +++ /dev/null @@ -1,50 +0,0 @@ -/**************************************************************************** - * 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 AQHOMED_H -#define AQHOMED_H - - -#include -#include - - -#define AQHOME_ENDPOINTGROUP_NODE 1 -#define AQHOME_ENDPOINTGROUP_IPC 2 -#define AQHOME_ENDPOINTGROUP_MQTT 4 - - -typedef struct AQHOMED AQHOMED; - -AQHOMED *AqHomed_new(void); -void AqHomed_free(AQHOMED *aqh); - -GWEN_MSG_ENDPOINT *AqHomed_GetTtyEndpoint(const AQHOMED *aqh); -GWEN_MSG_ENDPOINT *AqHomed_GetIpcdEndpoint(const AQHOMED *aqh); -GWEN_MSG_ENDPOINT *AqHomed_GetMqttEndpoint(const AQHOMED *aqh); - -GWEN_DB_NODE *AqHomed_GetDbArgs(const AQHOMED *aqh); - -const char *AqHomed_GetLogFile(const AQHOMED *aqh); -void AqHomed_SetLogFile(AQHOMED *aqh, const char *s); - -const char *AqHomed_GetWriteFolder(const AQHOMED *aqh); -void AqHomed_SetWriteFolder(AQHOMED *aqh, const char *s); - -const char *AqHomed_GetPidFile(const AQHOMED *aqh); -void AqHomed_SetPidFile(AQHOMED *aqh, const char *s); - -const char *AqHomed_GetDbFile(const AQHOMED *aqh); -void AqHomed_SetDbFile(AQHOMED *aqh, const char *s); - -const char *AqHomed_GetMqttTopicPrefix(const AQHOMED *aqh); -void AqHomed_SetMqttTopicPrefix(AQHOMED *aqh, const char *s); - -#endif - - diff --git a/apps/aqhomed/aqhomed_p.h b/apps/aqhomed/aqhomed_p.h deleted file mode 100644 index 55e6111..0000000 --- a/apps/aqhomed/aqhomed_p.h +++ /dev/null @@ -1,51 +0,0 @@ -/**************************************************************************** - * 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 AQHOMED_P_H -#define AQHOMED_P_H - - -#include "./aqhomed.h" - -#include "aqhome/nodes/nodedb.h" - - -/* default values */ -#define AQHOMED_DEFAULT_NODEADDR 240 -#define AQHOMED_DEFAULT_PIDFILE "/var/run/aqhomed.pid" -#define AQHOMED_DEFAULT_DEVICE "/dev/ttyUSB0" -#define AQHOMED_DEFAULT_IPC_PORT 45454 -#define AQHOMED_DEFAULT_MQTT_CLIENTID "aqhomed" -#define AQHOMED_DEFAULT_MQTT_TOPIC_PREFIX "aqhome/sensors" -#define AQHOMED_DEFAULT_MQTT_KEEPALIVE 600 -#define AQHOMED_DEFAULT_MQTT_PORT 1883 - - - -struct AQHOMED { - GWEN_MSG_ENDPOINT *rootEndpoint; - - GWEN_MSG_ENDPOINT *ttyEndpoint; - GWEN_MSG_ENDPOINT *ipcdEndpoint; - GWEN_MSG_ENDPOINT *mqttEndpoint; - - AQH_NODE_DB *nodeDb; - - GWEN_DB_NODE *dbArgs; - - char *dbFile; - char *logFile; - char *writeFolder; - char *pidFile; - - int nodeAddress; - char *mqttTopicPrefix; -}; - -#endif - diff --git a/apps/aqhomed/db.c b/apps/aqhomed/db.c deleted file mode 100644 index 7635d01..0000000 --- a/apps/aqhomed/db.c +++ /dev/null @@ -1,278 +0,0 @@ -/**************************************************************************** - * 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 "./db.h" -#include "./aqhomed_p.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 "aqhome/msg/msg_flashready.h" - - -#include -#include -#include -#include -#include - - - -/* ------------------------------------------------------------------------------------------------ - * forward declarations - * ------------------------------------------------------------------------------------------------ - */ - -static void _handleMsgValue2(AQHOMED *aqh, const GWEN_MSG *msg); -static void _handleMsgNeedAddress(AQHOMED *aqh, const GWEN_MSG *msg); -static void _handleMsgClaimAddress(AQHOMED *aqh, const GWEN_MSG *msg); -static void _handleMsgHaveAddress(AQHOMED *aqh, const GWEN_MSG *msg); -static void _handleMsgComSendStat(AQHOMED *aqh, const GWEN_MSG *msg); -static void _handleMsgComRecvStat(AQHOMED *aqh, const GWEN_MSG *msg); -static void _handleMsgDevice(AQHOMED *aqh, const GWEN_MSG *msg); -static void _handleMsgFlashReady(AQHOMED *aqh, const GWEN_MSG *msg); - -static AQH_NODE_INFO *_getOrCreateNodeAndUpdateUidAddr(AQHOMED *aqh, const GWEN_MSG *msg, uint32_t uid); -static void _updateTimestampLastChange(AQH_NODE_INFO *ni); - - - - -/* ------------------------------------------------------------------------------------------------ - * implementations - * ------------------------------------------------------------------------------------------------ - */ - -void AqHomed_NodeMsgToDb(AQHOMED *aqh, const GWEN_MSG *msg) -{ - int msgIsValid; - uint8_t msgType; - - DBG_INFO(AQH_LOGDOMAIN, - " - msg %d (%s) from %d to %d", - AQH_NodeMsg_GetMsgType(msg), - AQH_NodeMsg_MsgTypeToChar(AQH_NodeMsg_GetMsgType(msg)), - AQH_NodeMsg_GetSourceAddress(msg), - AQH_NodeMsg_GetDestAddress(msg)); - - msgIsValid=(AQH_NodeMsg_IsChecksumValid(msg) && AQH_NodeMsg_IsMsgComplete(msg)); - msgType=AQH_NodeMsg_GetMsgType(msg); - - if (msgIsValid) { - switch(msgType) { - case AQH_MSG_TYPE_COMSENDSTATS: _handleMsgComSendStat(aqh, msg); break; - case AQH_MSG_TYPE_COMRECVSTATS: _handleMsgComRecvStat(aqh, msg); break; - case AQH_MSG_TYPE_VALUE2: _handleMsgValue2(aqh, msg); break; - case AQH_MSG_TYPE_NEED_ADDRESS: _handleMsgNeedAddress(aqh, msg); break; - case AQH_MSG_TYPE_CLAIM_ADDRESS: _handleMsgClaimAddress(aqh, msg); break; - case AQH_MSG_TYPE_HAVE_ADDRESS: _handleMsgHaveAddress(aqh, msg); break; - case AQH_MSG_TYPE_DEVICE: _handleMsgDevice(aqh, msg); break; - case AQH_MSG_TYPE_FLASH_READY: _handleMsgFlashReady(aqh, msg); break; - default: break; - } - } -} - - - -void _handleMsgValue2(AQHOMED *aqh, const GWEN_MSG *msg) -{ - AQH_NODE_INFO *ni; - uint32_t uid; - - uid=AQH_Value2Msg_GetUid(msg); - ni=_getOrCreateNodeAndUpdateUidAddr(aqh, msg, uid); - if (ni==NULL) { - DBG_INFO(AQH_LOGDOMAIN, "Error handling message"); - } -} - - - -void _handleMsgNeedAddress(AQHOMED *aqh, const GWEN_MSG *msg) -{ - AQH_NODE_INFO *ni; - uint32_t uid; - - uid=AQH_NeedAddrMsg_GetUid(msg); - ni=_getOrCreateNodeAndUpdateUidAddr(aqh, msg, uid); - if (ni==NULL) { - DBG_INFO(AQH_LOGDOMAIN, "Error handling message"); - } -} - - - -void _handleMsgClaimAddress(AQHOMED *aqh, const GWEN_MSG *msg) -{ - AQH_NODE_INFO *ni; - uint32_t uid; - - uid=AQH_ClaimAddrMsg_GetUid(msg); - ni=_getOrCreateNodeAndUpdateUidAddr(aqh, msg, uid); - if (ni==NULL) { - DBG_INFO(AQH_LOGDOMAIN, "Error handling message"); - } -} - - - -void _handleMsgHaveAddress(AQHOMED *aqh, const GWEN_MSG *msg) -{ - AQH_NODE_INFO *ni; - uint32_t uid; - - uid=AQH_HaveAddrMsg_GetUid(msg); - ni=_getOrCreateNodeAndUpdateUidAddr(aqh, msg, uid); - if (ni==NULL) { - DBG_INFO(AQH_LOGDOMAIN, "Error handling message"); - } -} - - - -void _handleMsgComSendStat(AQHOMED *aqh, const GWEN_MSG *msg) -{ - AQH_NODE_INFO *ni; - uint32_t uid; - - uid=AQH_SendStatsMsg_GetUid(msg); - ni=_getOrCreateNodeAndUpdateUidAddr(aqh, 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_SetStatsBusy(ni, AQH_SendStatsMsg_GetBusyErrors(msg)); - AQH_NodeDb_SetModified(aqh->nodeDb); - _updateTimestampLastChange(ni); -} - - - -void _handleMsgComRecvStat(AQHOMED *aqh, const GWEN_MSG *msg) -{ - AQH_NODE_INFO *ni; - uint32_t uid; - - uid=AQH_RecvStatsMsg_GetUid(msg); - ni=_getOrCreateNodeAndUpdateUidAddr(aqh, msg, uid); - if (ni==NULL) { - DBG_INFO(AQH_LOGDOMAIN, "Error handling message"); - } - AQH_NodeInfo_SetStatsPacketsIn(ni, AQH_RecvStatsMsg_GetPacketsIn(msg)); - AQH_NodeInfo_SetStatsCrcErrors(ni, AQH_RecvStatsMsg_GetCrcErrors(msg)); - AQH_NodeInfo_SetStatsIoErrors(ni, AQH_RecvStatsMsg_GetIoErrors(msg)); - AQH_NodeDb_SetModified(aqh->nodeDb); - _updateTimestampLastChange(ni); -} - - - -void _handleMsgDevice(AQHOMED *aqh, const GWEN_MSG *msg) -{ - AQH_NODE_INFO *ni; - uint32_t uid; - - uid=AQH_DeviceMsg_GetUid(msg); - ni=_getOrCreateNodeAndUpdateUidAddr(aqh, 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_GetModuleMask(msg)); - _updateTimestampLastChange(ni); - AQH_NodeDb_SetModified(aqh->nodeDb); - } - else { - DBG_INFO(AQH_LOGDOMAIN, "Error handling message"); - } -} - - - -void _handleMsgFlashReady(AQHOMED *aqh, const GWEN_MSG *msg) -{ - AQH_NODE_INFO *ni; - uint32_t uid; - - uid=AQH_FlashReadyMsg_GetUid(msg); - ni=_getOrCreateNodeAndUpdateUidAddr(aqh, msg, uid); - if (ni) { - AQH_NodeInfo_SetFirmwareType(ni, AQH_FlashReadyMsg_GetFirmwareType(msg)); - AQH_NodeInfo_SetFirmwareVersion(ni, AQH_FlashReadyMsg_GetFirmwareVersion(msg)); - _updateTimestampLastChange(ni); - AQH_NodeDb_SetModified(aqh->nodeDb); - } - else { - DBG_INFO(AQH_LOGDOMAIN, "Error handling message"); - } -} - - - -AQH_NODE_INFO *_getOrCreateNodeAndUpdateUidAddr(AQHOMED *aqh, const GWEN_MSG *msg, uint32_t uid) -{ - uint8_t busAddr; - AQH_NODE_INFO *ni; - - busAddr=AQH_NodeMsg_GetSourceAddress(msg); - ni=AQH_NodeDb_GetNodeInfoByUid(aqh->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); - _updateTimestampLastChange(ni); - AQH_NodeDb_SetModified(aqh->nodeDb); - } - } - else { - int rv; - - ni=AQH_NodeInfo_new(); - AQH_NodeInfo_SetBusAddress(ni, busAddr); - AQH_NodeInfo_SetUid(ni, uid); - _updateTimestampLastChange(ni); - rv=AQH_NodeDb_AddNodeInfo(aqh->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; -} - - - -void _updateTimestampLastChange(AQH_NODE_INFO *ni) -{ - GWEN_TIMESTAMP *t; - - t=GWEN_Timestamp_NowInLocalTime(); - AQH_NodeInfo_SetTimestampLastChange(ni, t); - GWEN_Timestamp_free(t); -} - - - diff --git a/apps/aqhomed/db.h b/apps/aqhomed/db.h deleted file mode 100644 index cdd5f01..0000000 --- a/apps/aqhomed/db.h +++ /dev/null @@ -1,23 +0,0 @@ -/**************************************************************************** - * 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 AQHOMED_DB_H -#define AQHOMED_DB_H - - -#include "./aqhomed.h" - - - -void AqHomed_NodeMsgToDb(AQHOMED *aqh, const GWEN_MSG *msg); - - - -#endif - - diff --git a/apps/aqhomed/fini.c b/apps/aqhomed/fini.c deleted file mode 100644 index b69cfd0..0000000 --- a/apps/aqhomed/fini.c +++ /dev/null @@ -1,86 +0,0 @@ -/**************************************************************************** - * 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 "./fini.h" -#include "./aqhomed_p.h" - -#include -#include -#include -#include - - -#include - - - -/* ------------------------------------------------------------------------------------------------ - * defines - * ------------------------------------------------------------------------------------------------ - */ - -#define I18N(msg) msg -#define I18S(msg) msg - - - -/* ------------------------------------------------------------------------------------------------ - * forward declarations - * ------------------------------------------------------------------------------------------------ - */ - -static void _disconnectTree(GWEN_MSG_ENDPOINT *ep); - - - -/* ------------------------------------------------------------------------------------------------ - * implementations - * ------------------------------------------------------------------------------------------------ - */ - -void AqHomed_Fini(AQHOMED *aqh) -{ - if (aqh) { - if (aqh->rootEndpoint) { - _disconnectTree(aqh->rootEndpoint); - GWEN_MsgEndpoint_Disconnect(aqh->rootEndpoint); - } - GWEN_MsgEndpoint_free(aqh->rootEndpoint); - aqh->rootEndpoint=NULL; - aqh->ttyEndpoint=NULL; - aqh->ipcdEndpoint=NULL; - aqh->mqttEndpoint=NULL; - - if (aqh->pidFile) - remove(aqh->pidFile); - } -} - - - -void _disconnectTree(GWEN_MSG_ENDPOINT *ep) -{ - GWEN_MSG_ENDPOINT *epChild; - - epChild=GWEN_MsgEndpoint_Tree2_GetFirstChild(ep); - while(epChild) { - _disconnectTree(epChild); - epChild=GWEN_MsgEndpoint_Tree2_GetNext(epChild); - } /* while */ - - GWEN_MsgEndpoint_Disconnect(ep); -} - - - - diff --git a/apps/aqhomed/fini.h b/apps/aqhomed/fini.h deleted file mode 100644 index 4e41d91..0000000 --- a/apps/aqhomed/fini.h +++ /dev/null @@ -1,23 +0,0 @@ -/**************************************************************************** - * 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 AQHOMED_FINI_H -#define AQHOMED_FINI_H - - -#include "./aqhomed.h" - - - -void AqHomed_Fini(AQHOMED *aqh); - - - -#endif - - diff --git a/apps/aqhomed/init.c b/apps/aqhomed/init.c deleted file mode 100644 index 8ad814b..0000000 --- a/apps/aqhomed/init.c +++ /dev/null @@ -1,519 +0,0 @@ -/**************************************************************************** - * 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 "./init.h" -#include "./aqhomed_p.h" -#include "./tty_log.h" -#include "./tty_write.h" - -#include "aqhome/msg/endpoint_tty.h" -#include "aqhome/ipc/endpoint_ipc.h" -#include "aqhome/mqtt/endpoint_mqttc.h" - -#include -#include -#include -#include - -#ifdef HAVE_SYS_TYPES_H -# include -#endif - -#ifdef HAVE_SYS_STAT_H -# include -#endif - -#include -#include -#include -#include -#include -#include - - - -/* ------------------------------------------------------------------------------------------------ - * defines - * ------------------------------------------------------------------------------------------------ - */ - -#define I18N(msg) msg -#define I18S(msg) msg - - - -/* ------------------------------------------------------------------------------------------------ - * forward declarations - * ------------------------------------------------------------------------------------------------ - */ - -static int _setupTty(AQHOMED *aqh, GWEN_DB_NODE *dbArgs); -static void _setupIpc(AQHOMED *aqh, GWEN_DB_NODE *dbArgs); -static GWEN_MSG_ENDPOINT *_acceptIpcFn(GWEN_MSG_ENDPOINT *ep, GWEN_SOCKET *sk, const GWEN_INETADDRESS *addr, void *data); -static void _setupMqtt(AQHOMED *aqh, GWEN_DB_NODE *dbArgs); -static void _setupLog(AQHOMED *aqh, GWEN_DB_NODE *dbArgs); -static void _setupWriter(AQHOMED *aqh, GWEN_DB_NODE *dbArgs); -static void _setupDb(AQHOMED *aqh, GWEN_DB_NODE *dbArgs); - -static int _readArgs(int argc, char **argv, GWEN_DB_NODE *dbArgs); -static int _createPidFile(const char *pidFilename); - - - -/* ------------------------------------------------------------------------------------------------ - * implementations - * ------------------------------------------------------------------------------------------------ - */ - -int AqHomed_Init(AQHOMED *aqh, int argc, char **argv) -{ - GWEN_DB_NODE *dbArgs; - int rv; - const char *s; - - dbArgs=GWEN_DB_Group_new("args"); - rv=_readArgs(argc, argv, dbArgs); - if (rv<0) { - DBG_ERROR(NULL, "Error reading args (%d)", rv); - return rv; - } - aqh->dbArgs=dbArgs; - - s=GWEN_DB_GetCharValue(dbArgs, "pidfile", 0, AQHOMED_DEFAULT_PIDFILE); - if (s && *s) { - AqHomed_SetPidFile(aqh, s); - rv=_createPidFile(s); - if (rv<0) { - DBG_ERROR(NULL, "Error creating PID file (%d)", rv); - return rv; - } - } - - aqh->nodeAddress=GWEN_DB_GetIntValue(dbArgs, "nodeAddress", 0, AQHOMED_DEFAULT_NODEADDR); - - _setupDb(aqh, dbArgs); - - rv=_setupTty(aqh, dbArgs); - if (rv<0) { - DBG_ERROR(NULL, "Error setting up TTY endpoint (%d)", rv); - return rv; - } - - _setupIpc(aqh, dbArgs); - _setupMqtt(aqh, dbArgs); - _setupLog(aqh, dbArgs); - _setupWriter(aqh, dbArgs); - - return 0; -} - - - -int _setupTty(AQHOMED *aqh, GWEN_DB_NODE *dbArgs) -{ - const char *devicePath; - - devicePath=GWEN_DB_GetCharValue(dbArgs, "device", 0, AQHOMED_DEFAULT_DEVICE); - if (devicePath && *devicePath) { - GWEN_MSG_ENDPOINT *epTty; - - epTty=AQH_TtyEndpoint_new(devicePath, AQHOME_ENDPOINTGROUP_NODE); - if (epTty==NULL) { - DBG_ERROR(NULL, "Error creating endpoint TTY"); - return GWEN_ERROR_GENERIC; - } - GWEN_MsgEndpoint_Tree2_AddChild(aqh->rootEndpoint, epTty); - aqh->ttyEndpoint=epTty; - } - else { - DBG_ERROR(NULL, "Missing device path"); - return GWEN_ERROR_GENERIC; - } - - return 0; -} - - - -void _setupIpc(AQHOMED *aqh, GWEN_DB_NODE *dbArgs) -{ - const char *tcpAddress; - int tcpPort; - - tcpAddress=GWEN_DB_GetCharValue(dbArgs, "tcpAddress", 0, NULL); - tcpPort=GWEN_DB_GetIntValue(dbArgs, "tcpPort", 0, AQHOMED_DEFAULT_IPC_PORT); - - if (tcpAddress && *tcpAddress && tcpPort) { - GWEN_MSG_ENDPOINT *ep; - - ep=GWEN_TcpdEndpoint_new(tcpAddress, tcpPort, NULL, AQHOME_ENDPOINTGROUP_IPC); - GWEN_TcpdEndpoint_SetAcceptFn(ep, _acceptIpcFn, aqh); - - GWEN_MsgEndpoint_Tree2_AddChild(aqh->rootEndpoint, ep); - aqh->ipcdEndpoint=ep; - } -} - - - -void _setupMqtt(AQHOMED *aqh, GWEN_DB_NODE *dbArgs) -{ - const char *mqttAddress; - int mqttPort; - const char *mqttClientId; - const char *mqttTopicPrefix; - int mqttKeepAlive; - - mqttAddress=GWEN_DB_GetCharValue(dbArgs, "mqttAddress", 0, NULL); - mqttPort=GWEN_DB_GetIntValue(dbArgs, "mqttPort", 0, AQHOMED_DEFAULT_MQTT_PORT); - mqttClientId=GWEN_DB_GetCharValue(dbArgs, "mqttClientId", 0, AQHOMED_DEFAULT_MQTT_CLIENTID); - mqttTopicPrefix=GWEN_DB_GetCharValue(dbArgs, "mqttTopicPrefix", 0, AQHOMED_DEFAULT_MQTT_TOPIC_PREFIX); - mqttKeepAlive=GWEN_DB_GetIntValue(dbArgs, "mqttKeepAlive", 0, AQHOMED_DEFAULT_MQTT_KEEPALIVE); - - if (mqttAddress && *mqttAddress && mqttPort) { - GWEN_MSG_ENDPOINT *ep; - int rv; - - ep=AQH_MqttClientEndpoint_new(mqttClientId, mqttAddress, mqttPort, NULL, AQHOME_ENDPOINTGROUP_MQTT); - AqHomed_SetMqttTopicPrefix(aqh, mqttTopicPrefix); - AQH_MqttClientEndpoint_SetKeepAliveTime(ep, mqttKeepAlive); - - GWEN_MsgEndpoint_Tree2_AddChild(aqh->rootEndpoint, ep); - aqh->mqttEndpoint=ep; - - rv=AQH_MqttClientEndpoint_StartConnect(ep); - if (rv<0 && rv!=GWEN_ERROR_IN_PROGRESS) { - DBG_ERROR(NULL, "Error connecting to MQTT server %s:%d (%d), will retry later", mqttAddress, mqttPort, rv); - } - } -} - - - -GWEN_MSG_ENDPOINT *_acceptIpcFn(GWEN_MSG_ENDPOINT *ep, - GWEN_SOCKET *sk, - const GWEN_INETADDRESS *addr, - GWEN_UNUSED void *data) -{ -/* AQHOMED *aqh; - * - * aqh=(AQHOMED*) data; - */ - DBG_INFO(NULL, "Incoming IPC connection"); - return AQH_IpcEndpoint_CreateIpcTcpServiceForSocket(sk, NULL, AQHOME_ENDPOINTGROUP_IPC); -} - - - -void _setupLog(AQHOMED *aqh, GWEN_DB_NODE *dbArgs) -{ - const char *logFile; - - logFile=GWEN_DB_GetCharValue(dbArgs, "logfile", 0, NULL); - if (logFile && *logFile) - AqHomed_SetLogFile(aqh, logFile); -} - - - -void _setupWriter(AQHOMED *aqh, GWEN_DB_NODE *dbArgs) -{ - const char *writeToFolder; - - writeToFolder=GWEN_DB_GetCharValue(dbArgs, "writeToFolder", 0, NULL); - if (writeToFolder && *writeToFolder) - AqHomed_SetWriteFolder(aqh, writeToFolder); -} - - - -void _setupDb(AQHOMED *aqh, GWEN_DB_NODE *dbArgs) -{ - const char *s; - - s=GWEN_DB_GetCharValue(dbArgs, "dbfile", 0, NULL); - if (s && *s) { - GWEN_DB_NODE *dbNodeDb; - int rv; - - AqHomed_SetDbFile(aqh, s); - - dbNodeDb=GWEN_DB_Group_new("dbNodes"); - rv=GWEN_DB_ReadFile(dbNodeDb, s, GWEN_DB_FLAGS_DEFAULT); - if (rv==0) { - AQH_NodeDb_fromDb(aqh->nodeDb, dbNodeDb); - } - GWEN_DB_Group_free(dbNodeDb); - } -} - - - -int _createPidFile(const char *pidFilename) -{ - FILE *f; - int pidfd; - - if (remove(pidFilename)==0) { - DBG_ERROR(0, "Old PID file existed, removed. (Unclean shutdown?)"); - } - -#ifdef HAVE_SYS_STAT_H - pidfd = open(pidFilename, O_EXCL|O_CREAT|O_WRONLY, S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH); - if (pidfd < 0) { - DBG_ERROR(NULL, "Could not create PID file \"%s\" (%s), aborting.", pidFilename, strerror(errno)); - return GWEN_ERROR_IO; - } - - f = fdopen(pidfd, "w"); -#else /* HAVE_STAT_H */ - f=fopen(pidFilename,"w+"); -#endif /* HAVE_STAT_H */ - - /* write pid */ -#ifdef HAVE_GETPID - fprintf(f,"%d\n",getpid()); -#else - fprintf(f,"-1\n"); -#endif - if (fclose(f)) { - DBG_ERROR(0, "Could not close PID file \"%s\" (%s), aborting.", pidFilename, strerror(errno)); - return GWEN_ERROR_IO; - } - return 0; -} - - - -int _readArgs(int argc, char **argv, GWEN_DB_NODE *dbArgs) -{ - int rv; - const GWEN_ARGS args[]= { - { - GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ - GWEN_ArgsType_Char, /* type */ - "cfgdir", /* name */ - 0, /* minnum */ - 1, /* maxnum */ - "D", /* short option */ - "cfgdir", /* long option */ - I18S("Specify the configuration folder"), - I18S("Specify the configuration folder") - }, - { - GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ - GWEN_ArgsType_Char, /* type */ - "charset", /* name */ - 0, /* minnum */ - 1, /* maxnum */ - 0, /* short option */ - "charset", /* long option */ - I18S("Specify the output character set"), /* short description */ - I18S("Specify the output character set") /* long description */ - }, - { - GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ - GWEN_ArgsType_Char, /* type */ - "device", /* name */ - 0, /* minnum */ - 1, /* maxnum */ - "d", /* short option */ - "device", /* long option */ - I18S("Specify the device to communicate with (e.g. /dev/ttyUSB0)"), - I18S("Specify the device to communicate with (e.g. /dev/ttyUSB0)") - }, - { - GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ - GWEN_ArgsType_Int, /* type */ - "nodeAddress", /* name */ - 0, /* minnum */ - 1, /* maxnum */ - "n", /* short option */ - "node", /* long option */ - I18S("Specify the node address for the AqHome node adaptor (default 240)"), - I18S("Specify the node address for the AqHome node adaptor (default 240)") - }, - { - GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ - GWEN_ArgsType_Char, /* type */ - "logFile", /* name */ - 0, /* minnum */ - 1, /* maxnum */ - "l", /* short option */ - "logfile", /* long option */ - I18S("Specify a logfile to log received messages to"), - I18S("Specify a logfile to log received messages to") - }, - { - GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ - GWEN_ArgsType_Char, /* type */ - "tcpAddress", /* name */ - 0, /* minnum */ - 1, /* maxnum */ - "t", /* short option */ - "tcpaddress", /* long option */ - I18S("Specify the TCP address to listen on (disabled if missing)"), - I18S("Specify the TCP address to listen on (disabled if missing)") - }, - { - GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ - GWEN_ArgsType_Int, /* type */ - "tcpPort", /* name */ - 0, /* minnum */ - 1, /* maxnum */ - "P", /* short option */ - "tcpport", /* long option */ - I18S("Specify the TCP port to listen on"), - I18S("Specify the TCP port to listen on") - }, - { - GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ - GWEN_ArgsType_Char, /* type */ - "mqttAddress", /* name */ - 0, /* minnum */ - 1, /* maxnum */ - "ma", /* short option */ - "mqttaddress", /* long option */ - I18S("Specify the address of the MQTT server to connect to (disabled if missing)"), - I18S("Specify the address of the MQTT server to connect to (disabled if missing)") - }, - { - GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ - GWEN_ArgsType_Int, /* type */ - "mqttPort", /* name */ - 0, /* minnum */ - 1, /* maxnum */ - "mp", /* short option */ - "mqttport", /* long option */ - I18S("Specify the port of the MQTT server (default: 1883)"), - I18S("Specify the port of the MQTT server (default: 1883)") - }, - { - GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ - GWEN_ArgsType_Char, /* type */ - "mqttClientId", /* name */ - 0, /* minnum */ - 1, /* maxnum */ - NULL, /* short option */ - "mqttclientid", /* long option */ - I18S("Specify client id for the MQTT server (default: \"aqhomed\")"), - I18S("Specify client id for the MQTT server (default: \"aqhomed\")") - }, - { - GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ - GWEN_ArgsType_Char, /* type */ - "mqttTopicPrefix", /* name */ - 0, /* minnum */ - 1, /* maxnum */ - "mt", /* short option */ - "mqtttopicprefix", /* long option */ - I18S("Specify prefix of MQTT topics when publishing (defaults to \"aqhome/sensors\")"), - I18S("Specify prefix of MQTT topics when publishing (defaults to \"aqhome/sensors\")") - }, - { - GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ - GWEN_ArgsType_Int, /* type */ - "mqttKeepAlive", /* name */ - 0, /* minnum */ - 1, /* maxnum */ - "mk", /* short option */ - "mqttkeepalive", /* long option */ - I18S("Specify keepalive time in seconds (defaults: 600)"), - I18S("Specify keepalive time in seconds (defaults: 600)") - }, - { - GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ - GWEN_ArgsType_Char, /* type */ - "dbfile", /* name */ - 0, /* minnum */ - 1, /* maxnum */ - "db", /* short option */ - "dbfile", /* long option */ - I18S("Specify DB file to read/write node database"), - I18S("Specify DB file to read/write node database") - }, - { - GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ - GWEN_ArgsType_Char, /* type */ - "writeToFolder", /* name */ - 0, /* minnum */ - 1, /* maxnum */ - "W", /* short option */ - NULL, /* long option */ - I18S("Specify folder to write received values to"), - I18S("Specify folder to write received values to") - }, - { - GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ - GWEN_ArgsType_Char, /* type */ - "pidfile", /* name */ - 0, /* minnum */ - 1, /* maxnum */ - "p", /* short option */ - "pidfile", /* long option */ - I18S("Specify the PID file"), - I18S("Specify the PID file") - }, - { - GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */ - GWEN_ArgsType_Int, /* type */ - "timeout", /* name */ - 0, /* minnum */ - 1, /* maxnum */ - "T", /* short option */ - "timeout", /* long option */ - I18S("Specify timeout in second (default: no timeout)"), - I18S("Specify timeout in second (default: no timeout)") - }, - { - GWEN_ARGS_FLAGS_HELP | GWEN_ARGS_FLAGS_LAST, /* flags */ - GWEN_ArgsType_Int, /* type */ - "help", /* name */ - 0, /* minnum */ - 0, /* maxnum */ - "h", /* short option */ - "help", - I18S("Show this help screen."), - I18S("Show this help screen.") - } - }; - - rv=GWEN_Args_Check(argc, argv, 1, 0, args, dbArgs); - if (rv==GWEN_ARGS_RESULT_ERROR) { - fprintf(stderr, "ERROR: Could not parse arguments main\n"); - return GWEN_ERROR_INVALID; - } - else if (rv==GWEN_ARGS_RESULT_HELP) { - GWEN_BUFFER *ubuf; - - ubuf=GWEN_Buffer_new(0, 1024, 0, 1); - GWEN_Buffer_AppendArgs(ubuf, - I18N("This is version %s.\nUsage: %s [OPTIONS]\n\nOptions:\n"), - AQHOME_VERSION_STRING, - argv[0]); - if (GWEN_Args_Usage(args, ubuf, GWEN_ArgsOutType_Txt)) { - fprintf(stderr, "ERROR: Could not create help string\n"); - return 1; - } - GWEN_Buffer_AppendString(ubuf, "\n"); - - fprintf(stdout, "%s\n", GWEN_Buffer_GetStart(ubuf)); - GWEN_Buffer_free(ubuf); - return GWEN_ERROR_CLOSE; - } - return 0; -} - - - - diff --git a/apps/aqhomed/init.h b/apps/aqhomed/init.h deleted file mode 100644 index 8935383..0000000 --- a/apps/aqhomed/init.h +++ /dev/null @@ -1,23 +0,0 @@ -/**************************************************************************** - * 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 AQHOMED_INIT_H -#define AQHOMED_INIT_H - - -#include "./aqhomed.h" - - - -int AqHomed_Init(AQHOMED *aqh, int argc, char **argv); - - - -#endif - - diff --git a/apps/aqhomed/ipc.h b/apps/aqhomed/ipc.h deleted file mode 100644 index 091934b..0000000 --- a/apps/aqhomed/ipc.h +++ /dev/null @@ -1,23 +0,0 @@ -/**************************************************************************** - * 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 AQHOMED_LOOP_IPC_H -#define AQHOMED_LOOP_IPC_H - - -#include "./aqhomed.h" - - - -void AqHomed_ForwardTtyMsgToIpcClients(AQHOMED *aqh, const GWEN_MSG *msg); - - - -#endif - - diff --git a/apps/aqhomed/loop.c b/apps/aqhomed/loop.c deleted file mode 100644 index fbe9e00..0000000 --- a/apps/aqhomed/loop.c +++ /dev/null @@ -1,81 +0,0 @@ -/**************************************************************************** - * 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 "./loop.h" -#include "./loop_tty.h" -#include "./loop_ipc.h" -#include "./aqhomed_p.h" -#include "./tty_log.h" -#include "./tty_write.h" -#include "./db.h" - -#include "aqhome/msg/endpoint_tty.h" -#include "aqhome/msg/msg_node.h" -#include "aqhome/msg/msg_value2.h" -#include "aqhome/ipc/endpoint_ipc.h" -#include "aqhome/ipc/nodes/msg_ipc_forward.h" -#include "aqhome/ipc/nodes/msg_ipc_value.h" -#include "aqhome/mqtt/endpoint_mqttc.h" - -#include -#include -#include -#include - - - -/* ------------------------------------------------------------------------------------------------ - * defines - * ------------------------------------------------------------------------------------------------ - */ - -#define I18N(msg) msg -#define I18S(msg) msg - - - -/* ------------------------------------------------------------------------------------------------ - * forward declarations - * ------------------------------------------------------------------------------------------------ - */ - - - - -/* ------------------------------------------------------------------------------------------------ - * implementations - * ------------------------------------------------------------------------------------------------ - */ - -void AqHomed_Loop(AQHOMED *aqh, int timeoutInMsecs) -{ - if (aqh) { - GWEN_MsgEndpoint_ChildrenIoLoop(aqh->rootEndpoint, timeoutInMsecs); - AqHomed_ReadAndHandleTtyMessages(aqh); - AqHomed_ReadAndHandleIpcMessages(aqh); - - if (AQH_NodeDb_IsModified(aqh->nodeDb)) { - if (aqh->dbFile) { - GWEN_DB_NODE *dbNodeDb; - - dbNodeDb=GWEN_DB_Group_new("nodeDb"); - AQH_NodeDb_toDb(aqh->nodeDb, dbNodeDb); - GWEN_DB_WriteFile(dbNodeDb, aqh->dbFile, GWEN_DB_FLAGS_DEFAULT); - GWEN_DB_Group_free(dbNodeDb); - } - } - } -} - - - diff --git a/apps/aqhomed/loop.h b/apps/aqhomed/loop.h deleted file mode 100644 index c715173..0000000 --- a/apps/aqhomed/loop.h +++ /dev/null @@ -1,23 +0,0 @@ -/**************************************************************************** - * 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 AQHOMED_LOOP_H -#define AQHOMED_LOOP_H - - -#include "./aqhomed.h" - - - -void AqHomed_Loop(AQHOMED *aqh, int timeoutInMsecs); - - - -#endif - - diff --git a/apps/aqhomed/loop_ipc.c b/apps/aqhomed/loop_ipc.c deleted file mode 100644 index 2e049d3..0000000 --- a/apps/aqhomed/loop_ipc.c +++ /dev/null @@ -1,188 +0,0 @@ -/**************************************************************************** - * 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 "./loop_ipc.h" -#include "./aqhomed_p.h" -#include "./tty_log.h" -#include "./tty_write.h" -#include "./db.h" - -#include "aqhome/msg/endpoint_tty.h" -#include "aqhome/msg/msg_node.h" -#include "aqhome/msg/msg_value2.h" -#include "aqhome/msg/msg_ping.h" -#include "aqhome/ipc/endpoint_ipc.h" -#include "aqhome/ipc/nodes/ipc_nodes.h" -#include "aqhome/ipc/nodes/msg_ipc_forward.h" -#include "aqhome/ipc/nodes/msg_ipc_value.h" -#include "aqhome/ipc/nodes/msg_ipc_ping.h" -#include "aqhome/ipc/nodes/msg_ipc_setaccmsggrps.h" -#include "aqhome/ipc/nodes/msg_ipc_getdevices_rsp.h" -#include "aqhome/ipc/msg_ipc_result.h" - -#include -#include -#include -#include - - - -/* ------------------------------------------------------------------------------------------------ - * defines - * ------------------------------------------------------------------------------------------------ - */ - -#define I18N(msg) msg -#define I18S(msg) msg - - - -/* ------------------------------------------------------------------------------------------------ - * forward declarations - * ------------------------------------------------------------------------------------------------ - */ - -static void _handleIpcEndpoint(AQHOMED *aqh, GWEN_MSG_ENDPOINT *ep); -static void _handleIpcMsg(AQHOMED *aqh, GWEN_MSG_ENDPOINT *ep, const GWEN_MSG *msg); -void _handleIpcMsgPing(AQHOMED *aqh, GWEN_MSG_ENDPOINT *ep, const GWEN_MSG *msg); -void _handleIpcMsgSetAccMsgGrps(AQHOMED *aqh, GWEN_MSG_ENDPOINT *ep, const GWEN_MSG *msg); -void _handleIpcMsgForward(AQHOMED *aqh, GWEN_MSG_ENDPOINT *ep, const GWEN_MSG *msg); -void _handleIpcMsgGetDevicesReq(AQHOMED *aqh, GWEN_MSG_ENDPOINT *ep, const GWEN_MSG *msg); - - - -/* ------------------------------------------------------------------------------------------------ - * implementations - * ------------------------------------------------------------------------------------------------ - */ - - -void AqHomed_ReadAndHandleIpcMessages(AQHOMED *aqh) -{ - if (aqh->ipcdEndpoint) { - GWEN_MSG_ENDPOINT *ep; - - ep=GWEN_MsgEndpoint_Tree2_GetFirstChild(aqh->ipcdEndpoint); - while(ep) { - _handleIpcEndpoint(aqh, ep); - ep=GWEN_MsgEndpoint_Tree2_GetNext(ep); - } - } -} - - - -void _handleIpcEndpoint(AQHOMED *aqh, GWEN_MSG_ENDPOINT *ep) -{ - GWEN_MSG *msg; - - while( (msg=GWEN_MsgEndpoint_TakeFirstReceivedMessage(ep)) ) { - _handleIpcMsg(aqh, ep, msg); - GWEN_Msg_free(msg); - } -} - - - -void _handleIpcMsg(AQHOMED *aqh, GWEN_MSG_ENDPOINT *ep, const GWEN_MSG *msg) -{ - uint16_t code; - - /* exec IPC message */ - code=GWEN_IpcMsg_GetCode(msg); - DBG_ERROR(AQH_LOGDOMAIN, "Received IPC packet"); - switch(code) { - case AQH_MSGTYPE_IPC_NODES_PING: _handleIpcMsgPing(aqh, ep, msg); break; - case AQH_MSGTYPE_IPC_NODES_SETACCMSGGRPS: _handleIpcMsgSetAccMsgGrps(aqh, ep, msg); break; - case AQH_MSGTYPE_IPC_NODES_FORWARD: _handleIpcMsgForward(aqh, ep, msg); break; - case AQH_MSGTYPE_IPC_NODES_GETDEVICES_REQ: _handleIpcMsgGetDevicesReq(aqh, ep, msg); break; - default: break; - } -} - - - -void _handleIpcMsgPing(AQHOMED *aqh, GWEN_MSG_ENDPOINT *ep, const GWEN_MSG *msg) -{ - if (aqh->ttyEndpoint && GWEN_MsgEndpoint_GetState(aqh->ttyEndpoint)==GWEN_MSG_ENDPOINT_STATE_CONNECTED) { - GWEN_MSG *msgOut; - - DBG_ERROR(AQH_LOGDOMAIN, "Received IPC PING message"); - msgOut=AQH_PingMsg_new(aqh->nodeAddress, AQH_PingIpcMsg_GetDestAddr(msg), AQH_MSG_TYPE_PING); - GWEN_MsgEndpoint_AddSendMessage(aqh->ttyEndpoint, msgOut); - } -} - - - -void _handleIpcMsgSetAccMsgGrps(AQHOMED *aqh, GWEN_MSG_ENDPOINT *ep, const GWEN_MSG *msg) -{ - uint32_t groups; - - DBG_ERROR(AQH_LOGDOMAIN, "Received IPC SET_ACCEPTED_MSG_GROUPS message"); - groups=AQH_SetAcceptedMsgGroupsIpcMsg_GetMsgGroups(msg); - AQH_IpcEndpoint_SetAcceptedMsgGroups(ep, groups); - // TODO: send response? -} - - - -void _handleIpcMsgForward(AQHOMED *aqh, GWEN_MSG_ENDPOINT *ep, const GWEN_MSG *msg) -{ - if (aqh->ttyEndpoint && GWEN_MsgEndpoint_GetState(aqh->ttyEndpoint)==GWEN_MSG_ENDPOINT_STATE_CONNECTED) { - GWEN_MSG *msgOut; - - DBG_ERROR(AQH_LOGDOMAIN, "Received IPC FORWARD message"); - msgOut=AQH_ForwardIpcMsg_GetCopyOfNodeMsg(msg); - if (msgOut) - GWEN_MsgEndpoint_AddSendMessage(aqh->ttyEndpoint, msgOut); - } -} - - - -void _handleIpcMsgGetDevicesReq(AQHOMED *aqh, GWEN_MSG_ENDPOINT *ep, const GWEN_MSG *msg) -{ - AQH_NODE_INFO_LIST *nodeInfoList; - - DBG_ERROR(AQH_LOGDOMAIN, "Received IPC GetDevicesRequest message"); - nodeInfoList=AQH_NodeDb_GetAllNodeInfos(aqh->nodeDb); - if (nodeInfoList && AQH_NodeInfo_List_GetCount(nodeInfoList)) { - const AQH_NODE_INFO *ni; - - ni=AQH_NodeInfo_List_First(nodeInfoList); - while(ni) { - const AQH_NODE_INFO *niNext; - GWEN_MSG *msgOut; - - niNext=AQH_NodeInfo_List_Next(ni); - DBG_INFO(AQH_LOGDOMAIN, "Sending response for node %02x (%08x)", AQH_NodeInfo_GetBusAddress(ni), AQH_NodeInfo_GetUid(ni)); - msgOut=AQH_GetDevicesResponseIpcMsg_new(AQH_MSGTYPE_IPC_NODES_GETDEVICES_RSP, niNext?0:AQH_MSGIPC_GETDEVICES_RSP_FLAGS_LAST, ni); - GWEN_MsgEndpoint_AddSendMessage(ep, msgOut); - ni=niNext; - } - } - else { - GWEN_MSG *msgOut; - - DBG_INFO(AQH_LOGDOMAIN, "No nodes"); - msgOut=AQH_ResultIpcMsg_new(AQH_MSGTYPE_IPC_NODES_RESULT, AQH_MSG_IPC_ERROR_NODATA); - GWEN_MsgEndpoint_AddSendMessage(ep, msgOut); - } -} - - - - - - diff --git a/apps/aqhomed/loop_ipc.h b/apps/aqhomed/loop_ipc.h deleted file mode 100644 index fab747e..0000000 --- a/apps/aqhomed/loop_ipc.h +++ /dev/null @@ -1,23 +0,0 @@ -/**************************************************************************** - * 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 AQHOMED_LOOP_IPC_H -#define AQHOMED_LOOP_IPC_H - - -#include "./aqhomed.h" - - - -void AqHomed_ReadAndHandleIpcMessages(AQHOMED *aqh); - - - -#endif - - diff --git a/apps/aqhomed/loop_tty.c b/apps/aqhomed/loop_tty.c deleted file mode 100644 index e5bebcb..0000000 --- a/apps/aqhomed/loop_tty.c +++ /dev/null @@ -1,89 +0,0 @@ -/**************************************************************************** - * 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 "./loop_tty.h" -#include "./loop_tty_ipc.h" -#include "./loop_tty_mqtt.h" -#include "./aqhomed_p.h" -#include "./tty_log.h" -#include "./tty_write.h" -#include "./db.h" - -#include "aqhome/msg/endpoint_tty.h" -#include "aqhome/msg/msg_node.h" -#include "aqhome/msg/msg_value2.h" -#include "aqhome/ipc/endpoint_ipc.h" -#include "aqhome/ipc/nodes/msg_ipc_forward.h" -#include "aqhome/ipc/nodes/msg_ipc_value.h" -#include "aqhome/mqtt/endpoint_mqttc.h" - -#include -#include -#include -#include - - - -/* ------------------------------------------------------------------------------------------------ - * defines - * ------------------------------------------------------------------------------------------------ - */ - -#define I18N(msg) msg -#define I18S(msg) msg - - - -/* ------------------------------------------------------------------------------------------------ - * forward declarations - * ------------------------------------------------------------------------------------------------ - */ - -static void _handleTtyMsg(AQHOMED *aqh, const GWEN_MSG *msg); - - - -/* ------------------------------------------------------------------------------------------------ - * implementations - * ------------------------------------------------------------------------------------------------ - */ - - -void AqHomed_ReadAndHandleTtyMessages(AQHOMED *aqh) -{ - GWEN_MSG *msg; - - while( (msg=GWEN_MsgEndpoint_TakeFirstReceivedMessage(aqh->ttyEndpoint)) ) { - _handleTtyMsg(aqh, msg); - GWEN_Msg_free(msg); - } -} - - - -void _handleTtyMsg(AQHOMED *aqh, const GWEN_MSG *msg) -{ - if (aqh->logFile) - AqHomed_LogTtyMsg(aqh, msg); - if (aqh->writeFolder) - AqHomed_WriteTtyMsg(aqh, msg); - if (aqh->nodeDb) - AqHomed_NodeMsgToDb(aqh, msg); - if (aqh->ipcdEndpoint) - AqHomed_ForwardTtyMsgToIpcClients(aqh, msg); - if (aqh->mqttEndpoint) - AqHomed_ForwardTtyMsgToMqttServer(aqh, msg); -} - - - diff --git a/apps/aqhomed/loop_tty.h b/apps/aqhomed/loop_tty.h deleted file mode 100644 index f5aac57..0000000 --- a/apps/aqhomed/loop_tty.h +++ /dev/null @@ -1,23 +0,0 @@ -/**************************************************************************** - * 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 AQHOMED_LOOP_TTY_H -#define AQHOMED_LOOP_TTY_H - - -#include "./aqhomed.h" - - - -void AqHomed_ReadAndHandleTtyMessages(AQHOMED *aqh); - - - -#endif - - diff --git a/apps/aqhomed/loop_tty_ipc.c b/apps/aqhomed/loop_tty_ipc.c deleted file mode 100644 index 070590b..0000000 --- a/apps/aqhomed/loop_tty_ipc.c +++ /dev/null @@ -1,118 +0,0 @@ -/**************************************************************************** - * 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 "./loop_tty_ipc.h" -#include "./aqhomed_p.h" -#include "./tty_log.h" -#include "./tty_write.h" -#include "./db.h" - -#include "aqhome/msg/endpoint_tty.h" -#include "aqhome/msg/msg_node.h" -#include "aqhome/msg/msg_value2.h" -#include "aqhome/ipc/endpoint_ipc.h" -#include "aqhome/ipc/nodes/msg_ipc_forward.h" -#include "aqhome/ipc/nodes/msg_ipc_value.h" -#include "aqhome/mqtt/endpoint_mqttc.h" - -#include -#include -#include -#include - - - -/* ------------------------------------------------------------------------------------------------ - * defines - * ------------------------------------------------------------------------------------------------ - */ - -#define I18N(msg) msg -#define I18S(msg) msg - - - -/* ------------------------------------------------------------------------------------------------ - * forward declarations - * ------------------------------------------------------------------------------------------------ - */ - -static void _forwardValue2MsgToIpc(GWEN_MSG_ENDPOINT *ep, const GWEN_MSG *nodeMsg); -static void _forwardAnyMsgToIpc(GWEN_MSG_ENDPOINT *ep, const GWEN_MSG *nodeMsg); - - - -/* ------------------------------------------------------------------------------------------------ - * implementations - * ------------------------------------------------------------------------------------------------ - */ - -void AqHomed_ForwardTtyMsgToIpcClients(AQHOMED *aqh, const GWEN_MSG *msg) -{ - uint32_t msgGroup; - - msgGroup=AQH_NodeMsg_GetMsgGroup(AQH_NodeMsg_GetMsgType(msg)); - if (msgGroup) { - GWEN_MSG_ENDPOINT *ep; - - ep=GWEN_MsgEndpoint_Tree2_GetFirstChild(aqh->ipcdEndpoint); - while(ep) { - if (msgGroup & AQH_IpcEndpoint_GetAcceptedMsgGroups(ep)) { - DBG_INFO(NULL, "Endpoint accepts msg group %d", msgGroup); - switch(AQH_NodeMsg_GetMsgType(msg)) { - case AQH_MSG_TYPE_VALUE2: - _forwardValue2MsgToIpc(ep, msg); - break; - default: - _forwardAnyMsgToIpc(ep, msg); - break; - } - - } - ep=GWEN_MsgEndpoint_Tree2_GetNext(ep); - } - } - else { - DBG_ERROR(NULL, "Message type %d not in any message group, ignoring message", AQH_NodeMsg_GetMsgType(msg)); - } -} - - - -void _forwardValue2MsgToIpc(GWEN_MSG_ENDPOINT *ep, const GWEN_MSG *nodeMsg) -{ - GWEN_MSG *ipcMsg; - - ipcMsg=AQH_ValueIpcMsg_new(AQH_MSGTYPE_IPC_NODES_VALUE, - AQH_Value2Msg_GetUid(nodeMsg), - AQH_Value2Msg_GetValueId(nodeMsg), - AQH_Value2Msg_GetValueType(nodeMsg), - AQH_Value2Msg_GetValueNom(nodeMsg), - AQH_Value2Msg_GetValueDenom(nodeMsg)); - GWEN_MsgEndpoint_AddSendMessage(ep, ipcMsg); -} - - - -void _forwardAnyMsgToIpc(GWEN_MSG_ENDPOINT *ep, const GWEN_MSG *nodeMsg) -{ - GWEN_MSG *ipcMsg; - - ipcMsg=AQH_ForwardIpcMsg_new(AQH_MSGTYPE_IPC_NODES_FORWARD, GWEN_Msg_GetConstBuffer(nodeMsg), GWEN_Msg_GetBytesInBuffer(nodeMsg)); - GWEN_MsgEndpoint_AddSendMessage(ep, ipcMsg); -} - - - - - diff --git a/apps/aqhomed/loop_tty_ipc.h b/apps/aqhomed/loop_tty_ipc.h deleted file mode 100644 index 39e4c0e..0000000 --- a/apps/aqhomed/loop_tty_ipc.h +++ /dev/null @@ -1,23 +0,0 @@ -/**************************************************************************** - * 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 AQHOMED_LOOP_TTY_IPC_H -#define AQHOMED_LOOP_TTY_IPC_H - - -#include "./aqhomed.h" - - - -void AqHomed_ForwardTtyMsgToIpcClients(AQHOMED *aqh, const GWEN_MSG *msg); - - - -#endif - - diff --git a/apps/aqhomed/loop_tty_mqtt.c b/apps/aqhomed/loop_tty_mqtt.c deleted file mode 100644 index a3bf995..0000000 --- a/apps/aqhomed/loop_tty_mqtt.c +++ /dev/null @@ -1,215 +0,0 @@ -/**************************************************************************** - * 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 "./loop_tty_mqtt.h" -#include "./aqhomed_p.h" -#include "./tty_log.h" -#include "./tty_write.h" -#include "./db.h" - -#include "aqhome/msg/endpoint_tty.h" -#include "aqhome/msg/msg_node.h" -#include "aqhome/msg/msg_value2.h" -#include "aqhome/msg/msg_sendstats.h" -#include "aqhome/msg/msg_recvstats.h" -#include "aqhome/ipc/endpoint_ipc.h" -#include "aqhome/ipc/nodes/msg_ipc_forward.h" -#include "aqhome/ipc/nodes/msg_ipc_value.h" -#include "aqhome/mqtt/endpoint_mqttc.h" -#include "aqhome/mqtt/msg_mqtt_publish.h" - -#include -#include -#include -#include - - - -/* ------------------------------------------------------------------------------------------------ - * defines - * ------------------------------------------------------------------------------------------------ - */ - -#define I18N(msg) msg -#define I18S(msg) msg - - - -/* ------------------------------------------------------------------------------------------------ - * forward declarations - * ------------------------------------------------------------------------------------------------ - */ - -static void _processValue2Message(AQHOMED *aqh, const GWEN_MSG *nodeMsg); -static void _processSendStatsMessage(AQHOMED *aqh, const GWEN_MSG *nodeMsg); -static void _processRecvStatsMessage(AQHOMED *aqh, const GWEN_MSG *nodeMsg); -static void _publishDouble(AQHOMED *aqh, uint32_t uid, int valueId, const char *valuePath, double v); -static void _publishInt(AQHOMED *aqh, uint32_t uid, int valueId, const char *valuePath, int v); -static void _publishString(AQHOMED *aqh, uint32_t uid, int valueId, const char *valuePath, const char *v); - - - - -/* ------------------------------------------------------------------------------------------------ - * implementations - * ------------------------------------------------------------------------------------------------ - */ - - - -void AqHomed_ForwardTtyMsgToMqttServer(AQHOMED *aqh, const GWEN_MSG *nodeMsg) -{ - if (GWEN_MsgEndpoint_GetState(aqh->mqttEndpoint)==GWEN_MSG_ENDPOINT_STATE_CONNECTED) { - DBG_DEBUG(AQH_LOGDOMAIN, "Processing output message"); - switch(AQH_NodeMsg_GetMsgType(nodeMsg)) { - case AQH_MSG_TYPE_VALUE2: - _processValue2Message(aqh, nodeMsg); - break; - case AQH_MSG_TYPE_COMSENDSTATS: - _processSendStatsMessage(aqh, nodeMsg); - break; - case AQH_MSG_TYPE_COMRECVSTATS: - _processRecvStatsMessage(aqh, nodeMsg); - break; - default: - break; - } - } -} - - - -void _processValue2Message(AQHOMED *aqh, const GWEN_MSG *nodeMsg) -{ - if (AQH_Value2Msg_GetValueType(nodeMsg)==AQH_MSG_VALUE2_TYPE_DOOR) - _publishString(aqh, - AQH_Value2Msg_GetUid(nodeMsg), - AQH_Value2Msg_GetValueId(nodeMsg), - AQH_Value2Msg_GetValueTypeName(nodeMsg), - AQH_Value2Msg_GetValueAsWindowStateString(nodeMsg)); - else - _publishDouble(aqh, - AQH_Value2Msg_GetUid(nodeMsg), - AQH_Value2Msg_GetValueId(nodeMsg), - AQH_Value2Msg_GetValueTypeName(nodeMsg), - AQH_Value2Msg_GetValue(nodeMsg)); -} - - - -void _processSendStatsMessage(AQHOMED *aqh, const GWEN_MSG *nodeMsg) -{ - uint16_t packetsOutInt; - - packetsOutInt=AQH_SendStatsMsg_GetPacketsOut(nodeMsg); - if (packetsOutInt) { - double packetsOut; - double collisions; - double busy; - double collisionsPercentage=0.0; - double busyPercentage=0.0; - - packetsOut=(double) packetsOutInt; - collisions=(double)AQH_SendStatsMsg_GetCollisions(nodeMsg); - busy=(double)AQH_SendStatsMsg_GetBusyErrors(nodeMsg); - - collisionsPercentage=collisions*100.0/packetsOut; - busyPercentage=busy*100.0/packetsOut; - - _publishInt(aqh, AQH_SendStatsMsg_GetUid(nodeMsg), 0, "net/packetsOut", packetsOutInt); - _publishInt(aqh, AQH_SendStatsMsg_GetUid(nodeMsg), 0, "net/collisions", (int) AQH_SendStatsMsg_GetCollisions(nodeMsg)); - _publishDouble(aqh, AQH_SendStatsMsg_GetUid(nodeMsg), 0, "net/collisionsPercent", collisionsPercentage); - _publishDouble(aqh, AQH_SendStatsMsg_GetUid(nodeMsg), 0, "net/busyPercent", busyPercentage); - } -} - - - -void _processRecvStatsMessage(AQHOMED *aqh, const GWEN_MSG *nodeMsg) -{ - uint16_t packetsInInt; - - packetsInInt=AQH_RecvStatsMsg_GetPacketsIn(nodeMsg); - if (packetsInInt) { - double packetsIn; - double crcErrors; - double ioErrors; - double crcErrorsPercentage=0.0; - double ioErrorsPercentage=0.0; - - packetsIn=(double) packetsInInt; - crcErrors=(double)AQH_RecvStatsMsg_GetCrcErrors(nodeMsg); - ioErrors=(double)AQH_RecvStatsMsg_GetIoErrors(nodeMsg); - - crcErrorsPercentage=crcErrors*100.0/packetsIn; - ioErrorsPercentage=ioErrors*100.0/packetsIn; - - _publishInt(aqh, AQH_RecvStatsMsg_GetUid(nodeMsg), 0, "net/packetsIn", packetsInInt); - _publishInt(aqh, AQH_RecvStatsMsg_GetUid(nodeMsg), 0, "net/crcerrors", (int) AQH_RecvStatsMsg_GetCrcErrors(nodeMsg)); - _publishInt(aqh, AQH_RecvStatsMsg_GetUid(nodeMsg), 0, "net/ioerrors", (int) AQH_RecvStatsMsg_GetIoErrors(nodeMsg)); - _publishDouble(aqh, AQH_RecvStatsMsg_GetUid(nodeMsg), 0, "net/crcerrorsPercent", crcErrorsPercentage); - _publishDouble(aqh, AQH_RecvStatsMsg_GetUid(nodeMsg), 0, "net/ioerrorsPercent", ioErrorsPercentage); - } -} - - - -void _publishDouble(AQHOMED *aqh, uint32_t uid, int valueId, const char *valuePath, double v) -{ - char numBuf[16]; - - snprintf(numBuf, sizeof(numBuf)-1, "%f", v); - numBuf[sizeof(numBuf)-1]=0; - _publishString(aqh, uid, valueId, valuePath, numBuf); -} - - - -void _publishInt(AQHOMED *aqh, uint32_t uid, int valueId, const char *valuePath, int v) -{ - char numBuf[16]; - - snprintf(numBuf, sizeof(numBuf)-1, "%d", v); - numBuf[sizeof(numBuf)-1]=0; - _publishString(aqh, uid, valueId, valuePath, numBuf); -} - - - -void _publishString(AQHOMED *aqh, uint32_t uid, int valueId, const char *valuePath, const char *v) -{ - GWEN_BUFFER *bufTopic; - GWEN_MSG *pubMsg; - - bufTopic=GWEN_Buffer_new(0, 64, 0, 1); - if (valueId>0) - GWEN_Buffer_AppendArgs(bufTopic, "%s/%08x/%d/%s", - aqh->mqttTopicPrefix, - uid, - valueId, - valuePath); - else - GWEN_Buffer_AppendArgs(bufTopic, "%s/%08x/%s", - aqh->mqttTopicPrefix, - uid, - valuePath); - - pubMsg=AQH_PublishMqttMsg_new(0, 0, GWEN_Buffer_GetStart(bufTopic), (const uint8_t*) v, strlen(v)); - if (pubMsg) { - DBG_INFO(AQH_LOGDOMAIN, "MQTT PUBLISH %s: %s", GWEN_Buffer_GetStart(bufTopic), v); - GWEN_MsgEndpoint_AddSendMessage(aqh->mqttEndpoint, pubMsg); - } - GWEN_Buffer_free(bufTopic); -} - - diff --git a/apps/aqhomed/loop_tty_mqtt.h b/apps/aqhomed/loop_tty_mqtt.h deleted file mode 100644 index ab62bd2..0000000 --- a/apps/aqhomed/loop_tty_mqtt.h +++ /dev/null @@ -1,23 +0,0 @@ -/**************************************************************************** - * 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 AQHOMED_LOOP_TTY_MQTT_H -#define AQHOMED_LOOP_TTY_MQTT_H - - -#include "./aqhomed.h" - - - -void AqHomed_ForwardTtyMsgToMqttServer(AQHOMED *aqh, const GWEN_MSG *msg); - - - -#endif - - diff --git a/apps/aqhomed/main.c b/apps/aqhomed/main.c deleted file mode 100644 index 87c1050..0000000 --- a/apps/aqhomed/main.c +++ /dev/null @@ -1,191 +0,0 @@ -/**************************************************************************** - * 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 -#include - -#include "./aqhomed.h" -#include "./init.h" -#include "./fini.h" -#include "./loop.h" - -#include -#include -#include -#include - -#ifdef HAVE_SIGNAL_H -# include -#endif - - - -/* ------------------------------------------------------------------------------------------------ - * defines - * ------------------------------------------------------------------------------------------------ - */ - -#define I18N(msg) msg -#define I18S(msg) msg - - - -/* ------------------------------------------------------------------------------------------------ - * forward declarations - * ------------------------------------------------------------------------------------------------ - */ - -#ifdef HAVE_SIGNAL_H -static int _setSignalHandlers(void); -static int _setupSigAction(struct sigaction *sa, int sig); -static void _signalHandler(int s); -#endif - - - -/* ------------------------------------------------------------------------------------------------ - * static vars - * ------------------------------------------------------------------------------------------------ - */ - -#ifdef HAVE_SIGNAL_H -static struct sigaction saINT,saTERM, saHUP, saTSTP, saCONT; -#endif - -static int stopService=0; - - - -/* ------------------------------------------------------------------------------------------------ - * implementations - * ------------------------------------------------------------------------------------------------ - */ - -int main(int argc, char **argv) -{ - int rv; - AQHOMED *aqh; - GWEN_GUI *gui; - - rv=GWEN_Init(); - if (rv) { - fprintf(stderr, "ERROR: Unable to init Gwen.\n"); - return 2; - } - - GWEN_Logger_Open(0, "aqhomed", 0, GWEN_LoggerType_Console, GWEN_LoggerFacility_User); - //GWEN_Logger_SetLevel(0, GWEN_LoggerLevel_Warning); - GWEN_Logger_SetLevel(0, GWEN_LoggerLevel_Info); - - rv=_setSignalHandlers(); - if (rv<0) { - DBG_INFO(NULL, "here (%d)", rv); - return rv; - } - - rv=AQH_Init(); - if (rv<0) { - DBG_INFO(NULL, "here (%d)", rv); - return 2; - } - - gui=GWEN_Gui_CGui_new(); - GWEN_Gui_SetGui(gui); - - aqh=AqHomed_new(); - rv=AqHomed_Init(aqh, argc, argv); - if (rv<0) { - DBG_INFO(NULL, "here (%d)", rv); - return 2; - } - - while(!stopService) { - DBG_DEBUG(NULL, "Next loop"); - AqHomed_Loop(aqh, 2000); - } - - AqHomed_Fini(aqh); - AqHomed_free(aqh); - - GWEN_Gui_SetGui(NULL); - GWEN_Gui_free(gui); - - return 0; -} - - - -int _setSignalHandlers(void) -{ -#ifdef HAVE_SIGNAL_H - int rv; - - rv=_setupSigAction(&saINT, SIGINT); - if (rv) - return rv; - - rv=_setupSigAction(&saTERM, SIGTERM); - if (rv) - return rv; - - rv=_setupSigAction(&saHUP, SIGHUP); - if (rv) - return rv; - -# ifdef SIGTSTP - rv=_setupSigAction(&saTSTP, SIGTSTP); - if (rv) - return rv; -# endif - -# ifdef SIGCONT - rv=_setupSigAction(&saCONT, SIGCONT); - if (rv) - return rv; -# endif -#endif - return 0; -} - - - -int _setupSigAction(struct sigaction *sa, int sig) -{ - sa->sa_handler=_signalHandler; - sigemptyset(&sa->sa_mask); - sa->sa_flags=0; - if (sigaction(sig, sa, 0)) { - DBG_ERROR(NULL, "Could not setup signal handler for signal %d", sig); - return GWEN_ERROR_IO; - } - - return 0; -} - - - -void _signalHandler(int s) -{ - switch(s) { - case SIGINT: - case SIGTERM: - case SIGHUP: - DBG_WARN(0, "Received signal %d, stopping service in next loop.",s); - stopService=1; - break; - default: - DBG_WARN(0, "Unknown signal %d",s); - break; - } -} - - diff --git a/apps/aqhomed/tty_log.c b/apps/aqhomed/tty_log.c deleted file mode 100644 index 0ac05aa..0000000 --- a/apps/aqhomed/tty_log.c +++ /dev/null @@ -1,131 +0,0 @@ -/**************************************************************************** - * 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 "./tty_log.h" -#include "./aqhomed_p.h" - -#include "aqhome/msg/msg_value.h" -#include "aqhome/msg/msg_value2.h" -#include "aqhome/msg/msg_sendstats.h" -#include "aqhome/msg/msg_recvstats.h" -#include "aqhome/msg/msg_memstats.h" -#include "aqhome/msg/msg_sysstats.h" -#include "aqhome/msg/msg_ping.h" -#include "aqhome/msg/msg_pong.h" -#include "aqhome/msg/msg_needaddr.h" -#include "aqhome/msg/msg_claimaddr.h" -#include "aqhome/msg/msg_haveaddr.h" -#include "aqhome/msg/msg_denyaddr.h" -#include "aqhome/msg/msg_device.h" -#include "aqhome/msg/msg_flashready.h" -#include "aqhome/msg/msg_flashstart.h" -#include "aqhome/msg/msg_flashresponse.h" -#include "aqhome/msg/msg_flashend.h" -#include "aqhome/msg/msg_flashdata.h" -#include "aqhome/msg/msg_reboot.h" - -#include -#include -#include -#include -#include - -#include - - - -/* ------------------------------------------------------------------------------------------------ - * forward declarations - * ------------------------------------------------------------------------------------------------ - */ - -static void _writeToLogFile(const char *filename, const char *txt); - - - -/* ------------------------------------------------------------------------------------------------ - * implementations - * ------------------------------------------------------------------------------------------------ - */ - -void AqHomed_LogTtyMsg(AQHOMED *aqh, const GWEN_MSG *msg) -{ - if (aqh && aqh->logFile) { - uint8_t msgType; - int msgIsValid; - GWEN_BUFFER *dbuf; - GWEN_TIME *ti; - - dbuf=GWEN_Buffer_new(0, 256, 0, 1); - ti=GWEN_CurrentTime(); - GWEN_Time_toString(ti, "YYYY-MM-DD hh:mm:ss ", dbuf); - GWEN_Time_free(ti); - ti=NULL; - - msgIsValid=(AQH_NodeMsg_IsChecksumValid(msg) && AQH_NodeMsg_IsMsgComplete(msg)); - msgType=AQH_NodeMsg_GetMsgType(msg); - - if (msgIsValid) { - switch(msgType) { - case AQH_MSG_TYPE_PING: AQH_PingMsg_DumpToBuffer(msg, dbuf, "received"); break; - case AQH_MSG_TYPE_PONG: AQH_PongMsg_DumpToBuffer(msg, dbuf, "received"); break; - case AQH_MSG_TYPE_COMSENDSTATS: AQH_SendStatsMsg_DumpToBuffer(msg, dbuf, "received"); break; - case AQH_MSG_TYPE_COMRECVSTATS: AQH_RecvStatsMsg_DumpToBuffer(msg, dbuf, "received"); break; - case AQH_MSG_TYPE_TWIBUSMEMBER: AQH_NodeMsg_DumpToBuffer(msg, dbuf, "received"); break; - case AQH_MSG_TYPE_DEBUG: AQH_NodeMsg_DumpToBuffer(msg, dbuf, "received"); break; - case AQH_MSG_TYPE_VALUE: AQH_ValueMsg_DumpToBuffer(msg, dbuf, "received"); break; - case AQH_MSG_TYPE_VALUE2: AQH_Value2Msg_DumpToBuffer(msg, dbuf, "received"); break; - case AQH_MSG_TYPE_NEED_ADDRESS: AQH_NeedAddrMsg_DumpToBuffer(msg, dbuf, "received"); break; - case AQH_MSG_TYPE_CLAIM_ADDRESS: AQH_ClaimAddrMsg_DumpToBuffer(msg, dbuf, "received"); break; - case AQH_MSG_TYPE_HAVE_ADDRESS: AQH_HaveAddrMsg_DumpToBuffer(msg, dbuf, "received"); break; - case AQH_MSG_TYPE_DENY_ADDRESS: AQH_DenyAddrMsg_DumpToBuffer(msg, dbuf, "received"); break; - case AQH_MSG_TYPE_DEVICE: AQH_DeviceMsg_DumpToBuffer(msg, dbuf, "received"); break; - case AQH_MSG_TYPE_MEMSTATS: AQH_MemStatsMsg_DumpToBuffer(msg, dbuf, "received"); break; - case AQH_MSG_TYPE_SYSSTATS: AQH_SysStatsMsg_DumpToBuffer(msg, dbuf, "received"); break; - case AQH_MSG_TYPE_FLASH_READY: AQH_FlashReadyMsg_DumpToBuffer(msg, dbuf, "received"); break; - case AQH_MSG_TYPE_FLASH_START: AQH_FlashStartMsg_DumpToBuffer(msg, dbuf, "received"); break; - case AQH_MSG_TYPE_FLASH_RSP: AQH_FlashResponseMsg_DumpToBuffer(msg, dbuf, "received"); break; - case AQH_MSG_TYPE_FLASH_END: AQH_FlashEndMsg_DumpToBuffer(msg, dbuf, "received"); break; - case AQH_MSG_TYPE_FLASH_DATA: AQH_FlashDataMsg_DumpToBuffer(msg, dbuf, "received"); break; - case AQH_MSG_TYPE_REBOOT_REQ: AQH_RebootRequestMsg_DumpToBuffer(msg, dbuf, "received"); break; - case AQH_MSG_TYPE_REBOOT_RSP: AQH_RebootResponseMsg_DumpToBuffer(msg, dbuf, "received"); break; - default: AQH_NodeMsg_DumpToBuffer(msg, dbuf, "received"); break; - } - } - else { - AQH_NodeMsg_DumpToBuffer(msg, dbuf, "(invalid) received"); - } - _writeToLogFile(aqh->logFile, GWEN_Buffer_GetStart(dbuf)); - GWEN_Buffer_free(dbuf); - } -} - - - -void _writeToLogFile(const char *filename, const char *txt) -{ - if (txt && *txt) { - FILE *f; - - f=fopen(filename, "a+"); - if (f) { - if (1!=fwrite(txt, strlen(txt), 1, f)) { - DBG_ERROR(AQH_LOGDOMAIN, "Error logging."); - } - fclose(f); - } - } -} - - - diff --git a/apps/aqhomed/tty_log.h b/apps/aqhomed/tty_log.h deleted file mode 100644 index 29add37..0000000 --- a/apps/aqhomed/tty_log.h +++ /dev/null @@ -1,23 +0,0 @@ -/**************************************************************************** - * 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 AQHOMED_TTY_LOG_H -#define AQHOMED_TTY_LOG_H - - -#include "./aqhomed.h" - - - -void AqHomed_LogTtyMsg(AQHOMED *aqh, const GWEN_MSG *msg); - - - -#endif - - diff --git a/apps/aqhomed/tty_write.c b/apps/aqhomed/tty_write.c deleted file mode 100644 index 3c6fb3d..0000000 --- a/apps/aqhomed/tty_write.c +++ /dev/null @@ -1,225 +0,0 @@ -/**************************************************************************** - * 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 "./tty_write.h" -#include "./aqhomed_p.h" - -#include "aqhome/msg/msg_value2.h" -#include "aqhome/msg/msg_sendstats.h" -#include "aqhome/msg/msg_recvstats.h" - -#include -#include - -#include - - - -/* ------------------------------------------------------------------------------------------------ - * forward declarations - * ------------------------------------------------------------------------------------------------ - */ - -static void _processValue2Message(AQHOMED *aqh, const GWEN_MSG *nodeMsg); -static void _processSendStatsMessage(AQHOMED *aqh, const GWEN_MSG *nodeMsg); -static void _processRecvStatsMessage(AQHOMED *aqh, const GWEN_MSG *nodeMsg); -static void _writeDouble(AQHOMED *aqh, uint32_t uid, int valueId, const char *valuePath, double v); -static void _writeInt(AQHOMED *aqh, uint32_t uid, int valueId, const char *valuePath, int v); -static void _writeString(AQHOMED *aqh, uint32_t uid, int valueId, const char *valuePath, const char *v); -static void _writeToFile(const char *filename, const char *txt); - - - -/* ------------------------------------------------------------------------------------------------ - * implementations - * ------------------------------------------------------------------------------------------------ - */ - -void AqHomed_WriteTtyMsg(AQHOMED *aqh, const GWEN_MSG *msg) -{ - if (aqh && aqh->writeFolder) { - switch(AQH_NodeMsg_GetMsgType(msg)) { - case AQH_MSG_TYPE_VALUE2: - _processValue2Message(aqh, msg); - break; - case AQH_MSG_TYPE_COMSENDSTATS: - _processSendStatsMessage(aqh, msg); - break; - case AQH_MSG_TYPE_COMRECVSTATS: - _processRecvStatsMessage(aqh, msg); - break; - default: - break; - } - } -} - - - -void _processValue2Message(AQHOMED *aqh, const GWEN_MSG *nodeMsg) -{ - const char *sType; - - sType=AQH_Value2Msg_GetValueTypeName(nodeMsg); - if (sType && *sType) { - if (AQH_Value2Msg_GetValueType(nodeMsg)==AQH_MSG_VALUE2_TYPE_DOOR) - _writeString(aqh, - AQH_Value2Msg_GetUid(nodeMsg), - AQH_Value2Msg_GetValueId(nodeMsg), - sType, - AQH_Value2Msg_GetValueAsWindowStateString(nodeMsg)); - else - _writeDouble(aqh, - AQH_Value2Msg_GetUid(nodeMsg), - AQH_Value2Msg_GetValueId(nodeMsg), - sType, - AQH_Value2Msg_GetValue(nodeMsg)); - } - _writeDouble(aqh, - AQH_Value2Msg_GetUid(nodeMsg), - AQH_Value2Msg_GetValueId(nodeMsg), - "value", - AQH_Value2Msg_GetValue(nodeMsg)); -} - - - -void _processSendStatsMessage(AQHOMED *aqh, const GWEN_MSG *nodeMsg) -{ - uint16_t packetsOutInt; - - packetsOutInt=AQH_SendStatsMsg_GetPacketsOut(nodeMsg); - if (packetsOutInt) { - double packetsOut; - double collisions; - double busy; - double collisionsPercentage=0.0; - double busyPercentage=0.0; - - packetsOut=(double) packetsOutInt; - collisions=(double)AQH_SendStatsMsg_GetCollisions(nodeMsg); - busy=(double)AQH_SendStatsMsg_GetBusyErrors(nodeMsg); - - collisionsPercentage=collisions*100.0/packetsOut; - busyPercentage=busy*100.0/packetsOut; - - _writeInt(aqh, AQH_SendStatsMsg_GetUid(nodeMsg), 0, "net/packetsOut", packetsOutInt); - _writeInt(aqh, AQH_SendStatsMsg_GetUid(nodeMsg), 0, "net/collisions", (int) AQH_SendStatsMsg_GetCollisions(nodeMsg)); - _writeDouble(aqh, AQH_SendStatsMsg_GetUid(nodeMsg), 0, "net/collisionsPercent", collisionsPercentage); - _writeDouble(aqh, AQH_SendStatsMsg_GetUid(nodeMsg), 0, "net/busyPercent", busyPercentage); - } -} - - - -void _processRecvStatsMessage(AQHOMED *aqh, const GWEN_MSG *nodeMsg) -{ - uint16_t packetsInInt; - - packetsInInt=AQH_RecvStatsMsg_GetPacketsIn(nodeMsg); - if (packetsInInt) { - double packetsIn; - double crcErrors; - double ioErrors; - double crcErrorsPercentage=0.0; - double ioErrorsPercentage=0.0; - - packetsIn=(double) packetsInInt; - crcErrors=(double)AQH_RecvStatsMsg_GetCrcErrors(nodeMsg); - ioErrors=(double)AQH_RecvStatsMsg_GetIoErrors(nodeMsg); - - crcErrorsPercentage=crcErrors*100.0/packetsIn; - ioErrorsPercentage=ioErrors*100.0/packetsIn; - - _writeInt(aqh, AQH_RecvStatsMsg_GetUid(nodeMsg), 0, "net/packetsIn", packetsInInt); - _writeInt(aqh, AQH_RecvStatsMsg_GetUid(nodeMsg), 0, "net/crcerrors", (int) AQH_RecvStatsMsg_GetCrcErrors(nodeMsg)); - _writeInt(aqh, AQH_RecvStatsMsg_GetUid(nodeMsg), 0, "net/ioerrors", (int) AQH_RecvStatsMsg_GetIoErrors(nodeMsg)); - _writeDouble(aqh, AQH_RecvStatsMsg_GetUid(nodeMsg), 0, "net/crcerrorsPercent", crcErrorsPercentage); - _writeDouble(aqh, AQH_RecvStatsMsg_GetUid(nodeMsg), 0, "net/ioerrorsPercent", ioErrorsPercentage); - } -} - - - -void _writeDouble(AQHOMED *aqh, uint32_t uid, int valueId, const char *valuePath, double v) -{ - char numBuf[16]; - - snprintf(numBuf, sizeof(numBuf)-1, "%f", v); - numBuf[sizeof(numBuf)-1]=0; - _writeString(aqh, uid, valueId, valuePath, numBuf); -} - - - -void _writeInt(AQHOMED *aqh, uint32_t uid, int valueId, const char *valuePath, int v) -{ - char numBuf[16]; - - snprintf(numBuf, sizeof(numBuf)-1, "%d", v); - numBuf[sizeof(numBuf)-1]=0; - _writeString(aqh, uid, valueId, valuePath, numBuf); -} - - - -void _writeString(AQHOMED *aqh, uint32_t uid, int valueId, const char *valuePath, const char *v) -{ - GWEN_BUFFER *bufFilename; - - bufFilename=GWEN_Buffer_new(0, 64, 0, 1); - if (valueId>0) - GWEN_Buffer_AppendArgs(bufFilename, "%s/%08x/%d/%s", aqh->writeFolder, uid, valueId, valuePath); - else - GWEN_Buffer_AppendArgs(bufFilename, "%s/%08x/%s", aqh->writeFolder, uid, valuePath); - _writeToFile(GWEN_Buffer_GetStart(bufFilename), v); - GWEN_Buffer_free(bufFilename); -} - - - -void _writeToFile(const char *filename, const char *txt) -{ - if (txt && *txt) { - GWEN_BUFFER *tmpNameBuf; - int rv; - - tmpNameBuf=GWEN_Buffer_new(0, 256, 0, 1); - GWEN_Buffer_AppendString(tmpNameBuf, filename); - GWEN_Buffer_AppendString(tmpNameBuf, ".tmp"); - - rv=GWEN_Directory_GetPath(GWEN_Buffer_GetStart(tmpNameBuf), GWEN_PATH_FLAGS_VARIABLE); - if (rv<0) { - DBG_INFO(NULL, "Error getting path for %s (%d)", GWEN_Buffer_GetStart(tmpNameBuf), rv); - } - else { - FILE *f; - - f=fopen(GWEN_Buffer_GetStart(tmpNameBuf), "w"); - if (f) { - if (1!=fwrite(txt, strlen(txt), 1, f)) { - DBG_ERROR(NULL, "Error writing."); - fclose(f); - } - else { - fclose(f); - rename(GWEN_Buffer_GetStart(tmpNameBuf), filename); - } - } - } - GWEN_Buffer_free(tmpNameBuf); - } -} - - - diff --git a/apps/aqhomed/tty_write.h b/apps/aqhomed/tty_write.h deleted file mode 100644 index 40fc111..0000000 --- a/apps/aqhomed/tty_write.h +++ /dev/null @@ -1,23 +0,0 @@ -/**************************************************************************** - * 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 AQHOMED_TTY_WRITE_H -#define AQHOMED_TTY_WRITE_H - - -#include "./aqhomed.h" - - - -void AqHomed_WriteTtyMsg(AQHOMED *aqh, const GWEN_MSG *msg); - - - -#endif - - diff --git a/aqhome/data/vars_dbread.c b/aqhome/data/vars_dbread.c index a2c99a7..4e97ff3 100644 --- a/aqhome/data/vars_dbread.c +++ b/aqhome/data/vars_dbread.c @@ -124,7 +124,7 @@ const char *_readLine(AQH_VARS **pVars, const char *src, GWEN_BUFFER *wbuf) else { s=_readGroupOrVar(pVars, s, wbuf); if (s==NULL) { - DBG_INFO(AQH_LOGDOMAIN, "here (%d)", rv); + DBG_INFO(AQH_LOGDOMAIN, "here"); return NULL; } } diff --git a/aqhome/msg/ipc/m_ipc_connect.c b/aqhome/msg/ipc/m_ipc_connect.c index 3494d2a..834a335 100644 --- a/aqhome/msg/ipc/m_ipc_connect.c +++ b/aqhome/msg/ipc/m_ipc_connect.c @@ -14,6 +14,7 @@ #include "aqhome/msg/ipc/m_ipc_connect.h" #include "aqhome/msg/ipc/m_ipc_tag16.h" #include "aqhome/msg/ipc/m_ipc.h" +#include "aqhome/msg/ipc/data/m_ipcd.h" #include #include