From 7fef0bf56eb02683e1b4e6b26af7521a59cf3b48 Mon Sep 17 00:00:00 2001 From: Kees Benkendorfer Date: Wed, 17 Jul 2024 10:23:27 +0200 Subject: [PATCH 1/4] Update template to parse objects from design Previously, if a configuration-instantiated object had children that were instantiated from design, Cacophony would not generate any code to parse those children. This commit updates the `designToConfigParser` template to parse design-instantiated children of configuration-instantiated objects. It does so by separating the XML-dependent part of DPE creation from the XML-independent part, and parsing the design for the XML-independent part. --- .gitignore | 1 + templates/designToConfigParser.jinja | 44 ++++++++++++++++++++++------ 2 files changed, 36 insertions(+), 9 deletions(-) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..86d4c2d --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +generated diff --git a/templates/designToConfigParser.jinja b/templates/designToConfigParser.jinja index b24d2a9..9785685 100644 --- a/templates/designToConfigParser.jinja +++ b/templates/designToConfigParser.jinja @@ -93,7 +93,7 @@ bool {{functionPrefix}}evaluateActive( {% for class_name in designInspector.get_names_of_all_classes() %} {% set cls = designInspector.objectify_class(class_name) %} -bool {{functionPrefix}}configure{{class_name}} ( +bool {{functionPrefix}}configureFromXML{{class_name}} ( int docNum, int childNode, string prefix, @@ -103,7 +103,7 @@ bool {{functionPrefix}}configure{{class_name}} ( mapping addressActiveControl, mapping connectionSettings) { - DebugTN("Configure.{{class_name}} called"); + DebugTN("Configure.{{class_name}} called from XML"); string name; if(xmlGetElementAttribute(docNum, childNode, "name", name) != 0) { @@ -118,6 +118,31 @@ bool {{functionPrefix}}configure{{class_name}} ( {% endif %} } + string fullName = prefix+name; + bool success = {{functionPrefix}}configureFromName{{class_name}}(name, prefix, createDps, assignAddresses, continueOnError, addressActiveControl, connectionSettings); + + dyn_int children; + {% for ho in designInspector.objectify_has_objects(class_name, "[@instantiateUsing='configuration']") %} + {# {% for ho in designInspector.objectify_has_objects(class_name, "") %} #} + {{debug(ho.get('class'), ho.get('name'))}} + children = {{functionPrefix}}getChildNodesWithName(docNum, childNode, "{{ho.get('class')}}"); + for (int i=1; i<=dynlen(children); i++) + {{functionPrefix}}configureFromXML{{ho.get('class')}} (docNum, children[i], fullName+"/", createDps, assignAddresses, continueOnError, addressActiveControl, connectionSettings); + {% endfor %} + + return success; +} + +bool {{functionPrefix}}configureFromName{{class_name}} ( + string name, + string prefix, + bool createDps, + bool assignAddresses, + bool continueOnError, + mapping addressActiveControl, + mapping connectionSettings) +{ + DebugTN("Configure.{{class_name}} called without XML"); string fullName = prefix+name; string dpt = "{{typePrefix}}{{class_name}}"; @@ -197,13 +222,14 @@ bool {{functionPrefix}}configure{{class_name}} ( } } - dyn_int children; - {% for ho in designInspector.objectify_has_objects(class_name, "[@instantiateUsing='configuration']") %} - children = {{functionPrefix}}getChildNodesWithName(docNum, childNode, "{{ho.get('class')}}"); - for (int i=1; i<=dynlen(children); i++) - {{functionPrefix}}configure{{ho.get('class')}} (docNum, children[i], fullName+"/", createDps, assignAddresses, continueOnError, addressActiveControl, connectionSettings); + // Parse children instantiated from design + {% for ho in designInspector.objectify_has_objects(class_name, "[@instantiateUsing='design']")%} + {% for obj in ho.object %} + {{debug(obj.get('name'))}} + {{functionPrefix}}configureFromName{{ho.get('class')}}("{{obj.get('name')}}", fullName+"/", createDps, assignAddresses, continueOnError, addressActiveControl, connectionSettings); + {% endfor %} + {{debug(ho.get('class'), ho.get('name'), 'needs to be generated from design')}} {% endfor %} - } {% endfor %} @@ -314,7 +340,7 @@ int {{functionPrefix}}parseConfig ( dyn_int children = {{functionPrefix}}getChildNodesWithName(docNum, firstNode, "{{ho.get('class')}}"); for (int i = 1; i<=dynlen(children); i++) { - {{functionPrefix}}configure{{ho.get('class')}} (docNum, children[i], "", createDps, assignAddresses, continueOnError, addressActiveControl, connectionSettings); + {{functionPrefix}}configureFromXML{{ho.get('class')}} (docNum, children[i], "", createDps, assignAddresses, continueOnError, addressActiveControl, connectionSettings); } {% elif ho.get('instantiateUsing') == 'design' %} {{debug("WARNING: Skipping objects instantiated by design. For pure design instantiation ")}} From 270fa4fa76a28758f5a6fbb6d0cf9798262c8b56 Mon Sep 17 00:00:00 2001 From: Kees Benkendorfer Date: Wed, 17 Jul 2024 10:57:07 +0200 Subject: [PATCH 2/4] Remove extraneous debug statements --- templates/designToConfigParser.jinja | 3 --- 1 file changed, 3 deletions(-) diff --git a/templates/designToConfigParser.jinja b/templates/designToConfigParser.jinja index 9785685..33ec209 100644 --- a/templates/designToConfigParser.jinja +++ b/templates/designToConfigParser.jinja @@ -124,7 +124,6 @@ bool {{functionPrefix}}configureFromXML{{class_name}} ( dyn_int children; {% for ho in designInspector.objectify_has_objects(class_name, "[@instantiateUsing='configuration']") %} {# {% for ho in designInspector.objectify_has_objects(class_name, "") %} #} - {{debug(ho.get('class'), ho.get('name'))}} children = {{functionPrefix}}getChildNodesWithName(docNum, childNode, "{{ho.get('class')}}"); for (int i=1; i<=dynlen(children); i++) {{functionPrefix}}configureFromXML{{ho.get('class')}} (docNum, children[i], fullName+"/", createDps, assignAddresses, continueOnError, addressActiveControl, connectionSettings); @@ -225,10 +224,8 @@ bool {{functionPrefix}}configureFromName{{class_name}} ( // Parse children instantiated from design {% for ho in designInspector.objectify_has_objects(class_name, "[@instantiateUsing='design']")%} {% for obj in ho.object %} - {{debug(obj.get('name'))}} {{functionPrefix}}configureFromName{{ho.get('class')}}("{{obj.get('name')}}", fullName+"/", createDps, assignAddresses, continueOnError, addressActiveControl, connectionSettings); {% endfor %} - {{debug(ho.get('class'), ho.get('name'), 'needs to be generated from design')}} {% endfor %} } From e184edd7861c3c786b9463eaed68444411b72234 Mon Sep 17 00:00:00 2001 From: Kees Benkendorfer Date: Wed, 21 Aug 2024 16:54:59 +0200 Subject: [PATCH 3/4] Restore signature of configure function to ensure backward compatibility --- templates/designToConfigParser.jinja | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/templates/designToConfigParser.jinja b/templates/designToConfigParser.jinja index 33ec209..8351958 100644 --- a/templates/designToConfigParser.jinja +++ b/templates/designToConfigParser.jinja @@ -93,7 +93,7 @@ bool {{functionPrefix}}evaluateActive( {% for class_name in designInspector.get_names_of_all_classes() %} {% set cls = designInspector.objectify_class(class_name) %} -bool {{functionPrefix}}configureFromXML{{class_name}} ( +bool {{functionPrefix}}configure{{class_name}} ( int docNum, int childNode, string prefix, @@ -126,7 +126,7 @@ bool {{functionPrefix}}configureFromXML{{class_name}} ( {# {% for ho in designInspector.objectify_has_objects(class_name, "") %} #} children = {{functionPrefix}}getChildNodesWithName(docNum, childNode, "{{ho.get('class')}}"); for (int i=1; i<=dynlen(children); i++) - {{functionPrefix}}configureFromXML{{ho.get('class')}} (docNum, children[i], fullName+"/", createDps, assignAddresses, continueOnError, addressActiveControl, connectionSettings); + {{functionPrefix}}configure{{ho.get('class')}} (docNum, children[i], fullName+"/", createDps, assignAddresses, continueOnError, addressActiveControl, connectionSettings); {% endfor %} return success; @@ -337,7 +337,7 @@ int {{functionPrefix}}parseConfig ( dyn_int children = {{functionPrefix}}getChildNodesWithName(docNum, firstNode, "{{ho.get('class')}}"); for (int i = 1; i<=dynlen(children); i++) { - {{functionPrefix}}configureFromXML{{ho.get('class')}} (docNum, children[i], "", createDps, assignAddresses, continueOnError, addressActiveControl, connectionSettings); + {{functionPrefix}}configure{{ho.get('class')}} (docNum, children[i], "", createDps, assignAddresses, continueOnError, addressActiveControl, connectionSettings); } {% elif ho.get('instantiateUsing') == 'design' %} {{debug("WARNING: Skipping objects instantiated by design. For pure design instantiation ")}} From 0315c4e8756e8d278bd6c5eab84511f9786b3c40 Mon Sep 17 00:00:00 2001 From: ITk Strips SR1 Team Date: Fri, 11 Oct 2024 20:19:32 +0200 Subject: [PATCH 4/4] Remove unneeded comment and log detail --- templates/designToConfigParser.jinja | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/templates/designToConfigParser.jinja b/templates/designToConfigParser.jinja index 8351958..ca98c06 100644 --- a/templates/designToConfigParser.jinja +++ b/templates/designToConfigParser.jinja @@ -103,7 +103,7 @@ bool {{functionPrefix}}configure{{class_name}} ( mapping addressActiveControl, mapping connectionSettings) { - DebugTN("Configure.{{class_name}} called from XML"); + DebugTN("Configure.{{class_name}} called"); string name; if(xmlGetElementAttribute(docNum, childNode, "name", name) != 0) { @@ -123,7 +123,6 @@ bool {{functionPrefix}}configure{{class_name}} ( dyn_int children; {% for ho in designInspector.objectify_has_objects(class_name, "[@instantiateUsing='configuration']") %} - {# {% for ho in designInspector.objectify_has_objects(class_name, "") %} #} children = {{functionPrefix}}getChildNodesWithName(docNum, childNode, "{{ho.get('class')}}"); for (int i=1; i<=dynlen(children); i++) {{functionPrefix}}configure{{ho.get('class')}} (docNum, children[i], fullName+"/", createDps, assignAddresses, continueOnError, addressActiveControl, connectionSettings);