mirror of
https://github.com/paparazzi/paparazzi.git
synced 2026-06-06 16:58:48 +08:00
request&answer on Ivy mechanisms
This commit is contained in:
+6
-2
@@ -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"/>
|
||||
|
||||
@@ -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 $@
|
||||
|
||||
@@ -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 ();
|
||||
|
||||
@@ -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 ();
|
||||
|
||||
@@ -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
@@ -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
@@ -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
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user