ua_application.c 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259
  1. #include "ua_application.h"
  2. #include "ua_namespace.h"
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. UA_indexedList_List nsMockup;
  6. Application appMockup = {
  7. ( UA_ApplicationDescription*) UA_NULL,
  8. &nsMockup
  9. };
  10. UA_Node* create_node_ns0(UA_Int32 class, UA_Int32 nodeClass, UA_Int32 const id, char const * qn, char const * dn, char const * desc) {
  11. UA_Node* n; UA_.types[class].new((void **)&n);
  12. n->nodeId.encodingByte = UA_NODEIDTYPE_FOURBYTE;
  13. n->nodeId.namespace = 0;
  14. n->nodeId.identifier.numeric = id;
  15. UA_String_copycstring(qn,&(n->browseName.name));
  16. UA_String_copycstring(dn,&n->displayName.text);
  17. UA_String_copycstring(desc,&n->description.text);
  18. n->nodeClass = nodeClass;
  19. return n;
  20. }
  21. #define C2UA_STRING(s) (UA_String) { sizeof(s)-1, (UA_Byte*) s }
  22. void appMockup_init() {
  23. // create namespaces
  24. // TODO: A table that maps the namespaceUris to Ids
  25. Namespace* ns0;
  26. Namespace_new(&ns0, 100, 0); //C2UA_STRING("http://opcfoundation.org/UA/"));
  27. Namespace* local;
  28. Namespace_new(&local, 100, 1); //C2UA_STRING("http://localhost:16664/open62541/"));
  29. // add to list of namespaces
  30. UA_indexedList_init(appMockup.namespaces);
  31. UA_indexedList_addValueToFront(appMockup.namespaces,0,ns0);
  32. UA_indexedList_addValueToFront(appMockup.namespaces,1,local);
  33. /***************/
  34. /* Namespace 0 */
  35. /***************/
  36. // ReferenceTypes
  37. UA_NodeId RefTypeId_Organizes = NS0NODEID(35);
  38. /* UA_NodeId RefTypeId_HasEventSource = NS0NODEID(36); */
  39. /* UA_NodeId RefTypeId_HasModellingRule = NS0NODEID(37); */
  40. /* UA_NodeId RefTypeId_HasEncoding = NS0NODEID(38); */
  41. /* UA_NodeId RefTypeId_HasDescription = NS0NODEID(39); */
  42. UA_NodeId RefTypeId_HasTypeDefinition = NS0NODEID(40);
  43. /* UA_NodeId RefTypeId_HasSubtype = NS0NODEID(45); */
  44. UA_NodeId RefTypeId_HasProperty = NS0NODEID(46);
  45. UA_NodeId RefTypeId_HasComponent = NS0NODEID(47);
  46. /* UA_NodeId RefTypeId_HasNotifier = NS0NODEID(48); */
  47. // ObjectTypes (Ids only)
  48. UA_ExpandedNodeId ObjTypeId_FolderType = NS0EXPANDEDNODEID(61);
  49. // Objects (Ids only)
  50. UA_ExpandedNodeId ObjId_ObjectsFolder = NS0EXPANDEDNODEID(85);
  51. UA_ExpandedNodeId ObjId_TypesFolder = NS0EXPANDEDNODEID(86);
  52. UA_ExpandedNodeId ObjId_ViewsFolder = NS0EXPANDEDNODEID(87);
  53. UA_ExpandedNodeId ObjId_Server = NS0EXPANDEDNODEID(2253);
  54. UA_ExpandedNodeId ObjId_ServerArray = NS0EXPANDEDNODEID(2254);
  55. UA_ExpandedNodeId ObjId_NamespaceArray = NS0EXPANDEDNODEID(2255);
  56. UA_ExpandedNodeId ObjId_ServerStatus = NS0EXPANDEDNODEID(2256);
  57. UA_ExpandedNodeId ObjId_ServerCapabilities = NS0EXPANDEDNODEID(2268);
  58. UA_ExpandedNodeId ObjId_State = NS0EXPANDEDNODEID(2259);
  59. // FolderType
  60. UA_ObjectNode *folderType;
  61. UA_ObjectNode_new(&folderType);
  62. folderType->nodeId = NS0NODEID(61);
  63. folderType->nodeClass = UA_NODECLASS_OBJECT; // I should not have to set this manually
  64. folderType->browseName = (UA_QualifiedName){0, {4, "FolderType"}};
  65. folderType->displayName = (UA_LocalizedText){{2,"EN"},{4, "FolderType"}};
  66. folderType->description = (UA_LocalizedText){{2,"EN"},{4, "FolderType"}};
  67. folderType->referencesSize = 0;
  68. folderType->references = UA_NULL;
  69. Namespace_insert(ns0,(UA_Node*)folderType);
  70. // Root
  71. UA_ObjectNode *root;
  72. UA_ObjectNode_new(&root);
  73. root->nodeId = NS0NODEID(84);
  74. root->nodeClass = UA_NODECLASS_OBJECT; // I should not have to set this manually
  75. root->browseName = (UA_QualifiedName){0, {4, "Root"}};
  76. root->displayName = (UA_LocalizedText){{2,"EN"},{4, "Root"}};
  77. root->description = (UA_LocalizedText){{2,"EN"},{4, "Root"}};
  78. root->referencesSize = 4;
  79. root->references = (UA_ReferenceNode[4]){
  80. {RefTypeId_HasTypeDefinition, UA_FALSE, ObjTypeId_FolderType},
  81. {RefTypeId_Organizes, UA_FALSE, ObjId_ObjectsFolder},
  82. {RefTypeId_Organizes, UA_FALSE, ObjId_TypesFolder},
  83. {RefTypeId_Organizes, UA_FALSE, ObjId_ViewsFolder}};
  84. Namespace_insert(ns0,(UA_Node*)root);
  85. // Objects
  86. UA_ObjectNode *objects;
  87. UA_ObjectNode_new(&objects);
  88. objects->nodeId = ObjId_ObjectsFolder.nodeId;
  89. objects->nodeClass = UA_NODECLASS_OBJECT;
  90. objects->browseName = (UA_QualifiedName){0, {7, "Objects"}};
  91. objects->displayName = (UA_LocalizedText){{2,"EN"},{7, "Objects"}};
  92. objects->description = (UA_LocalizedText){{2,"EN"},{7, "Objects"}};
  93. objects->referencesSize = 2;
  94. objects->references = (UA_ReferenceNode[2]){
  95. {RefTypeId_HasTypeDefinition, UA_FALSE, ObjTypeId_FolderType},
  96. {RefTypeId_Organizes, UA_FALSE, ObjId_Server}};
  97. Namespace_insert(ns0,(UA_Node*)objects);
  98. // Views
  99. UA_ObjectNode *views;
  100. UA_ObjectNode_new(&views);
  101. views->nodeId = ObjId_ViewsFolder.nodeId;
  102. views->nodeClass = UA_NODECLASS_OBJECT;
  103. views->browseName = (UA_QualifiedName){0, {5, "Views"}};
  104. views->displayName = (UA_LocalizedText){{2,"EN"},{5, "Views"}};
  105. views->description = (UA_LocalizedText){{2,"EN"},{5, "Views"}};
  106. views->referencesSize = 1;
  107. views->references = (UA_ReferenceNode[1]){
  108. {RefTypeId_HasTypeDefinition, UA_FALSE, ObjTypeId_FolderType}};
  109. Namespace_insert(ns0,(UA_Node*)views);
  110. // Server
  111. UA_ObjectNode *server;
  112. UA_ObjectNode_new(&server);
  113. server->nodeId = ObjId_Server.nodeId;
  114. server->nodeClass = UA_NODECLASS_OBJECT;
  115. server->browseName = (UA_QualifiedName){0, {6, "Server"}};
  116. server->displayName = (UA_LocalizedText){{2,"EN"},{6, "Server"}};
  117. server->description = (UA_LocalizedText){{2,"EN"},{6, "Server"}};
  118. server->referencesSize = 0;
  119. server->references = (UA_ReferenceNode[4]){
  120. {RefTypeId_HasComponent, UA_FALSE, ObjId_ServerCapabilities},
  121. {RefTypeId_HasComponent, UA_FALSE, ObjId_NamespaceArray},
  122. {RefTypeId_HasProperty, UA_FALSE, ObjId_ServerStatus},
  123. {RefTypeId_HasProperty, UA_FALSE, ObjId_ServerArray}};
  124. Namespace_insert(ns0,(UA_Node*)server);
  125. // NamespaceArray
  126. UA_VariableNode *namespaceArray;
  127. UA_VariableNode_new(&namespaceArray);
  128. namespaceArray->nodeId = ObjId_NamespaceArray.nodeId;
  129. namespaceArray->nodeClass = UA_NODECLASS_VARIABLE; //FIXME: this should go into _new?
  130. namespaceArray->browseName = (UA_QualifiedName){0, {13, "NamespaceArray"}};
  131. namespaceArray->displayName = (UA_LocalizedText){{2,"EN"},{13, "NamespaceArray"}};
  132. namespaceArray->description = (UA_LocalizedText){{2,"EN"},{13, "NamespaceArray"}};
  133. //FIXME: can we avoid new here?
  134. UA_Array_new((void**)&namespaceArray->value.data, 2, &UA_.types[UA_STRING]);
  135. namespaceArray->value.vt = &UA_.types[UA_STRING];
  136. namespaceArray->value.arrayLength = 2;
  137. UA_String_copycstring("http://opcfoundation.org/UA/",&((UA_String *)((namespaceArray->value).data))[0]);
  138. UA_String_copycstring("http://localhost:16664/open62541/",&((UA_String *)(((namespaceArray)->value).data))[1]);
  139. namespaceArray->arrayDimensionsSize = 1;
  140. UA_Int32 dimensions = 2;
  141. namespaceArray->arrayDimensions = &dimensions;
  142. namespaceArray->dataType = NS0NODEID(UA_STRING_NS0);
  143. namespaceArray->valueRank = 1;
  144. namespaceArray->minimumSamplingInterval = 1.0;
  145. namespaceArray->historizing = UA_FALSE;
  146. Namespace_insert(ns0,(UA_Node*)namespaceArray);
  147. // ServerStatus
  148. UA_VariableNode *serverstatus;
  149. UA_VariableNode_new(&serverstatus);
  150. serverstatus->nodeId = ObjId_ServerStatus.nodeId;
  151. serverstatus->nodeClass = UA_NODECLASS_VARIABLE;
  152. serverstatus->browseName = (UA_QualifiedName){0, {12, "ServerStatus"}};
  153. serverstatus->displayName = (UA_LocalizedText){{2,"EN"},{12, "ServerStatus"}};
  154. serverstatus->description = (UA_LocalizedText){{2,"EN"},{12, "ServerStatus"}};
  155. UA_ServerStatusDataType *status;
  156. UA_ServerStatusDataType_new(&status);
  157. status->startTime = UA_DateTime_now();
  158. status->startTime = UA_DateTime_now();
  159. status->state = UA_SERVERSTATE_RUNNING;
  160. status->buildInfo = (UA_BuildInfo){{13,"open62541.org"}, {9,"open62541"}, {9,"open62541"},
  161. {3, "0.0"}, {3, "0.0"}, UA_DateTime_now()};
  162. status->secondsTillShutdown = 99999999;
  163. status->shutdownReason = (UA_LocalizedText){{2,"EN"},{7, "because"}};
  164. serverstatus->value.vt = &UA_.types[UA_SERVERSTATUSDATATYPE]; // gets encoded as an extensionobject
  165. serverstatus->value.arrayLength = 1;
  166. serverstatus->value.data = status;
  167. Namespace_insert(ns0,(UA_Node*)serverstatus);
  168. // State (Component of ServerStatus)
  169. UA_VariableNode *state;
  170. UA_VariableNode_new(&state);
  171. state->nodeId = ObjId_State.nodeId;
  172. state->nodeClass = UA_NODECLASS_VARIABLE;
  173. state->browseName = (UA_QualifiedName){0, {5, "State"}};
  174. state->displayName = (UA_LocalizedText){{2,"EN"},{5, "State"}};
  175. state->description = (UA_LocalizedText){{2,"EN"},{5, "State"}};
  176. state->value.vt = &UA_borrowed_.types[UA_SERVERSTATE];
  177. state->value.arrayLength = 1;
  178. state->value.data = &status->state; // points into the other object.
  179. state->referencesSize = 0;
  180. state->references = UA_NULL;
  181. Namespace_insert(ns0,(UA_Node*)state);
  182. //TODO: free(namespaceArray->value.data) later or forget it
  183. /* UA_VariableNode* v = (UA_VariableNode*)np; */
  184. /* UA_Array_new((void**)&v->value.data, 2, &UA_.types[UA_STRING]); */
  185. /* v->value.vt = &UA_.types[UA_STRING]; */
  186. /* v->value.arrayLength = 2; */
  187. /* UA_String_copycstring("http://opcfoundation.org/UA/",&((UA_String *)((v->value).data))[0]); */
  188. /* UA_String_copycstring("http://localhost:16664/open62541/",&((UA_String *)(((v)->value).data))[1]); */
  189. /* v->dataType.encodingByte = UA_NODEIDTYPE_FOURBYTE; */
  190. /* v->dataType.identifier.numeric = UA_STRING_NS0; */
  191. /* v->valueRank = 1; */
  192. /* v->minimumSamplingInterval = 1.0; */
  193. /* v->historizing = UA_FALSE; */
  194. /* Namespace_insert(ns0,np); */
  195. /*TEST */
  196. const UA_Node * foundNode1;
  197. const UA_Node * foundNode2;
  198. Namespace_Entry_Lock *lock1;
  199. Namespace_get(ns0, &root->nodeId,
  200. &foundNode1, &lock1);
  201. Namespace_get(ns0, &foundNode1->references[0].targetId.nodeId,
  202. &foundNode2, &lock1);
  203. /*TEST END*/
  204. /*******************/
  205. /* Namespace local */
  206. /*******************/
  207. #if defined(DEBUG) && defined(VERBOSE)
  208. uint32_t i;
  209. for (i=0;i < ns0->size;i++) {
  210. if (ns0->entries[i].node != UA_NULL) {
  211. printf("appMockup_init - entries[%d]={",i);
  212. UA_Node_print(ns0->entries[i].node, stdout);
  213. printf("}\n");
  214. }
  215. }
  216. #endif
  217. }