summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRainer Keller <Rainer.Keller@qt.io>2018-09-13 08:52:29 +0200
committerRainer Keller <Rainer.Keller@qt.io>2018-09-13 13:03:24 +0000
commit71c98fb4aaf430683b5e3f88cd581f1f1373b38a (patch)
tree4032d55090455d008bf709de0b4c74f1a08a0d12
parente789efccb9b107d9d16151ee2b2d12c3ddaf3ff4 (diff)
testserver: Add method with multiple output arguments
Change-Id: I706bbc80d7a69b15d58ffb5ecdb51a062f3d4a53 Reviewed-by: Frank Meerkoetter <frank.meerkoetter@basyskom.com>
-rw-r--r--tests/open62541-testserver/main.cpp2
-rw-r--r--tests/open62541-testserver/testserver.cpp92
-rw-r--r--tests/open62541-testserver/testserver.h7
3 files changed, 100 insertions, 1 deletions
diff --git a/tests/open62541-testserver/main.cpp b/tests/open62541-testserver/main.cpp
index aa05edd..58df107 100644
--- a/tests/open62541-testserver/main.cpp
+++ b/tests/open62541-testserver/main.cpp
@@ -200,7 +200,7 @@ int main(int argc, char **argv)
// Add a method to the test folder
server.addMultiplyMethod(testFolder, "ns=3;s=Test.Method.Multiply", "MultiplyDoubles");
-
+ server.addMultipleOutputArgumentsMethod(testFolder, "ns=3;s=Test.Method.MultipleOutputArguments", "MultipleOutputArguments");
server.addEmptyArrayVariable(testFolder, "ns=2;s=EmptyBoolArray", "EmptyBoolArrayTest");
const QVector<quint32> arrayDimensions({2, 2, 3});
diff --git a/tests/open62541-testserver/testserver.cpp b/tests/open62541-testserver/testserver.cpp
index a674f4a..f7dd957 100644
--- a/tests/open62541-testserver/testserver.cpp
+++ b/tests/open62541-testserver/testserver.cpp
@@ -385,6 +385,98 @@ UA_NodeId TestServer::addMultiplyMethod(const UA_NodeId &folder, const QString &
return resultId;
}
+UA_StatusCode TestServer::multipleOutputArgumentsMethod(UA_Server *server, const UA_NodeId *sessionId, void *sessionHandle, const UA_NodeId *methodId, void *methodContext, const UA_NodeId *objectId, void *objectContext, size_t inputSize, const UA_Variant *input, size_t outputSize, UA_Variant *output)
+{
+ Q_UNUSED(server);
+ Q_UNUSED(sessionId);
+ Q_UNUSED(sessionHandle);
+ Q_UNUSED(methodId);
+ Q_UNUSED(methodContext);
+ Q_UNUSED(objectId);
+ Q_UNUSED(objectContext);
+
+ if (inputSize < 2)
+ return QOpcUa::UaStatusCode::BadArgumentsMissing;
+ if (inputSize > 2)
+ return QOpcUa::UaStatusCode::BadTooManyArguments;
+ if (outputSize != 2)
+ return QOpcUa::UaStatusCode::BadInvalidArgument;
+
+ double arg1 = *static_cast<double *>(input[0].data);
+ double arg2 = *static_cast<double *>(input[1].data);
+
+ double product = arg1 * arg2;
+ auto someText = UA_LOCALIZEDTEXT_ALLOC("en-US", "some text argument");
+ UA_Variant_setScalarCopy(&output[0], &product, &UA_TYPES[UA_TYPES_DOUBLE]);
+ UA_Variant_setScalarCopy(&output[1], &someText, &UA_TYPES[UA_TYPES_LOCALIZEDTEXT]);
+
+ return UA_STATUSCODE_GOOD;
+}
+
+UA_NodeId TestServer::addMultipleOutputArgumentsMethod(const UA_NodeId &folder, const QString &variableNode, const QString &description)
+{
+ UA_NodeId methodNodeId = Open62541Utils::nodeIdFromQString(variableNode);
+
+ UA_Argument inputArguments[2];
+ UA_Argument_init(&inputArguments[0]);
+ UA_Argument_init(&inputArguments[1]);
+
+ inputArguments[0].description = UA_LOCALIZEDTEXT_ALLOC("en", "First value");
+ inputArguments[0].name = UA_STRING_ALLOC("The first double");
+ inputArguments[0].dataType = UA_TYPES[UA_TYPES_DOUBLE].typeId;
+ inputArguments[0].valueRank = -1;
+
+ inputArguments[1].description = UA_LOCALIZEDTEXT_ALLOC("en", "Second value");
+ inputArguments[1].name = UA_STRING_ALLOC("The second double");
+ inputArguments[1].dataType = UA_TYPES[UA_TYPES_DOUBLE].typeId;
+ inputArguments[1].valueRank = -1;
+
+ UA_Argument outputArgument[2];
+ UA_Argument_init(&outputArgument[0]);
+ UA_Argument_init(&outputArgument[1]);
+
+ outputArgument[0].description = UA_LOCALIZEDTEXT_ALLOC("en", "The product of the two arguments");
+ outputArgument[0].name = UA_STRING_ALLOC("The product of the two arguments");
+ outputArgument[0].dataType = UA_TYPES[UA_TYPES_DOUBLE].typeId;
+ outputArgument[0].valueRank = -1;
+
+ outputArgument[1].description = UA_LOCALIZEDTEXT_ALLOC("en", "Some additional text argument");
+ outputArgument[1].name = UA_STRING_ALLOC("Text argument");
+ outputArgument[1].dataType = UA_TYPES[UA_TYPES_LOCALIZEDTEXT].typeId;
+ outputArgument[1].valueRank = -1;
+
+ UA_MethodAttributes attr = UA_MethodAttributes_default;
+
+ attr.description = UA_LOCALIZEDTEXT_ALLOC("en-US", description.toUtf8().constData());
+ attr.displayName = UA_LOCALIZEDTEXT_ALLOC("en-US", variableNode.toUtf8().constData());
+ attr.executable = true;
+
+ UA_QualifiedName nodeBrowseName = UA_QUALIFIEDNAME_ALLOC(methodNodeId.namespaceIndex, "multipleOutputArguments");
+
+ UA_NodeId resultId;
+ UA_StatusCode result = UA_Server_addMethodNode(m_server, methodNodeId, folder,
+ UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT),
+ nodeBrowseName,
+ attr, &multipleOutputArgumentsMethod,
+ 2, inputArguments,
+ 2, outputArgument,
+ nullptr, &resultId);
+
+ UA_QualifiedName_deleteMembers(&nodeBrowseName);
+ UA_NodeId_deleteMembers(&methodNodeId);
+ UA_MethodAttributes_deleteMembers(&attr);
+ UA_Argument_deleteMembers(&inputArguments[0]);
+ UA_Argument_deleteMembers(&inputArguments[1]);
+ UA_Argument_deleteMembers(&outputArgument[0]);
+ UA_Argument_deleteMembers(&outputArgument[1]);
+
+ if (result != UA_STATUSCODE_GOOD) {
+ qWarning() << "Could not add variable:" << result;
+ return UA_NODEID_NULL;
+ }
+ return resultId;
+}
+
UA_NodeId TestServer::addAddNamespaceMethod(const UA_NodeId &folder, const QString &variableNode, const QString &description)
{
UA_NodeId methodNodeId = Open62541Utils::nodeIdFromQString(variableNode);
diff --git a/tests/open62541-testserver/testserver.h b/tests/open62541-testserver/testserver.h
index 114e189..f8a5ff9 100644
--- a/tests/open62541-testserver/testserver.h
+++ b/tests/open62541-testserver/testserver.h
@@ -66,6 +66,7 @@ public:
UA_NodeId addEmptyArrayVariable(const UA_NodeId &folder, const QString &variableNode, const QString &name);
UA_NodeId addMultiplyMethod(const UA_NodeId &folder, const QString &variableNode, const QString &description);
+ UA_NodeId addMultipleOutputArgumentsMethod(const UA_NodeId &folder, const QString &variableNode, const QString &description);
UA_NodeId addAddNamespaceMethod(const UA_NodeId &folder, const QString &variableNode, const QString &description);
static UA_StatusCode multiplyMethod(UA_Server *server, const UA_NodeId *sessionId, void *sessionHandle,
@@ -74,6 +75,12 @@ public:
size_t inputSize, const UA_Variant *input,
size_t outputSize, UA_Variant *output);
+ static UA_StatusCode multipleOutputArgumentsMethod(UA_Server *server, const UA_NodeId *sessionId, void *sessionHandle,
+ const UA_NodeId *methodId, void *methodContext,
+ const UA_NodeId *objectId, void *objectContext,
+ size_t inputSize, const UA_Variant *input,
+ size_t outputSize, UA_Variant *output);
+
static UA_StatusCode addNamespaceMethod(UA_Server *server, const UA_NodeId *sessionId, void *sessionHandle,
const UA_NodeId *methodId, void *methodContext, const UA_NodeId *objectId,
void *objectContext, size_t inputSize, const UA_Variant *input, size_t outputSize,