|
@@ -15,15 +15,10 @@
|
|
#include "ua_subscription.h"
|
|
#include "ua_subscription.h"
|
|
#include "ua_session.h"
|
|
#include "ua_session.h"
|
|
|
|
|
|
-
|
|
|
|
-/*****************/
|
|
|
|
-/* Node Creation */
|
|
|
|
-/*****************/
|
|
|
|
-
|
|
|
|
static UA_StatusCode
|
|
static UA_StatusCode
|
|
-addNode_begin(UA_Server *server, UA_NodeClass nodeClass,
|
|
|
|
- UA_UInt32 nodeId, char *name, void *attributes,
|
|
|
|
- const UA_DataType *attributesType) {
|
|
|
|
|
|
+addNode_raw(UA_Server *server, UA_NodeClass nodeClass,
|
|
|
|
+ UA_UInt32 nodeId, char *name, void *attributes,
|
|
|
|
+ const UA_DataType *attributesType) {
|
|
UA_AddNodesItem item;
|
|
UA_AddNodesItem item;
|
|
UA_AddNodesItem_init(&item);
|
|
UA_AddNodesItem_init(&item);
|
|
item.nodeClass = nodeClass;
|
|
item.nodeClass = nodeClass;
|
|
@@ -32,46 +27,19 @@ addNode_begin(UA_Server *server, UA_NodeClass nodeClass,
|
|
item.nodeAttributes.encoding = UA_EXTENSIONOBJECT_DECODED_NODELETE;
|
|
item.nodeAttributes.encoding = UA_EXTENSIONOBJECT_DECODED_NODELETE;
|
|
item.nodeAttributes.content.decoded.data = attributes;
|
|
item.nodeAttributes.content.decoded.data = attributes;
|
|
item.nodeAttributes.content.decoded.type = attributesType;
|
|
item.nodeAttributes.content.decoded.type = attributesType;
|
|
- UA_NodeId parentNode = UA_NODEID_NULL;
|
|
|
|
- UA_NodeId referenceType = UA_NODEID_NULL;
|
|
|
|
- return Operation_addNode_begin(server, &adminSession, NULL, &item, &parentNode, &referenceType, NULL);
|
|
|
|
|
|
+ return AddNode_raw(server, &adminSession, NULL, &item, NULL);
|
|
}
|
|
}
|
|
|
|
|
|
static UA_StatusCode
|
|
static UA_StatusCode
|
|
addNode_finish(UA_Server *server, UA_UInt32 nodeId,
|
|
addNode_finish(UA_Server *server, UA_UInt32 nodeId,
|
|
UA_UInt32 parentNodeId, UA_UInt32 referenceTypeId) {
|
|
UA_UInt32 parentNodeId, UA_UInt32 referenceTypeId) {
|
|
- UA_NodeId sourceId = UA_NODEID_NUMERIC(0, nodeId);
|
|
|
|
- UA_NodeId refTypeId = UA_NODEID_NUMERIC(0, referenceTypeId);
|
|
|
|
- UA_ExpandedNodeId targetId = UA_EXPANDEDNODEID_NUMERIC(0, parentNodeId);
|
|
|
|
|
|
+ const UA_NodeId sourceId = UA_NODEID_NUMERIC(0, nodeId);
|
|
|
|
+ const UA_NodeId refTypeId = UA_NODEID_NUMERIC(0, referenceTypeId);
|
|
|
|
+ const UA_ExpandedNodeId targetId = UA_EXPANDEDNODEID_NUMERIC(0, parentNodeId);
|
|
UA_StatusCode retval = UA_Server_addReference(server, sourceId, refTypeId, targetId, UA_FALSE);
|
|
UA_StatusCode retval = UA_Server_addReference(server, sourceId, refTypeId, targetId, UA_FALSE);
|
|
if (retval != UA_STATUSCODE_GOOD)
|
|
if (retval != UA_STATUSCODE_GOOD)
|
|
return retval;
|
|
return retval;
|
|
-
|
|
|
|
-
|
|
|
|
- UA_NodeId node = UA_NODEID_NUMERIC(0, nodeId);
|
|
|
|
- return Operation_addNode_finish(server, &adminSession, &node);
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-static UA_StatusCode
|
|
|
|
-addDataTypeNode(UA_Server *server, char* name, UA_UInt32 datatypeid,
|
|
|
|
- UA_Boolean isAbstract, UA_UInt32 parentid) {
|
|
|
|
- UA_DataTypeAttributes attr = UA_DataTypeAttributes_default;
|
|
|
|
- attr.displayName = UA_LOCALIZEDTEXT("", name);
|
|
|
|
- attr.isAbstract = isAbstract;
|
|
|
|
- return UA_Server_addDataTypeNode(server, UA_NODEID_NUMERIC(0, datatypeid),
|
|
|
|
- UA_NODEID_NUMERIC(0, parentid), UA_NODEID_NULL,
|
|
|
|
- UA_QUALIFIEDNAME(0, name), attr, NULL, NULL);
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-static UA_StatusCode
|
|
|
|
-addObjectTypeNode(UA_Server *server, char* name, UA_UInt32 objecttypeid,
|
|
|
|
- UA_Boolean isAbstract, UA_UInt32 parentid) {
|
|
|
|
- UA_ObjectTypeAttributes attr = UA_ObjectTypeAttributes_default;
|
|
|
|
- attr.displayName = UA_LOCALIZEDTEXT("", name);
|
|
|
|
- attr.isAbstract = isAbstract;
|
|
|
|
- return UA_Server_addObjectTypeNode(server, UA_NODEID_NUMERIC(0, objecttypeid),
|
|
|
|
- UA_NODEID_NUMERIC(0, parentid), UA_NODEID_NULL,
|
|
|
|
- UA_QUALIFIEDNAME(0, name), attr, NULL, NULL);
|
|
|
|
|
|
+ return AddNode_finish(server, &adminSession, &sourceId);
|
|
}
|
|
}
|
|
|
|
|
|
static UA_StatusCode
|
|
static UA_StatusCode
|
|
@@ -80,11 +48,11 @@ addObjectNode(UA_Server *server, char* name, UA_UInt32 objectid,
|
|
UA_ObjectAttributes object_attr = UA_ObjectAttributes_default;
|
|
UA_ObjectAttributes object_attr = UA_ObjectAttributes_default;
|
|
object_attr.displayName = UA_LOCALIZEDTEXT("", name);
|
|
object_attr.displayName = UA_LOCALIZEDTEXT("", name);
|
|
return UA_Server_addObjectNode(server, UA_NODEID_NUMERIC(0, objectid),
|
|
return UA_Server_addObjectNode(server, UA_NODEID_NUMERIC(0, objectid),
|
|
- UA_NODEID_NUMERIC(0, parentid),
|
|
|
|
- UA_NODEID_NUMERIC(0, referenceid),
|
|
|
|
- UA_QUALIFIEDNAME(0, name),
|
|
|
|
- UA_NODEID_NUMERIC(0, type_id),
|
|
|
|
- object_attr, NULL, NULL);
|
|
|
|
|
|
+ UA_NODEID_NUMERIC(0, parentid),
|
|
|
|
+ UA_NODEID_NUMERIC(0, referenceid),
|
|
|
|
+ UA_QUALIFIEDNAME(0, name),
|
|
|
|
+ UA_NODEID_NUMERIC(0, type_id),
|
|
|
|
+ object_attr, NULL, NULL);
|
|
}
|
|
}
|
|
|
|
|
|
static UA_StatusCode
|
|
static UA_StatusCode
|
|
@@ -101,68 +69,38 @@ addReferenceTypeNode(UA_Server *server, char* name, char *inverseName, UA_UInt32
|
|
UA_QUALIFIEDNAME(0, name), reference_attr, NULL, NULL);
|
|
UA_QUALIFIEDNAME(0, name), reference_attr, NULL, NULL);
|
|
}
|
|
}
|
|
|
|
|
|
-static UA_StatusCode
|
|
|
|
-addVariableTypeNode(UA_Server *server, char* name, UA_UInt32 variabletypeid,
|
|
|
|
- UA_Boolean isAbstract, UA_Int32 valueRank, UA_UInt32 dataType,
|
|
|
|
- const UA_DataType *type, UA_UInt32 parentid) {
|
|
|
|
- UA_VariableTypeAttributes attr = UA_VariableTypeAttributes_default;
|
|
|
|
- attr.displayName = UA_LOCALIZEDTEXT("", name);
|
|
|
|
- attr.dataType = UA_NODEID_NUMERIC(0, dataType);
|
|
|
|
- attr.isAbstract = isAbstract;
|
|
|
|
- attr.valueRank = valueRank;
|
|
|
|
-
|
|
|
|
- if(type) {
|
|
|
|
- UA_STACKARRAY(UA_Byte, tempVal, type->memSize);
|
|
|
|
- UA_init(tempVal, type);
|
|
|
|
- UA_Variant_setScalar(&attr.value, tempVal, type);
|
|
|
|
- return UA_Server_addVariableTypeNode(server, UA_NODEID_NUMERIC(0, variabletypeid),
|
|
|
|
- UA_NODEID_NUMERIC(0, parentid), UA_NODEID_NULL,
|
|
|
|
- UA_QUALIFIEDNAME(0, name), UA_NODEID_NULL, attr, NULL, NULL);
|
|
|
|
- }
|
|
|
|
- return UA_Server_addVariableTypeNode(server, UA_NODEID_NUMERIC(0, variabletypeid),
|
|
|
|
- UA_NODEID_NUMERIC(0, parentid), UA_NODEID_NULL,
|
|
|
|
- UA_QUALIFIEDNAME(0, name), UA_NODEID_NULL, attr, NULL, NULL);
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-/**********************/
|
|
|
|
-/* Create Namespace 0 */
|
|
|
|
-/**********************/
|
|
|
|
|
|
+/***************************/
|
|
|
|
+/* Bootstrap NS0 hierarchy */
|
|
|
|
+/***************************/
|
|
|
|
|
|
/* Creates the basic nodes which are expected by the nodeset compiler to be
|
|
/* Creates the basic nodes which are expected by the nodeset compiler to be
|
|
* already created. This is necessary to reduce the dependencies for the nodeset
|
|
* already created. This is necessary to reduce the dependencies for the nodeset
|
|
* compiler. */
|
|
* compiler. */
|
|
static UA_StatusCode
|
|
static UA_StatusCode
|
|
UA_Server_createNS0_base(UA_Server *server) {
|
|
UA_Server_createNS0_base(UA_Server *server) {
|
|
-
|
|
|
|
- UA_StatusCode ret = UA_STATUSCODE_GOOD;
|
|
|
|
- /*********************************/
|
|
|
|
- /* Bootstrap reference hierarchy */
|
|
|
|
- /*********************************/
|
|
|
|
-
|
|
|
|
/* Bootstrap References and HasSubtype */
|
|
/* Bootstrap References and HasSubtype */
|
|
|
|
+ UA_StatusCode ret = UA_STATUSCODE_GOOD;
|
|
UA_ReferenceTypeAttributes references_attr = UA_ReferenceTypeAttributes_default;
|
|
UA_ReferenceTypeAttributes references_attr = UA_ReferenceTypeAttributes_default;
|
|
references_attr.displayName = UA_LOCALIZEDTEXT("", "References");
|
|
references_attr.displayName = UA_LOCALIZEDTEXT("", "References");
|
|
references_attr.isAbstract = true;
|
|
references_attr.isAbstract = true;
|
|
references_attr.symmetric = true;
|
|
references_attr.symmetric = true;
|
|
references_attr.inverseName = UA_LOCALIZEDTEXT("", "References");
|
|
references_attr.inverseName = UA_LOCALIZEDTEXT("", "References");
|
|
- ret |= addNode_begin(server, UA_NODECLASS_REFERENCETYPE, UA_NS0ID_REFERENCES, "References",
|
|
|
|
- &references_attr, &UA_TYPES[UA_TYPES_REFERENCETYPEATTRIBUTES]);
|
|
|
|
|
|
+ ret |= addNode_raw(server, UA_NODECLASS_REFERENCETYPE, UA_NS0ID_REFERENCES, "References",
|
|
|
|
+ &references_attr, &UA_TYPES[UA_TYPES_REFERENCETYPEATTRIBUTES]);
|
|
|
|
|
|
UA_ReferenceTypeAttributes hassubtype_attr = UA_ReferenceTypeAttributes_default;
|
|
UA_ReferenceTypeAttributes hassubtype_attr = UA_ReferenceTypeAttributes_default;
|
|
hassubtype_attr.displayName = UA_LOCALIZEDTEXT("", "HasSubtype");
|
|
hassubtype_attr.displayName = UA_LOCALIZEDTEXT("", "HasSubtype");
|
|
hassubtype_attr.isAbstract = false;
|
|
hassubtype_attr.isAbstract = false;
|
|
hassubtype_attr.symmetric = false;
|
|
hassubtype_attr.symmetric = false;
|
|
hassubtype_attr.inverseName = UA_LOCALIZEDTEXT("", "HasSupertype");
|
|
hassubtype_attr.inverseName = UA_LOCALIZEDTEXT("", "HasSupertype");
|
|
- ret |= addNode_begin(server, UA_NODECLASS_REFERENCETYPE, UA_NS0ID_HASSUBTYPE, "HasSubtype",
|
|
|
|
- &hassubtype_attr, &UA_TYPES[UA_TYPES_REFERENCETYPEATTRIBUTES]);
|
|
|
|
|
|
+ ret |= addNode_raw(server, UA_NODECLASS_REFERENCETYPE, UA_NS0ID_HASSUBTYPE, "HasSubtype",
|
|
|
|
+ &hassubtype_attr, &UA_TYPES[UA_TYPES_REFERENCETYPEATTRIBUTES]);
|
|
|
|
|
|
ret |= addReferenceTypeNode(server, "HierarchicalReferences", NULL,
|
|
ret |= addReferenceTypeNode(server, "HierarchicalReferences", NULL,
|
|
- UA_NS0ID_HIERARCHICALREFERENCES,
|
|
|
|
- true, false, UA_NS0ID_REFERENCES);
|
|
|
|
|
|
+ UA_NS0ID_HIERARCHICALREFERENCES, true, false, UA_NS0ID_REFERENCES);
|
|
|
|
|
|
ret |= addReferenceTypeNode(server, "NonHierarchicalReferences", NULL,
|
|
ret |= addReferenceTypeNode(server, "NonHierarchicalReferences", NULL,
|
|
- UA_NS0ID_NONHIERARCHICALREFERENCES,
|
|
|
|
- true, false, UA_NS0ID_REFERENCES);
|
|
|
|
|
|
+ UA_NS0ID_NONHIERARCHICALREFERENCES, true, false, UA_NS0ID_REFERENCES);
|
|
|
|
|
|
ret |= addReferenceTypeNode(server, "HasChild", NULL, UA_NS0ID_HASCHILD,
|
|
ret |= addReferenceTypeNode(server, "HasChild", NULL, UA_NS0ID_HASCHILD,
|
|
true, false, UA_NS0ID_HIERARCHICALREFERENCES);
|
|
true, false, UA_NS0ID_HIERARCHICALREFERENCES);
|
|
@@ -214,68 +152,45 @@ UA_Server_createNS0_base(UA_Server *server) {
|
|
UA_DataTypeAttributes basedatatype_attr = UA_DataTypeAttributes_default;
|
|
UA_DataTypeAttributes basedatatype_attr = UA_DataTypeAttributes_default;
|
|
basedatatype_attr.displayName = UA_LOCALIZEDTEXT("", "BaseDataType");
|
|
basedatatype_attr.displayName = UA_LOCALIZEDTEXT("", "BaseDataType");
|
|
basedatatype_attr.isAbstract = true;
|
|
basedatatype_attr.isAbstract = true;
|
|
- ret |= addNode_begin(server, UA_NODECLASS_DATATYPE, UA_NS0ID_BASEDATATYPE, "BaseDataType",
|
|
|
|
- &basedatatype_attr, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES]);
|
|
|
|
-
|
|
|
|
- ret |= addDataTypeNode(server, "Number", UA_NS0ID_NUMBER, true, UA_NS0ID_BASEDATATYPE);
|
|
|
|
- ret |= addDataTypeNode(server, "Integer", UA_NS0ID_INTEGER, true, UA_NS0ID_NUMBER);
|
|
|
|
- ret |= addDataTypeNode(server, "UInteger", UA_NS0ID_UINTEGER, true, UA_NS0ID_NUMBER);
|
|
|
|
- ret |= addDataTypeNode(server, "Boolean", UA_NS0ID_BOOLEAN, false, UA_NS0ID_BASEDATATYPE);
|
|
|
|
- ret |= addDataTypeNode(server, "SByte", UA_NS0ID_SBYTE, false, UA_NS0ID_INTEGER);
|
|
|
|
- ret |= addDataTypeNode(server, "Byte", UA_NS0ID_BYTE, false, UA_NS0ID_UINTEGER);
|
|
|
|
- ret |= addDataTypeNode(server, "Int16", UA_NS0ID_INT16, false, UA_NS0ID_INTEGER);
|
|
|
|
- ret |= addDataTypeNode(server, "UInt16", UA_NS0ID_UINT16, false, UA_NS0ID_UINTEGER);
|
|
|
|
- ret |= addDataTypeNode(server, "Int32", UA_NS0ID_INT32, false, UA_NS0ID_INTEGER);
|
|
|
|
- ret |= addDataTypeNode(server, "UInt32", UA_NS0ID_UINT32, false, UA_NS0ID_UINTEGER);
|
|
|
|
- ret |= addDataTypeNode(server, "Int64", UA_NS0ID_INT64, false, UA_NS0ID_INTEGER);
|
|
|
|
- ret |= addDataTypeNode(server, "UInt64", UA_NS0ID_UINT64, false, UA_NS0ID_UINTEGER);
|
|
|
|
- ret |= addDataTypeNode(server, "Float", UA_NS0ID_FLOAT, false, UA_NS0ID_NUMBER);
|
|
|
|
- ret |= addDataTypeNode(server, "Double", UA_NS0ID_DOUBLE, false, UA_NS0ID_NUMBER);
|
|
|
|
- ret |= addDataTypeNode(server, "DateTime", UA_NS0ID_DATETIME, false, UA_NS0ID_BASEDATATYPE);
|
|
|
|
- ret |= addDataTypeNode(server, "String", UA_NS0ID_STRING, false, UA_NS0ID_BASEDATATYPE);
|
|
|
|
- ret |= addDataTypeNode(server, "ByteString", UA_NS0ID_BYTESTRING, false, UA_NS0ID_BASEDATATYPE);
|
|
|
|
- ret |= addDataTypeNode(server, "Guid", UA_NS0ID_GUID, false, UA_NS0ID_BASEDATATYPE);
|
|
|
|
- ret |= addDataTypeNode(server, "XmlElement", UA_NS0ID_XMLELEMENT, false, UA_NS0ID_BASEDATATYPE);
|
|
|
|
- ret |= addDataTypeNode(server, "NodeId", UA_NS0ID_NODEID, false, UA_NS0ID_BASEDATATYPE);
|
|
|
|
- ret |= addDataTypeNode(server, "ExpandedNodeId", UA_NS0ID_EXPANDEDNODEID, false, UA_NS0ID_BASEDATATYPE);
|
|
|
|
- ret |= addDataTypeNode(server, "QualifiedName", UA_NS0ID_QUALIFIEDNAME, false, UA_NS0ID_BASEDATATYPE);
|
|
|
|
- ret |= addDataTypeNode(server, "LocalizedText", UA_NS0ID_LOCALIZEDTEXT, false, UA_NS0ID_BASEDATATYPE);
|
|
|
|
- ret |= addDataTypeNode(server, "StatusCode", UA_NS0ID_STATUSCODE, false, UA_NS0ID_BASEDATATYPE);
|
|
|
|
- ret |= addDataTypeNode(server, "Structure", UA_NS0ID_STRUCTURE, true, UA_NS0ID_BASEDATATYPE);
|
|
|
|
- ret |= addDataTypeNode(server, "Decimal", UA_NS0ID_DECIMAL, false, UA_NS0ID_NUMBER);
|
|
|
|
-
|
|
|
|
- ret |= addDataTypeNode(server, "Duration", UA_NS0ID_DURATION, false, UA_NS0ID_DOUBLE);
|
|
|
|
- ret |= addDataTypeNode(server, "UtcTime", UA_NS0ID_UTCTIME, false, UA_NS0ID_DATETIME);
|
|
|
|
- ret |= addDataTypeNode(server, "LocaleId", UA_NS0ID_LOCALEID, false, UA_NS0ID_STRING);
|
|
|
|
|
|
+ ret |= addNode_raw(server, UA_NODECLASS_DATATYPE, UA_NS0ID_BASEDATATYPE, "BaseDataType",
|
|
|
|
+ &basedatatype_attr, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES]);
|
|
|
|
|
|
/*****************/
|
|
/*****************/
|
|
/* VariableTypes */
|
|
/* VariableTypes */
|
|
/*****************/
|
|
/*****************/
|
|
|
|
|
|
- /* Bootstrap BaseVariableType */
|
|
|
|
UA_VariableTypeAttributes basevar_attr = UA_VariableTypeAttributes_default;
|
|
UA_VariableTypeAttributes basevar_attr = UA_VariableTypeAttributes_default;
|
|
basevar_attr.displayName = UA_LOCALIZEDTEXT("", "BaseVariableType");
|
|
basevar_attr.displayName = UA_LOCALIZEDTEXT("", "BaseVariableType");
|
|
basevar_attr.isAbstract = true;
|
|
basevar_attr.isAbstract = true;
|
|
basevar_attr.valueRank = -2;
|
|
basevar_attr.valueRank = -2;
|
|
basevar_attr.dataType = UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATATYPE);
|
|
basevar_attr.dataType = UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATATYPE);
|
|
- ret |= addNode_begin(server, UA_NODECLASS_VARIABLETYPE, UA_NS0ID_BASEVARIABLETYPE, "BaseVariableType",
|
|
|
|
- &basevar_attr, &UA_TYPES[UA_TYPES_VARIABLETYPEATTRIBUTES]);
|
|
|
|
-
|
|
|
|
- ret |= addVariableTypeNode(server, "BaseDataVariableType", UA_NS0ID_BASEDATAVARIABLETYPE,
|
|
|
|
- false, -2, UA_NS0ID_BASEDATATYPE, NULL, UA_NS0ID_BASEVARIABLETYPE);
|
|
|
|
|
|
+ ret |= addNode_raw(server, UA_NODECLASS_VARIABLETYPE, UA_NS0ID_BASEVARIABLETYPE, "BaseVariableType",
|
|
|
|
+ &basevar_attr, &UA_TYPES[UA_TYPES_VARIABLETYPEATTRIBUTES]);
|
|
|
|
+
|
|
|
|
+ UA_VariableTypeAttributes bdv_attr = UA_VariableTypeAttributes_default;
|
|
|
|
+ bdv_attr.displayName = UA_LOCALIZEDTEXT("", "BaseDataVariableType");
|
|
|
|
+ bdv_attr.dataType = UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATATYPE);
|
|
|
|
+ bdv_attr.valueRank = -2;
|
|
|
|
+ ret |= UA_Server_addVariableTypeNode(server, UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE),
|
|
|
|
+ UA_NODEID_NUMERIC(0, UA_NS0ID_BASEVARIABLETYPE),
|
|
|
|
+ UA_NODEID_NULL, UA_QUALIFIEDNAME(0, "BaseDataVariableType"),
|
|
|
|
+ UA_NODEID_NULL, bdv_attr, NULL, NULL);
|
|
|
|
|
|
/***************/
|
|
/***************/
|
|
/* ObjectTypes */
|
|
/* ObjectTypes */
|
|
/***************/
|
|
/***************/
|
|
|
|
|
|
- /* Bootstrap BaseObjectType */
|
|
|
|
UA_ObjectTypeAttributes baseobj_attr = UA_ObjectTypeAttributes_default;
|
|
UA_ObjectTypeAttributes baseobj_attr = UA_ObjectTypeAttributes_default;
|
|
baseobj_attr.displayName = UA_LOCALIZEDTEXT("", "BaseObjectType");
|
|
baseobj_attr.displayName = UA_LOCALIZEDTEXT("", "BaseObjectType");
|
|
- ret |= addNode_begin(server, UA_NODECLASS_OBJECTTYPE, UA_NS0ID_BASEOBJECTTYPE, "BaseObjectType",
|
|
|
|
- &baseobj_attr, &UA_TYPES[UA_TYPES_OBJECTTYPEATTRIBUTES]);
|
|
|
|
|
|
+ ret |= addNode_raw(server, UA_NODECLASS_OBJECTTYPE, UA_NS0ID_BASEOBJECTTYPE, "BaseObjectType",
|
|
|
|
+ &baseobj_attr, &UA_TYPES[UA_TYPES_OBJECTTYPEATTRIBUTES]);
|
|
|
|
|
|
- ret |= addObjectTypeNode(server, "FolderType", UA_NS0ID_FOLDERTYPE,
|
|
|
|
- false, UA_NS0ID_BASEOBJECTTYPE);
|
|
|
|
|
|
+ UA_ObjectTypeAttributes folder_attr = UA_ObjectTypeAttributes_default;
|
|
|
|
+ folder_attr.displayName = UA_LOCALIZEDTEXT("", "FolderType");
|
|
|
|
+ ret |= UA_Server_addObjectTypeNode(server, UA_NODEID_NUMERIC(0, UA_NS0ID_FOLDERTYPE),
|
|
|
|
+ UA_NODEID_NUMERIC(0, UA_NS0ID_BASEOBJECTTYPE),
|
|
|
|
+ UA_NODEID_NULL, UA_QUALIFIEDNAME(0, "FolderType"),
|
|
|
|
+ folder_attr, NULL, NULL);
|
|
|
|
|
|
/******************/
|
|
/******************/
|
|
/* Root and below */
|
|
/* Root and below */
|
|
@@ -296,13 +211,11 @@ UA_Server_createNS0_base(UA_Server *server) {
|
|
|
|
|
|
ret |= addObjectNode(server, "DataTypes", UA_NS0ID_DATATYPESFOLDER, UA_NS0ID_TYPESFOLDER,
|
|
ret |= addObjectNode(server, "DataTypes", UA_NS0ID_DATATYPESFOLDER, UA_NS0ID_TYPESFOLDER,
|
|
UA_NS0ID_ORGANIZES, UA_NS0ID_FOLDERTYPE);
|
|
UA_NS0ID_ORGANIZES, UA_NS0ID_FOLDERTYPE);
|
|
-
|
|
|
|
ret |= addNode_finish(server, UA_NS0ID_BASEDATATYPE, UA_NS0ID_DATATYPESFOLDER,
|
|
ret |= addNode_finish(server, UA_NS0ID_BASEDATATYPE, UA_NS0ID_DATATYPESFOLDER,
|
|
UA_NS0ID_ORGANIZES);
|
|
UA_NS0ID_ORGANIZES);
|
|
|
|
|
|
ret |= addObjectNode(server, "VariableTypes", UA_NS0ID_VARIABLETYPESFOLDER, UA_NS0ID_TYPESFOLDER,
|
|
ret |= addObjectNode(server, "VariableTypes", UA_NS0ID_VARIABLETYPESFOLDER, UA_NS0ID_TYPESFOLDER,
|
|
UA_NS0ID_ORGANIZES, UA_NS0ID_FOLDERTYPE);
|
|
UA_NS0ID_ORGANIZES, UA_NS0ID_FOLDERTYPE);
|
|
-
|
|
|
|
ret |= addNode_finish(server, UA_NS0ID_BASEVARIABLETYPE, UA_NS0ID_VARIABLETYPESFOLDER,
|
|
ret |= addNode_finish(server, UA_NS0ID_BASEVARIABLETYPE, UA_NS0ID_VARIABLETYPESFOLDER,
|
|
UA_NS0ID_ORGANIZES);
|
|
UA_NS0ID_ORGANIZES);
|
|
|
|
|
|
@@ -318,8 +231,9 @@ UA_Server_createNS0_base(UA_Server *server) {
|
|
UA_NS0ID_ORGANIZES, UA_NS0ID_FOLDERTYPE);
|
|
UA_NS0ID_ORGANIZES, UA_NS0ID_FOLDERTYPE);
|
|
|
|
|
|
if(ret != UA_STATUSCODE_GOOD)
|
|
if(ret != UA_STATUSCODE_GOOD)
|
|
- return UA_STATUSCODE_BADINTERNALERROR;
|
|
|
|
- return UA_STATUSCODE_GOOD;
|
|
|
|
|
|
+ ret = UA_STATUSCODE_BADINTERNALERROR;
|
|
|
|
+
|
|
|
|
+ return ret;
|
|
}
|
|
}
|
|
|
|
|
|
/****************/
|
|
/****************/
|
|
@@ -356,6 +270,7 @@ readStatus(UA_Server *server, const UA_NodeId *sessionId, void *sessionContext,
|
|
return UA_STATUSCODE_GOOD;
|
|
return UA_STATUSCODE_GOOD;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+#ifdef UA_GENERATED_NAMESPACE_ZERO
|
|
static UA_StatusCode
|
|
static UA_StatusCode
|
|
readServiceLevel(UA_Server *server, const UA_NodeId *sessionId, void *sessionContext,
|
|
readServiceLevel(UA_Server *server, const UA_NodeId *sessionId, void *sessionContext,
|
|
const UA_NodeId *nodeId, void *nodeContext, UA_Boolean includeSourceTimeStamp,
|
|
const UA_NodeId *nodeId, void *nodeContext, UA_Boolean includeSourceTimeStamp,
|
|
@@ -405,6 +320,7 @@ readAuditing(UA_Server *server, const UA_NodeId *sessionId, void *sessionContext
|
|
}
|
|
}
|
|
return UA_STATUSCODE_GOOD;
|
|
return UA_STATUSCODE_GOOD;
|
|
}
|
|
}
|
|
|
|
+#endif
|
|
|
|
|
|
static UA_StatusCode
|
|
static UA_StatusCode
|
|
readNamespaces(UA_Server *server, const UA_NodeId *sessionId, void *sessionContext,
|
|
readNamespaces(UA_Server *server, const UA_NodeId *sessionId, void *sessionContext,
|
|
@@ -487,7 +403,7 @@ readCurrentTime(UA_Server *server, const UA_NodeId *sessionId, void *sessionCont
|
|
return UA_STATUSCODE_GOOD;
|
|
return UA_STATUSCODE_GOOD;
|
|
}
|
|
}
|
|
|
|
|
|
-#if defined(UA_ENABLE_METHODCALLS) && defined(UA_ENABLE_SUBSCRIPTIONS)
|
|
|
|
|
|
+#if defined(UA_GENERATED_NAMESPACE_ZERO) && defined(UA_ENABLE_METHODCALLS) && defined(UA_ENABLE_SUBSCRIPTIONS)
|
|
static UA_StatusCode
|
|
static UA_StatusCode
|
|
readMonitoredItems(UA_Server *server, const UA_NodeId *sessionId, void *sessionContext,
|
|
readMonitoredItems(UA_Server *server, const UA_NodeId *sessionId, void *sessionContext,
|
|
const UA_NodeId *methodId, void *methodContext, const UA_NodeId *objectId,
|
|
const UA_NodeId *methodId, void *methodContext, const UA_NodeId *objectId,
|
|
@@ -543,6 +459,85 @@ writeNs0VariableArray(UA_Server *server, UA_UInt32 id, void *v,
|
|
return UA_Server_writeValue(server, UA_NODEID_NUMERIC(0, id), var);
|
|
return UA_Server_writeValue(server, UA_NODEID_NUMERIC(0, id), var);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+#ifndef UA_GENERATED_NAMESPACE_ZERO
|
|
|
|
+static UA_StatusCode
|
|
|
|
+addVariableNode(UA_Server *server, char* name, UA_UInt32 variableid,
|
|
|
|
+ UA_UInt32 parentid, UA_UInt32 referenceid,
|
|
|
|
+ UA_Int32 valueRank, UA_UInt32 dataType) {
|
|
|
|
+ UA_VariableAttributes attr = UA_VariableAttributes_default;
|
|
|
|
+ attr.displayName = UA_LOCALIZEDTEXT("", name);
|
|
|
|
+ attr.dataType = UA_NODEID_NUMERIC(0, dataType);
|
|
|
|
+ attr.valueRank = valueRank;
|
|
|
|
+ attr.accessLevel = UA_ACCESSLEVELMASK_READ;
|
|
|
|
+ return UA_Server_addVariableNode(server, UA_NODEID_NUMERIC(0, variableid),
|
|
|
|
+ UA_NODEID_NUMERIC(0, parentid), UA_NODEID_NUMERIC(0, referenceid),
|
|
|
|
+ UA_QUALIFIEDNAME(0, name),
|
|
|
|
+ UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE),
|
|
|
|
+ attr, NULL, NULL);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+/* A minimal server object that is not complete and does not use the mandated
|
|
|
|
+ * references to a server type. To be used on very constrained devices. */
|
|
|
|
+static UA_StatusCode
|
|
|
|
+UA_Server_minimalServerObject(UA_Server *server) {
|
|
|
|
+ /* Server */
|
|
|
|
+ UA_StatusCode retval = addObjectNode(server, "Server", UA_NS0ID_SERVER, UA_NS0ID_OBJECTSFOLDER,
|
|
|
|
+ UA_NS0ID_ORGANIZES, UA_NS0ID_BASEOBJECTTYPE);
|
|
|
|
+
|
|
|
|
+ retval |= addVariableNode(server, "ServerArray", UA_NS0ID_SERVER_SERVERARRAY,
|
|
|
|
+ UA_NS0ID_SERVER, UA_NS0ID_HASPROPERTY, 1, UA_NS0ID_BASEDATATYPE);
|
|
|
|
+
|
|
|
|
+ retval |= addVariableNode(server, "NamespaceArray", UA_NS0ID_SERVER_NAMESPACEARRAY,
|
|
|
|
+ UA_NS0ID_SERVER, UA_NS0ID_HASPROPERTY, 1, UA_NS0ID_BASEDATATYPE);
|
|
|
|
+
|
|
|
|
+ retval |= addVariableNode(server, "ServerStatus", UA_NS0ID_SERVER_SERVERSTATUS,
|
|
|
|
+ UA_NS0ID_SERVER, UA_NS0ID_HASCOMPONENT, -1, UA_NS0ID_BASEDATATYPE);
|
|
|
|
+
|
|
|
|
+ retval |= addVariableNode(server, "CurrentTime", UA_NS0ID_SERVER_SERVERSTATUS_CURRENTTIME,
|
|
|
|
+ UA_NS0ID_SERVER_SERVERSTATUS, UA_NS0ID_HASCOMPONENT, -1,
|
|
|
|
+ UA_NS0ID_BASEDATATYPE);
|
|
|
|
+
|
|
|
|
+ retval |= addVariableNode(server, "State", UA_NS0ID_SERVER_SERVERSTATUS_STATE,
|
|
|
|
+ UA_NS0ID_SERVER_SERVERSTATUS, UA_NS0ID_HASCOMPONENT, -1,
|
|
|
|
+ UA_NS0ID_BASEDATATYPE);
|
|
|
|
+
|
|
|
|
+ retval |= addVariableNode(server, "BuildInfo", UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO,
|
|
|
|
+ UA_NS0ID_SERVER_SERVERSTATUS, UA_NS0ID_HASCOMPONENT, -1,
|
|
|
|
+ UA_NS0ID_BASEDATATYPE);
|
|
|
|
+
|
|
|
|
+ retval |= addVariableNode(server, "ProductUri", UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO_PRODUCTURI,
|
|
|
|
+ UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO, UA_NS0ID_HASCOMPONENT, -1,
|
|
|
|
+ UA_NS0ID_BASEDATATYPE);
|
|
|
|
+
|
|
|
|
+ retval |= addVariableNode(server, "ManufacturerName",
|
|
|
|
+ UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO_MANUFACTURERNAME,
|
|
|
|
+ UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO, UA_NS0ID_HASCOMPONENT, -1,
|
|
|
|
+ UA_NS0ID_BASEDATATYPE);
|
|
|
|
+
|
|
|
|
+ retval |= addVariableNode(server, "ProductName",
|
|
|
|
+ UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO_PRODUCTNAME,
|
|
|
|
+ UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO, UA_NS0ID_HASCOMPONENT, -1,
|
|
|
|
+ UA_NS0ID_BASEDATATYPE);
|
|
|
|
+
|
|
|
|
+ retval |= addVariableNode(server, "SoftwareVersion",
|
|
|
|
+ UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO_SOFTWAREVERSION,
|
|
|
|
+ UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO, UA_NS0ID_HASCOMPONENT, -1,
|
|
|
|
+ UA_NS0ID_BASEDATATYPE);
|
|
|
|
+
|
|
|
|
+ retval |= addVariableNode(server, "BuildNumber",
|
|
|
|
+ UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO_BUILDNUMBER,
|
|
|
|
+ UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO, UA_NS0ID_HASCOMPONENT, -1,
|
|
|
|
+ UA_NS0ID_BASEDATATYPE);
|
|
|
|
+
|
|
|
|
+ retval |= addVariableNode(server, "BuildDate",
|
|
|
|
+ UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO_BUILDDATE,
|
|
|
|
+ UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO, UA_NS0ID_HASCOMPONENT, -1,
|
|
|
|
+ UA_NS0ID_BASEDATATYPE);
|
|
|
|
+
|
|
|
|
+ return retval;
|
|
|
|
+}
|
|
|
|
+#endif
|
|
|
|
+
|
|
/* Initialize the nodeset 0 by using the generated code of the nodeset compiler.
|
|
/* Initialize the nodeset 0 by using the generated code of the nodeset compiler.
|
|
* This also initialized the data sources for various variables, such as for
|
|
* This also initialized the data sources for various variables, such as for
|
|
* example server time. */
|
|
* example server time. */
|
|
@@ -557,15 +552,18 @@ UA_Server_initNS0(UA_Server *server) {
|
|
if(retVal != UA_STATUSCODE_GOOD)
|
|
if(retVal != UA_STATUSCODE_GOOD)
|
|
return retVal;
|
|
return retVal;
|
|
|
|
|
|
|
|
+#ifdef UA_GENERATED_NAMESPACE_ZERO
|
|
/* Load nodes and references generated from the XML ns0 definition */
|
|
/* Load nodes and references generated from the XML ns0 definition */
|
|
- server->bootstrapNS0 = true;
|
|
|
|
retVal = ua_namespace0(server);
|
|
retVal = ua_namespace0(server);
|
|
- server->bootstrapNS0 = false;
|
|
|
|
|
|
+#else
|
|
|
|
+ /* Create a minimal server object */
|
|
|
|
+ UA_Server_minimalServerObject(server);
|
|
|
|
+#endif
|
|
|
|
|
|
/* NamespaceArray */
|
|
/* NamespaceArray */
|
|
- UA_DataSource namespaceDataSource = {readNamespaces, NULL};
|
|
|
|
|
|
+ UA_DataSource namespaceDataSource = {readNamespaces, writeNamespaces};
|
|
retVal |= UA_Server_setVariableNode_dataSource(server,
|
|
retVal |= UA_Server_setVariableNode_dataSource(server,
|
|
- UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_NAMESPACEARRAY),
|
|
|
|
|
|
+ UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_NAMESPACEARRAY),
|
|
namespaceDataSource);
|
|
namespaceDataSource);
|
|
|
|
|
|
/* ServerArray */
|
|
/* ServerArray */
|
|
@@ -573,66 +571,10 @@ UA_Server_initNS0(UA_Server *server) {
|
|
&server->config.applicationDescription.applicationUri,
|
|
&server->config.applicationDescription.applicationUri,
|
|
1, &UA_TYPES[UA_TYPES_STRING]);
|
|
1, &UA_TYPES[UA_TYPES_STRING]);
|
|
|
|
|
|
- /* LocaleIdArray */
|
|
|
|
- UA_LocaleId locale_en = UA_STRING("en");
|
|
|
|
- retVal |= writeNs0VariableArray(server, UA_NS0ID_SERVER_SERVERCAPABILITIES_LOCALEIDARRAY,
|
|
|
|
- &locale_en, 1, &UA_TYPES[UA_TYPES_LOCALEID]);
|
|
|
|
-
|
|
|
|
- /* MaxBrowseContinuationPoints */
|
|
|
|
- UA_UInt16 maxBrowseContinuationPoints = UA_MAXCONTINUATIONPOINTS;
|
|
|
|
- retVal |= writeNs0Variable(server, UA_NS0ID_SERVER_SERVERCAPABILITIES_MAXBROWSECONTINUATIONPOINTS,
|
|
|
|
- &maxBrowseContinuationPoints, &UA_TYPES[UA_TYPES_UINT16]);
|
|
|
|
-
|
|
|
|
- /* ServerProfileArray */
|
|
|
|
- UA_String profileArray[5];
|
|
|
|
- UA_UInt16 profileArraySize = 0;
|
|
|
|
-#define ADDPROFILEARRAY(x) profileArray[profileArraySize++] = UA_STRING_ALLOC(x)
|
|
|
|
- ADDPROFILEARRAY("http://opcfoundation.org/UA-Profile/Server/NanoEmbeddedDevice");
|
|
|
|
-#ifdef UA_ENABLE_NODEMANAGEMENT
|
|
|
|
- ADDPROFILEARRAY("http://opcfoundation.org/UA-Profile/Server/NodeManagement");
|
|
|
|
-#endif
|
|
|
|
-#ifdef UA_ENABLE_METHODCALLS
|
|
|
|
- ADDPROFILEARRAY("http://opcfoundation.org/UA-Profile/Server/Methods");
|
|
|
|
-#endif
|
|
|
|
-#ifdef UA_ENABLE_SUBSCRIPTIONS
|
|
|
|
- ADDPROFILEARRAY("http://opcfoundation.org/UA-Profile/Server/EmbeddedDataChangeSubscription");
|
|
|
|
-#endif
|
|
|
|
-#ifdef UA_ENABLE_HISTORIZING
|
|
|
|
- ADDPROFILEARRAY("http://opcfoundation.org/UA-Profile/Server/HistoricalRawData");
|
|
|
|
-#endif
|
|
|
|
-
|
|
|
|
- retVal |= writeNs0VariableArray(server, UA_NS0ID_SERVER_SERVERCAPABILITIES_SERVERPROFILEARRAY,
|
|
|
|
- profileArray, profileArraySize, &UA_TYPES[UA_TYPES_STRING]);
|
|
|
|
- for(int i=0; i<profileArraySize; i++) {
|
|
|
|
- UA_String_deleteMembers(&profileArray[i]);
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- /* MaxQueryContinuationPoints */
|
|
|
|
- UA_UInt16 maxQueryContinuationPoints = 0;
|
|
|
|
- retVal |= writeNs0Variable(server, UA_NS0ID_SERVER_SERVERCAPABILITIES_MAXQUERYCONTINUATIONPOINTS,
|
|
|
|
- &maxQueryContinuationPoints, &UA_TYPES[UA_TYPES_UINT16]);
|
|
|
|
-
|
|
|
|
- /* MaxHistoryContinuationPoints */
|
|
|
|
- UA_UInt16 maxHistoryContinuationPoints = 0;
|
|
|
|
- retVal |= writeNs0Variable(server, UA_NS0ID_SERVER_SERVERCAPABILITIES_MAXHISTORYCONTINUATIONPOINTS,
|
|
|
|
- &maxHistoryContinuationPoints, &UA_TYPES[UA_TYPES_UINT16]);
|
|
|
|
-
|
|
|
|
/* MinSupportedSampleRate */
|
|
/* MinSupportedSampleRate */
|
|
retVal |= writeNs0Variable(server, UA_NS0ID_SERVER_SERVERCAPABILITIES_MINSUPPORTEDSAMPLERATE,
|
|
retVal |= writeNs0Variable(server, UA_NS0ID_SERVER_SERVERCAPABILITIES_MINSUPPORTEDSAMPLERATE,
|
|
&server->config.samplingIntervalLimits.min, &UA_TYPES[UA_TYPES_DURATION]);
|
|
&server->config.samplingIntervalLimits.min, &UA_TYPES[UA_TYPES_DURATION]);
|
|
|
|
|
|
- /* ServerDiagnostics - ServerDiagnosticsSummary */
|
|
|
|
- UA_ServerDiagnosticsSummaryDataType serverDiagnosticsSummary;
|
|
|
|
- UA_ServerDiagnosticsSummaryDataType_init(&serverDiagnosticsSummary);
|
|
|
|
- retVal |= writeNs0Variable(server, UA_NS0ID_SERVER_SERVERDIAGNOSTICS_SERVERDIAGNOSTICSSUMMARY,
|
|
|
|
- &serverDiagnosticsSummary,
|
|
|
|
- &UA_TYPES[UA_TYPES_SERVERDIAGNOSTICSSUMMARYDATATYPE]);
|
|
|
|
-
|
|
|
|
- /* ServerDiagnostics - EnabledFlag */
|
|
|
|
- UA_Boolean enabledFlag = false;
|
|
|
|
- retVal |= writeNs0Variable(server, UA_NS0ID_SERVER_SERVERDIAGNOSTICS_ENABLEDFLAG,
|
|
|
|
- &enabledFlag, &UA_TYPES[UA_TYPES_BOOLEAN]);
|
|
|
|
-
|
|
|
|
/* ServerStatus */
|
|
/* ServerStatus */
|
|
UA_DataSource serverStatus = {readStatus, NULL};
|
|
UA_DataSource serverStatus = {readStatus, NULL};
|
|
retVal |= UA_Server_setVariableNode_dataSource(server,
|
|
retVal |= UA_Server_setVariableNode_dataSource(server,
|
|
@@ -678,6 +620,8 @@ UA_Server_initNS0(UA_Server *server) {
|
|
retVal |= writeNs0Variable(server, UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO_BUILDDATE,
|
|
retVal |= writeNs0Variable(server, UA_NS0ID_SERVER_SERVERSTATUS_BUILDINFO_BUILDDATE,
|
|
&server->config.buildInfo.buildDate, &UA_TYPES[UA_TYPES_DATETIME]);
|
|
&server->config.buildInfo.buildDate, &UA_TYPES[UA_TYPES_DATETIME]);
|
|
|
|
|
|
|
|
+#ifdef UA_GENERATED_NAMESPACE_ZERO
|
|
|
|
+
|
|
/* SecondsTillShutdown */
|
|
/* SecondsTillShutdown */
|
|
UA_UInt32 secondsTillShutdown = 0;
|
|
UA_UInt32 secondsTillShutdown = 0;
|
|
retVal |= writeNs0Variable(server, UA_NS0ID_SERVER_SERVERSTATUS_SECONDSTILLSHUTDOWN,
|
|
retVal |= writeNs0Variable(server, UA_NS0ID_SERVER_SERVERSTATUS_SECONDSTILLSHUTDOWN,
|
|
@@ -694,21 +638,72 @@ UA_Server_initNS0(UA_Server *server) {
|
|
retVal |= UA_Server_setVariableNode_dataSource(server,
|
|
retVal |= UA_Server_setVariableNode_dataSource(server,
|
|
UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVICELEVEL), serviceLevel);
|
|
UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVICELEVEL), serviceLevel);
|
|
|
|
|
|
|
|
+ /* ServerDiagnostics - ServerDiagnosticsSummary */
|
|
|
|
+ UA_ServerDiagnosticsSummaryDataType serverDiagnosticsSummary;
|
|
|
|
+ UA_ServerDiagnosticsSummaryDataType_init(&serverDiagnosticsSummary);
|
|
|
|
+ retVal |= writeNs0Variable(server, UA_NS0ID_SERVER_SERVERDIAGNOSTICS_SERVERDIAGNOSTICSSUMMARY,
|
|
|
|
+ &serverDiagnosticsSummary,
|
|
|
|
+ &UA_TYPES[UA_TYPES_SERVERDIAGNOSTICSSUMMARYDATATYPE]);
|
|
|
|
+
|
|
|
|
+ /* ServerDiagnostics - EnabledFlag */
|
|
|
|
+ UA_Boolean enabledFlag = false;
|
|
|
|
+ retVal |= writeNs0Variable(server, UA_NS0ID_SERVER_SERVERDIAGNOSTICS_ENABLEDFLAG,
|
|
|
|
+ &enabledFlag, &UA_TYPES[UA_TYPES_BOOLEAN]);
|
|
|
|
+
|
|
/* Auditing */
|
|
/* Auditing */
|
|
UA_DataSource auditing = {readAuditing, NULL};
|
|
UA_DataSource auditing = {readAuditing, NULL};
|
|
retVal |= UA_Server_setVariableNode_dataSource(server,
|
|
retVal |= UA_Server_setVariableNode_dataSource(server,
|
|
UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_AUDITING), auditing);
|
|
UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_AUDITING), auditing);
|
|
|
|
|
|
- /* NamespaceArray */
|
|
|
|
- UA_DataSource nsarray_datasource = {readNamespaces, writeNamespaces};
|
|
|
|
- retVal |= UA_Server_setVariableNode_dataSource(server,
|
|
|
|
- UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_NAMESPACEARRAY), nsarray_datasource);
|
|
|
|
-
|
|
|
|
/* Redundancy Support */
|
|
/* Redundancy Support */
|
|
UA_RedundancySupport redundancySupport = UA_REDUNDANCYSUPPORT_NONE;
|
|
UA_RedundancySupport redundancySupport = UA_REDUNDANCYSUPPORT_NONE;
|
|
retVal |= writeNs0Variable(server, UA_NS0ID_SERVER_SERVERREDUNDANCY_REDUNDANCYSUPPORT,
|
|
retVal |= writeNs0Variable(server, UA_NS0ID_SERVER_SERVERREDUNDANCY_REDUNDANCYSUPPORT,
|
|
&redundancySupport, &UA_TYPES[UA_TYPES_REDUNDANCYSUPPORT]);
|
|
&redundancySupport, &UA_TYPES[UA_TYPES_REDUNDANCYSUPPORT]);
|
|
|
|
|
|
|
|
+ /* ServerCapabilities - LocaleIdArray */
|
|
|
|
+ UA_LocaleId locale_en = UA_STRING("en");
|
|
|
|
+ retVal |= writeNs0VariableArray(server, UA_NS0ID_SERVER_SERVERCAPABILITIES_LOCALEIDARRAY,
|
|
|
|
+ &locale_en, 1, &UA_TYPES[UA_TYPES_LOCALEID]);
|
|
|
|
+
|
|
|
|
+ /* ServerCapabilities - MaxBrowseContinuationPoints */
|
|
|
|
+ UA_UInt16 maxBrowseContinuationPoints = UA_MAXCONTINUATIONPOINTS;
|
|
|
|
+ retVal |= writeNs0Variable(server, UA_NS0ID_SERVER_SERVERCAPABILITIES_MAXBROWSECONTINUATIONPOINTS,
|
|
|
|
+ &maxBrowseContinuationPoints, &UA_TYPES[UA_TYPES_UINT16]);
|
|
|
|
+
|
|
|
|
+ /* ServerProfileArray */
|
|
|
|
+ UA_String profileArray[5];
|
|
|
|
+ UA_UInt16 profileArraySize = 0;
|
|
|
|
+#define ADDPROFILEARRAY(x) profileArray[profileArraySize++] = UA_STRING(x)
|
|
|
|
+ ADDPROFILEARRAY("http://opcfoundation.org/UA-Profile/Server/NanoEmbeddedDevice");
|
|
|
|
+#ifdef UA_ENABLE_NODEMANAGEMENT
|
|
|
|
+ ADDPROFILEARRAY("http://opcfoundation.org/UA-Profile/Server/NodeManagement");
|
|
|
|
+#endif
|
|
|
|
+#ifdef UA_ENABLE_METHODCALLS
|
|
|
|
+ ADDPROFILEARRAY("http://opcfoundation.org/UA-Profile/Server/Methods");
|
|
|
|
+#endif
|
|
|
|
+#ifdef UA_ENABLE_SUBSCRIPTIONS
|
|
|
|
+ ADDPROFILEARRAY("http://opcfoundation.org/UA-Profile/Server/EmbeddedDataChangeSubscription");
|
|
|
|
+#endif
|
|
|
|
+#ifdef UA_ENABLE_HISTORIZING
|
|
|
|
+ ADDPROFILEARRAY("http://opcfoundation.org/UA-Profile/Server/HistoricalRawData");
|
|
|
|
+#endif
|
|
|
|
+ retVal |= writeNs0VariableArray(server, UA_NS0ID_SERVER_SERVERCAPABILITIES_SERVERPROFILEARRAY,
|
|
|
|
+ profileArray, profileArraySize, &UA_TYPES[UA_TYPES_STRING]);
|
|
|
|
+
|
|
|
|
+ /* ServerCapabilities - MaxQueryContinuationPoints */
|
|
|
|
+ UA_UInt16 maxQueryContinuationPoints = 0;
|
|
|
|
+ retVal |= writeNs0Variable(server, UA_NS0ID_SERVER_SERVERCAPABILITIES_MAXQUERYCONTINUATIONPOINTS,
|
|
|
|
+ &maxQueryContinuationPoints, &UA_TYPES[UA_TYPES_UINT16]);
|
|
|
|
+
|
|
|
|
+ /* ServerCapabilities - MaxHistoryContinuationPoints */
|
|
|
|
+ UA_UInt16 maxHistoryContinuationPoints = 0;
|
|
|
|
+ retVal |= writeNs0Variable(server, UA_NS0ID_SERVER_SERVERCAPABILITIES_MAXHISTORYCONTINUATIONPOINTS,
|
|
|
|
+ &maxHistoryContinuationPoints, &UA_TYPES[UA_TYPES_UINT16]);
|
|
|
|
+
|
|
|
|
+ /* ServerCapabilities - MinSupportedSampleRate */
|
|
|
|
+ retVal |= writeNs0Variable(server, UA_NS0ID_SERVER_SERVERCAPABILITIES_MINSUPPORTEDSAMPLERATE,
|
|
|
|
+ &server->config.samplingIntervalLimits.min, &UA_TYPES[UA_TYPES_DURATION]);
|
|
|
|
+
|
|
/* ServerCapabilities - OperationLimits - MaxNodesPerRead */
|
|
/* ServerCapabilities - OperationLimits - MaxNodesPerRead */
|
|
retVal |= writeNs0Variable(server, UA_NS0ID_SERVER_SERVERCAPABILITIES_OPERATIONLIMITS_MAXNODESPERREAD,
|
|
retVal |= writeNs0Variable(server, UA_NS0ID_SERVER_SERVERCAPABILITIES_OPERATIONLIMITS_MAXNODESPERREAD,
|
|
&server->config.maxNodesPerRead, &UA_TYPES[UA_TYPES_UINT32]);
|
|
&server->config.maxNodesPerRead, &UA_TYPES[UA_TYPES_UINT32]);
|
|
@@ -804,6 +799,7 @@ UA_Server_initNS0(UA_Server *server) {
|
|
UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_GETMONITOREDITEMS), readMonitoredItems);
|
|
UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_GETMONITOREDITEMS), readMonitoredItems);
|
|
#endif
|
|
#endif
|
|
|
|
|
|
|
|
+#endif /* UA_GENERATED_NAMESPACE_ZERO */
|
|
|
|
|
|
/* create the OverFlowEventType
|
|
/* create the OverFlowEventType
|
|
* The EventQueueOverflowEventType is defined as abstract, therefore we can not create an instance of that type
|
|
* The EventQueueOverflowEventType is defined as abstract, therefore we can not create an instance of that type
|