From 085f53ac538f6ea626bfd02152a4d60ed28d6fd8 Mon Sep 17 00:00:00 2001 From: Frederik Pasch Date: Thu, 6 Mar 2025 21:13:51 +0100 Subject: [PATCH] support conditional wait --- docs/openscenarioDSL.rst | 2 +- .../model/model_to_py_tree.py | 25 +++++++++++++------ 2 files changed, 19 insertions(+), 8 deletions(-) diff --git a/docs/openscenarioDSL.rst b/docs/openscenarioDSL.rst index cb55a734..22763a4c 100644 --- a/docs/openscenarioDSL.rst +++ b/docs/openscenarioDSL.rst @@ -72,7 +72,7 @@ Element Tag Support Notes ``float`` :raw-html:`✅` ``global`` :raw-html:`✅` ``hard`` :raw-html:`❌` -``if`` :raw-html:`❌` +``if`` :raw-html:`✅` ``import`` :raw-html:`✅` ``inherits`` :raw-html:`✅` ``int`` :raw-html:`✅` diff --git a/scenario_execution/scenario_execution/model/model_to_py_tree.py b/scenario_execution/scenario_execution/model/model_to_py_tree.py index c6457e61..4fcdad22 100644 --- a/scenario_execution/scenario_execution/model/model_to_py_tree.py +++ b/scenario_execution/scenario_execution/model/model_to_py_tree.py @@ -171,14 +171,25 @@ def visit_do_member(self, node: DoMember): self.__cur_behavior = parent def visit_wait_directive(self, node: WaitDirective): - child = node.get_only_child() - - if isinstance(child, (EventCondition, EventReference)): - behavior = self.visit(child) - - self.__cur_behavior.add_child(behavior) + condition = None + reference = None + for child in node.get_children(): + if isinstance(child, EventCondition): + condition = self.visit(child) + elif isinstance(child, EventReference): + reference = self.visit(child) + else: + raise OSC2ParsingError(msg="Invalid wait directive.", context=node.get_ctx()) + + if condition is None: + self.__cur_behavior.add_child(reference) + elif reference is None: + self.__cur_behavior.add_child(condition) else: - raise OSC2ParsingError(msg="Invalid wait directive.", context=node.get_ctx()) + conditional_wait = py_trees.composites.Sequence(name="wait conditional", memory=False) + conditional_wait.add_child(reference) + conditional_wait.add_child(condition) + self.__cur_behavior.add_child(conditional_wait) def visit_emit_directive(self, node: EmitDirective): if node.event_name in ['start', 'end', 'fail']: