mirror of
https://github.com/paparazzi/paparazzi.git
synced 2026-06-02 13:27:32 +08:00
[settings] improve settings in pprzcenter
- check box for faster enable/disable - loading from modules
This commit is contained in:
@@ -6,6 +6,9 @@
|
||||
<define name="HACKHD_SYNC_SEND" value="TRUE|FALSE" description="enable telemetry report on camera position"/>
|
||||
<define name="HACKHD_LOG" value="TRUE|FALSE" description="enable logging of camera shot orientation and position"/>
|
||||
</doc>
|
||||
<settings>
|
||||
<file name="modules/hackhd.xml"/>
|
||||
</settings>
|
||||
<header>
|
||||
<file name="hackhd.h"/>
|
||||
</header>
|
||||
|
||||
@@ -8,6 +8,9 @@
|
||||
<configure name="ADC_IR_TOP" value="ADC_0" description="ADC for IR vertical channel"/>
|
||||
<configure name="ADC_IR_NB_SAMPLES" value="16" description="number of samples"/>
|
||||
</doc>
|
||||
<settings>
|
||||
<file name="estimation/infrared.xml"/>
|
||||
</settings>
|
||||
<header>
|
||||
<file name="infrared_adc.h"/>
|
||||
</header>
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
<!-- Paparazzi Modules DTD -->
|
||||
|
||||
<!ELEMENT module (doc?,depend?,header,init*,periodic*,event*,datalink*,makefile*)>
|
||||
<!ELEMENT module (doc?,settings?,depend?,header,init*,periodic*,event*,datalink*,makefile*)>
|
||||
<!ELEMENT doc (description|define|configure|section)*>
|
||||
<!ELEMENT settings (file*)>
|
||||
<!ELEMENT depend EMPTY>
|
||||
<!ELEMENT header (file*)>
|
||||
<!ELEMENT init EMPTY>
|
||||
|
||||
@@ -55,7 +55,7 @@ PKGCOMMON=xml-light,netclient,glibivy,lablgtk2
|
||||
XINCLUDES=
|
||||
XPKGCOMMON=xml-light,glibivy,$(LABLGTK2GNOMECANVAS),lablgtk2.glade
|
||||
|
||||
SRC = fig.ml debug.ml base64.ml serial.ml ocaml_tools.ml expr_syntax.ml expr_parser.ml expr_lexer.ml extXml.ml env.ml xml2h.ml latlong.ml egm96.ml srtm.ml http.ml maps_support.ml gm.ml iGN.ml geometry_2d.ml cserial.o convert.o ubx.ml pprz.ml xbee.ml logpprz.ml xmlCom.ml os_calls.ml editAirframe.ml defivybus.ml fp_proc.ml
|
||||
SRC = fig.ml debug.ml base64.ml serial.ml ocaml_tools.ml expr_syntax.ml expr_parser.ml expr_lexer.ml extXml.ml env.ml xml2h.ml latlong.ml egm96.ml srtm.ml http.ml maps_support.ml gm.ml iGN.ml geometry_2d.ml cserial.o convert.o ubx.ml pprz.ml xbee.ml logpprz.ml xmlCom.ml os_calls.ml editAirframe.ml defivybus.ml fp_proc.ml gen_common.ml
|
||||
CMO = $(SRC:.ml=.cmo)
|
||||
CMX = $(SRC:.ml=.cmx)
|
||||
|
||||
|
||||
+9
-3
@@ -56,6 +56,12 @@ let gcs_icons_path = paparazzi_home // "data" // "pictures" // "gcs_icons"
|
||||
|
||||
let dump_fp = paparazzi_src // "sw" // "tools" // "generators" // "gen_flight_plan.out -dump"
|
||||
|
||||
(* filter settings and keep the ones without brackets *)
|
||||
let filter_settings = fun settings ->
|
||||
let sl = Str.split (Str.regexp "[ ]+") settings in
|
||||
let sl = List.filter (fun s -> not (s.[0] = '[' && s.[String.length s - 1] = ']')) sl in
|
||||
String.concat " " sl
|
||||
|
||||
let expand_ac_xml = fun ?(raise_exception = true) ac_conf ->
|
||||
let prefix = fun s -> sprintf "%s/conf/%s" paparazzi_home s in
|
||||
let parse_file = fun a file ->
|
||||
@@ -70,10 +76,10 @@ let expand_ac_xml = fun ?(raise_exception = true) ac_conf ->
|
||||
make_element "parse error" ["file",a; "msg", msg] []
|
||||
end in
|
||||
|
||||
let parse = fun a ->
|
||||
let parse = fun ?(pre_filter=(fun x -> x)) a ->
|
||||
List.map
|
||||
(fun filename -> parse_file a (prefix filename))
|
||||
(Str.split space_regexp (ExtXml.attrib ac_conf a)) in
|
||||
(Str.split space_regexp (pre_filter (ExtXml.attrib ac_conf a))) in
|
||||
|
||||
let parse_opt = fun a ->
|
||||
try parse a with ExtXml.Error _ -> [] in
|
||||
@@ -101,7 +107,7 @@ let expand_ac_xml = fun ?(raise_exception = true) ac_conf ->
|
||||
with _ -> []
|
||||
in
|
||||
|
||||
let pervasives = parse "airframe" @ parse "telemetry" @ parse "settings" in
|
||||
let pervasives = parse "airframe" @ parse "telemetry" @ parse ~pre_filter:filter_settings "settings" in
|
||||
let optionals = parse_opt "radio" @ parse_fp "flight_plan" @ pervasives in
|
||||
|
||||
let children = Xml.children ac_conf@optionals in
|
||||
|
||||
@@ -48,6 +48,11 @@ val gconf_file : string
|
||||
|
||||
val gcs_icons_path : string
|
||||
|
||||
val filter_settings : string -> string
|
||||
(** filter settings (a string separted by white spaces)
|
||||
* and keep the ones without brackets
|
||||
* (return a string of filtered name separate by white spaces) *)
|
||||
|
||||
val expand_ac_xml : ?raise_exception:bool -> Xml.xml -> Xml.xml
|
||||
(** Expands a conf.xml aircraft entry, adding the XML configuration files
|
||||
(listed as attributes) as children. Returns an element containing the error
|
||||
|
||||
+42
-13
@@ -113,46 +113,75 @@ let combo_connect = fun ((combo: #GEdit.combo_box), (_,column)) cb ->
|
||||
cb data))
|
||||
|
||||
|
||||
type tree = GTree.view * (GTree.list_store * string GTree.column)
|
||||
type tree = GTree.view * (GTree.list_store * string GTree.column * bool GTree.column * GTree.cell_renderer_toggle_signals)
|
||||
let tree_widget = fst
|
||||
let tree_model = snd
|
||||
|
||||
let tree = fun (t:GTree.view) ->
|
||||
let tree = fun ?(check_box=false) (t:GTree.view) ->
|
||||
let cols = new GTree.column_list in
|
||||
let col_name = cols#add Gobject.Data.string in
|
||||
let col_name = cols#add Gobject.Data.string
|
||||
and col_check = cols#add Gobject.Data.boolean in
|
||||
let store = GTree.list_store cols in
|
||||
t#set_model (Some store#coerce);
|
||||
let col1 = GTree.view_column ~renderer:(GTree.cell_renderer_text [], ["text",col_name]) () in
|
||||
ignore (t#append_column col1);
|
||||
(t , (store, col_name))
|
||||
let renderer = GTree.cell_renderer_toggle [`XALIGN 1.] in
|
||||
if check_box then begin
|
||||
let col2 = GTree.view_column ~renderer:(renderer, ["active",col_check]) () in
|
||||
ignore (t#append_column col2);
|
||||
(** Toggling a tree element *)
|
||||
let item_toggled = fun ~(model : GTree.list_store) ~column path ->
|
||||
let row = model#get_iter path in
|
||||
let b = model#get ~row ~column in
|
||||
model#set ~row ~column (not b);
|
||||
in
|
||||
ignore (renderer#connect#toggled ~callback:(item_toggled ~model:store ~column:col_check));
|
||||
end;
|
||||
(t , (store, col_name, col_check, renderer#connect))
|
||||
|
||||
let tree_of = fun (t:GTree.view) (m:(GTree.list_store * string GTree.column)) ->
|
||||
let tree_of = fun (t:GTree.view) (m:(GTree.list_store * string GTree.column * bool GTree.column * GTree.cell_renderer_toggle_signals)) ->
|
||||
(t, m)
|
||||
|
||||
let tree_values = fun (tree : tree) ->
|
||||
let (store, column) = tree_model tree in
|
||||
let tree_values = fun ?(only_checked=true) (tree : tree) ->
|
||||
let (store, name, check, _) = tree_model tree in
|
||||
let values = ref "" in
|
||||
store#foreach (fun _ row ->
|
||||
values := !values^" "^(store#get ~row ~column);
|
||||
let v = store#get ~row ~column:name
|
||||
and c = store#get ~row ~column:check in
|
||||
let v =
|
||||
if only_checked then
|
||||
if c then " "^v else ""
|
||||
else
|
||||
if c then " "^v else " ["^v^"]"
|
||||
in
|
||||
values := !values^v;
|
||||
false);
|
||||
!values
|
||||
|
||||
let get_selected_in_tree = fun (tree : tree) ->
|
||||
let (store, column) = tree_model tree in
|
||||
let (store, _, _, _) = tree_model tree in
|
||||
let t = tree_widget tree in
|
||||
let sel_paths = t#selection#get_selected_rows in
|
||||
List.map (fun p -> store#get_row_reference p) sel_paths
|
||||
|
||||
(* add element to the tree
|
||||
* if element is between brackets, set to unchecked
|
||||
* and remove brackets in tree name
|
||||
*)
|
||||
let add_to_tree = fun (tree : tree) string ->
|
||||
let (store, column) = tree_model tree in
|
||||
let (store, name, check, _) = tree_model tree in
|
||||
let row = store#append () in
|
||||
store#set ~row ~column string
|
||||
let l = String.length string in
|
||||
let checked = not (string.[0] = '[' && string.[l - 1] = ']') in
|
||||
let string = if not checked then String.sub string 1 (l - 2) else string in
|
||||
store#set ~row ~column:check checked;
|
||||
store#set ~row ~column:name string
|
||||
|
||||
let remove_selected_from_tree = fun (tree : tree) ->
|
||||
let selected = get_selected_in_tree tree in
|
||||
let (store, _) = tree_model tree in
|
||||
let (store, _, _, _) = tree_model tree in
|
||||
List.iter (fun r -> ignore (store#remove r#iter)) selected
|
||||
|
||||
let clear_tree = fun (tree : tree) ->
|
||||
let (store, _) = tree_model tree in
|
||||
let (store, _, _, _) = tree_model tree in
|
||||
store#clear ()
|
||||
|
||||
@@ -61,13 +61,14 @@ val combo_connect : combo -> (string -> unit) -> unit
|
||||
(*** Utilities for a tree view widget ***)
|
||||
type tree
|
||||
val tree_widget : tree -> GTree.view
|
||||
val tree_model : tree -> (GTree.list_store * string GTree.column)
|
||||
val tree_model : tree -> (GTree.list_store * string GTree.column * bool GTree.column * GTree.cell_renderer_toggle_signals)
|
||||
|
||||
val tree : GTree.view -> tree
|
||||
val tree_of : GTree.view -> (GTree.list_store * string GTree.column) -> tree
|
||||
val tree : ?check_box:bool -> GTree.view -> tree
|
||||
val tree_of : GTree.view -> (GTree.list_store * string GTree.column * bool GTree.column * GTree.cell_renderer_toggle_signals) -> tree
|
||||
|
||||
val tree_values : tree -> string
|
||||
val tree_values : ?only_checked:bool -> tree -> string
|
||||
val get_selected_in_tree : tree -> GTree.row_reference list
|
||||
val add_to_tree : tree -> string -> unit
|
||||
val remove_selected_from_tree : tree -> unit
|
||||
val clear_tree : tree -> unit
|
||||
|
||||
|
||||
@@ -45,7 +45,7 @@ PAPARAZZICENTERCMO = gtk_pc.cmo gtk_process.cmo pc_common.cmo pc_control_panel.c
|
||||
|
||||
all: paparazzicenter
|
||||
|
||||
paparazzicenter : $(PAPARAZZICENTERCMO)
|
||||
paparazzicenter : $(PAPARAZZICENTERCMO) $(LIBPPRZCMA) $(XLIBPPRZCMA)
|
||||
@echo OL $@
|
||||
$(Q)$(OCAMLC) $(INCLUDES) -o $@ $(XLINKPKG) gtkInit.cmo $^
|
||||
|
||||
|
||||
@@ -660,86 +660,98 @@
|
||||
<property name="can_focus">False</property>
|
||||
<property name="label_xalign">0</property>
|
||||
<child>
|
||||
<widget class="GtkAlignment" id="alignment56">
|
||||
<widget class="GtkVBox" id="vbox1">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="left_padding">12</property>
|
||||
<child>
|
||||
<widget class="GtkHBox" id="hbox58">
|
||||
<widget class="GtkAlignment" id="alignment56">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="left_padding">12</property>
|
||||
<child>
|
||||
<widget class="GtkTreeView" id="tree_settings">
|
||||
<property name="height_request">4</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="headers_visible">False</property>
|
||||
</widget>
|
||||
<packing>
|
||||
<property name="expand">True</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<widget class="GtkVScrollbar" id="tree_settings_scrollbar">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
</widget>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">1</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<widget class="GtkVBox" id="vbox1">
|
||||
<widget class="GtkHBox" id="hbox58">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<child>
|
||||
<widget class="GtkButton" id="button_browse_settings">
|
||||
<property name="label">gtk-add</property>
|
||||
<widget class="GtkTreeView" id="tree_settings">
|
||||
<property name="height_request">4</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="receives_default">True</property>
|
||||
<property name="has_tooltip">True</property>
|
||||
<property name="tooltip" translatable="yes">Add a settings file</property>
|
||||
<property name="use_action_appearance">False</property>
|
||||
<property name="use_underline">True</property>
|
||||
<property name="use_stock">True</property>
|
||||
<property name="headers_visible">False</property>
|
||||
</widget>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">False</property>
|
||||
<property name="expand">True</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<widget class="GtkButton" id="button_edit_settings">
|
||||
<property name="label">gtk-edit</property>
|
||||
<widget class="GtkVScrollbar" id="tree_settings_scrollbar">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="receives_default">True</property>
|
||||
<property name="has_tooltip">True</property>
|
||||
<property name="tooltip" translatable="yes">Launch an editor on all the settings file</property>
|
||||
<property name="use_action_appearance">False</property>
|
||||
<property name="use_stock">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
</widget>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">1</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<widget class="GtkButton" id="button_remove_settings">
|
||||
<property name="label">gtk-remove</property>
|
||||
<widget class="GtkVBox" id="vbox2">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="receives_default">True</property>
|
||||
<property name="tooltip" translatable="yes">Remove the selected settings file</property>
|
||||
<property name="use_action_appearance">False</property>
|
||||
<property name="use_stock">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<child>
|
||||
<widget class="GtkButton" id="button_browse_settings">
|
||||
<property name="label">gtk-add</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="receives_default">True</property>
|
||||
<property name="has_tooltip">True</property>
|
||||
<property name="tooltip" translatable="yes">Add a settings file</property>
|
||||
<property name="use_action_appearance">False</property>
|
||||
<property name="use_underline">True</property>
|
||||
<property name="use_stock">True</property>
|
||||
</widget>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">False</property>
|
||||
<property name="position">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<widget class="GtkButton" id="button_edit_settings">
|
||||
<property name="label">gtk-edit</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="receives_default">True</property>
|
||||
<property name="has_tooltip">True</property>
|
||||
<property name="tooltip" translatable="yes">Launch an editor on all the settings file</property>
|
||||
<property name="use_action_appearance">False</property>
|
||||
<property name="use_stock">True</property>
|
||||
</widget>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">False</property>
|
||||
<property name="position">1</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<widget class="GtkButton" id="button_remove_settings">
|
||||
<property name="label">gtk-remove</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="receives_default">True</property>
|
||||
<property name="has_tooltip">True</property>
|
||||
<property name="tooltip" translatable="yes">Remove the selected settings file</property>
|
||||
<property name="use_action_appearance">False</property>
|
||||
<property name="use_stock">True</property>
|
||||
</widget>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">False</property>
|
||||
<property name="position">2</property>
|
||||
</packing>
|
||||
</child>
|
||||
</widget>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
@@ -748,13 +760,56 @@
|
||||
</packing>
|
||||
</child>
|
||||
</widget>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">False</property>
|
||||
<property name="position">2</property>
|
||||
</packing>
|
||||
</child>
|
||||
</widget>
|
||||
<packing>
|
||||
<property name="expand">True</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<widget class="GtkAlignment" id="alignment2">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="top_padding">4</property>
|
||||
<property name="left_padding">12</property>
|
||||
<child>
|
||||
<widget class="GtkHBox" id="hbox1">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<child>
|
||||
<widget class="GtkTreeView" id="tree_settings_modules">
|
||||
<property name="height_request">3</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="headers_visible">False</property>
|
||||
</widget>
|
||||
<packing>
|
||||
<property name="expand">True</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<widget class="GtkVScrollbar" id="tree_settings_modules_scrollbar">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
</widget>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">1</property>
|
||||
</packing>
|
||||
</child>
|
||||
</widget>
|
||||
</child>
|
||||
</widget>
|
||||
<packing>
|
||||
<property name="expand">True</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">1</property>
|
||||
</packing>
|
||||
</child>
|
||||
</widget>
|
||||
</child>
|
||||
|
||||
+118
-62
@@ -37,15 +37,16 @@ let string_of_gdkcolor = fun c ->
|
||||
|
||||
let aircraft_sample = fun name ac_id ->
|
||||
Xml.Element ("aircraft",
|
||||
["name", name;
|
||||
"ac_id", ac_id;
|
||||
"airframe", "airframes/examples/microjet.xml";
|
||||
"radio", "radios/cockpitSX.xml";
|
||||
"telemetry", "telemetry/default_fixedwing.xml";
|
||||
"flight_plan", "flight_plans/basic.xml";
|
||||
"settings", "settings/fixedwing_basic.xml";
|
||||
"gui_color", "blue"],
|
||||
[])
|
||||
[ "name", name;
|
||||
"ac_id", ac_id;
|
||||
"airframe", "airframes/examples/microjet.xml";
|
||||
"radio", "radios/cockpitSX.xml";
|
||||
"telemetry", "telemetry/default_fixedwing.xml";
|
||||
"flight_plan", "flight_plans/basic.xml";
|
||||
"settings", "settings/fixedwing_basic.xml";
|
||||
"settings_modules", "";
|
||||
"gui_color", "blue" ],
|
||||
[])
|
||||
|
||||
|
||||
let write_conf_xml = fun ?(user_save = false) () ->
|
||||
@@ -110,13 +111,6 @@ let string_of_ac_data = fun d ->
|
||||
Label l -> l#text
|
||||
| Tree t -> Gtk_tools.tree_values t
|
||||
|
||||
let ac_files = fun gui model ->
|
||||
["airframe", "airframes", Label gui#label_airframe, gui#button_browse_airframe, gui#button_edit_airframe, edit, None;
|
||||
"flight_plan", "flight_plans", Label gui#label_flight_plan, gui#button_browse_flight_plan, gui#button_edit_flight_plan, gcs_or_edit, None;
|
||||
"settings", "settings", Tree (Gtk_tools.tree_of gui#tree_settings model), gui#button_browse_settings, gui#button_edit_settings, edit, Some gui#button_remove_settings;
|
||||
"radio", "radios", Label gui#label_radio, gui#button_browse_radio, gui#button_edit_radio, edit, None;
|
||||
"telemetry", "telemetry", Label gui#label_telemetry, gui#button_browse_telemetry, gui#button_edit_telemetry, edit, None]
|
||||
|
||||
|
||||
(* Awful but easier *)
|
||||
let current_color = ref "white"
|
||||
@@ -138,8 +132,8 @@ let correct_ac_name = fun s ->
|
||||
with
|
||||
Exit -> false
|
||||
|
||||
(*TODO function text of date_type*)
|
||||
let save_callback = fun ?user_save gui ac_combo model () ->
|
||||
(*TODO function text of date_type*)
|
||||
let save_callback = fun ?user_save gui ac_combo tree tree_modules () ->
|
||||
let ac_name = Gtk_tools.combo_value ac_combo
|
||||
and ac_id = gui#entry_ac_id#text in
|
||||
|
||||
@@ -148,23 +142,52 @@ let save_callback = fun ?user_save gui ac_combo model () ->
|
||||
GToolbox.message_box ~title:"Error on A/C id" "A/C id must be a non null number less than 255"
|
||||
else
|
||||
let color = !current_color in
|
||||
let tree = Gtk_tools.tree_of gui#tree_settings model in
|
||||
let aircraft =
|
||||
Xml.Element ("aircraft",
|
||||
["name", ac_name;
|
||||
"ac_id", ac_id;
|
||||
"airframe", gui#label_airframe#text;
|
||||
"radio", gui#label_radio#text;
|
||||
"telemetry", gui#label_telemetry#text;
|
||||
"flight_plan", gui#label_flight_plan#text;
|
||||
"settings", Gtk_tools.tree_values tree;
|
||||
"gui_color", color],
|
||||
[]) in
|
||||
Xml.Element ("aircraft",
|
||||
[ "name", ac_name;
|
||||
"ac_id", ac_id;
|
||||
"airframe", gui#label_airframe#text;
|
||||
"radio", gui#label_radio#text;
|
||||
"telemetry", gui#label_telemetry#text;
|
||||
"flight_plan", gui#label_flight_plan#text;
|
||||
"settings", Gtk_tools.tree_values ~only_checked:false tree;
|
||||
"settings_modules", Gtk_tools.tree_values ~only_checked:false tree_modules;
|
||||
"gui_color", color ],
|
||||
[]) in
|
||||
begin try Hashtbl.remove Utils.aircrafts ac_name with _ -> () end;
|
||||
Hashtbl.add Utils.aircrafts ac_name aircraft
|
||||
end;
|
||||
write_conf_xml ?user_save ()
|
||||
|
||||
(* Get the settings (string list) with current modules *)
|
||||
let get_settings_modules = fun ac_xml settings_modules ->
|
||||
(* get modules *)
|
||||
let modules = Gen_common.get_modules_of_airframe ac_xml in
|
||||
let modules = List.map (fun m -> m.Gen_common.xml ) modules in
|
||||
(* get list of settings files *)
|
||||
let settings = List.fold_left (fun l m ->
|
||||
(* get list of settings xml node if any *)
|
||||
let set_list = try Xml.children (ExtXml.child m "settings") with _ -> [] in
|
||||
let file_list = List.map (fun s -> "settings/"^(Xml.attrib s "name")) set_list in
|
||||
l @ file_list
|
||||
) [] modules in
|
||||
(* store current state in a hashtable *)
|
||||
let current = Hashtbl.create 7 in
|
||||
let set = Str.split regexp_space settings_modules in
|
||||
List.iter (fun s ->
|
||||
let l = String.length s in
|
||||
if s.[0] == '[' && s.[l - 1] = ']'
|
||||
then Hashtbl.add current (String.sub s 1 (l - 2)) false (* unchecked *)
|
||||
else Hashtbl.add current s true (* checked *)
|
||||
) set;
|
||||
(* build list with previous state if necessary *)
|
||||
List.map (fun s ->
|
||||
(* get previous state, false (unchecked otherwise) *)
|
||||
let checked = try Hashtbl.find current s with _ -> false in
|
||||
(* add to tree with correct state *)
|
||||
if checked then s
|
||||
else ("["^s^"]")
|
||||
) settings
|
||||
|
||||
let first_word = fun s ->
|
||||
try
|
||||
@@ -220,30 +243,60 @@ let parse_ac_flash = fun target flash_combo ac_file ->
|
||||
(* not a valid airframe file *)
|
||||
(Gtk_tools.combo_widget flash_combo)#misc#set_sensitive false
|
||||
|
||||
|
||||
(* Link A/C to airframe & flight_plan labels *)
|
||||
let ac_combo_handler = fun gui (ac_combo:Gtk_tools.combo) target_combo flash_combo (log:string->unit) ->
|
||||
(* build tree for settings *)
|
||||
let tree_set = Gtk_tools.tree gui#tree_settings in
|
||||
let model = Gtk_tools.tree_model tree_set in
|
||||
let tree_set = Gtk_tools.tree ~check_box:true gui#tree_settings in
|
||||
(* attach vertical scrollbar *)
|
||||
gui#tree_settings#set_vadjustment gui#tree_settings_scrollbar#adjustment;
|
||||
(* build tree for modules settings *)
|
||||
let tree_set_mod = Gtk_tools.tree ~check_box:true gui#tree_settings_modules in
|
||||
(* attach vertical scrollbar *)
|
||||
gui#tree_settings_modules#set_vadjustment gui#tree_settings_modules_scrollbar#adjustment;
|
||||
|
||||
(* connect save_callback to the two toggle signals
|
||||
* it can't be done before because we need the two tree models
|
||||
*)
|
||||
let (_, _, _, tree_signal) = Gtk_tools.tree_model tree_set in
|
||||
ignore (tree_signal#toggled ~callback:(fun _ -> save_callback gui ac_combo tree_set tree_set_mod ()));
|
||||
let (_, _, _, tree_signal) = Gtk_tools.tree_model tree_set_mod in
|
||||
ignore (tree_signal#toggled ~callback:(fun _ -> save_callback gui ac_combo tree_set tree_set_mod ()));
|
||||
|
||||
(* Link AC conf with labels and buttons *)
|
||||
let ac_files =
|
||||
[ "airframe", "airframes", Label gui#label_airframe, Some gui#button_browse_airframe, Some gui#button_edit_airframe, edit, None;
|
||||
"flight_plan", "flight_plans", Label gui#label_flight_plan, Some gui#button_browse_flight_plan, Some gui#button_edit_flight_plan, gcs_or_edit, None;
|
||||
"settings", "settings", Tree tree_set, Some gui#button_browse_settings, Some gui#button_edit_settings, edit, Some gui#button_remove_settings;
|
||||
"settings_modules", "settings", Tree tree_set_mod, None, None, (fun _ -> ()), None;
|
||||
"radio", "radios", Label gui#label_radio, Some gui#button_browse_radio, Some gui#button_edit_radio, edit, None;
|
||||
"telemetry", "telemetry", Label gui#label_telemetry, Some gui#button_browse_telemetry, Some gui#button_edit_telemetry, edit, None]
|
||||
in
|
||||
|
||||
(* Update_params callback *)
|
||||
let update_params = fun ac_name ->
|
||||
try
|
||||
let aircraft = Hashtbl.find Utils.aircrafts ac_name in
|
||||
let sample = aircraft_sample ac_name "42" in
|
||||
let value = fun a ->
|
||||
try (ExtXml.attrib aircraft a) with _ -> Xml.attrib sample a in
|
||||
List.iter (fun (a, _subdir, label, _, _, _, _) ->
|
||||
(* update list of modules settings *)
|
||||
let settings_modules = try
|
||||
let af_xml = Xml.parse_file (Env.paparazzi_home // "conf" // (Xml.attrib aircraft "airframe")) in
|
||||
get_settings_modules af_xml (ExtXml.attrib_or_default aircraft "settings_modules" "")
|
||||
with _ -> []
|
||||
in
|
||||
(* update aicraft hashtable *)
|
||||
let aircraft = ExtXml.subst_attrib "settings_modules" (String.concat " " settings_modules) aircraft in
|
||||
begin try Hashtbl.remove Utils.aircrafts ac_name with _ -> () end;
|
||||
Hashtbl.add Utils.aircrafts ac_name aircraft;
|
||||
let value = fun a -> try (ExtXml.attrib aircraft a) with _ -> Xml.attrib sample a in
|
||||
(* update elements *)
|
||||
List.iter (fun (a, _subdir, label, _, _, _, _) ->
|
||||
match label with
|
||||
Label l -> l#set_text (value a)
|
||||
| Label l -> l#set_text (value a)
|
||||
| Tree t ->
|
||||
ignore (Gtk_tools.clear_tree tree_set);
|
||||
let names = Str.split regexp_space (value a) in
|
||||
List.iter (fun n -> Gtk_tools.add_to_tree t n) names
|
||||
) (ac_files gui model);
|
||||
ignore (Gtk_tools.clear_tree t);
|
||||
let names = Str.split regexp_space (value a) in
|
||||
List.iter (fun n -> Gtk_tools.add_to_tree t n) names;
|
||||
) ac_files;
|
||||
let ac_id = ExtXml.attrib aircraft "ac_id"
|
||||
and gui_color = ExtXml.attrib_or_default aircraft "gui_color" "white" in
|
||||
gui#button_clean#misc#set_sensitive true;
|
||||
@@ -320,27 +373,31 @@ let ac_combo_handler = fun gui (ac_combo:Gtk_tools.combo) target_combo flash_com
|
||||
let colorname = string_of_gdkcolor csd#colorsel#color in
|
||||
gui#eventbox_gui_color#misc#modify_bg [`NORMAL, `NAME colorname];
|
||||
current_color := colorname;
|
||||
save_callback gui ac_combo model ();
|
||||
save_callback gui ac_combo tree_set tree_set_mod ();
|
||||
csd#destroy () in
|
||||
ignore (csd#ok_button#connect#clicked ~callback);
|
||||
ignore (csd#cancel_button#connect#clicked ~callback:csd#destroy) in
|
||||
ignore(gui#button_gui_color#connect#clicked ~callback);
|
||||
|
||||
(* A/C id *)
|
||||
ignore(gui#entry_ac_id#connect#changed ~callback:(fun () -> save_callback gui ac_combo model ()));
|
||||
ignore(gui#entry_ac_id#connect#changed ~callback:(fun () -> save_callback gui ac_combo tree_set tree_set_mod ()));
|
||||
|
||||
(* Conf *)
|
||||
List.iter (fun (name, subdir, label, button_browse, button_edit, editor, remove) ->
|
||||
List.iter (fun (name, subdir, label, button_browse, button_edit, editor, button_remove) ->
|
||||
(* editor button callback *)
|
||||
let callback = fun _ ->
|
||||
let rel_files = match label with
|
||||
Label l -> Str.split regexp_space l#text
|
||||
| Tree t -> Str.split regexp_space (Gtk_tools.tree_values t)
|
||||
| Tree t -> Str.split regexp_space (Gtk_tools.tree_values ~only_checked:true t)
|
||||
in
|
||||
let abs_files = List.map (Filename.concat Utils.conf_dir) rel_files in
|
||||
let quoted_files = List.map (fun s -> "'"^s^"'") abs_files in
|
||||
let arg = String.concat " " quoted_files in
|
||||
editor arg in
|
||||
ignore (button_edit#connect#clicked ~callback);
|
||||
(* connect editor button *)
|
||||
ignore (match button_edit with Some e -> ignore(e#connect#clicked ~callback) | _ -> ());
|
||||
|
||||
(* browse button callback *)
|
||||
let callback = fun _ ->
|
||||
let cb = fun names ->
|
||||
ignore (match label with
|
||||
@@ -350,30 +407,29 @@ let ac_combo_handler = fun gui (ac_combo:Gtk_tools.combo) target_combo flash_com
|
||||
| Tree t ->
|
||||
List.iter (fun n -> Gtk_tools.add_to_tree t n) names
|
||||
);
|
||||
save_callback gui ac_combo model ();
|
||||
save_callback gui ac_combo tree_set tree_set_mod ();
|
||||
let ac_name = Gtk_tools.combo_value ac_combo in
|
||||
update_params ac_name
|
||||
in
|
||||
Utils.choose_xml_file name subdir cb in
|
||||
ignore (button_browse#connect#clicked ~callback);
|
||||
ignore (match remove with
|
||||
Some r ->
|
||||
let callback = fun _ ->
|
||||
match label with
|
||||
Tree t ->
|
||||
Gtk_tools.remove_selected_from_tree t;
|
||||
save_callback gui ac_combo model ()
|
||||
| _ -> ()
|
||||
in
|
||||
ignore (r#connect#clicked ~callback)
|
||||
| _ -> ()
|
||||
)
|
||||
)
|
||||
(ac_files gui model);
|
||||
(* connect browse button *)
|
||||
ignore (match button_browse with Some b -> ignore(b#connect#clicked ~callback) | _ -> ());
|
||||
|
||||
(* remove button callback *)
|
||||
let callback = fun _ ->
|
||||
match label with
|
||||
Tree t ->
|
||||
Gtk_tools.remove_selected_from_tree t;
|
||||
save_callback gui ac_combo tree_set tree_set_mod ()
|
||||
| _ -> ()
|
||||
in
|
||||
(* connect remove button *)
|
||||
ignore (match button_remove with Some r -> ignore(r#connect#clicked ~callback) | _ -> ())
|
||||
)
|
||||
ac_files;
|
||||
|
||||
(* Save button *)
|
||||
ignore(gui#menu_item_save_ac#connect#activate ~callback:(save_callback ~user_save:true gui ac_combo model))
|
||||
ignore(gui#menu_item_save_ac#connect#activate ~callback:(save_callback ~user_save:true gui ac_combo tree_set tree_set_mod))
|
||||
|
||||
|
||||
let build_handler = fun ~file gui ac_combo (target_combo:Gtk_tools.combo) (flash_combo:Gtk_tools.combo) (log:string->unit) ->
|
||||
|
||||
@@ -28,7 +28,7 @@ INCLUDES =
|
||||
PKG = -package pprz
|
||||
LINKPKG = $(PKG) -linkpkg -dllpath-pkg pprz
|
||||
|
||||
all: gen_common.cmo gen_aircraft.out gen_airframe.out gen_messages2.out gen_messages.out gen_ubx.out gen_mtk.out gen_flight_plan.out gen_radio.out gen_periodic.out gen_settings.out gen_xsens.out gen_modules.out gen_autopilot.out gen_abi.out gen_srtm.out
|
||||
all: gen_aircraft.out gen_airframe.out gen_messages2.out gen_messages.out gen_ubx.out gen_mtk.out gen_flight_plan.out gen_radio.out gen_periodic.out gen_settings.out gen_xsens.out gen_modules.out gen_autopilot.out gen_abi.out gen_srtm.out
|
||||
|
||||
gen_flight_plan.out : gen_flight_plan.cmo $(LIBPPRZCMA)
|
||||
@echo OL $@
|
||||
@@ -38,9 +38,9 @@ gen_srtm.out : gen_srtm.ml $(LIBPPRZCMA)
|
||||
@echo OL $@
|
||||
$(Q)$(OCAMLC) $(INCLUDES) -o $@ $(LINKPKG) $<
|
||||
|
||||
%.out : %.ml gen_common.cmo $(LIBPPRZCMA)
|
||||
%.out : %.ml $(LIBPPRZCMA)
|
||||
@echo OL $<
|
||||
$(Q)$(OCAMLC) $(INCLUDES) -o $@ $(LINKPKG) gen_common.cmo $<
|
||||
$(Q)$(OCAMLC) $(INCLUDES) -o $@ $(LINKPKG) $<
|
||||
|
||||
%.cmo : %.ml
|
||||
@echo OC $<
|
||||
|
||||
@@ -340,10 +340,12 @@ let () =
|
||||
mkdir (aircraft_conf_dir // "telemetry");
|
||||
|
||||
let settings =
|
||||
try value "settings" with
|
||||
try Env.filter_settings (value "settings") with
|
||||
_ ->
|
||||
fprintf stderr "\nWARNING: No 'settings' attribute specified for A/C '%s', using 'settings/basic.xml'\n\n%!" aircraft;
|
||||
"settings/basic.xml" in
|
||||
fprintf stderr "\nWARNING: No 'settings' attribute specified for A/C '%s', using 'settings/dummy.xml'\n\n%!" aircraft;
|
||||
"settings/dummy.xml" in
|
||||
(* add modules settings *)
|
||||
let settings = String.concat " " [settings; (try Env.filter_settings (value "settings_modules") with _ -> "")] in
|
||||
|
||||
(** Expands the configuration of the A/C into one single file *)
|
||||
let conf_aircraft = Env.expand_ac_xml aircraft_xml in
|
||||
|
||||
Reference in New Issue
Block a user