You can subscribe to this list here.
2009 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
(13) |
---|---|---|---|---|---|---|---|---|---|---|---|---|
2010 |
Jan
(50) |
Feb
(137) |
Mar
(84) |
Apr
(36) |
May
(100) |
Jun
(5) |
Jul
|
Aug
(4) |
Sep
(13) |
Oct
(1) |
Nov
(4) |
Dec
(22) |
2011 |
Jan
(4) |
Feb
(9) |
Mar
(113) |
Apr
(76) |
May
(31) |
Jun
(19) |
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
2012 |
Jan
(4) |
Feb
|
Mar
(2) |
Apr
(6) |
May
(19) |
Jun
|
Jul
|
Aug
|
Sep
|
Oct
(4) |
Nov
|
Dec
|
2013 |
Jan
|
Feb
|
Mar
(2) |
Apr
(22) |
May
(6) |
Jun
|
Jul
|
Aug
|
Sep
|
Oct
(1) |
Nov
|
Dec
|
2014 |
Jan
|
Feb
|
Mar
|
Apr
|
May
(1) |
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
From: Jérémie D. <Ba...@us...> - 2010-02-16 17:33:11
|
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 17e2475914c006b1b54860036bb0bf9f65aa4c0d (commit) from 8adb2a66b9012493643ed81af92932b4494415ba (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 17e2475914c006b1b54860036bb0bf9f65aa4c0d Author: Jérémie Dimino <je...@di...> Date: Tue Feb 16 18:08:28 2010 +0100 [driver] rewrite the driver with card monitoring ----------------------------------------------------------------------- Changes: diff --git a/PC_Mainboard/driver/card.ml b/PC_Mainboard/driver/card.ml index 2c517d1..cd8c920 100644 --- a/PC_Mainboard/driver/card.ml +++ b/PC_Mainboard/driver/card.ml @@ -110,6 +110,7 @@ and state = and wrapper = { mutable state : state; name : string; + watch : [ `Error of exn | `Closed ] Lwt.t; } type t = wrapper @@ -119,6 +120,8 @@ let closed wrapper = match wrapper.state with | Opened _ -> false | Closed _ -> true +let watch wrapper = wrapper.watch + (* Return a running card, if possible. *) let rec get_card wrapper = match wrapper.state with | Opened card -> @@ -234,6 +237,15 @@ let rec make ~name ~handle = } and wrapper = { state = Opened card; name = name; + watch = (try_lwt + lwt _ = abort_waiter in + (* Never happen: *) + return `Closed + with + | Card_closed -> + return `Closed + | exn -> + return (`Error exn)) } in ignore (dispatch card); return wrapper diff --git a/PC_Mainboard/driver/card.mli b/PC_Mainboard/driver/card.mli index c0ad590..d435a21 100644 --- a/PC_Mainboard/driver/card.mli +++ b/PC_Mainboard/driver/card.mli @@ -19,6 +19,11 @@ val name : t -> string val closed : t -> bool (** Returns [true] iff the card has been closed *) +val watch : t -> [ `Error of exn | `Closed ] Lwt.t + (** [watch card] is a thread which is wakeup when the card is + closed, or when a fatal error happen. The argument describe the + reason. *) + exception Card_closed (** Exception raised when trying to use a closed card *) diff --git a/PC_Mainboard/driver/commands.ml b/PC_Mainboard/driver/commands.ml index c298091..8524f16 100644 --- a/PC_Mainboard/driver/commands.ml +++ b/PC_Mainboard/driver/commands.ml @@ -28,6 +28,9 @@ let get_board_info card = let bootloader card = Card.send_command card Protocol.cmd_bootloader "" +let reset card = + Card.send_command card Protocol.cmd_reset "" + module Compass = struct let get card = diff --git a/PC_Mainboard/driver/commands.mli b/PC_Mainboard/driver/commands.mli index 7c0862c..ac1fe16 100644 --- a/PC_Mainboard/driver/commands.mli +++ b/PC_Mainboard/driver/commands.mli @@ -14,6 +14,7 @@ val get_firmware_build : Card.t -> string Lwt.t val get_board_info : Card.t -> string Lwt.t val bootloader : Card.t -> unit Lwt.t +val reset : Card.t -> unit Lwt.t module Compass : sig val get : Card.t -> int Lwt.t diff --git a/PC_Mainboard/driver/driver.ml b/PC_Mainboard/driver/driver.ml index 0c6adec..f103fb2 100644 --- a/PC_Mainboard/driver/driver.ml +++ b/PC_Mainboard/driver/driver.ml @@ -12,6 +12,8 @@ open OBus_pervasives open Lwt +let crashed card = fail (Failure(Printf.sprintf "%s card has crashed" (Card.name card))) + (* +-----------------------------------------------------------------+ | Compass | +-----------------------------------------------------------------+ *) @@ -46,13 +48,14 @@ struct loop dev let make card path = + lwt data = Commands.Compass.get card in let dev = { obus = OBus_object.make path; card = card; - data = 0; + data = data; } in ignore (loop dev); - dev + return dev end (* +-----------------------------------------------------------------+ @@ -77,10 +80,11 @@ struct fun dev id pos speed -> Commands.AX12.goto dev.card id pos speed - let make card path = { - obus = OBus_object.make path; - card = card; - } + let make card path = + return { + obus = OBus_object.make path; + card = card; + } end (* +-----------------------------------------------------------------+ @@ -123,7 +127,7 @@ struct data = Array.create 16 false; } in ignore (loop dev); - dev + return dev end (* +-----------------------------------------------------------------+ @@ -166,12 +170,9 @@ struct data = Array.create 8 0; } in ignore (loop dev); - dev + return dev end -open OBus_pervasives -open Lwt - (* +-----------------------------------------------------------------+ | Motors | +-----------------------------------------------------------------+ *) @@ -380,8 +381,7 @@ struct speed_left = 0; speed_right = 0; } in - dev.state <- React.S.map (fun state -> dev.acceleration <- 0) (Card.state card); - dev + return dev end (* +-----------------------------------------------------------------+ @@ -389,6 +389,10 @@ 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 module Manager = struct @@ -401,13 +405,19 @@ struct include OBus.MakeInterface(struct let name = "fr.krobot.Manager" end) - OL_method Shutdown : unit = fun () -> + let close card = match !card with + | None -> + return () + | Some card -> + Card.close card + + OL_method Shutdown : OBus_connection.t -> unit = fun () connection -> Log#info "exiting"; - lwt bus = Lazy.force OBus_bus.system in - lwt () = Card.close card_interface - and () = Card.close card_sensor - and () = Card.close card_motor - and _ = OBus_bus.release_name bus "fr.krobot" in + quit := true; + lwt _ = OBus_bus.release_name connection "fr.krobot" + and () = close card_interface + and () = close card_sensor + and () = close card_motor in Lwt.wakeup done_wakener (); return () end @@ -421,7 +431,6 @@ struct type t = { card : Card.t; obus : OBus_object.t; - mutable state : unit Lwt.t React.signal; } module OBus = OBus_object.Make(struct @@ -434,69 +443,65 @@ struct OL_property_r Name : string = fun card -> return (Card.name card.card) - let string_of_azt data = - try - String.sub data 0 (String.index data '\000') - with Not_found -> - data - OL_method GetFirmwareBuild : string = fun dev -> Commands.get_firmware_build dev.card OL_method GetBoardInfo : string = fun dev -> Commands.get_board_info dev.card - OL_method GetState : Types.card_state = fun dev -> - return (React.S.value (Card.state dev.card)) - OL_method Bootloader : unit = fun dev -> Commands.bootloader dev.card OL_method Reset : unit = fun dev -> - Card.restart dev.card - - OL_signal StateChanged : Types.card_state + Commands.reset dev.card let make card path = - let dev = { + return { card = card; obus = OBus_object.make path; - state = React.S.const (return ()); - } in - dev.state <- React.S.map (state_changed dev) (Card.state dev.card); - dev + } end (* +-----------------------------------------------------------------+ - | Cards | + | Cards management | +-----------------------------------------------------------------+ *) - - -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) +(* Continously try to open the card with given parameters *) +let rec monitor_card ~name ~vendor_id ~product_id ~var on_up on_down = + try_bind + (fun () -> + return (USB.open_device_with ~vendor_id ~product_id)) + (fun handle -> + Log#info "%s card opened" name; + lwt () = + try_lwt + lwt card = Card.make name handle in + var := Some card; + Log#info "%s card is up and running" name; + lwt () = on_up card in + lwt result = Card.watch card in + var := None; + lwt () = on_down () in + match result with + | `Closed -> + return () + | `Error exn -> + Log#exn exn "%s card crashed with" name; + return () + with exn -> + Log#exn exn "failed to initialise %s card" name; + return () + in + if !quit then + return () + else + monitor_card ~name ~vendor_id ~product_id ~var 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) (* +-----------------------------------------------------------------+ | Entry point | @@ -511,9 +516,6 @@ lwt () = 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 @@ -525,7 +527,7 @@ lwt () = ~interface:"fr.krobot.Manager" ~member:"Shutdown" ~destination:"fr.krobot" - <:obus_func< unit >> + <:obus_func< unit >> with OBus_bus.Service_unknown _ -> return () in @@ -544,38 +546,54 @@ lwt () = if !foreground then (* Running foreground, prints message on stderr: *) - Log#info "starting krobot driver in foreground mode" + Log#notice "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 () + Log#notice "starting krobot driver in daemon mode"; + Lwt_daemon.daemonize () 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"]); + ignore begin + monitor_card ~name:"interace" ~vendor_id:Protocol.usb_vid ~product_id:Protocol.usb_pid_robot_interface ~var: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"] + and () = AX12.OBus.export bus =|< AX12.make card ["fr"; "krobot"; "Devices"; "AX12"] in + return ()) + (fun () -> + OBus_object.remove_by_path bus ["fr"; "krobot"; "Cards"; "Interface"]; + OBus_object.remove_by_path bus ["fr"; "krobot"; "Devices"; "Compass"]; + OBus_object.remove_by_path bus ["fr"; "krobot"; "Devices"; "AX12"]; + return ()) + end; - (* Motor card *) - Motors.OBus.export bus (Motors.make card_motor ["fr"; "krobot"; "Devices"; "Motors"]); + ignore begin + monitor_card ~name:"motor" ~vendor_id:Protocol.usb_vid ~product_id:Protocol.usb_pid_motor_controller ~var:card_motor + (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 + return ()) + (fun () -> + OBus_object.remove_by_path bus ["fr"; "krobot"; "Cards"; "Motor"]; + OBus_object.remove_by_path bus ["fr"; "krobot"; "Devices"; "Motors"]; + return ()) + end; - (* 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"]); + ignore begin + monitor_card ~name:"sensor" ~vendor_id:Protocol.usb_vid ~product_id:Protocol.usb_pid_proximity_sensor ~var:card_sensor + (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 + 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"]; + return ()) + end; - (* Internal objects *) Manager.OBus.export bus (); Log#info "ready, waiting for requests"; hooks/post-receive -- krobot |
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 |
From: Jérémie D. <Ba...@us...> - 2010-02-15 22:50:30
|
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 80af4a55967b9189f8263c73a7f173e532b0d367 (commit) from fdb6a0d68539867257a8498a43564647205aa20e (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 80af4a55967b9189f8263c73a7f173e532b0d367 Author: Jérémie Dimino <je...@di...> Date: Mon Feb 15 23:49:50 2010 +0100 Rewrite the Card module ----------------------------------------------------------------------- Changes: diff --git a/PC_Mainboard/driver/card.ml b/PC_Mainboard/driver/card.ml index 2bb819f..a82451f 100644 --- a/PC_Mainboard/driver/card.ml +++ b/PC_Mainboard/driver/card.ml @@ -9,10 +9,6 @@ open Lwt -(* Log an error message and exit: *) -let fatal fmt = - Printf.ksprintf (fun txt -> Log#fatal "%s" txt; exit 2) fmt - (* +-----------------------------------------------------------------+ | Messages | +-----------------------------------------------------------------+ *) @@ -61,7 +57,7 @@ let forge_message msg = buf.[Protocol.up_cmd] <- Char.chr msg.command; buf.[Protocol.up_err] <- Char.chr msg.error; if String.length msg.data > 52 then - fatal "message trop grand pour être envoyé" + Printf.ksprintf invalid_arg "message body too big: %d > 52" (String.length msg.data) else begin String.blit msg.data 0 buf Protocol.up_data (String.length msg.data); buf @@ -72,10 +68,9 @@ let forge_message msg = +-----------------------------------------------------------------+ *) exception Card_closed +exception Card_crashed of string -module SerialMap = Map.Make(struct type t = serial let compare = compare end) - -type state = [ `Running | `Opening | `Closed ] +module Int_map = Map.Make(struct type t = int let compare = compare end) (* Type of a up and running card *) type card = { @@ -83,7 +78,7 @@ type card = { (* Pool de serial disponibles, comme il n'y a que 256 serial disponibles on évite de juste incrémenter un compteur au pif. *) - mutable reply_waiters : string Lwt.u SerialMap.t; + mutable reply_waiters : string Lwt.u Int_map.t; (* Threads en attente d'une réponse *) handle : USB.handle; @@ -96,191 +91,177 @@ type card = { mutex : Lwt_mutex.t; (* Mutex pour envoyer des commandes, les cartes n'aiment pas les appels parallèles. *) -} -type wrapper_state = - | Running of card - | Opening of unit Lwt.t - | Closed + mutable events : (string -> unit) Lwt_sequence.t Int_map.t; + (* Connected events *) -type wrapper = { - mutable state : wrapper_state; + abort_waiter : int Lwt.t; + abort_wakener : int Lwt.u; + (* Sleeping thread which is wakeup when the card is closed *) - public_state : state React.signal; - set_public_state : state -> unit; - (* The state that is returning to the user *) + wrapper : wrapper; + (* The associated wrapper *) +} - vendor_id : int; - product_id : int; - (* Informations needed to reopen the card when it crashes *) +and state = + | Opened of card + | Closed of exn +and wrapper = { + mutable state : state; name : string; - - events : (int * (string -> unit)) Lwt_sequence.t; - (* Connected events *) } type t = wrapper let name wrapper = wrapper.name +let closed wrapper = match wrapper.state with + | Opened _ -> false + | Closed _ -> true + +(* Return a running card, if possible. *) +let rec get_card wrapper = match wrapper.state with + | Opened card -> + return card + | Closed exn -> + fail exn -(* Returns the public state of a wrapper *) -let state wrapper = wrapper.public_state +(* +-----------------------------------------------------------------+ + | Aborting | + +-----------------------------------------------------------------+ *) -(* Set the state of a wrapper *) -let set_state wrapper state = - wrapper.state <- state; - wrapper.set_public_state - (match state with - | Running _ -> `Running - | Opening _ -> `Opening - | Closed -> `Closed) +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 (* +-----------------------------------------------------------------+ - | Opening, closing and dispatching | + | Dispatching | +-----------------------------------------------------------------+ *) -(* Return a running card, if possible. *) -let rec get_card wrapper = match wrapper.state with - | Running card -> - return card - | Opening waiter -> - lwt () = waiter in - get_card wrapper - | Closed -> - fail Card_closed - -let close_card card = - 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 () +(* Dispatch incomming messages continously *) +let rec dispatch card = + let buffer = String.create 64 in + begin + try_lwt + select [card.abort_waiter; + USB.interrupt_recv + ~handle:card.handle + ~endpoint:1 + buffer 0 64] >|= fun len -> `OK len + with exn -> + return (`Error exn) + end >>= function + | `Error exn -> + Log#exn exn "stop dispatching on %s card: %s" card.wrapper.name (Printexc.to_string exn); + lwt _ = abort card.wrapper exn in + return () + | `OK len -> + if len <> 64 then begin + let msg = Printf.sprintf "read on %s card returned %d instead of 64" card.wrapper.name len in + Log#error "%s" msg; + lwt _ = abort card.wrapper (Card_crashed msg) in + return () + end else begin + let msg = parse_message buffer in + if msg.command = Protocol.cmd_respond then begin + match try Some(Int_map.find msg.host_serial card.reply_waiters) with Not_found -> None with + | Some wakener -> + card.reply_waiters <- Int_map.remove msg.host_serial card.reply_waiters; + card.serial_pool <- card.serial_pool @ [msg.host_serial]; + Lwt.wakeup wakener msg.data + | None -> + Log#warning "response dropped" + end else begin + match try Some(Int_map.find msg.command card.events) with Not_found -> None with + | Some seq -> + Lwt_sequence.iter_l + (fun push -> + try + push msg.data + with exn -> + Log#exn exn "pushing event %d from %s card failed with" msg.command card.wrapper.name) + seq + | None -> + Log#warning "command dropped" + end; + dispatch card + end + +(* +-----------------------------------------------------------------+ + | Opening and closing | + +-----------------------------------------------------------------+ *) let close wrapper = match wrapper.state with - | Running card -> - set_state wrapper Closed; - close_card card - | Opening waiter -> - set_state wrapper Closed; - Lwt.cancel waiter; - return () - | Closed -> + | Opened _ -> + lwt _ = abort wrapper Card_closed in return () - -(* Retry continuously to open a card until it succeed: *) -let rec reopen_card wakener wrapper = - let rec loop is_first = - try_lwt - (* USB stuff *) - let handle = USB.open_device_with ~vendor_id:wrapper.vendor_id ~product_id:wrapper.product_id in - lwt () = USB.reset_device handle in - let kernel_active = USB.kernel_driver_active handle 0 in - if kernel_active then USB.detach_kernel_driver handle 0; - lwt () = USB.set_configuration handle 1 in - lwt () = USB.claim_interface handle 0 in - - Log#info "%s card opened" wrapper.name; - - let card = { - serial_pool = (let rec loop = function - | 256 -> [] - | n -> n :: loop (n + 1) - in - loop 1); - reply_waiters = SerialMap.empty; - handle = handle; - kernel_active = kernel_active; - mutex = Lwt_mutex.create (); - } in - set_state wrapper (Running card); - ignore (dispatch wrapper card); - Lwt.wakeup wakener (); + | Closed _ -> return () - with exn -> - if is_first then Log#exn exn "failed to open %s card" wrapper.name; - lwt () = Lwt_unix.sleep Config.reopen_delay in - loop false - in - loop true -(* Dispatch incomming messages *) -and dispatch wrapper card = - let buffer = String.create 64 in - lwt len = USB.interrupt_recv ~handle:card.handle ~endpoint:1 buffer 0 64 in - if len <> 64 then fatal "read <> 64!"; - let msg = parse_message buffer in - if msg.command = Protocol.cmd_respond then begin - (* Réponse à un message *) - match try Some(SerialMap.find msg.host_serial card.reply_waiters) with Not_found -> None with - | Some wakener -> - card.reply_waiters <- SerialMap.remove msg.host_serial card.reply_waiters; - card.serial_pool <- card.serial_pool @ [msg.host_serial]; - Lwt.wakeup wakener msg.data - | None -> - Log#warning "response dropped" - end else begin - Lwt_sequence.iter_l - (fun (command, push) -> - if command = msg.command then - try - push msg.data - with exn -> - Log#exn exn "pushing event %d failed with: " msg.command) - wrapper.events - end; - dispatch wrapper card - -let open_card ~name ~vendor_id ~product_id = - let waiter, wakener = Lwt.task () in - let state, set_state = React.S.create `Opening in - let wrapper = { - state = Opening waiter; - public_state = state; - set_public_state = set_state; - vendor_id = vendor_id; - product_id = product_id; +let rec make ~name ~handle = + lwt () = USB.reset_device handle in + let kernel_active = USB.kernel_driver_active handle 0 in + if kernel_active then USB.detach_kernel_driver handle 0; + lwt () = USB.set_configuration handle 1 in + lwt () = USB.claim_interface handle 0 in + let abort_waiter, abort_wakener = wait () in + let rec card = { + serial_pool = (let rec loop = function + | 256 -> [] + | n -> n :: loop (n + 1) + in + loop 1); + reply_waiters = Int_map.empty; + events = Int_map.empty; + handle = handle; + kernel_active = kernel_active; + mutex = Lwt_mutex.create (); + abort_waiter = abort_waiter; + abort_wakener = abort_wakener; + wrapper = wrapper; + } and wrapper = { + state = Opened card; name = name; - events = Lwt_sequence.create (); } in - ignore (reopen_card wakener wrapper); - wrapper - -(* Close and reopen a card: *) -let restart wrapper = - Log#info "restarting %s card" wrapper.name; - match wrapper.state with - | Opening _ | Closed -> - return () - | Running card -> - let waiter, wakener = Lwt.task () in - set_state wrapper (Opening waiter); - lwt () = - (* Try to close the card before reopening it: *) - try_lwt - close_card card - with exn -> - Log#exn exn "cannot close %s card" wrapper.name; - return () - in - ignore (reopen_card wakener wrapper); - return () + ignore (dispatch card); + return wrapper (* +-----------------------------------------------------------------+ | Sending/receiving messages | +-----------------------------------------------------------------+ *) +let send card buffer = + lwt len = 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; + fail =<< abort card.wrapper (Card_crashed msg) + end else + return () + (* Send a command and wait for the response: *) let rec send_request wrapper command data = lwt card = get_card wrapper in let serial = match card.serial_pool with | [] -> - fatal "no more serial available!" - | s :: l -> - card.serial_pool <- l; - s + failwith "Card.send_request: no more serial available!" + | serial :: rest -> + card.serial_pool <- rest; + serial in - let waiter, wakener = Lwt.wait () in - card.reply_waiters <- SerialMap.add serial wakener card.reply_waiters; + let waiter, wakener = Lwt.task () in + card.reply_waiters <- Int_map.add serial wakener card.reply_waiters; + on_cancel waiter (fun () -> + card.reply_waiters <- Int_map.remove serial card.reply_waiters; + card.serial_pool <- card.serial_pool @ [serial]); let buffer = forge_message { host_serial = serial; device_serial = 0; command = command; @@ -289,16 +270,14 @@ let rec send_request wrapper command data = try_lwt Lwt_mutex.with_lock card.mutex (fun () -> - lwt len = USB.interrupt_send ~handle:card.handle ~endpoint:1 buffer 0 64 in - if len <> 64 then fatal "write <> 64!"; + lwt () = send card buffer in waiter) with | Canceled -> fail Canceled - | exn -> - Log#exn exn "write to %s card failed" wrapper.name; - lwt () = restart wrapper in - send_request wrapper command data + | exn -> + Log#exn exn "write to %s card failed with" wrapper.name; + fail =<< abort wrapper exn (* Send a command without waiting for the reply: *) let rec send_command wrapper command data = @@ -309,21 +288,35 @@ let rec send_command wrapper command data = error = 0; data = data } in try_lwt - lwt len = USB.interrupt_send ~handle:card.handle ~endpoint:1 buffer 0 64 in - if len <> 64 then fatal "write <> 64!"; - return () + Lwt_mutex.with_lock card.mutex (fun () -> send card buffer) with | Canceled -> fail Canceled | exn -> - Log#exn exn "write to %s card failed" wrapper.name; - lwt () = restart wrapper in - send_command wrapper command data - -let connect wrapper command = - let event, push = React.E.create () in - let node = Lwt_sequence.add_l (command, push) wrapper.events in - (object - method event = event - method stop = Lwt_sequence.remove node; React.E.stop event - end) + Log#exn exn "write to %s card failed with" wrapper.name; + fail =<< abort wrapper exn + +let connect wrapper command = match wrapper.state with + | Closed exn -> + raise exn + | Opened card -> + let event, push = React.E.create () in + let seq = + try + Int_map.find command card.events + with Not_found -> + let seq = Lwt_sequence.create () in + card.events <- Int_map.add command seq card.events; + seq + in + let node = Lwt_sequence.add_l push seq in + let stop = lazy( + Lwt_sequence.remove node; + if Lwt_sequence.is_empty seq then + card.events <- Int_map.remove command card.events; + React.E.stop event + ) in + (object + method event = event + method stop = Lazy.force stop + end) diff --git a/PC_Mainboard/driver/card.mli b/PC_Mainboard/driver/card.mli index 8ca9ef2..c0ad590 100644 --- a/PC_Mainboard/driver/card.mli +++ b/PC_Mainboard/driver/card.mli @@ -12,38 +12,28 @@ type t (** Type of a card *) -(** {6 Card state} *) +val name : t -> string + (** Returns the name of a card. It can be applied on a closed + card. *) -(** State of a card: *) -type state = - [ `Running - (** The card is up and running *) - | `Opening - (** The card is being opened *) - | `Closed - (** The card has been closed *) ] +val closed : t -> bool + (** Returns [true] iff the card has been closed *) -val state : t -> state React.signal - (** [state card] is the state of a card, as a reactive value *) +exception Card_closed + (** Exception raised when trying to use a closed card *) -val name : t -> string - (** Returns the name of a card *) +exception Card_crashed of string + (** Exception raised when a fatal error happen on the card *) (** {6 Card opening/closing} *) -val open_card : name : string -> vendor_id : int -> product_id : int -> t - (** Opten the card with given product-id and vendor-id. [name] is - used for debug messages. *) +val make : name : string -> handle : USB.handle -> t Lwt.t + (** [make ~name ~handle] creates a card using the given USB + handle. [name] is used for debug messages. *) val close : t -> unit Lwt.t (** Close the given card *) -exception Card_closed - (** Exception raised when trying to use a closed card *) - -val restart : t -> unit Lwt.t - (** Closes and reopens the given card *) - (** {6 Sending/receving messages} *) val make_buffer : unit -> string hooks/post-receive -- krobot |
From: Jérémie D. <Ba...@us...> - 2010-02-15 20:58:55
|
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 fdb6a0d68539867257a8498a43564647205aa20e (commit) via 1def6218a057d6844c344042d595424dd891f396 (commit) from a4b90752699e95c28994bd8db6da99995798d984 (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 fdb6a0d68539867257a8498a43564647205aa20e Author: Jérémie Dimino <je...@di...> Date: Mon Feb 15 21:57:08 2010 +0100 Do not inverse directions in joy_control commit 1def6218a057d6844c344042d595424dd891f396 Author: Olivier BICHLER <oli...@en...> Date: Mon Feb 15 21:54:26 2010 +0100 Inverse directions for the right motor. ----------------------------------------------------------------------- Changes: diff --git a/PC_Mainboard/clients/joy_control.ml b/PC_Mainboard/clients/joy_control.ml index b36a9de..8c01b87 100644 --- a/PC_Mainboard/clients/joy_control.ml +++ b/PC_Mainboard/clients/joy_control.ml @@ -132,7 +132,7 @@ let parent_loop krobot pipe = return () | JoyRAxis n -> if not !rstop then - lwt () = try_call "set-speed-right" (fun () -> Krobot.set_speed krobot ~motor:`Right ~speed:((-n) * axis_coef) ~acc:acceleration) in + lwt () = try_call "set-speed-right" (fun () -> Krobot.set_speed krobot ~motor:`Right ~speed:(n * axis_coef) ~acc:acceleration) in loop () else loop () diff --git a/PC_Mainboard/driver/commands.ml b/PC_Mainboard/driver/commands.ml index 5404b77..c298091 100644 --- a/PC_Mainboard/driver/commands.ml +++ b/PC_Mainboard/driver/commands.ml @@ -93,9 +93,11 @@ struct backend Protocol.traj_tr card angle speed acc (* Values comming from lm629.h *) - let int_of_direction = function - | `Forward -> 1 - | `Backward -> -1 + let int_of_direction motor dir = match motor, dir with + | `Right, `Forward -> -1 + | `Right, `Backward -> 1 + | _, `Forward -> 1 + | _, `Backward -> -1 let int_of_motor = function | `Left -> Protocol.motor_left @@ -113,7 +115,7 @@ struct RW.set_uint8 data 1 (int_of_motor motor); RW.set_int16 data 2 speed; RW.set_int16 data 4 acc; - RW.set_uint8 data 6 (int_of_direction dir); + RW.set_uint8 data 6 (int_of_direction motor dir); Card.send_command card Protocol.cmd_traj data let traj_change_velocity card ~motor ~speed ~dir = @@ -121,7 +123,7 @@ struct RW.set_uint8 data 0 Protocol.traj_change_velocity; RW.set_uint8 data 1 (int_of_motor motor); RW.set_int16 data 2 speed; - RW.set_uint8 data 4 (int_of_direction dir); + RW.set_uint8 data 4 (int_of_direction motor dir); Card.send_command card Protocol.cmd_traj data let traj_start card ~motor = hooks/post-receive -- krobot |
From: Jérémie D. <Ba...@us...> - 2010-02-15 18:56:46
|
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 a4b90752699e95c28994bd8db6da99995798d984 (commit) via 682f03efcf4e3f6d2ba9f83ce31b877238dfa952 (commit) from 4487bdbbf8267e3f894707a786880dbe9929a00f (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 a4b90752699e95c28994bd8db6da99995798d984 Author: Jérémie Dimino <je...@di...> Date: Mon Feb 15 19:53:58 2010 +0100 allow to reset cards in the controller commit 682f03efcf4e3f6d2ba9f83ce31b877238dfa952 Author: Jérémie Dimino <je...@di...> Date: Mon Feb 15 19:45:56 2010 +0100 Handle failures in joy_control.ml. ----------------------------------------------------------------------- Changes: diff --git a/PC_Mainboard/clients/joy_control.ml b/PC_Mainboard/clients/joy_control.ml index 1fb1edb..b36a9de 100644 --- a/PC_Mainboard/clients/joy_control.ml +++ b/PC_Mainboard/clients/joy_control.ml @@ -117,6 +117,13 @@ let child_loop pipe joy = let axis_coef = 8 let acceleration = 800 +let try_call action f = + try_lwt + f () + with Failure msg -> + Log#error "action %s failed with: %s" action msg; + return () + let parent_loop krobot pipe = let rstop = ref false and lstop = ref false in let rec loop () = @@ -125,24 +132,24 @@ let parent_loop krobot pipe = return () | JoyRAxis n -> if not !rstop then - lwt () = Krobot.set_speed krobot ~motor:`Right ~speed:((-n) * axis_coef) ~acc:acceleration in + lwt () = try_call "set-speed-right" (fun () -> Krobot.set_speed krobot ~motor:`Right ~speed:((-n) * axis_coef) ~acc:acceleration) in loop () else loop () | JoyLAxis n -> if not !lstop then - lwt () = Krobot.set_speed krobot ~motor:`Left ~speed:(n * axis_coef) ~acc:acceleration in + lwt () = try_call "set-speed-left" (fun () -> Krobot.set_speed krobot ~motor:`Left ~speed:(n * axis_coef) ~acc:acceleration) in loop () else loop () | JoyButtonPressed ButtonL2 -> lstop := true; - lwt () = Krobot.stop_motors krobot ~motor:`Left ~mode:`Abrupt in + lwt () = try_call "stop-left-motor" (fun () -> Krobot.stop_motors krobot ~motor:`Left ~mode:`Abrupt) in ignore (lwt () = Lwt_unix.sleep 1.0 in lstop := false; return ()); loop () | JoyButtonPressed ButtonR2 -> rstop := true; - lwt () = Krobot.stop_motors krobot ~motor:`Right ~mode:`Abrupt in + lwt () = try_call "stop-right-motor" (fun () -> Krobot.stop_motors krobot ~motor:`Right ~mode:`Abrupt) in ignore (lwt () = Lwt_unix.sleep 1.0 in rstop := false; return ()); loop () | JoyButtonReleased ButtonCircle -> @@ -178,5 +185,6 @@ let () = Unix.close fd_w; Lwt_main.run begin lwt krobot = Krobot.create () in + Log#notice "ready to process event"; parent_loop krobot (Lwt_io.of_unix_fd ~mode:Lwt_io.input fd_r) end diff --git a/PC_Mainboard/clients/script.ml b/PC_Mainboard/clients/script.ml index 158bd3d..d9999d2 100644 --- a/PC_Mainboard/clients/script.ml +++ b/PC_Mainboard/clients/script.ml @@ -41,6 +41,8 @@ let commands = [ ("acc", Arg_int)] }; { name = "bootloader"; args = [("card", Arg_keyword ["interface"; "sensor"; "motor"])] }; + { name = "reset"; + args = [("card", Arg_keyword ["interface"; "sensor"; "motor"])] }; ] let set_of_list l = List.fold_left (fun set x -> TextSet.add x set) TextSet.empty l @@ -140,6 +142,13 @@ let exec krobot line = | "motor" -> `Motor | "sensor" -> `Sensor | _ -> failwith "Script.exec: invalid card") + | "reset" -> + Krobot.Card.reset krobot + (match arg_string "card" "" with + | "interface" -> `Interface + | "motor" -> `Motor + | "sensor" -> `Sensor + | _ -> failwith "Script.exec: invalid card") | _ -> Log#error "unknown command %S" action; return () diff --git a/PC_Mainboard/driver/card.mli b/PC_Mainboard/driver/card.mli index 55cc194..8ca9ef2 100644 --- a/PC_Mainboard/driver/card.mli +++ b/PC_Mainboard/driver/card.mli @@ -41,6 +41,9 @@ val close : t -> unit Lwt.t exception Card_closed (** Exception raised when trying to use a closed card *) +val restart : t -> unit Lwt.t + (** Closes and reopens the given card *) + (** {6 Sending/receving messages} *) val make_buffer : unit -> string diff --git a/PC_Mainboard/driver/driver.ml b/PC_Mainboard/driver/driver.ml index 801319b..d821592 100644 --- a/PC_Mainboard/driver/driver.ml +++ b/PC_Mainboard/driver/driver.ml @@ -512,6 +512,9 @@ struct OL_method Bootloader : unit = fun dev -> Commands.bootloader dev.card + OL_method Reset : unit = fun dev -> + Card.restart dev.card + OL_signal StateChanged : Types.card_state let make card path = diff --git a/PC_Mainboard/lib_krobot/krobot.ml b/PC_Mainboard/lib_krobot/krobot.ml index 1b38052..409f4ea 100644 --- a/PC_Mainboard/lib_krobot/krobot.ml +++ b/PC_Mainboard/lib_krobot/krobot.ml @@ -213,6 +213,7 @@ struct OP_method GetFirmwareBuild : string OP_method GetBoardInfo : string OP_method Bootloader : unit + OP_method Reset : unit let proxy krobot card = OBus_proxy.make krobot.peer @@ -224,4 +225,5 @@ struct let get_firmware_build krobot card = get_firmware_build (proxy krobot card) let get_board_info krobot card = get_board_info (proxy krobot card) let bootloader krobot card = bootloader (proxy krobot card) + let reset krobot card = reset (proxy krobot card) end diff --git a/PC_Mainboard/lib_krobot/krobot.mli b/PC_Mainboard/lib_krobot/krobot.mli index 3a45b1a..6561470 100644 --- a/PC_Mainboard/lib_krobot/krobot.mli +++ b/PC_Mainboard/lib_krobot/krobot.mli @@ -99,4 +99,5 @@ module Card : sig 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 end hooks/post-receive -- krobot |
From: Jérémie D. <Ba...@us...> - 2010-02-14 17:38:54
|
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 4487bdbbf8267e3f894707a786880dbe9929a00f (commit) from eba0bca6e5256da9fb4defc48157e10ea1a7f517 (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 4487bdbbf8267e3f894707a786880dbe9929a00f Author: Jérémie Dimino <je...@di...> Date: Sun Feb 14 18:38:22 2010 +0100 Typo in script.ml ----------------------------------------------------------------------- Changes: diff --git a/PC_Mainboard/clients/script.ml b/PC_Mainboard/clients/script.ml index 5c91e14..158bd3d 100644 --- a/PC_Mainboard/clients/script.ml +++ b/PC_Mainboard/clients/script.ml @@ -117,9 +117,9 @@ let exec krobot line = | "backward" -> move (Krobot.move krobot ~dist:(-(arg_int "dist" 100)) ~speed:(arg_int "speed" 400) ?acc:(arg_int "acc" 800)) | "left" -> - move (Krobot.turn krobot ~angle:(arg_int "dist" 100) ~speed:(arg_int "speed" 400) ?acc:(arg_int "acc" 800)) + move (Krobot.turn krobot ~angle:(arg_int "angle" 100) ~speed:(arg_int "speed" 400) ?acc:(arg_int "acc" 800)) | "right" -> - move (Krobot.turn krobot ~angle:(-(arg_int "dist" 100)) ~speed:(arg_int "speed" 400) ?acc:(arg_int "acc" 800)) + move (Krobot.turn krobot ~angle:(-(arg_int "angle" 100)) ~speed:(arg_int "speed" 400) ?acc:(arg_int "acc" 800)) | "stop-motors" -> Krobot.stop_motors krobot ~motor:(motor_of_string (arg_string "motor" "both")) hooks/post-receive -- krobot |
From: Jérémie D. <Ba...@us...> - 2010-02-14 16:32:24
|
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 eba0bca6e5256da9fb4defc48157e10ea1a7f517 (commit) from 8fe2c0254889142a8965c9132a825851b65b4d6d (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 eba0bca6e5256da9fb4defc48157e10ea1a7f517 Author: Jérémie Dimino <je...@di...> Date: Sun Feb 14 17:32:00 2010 +0100 Add tests/double_move.ml ----------------------------------------------------------------------- Changes: diff --git a/PC_Mainboard/tests/double_move.ml b/PC_Mainboard/tests/double_move.ml new file mode 100644 index 0000000..b0758b4 --- /dev/null +++ b/PC_Mainboard/tests/double_move.ml @@ -0,0 +1,25 @@ +(* + * double_move.ml + * -------------- + * Copyright : (c) 2010, Jeremie Dimino <je...@di...> + * Licence : BSD3 + * + * This file is a part of [kro]bot. + *) + +open Lwt + +let print_result = function + | `OK -> print_endline "ok" + | `Stopped -> print_endline "stopped" + +lwt () = + lwt krobot = Krobot.create () in + print_endline "first move"; + lwt result = Krobot.move krobot ~dist:(-500) ~speed:100 ~acc:200 in + print_result result; + print_endline "second move"; + lwt result = Krobot.move krobot ~dist:200 ~speed:100 ~acc:200 in + print_result result; + print_endline "done"; + return () hooks/post-receive -- krobot |
From: Jérémie D. <Ba...@us...> - 2010-02-14 16:31:14
|
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 8fe2c0254889142a8965c9132a825851b65b4d6d (commit) from 20ae0c3992b6052a624236ee9bf72f2174c83e4c (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 8fe2c0254889142a8965c9132a825851b65b4d6d Author: Olivier BICHLER <oli...@en...> Date: Sun Feb 14 17:28:59 2010 +0100 Add argument "-Is ..." to ocamlbuild For some reason the "include" does not work. ----------------------------------------------------------------------- Changes: diff --git a/PC_Mainboard/Makefile b/PC_Mainboard/Makefile index 121732e..005dcbb 100644 --- a/PC_Mainboard/Makefile +++ b/PC_Mainboard/Makefile @@ -7,7 +7,7 @@ PREFIX=/usr/local -OC = ocamlbuild +OC = ocamlbuild -Is common,lib_krobot OF = ocamlfind ifeq ($(TERM),dumb) hooks/post-receive -- krobot |
From: Olivier B. <Ba...@us...> - 2010-02-14 12:17:02
|
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 20ae0c3992b6052a624236ee9bf72f2174c83e4c (commit) from 8b3593844b7eed937ef746d741469eaee1295610 (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 20ae0c3992b6052a624236ee9bf72f2174c83e4c Author: Olivier BICHLER <oli...@gm...> Date: Sun Feb 14 13:15:58 2010 +0100 Amélioration du modèle du réducteur P20 ----------------------------------------------------------------------- Changes: diff --git a/meca/Assemblage P20.CATProduct b/meca/Assemblage P20.CATProduct new file mode 100644 index 0000000..59aa670 Binary files /dev/null and b/meca/Assemblage P20.CATProduct differ diff --git a/meca/Assemblage reducteur.CATProduct b/meca/Assemblage reducteur.CATProduct deleted file mode 100644 index 62cabdf..0000000 Binary files a/meca/Assemblage reducteur.CATProduct and /dev/null differ diff --git a/meca/Axe reducteur.CATPart b/meca/Axe reducteur.CATPart deleted file mode 100644 index a4228ce..0000000 Binary files a/meca/Axe reducteur.CATPart and /dev/null differ diff --git a/meca/Base assemblee.CATProduct b/meca/Base assemblee.CATProduct index b88466d..3fdd346 100644 Binary files a/meca/Base assemblee.CATProduct and b/meca/Base assemblee.CATProduct differ diff --git a/meca/Bras tige 1.CATPart b/meca/Bras tige 1.CATPart index fbbb62f..7fc7567 100644 Binary files a/meca/Bras tige 1.CATPart and b/meca/Bras tige 1.CATPart differ diff --git a/meca/Bras.CATProduct b/meca/Bras.CATProduct index 00307fb..09d3410 100644 Binary files a/meca/Bras.CATProduct and b/meca/Bras.CATProduct differ diff --git a/meca/Decalage pince guidage.CATPart b/meca/Decalage pince guidage.CATPart index 29cb86b..f445067 100644 Binary files a/meca/Decalage pince guidage.CATPart and b/meca/Decalage pince guidage.CATPart differ diff --git a/meca/P20 Arbre.CATPart b/meca/P20 Arbre.CATPart new file mode 100644 index 0000000..bc674a6 Binary files /dev/null and b/meca/P20 Arbre.CATPart differ diff --git a/meca/P20 Boitier.CATPart b/meca/P20 Boitier.CATPart new file mode 100644 index 0000000..de2f7e5 Binary files /dev/null and b/meca/P20 Boitier.CATPart differ diff --git a/meca/P20 Sortie.CATPart b/meca/P20 Sortie.CATPart new file mode 100644 index 0000000..65765cd Binary files /dev/null and b/meca/P20 Sortie.CATPart differ diff --git a/meca/PackBatteries.CATPart b/meca/PackBatteries.CATPart index e69c335..645c7e6 100644 Binary files a/meca/PackBatteries.CATPart and b/meca/PackBatteries.CATPart differ diff --git a/meca/Reducteur.CATPart b/meca/Reducteur.CATPart deleted file mode 100644 index 725f718..0000000 Binary files a/meca/Reducteur.CATPart and /dev/null differ diff --git a/meca/Tete servo S3010.CATPart b/meca/Tete servo S3010.CATPart index 85b683e..e1b6831 100644 Binary files a/meca/Tete servo S3010.CATPart and b/meca/Tete servo S3010.CATPart differ hooks/post-receive -- krobot |
From: Olivier B. <Ba...@us...> - 2010-02-13 16:10:21
|
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 8b3593844b7eed937ef746d741469eaee1295610 (commit) from a67201449e8b7179a94d1d0cd40c4cf8193d3964 (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 8b3593844b7eed937ef746d741469eaee1295610 Author: Olivier BICHLER <oli...@gm...> Date: Sat Feb 13 17:08:00 2010 +0100 Ajout de fixations et amélioration du rendu ----------------------------------------------------------------------- Changes: diff --git a/meca/Arbre moteur.CATPart b/meca/Arbre moteur.CATPart index aa69588..99a2efc 100644 Binary files a/meca/Arbre moteur.CATPart and b/meca/Arbre moteur.CATPart differ diff --git a/meca/Assemblage reducteur.CATProduct b/meca/Assemblage reducteur.CATProduct index 928daab..62cabdf 100644 Binary files a/meca/Assemblage reducteur.CATProduct and b/meca/Assemblage reducteur.CATProduct differ diff --git a/meca/Axe moteur C03092.CATPart b/meca/Axe moteur C03092.CATPart index b9f8554..5356334 100644 Binary files a/meca/Axe moteur C03092.CATPart and b/meca/Axe moteur C03092.CATPart differ diff --git a/meca/Axe moteur EMG30.CATPart b/meca/Axe moteur EMG30.CATPart index c61119c..2263cf4 100644 Binary files a/meca/Axe moteur EMG30.CATPart and b/meca/Axe moteur EMG30.CATPart differ diff --git a/meca/Axe porte.CATPart b/meca/Axe porte.CATPart index b25b999..de537e0 100644 Binary files a/meca/Axe porte.CATPart and b/meca/Axe porte.CATPart differ diff --git a/meca/Axe reducteur.CATPart b/meca/Axe reducteur.CATPart index d464baa..a4228ce 100644 Binary files a/meca/Axe reducteur.CATPart and b/meca/Axe reducteur.CATPart differ diff --git a/meca/Bac cote 1.CATPart b/meca/Bac cote 1.CATPart index 411c093..47d17ca 100644 Binary files a/meca/Bac cote 1.CATPart and b/meca/Bac cote 1.CATPart differ diff --git a/meca/Bac cote 2.CATPart b/meca/Bac cote 2.CATPart index 8b1b5c3..9205d88 100644 Binary files a/meca/Bac cote 2.CATPart and b/meca/Bac cote 2.CATPart differ diff --git a/meca/Base assemblee.CATProduct b/meca/Base assemblee.CATProduct index 032cf6d..b88466d 100644 Binary files a/meca/Base assemblee.CATProduct and b/meca/Base assemblee.CATProduct differ diff --git a/meca/Base.CATPart b/meca/Base.CATPart index e0a0595..6e676c4 100644 Binary files a/meca/Base.CATPart and b/meca/Base.CATPart differ diff --git a/meca/Bille porteuse.CATPart b/meca/Bille porteuse.CATPart index 0ab037b..fe4eb50 100644 Binary files a/meca/Bille porteuse.CATPart and b/meca/Bille porteuse.CATPart differ diff --git a/meca/Bras tige 1.CATPart b/meca/Bras tige 1.CATPart index 6851368..fbbb62f 100644 Binary files a/meca/Bras tige 1.CATPart and b/meca/Bras tige 1.CATPart differ diff --git a/meca/Bras.CATProduct b/meca/Bras.CATProduct index e7f2318..00307fb 100644 Binary files a/meca/Bras.CATProduct and b/meca/Bras.CATProduct differ diff --git a/meca/Decalage pince guidage.CATPart b/meca/Decalage pince guidage.CATPart index f07658d..29cb86b 100644 Binary files a/meca/Decalage pince guidage.CATPart and b/meca/Decalage pince guidage.CATPart differ diff --git a/meca/Ecrou/Ecrou M2.CATPart b/meca/Ecrou/Ecrou M2.CATPart index bccfc91..ad3e77b 100644 Binary files a/meca/Ecrou/Ecrou M2.CATPart and b/meca/Ecrou/Ecrou M2.CATPart differ diff --git a/meca/Ecrou/Ecrou M3 autoblocant.CATPart b/meca/Ecrou/Ecrou M3 autoblocant.CATPart index 348cce3..fddb039 100644 Binary files a/meca/Ecrou/Ecrou M3 autoblocant.CATPart and b/meca/Ecrou/Ecrou M3 autoblocant.CATPart differ diff --git a/meca/Ecrou/Ecrou M4 autoblocant.CATPart b/meca/Ecrou/Ecrou M4 autoblocant.CATPart index 0dd4659..0d99592 100644 Binary files a/meca/Ecrou/Ecrou M4 autoblocant.CATPart and b/meca/Ecrou/Ecrou M4 autoblocant.CATPart differ diff --git a/meca/Ecrou/Ecrou M8 autoblocant.CATPart b/meca/Ecrou/Ecrou M8 autoblocant.CATPart index d7cdbf5..5705314 100644 Binary files a/meca/Ecrou/Ecrou M8 autoblocant.CATPart and b/meca/Ecrou/Ecrou M8 autoblocant.CATPart differ diff --git a/meca/Encodeur HEDL 55__.CATPart b/meca/Encodeur HEDL 55__.CATPart index d1b96ed..3493a28 100644 Binary files a/meca/Encodeur HEDL 55__.CATPart and b/meca/Encodeur HEDL 55__.CATPart differ diff --git a/meca/Entretoise/Entretoise M3 F-F 10mm.CATPart b/meca/Entretoise/Entretoise M3 F-F 10mm.CATPart index 54b98ec..5762b02 100644 Binary files a/meca/Entretoise/Entretoise M3 F-F 10mm.CATPart and b/meca/Entretoise/Entretoise M3 F-F 10mm.CATPart differ diff --git a/meca/Entretoise/Entretoise M3 M-F 10mm.CATPart b/meca/Entretoise/Entretoise M3 M-F 10mm.CATPart index 4dcbb52..6f70b77 100644 Binary files a/meca/Entretoise/Entretoise M3 M-F 10mm.CATPart and b/meca/Entretoise/Entretoise M3 M-F 10mm.CATPart differ diff --git a/meca/Entretoise/Entretoise M3 M-F 30mm.CATPart b/meca/Entretoise/Entretoise M3 M-F 30mm.CATPart index 1d8b4ec..e993c8e 100644 Binary files a/meca/Entretoise/Entretoise M3 M-F 30mm.CATPart and b/meca/Entretoise/Entretoise M3 M-F 30mm.CATPart differ diff --git a/meca/Entretoise/Entretoise M3 M-F 40mm.CATPart b/meca/Entretoise/Entretoise M3 M-F 40mm.CATPart index f6db1e5..36c3bf8 100644 Binary files a/meca/Entretoise/Entretoise M3 M-F 40mm.CATPart and b/meca/Entretoise/Entretoise M3 M-F 40mm.CATPart differ diff --git a/meca/Entretoise/Entretoise M4 M-F 10mm.CATPart b/meca/Entretoise/Entretoise M4 M-F 10mm.CATPart index ffa58ef..7957545 100644 Binary files a/meca/Entretoise/Entretoise M4 M-F 10mm.CATPart and b/meca/Entretoise/Entretoise M4 M-F 10mm.CATPart differ diff --git a/meca/Entretoise/Entretoise M4 M-F 20mm.CATPart b/meca/Entretoise/Entretoise M4 M-F 20mm.CATPart index 284193b..8cdfa8b 100644 Binary files a/meca/Entretoise/Entretoise M4 M-F 20mm.CATPart and b/meca/Entretoise/Entretoise M4 M-F 20mm.CATPart differ diff --git a/meca/Entretoise/Entretoise M4 M-F 60mm.CATPart b/meca/Entretoise/Entretoise M4 M-F 60mm.CATPart index 680958f..774fd24 100644 Binary files a/meca/Entretoise/Entretoise M4 M-F 60mm.CATPart and b/meca/Entretoise/Entretoise M4 M-F 60mm.CATPart differ diff --git a/meca/Essieu.CATPart b/meca/Essieu.CATPart index a2c5f22..1605ea1 100644 Binary files a/meca/Essieu.CATPart and b/meca/Essieu.CATPart differ diff --git a/meca/Moteur.CATPart b/meca/Moteur.CATPart index 04a1ebe..d96832d 100644 Binary files a/meca/Moteur.CATPart and b/meca/Moteur.CATPart differ diff --git a/meca/Niveau 1 bac.CATPart b/meca/Niveau 1 bac.CATPart index e56b2bf..ca85aa4 100644 Binary files a/meca/Niveau 1 bac.CATPart and b/meca/Niveau 1 bac.CATPart differ diff --git a/meca/Niveau 1.CATPart b/meca/Niveau 1.CATPart index f7240bf..c722bb3 100644 Binary files a/meca/Niveau 1.CATPart and b/meca/Niveau 1.CATPart differ diff --git a/meca/Niveau 2 bac.CATPart b/meca/Niveau 2 bac.CATPart index fd39492..a982c46 100644 Binary files a/meca/Niveau 2 bac.CATPart and b/meca/Niveau 2 bac.CATPart differ diff --git a/meca/Niveau 2.CATPart b/meca/Niveau 2.CATPart index 221ce99..1d0edfa 100644 Binary files a/meca/Niveau 2.CATPart and b/meca/Niveau 2.CATPart differ diff --git a/meca/Niveau 3 bac.CATPart b/meca/Niveau 3 bac.CATPart index eed2585..b439954 100644 Binary files a/meca/Niveau 3 bac.CATPart and b/meca/Niveau 3 bac.CATPart differ diff --git a/meca/Niveau 3.CATPart b/meca/Niveau 3.CATPart index 04a6fb7..22e23e1 100644 Binary files a/meca/Niveau 3.CATPart and b/meca/Niveau 3.CATPart differ diff --git a/meca/PackBatteries.CATPart b/meca/PackBatteries.CATPart index c668618..e69c335 100644 Binary files a/meca/PackBatteries.CATPart and b/meca/PackBatteries.CATPart differ diff --git a/meca/Pince guidage.CATPart b/meca/Pince guidage.CATPart index aba5224..b1ee446 100644 Binary files a/meca/Pince guidage.CATPart and b/meca/Pince guidage.CATPart differ diff --git a/meca/Porte.CATPart b/meca/Porte.CATPart index 629801b..ff59aea 100644 Binary files a/meca/Porte.CATPart and b/meca/Porte.CATPart differ diff --git a/meca/Poulie dentee 15T2,5-8.CATPart b/meca/Poulie dentee 15T2,5-8.CATPart index 0e4fdba..8bfd923 100644 Binary files a/meca/Poulie dentee 15T2,5-8.CATPart and b/meca/Poulie dentee 15T2,5-8.CATPart differ diff --git a/meca/Reducteur.CATPart b/meca/Reducteur.CATPart index c085a07..725f718 100644 Binary files a/meca/Reducteur.CATPart and b/meca/Reducteur.CATPart differ diff --git a/meca/Servo S3010.CATPart b/meca/Servo S3010.CATPart index 8e439de..08689e5 100644 Binary files a/meca/Servo S3010.CATPart and b/meca/Servo S3010.CATPart differ diff --git a/meca/Support BH0102-40-606.CATPart b/meca/Support BH0102-40-606.CATPart index 04081b3..ecd5aa7 100644 Binary files a/meca/Support BH0102-40-606.CATPart and b/meca/Support BH0102-40-606.CATPart differ diff --git a/meca/Support axe porte sym.CATPart b/meca/Support axe porte sym.CATPart index b8d51a1..594f757 100644 Binary files a/meca/ Support axe porte sym.CATPart and b/meca/Support axe porte sym.CATPart differ diff --git a/meca/Support axe porte.CATPart b/meca/Support axe porte.CATPart index 7cb6f12..b2f0b6b 100644 Binary files a/meca/Support axe porte.CATPart and b/meca/Support axe porte.CATPart differ diff --git a/meca/Support bras.CATPart b/meca/Support bras.CATPart index 98a6f4e..52b4a72 100644 Binary files a/meca/Support bras.CATPart and b/meca/Support bras.CATPart differ diff --git a/meca/Support moteur C03092.CATPart b/meca/Support moteur C03092.CATPart index 9f971e7..41cd346 100644 Binary files a/meca/Support moteur C03092.CATPart and b/meca/Support moteur C03092.CATPart differ diff --git a/meca/Support moteurs.CATPart b/meca/Support moteurs.CATPart index b726759..99d7744 100644 Binary files a/meca/Support moteurs.CATPart and b/meca/Support moteurs.CATPart differ diff --git a/meca/Support reducteur.CATPart b/meca/Support reducteur.CATPart index 1f629c1..3527561 100644 Binary files a/meca/Support reducteur.CATPart and b/meca/Support reducteur.CATPart differ diff --git a/meca/Support tourelle.CATPart b/meca/Support tourelle.CATPart index 0ec4e8a..b144d59 100644 Binary files a/meca/Support tourelle.CATPart and b/meca/Support tourelle.CATPart differ diff --git a/meca/Tete servo S3010.CATPart b/meca/Tete servo S3010.CATPart index cf3d897..85b683e 100644 Binary files a/meca/Tete servo S3010.CATPart and b/meca/Tete servo S3010.CATPart differ diff --git a/meca/Vis/Vis cylindrique hexa M3x10.CATPart b/meca/Vis/Vis cylindrique hexa M3x10.CATPart index 0b64b82..720bc62 100644 Binary files a/meca/Vis/Vis cylindrique hexa M3x10.CATPart and b/meca/Vis/Vis cylindrique hexa M3x10.CATPart differ diff --git a/meca/Vis/Vis cylindrique hexa M4x16.CATPart b/meca/Vis/Vis cylindrique hexa M4x16.CATPart index e445b2a..21324f8 100644 Binary files a/meca/Vis/Vis cylindrique hexa M4x16.CATPart and b/meca/Vis/Vis cylindrique hexa M4x16.CATPart differ diff --git a/meca/Vis/Vis cylindrique hexa M4x35.CATPart b/meca/Vis/Vis cylindrique hexa M4x35.CATPart index a489add..e0cfa12 100644 Binary files a/meca/Vis/Vis cylindrique hexa M4x35.CATPart and b/meca/Vis/Vis cylindrique hexa M4x35.CATPart differ diff --git a/meca/Vis/Vis tete bombee hexa M3x12.CATPart b/meca/Vis/Vis tete bombee hexa M3x12.CATPart index 97ece80..d12cc80 100644 Binary files a/meca/Vis/Vis tete bombee hexa M3x12.CATPart and b/meca/Vis/Vis tete bombee hexa M3x12.CATPart differ diff --git a/meca/Vis/Vis tete bombee hexa M4x10.CATPart b/meca/Vis/Vis tete bombee hexa M4x10.CATPart index b5f08c3..7557fed 100644 Binary files a/meca/Vis/Vis tete bombee hexa M4x10.CATPart and b/meca/Vis/Vis tete bombee hexa M4x10.CATPart differ diff --git a/meca/Vis/Vis tete bombee hexa M4x12.CATPart b/meca/Vis/Vis tete bombee hexa M4x12.CATPart index 6ccc3ee..58b70ec 100644 Binary files a/meca/Vis/Vis tete bombee hexa M4x12.CATPart and b/meca/Vis/Vis tete bombee hexa M4x12.CATPart differ diff --git a/meca/Vis/Vis tete bombee hexa M4x16.CATPart b/meca/Vis/Vis tete bombee hexa M4x16.CATPart index 1b98027..2bb1b58 100644 Binary files a/meca/Vis/Vis tete bombee hexa M4x16.CATPart and b/meca/Vis/Vis tete bombee hexa M4x16.CATPart differ diff --git a/meca/Vis/Vis tete bombee pozi M2x12.CATPart b/meca/Vis/Vis tete bombee pozi M2x12.CATPart index a97a417..0fde4a8 100644 Binary files a/meca/Vis/Vis tete bombee pozi M2x12.CATPart and b/meca/Vis/Vis tete bombee pozi M2x12.CATPart differ diff --git a/meca/Vis/Vis tete bombee pozi M4x40.CATPart b/meca/Vis/Vis tete bombee pozi M4x40.CATPart index 3731fba..a032083 100644 Binary files a/meca/Vis/Vis tete bombee pozi M4x40.CATPart and b/meca/Vis/Vis tete bombee pozi M4x40.CATPart differ diff --git a/meca/Vis/Vis tete plate fendue M4x50.CATPart b/meca/Vis/Vis tete plate fendue M4x50.CATPart index 0fa2ca1..4ef5523 100644 Binary files a/meca/Vis/Vis tete plate fendue M4x50.CATPart and b/meca/Vis/Vis tete plate fendue M4x50.CATPart differ hooks/post-receive -- krobot |
From: Olivier B. <Ba...@us...> - 2010-02-13 12:06:45
|
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 a67201449e8b7179a94d1d0cd40c4cf8193d3964 (commit) from 955696bb98909ba57753799f47b7a0c36b7c9fe9 (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 a67201449e8b7179a94d1d0cd40c4cf8193d3964 Author: Olivier BICHLER <oli...@gm...> Date: Sat Feb 13 13:06:02 2010 +0100 Correction entretoise devant la prise réseau de la carte mère (changement d'orientation de la carte) ----------------------------------------------------------------------- Changes: diff --git a/meca/Base assemblee.CATProduct b/meca/Base assemblee.CATProduct index c9784c7..032cf6d 100644 Binary files a/meca/Base assemblee.CATProduct and b/meca/Base assemblee.CATProduct differ diff --git a/meca/Bras.CATProduct b/meca/Bras.CATProduct index 087649b..e7f2318 100644 Binary files a/meca/Bras.CATProduct and b/meca/Bras.CATProduct differ diff --git a/meca/Niveau 1.CATPart b/meca/Niveau 1.CATPart index bdaafe4..f7240bf 100644 Binary files a/meca/Niveau 1.CATPart and b/meca/Niveau 1.CATPart differ diff --git a/meca/Niveau 2.CATPart b/meca/Niveau 2.CATPart index 6712e46..221ce99 100644 Binary files a/meca/Niveau 2.CATPart and b/meca/Niveau 2.CATPart differ diff --git a/meca/Niveau 3.CATPart b/meca/Niveau 3.CATPart index e478fe3..04a6fb7 100644 Binary files a/meca/Niveau 3.CATPart and b/meca/Niveau 3.CATPart differ hooks/post-receive -- krobot |
From: Olivier B. <Ba...@us...> - 2010-02-13 11:09:02
|
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 955696bb98909ba57753799f47b7a0c36b7c9fe9 (commit) from d166ea533d35f2ece4da13c07b5039763bf01d15 (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 955696bb98909ba57753799f47b7a0c36b7c9fe9 Author: Olivier BICHLER <oli...@gm...> Date: Sat Feb 13 12:08:01 2010 +0100 Abaissement des pinces et corrections d'interférences ----------------------------------------------------------------------- Changes: diff --git a/meca/Antiblocant balles .CATPart b/meca/Antiblocant balles .CATPart index 4126f1b..45bc045 100644 Binary files a/meca/Antiblocant balles .CATPart and b/meca/Antiblocant balles .CATPart differ diff --git a/meca/Base assemblee.CATProduct b/meca/Base assemblee.CATProduct index 9105fb1..c9784c7 100644 Binary files a/meca/Base assemblee.CATProduct and b/meca/Base assemblee.CATProduct differ diff --git a/meca/Base.CATPart b/meca/Base.CATPart index a63941d..e0a0595 100644 Binary files a/meca/Base.CATPart and b/meca/Base.CATPart differ diff --git a/meca/Bras tige 1.CATPart b/meca/Bras tige 1.CATPart index b831ae2..6851368 100644 Binary files a/meca/Bras tige 1.CATPart and b/meca/Bras tige 1.CATPart differ diff --git a/meca/Bras.CATProduct b/meca/Bras.CATProduct index ea644b0..087649b 100644 Binary files a/meca/Bras.CATProduct and b/meca/Bras.CATProduct differ diff --git a/meca/Niveau 1.CATPart b/meca/Niveau 1.CATPart index 4fe1035..bdaafe4 100644 Binary files a/meca/Niveau 1.CATPart and b/meca/Niveau 1.CATPart differ diff --git a/meca/Niveau 2.CATPart b/meca/Niveau 2.CATPart index b0bd5cb..6712e46 100644 Binary files a/meca/Niveau 2.CATPart and b/meca/Niveau 2.CATPart differ diff --git a/meca/Niveau 3.CATPart b/meca/Niveau 3.CATPart index 4f022d1..e478fe3 100644 Binary files a/meca/Niveau 3.CATPart and b/meca/Niveau 3.CATPart differ diff --git a/meca/Support BH0102-40-606.CATPart b/meca/Support BH0102-40-606.CATPart index 950355e..04081b3 100644 Binary files a/meca/Support BH0102-40-606.CATPart and b/meca/Support BH0102-40-606.CATPart differ diff --git a/meca/Vis/Vis tete bombee hexa M4x12.CATPart b/meca/Vis/Vis tete bombee hexa M4x12.CATPart new file mode 100644 index 0000000..6ccc3ee Binary files /dev/null and b/meca/Vis/Vis tete bombee hexa M4x12.CATPart differ diff --git a/meca/Vis/Vis tete plate fendue M4x50.CATPart b/meca/Vis/Vis tete plate fendue M4x50.CATPart new file mode 100644 index 0000000..0fa2ca1 Binary files /dev/null and b/meca/Vis/Vis tete plate fendue M4x50.CATPart differ hooks/post-receive -- krobot |
From: Olivier B. <Ba...@us...> - 2010-02-12 20:06:45
|
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 d166ea533d35f2ece4da13c07b5039763bf01d15 (commit) from c169a1930485bfbe76bd9b079931e3ff3d875e92 (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 d166ea533d35f2ece4da13c07b5039763bf01d15 Author: Olivier BICHLER <oli...@gm...> Date: Fri Feb 12 21:06:06 2010 +0100 Correction de quelques erreurs ----------------------------------------------------------------------- Changes: diff --git a/meca/Base assemblee.CATProduct b/meca/Base assemblee.CATProduct index 1b1802f..9105fb1 100644 Binary files a/meca/Base assemblee.CATProduct and b/meca/Base assemblee.CATProduct differ diff --git a/meca/Bras tige 1.CATPart b/meca/Bras tige 1.CATPart index 6477aeb..b831ae2 100644 Binary files a/meca/Bras tige 1.CATPart and b/meca/Bras tige 1.CATPart differ diff --git a/meca/Bras.CATProduct b/meca/Bras.CATProduct index 6360c5c..ea644b0 100644 Binary files a/meca/Bras.CATProduct and b/meca/Bras.CATProduct differ diff --git a/meca/Niveau 3 bac.CATPart b/meca/Niveau 3 bac.CATPart index 331d712..eed2585 100644 Binary files a/meca/Niveau 3 bac.CATPart and b/meca/Niveau 3 bac.CATPart differ diff --git a/meca/Niveau 3.CATPart b/meca/Niveau 3.CATPart index 66ff1f2..4f022d1 100644 Binary files a/meca/Niveau 3.CATPart and b/meca/Niveau 3.CATPart differ hooks/post-receive -- krobot |
From: Olivier B. <Ba...@us...> - 2010-02-12 19:49:30
|
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 c169a1930485bfbe76bd9b079931e3ff3d875e92 (commit) from 9458f92e737affb51e39ca33520b196e7e54268b (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 c169a1930485bfbe76bd9b079931e3ff3d875e92 Author: Olivier BICHLER <oli...@gm...> Date: Fri Feb 12 20:48:38 2010 +0100 Ajout niveau 3 (potentiellement le dessus du robot) ----------------------------------------------------------------------- Changes: diff --git a/meca/Bac cote 1.CATPart b/meca/Bac cote 1.CATPart index 9bba13f..411c093 100644 Binary files a/meca/Bac cote 1.CATPart and b/meca/Bac cote 1.CATPart differ diff --git a/meca/Bac cote 2.CATPart b/meca/Bac cote 2.CATPart index 28cc2e7..8b1b5c3 100644 Binary files a/meca/Bac cote 2.CATPart and b/meca/Bac cote 2.CATPart differ diff --git a/meca/Base assemblee.CATProduct b/meca/Base assemblee.CATProduct index b330742..1b1802f 100644 Binary files a/meca/Base assemblee.CATProduct and b/meca/Base assemblee.CATProduct differ diff --git a/meca/Bras tige 1.CATPart b/meca/Bras tige 1.CATPart index 922fa64..6477aeb 100644 Binary files a/meca/Bras tige 1.CATPart and b/meca/Bras tige 1.CATPart differ diff --git a/meca/Bras.CATProduct b/meca/Bras.CATProduct index 16d5f07..6360c5c 100644 Binary files a/meca/Bras.CATProduct and b/meca/Bras.CATProduct differ diff --git a/meca/Cartes/AX12 Interface.CATPart b/meca/Cartes/AX12 Interface.CATPart index 2a9da00..4b7d4e9 100644 Binary files a/meca/Cartes/AX12 Interface.CATPart and b/meca/Cartes/AX12 Interface.CATPart differ diff --git a/meca/Cartes/CarteAsservissement.CATPart b/meca/Cartes/CarteAsservissement.CATPart index 96f8f0b..e3025dc 100644 Binary files a/meca/Cartes/CarteAsservissement.CATPart and b/meca/Cartes/CarteAsservissement.CATPart differ diff --git a/meca/Cartes/Monitoring batteries.CATPart b/meca/Cartes/Monitoring batteries.CATPart index 5875258..f1385f2 100644 Binary files a/meca/Cartes/Monitoring batteries.CATPart and b/meca/Cartes/Monitoring batteries.CATPart differ diff --git a/meca/Cartes/PontH.CATPart b/meca/Cartes/PontH.CATPart index 1ee0f07..e968419 100644 Binary files a/meca/Cartes/PontH.CATPart and b/meca/Cartes/PontH.CATPart differ diff --git a/meca/Cartes/Proximity Sensor.CATPart b/meca/Cartes/Proximity Sensor.CATPart new file mode 100644 index 0000000..19a2dd4 Binary files /dev/null and b/meca/Cartes/Proximity Sensor.CATPart differ diff --git a/meca/Cartes/Robot Interface.CATPart b/meca/Cartes/Robot Interface.CATPart index 67bc81d..f6950a8 100644 Binary files a/meca/Cartes/Robot Interface.CATPart and b/meca/Cartes/Robot Interface.CATPart differ diff --git a/meca/Niveau 1.CATPart b/meca/Niveau 1.CATPart index 78bcd26..4fe1035 100644 Binary files a/meca/Niveau 1.CATPart and b/meca/Niveau 1.CATPart differ diff --git a/meca/Niveau 2.CATPart b/meca/Niveau 2.CATPart index 81fc0a8..b0bd5cb 100644 Binary files a/meca/Niveau 2.CATPart and b/meca/Niveau 2.CATPart differ diff --git a/meca/Niveau 3 bac.CATPart b/meca/Niveau 3 bac.CATPart new file mode 100644 index 0000000..331d712 Binary files /dev/null and b/meca/Niveau 3 bac.CATPart differ diff --git a/meca/Niveau 3.CATPart b/meca/Niveau 3.CATPart new file mode 100644 index 0000000..66ff1f2 Binary files /dev/null and b/meca/Niveau 3.CATPart differ hooks/post-receive -- krobot |
From: Jérémie D. <Ba...@us...> - 2010-02-11 22:58:39
|
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 9458f92e737affb51e39ca33520b196e7e54268b (commit) from cf6fd012353bccafa22317d7ee087475af2b1f82 (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 9458f92e737affb51e39ca33520b196e7e54268b Author: Jérémie Dimino <je...@di...> Date: Thu Feb 11 23:58:15 2010 +0100 [controller] print an error on unknown commands ----------------------------------------------------------------------- Changes: diff --git a/PC_Mainboard/clients/script.ml b/PC_Mainboard/clients/script.ml index 99810ee..5c91e14 100644 --- a/PC_Mainboard/clients/script.ml +++ b/PC_Mainboard/clients/script.ml @@ -141,6 +141,7 @@ let exec krobot line = | "sensor" -> `Sensor | _ -> failwith "Script.exec: invalid card") | _ -> + Log#error "unknown command %S" action; return () with exn -> Log#exn exn "command failed with"; hooks/post-receive -- krobot |
From: Jérémie D. <Ba...@us...> - 2010-02-11 22:01:45
|
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 cf6fd012353bccafa22317d7ee087475af2b1f82 (commit) from f96b27abd1f34c12f5dd40ab2c2c532e812f0936 (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 cf6fd012353bccafa22317d7ee087475af2b1f82 Author: Jérémie Dimino <je...@di...> Date: Thu Feb 11 23:00:52 2010 +0100 [controller] change the default stop mode ----------------------------------------------------------------------- Changes: diff --git a/PC_Mainboard/clients/script.ml b/PC_Mainboard/clients/script.ml index ef69fe9..99810ee 100644 --- a/PC_Mainboard/clients/script.ml +++ b/PC_Mainboard/clients/script.ml @@ -123,7 +123,7 @@ let exec krobot line = | "stop-motors" -> Krobot.stop_motors krobot ~motor:(motor_of_string (arg_string "motor" "both")) - ~mode:(match arg_string "mode" "off" with + ~mode:(match arg_string "mode" "smooth" with | "off" -> `Off | "abrupt" -> `Abrupt | "smooth" -> `Smooth diff --git a/PC_Mainboard/myocamlbuild.ml b/PC_Mainboard/myocamlbuild.ml index d70ead8..b23d4cf 100644 --- a/PC_Mainboard/myocamlbuild.ml +++ b/PC_Mainboard/myocamlbuild.ml @@ -78,6 +78,7 @@ let targets = List.filter_opt (function (true, target) -> Some target | (false, (* Tests *) (have_lwt_unix && have_obus, "tests/double_move.best"); + (have_lwt_unix && have_obus, "tests/stop_and_restart.best"); ] (* +-----------------------------------------------------------------+ diff --git a/PC_Mainboard/tests/stop_and_restart.ml b/PC_Mainboard/tests/stop_and_restart.ml new file mode 100644 index 0000000..8632258 --- /dev/null +++ b/PC_Mainboard/tests/stop_and_restart.ml @@ -0,0 +1,23 @@ +(* + * stop_and_restart.ml + * ------------------- + * Copyright : (c) 2010, Jeremie Dimino <je...@di...> + * Licence : BSD3 + * + * This file is a part of [kro]bot. + *) + +open Lwt + +lwt () = + lwt krobot = Krobot.create () in + print_endline "moving forward"; + let t = Krobot.move krobot ~dist:1000 ~speed:100 ~acc:200 in + lwt () = Lwt_unix.sleep 2.0 in + print_endline "stopping motors"; + lwt () = Krobot.stop_motors krobot `Both `Smooth in + print_endline "waiting for trajectory to terminates"; + lwt _ = t in + print_endline "mobing backward"; + lwt _ = Krobot.move krobot ~dist:(-200) ~speed:100 ~acc:200 in + return () hooks/post-receive -- krobot |
From: Jérémie D. <Ba...@us...> - 2010-02-11 20:39:47
|
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 f96b27abd1f34c12f5dd40ab2c2c532e812f0936 (commit) via 5fb431106f3ad37b156b341be84a8bc2e7721f23 (commit) via d4d5b0aaafe5449491e064bbcf44648f93156ef7 (commit) from cb2666ad63d7de5c68a47ea0803cb113b8a264a3 (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 f96b27abd1f34c12f5dd40ab2c2c532e812f0936 Author: Jérémie Dimino <je...@di...> Date: Thu Feb 11 21:39:20 2010 +0100 [driver] typos commit 5fb431106f3ad37b156b341be84a8bc2e7721f23 Author: Jérémie Dimino <je...@di...> Date: Thu Feb 11 21:36:36 2010 +0100 [clients] added some tests commit d4d5b0aaafe5449491e064bbcf44648f93156ef7 Author: Jérémie Dimino <je...@di...> Date: Thu Feb 11 21:36:04 2010 +0100 [driver] adapt trajectory conrol to the new firmware ----------------------------------------------------------------------- Changes: diff --git a/PC_Mainboard/Makefile b/PC_Mainboard/Makefile index 56af001..121732e 100644 --- a/PC_Mainboard/Makefile +++ b/PC_Mainboard/Makefile @@ -21,3 +21,7 @@ all: .PHONY: clean clean: $(OC) -clean + +.PHONY: send +send: + scp $(wildcard _build/**/*.best) ol...@mr...:bin diff --git a/PC_Mainboard/_tags b/PC_Mainboard/_tags index 103ccce..818fd97 100644 --- a/PC_Mainboard/_tags +++ b/PC_Mainboard/_tags @@ -55,3 +55,10 @@ <tools/forward_dbus.ml>: syntax_camlp4o, pkg_lwt.syntax, pkg_lwt.syntax.log, pkg_obus.syntax <tools/forward_dbus.*>: pkg_obus + +# +------------------------------------------------------------------+ +# | Tests | +# +------------------------------------------------------------------+ + +<tests/**/*.ml>: syntax_camlp4o, pkg_lwt.syntax, pkg_lwt.syntax.log, pkg_obus.syntax +<tests/**>: pkg_lwt.unix, pkg_obus diff --git a/PC_Mainboard/clients/script.ml b/PC_Mainboard/clients/script.ml index 3ea209e..ef69fe9 100644 --- a/PC_Mainboard/clients/script.ml +++ b/PC_Mainboard/clients/script.ml @@ -107,38 +107,41 @@ let move thread = return () let exec krobot line = - let action, args = Script_lexer.whole_command (Lexing.from_string line) in - let arg_int key default = try int_of_string (List.assoc key args) with Not_found -> default in - let arg_string key default = try List.assoc key args with Not_found -> default in - match action with - | "forward" -> - move (Krobot.move krobot ~dist:(arg_int "dist" 100) ~speed:(arg_int "speed" 400) ?acc:(arg_int "acc" 800)) - | "backward" -> - move (Krobot.move krobot ~dist:(-(arg_int "dist" 100)) ~speed:(arg_int "speed" 400) ?acc:(arg_int "acc" 800)) - | "left" -> - move (Krobot.turn krobot ~angle:(arg_int "dist" 100) ~speed:(arg_int "speed" 400) ?acc:(arg_int "acc" 800)) - | "right" -> - move (Krobot.turn krobot ~angle:(-(arg_int "dist" 100)) ~speed:(arg_int "speed" 400) ?acc:(arg_int "acc" 800)) - | "stop-motors" -> - Krobot.stop_motors krobot - ~motor:(motor_of_string (arg_string "motor" "both")) - ~mode:(match arg_string "mode" "off" with - | "off" -> `Off - | "abrupt" -> `Abrupt - | "smooth" -> `Smooth - | _ -> failwith "Script.exec: invalid stop mode") - | "set-speed" -> - Krobot.set_speed krobot - ~motor:(motor_of_string (arg_string "motor" "both")) - ~speed:(arg_int "speed" 100) - ~acc:(arg_int "acc" 800) - | "bootloader" -> - Krobot.Card.bootloader krobot - (match arg_string "card" "" with - | "interface" -> `Interface - | "motor" -> `Motor - | "sensor" -> `Sensor - | _ -> failwith "Script.exec: invalid card") - | _ -> - return () - + try_lwt + let action, args = Script_lexer.whole_command (Lexing.from_string line) in + let arg_int key default = try int_of_string (List.assoc key args) with Not_found -> default in + let arg_string key default = try List.assoc key args with Not_found -> default in + match action with + | "forward" -> + move (Krobot.move krobot ~dist:(arg_int "dist" 100) ~speed:(arg_int "speed" 400) ?acc:(arg_int "acc" 800)) + | "backward" -> + move (Krobot.move krobot ~dist:(-(arg_int "dist" 100)) ~speed:(arg_int "speed" 400) ?acc:(arg_int "acc" 800)) + | "left" -> + move (Krobot.turn krobot ~angle:(arg_int "dist" 100) ~speed:(arg_int "speed" 400) ?acc:(arg_int "acc" 800)) + | "right" -> + move (Krobot.turn krobot ~angle:(-(arg_int "dist" 100)) ~speed:(arg_int "speed" 400) ?acc:(arg_int "acc" 800)) + | "stop-motors" -> + Krobot.stop_motors krobot + ~motor:(motor_of_string (arg_string "motor" "both")) + ~mode:(match arg_string "mode" "off" with + | "off" -> `Off + | "abrupt" -> `Abrupt + | "smooth" -> `Smooth + | _ -> failwith "Script.exec: invalid stop mode") + | "set-speed" -> + Krobot.set_speed krobot + ~motor:(motor_of_string (arg_string "motor" "both")) + ~speed:(arg_int "speed" 100) + ~acc:(arg_int "acc" 800) + | "bootloader" -> + Krobot.Card.bootloader krobot + (match arg_string "card" "" with + | "interface" -> `Interface + | "motor" -> `Motor + | "sensor" -> `Sensor + | _ -> failwith "Script.exec: invalid card") + | _ -> + return () + with exn -> + Log#exn exn "command failed with"; + fail exn diff --git a/PC_Mainboard/driver/driver.ml b/PC_Mainboard/driver/driver.ml index c9ee93c..801319b 100644 --- a/PC_Mainboard/driver/driver.ml +++ b/PC_Mainboard/driver/driver.ml @@ -241,7 +241,9 @@ struct type move_state = | Ms_static (* No movement *) - | Ms_moving of unit Lwt.u * [ `Forward | `Backward | `Turn ] + | Ms_stopping + (* The trajectory has been stopped *) + | Ms_moving of [ `Forward | `Backward | `Turn ] (* Currently moving. The argument is a wakener to stop the mover. *) @@ -287,11 +289,10 @@ struct let stop_move dev = match dev.move_state with - | Ms_static -> + | Ms_moving _ -> + dev.move_state <- Ms_stopping + | _ -> () - | Ms_moving(wakener, _) -> - dev.move_state <- Ms_static; - wakeup wakener () let reset_speed dev = dev.speed_left <- 0; @@ -300,7 +301,7 @@ struct let move dev dist speed acc = Log#info "motor: move(dist=%d, speed=%d, acc=%d)" dist speed acc; match dev.move_state with - | Ms_moving _ -> + | Ms_moving _ | Ms_stopping -> fail (Failure "already moving") | Ms_static -> let date = Unix.gettimeofday () in @@ -308,10 +309,14 @@ struct fail (Failure "inhibited move") else begin reset_speed dev; - let waiter, wakener = wait () in - dev.move_state <- Ms_moving(wakener, if dist > 0 then `Forward else `Backward); - lwt () = Commands.Motor.move dev.card dist speed acc in - lwt result = select [Lwt_event.next dev.traj_completed >> return `OK; waiter >> return `Stopped] in + dev.move_state <- Ms_moving(if dist > 0 then `Forward else `Backward); + lwt () = Commands.Motor.move dev.card dist speed acc and _ = Lwt_event.next dev.traj_completed in + let result = match dev.move_state with + | Ms_stopping -> + `Stopped + | _ -> + `OK + in dev.move_state <- Ms_static; return result end @@ -319,14 +324,18 @@ struct let turn dev angle speed acc = Log#info "motor: turn(angle=%d, speed=%d, acc=%d)" angle speed acc; match dev.move_state with - | Ms_moving _ -> + | Ms_moving _ | Ms_stopping -> fail (Failure "already moving") | Ms_static -> reset_speed dev; - let waiter, wakener = wait () in - dev.move_state <- Ms_moving(wakener, `Turn); - lwt () = Commands.Motor.turn dev.card angle speed acc in - lwt result = select [Lwt_event.next dev.traj_completed >> return `OK; waiter >> return `Stopped] in + dev.move_state <- Ms_moving `Turn; + lwt () = Commands.Motor.turn dev.card angle speed acc and _ = Lwt_event.next dev.traj_completed in + let result = match dev.move_state with + | Ms_stopping -> + `Stopped + | _ -> + `OK + in dev.move_state <- Ms_static; return result @@ -396,10 +405,10 @@ struct dev.inhibit_forward_until <- until; ignore (inhibited_forward_changed dev until); match dev.move_state with - | Ms_moving(_, `Forward) -> - stop_motors dev `Both `Smooth + | Ms_moving `Forward -> + stop_motors dev `Both `Abrupt | Ms_static when dev.speed_left > 0 || dev.speed_right > 0 -> - stop_motors dev `Both `Smooth + stop_motors dev `Both `Abrupt | _ -> return () @@ -409,10 +418,10 @@ struct dev.inhibit_backward_until <- until; ignore (inhibited_backward_changed dev until); match dev.move_state with - | Ms_moving(_, `Backward) -> - stop_motors dev `Both `Smooth + | Ms_moving `Backward -> + stop_motors dev `Both `Abrupt | Ms_static when dev.speed_left < 0 || dev.speed_right < 0 -> - stop_motors dev `Both `Smooth + stop_motors dev `Both `Abrupt | _ -> return () diff --git a/PC_Mainboard/myocamlbuild.ml b/PC_Mainboard/myocamlbuild.ml index fc811df..d70ead8 100644 --- a/PC_Mainboard/myocamlbuild.ml +++ b/PC_Mainboard/myocamlbuild.ml @@ -75,6 +75,9 @@ let targets = List.filter_opt (function (true, target) -> Some target | (false, (* Services *) (have_lwt_unix && have_obus, "services/hard_stop.best"); + + (* Tests *) + (have_lwt_unix && have_obus, "tests/double_move.best"); ] (* +-----------------------------------------------------------------+ hooks/post-receive -- krobot |
From: Olivier B. <Ba...@us...> - 2010-02-11 20:13:33
|
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 cb2666ad63d7de5c68a47ea0803cb113b8a264a3 (commit) via a5dfd6b915f395eda2c9a0bcadbf0b6af1dda518 (commit) via dd1f9ac2f18a43870b5f918c2dcb884bc1de9ef8 (commit) from 0c5b4c2d11b04376479351b4e11a65efb7ebb557 (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 cb2666ad63d7de5c68a47ea0803cb113b8a264a3 Merge: a5dfd6b915f395eda2c9a0bcadbf0b6af1dda518 0c5b4c2d11b04376479351b4e11a65efb7ebb557 Author: Olivier BICHLER <oli...@gm...> Date: Thu Feb 11 21:12:58 2010 +0100 Merge branch 'master' of ssh://krobot.git.sourceforge.net/gitroot/krobot/krobot commit a5dfd6b915f395eda2c9a0bcadbf0b6af1dda518 Author: Olivier BICHLER <oli...@gm...> Date: Thu Feb 11 21:12:21 2010 +0100 Il faut toujours attendre TRAJ_COMPLETED en cas de stop commit dd1f9ac2f18a43870b5f918c2dcb884bc1de9ef8 Author: Olivier BICHLER <oli...@gm...> Date: Thu Feb 11 21:11:44 2010 +0100 Ajout vis de fixation bras ----------------------------------------------------------------------- Changes: diff --git a/USB_Module/Motor_Controller/Firmware/Motor_Controller.mcw b/USB_Module/Motor_Controller/Firmware/Motor_Controller.mcw index e9cc119..5c9abc6 100644 Binary files a/USB_Module/Motor_Controller/Firmware/Motor_Controller.mcw and b/USB_Module/Motor_Controller/Firmware/Motor_Controller.mcw differ diff --git a/USB_Module/Motor_Controller/Firmware/main.c b/USB_Module/Motor_Controller/Firmware/main.c index f668df4..1ce9713 100644 --- a/USB_Module/Motor_Controller/Firmware/main.c +++ b/USB_Module/Motor_Controller/Firmware/main.c @@ -1009,7 +1009,7 @@ void ProcessIO(void) { word1.byte.LB = ReceivedDataBuffer.DATA[3]; stop(ReceivedDataBuffer.DATA[1], word1.Val); - traj_engaged = 0; + //traj_engaged = 0; break; case TRAJ_NEW_POSITION: diff --git a/USB_Module/Motor_Controller/Firmware/output/Motor_controller.cof b/USB_Module/Motor_Controller/Firmware/output/Motor_controller.cof index 603e1c6..f106d0e 100644 Binary files a/USB_Module/Motor_Controller/Firmware/output/Motor_controller.cof and b/USB_Module/Motor_Controller/Firmware/output/Motor_controller.cof differ diff --git a/USB_Module/Motor_Controller/Firmware/output/Motor_controller.hex b/USB_Module/Motor_Controller/Firmware/output/Motor_controller.hex index 32b1f0b..d6ded68 100644 --- a/USB_Module/Motor_Controller/Firmware/output/Motor_controller.hex +++ b/USB_Module/Motor_Controller/Firmware/output/Motor_controller.hex @@ -1,136 +1,136 @@ :020000040000FA -:060000002CEF33F01200AA +:060000002AEF33F01200AC :0600080004EF04F01200F9 :060018000CEF04F01200E1 -:060800002CEF33F01200A2 +:060800002AEF33F01200A4 :060808002EEF04F01200C7 :0608180096EF04F012004F -:06082A000400EB66000073 -:100830002601000021000000E36600005F010000C7 -:1008400008000000D5660000470100000E0000000F -:0C085000D26600006A01000003000000F6 +:06082A000400E766000077 +:100830002601000021000000DF6600005F010000CB +:1008400008000000D1660000470100000E00000013 +:0C085000CE6600006A01000003000000FA :04085C00DACFE4FF0C :10086000E2CFDAFFE9CFE4FFEACFE4FFF6CFE4FF1F :10087000F7CFE4FFF5CFE4FFF3CFE4FFF4CFE4FFDD :10088000FACFE4FF00EE45F0140EE80403E3EECFE8 :10089000E4FFFBD700EE00F0450EE80403E3EECFE3 -:1008A000E4FFFBD760EC13F09EA013D06AEC13F0CA +:1008A000E4FFFBD75EEC13F09EA013D068EC13F0CE :1008B00001014D2B000E4E23E80E4D5D030E4E59E7 -:1008C00005E34D6B4E6B4F2B000E5023D6EC2BF0F7 -:1008D0009E9073EC13F002E2E16AE552E16EE5529C +:1008C00005E34D6B4E6B4F2B000E5023D4EC2BF0F9 +:1008D0009E9071EC13F002E2E16AE552E16EE5529E :1008E000E7CFD9FFE55200EE44F0450EE80403E3FC :1008F000E5CFEDFFFBD700EE58F0140EE80403E35C :10090000E5CFEDFFFBD7E5CFFAFFE5CFF4FFE5CF6D :10091000F3FFE5CFF5FFE5CFF7FFE5CFF6FFE5CF36 :10092000EAFFE5CFE9FFE5CFDAFF1100D8CFE4FF1A :10093000E0CFE4FFE46EDACFE4FFE2CFDAFFF3CFFB -:10094000E4FFF4CFE4FF60EC13F073EC13F002E289 +:10094000E4FFF4CFE4FF5EEC13F071EC13F002E28D :10095000E16AE552E16EE552E7CFD9FFE552E5CF16 :10096000F4FFE5CFF3FFE5CFDAFFE550E5CFE0FF99 -:10097000E5CFD8FF100004D8B9EC1EF060D8FCD742 -:100980000F0EC11202D883EF1EF083EC13F0E65273 -:1009900037EC13F00101676F070E675D10E1E66A3F -:1009A00046EC32F0E552DF6E000EDF807BEC13F098 -:1009B000E66AFFEC32F0E552DF707BEC13F0D08E8C +:10097000E5CFD8FF100004D8B7EC1EF060D8FCD744 +:100980000F0EC11202D881EF1EF081EC13F0E65277 +:1009900035EC13F00101676F070E675D10E1E66A41 +:1009A00044EC32F0E552DF6E000EDF8079EC13F09C +:1009B000E66AFDEC32F0E552DF7079EC13F0D08E90 :1009C000F28EF28CF30E8C1695160101476B486B74 :1009D000496B4A6B010E4B6FF90E921680160E0E84 -:1009E000E66E7C0EE66EE10EE66EB9EC31F0E55295 +:1009E000E66E7C0EE66EE10EE66EB7EC31F0E55297 :1009F000E552E552CF0E9216939894943F0E9516B9 -:100A0000010EE66E88EC13F0E552838C81888284B7 -:100A1000808A838E80888294010EE66E3AEC33F0F1 -:100A2000E55282849D80C50EE66E8FEC32F0E55271 -:100A30006AEC13F0E552E552E7CFD9FF1200D9CFA7 +:100A0000010EE66E86EC13F0E552838C81888284B9 +:100A1000808A838E80888294010EE66E38EC33F0F3 +:100A2000E55282849D80C50EE66E8DEC32F0E55273 +:100A300068EC13F0E552E552E7CFD9FF1200D9CFA9 :100A4000E6FFE1CFD9FF0F0EE12601014B5102E095 -:100A50007CEC12F0200E0101005D03E36D50020BEF -:100A600002E072EF12F0010149514A1102E1000E59 +:100A50007AEC12F0200E0101005D03E36D50020BF1 +:100A600002E070EF12F0010149514A1102E1000E5B :100A700008D049C1E9FF4AC1EAFFEF50800B01E00D :100A8000010E000947E101014651EA6A260FE96EAD :100A9000010EEA22EF5000083DE20501406B010122 :100AA0004C514C2B0501416F0501040E426F0101B1 :100AB0004651EA6A260FE96E010EEA22EFCF43F5AE :100AC000400EE66E400EE66E050EE66E010EE66E18 -:100AD000010EE66ED4EC22F0006E050EE15E0050D1 +:100AD000010EE66ED2EC22F0006E050EE15E0050D3 :100AE000F3CF49F1F4CF4AF101014651EA6A260FEA :100AF000E96E010EEA22EF6A01014651000803E2A5 :100B00000101460707D001014551000803E2010138 :100B10001F0E466F010149514A1102E1000E08D033 :100B200049C1E9FF4AC1EAFFEF50800B01E0010E25 -:100B300000092CE10101520529E10DEC1BF000092F +:100B300000092CE10101520529E10BEC1BF0000931 :100B400025E00501406B01014C514C2B0501416F23 :100B500005010A0E426F0501436B0501010E486F46 :100B6000400EE66E400EE66E050EE66E010EE66E77 -:100B7000010EE66ED4EC22F0006E050EE15E005030 +:100B7000010EE66ED2EC22F0006E050EE15E005032 :100B8000F3CF49F1F4CF4AF10101526B000E01019C :100B9000E76E5119E8AE02D0513503D0E750D88046 :100BA000515501E38ED001015151FF0A29E0FD0AA0 -:100BB00013E0030A01E06ED0020EE66E22EC2DF087 -:100BC000E552AFEC16F0000904E00101020E516F8E +:100BB00013E0030A01E06ED0020EE66E20EC2DF089 +:100BC000E552ADEC16F0000904E00101020E516F90 :100BD00002D00101516960D0200EE66E030EE66E70 -:100BE000C80EE66EE66AE80EE66E030EE66E0FECE1 +:100BE000C80EE66EE66AE80EE66E030EE66E0DECE3 :100BF00018F0006E060EE15E00500101516B4CD002 :100C0000010149514A1102E1000E08D049C1E9FF32 :100C10004AC1EAFFEF50800B01E0010E000939E103 :100C20000501406B01014C514C2B0501416F050141 -:100C3000050E426F0501436B0501486B530E006EB4 +:100C3000050E426F0501436B0501486B4F0E006EB8 :100C4000630E016E026A00C0E6FF01C0E6FF02C04B -:100C5000E6FF480EE66E050EE66E0AEC32F0036E15 +:100C5000E6FF480EE66E050EE66E08EC32F0036E17 :100C6000050EE15E0350400EE66E400EE66E050E88 -:100C7000E66E010EE66E010EE66ED4EC22F0006E1A +:100C7000E66E010EE66E010EE66ED2EC22F0006E1C :100C8000050EE15E0050F3CF49F1F4CF4AF10101C6 -:100C9000516B02D00101516B020EE66EE66A4AEC1E +:100C9000516B02D00101516B020EE66EE66A48EC20 :100CA00016F0E552E55200090AE1020EE66E010E69 -:100CB000E66E4AEC16F0E552E552000902E0010149 +:100CB000E66E48EC16F0E552E552000902E001014B :100CC000516901014751481102E1000E08D047C1A6 :100CD000E9FF48C1EAFFEF50800B01E0010E000977 -:100CE00002E072EF12F005010251070A02E1D3EFB0 +:100CE00002E070EF12F005010251070A02E1D1EFB4 :100CF00011F00D0A01E10CD2010A01E1DCD10D0A6B :100D000001E174D1040A1AE0030A07E0010A02E0D3 -:100D100031EF12F0FF0072EF12F0E66A46EC32F0AB -:100D2000E552DF6E000EDB80DFCFE6FFE66A26ECE1 -:100D300032F0E552E552FF0072EF12F00101495125 +:100D10002FEF12F0FF0070EF12F0E66A44EC32F0B1 +:100D2000E552DF6E000EDB80DFCFE6FFE66A24ECE3 +:100D300032F0E552E552FF0070EF12F00101495127 :100D40004A1102E1000E08D049C1E9FF4AC1EAFF99 :100D5000EF50800B01E0010E000901E045D100C514 :100D600040F50501416B0501030E426F0501436B20 :100D700005010851070A01E1BBD0010A01E17ED05B :100D8000020A71E0070A64E0010A20E0030A06E0B3 :100D9000010A01E0FFD067C148F5FFD00501486BAB -:100DA0002F0E006E630E016E026A00C0E6FF01C0E6 -:100DB000E6FF02C0E6FF480EE66E050EE66E0AECA0 +:100DA0002B0E006E630E016E026A00C0E6FF01C0EA +:100DB000E6FF02C0E6FF480EE66E050EE66E08ECA2 :100DC00032F0036E050EE15E0350E7D00501486B7B -:100DD000230E006E630E016E026A00C0E6FF01C0C2 -:100DE000E6FF02C0E6FF480EE66E050EE66E0AEC70 -:100DF00032F0036E050EE15E0350210E006E630EAD +:100DD0001F0E006E630E016E026A00C0E6FF01C0C6 +:100DE000E6FF02C0E6FF480EE66E050EE66E08EC72 +:100DF00032F0036E050EE15E03501D0E006E630EB1 :100E0000016E026A00C0E6FF01C0E6FF02C0E6FF15 -:100E1000480EE66E050EE66E0AEC32F0036E050E25 -:100E2000E15E0350180E006E630E016E026A00C090 +:100E1000480EE66E050EE66E08EC32F0036E050E27 +:100E2000E15E0350140E006E630E016E026A00C094 :100E3000E6FF01C0E6FF02C0E6FF480EE66E050EC3 -:100E4000E66E0AEC32F0036E050EE15E0350A5D0AB +:100E4000E66E08EC32F0036E050EE15E0350A5D0AD :100E500092CF48F593CF49F594CF4AF595CF4BF50E :100E600096CF4CF59AD080CF48F581CF49F582CF07 -:100E70004AF583CF4BF584CF4CF58FD0E66A7CECF6 +:100E70004AF583CF4BF584CF4CF58FD0E66A7AECF8 :100E80002CF0E552010E49C0DBFF020E4AC0DBFF29 :100E9000030E4BC0DBFF040E4CC0DBFF040EDBCFA8 :100EA00048F5030EDBCF49F5020EDBCF4AF5010E04 -:100EB000DBCF4BF5010EE66E7CEC2CF0E552010E1B +:100EB000DBCF4BF5010EE66E7AEC2CF0E552010E1D :100EC00049C0DBFF020E4AC0DBFF030E4BC0DBFF55 :100ED000040E4CC0DBFF040EDBCF4CF5030EDBCF62 :100EE0004DF5020EDBCF4EF5010EDBCF4FF555D0A1 -:100EF0000A0EE66EE66AD8EC13F0E552E552E66AB1 -:100F00003CEC15F0E552030EF3CFDBFF040EF4CFFB -:100F1000DBFFE66A3CEC15F0E552DE52F3CFDEFF74 +:100EF0000A0EE66EE66AD6EC13F0E552E552E66AB3 +:100F00003AEC15F0E552030EF3CFDBFF040EF4CFFD +:100F1000DBFFE66A3AEC15F0E552DE52F3CFDEFF76 :100F2000F4CFDDFFDD52040EDBCF48F5030EDBCF3F :100F300049F5020EDBCF4AF5010EDBCF4BF50A0E69 -:100F4000E66E010EE66ED8EC13F0E552E552010EA6 -:100F5000E66E3CEC15F0E552030EF3CFDBFF040E1A -:100F6000F4CFDBFF010EE66E3CEC15F0E552DE52ED +:100F4000E66E010EE66ED6EC13F0E552E552010EA8 +:100F5000E66E3AEC15F0E552030EF3CFDBFF040E1C +:100F6000F4CFDBFF010EE66E3AEC15F0E552DE52EF :100F7000F3CFDEFFF4CFDDFFDD52040EDBCF4CF507 :100F8000030EDBCF4DF5020EDBCF4EF5010EDBCFAE :100F90004FF503D00501020E436F400EE66E400E82 -:100FA000E66E050EE66E010EE66E010EE66ED4EC00 +:100FA000E66E050EE66E010EE66E010EE66ED2EC02 :100FB00022F0006E050EE15E0050F3CF49F1F4CF50 :100FC0004AF1400EE66E000EE66E050EE66EE66A2B -:100FD000010EE66ED4EC22F0006E050EE15E0050CC -:100FE000F3CF47F1F4CF48F172EF12F00501085149 +:100FD000010EE66ED2EC22F0006E050EE15E0050CE +:100FE000F3CF47F1F4CF48F170EF12F0050108514B :100FF000030A37E0010A25E0030A13E0010A01E0D1 :1010000040D005010951921205010A5193120501C0 :101010000B51941205010C51951205010D519612B8 @@ -140,98 +140,98 @@ :101050000B1D8B1605010C1D8C1605010D1D8D1623 :1010600015D005010951891205010A518A1205019D :101070000B518B1205010C518C1205010D518D1273 -:1010800005D0030EE66ECCEC32F0E552400EE66E73 -:10109000000EE66E050EE66EE66A010EE66ED4EC14 +:1010800005D0030EE66ECAEC32F0E552400EE66E75 +:10109000000EE66E050EE66EE66A010EE66ED2EC16 :1010A00022F0006E050EE15E0050F3CF47F1F4CF61 -:1010B00048F172EF12F005010851020A09E0030A33 -:1010C00001E00CD009C5E6FF22EC2DF0E5520BD073 -:1010D00009C5E6FF32EC2DF0E55205D0010EE66EB3 -:1010E000CCEC32F0E552400EE66E000EE66E050ED8 -:1010F000E66EE66A010EE66ED4EC22F0006E050E96 -:10110000E15E0050F3CF47F1F4CF48F172EF12F0F7 -:1011100005010851060A02E192EF11F0080A02E106 -:1011200058EF11F0030A02E14FEF11F0070A02E154 -:1011300035EF10F0030A02E12BEF0EF0010A01E196 -:10114000DAD20F0A01E1C0D2020A01E174D2010A27 +:1010B00048F170EF12F005010851020A09E0030A35 +:1010C00001E00CD009C5E6FF20EC2DF0E5520BD075 +:1010D00009C5E6FF30EC2DF0E55205D0010EE66EB5 +:1010E000CAEC32F0E552400EE66E000EE66E050EDA +:1010F000E66EE66A010EE66ED2EC22F0006E050E98 +:10110000E15E0050F3CF47F1F4CF48F170EF12F0F9 +:1011100005010851060A02E190EF11F0080A02E108 +:1011200056EF11F0030A02E14DEF11F0070A02E158 +:1011300033EF10F0030A02E129EF0EF0010A01E19A +:10114000D8D20F0A01E1C0D2020A01E174D2010A29 :1011500001E142D2070A01E110D2010A01E1DED128 :10116000030A01E1ACD1010A01E1A5D10C0A01E1B8 -:1011700026D1030A01E194D0040A02E0BAEF11F08B +:1011700026D1030A01E194D0040A02E0B8EF11F08D :101180000501095104E0020E0501095D40E10AC5AF -:10119000E6FF010EE66E26EC32F0E552E5520BC595 -:1011A000E6FF020EE66E26EC32F0E552E5520CC583 -:1011B000E6FF030EE66E26EC32F0E552E5520DC571 -:1011C000E6FF040EE66E26EC32F0E552E5520EC55F -:1011D000E6FF050EE66E26EC32F0E552E5520FC54D -:1011E000E6FF060EE66E26EC32F0E552E55210C53B -:1011F000E6FF070EE66E26EC32F0E552E55211C529 -:10120000E6FF080EE66E26EC32F0E552E5520501E7 +:10119000E6FF010EE66E24EC32F0E552E5520BC597 +:1011A000E6FF020EE66E24EC32F0E552E5520CC585 +:1011B000E6FF030EE66E24EC32F0E552E5520DC573 +:1011C000E6FF040EE66E24EC32F0E552E5520EC561 +:1011D000E6FF050EE66E24EC32F0E552E5520FC54F +:1011E000E6FF060EE66E24EC32F0E552E55210C53D +:1011F000E6FF070EE66E24EC32F0E552E55211C52B +:10120000E6FF080EE66E24EC32F0E552E5520501E9 :10121000090504E0020E0501095D40E10AC5E6FF8B -:10122000090EE66E26EC32F0E552E5520BC5E6FFFC -:101230000A0EE66E26EC32F0E552E5520CC5E6FFEA -:101240000B0EE66E26EC32F0E552E5520DC5E6FFD8 -:101250000C0EE66E26EC32F0E552E5520EC5E6FFC6 -:101260000D0EE66E26EC32F0E552E5520FC5E6FFB4 -:101270000E0EE66E26EC32F0E552E55210C5E6FFA2 -:101280000F0EE66E26EC32F0E552E55211C5E6FF90 -:10129000100EE66E26EC32F0E552E552BFEF11F08B +:10122000090EE66E24EC32F0E552E5520BC5E6FFFE +:101230000A0EE66E24EC32F0E552E5520CC5E6FFEC +:101240000B0EE66E24EC32F0E552E5520DC5E6FFDA +:101250000C0EE66E24EC32F0E552E5520EC5E6FFC8 +:101260000D0EE66E24EC32F0E552E5520FC5E6FFB6 +:101270000E0EE66E24EC32F0E552E55210C5E6FFA4 +:101280000F0EE66E24EC32F0E552E55211C5E6FF92 +:10129000100EE66E24EC32F0E552E552BDEF11F08F :1012A00000C540F50501416B0501030E426F0501C4 -:1012B000436B010EE66E46EC32F0E5520501486FD5 -:1012C000020EE66E46EC32F0E5520501496F030E60 -:1012D000E66E46EC32F0E55205014A6F040EE66E0A -:1012E00046EC32F0E55205014B6F050EE66E46EC1A -:1012F00032F0E55205014C6F060EE66E46EC32F018 -:10130000E55205014D6F070EE66E46EC32F0E552F0 -:1013100005014E6F080EE66E46EC32F0E55205010F -:101320004F6F090EE66E46EC32F0E5520501506F44 -:101330000A0EE66E46EC32F0E5520501516F0B0ED7 -:10134000E66E46EC32F0E5520501526F0C0EE66E89 -:1013500046EC32F0E5520501536F0D0EE66E46EC99 -:1013600032F0E5520501546F0E0EE66E46EC32F097 -:10137000E5520501556F0F0EE66E46EC32F0E55270 -:101380000501566F100EE66E46EC32F0E55205018F +:1012B000436B010EE66E44EC32F0E5520501486FD7 +:1012C000020EE66E44EC32F0E5520501496F030E62 +:1012D000E66E44EC32F0E55205014A6F040EE66E0C +:1012E00044EC32F0E55205014B6F050EE66E44EC1E +:1012F00032F0E55205014C6F060EE66E44EC32F01A +:10130000E55205014D6F070EE66E44EC32F0E552F2 +:1013100005014E6F080EE66E44EC32F0E552050111 +:101320004F6F090EE66E44EC32F0E5520501506F46 +:101330000A0EE66E44EC32F0E5520501516F0B0ED9 +:10134000E66E44EC32F0E5520501526F0C0EE66E8B +:1013500044EC32F0E5520501536F0D0EE66E44EC9D +:1013600032F0E5520501546F0E0EE66E44EC32F099 +:10137000E5520501556F0F0EE66E44EC32F0E55272 +:101380000501566F100EE66E44EC32F0E552050191 :10139000576F400EE66E400EE66E050EE66E010ECD -:1013A000E66E010EE66ED4EC22F0006E050EE15EF4 -:1013B0000050F3CF49F1F4CF4AF1BFEF11F0030E23 -:1013C000E66E010EE66E26EC32F0E552E552E80ECE -:1013D000E66E020EE66E26EC32F0E552E552E66A63 -:1013E000030EE66E26EC32F0E552E552010EE66E93 -:1013F000040EE66E26EC32F0E552E552E66A050E82 -:10140000E66E26EC32F0E552E552E66A060EE66E2E -:1014100026EC32F0E552E552270EE66E070EE66E38 -:1014200026EC32F0E552E552100EE66E080EE66E3E -:1014300026EC32F0E552E552030EE66E090EE66E3A -:1014400026EC32F0E552E552E80EE66E0A0EE66E44 -:1014500026EC32F0E552E552E66A0B0EE66E26EC1B -:1014600032F0E552E552010EE66E0C0EE66E26EC09 -:1014700032F0E552E552E66A0D0EE66E26EC32F0E9 -:10148000E552E552E66A0E0EE66E26EC32F0E552C3 -:10149000E552270EE66E0F0EE66E26EC32F0E552B0 -:1014A000E552100EE66E100EE66E26EC32F0E552B6 -:1014B000E552BFEF11F0AFEC16F0BFEF11F0060EE2 +:1013A000E66E010EE66ED2EC22F0006E050EE15EF6 +:1013B0000050F3CF49F1F4CF4AF1BDEF11F0030E25 +:1013C000E66E010EE66E24EC32F0E552E552E80ED0 +:1013D000E66E020EE66E24EC32F0E552E552E66A65 +:1013E000030EE66E24EC32F0E552E552010EE66E95 +:1013F000040EE66E24EC32F0E552E552E66A050E84 +:10140000E66E24EC32F0E552E552E66A060EE66E30 +:1014100024EC32F0E552E552270EE66E070EE66E3A +:1014200024EC32F0E552E552100EE66E080EE66E40 +:1014300024EC32F0E552E552030EE66E090EE66E3C +:1014400024EC32F0E552E552E80EE66E0A0EE66E46 +:1014500024EC32F0E552E552E66A0B0EE66E24EC1F +:1014600032F0E552E552010EE66E0C0EE66E24EC0B +:1014700032F0E552E552E66A0D0EE66E24EC32F0EB +:10148000E552E552E66A0E0EE66E24EC32F0E552C5 +:10149000E552270EE66E0F0EE66E24EC32F0E552B2 +:1014A000E552100EE66E100EE66E24EC32F0E552B8 +:1014B000E552BDEF11F0ADEC16F0BDEF11F0060EE8 :1014C00009C5DBFF050E0AC5DBFF080E0BC5DBFFF8 :1014D000070E0CC5DBFF0A0E0DC5DBFF090E0EC59E :1014E000DBFF090EDBCFE6FF0A0EDBCFE6FF070EC0 :1014F000DBCFE6FF080EDBCFE6FF050EDBCFE6FF16 -:10150000060EDBCFE6FF0FEC18F0006E060EE15E74 -:1015100000500101010E526FBFEF11F0060E09C518 +:10150000060EDBCFE6FF0DEC18F0006E060EE15E76 +:1015100000500101010E526FBDEF11F0060E09C51A :10152000DBFF050E0AC5DBFF080E0BC5DBFF070E50 :101530000CC5DBFF0A0E0DC5DBFF090E0EC5DBFF78 :10154000090EDBCFE6FF0A0EDBCFE6FF070EDBCF8F :10155000E6FF080EDBCFE6FF050EDBCFE6FF060E4B -:10156000DBCFE6FF1AEC18F0006E060EE15E0050CD -:101570000101010E526FBFEF11F0060E09C5DBFF2E +:10156000DBCFE6FF18EC18F0006E060EE15E0050CF +:101570000101010E526FBDEF11F0060E09C5DBFF30 :10158000050E0AC5DBFF080E0BC5DBFF070E0CC5F9 :10159000DBFF0A0E0DC5DBFF090E0EC5DBFF090ED2 :1015A000DBCFE6FF0A0EDBCFE6FF070EDBCFE6FF61 :1015B000080EDBCFE6FF050EDBCFE6FF060EDBCF26 -:1015C000E6FF25EC18F0006E060EE15E005001010A -:1015D000010E526FBFEF11F0060E09C5DBFF050EBD +:1015C000E6FF23EC18F0006E060EE15E005001010C +:1015D000010E526FBDEF11F0060E09C5DBFF050EBF :1015E0000AC5DBFF080E0BC5DBFF070E0CC5DBFFD2 :1015F0000A0E0DC5DBFF090E0EC5DBFF090EDBCFA2 :10160000E6FF0A0EDBCFE6FF070EDBCFE6FF080E94 :10161000DBCFE6FF050EDBCFE6FF060EDBCFE6FFF6 -:1016200034EC18F0006E060EE15E00500101010E70 -:10163000526FBFEF11F0060E09C5DBFF050E0AC59C +:1016200032EC18F0006E060EE15E00500101010E72 +:10163000526FBDEF11F0060E09C5DBFF050E0AC59E :10164000DBFF080E0BC5DBFF070E0CC5DBFF0A0E28 :101650000DC5DBFF090E0EC5DBFF0C0E0FC5DBFF52 :101660000B0E10C5DBFF0E0E12C5DBFF0D0E13C5F2 @@ -239,1319 +239,1321 @@ :10168000E6FF0B0EDBCFE6FF0C0EDBCFE6FF090E0D :10169000DBCFE6FF0A0EDBCFE6FF070EDBCFE6FF70 :1016A000080EDBCFE6FF050EDBCFE6FF060EDBCF35 -:1016B000E6FF41EC18F0006E0B0EE15E00500101F8 -:1016C000010E526FBFEF11F0060E0AC5DBFF050ECB +:1016B000E6FF3FEC18F0006E0B0EE15E00500101FA +:1016C000010E526FBDEF11F0060E0AC5DBFF050ECD :1016D0000BC5DBFF050EDBCFE6FF060EDBCFE6FF1B -:1016E00009C5E6FF07EC18F0E552E552E5520101A5 -:1016F000526BBFEF11F0060E0AC5DBFF050E0BC5DE -:10170000DBFF080E0CC5DBFF070E0DC5DBFF0A0E65 -:101710000EC5DBFF090E0FC5DBFF020E0501095DDB -:1017200001E0B8D1090EDBCF4BF00A0EDBCF4CF055 -:1017300029EC24F04AC008F04BC009F04CC00AF074 -:101740004DC00BF0A60E4F6E280E506E940E516ECB -:101750003F0E526E08C04AF009C04BF00AC04CF070 -:101760000BC04DF043EC25F04AC004F04BC005F02F -:101770004CC006F04DC007F0CC0E4F6EBC0E506E44 -:101780008C0E516E3B0E526E04C04AF005C04BF0F9 -:1017900006C04CF007C04DF043EC25F0DFEC25F01F -:1017A00049C000F04AC001F04BC002F04CC003F049 -:1017B00000C0E6FF01C0E6FF02C0E6FF03C0E6FF8F -:1017C000070EDBCF4BF0080EDBCF4CF029EC24F0FA -:1017D0004AC014F04BC015F04CC016F04DC017F0C5 -:1017E000A60E4F6E280E506E940E516E3F0E526E26 -:1017F00014C04AF015C04BF016C04CF017C04DF0A5 -:1018000043EC25F04AC010F04BC011F04CC012F070 -:101810004DC013F0BD0E4F6E370E506E860E516EDA -:10182000410E526E10C04AF011C04BF012C04CF085 -:1018300013C04DF043EC25F0DFEC25F049C00CF06F -:101840004AC00DF04BC00EF04CC00FF00CC0E6FFCC -:101850000DC0E6FF0EC0E6FF0FC0E6FF050EDBCFB2 -:101860004BF0060EDBCF4CF029EC24F04AC01CF004 -:101870004BC01DF04CC01EF04DC01FF0A60E4F6EA9 -:10188000280E506E940E516E3F0E526E1CC04AF0E0 -:101890001DC04BF01EC04CF01FC04DF043EC25F0B6 -:1018A000DFEC25F049C018F04AC019F04BC01AF01F -:1018B0004CC01BF0000E186C191E19221A1E1A2299 -:1018C0001B1E1B2218C0E6FF19C0E6FF1AC0E6FF68 -:1018D0001BC0E6FFE66A31EC17F0206E0D0EE15EEC -:1018E0002050090EDBCF4BF00A0EDBCF4CF029EC79 -:1018F00024F04AC008F04BC009F04CC00AF04DC0BB -:101900000BF0A60E4F6E280E506E940E516E3F0EC9 -:10191000526E08C04AF009C04BF00AC04CF00BC030 -:101920004DF043EC25F04AC004F04BC005F04CC02C -:1019300006F04DC007F0CC0E4F6EBC0E506E8C0EF4 -:10194000516E3B0E526E04C04AF005C04BF006C00B -:101950004CF007C04DF043EC25F0DFEC25F049C01A -:1019600000F04AC001F04BC002F04CC003F000C0D0 -:10197000E6FF01C0E6FF02C0E6FF03C0E6FF070E78 -:10198000DBCF4BF0080EDBCF4CF029EC24F04AC043 -:1019900014F04BC015F04CC016F04DC017F0A60E59 -:1019A0004F6E280E506E940E516E3F0E526E14C044 -:1019B0004AF015C04BF016C04CF017C04DF043EC88 -:1019C00025F04AC010F04BC011F04CC012F04DC0D1 -:1019D00013F0BD0E4F6E370E506E860E516E410ED7 -:1019E000526E10C04AF011C04BF012C04CF013C040 -:1019F0004DF043EC25F0DFEC25F049C00CF04AC077 -:101A00000DF04BC00EF04CC00FF00CC0E6FF0DC047 -:101A1000E6FF0EC0E6FF0FC0E6FF050EDBCF4BF082 -:101A2000060EDBCF4CF029EC24F04AC01CF04BC072 -:101A30001DF04CC01EF04DC01FF0A60E4F6E280EBC -:101A4000506E940E516E3F0E526E1CC04AF01DC077 -:101A50004BF01EC04CF01FC04DF043EC25F0DFEC06 -:101A600025F049C018F04AC019F04BC01AF04CC01C -:101A70001BF018C0E6FF19C0E6FF1AC0E6FF1BC046 -:101A8000E6FF010EE66E31EC17F0206E0D0EE15E02 -:101A90002050E0D0090EDBCF4BF00A0EDBCF4CF02C -:101AA00029EC24F04AC008F04BC009F04CC00AF001 -:101AB0004DC00BF0A60E4F6E280E506E940E516E58 -:101AC0003F0E526E08C04AF009C04BF00AC04CF0FD -:101AD0000BC04DF043EC25F04AC004F04BC005F0BC -:101AE0004CC006F04DC007F0CC0E4F6EBC0E506ED1 -:101AF0008C0E516E3B0E526E04C04AF005C04BF086 -:101B000006C04CF007C04DF043EC25F0DFEC25F0AB -:101B100049C000F04AC001F04BC002F04CC003F0D5 -:101B200000C0E6FF01C0E6FF02C0E6FF03C0E6FF1B -:101B3000070EDBCF4BF0080EDBCF4CF029EC24F086 -:101B40004AC014F04BC015F04CC016F04DC017F051 -:101B5000A60E4F6E280E506E940E516E3F0E526EB2 -:101B600014C04AF015C04BF016C04CF017C04DF031 -:101B700043EC25F04AC010F04BC011F04CC012F0FD -:101B80004DC013F0BD0E4F6E370E506E860E516E67 -:101B9000410E526E10C04AF011C04BF012C04CF012 -:101BA00013C04DF043EC25F0DFEC25F049C00CF0FC -:101BB0004AC00DF04BC00EF04CC00FF00CC0E6FF59 -:101BC0000DC0E6FF0EC0E6FF0FC0E6FF050EDBCF3F -:101BD0004BF0060EDBCF4CF029EC24F04AC01CF091 -:101BE0004BC01DF04CC01EF04DC01FF0A60E4F6E36 -:101BF000280E506E940E516E3F0E526E1CC04AF06D -:101C00001DC04BF01EC04CF01FC04DF043EC25F042 -:101C1000DFEC25F049C018F04AC019F04BC01AF0AB -:101C20004CC01BF0000E186C191E19221A1E1A2225 -:101C30001B1E1B2218C0E6FF19C0E6FF1AC0E6FFF4 -:101C40001BC0E6FF09C5E6FF31EC17F0206E0D0E54 -:101C5000E15E205094D3060E0AC5DBFF050E0BC5CE -:101C6000DBFF080E0CC5DBFF070E0DC5DBFF020E08 -:101C70000501095D01E04FD1FF0E05010E03F35090 -:101C8000E66E070EDBCF4BF0080EDBCF4CF029ECF5 -:101C900024F04AC008F04BC009F04CC00AF04DC017 -:101CA0000BF0A60E4F6E280E506E940E516E3F0E26 -:101CB000526E08C04AF009C04BF00AC04CF00BC08D -:101CC0004DF043EC25F04AC004F04BC005F04CC089 -:101CD00006F04DC007F0CC0E4F6EBC0E506E8C0E51 -:101CE000516E3B0E526E04C04AF005C04BF006C068 -:101CF0004CF007C04DF043EC25F0DFEC25F049C077 -:101D000000F04AC001F04BC002F04CC003F000C02C -:101D1000E6FF01C0E6FF02C0E6FF03C0E6FF050ED6 -:101D2000DBCF4BF0060EDBCF4CF029EC24F04AC0A1 -:101D300014F04BC015F04CC016F04DC017F0A60EB5 -:101D40004F6E280E506E940E516E3F0E526E14C0A0 -:101D50004AF015C04BF016C04CF017C04DF043ECE4 -:101D600025F04AC010F04BC011F04CC012F04DC02D -:101D700013F0BD0E4F6E370E506E860E516E410E33 -:101D8000526E10C04AF011C04BF012C04CF013C09C -:101D90004DF043EC25F0DFEC25F049C00CF04AC0D3 -:101DA0000DF04BC00EF04CC00FF00CC0E6FF0DC0A4 -:101DB000E6FF0EC0E6FF0FC0E6FFE66A73EC17F021 -:101DC000186E0A0EE15E18500EC5E6FF070EDBCF57 -:101DD0004BF0080EDBCF4CF029EC24F04AC008F0A1 -:101DE0004BC009F04CC00AF04DC00BF0A60E4F6E70 -:101DF000280E506E940E516E3F0E526E08C04AF07F -:101E000009C04BF00AC04CF00BC04DF043EC25F07C -:101E10004AC004F04BC005F04CC006F04DC007F0BE -:101E2000CC0E4F6EBC0E506E8C0E516E3B0E526E31 -:101E300004C04AF005C04BF006C04CF007C04DF09E -:101E400043EC25F0DFEC25F049C000F04AC001F07A -:101E50004BC002F04CC003F000C0E6FF01C0E6FF3B -:101E600002C0E6FF03C0E6FF050EDBCF4BF0060E17 -:101E7000DBCF4CF029EC24F04AC014F04BC015F035 -:101E80004CC016F04DC017F0A60E4F6E280E506EC7 -:101E9000940E516E3F0E526E14C04AF015C04BF0B6 -:101EA00016C04CF017C04DF043EC25F04AC010F0BE -:101EB0004BC011F04CC012F04DC013F0BD0E4F6E70 -:101EC000370E506E860E516E410E526E10C04AF0A3 -:101ED00011C04BF012C04CF013C04DF043EC25F094 -:101EE000DFEC25F049C00CF04AC00DF04BC00EF0FD -:101EF0004CC00FF00CC0E6FF0DC0E6FF0EC0E6FFC1 -:101F00000FC0E6FF010EE66E73EC17F0186E0A0EB6 -:101F1000E15E1850A9D0FF0E05010E03F350E66EE6 -:101F2000070EDBCF4BF0080EDBCF4CF029EC24F092 -:101F30004AC008F04BC009F04CC00AF04DC00BF08D -:101F4000A60E4F6E280E506E940E516E3F0E526EBE -:101F500008C04AF009C04BF00AC04CF00BC04DF06D -:101F600043EC25F04AC004F04BC005F04CC006F02D -:101F70004DC007F0CC0E4F6EBC0E506E8C0E516EE5 -:101F80003B0E526E04C04AF005C04BF006C04CF048 -:101F900007C04DF043EC25F0DFEC25F049C000F020 -:101FA0004AC001F04BC002F04CC003F000C0E6FF95 -:101FB00001C0E6FF02C0E6FF03C0E6FF050EDBCF6F -:101FC0004BF0060EDBCF4CF029EC24F04AC014F0A5 -:101FD0004BC015F04CC016F04DC017F0A60E4F6E5A -:101FE000280E506E940E516E3F0E526E14C04AF081 -:101FF00015C04BF016C04CF017C04DF043EC25F067 -:102000004AC010F04BC011F04CC012F04DC013F09C -:10201000BD0E4F6E370E506E860E516E410E526ED3 -:1020200010C04AF011C04BF012C04CF013C04DF07C -:1020300043EC25F0DFEC25F049C00CF04AC00DF070 -:102040004BC00EF04CC00FF00CC0E6FF0DC0E6FF19 -:102050000EC0E6FF0FC0E6FF09C5E6FF73EC17F000 -:10206000186E0A0EE15E18508AD1060E0AC5DBFF13 -:10207000050E0BC5DBFF020E0501095D01E0B3D0C3 -:10208000FF0E05010C03F350E66E050EDBCF4BF09F -:10209000060EDBCF4CF029EC24F04AC008F04BC010 -:1020A00009F04CC00AF04DC00BF0A60E4F6E280E82 -:1020B000506E940E516E3F0E526E08C04AF009C029 -:1020C0004BF00AC04CF00BC04DF043EC25F04AC079 -:1020D00004F04BC005F04CC006F04DC007F0BD0E3B -:1020E0004F6E370E506E860E516E410E526E04C00A -:1020F0004AF005C04BF006C04CF007C04DF043EC71 -:1021000025F0DFEC25F049C000F04AC001F04BC0DB -:1021100002F04CC003F000C0E6FF01C0E6FF02C0C1 -:10212000E6FF03C0E6FFE66ABBEC17F00C6E060E96 -:10213000E15E0C500CC5E6FF050EDBCF4BF0060E42 -:10214000DBCF4CF029EC24F04AC008F04BC009F07A -:102150004CC00AF04DC00BF0A60E4F6E280E506E0C -:10216000940E516E3F0E526E08C04AF009C04BF0FB -:102170000AC04CF00BC04DF043EC25F04AC004F00F -:102180004BC005F04CC006F04DC007F0BD0E4F6EC1 -:10219000370E506E860E516E410E526E04C04AF0DC -:1021A00005C04BF006C04CF007C04DF043EC25F0E5 -:1021B000DFEC25F049C000F04AC001F04BC002F04E -:1021C0004CC003F000C0E6FF01C0E6FF02C0E6FF1E -:1021D00003C0E6FF010EE66EBBEC17F00C6E060EB8 -:1021E000E15E0C505BD0FF0E05010C03F350E66E70 -:1021F000050EDBCF4BF0060EDBCF4CF029EC24F0C4 -:102200004AC008F04BC009F04CC00AF04DC00BF0BA -:10221000A60E4F6E280E506E940E516E3F0E526EEB -:1022200008C04AF009C04BF00AC04CF00BC04DF09A -:1022300043EC25F04AC004F04BC005F04CC006F05A -:102240004DC007F0BD0E4F6E370E506E860E516EAC -:10225000410E526E04C04AF005C04BF006C04CF06F -:1022600007C04DF043EC25F0DFEC25F049C000F04D -:102270004AC001F04BC002F04CC003F000C0E6FFC2 -:1022800001C0E6FF02C0E6FF03C0E6FF09C5E6FFA6 -:10229000BBEC17F00C6E060EE15E0C5070D009C559 -:1022A000E6FFD9EC17F0E5520101010E526F67D03D -:1022B000DCEC1AF0050EF3CFDBFF060EF4CFDBFFEC -:1022C000F4EC1AF0070EF3CFDBFF080EF4CFDBFFC0 -:1022D00000C540F50501416B0501030E426F050184 -:1022E000436B060EDBCF48F5050EDBCF49F5080E34 -:1022F000DBCF4AF5070EDBCF4BF5400EE66E400E06 -:10230000E66E050EE66E010EE66E010EE66ED4EC8C -:1023100022F0006E050EE15E0050F3CF49F1F4CFDC -:102320004AF12DD000C540F50501416B0501030EB2 -:10233000426F0501436B0DEC1BF0000904E0050141 -:10234000010E486F02D00501486B400EE66E400E4C -:10235000E66E050EE66E010EE66E010EE66ED4EC3C -:1023600022F0006E050EE15E0050F3CF49F1F4CF8C -:102370004AF105D0010EE66ECCEC32F0E552400E8B -:10238000E66E000EE66E050EE66EE66A010EE66E7D -:10239000D4EC22F0006E050EE15E0050F3CF47F161 -:1023A000F4CF48F19FD0010149514A1102E1000EDA -:1023B00008D049C1E9FF4AC1EAFFEF50800B01E0B4 -:1023C000010E00094DE10101010E516F0501406B45 -:1023D00001014C514C2B0501416F0501050E426F67 -:1023E0000501436B0501486B040E006E630E016E20 -:1023F000026A00C0E6FF01C0E6FF02C0E6FF480E29 -:10240000E66E050EE66E0AEC32F0036E050EE15E36 -:102410000350400EE66E400EE66E050EE66E010EAF -:10242000E66E010EE66ED4EC22F0006E050EE15E63 -:102430000050F3CF49F1F4CF4AF1400EE66E000EA2 -:10244000E66E050EE66EE66A010EE66ED4EC22F04C -:10245000006E050EE15E0050F3CF47F1F4CF48F176 -:1024600041D0010149514A1102E1000E08D049C191 -:10247000E9FF4AC1EAFFEF50800B01E0010E0009BD -:1024800031E100C540F50501416B0501030E426FC6 -:102490000501010E436F400EE66E400EE66E050E1E -:1024A000E66E010EE66E010EE66ED4EC22F0006ED2 -:1024B000050EE15E0050F3CF49F1F4CF4AF1400E32 -:1024C000E66E000EE66E050EE66EE66A010EE66E3C -:1024D000D4EC22F0006E050EE15E0050F3CF47F120 -:1024E000F4CF48F10F0EE15C02E2E16AE552E16EE1 -:1024F000E552E7CFD9FF120001015351541104E115 -:10250000100E536F270E546F5307000E545B6DA2CD -:1025100007D0535154112EE18C748CB413D027D0B2 -:102520000101005102E18C9422D0000502E18C846B -:1025300009D0020E005D02E18C8419D0040E005D0A -:1025400003E18C948C861200100E005D06E10101FF -:10255000535154110FE18C740AD0200E005D0AE132 -:1025600001015351541106E18C748CA402D08C9655 -:1025700012008C861200120012001200120073EF7B -:1025800030F012001E0EE66E010EE66EA2EC22F096 -:10259000E552E552400EE66E000EE66E050EE66E62 -:1025A000E66A010EE66ED4EC22F0006E050EE15EE6 -:1025B0000050F3CF47F1F4CF48F112006D840101D0 -:1025C000080E686F070E696F6807000E695B685137 -:1025D0006911FAE16D941200D9CFE6FFE1CFD9FF7E -:1025E000FD0EDBCF4BF0FE0EDBCF4CF0010E4B1897 -:1025F00001E14C5033E0E8684B1802E1E8684C1800 -:102600002BE0030E4B1801E14C5024E0040E4B1854 -:1026100001E14C501DE0020E4B1801E14C5016E058 -:10262000170E4B1801E14C500FE0160E4B1801E14C -:102630004C5008E0150E4B1801E14C5001E010D051 -:10264000A1DF0FD09EDF0DD09ADF0BD096DF09D02F -:1026500092DF07D091DF05D091DF03D0000001D0D9 -:1026600000D0010E00D0E552E7CFD9FF12004BD8C1 -:10267000E652D0B202D0010E15D0D0B802D0020E70 -:1026800011D0D0B002D0030E0DD0D0B602D0040EBF -:1026900009D0FCAE02D0050E05D0FCAC02D0060E6F -:1026A00001D0070EDF6ED088D086D084D082D08053 -:1026B000FC9EFC9CDF50E552E552E7CFD9FF1200AB -:1026C000E65221D8020EE126F350DF6E010EF4CF60 -:1026D000DBFF1200C00EE66EE00EE66EB0EC32F0EC -:1026E000E552E5521200DF50F36E010EDB50F46E3E -:1026F000020EE15C1200DFCFE6FFE66A26EC32F064 -:10270000E552E5521200D9CFE6FFE1CFD9FF120022 -:10271000D6EC1BF0FE0EDB5006E1F80E96163C0ED2 -:102720009416959808D0FE0EDB0405E1070E96126C -:10273000C30E94129588DBEF1BF0D9CFE6FFE1CFF3 -:10274000D9FFE652010EE66EE3DFE552809AFE0EF7 -:10275000DB5004E0FE0EDB5002080FE1839C818811 -:102760000000839E0000000000008450010BDF6E1B -:10277000838E00000000DF04F4E0FE0EDB0404E0C2 -:10278000FE0EDB5002080FE1838C81980000839ECF -:102790000000000000008450010BDF6E838E0000FB -:1027A0000000DF04F4E0E552E552E7CFD9FF120064 -:1027B000D9CFE6FFE1CFD9FFE652FD0EDB50DF6E49 -:1027C000FE0EDBCFE6FFB9DFE552E66AA1DFE55298 -:1027D000FE0EDB5003E1839C81880CD0FE0EDB04EF -:1027E00003E1838C819806D0FE0EDB50020802E1E3 -:1027F000839C8198809A00008098D9CFE9FFDACF36 -:10280000EAFFEF50010B02E0848001D08490D9CF21 -:10281000E9FFDACFEAFFEF50020B02E0848201D039 -:102820008492D9CFE9FFDACFEAFFEF50040B02E040 -:10283000848401D08494D9CFE9FFDACFEAFFEF5046 -:10284000080B02E0838801D08398D9CFE9FFDACF63 -:10285000EAFFEF50100B02E0828201D08292D9CFC2 -:10286000E9FFDACFEAFFEF50200B02E0828E01D0C1 -:10287000829ED9CFE9FFDACFEAFFEF50400B02E0AA -:10288000828001D08290D9CFE9FFDACFEAFFEF5002 -:10289000800B02E0828C01D0829C000000008088C6 -:1028A00000000000E552E552E7CFD9FF1200D9CF72 -:1028B000E6FFE1CFD9FF020EE126FC0EDBCFDEFF03 -:1028C000DBCFDDFFFE0EDBCFE6FF37DFE552E66A4A -:1028D0001FDFE552FE0EDB5003E1839C81880CD0A4 -:1028E000FE0EDB0403E1838C819806D0FE0EDB50E4 -:1028F000020802E1839C8198808A00008098D9CFE9 -:10290000E9FFDACFEAFFEE52EF50010B02E08480DC -:1029100001D08490D9CFE9FFDACFEAFFEE52EF5031 -:10292000020B02E0848201D08492D9CFE9FFDACF92 -:10293000EAFFEE52EF50040B02E0848401D084944D -:10294000D9CFE9FFDACFEAFFEE52EF50080B02E0F1 -:10295000838801D08398D9CFE9FFDACFEAFFEE521E -:10296000EF50100B02E0828201D08292D9CFE9FFB2 -:10297000DACFEAFFEE52EF50200B02E0828E01D058 -:10298000829ED9CFE9FFDACFEAFFEE52EF50400B3B -:1029900002E0828001D08290D9CFE9FFDACFEAFF4E -:1029A000EE52EF50800B02E0828C01D0829C00003E -:1029B00000008088000000008098D9CFE9FFDACFBE -:1029C000EAFFEF50010B02E0848001D08490D9CF60 -:1029D000E9FFDACFEAFFEF50020B02E0848201D078 -:1029E0008492D9CFE9FFDACFEAFFEF50040B02E07F -:1029F000848401D08494D9CFE9FFDACFEAFFEF5085 -:102A0000080B02E0838801D08398D9CFE9FFDACFA1 -:102A1000EAFFEF50100B02E0828201D08292D9CF00 -:102A2000E9FFDACFEAFFEF50200B02E0828E01D0FF -:102A3000829ED9CFE9FFDACFEAFFEF50400B02E0E8 -:102A4000828001D08290D9CFE9FFDACFEAFFEF5040 -:102A5000800B02E0828C01D0829C00000000808804 -:102A600000000000020EE15C02E2E16AE552E16E64 -:102A7000E552E7CFD9FF1200D9CFE6FFE1CFD9FF6A -:102A8000020EE126FE0EDBCFE6FF57DEE552010E19 -:102A9000E66E3EDEE552FE0EDB5003E1839C81884C -:102AA00005D0FE0EDB0402E1838C8198808A000051 -:102AB000839E0000000000008450010B066E8450CD -:102AC000020B01E0010EE824056E8450040B01E0C6 -:102AD000010E040DF3CF04F08350100B01E0010E42 -:102AE000080DF3CF03F08250020B01E0010E100D30 -:102AF000F3CF02F08250800B01E0010E200DF3CFE6 -:102B000001F08250010B400DF3CF00F08250400BDA -:102B100001E0010E800DF3500010011002100310AF -:102B2000041005100610E76E010EE7CFDBFF838E61 -:102B300000000000839E0000000000008450010B94 -:102B4000066E8450020B01E0010EE824056E8450ED -:102B5000040B01E0010E040DF3CF04F08350100BC1 -:102B600001E0010E080DF3CF03F08250020B01E0EB -:102B7000010E100DF3CF02F08250800B01E0010E28 -:102B8000200DF3CF01F08250010B400DF3CF00F088 -:102B90008250400B01E0010E800DF3500010011037 -:102BA00002100310041005100610DF6E838EDECFB6 -:102BB00000F0DDCF01F000C0F3FF01C0F4FF00D052 -:102BC000020EE15C02E2E16AE552E16EE552E7CF16 -:102BD000D9FF1200D9CFE6FFE1CFD9FFE652DF6A75 -:102BE000FE0EDBCFE6FFA9DDE552010EE66E90DDBD -:102BF000E552FE0EDB5003E1839C818805D0FE0E7A -:102C0000DB0402E1838C8198809A0000839E00009F -:102C1000000000008450010B066E8450020B01E09E -:102C2000010EE824056E8450040B01E0010E040D32 -:102C3000F3CF04F08350100B01E0010E080DF3CF29 -:102C400003F08250020B01E0010E100DF3CF02F0F1 -:102C50008250800B01E0010E200DF3CF01F0825075 -:102C6000010B400DF3CF00F08250400B01E0010E4C -:102C7000800DF35000100110021003100410051015 -:102C80000610DF6E838EDF5000D0E552E552E7CFAD -:102C9000D9FF1200D6EC1BF0E652DF6A2DEC1CF0D7 -:102CA000DF6EFD0EDB50DF14DF6EDF5002E0010E41 -:102CB00001D0000EE552DBEF1BF0D6EC1BF01D0E31 -:102CC00084EC1BF0000EADEC1DF0DBEF1BF0D6EC3E -:102CD0001BF02DEC1CF084080DE02DEC1CF0C4085A -:102CE00009E0E66ABBEC1DF0AFEC1CF0FFEC32F043 -:102CF000E552EFD71C0E84EC1BF00A0EADEC1DF074 -:102D0000B3EC1CF02DEC1CF0800804E02DEC1CF062 -:102D1000C008E7E12DEC1CF0C00802E1B3EC1CF0A8 -:102D20001E0E84EC1BF00F0EADEC1DF05FEC1EF0E0 -:102D3000FA0EDBCFE6FFFB0E4BEC1DF0F80EDBCFFF -:102D4000E6FFF90E4BEC1DF0F60EDBCFE6FFF70EBB -:102D50004BEC1DF0040E84EC1BF0DBEF1BF0D6EC0B -:102D60001BF0080EE126010EAEEC1BF0010EE7CFC2 -:102D7000DBFF020EE0EC1DF0DF6E030EAEEC1BF08D -:102D8000030EE7CFDBFF040EAEEC1BF0020EE7CF25 -:102D9000DBFF050EAEEC1BF0050EE7CFDBFF060EEA -:102DA000AEEC1BF0040EE7CFDBFF070EAEEC1BF022 -:102DB000070EE7CFDBFF080EAEEC1BF00BEC1CF0B0 -:102DC000E66AB8EC1CF0090EAEEC1BF0010EE7CF82 -:102DD000DBFF0A0EE0EC1DF0DF6E0B0EAEEC1BF01D -:102DE000030EE7CFDBFF0C0EAEEC1BF0020EE7CFBD -:102DF000DBFF0D0EAEEC1BF0050EE7CFDBFF0E0E7A -:102E0000AEEC1BF0040EE7CFDBFF0F0EAEEC1BF0B9 -:102E1000070EE7CFDBFF100EAEEC1BF00BEC1CF047 -:102E2000010EE66EB8EC1CF0020EE66EE66EAFEC3C -:102E30001CF0E66A90EC1CF007E1020EE66E010E53 -:102E4000E66E90EC1CF002E0000E01D0010E006E68 -:102E5000080EE15C02E2E16AE552E16E0050DBEF50 -:102E60001BF0D6EC1BF00C0EB5EC1BF0D950F20F9A -:102E7000B1EC1DF0080EEECFDBFF090EEECFDBFF4D -:102E80000A0EEECFDBFF0B0EEECFDBFF1F0E84EC46 -:102E90001BF096EC1CF00A0EDBCF02F00B0EBFEC21 -:102EA0001CF010E02B0EADEC1DF00A0EDBCFE6FFA0 -:102EB0000B0E4BEC1DF0080EDBCFE6FF090EDBCF4F -:102EC000E6FF03D00B0EE66EE66A27EC1EF04BEC35 -:102ED0001DF039EC1EF00C0EE15C02E2E16AE552F5 -:102EE000E16EDBEF1BF0D6EC1BF00A0EB5EC1BF02D -:102EF000080EDB6A090EDB6A1F0E84EC1BF0F50E70 -:102F0000DBCF00F0003407E2080EDB6A100EF36E30 -:102F1000090EF3CFDBFF040EDBCF00F0050EDBCF95 -:102F200001F0060EDBCF02F0070EBFEC1CF00FE045 -:102F300096EC1CF0280E0012080E011200C0E6FFED -:102F400001C0E6FF27EC1EF0DBCFE6FF09D096ECD0 -:102F50001CF0080E0012011200C0E6FF01C0E6FFDF -:102F60007FDB39EC1EF00A0EE15C02E2E16AE55219 -:102F7000E16EDBEF1BF0D6EC1BF0F90EDBCFE6FFCA -:102F8000E66AE66AE66AE66AD950FA0FB1EC1DF025 -:102F9000EECFE6FFEECFE6FFEECFE6FFEFCFE6FFA8 -:102FA000BBEC1DF0A0DF006E0A0EE15E0050DBEF0F -:102FB0001BF0D6EC1BF0FE0EDB5004E0FE0EDB50E7 -:102FC00002080DE17FEC1CF0F3CF61F1F4CF62F168 -:102FD000E66AF7EC1DF0F3CF5FF1F4CF60F1FE0E7F -:102FE000DB0404E0FE0EDB5002080EE157EC1CF09F -:102FF000F3CF65F1F4CF66F1010EE66EF7EC1DF04C -:10300000F3CF63F1F4CF64F1010E7EDBD4D3CEDBDA -:103010001F0E7ADB5FEC1EF0010E76DBCCD358EC92 -:103020001EF0C5EC1DF077EC1CF073EC1DF024ECE9 -:103030001CF0C1D358EC1EF073EC1DF077EC1CF0C3 -:10304000C5EC1DF024EC1CF0B6D358EC1EF0F4ECEB -:103050001CF0FBEC1DF0E66A4AEC1CF0F4EC1CF0F2 -:10306000FBEC1DF07CEF1DF058EC1EF0F4EC1CF0B6 -:103070002EDBE66A4AEC1CF0F4EC1CF028DB7CEF5B -:103080001DF094DB200EE1264FEC1DF0FFEC1DF04F -:10309000C9EC1DF0ECDAF2DB43EC25F008EC1EF095 -:1030A00080EC1EF015EC1EF077EC1DF060EC1CF0CF -:1030B000DEDA9DEC1CF043EC25F055EC1DF085DBD1 -:1030C0005AEC24F02BDB4F6A506A800E516E6CEC88 -:1030D0001EF01C0E4AC0DBFF1D0E4BC0DBFF1E0E98 -:1030E0004CC0DBFF1F0E4DC0DBFF4FEC1DF016DBAD -:1030F00038DB77EC1DF066DBE5EC1DF0086E080EA2 -:10310000E15E0850080E49C0DBFF090E4AC0DBFF34 -:103110000A0E4BC0DBFF0B0E4CC0DBFFC2DBF60E12 -:10312000DB5007E0D950F40FB1EC1DF0EE50ED107C -:1031300059E13EEC1DF0026A036AB40E046E420EC1 -:10314000056E080EDBCF0EF0090EDBCF0FF00A0E76 -:10315000DBCF10F00B0EDBCF11F0CFEC1DF00EC06B -:103160004AF00FC04BF010C04CF011C04DF043ECD2 -:1031700025F04AC00AF04BC00BF04CC00CF04DC01B -:103180000DF085EC1DF0E2DB72DA02C04AF0C6EC0D -:103190001CF059EC24F058EC1DF057DF126E060EAF -:1031A000E15E125047DA3EEC1DF06BEC1DF0CEDB19 -:1031B000D8DAB5EC29F0E552E552E552E55249C0BE -:1031C00002F04AC003F04BC004F04CC005F049C007 -:1031D0004AF0DCDB58EC1DF022DF0A6E060EE15EE1 -:1031E0000A50E3D11C0EDBCF04F01D0EDBCF05F03F -:1031F0001E0EDBCF06F01F0EDBCF07F00C6A0D6A48 -:103200000E6A400E0F6EE8EC1DF011EC1EF055EC4E -:103210001DF00CC04AF00DC04BF00EC04CF00FC0BA -:103220004DF043EC25F0FFEC1DF049EC1EF0E8EC0E -:103230001DF046DB5FDB15EC1EF08DEC1DF059EC4C -:1032400024F0140E4AC0DBFF150E4BC0DBFF160E38 -:103250004CC0DBFF170E4DC0DBFF140EDBCF00F0C0 -:10326000150EDBCF01F0160EDBCF02F0170EDBCF11 -:1032700003F0E8EC1DF0A6DA8DEC1DF05AEC24F01A -:10328000180E4AC0DBFF190E4BC0DBFF1A0E4CC0F4 -:10329000DBFF1B0E4DC0DBFFC9EC1DF02BDBFFEC91 -:1032A0001DF0140EDBCF18F0150EDBCF19F0160E43 -:1032B000DBCF1AF0170EDBCF1BF080EC1EF092EC88 -:1032C0001DF0D5D918C04AF019C04BF01AC04CF007 -:1032D0001BC04DF043EC25F015EC1EF06BEC1DF01F -:1032E00091DAC5D92ADBF0EC24F0DFDBC7DA5AEC3F -:1032F00024F008EC1EF035DA80EC1EF04AC02CF009 -:103300004BC02DF04CC02EF04DC02FF0F3DA4AC068 -:1033100028F04BC029F04CC02AF04DC02BF0140E01 -:10332000DBCF38F0150EDBCF39F0160EDBCF3AF0DD -:10333000170EDBCF3BF0B3DB4AC03CF04BC03DF097 -:103340004CC03EF04DC03FF092D938C04AF039C071 -:103350004BF03AC04CF03BC04DF043EC25F04AC076 -:1033600034F04BC035F04CC036F04DC037F0B3DB15 -:103370004AC040F04BC041F04CC042F04DC043F059 -:1033800076D934C04AF035C04BF036C04CF037C067 -:103390004DF0F0EC24F04AC030F04BC031F04CC09E -:1033A00032F04DC033F063D928C04AF029C04BF049 -:1033B0002AC04CF02BC04DF059EC24F01ADAE5ECA1 -:1033C0001DF0446E080EE15E445040EC1EF0E5DA5C -:1033D00049C04AF05CDA7EDA140EDBCF4AF0150EF3 -:1033E000DBCF4BF0160EDBCF4CF0170EDBCF4DF0E2 -:1033F00039DA08EC1EF01C0EDBCF4AF01D0EDBCFD5 -:103400004BF01E0EDBCF4CF01F0EDBCF4DF070D912 -:10341000F6DB2DD9DAD959EC24F080D9A2D94A6A41 -:103420004B6A4C6A400E4D6E1DDA62D984DBCDDBEF -:10343000106E080EE15E1050100E49C0DBFF110E39 -:103440004AC0DBFF120E4BC0DBFF130E4CC0DBFF8C -:10345000100EDBCF04F0110EDBCF05F0120EDBCF28 -:1034600006F0130EDBCF07F04F6A506A516A526ABA -:10347000ACD916EC26F0010A0DE0100EDBCF00F0FF -:10348000110EDBCF01F0120EDBCF02F0130EDBCFFB -:1034900003F011D0100EDBCF08F0110EDBCF09F0D6 -:1034A000120EDBCF0AF0130EDBCF0BF076DAE6D983 -:1034B00043EC25F033D9100E00C0DBFF110E01C024 -:1034C000DBFF120E02C0DBFF130E03C0DBFFF60EA4 -:1034D000DB50020816E1D4D859EC24F019D95AEC83 -:1034E00024F07CD9060E4BC0DBFF070E4CC0DBFF7F -:1034F00074DB68D977DBA1DA040E4BC0DBFF050E65 -:103500003DD04A6A4B6A4C6A400E4D6E080EDBCFC6 -:103510004FF0090EDBCF50F00A0EDBCF51F00B0E4F -:10352000CADBFCD80C0EDBCF04F00D0EDBCF05F0B0 -:103530000E0EDBCF06F00F0EDBCF07F004C04FF00E -:1035400005C050F006C051F007C052F059EC24F00D -:10355000C1D996D85AEC24F0DBD859EC24F03ED9E6 -:10356000040E4BC0DBFF050E4CC0DBFF3BDB2AD952 -:1035700034DB63DA060E4BC0DBFF070E4CC0DBFF0B -:1035800059D89FD8040EDBCF4BF0050E14DA25DB9B -:103590000DDB9DD8ACD995D8060EDBCF4BF0070ECE -:1035A0000ADA20DB03DB27DB4FD9200EE15C02E2E5 -:1035B000E16AE552E16EFFD0F9D8040EE1269FD909 -:1035C000F3D9E66AA3D901015F51EE5C066E605142 -:1035D000EE58076E6151EE58086E6251A8D802E2AB -:1035E000E16AE552E16EE7D0E1D8040EE1265FD949 -:1035F000DBD9010EE66E8AD901016351EE5C066EDD -:103600006451EE58076E6551EE58086E66518FD8BA -:1036100002E2E16AE552E16ECED0040EE66EE66AA1 -:103620007FD906E0040EE66E010EE66E79D901E15F -:10363000000C010CF2DF0009FDE0120051DBEBD9B8 -:1036400056DAB9D94FEF1DF06DDAF8DA4EDB49C022 -:1036500018F04AC019F04BC01AF04CC01BF0120011 -:103660008ADA57EC14F0E552E552E55212004AC0EE -:103670004FF04BC050F04CC051F04DC052F0120012 -:10368000FDD90C0EDBCF06F00D0EDBCF07F00E0ED2 -:10369000DBCF08F00F0EDBCF09F081DA06C04AF06D -:1036A00007C04BF008C04CF009C04DF043EC25F0CA -:1036B0004BDA2BDAFDD9C9DC0A6E060EE15E0A5040 -:1036C000C7D1F70EDBCF4BF0F80E0BEF1DF0000E5D -:1036D000186C191E19221A1E1A221B1E1B2218C032 -:1036E000E6FF19C0E6FF1AC0E6FF1BC0E6FF1200A6 -:1036F0001C0EDBCF4FF01D0EDBCF50F01E0EDBCFCC -:1037000051F01F0E5BEF1EF0E66E35DAB6EF1DF0DE -:10371000D5D94BC0DEFF4CC0DDFF9AD14AC000F0C6 -:103720004BC001F04CC002F04DC003F01200EE5847 -:10373000096E06C049F007C04AF008C04BF04C6E55 -:1037400040EC24F001DA7ADAF0EC24F0BEDA4BC077 -:10375000F3FF4CC0F4FF040EE15C120031DAE76EB7 -:103760001200C7DA4DC0E6FF1200E126D9CFE9FF0B -:10377000DACFEAFFFA0EDBCFEEFFFB0EDBCFEEFF78 -:10378000FC0EDBCFEEFFFD0EDBCFEEFFD950F60FC8 -:10379000E8D9040EEECFDBFF050EEECFDBFF060E01 -:1037A000EECFDBFF070EEECFDBFF1200D9CFE6FF37 -:1037B000E1CFD9FF1200E552E7CFD9FF120031DA8D -:1037C0009BEF1DF02EDA08EF1EF004C04AF005C092 -:1037D0004BF006C04CF007C04DF012006FD9020E3E -:1037E0004BC0DBFF030E4CC0DBFF7ADADBCF4CF0C3 -:1037F00012004AC024F04BC025F04CC026F04DC04A -:1038000027F012004AC020F04BC021F04CC022F03B -:103810004DC023F01200060EE7CFDBFFDBCFE6FF43 -:10382000070EDBCFE6FF040EDBCFE6FF050EDBCF96 -:10383000E6FF020EDBCFE6FF030EDBCFE6FFDECFB7 -:10384000E6FFDDCFE6FF1200010EE66EB2D9020EF2 -:10385000E66ED9EC17F0E55212008DD9EAEC15F0BE -:10386000E5521200140EDBCF4FF0150EDBCF50F0F7 -:10387000160EDBCF51F0170E5BEF1EF008C04AF0BA -:1038800009C04BF00AC04CF00BC04DF01200EAD951 -:1038900043EF25F031EC17F0286E0D0EE15E285055 -:1038A0001200020EE66E5DEC16F0E55212000A0EF2 -:1038B000E66E010EE66E5AD9010EE66EF7EF1DF0C8 -:1038C000B0D94AC018F04BC019F04CC01AF04DC026 -:1038D0001BF012000C0E4AC0DBFF0D0E4BC0DBFFCD -:1038E0000E0E4CC0DBFF0F0E4DC0DBFF1200E66A70 -:1038F000D9EF1DF04F6A506A516A6CEF1EF00A0E44 -:10390000E66EE66A33D9E66AF7EF1DF070D9F3CFB9 -:10391000DEFFF4CFDDFFD9CFE9FFDACFEAFF1200F7 -:103920004AEC16F0E552E55200091200080EDBCF12 -:1039300000F0090EDBCF01F0120014C04AF015C0F0 -:103940004BF016C04CF017C04DF012004AC006F004 -:103950004BC007F04CC008F04DC009F0120006D96A -:10396000020EE66E120007D95DEC16F0E552120069 -:1039700067EC16F0006E090EE15E00501200DBCF1E -:1039800003F00050011002100310120003C04BF0AE -:1039900004C04CF005C04DF012004F6A506A800E12 -:1039A000516EBF0E526E1200020EF3CFDBFF030EFC -:1039B000F4CFDBFF120035D938D940D943EC25F0DC -:1039C0006ED9BD0E4F6E370E506E860E516E410E83 -:1039D000526E8BD949C00CF04AC00DF04BC00EF0AE -:1039E0004CC00FF0FBEF1DF029DE03DF350E4F6EEC -:1039F000FA0E506E0E0E516E3C0E526E43EC25F0D8 -:103A000001DF4F6A506A5C0E516E430E526E43ECFA -:103A100025F024EF1BF005D9F2D810D943EC25F09E -:103A2000F7D8CC0E4F6EBC0E506E8C0E516E3B0E06 -:103A3000526E5BD925D9FBEF1DF0F3D8E0D829D918 -:103A40004FD9BDDE14DE00C04AF021DFB0EF25F013 -:103A5000180EDBCF00F0190EDBCF01F01A0EDBCF12 -:103A600002F01B0EDBCF03F04F6A506ADC0E516E82 -:103A7000420E526E00C04AF032EF1EF0F70EDBCF5E -:103A8000E6FFF80EDBCFE6FFF90EDBCFE6FFFA0E1E -:103A9000DBCFE6FF1200DBCFE6FF30EF1BF0FD0EC1 -:103AA000DBCF4BF0FE0E11EF1EF0F9D837EF1BF015 -:103AB0000CD94BC0E6FF4CC0E6FF1200100EDBCF66 -:103AC0004FF0110EDBCF50F0120EDBCF51F0130E82 -:103AD000F2D8B0EF25F04A6A4B6A800E4C6E400E69 -:103AE0004D6E78EF1BF0AADDAFDDFBEF1DF0FB0E96 -:103AF000DBCF4BF0FC0E1200010EE66ECBDE020EA9 -:103B0000E66ED9EC17F0E55256D6DB0E4F6E0F0E6F -:103B1000506E490E516E6CEF1EF0A9DD00C04AF0E8 -:103B200032EF1EF04AC01CF04BC01DF04CC01EF01E -:103B30004DC01FF012004AC00CF04BC00DF04CC03D -:103B40000EF04DC00FF012004AC002F04BC003F05F -:103B50004CC004F04DC005F01200E66EE66A30EF8E -:103B60001BF0E96EFF0EDA20EA6E1200D8EC13F0BB -:103B7000E552E5521200FE0EDBCFE6FF1200DECF6B -:103B8000E6FFDDCFE6FF30EF1BF058DD5DDD67EFD0 -:103B90001BF0FD0EDBCF4BF0FE0EDFEF1BF04F6A8C -:103BA000506A340E516E430E526E12003AD824EF12 -:103BB0001BF031EC17F0206E0D0EE15E205012006C -:103BC000E66E46EC32F0E5521200CBDDA2EF2DF0AE -:103BD000F40EDBCF4BF0F50E1200000EDFCF4BF0F2 -:103BE000010E1200020EDBCF4BF0030E12003CEC74 -:103BF00015F0E552120049C0E6FF79EF1EF04AC009 -:103C000008F04BC009F04CC00AF04DC00BF0120098 -:103C10004AC004F04BC005F04CC006F04DC007F0A0 -:103C20001200DBCF4CF02BEF24F04AC014F04BC055 -:103C300015F04CC016F04DC017F01200A60E4F6ED6 -:103C4000280E506E940E516E3F0E526E120008DD1B -:103C5000060EDBCFE6FF070E1EDF040EDBCFE6FF0E -:103C6000050E120001C04BF002C04CF003C04DF035 -:103C70001200020EDBCFE6FF030E0DDFBFEF1DF0DB -:103C800049C000F04AC001F04BC002F04CC003F044 -:103C90001200EDDC9ADDF0EC24F08EEF1BF04AC050 -:103CA00010F04BC011F04CC012F04DC013F01200D8 -:103CB0007DDD51EF1CF0DBCF52F043EF25F0FC0E21 -:103CC000DBCFE6FFFD0E4BEF1DF0B0EC25F04BC057 -:103CD00000F04CC001F01200400E526EF0EF24F0E4 -:103CE000F90EDBCF4BF0FA0E120043EC25F0DFEFBC -:103CF00025F04AC0E6FF4BC0E6FF4CC0E6FF1200CD -:063D0000F6DE11EF1EF0DB -:0A3D06007BEC23F06A6A686AAEECF9 -:103D100023F06D8C6E6A5EEC23F06D9CDF6A8FEC95 -:103D200023F010E2DF50040DF3CFE9FFF4CFEAFFF8 -:103D3000000EE926040EEA22EE6AEE6AEE6AEE6AE8 -:103D4000DF2AEDD7160E706E68A604D0030E24ECA1 -:103D500023F0FAD70101136B186B196B1A6B6D986E -:103D6000080E0B6F040E0C6F016B006BE55239EF00 -:103D700023F07BEC23F0010100510BE16D6A696ACD -:103D8000AEEC23F06DB602D06D86FCD70101010EBA -:103D9000006F000508E16DBA06D0686A696A69803B -:103DA0006988020E006F6850040B07E06950040B2D -:103DB00004E0020E24EC23F089D86DB247D068509D -:103DC000010B14E06950010B11E09DDF0101040EAD -:103DD000006F0401200E026F040E036F080E016FC6 -:103DE000006B8C0E0013E66AEDEC23F06850100BAC -:103DF00007E06950100B04E060D8040E24EC23F0B7 -:103E00006850400B0BE06950400B08E0B5EC23F024 -:103E1000020E2CEC23F0060E24EC23F06850200B4D -:103E200004E06950200B01E035D86850020B0AE02D -:103E30006950020B07E0B5EC23F0E668E6680DEC8C -:103E400024F06A6A040E0101005D02E2A19A1FD00B -:103E500069A61CD0DF6A040EDF5C18E268A616D0E3 -:103E60006CCF20F1030E24EC23F0780E0101201515 -:103E700002E138D809D0000EE66EE66A200EE66E42 -:103E8000010EE66E010EE8DBDF2AE5D7A19AE552C6 -:103E900039EF23F070A00ED047EC23F0EF508008EC -:103EA00008E1D5DBEF50840804E147EC23F08C0EE9 -:103EB000EF6E7090050E24EF23F06984040EC4DBCE -:103EC0006D8267EC23F0040E2CEF23F067EC23F0F7 -:103ED000030EC2DB6D92699468A403D0020EB4DBBA -:103EE000FBD712007BEC23F0FD0E010120153DE114 -:103EF0007E0E2015E8407F0B040DF3CF03F1F4CFC5 -:103F000004F1000E0327040E042303C105F104C1CC -:103F100006F10575BCDBEF503C0BE842E8420D08AA -:103F200022E1B5DBE4EC23F0EECF00F0EFCF01F0BF -:103F3000280E001816E1040E011813E11EEC24F0FF -:103F4000DF6AEDDB0EE2DF5097EC23F0DF50EA6A28 -:103F5000200FE96E040EEA22E552E750EF6EDF2AE9 -:103F6000F0D70AD807D01AD805D0FD0E20150408BE -:103F700001E122D8E5527DD36ADBEF50800B02E0ED -:103F800066DBEF6A01010F6B106B146B156B136B23 -:103F900064D89DDB170E60DB62EF21F0020E010199 -:103FA000105D02E1EFEF21F034D80101215102E16F -:103FB000E9EF23F0216B12009EDB49DBEF50400B51 -:103FC00001E0010EDF6E01010B75080E005D09E1D5 -:103FD00022C46EFF6E50000802E2100E01D0040EE3 -:103FE000006F100513E122EC24F0A6D9020E0101A6 -:103FF0000F5D03E12CDB840E07D0DF5003E127DBEC -:10400000C80E02D024DB880EEF6E01D002D8E55234 -:1040100030D32BDB0101106B1ADBEF6A040E0B1996 -:10402000006E0CC101F0DE6E0CC1DDFF19DBEF6A22 -:1040300018AF0CD01B511C1107E005D01CC1FAFFB2 -:1040400001011B51F96EFADF0101189F020EE15CBC -:1040500002E2E16AE552E16E0CD304012051600BEB -:10406000E842E842E842E842E842000901E0120082 -:1040700021510C0A45E00B0A3FE00C0A31E0010A2D -:1040800022E00B0A1EE0020A1CE0030A18E0080AFC -:1040900010E0010A0CE00F0A08E0030A01E0120038 -:1040A0000101138F080E006F1200E2EF20F04BEFBA -:1040B00022F00101010E116F010E126F0CD023EFDF -:1040C00021F081EF20F024510101116F126B020EDB -:1040D0001127010E12231381010E146F138F12008A -:1040E0000101138F04012451EA6A020FE96E010EE7 -:1040F000EA2222C4EFFF1200EADA160E2CEF23F0B8 -:1041000012007EDB040EE1260401220510E120519D -:104110001F0B00090CE10101138F030E0401215D47 -:1041200004E10101010E1F6F02D001011F6B0401A8 -:10413000225141E120511F0B02083DE124510F0B98 -:10414000000939E00101138F040124BF05D0A4DA6E -:10415000070EE926010E04D09FDA0B0EE926010EA8 -:10416000D2DA030E215D03E17BDA840E23D02451E1 -:104170000F0B016A700F006E0F0E0122020E00C0BD -:10418000DBFF030E01C0DBFF020EDBCFE9FF030EF6 -:10419000DBCFEAFFEE90ED5224AF06D061DAEF6A92 -:1041A000DF745EDA400E06D05BDA880EEF6EDF74E5 -:1041B00057DAC80EEF6E040EE15C02E2E16AE552E6 -:1041C000E16E57D2800E0401205D3CE10101C00E7A -:1041D000136F04012351030A1EE0010A09E0030AD8 -:1041E0002FE10101B40E116F610E126F120E22D079 -:1041F000C3DA5E0EF626620EA2DA020E0101F76A3B -:104200001125F66E1251F7220900F5CF14F10A00BC -:10421000F5CF15F11200030E225D0FE2ADDA600E4C -:10422000F626620E8CDA11C1F6FF12C1F7FF080004 -:10423000F5500101146F156B12000101136B120090 -:104240000101136B120011DA0401286B296B205154 -:104250001F0B020A11E0030A0CE0010A22E101012E -:10426000138F0401288101011F051BE1040128832C -:1042700018D00101138F15D00101138F040124BF41 -:1042800005D00ADA070EE926010E04D005DA0B0E76 -:10429000E926010E38DAE4D9EF50040B02E0010EF2 -:1042A000286F010113AF07D0280E116F040E126F93 -:1042B0001381020E146F020EE15C02E2E16AE55224 -:1042C000E16ED7D16D98010113BF08D018AF02D0AD -:1042D00061DA2AD07EDABBD9840E27D018BF2BD062 -:1042E000040120AF24D0010114510401265D010115 -:1042F00015510401275904E226C414F127C415F10D -:104300001BD80101010E106FA1DA800EEF6E216B38 -:10431000BED9EE52080EEF6E91DAB9D9840EEF6E67 -:10432000010E216F8FDA93D9C80EEF6E12000101D2 -:1043300031DAC80EEF6E120098D90101080E145D33 -:10434000000E15590DE214C1DEFF15C1DDFF0F513E -:1043500002E1010E03D00F0506E1020E0F6F03D03C -:10436000080EDE6EDD6A73D9EF9271D9EF906FD9C6 -:10437000010EDB50EF126BD9EE52DFCFEFFF000ED4 -:10438000DB50145F010EDB50155B280E1D6F040E11 -:104390001E6F13B10FD0F7D91BE011C1F6FF12C188 -:1043A000F7FF112B000E12230800F55096D9F3E207 -:1043B000DB06F1D7E8D90CE011C1E9FF12C1EAFF31 -:1043C000112B000E1223EF5088D9F4E2DB06F2D74E -:1043D000020EE15C02E2E16AE552E16E4AD145D9A2 -:1043E00056D9EE52EFCFDFFFDFCF00F000500101D2 -:1043F000195D000E1A5903E219C1DFFF09D0DF5021 -:10440000006E016AE850195D196F01501A591A6F50 -:10441000010EDB6ADF50F36E010EDBCFF4FFF350C9 -:10442000F45C10E2010EDB5082D916C1E9FF17C11E -:10443000EAFF162B000E1723E552E750EF6E010E30 -:10444000DB2AE8D7000ED8801955000E1A550DE268 -:10445000F4D854D91CD9EF50400B03E1EAD9C80E67 -:1044600002D0E7D9880EEF6E0FD0F0D9840EEF6E30 -:104470001B511C1107E005D01CC1FAFF01011B51A3 -:10448000F96EFADF0101189F020EE15C02E2E16AB7 -:10449000E552E16EEED00101138F10D9010EE66EE8 -:1044A000E66AE66A020EE66E010EAFD922C401F199 -:1044B0000401225104E10101100E006F12000101FC -:1044C000200E006F04D9150E2CEF23F0CED8000E6D -:1044D000DE6E040EDD6EE8D8040DF350006E016A46 -:1044E000020E0F0B05E0D89001320032E806FBE126 -:1044F000D89000360136D89000360136D9CFE9FF82 -:10450000DACFEAFF0050EE260150ED22A9D8EF9E47 -:10451000FD0EDB5002E16AD901D06DD9EA22DECF6F -:10452000EEFFDDCFEDFF9CD8EF9C9AD8040EE92674 -:10453000000EEA22EF8C020EE15C02E2E16AE55233 -:10454000E16E97D092D8FE0EDB50016A700F006EBC -:104550000F0EDFD885D8FD0EDBCFEFFFDBA402D036 -:10456000E66AF5D8FD0EDBA203D0010EE66EEFD8A9 -:10457000020EE15C02E2E16AE552E16E7AD075D8A2 -:10458000FE0EDB5005E125D962D8840EEF6E05D012 -:104590008BD80CD989D8010F09D9020EE15C02E24F -:1045A000E16AE552E16E65D060D8FD0EDB5002E0B5 -:1045B00022D901D01BD9A7D853D806D9FB0EDBCFFF -:1045C000EEFFFC0EDBCFEDFF4BD8EE52FA0EDBCF49 -:1045D000EFFF400E45D8E850EF16880E41D8E8505E -:1045E000EF12FD0EDB5002E006D901D0FFD8EA221F -:1045F000EF74DECF00F0DDCF01F000C0F3FF01C0AB -:10460000F4FF020EE15C02E2E16AE552E16E31D0B4 -:10461000F7D8010EF36EFC0EDB5004E0D890F336B1 -:10462000E806FCE1F31C006EFD0EDBCFE9FFFE0E99 -:10463000DBCFEAFF0050EF161CD0FBD8EE52080E7D -:10464000EF6EF7D8E4EF23F0E66EEDEF23F00BC149 -:10465000E9FF0CC1EAFF1200E66EE66A0DEF24F0F6 -:10466000DECFE9FFDDCFEAFF1200CAD8020EE12655 -:104670001200E552E7CFD9FF1200D6D819EF24F087 -:10468000FE0EEA6ADB34FE0BEA36E96E120003C165 -:10469000E9FF04C1EAFF120024510F0BE96EEA6A38 -:1046A000D890E936EA361200FD0EDB50E824026E9F -:1046B000FE0EDB50040DF35002241200000EE66ED5 -:1046C000E66AE66A710EE66E0F0E05EF24F0000E44 -:1046D000E66EE66AE66EE66A1200E66E1DC1E9FF66 -:1046E0001EC1EAFF1D2B000E1E23E552E750EF6EA0 -:1046F000DF06010E120084D8E6521200280EEE6E7C -:10470000040EED6E1200EA22EECFDEFFEDCFDDFFEC -:104710001200012200C0DEFF01C0DDFF1200DF50E9 -:10472000006E016A080E005C000E01581200EA6A71 -:10473000280FE96E040EEA22EF50E66E1200F7220F -:104740000900F5CF11F10A00F5CF12F11200FE0EAB -:10475000DBCFE6FFBBDEE552E5521200160E6F6EB0 -:104760009F0E6B6E7B0E696E1200010EE66EE66A9E -:10477000000EE66EE66A12002251F66EF76AD890D5 -:10478000F636F7361200D9CFE9FFDACFEAFFEE505E -:10479000ED101200020E106F5ADFEE52EF6A57DF73 -:1047A000C80EEF6E4ADFAADF19EF24F0040DF3CF35 -:1047B00000F0F4CF01F0000E0026040EAADF840EF4 -:1047C0004FDFE850EF121200020EE926000EEA2237 -:1047D00012003CD88C0EEF6E1200680EE66E0F0EC3 -:1047E000E66E16DFE552E552E552120049DF070E8C -:1047F000E926010E120044DF0B0EE926010E12001D -:10480000D9CFE6FFE1CFD9FF1200E66EF0EC31F030 -:10481000006E050EE15E00501200ECEC12F0006E2E -:10482000060EE15E00501200200EEE6E040EED6EDC -:10483000120005C1E9FF06C1EAFF120028DFC4DF4C -:1048400014EF24F004DFC0DF7EEF23F0F6DE3DEF4F -:0248500023F053 -:0E485200549E08D0549E4CAE05D04B6C4C1EAC -:10486000E86A4C22548E4CC046F04BC045F0586A62 -:10487000576A8E0E476E486A90EF26F0549E0CD011 -:10488000549E4CAE09D0496C4A1E4B1E4C1EE86A21 -:104890004A224B224C22548E4CC046F04BC045F06D -:1048A0004AC058F049C057F09E0E476E486A90EFD4 -:1048B00026F0527E546ACCEC26F0E4EC26F054B696 -:1048C00074EF26F054A20AD054AA03D054BE74EF59 -:1048D00026F054A480EF26F07DEF26F054AA05D0F0 -:1048E00054AC80EF26F07DEF26F054A00AD054A8F7 -:1048F00008D054BE04D054A402D089EF26F08DEF26 -:1049000026F0576A486A52504D5C566E10E34AC012 -:1049100058F04BC045F04CC046F04DC055F04FC06C -:104920004AF050C04BF051C04CF0543A09D04FC03F -:1049300058F050C045F051C046F052C055F0566C8A -:10494000549E54BC548E55C047F054B0BCEF26F072 -:104950001A0E5660BCEF26F0476A4D6A54A408D080 -:104960004A6C4B1E4C1E4D1EE86A4B224C224D22B7 -:1049700054AC08D0586C451E461E471EE86A4522B6 -:1049800046224722496A565207E04D344C324B3298 -:104990004A324932562EF9D74A5058264B504522B2 -:1049A0004C5046224D50472249C057F0549E47AEC6 -:1049B0000BD0576C581E451E461E471EE86A5822EB -:1049C000452246224722548E47A006D0D880463240 -:1049D000453258325732552A55C047F090EF26F0ED -:1049E000546ACCEC26F0E4EC26F054B674EF26F0D2 -:1049F00054A205D054BA74EF26F07BEF26F054BAD7 -:104A000087EF26F054A005D054B874EF26F087EF56 -:104A100026F054B87BEF26F0486A7F0E4D24476E8F -:104A2000E86A48225250475EE86A485A1A0E556EA4 -:104A30004D6A576A586A456A466A4F504A5E5050F6 -:104A40004B5A51504C5A000E4D5A09E74F504A26C6 -:104A500050504B2251504C22000E4D2201D0578A0B -:104A6000D8904A364B364C364D36D8905736583655 -:104A700045364636552EE1D74C504B104A10D8A437 -:104A8000578A90EF26F0546ACCEC26F0E4EC26F03E -:104A900054B674EF26F054A205D054B874EF26F043 -:104AA0007BEF26F054AA05D054B074EF26F07BEFCC -:104AB00026F054B002D054A802D087EF26F0486AFE -:104AC00052504D24476EE86A48227E0E475EE86ADF -:104AD000485A576A586A456A466A51504C02F4CFA0 -:104AE00046F0F3CF45F050504C02F3505826F450A6 -:104AF0004522000E462251504B02F3505826F450E6 -:104B00004522000E46224F504C02F3505726F450D7 -:104B10005822000E4522462250504B02F350572691 -:104B2000F4505822000E4522462251504A02F350BA -:104B30005726F4505822000E452246224F504B0271 -:104B4000F4505726000E58224522462250504A0261 -:104B5000F4505726000E58224522462290EF26F0A8 -:104B6000546ACCEC26F054B6BAEF25F054A20ED01D -:104B700054B405D07F0E4C6EFF0E4B6E1FD0800ECE -:104B80004C6E4B6A1BD04C6A4B6A18D054B0FBD7A2 -:104B90008F0E4D60EDD77E0E4D64F5D78E0E4D5CB9 -:104BA00005E0D8904C324B324D2AF8D754A406D0A9 -:104BB0004B6C4C1EE86A4C224CAEE5D71200546A8E -:104BC000CCEC26F054B6E9EF25F054A20FD054B443 -:104BD00007D07F0E4C6EFF0E4B6E4A6E496E25D08D -:104BE000800E4C6E01D04C6A000EF6D754B0FBD745 -:104BF000496A9F0E4D60EBD77E0E4D64F4D79E0E32 -:104C00004D5C07E0D8904C324B324A3249324D2A43 -:104C1000F6D754A40AD0496C4A1E4B1E4C1EE86AB3 -:104C20004A224B224C224CAEDED712001FEC26F05B -:104C300054B6000C54B0000C54A4000C010C546A7F -:104C4000CCEC26F0E4EC26F054B6120054AE08D0BA -:104C500054A004D054A802D05480120054901200E2 -:104C600052504D5C0BE151504C5C08E150504B5C94 -:104C700005E14F504A5C02E154801200D8A002D0F6 -:104C8000548E10D04D5052C04DF0526E4C5051C009 -:104C90004CF0516E4B5050C04BF0506E4A504FC0CC -:104CA0004AF04F6E52504D5C10E0FF0F09E05490F7 -:104CB00054B403D054AE5484120054AE5494120031 -:104CC000522AD890513250324F324F504A5E505093 -:104CD0004B5A51504C5A4CBEEAD7D8904A364B36B4 -:104CE0004C364D2EF8D7C8D77F0E4D6EFF0E4C6E4A -:104CF0004B6E4A6E12007F0E54BEFF0E4D6E02D0F8 -:104D00007F0E4D6E800E4C6E4B6A4A6AF3D754AEDE -:104D100004D0800E4D6E4C6AF7D74D6A4C6AF4D7BA -:104D20004650451058105710F8E048BEF0D746BE20 -:104D30000CD047504810EBE0D890573658364536DF -:104D400046364706D8A04806F2D74850D4E147284F -:104D5000D2E057AE11D07F0E571402E158A00CD00C -:104D6000582AE86A4522462207E3D880463245326F -:104D70005832472A4728BFE04750C9E058C04AF098 -:104D800045C04BF046344C6E47304D6E4C324D9E14 -:104D900054BE4D8E7AEF26F04C364D3602E35484E5 -:104DA000547E06E154804D6A4C6A4B6A4A6A12008E -:104DB0004D2803E0D8804C321200D8904C3202E1EA -:104DC00054821200548612005136523602E3548C3B -:104DD000547E06E15488526A516A506A4F6A120042 -:104DE000522803E0D88051321200D8905132EAE1C3 -:104DF000548A12001FEC26F054B6000C54B0000C7C -:104E000054B4000C010C536A51AE0CEF27F0506CF7 -:104E1000511EE86A5122531E4CAE14EF27F04B6C22 -:104E20004C1EE86A4C22531E16EC33F04CBE24EFA5 -:104E300027F053AE000C4B6C4C1EE86A4C22476CBA -:104E4000481EE86A4822000C53BE1BEF27F0548826 -:024E5000FF0C55 -:0E4E5200D9CFE6FFDACFE6FFE1CFD9FFE2CFFE -:104E6000DAFF1D0EE12402E3E168E652E16E67DA43 -:104E7000FA0EDBCFEEFFFB0EDBCFEEFFFC0EDBCF3F -:104E8000EEFFFD0EDBCFEEFFD950040FE66E000EF5 -:104E9000DA20E... [truncated message content] |
From: Jérémie D. <Ba...@us...> - 2010-02-11 17:04:00
|
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 0c5b4c2d11b04376479351b4e11a65efb7ebb557 (commit) via 0f60bf1b91b83cad609a6e8c468e605a01aef247 (commit) from c382ce049a0f6289d3b02d9db51b97ef788ef00f (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 0c5b4c2d11b04376479351b4e11a65efb7ebb557 Author: Jérémie Dimino <je...@di...> Date: Thu Feb 11 18:03:28 2010 +0100 [forward-dbus] connect to krobot bus instead of system message bus commit 0f60bf1b91b83cad609a6e8c468e605a01aef247 Author: Jérémie Dimino <je...@di...> Date: Thu Feb 11 17:30:40 2010 +0100 Merges Config modules ----------------------------------------------------------------------- Changes: diff --git a/PC_Mainboard/common/config.ml b/PC_Mainboard/common/config.ml index 46a2ea0..c248d6e 100644 --- a/PC_Mainboard/common/config.ml +++ b/PC_Mainboard/common/config.ml @@ -11,3 +11,5 @@ let back_sensors = [3; 6; 7; 10] let front_sensors = [0; 1; 2; 4; 5; 8; 9; 11; 12; 13; 14; 15] let initial_position = 200 let bus_address = "unix:abstract=krobot" +let update_delay = 0.05 +let reopen_delay = 1.0 diff --git a/PC_Mainboard/common/config.mli b/PC_Mainboard/common/config.mli index 05ec7f2..645ac10 100644 --- a/PC_Mainboard/common/config.mli +++ b/PC_Mainboard/common/config.mli @@ -20,3 +20,9 @@ val initial_position : int val bus_address : string (** Default address of the krobot dbus daemon *) + +val update_delay : float + (** Time to wait between updates *) + +val reopen_delay : float + (** Time to wait before retrying to open a card *) diff --git a/PC_Mainboard/driver/config.ml b/PC_Mainboard/driver/config.ml deleted file mode 100644 index 4d5953a..0000000 --- a/PC_Mainboard/driver/config.ml +++ /dev/null @@ -1,11 +0,0 @@ -(* - * config.ml - * --------- - * Copyright : (c) 2009, Jeremie Dimino <je...@di...> - * Licence : BSD3 - * - * This file is a part of [kro]bot. - *) - -let update_delay = 0.05 -let reopen_delay = 1.0 diff --git a/PC_Mainboard/driver/config.mli b/PC_Mainboard/driver/config.mli deleted file mode 100644 index 614cd16..0000000 --- a/PC_Mainboard/driver/config.mli +++ /dev/null @@ -1,14 +0,0 @@ -(* - * config.mli - * ---------- - * Copyright : (c) 2009, Jeremie Dimino <je...@di...> - * Licence : BSD3 - * - * This file is a part of [kro]bot. - *) - -val update_delay : float - (** Time to wait between updates *) - -val reopen_delay : float - (** Time to wait before retrying to open a card *) diff --git a/PC_Mainboard/driver/driver.ml b/PC_Mainboard/driver/driver.ml index 915498b..c9ee93c 100644 --- a/PC_Mainboard/driver/driver.ml +++ b/PC_Mainboard/driver/driver.ml @@ -523,8 +523,7 @@ lwt () = (* Be verbose: *) Lwt_log.set_level !Lwt_log.default (min Lwt_log.Info Lwt_log.default_level); - lwt bus = OBus_bus.of_addresses [{ OBus_address.address = OBus_address.Unix_abstract "krobot"; - OBus_address.guid = None }] in + 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 -> diff --git a/PC_Mainboard/lib_krobot/krobot.ml b/PC_Mainboard/lib_krobot/krobot.ml index 01a2d68..1b38052 100644 --- a/PC_Mainboard/lib_krobot/krobot.ml +++ b/PC_Mainboard/lib_krobot/krobot.ml @@ -76,8 +76,7 @@ let make_card_signal ~peer ~name ~get ~update ~typ = +-----------------------------------------------------------------+ *) let bus = lazy( - OBus_bus.of_addresses [{ OBus_address.address = OBus_address.Unix_abstract "krobot"; - OBus_address.guid = None }] + OBus_bus.of_addresses (OBus_address.of_string Config.bus_address) ) let get_bus () = diff --git a/PC_Mainboard/tools/forward_dbus.ml b/PC_Mainboard/tools/forward_dbus.ml index af19b40..7c85c84 100644 --- a/PC_Mainboard/tools/forward_dbus.ml +++ b/PC_Mainboard/tools/forward_dbus.ml @@ -15,7 +15,7 @@ let rec copy ta tb = copy ta tb lwt () = - lwt addresses = Lazy.force OBus_address.system in + let addresses = OBus_address.of_string Config.bus_address in lwt (_, ta) = OBus_transport.of_addresses addresses in let tb = OBus_transport.make hooks/post-receive -- krobot |
From: Jérémie D. <Ba...@us...> - 2010-02-11 16:09: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 c382ce049a0f6289d3b02d9db51b97ef788ef00f (commit) from 9a1b10ff61b5e18787f09759fe14c1d2aefb7d09 (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 c382ce049a0f6289d3b02d9db51b97ef788ef00f Author: Jérémie Dimino <je...@di...> Date: Thu Feb 11 17:08:25 2010 +0100 missing files common/types.{ml,mli} and driver/bus.conf ----------------------------------------------------------------------- Changes: diff --git a/PC_Mainboard/common/types.ml b/PC_Mainboard/common/types.ml new file mode 100644 index 0000000..cb42817 --- /dev/null +++ b/PC_Mainboard/common/types.ml @@ -0,0 +1,36 @@ +(* + * types.ml + * -------- + * Copyright : (c) 2010, Jeremie Dimino <je...@di...> + * Licence : BSD3 + * + * This file is a part of [kro]bot. + *) + +open OBus_pervasives + +type move_result = [ `OK | `Stopped ] + +let obus_move_result = + OBus_type.mapping obus_int [(`OK, 0); (`Stopped, 1)] + +type motor = [ `Left | `Right | `Both ] + +let obus_motor = OBus_type.mapping obus_int + [(`Left, -1); + (`Both, 0); + (`Right, 1)] + +type stop_mode = [ `Off | `Abrupt | `Smooth ] + +let obus_stop_mode = OBus_type.mapping obus_int + [(`Off, 0); + (`Abrupt, 1); + (`Smooth, 2)] + +type card_state = [ `Running | `Opening | `Closed ] + +let obus_card_state = OBus_type.mapping obus_int + [(`Running, 0); + (`Opening, 1); + (`Closed, 2)] diff --git a/PC_Mainboard/common/types.mli b/PC_Mainboard/common/types.mli new file mode 100644 index 0000000..35eed37 --- /dev/null +++ b/PC_Mainboard/common/types.mli @@ -0,0 +1,29 @@ +(* + * types.mli + * --------- + * Copyright : (c) 2010, Jeremie Dimino <je...@di...> + * Licence : BSD3 + * + * This file is a part of [kro]bot. + *) + +(** Common types with their obus type combinators *) + +(** This types are used by the driver and the client-side krobot + library. + + Putting in a module shared by the client and the server prevents + typos in conversions. *) + +type move_result = [ `OK | `Stopped ] with obus(basic) + (** Result of a movement started by [Krobot.move] or + [Krobot.turn] *) + +type motor = [ `Left | `Right | `Both ] with obus(basic) + (** Motors *) + +type stop_mode = [ `Off | `Abrupt | `Smooth ] with obus(basic) + (** Mode for stopping motors *) + +type card_state = [ `Running | `Opening | `Closed ] with obus(basic) + (** State of a card *) diff --git a/PC_Mainboard/driver/bus.conf b/PC_Mainboard/driver/bus.conf new file mode 100644 index 0000000..9808b8e --- /dev/null +++ b/PC_Mainboard/driver/bus.conf @@ -0,0 +1,30 @@ +<!-- Configuration for the dbus daemon --> +<!DOCTYPE busconfig PUBLIC "-//freedesktop//DTD D-Bus Bus Configuration 1.0//EN" + "http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd"> +<busconfig> + <keep_umask/> + + <!-- Krobot dbus daemon address --> + <listen>unix:abstract=krobot</listen> + + <!-- Allow everything --> + <policy context="default"> + <allow send_destination="*" eavesdrop="true"/> + <allow eavesdrop="true"/> + <allow own="*"/> + </policy> + + <!-- Raise limits --> + <limit name="max_incoming_bytes">1000000000</limit> + <limit name="max_outgoing_bytes">1000000000</limit> + <limit name="max_message_size">1000000000</limit> + <limit name="service_start_timeout">120000</limit> + <limit name="auth_timeout">240000</limit> + <limit name="max_completed_connections">100000</limit> + <limit name="max_incomplete_connections">10000</limit> + <limit name="max_connections_per_user">100000</limit> + <limit name="max_pending_service_starts">10000</limit> + <limit name="max_names_per_connection">50000</limit> + <limit name="max_match_rules_per_connection">50000</limit> + <limit name="max_replies_per_connection">50000</limit> +</busconfig> hooks/post-receive -- krobot |
From: Jérémie D. <Ba...@us...> - 2010-02-11 16:02:35
|
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 9a1b10ff61b5e18787f09759fe14c1d2aefb7d09 (commit) via ba0eee6c0452eaf35f96561b4734103a2088b372 (commit) from 5dfa179cb90bb249bdbccdf7d1e18818a9854581 (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 9a1b10ff61b5e18787f09759fe14c1d2aefb7d09 Author: Jérémie Dimino <je...@di...> Date: Thu Feb 11 17:01:43 2010 +0100 Reorganisation of the soure tree commit ba0eee6c0452eaf35f96561b4734103a2088b372 Author: Jérémie Dimino <je...@di...> Date: Thu Feb 11 15:32:37 2010 +0100 use a custom bus daemon ----------------------------------------------------------------------- Changes: diff --git a/PC_Mainboard/Makefile b/PC_Mainboard/Makefile new file mode 100644 index 0000000..56af001 --- /dev/null +++ b/PC_Mainboard/Makefile @@ -0,0 +1,23 @@ +# Makefile +# -------- +# Copyright : (c) 2009, Jeremie Dimino <je...@di...> +# Licence : BSD3 +# +# This file is a part of [kro]bot. + +PREFIX=/usr/local + +OC = ocamlbuild +OF = ocamlfind + +ifeq ($(TERM),dumb) +OC += -classic-display +endif + +.PHONY: all +all: + $(OC) all + +.PHONY: clean +clean: + $(OC) -clean diff --git a/PC_Mainboard/README b/PC_Mainboard/README index 1481106..a595631 100644 --- a/PC_Mainboard/README +++ b/PC_Mainboard/README @@ -1,5 +1,22 @@ -* "daemons" contient les processus lancés au niveau système qui font - l'interfaçage entre les cartes +Organisation des dossiers: -* "clients" contient des utilitaires, l'intelligence artificielle, - l'interface web, ... +* "card_tools" contient des outils pour les cartes usb, notamment pour + flasher les firmwares + +* "clients" contient les divers programmes pour monitorer et + controller le robot + +* "common" contient les modules partagés par plusieurs composantes du + robot + +* "driver" contient le driver qui accède au cartes usb + +* "lib_krobot" contient la librairie cliente pour utiliser le robot, + qui se connecte au driver via D-Bus + +* "services" contient des services tels que l'arrêt des moteurs en cas + de colision ou le logging d'un match + +* "tools" contient divers outils + +* "www" contient une interface web pour le krobot diff --git a/PC_Mainboard/_tags b/PC_Mainboard/_tags new file mode 100644 index 0000000..103ccce --- /dev/null +++ b/PC_Mainboard/_tags @@ -0,0 +1,57 @@ +# -*- conf -*- + +"common": include +"lib_krobot": include + +# +------------------------------------------------------------------+ +# | Krobot library | +# +------------------------------------------------------------------+ + +<lib_krobot/**/*.ml>: syntax_camlp4o, pkg_lwt.syntax, pkg_lwt.syntax.log, pkg_obus.syntax +<lib_krobot/**>: pkg_lwt.unix, pkg_obus + +# +------------------------------------------------------------------+ +# | Card tools | +# +------------------------------------------------------------------+ + +<card_tools/**/*.ml>: syntax_camlp4o, pkg_lwt.syntax, pkg_lwt.syntax.log +<card_tools/**>: thread, pkg_usb, pkg_lwt.unix + +# +------------------------------------------------------------------+ +# | Clients | +# +------------------------------------------------------------------+ + +<clients/**/*.ml>: syntax_camlp4o, pkg_lwt.syntax, pkg_lwt.syntax.log, pkg_obus.syntax +<clients/**>: pkg_lwt.unix, pkg_obus +<clients/joy_control.*>: pkg_sdl +<clients/controller.*>: pkg_lwt.text +<clients/script_lexer.*>: pkg_text +<clients/script.*>: pkg_text + +# +------------------------------------------------------------------+ +# | Services | +# +------------------------------------------------------------------+ + +<services/**/*.ml>: syntax_camlp4o, pkg_lwt.syntax, pkg_lwt.syntax.log, pkg_obus.syntax +<services/**>: pkg_lwt.unix, pkg_obus + +# +------------------------------------------------------------------+ +# | Common | +# +------------------------------------------------------------------+ + +<common/types.{ml,mli}>: syntax_camlp4o, pkg_obus.syntax +<common/types.*>: pkg_obus + +# +------------------------------------------------------------------+ +# | Driver | +# +------------------------------------------------------------------+ + +<driver/**/*.ml>: syntax_camlp4o, pkg_lwt.syntax, pkg_lwt.syntax.log, pkg_obus.syntax +<driver/**>: thread, pkg_lwt.unix, pkg_obus, pkg_usb + +# +------------------------------------------------------------------+ +# | Tools | +# +------------------------------------------------------------------+ + +<tools/forward_dbus.ml>: syntax_camlp4o, pkg_lwt.syntax, pkg_lwt.syntax.log, pkg_obus.syntax +<tools/forward_dbus.*>: pkg_obus diff --git a/PC_Mainboard/card-tools/Makefile b/PC_Mainboard/card-tools/Makefile deleted file mode 100644 index 8055020..0000000 --- a/PC_Mainboard/card-tools/Makefile +++ /dev/null @@ -1,36 +0,0 @@ -# Makefile -# -------- -# Copyright : (c) 2009, Jeremie Dimino <je...@di...> -# Licence : BSD3 -# -# This file is a part of [kro]bot. - -PREFIX=/usr/local - -OC = ocamlbuild -OF = ocamlfind - -ifeq ($(TERM),dumb) -OC += -classic-display -endif - -.PHONY: all -all: - $(OC) all - -.PHONY: clean -clean: - $(OC) -clean - -.PHONY: install -install: - install -m0755 _build/src/send_firmare.best $(PREFIX)/bin/send-firmware - install -m0755 _build/src/dump_memory.best $(PREFIX)/bin/dump-memory - -.PHONY: uninstall -uninstall: - rm -f $(PREFIX)/bin/send-firmware - rm -f $(PREFIX)/bin/dump-memory - -.PHONY: reinstall -reinstall: uninstall install diff --git a/PC_Mainboard/card-tools/PcInterface.h b/PC_Mainboard/card-tools/PcInterface.h deleted file mode 100644 index 6928d8e..0000000 --- a/PC_Mainboard/card-tools/PcInterface.h +++ /dev/null @@ -1,208 +0,0 @@ -/** - * @file PcInterface.h - * Fichier commun avec le programme hsur la carte m (USB PC). - * Ce fichier dnit de nombreuses constantes utilis pour le protocole - * de communication carte <-> PC. -*/ - -#ifndef PC_INTERFACE_H -#define PC_INTERFACE_H - -#define USB_VID 0x04D8 ///< Vendor ID commun aux diffntes cartes USB -#define USB_PID_USB_DEV_BOARD 0x0001 ///< Product ID de la Carte d'essais -#define USB_PID_PROXIMITY_SENSOR 0x0002 ///< Product ID de la Carte capteurs -#define USB_PID_MOTOR_CONTROLLER 0x0003 ///< Product ID de la Carte d'asservissement -#define USB_PID_ROBOT_INTERFACE 0x0004 ///< Product ID de la Carte d'actionneur -#define USB_PID_BATTERY_MONITORING 0x0005 ///< Product ID de la carte Battery Monitoring -#define USB_PID_BOOTLOADER 0x000b ///< Product ID d'une carte en mode bootloader - -// Protocole USB -#define UP_HSEQ 0 ///< Host sequence number -#define UP_DSEQ 1 ///< Device sequence number -#define UP_CMD 2 -#define UP_ERR 3 -#define UP_RES0 4 -#define UP_RES1 5 -#define UP_RES2 6 -#define UP_RES3 7 -#define UP_RES4 60 -#define UP_RES5 61 -#define UP_RES6 62 -#define UP_RES7 63 -#define UP_DATA 8 - -// Commande (premier bit) -#define CMD_RESET 0 ///< Reset du PIC -#define CMD_BOOTLOADER 1 ///< Reset du PIC en mode bootloader -#define CMD_GET 2 ///< Obtenir une information -#define CMD_RESPOND 3 ///< Rnse ne commande -#define CMD_ERR 4 ///< Envoyer une erreur -#define CMD_SEND 5 ///< Envoyer du texte -#define CMD_SET 6 ///< Dnir l't d'un parame -#define CMD_TEST 7 ///< Commande grique pour dencher une action de test -#define CMD_CALIBRATE 8 ///< Lance la calibration d'un tme [Carte capteurs] -#define CMD_AX12 9 -#define CMD_TRAJ 10 ///< Transmet une trajetoire au Krobot -#define CMD_MOTOR 11 ///< Gestion des moteurs -#define CMD_MOTOR_TOR 12 - -// CMD_GET arguments -#define GET_RESET_SOURCE 0 ///< Demande au PIC la source du Reset -#define GET_BOARD_INFO 1 ///< Demande au PIC le nom de la carte et l'auteur -#define GET_FIRMWARE_BUILD 2 ///< Demande au PIC la date et l'heure de compilation du firmware -#define GET_PORTS_CONFIG 3 ///< Demande la config TRIS des ports du PIC -#define GET_PORTS_STATE 4 ///< Demande l't des ports du PIC -#define GET_RANGEFINDER_STATE 5 ///< Demande au PIC les mesures des tmes [Carte capteurs] -#define GET_ISENS 6 ///< Demande au PIC les valeurs des courants moteurs mesur [Carte d'asservissement] -#define GET_CURRENT_POS 7 ///< Demande au PIC les positions actuelles des moteurs [Carte d'asservissement] -#define GET_RANGEFINDER_CALIBRATION 8 ///< Demande au PIC les valeurs de calibration des tmes [Carte capteurs] -#define GET_TOR_STATE 9 ///< Demande au PIC l't des capteurs de contact [Carte capteurs] -#define GET_CMP03_DATA 10 ///< Rp les infos du compas ctronique CMP03 -#define GET_CELL_VOLTAGE 11 ///< Tensions des cellules [Battery Monitoring] -#define GET_CURRENT 12 ///< Valeur instantandu courant dtar la batterie [Battery Monitoring] -#define GET_POWER_STATE 13 ///< Etat de l'alimentation de puissance (On/Off) [Battery Monitoring] -#define GET_BATTERY_STATE 14 ///< Etat des batteries (Pleine charge/Charge moyenne/Charge faible) [Battery Monitoring] - -// CMD_ERR arguments -#define ERR_UNKNOWN_CMD 1 ///< Commande inconnue -#define ERR_UNKNOWN_GET 2 ///< Demande inconnue -#define ERR_UNKNOWN_SET 3 ///< Demande inconnue -#define ERR_INVALID_RESPONSE 4 ///< Rnse invalide -#define ERR_AX12_WRONG_PACKET 5 -#define ERR_AX12_ERROR 6 -#define ERR_AX12_CHKSUM 7 -#define ERR_CMP03_NOT_RESPONDING 8 -#define ERR_ADJD_S371_NOT_RESPONDING 9 - -// CMD_SET arguments -#define SET_PORTS_CONFIG_INPUTS 0x00 ///< Dnir les entr du PIC -#define SET_PORTS_CONFIG_OUTPUTS 0x01 ///< Dnir les sorties du PIC -#define SET_PORTS_STATE_LOW 0x02 ///< Dnir les sorties 't bas du PIC -#define SET_PORTS_STATE_HIGH 0x03 ///< Dnir les sorties 't haut du PIC -#define SET_SERVO_CONFIG 0x04 ///< Dnir la config des servomoteurs -#define SET_SERVO_STATE 0x05 ///< Dnir l't des servomoteurs - -// CMD_CALIBRATE arguments -#define CAL_START 0x00 -#define CAL_CONTINUE 0x01 -#define CAL_STOP 0x02 -#define CAL_ERROR 0x03 -#define CAL_DONE 0x04 -#define CAL_PLACE_INF 0x05 -#define CAL_PLACE_30 0x06 -#define CAL_PLACE_100 0x07 - -// GET_RESET_SOURCE reponse -#define RESET_SOURCE_POR 0x01 ///< Power-on Reset -#define RESET_SOURCE_RI 0x02 ///< RESET Instruction -#define RESET_SOURCE_BOR 0x03 ///< Brown-out Reset -#define RESET_SOURCE_WDT 0x04 ///< Watchdog Time-out Reset -#define RESET_SOURCE_STKFUL 0x05 ///< Stack Full Reset -#define RESET_SOURCE_STKUNF 0x06 ///< Stack Underflow Reset -#define RESET_SOURCE_MCLR 0x07 ///< Master Clear Reset - -// CMD_AX12 -#define AX12_PING 0x01 -#define AX12_READ 0x02 -#define AX12_WRITE 0x03 -#define AX12_GOTO 0x04 -#define AX12_GET_POS 0x05 -#define AX12_GET_SPEED 0x06 -#define AX12_GET_LOAD 0x07 -#define AX12_GET_STATS 0x08 -#define AX12_WRITE_REG 0x09 -#define AX12_ACTION 0x10 - -// CMD_TRAJ -#define TRAJ_INIT 0x00 -#define TRAJ_FORWARD 0x01 -#define TRAJ_BACKWARD 0x02 -#define TRAJ_TR 0x03 -#define TRAJ_TL 0x04 -#define TRAJ_GOTO 0x05 -#define TRAJ_FINISHED 0x06 -#define TRAJ_STOP 0x07 -#define TRAJ_NEW_POSITION 0x08 -#define TRAJ_NEW_VELOCITY 0x09 -#define TRAJ_CHANGE_VELOCITY 0x0A -#define TRAJ_CONFIG 0x0B -#define TRAJ_CONFIG_DEFAULT 0x0C -#define TRAJ_START 0x0D -#define TRAJ_GET_REL_POS 0x0E -#define TRAJ_READ_CONFIG 0x0F - -#define TRAJ_NOT_COMPLETED 0x00 -#define TRAJ_COMPLETED 0x01 - -#define TRAJ_STOP_MOTOR_OFF 256 -#define TRAJ_STOP_ABRUPT 512 -#define TRAJ_STOP_SMOOTH 1024 - -// CMD_MOTOR -#define MOTOR_ENABLE 1 -#define MOTOR_DISABLE 2 -#define MOTOR_MOVE 3 - -#define MOTOR_RIGHT 0 ///< Sction du moteur de droite (moteur 1) -#define MOTOR_LEFT 1 ///< Sction du moteur de gauche (moteur 2) -#define MOTOR_BOTH 2 ///< Sction des 2 moteurs simultannt - -// XXX omplr -#define READ_VERSION 0x00 -#define READ_FLASH 0x01 -#define WRITE_FLASH 0x02 -#define ERASE_FLASH 0x03 -#define READ_EEDATA 0x04 -#define WRITE_EEDATA 0x05 -#define READ_CONFIG 0x06 -#define WRITE_CONFIG 0x07 -#define UPDATE_LED 0x32 -#define RESET 0xFF - -#define FLASH_BOOT_START 0x00 -#define FLASH_BOOT_END 0x7FF -#define FLASH_VECTOR_START 0x800 -#define FLASH_VECTOR_END 0x829 -#define FLASH_PAGE_START 0x82A -#define FLASH_PAGE_END 0x7FFF - -#define PORTA_RA0 1 -#define PORTA_RA1 2 -#define PORTA_RA2 4 -#define PORTA_RA3 8 -#define PORTA_RA4 16 -#define PORTA_RA5 32 -#define PORTA_RA6 64 - -#define PORTB_RB0 1 -#define PORTB_RB1 2 -#define PORTB_RB2 4 -#define PORTB_RB3 8 -#define PORTB_RB4 16 -#define PORTB_RB5 32 -#define PORTB_RB6 64 -#define PORTB_RB7 128 - -#define PORTC_RC0 1 -#define PORTC_RC1 2 -#define PORTC_RC2 4 -#define PORTC_RC4 16 -#define PORTC_RC5 32 -#define PORTC_RC6 64 -#define PORTC_RC7 128 - -#define PORTD_RD0 1 -#define PORTD_RD1 2 -#define PORTD_RD2 4 -#define PORTD_RD3 8 -#define PORTD_RD4 16 -#define PORTD_RD5 32 -#define PORTD_RD6 64 -#define PORTD_RD7 128 - -#define PORTE_RE0 1 -#define PORTE_RE1 2 -#define PORTE_RE2 4 -#define PORTE_RE3 8 - -#endif // PC_INTERFACE_H diff --git a/PC_Mainboard/card-tools/_tags b/PC_Mainboard/card-tools/_tags deleted file mode 100644 index e273d14..0000000 --- a/PC_Mainboard/card-tools/_tags +++ /dev/null @@ -1,4 +0,0 @@ -# -*- conf -*- - -<src/*.ml>: syntax_camlp4o, pkg_lwt.syntax -<src/*>: thread, pkg_usb diff --git a/PC_Mainboard/card-tools/myocamlbuild.ml b/PC_Mainboard/card-tools/myocamlbuild.ml deleted file mode 100644 index 0607ed1..0000000 --- a/PC_Mainboard/card-tools/myocamlbuild.ml +++ /dev/null @@ -1,146 +0,0 @@ -(* - * myocamlbuild.ml - * --------------- - * Copyright : (c) 2009, Jeremie Dimino <je...@di...> - * Licence : BSD3 - * - * This file is a part of [kro]bot. - *) - -open Printf -open Ocamlbuild_plugin - -(* +-----------------------------------------------------------------+ - | Configuration | - +-----------------------------------------------------------------+ *) - -let try_exec command = - try - let () = Command.execute ~quiet:true (Cmd(S[Sh command; Sh"> /dev/null"; Sh"2> /dev/null"])) in - true - with _ -> - false - -let () = - if not (try_exec "ocamlfind printconf") then begin - prerr_endline "ocamlfind is not available, please install it"; - exit 1 - end - -let have_native = try_exec "ocamlfind ocamlopt -version" - -let () = - let yes_no = function true -> "yes" | false -> "no" in - printf "\ -+--[ compilation options ]----------+ -| native compilation: %3s | -+-----------------------------------+ -%!" (yes_no have_native) - -(* +-----------------------------------------------------------------+ - | Ocamlfind | - +-----------------------------------------------------------------+ *) - -(* Put here packages you may use in this project: *) -let packages = [ - "type-conv"; - "type-conv.syntax"; - "camlp4"; - "camlp4.extend"; - "camlp4.lib"; - "camlp4.macro"; - "camlp4.quotations.o"; - "camlp4.quotations.r"; - "lwt"; - "lwt.unix"; - "lwt.syntax"; - "lwt.syntax.log"; - "str"; - "xmlm"; - "react"; - "usb"; - "obus"; - "obus.syntax"; - "bitstring"; - "bitstring.syntax"; -] - -(* List of available syntaxes :*) -let syntaxes = [ - "camlp4o"; - "camlp4r"; -] - -(* +-----------------------------------------------------------------+ - | Utils | - +-----------------------------------------------------------------+ *) - -let flag_all_stages_except_link tag f = - flag ["ocaml"; "compile"; tag] f; - flag ["ocaml"; "ocamldep"; tag] f; - flag ["ocaml"; "doc"; tag] f - -let flag_all_stages tag f = - flag_all_stages_except_link tag f; - flag ["ocaml"; "link"; tag] f - -let _ = - dispatch begin function - | Before_options -> - - (* override default commands by ocamlfind ones *) - let ocamlfind x = S[A"ocamlfind"; A x] in - Options.ocamlc := ocamlfind "ocamlc"; - Options.ocamlopt := ocamlfind "ocamlopt"; - Options.ocamldep := ocamlfind "ocamldep"; - (* FIXME: sometimes ocamldoc say that elements are not found - even if they are present: *) - Options.ocamldoc := S[A"ocamlfind"; A"ocamldoc"; A"-hide-warnings"] - - | After_rules -> - - (* Génération du fichier contenant les détails du protocol à - partir du fichier .h *) - rule "protocol du krobot" ~dep:"PcInterface.h" ~prod:"protocol.ml" - (fun _ _ -> - Cmd(S[Sh"awk '$1 == \"#define\" && $3 != \"\" { print \"let \" tolower($2) \" = \" $3 }' PcInterface.h > protocol.ml"])); - - (* +---------------------------------------------------------+ - | Virtual targets | - +---------------------------------------------------------+ *) - - if have_native then - rule "best" ~dep:"%.native" ~prod:"%.best" - (fun env _ -> cp (env "%.native") (env "%.best")) - else - rule "best" ~dep:"%.byte" ~prod:"%.best" - (fun env _ -> cp (env "%.byte") (env "%.best")); - - let virtual_rule name deps = - rule name ~stamp:name ~deps (fun _ _ -> Nop) - in - - virtual_rule "all" ["src/send_firmware.best"; "src/dump_memory.best"]; - - (* +---------------------------------------------------------+ - | Ocamlfind stuff | - +---------------------------------------------------------+ *) - - (* When one link an OCaml binary, one should use -linkpkg *) - flag ["ocaml"; "link"; "program"] & A"-linkpkg"; - - (* For each ocamlfind package one inject the -package option - when compiling, computing dependencies, generating - documentation and linking. *) - List.iter - (fun package -> flag_all_stages ("pkg_" ^ package) (S[A"-package"; A package])) - packages; - - (* Like -package but for extensions syntax. Morover -syntax is - useless when linking. *) - List.iter - (fun syntax -> flag_all_stages_except_link ("syntax_" ^ syntax) (S[A"-syntax"; A syntax])) - syntaxes; - - | _ -> () - end diff --git a/PC_Mainboard/card-tools/src/boardname.mli b/PC_Mainboard/card-tools/src/boardname.mli deleted file mode 100644 index 23b0032..0000000 --- a/PC_Mainboard/card-tools/src/boardname.mli +++ /dev/null @@ -1,12 +0,0 @@ -(* - * boardname.mli - * ------------- - * Copyright : (c) 2009, Stéphane Glondu <st...@gl...> - * Licence : BSD3 - * - * This file is a part of Krobot. - *) - -val get_board_name : string -> string option - (** [get_board_name dump] recherche dans le [dump] mémoire (peut - être également un fichier .hex chargé) le nom de la carte. *) diff --git a/PC_Mainboard/card-tools/src/boardname.mll b/PC_Mainboard/card-tools/src/boardname.mll deleted file mode 100644 index 30f99cf..0000000 --- a/PC_Mainboard/card-tools/src/boardname.mll +++ /dev/null @@ -1,22 +0,0 @@ -(* - * boardname.mll - * ------------- - * Copyright : (c) 2009, Stéphane Glondu <st...@gl...> - * Licence : BSD3 - * - * This file is a part of Krobot. - *) - - -let boardname_regex = ("Carte " | "Robot Interface") [^'\n']+ - -rule boardname = parse - | (boardname_regex as name) '\n' { Some name } - | _ { boardname lexbuf } - | eof { None } - -{ - let get_board_name str = - let lexbuf = Lexing.from_string str in - boardname lexbuf -} diff --git a/PC_Mainboard/card-tools/src/bootloader.ml b/PC_Mainboard/card-tools/src/bootloader.ml deleted file mode 100644 index 28044cc..0000000 --- a/PC_Mainboard/card-tools/src/bootloader.ml +++ /dev/null @@ -1,184 +0,0 @@ -(* - * bootloader.ml - * ------------- - * Copyright : (c) 2009, Stéphane Glondu <st...@gl...> - * Licence : BSD3 - * - * This file is a part of Krobot. - *) - -open Lwt -open Lwt_io - -(* Code très inspiré de kard.ml, mais mis à part car le mode de - communication avec la carte est différent (bulk au lieu - d'interrupt). *) - -type t = { - mutable is_open : bool; - (* La carte est-elle ouverte ? *) - - handle : USB.handle; - (* Handle pour le périphérique usb *) - - kernel_active : bool; - (* Est-ce qu'un driver noyau était attaché à la carte avant qu'on - l'utilise ? *) -} - -type error = - | IncompleteWrite of int * int - | IncompleteRead of int * int - | UnexpectedReply of string * string - | WriteError of string * string - -let string_of_error = function - | IncompleteWrite (a, b) -> Printf.sprintf "%d byte(s) written instead of %d" a b - | IncompleteRead (a, b) -> Printf.sprintf "%d byte(s) read instead of %d" a b - | UnexpectedReply (a, b) -> Printf.sprintf "received unexpected reply %S instead of %S" a b - | WriteError (a, b) -> Printf.sprintf "written: %S, read back: %S" a b - -exception Error of error - -let failwith e = fail (Error e) - -let close k = - if k.is_open then begin - lwt _ = USB.release_interface k.handle 0 in - lwt _ = USB.reset_device k.handle in - (*if k.kernel_active then USB.attach_kernel_driver k.handle 0;*) - (*USB.close k.handle;*) - k.is_open <- false; - return () - end else return () - -let open_card () = - let handle = USB.open_device_with - ~vendor_id:Protocol.usb_vid - ~product_id:Protocol.usb_pid_bootloader - in - let kernel_active = USB.kernel_driver_active handle 0 in - if kernel_active then USB.detach_kernel_driver handle 0; - lwt _ = USB.set_configuration handle 1 in - lwt _ = USB.claim_interface handle 0 in - let k = { is_open = true; - handle = handle; - kernel_active = kernel_active } in - let _ = Lwt_sequence.add_l (fun _ -> close k) Lwt_main.exit_hooks in - return k - -let header_length = 5 - -let put_message buffer cmd length address data = - let body_length = String.length data in - assert (String.length buffer >= header_length+body_length); - let set i n = buffer.[i] <- char_of_int n in - set 0 cmd; - assert (length < 0x100); - set 1 length; - assert (address <= 0x1000000); - set 2 (address land 0xff); - set 3 ((address lsr 8) land 0xff); - set 4 ((address lsr 16) land 0xff); - String.blit data 0 buffer 5 body_length - -let send_receive_packet k send_buffer send_length receive_buffer receive_length send_delay receive_delay = - let handle = k.handle and endpoint = 1 in - lwt sent = USB.bulk_send ~handle ~endpoint ~timeout:1. send_buffer 0 send_length in - if sent <> send_length then - failwith (IncompleteWrite (sent, send_length)) - else begin - lwt received = USB.bulk_recv ~handle ~endpoint ~timeout:3. receive_buffer 0 receive_length in - if received <> receive_length then - failwith (IncompleteRead (received, receive_length)) - else - return () - end - -let get_flash k ~address ~length = - let response_length = 64 in - let increment = response_length-header_length in - assert (increment < 256); - let send_buffer = String.create header_length in - let receive_buffer = String.create response_length in - let result_buffer = String.create length in - let rec loop offset total_length = - if total_length <= 0 then - return result_buffer - else begin - let length = min increment total_length in - let response_length = length+header_length in - let address = address+offset in - put_message send_buffer Protocol.read_flash length address ""; - lwt () = send_receive_packet k send_buffer header_length receive_buffer response_length 1. 3. in - let receive_header = String.sub receive_buffer 0 header_length in - if receive_header <> send_buffer then - failwith (UnexpectedReply (receive_header, send_buffer)) - else begin - String.blit receive_buffer header_length result_buffer offset length; - loop (offset+length) (total_length-length); - end - end - in loop 0 length - -let erase_flash k ~address ~length = - let response_length = 1 in - (* les effacements se font par blocs de 64 octets *) - let increment = 64 in - let send_buffer = String.create header_length in - let receive_buffer = String.create response_length in - let rec loop offset total_length = - if total_length <= 0 then - return () - else begin - let address = address+offset in - put_message send_buffer Protocol.erase_flash 1 address ""; - lwt () = send_receive_packet k send_buffer header_length receive_buffer response_length 1. 5. in - if int_of_char receive_buffer.[0] <> Protocol.erase_flash then - failwith (UnexpectedReply (receive_buffer, String.make 1 (char_of_int Protocol.erase_flash))) - else - loop (offset+increment) (total_length-increment); - end - in loop 0 length - -let reference = String.make 16 '\255' - -let write_flash k ~address data offset length = - let send_length = 64 and receive_length = 1 in - (* les écritures se font par blocs de 16 octets *) - let increment = 16 in - let send_buffer = String.create send_length in - let receive_buffer = String.create receive_length in - let rec loop address offset total_length = - (* address: sur le PIC, offset: dans data, total_length: taille restante *) - if total_length <= 0 then - return () - else begin - let packet = String.make increment '\255' in - String.blit data offset packet 0 (min total_length increment); - if packet = reference the n begin - (* le paquet n'a pas de contenu, on l'ignore *) - (* lwt () = printf "Skipping address 0x%06X...\n" address in *) - loop (address+increment) (offset+increment) (total_length-increment) - end else begin - (* lwt () = printf "Processing address 0x%06X...\n" address in *) - put_message send_buffer Protocol.write_flash increment address packet; - lwt () = send_receive_packet k send_buffer send_length receive_buffer receive_length 0.5 1. in - if int_of_char receive_buffer.[0] <> Protocol.write_flash then - failwith (UnexpectedReply (receive_buffer, String.make 1 (char_of_int Protocol.erase_flash))) - else begin - lwt written = get_flash k ~address ~length:increment in - if written <> packet then - failwith (WriteError (packet, written)) - else - loop (address+increment) (offset+increment) (total_length-increment) - end - end - end - in loop address offset length - -let reset_board k = - let send_buffer = String.create 64 and receive_buffer = String.create 64 in - send_buffer.[0] <- char_of_int Protocol.reset; - lwt () = send_receive_packet k send_buffer 1 receive_buffer 64 5. 5. in - return () diff --git a/PC_Mainboard/card-tools/src/dump_memory.ml b/PC_Mainboard/card-tools/src/dump_memory.ml deleted file mode 100644 index 5c746e0..0000000 --- a/PC_Mainboard/card-tools/src/dump_memory.ml +++ /dev/null @@ -1,30 +0,0 @@ -(* - * dump_memory.ml - * -------------- - * Copyright : (c) 2009, Stéphane Glondu <st...@gl...> - * Licence : BSD3 - * - * This file is a part of Krobot. - *) - -open Printf -open Lwt -open Lwt_io - -let main = - lwt k = Bootloader.open_card () in - try_lwt - lwt data = Bootloader.get_flash k ~address:0x0 ~length:0x8000 in - let msg = match Boardname.get_board_name data with - | Some s -> sprintf "Board: %S" s - | None -> "Unable to identify board!" - in - lwt () = eprintlf "%s" msg in - (if Unix.isatty Unix.stdout then hexdump else write) stdout data >> flush stdout - with - | Bootloader.Error e -> - eprintlf "%s" (Bootloader.string_of_error e) - | e -> - eprintlf "%s" (Printexc.to_string e) - -let _ = Lwt_main.run main diff --git a/PC_Mainboard/card-tools/src/hexfile.ml b/PC_Mainboard/card-tools/src/hexfile.ml deleted file mode 100644 index a667957..0000000 --- a/PC_Mainboard/card-tools/src/hexfile.ml +++ /dev/null @@ -1,112 +0,0 @@ -(* - * hexfile.ml - * ---------- - * Copyright : (c) 2009, Stéphane Glondu <st...@gl...> - * Licence : BSD3 - * - * This file is a part of Krobot. - *) - -open Lwt -open Lwt_io - -type hex_record = - | Data of int * string - | ExtendedLinearAddress of int - | EndOfFile of int - -let string_of_hexline str = - let n = String.length str in - assert (n > 0 && n mod 2 = 1 && str.[0] = ':'); - let m = n/2 in - let result = String.create m in - for i = 0 to m-1 do - let j = 2*i+1 in - result.[i] <- char_of_int (int_of_string ("0x"^(String.sub str j 2))) - done; - result - -let compute_checksum str = - let rec aux i accu = - if i < 0 then - (-accu) land 0xff - else - aux (i-1) (accu+(int_of_char str.[i])) - in aux (String.length str - 2) 0 - -let parse_line str = - let str = string_of_hexline str in - let get i = int_of_char str.[i] in - let n = String.length str in - assert (n >= 5 && compute_checksum str = int_of_char str.[n-1]); - let count = get 0 in - assert (count+5 = n); - let address = ((get 1) lsl 8) lor (get 2) in - let record_type = get 3 in - let data = String.sub str 4 count in - match record_type with - | 0x00 -> - Data (address, data) - | 0x01 -> - assert (count = 0); - EndOfFile address - | 0x04 -> - assert (count = 2 && address = 0); - let msb = int_of_char data.[0] and lsb = int_of_char data.[1] in - (* check for possible overflow *) - assert (msb land 0x80 = 0); - ExtendedLinearAddress ((msb lsl 8) lor lsb) - | _ -> assert false - -let parse_file fi le = - let ic = Lwt_io.open_file ~mode:input file in - let lines = Lwt_io.read_lines ic in - let lines = Lwt_stream.map parse_line lines in - lwt lines = Lwt_stream.get_while (fun _ -> true) lines in - lwt _ = Lwt_io.close ic in - return lines - -let print_record = function - | Data (address, data) -> - Printf.printf "DAT %04x" address; - String.iter (fun c -> Printf.printf " %02x" (int_of_char c)) data; - Printf.printf "\n" - | ExtendedLinearAddress address -> - Printf.printf "ELA %04x\n" address - | EndOfFile address -> - Printf.printf "EOF %04x\n" address - -let validate_and_copy hex addr_base buffer offset length = - assert (offset+length <= String.length buffer); - let min_address = addr_base+offset in - let max_address = min_address+length in - let addr_high = ref 0 in - let execute_record = function - | Data (address, data) -> - assert (address land 0xFFFF = address); - let address = !addr_high lor address in - if address < min_address || address >= max_address then - Printf.eprintf - "0x%04x is outside range, all bytes dropped\n" - address - else begin - let length = - let n = String.length data in - if address+n >= max_address then begin - Printf.eprintf - "some bytes at address 0x%04x are outside range (dropped)\n" - address; - max_address-address - end else n - in - let offset2 = address-addr_base in - String.blit data 0 buffer offset2 length; - end - | ExtendedLinearAddress address -> - assert (address land 0x8000 = 0); - addr_high := address lsl 16 - | EndOfFile address -> - assert (address = 0); - raise Exit - in - try List.iter execute_record hex with Exit -> () diff --git a/PC_Mainboard/card-tools/src/hexfile.mli b/PC_Mainboard/card-tools/src/hexfile.mli deleted file mode 100644 index c6fa563..0000000 --- a/PC_Mainboard/card-tools/src/hexfile.mli +++ /dev/null @@ -1,26 +0,0 @@ -(* - * hexfile.mli - * ----------- - * Copyright : (c) 2009, Stéphane Glondu <st...@gl...> - * Licence : BSD3 - * - * This file is a part of Krobot. - *) - -type hex_record = - | Data of int * string - | ExtendedLinearAddress of int - | EndOfFile of int - -val parse_file : string -> hex_record list Lwt.t - -val print_record : hex_record -> unit - (** Prints one record on standard output. *) - -val validate_and_copy : hex_record list -> int -> string -> int -> int -> unit - (** [validate_and_copy hex addr_base buffer offset length] copies - the contents of the (parsed) [hex] file to [buffer]. [offset] - and [length] denote the valid range inside [buffer] that can be - written. [addr_base] is the address [buffer] is mapped to on the - microcontroller. Bytes outside the range are ignored (and a - warning is printed on standard error. *) diff --git a/PC_Mainboard/card-tools/src/myocamlbuild.ml b/PC_Mainboard/card-tools/src/myocamlbuild.ml deleted file mode 100644 index 593f6b9..0000000 --- a/PC_Mainboard/card-tools/src/myocamlbuild.ml +++ /dev/null @@ -1,126 +0,0 @@ -(* - * myocamlbuild.ml - * --------------- - * Copyright : (c) 2009, Jeremie Dimino <je...@di...> - * Licence : BSD3 - * - * This file is a part of [kro]bot. - *) - -open Printf -open Ocamlbuild_plugin - -(* +-----------------------------------------------------------------+ - | Ocamlfind | - +-----------------------------------------------------------------+ *) - -(* Put here packages you may use in this project: *) -let packages = [ - "type-conv"; - "type-conv.syntax"; - "camlp4"; - "camlp4.extend"; - "camlp4.lib"; - "camlp4.macro"; - "camlp4.quotations.o"; - "camlp4.quotations.r"; - "lwt"; - "lwt.unix"; - "lwt.syntax"; - "lwt.syntax.log"; - "lwt.text"; - "text"; - "text.pcre"; - "str"; - "xmlm"; - "react"; - "usb"; - "obus"; - "obus.syntax"; - "bitstring"; - "bitstring.syntax"; - "sdl"; -] - -(* List of available syntaxes :*) -let syntaxes = [ - "camlp4o"; - "camlp4r"; -] - -(* +-----------------------------------------------------------------+ - | Utils | - +-----------------------------------------------------------------+ *) - -let flag_all_stages_except_link tag f = - flag ["ocaml"; "compile"; tag] f; - flag ["ocaml"; "ocamldep"; tag] f; - flag ["ocaml"; "doc"; tag] f - -let flag_all_stages tag f = - flag_all_stages_except_link tag f; - flag ["ocaml"; "link"; tag] f - -let _ = - dispatch begin function - | Before_options -> - - (* override default commands by ocamlfind ones *) - let ocamlfind x = S[A"ocamlfind"; A x] in - Options.ocamlc := ocamlfind "ocamlc"; - Options.ocamlopt := ocamlfind "ocamlopt"; - Options.ocamldep := ocamlfind "ocamldep"; - (* FIXME: sometimes ocamldoc say that elements are not found - even if they are present: *) - Options.ocamldoc := S[A"ocamlfind"; A"ocamldoc"; A"-hide-warnings"] - - | After_rules -> - - (* D-Bus drivers can see the lowlevel interfaces *) - Pathname.define_context "dbus-drivers" [ "usb" ]; - - (* Génération du fichier contenant les détails du protocol à - partir du fichier .h *) - rule "protocol du krobot" ~dep:"PcInterface.h" ~prod:"protocol.ml" - (fun _ _ -> - Cmd(S[Sh"awk '$1 == \"#define\" && $3 != \"\" { print \"let \" tolower($2) \" = \" $3 }' PcInterface.h > protocol.ml"])); - - (* +---------------------------------------------------------+ - | Virtual targets | - +---------------------------------------------------------+ *) - - let virtual_rule name deps = - rule name ~stamp:name ~deps (fun _ _ -> Nop) - in - - virtual_rule "all" [ - "lib-krobot/krobot.cma"; - "lib-krobot/krobot.cmxa"; - "tools/status.native"; - "tools/controller.native"; - "remote/forward_dbus.native"; - "tools/joy_control.native"; - ]; - - (* +---------------------------------------------------------+ - | Ocamlfind stuff | - +---------------------------------------------------------+ *) - - (* When one link an OCaml binary, one should use -linkpkg *) - flag ["ocaml"; "link"; "program"] & A"-linkpkg"; - - (* For each ocamlfind package one inject the -package option - when compiling, computing dependencies, generating - documentation and linking. *) - List.iter - (fun package -> flag_all_stages ("pkg_" ^ package) (S[A"-package"; A package])) - packages; - - (* Like -package but for extensions syntax. Morover -syntax is - useless when linking. *) - List.iter - (fun syntax -> flag_all_stages_except_link ("syntax_" ^ syntax) (S[A"-syntax"; A syntax])) - syntaxes; - - | _ -> () - end diff --git a/PC_Mainboard/card-tools/src/send_firmware.ml b/PC_Mainboard/card-tools/src/send_firmware.ml deleted file mode 100644 index 1dedd01..0000000 --- a/PC_Mainboard/card-tools/src/send_firmware.ml +++ /dev/null @@ -1,69 +0,0 @@ -(* - * send_firmware.ml - * ---------------- - * Copyright : (c) 2009, Stéphane Glondu <st...@gl...> - * Licence : BSD3 - * - * This file is a part of Krobot. - *) - -open Lwt -open Lwt_io - -let do_flash force filename = - lwt hex = Hexfile.parse_file filename in - let memory = - let buffer = String.make 0x8000 '\255' in - Hexfile.validate_and_copy hex 0x0 buffer 0 0x8000; - buffer - in - let firmware_name = Boardname.get_board_name memory in - lwt () = match firmware_name with - | Some s -> printf "Detected firmware: %S\n" s - | None -> printf "Unable to identify firmware!\n" - in - let address = 0x800 and length = 0x8000-0x800 in - lwt k = Bootloader.open_card () in - lwt () = printf "Card opened\n" in - lwt data = Bootloader.get_flash k ~address:0x0 ~length:0x8000 in - let board_name = Boardname.get_board_name data in - lwt () = match board_name with - | Some s -> printf "Detected card: %S\n" s - | None -> printf "Unable to identify card!\n" - in - lwt () = - if not force && (board_name = None || firmware_name = None || board_name <> firmware_name) then begin - lwt () = eprintf "board name and firmware name do not match, use --force\n" in - exit 1 - end else return () - in - lwt () = Bootloader.erase_flash k ~address ~length in - lwt () = printf "Flash erased\n" in - lwt () = Bootloader.write_flash k ~address memory address length in - lwt () = printf "Flashing completed\n" in - return () - -let _ = - let force = ref false in - let filename = ref None in - let speclist = [ - "--force", Arg.Set force, "Force flashing even if board id and firmware id do not match"; - ] in - Arg.parse speclist - (fun s -> - match !filename with - | None -> filename := Some s - | Some _ -> raise (Arg.Bad s)) - "Send a firmware to a board in bootloader mode"; - let filename = match !filename with - | None -> Printf.eprintf "You must specify a .hex file!\n"; exit 1 - | Some s -> s - in - Lwt_main.run - (try_lwt - do_flash !force filename - with - | Bootloader.Error e -> - eprintl (Bootloader.string_of_error e) - | e -> - eprintl (Printexc.to_string e)) diff --git a/PC_Mainboard/card_tools/boardname.mli b/PC_Mainboard/card_tools/boardname.mli new file mode 100644 index 0000000..23b0032 --- /dev/null +++ b/PC_Mainboard/card_tools/boardname.mli @@ -0,0 +1,12 @@ +(* + * boardname.mli + * ------------- + * Copyright : (c) 2009, Stéphane Glondu <st...@gl...> + * Licence : BSD3 + * + * This file is a part of Krobot. + *) + +val get_board_name : string -> string option + (** [get_board_name dump] recherche dans le [dump] mémoire (peut + être également un fichier .hex chargé) le nom de la carte. *) diff --git a/PC_Mainboard/card_tools/boardname.mll b/PC_Mainboard/card_tools/boardname.mll new file mode 100644 index 0000000..30f99cf --- /dev/null +++ b/PC_Mainboard/card_tools/boardname.mll @@ -0,0 +1,22 @@ +(* + * boardname.mll + * ------------- + * Copyright : (c) 2009, Stéphane Glondu <st...@gl...> + * Licence : BSD3 + * + * This file is a part of Krobot. + *) + + +let boardname_regex = ("Carte " | "Robot Interface") [^'\n']+ + +rule boardname = parse + | (boardname_regex as name) '\n' { Some name } + | _ { boardname lexbuf } + | eof { None } + +{ + let get_board_name str = + let lexbuf = Lexing.from_string str in + boardname lexbuf +} diff --git a/PC_Mainboard/card_tools/bootloader.ml b/PC_Mainboard/card_tools/bootloader.ml new file mode 100644 index 0000000..28044cc --- /dev/null +++ b/PC_Mainboard/card_tools/bootloader.ml @@ -0,0 +1,184 @@ +(* + * bootloader.ml + * ------------- + * Copyright : (c) 2009, Stéphane Glondu <st...@gl...> + * Licence : BSD3 + * + * This file is a part of Krobot. + *) + +open Lwt +open Lwt_io + +(* Code très inspiré de kard.ml, mais mis à part car le mode de + communication avec la carte est différent (bulk au lieu + d'interrupt). *) + +type t = { + mutable is_open : bool; + (* La carte est-elle ouverte ? *) + + handle : USB.handle; + (* Handle pour le périphérique usb *) + + kernel_active : bool; + (* Est-ce qu'un driver noyau était attaché à la carte avant qu'on + l'utilise ? *) +} + +type error = + | IncompleteWrite of int * int + | IncompleteRead of int * int + | UnexpectedReply of string * string + | WriteError of string * string + +let string_of_error = function + | IncompleteWrite (a, b) -> Printf.sprintf "%d byte(s) written instead of %d" a b + | IncompleteRead (a, b) -> Printf.sprintf "%d byte(s) read instead of %d" a b + | UnexpectedReply (a, b) -> Printf.sprintf "received unexpected reply %S instead of %S" a b + | WriteError (a, b) -> Printf.sprintf "written: %S, read back: %S" a b + +exception Error of error + +let failwith e = fail (Error e) + +let close k = + if k.is_open then begin + lwt _ = USB.release_interface k.handle 0 in + lwt _ = USB.reset_device k.handle in + (*if k.kernel_active then USB.attach_kernel_driver k.handle 0;*) + (*USB.close k.handle;*) + k.is_open <- false; + return () + end else return () + +let open_card () = + let handle = USB.open_device_with + ~vendor_id:Protocol.usb_vid + ~product_id:Protocol.usb_pid_bootloader + in + let kernel_active = USB.kernel_driver_active handle 0 in + if kernel_active then USB.detach_kernel_driver handle 0; + lwt _ = USB.set_configuration handle 1 in + lwt _ = USB.claim_interface handle 0 in + let k = { is_open = true; + handle = handle; + kernel_active = kernel_active } in + let _ = Lwt_sequence.add_l (fun _ -> close k) Lwt_main.exit_hooks in + return k + +let header_length = 5 + +let put_message buffer cmd length address data = + let body_length = String.length data in + assert (String.length buffer >= header_length+body_length); + let set i n = buffer.[i] <- char_of_int n in + set 0 cmd; + assert (length < 0x100); + set 1 length; + assert (address <= 0x1000000); + set 2 (address land 0xff); + set 3 ((address lsr 8) land 0xff); + set 4 ((address lsr 16) land 0xff); + String.blit data 0 buffer 5 body_length + +let send_receive_packet k send_buffer send_length receive_buffer receive_length send_delay receive_delay = + let handle = k.handle and endpoint = 1 in + lwt sent = USB.bulk_send ~handle ~endpoint ~timeout:1. send_buffer 0 send_length in + if sent <> send_length then + failwith (IncompleteWrite (sent, send_length)) + else begin + lwt received = USB.bulk_recv ~handle ~endpoint ~timeout:3. receive_buffer 0 receive_length in + if received <> receive_length then + failwith (IncompleteRead (received, receive_length)) + else + return () + end + +let get_flash k ~address ~length = + let response_length = 64 in + let increment = response_length-header_length in + assert (increment < 256); + let send_buffer = String.create header_length in + let receive_buffer = String.create response_length in + let result_buffer = String.create length in + let rec loop offset total_length = + if total_length <= 0 then + return result_buffer + else begin + let length = min increment total_length in + let response_length = length+header_length in + let address = address+offset in + put_message send_buffer Protocol.read_flash length address ""; + lwt () = send_receive_packet k send_buffer header_length receive_buffer response_length 1. 3. in + let receive_header = String.sub receive_buffer 0 header_length in + if receive_header <> send_buffer then + failwith (UnexpectedReply (receive_header, send_buffer)) + else begin + String.blit receive_buffer header_length result_buffer offset length; + loop (offset+length) (total_length-length); + end + end + in loop 0 length + +let erase_flash k ~address ~length = + let response_length = 1 in + (* les effacements se font par blocs de 64 octets *) + let increment = 64 in + let send_buffer = String.create header_length in + let receive_buffer = String.create response_length in + let rec loop offset total_length = + if total_length <= 0 then + return () + else begin + let address = address+offset in + put_message send_buffer Protocol.erase_flash 1 address ""; + lwt () = send_receive_packet k send_buffer header_length receive_buffer response_length 1. 5. in + if int_of_char receive_buffer.[0] <> Protocol.erase_flash then + failwith (UnexpectedReply (receive_buffer, String.make 1 (char_of_int Protocol.erase_flash))) + else + loop (offset+increment) (total_length-increment); + end + in loop 0 length + +let reference = String.make 16 '\255' + +let write_flash k ~address data offset length = + let send_length = 64 and receive_length = 1 in + (* les écritures se font par blocs de 16 octets *) + let increment = 16 in + let send_buffer = String.create send_length in + let receive_buffer = String.create receive_length in + let rec loop address offset total_length = + (* address: sur le PIC, offset: dans data, total_length: taille restante *) + if total_length <= 0 then + return () + else begin + let packet = String.make increment '\255' in + String.blit data offset packet 0 (min total_length increment); + if packet = reference then begin + (* le paquet n'a pas de contenu, on l'ignore *) + (* lwt () = printf "Skipping address 0x%06X...\n" address in *) + loop (address+increment) (offset+increment) (total_length-increment) + end else begin + (* lwt () = printf "Processing address 0x%06X...\n" address in *) + put_message send_buffer Protocol.write_flash increment address packet; + lwt () = send_receive_packet k send_buffer send_length receive_buffer receive_length 0.5 1. in + if int_of_char receive_buffer.[0] <> Protocol.write_flash then + failwith (UnexpectedReply (receive_buffer, String.make 1 (char_of_int Protocol.erase_flash))) + else begin + lwt written = get_flash k ~address ~length:increment in + if written <> packet then + failwith (WriteError (packet, written)) + else + loop (address+increment) (offset+increment) (total_length-increment) + end + end + end + in loop address offset length + +let reset_board k = + let send_buffer = String.create 64 and receive_buffer = String.create 64 in + send_buffer.[0] <- char_of_int Protocol.reset; + lwt () = send_receive_packet k send_buffer 1 receive_buffer 64 5. 5. in + return () diff --git a/PC_Mainboard/card_tools/dump_memory.ml b/PC_Mainboard/card_tools/dump_memory.ml new file mode 100644 index 0000000..5c746e0 --- /dev/null +++ b/PC_Mainboard/card_tools/dump_memory.ml @@ -0,0 +1,30 @@ +(* + * dump_memory.ml + * -------------- + * Copyright : (c) 2009, Stéphane Glondu <st...@gl...> + * Licence : BSD3 + * + * This file is a part of Krobot. + *) + +open Printf +open Lwt +open Lwt_io + +let main = + lwt k = Bootloader.open_card () in + try_lwt + lwt data = Bootloader.get_flash k ~address:0x0 ~length:0x8000 in + let msg = match Boardname.get_board_name data with + | Some s -> sprintf "Board: %S" s + | None -> "Unable to identify board!" + in + lwt () = eprintlf "%s" msg in + (if Unix.isatty Unix.stdout then hexdump else write) stdout data >> flush stdout + with + | Bootloader.Error e -> + eprintlf "%s" (Bootloader.string_of_error e) + | e -> + eprintlf "%s" (Printexc.to_string e) + +let _ = Lwt_main.run main diff --git a/PC_Mainboard/card_tools/hexfile.ml b/PC_Mainboard/card_tools/hexfile.ml new file mode 100644 index 0000000..a667957 --- /dev/null +++ b/PC_Mainboard/card_tools/hexfile.ml @@ -0,0 +1,112 @@ +(* + * hexfile.ml + * ---------- + * Copyright : (c) 2009, Stéphane Glondu <st...@gl...> + * Licence : BSD3 + * + * This file is a part of Krobot. + *) + +open Lwt +open Lwt_io + +type hex_record = + | Data of int * string + | ExtendedLinearAddress of int + | EndOfFile of int + +let string_of_hexline str = + let n = String.length str in + assert (n > 0 && n mod 2 = 1 && str.[0] = ':'); + let m = n/2 in + let result = String.create m in + for i = 0 to m-1 do + let j = 2*i+1 in + result.[i] <- char_of_int (int_of_string ("0x"^(String.sub str j 2))) + done; + result + +let compute_checksum str = + let rec aux i accu = + if i < 0 then + (-accu) land 0xff + else + aux (i-1) (accu+(int_of_char str.[i])) + in aux (String.length str - 2) 0 + +let parse_line str = + let str = string_of_hexline str in + let get i = int_of_char str.[i] in + let n = String.length str in + assert (n >= 5 && compute_checksum str = int_of_char str.[n-1]); + let count = get 0 in + assert (count+5 = n); + let address = ((get 1) lsl 8) lor (get 2) in + let record_type = get 3 in + let data = String.sub str 4 count in + match record_type with + | 0x00 -> + Data (address, data) + | 0x01 -> + assert (count = 0); + EndOfFile address + | 0x04 -> + assert (count = 2 && address = 0); + let msb = int_of_char data.[0] and lsb = int_of_char data.[1] in + (* check for possible overflow *) + assert (msb land 0x80 = 0); + ExtendedLinearAddress ((msb lsl 8) lor lsb) + | _ -> assert false + +let parse_file file = + let ic = Lwt_io.open_file ~mode:input file in + let lines = Lwt_io.read_lines ic in + let lines = Lwt_stream.map parse_line lines in + lwt lines = Lwt_stream.get_while (fun _ -> true) lines in + lwt _ = Lwt_io.close ic in + return lines + +let print_record = function + | Data (address, data) -> + Printf.printf "DAT %04x" address; + String.iter (fun c -> Printf.printf " %02x" (int_of_char c)) data; + Printf.printf "\n" + | ExtendedLinearAddress address -> + Printf.printf "ELA %04x\n" address + | EndOfFile address -> + Printf.printf "EOF %04x\n" address + +let validate_and_copy hex addr_base buffer offset length = + assert (offset+length <= String.length buffer); + let min_address = addr_base+offset in + let max_address = min_address+length in + let addr_high = ref 0 in + let execute_record = function + | Data (address, data) -> + assert (address land 0xFFFF = address); + let address = !addr_high lor address in + if address < min_address || address >= max_address then + Printf.eprintf + "0x%04x is outside range, all bytes dropped\n" + address + else begin + let length = + let n = String.length data in + if address+n >= max_address then begin + Printf.eprintf + "some bytes at address 0x%04x are outside range (dropped)\n" + address; + max_address-address + end else n + in + let offset2 = address-addr_base in + String.blit data 0 buffer offset2 length; + end + | ExtendedLinearAddress address -> + assert (address land 0x8000 = 0); + addr_high := address lsl 16 + | EndOfFile address -> + assert (address = 0); + raise Exit + in + try List.iter execute_record hex with Exit -> () diff --git a/PC_Mainboard/card_tools/hexfile.mli b/PC_Mainboard/card_tools/hexfile.mli new file mode 100644 index 0000000..c6fa563 --- /dev/null +++ b/PC_Mainboard/card_tools/hexfile.mli @@ -0,0 +1,26 @@ +(* + * hexfile.mli + * ----------- + * Copyright : (c) 2009, Stéphane Glondu <st...@gl...> + * Licence : BSD3 + * + * This file is a part of Krobot. + *) + +type hex_record = + | Data of int * string + | ExtendedLinearAddress of int + | EndOfFile of int + +val parse_file : string -> hex_record list Lwt.t + +val print_record : hex_record -> unit + (** Prints one record on standard output. *) + +val validate_and_copy : hex_record list -> int -> string -> int -> int -> unit + (** [validate_and_copy hex addr_base buffer offset length] copies + the contents of the (parsed) [hex] file to [buffer]. [offset] + and [length] denote the valid range inside [buffer] that can be + written. [addr_base] is the address [buffer] is mapped to on the + microcontroller. Bytes outside the range are ignored (and a + warning is printed on standard error. *) diff --git a/PC_Mainboard/card_tools/send_firmware.ml b/PC_Mainboard/card_tools/send_firmware.ml new file mode 100644 index 0000000..1dedd01 --- /dev/null +++ b/PC_Mainboard/card_tools/send_firmware.ml @@ -0,0 +1,69 @@ +(* + * send_firmware.ml + * ---------------- + * Copyright : (c) 2009, Stéphane Glondu <st...@gl...> + * Licence : BSD3 + * + * This file is a part of Krobot. + *) + +open Lwt +open Lwt_io + +let do_flash force filename = + lwt hex = Hexfile.parse_file filename in + let memory = + let buffer = String.make 0x8000 '\255' in + Hexfile.validate_and_copy hex 0x0 buffer 0 0x8000; + buffer + in + let firmware_name = Boardname.get_board_name memory in + lwt () = match firmware_name with + | Some s -> printf "Detected firmware: %S\n" s + | None -> printf "Unable to identify firmware!\n" + in + let address = 0x800 and length = 0x8000-0x800 in + lwt k = Bootloader.open_card () in + lwt () = printf "Card opened\n" in + lwt data = Bootloader.get_flash k ~address:0x0 ~length:0x8000 in + let board_name = Boardname.get_board_name data in + lwt () = match board_name with + | Some s -> printf "Detected card: %S\n" s + | None -> printf "Unable to identify card!\n" + in + lwt () = + if not force && (board_name = None || firmware_name = None || board_name <> firmware_name) then begin + lwt () = eprintf "board name and firmware name do not match, use --force\n" in + exit 1 + end else return () + in + lwt () = Bootloader.erase_flash k ~address ~length in + lwt () = printf "Flash erased\n" in + lwt () = Bootloader.write_flash k ~address memory address length in + lwt () = printf "Flashing completed\n" in + return () + +let _ = + let force = ref false in + let filename = ref None in + let speclist = [ + "--force", Arg.Set force, "Force flashing even if board id and firmware id do not match"; + ] in + Arg.parse speclist + (fun s -> + match !filename with + | None -> filename := Some s + | Some _ -> raise (Arg.Bad s)) + "Send a firmware to a board in bootloader mode"; + let filename = match !filename with + | None -> Printf.eprintf "You must specify a .hex file!\n"; exit 1 + | Some s -> s + in + Lwt_main.run + (try_lwt + do_flash !force filename + with + | Bootloader.Error e -> + eprintl (Bootloader.string_of_error e) + | e -> + eprintl (Printexc.to_string e)) diff --git a/PC_Mainboard/clients/Makefile b/PC_Mainboard/clients/Makefile deleted file mode 100644 index 56af001..0000000 --- a/PC_Mainboard/clients/Makefile +++ /dev/null @@ -1,23 +0,0 @@ -# Makefile -# -------- -# Copyright : (c) 2009, Jeremie Dimino <je...@di...> -# Licence : BSD3 -# -# This file is a part of [kro]bot. - -PREFIX=/usr/local - -OC = ocamlbuild -OF = ocamlfind - -ifeq ($(TERM),dumb) -OC += -classic-display -endif - -.PHONY: all -all: - $(OC) all - -.PHONY: clean -clean: - $(OC) -clean diff --git a/PC_Mainboard/clients/_tags b/PC_Mainboard/clients/_tags deleted file mode 100644 index c23ac4f..0000000 --- a/PC_Mainboard/clients/_tags +++ /dev/null @@ -1,15 +0,0 @@ -# -*- conf -*- - -# Syntax extensions -<**/*.ml>: syntax_camlp4o, pkg_camlp4, pkg_lwt.syntax, pkg_lwt.... [truncated message content] |
From: Jérémie D. <Ba...@us...> - 2010-02-11 08:14:40
|
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 5dfa179cb90bb249bdbccdf7d1e18818a9854581 (commit) from 5fb766cfa9a3523c9143ff2aae1e0b3cd343b693 (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 5dfa179cb90bb249bdbccdf7d1e18818a9854581 Author: Jérémie Dimino <je...@di...> Date: Thu Feb 11 09:14:13 2010 +0100 [clients] enable conditionnal compilation ----------------------------------------------------------------------- Changes: diff --git a/PC_Mainboard/clients/myocamlbuild.ml b/PC_Mainboard/clients/myocamlbuild.ml index 5da00b7..c1df199 100644 --- a/PC_Mainboard/clients/myocamlbuild.ml +++ b/PC_Mainboard/clients/myocamlbuild.ml @@ -11,6 +11,53 @@ open Printf open Ocamlbuild_plugin (* +-----------------------------------------------------------------+ + | Configuration | + +-----------------------------------------------------------------+ *) + +let try_exec command = + try + let () = Command.execute ~quiet:true (Cmd(S[Sh command; Sh"> /dev/null"; Sh"2> /dev/null"])) in + true + with _ -> + false + +let () = + if not (try_exec "ocamlfind printconf") then begin + prerr_endline "ocamlfind is not available, please install it"; + exit 1 + end + +let have_native = try_exec "ocamlfind ocamlopt -version" +let have_sdl = try_exec "ocamlfind query sdl" +let have_obus = try_exec "ocamlfind query obus" +let have_lwt_text = try_exec "ocamlfind query lwt.text" + +let () = + let yes_no = function true -> "yes" | false -> "no" in + printf "\ ++--[ compilation options ]----------+ +| native compilation: %3s | +| SDL (joystick): %3s | +| OBus: %3s | +| Lwt.text %3s | ++-----------------------------------+ +%!" (yes_no have_native) + (yes_no have_sdl) + (yes_no have_obus) + (yes_no have_lwt_text) + +let targets = List.filter_opt (function (true, target) -> Some target | (false, target) -> None) [ + (have_obus, "lib-krobot/krobot.cma"); + (have_obus && have_native, "lib-krobot/krobot.cmxa"); + (have_obus, "tools/status.best"); + (have_obus && have_lwt_text, "tools/controller.best"); + (have_obus, "remote/forward_dbus.best"); + (have_obus && have_sdl, "tools/joy_control.best"); + (have_obus, "security/hard_stop.best"); + (have_obus, "tools/init_position.best"); +] + +(* +-----------------------------------------------------------------+ | Ocamlfind | +-----------------------------------------------------------------+ *) @@ -89,20 +136,18 @@ let _ = | Virtual targets | +---------------------------------------------------------+ *) + if have_native then + rule "best" ~dep:"%.native" ~prod:"%.best" + (fun env _ -> cp (env "%.native") (env "%.best")) + else + rule "best" ~dep:"%.byte" ~prod:"%.best" + (fun env _ -> cp (env "%.byte") (env "%.best")); + let virtual_rule name deps = rule name ~stamp:name ~deps (fun _ _ -> Nop) in - virtual_rule "all" [ - "lib-krobot/krobot.cma"; - "lib-krobot/krobot.cmxa"; - "tools/status.native"; - "tools/controller.native"; - "remote/forward_dbus.native"; - "tools/joy_control.native"; - "security/hard_stop.native"; - "tools/init_position.native"; - ]; + virtual_rule "all" targets; (* +---------------------------------------------------------+ | Ocamlfind stuff | hooks/post-receive -- krobot |
From: Jérémie D. <Ba...@us...> - 2010-02-11 07:34:17
|
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 5fb766cfa9a3523c9143ff2aae1e0b3cd343b693 (commit) via fea2e32147df3277fb54354c019fe6ec2ae60d8f (commit) from 17aec75ed2e973313bb0f7f2a877fa243ff045c1 (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 5fb766cfa9a3523c9143ff2aae1e0b3cd343b693 Author: Jérémie Dimino <je...@di...> Date: Thu Feb 11 08:33:24 2010 +0100 [driver] also stop motors on collision when manually controlled commit fea2e32147df3277fb54354c019fe6ec2ae60d8f Author: Jérémie Dimino <je...@di...> Date: Thu Feb 11 08:12:11 2010 +0100 [driver] wait only for TRAJ_COMPLETED when moving ----------------------------------------------------------------------- Changes: diff --git a/PC_Mainboard/driver/src/driver.ml b/PC_Mainboard/driver/src/driver.ml index c445926..1c2200c 100644 --- a/PC_Mainboard/driver/src/driver.ml +++ b/PC_Mainboard/driver/src/driver.ml @@ -264,6 +264,14 @@ struct commands : int React.event; (* CMD_TRAJ commands sent by the card *) + + traj_completed : int React.event; + (* Event which occurs each time a TRAJ_COMPLETED command is + received *) + + mutable speed_left : int; + mutable speed_right : int; + (* Speed when manually controlled (by the joystick for example) *) } module OBus = OBus_object.Make(struct @@ -288,6 +296,10 @@ struct dev.move_state <- Ms_static; wakeup wakener () + let reset_speed dev = + dev.speed_left <- 0; + dev.speed_right <- 0 + let move dev dist speed acc = Log#info "motor: move(dist=%d, speed=%d, acc=%d)" dist speed acc; match dev.move_state with @@ -298,10 +310,11 @@ struct if (dist > 0 && date < dev.inhibit_forward_until) || (dist < 0 && date < dev.inhibit_backward_until) then fail (Failure "inhibited move") else begin + reset_speed dev; let waiter, wakener = wait () in dev.move_state <- Ms_moving(wakener, if dist > 0 then `Forward else `Backward); lwt () = Commands.Motor.move dev.card dist speed acc in - lwt result = select [Lwt_event.next dev.commands >> return `OK; waiter >> return `Stopped] in + lwt result = select [Lwt_event.next dev.traj_completed >> return `OK; waiter >> return `Stopped] in dev.move_state <- Ms_static; return result end @@ -312,10 +325,11 @@ struct | Ms_moving _ -> fail (Failure "already moving") | Ms_static -> + reset_speed dev; let waiter, wakener = wait () in dev.move_state <- Ms_moving(wakener, `Turn); lwt () = Commands.Motor.turn dev.card angle speed acc in - lwt result = select [Lwt_event.next dev.commands >> return `OK; waiter >> return `Stopped] in + lwt result = select [Lwt_event.next dev.traj_completed >> return `OK; waiter >> return `Stopped] in dev.move_state <- Ms_static; return result @@ -354,19 +368,24 @@ struct let set_speed dev motor speed acc = Log#info "motor: set_speed(motor=%s, speed=%d, acc=%d)" (string_of_motor motor) speed acc; stop_move dev; - let dir, speed = if speed < 0 then (`Backward, -speed) else (`Forward, speed) in + let dir, abs_speed = if speed < 0 then (`Backward, -speed) else (`Forward, speed) in let date = Unix.gettimeofday () in if (dir = `Forward && date < dev.inhibit_forward_until) || (dir = `Backward && date < dev.inhibit_backward_until) then fail (Failure "inhibited move") - else + else begin + if motor = `Both || motor = `Left then + dev.speed_left <- speed; + if motor = `Both || motor = `Right then + dev.speed_right <- speed; lwt () = if acc <> dev.acceleration then begin dev.acceleration <- acc; - Commands.Motor.traj_new_velocity dev.card motor speed acc dir + Commands.Motor.traj_new_velocity dev.card motor abs_speed acc dir end else - Commands.Motor.traj_change_velocity dev.card motor speed dir + Commands.Motor.traj_change_velocity dev.card motor abs_speed dir in Commands.Motor.traj_start dev.card motor + end OL_method StopMotors : motor -> stop_mode -> unit OL_method SetSpeed : motor -> int -> int -> unit @@ -392,6 +411,8 @@ struct match dev.move_state with | Ms_moving(_, `Forward) -> stop_motors dev `Both `Smooth + | Ms_static when dev.speed_left > 0 || dev.speed_right > 0 -> + stop_motors dev `Both `Smooth | _ -> return () @@ -403,10 +424,13 @@ struct match dev.move_state with | Ms_moving(_, `Backward) -> stop_motors dev `Both `Smooth + | Ms_static when dev.speed_left < 0 || dev.speed_right < 0 -> + stop_motors dev `Both `Smooth | _ -> return () let make card path = + let commands = React.E.map (fun data -> Char.code data.[0]) (Card.connect card Protocol.cmd_traj)#event in let dev = { obus = OBus_object.make path; card = card; @@ -415,7 +439,10 @@ struct inhibit_forward_until = 0.0; inhibit_backward_until = 0.0; move_state = Ms_static; - commands = React.E.map (fun data -> Char.code data.[0]) (Card.connect card Protocol.cmd_traj)#event; + commands = commands; + traj_completed = React.E.filter ((=) Protocol.traj_completed) commands; + speed_left = 0; + speed_right = 0; } in dev.state <- React.S.map (fun state -> dev.acceleration <- 0) (Card.state card); dev hooks/post-receive -- krobot |
From: Jérémie D. <Ba...@us...> - 2010-02-11 00:31:21
|
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 17aec75ed2e973313bb0f7f2a877fa243ff045c1 (commit) via dc723ce8075a0868981993373334c3302af3f7d7 (commit) via ed02672ed43b8f4af8b64a1e50cda62011898637 (commit) from fbbe106af923be6ff62fc6923d0fe773d95ca5cf (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 17aec75ed2e973313bb0f7f2a877fa243ff045c1 Author: Jérémie Dimino <je...@di...> Date: Thu Feb 11 01:15:10 2010 +0100 [client-tools] record movement results commit dc723ce8075a0868981993373334c3302af3f7d7 Author: Jérémie Dimino <je...@di...> Date: Thu Feb 11 01:02:55 2010 +0100 typo need to go to bed... commit ed02672ed43b8f4af8b64a1e50cda62011898637 Author: Jérémie Dimino <je...@di...> Date: Thu Feb 11 00:59:11 2010 +0100 rewrite movement/blocking stuff ----------------------------------------------------------------------- Changes: diff --git a/PC_Mainboard/clients/lib-krobot/krobot.ml b/PC_Mainboard/clients/lib-krobot/krobot.ml index eacc4da..e45b1c3 100644 --- a/PC_Mainboard/clients/lib-krobot/krobot.ml +++ b/PC_Mainboard/clients/lib-krobot/krobot.ml @@ -168,6 +168,11 @@ OP_method AX12Goto : id : int -> pos : int -> speed : int -> unit include MakeDevice(struct let name = "Motors" end) type motor = [ `Left | `Right | `Both ] +type move_result = [ `OK | `Stopped ] + +let obus_move_result = OBus_type.mapping obus_int + [(`OK, 0); + (`Stopped, 1)] let obus_motor = OBus_type.mapping obus_int [(`Left, -1); @@ -179,8 +184,8 @@ let obus_stop_mode = OBus_type.mapping obus_int (`Abrupt, 1); (`Smooth, 2)] -OP_method Turn : angle : int -> speed : int -> acc : int -> unit -OP_method Move : dist : int -> speed : int -> acc : int -> unit +OP_method Turn : angle : int -> speed : int -> acc : int -> move_result +OP_method Move : dist : int -> speed : int -> acc : int -> move_result OP_method StopMotors : motor : motor -> mode : stop_mode -> unit OP_method SetSpeed : motor : motor -> speed : int -> acc : int -> unit OP_method InhibitForward : float -> unit diff --git a/PC_Mainboard/clients/lib-krobot/krobot.mli b/PC_Mainboard/clients/lib-krobot/krobot.mli index f5c8a53..ba5ca18 100644 --- a/PC_Mainboard/clients/lib-krobot/krobot.mli +++ b/PC_Mainboard/clients/lib-krobot/krobot.mli @@ -54,8 +54,10 @@ val ax12_goto : t -> id : int -> pos : int -> speed : int -> unit Lwt.t (** {6 Motors} *) -val turn : t -> angle : int -> speed : int -> acc : int -> unit Lwt.t -val move : t -> dist : int -> speed : int -> acc : int -> unit Lwt.t +type move_result = [ `OK | `Stopped ] + +val turn : t -> angle : int -> speed : int -> acc : int -> move_result Lwt.t +val move : t -> dist : int -> speed : int -> acc : int -> move_result Lwt.t type motor = [ `Left | `Right | `Both ] diff --git a/PC_Mainboard/clients/security/hard_stop.ml b/PC_Mainboard/clients/security/hard_stop.ml index 4421cf3..d2ee376 100644 --- a/PC_Mainboard/clients/security/hard_stop.ml +++ b/PC_Mainboard/clients/security/hard_stop.ml @@ -22,37 +22,18 @@ let usage = Printf.sprintf "Usage: %s [-n]\n\noptions are:" (Filename.basename ( type state = OK | Stopped -let state_forward = ref OK -let state_backward = ref OK - let handle_collide krobot sensors = join [ (if Util.front_collide sensors then begin Log#notice "front collision detected, inhibit motors"; - lwt () = Krobot.inhibit_forward krobot duration in - if !state_forward = OK then begin - Log#notice "front: stop motors"; - state_forward := Stopped; - Krobot.stop_motors krobot ~motor:`Both ~mode:`Smooth; - end else - return () - end else begin - state_forward := OK; - return () - end); + Krobot.inhibit_forward krobot duration + end else + return ()); (if Util.back_collide sensors then begin Log#notice "back collision detected, inhibit motors"; - lwt () = Krobot.inhibit_backward krobot duration in - if !state_backward = OK then begin - Log#notice "back: stop motors"; - state_backward := Stopped; - Krobot.stop_motors krobot ~motor:`Both ~mode:`Smooth; - end else - return () - end else begin - state_backward := OK; - return () - end); + Krobot.inhibit_backward krobot duration + end else + return ()); ] lwt () = diff --git a/PC_Mainboard/clients/tools/controller.ml b/PC_Mainboard/clients/tools/controller.ml index 3e36d5d..29d6c3e 100644 --- a/PC_Mainboard/clients/tools/controller.ml +++ b/PC_Mainboard/clients/tools/controller.ml @@ -266,7 +266,7 @@ let rec loop krobot history = else begin let history = Lwt_read_line.add_entry line history in set_engine_state (Engine.init history); - set_logs (line :: React.S.value logs); + Log#notice "%s" line; ignore (Script.exec krobot line); loop krobot history end @@ -297,6 +297,21 @@ lwt () = Unix.dup2 fdw Unix.stderr; Unix.close fdw; ignore (copy_logs (Lwt_io.of_unix_fd ~mode:Lwt_io.input fdr)); + (* Logs to the log window: *) + Lwt_log.default := + Lwt_log.make + ~output:(fun level lines -> + let buffer = Buffer.create 128 in + let lines = + List.map (fun line -> + Buffer.clear buffer; + Lwt_log.render ~buffer ~level ~message:line ~template:"$(date): $(message)"; + Buffer.contents buffer) lines + in + set_logs (lines @ React.S.value logs); + return ()) + ~close:return + (); lwt krobot = Krobot.create () in let signal = React.S.l5 draw diff --git a/PC_Mainboard/clients/tools/init_position.ml b/PC_Mainboard/clients/tools/init_position.ml index f5aec9f..2217b76 100644 --- a/PC_Mainboard/clients/tools/init_position.ml +++ b/PC_Mainboard/clients/tools/init_position.ml @@ -11,26 +11,32 @@ open Lwt +let move_backward_slowly krobot = + Log#notice "moving backward"; + Krobot.move krobot ~dist:(-1000) ~speed:100 ~acc:100 >>= function + | `OK -> + Log#error "where am i ???"; + exit 1 + | `Stopped -> + Log#notice "backward colisiton dectected"; + return () + lwt () = lwt krobot = Krobot.create () in - Log#notice "moving backward"; - lwt () = Krobot.move krobot ~dist:(-1000) ~speed:100 ~acc:100 in - Log#notice "backward colisiton dectected"; + lwt () = move_backward_slowly krobot in Log#notice "going to initial position on first axis"; - lwt () = Lwt_unix.sleep 2.0 in - lwt () = Krobot.move krobot ~dist:Config.initial_position ~speed:400 ~acc:800 in + lwt _ = Krobot.move krobot ~dist:Config.initial_position ~speed:400 ~acc:800 in Log#notice "turning"; - lwt () = Krobot.turn krobot ~angle:(-90) ~speed:400 ~acc:800 in - Log#notice "moving backward"; - lwt () = Krobot.move krobot ~dist:(-1000) ~speed:100 ~acc:50 in - Log#notice "backward colisiton dectected"; + lwt _ = Krobot.turn krobot ~angle:(-90) ~speed:400 ~acc:800 in - Log#notice "going to initial position on second axis"; - lwt () = Krobot.move krobot ~dist:Config.initial_position ~speed:400 ~acc:800 in + lwt () = move_backward_slowly krobot in - lwt () = Lwt_unix.sleep 2.0 in - Krobot.turn krobot ~angle:45 ~speed:400 ~acc:800 + Log#notice "going to initial position on second axis"; + lwt _ = Krobot.move krobot ~dist:Config.initial_position ~speed:400 ~acc:800 in + Log#notice "turning"; + lwt _ = Krobot.turn krobot ~angle:45 ~speed:400 ~acc:800 in + return () diff --git a/PC_Mainboard/clients/tools/script.ml b/PC_Mainboard/clients/tools/script.ml index 69bb06b..3ea209e 100644 --- a/PC_Mainboard/clients/tools/script.ml +++ b/PC_Mainboard/clients/tools/script.ml @@ -97,19 +97,28 @@ let motor_of_string = function | "right" -> `Right | _ -> failwith "Script.motor_of_strig: invalid motor" +let move thread = + thread >>= function + | `OK -> + Log#notice "done"; + return () + | `Stopped -> + Log#notice "stopped"; + return () + let exec krobot line = let action, args = Script_lexer.whole_command (Lexing.from_string line) in let arg_int key default = try int_of_string (List.assoc key args) with Not_found -> default in let arg_string key default = try List.assoc key args with Not_found -> default in match action with | "forward" -> - Krobot.move krobot ~dist:(arg_int "dist" 100) ~speed:(arg_int "speed" 400) ?acc:(arg_int "acc" 800) + move (Krobot.move krobot ~dist:(arg_int "dist" 100) ~speed:(arg_int "speed" 400) ?acc:(arg_int "acc" 800)) | "backward" -> - Krobot.move krobot ~dist:(-(arg_int "dist" 100)) ~speed:(arg_int "speed" 400) ?acc:(arg_int "acc" 800) + move (Krobot.move krobot ~dist:(-(arg_int "dist" 100)) ~speed:(arg_int "speed" 400) ?acc:(arg_int "acc" 800)) | "left" -> - Krobot.turn krobot ~angle:(arg_int "dist" 100) ~speed:(arg_int "speed" 400) ?acc:(arg_int "acc" 800) + move (Krobot.turn krobot ~angle:(arg_int "dist" 100) ~speed:(arg_int "speed" 400) ?acc:(arg_int "acc" 800)) | "right" -> - Krobot.turn krobot ~angle:(-(arg_int "dist" 100)) ~speed:(arg_int "speed" 400) ?acc:(arg_int "acc" 800) + move (Krobot.turn krobot ~angle:(-(arg_int "dist" 100)) ~speed:(arg_int "speed" 400) ?acc:(arg_int "acc" 800)) | "stop-motors" -> Krobot.stop_motors krobot ~motor:(motor_of_string (arg_string "motor" "both")) diff --git a/PC_Mainboard/driver/src/card.ml b/PC_Mainboard/driver/src/card.ml index a3b9cdb..4a2cabf 100644 --- a/PC_Mainboard/driver/src/card.ml +++ b/PC_Mainboard/driver/src/card.ml @@ -74,7 +74,6 @@ let forge_message msg = exception Card_closed module SerialMap = Map.Make(struct type t = serial let compare = compare end) -module CommandMap = Map.Make(struct type t = int let compare = compare end) type state = Running | Opening | Closed @@ -90,12 +89,9 @@ type card = { (* Pool de serial disponibles, comme il n'y a que 256 serial disponibles on évite de juste incrémenter un compteur au pif. *) - mutable reply_waiters : (string Lwt.t * string Lwt.u) SerialMap.t; + mutable reply_waiters : string Lwt.u SerialMap.t; (* Threads en attente d'une réponse *) - mutable command_waiters : (string Lwt.t * string Lwt.u) CommandMap.t; - (* Thread waiting for a command *) - handle : USB.handle; (* Handle pour le périphérique usb *) @@ -125,6 +121,9 @@ type wrapper = { (* Informations needed to reopen the card when it crashes *) name : string; + + events : (int * (string -> unit)) Lwt_sequence.t; + (* Connected events *) } type t = wrapper @@ -195,13 +194,12 @@ let rec reopen_card wakener wrapper = in loop 1); reply_waiters = SerialMap.empty; - command_waiters = CommandMap.empty; handle = handle; kernel_active = kernel_active; mutex = Lwt_mutex.create (); } in set_state wrapper (Ws_running card); - ignore (dispatch card); + ignore (dispatch wrapper card); Lwt.wakeup wakener (); return () with exn -> @@ -212,7 +210,7 @@ let rec reopen_card wakener wrapper = loop true (* Dispatch incomming messages *) -and dispatch card = +and dispatch wrapper card = let buffer = String.create 64 in lwt len = USB.interrupt_recv ~handle:card.handle ~endpoint:1 buffer 0 64 in if len <> 64 then fatal "read <> 64!"; @@ -220,21 +218,23 @@ and dispatch card = if msg.command = Protocol.cmd_respond then begin (* Réponse à un message *) match try Some(SerialMap.find msg.host_serial card.reply_waiters) with Not_found -> None with - | Some (_, w) -> + | Some wakener -> card.reply_waiters <- SerialMap.remove msg.host_serial card.reply_waiters; card.serial_pool <- card.serial_pool @ [msg.host_serial]; - Lwt.wakeup w msg.data + Lwt.wakeup wakener msg.data | None -> Log#warning "response dropped" end else begin - match try Some(CommandMap.find msg.command card.command_waiters) with Not_found -> None with - | Some(_, w) -> - card.command_waiters <- CommandMap.remove msg.command card.command_waiters; - Lwt.wakeup w msg.data - | None -> - Log#warning "command droppped" + Lwt_sequence.iter_l + (fun (command, push) -> + if command = msg.command then + try + push msg.data + with exn -> + Log#exn exn "pushing event %d failed with: " msg.command) + wrapper.events end; - dispatch card + dispatch wrapper card let open_card ~name ~vendor_id ~product_id = let waiter, wakener = Lwt.task () in @@ -246,6 +246,7 @@ let open_card ~name ~vendor_id ~product_id = vendor_id = vendor_id; product_id = product_id; name = name; + events = Lwt_sequence.create (); } in ignore (reopen_card wakener wrapper); wrapper @@ -284,8 +285,8 @@ let rec send_request wrapper command data = card.serial_pool <- l; s in - let (waiter, wakener) as w = Lwt.wait () in - card.reply_waiters <- SerialMap.add serial w card.reply_waiters; + let waiter, wakener = Lwt.wait () in + card.reply_waiters <- SerialMap.add serial wakener card.reply_waiters; let buffer = forge_message { host_serial = serial; device_serial = 0; command = command; @@ -297,10 +298,13 @@ let rec send_request wrapper command data = lwt len = USB.interrupt_send ~handle:card.handle ~endpoint:1 buffer 0 64 in if len <> 64 then fatal "write <> 64!"; waiter) - with exn -> - Log#exn exn "write to %s card failed" wrapper.name; - lwt () = restart wrapper in - send_request wrapper command data + with + | Canceled -> + fail Canceled + | exn -> + Log#exn exn "write to %s card failed" wrapper.name; + lwt () = restart wrapper in + send_request wrapper command data (* Send a command without waiting for the reply: *) let rec send_command wrapper command data = @@ -314,29 +318,18 @@ let rec send_command wrapper command data = lwt len = USB.interrupt_send ~handle:card.handle ~endpoint:1 buffer 0 64 in if len <> 64 then fatal "write <> 64!"; return () - with exn -> - Log#exn exn "write to %s card failed" wrapper.name; - lwt () = restart wrapper in - send_command wrapper command data - -let rec send_command_with_reply wrapper command data = - lwt card = get_card wrapper in - let buffer = forge_message { host_serial = 0; - device_serial = 0; - command = command; - error = 0; - data = data } in - let (waiter, wakener) as w = Lwt.wait () in - card.command_waiters <- CommandMap.add command w card.command_waiters; - try_lwt - Lwt_mutex.with_lock card.mutex - (fun () -> - lwt len = USB.interrupt_send ~handle:card.handle ~endpoint:1 buffer 0 64 in - if len <> 64 then fatal "write <> 64!"; - waiter) - with exn -> - Log#exn exn "write to %s card failed" wrapper.name; - lwt () = restart wrapper in - send_command_with_reply wrapper command data - -let connect card command = failwith "not implemented" + with + | Canceled -> + fail Canceled + | exn -> + Log#exn exn "write to %s card failed" wrapper.name; + lwt () = restart wrapper in + send_command wrapper command data + +let connect wrapper command = + let event, push = React.E.create () in + let node = Lwt_sequence.add_l (command, push) wrapper.events in + (object + method event = event + method stop = Lwt_sequence.remove node; React.E.stop event + end) diff --git a/PC_Mainboard/driver/src/card.mli b/PC_Mainboard/driver/src/card.mli index fcbd8b1..b3ca5bf 100644 --- a/PC_Mainboard/driver/src/card.mli +++ b/PC_Mainboard/driver/src/card.mli @@ -54,9 +54,6 @@ val send_request : t -> int -> string -> string Lwt.t val send_command : t -> int -> string -> unit Lwt.t (** Sends a command to the device *) -val send_command_with_reply : t -> int -> string -> string Lwt.t - (** Send a command and wait for the reply *) - val connect : t -> int -> < event : string React.event; stop : unit > (** [connect card command] connects to signals [command] emitted by [card] *) diff --git a/PC_Mainboard/driver/src/commands.ml b/PC_Mainboard/driver/src/commands.ml index 10d4c2a..5404b77 100644 --- a/PC_Mainboard/driver/src/commands.ml +++ b/PC_Mainboard/driver/src/commands.ml @@ -78,8 +78,7 @@ struct RW.set_int16 data 1 arg1; RW.set_int16 data 3 arg2; RW.set_int16 data 5 arg3; - lwt _ = Card.send_command_with_reply card Protocol.cmd_traj data in - return () + Card.send_command card Protocol.cmd_traj data let move card ~dist ~speed ~acc = if dist < 0 then diff --git a/PC_Mainboard/driver/src/driver.ml b/PC_Mainboard/driver/src/driver.ml index e652c0f..c445926 100644 --- a/PC_Mainboard/driver/src/driver.ml +++ b/PC_Mainboard/driver/src/driver.ml @@ -238,6 +238,13 @@ open Lwt module Motors = struct + type move_state = + | Ms_static + (* No movement *) + | Ms_moving of unit Lwt.u * [ `Forward | `Backward | `Turn ] + (* Currently moving. The argument is a wakener to stop the + mover. *) + type t = { obus : OBus_object.t; card : Card.t; @@ -252,8 +259,11 @@ struct mutable inhibit_backward_until : float; (* Date after which motor's inhition should be stopped *) - move_mutex : Lwt_mutex.t; - mutable move_stop : unit -> unit; + mutable move_state : move_state; + (* Move state *) + + commands : int React.event; + (* CMD_TRAJ commands sent by the card *) } module OBus = OBus_object.Make(struct @@ -267,25 +277,50 @@ struct | High-level movement | +---------------------------------------------------------------+ *) + let obus_move_result : [ `OK | `Stopped ] OBus_type.basic = + OBus_type.mapping obus_int [(`OK, 0); (`Stopped, 1)] + + let stop_move dev = + match dev.move_state with + | Ms_static -> + () + | Ms_moving(wakener, _) -> + dev.move_state <- Ms_static; + wakeup wakener () + let move dev dist speed acc = Log#info "motor: move(dist=%d, speed=%d, acc=%d)" dist speed acc; - let date = Unix.gettimeofday () in - if (dist > 0 && date < dev.inhibit_forward_until) || (dist < 0 && date < dev.inhibit_backward_until) then - return () - else - Lwt_mutex.with_lock dev.move_mutex - (fun () -> - let waiter, wakener = task () in - dev.move_stop <- (fun () -> wakeup wakener ()); - lwt () = choose [Commands.Motor.move dev.card dist speed acc; waiter] in - return ()) + match dev.move_state with + | Ms_moving _ -> + fail (Failure "already moving") + | Ms_static -> + let date = Unix.gettimeofday () in + if (dist > 0 && date < dev.inhibit_forward_until) || (dist < 0 && date < dev.inhibit_backward_until) then + fail (Failure "inhibited move") + else begin + let waiter, wakener = wait () in + dev.move_state <- Ms_moving(wakener, if dist > 0 then `Forward else `Backward); + lwt () = Commands.Motor.move dev.card dist speed acc in + lwt result = select [Lwt_event.next dev.commands >> return `OK; waiter >> return `Stopped] in + dev.move_state <- Ms_static; + return result + end let turn dev angle speed acc = Log#info "motor: turn(angle=%d, speed=%d, acc=%d)" angle speed acc; - Commands.Motor.turn dev.card angle speed acc - - OL_method Turn : int -> int -> int -> unit - OL_method Move : int -> int -> int -> unit + match dev.move_state with + | Ms_moving _ -> + fail (Failure "already moving") + | Ms_static -> + let waiter, wakener = wait () in + dev.move_state <- Ms_moving(wakener, `Turn); + lwt () = Commands.Motor.turn dev.card angle speed acc in + lwt result = select [Lwt_event.next dev.commands >> return `OK; waiter >> return `Stopped] in + dev.move_state <- Ms_static; + return result + + OL_method Turn : int -> int -> int -> move_result + OL_method Move : int -> int -> int -> move_result (* +---------------------------------------------------------------+ | Low-level control of speed and acceleration of each motor | @@ -313,16 +348,16 @@ struct let stop_motors dev motor mode = Log#info "motor: stopping(motor=%s, mode=%s)" (string_of_motor motor) (string_of_stop_mode mode); - let t = Commands.Motor.stop dev.card motor mode in - dev.move_stop (); - t + stop_move dev; + Commands.Motor.stop dev.card motor mode let set_speed dev motor speed acc = Log#info "motor: set_speed(motor=%s, speed=%d, acc=%d)" (string_of_motor motor) speed acc; + stop_move dev; let dir, speed = if speed < 0 then (`Backward, -speed) else (`Forward, speed) in let date = Unix.gettimeofday () in if (dir = `Forward && date < dev.inhibit_forward_until) || (dir = `Backward && date < dev.inhibit_backward_until) then - return () + fail (Failure "inhibited move") else lwt () = if acc <> dev.acceleration then begin @@ -353,13 +388,23 @@ struct fun dev delay -> let until = Unix.gettimeofday () +. delay in dev.inhibit_forward_until <- until; - inhibited_forward_changed dev until + ignore (inhibited_forward_changed dev until); + match dev.move_state with + | Ms_moving(_, `Forward) -> + stop_motors dev `Both `Smooth + | _ -> + return () OL_method InhibitBackward : float -> unit = fun dev delay -> let until = Unix.gettimeofday () +. delay in dev.inhibit_backward_until <- until; - inhibited_backward_changed dev until + ignore (inhibited_backward_changed dev until); + match dev.move_state with + | Ms_moving(_, `Backward) -> + stop_motors dev `Both `Smooth + | _ -> + return () let make card path = let dev = { @@ -369,10 +414,9 @@ struct state = React.S.const (); inhibit_forward_until = 0.0; inhibit_backward_until = 0.0; - move_mutex = Lwt_mutex.create (); - move_stop = ignore; - } - in + move_state = Ms_static; + commands = React.E.map (fun data -> Char.code data.[0]) (Card.connect card Protocol.cmd_traj)#event; + } in dev.state <- React.S.map (fun state -> dev.acceleration <- 0) (Card.state card); dev end hooks/post-receive -- krobot |
From: Jérémie D. <Ba...@us...> - 2010-02-10 22:38:49
|
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 eeac9721d285ef7eed062fdf323769b1e56d5c2d (commit) via bf38241886423400959d4eae9e612ddcd92cf497 (commit) from d36204afda2e453843002b5941b805ad5d71ec49 (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 eeac9721d285ef7eed062fdf323769b1e56d5c2d Author: Jérémie Dimino <je...@di...> Date: Wed Feb 10 23:38:16 2010 +0100 typos commit bf38241886423400959d4eae9e612ddcd92cf497 Author: Jérémie Dimino <je...@di...> Date: Wed Feb 10 23:37:35 2010 +0100 [client-tools] add init_position ----------------------------------------------------------------------- Changes: diff --git a/PC_Mainboard/clients/common/util.ml b/PC_Mainboard/clients/common/util.ml index b369bdc..c40e26f 100644 --- a/PC_Mainboard/clients/common/util.ml +++ b/PC_Mainboard/clients/common/util.ml @@ -7,16 +7,16 @@ * This file is a part of [kro]bot. *) -let front_colide sensors = - if Array.length sensors <> 16 then invalid_arg "Until.front_colide"; +let front_collide sensors = + if Array.length sensors <> 16 then invalid_arg "Until.front_collide"; let rec loop = function | 16 -> false | n -> (sensors.(n) && List.mem n Config.front_sensors) || loop (n + 1) in loop 0 -let back_colide sensors = - if Array.length sensors <> 16 then invalid_arg "Until.back_colide"; +let back_collide sensors = + if Array.length sensors <> 16 then invalid_arg "Until.back_collide"; let rec loop = function | 16 -> false | n -> (sensors.(n) && List.mem n Config.back_sensors) || loop (n + 1) diff --git a/PC_Mainboard/clients/common/util.mli b/PC_Mainboard/clients/common/util.mli index c34b8dc..f652bb8 100644 --- a/PC_Mainboard/clients/common/util.mli +++ b/PC_Mainboard/clients/common/util.mli @@ -9,10 +9,10 @@ (** Utilities *) -val front_colide : bool array -> bool - (** [front_colide sensors] returns whether on of the front sensors +val front_collide : bool array -> bool + (** [front_collide sensors] returns whether on of the front sensors is activated *) -val back_colide : bool array -> bool - (** [front_colide sensors] returns whether on of the back sensors is +val back_collide : bool array -> bool + (** [front_collide sensors] returns whether on of the back sensors is activated *) diff --git a/PC_Mainboard/clients/security/hard_stop.ml b/PC_Mainboard/clients/security/hard_stop.ml index a5559cc..2adf52f 100644 --- a/PC_Mainboard/clients/security/hard_stop.ml +++ b/PC_Mainboard/clients/security/hard_stop.ml @@ -25,9 +25,9 @@ type state = OK | Stopped let state_forward = ref OK let state_backward = ref OK -let handle_colide krobot sensors = +let handle_collide krobot sensors = join [ - (if Util.front_colide sensors then begin + (if Util.front_collide sensors then begin lwt () = Krobot.inhibit_forward krobot duration in if !state_forward = OK then begin state_forward := Stopped; @@ -38,7 +38,7 @@ let handle_colide krobot sensors = state_forward := OK; return () end); - (if Util.back_colide sensors then begin + (if Util.back_collide sensors then begin lwt () = Krobot.inhibit_backward krobot duration in if !state_backward = OK then begin state_backward := Stopped; @@ -68,11 +68,11 @@ lwt () = lwt krobot = Krobot.create () in (* Stop motors as soon as possible: *) - Lwt_signal.always_notify_p (handle_colide krobot) (Krobot.logic_sensors krobot); + Lwt_signal.always_notify_p (handle_collide krobot) (Krobot.logic_sensors krobot); (* Continue the inhibition: *) let rec loop () = - lwt () = handle_colide krobot (React.S.value (Krobot.logic_sensors krobot)) in + lwt () = handle_collide krobot (React.S.value (Krobot.logic_sensors krobot)) in lwt () = Lwt_unix.sleep (duration /. 2.) in loop () in diff --git a/PC_Mainboard/clients/tools/init_position.ml b/PC_Mainboard/clients/tools/init_position.ml index 5ce1172..f5aec9f 100644 --- a/PC_Mainboard/clients/tools/init_position.ml +++ b/PC_Mainboard/clients/tools/init_position.ml @@ -13,24 +13,24 @@ open Lwt lwt () = lwt krobot = Krobot.create () in - let colide = React.S.changes (React.S.map Util.back_colide (Krobot.logic_sensors krobot)) in Log#notice "moving backward"; lwt () = Krobot.move krobot ~dist:(-1000) ~speed:100 ~acc:100 in - Log#notice "waiting for colision"; - lwt _ = Lwt_event.next colide in Log#notice "backward colisiton dectected"; Log#notice "going to initial position on first axis"; + lwt () = Lwt_unix.sleep 2.0 in lwt () = Krobot.move krobot ~dist:Config.initial_position ~speed:400 ~acc:800 in Log#notice "turning"; - lwt () = Krobot.turn krobot ~angle:90 ~speed:400 ~acc:800 in + lwt () = Krobot.turn krobot ~angle:(-90) ~speed:400 ~acc:800 in Log#notice "moving backward"; lwt () = Krobot.move krobot ~dist:(-1000) ~speed:100 ~acc:50 in - Log#notice "waiting for colision"; - lwt _ = Lwt_event.next colide in Log#notice "backward colisiton dectected"; Log#notice "going to initial position on second axis"; - Krobot.move krobot ~dist:Config.initial_position ~speed:400 ~acc:800 + lwt () = Krobot.move krobot ~dist:Config.initial_position ~speed:400 ~acc:800 in + + lwt () = Lwt_unix.sleep 2.0 in + Krobot.turn krobot ~angle:45 ~speed:400 ~acc:800 + hooks/post-receive -- krobot |