From: Jérémie D. <Ba...@us...> - 2010-02-16 18:11:06
|
This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "krobot". The branch, master has been updated via 31a63cff42edcdc0ad0302eb62a3bd4fad21bc26 (commit) from 17e2475914c006b1b54860036bb0bf9f65aa4c0d (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 31a63cff42edcdc0ad0302eb62a3bd4fad21bc26 Author: Jérémie Dimino <je...@di...> Date: Tue Feb 16 19:10:36 2010 +0100 Adapt clients for the new driver ----------------------------------------------------------------------- Changes: diff --git a/PC_Mainboard/clients/controller.ml b/PC_Mainboard/clients/controller.ml index 29d6c3e..f8817b0 100644 --- a/PC_Mainboard/clients/controller.ml +++ b/PC_Mainboard/clients/controller.ml @@ -114,14 +114,13 @@ let rec draw size Draw.textf zone x 0 "team = %s" (match team with Krobot.Team_red -> "red" | Krobot.Team_green -> "green"); Draw.textf zone x 1 "jack = %s" (if jack then "present" else "absent"); Draw.textf zone x 2 "compass = %d" compass; - let string_of_state = function - | `Running -> "running" - | `Opening -> "opening" - | `Closed -> "closed" + let text_of_state name = function + | `Absent -> [fg lred; textf "%s card is absent" name] + | `Present -> [fg lred; textf "%s card is present" name] in - Draw.textf zone x 3 "interface card is %s" (string_of_state state_interface); - Draw.textf zone x 4 "sensor card is %s" (string_of_state state_sensor); - Draw.textf zone x 5 "motor card is %s" (string_of_state state_motor); + Draw.textc zone x 3 (text_of_state "interface" state_interface); + Draw.textc zone x 4 (text_of_state "sensor" state_sensor); + Draw.textc zone x 5 (text_of_state "motor" state_motor); let date = Unix.gettimeofday () in let string_of_motor_state until = if date < until then diff --git a/PC_Mainboard/clients/info.ml b/PC_Mainboard/clients/info.ml index 3fee081..99519db 100644 --- a/PC_Mainboard/clients/info.ml +++ b/PC_Mainboard/clients/info.ml @@ -14,19 +14,18 @@ open Lwt_io let print_card krobot card = match React.S.value (Krobot.Card.state krobot card) with - | `Running -> + | `Present -> lwt firmware_build = Krobot.Card.get_firmware_build krobot card and board_info = Krobot.Card.get_board_info krobot card in let name = Krobot.Card.name card in lwt () = printl "==========" in - lwt () = printlf "card.%s.state = running" name in + lwt () = printlf "card.%s.state = present" name in lwt () = printlf "card.%s.firmware_build = %s" name firmware_build in lwt () = printlf "card.%s.board_info = %s" name board_info in return () - | `Opening -> - printlf "card.%s.state = opening" (Krobot.Card.name card) - | `Closed -> - printlf "card.%s.state = closed" (Krobot.Card.name card) + | `Absent -> + lwt () = printl "==========" in + printlf "card.%s.state = absent" (Krobot.Card.name card) lwt () = lwt krobot = Krobot.create () in diff --git a/PC_Mainboard/common/types.ml b/PC_Mainboard/common/types.ml index cb42817..0a4f80a 100644 --- a/PC_Mainboard/common/types.ml +++ b/PC_Mainboard/common/types.ml @@ -28,9 +28,8 @@ let obus_stop_mode = OBus_type.mapping obus_int (`Abrupt, 1); (`Smooth, 2)] -type card_state = [ `Running | `Opening | `Closed ] +type card_state = [ `Present | `Absent ] let obus_card_state = OBus_type.mapping obus_int - [(`Running, 0); - (`Opening, 1); - (`Closed, 2)] + [(`Present, 0); + (`Absent, 1)] diff --git a/PC_Mainboard/common/types.mli b/PC_Mainboard/common/types.mli index 35eed37..53a3511 100644 --- a/PC_Mainboard/common/types.mli +++ b/PC_Mainboard/common/types.mli @@ -25,5 +25,5 @@ type motor = [ `Left | `Right | `Both ] with obus(basic) type stop_mode = [ `Off | `Abrupt | `Smooth ] with obus(basic) (** Mode for stopping motors *) -type card_state = [ `Running | `Opening | `Closed ] with obus(basic) +type card_state = [ `Present | `Absent ] with obus(basic) (** State of a card *) diff --git a/PC_Mainboard/driver/driver.ml b/PC_Mainboard/driver/driver.ml index f103fb2..06e11a1 100644 --- a/PC_Mainboard/driver/driver.ml +++ b/PC_Mainboard/driver/driver.ml @@ -12,8 +12,6 @@ open OBus_pervasives open Lwt -let crashed card = fail (Failure(Printf.sprintf "%s card has crashed" (Card.name card))) - (* +-----------------------------------------------------------------+ | Compass | +-----------------------------------------------------------------+ *) @@ -390,9 +388,9 @@ end let done_waiter, done_wakener = Lwt.wait () let quit = ref false -let card_interface = ref None -let card_sensor = ref None -let card_motor = ref None +let card_interface, set_card_interface = React.S.create None +let card_sensor, set_card_sensor = React.S.create None +let card_motor, set_card_motor = React.S.create None module Manager = struct @@ -405,7 +403,7 @@ struct include OBus.MakeInterface(struct let name = "fr.krobot.Manager" end) - let close card = match !card with + let close card = match React.S.value card with | None -> return () | Some card -> @@ -429,8 +427,10 @@ end module MCard = struct type t = { - card : Card.t; + card : Card.t option React.signal; obus : OBus_object.t; + name : string; + mutable state : unit Lwt.t React.signal; } module OBus = OBus_object.Make(struct @@ -440,26 +440,49 @@ struct include OBus.MakeInterface(struct let name = "fr.krobot.Card" end) - OL_property_r Name : string = fun card -> - return (Card.name card.card) + let get_card dev = match React.S.value dev.card with + | None -> + Printf.ksprintf failwith "%s card is not available" dev.name + | Some card -> + card + + OL_property_r Name : string = fun dev -> + return (Card.name (get_card dev)) + + OL_method GetState : Types.card_state = fun dev -> + match React.S.value dev.card with + | None -> + return `Absent + | Some _ -> + return `Present OL_method GetFirmwareBuild : string = fun dev -> - Commands.get_firmware_build dev.card + Commands.get_firmware_build (get_card dev) OL_method GetBoardInfo : string = fun dev -> - Commands.get_board_info dev.card + Commands.get_board_info (get_card dev) OL_method Bootloader : unit = fun dev -> - Commands.bootloader dev.card + Commands.bootloader (get_card dev) OL_method Reset : unit = fun dev -> - Commands.reset dev.card + Commands.reset (get_card dev) - let make card path = - return { + OL_signal StateChanged : Types.card_state + + let make name card path = + let dev = { card = card; obus = OBus_object.make path; - } + name = name; + state = React.S.const (return ()); + } in + dev.state <- React.S.map (function + | None -> + state_changed dev `Absent + | Some _ -> + state_changed dev `Present) card; + dev end (* +-----------------------------------------------------------------+ @@ -467,7 +490,7 @@ end +-----------------------------------------------------------------+ *) (* Continously try to open the card with given parameters *) -let rec monitor_card ~name ~vendor_id ~product_id ~var on_up on_down = +let rec monitor_card ~name ~vendor_id ~product_id ~set on_up on_down = try_bind (fun () -> return (USB.open_device_with ~vendor_id ~product_id)) @@ -476,11 +499,11 @@ let rec monitor_card ~name ~vendor_id ~product_id ~var on_up on_down = lwt () = try_lwt lwt card = Card.make name handle in - var := Some card; + set (Some card); Log#info "%s card is up and running" name; lwt () = on_up card in lwt result = Card.watch card in - var := None; + set None; lwt () = on_down () in match result with | `Closed -> @@ -495,13 +518,13 @@ let rec monitor_card ~name ~vendor_id ~product_id ~var on_up on_down = if !quit then return () else - monitor_card ~name ~vendor_id ~product_id ~var on_up on_down) + monitor_card ~name ~vendor_id ~product_id ~set on_up on_down) (fun exn -> Log#exn exn "failed to open %s card" name; if !quit then return () else - monitor_card ~name ~vendor_id ~product_id ~var on_up on_down) + monitor_card ~name ~vendor_id ~product_id ~set on_up on_down) (* +-----------------------------------------------------------------+ | Entry point | @@ -553,11 +576,10 @@ lwt () = end; ignore begin - monitor_card ~name:"interace" ~vendor_id:Protocol.usb_vid ~product_id:Protocol.usb_pid_robot_interface ~var:card_interface + monitor_card ~name:"interace" ~vendor_id:Protocol.usb_vid ~product_id:Protocol.usb_pid_robot_interface ~set:set_card_interface (fun card -> lwt () = Commands.Motor.enable card in - lwt () = MCard.OBus.export bus =|< MCard.make card ["fr"; "krobot"; "Cards"; "Interface"] - and () = Compass.OBus.export bus =|< Compass.make card ["fr"; "krobot"; "Devices"; "Compass"] + lwt () = Compass.OBus.export bus =|< Compass.make card ["fr"; "krobot"; "Devices"; "Compass"] and () = AX12.OBus.export bus =|< AX12.make card ["fr"; "krobot"; "Devices"; "AX12"] in return ()) (fun () -> @@ -568,32 +590,34 @@ lwt () = end; ignore begin - monitor_card ~name:"motor" ~vendor_id:Protocol.usb_vid ~product_id:Protocol.usb_pid_motor_controller ~var:card_motor + monitor_card ~name:"sensor" ~vendor_id:Protocol.usb_vid ~product_id:Protocol.usb_pid_proximity_sensor ~set:set_card_sensor (fun card -> - lwt () = Commands.Motor.enable card and () = Commands.Motor.init_lm629 card in - lwt () = MCard.OBus.export bus =|< MCard.make card ["fr"; "krobot"; "Cards"; "Motor"] - and () = Motors.OBus.export bus =|< Motors.make card ["fr"; "krobot"; "Devices"; "Motors"] in + lwt () = Logic_sensors.OBus.export bus =|< Logic_sensors.make card ["fr"; "krobot"; "Devices"; "LogicSensors"] + and () = Range_finders.OBus.export bus =|< Range_finders.make card ["fr"; "krobot"; "Devices"; "RangeFinders"] in return ()) (fun () -> - OBus_object.remove_by_path bus ["fr"; "krobot"; "Cards"; "Motor"]; - OBus_object.remove_by_path bus ["fr"; "krobot"; "Devices"; "Motors"]; + OBus_object.remove_by_path bus ["fr"; "krobot"; "Cards"; "Sensor"]; + OBus_object.remove_by_path bus ["fr"; "krobot"; "Devices"; "LogicSensors"]; + OBus_object.remove_by_path bus ["fr"; "krobot"; "Devices"; "RangeFinders"]; return ()) end; ignore begin - monitor_card ~name:"sensor" ~vendor_id:Protocol.usb_vid ~product_id:Protocol.usb_pid_proximity_sensor ~var:card_sensor + monitor_card ~name:"motor" ~vendor_id:Protocol.usb_vid ~product_id:Protocol.usb_pid_motor_controller ~set:set_card_motor (fun card -> - lwt () = MCard.OBus.export bus =|< MCard.make card ["fr"; "krobot"; "Cards"; "Sensor"] - and () = Logic_sensors.OBus.export bus =|< Logic_sensors.make card ["fr"; "krobot"; "Devices"; "LogicSensors"] - and () = Range_finders.OBus.export bus =|< Range_finders.make card ["fr"; "krobot"; "Devices"; "RangeFinders"] in + lwt () = Commands.Motor.enable card and () = Commands.Motor.init_lm629 card in + lwt () = Motors.OBus.export bus =|< Motors.make card ["fr"; "krobot"; "Devices"; "Motors"] in return ()) (fun () -> - OBus_object.remove_by_path bus ["fr"; "krobot"; "Cards"; "Sensor"]; - OBus_object.remove_by_path bus ["fr"; "krobot"; "Devices"; "LogicSensors"]; - OBus_object.remove_by_path bus ["fr"; "krobot"; "Devices"; "RangeFinders"]; + OBus_object.remove_by_path bus ["fr"; "krobot"; "Cards"; "Motor"]; + OBus_object.remove_by_path bus ["fr"; "krobot"; "Devices"; "Motors"]; return ()) end; + MCard.OBus.export bus (MCard.make "interface" card_interface ["fr"; "krobot"; "Cards"; "Interface"]); + MCard.OBus.export bus (MCard.make "sensor" card_sensor ["fr"; "krobot"; "Cards"; "Sensor"]); + MCard.OBus.export bus (MCard.make "motor" card_motor ["fr"; "krobot"; "Cards"; "Motor"]); + Manager.OBus.export bus (); Log#info "ready, waiting for requests"; diff --git a/PC_Mainboard/lib_krobot/krobot.ml b/PC_Mainboard/lib_krobot/krobot.ml index 409f4ea..6ff6b4b 100644 --- a/PC_Mainboard/lib_krobot/krobot.ml +++ b/PC_Mainboard/lib_krobot/krobot.ml @@ -17,7 +17,7 @@ open Lwt type team = Team_red | Team_green type card = { - card_state : [ `Running | `Opening | `Closed ] React.signal; + card_state : Types.card_state React.signal; } type t = { diff --git a/PC_Mainboard/services/hard_stop.ml b/PC_Mainboard/services/hard_stop.ml index d2ee376..825e3f0 100644 --- a/PC_Mainboard/services/hard_stop.ml +++ b/PC_Mainboard/services/hard_stop.ml @@ -47,7 +47,7 @@ lwt () = ~level:(min Lwt_log.Info Lwt_log.default_level) ~facility:`Daemon (); - Lwt_unix.daemonize ~keep_stderr:true () + Lwt_daemon.daemonize () end; lwt krobot = Krobot.create () in hooks/post-receive -- krobot |