1// Copyright (C) 2017 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
4#ifndef QOPEN62541SUBSCRIPTION_H
5#define QOPEN62541SUBSCRIPTION_H
6
7#ifdef USE_SYSTEM_OPEN62541
8#include <open62541/client_subscriptions.h>
9#else
10#include "qopen62541.h"
11#endif
12
13#include <QtOpcUa/qopcuanode.h>
14
15QT_BEGIN_NAMESPACE
16
17class Open62541AsyncBackend;
18
19class QOpen62541Subscription : public QObject
20{
21 Q_OBJECT
22
23public:
24 QOpen62541Subscription(Open62541AsyncBackend *backend, const QOpcUaMonitoringParameters &settings);
25 ~QOpen62541Subscription();
26
27 UA_UInt32 createOnServer();
28 bool removeOnServer();
29
30 void modifyMonitoring(quint64 handle, QOpcUa::NodeAttribute attr, QOpcUaMonitoringParameters::Parameter item, QVariant value);
31
32 bool addAttributeMonitoredItem(quint64 handle, QOpcUa::NodeAttribute attr, const UA_NodeId &id, QOpcUaMonitoringParameters settings);
33 bool removeAttributeMonitoredItem(quint64 handle, QOpcUa::NodeAttribute attr);
34
35 void monitoredValueUpdated(UA_UInt32 monId, UA_DataValue *value);
36 void eventReceived(UA_UInt32 monId, QVariantList list);
37
38 void sendTimeoutNotification();
39
40 struct MonitoredItem {
41 quint64 handle;
42 QOpcUa::NodeAttribute attr;
43 UA_UInt32 monitoredItemId;
44 UA_UInt32 clientHandle;
45 QOpcUaMonitoringParameters parameters;
46 MonitoredItem(quint64 h, QOpcUa::NodeAttribute a, UA_UInt32 id)
47 : handle(h)
48 , attr(a)
49 , monitoredItemId(id)
50 {}
51 MonitoredItem()
52 : handle(0)
53 , monitoredItemId(0)
54 {}
55 };
56
57 double interval() const;
58 UA_UInt32 subscriptionId() const;
59 int monitoredItemsCount() const;
60
61 QOpcUaMonitoringParameters::SubscriptionType shared() const;
62
63signals:
64 void timeout(QOpen62541Subscription *sub, QList<QPair<quint64, QOpcUa::NodeAttribute>> items);
65
66private:
67 MonitoredItem *getItemForAttribute(quint64 nodeHandle, QOpcUa::NodeAttribute attr);
68 UA_ExtensionObject createFilter(const QVariant &filterData);
69 void createDataChangeFilter(const QOpcUaMonitoringParameters::DataChangeFilter &filter, UA_ExtensionObject *out);
70
71 bool modifySubscriptionParameters(quint64 nodeHandle, QOpcUa::NodeAttribute attr, const QOpcUaMonitoringParameters::Parameter &item, const QVariant &value);
72 bool modifyMonitoredItemParameters(quint64 nodeHandle, QOpcUa::NodeAttribute attr, const QOpcUaMonitoringParameters::Parameter &item, const QVariant &value);
73 QOpcUaEventFilterResult convertEventFilterResult(UA_ExtensionObject *obj);
74
75 Open62541AsyncBackend *m_backend;
76 double m_interval;
77 UA_UInt32 m_subscriptionId;
78 UA_UInt32 m_lifetimeCount;
79 UA_UInt32 m_maxKeepaliveCount;
80 QOpcUaMonitoringParameters::SubscriptionType m_shared;
81 quint8 m_priority;
82 quint32 m_maxNotificationsPerPublish;
83
84 QHash<quint64, QHash<QOpcUa::NodeAttribute, MonitoredItem *>> m_nodeHandleToItemMapping; // Handle -> Attribute -> MonitoredItem
85 QHash<UA_UInt32, MonitoredItem *> m_itemIdToItemMapping; // ItemId -> Item for fast lookup on data change
86
87 quint32 m_clientHandle;
88 bool m_timeout;
89};
90
91QT_END_NAMESPACE
92
93#endif // QOPEN62541SUBSCRIPTION_H
94

source code of qtopcua/src/plugins/opcua/open62541/qopen62541subscription.h