Parcourir la source

Rearranged variable/variableType variant assignement to be conducted by the node, not the value; allows fallthrough cases where the values encoding cannot be determined both in bootstrapping and userland modes. Shut up the logger. Bug #304 resolved in due process.

ichrispa il y a 9 ans
Parent
commit
57f7b1b6d4

+ 1 - 1
tools/pyUANamespace/logger.py

@@ -29,7 +29,7 @@ LOG_LEVEL_ERROR  = 0
 LOG_LEVEL_SILENT = -1
 
 # Change the following to filter logging output
-GLOBAL_LOG_LEVEL = LOG_LEVEL_DEBUG
+GLOBAL_LOG_LEVEL = LOG_LEVEL_SILENT
 
 def log(callee, logstr, level=LOG_LEVEL_DEBUG):
   prefixes = { LOG_LEVEL_DEBUG : "DBG: ",

+ 9 - 6
tools/pyUANamespace/ua_builtin_types.py

@@ -360,8 +360,9 @@ class opcua_value_t():
           for v in self.value:
             code.append(valueName + "[" + str(self.value.index(v)) + "] = " + v.printOpen62541CCode_SubType() + ";")
         code.append("UA_Variant_setArrayCopy(" + self.parent.getCodePrintableID() + "_variant, &" + valueName + ", (UA_Int32) " + str(len(self.value)) + ", &UA_TYPES[UA_TYPES_" + self.value[0].stringRepresentation.upper() + "]);")
-        if (bootstrapping == True):
-          code.append(self.parent.getCodePrintableID() + "->value.variant = *" + self.parent.getCodePrintableID() + "_variant;")
+        # Variant creation is now part of printSubtypeEarly, the node does not exist when the type is initialized!
+        #if (bootstrapping == True):
+        #  code.append(self.parent.getCodePrintableID() + "->value.variant = *" + self.parent.getCodePrintableID() + "_variant;")
     else:
       # User the following strategy for all directly mappable values a la 'UA_Type MyInt = (UA_Type) 23;'
       if self.value[0].__binTypeId__ == BUILTINTYPE_TYPEID_GUID:
@@ -383,14 +384,16 @@ class opcua_value_t():
           code.append("UA_Variant_setScalarCopy(" + self.parent.getCodePrintableID() + "_variant, " + valueName + ", &UA_TYPES[UA_TYPES_" + self.value[0].stringRepresentation.upper() + "]);")
           #FIXME: There is no membership definition for extensionObjects generated in this function.
           code.append("UA_" + self.value[0].stringRepresentation + "_deleteMembers(" + valueName + ");")
-          if (bootstrapping == True):
-            code.append(self.parent.getCodePrintableID() + "->value.variant = *" + self.parent.getCodePrintableID() + "_variant;")
+          # Variant creation is now part of printSubtypeEarly, the node does not exist when the type is initialized!
+          #if (bootstrapping == True):
+          #  code.append(self.parent.getCodePrintableID() + "->value.variant = *" + self.parent.getCodePrintableID() + "_variant;")
         else:
           code.append("UA_" + self.value[0].stringRepresentation + " " + valueName + " = " + self.value[0].printOpen62541CCode_SubType() + ";")
           code.append("UA_Variant_setScalarCopy(" + self.parent.getCodePrintableID() + "_variant, &" + valueName + ", &UA_TYPES[UA_TYPES_" + self.value[0].stringRepresentation.upper() + "]);")
           code.append("UA_" + self.value[0].stringRepresentation + "_deleteMembers(&" + valueName + ");")
-          if (bootstrapping == True):
-            code.append(self.parent.getCodePrintableID() + "->value.variant = *" + self.parent.getCodePrintableID() + "_variant;")
+          # Variant creation is now part of printSubtypeEarly, the node does not exist when the type is initialized!
+          #if (bootstrapping == True):
+          #  code.append(self.parent.getCodePrintableID() + "->value.variant = *" + self.parent.getCodePrintableID() + "_variant;")
     return code
 
 

+ 7 - 7
tools/pyUANamespace/ua_node_types.py

@@ -1050,9 +1050,7 @@ class opcua_node_variable_t(opcua_node_t):
         if self.value() != None:
           code = code + self.value().printOpen62541CCode(bootstrapping)
           return code
-    if bootstrapping == False:
-      # Otherwise create a dummy variant to statisfy UA_Server_addVariableNode()
-      code.append("UA_Variant *" + self.getCodePrintableID() + "_variant = UA_Variant_new();")
+    code.append("UA_Variant *" + self.getCodePrintableID() + "_variant = UA_Variant_new();")
     return code
   
   def printOpen62541CCode_Subtype(self, bootstrapping = True):
@@ -1075,7 +1073,8 @@ class opcua_node_variable_t(opcua_node_t):
     code.append(self.getCodePrintableID() + "->userAccessLevel = (UA_Int32) " + str(self.userAccessLevel()) + ";")
     code.append(self.getCodePrintableID() + "->accessLevel = (UA_Int32) " + str(self.accessLevel()) + ";")
     code.append(self.getCodePrintableID() + "->valueRank = (UA_Int32) " + str(self.valueRank()) + ";")
-    
+    # The variant is guaranteed to exist by SubtypeEarly()
+    code.append(self.getCodePrintableID() + "->value.variant = *" + self.getCodePrintableID() + "_variant;")
     return code
 
 class opcua_node_method_t(opcua_node_t):
@@ -1301,9 +1300,7 @@ class opcua_node_variableType_t(opcua_node_t):
         if self.value() != None:
           code = code + self.value().printOpen62541CCode(bootstrapping)
           return code
-    if bootstrapping == False:
-      # Otherwise create a dummy variant to statisfy UA_Server_addVariableNode()
-      code.append("UA_Variant *" + self.getCodePrintableID() + "_variant = UA_Variant_new();")
+    code.append("UA_Variant *" + self.getCodePrintableID() + "_variant = UA_Variant_new();")
     return code
   
   def printOpen62541CCode_Subtype(self, bootstrapping = True):
@@ -1323,6 +1320,9 @@ class opcua_node_variableType_t(opcua_node_t):
       code.append(self.getCodePrintableID() + "->isAbstract = UA_TRUE;")
     else:
       code.append(self.getCodePrintableID() + "->isAbstract = UA_FALSE;")
+    
+    # The variant is guaranteed to exist by SubtypeEarly()
+    code.append(self.getCodePrintableID() + "->value.variant = *" + self.getCodePrintableID() + "_variant;")
     return code
 
 class opcua_node_dataType_t(opcua_node_t):