[flight_plan] allow variable declaration from flight plan

- can be used localy in the flight plan to avoid adding new variables in
  the base code when it can be avoided
- with appropriate attributes, will generate a settings accessible from
  the GCS
This commit is contained in:
Gautier Hattenberger
2016-02-05 00:36:18 +01:00
parent 987755f61f
commit 579fdf4acd
4 changed files with 76 additions and 6 deletions
+4 -2
View File
@@ -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
+20 -1
View File
@@ -1,6 +1,6 @@
<!-- Paparazzi flight plan DTD -->
<!ELEMENT flight_plan (header?,waypoints,sectors?,includes?,exceptions?,blocks)>
<!ELEMENT flight_plan (header?,waypoints,sectors?,variables?,includes?,exceptions?,blocks)>
<!ELEMENT procedure (param*,header?,waypoints?,sectors?,exceptions?,blocks?)>
@@ -14,6 +14,9 @@
<!ELEMENT corner EMPTY>
<!ELEMENT kml EMPTY>
<!ELEMENT variables (variable*)>
<!ELEMENT variable EMPTY>
<!ELEMENT includes (include*)>
<!ELEMENT exceptions (exception*)>
@@ -86,6 +89,22 @@ name CDATA #REQUIRED>
<!ATTLIST kml
file CDATA #REQUIRED>
<!ATTLIST variables>
<!ATTLIST variable
var CDATA #REQUIRED
type CDATA #IMPLIED
init CDATA #IMPLIED
shortname CDATA #IMPLIED
min CDATA #IMPLIED
max CDATA #IMPLIED
step CDATA #IMPLIED
unit CDATA #IMPLIED
alt_unit CDATA #IMPLIED
alt_unit_coef CDATA #IMPLIED
values CDATA #IMPLIED>
<!ATTLIST blocks>
<!ATTLIST block
+2 -2
View File
@@ -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
+50 -1
View File
@@ -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 "<!-- This file has been generated by gen_flight_plan from %s -->\n" xml_file;
fprintf out_set "<!-- Version %s -->\n" (Env.get_paparazzi_version ());
fprintf out_set "<!-- Please DO NOT EDIT -->\n\n";
fprintf out_set "<settings>\n";
fprintf out_set " <dl_settings>\n";
(* add tab only if their are some variables *)
if List.length variables > 0 then
fprintf out_set " <dl_settings name=\"Flight Plan\">\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 " </dl_settings>\n";
fprintf out_set " </dl_settings>\n";
fprintf out_set "</settings>\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