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