mirror of
https://github.com/paparazzi/paparazzi.git
synced 2026-05-24 13:55:51 +08:00
[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:
+4
-2
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user