summaryrefslogtreecommitdiffstats
path: root/src/plugins/opcua/freeopcua/qfreeopcuasubscription.h
diff options
context:
space:
mode:
authorJannis Voelker <jannis.voelker@basyskom.com>2017-11-13 14:34:17 +0100
committerFrank Meerkoetter <frank.meerkoetter@basyskom.com>2017-12-14 10:52:33 +0000
commit28f2c5d6bc152948a3ce7f22e55db9afcaba1d3c (patch)
tree5d7138b25642bfc8f98e1f0432e44cbbad6731c0 /src/plugins/opcua/freeopcua/qfreeopcuasubscription.h
parent0e71f5b4a9b6073f527236f5e6ac9d423ebe315b (diff)
Add async API for data change subscriptions
Subscriptions and monitored items are now handled entirely in the backend, no objects are passed to the user. Monitoring of attributes is activated using enableMonitoring() on the node. Different attributes of the node can be monitored with different intervals. Subscriptions are shared by default. Parameters allow requesting the creation of an exclusive subscription or to assign monitored items for attributes to an existing subscription. disableMonitoring() removes a monitored item. The enableMonitoringFinished and disableMonitoringFinished signals inform the user about the success of adding and removing monitored items. Data changes are reported by the attributeUpdated signal, this also updates the attribute cache. Monitoring parameters can be modified using modifyMonitoring(). Changed settings are reported by the monitoringStatusChanged signal, the value can be checked by calling monitoringStatus() for an attribute. Modifying monitoring parameters is currently not supported in freeopcua. Open62541 allows modifying subscription settings, monitored items can't be modified. Change-Id: I3ba5b3f03bd9f0413c98feefa9ad9571f82e8f0d Reviewed-by: Frank Meerkoetter <frank.meerkoetter@basyskom.com>
Diffstat (limited to 'src/plugins/opcua/freeopcua/qfreeopcuasubscription.h')
-rw-r--r--src/plugins/opcua/freeopcua/qfreeopcuasubscription.h59
1 files changed, 43 insertions, 16 deletions
diff --git a/src/plugins/opcua/freeopcua/qfreeopcuasubscription.h b/src/plugins/opcua/freeopcua/qfreeopcuasubscription.h
index bcc4d1e..8d36bfe 100644
--- a/src/plugins/opcua/freeopcua/qfreeopcuasubscription.h
+++ b/src/plugins/opcua/freeopcua/qfreeopcuasubscription.h
@@ -37,9 +37,9 @@
#ifndef QFREEOPCUASUBSCRIPTION_H
#define QFREEOPCUASUBSCRIPTION_H
-#include <QtOpcUa/qopcuamonitoredevent.h>
-#include <QtOpcUa/qopcuamonitoredvalue.h>
-#include <private/qopcuasubscriptionimpl_p.h>
+#include "qfreeopcuanode.h"
+
+#include <QtCore/qhash.h>
#include <opc/ua/subscription.h>
@@ -51,30 +51,57 @@ namespace OpcUa {
QT_BEGIN_NAMESPACE
class QOpcUaNode;
-class QFreeOpcUaMonitoredValue;
-class QOpcUaSubscription;
+class QFreeOpcUaWorker;
-class QFreeOpcUaSubscription : public QOpcUaSubscriptionImpl, public OpcUa::SubscriptionHandler
+class QFreeOpcUaSubscription : public OpcUa::SubscriptionHandler
{
public:
- explicit QFreeOpcUaSubscription(OpcUa::UaClient *client, quint32 interval);
+ QFreeOpcUaSubscription(QFreeOpcUaWorker *backend, const QOpcUaMonitoringParameters &settings);
~QFreeOpcUaSubscription() override;
// FreeOPC-UA callbacks
void DataChange(uint32_t handle, const OpcUa::Node &node, const OpcUa::Variant &val,
OpcUa::AttributeId attr) override;
- void Event(quint32 handle, const OpcUa::Event &event) override;
- QOpcUaMonitoredEvent *addEvent(QOpcUaNode *node) override;
- void removeEvent(QOpcUaMonitoredEvent *event) override;
- QOpcUaMonitoredValue *addValue(QOpcUaNode *node) override;
- void removeValue(QOpcUaMonitoredValue *value) override;
+ quint32 createOnServer();
+ bool removeOnServer();
+
+ void modifyMonitoring(uintptr_t handle, QOpcUaNode::NodeAttribute attr, QOpcUaMonitoringParameters::Parameter item, QVariant value);
+
+ bool addAttributeMonitoredItem(uintptr_t handle, QOpcUaNode::NodeAttribute attr, const OpcUa::Node &node, QOpcUaMonitoringParameters settings);
+ bool removeAttributeMonitoredItem(uintptr_t handle, QOpcUaNode::NodeAttribute attr);
+
+ double interval() const;
+ QOpcUaMonitoringParameters::SubscriptionType shared() const;
+ quint32 subscriptionId() const;
+ int monitoredItemsCount() const;
+
+ struct MonitoredItem {
+ uintptr_t handle;
+ QOpcUaNode::NodeAttribute attr;
+ quint32 monitoredItemId;
+ MonitoredItem(uintptr_t h, QOpcUaNode::NodeAttribute a, quint32 id)
+ : handle(h)
+ , attr(a)
+ , monitoredItemId(id)
+ {}
+ MonitoredItem()
+ : handle(0)
+ , monitoredItemId(0)
+ {}
+ };
+
+private:
+ MonitoredItem *getItemForAttribute(uintptr_t handle, QOpcUaNode::NodeAttribute attr);
+
+ double m_interval;
+ QOpcUaMonitoringParameters::SubscriptionType m_shared;
- OpcUa::UaClient *m_client;
- QOpcUaSubscription *m_qsubscription;
OpcUa::Subscription::SharedPtr m_subscription;
- QMap<int32_t, QOpcUaMonitoredValue *> m_dataChangeHandles;
- QMap<int32_t, QOpcUaMonitoredEvent *> m_eventHandles;
+ QFreeOpcUaWorker *m_backend;
+
+ QHash<quint32, MonitoredItem *> m_itemIdToItemMapping;
+ QHash<uintptr_t, QHash<QOpcUaNode::NodeAttribute, MonitoredItem *>> m_handleToItemMapping;
};
QT_END_NAMESPACE