|
@@ -203,174 +203,178 @@ UA_StatusCode nodeIter(UA_NodeId childId, UA_Boolean isInverse, UA_NodeId refere
|
|
|
}
|
|
|
|
|
|
int main(int argc, char** argv) {
|
|
|
- signal(SIGINT, stopHandler); /* catches ctrl-c */
|
|
|
+ signal(SIGINT, stopHandler); /* catches ctrl-c */
|
|
|
#ifdef UA_MULTITHREADING
|
|
|
- pthread_rwlock_init(&writeLock, 0);
|
|
|
+ pthread_rwlock_init(&writeLock, 0);
|
|
|
#endif
|
|
|
|
|
|
- UA_Server *server; = UA_Server_new(UA_ServerConfig_standard);
|
|
|
- logger = Logger_Stdout_new();
|
|
|
- UA_Server_setLogger(server, logger);
|
|
|
- UA_ByteString certificate = loadCertificate();
|
|
|
- UA_Server_setServerCertificate(server, certificate);
|
|
|
- UA_ByteString_deleteMembers(&certificate);
|
|
|
- UA_Server_addNetworkLayer(server, ServerNetworkLayerTCP_new(UA_ConnectionConfig_standard, 16664));
|
|
|
+ UA_Server *server = UA_Server_new(UA_ServerConfig_standard);
|
|
|
+ logger = Logger_Stdout_new();
|
|
|
+ UA_Server_setLogger(server, logger);
|
|
|
+ UA_ByteString certificate = loadCertificate();
|
|
|
+ UA_Server_setServerCertificate(server, certificate);
|
|
|
+ UA_ByteString_deleteMembers(&certificate);
|
|
|
+ UA_Server_addNetworkLayer(server, ServerNetworkLayerTCP_new(UA_ConnectionConfig_standard, 16664));
|
|
|
|
|
|
- // add node with the datetime data source
|
|
|
- UA_DataSource dateDataSource = (UA_DataSource) {.handle = NULL, .read = readTimeData, .write = NULL};
|
|
|
- const UA_QualifiedName dateName = UA_QUALIFIEDNAME(1, "current time");
|
|
|
- UA_Server_addDataSourceVariableNode(server, dateDataSource, dateName, UA_NODEID_NULL,
|
|
|
- UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER), UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES), NULL);
|
|
|
+ // add node with the datetime data source
|
|
|
+ UA_DataSource dateDataSource = (UA_DataSource) {.handle = NULL, .read = readTimeData, .write = NULL};
|
|
|
+ const UA_QualifiedName dateName = UA_QUALIFIEDNAME(1, "current time");
|
|
|
+ UA_Server_addDataSourceVariableNode(server, dateDataSource, dateName, UA_NODEID_NULL,
|
|
|
+ UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER), UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES), NULL);
|
|
|
|
|
|
#ifndef _WIN32
|
|
|
- //cpu temperature monitoring for linux machines
|
|
|
- if((temperatureFile = fopen("/sys/class/thermal/thermal_zone0/temp", "r"))) {
|
|
|
- // add node with the data source
|
|
|
- UA_DataSource temperatureDataSource = (UA_DataSource) {.handle = NULL, .read = readTemperature, .write = NULL};
|
|
|
- const UA_QualifiedName tempName = UA_QUALIFIEDNAME(1, "cpu temperature");
|
|
|
- UA_Server_addDataSourceVariableNode(server, temperatureDataSource, tempName, UA_NODEID_NULL,
|
|
|
- UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER), UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES), NULL);
|
|
|
- }
|
|
|
+ //cpu temperature monitoring for linux machines
|
|
|
+ if((temperatureFile = fopen("/sys/class/thermal/thermal_zone0/temp", "r"))) {
|
|
|
+ // add node with the data source
|
|
|
+ UA_DataSource temperatureDataSource = (UA_DataSource) {.handle = NULL, .read = readTemperature, .write = NULL};
|
|
|
+ const UA_QualifiedName tempName = UA_QUALIFIEDNAME(1, "cpu temperature");
|
|
|
+ UA_Server_addDataSourceVariableNode(server, temperatureDataSource, tempName, UA_NODEID_NULL,
|
|
|
+ UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER), UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES), NULL);
|
|
|
+ }
|
|
|
|
|
|
- //LED control for rpi
|
|
|
- if(access("/sys/class/leds/led0/trigger", F_OK ) != -1 || access("/sys/class/leds/led0/brightness", F_OK ) != -1) {
|
|
|
- if((triggerFile = fopen("/sys/class/leds/led0/trigger", "w")) && (ledFile = fopen("/sys/class/leds/led0/brightness", "w"))) {
|
|
|
- //setting led mode to manual
|
|
|
- fprintf(triggerFile, "%s", "none");
|
|
|
- fflush(triggerFile);
|
|
|
-
|
|
|
- //turning off led initially
|
|
|
- fprintf(ledFile, "%s", "1");
|
|
|
- fflush(ledFile);
|
|
|
-
|
|
|
- // add node with the LED status data source
|
|
|
- UA_DataSource ledStatusDataSource = (UA_DataSource) {.handle = NULL, .read = readLedStatus, .write = writeLedStatus};
|
|
|
- const UA_QualifiedName statusName = UA_QUALIFIEDNAME(0, "status LED");
|
|
|
- UA_Server_addDataSourceVariableNode(server, ledStatusDataSource, statusName, UA_NODEID_NULL,
|
|
|
- UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER),
|
|
|
- UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES), NULL);
|
|
|
- } else {
|
|
|
- UA_LOG_WARNING(logger, UA_LOGCATEGORY_USERLAND, "[Raspberry Pi] LED file exist, but I have no access (try to run server with sudo)");
|
|
|
- }
|
|
|
+ //LED control for rpi
|
|
|
+ if(access("/sys/class/leds/led0/trigger", F_OK ) != -1 || access("/sys/class/leds/led0/brightness", F_OK ) != -1) {
|
|
|
+ if((triggerFile = fopen("/sys/class/leds/led0/trigger", "w")) && (ledFile = fopen("/sys/class/leds/led0/brightness", "w"))) {
|
|
|
+ //setting led mode to manual
|
|
|
+ fprintf(triggerFile, "%s", "none");
|
|
|
+ fflush(triggerFile);
|
|
|
+
|
|
|
+ //turning off led initially
|
|
|
+ fprintf(ledFile, "%s", "1");
|
|
|
+ fflush(ledFile);
|
|
|
+
|
|
|
+ // add node with the LED status data source
|
|
|
+ UA_DataSource ledStatusDataSource = (UA_DataSource) {.handle = NULL, .read = readLedStatus, .write = writeLedStatus};
|
|
|
+ const UA_QualifiedName statusName = UA_QUALIFIEDNAME(0, "status LED");
|
|
|
+ UA_Server_addDataSourceVariableNode(server, ledStatusDataSource, statusName, UA_NODEID_NULL,
|
|
|
+ UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER),
|
|
|
+ UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES), NULL);
|
|
|
+ } else {
|
|
|
+ UA_LOG_WARNING(logger, UA_LOGCATEGORY_USERLAND, "[Raspberry Pi] LED file exist, but I have no access (try to run server with sudo)");
|
|
|
}
|
|
|
+ }
|
|
|
#endif
|
|
|
|
|
|
- // add a static variable node to the adresspace
|
|
|
- UA_Variant *myIntegerVariant = UA_Variant_new();
|
|
|
- UA_Int32 myInteger = 42;
|
|
|
- UA_Variant_setScalarCopy(myIntegerVariant, &myInteger, &UA_TYPES[UA_TYPES_INT32]);
|
|
|
- const UA_QualifiedName myIntegerName = UA_QUALIFIEDNAME(1, "the answer");
|
|
|
- const UA_NodeId myIntegerNodeId = UA_NODEID_STRING(1, "the.answer");
|
|
|
- UA_NodeId parentNodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER);
|
|
|
- UA_NodeId parentReferenceNodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES);
|
|
|
- UA_Server_addVariableNode(server, myIntegerVariant, myIntegerName,
|
|
|
- myIntegerNodeId, parentNodeId, parentReferenceNodeId, NULL);
|
|
|
-
|
|
|
- /**************/
|
|
|
- /* Demo Nodes */
|
|
|
- /**************/
|
|
|
+ // add a static variable node to the adresspace
|
|
|
+ UA_Variant *myIntegerVariant = UA_Variant_new();
|
|
|
+ UA_Int32 myInteger = 42;
|
|
|
+ UA_Variant_setScalarCopy(myIntegerVariant, &myInteger, &UA_TYPES[UA_TYPES_INT32]);
|
|
|
+ const UA_QualifiedName myIntegerName = UA_QUALIFIEDNAME(1, "the answer");
|
|
|
+ const UA_NodeId myIntegerNodeId = UA_NODEID_STRING(1, "the.answer");
|
|
|
+ UA_NodeId parentNodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER);
|
|
|
+ UA_NodeId parentReferenceNodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES);
|
|
|
+ UA_Server_addVariableNode(server, myIntegerNodeId, myIntegerName, UA_LOCALIZEDTEXT("en_US","My Integer"), UA_LOCALIZEDTEXT("en_US","My Integer"),
|
|
|
+ parentNodeId, parentReferenceNodeId, 0, 0, myIntegerVariant, NULL);
|
|
|
+
|
|
|
+ /**************/
|
|
|
+ /* Demo Nodes */
|
|
|
+ /**************/
|
|
|
|
|
|
#define DEMOID 50000
|
|
|
- UA_Server_addObjectNode(server,UA_QUALIFIEDNAME(1, "Demo"), UA_NODEID_NUMERIC(1, DEMOID), UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER),
|
|
|
- UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES), UA_NODEID_NUMERIC(0, UA_NS0ID_FOLDERTYPE), NULL);
|
|
|
+ UA_Server_addObjectNode(server, UA_NODEID_NUMERIC(1, DEMOID), UA_QUALIFIEDNAME(1, "Demo"), UA_LOCALIZEDTEXT("en_US","Demo"),
|
|
|
+ UA_LOCALIZEDTEXT("en_US","Demo"), UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER), UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES),
|
|
|
+ 0, 0, UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_FOLDERTYPE), NULL);
|
|
|
|
|
|
#define SCALARID 50001
|
|
|
- UA_Server_addObjectNode(server,UA_QUALIFIEDNAME(1, "Scalar"), UA_NODEID_NUMERIC(1, SCALARID), UA_NODEID_NUMERIC(1, DEMOID),
|
|
|
- UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES), UA_NODEID_NUMERIC(0, UA_NS0ID_FOLDERTYPE), NULL);
|
|
|
+ UA_Server_addObjectNode(server, UA_NODEID_NUMERIC(1, SCALARID), UA_QUALIFIEDNAME(1, "Scalar"), UA_LOCALIZEDTEXT("en_US","Demo"),
|
|
|
+ UA_LOCALIZEDTEXT("en_US","Demo"), UA_NODEID_NUMERIC(1, DEMOID), UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES),
|
|
|
+ 0, 0, UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_FOLDERTYPE), NULL);
|
|
|
|
|
|
#define ARRAYID 50002
|
|
|
- UA_Server_addObjectNode(server,UA_QUALIFIEDNAME(1, "Array"), UA_NODEID_NUMERIC(1, ARRAYID), UA_NODEID_NUMERIC(1, DEMOID),
|
|
|
- UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES), UA_NODEID_NUMERIC(0, UA_NS0ID_FOLDERTYPE), NULL);
|
|
|
+ UA_Server_addObjectNode(server, UA_NODEID_NUMERIC(1, ARRAYID), UA_QUALIFIEDNAME(1, "Array"), UA_LOCALIZEDTEXT("en_US","Demo"),
|
|
|
+ UA_LOCALIZEDTEXT("en_US","Demo"), UA_NODEID_NUMERIC(1, DEMOID), UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES),
|
|
|
+ 0, 0, UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_FOLDERTYPE), NULL);
|
|
|
|
|
|
#define MATRIXID 50003
|
|
|
- UA_Server_addObjectNode(server,UA_QUALIFIEDNAME(1, "Matrix"), UA_NODEID_NUMERIC(1, MATRIXID), UA_NODEID_NUMERIC(1, DEMOID),
|
|
|
- UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES), UA_NODEID_NUMERIC(0, UA_NS0ID_FOLDERTYPE), NULL);
|
|
|
-
|
|
|
- UA_UInt32 id = 51000; //running id in namespace 0
|
|
|
- for(UA_UInt32 type = 0; UA_IS_BUILTIN(type); type++) {
|
|
|
- if(type == UA_TYPES_VARIANT || type == UA_TYPES_DIAGNOSTICINFO)
|
|
|
- continue;
|
|
|
- //add a scalar node for every built-in type
|
|
|
- void *value = UA_new(&UA_TYPES[type]);
|
|
|
- UA_Variant *variant = UA_Variant_new();
|
|
|
- UA_Variant_setScalar(variant, value, &UA_TYPES[type]);
|
|
|
- char name[15];
|
|
|
- sprintf(name, "%02d", type);
|
|
|
- UA_QualifiedName qualifiedName = UA_QUALIFIEDNAME(1, name);
|
|
|
- UA_Server_addVariableNode(server, variant, qualifiedName, UA_NODEID_NUMERIC(1, ++id),
|
|
|
- UA_NODEID_NUMERIC(1, SCALARID), UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES), NULL);
|
|
|
-
|
|
|
- //add an array node for every built-in type
|
|
|
- UA_Variant *arrayvar = UA_Variant_new();
|
|
|
- UA_Variant_setArray(arrayvar, UA_Array_new(&UA_TYPES[type], 10), 10, &UA_TYPES[type]);
|
|
|
- UA_Server_addVariableNode(server, arrayvar, qualifiedName, UA_NODEID_NUMERIC(1, ++id),
|
|
|
- UA_NODEID_NUMERIC(1, ARRAYID), UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES), NULL);
|
|
|
-
|
|
|
- //add an matrix node for every built-in type
|
|
|
- arrayvar = UA_Variant_new();
|
|
|
- void* myMultiArray = UA_Array_new(&UA_TYPES[type],9);
|
|
|
- arrayvar->arrayDimensions = UA_Array_new(&UA_TYPES[UA_TYPES_INT32],2);
|
|
|
- arrayvar->arrayDimensions[0] = 3;
|
|
|
- arrayvar->arrayDimensions[1] = 3;
|
|
|
- arrayvar->arrayDimensionsSize = 2;
|
|
|
- arrayvar->arrayLength = 9;
|
|
|
- arrayvar->data = myMultiArray;
|
|
|
- arrayvar->type = &UA_TYPES[type];
|
|
|
- UA_Server_addVariableNode(server, arrayvar, qualifiedName, UA_NODEID_NUMERIC(1, ++id),
|
|
|
- UA_NODEID_NUMERIC(1, MATRIXID), UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES), NULL);
|
|
|
- }
|
|
|
+ UA_Server_addObjectNode(server, UA_NODEID_NUMERIC(1, MATRIXID), UA_QUALIFIEDNAME(1, "Matrix"), UA_LOCALIZEDTEXT("en_US","Demo"),
|
|
|
+ UA_LOCALIZEDTEXT("en_US","Demo"), UA_NODEID_NUMERIC(1, DEMOID), UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES),
|
|
|
+ 0, 0, UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_FOLDERTYPE), NULL);
|
|
|
+
|
|
|
+ UA_UInt32 id = 51000; //running id in namespace 0
|
|
|
+ for(UA_UInt32 type = 0; UA_IS_BUILTIN(type); type++) {
|
|
|
+ if(type == UA_TYPES_VARIANT || type == UA_TYPES_DIAGNOSTICINFO)
|
|
|
+ continue;
|
|
|
+ //add a scalar node for every built-in type
|
|
|
+ void *value = UA_new(&UA_TYPES[type]);
|
|
|
+ UA_Variant *variant = UA_Variant_new();
|
|
|
+ UA_Variant_setScalar(variant, value, &UA_TYPES[type]);
|
|
|
+ char name[15];
|
|
|
+ sprintf(name, "%02d", type);
|
|
|
+ UA_QualifiedName qualifiedName = UA_QUALIFIEDNAME(1, name);
|
|
|
+ UA_Server_addVariableNode(server, UA_NODEID_NUMERIC(1, ++id), qualifiedName, UA_LOCALIZEDTEXT("en_US",""), UA_LOCALIZEDTEXT("en_US",""),
|
|
|
+ UA_NODEID_NUMERIC(1, SCALARID), UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES), 0, 0, variant, NULL);
|
|
|
+
|
|
|
+ //add an array node for every built-in type
|
|
|
+ UA_Variant *arrayvar = UA_Variant_new();
|
|
|
+ UA_Variant_setArray(arrayvar, UA_Array_new(&UA_TYPES[type], 10), 10, &UA_TYPES[type]);
|
|
|
+ UA_Server_addVariableNode(server, UA_NODEID_NUMERIC(1, ++id), qualifiedName, UA_LOCALIZEDTEXT("en_US",""), UA_LOCALIZEDTEXT("en_US",""),
|
|
|
+ UA_NODEID_NUMERIC(1, ARRAYID), UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES), 0, 0, arrayvar, NULL);
|
|
|
+
|
|
|
+ //add an matrix node for every built-in type
|
|
|
+ arrayvar = UA_Variant_new();
|
|
|
+ void* myMultiArray = UA_Array_new(&UA_TYPES[type],9);
|
|
|
+ arrayvar->arrayDimensions = UA_Array_new(&UA_TYPES[UA_TYPES_INT32],2);
|
|
|
+ arrayvar->arrayDimensions[0] = 3;
|
|
|
+ arrayvar->arrayDimensions[1] = 3;
|
|
|
+ arrayvar->arrayDimensionsSize = 2;
|
|
|
+ arrayvar->arrayLength = 9;
|
|
|
+ arrayvar->data = myMultiArray;
|
|
|
+ arrayvar->type = &UA_TYPES[type];
|
|
|
+ UA_Server_addVariableNode(server, UA_NODEID_NUMERIC(1, ++id), qualifiedName, UA_LOCALIZEDTEXT("en_US",""), UA_LOCALIZEDTEXT("en_US",""),
|
|
|
+ UA_NODEID_NUMERIC(1, MATRIXID), UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES), 0, 0, arrayvar, NULL);
|
|
|
+ }
|
|
|
|
|
|
#ifdef ENABLE_METHODCALLS
|
|
|
- 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("Input an integer");
|
|
|
- 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("Input an integer");
|
|
|
- outputArguments.valueRank = -1;
|
|
|
-
|
|
|
- UA_NodeId methodId; // Retrieve the actual ID if this node if a random id as in UA_NODEID_NUMERIC(1,0) is used
|
|
|
- UA_Server_addMethodNode(server, UA_QUALIFIEDNAME(1,"ping"), UA_NODEID_NUMERIC(1,62541),
|
|
|
- UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER), UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES),
|
|
|
- &getMonitoredItems, 1, &inputArguments, 1, &outputArguments, &methodId);
|
|
|
+ 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("Input an integer");
|
|
|
+ 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("Input an integer");
|
|
|
+ outputArguments.valueRank = -1;
|
|
|
+
|
|
|
+ UA_NodeId methodId; // Retrieve the actual ID if this node if a random id as in UA_NODEID_NUMERIC(1,0) is used
|
|
|
+ UA_Server_addMethodNode(server, UA_QUALIFIEDNAME(1,"ping"), UA_NODEID_NUMERIC(1,62541),
|
|
|
+ UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER), UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES),
|
|
|
+ &getMonitoredItems, 1, &inputArguments, 1, &outputArguments, &methodId);
|
|
|
#endif
|
|
|
|
|
|
- // Example for iterating over all nodes referenced by "Objects":
|
|
|
- printf("Nodes connected to 'Objects':\n=============================\n");
|
|
|
- UA_Server_forEachChildNodeCall(server, UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER), nodeIter);
|
|
|
-
|
|
|
- //start server
|
|
|
- UA_StatusCode retval = UA_Server_run(server, 1, &running); //blocks until running=false
|
|
|
+ // Example for iterating over all nodes referenced by "Objects":
|
|
|
+ printf("Nodes connected to 'Objects':\n=============================\n");
|
|
|
+ UA_Server_forEachChildNodeCall(server, UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER), nodeIter);
|
|
|
+
|
|
|
+ //start server
|
|
|
+ UA_StatusCode retval = UA_Server_run(server, 1, &running); //blocks until running=false
|
|
|
|
|
|
- //ctrl-c received -> clean up
|
|
|
- UA_Server_delete(server);
|
|
|
+ //ctrl-c received -> clean up
|
|
|
+ UA_Server_delete(server);
|
|
|
|
|
|
- if(temperatureFile)
|
|
|
- fclose(temperatureFile);
|
|
|
+ if(temperatureFile)
|
|
|
+ fclose(temperatureFile);
|
|
|
|
|
|
- if(triggerFile) {
|
|
|
- fseek(triggerFile, 0, SEEK_SET);
|
|
|
- //setting led mode to default
|
|
|
- fprintf(triggerFile, "%s", "mmc0");
|
|
|
- fclose(triggerFile);
|
|
|
- }
|
|
|
+ if(triggerFile) {
|
|
|
+ fseek(triggerFile, 0, SEEK_SET);
|
|
|
+ //setting led mode to default
|
|
|
+ fprintf(triggerFile, "%s", "mmc0");
|
|
|
+ fclose(triggerFile);
|
|
|
+ }
|
|
|
|
|
|
- if(ledFile)
|
|
|
- fclose(ledFile);
|
|
|
+ if(ledFile)
|
|
|
+ fclose(ledFile);
|
|
|
|
|
|
#ifdef UA_MULTITHREADING
|
|
|
- pthread_rwlock_destroy(&writeLock);
|
|
|
+ pthread_rwlock_destroy(&writeLock);
|
|
|
#endif
|
|
|
|
|
|
- return retval;
|
|
|
+ return retval;
|
|
|
}
|