|
@@ -2,50 +2,51 @@
|
|
#include "ua_statuscodes.h"
|
|
#include "ua_statuscodes.h"
|
|
|
|
|
|
enum UA_AttributeId {
|
|
enum UA_AttributeId {
|
|
- UA_ATTRIBUTEID_NODEID = 1,
|
|
|
|
- UA_ATTRIBUTEID_NODECLASS = 2,
|
|
|
|
- UA_ATTRIBUTEID_BROWSENAME = 3,
|
|
|
|
- UA_ATTRIBUTEID_DISPLAYNAME = 4,
|
|
|
|
- UA_ATTRIBUTEID_DESCRIPTION = 5,
|
|
|
|
- UA_ATTRIBUTEID_WRITEMASK = 6,
|
|
|
|
- UA_ATTRIBUTEID_USERWRITEMASK = 7,
|
|
|
|
- UA_ATTRIBUTEID_ISABSTRACT = 8,
|
|
|
|
- UA_ATTRIBUTEID_SYMMETRIC = 9,
|
|
|
|
- UA_ATTRIBUTEID_INVERSENAME = 10,
|
|
|
|
- UA_ATTRIBUTEID_CONTAINSNOLOOPS = 11,
|
|
|
|
- UA_ATTRIBUTEID_EVENTNOTIFIER = 12,
|
|
|
|
- UA_ATTRIBUTEID_VALUE = 13,
|
|
|
|
- UA_ATTRIBUTEID_DATATYPE = 14,
|
|
|
|
- UA_ATTRIBUTEID_VALUERANK = 15,
|
|
|
|
- UA_ATTRIBUTEID_ARRAYDIMENSIONS = 16,
|
|
|
|
- UA_ATTRIBUTEID_ACCESSLEVEL = 17,
|
|
|
|
- UA_ATTRIBUTEID_USERACCESSLEVEL = 18,
|
|
|
|
|
|
+ UA_ATTRIBUTEID_NODEID = 1,
|
|
|
|
+ UA_ATTRIBUTEID_NODECLASS = 2,
|
|
|
|
+ UA_ATTRIBUTEID_BROWSENAME = 3,
|
|
|
|
+ UA_ATTRIBUTEID_DISPLAYNAME = 4,
|
|
|
|
+ UA_ATTRIBUTEID_DESCRIPTION = 5,
|
|
|
|
+ UA_ATTRIBUTEID_WRITEMASK = 6,
|
|
|
|
+ UA_ATTRIBUTEID_USERWRITEMASK = 7,
|
|
|
|
+ UA_ATTRIBUTEID_ISABSTRACT = 8,
|
|
|
|
+ UA_ATTRIBUTEID_SYMMETRIC = 9,
|
|
|
|
+ UA_ATTRIBUTEID_INVERSENAME = 10,
|
|
|
|
+ UA_ATTRIBUTEID_CONTAINSNOLOOPS = 11,
|
|
|
|
+ UA_ATTRIBUTEID_EVENTNOTIFIER = 12,
|
|
|
|
+ UA_ATTRIBUTEID_VALUE = 13,
|
|
|
|
+ UA_ATTRIBUTEID_DATATYPE = 14,
|
|
|
|
+ UA_ATTRIBUTEID_VALUERANK = 15,
|
|
|
|
+ UA_ATTRIBUTEID_ARRAYDIMENSIONS = 16,
|
|
|
|
+ UA_ATTRIBUTEID_ACCESSLEVEL = 17,
|
|
|
|
+ UA_ATTRIBUTEID_USERACCESSLEVEL = 18,
|
|
UA_ATTRIBUTEID_MINIMUMSAMPLINGINTERVAL = 19,
|
|
UA_ATTRIBUTEID_MINIMUMSAMPLINGINTERVAL = 19,
|
|
- UA_ATTRIBUTEID_HISTORIZING = 20,
|
|
|
|
- UA_ATTRIBUTEID_EXECUTABLE = 21,
|
|
|
|
- UA_ATTRIBUTEID_USEREXECUTABLE = 22
|
|
|
|
|
|
+ UA_ATTRIBUTEID_HISTORIZING = 20,
|
|
|
|
+ UA_ATTRIBUTEID_EXECUTABLE = 21,
|
|
|
|
+ UA_ATTRIBUTEID_USEREXECUTABLE = 22
|
|
};
|
|
};
|
|
|
|
|
|
-#define CHECK_NODECLASS(CLASS) do { \
|
|
|
|
- if((node->nodeClass & (CLASS)) != 0x00) { \
|
|
|
|
- v.encodingMask = UA_DATAVALUE_ENCODINGMASK_STATUSCODE; \
|
|
|
|
- v.status = UA_STATUSCODE_BADNOTREADABLE; \
|
|
|
|
- } \
|
|
|
|
- break; \
|
|
|
|
- } while(0)
|
|
|
|
|
|
+#define CHECK_NODECLASS(CLASS) do { \
|
|
|
|
+ if((node->nodeClass & (CLASS)) != 0x00) { \
|
|
|
|
+ v.encodingMask = UA_DATAVALUE_ENCODINGMASK_STATUSCODE; \
|
|
|
|
+ v.status = UA_STATUSCODE_BADNOTREADABLE; \
|
|
|
|
+ } \
|
|
|
|
+ break; \
|
|
|
|
+} while(0)
|
|
|
|
|
|
-static UA_DataValue service_read_node(Application * app, const UA_ReadValueId * id) {
|
|
|
|
|
|
+static UA_DataValue service_read_node(Application *app, const UA_ReadValueId *id) {
|
|
UA_DataValue v;
|
|
UA_DataValue v;
|
|
UA_DataValue_init(&v);
|
|
UA_DataValue_init(&v);
|
|
|
|
|
|
- DBG(printf("service_read_node - entered with ns=%d,id=%d,attr=%i\n", id->nodeId.namespace, id->nodeId.identifier.numeric, id->attributeId));
|
|
|
|
|
|
+ DBG(printf("service_read_node - entered with ns=%d,id=%d,attr=%i\n", id->nodeId.namespace,
|
|
|
|
+ id->nodeId.identifier.numeric, id->attributeId));
|
|
Namespace *ns = UA_indexedList_findValue(app->namespaces, id->nodeId.namespace);
|
|
Namespace *ns = UA_indexedList_findValue(app->namespaces, id->nodeId.namespace);
|
|
|
|
|
|
if(ns == UA_NULL) {
|
|
if(ns == UA_NULL) {
|
|
- DBG_VERBOSE(printf("service_read_node - unknown namespace %d\n", id->nodeId.namespace));
|
|
|
|
- v.encodingMask = UA_DATAVALUE_ENCODINGMASK_STATUSCODE;
|
|
|
|
- v.status = UA_STATUSCODE_BADNODEIDUNKNOWN;
|
|
|
|
- return v;
|
|
|
|
|
|
+ DBG_VERBOSE(printf("service_read_node - unknown namespace %d\n", id->nodeId.namespace));
|
|
|
|
+ v.encodingMask = UA_DATAVALUE_ENCODINGMASK_STATUSCODE;
|
|
|
|
+ v.status = UA_STATUSCODE_BADNODEIDUNKNOWN;
|
|
|
|
+ return v;
|
|
}
|
|
}
|
|
|
|
|
|
UA_Node const *node = UA_NULL;
|
|
UA_Node const *node = UA_NULL;
|
|
@@ -54,122 +55,162 @@ static UA_DataValue service_read_node(Application * app, const UA_ReadValueId *
|
|
DBG_VERBOSE(UA_NodeId_printf("service_read_node - search for ", &(id->nodeId)));
|
|
DBG_VERBOSE(UA_NodeId_printf("service_read_node - search for ", &(id->nodeId)));
|
|
UA_Int32 result = Namespace_get(ns, &(id->nodeId), &node, &lock);
|
|
UA_Int32 result = Namespace_get(ns, &(id->nodeId), &node, &lock);
|
|
if(result != UA_SUCCESS || node == UA_NULL) {
|
|
if(result != UA_SUCCESS || node == UA_NULL) {
|
|
- v.encodingMask = UA_DATAVALUE_ENCODINGMASK_STATUSCODE;
|
|
|
|
- v.status = UA_STATUSCODE_BADNODEIDUNKNOWN;
|
|
|
|
- return v;
|
|
|
|
|
|
+ v.encodingMask = UA_DATAVALUE_ENCODINGMASK_STATUSCODE;
|
|
|
|
+ v.status = UA_STATUSCODE_BADNODEIDUNKNOWN;
|
|
|
|
+ return v;
|
|
}
|
|
}
|
|
DBG_VERBOSE(UA_NodeId_printf("service_read_node - found node=", &(node->nodeId)));
|
|
DBG_VERBOSE(UA_NodeId_printf("service_read_node - found node=", &(node->nodeId)));
|
|
|
|
|
|
UA_Int32 retval = UA_SUCCESS;
|
|
UA_Int32 retval = UA_SUCCESS;
|
|
|
|
|
|
- switch (id->attributeId) {
|
|
|
|
|
|
+ switch(id->attributeId) {
|
|
case UA_ATTRIBUTEID_NODEID:
|
|
case UA_ATTRIBUTEID_NODEID:
|
|
v.encodingMask = UA_DATAVALUE_ENCODINGMASK_VARIANT;
|
|
v.encodingMask = UA_DATAVALUE_ENCODINGMASK_VARIANT;
|
|
retval |= UA_Variant_copySetValue(&v.value, &UA_.types[UA_NODEID], &node->nodeId);
|
|
retval |= UA_Variant_copySetValue(&v.value, &UA_.types[UA_NODEID], &node->nodeId);
|
|
break;
|
|
break;
|
|
|
|
+
|
|
case UA_ATTRIBUTEID_NODECLASS:
|
|
case UA_ATTRIBUTEID_NODECLASS:
|
|
v.encodingMask = UA_DATAVALUE_ENCODINGMASK_VARIANT;
|
|
v.encodingMask = UA_DATAVALUE_ENCODINGMASK_VARIANT;
|
|
retval |= UA_Variant_copySetValue(&v.value, &UA_.types[UA_UINT32], &node->nodeClass);
|
|
retval |= UA_Variant_copySetValue(&v.value, &UA_.types[UA_UINT32], &node->nodeClass);
|
|
break;
|
|
break;
|
|
|
|
+
|
|
case UA_ATTRIBUTEID_BROWSENAME:
|
|
case UA_ATTRIBUTEID_BROWSENAME:
|
|
v.encodingMask = UA_DATAVALUE_ENCODINGMASK_VARIANT;
|
|
v.encodingMask = UA_DATAVALUE_ENCODINGMASK_VARIANT;
|
|
retval |= UA_Variant_copySetValue(&v.value, &UA_.types[UA_QUALIFIEDNAME], &node->browseName);
|
|
retval |= UA_Variant_copySetValue(&v.value, &UA_.types[UA_QUALIFIEDNAME], &node->browseName);
|
|
break;
|
|
break;
|
|
|
|
+
|
|
case UA_ATTRIBUTEID_DISPLAYNAME:
|
|
case UA_ATTRIBUTEID_DISPLAYNAME:
|
|
v.encodingMask = UA_DATAVALUE_ENCODINGMASK_VARIANT;
|
|
v.encodingMask = UA_DATAVALUE_ENCODINGMASK_VARIANT;
|
|
- retval |= UA_Variant_copySetValue(&v.value, &UA_.types[UA_LOCALIZEDTEXT], &node->displayName);
|
|
|
|
|
|
+ retval |= UA_Variant_copySetValue(&v.value, &UA_.types[UA_LOCALIZEDTEXT],
|
|
|
|
+ &node->displayName);
|
|
break;
|
|
break;
|
|
|
|
+
|
|
case UA_ATTRIBUTEID_DESCRIPTION:
|
|
case UA_ATTRIBUTEID_DESCRIPTION:
|
|
v.encodingMask = UA_DATAVALUE_ENCODINGMASK_STATUSCODE;
|
|
v.encodingMask = UA_DATAVALUE_ENCODINGMASK_STATUSCODE;
|
|
- v.status = UA_STATUSCODE_BADNOTREADABLE;
|
|
|
|
|
|
+ v.status = UA_STATUSCODE_BADNOTREADABLE;
|
|
break;
|
|
break;
|
|
|
|
+
|
|
case UA_ATTRIBUTEID_WRITEMASK:
|
|
case UA_ATTRIBUTEID_WRITEMASK:
|
|
v.encodingMask = UA_DATAVALUE_ENCODINGMASK_VARIANT;
|
|
v.encodingMask = UA_DATAVALUE_ENCODINGMASK_VARIANT;
|
|
retval |= UA_Variant_copySetValue(&v.value, &UA_.types[UA_UINT32], &node->writeMask);
|
|
retval |= UA_Variant_copySetValue(&v.value, &UA_.types[UA_UINT32], &node->writeMask);
|
|
break;
|
|
break;
|
|
|
|
+
|
|
case UA_ATTRIBUTEID_USERWRITEMASK:
|
|
case UA_ATTRIBUTEID_USERWRITEMASK:
|
|
v.encodingMask = UA_DATAVALUE_ENCODINGMASK_VARIANT;
|
|
v.encodingMask = UA_DATAVALUE_ENCODINGMASK_VARIANT;
|
|
retval |= UA_Variant_copySetValue(&v.value, &UA_.types[UA_UINT32], &node->userWriteMask);
|
|
retval |= UA_Variant_copySetValue(&v.value, &UA_.types[UA_UINT32], &node->userWriteMask);
|
|
break;
|
|
break;
|
|
|
|
+
|
|
case UA_ATTRIBUTEID_ISABSTRACT:
|
|
case UA_ATTRIBUTEID_ISABSTRACT:
|
|
CHECK_NODECLASS(UA_NODECLASS_REFERENCETYPE);
|
|
CHECK_NODECLASS(UA_NODECLASS_REFERENCETYPE);
|
|
v.encodingMask = UA_DATAVALUE_ENCODINGMASK_VARIANT;
|
|
v.encodingMask = UA_DATAVALUE_ENCODINGMASK_VARIANT;
|
|
- retval |= UA_Variant_copySetValue(&v.value, &UA_.types[UA_BOOLEAN], &((UA_ReferenceTypeNode *) node)->isAbstract);
|
|
|
|
|
|
+ retval |=
|
|
|
|
+ UA_Variant_copySetValue(&v.value, &UA_.types[UA_BOOLEAN],
|
|
|
|
+ &((UA_ReferenceTypeNode *)node)->isAbstract);
|
|
break;
|
|
break;
|
|
|
|
+
|
|
case UA_ATTRIBUTEID_SYMMETRIC:
|
|
case UA_ATTRIBUTEID_SYMMETRIC:
|
|
CHECK_NODECLASS(UA_NODECLASS_REFERENCETYPE);
|
|
CHECK_NODECLASS(UA_NODECLASS_REFERENCETYPE);
|
|
v.encodingMask = UA_DATAVALUE_ENCODINGMASK_VARIANT;
|
|
v.encodingMask = UA_DATAVALUE_ENCODINGMASK_VARIANT;
|
|
- retval |= UA_Variant_copySetValue(&v.value, &UA_.types[UA_BOOLEAN], &((UA_ReferenceTypeNode *) node)->symmetric);
|
|
|
|
|
|
+ retval |= UA_Variant_copySetValue(&v.value, &UA_.types[UA_BOOLEAN],
|
|
|
|
+ &((UA_ReferenceTypeNode *)node)->symmetric);
|
|
break;
|
|
break;
|
|
|
|
+
|
|
case UA_ATTRIBUTEID_INVERSENAME:
|
|
case UA_ATTRIBUTEID_INVERSENAME:
|
|
CHECK_NODECLASS(UA_NODECLASS_REFERENCETYPE);
|
|
CHECK_NODECLASS(UA_NODECLASS_REFERENCETYPE);
|
|
v.encodingMask = UA_DATAVALUE_ENCODINGMASK_VARIANT;
|
|
v.encodingMask = UA_DATAVALUE_ENCODINGMASK_VARIANT;
|
|
- retval |= UA_Variant_copySetValue(&v.value, &UA_.types[UA_LOCALIZEDTEXT], &((UA_ReferenceTypeNode *) node)->inverseName);
|
|
|
|
|
|
+ retval |= UA_Variant_copySetValue(&v.value, &UA_.types[UA_LOCALIZEDTEXT],
|
|
|
|
+ &((UA_ReferenceTypeNode *)node)->inverseName);
|
|
break;
|
|
break;
|
|
|
|
+
|
|
case UA_ATTRIBUTEID_CONTAINSNOLOOPS:
|
|
case UA_ATTRIBUTEID_CONTAINSNOLOOPS:
|
|
CHECK_NODECLASS(UA_NODECLASS_VIEW);
|
|
CHECK_NODECLASS(UA_NODECLASS_VIEW);
|
|
v.encodingMask = UA_DATAVALUE_ENCODINGMASK_VARIANT;
|
|
v.encodingMask = UA_DATAVALUE_ENCODINGMASK_VARIANT;
|
|
- retval |= UA_Variant_copySetValue(&v.value, &UA_.types[UA_BOOLEAN], &((UA_ViewNode *) node)->containsNoLoops);
|
|
|
|
|
|
+ retval |= UA_Variant_copySetValue(&v.value, &UA_.types[UA_BOOLEAN],
|
|
|
|
+ &((UA_ViewNode *)node)->containsNoLoops);
|
|
break;
|
|
break;
|
|
|
|
+
|
|
case UA_ATTRIBUTEID_EVENTNOTIFIER:
|
|
case UA_ATTRIBUTEID_EVENTNOTIFIER:
|
|
CHECK_NODECLASS(UA_NODECLASS_VIEW);
|
|
CHECK_NODECLASS(UA_NODECLASS_VIEW);
|
|
v.encodingMask = UA_DATAVALUE_ENCODINGMASK_VARIANT;
|
|
v.encodingMask = UA_DATAVALUE_ENCODINGMASK_VARIANT;
|
|
- retval |= UA_Variant_copySetValue(&v.value, &UA_.types[UA_BYTE], &((UA_ViewNode *) node)->eventNotifier);
|
|
|
|
|
|
+ retval |= UA_Variant_copySetValue(&v.value, &UA_.types[UA_BYTE],
|
|
|
|
+ &((UA_ViewNode *)node)->eventNotifier);
|
|
break;
|
|
break;
|
|
|
|
+
|
|
case UA_ATTRIBUTEID_VALUE:
|
|
case UA_ATTRIBUTEID_VALUE:
|
|
CHECK_NODECLASS(UA_NODECLASS_VARIABLE);
|
|
CHECK_NODECLASS(UA_NODECLASS_VARIABLE);
|
|
v.encodingMask = UA_DATAVALUE_ENCODINGMASK_VARIANT;
|
|
v.encodingMask = UA_DATAVALUE_ENCODINGMASK_VARIANT;
|
|
// TODO: Ensure that the borrowed value is not freed prematurely (multithreading)
|
|
// TODO: Ensure that the borrowed value is not freed prematurely (multithreading)
|
|
- retval |= UA_Variant_borrowSetValue(&v.value, &UA_.types[UA_VARIANT], &((UA_VariableNode *) node)->value);
|
|
|
|
|
|
+ retval |= UA_Variant_borrowSetValue(&v.value, &UA_.types[UA_VARIANT],
|
|
|
|
+ &((UA_VariableNode *)node)->value);
|
|
break;
|
|
break;
|
|
|
|
+
|
|
case UA_ATTRIBUTEID_DATATYPE:
|
|
case UA_ATTRIBUTEID_DATATYPE:
|
|
CHECK_NODECLASS(UA_NODECLASS_VARIABLE | UA_NODECLASS_VARIABLETYPE);
|
|
CHECK_NODECLASS(UA_NODECLASS_VARIABLE | UA_NODECLASS_VARIABLETYPE);
|
|
v.encodingMask = UA_DATAVALUE_ENCODINGMASK_VARIANT;
|
|
v.encodingMask = UA_DATAVALUE_ENCODINGMASK_VARIANT;
|
|
- retval |= UA_Variant_copySetValue(&v.value, &UA_.types[UA_NODEID], &((UA_VariableTypeNode *) node)->dataType);
|
|
|
|
|
|
+ retval |= UA_Variant_copySetValue(&v.value, &UA_.types[UA_NODEID],
|
|
|
|
+ &((UA_VariableTypeNode *)node)->dataType);
|
|
break;
|
|
break;
|
|
|
|
+
|
|
case UA_ATTRIBUTEID_VALUERANK:
|
|
case UA_ATTRIBUTEID_VALUERANK:
|
|
CHECK_NODECLASS(UA_NODECLASS_VARIABLE | UA_NODECLASS_VARIABLETYPE);
|
|
CHECK_NODECLASS(UA_NODECLASS_VARIABLE | UA_NODECLASS_VARIABLETYPE);
|
|
v.encodingMask = UA_DATAVALUE_ENCODINGMASK_VARIANT;
|
|
v.encodingMask = UA_DATAVALUE_ENCODINGMASK_VARIANT;
|
|
- retval |= UA_Variant_copySetValue(&v.value, &UA_.types[UA_INT32], &((UA_VariableTypeNode *) node)->valueRank);
|
|
|
|
|
|
+ retval |= UA_Variant_copySetValue(&v.value, &UA_.types[UA_INT32],
|
|
|
|
+ &((UA_VariableTypeNode *)node)->valueRank);
|
|
break;
|
|
break;
|
|
|
|
+
|
|
case UA_ATTRIBUTEID_ARRAYDIMENSIONS:
|
|
case UA_ATTRIBUTEID_ARRAYDIMENSIONS:
|
|
CHECK_NODECLASS(UA_NODECLASS_VARIABLE | UA_NODECLASS_VARIABLETYPE);
|
|
CHECK_NODECLASS(UA_NODECLASS_VARIABLE | UA_NODECLASS_VARIABLETYPE);
|
|
v.encodingMask = UA_DATAVALUE_ENCODINGMASK_VARIANT;
|
|
v.encodingMask = UA_DATAVALUE_ENCODINGMASK_VARIANT;
|
|
- UA_Variant_copySetArray(&v.value, &UA_.types[UA_UINT32], ((UA_VariableTypeNode *) node)->arrayDimensionsSize, &((UA_VariableTypeNode *) node)->arrayDimensions);
|
|
|
|
|
|
+ UA_Variant_copySetArray(&v.value, &UA_.types[UA_UINT32],
|
|
|
|
+ ((UA_VariableTypeNode *)node)->arrayDimensionsSize,
|
|
|
|
+ &((UA_VariableTypeNode *)node)->arrayDimensions);
|
|
break;
|
|
break;
|
|
|
|
+
|
|
case UA_ATTRIBUTEID_ACCESSLEVEL:
|
|
case UA_ATTRIBUTEID_ACCESSLEVEL:
|
|
CHECK_NODECLASS(UA_NODECLASS_VARIABLE);
|
|
CHECK_NODECLASS(UA_NODECLASS_VARIABLE);
|
|
v.encodingMask = UA_DATAVALUE_ENCODINGMASK_VARIANT;
|
|
v.encodingMask = UA_DATAVALUE_ENCODINGMASK_VARIANT;
|
|
- retval |= UA_Variant_copySetValue(&v.value, &UA_.types[UA_BYTE], &((UA_VariableNode *) node)->accessLevel);
|
|
|
|
|
|
+ retval |= UA_Variant_copySetValue(&v.value, &UA_.types[UA_BYTE],
|
|
|
|
+ &((UA_VariableNode *)node)->accessLevel);
|
|
break;
|
|
break;
|
|
|
|
+
|
|
case UA_ATTRIBUTEID_USERACCESSLEVEL:
|
|
case UA_ATTRIBUTEID_USERACCESSLEVEL:
|
|
CHECK_NODECLASS(UA_NODECLASS_VARIABLE);
|
|
CHECK_NODECLASS(UA_NODECLASS_VARIABLE);
|
|
v.encodingMask = UA_DATAVALUE_ENCODINGMASK_VARIANT;
|
|
v.encodingMask = UA_DATAVALUE_ENCODINGMASK_VARIANT;
|
|
- retval |= UA_Variant_copySetValue(&v.value, &UA_.types[UA_BYTE], &((UA_VariableNode *) node)->userAccessLevel);
|
|
|
|
|
|
+ retval |= UA_Variant_copySetValue(&v.value, &UA_.types[UA_BYTE],
|
|
|
|
+ &((UA_VariableNode *)node)->userAccessLevel);
|
|
break;
|
|
break;
|
|
|
|
+
|
|
case UA_ATTRIBUTEID_MINIMUMSAMPLINGINTERVAL:
|
|
case UA_ATTRIBUTEID_MINIMUMSAMPLINGINTERVAL:
|
|
CHECK_NODECLASS(UA_NODECLASS_VARIABLE);
|
|
CHECK_NODECLASS(UA_NODECLASS_VARIABLE);
|
|
v.encodingMask = UA_DATAVALUE_ENCODINGMASK_VARIANT;
|
|
v.encodingMask = UA_DATAVALUE_ENCODINGMASK_VARIANT;
|
|
- retval |= UA_Variant_copySetValue(&v.value, &UA_.types[UA_DOUBLE], &((UA_VariableNode *) node)->minimumSamplingInterval);
|
|
|
|
|
|
+ retval |= UA_Variant_copySetValue(&v.value, &UA_.types[UA_DOUBLE],
|
|
|
|
+ &((UA_VariableNode *)node)->minimumSamplingInterval);
|
|
break;
|
|
break;
|
|
|
|
+
|
|
case UA_ATTRIBUTEID_HISTORIZING:
|
|
case UA_ATTRIBUTEID_HISTORIZING:
|
|
CHECK_NODECLASS(UA_NODECLASS_VARIABLE);
|
|
CHECK_NODECLASS(UA_NODECLASS_VARIABLE);
|
|
v.encodingMask = UA_DATAVALUE_ENCODINGMASK_VARIANT;
|
|
v.encodingMask = UA_DATAVALUE_ENCODINGMASK_VARIANT;
|
|
- retval |= UA_Variant_copySetValue(&v.value, &UA_.types[UA_BOOLEAN], &((UA_VariableNode *) node)->historizing);
|
|
|
|
|
|
+ retval |= UA_Variant_copySetValue(&v.value, &UA_.types[UA_BOOLEAN],
|
|
|
|
+ &((UA_VariableNode *)node)->historizing);
|
|
break;
|
|
break;
|
|
|
|
+
|
|
case UA_ATTRIBUTEID_EXECUTABLE:
|
|
case UA_ATTRIBUTEID_EXECUTABLE:
|
|
CHECK_NODECLASS(UA_NODECLASS_METHOD);
|
|
CHECK_NODECLASS(UA_NODECLASS_METHOD);
|
|
v.encodingMask = UA_DATAVALUE_ENCODINGMASK_VARIANT;
|
|
v.encodingMask = UA_DATAVALUE_ENCODINGMASK_VARIANT;
|
|
- retval |= UA_Variant_copySetValue(&v.value, &UA_.types[UA_BOOLEAN], &((UA_MethodNode *) node)->executable);
|
|
|
|
|
|
+ retval |= UA_Variant_copySetValue(&v.value, &UA_.types[UA_BOOLEAN],
|
|
|
|
+ &((UA_MethodNode *)node)->executable);
|
|
break;
|
|
break;
|
|
|
|
+
|
|
case UA_ATTRIBUTEID_USEREXECUTABLE:
|
|
case UA_ATTRIBUTEID_USEREXECUTABLE:
|
|
CHECK_NODECLASS(UA_NODECLASS_METHOD);
|
|
CHECK_NODECLASS(UA_NODECLASS_METHOD);
|
|
v.encodingMask = UA_DATAVALUE_ENCODINGMASK_VARIANT;
|
|
v.encodingMask = UA_DATAVALUE_ENCODINGMASK_VARIANT;
|
|
- retval |= UA_Variant_copySetValue(&v.value, &UA_.types[UA_BOOLEAN], &((UA_MethodNode *) node)->userExecutable);
|
|
|
|
|
|
+ retval |= UA_Variant_copySetValue(&v.value, &UA_.types[UA_BOOLEAN],
|
|
|
|
+ &((UA_MethodNode *)node)->userExecutable);
|
|
break;
|
|
break;
|
|
|
|
+
|
|
default:
|
|
default:
|
|
v.encodingMask = UA_DATAVALUE_ENCODINGMASK_STATUSCODE;
|
|
v.encodingMask = UA_DATAVALUE_ENCODINGMASK_STATUSCODE;
|
|
- v.status = UA_STATUSCODE_BADATTRIBUTEIDINVALID;
|
|
|
|
|
|
+ v.status = UA_STATUSCODE_BADATTRIBUTEIDINVALID;
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -177,15 +218,16 @@ static UA_DataValue service_read_node(Application * app, const UA_ReadValueId *
|
|
|
|
|
|
if(retval != UA_SUCCESS) {
|
|
if(retval != UA_SUCCESS) {
|
|
v.encodingMask = UA_DATAVALUE_ENCODINGMASK_STATUSCODE;
|
|
v.encodingMask = UA_DATAVALUE_ENCODINGMASK_STATUSCODE;
|
|
- v.status = UA_STATUSCODE_BADNOTREADABLE;
|
|
|
|
|
|
+ v.status = UA_STATUSCODE_BADNOTREADABLE;
|
|
}
|
|
}
|
|
|
|
|
|
return v;
|
|
return v;
|
|
}
|
|
}
|
|
|
|
|
|
-UA_Int32 Service_Read(SL_Channel * channel, const UA_ReadRequest * request, UA_ReadResponse * response) {
|
|
|
|
|
|
+UA_Int32 Service_Read(SL_Channel *channel, const UA_ReadRequest *request,
|
|
|
|
+ UA_ReadResponse *response) {
|
|
if(channel->session == UA_NULL || channel->session->application == UA_NULL)
|
|
if(channel->session == UA_NULL || channel->session->application == UA_NULL)
|
|
- return UA_ERROR; // TODO: Return error message
|
|
|
|
|
|
+ return UA_ERROR; // TODO: Return error message
|
|
|
|
|
|
int readsize = request->nodesToReadSize;
|
|
int readsize = request->nodesToReadSize;
|
|
/* NothingTodo */
|
|
/* NothingTodo */
|
|
@@ -197,10 +239,11 @@ UA_Int32 Service_Read(SL_Channel * channel, const UA_ReadRequest * request, UA_R
|
|
|
|
|
|
response->resultsSize = readsize;
|
|
response->resultsSize = readsize;
|
|
UA_alloc((void **)&response->results, sizeof(UA_DataValue) * readsize);
|
|
UA_alloc((void **)&response->results, sizeof(UA_DataValue) * readsize);
|
|
- for(int i = 0; i < readsize; i++) {
|
|
|
|
|
|
+ for(int i = 0;i < readsize;i++) {
|
|
DBG_VERBOSE(printf("service_read - attributeId=%d\n", request->nodesToRead[i].attributeId));
|
|
DBG_VERBOSE(printf("service_read - attributeId=%d\n", request->nodesToRead[i].attributeId));
|
|
DBG_VERBOSE(UA_NodeId_printf("service_read - nodeId=", &(request->nodesToRead[i].nodeId)));
|
|
DBG_VERBOSE(UA_NodeId_printf("service_read - nodeId=", &(request->nodesToRead[i].nodeId)));
|
|
- response->results[i] = service_read_node(channel->session->application, &request->nodesToRead[i]);
|
|
|
|
|
|
+ response->results[i] = service_read_node(channel->session->application,
|
|
|
|
+ &request->nodesToRead[i]);
|
|
}
|
|
}
|
|
response->responseHeader.serviceResult = UA_STATUSCODE_GOOD;
|
|
response->responseHeader.serviceResult = UA_STATUSCODE_GOOD;
|
|
response->diagnosticInfosSize = -1;
|
|
response->diagnosticInfosSize = -1;
|