diff --git a/conf/flight_plans/flight_plan.dtd b/conf/flight_plans/flight_plan.dtd
index 993e43eaec..7bb321a6d6 100644
--- a/conf/flight_plans/flight_plan.dtd
+++ b/conf/flight_plans/flight_plan.dtd
@@ -27,14 +27,14 @@
-
+
-
-
+
+
@@ -43,6 +43,7 @@
+
@@ -216,6 +217,10 @@ until CDATA #IMPLIED
loop CDATA #IMPLIED
break CDATA #IMPLIED>
+
+
-
+
-
+
-
+
-
+
-
+
@@ -111,30 +111,30 @@
-
+
-
+
-
+
-
+
-
+
-
+
diff --git a/sw/tools/generators/gen_flight_plan.ml b/sw/tools/generators/gen_flight_plan.ml
index d1bdd83799..012033817a 100644
--- a/sw/tools/generators/gen_flight_plan.ml
+++ b/sw/tools/generators/gen_flight_plan.ml
@@ -303,7 +303,7 @@ let rec index_stage = fun x ->
let l = List.map index_stage (Xml.children x) in
incr stage; (* To count the loop stage *)
Xml.Element (Xml.tag x, Xml.attribs x@["no", soi n], l)
- | "return" | "goto" | "deroute" | "exit_block" | "follow" | "call" | "home"
+ | "return" | "goto" | "deroute" | "exit_block" | "follow" | "call" | "call_once" | "home"
| "heading" | "attitude" | "manual" | "go" | "stay" | "xyz" | "set" | "circle" ->
incr stage;
Xml.Element (Xml.tag x, Xml.attribs x@["no", soi !stage], Xml.children x)
@@ -579,6 +579,18 @@ let rec print_stage = fun index_of_waypoints x ->
end;
| _ -> failwith "FP: 'call' loop attribute must be TRUE or FALSE"
end
+ | "call_once" ->
+ (* call_once is an alias for *)
+ stage ();
+ let statement = ExtXml.attrib x "fun" in
+ (* by default, go to next stage immediately *)
+ let break = String.uppercase (ExtXml.attrib_or_default x "break" "FALSE") in
+ lprintf "%s;\n" statement;
+ begin match break with
+ | "TRUE" -> lprintf "NextStageAndBreak();\n";
+ | "FALSE" -> lprintf "NextStage();\n";
+ | _ -> failwith "FP: 'call_once' break attribute must be TRUE or FALSE";
+ end;
| "survey_rectangle" ->
let grid = parsed_attrib x "grid"
and wp1 = get_index_waypoint (ExtXml.attrib x "wp1") index_of_waypoints