request&answer on Ivy mechanisms

This commit is contained in:
Pascal Brisset
2005-08-13 23:27:07 +00:00
parent ae56c41d13
commit 2801753dff
8 changed files with 189 additions and 112 deletions
+6 -2
View File
@@ -257,17 +257,18 @@
</message>
<message name="CONFIG_REQ" ID="0x07">
<field name="aircraft_id" type="string"/>
<field name="ac_id" type="string"/>
</message>
<message name="CONFIG" ID="0x08">
<field name="aircraft_id" type="string"/>
<field name="ac_id" type="string"/>
<field name="flight_plan" type="string" unit="url"/>
<field name="airframe" type="string" unit="url"/>
<field name="radio" type="string" unit="url"/>
</message>
<message name="FLIGHT_PARAM" ID="0x04">
<field name="ac_id" type="string"/>
<field name="roll" type="float" unit="deg"/>
<field name="pitch" type="float" unit="deg"/>
<field name="east" type="float" unit="m"/>
@@ -279,6 +280,7 @@
</message>
<message name="AP_STATUS" ID="0x05">
<field name="ac_id" type="string"/>
<field name="mode" type="uint8" values="MANUAL|AUTO1|AUTO2|HOME"/>
<field name="h_mode" type="uint8" values="NONE|ROLLDOT|ROLL|HEADING_DOT|HEADING|WP|ROUTE|CIRCLE"/>
<field name="v_mode" type="uint8" values="NONE|CLIMB|ALT|GLIDE|PARABOLIC"/>
@@ -288,6 +290,7 @@
</message>
<message name="NAV_STATUS" ID="0x06">
<field name="ac_id" type="string"/>
<field name="cur_block" type="uint8"/>
<field name="cur_stage" type="uint8"/>
<field name="flight_time" type="uint32"/>
@@ -298,6 +301,7 @@
</message>
<message name="ENGINE_STATUS" ID="0x07">
<field name="ac_id" type="string"/>
<field name="throttle" type="float" unit="%"/>
<field name="rpm" type="float" unit="rpm"/>
<field name="temp" type="float" unit="celcius"/>
+2 -2
View File
@@ -1,4 +1,4 @@
OCAMLC=ocamlc -g
OCAMLC=ocamlc
OCAMLOPT=ocamlopt
INCLUDES=-I +lablgtk2 -I +camlimages -I ../../lib/ocaml
LIBS=glibivy-ocaml.cma lablgtk.cma ci_core.cma ci_png.cma ci_gif.cma ci_jpeg.cma ci_tiff.cma ci_bmp.cma ci_ppm.cma ci_ps.cma lib-pprz.cma lablgnomecanvas.cma xlib-pprz.cma
@@ -9,7 +9,7 @@ all : map2d
map2d : map2d.ml
$(OCAMLC) -custom $(INCLUDES) $(LIBS) gtkInit.cmo $(CMO) -o /dev/null #to Check
$(OCAMLC) -custom $(INCLUDES) $(LIBS) gtkInit.cmo $< -o /dev/null #to Check
cat ../../../pprz_src_test.sh > $@
echo 'lablgtk2 str.cma unix.cma xml-light.cma -I +camlimages glibivy-ocaml.cma ci_core.cma ci_png.cma ci_gif.cma ci_jpeg.cma ci_tiff.cma ci_bmp.cma ci_ppm.cma ci_ps.cma -I $$PAPARAZZI_SRC/sw/lib/ocaml lib-pprz.cma xlib-pprz.cma $$PAPARAZZI_SRC/sw/ground_segment/cockpit/$< $$*' >> $@
chmod a+x $@
+65 -31
View File
@@ -1,5 +1,32 @@
(*
* $Id$
*
* Multi aircrafts map display
*
* Copyright (C) 2004 CENA/ENAC, Pascal Brisset, Antoine Drouin
*
* 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
open Latlong
module Ground_Pprz = Pprz.Protocol(struct let name = "ground" end)
type color = string
@@ -72,8 +99,11 @@ let file_of_url = fun url ->
String.sub url 7 (String.length url - 7)
else
let tmp_file = Filename.temp_file "fp" ".xml" in
Sys.command (sprintf "wget -O %s %s" tmp_file url);
tmp_file
let c = sprintf "wget -O %s %s" tmp_file url in
if Sys.command c = 0 then
tmp_file
else
failwith c
let load_mission = fun color geomap url ->
let file = file_of_url url in
@@ -132,24 +162,12 @@ let new_color =
| [] -> failwith "new_color"
let ivy_request = fun s f ->
let b = ref (Obj.magic ()) in
let cb = fun response ->
Ivy.unbind !b;
f response in
let id = sprintf "%s_%d" (Filename.basename Sys.argv.(1)) (Unix.getpid ()) in
b := Ivy.bind (fun _ args -> cb args.(0)) (sprintf "response %s (.*)" id);
Ivy.send (sprintf "request %s %s" id s)
let ask_fp = fun geomap ac ->
let b = ref (Obj.magic ()) in
let load_fp = fun file ->
Ivy.unbind !b;
let get_config = fun _sender values ->
let file = Pprz.string_assoc "flight_plan" values in
let ac = Hashtbl.find live_aircrafts ac in
ac.fp_group <- Some (load_mission ac.color geomap file) in
b := Ivy.bind (fun _ args -> load_fp args.(0)) (sprintf "ground FLIGHT_PLAN %s (.*)" ac);
Ivy.send (sprintf "ask FLIGHT_PLAN %s" ac)
Ground_Pprz.message_req "map2d" "CONFIG" ["ac_id", Pprz.String ac] get_config
let show_mission = fun geomap ac on_off ->
@@ -171,6 +189,8 @@ let resize_track = fun ac track ->
let live_aircrafts_msg = fun (geomap:MapCanvas.widget) acs ->
let acs = Pprz.string_assoc "ac_list" acs in
let acs = Str.split list_separator acs in
List.iter
(fun ac ->
if not (Hashtbl.mem live_aircrafts ac) then begin
@@ -180,21 +200,33 @@ let live_aircrafts_msg = fun (geomap:MapCanvas.widget) acs ->
ignore (fp#connect#toggled (fun () -> show_mission geomap ac fp#active));
let color = new_color () in
let track = new MapTrack.track ~name:ac ~color:color geomap in
ignore (ac_menu_fact#add_item "Clear Track" ~callback:(fun () -> track#clear)) ;
ignore (ac_menu_fact#add_item "Resize Track" ~callback:(fun () -> resize_track ac track)) ;
let b =
Ivy.bind
(fun _ args -> aircraft_pos_msg track (fos args.(0)) (fos args.(1))(fos args.(2)))
(sprintf "%s +FLIGHT_PARAM +[^ ]* +[^ ]* +([0-9\\.]*) +([0-9\\.]*) +[0-9\\.]* +([0-9\\.]*)" ac) in
let b =
Ivy.bind
(fun _ args -> carrot_pos_msg track (fos args.(0)) (fos args.(1)))
(sprintf "%s +NAV_STATUS +[^ ]* +[^ ]* +[^ ]* +[^ ]* +[^ ]* +([\\-0-9\\.]*) +([\\-0-9\\.]*)" ac) in
ignore (ac_menu_fact#add_item "Clear Track" ~callback:(fun () -> track#clear));
ignore (ac_menu_fact#add_item "Resize Track" ~callback:(fun () -> resize_track ac track));
Hashtbl.add live_aircrafts ac { track = track; color = color; fp_group = None }
end
)
end)
acs
let listen_flight_params = fun () ->
let get_fp = fun _sender vs ->
let ac_id = Pprz.string_assoc "ac_id" vs in
try
let ac = Hashtbl.find live_aircrafts ac_id in
let a = fun s -> Pprz.float_assoc s vs in
aircraft_pos_msg ac.track (a "east") (a "north") (a "heading")
with Not_found -> ()
in
ignore (Ground_Pprz.message_bind "FLIGHT_PARAM" get_fp);
let get_ns = fun _sender vs ->
let ac_id = Pprz.string_assoc "ac_id" vs in
try
let ac = Hashtbl.find live_aircrafts ac_id in
let a = fun s -> Pprz.float_assoc s vs in
carrot_pos_msg ac.track (a "target_east") (a "target_north")
with Not_found -> ()
in
ignore (Ground_Pprz.message_bind "NAV_STATUS" get_ns)
let _ =
let ivy_bus = ref "127.255.255.255:2010"
@@ -229,7 +261,9 @@ let _ =
load_map geomap xml_map_file
end;
Ivy.bind (fun _ args -> live_aircrafts_msg geomap (Str.split list_separator args.(0))) "ground +AIRCRAFTS +(.*)";
ignore (Ground_Pprz.message_bind "AIRCRAFTS" (fun _sender vs -> live_aircrafts_msg geomap vs));
listen_flight_params ();
window#add_accel_group accel_group;
window#show ();
+47 -67
View File
@@ -24,15 +24,15 @@
*
*)
let my_id = "ground"
open Printf
module U = Unix
module Tele_Class = struct let name = "telemetry_ap" end
module Tc_Class = struct let name = "non" end
module AcInfo = struct let name = "aircraft_info" end
module Ground = struct let name = "ground" end
module Tele_Pprz = Pprz.Protocol(Tele_Class)
module Tc_Pprz = Pprz.Protocol(Tc_Class)
module AcInfo_Pprz = Pprz.Protocol(AcInfo)
module Ground_Pprz = Pprz.Protocol(Ground)
let (//) = Filename.concat
let logs_path = Env.paparazzi_home // "var" // "logs"
@@ -76,11 +76,10 @@ let aircrafts = Hashtbl.create 3
let aircrafts_msg_period = 5000 (* ms *)
let aircraft_msg_period = 1000 (* ms *)
let traffic_info_period = 2000 (* ms *)
let send_aircrafts_msg = fun () ->
let t = U.gettimeofday () in
let names = String.concat "," (Hashtbl.fold (fun k v r -> k::r) aircrafts []) in
Ivy.send (sprintf "ground AIRCRAFTS %s" names)
(* Ivy.send (sprintf "YOUOPIIIII") *)
let send_aircrafts_msg = fun _asker _values ->
assert(_values = []);
let names = String.concat "," (Hashtbl.fold (fun k v r -> k::r) aircrafts []) ^ "," in
["ac_list", Pprz.String names]
(* Opens the log file *)
(* FIXME : shoud open also an associated config file *)
@@ -164,7 +163,8 @@ let send_aircraft_msg = fun ac ->
let sof = fun f -> sprintf "%.1f" f in
let a = Hashtbl.find aircrafts ac in
let f = fun x -> Pprz.Float x in
let values = ["roll", f (Geometry_2d.rad2deg a.roll);
let values = ["ac_id", Pprz.String ac;
"roll", f (Geometry_2d.rad2deg a.roll);
"pitch", f (Geometry_2d.rad2deg a.pitch);
"east", f a.east;
"north", f a.north;
@@ -172,46 +172,25 @@ let send_aircraft_msg = fun ac ->
"heading", f (Geometry_2d.rad2deg a.course);
"alt", f a.alt;
"climb", f a.climb] in
let _, fp_msg = AcInfo_Pprz.message_of_name "FLIGHT_PARAM" in
Ivy.send (sprintf "%s %s" ac (AcInfo_Pprz.string_of_message fp_msg values));
Ground_Pprz.message_send my_id "FLIGHT_PARAM" values;
let values = ["cur_block", Pprz.Int a.cur_block;"cur_stage", Pprz.Int a.cur_stage; "target_east", f (a.nav_ref_east+.a.desired_east); "target_north", f (a.nav_ref_north+.a.desired_north)]
and _, ns_msg = AcInfo_Pprz.message_of_name "NAV_STATUS" in
Ivy.send (sprintf "%s %s" ac (AcInfo_Pprz.string_of_message ns_msg values));
let values = ["ac_id", Pprz.String ac; "cur_block", Pprz.Int a.cur_block;"cur_stage", Pprz.Int a.cur_stage; "target_east", f (a.nav_ref_east+.a.desired_east); "target_north", f (a.nav_ref_north+.a.desired_north)] in
Ground_Pprz.message_send my_id "NAV_STATUS" values;
let values = ["throttle", f a.throttle;"rpm", f a.rpm;"temp", f a.temp;"bat", f a.bat;"amp", f a.amp;"energy", f a.energy]
and _, es_msg = AcInfo_Pprz.message_of_name "ENGINE_STATUS" in
Ivy.send (sprintf "%s %s" ac (AcInfo_Pprz.string_of_message es_msg values));
let values = ["ac_id", Pprz.String ac; "throttle", f a.throttle;"rpm", f a.rpm;"temp", f a.temp;"bat", f a.bat;"amp", f a.amp;"energy", f a.energy] in
Ground_Pprz.message_send my_id "ENGINE_STATUS" values;
let values = ["mode", Pprz.Int a.ap_mode; "v_mode", Pprz.Int a.ap_altitude]
and _, as_msg = AcInfo_Pprz.message_of_name "AP_STATUS" in
Ivy.send (sprintf "%s %s" ac (AcInfo_Pprz.string_of_message as_msg values))
let values = ["ac_id", Pprz.String ac; "mode", Pprz.Int a.ap_mode; "v_mode", Pprz.Int a.ap_altitude] in
Ground_Pprz.message_send my_id "AP_STATUS" values
with
Not_found -> prerr_endline ac
let send_traffic_info = fun ac ->
(* TODO: should send up on the datalink *)
(* Sending on the Ivy bus for the simulators *)
let a = Hashtbl.find aircrafts ac in
let f = fun x -> Pprz.Float x in
let conf = ExtXml.child conf_xml "aircraft" ~select:(fun x -> ExtXml.attrib x "ac_id" = ac) in
let values = ["ac_id", Pprz.Int (int_of_string (ExtXml.attrib conf "ac_id"));
"east", f a.east;
"north", f a.north;
"speed", f a.gspeed;
"heading", f (Geometry_2d.rad2deg a.course);
"alt", f a.alt;
"climb", f a.climb] in
let _, fp_msg = Tc_Pprz.message_of_name "TRAFFIC_INFO" in
Ivy.send (sprintf "%s %s" ac (Tc_Pprz.string_of_message fp_msg values))
let new_aircraft = fun id ->
{ port = id ; roll = 0.; pitch = 0.; east = 0.; north = 0.; nav_ref_east = 0.; nav_ref_north = 0.; desired_east = 0.; desired_north = 0.; gspeed=0.; course = 0.; alt=0.; climb=0.; cur_block=0; cur_stage=0; throttle = 0.; rpm = 0.; temp = 0.; bat = 0.; amp = 0.; energy = 0.; ap_mode=0; ap_altitude=0; if_calib_mode=0; mcu1_status=0; lls_calib=0 }
let register_aircraft = fun name a ->
Hashtbl.add aircrafts name a;
ignore (Glib.Timeout.add aircraft_msg_period (fun () -> send_aircraft_msg name; true));
ignore (Glib.Timeout.add traffic_info_period (fun () -> send_traffic_info name; true))
ignore (Glib.Timeout.add aircraft_msg_period (fun () -> send_aircraft_msg name; true))
(** Identifying message from a A/C *)
@@ -220,41 +199,37 @@ let ident_msg = fun log id name ->
let ac = new_aircraft id in
let b = Ivy.bind (fun _ args -> ac_msg log name ac args.(0)) (sprintf "^%s +(.*)" id) in
register_aircraft name ac;
send_aircrafts_msg ()
Ground_Pprz.message_send my_id "NEW_AIRCRAFT" ["ac_id", Pprz.String id]
end
(* Waits for new aircrafts *)
let listen_acs = fun log ->
ignore (Ivy.bind (fun _ args -> ident_msg log args.(0) args.(1)) "^(.*) IDENT +(.*)")
(* Server on the Ivy bus *)
let send_flight_plan = fun id ->
try
let conf = ExtXml.child conf_xml "aircraft" ~select:(fun x -> ExtXml.attrib x "ac_id" = id) in
let f = ExtXml.attrib conf "flight_plan" in
Ivy.send (sprintf "ground FLIGHT_PLAN %s file://%s/conf/%s" id Env.paparazzi_home f)
with
Not_found ->
Ivy.send (sprintf "ground UNKNOWN %s" id)
let send_config = fun id_ac id_req ->
try
prerr_endline (sprintf "[%s] [%s]\n" id_ac id_req);
let conf = ExtXml.child conf_xml "aircraft" ~select:(fun x -> ExtXml.attrib x "ac_id" = id_ac) in
let fp = sprintf "%s/conf/%s" Env.paparazzi_home (ExtXml.attrib conf "flight_plan") and
af = sprintf "%s/conf/%s" Env.paparazzi_home (ExtXml.attrib conf "airframe") and
rc = sprintf "%s/conf/%s" Env.paparazzi_home (ExtXml.attrib conf "radio")in
let resp = sprintf "%s CONFIG_RES %s %s %s %s" id_ac id_req fp af rc in
Ivy.send (resp);
prerr_endline (resp)
with
Not_found ->
Ivy.send (sprintf "ground UNKNOWN %s" id_req)
let send_config = fun _asker args ->
match args with
["ac_id", Pprz.String ac_id] -> begin
try
let conf = ExtXml.child conf_xml "aircraft" ~select:(fun x -> ExtXml.attrib x "ac_id" = ac_id) in
let prefix = fun s -> sprintf "file://%s/conf/%s" Env.paparazzi_home s in
let fp = prefix (ExtXml.attrib conf "flight_plan")
and af = prefix (ExtXml.attrib conf "airframe")
and rc = prefix (ExtXml.attrib conf "radio") in
["ac_id", Pprz.String ac_id;
"flight_plan", Pprz.String fp;
"airframe", Pprz.String af;
"radio", Pprz.String rc]
with
Not_found ->
failwith (sprintf "ground UNKNOWN %s" ac_id)
end
| _ ->
let s = String.concat " " (List.map (fun (a,v) -> a^"="^Pprz.string_of_value v) args) in
failwith (sprintf "Error, Receive.send_config: %s" s)
let ivy_server = fun () ->
ignore (Ivy.bind (fun _ args -> send_aircrafts_msg ()) "^ask AIRCRAFTS");
ignore (Ivy.bind (fun _ args -> send_flight_plan args.(0)) "^ask FLIGHT_PLAN +(.*)");
ignore (Ivy.bind (fun _ args -> send_config args.(0) args.(1)) "^(.*) CONFIG_REQ +(.*)")
ignore (Ground_Pprz.message_answerer my_id "AIRCRAFTS" send_aircrafts_msg);
ignore (Ground_Pprz.message_answerer my_id "CONFIG" send_config)
@@ -278,7 +253,12 @@ let _ =
listen_acs log;
(* Sends periodically alive aircrafts *)
ignore (Glib.Timeout.add aircrafts_msg_period (fun () -> send_aircrafts_msg (); true));
let sending = fun () ->
let vs = send_aircrafts_msg "event" [] in
Ground_Pprz.message_send my_id "AIRCRAFTS" vs;
true
in
ignore (Glib.Timeout.add aircrafts_msg_period sending);
(* Waits for client requests on the Ivy bus *)
ivy_server ();
+1 -1
View File
@@ -39,7 +39,7 @@ all : lib-pprz.cma xlib-pprz.cma xml_get.out lib-pprz.cmxa
lib-pprz.cma : $(CMO)
ocamlmklib -o lib-pprz str.cma xml-light.cma unix.cma $^
ocamlmklib -o lib-pprz str.cma unix.cma xml-light.cma ivy-ocaml.cma $^
lib-pprz.cmxa : $(CMX)
ocamlmklib -o lib-pprz $^
+43 -1
View File
@@ -49,6 +49,8 @@ type type_descr = {
value : value
}
type values = (string * value) list
@@ -67,7 +69,8 @@ let types = [
("int8", { format = "%d"; glib_type = "gint8"; size = 1; value= Int 42 });
("int16", { format = "%d"; glib_type = "gint16"; size = 2; value= Int 42 });
("int32", { format = "%ld" ; glib_type = "gint32"; size = 4; value=Int 42 });
("float", { format = "%f" ; glib_type = "gfloat"; size = 4; value=Float 4.2 })
("float", { format = "%f" ; glib_type = "gfloat"; size = 4; value=Float 4.2 });
("string", { format = "%s" ; glib_type = "gchar*"; size = max_int; value=String "42" })
]
let int_of_string = fun x ->
@@ -106,6 +109,14 @@ let field_of_xml = fun xml ->
let f = try Xml.attrib xml "format" with _ -> default_format t in
(ExtXml.attrib xml "name", { _type = t; fformat = f })
let float_assoc = fun (a:string) vs ->
match List.assoc a vs with
Float x -> x
| _ -> invalid_arg "Pprz.float_assoc"
let string_assoc = fun (a:string) (vs:values) -> string_of_value (List.assoc a vs)
(** Table of msg classes indexed by name. Each class is a table of messages
indexed by ids *)
@@ -237,6 +248,7 @@ module Protocol(Class:CLASS) = struct
(msg_id, values)
with
Not_found -> raise (Unknown_msg_name msg_name)
| Invalid_argument "List.map2" -> failwith (sprintf "Pprz.values_of_string: '%s'" s)
end
| [] -> invalid_arg "Pprz.values_of_string"
@@ -248,4 +260,34 @@ module Protocol(Class:CLASS) = struct
try string_of_value (List.assoc field_name values) with
Not_found -> string_of_value (default_value field._type))
msg.fields)
let message_send = fun sender msg_name values ->
let m = snd (message_of_name msg_name) in
let s = string_of_message m values in
Ivy.send (sprintf "%s %s" sender s)
let message_bind = fun msg_name cb ->
Ivy.bind (fun _ args -> cb args.(0) (snd (values_of_string args.(1)))) (sprintf "^([^ ]*) +(%s.*)" msg_name)
let message_answerer = fun sender msg_name cb ->
let ivy_cb = fun _ args ->
let asker = args.(0)
and asker_id = args.(1) in
let values = cb asker (snd (values_of_string args.(2))) in
let m = string_of_message (snd (message_of_name msg_name)) values in
Ivy.send (sprintf "%s %s %s" asker_id sender m) in
Ivy.bind ivy_cb (sprintf "^([^ ]*) +([^ ]*) +(%s_REQ.*)" msg_name)
let gen_id = let r = ref 0 in fun () -> incr r; !r
let message_req = fun sender msg_name values (f:string -> (string * value) list -> unit) ->
let b = ref (Obj.magic ()) in
let cb = fun _ args ->
Ivy.unbind !b;
f args.(0) (snd (values_of_string args.(1))) in
let id = sprintf "%d_%d" (Unix.getpid ()) (gen_id ()) in
let r = sprintf "^%s ([^ ]*) +(%s.*)" id msg_name in
b := Ivy.bind cb r;
let msg_name_req = msg_name ^ "_REQ" in
let m = sprintf "%s %s %s" sender id (string_of_message (snd (message_of_name msg_name_req)) values) in
Ivy.send m
end
+24 -7
View File
@@ -43,6 +43,13 @@ type type_descr = {
value : value
}
val types : (string * type_descr) list
type values = (string * value) list
val string_assoc : string -> values -> string
(** May raise Not_found *)
val float_assoc : string -> values -> float
(** May raise Not_found or Invalid_argument *)
exception Unknown_msg_name of string
@@ -51,21 +58,31 @@ module Protocol : functor (Class : CLASS) -> sig
include Serial.PROTOCOL
val message_of_id : message_id -> message
val message_of_name : string -> message_id * message
val values_of_payload : string -> message_id * (string * value) list
val values_of_payload : string -> message_id * values
(** [values_of_bin payload] Parses a raw payload, returns the
message id and the list of (field_name, value) *)
val values_of_bin : string -> message_id * (string * value) list
val values_of_bin : string -> message_id * values
(** [values_of_bin raw_message] Same than previous but [raw_message]
includes header and checksum. *)
val payload_of_values : message_id -> (string * value) list -> string
val payload_of_values : message_id -> values -> string
(** [payload_of_values m vs] Returns a payload *)
val values_of_string : string -> message_id * (string * value) list
val values_of_string : string -> message_id * values
(** May raise [(Unknown_msg_name msg_name)] *)
val string_of_message : message -> (string * value) list -> string
val string_of_message : message -> values -> string
(** [string_of_message msg values] *)
end
val message_send : string -> string -> values -> unit
(** [message_send sender msg_name values] *)
val message_bind : string -> (string -> values -> unit) -> Ivy.binding
(** [message_bind msg_name callback] *)
val message_answerer : string -> string -> (string -> values -> values) -> Ivy.binding
(** [message_answerer sender msg_name callback] *)
val message_req : string -> string -> values -> (string -> values -> unit) -> unit
(** [message_answerer sender msg_name values receiver] Sends a request on the Ivy bus for the specified message. On reception, [receiver] will be applied on [sender_name] and expected values. *)
end
+1 -1
View File
@@ -150,7 +150,7 @@ module Make(AircraftItl : AIRCRAFT_ITL) = struct
let horizon_distance = 1000. in
try
match !last_gps_state with
None -> Printf.printf "gps state NONE \n%!";()
None -> ()
| Some gps_state ->
let delta_ir =
if !ir_srtm then