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> + + + + + "" 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