[settings] improve settings in pprzcenter

- check box for faster enable/disable
- loading from modules
This commit is contained in:
Gautier Hattenberger
2014-09-16 17:26:14 +02:00
parent 9e3510e51e
commit e39292c77b
15 changed files with 311 additions and 150 deletions
+3
View File
@@ -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>
+3
View File
@@ -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>
+2 -1
View File
@@ -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>
+1 -1
View File
@@ -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
View File
@@ -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
+5
View File
@@ -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
View File
@@ -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 ()
+5 -4
View File
@@ -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
+1 -1
View File
@@ -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 $^
+114 -59
View File
@@ -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
View File
@@ -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) ->
+3 -3
View File
@@ -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 $<
+5 -3
View File
@@ -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