mirror of
https://github.com/paparazzi/paparazzi.git
synced 2026-06-04 13:55:40 +08:00
Merge pull request #1530 from paparazzi/flight_plan_variables
[flight_plan] allow variable declaration from flight plan
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_MODULES=$(AIRCRAFT_BUILD_DIR)/settings_modules.xml
|
||||||
SETTINGS_TELEMETRY=$(AIRCRAFT_BUILD_DIR)/settings_telemetry.xml
|
SETTINGS_TELEMETRY=$(AIRCRAFT_BUILD_DIR)/settings_telemetry.xml
|
||||||
SETTINGS_AUTOPILOT=$(AIRCRAFT_BUILD_DIR)/settings_autopilot.xml
|
SETTINGS_AUTOPILOT=$(AIRCRAFT_BUILD_DIR)/settings_autopilot.xml
|
||||||
|
SETTINGS_FLIGHTPLAN=$(AIRCRAFT_BUILD_DIR)/settings_flightplan.xml
|
||||||
MAKEFILE_AC=$(AIRCRAFT_BUILD_DIR)/Makefile.ac
|
MAKEFILE_AC=$(AIRCRAFT_BUILD_DIR)/Makefile.ac
|
||||||
MODULES_H=$(AC_GENERATED)/modules.h
|
MODULES_H=$(AC_GENERATED)/modules.h
|
||||||
MODULES_DIR=$(PAPARAZZI_HOME)/conf/modules/
|
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)
|
$(Q)test -d $(AC_GENERATED) || mkdir -p $(AC_GENERATED)
|
||||||
@echo GENERATE $@ from $(FLIGHT_PLAN)
|
@echo GENERATE $@ from $(FLIGHT_PLAN)
|
||||||
$(eval $@_TMP := $(shell $(MKTEMP)))
|
$(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)mv $($@_TMP) $@
|
||||||
$(Q)chmod a+r $@
|
$(Q)chmod a+r $@
|
||||||
$(Q)cp $< $(AIRCRAFT_CONF_DIR)/flight_plans
|
$(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)
|
$(Q)test -d $(AC_GENERATED) || mkdir -p $(AC_GENERATED)
|
||||||
@echo GENERATE $@
|
@echo GENERATE $@
|
||||||
$(eval $@_TMP := $(shell $(MKTEMP)))
|
$(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)mv $($@_TMP) $@
|
||||||
$(Q)chmod a+r $@
|
$(Q)chmod a+r $@
|
||||||
$(Q)cp $(SETTINGS_XMLS_DEP) $(AIRCRAFT_CONF_DIR)/settings
|
$(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_MODULES) : $(MODULES_H)
|
||||||
$(SETTINGS_TELEMETRY) : $(PERIODIC_H)
|
$(SETTINGS_TELEMETRY) : $(PERIODIC_H)
|
||||||
|
$(SETTINGS_FLIGHTPLAN) : $(FLIGHT_PLAN_H)
|
||||||
|
|
||||||
%.ac_h : $(GENERATORS)/gen_aircraft.out
|
%.ac_h : $(GENERATORS)/gen_aircraft.out
|
||||||
$(Q)if (expr "$(AIRCRAFT)") > /dev/null; then : ; else echo "AIRCRAFT undefined: type 'make AIRCRAFT=AircraftName ...'"; exit 1; fi
|
$(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 -->
|
<!-- 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?)>
|
<!ELEMENT procedure (param*,header?,waypoints?,sectors?,exceptions?,blocks?)>
|
||||||
|
|
||||||
@@ -14,6 +14,9 @@
|
|||||||
<!ELEMENT corner EMPTY>
|
<!ELEMENT corner EMPTY>
|
||||||
<!ELEMENT kml EMPTY>
|
<!ELEMENT kml EMPTY>
|
||||||
|
|
||||||
|
<!ELEMENT variables (variable*)>
|
||||||
|
<!ELEMENT variable EMPTY>
|
||||||
|
|
||||||
<!ELEMENT includes (include*)>
|
<!ELEMENT includes (include*)>
|
||||||
|
|
||||||
<!ELEMENT exceptions (exception*)>
|
<!ELEMENT exceptions (exception*)>
|
||||||
@@ -86,6 +89,22 @@ name CDATA #REQUIRED>
|
|||||||
<!ATTLIST kml
|
<!ATTLIST kml
|
||||||
file CDATA #REQUIRED>
|
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 blocks>
|
||||||
|
|
||||||
<!ATTLIST block
|
<!ATTLIST block
|
||||||
|
|||||||
@@ -29,6 +29,9 @@
|
|||||||
<corner name="_4"/>
|
<corner name="_4"/>
|
||||||
</sector>
|
</sector>
|
||||||
</sectors>
|
</sectors>
|
||||||
|
<variables>
|
||||||
|
<variable var="roll_step" init="15." min="0." max="50." step="1.0"/>
|
||||||
|
</variables>
|
||||||
<exceptions/>
|
<exceptions/>
|
||||||
<blocks>
|
<blocks>
|
||||||
<block name="Wait GPS">
|
<block name="Wait GPS">
|
||||||
@@ -146,6 +149,12 @@
|
|||||||
<attitude alt="250" roll="-20.0" until="stage_time > 3" vmode="alt"/>
|
<attitude alt="250" roll="-20.0" until="stage_time > 3" vmode="alt"/>
|
||||||
</while>
|
</while>
|
||||||
</block>
|
</block>
|
||||||
|
<block name="Steps roll from var">
|
||||||
|
<while cond="TRUE">
|
||||||
|
<attitude alt="250" roll="roll_step" until=" stage_time > 3" vmode="alt"/>
|
||||||
|
<attitude alt="250" roll="-roll_step" until="stage_time > 3" vmode="alt"/>
|
||||||
|
</while>
|
||||||
|
</block>
|
||||||
<block name="Steps pitch -10, +10">
|
<block name="Steps pitch -10, +10">
|
||||||
<while cond="TRUE">
|
<while cond="TRUE">
|
||||||
<attitude alt="250" pitch="10" roll="0.0" until=" stage_time > 2" vmode="alt"/>
|
<attitude alt="250" pitch="10" roll="0.0" until=" stage_time > 2" vmode="alt"/>
|
||||||
|
|||||||
@@ -397,9 +397,9 @@ let () =
|
|||||||
|
|
||||||
(* Get TARGET env, needed to build modules.h according to the target *)
|
(* Get TARGET env, needed to build modules.h according to the target *)
|
||||||
let t = try Printf.sprintf "TARGET=%s" (Sys.getenv "TARGET") with _ -> "" in
|
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 "all_ac_h" t;
|
||||||
make_opt "radio_ac_h" "RADIO" "radio";
|
make_opt "radio_ac_h" "RADIO" "radio"
|
||||||
make_opt "flight_plan_ac_h" "FLIGHT_PLAN" "flight_plan"
|
|
||||||
with Failure f ->
|
with Failure f ->
|
||||||
prerr_endline f;
|
prerr_endline f;
|
||||||
exit 1
|
exit 1
|
||||||
|
|||||||
@@ -796,12 +796,44 @@ let parse_wpt_sector = fun indexes waypoints xml ->
|
|||||||
(sector_name, List.map p2D_of (Xml.children 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 ******************************************)
|
(************************** MAIN ******************************************)
|
||||||
let () =
|
let () =
|
||||||
let xml_file = ref "fligh_plan.xml"
|
let xml_file = ref "fligh_plan.xml"
|
||||||
|
and set_file = ref None
|
||||||
and dump = ref false in
|
and dump = ref false in
|
||||||
Arg.parse [ ("-check", Arg.Set check_expressions, "Enable expression checking");
|
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)
|
(fun f -> xml_file := f)
|
||||||
"Usage:";
|
"Usage:";
|
||||||
if !xml_file = "" then
|
if !xml_file = "" then
|
||||||
@@ -822,6 +854,7 @@ let () =
|
|||||||
|
|
||||||
let xml = ExtXml.subst_child "blocks" (index_blocks (element "blocks" [] blocks)) xml in
|
let xml = ExtXml.subst_child "blocks" (index_blocks (element "blocks" [] blocks)) xml in
|
||||||
let waypoints = Xml.children (ExtXml.child xml "waypoints")
|
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 blocks = Xml.children (ExtXml.child xml "blocks")
|
||||||
and global_exceptions = try Xml.children (ExtXml.child xml "exceptions") with _ -> [] in
|
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 "HOME_MODE_HEIGHT" (sof home_mode_height);
|
||||||
Xml2h.define "MAX_DIST_FROM_HOME" (sof mdfh);
|
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";
|
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 index_of_waypoints =
|
||||||
let i = ref (-1) in
|
let i = ref (-1) in
|
||||||
List.map (fun w -> incr i; (name_of w, !i)) waypoints in
|
List.map (fun w -> incr i; (name_of w, !i)) waypoints in
|
||||||
|
|||||||
Reference in New Issue
Block a user