Parcourir la source

related to #332 , added another example to server_method

FlorianPalm il y a 9 ans
Parent
commit
c379b60491
2 fichiers modifiés avec 135 ajouts et 57 suppressions
  1. 134 56
      examples/server_method.c
  2. 1 1
      src/server/ua_services_call.c

+ 134 - 56
examples/server_method.c

@@ -18,66 +18,144 @@
 UA_Boolean running = UA_TRUE;
 UA_Logger logger;
 
-static UA_StatusCode helloWorldMethod(const UA_NodeId objectId, const UA_Variant *input, UA_Variant *output) {
-    UA_String *inputStr = (UA_String*)input->data;
-    UA_String tmp = UA_STRING_ALLOC("Hello ");
-    if(inputStr->length > 0) {
-        tmp.data = realloc(tmp.data, tmp.length + inputStr->length);
-        memcpy(&tmp.data[tmp.length], inputStr->data, inputStr->length);
-        tmp.length += inputStr->length;
-    }
-    UA_Variant_setScalarCopy(output, &tmp, &UA_TYPES[UA_TYPES_STRING]);
-    UA_String_deleteMembers(&tmp);
-    UA_LOG_INFO(logger, UA_LOGCATEGORY_SERVER, "Hello World was called");
-    return UA_STATUSCODE_GOOD;
-} 
+static UA_StatusCode helloWorldMethod(const UA_NodeId objectId,
+		const UA_Variant *input, UA_Variant *output) {
+	UA_String *inputStr = (UA_String*) input->data;
+	UA_String tmp = UA_STRING_ALLOC("Hello ");
+	if (inputStr->length > 0) {
+		tmp.data = realloc(tmp.data, tmp.length + inputStr->length);
+		memcpy(&tmp.data[tmp.length], inputStr->data, inputStr->length);
+		tmp.length += inputStr->length;
+	}
+	UA_Variant_setScalarCopy(output, &tmp, &UA_TYPES[UA_TYPES_STRING]);
+	UA_String_deleteMembers(&tmp);
+	UA_LOG_INFO(logger, UA_LOGCATEGORY_SERVER, "Hello World was called");
+	return UA_STATUSCODE_GOOD;
+}
+static UA_StatusCode IncInt32ArrayValues(const UA_NodeId objectId,
+		const UA_Variant *input, UA_Variant *output) {
+
+
+	UA_Variant_setArrayCopy(output,input->data,5,&UA_TYPES[UA_TYPES_INT32]);
+	for(int i = 0; i< input->arrayLength; i++){
+		((UA_Int32*)output->data)[i] = ((UA_Int32*)input->data)[i] + 2;
+	}
+
+	return UA_STATUSCODE_GOOD;
+}
+static UA_StatusCode callWithDifferentInputArgTypes(const UA_NodeId objectId,
+		const UA_Variant *input, UA_Variant *output) {
+
+	UA_String *string = (UA_String*) (input[0].data);
+	UA_Int32 *number = (UA_Int32*) (input[1].data);
+	UA_String tmp;
+	UA_Double tmpDouble;
+
+	//tmp = UA_STRING_ALLOC(string);
+
+	UA_String_copy(string, &tmp);
+	tmpDouble = *number;
+
+	UA_Variant_setScalarCopy(&output[0], &tmp, &UA_TYPES[UA_TYPES_STRING]);
+	UA_Variant_setScalarCopy(&output[1], &tmpDouble,
+			&UA_TYPES[UA_TYPES_DOUBLE]);
+
+	UA_String_deleteMembers(&tmp);
+	UA_LOG_INFO(logger, UA_LOGCATEGORY_SERVER,
+			"Call with different Arg types was called");
+	return UA_STATUSCODE_GOOD;
+
+}
 
 static void stopHandler(int sign) {
     UA_LOG_INFO(logger, UA_LOGCATEGORY_SERVER, "received ctrl-c");
     running = 0;
 }
-
 int main(int argc, char** argv) {
-    signal(SIGINT, stopHandler); /* catches ctrl-c */
-
-    /* initialize the server */
-    UA_Server *server = UA_Server_new(UA_ServerConfig_standard);
-    logger = Logger_Stdout_new();
-    UA_Server_setLogger(server, logger);
-    UA_Server_addNetworkLayer(server, ServerNetworkLayerTCP_new(UA_ConnectionConfig_standard, 16664));
-
-    /* add the method node with the callback */
-    UA_Argument inputArguments;
-    UA_Argument_init(&inputArguments);
-    inputArguments.arrayDimensionsSize = -1;
-    inputArguments.arrayDimensions = NULL;
-    inputArguments.dataType = UA_TYPES[UA_TYPES_STRING].typeId;
-    inputArguments.description = UA_LOCALIZEDTEXT("en_US", "A String");
-    inputArguments.name = UA_STRING("MyInput");
-    inputArguments.valueRank = -1;
-
-    UA_Argument outputArguments;
-    UA_Argument_init(&outputArguments);
-    outputArguments.arrayDimensionsSize = -1;
-    outputArguments.arrayDimensions = NULL;
-    outputArguments.dataType = UA_TYPES[UA_TYPES_STRING].typeId;
-    outputArguments.description = UA_LOCALIZEDTEXT("en_US", "A String");
-    outputArguments.name = UA_STRING("MyOutput");
-    outputArguments.valueRank = -1;
-    UA_NodeId createdNodeId;
-    UA_Server_addObjectNode(server,UA_QUALIFIEDNAME(1, "hello world object node"),UA_NODEID_NUMERIC(1,31415),
-    		UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER),UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES),
-    		UA_NODEID_NUMERIC(0,UA_NS0ID_OBJECTNODE),&createdNodeId);
-
-    UA_Server_addMethodNode(server, UA_QUALIFIEDNAME(1, "hello world"), UA_NODEID_NUMERIC(1,62541),
-                            UA_EXPANDEDNODEID_NUMERIC(1, 31415), UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT),
-                            &helloWorldMethod, 1, &inputArguments, 1, &outputArguments, NULL);
-
-    /* start server */
-    UA_StatusCode retval = UA_Server_run(server, 1, &running); //blocks until running=false
-
-    /* ctrl-c received -> clean up */
-
-    UA_Server_delete(server);
-    return retval;
+	signal(SIGINT, stopHandler); /* catches ctrl-c */
+
+	/* initialize the server */
+	UA_Server *server = UA_Server_new(UA_ServerConfig_standard);
+	logger = Logger_Stdout_new();
+	UA_Server_setLogger(server, logger);
+	UA_Server_addNetworkLayer(server,
+			ServerNetworkLayerTCP_new(UA_ConnectionConfig_standard, 16664));
+
+
+	 /* add the method node with the callback */
+	 UA_Argument inputArguments;
+	 UA_Argument_init(&inputArguments);
+	 inputArguments.arrayDimensionsSize = -1;
+	 inputArguments.arrayDimensions = NULL;
+	 inputArguments.dataType = UA_TYPES[UA_TYPES_STRING].typeId;
+	 inputArguments.description = UA_LOCALIZEDTEXT("en_US", "A String");
+	 inputArguments.name = UA_STRING("MyInput");
+	 inputArguments.valueRank = -1;
+
+	 UA_Argument outputArguments;
+	 UA_Argument_init(&outputArguments);
+	 outputArguments.arrayDimensionsSize = -1;
+	 outputArguments.arrayDimensions = NULL;
+	 outputArguments.dataType = UA_TYPES[UA_TYPES_STRING].typeId;
+	 outputArguments.description = UA_LOCALIZEDTEXT("en_US", "A String");
+	 outputArguments.name = UA_STRING("MyOutput");
+	 outputArguments.valueRank = -1;
+	 UA_NodeId createdNodeId;
+	 UA_Server_addObjectNode(server,UA_QUALIFIEDNAME(1, "hello world object node"),UA_NODEID_NUMERIC(1,31415),
+	 UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER),UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES),
+	 UA_NODEID_NUMERIC(0,UA_NS0ID_OBJECTNODE),&createdNodeId);
+
+	 UA_Server_addMethodNode(server, UA_QUALIFIEDNAME(1, "hello world"), UA_NODEID_NUMERIC(1,62541),
+	 UA_EXPANDEDNODEID_NUMERIC(1, 31415), UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT),
+	 &helloWorldMethod, 1, &inputArguments, 1, &outputArguments, NULL);
+
+	 /* add another method node: output argument as 1d Int32 array*/
+	// define input arguments
+	UA_Argument_init(&inputArguments);
+	inputArguments.arrayDimensionsSize = 1;
+	UA_UInt32 * pInputDimensions = UA_UInt32_new();
+	pInputDimensions[0] = 5;
+	inputArguments.arrayDimensions = pInputDimensions;
+	inputArguments.dataType = UA_TYPES[UA_TYPES_INT32].typeId;
+	inputArguments.description = UA_LOCALIZEDTEXT("en_US",
+			"input an array with 5 elements, type int32");
+	inputArguments.name = UA_STRING("int32 value");
+	inputArguments.valueRank = 1;
+
+	// define output arguments
+	UA_Argument_init(&outputArguments);
+	outputArguments.arrayDimensionsSize = 1;
+	UA_UInt32 * pOutputDimensions = UA_UInt32_new();
+	pOutputDimensions[0] = 5;
+	outputArguments.arrayDimensions = pOutputDimensions;
+	outputArguments.dataType = UA_TYPES[UA_TYPES_INT32].typeId;
+	outputArguments.description = UA_LOCALIZEDTEXT("en_US",
+			"increment each array index");
+	outputArguments.name = UA_STRING(
+			"output is the array, each index is incremented");
+	outputArguments.valueRank = 1;
+
+	UA_Server_addMethodNode(server, UA_QUALIFIEDNAME(1, "IncInt32ArrayValues"),
+			UA_NODEID_STRING(1, "IncInt32ArrayValues"),
+			UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER),
+			UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT), &IncInt32ArrayValues,
+			1, &inputArguments, 1, &outputArguments, NULL);
+
+
+
+
+
+	/* start server */
+	UA_StatusCode retval = UA_Server_run(server, 1, &running); //blocks until running=false
+
+	/* ctrl-c received -> clean up */
+
+        
+    UA_UInt32_delete(pInputDimensions);
+    UA_UInt32_delete(pOutputDimensions);
+	UA_Server_delete(server);
+
+	return retval;
 }
+
+

+ 1 - 1
src/server/ua_services_call.c

@@ -50,7 +50,7 @@ static UA_StatusCode statisfySignature(UA_Variant *var, UA_Argument arg) {
             return UA_STATUSCODE_BADINVALIDARGUMENT;
         if(arg.valueRank == -3 && var->arrayDimensionsSize > 1)
             return UA_STATUSCODE_BADINVALIDARGUMENT;
-        if(arg.valueRank >= 1 && var->arrayDimensionsSize != arg.arrayDimensionsSize)
+        if(arg.valueRank > 1 && var->arrayDimensionsSize != arg.arrayDimensionsSize)
             return UA_STATUSCODE_BADINVALIDARGUMENT;
         
         //variants do not always encode the dimension flag (e.g. 1d array)