backend_open62541_nodes.py 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  1. #!/usr/bin/env/python
  2. # -*- coding: utf-8 -*-
  3. ###
  4. ### Author: Chris Iatrou (ichrispa@core-vector.net)
  5. ### Version: rev 13
  6. ###
  7. ### This program was created for educational purposes and has been
  8. ### contributed to the open62541 project by the author. All licensing
  9. ### terms for this source is inherited by the terms and conditions
  10. ### specified for by the open62541 project (see the projects readme
  11. ### file for more information on the LGPL terms and restrictions).
  12. ###
  13. ### This program is not meant to be used in a production environment. The
  14. ### author is not liable for any complications arising due to the use of
  15. ### this program.
  16. ###
  17. from nodes import *
  18. from backend_open62541_datatypes import *
  19. ###########################################
  20. # Extract References with Special Meaning #
  21. ###########################################
  22. def extractNodeParent(node, parentrefs):
  23. """Return a tuple of the most likely (parent, parentReference). The
  24. parentReference is removed form the inverse references list of the node.
  25. """
  26. for ref in node.inverseReferences:
  27. if ref.referenceType in parentrefs:
  28. node.inverseReferences.remove(ref)
  29. node.printRefs.remove(ref)
  30. return (ref.target, ref.referenceType)
  31. raise Exception("No node parent known for " + str(node))
  32. def extractNodeType(node):
  33. """Returns the most likely type of the variable- or objecttype node. The
  34. isinstanceof reference is removed form the inverse references list of the
  35. node.
  36. """
  37. pass
  38. def extractNodeSuperType(node):
  39. """Returns the most likely supertype of the variable-, object-, or referencetype
  40. node. The reference to the supertype is removed from the inverse
  41. references list of the node.
  42. """
  43. pass
  44. #################
  45. # Generate Code #
  46. #################
  47. def generateReferenceCode(reference):
  48. if reference.isForward:
  49. return "UA_Server_addReference(server, %s, %s, %s, true);" % \
  50. (generateNodeIdCode(reference.source), \
  51. generateNodeIdCode(reference.referenceType), \
  52. generateExpandedNodeIdCode(reference.target))
  53. else:
  54. return "UA_Server_addReference(server, %s, %s, %s, false);" % \
  55. (generateNodeIdCode(reference.source), \
  56. generateNodeIdCode(reference.referenceType), \
  57. generateExpandedNodeIdCode(reference.target))
  58. def generateReferenceTypeNodeCode(node):
  59. code = []
  60. code.append("UA_ReferenceTypeAttributes attr;")
  61. code.append("UA_ReferenceTypeAttributes_init(&attr);")
  62. if node.isAbstract:
  63. code.append("attr.isAbstract = true;")
  64. if node.symmetric:
  65. code.append("attr.symmetric = true;")
  66. if node.inverseName != "":
  67. code.append("attr.inverseName = UA_LOCALIZEDTEXT_ALLOC(\"en_US\", \"%s\");" % \
  68. node.inverseName)
  69. return code;
  70. def generateObjectNodeCode(node):
  71. code = []
  72. code.append("UA_ObjectAttributes attr;")
  73. code.append("UA_ObjectAttributes_init(&attr);")
  74. if node.eventNotifier:
  75. code.append("attr.eventNotifier = true;")
  76. return code;
  77. def generateVariableNodeCode(node):
  78. code = []
  79. code.append("UA_VariableAttributes attr;")
  80. code.append("UA_VariableAttributes_init(&attr);")
  81. if node.historizing:
  82. code.append("attr.historizing = true;")
  83. code.append("attr.minimumSamplingInterval = %f;" % node.minimumSamplingInterval)
  84. code.append("attr.userAccessLevel = %d;" % node.userAccessLevel)
  85. code.append("attr.accessLevel = %d;" % node.accessLevel)
  86. code.append("attr.valueRank = %d;" % node.valueRank)
  87. # # The variant is guaranteed to exist by SubtypeEarly()
  88. # code.append(getCodePrintableNodeID(node) + ".value.variant.value = *" + \
  89. # getCodePrintableNodeID(node) + "_variant;")
  90. # code.append(getCodePrintableNodeID(node) + ".valueSource = UA_VALUESOURCE_VARIANT;")
  91. return code
  92. def generateVariableTypeNodeCode(node):
  93. code = []
  94. code.append("UA_VariableTypeAttributes attr;")
  95. code.append("UA_VariableTypeAttributes_init(&attr);")
  96. if node.historizing:
  97. code.append("attr.historizing = true;")
  98. code.append("attr.valueRank = (UA_Int32)%s;" %str(node.valueRank))
  99. # # The variant is guaranteed to exist by SubtypeEarly()
  100. # code.append(getCodePrintableNodeID(node) + ".value.variant.value = *" + \
  101. # getCodePrintableNodeID(node) + "_variant;")
  102. # code.append(getCodePrintableNodeID(node) + ".valueSource = UA_VALUESOURCE_VARIANT;")
  103. return code
  104. def generateMethodNodeCode(node):
  105. code = []
  106. code.append("UA_MethodAttributes attr;")
  107. code.append("UA_MethodAttributes_init(&attr);")
  108. if node.executable:
  109. code.append("attr.executable = true;")
  110. if node.userExecutable:
  111. code.append("attr.userExecutable = true;")
  112. return code
  113. def generateObjectTypeNodeCode(node):
  114. code = []
  115. code.append("UA_ObjectTypeAttributes attr;")
  116. code.append("UA_ObjectTypeAttributes_init(&attr);")
  117. if node.isAbstract:
  118. code.append("attr.isAbstract = true;")
  119. return code
  120. def generateDataTypeNodeCode(node):
  121. code = []
  122. code.append("UA_DataTypeAttributes attr;")
  123. code.append("UA_DataTypeAttributes_init(&attr);")
  124. if node.isAbstract:
  125. code.append("attr.isAbstract = true;")
  126. return code
  127. def generateViewNodeCode(node):
  128. code = []
  129. code.append("UA_ViewAttributes attr;")
  130. code.append("UA_ViewAttributes_init(&attr);")
  131. if node.containsNoLoops:
  132. code.append("attr.containsNoLoops = true;")
  133. code.append("attr.eventNotifier = (UA_Byte)%s;" % str(node.eventNotifier))
  134. return code
  135. def generateNodeCode(node, supressGenerationOfAttribute, generate_ns0, parentrefs):
  136. code = []
  137. code.append("{")
  138. if isinstance(node, ReferenceTypeNode):
  139. code.extend(generateReferenceTypeNodeCode(node))
  140. elif isinstance(node, ObjectNode):
  141. code.extend(generateObjectNodeCode(node))
  142. elif isinstance(node, VariableNode) and not isinstance(node, VariableTypeNode):
  143. code.extend(generateVariableNodeCode(node))
  144. elif isinstance(node, VariableTypeNode):
  145. code.extend(generateVariableTypeNodeCode(node))
  146. elif isinstance(node, MethodNode):
  147. code.extend(generateMethodNodeCode(node))
  148. elif isinstance(node, ObjectTypeNode):
  149. code.extend(generateObjectTypeNodeCode(node))
  150. elif isinstance(node, DataTypeNode):
  151. code.extend(generateDataTypeNodeCode(node))
  152. elif isinstance(node, ViewNode):
  153. code.extend(generateViewNodeCode(node))
  154. code.append("attr.displayName = " + generateLocalizedTextCode(node.displayName) + ";")
  155. code.append("attr.description = " + generateLocalizedTextCode(node.description) + ";")
  156. code.append("attr.writeMask = %d;" % node.writeMask)
  157. code.append("attr.userWriteMask = %d;" % node.userWriteMask)
  158. if not generate_ns0:
  159. (parentNode, parentRef) = extractNodeParent(node, parentrefs)
  160. else:
  161. (parentNode, parentRef) = (NodeId(), NodeId())
  162. code.append("UA_Server_add%s(server," % node.__class__.__name__)
  163. code.append(generateNodeIdCode(node.id) + ",")
  164. code.append(generateNodeIdCode(parentNode) + ",")
  165. code.append(generateNodeIdCode(parentRef) + ",")
  166. code.append(generateQualifiedNameCode(node.browseName) + ",")
  167. if (isinstance(node, VariableNode) and not isinstance(node, VariableTypeNode)) or isinstance(node, ObjectNode):
  168. code.append("UA_NODEID_NUMERIC(0,0),") # parent
  169. code.append("attr,")
  170. if isinstance(node, MethodNode):
  171. code.append("NULL, NULL, 0, NULL, 0, NULL, NULL);")
  172. else:
  173. code.append("NULL, NULL);")
  174. code.append("}\n")
  175. return "\n".join(code)