From: Jérémie D. <Ba...@us...> - 2010-02-16 07:05:50
|
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 8adb2a66b9012493643ed81af92932b4494415ba (commit) from 80af4a55967b9189f8263c73a7f173e532b0d367 (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 8adb2a66b9012493643ed81af92932b4494415ba Author: Jérémie Dimino <je...@di...> Date: Tue Feb 16 08:04:50 2010 +0100 [driver/card] abort waiters on card close/crash ----------------------------------------------------------------------- Changes: diff --git a/PC_Mainboard/driver/card.ml b/PC_Mainboard/driver/card.ml index a82451f..2c517d1 100644 --- a/PC_Mainboard/driver/card.ml +++ b/PC_Mainboard/driver/card.ml @@ -132,15 +132,19 @@ let rec get_card wrapper = match wrapper.state with let abort wrapper exn = match wrapper.state with - | Opened card -> - wrapper.state <- Closed exn; - wakeup_exn card.abort_wakener exn; - lwt () = USB.release_interface card.handle 0 in - if card.kernel_active then USB.attach_kernel_driver card.handle 0; - USB.close card.handle; - return exn | Closed exn -> return exn + | Opened card -> + wrapper.state <- Closed exn; + try_lwt + lwt () = USB.release_interface card.handle 0 in + if card.kernel_active then USB.attach_kernel_driver card.handle 0; + USB.close card.handle; + return exn + finally + wakeup_exn card.abort_wakener exn; + Int_map.iter (fun serial w -> wakeup_exn w exn) card.reply_waiters; + return () (* +-----------------------------------------------------------------+ | Dispatching | @@ -239,7 +243,7 @@ let rec make ~name ~handle = +-----------------------------------------------------------------+ *) let send card buffer = - lwt len = USB.interrupt_send ~handle:card.handle ~endpoint:1 buffer 0 64 in + lwt len = select [card.abort_waiter; USB.interrupt_send ~handle:card.handle ~endpoint:1 buffer 0 64] in if len <> 64 then begin let msg = Printf.sprintf "write on %s card returned %d instead of 64" card.wrapper.name len in Log#error "%s" msg; diff --git a/PC_Mainboard/driver/driver.ml b/PC_Mainboard/driver/driver.ml index d821592..0c6adec 100644 --- a/PC_Mainboard/driver/driver.ml +++ b/PC_Mainboard/driver/driver.ml @@ -12,66 +12,6 @@ open OBus_pervasives open Lwt -(* Kill a running driver *) -let kill bus = - OBus_connection.method_call bus - ~path:["fr"; "krobot"; "Manager"] - ~interface:"fr.krobot.Manager" - ~member:"Shutdown" - ~destination:"fr.krobot" - <:obus_func< unit >> - -(* +-----------------------------------------------------------------+ - | Command line options | - +-----------------------------------------------------------------+ *) - -let foreground = ref false -let kill_and_exit = ref false - -let () = - let args = [ - "-n", Arg.Set foreground, "do not daemonize"; - "-k", Arg.Set kill_and_exit, "kill any running driver and exit"; - ] in - let usage_msg = Printf.sprintf "Usage: %s [-n]\n\noptions are:" (Filename.basename (Sys.argv.(0))) in - Arg.parse args ignore usage_msg; - - if !kill_and_exit then - Lwt_main.run begin - lwt bus = Lazy.force OBus_bus.system in - lwt () = kill bus in - exit 0 - end - -(* +-----------------------------------------------------------------+ - | Cards | - +-----------------------------------------------------------------+ *) - -let card_interface = Card.open_card ~name:"interface" ~vendor_id:Protocol.usb_vid ~product_id:Protocol.usb_pid_robot_interface -let card_sensor = Card.open_card ~name:"sensor" ~vendor_id:Protocol.usb_vid ~product_id:Protocol.usb_pid_proximity_sensor -let card_motor = Card.open_card ~name:"motor" ~vendor_id:Protocol.usb_vid ~product_id:Protocol.usb_pid_motor_controller - -(* Enable motors when a card comes up *) -let on_running card f = - let stop = ref ignore in - let notifier = - Lwt_signal.notify_p - (function - | `Running -> - f card - | `Opening -> - return () - | `Closed -> - !stop (); - return ()) - (Card.state card) - in - stop := (fun () -> Lwt_signal.disable notifier) - -let () = - on_running card_interface Commands.Motor.enable; - on_running card_motor (fun card -> Commands.Motor.enable card <&> Commands.Motor.init_lm629 card) - (* +-----------------------------------------------------------------+ | Compass | +-----------------------------------------------------------------+ *) @@ -528,67 +468,116 @@ struct end (* +-----------------------------------------------------------------+ + | Cards | + +-----------------------------------------------------------------+ *) + + + +let card_interface = Card.open_card ~name:"interface" ~vendor_id:Protocol.usb_vid ~product_id:Protocol.usb_pid_robot_interface +let card_sensor = Card.open_card ~name:"sensor" ~vendor_id:Protocol.usb_vid ~product_id:Protocol.usb_pid_proximity_sensor +let card_motor = Card.open_card ~name:"motor" ~vendor_id:Protocol.usb_vid ~product_id:Protocol.usb_pid_motor_controller + +(* Enable motors when a card comes up *) +let on_running card f = + let stop = ref ignore in + let notifier = + Lwt_signal.notify_p + (function + | `Running -> + f card + | `Opening -> + return () + | `Closed -> + !stop (); + return ()) + (Card.state card) + in + stop := (fun () -> Lwt_signal.disable notifier) + +let () = + on_running card_interface Commands.Motor.enable; + on_running card_motor (fun card -> Commands.Motor.enable card <&> Commands.Motor.init_lm629 card) + +(* +-----------------------------------------------------------------+ | Entry point | +-----------------------------------------------------------------+ *) lwt () = + let foreground = ref false and kill_and_exit = ref false in + let args = [ + "-n", Arg.Set foreground, "do not daemonize"; + "-k", Arg.Set kill_and_exit, "kill any running driver and exit"; + ] in + let usage_msg = Printf.sprintf "Usage: %s [-n]\n\noptions are:" (Filename.basename (Sys.argv.(0))) in + Arg.parse args ignore usage_msg; + (* Be verbose: *) Lwt_log.set_level !Lwt_log.default (min Lwt_log.Info Lwt_log.default_level); + (* Open the krobot message bus *) lwt bus = OBus_bus.of_addresses (OBus_address.of_string Config.bus_address) in - lwt () = OBus_bus.name_has_owner bus "fr.krobot" >>= function - | true -> - (* If a daemon is already running, kill it: *) - Log#info "killing the currently running driver"; - kill bus - | false -> - return () + lwt () = + try_lwt + Log#info "Killing any running driver"; + OBus_connection.method_call bus + ~path:["fr"; "krobot"; "Manager"] + ~interface:"fr.krobot.Manager" + ~member:"Shutdown" + ~destination:"fr.krobot" + <:obus_func< unit >> + with OBus_bus.Service_unknown _ -> + return () in - (* Request the bus name for the driver: *) - lwt () = OBus_bus.request_name bus "fr.krobot" >>= function - | `primary_owner -> - return () - | _ -> - fail (Failure "cannot obtain the name 'fr.krobot'") - in + if !kill_and_exit then + return () - if !foreground then - (* Running foreground, prints message on stderr: *) - Log#info "starting krobot driver in foreground mode" else begin - Log#info "starting krobot driver in daemon mode"; - (* In daemon mode, send messages to syslog: *) - Lwt_log.default := Lwt_log.syslog - ~level:(min Lwt_log.Info Lwt_log.default_level) - ~facility:`Daemon - (); - (* Become a daemon. Keep stderr for possible error messages of - libusb. *) - Lwt_unix.daemonize ~keep_stderr:true () - end; - - Log#info "creating and exporting objects"; - - (* Interface card *) - Compass.OBus.export bus (Compass.make card_interface ["fr"; "krobot"; "Devices"; "Compass"]); - AX12.OBus.export bus (AX12.make card_interface ["fr"; "krobot"; "Devices"; "AX12"]); - - (* Sensor card *) - Logic_sensors.OBus.export bus (Logic_sensors.make card_sensor ["fr"; "krobot"; "Devices"; "LogicSensors"]); - Range_finders.OBus.export bus (Range_finders.make card_sensor ["fr"; "krobot"; "Devices"; "RangeFinders"]); - - (* Motor card *) - Motors.OBus.export bus (Motors.make card_motor ["fr"; "krobot"; "Devices"; "Motors"]); - - (* Cards *) - MCard.OBus.export bus (MCard.make card_interface ["fr"; "krobot"; "Cards"; "Interface"]); - MCard.OBus.export bus (MCard.make card_sensor ["fr"; "krobot"; "Cards"; "Sensor"]); - MCard.OBus.export bus (MCard.make card_motor ["fr"; "krobot"; "Cards"; "Motor"]); - - (* Internal objects *) - Manager.OBus.export bus (); - - Log#info "ready, waiting for requests"; - done_waiter + (* Request the bus name for the driver: *) + lwt () = OBus_bus.request_name bus "fr.krobot" >>= function + | `primary_owner -> + return () + | _ -> + fail (Failure "cannot obtain the name 'fr.krobot'") + in + + if !foreground then + (* Running foreground, prints message on stderr: *) + Log#info "starting krobot driver in foreground mode" + else begin + Log#info "starting krobot driver in daemon mode"; + (* In daemon mode, send messages to syslog: *) + Lwt_log.default := Lwt_log.syslog + ~level:(min Lwt_log.Info Lwt_log.default_level) + ~facility:`Daemon + (); + (* Become a daemon. Keep stderr for possible error messages of + libusb. *) + Lwt_unix.daemonize ~keep_stderr:true () + end; + + Log#info "creating and exporting objects"; + + (* Interface card *) + Compass.OBus.export bus (Compass.make card_interface ["fr"; "krobot"; "Devices"; "Compass"]); + AX12.OBus.export bus (AX12.make card_interface ["fr"; "krobot"; "Devices"; "AX12"]); + + (* Sensor card *) + Logic_sensors.OBus.export bus (Logic_sensors.make card_sensor ["fr"; "krobot"; "Devices"; "LogicSensors"]); + Range_finders.OBus.export bus (Range_finders.make card_sensor ["fr"; "krobot"; "Devices"; "RangeFinders"]); + + (* Motor card *) + Motors.OBus.export bus (Motors.make card_motor ["fr"; "krobot"; "Devices"; "Motors"]); + + (* Cards *) + MCard.OBus.export bus (MCard.make card_interface ["fr"; "krobot"; "Cards"; "Interface"]); + MCard.OBus.export bus (MCard.make card_sensor ["fr"; "krobot"; "Cards"; "Sensor"]); + MCard.OBus.export bus (MCard.make card_motor ["fr"; "krobot"; "Cards"; "Motor"]); + + (* Internal objects *) + Manager.OBus.export bus (); + + Log#info "ready, waiting for requests"; + done_waiter + end hooks/post-receive -- krobot |