Selaa lähdekoodia

first approach to generate minimal ns0

Julius Pfrommer 10 vuotta sitten
vanhempi
commit
ba334c9d51
2 muutettua tiedostoa jossa 103 lisäystä ja 20 poistoa
  1. 97 20
      src/ua_application.c
  2. 6 0
      src/ua_types.h

+ 97 - 20
src/ua_application.c

@@ -37,26 +37,103 @@ void appMockup_init() {
 	UA_indexedList_addValueToFront(appMockup.namespaces,0,ns0);
 	UA_indexedList_addValueToFront(appMockup.namespaces,1,local);
 
-	UA_Node* np;
-	np = create_node_ns0(UA_OBJECTNODE, UA_NODECLASS_OBJECT, 2253, "Server", "open62541", "...");
-	Namespace_insert(ns0,np);
-	UA_ObjectNode* o = (UA_ObjectNode*)np;
-	o->eventNotifier = UA_FALSE;
-
-	np = create_node_ns0(UA_VARIABLENODE, UA_NODECLASS_VARIABLE, 2255, "Server_NamespaceArray", "open62541", "..." );
-	UA_VariableNode* v = (UA_VariableNode*)np;
-	UA_Array_new((void**)&v->value.data, 2, &UA_.types[UA_STRING]);
-	v->value.vt = &UA_.types[UA_STRING];
-	v->value.arrayLength = 2;
-	UA_String_copycstring("http://opcfoundation.org/UA/",&((UA_String *)((v->value).data))[0]);
-	UA_String_copycstring("http://localhost:16664/open62541/",&((UA_String *)(((v)->value).data))[1]);
-	v->dataType.encodingByte = UA_NODEIDTYPE_FOURBYTE;
-	v->dataType.identifier.numeric = UA_STRING_NS0;
-	v->valueRank = 1;
-	v->minimumSamplingInterval = 1.0;
-	v->historizing = UA_FALSE;
-
-	Namespace_insert(ns0,np);
+    /***************/
+    /* Namespace 0 */
+    /***************/
+
+    // ReferenceTypes
+	UA_NodeId RefTypeId_Organizes = NS0NODEID(35);
+	/* UA_NodeId RefTypeId_HasEventSource = NS0NODEID(36); */
+	/* UA_NodeId RefTypeId_HasModellingRule = NS0NODEID(37); */
+	/* UA_NodeId RefTypeId_HasEncoding = NS0NODEID(38); */
+	/* UA_NodeId RefTypeId_HasDescription = NS0NODEID(39); */
+	UA_NodeId RefTypeId_HasTypeDefinition = NS0NODEID(40);
+	/* UA_NodeId RefTypeId_HasSubtype = NS0NODEID(45); */
+	/* UA_NodeId RefTypeId_HasProperty = NS0NODEID(46); */
+	/* UA_NodeId RefTypeId_HasComponent = NS0NODEID(47); */
+	/* UA_NodeId RefTypeId_HasNotifier = NS0NODEID(48); */
+
+    // ObjectTypes (Ids only)
+	UA_ExpandedNodeId ObjTypeId_FolderType = NS0EXPANDEDNODEID(61);
+
+	// Objects (Ids only)
+	UA_ExpandedNodeId ObjId_ObjectsFolder = NS0EXPANDEDNODEID(85);
+	UA_ExpandedNodeId ObjId_TypesFolder = NS0EXPANDEDNODEID(86);
+	UA_ExpandedNodeId ObjId_ViewsFolder = NS0EXPANDEDNODEID(87);
+	UA_ExpandedNodeId ObjId_Server = NS0EXPANDEDNODEID(2253);
+
+	// Root
+	UA_ObjectNode *root;
+	UA_ObjectNode_new(&root);
+	root->nodeId = NS0NODEID(84);
+	root->nodeClass = UA_NODECLASS_OBJECT; // I should not have to set this manually
+	root->browseName = (UA_QualifiedName){0, {4, "Root"}};
+	root->displayName = (UA_LocalizedText){{2,"EN"},{4, "Root"}};
+	root->description = (UA_LocalizedText){{2,"EN"},{4, "Root"}};
+	root->referencesSize = 4;
+	root->references = (UA_ReferenceNode[4]){
+		{RefTypeId_HasTypeDefinition, UA_FALSE, ObjTypeId_FolderType},
+		{RefTypeId_Organizes, UA_FALSE, ObjId_ObjectsFolder},
+		{RefTypeId_Organizes, UA_FALSE, ObjId_TypesFolder},
+		{RefTypeId_Organizes, UA_FALSE, ObjId_ViewsFolder}};
+
+	// Objects
+	UA_ObjectNode *objects;
+	UA_ObjectNode_new(&objects);
+	objects->nodeId = ObjId_ObjectsFolder.nodeId;
+	objects->nodeClass = UA_NODECLASS_OBJECT;
+	objects->browseName = (UA_QualifiedName){0, {7, "Objects"}};
+	objects->displayName = (UA_LocalizedText){{2,"EN"},{7, "Objects"}};
+	objects->description = (UA_LocalizedText){{2,"EN"},{7, "Objects"}};
+	objects->referencesSize = 2;
+	objects->references = (UA_ReferenceNode[2]){
+		{RefTypeId_HasTypeDefinition, UA_FALSE, ObjTypeId_FolderType},
+		{RefTypeId_Organizes, UA_FALSE, ObjId_Server}};
+
+	// Views
+	UA_ObjectNode *views;
+	UA_ObjectNode_new(&views);
+	views->nodeId = ObjId_ViewsFolder.nodeId;
+	views->nodeClass = UA_NODECLASS_OBJECT;
+	views->browseName = (UA_QualifiedName){0, {5, "Views"}};
+	views->displayName = (UA_LocalizedText){{2,"EN"},{5, "Views"}};
+	views->description = (UA_LocalizedText){{2,"EN"},{5, "Views"}};
+	views->referencesSize = 1;
+	views->references = (UA_ReferenceNode[1]){
+		{RefTypeId_HasTypeDefinition, UA_FALSE, ObjTypeId_FolderType}};
+
+	// Server
+	UA_ObjectNode *server;
+	UA_ObjectNode_new(&server);
+	server->nodeId = ObjId_Server.nodeId;
+	server->nodeClass = UA_NODECLASS_OBJECT;
+	server->browseName = (UA_QualifiedName){0, {6, "Server"}};
+	server->displayName = (UA_LocalizedText){{2,"EN"},{6, "Server"}};
+	server->description = (UA_LocalizedText){{2,"EN"},{6, "Server"}};
+	server->referencesSize = 0;
+	server->references = UA_NULL; // TODO. Fill up here.
+	
+	Namespace_insert(ns0,(UA_Node*)root);
+	Namespace_insert(ns0,(UA_Node*)objects);
+	Namespace_insert(ns0,(UA_Node*)views);
+	Namespace_insert(ns0,(UA_Node*)server);
+
+	/* UA_VariableNode* v = (UA_VariableNode*)np; */
+	/* UA_Array_new((void**)&v->value.data, 2, &UA_.types[UA_STRING]); */
+	/* v->value.vt = &UA_.types[UA_STRING]; */
+	/* v->value.arrayLength = 2; */
+	/* UA_String_copycstring("http://opcfoundation.org/UA/",&((UA_String *)((v->value).data))[0]); */
+	/* UA_String_copycstring("http://localhost:16664/open62541/",&((UA_String *)(((v)->value).data))[1]); */
+	/* v->dataType.encodingByte = UA_NODEIDTYPE_FOURBYTE; */
+	/* v->dataType.identifier.numeric = UA_STRING_NS0; */
+	/* v->valueRank = 1; */
+	/* v->minimumSamplingInterval = 1.0; */
+	/* v->historizing = UA_FALSE; */
+	/* Namespace_insert(ns0,np); */
+
+    /*******************/
+    /* Namespace local */
+    /*******************/
 
 #if defined(DEBUG) && defined(VERBOSE)
 	uint32_t i;

+ 6 - 0
src/ua_types.h

@@ -119,6 +119,9 @@ typedef struct UA_NodeId {
 	} identifier;
 } UA_NodeId;
 
+#define NS0NODEID(NUMERIC_ID) \
+	(UA_NodeId){.encodingByte = 1 /*UA_NODEIDTYPE_FOURBYTE*/, .namespace = 0, .identifier.numeric = NUMERIC_ID}
+
 #define UA_NODEIDTYPE_NAMESPACE_URI_FLAG 0x80
 #define UA_NODEIDTYPE_SERVERINDEX_FLAG 0x40
 #define UA_NODEIDTYPE_MASK (~(UA_NODEIDTYPE_NAMESPACE_URI_FLAG | UA_NODEIDTYPE_SERVERINDEX_FLAG))
@@ -130,6 +133,9 @@ typedef struct UA_ExpandedNodeId {
 	UA_UInt32 serverIndex;
 } UA_ExpandedNodeId;
 
+#define NS0EXPANDEDNODEID(NUMERIC_ID) \
+	(UA_ExpandedNodeId){.nodeId = NS0NODEID(NUMERIC_ID), .namespaceUri = {-1, UA_NULL}, .serverIndex = 0}
+
 /** @brief A numeric identifier for a error or condition that is associated with a value or an operation. */
 typedef UA_UInt32 UA_StatusCode; // StatusCodes aren't an enum(=int) since 32 unsigned bits are needed. See also ua_statuscodes.h */