From: Jérémie D. <Ba...@us...> - 2010-03-20 15:09:26
|
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 8dc0a8c11338c9b18afbe9bd3473370afc110dd7 (commit) from f2213bbbf674944c0d841ddb4a7e71d25010bb2e (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 8dc0a8c11338c9b18afbe9bd3473370afc110dd7 Author: Jérémie Dimino <je...@di...> Date: Sat Mar 20 16:08:50 2010 +0100 Display errors in the controller ----------------------------------------------------------------------- Changes: diff --git a/PC_Mainboard/clients/controller.ml b/PC_Mainboard/clients/controller.ml index 329f205..8c58876 100644 --- a/PC_Mainboard/clients/controller.ml +++ b/PC_Mainboard/clients/controller.ml @@ -425,6 +425,13 @@ lwt () = notify (Krobot.Card.state (krobot, `Motor)); notify services; + List.iter + (fun card -> + Lwt_event.always_notify + (fun error -> log_add_line [fg lred; textf "error on card %s: %s" (Krobot.Card.name card) error]) + (Krobot.Card.errors (krobot, card))) + [`Interface; `Sensor; `Motor; `Monitoring]; + (* Redraw immedlatly the screen when [signal] changes: *) let urgent signal = Lwt_signal.always_notify_p (fun _ -> refresh krobot) signal in urgent Lwt_term.size; diff --git a/PC_Mainboard/driver/driver.ml b/PC_Mainboard/driver/driver.ml index 8705b76..41c7c76 100644 --- a/PC_Mainboard/driver/driver.ml +++ b/PC_Mainboard/driver/driver.ml @@ -678,6 +678,7 @@ struct obus : OBus_object.t; name : string; mutable state : unit Lwt.t React.signal; + mutable errors : unit Lwt.t React.event; } module OBus = OBus_object.Make(struct @@ -721,6 +722,7 @@ struct USB_commands.Card.test (get_card dev) OL_signal StateChanged : Krobot_types.card_state + OL_signal Error : string let make name card path = let dev = { @@ -728,17 +730,19 @@ struct obus = OBus.make ~interfaces:[Unsafe.ol_interface; ol_interface] path; name = name; state = React.S.const (return ()); + errors = React.E.never; } in dev.state <- React.S.map (function | None -> state_changed dev `Absent - | Some _ -> + | Some card -> + dev.errors <- React.E.map (error dev) (Krobot_card.errors card); state_changed dev `Present) card; dev end (* +-----------------------------------------------------------------+ - | Krobot_cards management | + | Krobot_cards management | +-----------------------------------------------------------------+ *) (* Continously try to open the card with given parameters *) diff --git a/PC_Mainboard/driver/krobot_card.ml b/PC_Mainboard/driver/krobot_card.ml index d89b116..f12da8b 100644 --- a/PC_Mainboard/driver/krobot_card.ml +++ b/PC_Mainboard/driver/krobot_card.ml @@ -124,6 +124,9 @@ type card = { abort_wakener : int Lwt.u; (* Sleeping thread which is wakeup when the card is closed *) + errors : string React.event; + push_error : string -> unit; + wrapper : wrapper; (* The associated wrapper *) } @@ -148,12 +151,16 @@ let closed wrapper = match wrapper.state with let watch wrapper = wrapper.watch (* Return a running card, if possible. *) -let rec get_card wrapper = match wrapper.state with +let get_card wrapper = match wrapper.state with | Opened card -> return card | Closed exn -> fail exn +let errors wrapper = match wrapper.state with + | Opened card -> card.errors + | Closed exn -> raise exn + (* +-----------------------------------------------------------------+ | Aborting | +-----------------------------------------------------------------+ *) @@ -235,7 +242,10 @@ let rec dispatch card = ignore (Log.exn_f exn "pushing event %d from %s card failed with" msg.command card.wrapper.name)) seq | None -> - ignore (dropped "command" card msg) + if msg.error <> 0 then + card.push_error (error_message msg.error) + else + ignore (dropped "command" card msg) end; dispatch card end @@ -258,6 +268,7 @@ let rec make ~name ~handle = lwt () = USB.set_configuration handle 1 in lwt () = USB.claim_interface handle 0 in let abort_waiter, abort_wakener = wait () in + let errors, push_error = React.E.create () in let rec card = { serial_pool = (let rec loop = function | 256 -> [] @@ -272,6 +283,8 @@ let rec make ~name ~handle = abort_waiter = abort_waiter; abort_wakener = abort_wakener; wrapper = wrapper; + errors = errors; + push_error = push_error; } and wrapper = { state = Opened card; name = name; diff --git a/PC_Mainboard/driver/krobot_card.mli b/PC_Mainboard/driver/krobot_card.mli index 8c65caf..219bf62 100644 --- a/PC_Mainboard/driver/krobot_card.mli +++ b/PC_Mainboard/driver/krobot_card.mli @@ -57,3 +57,7 @@ val send_command : t -> int -> string -> unit Lwt.t val connect : t -> int -> < event : string React.event; stop : unit > (** [connect card command] connects to signals [command] emitted by [card] *) + +val errors : t -> string React.event + (** [errors card] is an event which occurs each time a card send an + error *) diff --git a/PC_Mainboard/lib_krobot/krobot.ml b/PC_Mainboard/lib_krobot/krobot.ml index a866c75..54647ed 100644 --- a/PC_Mainboard/lib_krobot/krobot.ml +++ b/PC_Mainboard/lib_krobot/krobot.ml @@ -21,6 +21,7 @@ type team = Team_red | Team_green type card = { card_state : Krobot_types.card_state React.signal; + card_errors : string React.event; } type t = { @@ -138,10 +139,38 @@ let create ?peer () = range_finders = range_finders; inhibited_forward_until = inhibited_forward_until; inhibited_backward_until = inhibited_backward_until; - interface = { card_state = card_interface }; - sensor = { card_state = card_sensor }; - motor = { card_state = card_motor }; - monitoring = { card_state = card_monitoring }; + interface = { + card_state = card_interface; + card_errors = (OBus_proxy.connect + (OBus_proxy.make peer ["fr"; "krobot"; "Cards"; "Interface"]) + ~interface:"fr.krobot.Card" + ~member:"Error" + <:obus_type< string >>)#event; + }; + sensor = { + card_state = card_sensor; + card_errors = (OBus_proxy.connect + (OBus_proxy.make peer ["fr"; "krobot"; "Cards"; "Sensor"]) + ~interface:"fr.krobot.Card" + ~member:"Error" + <:obus_type< string >>)#event; + }; + motor = { + card_state = card_motor; + card_errors = (OBus_proxy.connect + (OBus_proxy.make peer ["fr"; "krobot"; "Cards"; "Motor"]) + ~interface:"fr.krobot.Card" + ~member:"Error" + <:obus_type< string >>)#event; + }; + monitoring = { + card_state = card_monitoring; + card_errors = (OBus_proxy.connect + (OBus_proxy.make peer ["fr"; "krobot"; "Cards"; "Monitoring"]) + ~interface:"fr.krobot.Card" + ~member:"Error" + <:obus_type< string >>)#event; + }; } (* +-----------------------------------------------------------------+ @@ -230,6 +259,12 @@ struct | `Motor -> krobot.motor.card_state | `Monitoring -> krobot.monitoring.card_state + let errors (krobot, card) = match card with + | `Interface -> krobot.interface.card_errors + | `Sensor -> krobot.sensor.card_errors + | `Motor -> krobot.motor.card_errors + | `Monitoring -> krobot.monitoring.card_errors + module Proxy = OBus_proxy.Make (struct type proxy = t * card diff --git a/PC_Mainboard/lib_krobot/krobot.mli b/PC_Mainboard/lib_krobot/krobot.mli index 26d12d9..3138a02 100644 --- a/PC_Mainboard/lib_krobot/krobot.mli +++ b/PC_Mainboard/lib_krobot/krobot.mli @@ -139,6 +139,8 @@ module Card : sig val bootloader : t * card -> unit Lwt.t (** Put the card into bootloader mode *) + val errors : t * card -> string React.event + val get_firmware_build : t * card -> string Lwt.t val get_board_info : t * card -> string Lwt.t val reset : t * card -> unit Lwt.t hooks/post-receive -- krobot |