diff --git a/Makefile.ac b/Makefile.ac
index 5f3f2ec4ea..b3b9b88439 100644
--- a/Makefile.ac
+++ b/Makefile.ac
@@ -56,6 +56,7 @@ SETTINGS_XML=$(AIRCRAFT_BUILD_DIR)/settings.xml
SETTINGS_MODULES=$(AIRCRAFT_BUILD_DIR)/settings_modules.xml
SETTINGS_TELEMETRY=$(AIRCRAFT_BUILD_DIR)/settings_telemetry.xml
SETTINGS_AUTOPILOT=$(AIRCRAFT_BUILD_DIR)/settings_autopilot.xml
+SETTINGS_FLIGHTPLAN=$(AIRCRAFT_BUILD_DIR)/settings_flightplan.xml
MAKEFILE_AC=$(AIRCRAFT_BUILD_DIR)/Makefile.ac
MODULES_H=$(AC_GENERATED)/modules.h
MODULES_DIR=$(PAPARAZZI_HOME)/conf/modules/
@@ -186,7 +187,7 @@ $(FLIGHT_PLAN_H) : $(CONF)/$(FLIGHT_PLAN) $(CONF_XML) $(GENERATORS)/gen_flight_p
$(Q)test -d $(AC_GENERATED) || mkdir -p $(AC_GENERATED)
@echo GENERATE $@ from $(FLIGHT_PLAN)
$(eval $@_TMP := $(shell $(MKTEMP)))
- $(Q)$(GENERATORS)/gen_flight_plan.out $< > $($@_TMP)
+ $(Q)$(GENERATORS)/gen_flight_plan.out -settings $(SETTINGS_FLIGHTPLAN) $< > $($@_TMP)
$(Q)mv $($@_TMP) $@
$(Q)chmod a+r $@
$(Q)cp $< $(AIRCRAFT_CONF_DIR)/flight_plans
@@ -202,7 +203,7 @@ $(SETTINGS_H) : $(SETTINGS_XMLS_DEP) $(CONF_XML) $(SETTINGS_MODULES) $(SETTINGS_
$(Q)test -d $(AC_GENERATED) || mkdir -p $(AC_GENERATED)
@echo GENERATE $@
$(eval $@_TMP := $(shell $(MKTEMP)))
- $(Q)$(GENERATORS)/gen_settings.out $(SETTINGS_XML) $(SETTINGS_TELEMETRY) $(SETTINGS_XMLS) $(SETTINGS_MODULES) > $($@_TMP)
+ $(Q)$(GENERATORS)/gen_settings.out $(SETTINGS_XML) $(SETTINGS_TELEMETRY) $(SETTINGS_XMLS) $(SETTINGS_FLIGHTPLAN) $(SETTINGS_MODULES) > $($@_TMP)
$(Q)mv $($@_TMP) $@
$(Q)chmod a+r $@
$(Q)cp $(SETTINGS_XMLS_DEP) $(AIRCRAFT_CONF_DIR)/settings
@@ -222,6 +223,7 @@ autopilot_h : $(CONF)/$(AIRFRAME_XML) $(GENERATORS)/gen_autopilot.out $(CONF)/au
$(SETTINGS_MODULES) : $(MODULES_H)
$(SETTINGS_TELEMETRY) : $(PERIODIC_H)
+$(SETTINGS_FLIGHTPLAN) : $(FLIGHT_PLAN_H)
%.ac_h : $(GENERATORS)/gen_aircraft.out
$(Q)if (expr "$(AIRCRAFT)") > /dev/null; then : ; else echo "AIRCRAFT undefined: type 'make AIRCRAFT=AircraftName ...'"; exit 1; fi
diff --git a/conf/flight_plans/flight_plan.dtd b/conf/flight_plans/flight_plan.dtd
index 1fc5ab2079..0d9e67e35c 100644
--- a/conf/flight_plans/flight_plan.dtd
+++ b/conf/flight_plans/flight_plan.dtd
@@ -1,6 +1,6 @@
-
+
@@ -14,6 +14,9 @@
+
+
+
@@ -86,6 +89,22 @@ name CDATA #REQUIRED>
+
+
+
+
+
+
+
+
@@ -146,6 +149,12 @@
+
+
+
+
+
+
diff --git a/sw/tools/generators/gen_aircraft.ml b/sw/tools/generators/gen_aircraft.ml
index 0d7cd69f38..b4e109fcfa 100644
--- a/sw/tools/generators/gen_aircraft.ml
+++ b/sw/tools/generators/gen_aircraft.ml
@@ -397,9 +397,9 @@ let () =
(* Get TARGET env, needed to build modules.h according to the target *)
let t = try Printf.sprintf "TARGET=%s" (Sys.getenv "TARGET") with _ -> "" in
+ make_opt "flight_plan_ac_h" "FLIGHT_PLAN" "flight_plan";
make "all_ac_h" t;
- make_opt "radio_ac_h" "RADIO" "radio";
- make_opt "flight_plan_ac_h" "FLIGHT_PLAN" "flight_plan"
+ make_opt "radio_ac_h" "RADIO" "radio"
with Failure f ->
prerr_endline f;
exit 1
diff --git a/sw/tools/generators/gen_flight_plan.ml b/sw/tools/generators/gen_flight_plan.ml
index 0df844cbdd..f48841f4d5 100644
--- a/sw/tools/generators/gen_flight_plan.ml
+++ b/sw/tools/generators/gen_flight_plan.ml
@@ -796,12 +796,44 @@ let parse_wpt_sector = fun indexes waypoints xml ->
(sector_name, List.map p2D_of (Xml.children xml))
+let parse_variables = fun xml ->
+ List.map (fun var ->
+ let v = ExtXml.attrib var "var"
+ and t = ExtXml.attrib_or_default var "type" "float"
+ and i = ExtXml.attrib_or_default var "init" "0" in
+ (t, v, i)
+ ) xml
+
+let write_settings = fun xml_file out_set variables ->
+ fprintf out_set "\n" xml_file;
+ fprintf out_set "\n" (Env.get_paparazzi_version ());
+ fprintf out_set "\n\n";
+ fprintf out_set "\n";
+ fprintf out_set " \n";
+ (* add tab only if their are some variables *)
+ if List.length variables > 0 then
+ fprintf out_set " \n";
+ List.iter (fun v ->
+ let attribs = Xml.attribs v in
+ (* remove some incompatible attributes *)
+ let attribs = List.filter (fun (a, _) -> not (a = "init")) attribs in
+ let xml = Xml.Element ("dl_setting", attribs @ ["module", "generated/flight_plan"], []) in
+ fprintf out_set " %s\n" (Xml.to_string xml);
+ ) variables;
+ if List.length variables > 0 then
+ fprintf out_set " \n";
+ fprintf out_set " \n";
+ fprintf out_set "\n"
+
+
(************************** MAIN ******************************************)
let () =
let xml_file = ref "fligh_plan.xml"
+ and set_file = ref None
and dump = ref false in
Arg.parse [ ("-check", Arg.Set check_expressions, "Enable expression checking");
- ("-dump", Arg.Set dump, "Dump compile result") ]
+ ("-dump", Arg.Set dump, "Dump compile result");
+ ("-settings", Arg.String (fun f -> set_file := Some f), "Settings file for flight plan variables") ]
(fun f -> xml_file := f)
"Usage:";
if !xml_file = "" then
@@ -822,6 +854,7 @@ let () =
let xml = ExtXml.subst_child "blocks" (index_blocks (element "blocks" [] blocks)) xml in
let waypoints = Xml.children (ExtXml.child xml "waypoints")
+ and variables = try Xml.children (ExtXml.child xml "variables") with _ -> []
and blocks = Xml.children (ExtXml.child xml "blocks")
and global_exceptions = try Xml.children (ExtXml.child xml "exceptions") with _ -> [] in
@@ -921,8 +954,24 @@ let () =
Xml2h.define "HOME_MODE_HEIGHT" (sof home_mode_height);
Xml2h.define "MAX_DIST_FROM_HOME" (sof mdfh);
+ (* output settings file if needed *)
+ begin
+ match !set_file with
+ | Some f ->
+ let out_set = open_out f in
+ write_settings !xml_file out_set variables;
+ close_out out_set
+ | None -> ()
+ end;
+ lprintf "\n";
+ let variables = parse_variables variables in
+ List.iter (fun (t, v, _) -> printf "extern %s %s;\n" t v) variables;
+
lprintf "\n#ifdef NAV_C\n\n";
+ List.iter (fun (t, v, i) -> printf "%s %s = %s;\n" t v i) variables;
+ lprintf "\n";
+
let index_of_waypoints =
let i = ref (-1) in
List.map (fun w -> incr i; (name_of w, !i)) waypoints in