From 71c98fb4aaf430683b5e3f88cd581f1f1373b38a Mon Sep 17 00:00:00 2001 From: Rainer Keller Date: Thu, 13 Sep 2018 08:52:29 +0200 Subject: testserver: Add method with multiple output arguments Change-Id: I706bbc80d7a69b15d58ffb5ecdb51a062f3d4a53 Reviewed-by: Frank Meerkoetter --- tests/open62541-testserver/main.cpp | 2 +- tests/open62541-testserver/testserver.cpp | 92 +++++++++++++++++++++++++++++++ tests/open62541-testserver/testserver.h | 7 +++ 3 files changed, 100 insertions(+), 1 deletion(-) 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 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(input[0].data); + double arg2 = *static_cast(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, -- cgit v1.2.3