aboutsummaryrefslogtreecommitdiffstats
path: root/src/OpcUaMonitoredNode.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/OpcUaMonitoredNode.cpp')
-rw-r--r--src/OpcUaMonitoredNode.cpp67
1 files changed, 67 insertions, 0 deletions
diff --git a/src/OpcUaMonitoredNode.cpp b/src/OpcUaMonitoredNode.cpp
index cd93730..922ad43 100644
--- a/src/OpcUaMonitoredNode.cpp
+++ b/src/OpcUaMonitoredNode.cpp
@@ -177,6 +177,7 @@ OpcUaMonitoredNode::teardownNode ()
emit infoChanged ();
m_valueType = QOpcUa::Types::Undefined;
+ m_pendingRangeWrite = false;
if (m_writable)
{
@@ -270,6 +271,9 @@ OpcUaMonitoredNode::handleAttributeUpdated (QOpcUa::NodeAttribute attr,
void
OpcUaMonitoredNode::handleValueUpdated (const QVariant &value)
{
+ if (m_pendingRangeWrite)
+ return;
+
m_value = value;
emit valueChanged ();
@@ -306,6 +310,8 @@ OpcUaMonitoredNode::handleAttributeWritten (QOpcUa::NodeAttribute attr,
if (attr != QOpcUa::NodeAttribute::Value)
return;
+ m_pendingRangeWrite = false;
+
bool ok = (statusCode == QOpcUa::Good);
emit writeCompleted (ok, ok ? QStringLiteral ("Write successful")
: QOpcUa::statusToString (statusCode));
@@ -511,3 +517,64 @@ OpcUaMonitoredNode::writeValue (const QVariant &value)
emit writeCompleted (false,
QStringLiteral ("Write request failed to dispatch"));
}
+
+void
+OpcUaMonitoredNode::writeValueAtRange (const QVariant &value,
+ const QString &indexRange)
+{
+ if (!m_node)
+ {
+ emit writeCompleted (false, QStringLiteral ("Node not connected"));
+ return;
+ }
+ if (!m_writable)
+ {
+ emit writeCompleted (false, QStringLiteral ("Node is read-only"));
+ return;
+ }
+ if (m_valueType == QOpcUa::Types::Undefined)
+ {
+ emit writeCompleted (false,
+ QStringLiteral ("Data type not yet resolved"));
+ return;
+ }
+ if (indexRange.isEmpty ())
+ {
+ emit writeCompleted (false, QStringLiteral ("Index range is empty"));
+ return;
+ }
+
+ QVariant toWrite = value;
+
+ // If the input is a comma-separated string, split into a list so
+ // coerceValue can handle each element (e.g. "10, 20" for range "0:1").
+ if (value.metaType ().id () == QMetaType::QString
+ && value.toString ().contains (QLatin1Char (',')))
+ {
+ QStringList parts
+ = value.toString ().split (QLatin1Char (','), Qt::SkipEmptyParts);
+ QVariantList list;
+ list.reserve (parts.size ());
+ for (const QString &part : parts)
+ list.append (QVariant (part.trimmed ()));
+ toWrite = QVariant::fromValue (list);
+ }
+
+ QVariant coerced = coerceValue (toWrite);
+ if (!coerced.isValid ())
+ {
+ emit writeCompleted (
+ false, QStringLiteral ("Cannot convert value to node data type"));
+ return;
+ }
+
+ m_pendingRangeWrite = true;
+
+ if (!m_node->writeAttributeRange (QOpcUa::NodeAttribute::Value, coerced,
+ indexRange, m_valueType))
+ {
+ m_pendingRangeWrite = false;
+ emit writeCompleted (
+ false, QStringLiteral ("Write range request failed to dispatch"));
+ }
+}