open62541_MacroHelper.py 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  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 is released into the
  8. ### public domain under the General Public Licence. A copy of the GNU GPL is
  9. ### available under http://www.gnu.org/licenses/gpl-3.0.html.
  10. ###
  11. ### This program is not meant to be used in a production environment. The
  12. ### author is not liable for any complications arising due to the use of
  13. ### this program.
  14. ###
  15. from logger import *
  16. from ua_constants import *
  17. __unique_item_id = 0
  18. class open62541_MacroHelper():
  19. def __init__(self):
  20. pass
  21. def getCreateExpandedNodeIDMacro(self, node):
  22. if node.id().i != None:
  23. return "UA_EXPANDEDNODEID_NUMERIC(" + str(node.id().ns) + ", " + str(node.id().i) + ")"
  24. elif node.id().s != None:
  25. return "UA_EXPANDEDNODEID_STRING(" + str(node.id().ns) + ", " + node.id().s + ")"
  26. elif node.id().b != None:
  27. log(self, "NodeID Generation macro for bytestrings has not been implemented.")
  28. return ""
  29. elif node.id().g != None:
  30. log(self, "NodeID Generation macro for guids has not been implemented.")
  31. return ""
  32. else:
  33. return ""
  34. def getCreateNodeIDMacro(self, node):
  35. if node.id().i != None:
  36. return "UA_NODEID_NUMERIC(" + str(node.id().ns) + ", " + str(node.id().i) + ")"
  37. elif node.id().s != None:
  38. return "UA_NODEID_STRING(" + str(node.id().ns) + ", " + node.id().s + ")"
  39. elif node.id().b != None:
  40. log(self, "NodeID Generation macro for bytestrings has not been implemented.")
  41. return ""
  42. elif node.id().g != None:
  43. log(self, "NodeID Generation macro for guids has not been implemented.")
  44. return ""
  45. else:
  46. return ""
  47. def getCreateStandaloneReference(self, sourcenode, reference):
  48. # As reference from open62541 (we need to alter the attributes)
  49. # #define ADDREFERENCE(NODEID, REFTYPE_NODEID, TARGET_EXPNODEID) do { \
  50. # UA_AddReferencesItem item; \
  51. # UA_AddReferencesItem_init(&item); \
  52. # item.sourceNodeId = NODEID; \
  53. # item.referenceTypeId = REFTYPE_NODEID; \
  54. # item.isForward = UA_TRUE; \
  55. # item.targetNodeId = TARGET_EXPNODEID; \
  56. # UA_Server_addReference(server, &item); \
  57. # } while(0)
  58. code = []
  59. refid = "ref_" + reference.getCodePrintableID()
  60. code.append("UA_AddReferencesItem " + refid + ";")
  61. code.append("UA_AddReferencesItem_init(&" + refid + ");")
  62. code.append(refid + ".sourceNodeId = " + self.getCreateNodeIDMacro(sourcenode) + ";")
  63. code.append(refid + ".referenceTypeId = " + self.getCreateNodeIDMacro(reference.referenceType()) + ";")
  64. if reference.isForward():
  65. code.append(refid + ".isForward = UA_TRUE;")
  66. else:
  67. code.append(refid + ".isForward = UA_FALSE;")
  68. code.append(refid + ".targetNodeId = " + self.getCreateExpandedNodeIDMacro(reference.target()) + ";")
  69. code.append("UA_Server_addReference(server, &" + refid + ");")
  70. return code
  71. def getCreateNode(self, node):
  72. nodetype = ""
  73. code = []
  74. code.append("// Node: " + str(node) + ", " + str(node.browseName()))
  75. if node.nodeClass() == NODE_CLASS_OBJECT:
  76. nodetype = "UA_ObjectNode"
  77. elif node.nodeClass() == NODE_CLASS_VARIABLE:
  78. nodetype = "UA_VariableNode"
  79. elif node.nodeClass() == NODE_CLASS_METHOD:
  80. nodetype = "UA_MethodNode"
  81. elif node.nodeClass() == NODE_CLASS_OBJECTTYPE:
  82. nodetype = "UA_ObjectTypeNode"
  83. elif node.nodeClass() == NODE_CLASS_REFERENCETYPE:
  84. nodetype = "UA_ReferenceTypeNode"
  85. elif node.nodeClass() == NODE_CLASS_VARIABLETYPE:
  86. nodetype = "UA_VariableTypeNode"
  87. elif node.nodeClass() == NODE_CLASS_DATATYPE:
  88. nodetype = "UA_DataTypeNode"
  89. elif node.nodeClass() == NODE_CLASS_VIEW:
  90. nodetype = "UA_ViewNode"
  91. elif node.nodeClass() == NODE_CLASS_METHODTYPE:
  92. nodetype = "UA_MethodTypeNode"
  93. else:
  94. nodetype = "UA_NodeTypeNotFoundorGeneric"
  95. code.append(nodetype + " *" + node.getCodePrintableID() + " = " + nodetype + "_new();")
  96. code.append(node.getCodePrintableID() + "->browseName = UA_QUALIFIEDNAME_ALLOC(" + str(node.id().ns) + ", \"" + node.browseName() + "\");")
  97. code.append(node.getCodePrintableID() + "->displayName = UA_LOCALIZEDTEXT_ALLOC(\"en_US\", \"" + node.displayName() + "\");")
  98. code.append(node.getCodePrintableID() + "->description = UA_LOCALIZEDTEXT_ALLOC(\"en_US\", \"" + node.description() + "\");")
  99. code.append(node.getCodePrintableID() + "->writeMask = (UA_Int32) " + str(node.__node_writeMask__) + ";")
  100. code.append(node.getCodePrintableID() + "->userWriteMask = (UA_Int32) " + str(node.__node_userWriteMask__) + ";")
  101. #FIXME: Allocate descriptions, etc.
  102. if node.id().i != None:
  103. code.append(node.getCodePrintableID() + "->nodeId.identifier.numeric = " + str(node.id().i) + ";")
  104. elif node.id().b != None:
  105. log(self, "ByteString IDs for nodes has not been implemented yet.", LOG_LEVEL_ERROR)
  106. return []
  107. elif node.id().g != None:
  108. #<jpfr> the string is sth like { .length = 111, .data = <ptr> }
  109. #<jpfr> there you _may_ alloc the <ptr> on the heap
  110. #<jpfr> for the guid, just set it to {.data1 = 111, .data2 = 2222, ....
  111. log(self, "GUIDs for nodes has not been implemented yet.", LOG_LEVEL_ERROR)
  112. return []
  113. elif node.id().s != None:
  114. code.append(node.getCodePrintableID() + "->nodeId.identifier.numeric = UA_STRING_ALLOC(\"" + str(node.id().i) + "\");")
  115. else:
  116. log(self, "Node ID is not numeric, bytestring, guid or string. I do not know how to create c code for that...", LOG_LEVEL_ERROR)
  117. return []
  118. return code