paparazzi-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[paparazzi-commits] [4289] add generic tool to translate events from an


From: Pascal Brisset
Subject: [paparazzi-commits] [4289] add generic tool to translate events from an input device into messages on the ivy bus
Date: Tue, 20 Oct 2009 11:00:35 +0000

Revision: 4289
          http://svn.sv.gnu.org/viewvc/?view=rev&root=paparazzi&revision=4289
Author:   hecto
Date:     2009-10-20 11:00:34 +0000 (Tue, 20 Oct 2009)
Log Message:
-----------
 add generic tool to translate events from an input device into messages on the 
ivy bus

Modified Paths:
--------------
    paparazzi3/trunk/sw/ground_segment/joystick/Makefile

Added Paths:
-----------
    paparazzi3/trunk/sw/ground_segment/joystick/attack3_booz_nav.xml
    paparazzi3/trunk/sw/ground_segment/joystick/input2ivy.ml
    paparazzi3/trunk/sw/ground_segment/joystick/ml_usb_stick.c
    paparazzi3/trunk/sw/ground_segment/joystick/xbox_booz_nav.xml

Removed Paths:
-------------
    paparazzi3/trunk/sw/ground_segment/joystick/booz_fms.xml

Modified: paparazzi3/trunk/sw/ground_segment/joystick/Makefile
===================================================================
--- paparazzi3/trunk/sw/ground_segment/joystick/Makefile        2009-10-20 
10:52:13 UTC (rev 4288)
+++ paparazzi3/trunk/sw/ground_segment/joystick/Makefile        2009-10-20 
11:00:34 UTC (rev 4289)
@@ -23,23 +23,40 @@
 # Quiet compilation
 Q=@
 
+OCAMLC = ocamlc
+OCAMLLIB = ../../lib/ocaml
+TOOLSDIR = ../../tools
+OCAMLINCLUDES= -I $(OCAMLLIB) -I +lablgtk2 -I +xml-light -I $(TOOLSDIR)
+LIBPPRZCMA=$(OCAMLLIB)/lib-pprz.cma
+
 all: main_stick
 
-main_stick: main_stick.c usb_stick.c
+main_stick: main_stick.o usb_stick.o
        gcc -g -O2 -Wall `pkg-config glib-2.0 --cflags` -o $@ $^ `pkg-config 
glib-2.0 --libs`  `pcre-config --libs` -lglibivy
 
-main_stick_debug: main_stick.c usb_stick.c
+main_stick_debug: main_stick.o usb_stick.o
        gcc -g -O2 -Wall `pkg-config glib-2.0 --cflags` -o $@ $^ `pkg-config 
glib-2.0 --libs`  `pcre-config --libs` -lglibivy -DSTICK_DBG
 
-apm_stick: apm_stick.c usb_stick.c
+apm_stick: apm_stick.o usb_stick.o
        gcc -g -O2 -Wall `pkg-config glib-2.0 --cflags` -o $@ $^ `pkg-config 
glib-2.0 --libs`  `pcre-config --libs` -lglibivy
 
-xbox_stick: xbox_stick.c usb_stick.c
+xbox_stick: xbox_stick.o usb_stick.o
        gcc -g -O2 -Wall `pkg-config glib-2.0 --cflags` -o $@ $^ `pkg-config 
glib-2.0 --libs`  `pcre-config --libs` -lglibivy
 
-attack3_stick: attack3_stick.c usb_stick.c
+attack3_stick: attack3_stick.o usb_stick.o
        gcc -g -O2 -Wall `pkg-config glib-2.0 --cflags` -o $@ $^ `pkg-config 
glib-2.0 --libs`  `pcre-config --libs` -lglibivy
 
+input2ivy: usb_stick.o ml_usb_stick.o input2ivy.cmo
+       $(OCAMLC) $(OCAMLINCLUDES) -custom -o $@ unix.cma str.cma 
glibivy-ocaml.cma xml-light.cma lib-pprz.cma lablgtk.cma 
$(TOOLSDIR)/fp_syntax.cmo $(TOOLSDIR)/fp_lexer.cmo $(TOOLSDIR)/fp_parser.cmo 
$(TOOLSDIR)/fp_proc.cmo $^
+
+
+%.o : %.c
+       gcc -c -O2 -Wall `pkg-config glib-2.0 --cflags` $<
+
+%.cmo : %.ml
+       @echo OC $<
+       $(Q)$(OCAMLC) $(OCAMLINCLUDES) -c $<
+
 clean:
-       rm -f *~ core *.o *.bak .depend main_stick main_stick_debug apm_stick 
xbox_stick attack3_stick
+       rm -f *~ core *.o *.bak .depend main_stick main_stick_debug apm_stick 
xbox_stick attack3_stick *.cmo *.cmi input2ivy
 

Added: paparazzi3/trunk/sw/ground_segment/joystick/attack3_booz_nav.xml
===================================================================
--- paparazzi3/trunk/sw/ground_segment/joystick/attack3_booz_nav.xml            
                (rev 0)
+++ paparazzi3/trunk/sw/ground_segment/joystick/attack3_booz_nav.xml    
2009-10-20 11:00:34 UTC (rev 4289)
@@ -0,0 +1,32 @@
+<joystick>
+ <input>
+  <axis index="0" name="roll"/>
+  <axis index="1" name="pitch"/>
+  <axis index="2" name="throttle"/>
+  <button index="0" name="shoot"/>
+  <button index="1" name="down"/>
+  <button index="2" name="up"/>
+  <button index="3" name="left"/>
+  <button index="4" name="right"/>
+  <button index="7" name="button8"/>
+</input>
+<messages period="0.1">
+  <message class="datalink" name="BOOZ2_FMS_COMMAND">
+   <field name="h_mode" value="IndexOfEnum(NAV)"/>
+   <field name="v_mode" value="IndexOfEnum(NAV)"/>
+   <field name="v_sp"   value="(up-down)*42"/>
+   <field name="h_sp_1" value="roll"/>
+   <field name="h_sp_2" value="pitch"/>
+   <field name="h_sp_3" value="(right-left)*42"/>
+  </message>
+
+  <message class="ground" name="DL_SETTING">
+    <field name="index" value="IndexOfSetting(ir_pitch_neutral)"/>
+    <field name="value" value="Scale(throttle, 1000, 2000)"/>
+  </message>
+
+  <message class="ground" name="JUMP_TO_BLOCK" on_event="shoot && button8">
+    <field name="block_id" value="IndexOfBlock('Land Left AF-TD')"/>
+  </message>
+ </messages>
+</joystick>

Deleted: paparazzi3/trunk/sw/ground_segment/joystick/booz_fms.xml
===================================================================
--- paparazzi3/trunk/sw/ground_segment/joystick/booz_fms.xml    2009-10-20 
10:52:13 UTC (rev 4288)
+++ paparazzi3/trunk/sw/ground_segment/joystick/booz_fms.xml    2009-10-20 
11:00:34 UTC (rev 4289)
@@ -1,32 +0,0 @@
-<joystick>
- <input>
-  <axis index="0" name="roll"/>
-  <axis index="1" name="pitch"/>
-  <axis index="2" name="throttle"/>
-  <button index="0" name="shoot"/>
-  <button index="1" name="down"/>
-  <button index="2" name="up"/>
-  <button index="3" name="left"/>
-  <button index="4" name="right"/>
-  <button index="7" name="button8"/>
-</input>
-<messages period="0.1">
-  <message class="datalink" name="BOOZ2_FMS_COMMAND" min_period="1">
-   <field name="h_mode" value="IndexOfEnum(NAV)"/>
-   <field name="v_mode" value="IndexOfEnum(NAV)"/>
-   <field name="v_sp"   value="(up-down)*42"/>
-   <field name="h_sp_1" value="roll"/>
-   <field name="h_sp_2" value="pitch"/>
-   <field name="h_sp_3" value="(right-left)*42"/>
-  </message>
-
-  <message class="ground" name="DL_SETTING">
-    <field name="index" value="IndexOfSetting(ir_pitch_neutral)"/>
-    <field name="value" value="Scale(throttle, 1000, 2000)"/>
-  </message>
-
-  <message class="ground" name="JUMP_TO_BLOCK" on_event="shoot && button8">
-    <field name="block_id" value="IndexOfBlock('Land Left AF-TD')"/>
-  </message>
- </messages>
-</joystick>

Added: paparazzi3/trunk/sw/ground_segment/joystick/input2ivy.ml
===================================================================
--- paparazzi3/trunk/sw/ground_segment/joystick/input2ivy.ml                    
        (rev 0)
+++ paparazzi3/trunk/sw/ground_segment/joystick/input2ivy.ml    2009-10-20 
11:00:34 UTC (rev 4289)
@@ -0,0 +1,352 @@
+(*
+ * $Id$
+ *
+ * Forwarding events from an USB input device to the ivy bus
+ *  
+ * Copyright (C) 2009 ENAC, Pascal Brisset
+ *
+ * This file is part of paparazzi.
+ *
+ * paparazzi is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * paparazzi is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with paparazzi; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA. 
+ *
+ *)
+
+open Printf
+
+let (//) = Filename.concat
+let conf_dir = Env.paparazzi_home // "conf"
+let verbose = ref false (* Command line option *)
+
+(** Messages libraries *)
+module DL = Pprz.Messages(struct let name = "datalink" end)
+module G = Pprz.Messages(struct let name = "ground" end)
+
+(** Syntax for expressions *)
+module Syntax = Fp_syntax (* From ../../tools/ *)
+
+(** Hash table of name-index associations for the settings of the A/C *)
+let index_of_settings = Hashtbl.create 13
+
+(**Hash table of name-index associations for the flightplan blocks of the A/C*)
+let index_of_blocks = Hashtbl.create 13
+
+(** External C functions to access the input device *)
+external stick_init : string -> int = "ml_stick_init"
+(** [stick_init device] Return 0 on success. Search for a device if [device]
+ is the empty string *)
+
+external stick_read : unit -> int * int * int array = "ml_stick_read"
+(** Return the number of buttons, an integer of bits for the buttons values
+    and an array of signed integers for the axis *)
+
+(** Range for the input axis *)
+let max_input = 127
+let min_input = -127
+
+(** Representation of an input value *)
+type input =
+    Axis of int
+  | Button of int
+
+(** Description of a message *)
+type msg = {
+    msg_name : string;
+    msg_class : string;
+    fields : (string * Syntax.expression) list;
+    on_event : Syntax.expression option
+  }
+
+(** Represenation of an input device and of the messages to send *)
+type actions = {
+    period_ms : int;
+    inputs : (string*input) list;
+    messages : msg list
+  }
+
+(** Get a message description from its name (and class name) *)
+let get_message = fun class_name msg_name ->
+  match class_name with
+    "datalink" -> snd (DL.message_of_name msg_name)
+  | "ground" -> snd (G.message_of_name msg_name)
+  | _ -> failwith class_name
+
+(** Get the A/C id from its name in conf/conf.xml *)
+let ac_id_of_name = fun ac_name ->
+  let conf_xml = Xml.parse_file (conf_dir // "conf.xml") in
+  try
+    let aircraft = ExtXml.child ~select:(fun x -> Xml.attrib x "name" = 
ac_name) conf_xml "aircraft" in
+    ExtXml.int_attrib aircraft "ac_id"
+  with
+    Not_found ->
+      failwith (sprintf "A/C '%s' not found" ac_name)
+
+(** Fill the index_of_settings table from var/AC/settings.xml *)
+let hash_index_of_settings = fun ac_name ->
+  let xml_file = Env.paparazzi_home // "var" // ac_name // "settings.xml" in
+  let xml = Xml.parse_file xml_file in
+  let index = ref 0 in
+  let rec loop = fun xml ->
+    if Xml.tag xml = "dl_settings" then
+      List.iter loop (Xml.children xml)
+    else begin (* dl_setting *)
+      Hashtbl.add index_of_settings (Xml.attrib xml "var") !index;
+      incr index
+    end in
+  loop (ExtXml.child xml "dl_settings")
+
+
+(** Fill the index_of_blocks table from var/AC/flight_plan.xml *)
+let hash_index_of_blocks = fun ac_name ->
+  let xml_file = Env.paparazzi_home // "var" // ac_name // "flight_plan.xml" in
+  let dump = Xml.parse_file xml_file in
+  let flight_plan = ExtXml.child dump "flight_plan" in
+  let blocks = ExtXml.child flight_plan "blocks" in
+  List.iter (fun block ->
+    Hashtbl.add
+      index_of_blocks
+      (Xml.attrib block "name") 
+      (ExtXml.int_attrib block "no"))
+    (Xml.children blocks)
+
+
+(* Return the rank of an element in a list, first is 0 *)
+let rank = fun x l ->
+  let rec loop i = function
+      [] -> raise Not_found
+    | y::ys -> if x = y then i else loop (i+1) ys in
+  loop 0 l
+
+(** Eval IndexOfEnum, IndexOfSetting and IndexOfBlock built-in functions
+   in an expression *)
+let eval_settings_and_blocks = fun field_descr expr ->
+  let rec loop = function
+    Syntax.Call ("IndexOfEnum", [Syntax.Ident enum]) -> begin
+      try Syntax.Int (rank enum field_descr.Pprz.enum) with
+       Not_found -> failwith (sprintf "IndexOfEnum: unknown value '%s'" enum)
+    end
+  | Syntax.Call ("IndexOfSetting", [Syntax.Ident var]) -> begin
+      try Syntax.Int (Hashtbl.find index_of_settings var) with
+       Not_found -> failwith (sprintf "IndexOfSetting: unknown var '%s'" var)
+    end
+  | Syntax.Call ("IndexOfBlock", [Syntax.Ident name]) -> begin
+      try Syntax.Int (Hashtbl.find index_of_blocks name) with
+       Not_found -> failwith (sprintf "IndexOfBlock: unknown block '%s'" name)
+    end
+  | Syntax.Call (ident, exprs) | Syntax.CallOperator (ident, exprs) ->
+      Syntax.Call (ident, List.map loop exprs)
+  | e -> e in
+  loop expr
+
+(** Parse an XML list of input channels *)
+let parse_input = fun input ->
+  List.map
+    (fun x ->
+      let name = Xml.attrib x "name"
+      and index = ExtXml.int_attrib x "index" in
+      let value =
+       match Xml.tag x with
+         "axis" -> Axis index
+       | "button" -> Button index
+       | _ -> failwith "parse_input: unexepcted tag" in
+      (name, value))
+    (Xml.children input)
+
+(** Parse a '\xE0 la C' expression *)
+let parse_value = fun s ->
+  Fp_proc.parse_expression s
+
+(** Parse a message field and eval *)
+let parse_msg_field = fun msg_descr field ->
+  let name = Xml.attrib field "name" in
+  let field_descr = List.assoc name msg_descr.Pprz.fields in
+
+  let value = eval_settings_and_blocks field_descr (parse_value (Xml.attrib 
field "value")) in
+  (name, value)
+
+(** Parse a complete message and build its representation *)
+let parse_msg = fun msg ->
+  let msg_name = Xml.attrib msg "name"
+  and msg_class = Xml.attrib msg "class" in
+
+  let msg_descr = get_message msg_class msg_name in
+
+  let fields = List.map (parse_msg_field msg_descr) (Xml.children msg) in
+
+  let on_event =
+    try Some (parse_value (Xml.attrib msg "on_event")) with _ -> None in
+
+  { msg_name = msg_name;
+    msg_class = msg_class;
+    fields = fields;
+    on_event = on_event
+  }
+
+(** Parse the complete (input and messages) XML desxription *)
+let parse_descr = fun xml_file ->
+  let xml = Xml.parse_file xml_file in
+
+  let inputs = parse_input (ExtXml.child xml "input")
+  and messages_xml = ExtXml.child xml "messages" in
+
+  let period_ms =truncate (1000.*.ExtXml.float_attrib messages_xml "period")
+  and messages = List.map parse_msg (Xml.children messages_xml) in
+
+  { period_ms = period_ms; inputs = inputs; messages = messages }
+
+(** Verbose List.assco *)
+let my_assoc = fun x l ->
+  try List.assoc x l with Not_found ->
+    failwith (sprintf "my_assoc: %s not found" x)
+
+(** Access to an input value, button or axis *)
+let eval_input = fun buttons axis input ->
+  match input with
+    Axis i -> axis.(i)
+  | Button i -> (buttons lsr i) land 0x1
+
+(** Scale a value in the given bounds *)
+let scale = fun x min max ->
+  min + ((x - min_input) * (max - min)) / (max_input - min_input)
+
+(** Eval a function call (TO BE COMPLETED) *)
+let eval_call = fun f args ->
+  match f, args with
+    "-", [a1; a2] -> a1 - a2
+  | "+", [a1; a2] -> a1 + a2
+  | "*", [a1; a2] -> a1 * a2
+  | "&&", [a1; a2] -> a1 land a2
+  | "Scale", [x; min; max] -> scale (x) (min) (max)
+  | f, args -> failwith (sprintf "eval_call: unknown function '%s'" f)
+
+(** Eval an expression *)
+let eval_expr = fun buttons axis inputs expr ->
+  let rec eval = function
+      Syntax.Ident ident ->
+       let input = my_assoc ident inputs in
+       eval_input buttons axis input
+    | Syntax.Int int -> int
+    | Syntax.Float float -> failwith "eval_expr: float"
+    | Syntax.Call (ident, exprs) | Syntax.CallOperator (ident, exprs) ->
+       eval_call ident (List.map eval exprs)
+    | Syntax.Index _ -> failwith "eval_expr: index" in
+
+  eval expr
+  
+(** Store for the last sent values: msg_name->values *)
+let last_values = Hashtbl.create 5
+
+(** Get the previous sent values for a given message *)
+let get_previous_values = fun msg_name ->
+  try Hashtbl.find last_values msg_name with Not_found -> (false, [])
+
+(** Record the current values for a given message *)
+let record_values = fun msg_name values ->
+  Hashtbl.replace last_values msg_name values
+
+(**Send an ivy message if needed: new values and/or 'on_event' condition true*)
+let execute_action = fun ac_id inputs buttons axis message ->
+  let values =
+    List.map
+      (fun (name, expr) -> (name, Pprz.Int (eval_expr buttons axis inputs 
expr)))
+      message.fields
+
+  and on_event = 
+    match message.on_event with
+      None -> true
+    | Some expr -> eval_expr buttons axis inputs expr <> 0 in
+
+  let previous_values = get_previous_values message.msg_name in
+  if (on_event, values) <> previous_values && on_event then begin
+    let vs = ("ac_id", Pprz.Int ac_id) :: values in
+    match message.msg_class with
+      "datalink" -> DL.message_send "input2ivy" message.msg_name vs
+    | "ground" -> G.message_send "input2ivy" message.msg_name vs
+    | c -> failwith (sprintf "execute_action: unknown class '%s'" c)
+  end;
+  record_values message.msg_name (on_event, values)
+
+
+(** Output on stderr the values from the input device *)
+let print_inputs = fun nb_buttons buttons axis ->
+  fprintf stderr "buttons: ";
+  for i = 0 to nb_buttons - 1 do
+    fprintf stderr "%d:%d " i (eval_input buttons axis (Button i))
+  done;
+  fprintf stderr "\naxis: ";
+  for i = 0 to Array.length axis - 1 do
+    fprintf stderr "%d:%d " i (eval_input buttons axis (Axis i))
+  done;
+  fprintf stderr "\n%!"
+  
+
+(** Get the values from the input values and send messages *)
+let execute_actions = fun actions ac_id ->
+  try
+    let (nb_buttons, buttons, axis) = stick_read () in
+
+    if !verbose then
+      print_inputs nb_buttons buttons axis;
+    
+    List.iter (execute_action ac_id actions.inputs buttons axis) 
actions.messages
+  with
+    exc -> prerr_endline (Printexc.to_string exc)
+
+
+
+(************************************* MAIN **********************************)
+let () =
+  let ivy_bus = ref "127.255.255.255:2010" in
+  let device_name = ref ""
+  and ac_name = ref "MYAC"
+  and xml_descr = ref "" in
+
+  let anon_fun = (fun x -> xml_descr := x) in
+  let speclist =  
+    [ "-b", Arg.String (fun x -> ivy_bus := x), "Bus\tDefault is 
127.255.255.255:2010";
+      "-ac",  Arg.Set_string ac_name, "<A/C name>";
+      "-d",  Arg.Set_string device_name, "<device name>";
+      "-v",  Arg.Set verbose, "Verbose mode (useful to identify the channels 
of an input device)";
+      "-", Arg.String anon_fun, "<xml file of actions>"
+    ]
+  and usage_msg = "Usage: " in
+
+  Arg.parse speclist anon_fun usage_msg;
+
+  if !xml_descr = "" then begin
+    Arg.usage speclist usage_msg;
+    exit 1
+  end;
+
+  let ac_id = ac_id_of_name !ac_name in
+
+  hash_index_of_settings !ac_name;
+  hash_index_of_blocks !ac_name;
+
+  let actions = parse_descr !xml_descr in
+
+  if stick_init !device_name <> 0 then
+    failwith (sprintf "Error: cannot open device %s\n" !device_name);
+
+  (** Connect to the Ivy bus *)
+  Ivy.init "Paparazzi joystick" "READY" (fun _ _ -> ());
+  Ivy.start !ivy_bus;
+
+  ignore (Glib.Timeout.add actions.period_ms (fun () -> execute_actions 
actions ac_id; true));
+  
+  (** Start the main loop *)
+  let loop = Glib.Main.create true in
+  while Glib.Main.is_running loop do ignore (Glib.Main.iteration true) done
+

Added: paparazzi3/trunk/sw/ground_segment/joystick/ml_usb_stick.c
===================================================================
--- paparazzi3/trunk/sw/ground_segment/joystick/ml_usb_stick.c                  
        (rev 0)
+++ paparazzi3/trunk/sw/ground_segment/joystick/ml_usb_stick.c  2009-10-20 
11:00:34 UTC (rev 4289)
@@ -0,0 +1,69 @@
+/* 
+   $Id$
+
+ Copyright (C) 2009 ENAC, Pascal Brisset, Gautier Hattenberger
+
+ Ocaml bindings for USB stick
+
+ This file is part of paparazzi.
+
+ paparazzi is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ paparazzi is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with paparazzi; see the file COPYING.  If not, write to
+ the Free Software Foundation, 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA.  
+*/ 
+
+#include <stdio.h>
+#include <string.h>
+#include <caml/mlvalues.h>
+#include <caml/alloc.h>
+#include <caml/memory.h>
+#include <caml/callback.h>
+#include <caml/fail.h>
+#include "usb_stick.h"
+
+
+/** Open an input device. Try to discover it if name is empty */
+value
+ml_stick_init(value device_name_val) {
+  char * device_name = String_val(device_name_val);
+  if (strlen(device_name) == 0)
+    device_name = NULL;
+  int opened = stick_init(device_name);
+  return Val_int(opened);
+}
+
+/** Return a triple of 
+    - the number of buttons
+    - one integer with the buttons values
+    - the array of axis values */
+CAMLprim value
+ml_stick_read(value _unit) {
+  CAMLparam0();
+  CAMLlocal3 (result, buttons, axis);
+
+  stick_read();
+
+  buttons = Val_int(stick_button_values);
+
+  axis = caml_alloc_tuple(stick_axis_count);
+  unsigned int i;
+  for(i = 0; i < stick_axis_count; i++)
+    Store_field(axis, i, Val_int(stick_axis_values[i]));
+
+  result = caml_alloc_tuple(3);
+  Store_field(result, 0, Val_int(stick_button_count));
+  Store_field(result, 1, buttons);
+  Store_field(result, 2, axis);
+  CAMLreturn(result);
+}

Added: paparazzi3/trunk/sw/ground_segment/joystick/xbox_booz_nav.xml
===================================================================
--- paparazzi3/trunk/sw/ground_segment/joystick/xbox_booz_nav.xml               
                (rev 0)
+++ paparazzi3/trunk/sw/ground_segment/joystick/xbox_booz_nav.xml       
2009-10-20 11:00:34 UTC (rev 4289)
@@ -0,0 +1,31 @@
+<joystick>
+ <input>
+  <axis index="0" name="roll"/>
+  <axis index="1" name="pitch"/>
+  <axis index="3" name="yaw"/>
+  <axis index="4" name="tilt"/>
+  <button index="3" name="X"/>
+  <button index="0" name="down"/>
+  <button index="1" name="up"/>
+  <button index="4" name="Y"/>
+</input>
+<messages period="0.1">
+  <message class="datalink" name="BOOZ2_FMS_COMMAND">
+   <field name="h_mode" value="IndexOfEnum(NAV)"/>
+   <field name="v_mode" value="IndexOfEnum(NAV)"/>
+   <field name="v_sp"   value="(up-down)*42"/>
+   <field name="h_sp_1" value="roll"/>
+   <field name="h_sp_2" value="pitch"/>
+   <field name="h_sp_3" value="yaw"/>
+  </message>
+
+  <message class="ground" name="DL_SETTING">
+    <field name="index" value="IndexOfSetting(booz2_cam_tilt)"/>
+    <field name="value" value="Scale(tilt, 1000, 2000)"/>
+  </message>
+
+  <message class="ground" name="JUMP_TO_BLOCK" on_event="X && Y">
+    <field name="block_id" value="IndexOfBlock('land here')"/>
+  </message>
+ </messages>
+</joystick>





reply via email to

[Prev in Thread] Current Thread [Next in Thread]