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#include "qopen62541.h"
5#include "qopen62541backend.h"
6#include "qopen62541node.h"
7#include "qopen62541utils.h"
8#include "qopen62541valueconverter.h"
9
10#include <private/qopcuahistoryreadresponse_p.h>
11
12#include <QtCore/qdatetime.h>
13#include <QtCore/qstring.h>
14#include <QtCore/qlist.h>
15
16QT_BEGIN_NAMESPACE
17
18QOpen62541Node::QOpen62541Node(const UA_NodeId nodeId, QOpen62541Client *client, const QString nodeIdString)
19 : m_client(client)
20 , m_nodeIdString(nodeIdString)
21 , m_nodeId(nodeId)
22{
23 bool success = m_client->registerNode(obj: this);
24 setRegistered(success);
25}
26
27QOpen62541Node::~QOpen62541Node()
28{
29 if (m_client)
30 m_client->unregisterNode(obj: this);
31
32 UA_NodeId_clear(p: &m_nodeId);
33}
34
35bool QOpen62541Node::readAttributes(QOpcUa::NodeAttributes attr, const QString &indexRange)
36{
37 if (!m_client)
38 return false;
39
40 UA_NodeId tempId;
41 UA_NodeId_copy(src: &m_nodeId, dst: &tempId);
42 return QMetaObject::invokeMethod(obj: m_client->m_backend, member: "readAttributes",
43 c: Qt::QueuedConnection,
44 Q_ARG(quint64, handle()),
45 Q_ARG(UA_NodeId, tempId),
46 Q_ARG(QOpcUa::NodeAttributes, attr),
47 Q_ARG(QString, indexRange));
48}
49
50bool QOpen62541Node::enableMonitoring(QOpcUa::NodeAttributes attr, const QOpcUaMonitoringParameters &settings)
51{
52 if (!m_client)
53 return false;
54
55 UA_NodeId tempId;
56 UA_NodeId_copy(src: &m_nodeId, dst: &tempId);
57 return QMetaObject::invokeMethod(obj: m_client->m_backend, member: "enableMonitoring",
58 c: Qt::QueuedConnection,
59 Q_ARG(quint64, handle()),
60 Q_ARG(UA_NodeId, tempId),
61 Q_ARG(QOpcUa::NodeAttributes, attr),
62 Q_ARG(QOpcUaMonitoringParameters, settings));
63}
64
65bool QOpen62541Node::disableMonitoring(QOpcUa::NodeAttributes attr)
66{
67 if (!m_client)
68 return false;
69
70 return QMetaObject::invokeMethod(obj: m_client->m_backend, member: "disableMonitoring",
71 c: Qt::QueuedConnection,
72 Q_ARG(quint64, handle()),
73 Q_ARG(QOpcUa::NodeAttributes, attr));
74}
75
76bool QOpen62541Node::modifyMonitoring(QOpcUa::NodeAttribute attr, QOpcUaMonitoringParameters::Parameter item, const QVariant &value)
77{
78 if (!m_client)
79 return false;
80
81 return QMetaObject::invokeMethod(obj: m_client->m_backend, member: "modifyMonitoring",
82 c: Qt::QueuedConnection,
83 Q_ARG(quint64, handle()),
84 Q_ARG(QOpcUa::NodeAttribute, attr),
85 Q_ARG(QOpcUaMonitoringParameters::Parameter, item),
86 Q_ARG(QVariant, value));
87}
88
89QString QOpen62541Node::nodeId() const
90{
91 return m_nodeIdString;
92}
93
94bool QOpen62541Node::browse(const QOpcUaBrowseRequest &request)
95{
96 if (!m_client)
97 return false;
98
99 UA_NodeId tempId;
100 UA_NodeId_copy(src: &m_nodeId, dst: &tempId);
101 return QMetaObject::invokeMethod(obj: m_client->m_backend, member: "browse",
102 c: Qt::QueuedConnection,
103 Q_ARG(quint64, handle()),
104 Q_ARG(UA_NodeId, tempId),
105 Q_ARG(QOpcUaBrowseRequest, request));
106}
107
108bool QOpen62541Node::writeAttribute(QOpcUa::NodeAttribute attribute, const QVariant &value, QOpcUa::Types type, const QString &indexRange)
109{
110 if (!m_client)
111 return false;
112
113 UA_NodeId tempId;
114 UA_NodeId_copy(src: &m_nodeId, dst: &tempId);
115 return QMetaObject::invokeMethod(obj: m_client->m_backend, member: "writeAttribute",
116 c: Qt::QueuedConnection,
117 Q_ARG(quint64, handle()),
118 Q_ARG(UA_NodeId, tempId),
119 Q_ARG(QOpcUa::NodeAttribute, attribute),
120 Q_ARG(QVariant, value),
121 Q_ARG(QOpcUa::Types, type),
122 Q_ARG(QString, indexRange));
123}
124
125bool QOpen62541Node::writeAttributes(const QOpcUaNode::AttributeMap &toWrite, QOpcUa::Types valueAttributeType)
126{
127 if (!m_client)
128 return false;
129
130 UA_NodeId tempId;
131 UA_NodeId_copy(src: &m_nodeId, dst: &tempId);
132 return QMetaObject::invokeMethod(obj: m_client->m_backend, member: "writeAttributes",
133 c: Qt::QueuedConnection,
134 Q_ARG(quint64, handle()),
135 Q_ARG(UA_NodeId, tempId),
136 Q_ARG(QOpcUaNode::AttributeMap, toWrite),
137 Q_ARG(QOpcUa::Types, valueAttributeType));
138}
139
140
141bool QOpen62541Node::callMethod(const QString &methodNodeId, const QList<QOpcUa::TypedVariant> &args)
142
143{
144 if (!m_client)
145 return false;
146
147 UA_NodeId obj;
148 UA_NodeId_copy(src: &m_nodeId, dst: &obj);
149 return QMetaObject::invokeMethod(obj: m_client->m_backend, member: "callMethod",
150 c: Qt::QueuedConnection,
151 Q_ARG(quint64, handle()),
152 Q_ARG(UA_NodeId, obj),
153 Q_ARG(UA_NodeId, Open62541Utils::nodeIdFromQString(methodNodeId)),
154 Q_ARG(QList<QOpcUa::TypedVariant>, args));
155}
156
157QOpcUaHistoryReadResponse *QOpen62541Node::readHistoryRaw(const QDateTime &startTime, const QDateTime &endTime,
158 quint32 numValues, bool returnBounds)
159{
160 if (!m_client)
161 return nullptr;
162
163 return m_client->readHistoryData(request: QOpcUaHistoryReadRawRequest{{QOpcUaReadItem(m_nodeIdString)},
164 startTime, endTime, numValues, returnBounds});
165}
166
167bool QOpen62541Node::resolveBrowsePath(const QList<QOpcUaRelativePathElement> &path)
168{
169 if (!m_client)
170 return false;
171
172 UA_NodeId start;
173 UA_NodeId_copy(src: &m_nodeId, dst: &start);
174
175 return QMetaObject::invokeMethod(obj: m_client->m_backend, member: "resolveBrowsePath", c: Qt::QueuedConnection,
176 Q_ARG(quint64, handle()),
177 Q_ARG(UA_NodeId, start),
178 Q_ARG(QList<QOpcUaRelativePathElement>, path));
179}
180
181QT_END_NAMESPACE
182

source code of qtopcua/src/plugins/opcua/open62541/qopen62541node.cpp