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: oiffrig <Ba...@us...> - 2010-04-05 16:20: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 1bd61bc9f4c1d64e4c371681792b22414565379f (commit) from c3fc7c1c016367f1518bb71e6e309086efecf9a7 (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 1bd61bc9f4c1d64e4c371681792b22414565379f Author: Olivier Iffrig <if...@cr...> Date: Mon Apr 5 18:15:25 2010 +0200 Amélioration de la porte (la plaque était plus haut que les rails une fois baissée) Décalage du plan incliné ----------------------------------------------------------------------- Changes: diff --git a/meca/2010_Junior/Assemblage.CATProduct b/meca/2010_Junior/Assemblage.CATProduct index 5dec242..6c658aa 100644 Binary files a/meca/2010_Junior/Assemblage.CATProduct and b/meca/2010_Junior/Assemblage.CATProduct differ diff --git a/meca/2010_Junior/Baguette entrainement porte.CATPart b/meca/2010_Junior/Baguette entrainement porte.CATPart index 1479630..646e00a 100644 Binary files a/meca/2010_Junior/Baguette entrainement porte.CATPart and b/meca/2010_Junior/Baguette entrainement porte.CATPart differ diff --git a/meca/2010_Junior/Base.CATPart b/meca/2010_Junior/Base.CATPart index 964f29a..f143d03 100644 Binary files a/meca/2010_Junior/Base.CATPart and b/meca/2010_Junior/Base.CATPart differ diff --git a/meca/2010_Junior/Guide porte.CATPart b/meca/2010_Junior/Guide porte.CATPart index 95bca31..cc4fa83 100644 Binary files a/meca/2010_Junior/Guide porte.CATPart and b/meca/2010_Junior/Guide porte.CATPart differ diff --git a/meca/2010_Junior/L plan incline long.CATPart b/meca/2010_Junior/L plan incline long.CATPart index d60429b..abffec5 100644 Binary files a/meca/2010_Junior/L plan incline long.CATPart and b/meca/2010_Junior/L plan incline long.CATPart differ hooks/post-receive -- krobot |
From: Jérémie D. <Ba...@us...> - 2010-04-05 12:03:44
|
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 c3fc7c1c016367f1518bb71e6e309086efecf9a7 (commit) from 63a56a07ebda717cedfd5527b1b2af1721d4e12f (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 c3fc7c1c016367f1518bb71e6e309086efecf9a7 Author: Jérémie Dimino <je...@di...> Date: Mon Apr 5 14:01:44 2010 +0200 Use D-Bus properties with automatic notifications ----------------------------------------------------------------------- Changes: diff --git a/info/control/_tags b/info/control/_tags index bf46a8a..23ffcf3 100644 --- a/info/control/_tags +++ b/info/control/_tags @@ -41,6 +41,7 @@ <common/krobot_{types,util}.{ml,mli}>: syntax_camlp4o, pkg_obus.syntax, pkg_lwt.syntax <common/krobot_{types,util}.*>: pkg_obus +<common/var.*>: pkg_react # +------------------------------------------------------------------+ # | Driver | diff --git a/info/control/clients/krobot_controller.ml b/info/control/clients/krobot_controller.ml index 16e1018..f6d3fbd 100644 --- a/info/control/clients/krobot_controller.ml +++ b/info/control/clients/krobot_controller.ml @@ -150,9 +150,6 @@ let check_services bus = | Drawing | +-----------------------------------------------------------------+ *) -(* Thread currently redrawing the screen: *) -let renderer = ref (return ()) - (* Draw the whole screen *) let rec draw krobot = let size = React.S.value Lwt_term.size in @@ -207,12 +204,12 @@ let rec draw krobot = let zone = Zone.inner screen in - let range_finders = React.S.value (Krobot.range_finders krobot) in + lwt range_finders = OBus_property.get (Krobot.range_finders krobot) in for i = 0 to Array.length range_finders - 1 do Draw.textc zone 0 i [textf "%d : " i; text (Text.repeat (range_finders.(i) * 14 / 3146) "=")] done; - let logic_sensors = React.S.value (Krobot.logic_sensors krobot) in + lwt logic_sensors = OBus_property.get (Krobot.logic_sensors krobot) in for i = 0 to Array.length logic_sensors / 2 - 1 do let j = i * 2 in Draw.textf zone 20 i "%02d : %s %02d : %s" @@ -235,16 +232,21 @@ let rec draw krobot = | `Absent -> [fg lred; text name] | `Present -> [text name] in - Draw.textc zone x 0 (text_of_state "interface" (React.S.value (Krobot.Card.state (krobot, `Interface)))); - Draw.textc zone x 1 (text_of_state "sensor" (React.S.value (Krobot.Card.state (krobot, `Sensor)))); - Draw.textc zone x 2 (text_of_state "motor" (React.S.value (Krobot.Card.state (krobot, `Motor)))); - Draw.textc zone x 3 (text_of_state "monitoring" (React.S.value (Krobot.Card.state (krobot, `Monitoring)))); + lwt interface_state = OBus_property.get (Krobot.Card.state (krobot, `Interface)) + and sensor_state = OBus_property.get (Krobot.Card.state (krobot, `Sensor)) + and motor_state = OBus_property.get (Krobot.Card.state (krobot, `Motor)) + and monitoring_state = OBus_property.get (Krobot.Card.state (krobot, `Monitoring)) in + Draw.textc zone x 0 (text_of_state "interface" interface_state); + Draw.textc zone x 1 (text_of_state "sensor" sensor_state); + Draw.textc zone x 2 (text_of_state "motor" motor_state); + Draw.textc zone x 3 (text_of_state "monitoring" monitoring_state); let x = x + 12 in - Draw.textf zone x 0 "team = %s" (match React.S.value (Krobot.team krobot) with +(* Draw.textf zone x 0 "team = %s" (match React.S.value (Krobot.team krobot) with | Krobot.Team_red -> "red" | Krobot.Team_green -> "green"); - Draw.textf zone x 1 "jack = %s" (if React.S.value (Krobot.jack krobot) then "present" else "absent"); - Draw.textf zone x 2 "compass = %d" (React.S.value (Krobot.compass krobot)); + Draw.textf zone x 1 "jack = %s" (if React.S.value (Krobot.jack krobot) then "present" else "absent");*) + lwt compass = OBus_property.get (Krobot.compass krobot) in + Draw.textf zone x 2 "compass = %d" compass; let date = Unix.gettimeofday () in let text_of_motor_state mode until = if date < until then @@ -252,8 +254,10 @@ let rec draw krobot = else [text mode; text "OK"] in - Draw.textc zone x 3 (text_of_motor_state "move forward: " (React.S.value (Krobot.inhibited_forward_until krobot))); - Draw.textc zone x 4 (text_of_motor_state "move backward: " (React.S.value (Krobot.inhibited_backward_until krobot))); + lwt forward = OBus_property.get (Krobot.inhibit_forward_until krobot) + and backward = OBus_property.get (Krobot.inhibit_backward_until krobot) in + Draw.textc zone x 3 (text_of_motor_state "move forward: " forward); + Draw.textc zone x 4 (text_of_motor_state "move backward: " backward); (* ===== History ===== *) @@ -351,8 +355,7 @@ let rec draw krobot = words 0) end; - Lwt.cancel !renderer; - renderer := Lwt_term.render (Zone.points screen) + Lwt_term.render (Zone.points screen) (* Wether the screen need to be refreshed *) let refresh_needed = ref false @@ -365,8 +368,7 @@ let refresh krobot = refresh_needed := true; lwt () = Lwt.pause () in refresh_needed := false; - draw krobot; - return () + draw krobot end (* +-----------------------------------------------------------------+ @@ -375,8 +377,8 @@ let refresh krobot = lwt () = lwt () = Lwt_log.notice "connecting to the krobot bus..." in - lwt bus = Lazy.force Krobot.bus in lwt krobot = Krobot.create () in + let bus = OBus_peer.connection (Krobot.to_peer krobot) in (* Put the terminal into drawing mode: *) lwt () = Lwt_term.enter_drawing_mode () in @@ -410,23 +412,23 @@ lwt () = let notify signal = Lwt_signal.always_notify (fun _ -> push ()) signal in notify box; notify logs; - notify (Krobot.compass krobot); - notify (Krobot.logic_sensors krobot); - notify (Krobot.range_finders krobot); - notify (Krobot.team krobot); - notify (Krobot.jack krobot); - notify (Krobot.inhibited_forward_until krobot); - notify (Krobot.inhibited_backward_until krobot); - notify (Krobot.Card.state (krobot, `Interface)); - notify (Krobot.Card.state (krobot, `Sensor)); - notify (Krobot.Card.state (krobot, `Motor)); + lwt () = notify =|< OBus_property.monitor (Krobot.compass krobot) + and () = notify =|< OBus_property.monitor (Krobot.logic_sensors krobot) + and () = notify =|< OBus_property.monitor (Krobot.range_finders krobot) + (*and () = notify =|< OBus_property.monitor (Krobot.team krobot) + and () = notify =|< OBus_property.monitor (Krobot.jack krobot)*) + and () = notify =|< OBus_property.monitor (Krobot.inhibit_forward_until krobot) + and () = notify =|< OBus_property.monitor (Krobot.inhibit_backward_until krobot) + and () = notify =|< OBus_property.monitor (Krobot.Card.state (krobot, `Interface)) + and () = notify =|< OBus_property.monitor (Krobot.Card.state (krobot, `Sensor)) + and () = notify =|< OBus_property.monitor (Krobot.Card.state (krobot, `Motor)) in notify services; List.iter (fun card -> Lwt_event.always_notify (fun error -> log_add_line [fg lred; textf "error on card %s: %s" (Krobot.Card.name card) error]) - (Krobot.Card.errors (krobot, card))) + (OBus_signal.event (Krobot.Card.errors (krobot, card)))) [`Interface; `Sensor; `Motor; `Monitoring]; (* Redraw immedlatly the screen when [signal] changes: *) diff --git a/info/control/clients/krobot_info.ml b/info/control/clients/krobot_info.ml index b0906dc..496a66e 100644 --- a/info/control/clients/krobot_info.ml +++ b/info/control/clients/krobot_info.ml @@ -13,7 +13,7 @@ open Lwt open Lwt_io let print_card krobot card = - match React.S.value (Krobot.Card.state (krobot, card)) with + OBus_property.get (Krobot.Card.state (krobot, card)) >>= function | `Present -> lwt firmware_build = Krobot.Card.get_firmware_build (krobot, card) and board_info = Krobot.Card.get_board_info (krobot, card) in diff --git a/info/control/clients/krobot_script.ml b/info/control/clients/krobot_script.ml index 7322c89..a3922dc 100644 --- a/info/control/clients/krobot_script.ml +++ b/info/control/clients/krobot_script.ml @@ -213,7 +213,7 @@ let () = register "motors-state" f0 (fun logger krobot -> - lwt state = Krobot.motors_state krobot in + lwt state = OBus_property.get (Krobot.motors_state krobot) in logger [text "motors state: "; text state]); register "stop-motors" (f1 stop_mode) (fun logger krobot mode -> diff --git a/info/control/driver/krobot_driver.ml b/info/control/driver/krobot_driver.ml index 5d37d75..6b73a5a 100644 --- a/info/control/driver/krobot_driver.ml +++ b/info/control/driver/krobot_driver.ml @@ -15,6 +15,16 @@ open OBus_pervasives open Krobot_types open Lwt +let make_signal ?(update_delay=Krobot_config.update_delay) get card = + lwt value = get card in + return (React.S.hold value (Lwt_event.from + (fun () -> + lwt () = Lwt_unix.sleep update_delay in + get card))) + +(* THe notification mode for all interfaces: *) +let notify = OBus_object.notify_update "PropertiesChanged" + (* +-----------------------------------------------------------------+ | Battery monitoring | +-----------------------------------------------------------------+ *) @@ -34,10 +44,12 @@ struct module Unsafe = Krobot_exports.Power(OBus)(struct let get dev = dev.card end) let make card path = - return { - obus = OBus.make ~interfaces:[Unsafe.ol_interface] path; - card = card; - } + return + (OBus.make ~interfaces:[Unsafe.ol_interface] path + (fun obus -> { + obus = obus; + card = card; + })) end (* +-----------------------------------------------------------------+ @@ -49,7 +61,7 @@ struct type t = { obus : OBus_object.t; card : Krobot_card.t; - mutable data : int; + value : int React.signal; } module OBus = OBus_object.Make(struct @@ -59,31 +71,19 @@ struct module Unsafe = Krobot_exports.Compass(OBus)(struct let get dev = dev.card end) - let ol_interface = OBus.make_interface "fr.krobot.Device.Compass" - - OL_signal Value : int - OL_method Get : int = fun dev -> return dev.data + let ol_interface = OBus.make_interface ~notify "fr.krobot.Device.Compass" - let rec loop dev = - lwt _, data = Krobot_commands.Compass.get dev.card in - if data <> dev.data then begin - dev.data <- data; - lwt () = value dev data in - lwt () = Lwt_unix.sleep (Krobot_config.update_delay *. 2.) in - loop dev - end else - lwt () = Lwt_unix.sleep (Krobot_config.update_delay *. 2.) in - loop dev + OL_property_r Value : int let make card path = - lwt _, data = Krobot_commands.Compass.get card in - let dev = { - obus = OBus.make ~interfaces:[Unsafe.ol_interface; ol_interface] path; - card = card; - data = data; - } in - ignore (loop dev); - return dev + lwt value = make_signal ~update_delay:(Krobot_config.update_delay *. 2.) (fun card -> snd =|< Krobot_commands.Compass.get card) card in + return + (OBus.make ~interfaces:[Unsafe.ol_interface; ol_interface] path + (fun obus -> { + obus = obus; + card = card; + value = value; + })) end (* +-----------------------------------------------------------------+ @@ -104,7 +104,7 @@ struct module Unsafe = Krobot_exports.LCD(OBus)(struct let get dev = dev.card end) - let ol_interface = OBus.make_interface "fr.krobot.Device.LCD" + let ol_interface = OBus.make_interface ~notify "fr.krobot.Device.LCD" OL_method SetLCD : string list -> unit = fun dev lines -> if List.length lines > 4 || List.exists (fun line -> String.length line > 20) lines then @@ -126,11 +126,12 @@ struct OL_method BacklightOff : unit = Unsafe.backlight_off let make card path = - let dev = { - obus = OBus.make ~interfaces:[Unsafe.ol_interface; ol_interface] path; - card = card; - } in - return dev + return + (OBus.make ~interfaces:[Unsafe.ol_interface; ol_interface] path + (fun obus -> { + obus = obus; + card = card; + })) end (* +-----------------------------------------------------------------+ @@ -151,7 +152,7 @@ struct module Unsafe = Krobot_exports.Servo(OBus)(struct let get dev = dev.card end) - let ol_interface = OBus.make_interface "fr.krobot.Device.Servo" + let ol_interface = OBus.make_interface ~notify "fr.krobot.Device.Servo" OL_method ClawsEnable : unit = fun dev -> Unsafe.set_config dev 0b10100 0 @@ -169,11 +170,12 @@ struct Unsafe.set_state dev 0b10100 0 0 (-40) 0 (-20) let make card path = - let dev = { - obus = OBus.make ~interfaces:[Unsafe.ol_interface; ol_interface] path; - card = card; - } in - return dev + return + (OBus.make ~interfaces:[Unsafe.ol_interface; ol_interface] path + (fun obus -> { + obus = obus; + card = card; + })) end (* +-----------------------------------------------------------------+ @@ -202,7 +204,7 @@ struct | High-level commands | +---------------------------------------------------------------+ *) - let ol_interface = OBus.make_interface "fr.krobot.Device.AX12" + let ol_interface = OBus.make_interface ~notify "fr.krobot.Device.AX12" OL_method SetAX12 : Krobot_types.ax12_action structure list -> unit = fun dev actions -> lwt () = @@ -257,10 +259,12 @@ struct Krobot_commands.AX12.goto dev.card ~id:3 ~position:200 ~velocity:200 ~mode:`Now let make card path = - return { - obus = OBus.make ~interfaces:[Unsafe.ol_interface; ol_interface] path; - card = card; - } + return + (OBus.make ~interfaces:[Unsafe.ol_interface; ol_interface] path + (fun obus -> { + obus = obus; + card = card; + })) end (* +-----------------------------------------------------------------+ @@ -272,7 +276,7 @@ struct type t = { obus : OBus_object.t; card : Krobot_card.t; - mutable data : bool array; + value : bool array React.signal; } module OBus = OBus_object.Make(struct @@ -282,30 +286,19 @@ struct module Unsafe = Krobot_exports.Logic_sensors(OBus)(struct let get dev = dev.card end) - let ol_interface = OBus.make_interface "fr.krobot.Device.LogicSensors" + let ol_interface = OBus.make_interface ~notify "fr.krobot.Device.LogicSensors" - OL_signal Value : bool array - OL_method Get : bool array = fun dev -> return dev.data - - let rec loop dev = - lwt data = Krobot_commands.Logic_sensors.get_state dev.card in - if data <> dev.data then begin - dev.data <- data; - lwt () = value dev data in - lwt () = Lwt_unix.sleep Krobot_config.update_delay in - loop dev - end else - lwt () = Lwt_unix.sleep Krobot_config.update_delay in - loop dev + OL_property_r Value : bool array let make card path = - let dev = { - obus = OBus.make ~interfaces:[Unsafe.ol_interface; ol_interface] path; - card = card; - data = Array.create 16 false; - } in - ignore (loop dev); - return dev + lwt value = make_signal Krobot_commands.Logic_sensors.get_state card in + return + (OBus.make ~interfaces:[Unsafe.ol_interface; ol_interface] path + (fun obus -> { + obus = obus; + card = card; + value = value; + })) end (* +-----------------------------------------------------------------+ @@ -317,7 +310,7 @@ struct type t = { obus : OBus_object.t; card : Krobot_card.t; - mutable data : int array; + value : int array React.signal; } module OBus = OBus_object.Make(struct @@ -327,10 +320,10 @@ struct module Unsafe = Krobot_exports.Range_finders(OBus)(struct let get dev = dev.card end) - let ol_interface = OBus.make_interface "fr.krobot.Device.RangeFinders" + let ol_interface = OBus.make_interface ~notify "fr.krobot.Device.RangeFinders" + + OL_property_r Value : int array - OL_signal Value : int array - OL_method Get : int array = fun dev -> return dev.data OL_method GetCalibration : int -> int array = fun dev num -> Krobot_commands.Range_finders.get_calibration dev.card num @@ -341,25 +334,15 @@ struct OL_method CalibrationContinue : unit = fun dev -> Krobot_commands.Range_finders.calibration_continue dev.card - let rec loop dev = - lwt data = Krobot_commands.Range_finders.get_state dev.card in - if data <> dev.data then begin - dev.data <- data; - lwt () = value dev data in - lwt () = Lwt_unix.sleep Krobot_config.update_delay in - loop dev - end else - lwt () = Lwt_unix.sleep Krobot_config.update_delay in - loop dev - let make card path = - let dev = { - obus = OBus.make ~interfaces:[Unsafe.ol_interface; ol_interface] path; - card = card; - data = Array.create 8 0; - } in - ignore (loop dev); - return dev + lwt value = make_signal Krobot_commands.Range_finders.get_state card in + return + (OBus.make ~interfaces:[Unsafe.ol_interface; ol_interface] path + (fun obus -> { + obus = obus; + card = card; + value = value; + })) end (* +-----------------------------------------------------------------+ @@ -397,15 +380,15 @@ struct obus : OBus_object.t; card : Krobot_card.t; - mutable inhibit_forward_until : float; - mutable inhibit_backward_until : float; + inhibit_forward_until : float Var.t; + inhibit_backward_until : float Var.t; (* Date after which motor's inhibition should be stopped *) traj_completed : (int * string) React.event; (* Event which occurs each time a TRAJ_COMPLETED command is received *) - mutable state : state; + state : state Var.t; (* The current state of the two motors *) } @@ -416,29 +399,33 @@ struct module Unsafe = Krobot_exports.Motors(OBus)(struct let get dev = dev.card end) - let ol_interface = OBus.make_interface "fr.krobot.Device.Motors" + let ol_interface = OBus.make_interface ~notify "fr.krobot.Device.Motors" let string_of_direction = function | `Forward -> "forward" | `Backward -> "backward" - OL_method GetState : string = fun dev -> - return (match dev.state with - | Static -> - "static" - | Trajectory traj -> - Printf.sprintf "trajectory: trajectory=%s stopped=%B" - (match traj.trajectory with - | `Forward -> "forward" - | `Backward -> "backward" - | `Left -> "left" - | `Right -> "right" - | `Goto -> "goto") - traj.stopped - | Manual(_, settings_l, settings_r) -> - Printf.sprintf "manual: left={ direction=%s; velocity=%d; acceleration=%d } right={ direction=%s; velocity=%d; acceleration=%d }" - (string_of_direction settings_l.direction) settings_l.velocity settings_l.acceleration - (string_of_direction settings_r.direction) settings_r.velocity settings_r.acceleration) + let obus_state = OBus_type.map obus_string + (fun str -> + failwith "not implemented") + (function + | Static -> + "static" + | Trajectory traj -> + Printf.sprintf "trajectory: trajectory=%s stopped=%B" + (match traj.trajectory with + | `Forward -> "forward" + | `Backward -> "backward" + | `Left -> "left" + | `Right -> "right" + | `Goto -> "goto") + traj.stopped + | Manual(_, settings_l, settings_r) -> + Printf.sprintf "manual: left={ direction=%s; velocity=%d; acceleration=%d } right={ direction=%s; velocity=%d; acceleration=%d }" + (string_of_direction settings_l.direction) settings_l.velocity settings_l.acceleration + (string_of_direction settings_r.direction) settings_r.velocity settings_r.acceleration) + + OL_property_r State : state = fun dev -> Var.signal dev.state (* +---------------------------------------------------------------+ | High-level movement | @@ -449,7 +436,7 @@ struct Lwt_log.info_f ~section "move: distance=%d velocity=%d acceleration=%d" dist velocity acc in - match dev.state with + match Var.get dev.state with | Trajectory _ -> lwt () = Lwt_log.info ~section "move: state=trajectory" in fail (Failure "already in a trajectory") @@ -459,7 +446,7 @@ struct | Static -> lwt () = Lwt_log.info ~section "move: state=static" in let date = Unix.gettimeofday () in - if (dist > 0 && date < dev.inhibit_forward_until) || (dist < 0 && date < dev.inhibit_backward_until) then + if (dist > 0 && date < Var.get dev.inhibit_forward_until) || (dist < 0 && date < Var.get dev.inhibit_backward_until) then fail (Failure "inhibited move") else begin let waiter, wakener = Lwt.wait () in @@ -468,7 +455,7 @@ struct trajectory = if dist > 0 then `Forward else `Backward; stopped = false } in - dev.state <- Trajectory trajectory; + Var.set dev.state (Trajectory trajectory); let thread = Lwt_event.next dev.traj_completed >> return () in lwt () = pick [waiter; @@ -480,7 +467,7 @@ struct in thread)] in - dev.state <- Static; + Var.set dev.state Static; return (if trajectory.stopped then `Stopped else `OK) end @@ -489,7 +476,7 @@ struct Lwt_log.info_f ~section "turn: angle=%d velocity=%d acceleration=%d" angle velocity acc in - match dev.state with + match Var.get dev.state with | Trajectory _ -> lwt () = Lwt_log.info ~section "turn: state=trajectory" in fail (Failure "already in a trajectory") @@ -504,7 +491,7 @@ struct trajectory = if angle > 0 then `Left else `Right; stopped = false } in - dev.state <- Trajectory trajectory; + Var.set dev.state (Trajectory trajectory); let thread = Lwt_event.next dev.traj_completed >> return () in lwt () = pick [waiter; @@ -516,7 +503,7 @@ struct in thread)] in - dev.state <- Static; + Var.set dev.state Static; return (if trajectory.stopped then `Stopped else `OK) let string_of_goto_mode = function @@ -529,7 +516,7 @@ struct Lwt_log.info_f ~section "goto: x=%d y=%d velocity=%d acceleration=%d mode=%s bypass_distance=%d" x y velocity acc (string_of_goto_mode mode) bypass_distance in - match dev.state with + match Var.get dev.state with | Trajectory _ -> lwt () = Lwt_log.info ~section "goto: state=trajectory" in fail (Failure "already in a trajectory") @@ -539,7 +526,7 @@ struct | Static -> lwt () = Lwt_log.info ~section "goto: state=static" in let date = Unix.gettimeofday () in - if date < dev.inhibit_forward_until then + if date < Var.get dev.inhibit_forward_until then fail (Failure "inhibited move") else begin let waiter, wakener = Lwt.wait () in @@ -548,7 +535,7 @@ struct trajectory = `Goto; stopped = false } in - dev.state <- Trajectory trajectory; + Var.set dev.state (Trajectory trajectory); let thread = Lwt_event.next dev.traj_completed >> return () in lwt () = pick [waiter; @@ -562,7 +549,7 @@ struct in thread)] in - dev.state <- Static; + Var.set dev.state Static; return (if trajectory.stopped then `Stopped else `OK) end @@ -581,7 +568,7 @@ struct let stop_motors dev mode = lwt () = Lwt_log.info_f ~section "stop-motors: mode=%s" (string_of_stop_mode mode) in - match dev.state with + match Var.get dev.state with | Trajectory trajectory -> lwt () = Lwt_log.info ~section "stop-motors: state=trajectory" in trajectory.stopped <- true; @@ -591,7 +578,7 @@ struct | Manual(stopper, left, right) -> lwt () = Lwt_log.info ~section "stop-motors: state=manual" in lwt () = Krobot_commands.Motors.traj_stop dev.card `Both mode in - dev.state <- Static; + Var.set dev.state Static; cancel stopper; return () | Static -> @@ -602,15 +589,15 @@ struct let direction_l, velocity_l = if velocity_l < 0 then (`Backward, -velocity_l) else (`Forward, velocity_l) in let direction_r, velocity_r = if velocity_r < 0 then (`Backward, -velocity_r) else (`Forward, velocity_r) in let date = Unix.gettimeofday () in - if (((direction_l = `Forward && velocity_l > 0) || (direction_r = `Forward && velocity_r > 0)) && date < dev.inhibit_forward_until) - || (((direction_l = `Backward && velocity_l > 0) || (direction_r = `Backward && velocity_r > 0)) && date < dev.inhibit_backward_until) then + if (((direction_l = `Forward && velocity_l > 0) || (direction_r = `Forward && velocity_r > 0)) && date < Var.get dev.inhibit_forward_until) + || (((direction_l = `Backward && velocity_l > 0) || (direction_r = `Backward && velocity_r > 0)) && date < Var.get dev.inhibit_backward_until) then fail (Failure "inhibited move") else begin cancel stopper; if velocity_l <> 0 || velocity_r <> 0 then begin - dev.state <- Manual(Lwt_unix.sleep duration >> stop_motors dev `Smooth, - { velocity = velocity_l; acceleration = acceleration_l; direction = direction_l }, - { velocity = velocity_r; acceleration = acceleration_r; direction = direction_r }); + Var.set dev.state (Manual(Lwt_unix.sleep duration >> stop_motors dev `Smooth, + { velocity = velocity_l; acceleration = acceleration_l; direction = direction_l }, + { velocity = velocity_r; acceleration = acceleration_r; direction = direction_r })); lwt () = if acceleration_l <> settings_l.acceleration then Krobot_commands.Motors.traj_new_velocity dev.card `Left velocity_l acceleration_l direction_l @@ -634,7 +621,7 @@ struct (fst accelerations) (snd accelerations) duration in - match dev.state with + match Var.get dev.state with | Trajectory _ -> lwt () = Lwt_log.info ~section "set-velocities: state=trajectory" in fail (Failure "currently in trajectory mode") @@ -653,55 +640,47 @@ struct | Motors inhbition | +---------------------------------------------------------------+ *) - OL_method InhibitedForward : float = fun dev -> - return dev.inhibit_forward_until - - OL_method InhibitedBackward : float = fun dev -> - return dev.inhibit_backward_until - - OL_signal InhibitedForwardChanged : float - OL_signal InhibitedBackwardChanged : float - - OL_method InhibitForward : float -> unit = - fun dev delay -> - let until = Unix.gettimeofday () +. delay in - dev.inhibit_forward_until <- until; - ignore (inhibited_forward_changed dev until); - match dev.state with - | Trajectory{ trajectory = (`Forward | `Goto) } -> - stop_motors dev `Abrupt - | Manual(_, settings_l, settings_r) - when (settings_l.direction = `Forward && settings_l.velocity > 0) - || (settings_r.direction = `Forward && settings_r.velocity > 0) -> - stop_motors dev `Abrupt - | _ -> - return () - - OL_method InhibitBackward : float -> unit = - fun dev delay -> - let until = Unix.gettimeofday () +. delay in - dev.inhibit_backward_until <- until; - ignore (inhibited_backward_changed dev until); - match dev.state with - | Trajectory{ trajectory = `Backward } -> - stop_motors dev `Abrupt - | Manual(_, settings_l, settings_r) - when (settings_l.direction = `Backward && settings_l.velocity > 0) - || (settings_r.direction = `Backward && settings_r.velocity > 0) -> - stop_motors dev `Abrupt - | _ -> - return () + OL_property_rw InhibitForwardUntil : float = + (fun dev -> Var.signal dev.inhibit_forward_until) + (fun dev delay -> + let until = Unix.gettimeofday () +. delay in + Var.set dev.inhibit_forward_until until; + match Var.get dev.state with + | Trajectory{ trajectory = (`Forward | `Goto) } -> + stop_motors dev `Abrupt + | Manual(_, settings_l, settings_r) + when (settings_l.direction = `Forward && settings_l.velocity > 0) + || (settings_r.direction = `Forward && settings_r.velocity > 0) -> + stop_motors dev `Abrupt + | _ -> + return ()) + + OL_property_rw InhibitBackwardUntil : float = + (fun dev -> Var.signal dev.inhibit_backward_until) + (fun dev delay -> + let until = Unix.gettimeofday () +. delay in + Var.set dev.inhibit_backward_until until; + match Var.get dev.state with + | Trajectory{ trajectory = `Backward } -> + stop_motors dev `Abrupt + | Manual(_, settings_l, settings_r) + when (settings_l.direction = `Backward && settings_l.velocity > 0) + || (settings_r.direction = `Backward && settings_r.velocity > 0) -> + stop_motors dev `Abrupt + | _ -> + return ()) let make card path = - let dev = { - obus = OBus.make ~interfaces:[Unsafe.ol_interface; ol_interface] path; - card = card; - inhibit_forward_until = 0.0; - inhibit_backward_until = 0.0; - state = Static; - traj_completed = React.E.filter (fun (cmd, data) -> cmd = PcInterface.cmd_traj && Char.code data.[0] = PcInterface.traj_completed) (Krobot_card.commands card); - } in - return dev + return + (OBus.make ~interfaces:[Unsafe.ol_interface; ol_interface] path + (fun obus -> { + obus = obus; + card = card; + inhibit_forward_until = Var.create 0.0; + inhibit_backward_until = Var.create 0.0; + state = Var.create Static; + traj_completed = React.E.filter (fun (cmd, data) -> cmd = PcInterface.cmd_traj && Char.code data.[0] = PcInterface.traj_completed) (Krobot_card.commands card); + })) end (* +-----------------------------------------------------------------+ @@ -717,7 +696,7 @@ let card_motor, set_card_motor = React.S.create None module Manager = struct - let ol_interface = OBus_object.make_interface "fr.krobot.Manager" + let ol_interface = OBus_object.make_interface ~notify "fr.krobot.Manager" let close card = match React.S.value card with | None -> @@ -725,7 +704,7 @@ struct | Some card -> Krobot_card.close card - OL_method CardStates : OBus_connection.t -> Krobot_types.card_state * Krobot_types.card_state * Krobot_types.card_state * Krobot_types.card_state = fun manager connection -> + OL_method CardStates : context -> Krobot_types.card_state * Krobot_types.card_state * Krobot_types.card_state * Krobot_types.card_state = fun manager (connection, message) -> let state card = match React.S.value card with | Some _ -> `Present | None -> `Absent @@ -735,7 +714,7 @@ struct state card_motor, state card_monitoring) - OL_method Shutdown : OBus_connection.t -> unit = fun manager connection -> + OL_method Shutdown : context -> unit = fun manager (connection, message) -> lwt () = Lwt_log.info ~section "exiting" in quit := true; lwt () = close card_interface @@ -746,7 +725,7 @@ struct Lwt.wakeup done_wakener (); return () - let manager = OBus_object.make ~interfaces:[ol_interface] ["fr"; "krobot"; "Manager"] + let manager = OBus_object.make ~interfaces:[ol_interface] ["fr"; "krobot"; "Manager"] (fun x -> x) end (* +-----------------------------------------------------------------+ @@ -759,8 +738,8 @@ struct card : Krobot_card.t option React.signal; obus : OBus_object.t; name : string; - mutable state : unit Lwt.t React.signal; - mutable errors : unit Lwt.t React.event; + state : Krobot_types.card _state React.signal; + mutable errors : unit React.event; } module OBus = OBus_object.Make(struct @@ -776,17 +755,11 @@ struct module Unsafe = Krobot_exports.Card(OBus)(struct let get = get_card end) - let ol_interface = OBus.make_interface "fr.krobot.Card" + let ol_interface = OBus.make_interface ~notify "fr.krobot.Card" - OL_property_r Name : string = fun dev -> - return (Krobot_card.name (get_card dev)) + OL_property_r Name : string = fun dev -> React.S.const dev.name - OL_method GetState : Krobot_types.card_state = fun dev -> - match React.S.value dev.card with - | None -> - return `Absent - | Some _ -> - return `Present + OL_property_r State : Krobot_types.card_state OL_method GetFirmwareBuild : string = fun dev -> Krobot_commands.Card.get_firmware_build (get_card dev) @@ -803,23 +776,29 @@ struct OL_method Test : unit = fun dev -> Krobot_commands.Card.test (get_card dev) - OL_signal StateChanged : Krobot_types.card_state OL_signal Error : string let make name card path = - let dev = { - card = card; - obus = OBus.make ~interfaces:[Unsafe.ol_interface; ol_interface] path; - name = name; - state = React.S.const (return ()); - errors = React.E.never; - } in - dev.state <- React.S.map (function - | None -> - state_changed dev `Absent - | Some card -> - dev.errors <- React.E.map (error dev) (Krobot_card.errors card); - state_changed dev `Present) card; + let dev = + OBus.make ~interfaces:[Unsafe.ol_interface; ol_interface] path + (fun obus -> { + card = card; + obus = obus; + name = name; + state = React.S.map (function None -> `Absent | Some _ -> `Present) card; + errors = React.E.never; + }) + in + dev.errors <- ( + React.E.switch React.E.never + (React.E.map + (function + | None -> + React.E.never + | Some card -> + Lwt_event.map_p (error dev) (Krobot_card.errors card)) + (React.S.changes card)) + ); dev end @@ -888,7 +867,8 @@ lwt () = lwt () = try_lwt lwt () = Lwt_log.info ~section "Killing any running driver" in - OBus_connection.method_call bus + OBus_method.call + ~connection:bus ~path:["fr"; "krobot"; "Manager"] ~interface:"fr.krobot.Manager" ~member:"Shutdown" diff --git a/info/control/krobot.mllib b/info/control/krobot.mllib index 03fb8f1..567016e 100644 --- a/info/control/krobot.mllib +++ b/info/control/krobot.mllib @@ -3,3 +3,4 @@ lib_krobot/Krobot_unsafe lib_krobot/Krobot_move common/Krobot_types common/Krobot_config +common/Var diff --git a/info/control/lib_krobot/krobot.ml b/info/control/lib_krobot/krobot.ml index 0969eec..477213c 100644 --- a/info/control/lib_krobot/krobot.ml +++ b/info/control/lib_krobot/krobot.ml @@ -14,42 +14,17 @@ open Lwt open Krobot_types (* +-----------------------------------------------------------------+ - | Krobot_types | + | Krobot_types | +-----------------------------------------------------------------+ *) -type team = Team_red | Team_green - -type card_info = { - card_state : Krobot_types.card_state React.signal; - card_errors : string React.event; -} - -type t = { - (* Basic signals: *) - compass : int React.signal; - logic_sensors : bool array React.signal; - range_finders : int array React.signal; - - (* Cards *) - interface : card_info; - sensor : card_info; - motor : card_info; - monitoring : card_info; - - (* Motors state *) - inhibited_forward_until : float React.signal; - inhibited_backward_until : float React.signal; +include OBus_peer.Private - peer : OBus_peer.t; - (* The driver peer *) -} +type team = Team_red | Team_green type card = [ `Interface | `Sensor | `Motor | `Monitoring ] -let peer krobot = krobot.peer - let card krobot card = - OBus_proxy.make krobot.peer + OBus_proxy.make krobot ["fr"; "krobot"; "Cards"; (match card with | `Interface -> "Interface" | `Sensor -> "Sensor" @@ -57,7 +32,7 @@ let card krobot card = | `Monitoring -> "Monitoring" )] let device krobot name = - OBus_proxy.make krobot.peer ["fr"; "krobot"; "Devices"; name] + OBus_proxy.make krobot ["fr"; "krobot"; "Devices"; name] (* +-----------------------------------------------------------------+ | Helpers | @@ -65,153 +40,52 @@ let device krobot name = (* Create an interface using [t] as type for proxies *) module Make_device(Name : sig val name : string end) = - OBus_proxy.Make +struct + module OBus = OBus_proxy.Make (struct type proxy = t - let cast krobot = OBus_proxy.make krobot.peer ["fr"; "krobot"; "Devices"; Name.name] + let cast krobot = OBus_proxy.make krobot ["fr"; "krobot"; "Devices"; Name.name] let make _ = failwith "not implemented" end) -let make_dev_signal ~peer ~name ~get ~update ~typ ~default = - let proxy = OBus_proxy.make peer ["fr"; "krobot"; "Devices"; name] in - let interface = "fr.krobot.Device." ^ name in - lwt initial = - try_lwt - OBus_proxy.method_call proxy ~interface ~member:get (OBus_type.reply typ) - with exn -> - return default - in - return (React.S.hold initial (OBus_signal.event (OBus_proxy.connect proxy ~interface ~member:update typ))) - -let make_card_signal ~peer ~name ~get ~update ~typ ~default = - let proxy = OBus_proxy.make peer ["fr"; "krobot"; "Cards"; name] in - let interface = "fr.krobot.Card" in - lwt initial = - try_lwt - OBus_proxy.method_call proxy ~interface ~member:get (OBus_type.reply typ) - with exn -> - return default - in - return (React.S.hold initial (OBus_signal.event (OBus_proxy.connect proxy ~interface ~member:update typ))) - -(* +-----------------------------------------------------------------+ - | Creation | - +-----------------------------------------------------------------+ *) - -let bus = lazy( - match try Some(Sys.getenv "KROBOT") with Not_found -> None with - | Some command -> begin - try_lwt - lwt () = Lwt_log.info_f ~section "connecting to the krobot with command %S" command in - let process = Lwt_process.open_process (Lwt_process.shell command) in - let transport = - OBus_transport.make - ~send:(fun msg -> OBus_wire.write_message process#stdin msg) - ~recv:(fun () -> OBus_wire.read_message process#stdout) - ~shutdown:(fun () -> process#close >> return ()) - () - in - let connection = OBus_connection.of_transport transport in - lwt () = OBus_bus.register_connection connection in - return connection - with exn -> - lwt () = Lwt_log.error ~section ~exn "failed to create remote transport" in - fail exn - end - | None -> - try_lwt - lwt () = Lwt_log.info ~section "connecting to the krobot with the local krobot bus" in - OBus_bus.of_addresses (OBus_address.of_string Krobot_config.bus_address) - with exn -> - lwt () = Lwt_log.error ~section ~exn "failed to connect to the local krobot bus" in - fail exn -) - -let create ?peer () = - lwt peer = match peer with - | Some peer -> - return peer - | None -> - lwt bus = Lazy.force bus in - return (OBus_peer.make bus "fr.krobot.Driver") - in - lwt compass = make_dev_signal peer "Compass" "Get" "Value" <:obus_type< int >> 0 - and logic_sensors = make_dev_signal peer "LogicSensors" "Get" "Value" <:obus_type< bool array >> (Array.make 16 false) - and range_finders = make_dev_signal peer "RangeFinders" "Get" "Value" <:obus_type< int array >> (Array.make 8 0) - and inhibited_forward_until = make_dev_signal peer "Motors" "InhibitedForward" "InhibitedForwardChanged" <:obus_type< float >> 0. - and inhibited_backward_until = make_dev_signal peer "Motors" "InhibitedBackward" "InhibitedBackwardChanged" <:obus_type< float >> 0. - and card_interface = make_card_signal peer "Interface" "GetState" "StateChanged" <:obus_type< Krobot_types.card_state >> `Absent - and card_sensor = make_card_signal peer "Sensor" "GetState" "StateChanged" <:obus_type< Krobot_types.card_state >> `Absent - and card_motor = make_card_signal peer "Motor" "GetState" "StateChanged" <:obus_type< Krobot_types.card_state >> `Absent - and card_monitoring = make_card_signal peer "Monitoring" "GetState" "StateChanged" <:obus_type< Krobot_types.card_state >> `Absent - in - return { - peer = peer; - compass = compass; - logic_sensors = logic_sensors; - range_finders = range_finders; - inhibited_forward_until = inhibited_forward_until; - inhibited_backward_until = inhibited_backward_until; - interface = { - card_state = card_interface; - card_errors = (OBus_signal.event - (OBus_proxy.connect - (OBus_proxy.make peer ["fr"; "krobot"; "Cards"; "Interface"]) - ~interface:"fr.krobot.Card" - ~member:"Error" - <:obus_type< string >>)); - }; - sensor = { - card_state = card_sensor; - card_errors = (OBus_signal.event - (OBus_proxy.connect - (OBus_proxy.make peer ["fr"; "krobot"; "Cards"; "Sensor"]) - ~interface:"fr.krobot.Card" - ~member:"Error" - <:obus_type< string >>)); - }; - motor = { - card_state = card_motor; - card_errors = (OBus_signal.event - (OBus_proxy.connect - (OBus_proxy.make peer ["fr"; "krobot"; "Cards"; "Motor"]) - ~interface:"fr.krobot.Card" - ~member:"Error" - <:obus_type< string >>)); - }; - monitoring = { - card_state = card_monitoring; - card_errors = (OBus_signal.event - (OBus_proxy.connect - (OBus_proxy.make peer ["fr"; "krobot"; "Cards"; "Monitoring"]) - ~interface:"fr.krobot.Card" - ~member:"Error" - <:obus_type< string >>)); - }; - } + let op_interface = OBus.make_interface ~notify:(OBus_property.notify_update "PropertiesChanged") "fr.krobot.Device.Compass" +end (* +-----------------------------------------------------------------+ | Reactive signals | +-----------------------------------------------------------------+ *) -let compass krobot = krobot.compass -let logic_sensors krobot = krobot.logic_sensors -let range_finders krobot = krobot.range_finders -let inhibited_forward_until krobot = krobot.inhibited_forward_until -let inhibited_backward_until krobot = krobot.inhibited_backward_until - +(* let team krobot = React.S.map (fun ls -> if ls.(14) then Team_red else Team_green) krobot.logic_sensors let jack krobot = React.S.map (fun ls -> ls.(15)) krobot.logic_sensors +*) +(* +-----------------------------------------------------------------+ + | Compass | + +-----------------------------------------------------------------+ *) + +module Compass = Make_device(struct let name = "Compass" end) +let op_interface = Compass.op_interface + +OP_property_r Value as compass : int + +(* +-----------------------------------------------------------------+ + | Logic sensors | + +-----------------------------------------------------------------+ *) + +module LS = Make_device(struct let name = "LogicSensors" end) +let op_interface = Compass.op_interface + +OP_property_r Value as logic_sensors : bool array (* +-----------------------------------------------------------------+ | LCD | +-----------------------------------------------------------------+ *) module LCD = Make_device(struct let name = "LCD" end) -let op_interface = LCD.make_interface "fr.krobot.Device.LCD" +let op_interface = Compass.op_interface OP_method SetLCD : string list -> unit OP_method BacklightOn : unit @@ -222,8 +96,9 @@ OP_method BacklightOff : unit +-----------------------------------------------------------------+ *) module RF = Make_device(struct let name = "RangeFinders" end) -let op_interface = RF.make_interface "fr.krobot.Device.RangeFinders" +let op_interface = Compass.op_interface +OP_property_r Value as range_finders : int array OP_method GetCalibration : int -> int array OP_method CalibrationStart : int -> bool -> unit OP_method CalibrationStop : unit @@ -234,7 +109,7 @@ OP_method CalibrationContinue : unit +-----------------------------------------------------------------+ *) module AX12 = Make_device(struct let name = "AX12" end) -let op_interface = AX12.make_interface "fr.krobot.Device.AX12" +let op_interface = Compass.op_interface OP_method SetAX12 : Krobot_types.ax12_action structure list -> unit OP_method GripUp : unit @@ -248,7 +123,7 @@ OP_method GripRelease : unit +-----------------------------------------------------------------+ *) module Servo = Make_device(struct let name = "Servo" end) -let op_interface = Servo.make_interface "fr.krobot.Device.Servo" +let op_interface = Compass.op_interface OP_method ClawsEnable : unit OP_method ClawsDisable : unit @@ -261,16 +136,16 @@ OP_method ClawsTake : unit +-----------------------------------------------------------------+ *) module Motors = Make_device(struct let name = "Motors" end) -let op_interface = Motors.make_interface "fr.krobot.Device.Motors" +let op_interface = Compass.op_interface OP_method Turn : angle : int -> velocity : int -> acceleration : int -> Krobot_types.move_result OP_method Move : distance : int -> velocity : int -> acceleration : int -> Krobot_types.move_result OP_method Goto : x : int -> y : int -> velocity : int -> acceleration : int -> mode : Krobot_types.goto_mode -> bypass_distance : int -> Krobot_types.move_result OP_method StopMotors : mode : Krobot_types.stop_mode -> unit OP_method SetVelocities : velocities : int * int -> accelerations : int * int -> duration : float -> unit -OP_method InhibitForward : float -> unit -OP_method InhibitBackward : float -> unit -OP_method GetState as motors_state : string +OP_property_rw InhibitForwardUntil : float +OP_property_rw InhibitBackwardUntil : float +OP_property_r State as motors_state : string (* +-----------------------------------------------------------------+ | Cards | @@ -278,25 +153,12 @@ OP_method GetState as motors_state : string module Card = struct - let name = function | `Interface -> "interface" | `Sensor -> "sensor" | `Motor -> "motor" | `Monitoring -> "monitoring" - let state (krobot, card) = match card with - | `Interface -> krobot.interface.card_state - | `Sensor -> krobot.sensor.card_state - | `Motor -> krobot.motor.card_state - | `Monitoring -> krobot.monitoring.card_state - - let errors (krobot, card) = match card with - | `Interface -> krobot.interface.card_errors - | `Sensor -> krobot.sensor.card_errors - | `Motor -> krobot.motor.card_errors - | `Monitoring -> krobot.monitoring.card_errors - module Proxy = OBus_proxy.Make (struct type proxy = t * card @@ -305,9 +167,61 @@ struct end) let op_interface = Proxy.make_interface "fr.krobot.Card" + OP_method GetFirmwareBuild : string OP_method GetBoardInfo : string OP_method Bootloader : unit OP_method Reset : unit OP_method Test : unit + OP_property_r State : Krobot_types.card_state + OP_signal Errors : string end + +(* +-----------------------------------------------------------------+ + | Creation | + +-----------------------------------------------------------------+ *) + +let bus_state = ref None +let bus_mutex = Lwt_mutex.create () + +let bus () = + Lwt_mutex.with_lock bus_mutex + (fun () -> + match !bus_state with + | Some bus when React.S.value (OBus_connection.running bus) -> + return bus + | _ -> + match try Some(Sys.getenv "KROBOT") with Not_found -> None with + | Some command -> begin + try_lwt + lwt () = Lwt_log.info_f ~section "connecting to the krobot with command %S" command in + let process = Lwt_process.open_process (Lwt_process.shell command) in + let transport = + OBus_transport.make + ~send:(fun msg -> OBus_wire.write_message process#stdin msg) + ~recv:(fun () -> OBus_wire.read_message process#stdout) + ~shutdown:(fun () -> process#close >> return ()) + () + in + let connection = OBus_connection.of_transport transport in + lwt () = OBus_bus.register_connection connection in + bus_state := Some connection; + return connection + with exn -> + lwt () = Lwt_log.error ~section ~exn "failed to create remote transport" in + fail exn + end + | None -> + try_lwt + lwt () = Lwt_log.info ~section "connecting to the krobot with the local krobot bus" in + lwt bus = OBus_bus.of_addresses (OBus_address.of_string Krobot_config.bus_address) in + bus_state := Some bus; + return bus + with exn -> + lwt () = Lwt_log.error ~section ~exn "failed to connect to the local krobot bus" in + fail exn) + + +let create () = + lwt bus = bus () in + return (OBus_peer.make bus "fr.krobot.Driver") diff --git a/info/control/lib_krobot/krobot.mli b/info/control/lib_krobot/krobot.mli index e75e5b2..18802d2 100644 --- a/info/control/lib_krobot/krobot.mli +++ b/info/control/lib_krobot/krobot.mli @@ -11,24 +11,19 @@ (** {6 Krobot object} *) -type t - (** Type of a Krobot client. *) +include OBus_peer.Private -val bus : OBus_bus.t Lwt.t Lazy.t - (** The bus daemon used for the krobot *) +val create : unit -> t Lwt.t + (** [create ()] makes a Krobot valie *) -val create : ?peer : OBus_peer.t -> unit -> t Lwt.t - (** [create ?peer ()] makes a Krobot client value. If [peer] is not - specified, then: +val bus : unit -> OBus_bus.t Lwt.t + (** [bus ()] returns the bus used by the krobot. - if the environment variable [KROBOT] is set, it is used as a - command to connect to the message bus the krobot is using. - - otherwise it uses the local system bus + command to connect to the bus used by the robot, + - otherwise it uses the local krobot bus *) -val peer : t -> OBus_peer.t - (** Returns the driver peer *) - val device : t -> string -> OBus_proxy.t (** [device name] returns a proxy for the given device *) @@ -52,27 +47,27 @@ val backlight_off : t -> unit Lwt.t (** {6 Compass} *) -val compass : t -> int React.signal +val compass : t -> int OBus_property.r (** Signal holding the current value of the compass. *) (** {6 Logic sensors} *) -val logic_sensors : t -> bool array React.signal +val logic_sensors : t -> bool array OBus_property.r (** Signal holding the current state of logic sensors. *) (** {6 Team/jack stuff} *) - +(* type team = Team_red | Team_green -val team : t -> team React.signal +val team : t -> team OBus_property.r (** Signal holding the state of the team button *) -val jack : t -> bool React.signal +val jack : t -> bool OBus_property.r (** Signal holding the status of the jack *) - +*) (** {6 Range finders} *) -val range_finders : t -> int array React.signal +val range_finders : t -> int array OBus_property.r (** Signal holding the current range finders state *) val get_calibration : t -> int -> int array Lwt.t @@ -105,8 +100,8 @@ val claws_take : t -> unit Lwt.t (** {6 Motors} *) -val motors_state : t -> string Lwt.t - (** Return a string describing the current state of motors *) +val motors_state : t -> string OBus_property.r + (** String describing the current state of motors *) val turn : t -> angle : int -> velocity : int -> acceleration : int -> Krobot_types.move_result Lwt.t val move : t -> distance : int -> velocity : int -> acceleration : int -> Krobot_types.move_result Lwt.t @@ -129,21 +124,11 @@ val set_velocities : t -> and stop the motors, unless [set_velocities] is called again before. *) -val inhibit_forward : t -> float -> unit Lwt.t - (** [inhibit_forward krobot delay] forbid forward moves during - [delay] seconds *) +val inhibit_forward_until : t -> float OBus_property.rw + (** The date until which the robot is reallowed to move forward *) -val inhibit_backward : t -> float -> unit Lwt.t - (** [inhibit_backward krobot delay] forbid backward moves during - [delay] seconds *) - -val inhibited_forward_until : t -> float React.signal - (** Signal holding the date until which the robot is reallowed to - move forward *) - -val inhibited_backward_until : t -> float React.signal - (** Signal holding the date until which the robot is reallowed to - move backward *) +val inhibit_backward_until : t -> float OBus_property.rw + (** The date until which the robot is reallowed to move backward *) (** {6 Cards} *) @@ -151,16 +136,17 @@ module Card : sig val name : card -> string (** Returns the name of a card *) - val state : t * card -> Krobot_types.card_state React.signal + val state : t * card -> Krobot_types.card_state OBus_property.r (** Returns the status of one of the card of the krobot *) val bootloader : t * card -> unit Lwt.t (** Put the card into bootloader mode *) - val errors : t * card -> string React.event - val get_firmware_build : t * card -> string Lwt.t val get_board_info : t * card -> string Lwt.t val reset : t * card -> unit Lwt.t val test : t * card -> unit Lwt.t + + val errors : t * card -> string OBus_signal.t + (** Errors on the given card *) end diff --git a/info/control/services/krobot_hard_stop.ml b/info/control/services/krobot_hard_stop.ml index 51b832c..a8e04be 100644 --- a/info/control/services/krobot_hard_stop.ml +++ b/info/control/services/krobot_hard_stop.ml @@ -27,12 +27,12 @@ let handle_collide krobot sensors = join [ (if Krobot_util.front_collide sensors then begin lwt () = Lwt_log.notice "front collision detected, inhibit motors" in - Krobot.inhibit_forward krobot duration + OBus_property.set (Krobot.inhibit_forward_until krobot) duration end else return ()); (if Krobot_util.back_collide sensors then begin lwt () = Lwt_log.notice "back collision detected, inhibit motors" in - Krobot.inhibit_backward krobot duration + OBus_property.set (Krobot.inhibit_backward_until krobot) duration end else return ()); ] @@ -42,7 +42,7 @@ let handle_collide krobot sensors = lwt () = Arg.parse args ignore usage; - lwt bus = Lazy.force Krobot.bus in + lwt bus = Krobot.bus () in (* Ensure there is only one running instance of the service: *) lwt () = Krobot_util.single_instance bus "fr.krobot.HardStop" in @@ -59,11 +59,12 @@ lwt () = lwt krobot = Krobot.create () in (* Stop motors as soon as possible: *) - Lwt_signal.always_notify_p (handle_collide krobot) (Krobot.logic_sensors krobot); + lwt logic_sensors = OBus_property.monitor (Krobot.logic_sensors krobot) in + Lwt_signal.always_notify_p (handle_collide krobot) logic_sensors; (* Continue the inhibition: *) let rec loop () = - lwt () = handle_collide krobot (React.S.value (Krobot.logic_sensors krobot)) in + lwt () = handle_collide krobot (React.S.value logic_sensors) in lwt () = Lwt_unix.sleep (duration /. 2.) in loop () in hooks/post-receive -- krobot |
From: Nicolas D. <Ba...@us...> - 2010-04-01 14:51: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 63a56a07ebda717cedfd5527b1b2af1721d4e12f (commit) from edb5a92b77d38306402cd0aae7aff5f54ba46e7b (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 63a56a07ebda717cedfd5527b1b2af1721d4e12f Author: Nicolas Dandrimont <Nic...@cr...> Date: Thu Apr 1 16:50:15 2010 +0200 Add SMA Footprint for SMD Diodes ----------------------------------------------------------------------- Changes: diff --git a/elec/lib/OrCAD/KROBOT.LLB b/elec/lib/OrCAD/KROBOT.LLB index b0c5173..67b670a 100644 Binary files a/elec/lib/OrCAD/KROBOT.LLB and b/elec/lib/OrCAD/KROBOT.LLB differ hooks/post-receive -- krobot |
From: oiffrig <Ba...@us...> - 2010-04-01 13:46:32
|
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 edb5a92b77d38306402cd0aae7aff5f54ba46e7b (commit) from a43dfb9324452ed9648570d1ddd99cc7e4c52fa4 (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 edb5a92b77d38306402cd0aae7aff5f54ba46e7b Author: Olivier Iffrig <if...@cr...> Date: Thu Apr 1 15:45:13 2010 +0200 Montage des roues et du système d'entraînement de la porte. ----------------------------------------------------------------------- Changes: diff --git a/meca/2010_Junior/Assemblage.CATProduct b/meca/2010_Junior/Assemblage.CATProduct index b34f7b9..5dec242 100644 Binary files a/meca/2010_Junior/Assemblage.CATProduct and b/meca/2010_Junior/Assemblage.CATProduct differ diff --git a/meca/2010_Junior/Axe entrainement porte.CATPart b/meca/2010_Junior/Axe entrainement porte.CATPart new file mode 100644 index 0000000..13bf5fb Binary files /dev/null and b/meca/2010_Junior/Axe entrainement porte.CATPart differ diff --git a/meca/2010_Junior/Baguette entrainement porte.CATPart b/meca/2010_Junior/Baguette entrainement porte.CATPart new file mode 100644 index 0000000..1479630 Binary files /dev/null and b/meca/2010_Junior/Baguette entrainement porte.CATPart differ diff --git a/meca/2010_Junior/Entrainement porte.CATProduct b/meca/2010_Junior/Entrainement porte.CATProduct new file mode 100644 index 0000000..cadab97 Binary files /dev/null and b/meca/2010_Junior/Entrainement porte.CATProduct differ diff --git a/meca/2010_Junior/Guide porte.CATPart b/meca/2010_Junior/Guide porte.CATPart index 540f274..95bca31 100644 Binary files a/meca/2010_Junior/Guide porte.CATPart and b/meca/2010_Junior/Guide porte.CATPart differ diff --git a/meca/Common/Assemblage EMG30.CATProduct b/meca/Common/Assemblage EMG30.CATProduct index 46a34dc..6135aee 100644 Binary files a/meca/Common/Assemblage EMG30.CATProduct and b/meca/Common/Assemblage EMG30.CATProduct differ diff --git a/meca/Common/Moteur EMG30.CATPart b/meca/Common/Moteur EMG30.CATPart index fe9fcdd..63aeb70 100644 Binary files a/meca/Common/Moteur EMG30.CATPart and b/meca/Common/Moteur EMG30.CATPart differ diff --git a/meca/Common/Moyeu omni 1.CATPart b/meca/Common/Moyeu omni 1.CATPart new file mode 100644 index 0000000..8f2173a Binary files /dev/null and b/meca/Common/Moyeu omni 1.CATPart differ diff --git a/meca/Common/Moyeu omni 2.CATPart b/meca/Common/Moyeu omni 2.CATPart new file mode 100644 index 0000000..4463a76 Binary files /dev/null and b/meca/Common/Moyeu omni 2.CATPart differ diff --git a/meca/Common/Roue omnidirectionnelle.CATPart b/meca/Common/Roue omnidirectionnelle.CATPart index 910d005..52c6f2f 100644 Binary files a/meca/Common/Roue omnidirectionnelle.CATPart and b/meca/Common/Roue omnidirectionnelle.CATPart differ diff --git a/meca/Common/Support EMG30.CATPart b/meca/Common/Support EMG30.CATPart index 9a2380e..5dd143f 100644 Binary files a/meca/Common/Support EMG30.CATPart and b/meca/Common/Support EMG30.CATPart differ hooks/post-receive -- krobot |
From: oiffrig <Ba...@us...> - 2010-03-31 21:59:44
|
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 a43dfb9324452ed9648570d1ddd99cc7e4c52fa4 (commit) from ac2981aecdf56bcc56d1540c2a48734b7a86775a (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 a43dfb9324452ed9648570d1ddd99cc7e4c52fa4 Author: Olivier Iffrig <if...@cr...> Date: Wed Mar 31 23:58:41 2010 +0200 Maquettes minimalistes des roues ----------------------------------------------------------------------- Changes: diff --git a/meca/Common/Roue omni double.CATPart b/meca/Common/Roue omni double.CATPart new file mode 100644 index 0000000..57c648c Binary files /dev/null and b/meca/Common/Roue omni double.CATPart differ diff --git a/meca/Common/Roue omnidirectionnelle.CATPart b/meca/Common/Roue omnidirectionnelle.CATPart new file mode 100644 index 0000000..910d005 Binary files /dev/null and b/meca/Common/Roue omnidirectionnelle.CATPart differ hooks/post-receive -- krobot |
From: Jérémie D. <Ba...@us...> - 2010-03-31 20:42: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 ac2981aecdf56bcc56d1540c2a48734b7a86775a (commit) via fd387015dc28818e5fb790402a685a6f1fcedac4 (commit) from 562ee96fe430b5aff4d8af5f682d0c0c326f17e3 (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 ac2981aecdf56bcc56d1540c2a48734b7a86775a Author: Jérémie Dimino <je...@di...> Date: Wed Mar 31 22:42:08 2010 +0200 Choose the minimal angle when turning commit fd387015dc28818e5fb790402a685a6f1fcedac4 Author: Jérémie Dimino <je...@di...> Date: Wed Mar 31 22:09:01 2010 +0200 Update code to match obus changes ----------------------------------------------------------------------- Changes: diff --git a/info/control/clients/krobot_controller.ml b/info/control/clients/krobot_controller.ml index f40fcf8..16e1018 100644 --- a/info/control/clients/krobot_controller.ml +++ b/info/control/clients/krobot_controller.ml @@ -396,7 +396,7 @@ lwt () = (* Service monitoring *) lwt () = check_services bus in - Lwt_event.always_notify_p (fun _ -> check_services bus) (OBus_bus.name_owner_changed bus)#event; + Lwt_event.always_notify_p (fun _ -> check_services bus) (OBus_signal.event (OBus_bus.name_owner_changed bus)); (* Minimum delay to wait between two screen redrawing *) let delay = 1.0 /. (float_of_int refresh_rate) in diff --git a/info/control/common/krobot_util.ml b/info/control/common/krobot_util.ml index 0781326..382a8c4 100644 --- a/info/control/common/krobot_util.ml +++ b/info/control/common/krobot_util.ml @@ -34,7 +34,7 @@ let single_instance bus name = (fun name -> lwt () = Lwt_log.log ~level:Lwt_log.Notice "service restarted, exiting" in exit 0) - (React.E.filter ((=) name) (OBus_bus.name_lost bus)#event); + (React.E.filter ((=) name) (OBus_signal.event (OBus_bus.name_lost bus))); OBus_bus.request_name bus ~allow_replacement:true ~replace_existing:true name >>= function | `Primary_owner -> return () diff --git a/info/control/lib_krobot/krobot.ml b/info/control/lib_krobot/krobot.ml index 234540d..0969eec 100644 --- a/info/control/lib_krobot/krobot.ml +++ b/info/control/lib_krobot/krobot.ml @@ -81,7 +81,7 @@ let make_dev_signal ~peer ~name ~get ~update ~typ ~default = with exn -> return default in - return (React.S.hold initial (OBus_proxy.connect proxy ~interface ~member:update typ)#event) + return (React.S.hold initial (OBus_signal.event (OBus_proxy.connect proxy ~interface ~member:update typ))) let make_card_signal ~peer ~name ~get ~update ~typ ~default = let proxy = OBus_proxy.make peer ["fr"; "krobot"; "Cards"; name] in @@ -92,7 +92,7 @@ let make_card_signal ~peer ~name ~get ~update ~typ ~default = with exn -> return default in - return (React.S.hold initial (OBus_proxy.connect proxy ~interface ~member:update typ)#event) + return (React.S.hold initial (OBus_signal.event (OBus_proxy.connect proxy ~interface ~member:update typ))) (* +-----------------------------------------------------------------+ | Creation | @@ -154,35 +154,39 @@ let create ?peer () = inhibited_backward_until = inhibited_backward_until; interface = { card_state = card_interface; - card_errors = (OBus_proxy.connect - (OBus_proxy.make peer ["fr"; "krobot"; "Cards"; "Interface"]) - ~interface:"fr.krobot.Card" - ~member:"Error" - <:obus_type< string >>)#event; + card_errors = (OBus_signal.event + (OBus_proxy.connect + (OBus_proxy.make peer ["fr"; "krobot"; "Cards"; "Interface"]) + ~interface:"fr.krobot.Card" + ~member:"Error" + <:obus_type< string >>)); }; sensor = { card_state = card_sensor; - card_errors = (OBus_proxy.connect - (OBus_proxy.make peer ["fr"; "krobot"; "Cards"; "Sensor"]) - ~interface:"fr.krobot.Card" - ~member:"Error" - <:obus_type< string >>)#event; + card_errors = (OBus_signal.event + (OBus_proxy.connect + (OBus_proxy.make peer ["fr"; "krobot"; "Cards"; "Sensor"]) + ~interface:"fr.krobot.Card" + ~member:"Error" + <:obus_type< string >>)); }; motor = { card_state = card_motor; - card_errors = (OBus_proxy.connect - (OBus_proxy.make peer ["fr"; "krobot"; "Cards"; "Motor"]) - ~interface:"fr.krobot.Card" - ~member:"Error" - <:obus_type< string >>)#event; + card_errors = (OBus_signal.event + (OBus_proxy.connect + (OBus_proxy.make peer ["fr"; "krobot"; "Cards"; "Motor"]) + ~interface:"fr.krobot.Card" + ~member:"Error" + <:obus_type< string >>)); }; monitoring = { card_state = card_monitoring; - card_errors = (OBus_proxy.connect - (OBus_proxy.make peer ["fr"; "krobot"; "Cards"; "Monitoring"]) - ~interface:"fr.krobot.Card" - ~member:"Error" - <:obus_type< string >>)#event; + card_errors = (OBus_signal.event + (OBus_proxy.connect + (OBus_proxy.make peer ["fr"; "krobot"; "Cards"; "Monitoring"]) + ~interface:"fr.krobot.Card" + ~member:"Error" + <:obus_type< string >>)); }; } diff --git a/info/control/tests/move.ml b/info/control/tests/move.ml index 04e7216..28145e7 100644 --- a/info/control/tests/move.ml +++ b/info/control/tests/move.ml @@ -11,14 +11,18 @@ open Lwt open Printf open Krobot_move -let graph = List.fold_left (fun graph edge -> add_edge edge graph) empty [ - ({ vx = 0; vy = 0 }, { vx = 0; vy = 100 }); - ({ vx = 0; vy = 100 }, { vx = 100; vy = 100 }); - ({ vx = 100; vy = 100 }, { vx = 100; vy = 200 }); -] +let velocity = 200 +let acceleration = 400 let init = { vx = 0; vy = 0 } -let dest = { vx = 100; vy = 200 } +let dest = { vx = -100; vy = 100 } + +let a = { vx = 0; vy = 200 } + +let graph = List.fold_left (fun graph edge -> add_edge edge graph) empty [ + (init, a); + (a, dest); +] let rec loop krobot position angle = if position = dest then @@ -26,19 +30,27 @@ let rec loop krobot position angle = else begin let next = Krobot_move.move graph position dest in printf "(%d, %d) -> (%d, %d)\n" position.vx position.vy next.vx next.vy; - let diff = Krobot_move.angle position next - angle in + let diff = (Krobot_move.angle position next - angle) mod 360 in + let diff = + if diff < -180 then + diff + 360 + else if diff > 180 then + diff - 360 + else + diff + in printf " current; %d, diff: %d\n" angle diff; lwt () = match krobot with | Some krobot -> lwt () = if diff <> 0 then - lwt _ = Krobot.turn krobot ~angle:diff ~velocity:400 ~acceleration:400 in + lwt _ = Krobot.turn krobot ~angle:(diff mod 360) ~velocity ~acceleration in return () else return () in - lwt _ = Krobot.move krobot ~distance:(Krobot_move.distance position next) ~velocity:400 ~acceleration:400 in + lwt _ = Krobot.move krobot ~distance:(Krobot_move.distance position next) ~velocity ~acceleration in return () | None -> return () hooks/post-receive -- krobot |
From: oiffrig <Ba...@us...> - 2010-03-31 20:24:59
|
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 562ee96fe430b5aff4d8af5f682d0c0c326f17e3 (commit) from 4fc9a4210880a4ba206ebfb23c4ad686f90df2d0 (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 562ee96fe430b5aff4d8af5f682d0c0c326f17e3 Author: Olivier Iffrig <if...@cr...> Date: Wed Mar 31 22:14:22 2010 +0200 Réorganisation côté Jr ----------------------------------------------------------------------- Changes: diff --git a/meca/2010_Junior/Assemblage.CATProduct b/meca/2010_Junior/Assemblage.CATProduct index eeff1d0..b34f7b9 100644 Binary files a/meca/2010_Junior/Assemblage.CATProduct and b/meca/2010_Junior/Assemblage.CATProduct differ diff --git a/meca/2010_Junior/Bras.CATProduct b/meca/2010_Junior/Bras.CATProduct index e320f40..e32e2f8 100644 Binary files a/meca/2010_Junior/Bras.CATProduct and b/meca/2010_Junior/Bras.CATProduct differ diff --git a/meca/2010_Table/Assemblage mais fixe.CATProduct b/meca/2010_Table/Assemblage mais fixe.CATProduct new file mode 100644 index 0000000..433a9f4 Binary files /dev/null and b/meca/2010_Table/Assemblage mais fixe.CATProduct differ diff --git a/meca/2010_Table/AssemblageTable.CATProduct b/meca/2010_Table/AssemblageTable.CATProduct new file mode 100644 index 0000000..f7cb946 Binary files /dev/null and b/meca/2010_Table/AssemblageTable.CATProduct differ diff --git a/meca/2010_Table/Corps mais fixe.CATPart b/meca/2010_Table/Corps mais fixe.CATPart new file mode 100644 index 0000000..52a41b2 Binary files /dev/null and b/meca/2010_Table/Corps mais fixe.CATPart differ diff --git a/meca/2010_Table/Mais mobile.CATPart b/meca/2010_Table/Mais mobile.CATPart new file mode 100644 index 0000000..e0912f6 Binary files /dev/null and b/meca/2010_Table/Mais mobile.CATPart differ diff --git a/meca/2010_Table/Orange.CATPart b/meca/2010_Table/Orange.CATPart new file mode 100644 index 0000000..81a29e6 Binary files /dev/null and b/meca/2010_Table/Orange.CATPart differ diff --git a/meca/2010_Table/Table.CATPart b/meca/2010_Table/Table.CATPart new file mode 100644 index 0000000..ff25f6b Binary files /dev/null and b/meca/2010_Table/Table.CATPart differ diff --git a/meca/2010_Table/Tomate.CATPart b/meca/2010_Table/Tomate.CATPart new file mode 100644 index 0000000..d13122d Binary files /dev/null and b/meca/2010_Table/Tomate.CATPart differ diff --git a/meca/2010_Table/Vis mais fixe.CATPart b/meca/2010_Table/Vis mais fixe.CATPart new file mode 100644 index 0000000..debcfb0 Binary files /dev/null and b/meca/2010_Table/Vis mais fixe.CATPart differ diff --git a/meca/Common/AX-12.CATPart b/meca/Common/AX-12.CATPart new file mode 100644 index 0000000..0e417c8 Binary files /dev/null and b/meca/Common/AX-12.CATPart differ diff --git a/meca/Common/Assemblage EMG30.CATProduct b/meca/Common/Assemblage EMG30.CATProduct new file mode 100644 index 0000000..46a34dc Binary files /dev/null and b/meca/Common/Assemblage EMG30.CATProduct differ diff --git a/meca/Common/Assemblage moteur EMG30.CATProduct b/meca/Common/Assemblage moteur EMG30.CATProduct new file mode 100644 index 0000000..4544342 Binary files /dev/null and b/meca/Common/Assemblage moteur EMG30.CATProduct differ diff --git a/meca/Common/Axe moteur EMG30.CATPart b/meca/Common/Axe moteur EMG30.CATPart new file mode 100644 index 0000000..2263cf4 Binary files /dev/null and b/meca/Common/Axe moteur EMG30.CATPart differ diff --git a/meca/Common/Entretoise/Entretoise M3 F-F 10mm.CATPart b/meca/Common/Entretoise/Entretoise M3 F-F 10mm.CATPart new file mode 100644 index 0000000..5762b02 Binary files /dev/null and b/meca/Common/Entretoise/Entretoise M3 F-F 10mm.CATPart differ diff --git a/meca/Common/Entretoise/Entretoise M3 M-F 10mm.CATPart b/meca/Common/Entretoise/Entretoise M3 M-F 10mm.CATPart new file mode 100644 index 0000000..6f70b77 Binary files /dev/null and b/meca/Common/Entretoise/Entretoise M3 M-F 10mm.CATPart differ diff --git a/meca/Common/Entretoise/Entretoise M3 M-F 30mm.CATPart b/meca/Common/Entretoise/Entretoise M3 M-F 30mm.CATPart new file mode 100644 index 0000000..e993c8e Binary files /dev/null and b/meca/Common/Entretoise/Entretoise M3 M-F 30mm.CATPart differ diff --git a/meca/Common/Entretoise/Entretoise M3 M-F 40mm.CATPart b/meca/Common/Entretoise/Entretoise M3 M-F 40mm.CATPart new file mode 100644 index 0000000..36c3bf8 Binary files /dev/null and b/meca/Common/Entretoise/Entretoise M3 M-F 40mm.CATPart differ diff --git a/meca/Common/Entretoise/Entretoise M4 M-F 10mm.CATPart b/meca/Common/Entretoise/Entretoise M4 M-F 10mm.CATPart new file mode 100644 index 0000000..7957545 Binary files /dev/null and b/meca/Common/Entretoise/Entretoise M4 M-F 10mm.CATPart differ diff --git a/meca/Common/Entretoise/Entretoise M4 M-F 20mm.CATPart b/meca/Common/Entretoise/Entretoise M4 M-F 20mm.CATPart new file mode 100644 index 0000000..8cdfa8b Binary files /dev/null and b/meca/Common/Entretoise/Entretoise M4 M-F 20mm.CATPart differ diff --git a/meca/Common/Entretoise/Entretoise M4 M-F 60mm.CATPart b/meca/Common/Entretoise/Entretoise M4 M-F 60mm.CATPart new file mode 100644 index 0000000..774fd24 Binary files /dev/null and b/meca/Common/Entretoise/Entretoise M4 M-F 60mm.CATPart differ diff --git a/meca/Common/Moteur EMG30.CATPart b/meca/Common/Moteur EMG30.CATPart new file mode 100644 index 0000000..fe9fcdd Binary files /dev/null and b/meca/Common/Moteur EMG30.CATPart differ diff --git a/meca/Common/OF-12S.CATPart b/meca/Common/OF-12S.CATPart new file mode 100644 index 0000000..66a466d Binary files /dev/null and b/meca/Common/OF-12S.CATPart differ diff --git a/meca/Common/OF-12SH.CATPart b/meca/Common/OF-12SH.CATPart new file mode 100644 index 0000000..b0498b0 Binary files /dev/null and b/meca/Common/OF-12SH.CATPart differ diff --git a/meca/Common/Profile en L 2x2x0.125 pouce.CATPart b/meca/Common/Profile en L 2x2x0.125 pouce.CATPart new file mode 100644 index 0000000..d221149 Binary files /dev/null and b/meca/Common/Profile en L 2x2x0.125 pouce.CATPart differ diff --git a/meca/Common/Profile en U 1x1x0.125 pouce.CATPart b/meca/Common/Profile en U 1x1x0.125 pouce.CATPart new file mode 100644 index 0000000..118249d Binary files /dev/null and b/meca/Common/Profile en U 1x1x0.125 pouce.CATPart differ diff --git a/meca/Common/Support EMG30.CATPart b/meca/Common/Support EMG30.CATPart new file mode 100644 index 0000000..9a2380e Binary files /dev/null and b/meca/Common/Support EMG30.CATPart differ hooks/post-receive -- krobot |
From: oiffrig <Ba...@us...> - 2010-03-31 19:32: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 b31bc7a50dadf5669b889fe4296ca90dd5a7f47b (commit) from f9f2b69f1bab4796a983bd4349a656c4e2771b52 (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 b31bc7a50dadf5669b889fe4296ca90dd5a7f47b Author: Olivier Iffrig <if...@cr...> Date: Wed Mar 31 21:31:39 2010 +0200 Suite du bras, manque plus que la pince ----------------------------------------------------------------------- Changes: diff --git a/Robot_Jr/Meca/Bras.CATProduct b/Robot_Jr/Meca/Bras.CATProduct index d15beea..e320f40 100644 Binary files a/Robot_Jr/Meca/Bras.CATProduct and b/Robot_Jr/Meca/Bras.CATProduct differ diff --git a/Robot_Jr/Meca/L bras 2.CATPart b/Robot_Jr/Meca/L bras 2.CATPart new file mode 100644 index 0000000..ef93858 Binary files /dev/null and b/Robot_Jr/Meca/L bras 2.CATPart differ hooks/post-receive -- krobot |
From: oiffrig <Ba...@us...> - 2010-03-29 21:13:12
|
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 f9f2b69f1bab4796a983bd4349a656c4e2771b52 (commit) from a4c94e5b7dfe71df192312cc0b5edc83bd678e1f (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 f9f2b69f1bab4796a983bd4349a656c4e2771b52 Author: Olivier Iffrig <if...@cr...> Date: Mon Mar 29 23:10:59 2010 +0200 Début de la porte et du bras ----------------------------------------------------------------------- Changes: diff --git a/Robot_Jr/Meca/Assemblage.CATProduct b/Robot_Jr/Meca/Assemblage.CATProduct index f279861..eeff1d0 100644 Binary files a/Robot_Jr/Meca/Assemblage.CATProduct and b/Robot_Jr/Meca/Assemblage.CATProduct differ diff --git a/Robot_Jr/Meca/Axe porte.CATPart b/Robot_Jr/Meca/Axe porte.CATPart new file mode 100644 index 0000000..2744d94 Binary files /dev/null and b/Robot_Jr/Meca/Axe porte.CATPart differ diff --git a/Robot_Jr/Meca/Bras.CATProduct b/Robot_Jr/Meca/Bras.CATProduct new file mode 100644 index 0000000..d15beea Binary files /dev/null and b/Robot_Jr/Meca/Bras.CATProduct differ diff --git a/Robot_Jr/Meca/Guide porte.CATPart b/Robot_Jr/Meca/Guide porte.CATPart index c949213..540f274 100644 Binary files a/Robot_Jr/Meca/Guide porte.CATPart and b/Robot_Jr/Meca/Guide porte.CATPart differ diff --git a/Robot_Jr/Meca/L bras.CATPart b/Robot_Jr/Meca/L bras.CATPart new file mode 100644 index 0000000..a69c1f6 Binary files /dev/null and b/Robot_Jr/Meca/L bras.CATPart differ diff --git a/Robot_Jr/Meca/Plaque porte.CATPart b/Robot_Jr/Meca/Plaque porte.CATPart index 3cbad6d..9887153 100644 Binary files a/Robot_Jr/Meca/Plaque porte.CATPart and b/Robot_Jr/Meca/Plaque porte.CATPart differ diff --git a/Robot_Jr/Meca/Porte.CATProduct b/Robot_Jr/Meca/Porte.CATProduct new file mode 100644 index 0000000..786d4b2 Binary files /dev/null and b/Robot_Jr/Meca/Porte.CATProduct differ diff --git a/Robot_Jr/Meca/U bras.CATPart b/Robot_Jr/Meca/U bras.CATPart new file mode 100644 index 0000000..3a0e885 Binary files /dev/null and b/Robot_Jr/Meca/U bras.CATPart differ hooks/post-receive -- krobot |
From: Jérémie D. <Ba...@us...> - 2010-03-28 17:59: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 a4c94e5b7dfe71df192312cc0b5edc83bd678e1f (commit) from 0ecd473b933a4ea03a9d4e72f818441bb3406c5a (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 a4c94e5b7dfe71df192312cc0b5edc83bd678e1f Author: Jérémie Dimino <je...@di...> Date: Sun Mar 28 18:58:53 2010 +0200 add a tool for interactive control of the ax12s ----------------------------------------------------------------------- Changes: diff --git a/PC_Mainboard/Makefile b/PC_Mainboard/Makefile index 9435bbb..bbaf447 100644 --- a/PC_Mainboard/Makefile +++ b/PC_Mainboard/Makefile @@ -40,6 +40,7 @@ install: install -m 0755 _build/clients/krobot_controller.best $(PREFIX)/bin/krobot-controller install -m 0755 _build/services/krobot_hard_stop.best $(PREFIX)/bin/krobot-hard-stop install -m 0755 _build/driver/krobot_driver.best $(PREFIX)/bin/krobot-driver + install -m 0755 _build/clients/krobot_ax12.best $(PREFIX)/bin/krobot-ax12 .PHONY: uninstall uninstall: diff --git a/PC_Mainboard/_tags b/PC_Mainboard/_tags index 4f33d64..bf46a8a 100644 --- a/PC_Mainboard/_tags +++ b/PC_Mainboard/_tags @@ -26,6 +26,7 @@ <clients/krobot_joy_control.*>: pkg_sdl <clients/krobot_controller.*>: pkg_lwt.text <clients/krobot_script*>: pkg_text +<clients/krobot_ax12.*>: pkg_lwt.text # +------------------------------------------------------------------+ # | Services | diff --git a/PC_Mainboard/clients/krobot_ax12.ml b/PC_Mainboard/clients/krobot_ax12.ml new file mode 100644 index 0000000..439ac38 --- /dev/null +++ b/PC_Mainboard/clients/krobot_ax12.ml @@ -0,0 +1,83 @@ +(* + * krobot_ax12.ml + * -------------- + * Copyright : (c) 2010, Jeremie Dimino <je...@di...> + * Licence : BSD3 + * + * This file is a part of [kro]bot. + *) + +(* AX12 interactive controller *) + +open Lwt +open Lwt_io +open Lwt_term + +let render positions selected = + let size = React.S.value Lwt_term.size in + let zone = Zone.make ~width:size.columns ~height:size.lines in + let x = (size.columns / 2) - 7 in + let y = (size.lines / 2) - (Array.length positions / 2) in + for i = 0 to Array.length positions - 1 do + if i = selected then + Draw.textc ~zone ~x ~y:(y + i * 2) + ~text:[inverse; textf "ax12[%d] : %4d" (i + 1) positions.(i)] + else + Draw.textc ~zone ~x ~y:(y + i * 2) + ~text:[textf "ax12[%d] : %4d" (i + 1) positions.(i)] + done; + Lwt_term.render (Zone.points zone) + +lwt () = + lwt krobot = Krobot.create () in + + lwt () = Lwt_log.notice "reading current ax12 positions" in + lwt pos1 = Krobot_unsafe.AX12.get_position krobot ~id:1 ~timeout:100 + and pos2 = Krobot_unsafe.AX12.get_position krobot ~id:2 ~timeout:100 + and pos3 = Krobot_unsafe.AX12.get_position krobot ~id:3 ~timeout:100 in + lwt () = Lwt_log.notice "done" in + + let positions = [|pos1; pos2; pos3|] in + + let rec loop selected = + lwt () = render positions selected in + Lwt_term.read_key () >>= function + | Key_up -> + if selected > 0 then + loop (selected - 1) + else + loop selected + | Key_down -> + if selected < Array.length positions - 1 then + loop (selected + 1) + else + loop selected + | Key_left -> + positions.(selected) <- max 0 (positions.(selected) - 10); + lwt () = Krobot_unsafe.AX12.goto krobot ~id:(selected + 1) ~position:positions.(selected) ~velocity:50 ~mode:`Now in + loop selected + | Key_right -> + positions.(selected) <- min 1023 (positions.(selected) + 10); + lwt () = Krobot_unsafe.AX12.goto krobot ~id:(selected + 1) ~position:positions.(selected) ~velocity:50 ~mode:`Now in + loop selected + | Key ("\027[d" | "\027[1;2D") -> + positions.(selected) <- max 0 (positions.(selected) - 1); + lwt () = Krobot_unsafe.AX12.goto krobot ~id:(selected + 1) ~position:positions.(selected) ~velocity:50 ~mode:`Now in + loop selected + | Key ("\027[c" | "\027[1;2C") -> + positions.(selected) <- min 1023 (positions.(selected) + 1); + lwt () = Krobot_unsafe.AX12.goto krobot ~id:(selected + 1) ~position:positions.(selected) ~velocity:50 ~mode:`Now in + loop selected + | Key_control '[' -> + return () + | _ -> + loop selected + in + + lwt () = Lwt_term.enter_drawing_mode () in + lwt () = Lwt_term.hide_cursor () in + + try_lwt + loop 0 + finally + Lwt_term.leave_drawing_mode () diff --git a/PC_Mainboard/myocamlbuild.ml b/PC_Mainboard/myocamlbuild.ml index 42a97e6..4a083c6 100644 --- a/PC_Mainboard/myocamlbuild.ml +++ b/PC_Mainboard/myocamlbuild.ml @@ -73,6 +73,7 @@ let targets = List.filter_opt (function (true, target) -> Some target | (false, (have_lwt_unix && have_obus, "clients/krobot_init_position.best"); (have_lwt_unix && have_obus && have_lwt_text, "clients/krobot_controller.best"); (have_lwt_unix && have_obus && have_sdl, "clients/krobot_joy_control.best"); + (have_lwt_unix && have_obus && have_lwt_text, "clients/krobot_ax12.best"); (* Services *) (have_lwt_unix && have_obus, "services/krobot_hard_stop.best"); hooks/post-receive -- krobot |
From: Jérémie D. <Ba...@us...> - 2010-03-28 16:50: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 0ecd473b933a4ea03a9d4e72f818441bb3406c5a (commit) via d8f9e3d9489155d105dced516e33419433bd63d6 (commit) from 893ed223d609b74ea814468ded4ad5f5d54a29f0 (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 0ecd473b933a4ea03a9d4e72f818441bb3406c5a Author: Jérémie Dimino <je...@di...> Date: Sun Mar 28 17:21:26 2010 +0200 add the script command grip.release commit d8f9e3d9489155d105dced516e33419433bd63d6 Author: Jérémie Dimino <je...@di...> Date: Sun Mar 28 17:19:51 2010 +0200 Advanced movements for the grip ----------------------------------------------------------------------- Changes: diff --git a/PC_Mainboard/clients/krobot_script.ml b/PC_Mainboard/clients/krobot_script.ml index 59de7aa..7322c89 100644 --- a/PC_Mainboard/clients/krobot_script.ml +++ b/PC_Mainboard/clients/krobot_script.ml @@ -275,7 +275,7 @@ let () = let id = int "id" and position = int "position" - and velocity = int ~default:Krobot_config.ax12_default_velocity "velocity" + and velocity = int ~default:50 "velocity" and timeout = int ~default:100 "timeout" and goto_mode = keyword ~default:`Now "mode" [("now", `Now); ("action", `Action)] in @@ -330,6 +330,9 @@ let () = register ~path:["grip"] "close" f0 (fun logger krobot -> Krobot.grip_close krobot); + register ~path:["grip"] "release" f0 + (fun logger krobot -> + Krobot.grip_release krobot); (* +---------------------------------------------------------------+ | Claws | diff --git a/PC_Mainboard/common/krobot_config.ml b/PC_Mainboard/common/krobot_config.ml index 1895a58..f51a703 100644 --- a/PC_Mainboard/common/krobot_config.ml +++ b/PC_Mainboard/common/krobot_config.ml @@ -13,8 +13,3 @@ let initial_position = 200 let bus_address = "unix:abstract=krobot" let update_delay = 0.05 let reopen_delay = 1.0 - -let ax12_grip_up_down = 1 -let grip_up_position = 880 -let grip_down_position = 580 -let ax12_default_velocity = 50 diff --git a/PC_Mainboard/common/krobot_config.mli b/PC_Mainboard/common/krobot_config.mli index aa34719..a582c32 100644 --- a/PC_Mainboard/common/krobot_config.mli +++ b/PC_Mainboard/common/krobot_config.mli @@ -26,8 +26,3 @@ val update_delay : float val reopen_delay : float (** Time to wait before retrying to open a card *) - -val ax12_grip_up_down : int -val grip_up_position : int -val grip_down_position : int -val ax12_default_velocity : int diff --git a/PC_Mainboard/driver/krobot_driver.ml b/PC_Mainboard/driver/krobot_driver.ml index 7998bdd..5d37d75 100644 --- a/PC_Mainboard/driver/krobot_driver.ml +++ b/PC_Mainboard/driver/krobot_driver.ml @@ -194,6 +194,14 @@ struct module Unsafe = Krobot_exports.AX12(OBus)(struct let get dev = dev.card end) + let grip_up_position = 880 + let grip_down_position = 580 + let ax12_default_velocity = 50 + + (* +---------------------------------------------------------------+ + | High-level commands | + +---------------------------------------------------------------+ *) + let ol_interface = OBus.make_interface "fr.krobot.Device.AX12" OL_method SetAX12 : Krobot_types.ax12_action structure list -> unit = fun dev actions -> @@ -211,18 +219,42 @@ struct Krobot_commands.AX12.action dev.card ~id:0xfe OL_method GripUp : unit = fun dev -> - set_ax12 dev [{ aa_id = Krobot_config.ax12_grip_up_down; aa_position = Krobot_config.grip_up_position; aa_velocity = Krobot_config.ax12_default_velocity }] + set_ax12 dev [{ aa_id = 1; + aa_position = 880; + aa_velocity = 50 }; + { aa_id = 2; + aa_position = 180; + aa_velocity = 50 }] OL_method GripDown : unit = fun dev -> - set_ax12 dev [{ aa_id = Krobot_config.ax12_grip_up_down; aa_position = Krobot_config.grip_down_position; aa_velocity = Krobot_config.ax12_default_velocity }] + set_ax12 dev [{ aa_id = 1; + aa_position = 580; + aa_velocity = 50 }; + { aa_id = 2; + aa_position = 510; + aa_velocity = 50 }; + { aa_id = 3; + aa_position = 390; + aa_velocity = 200 }] OL_method GripOpen : unit = fun dev -> - set_ax12 dev [{ aa_id = 2; aa_position = 610; aa_velocity = 100 }; - { aa_id = 3; aa_position = 265; aa_velocity = 200 }] + set_ax12 dev [{ aa_id = 2; + aa_position = 610; + aa_velocity = 100 }; + { aa_id = 3; + aa_position = 265; + aa_velocity = 200 }] OL_method GripClose : unit = fun dev -> - set_ax12 dev [{ aa_id = 2; aa_position = 510; aa_velocity = 100 }; - { aa_id = 3; aa_position = 390; aa_velocity = 200 }] + set_ax12 dev [{ aa_id = 2; + aa_position = 510; + aa_velocity = 100 }; + { aa_id = 3; + aa_position = 390; + aa_velocity = 200 }] + + OL_method GripRelease : unit = fun dev -> + Krobot_commands.AX12.goto dev.card ~id:3 ~position:200 ~velocity:200 ~mode:`Now let make card path = return { diff --git a/PC_Mainboard/lib_krobot/krobot.ml b/PC_Mainboard/lib_krobot/krobot.ml index acfb6df..234540d 100644 --- a/PC_Mainboard/lib_krobot/krobot.ml +++ b/PC_Mainboard/lib_krobot/krobot.ml @@ -237,6 +237,7 @@ OP_method GripUp : unit OP_method GripDown : unit OP_method GripOpen : unit OP_method GripClose : unit +OP_method GripRelease : unit (* +-----------------------------------------------------------------+ | Servo | diff --git a/PC_Mainboard/lib_krobot/krobot.mli b/PC_Mainboard/lib_krobot/krobot.mli index 7c7fed3..e75e5b2 100644 --- a/PC_Mainboard/lib_krobot/krobot.mli +++ b/PC_Mainboard/lib_krobot/krobot.mli @@ -93,7 +93,7 @@ val grip_up : t -> unit Lwt.t val grip_down : t -> unit Lwt.t val grip_open : t -> unit Lwt.t val grip_close : t -> unit Lwt.t - +val grip_release : t -> unit Lwt.t (** {6 Servos} *) hooks/post-receive -- krobot |
From: Jérémie D. <Ba...@us...> - 2010-03-28 08:50:43
|
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 893ed223d609b74ea814468ded4ad5f5d54a29f0 (commit) via eab764ff233b9042af662a60298f855413947201 (commit) via bd4bbf755162f216cc9afab5787917521efca6ac (commit) via 620f4f865763156cdfc80c090c43596a6ffcc991 (commit) from 55d744ede328cc22f5e3cd1f4904183472907936 (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 893ed223d609b74ea814468ded4ad5f5d54a29f0 Author: Jérémie Dimino <je...@di...> Date: Sun Mar 28 10:37:48 2010 +0200 krobot-forward-dbus: do not fail on end-of-file commit eab764ff233b9042af662a60298f855413947201 Author: Jérémie Dimino <je...@di...> Date: Sun Mar 28 10:37:13 2010 +0200 rename some modules commit bd4bbf755162f216cc9afab5787917521efca6ac Author: Jérémie Dimino <je...@di...> Date: Sat Mar 27 23:53:38 2010 +0100 adapt position for the new grip commit 620f4f865763156cdfc80c090c43596a6ffcc991 Author: Kro[bot] <krobot@wally.(none)> Date: Sat Mar 27 22:28:51 2010 +0000 Be less aggressive with the compass ----------------------------------------------------------------------- Changes: diff --git a/PC_Mainboard/Makefile b/PC_Mainboard/Makefile index 079e436..9435bbb 100644 --- a/PC_Mainboard/Makefile +++ b/PC_Mainboard/Makefile @@ -32,13 +32,13 @@ install: $(wildcard _build/*.cmxa) \ $(wildcard _build/*.cmxs) \ $(wildcard _build/*.a) - install -m 0755 _build/card_tools/send_firmware.best $(PREFIX)/bin/krobot-send-firmware - install -m 0755 _build/card_tools/dump_memory.best $(PREFIX)/bin/krobot-dump-memory - install -m 0755 _build/tools/forward_dbus.best $(PREFIX)/bin/krobot-forward-dbus + install -m 0755 _build/card_tools/krobot_send_firmware.best $(PREFIX)/bin/krobot-send-firmware + install -m 0755 _build/card_tools/krobot_dump_memory.best $(PREFIX)/bin/krobot-dump-memory + install -m 0755 _build/tools/krobot_forward_dbus.best $(PREFIX)/bin/krobot-forward-dbus install -m 0755 _build/clients/krobot_info.best $(PREFIX)/bin/krobot-info install -m 0755 _build/clients/krobot_joy_control.best $(PREFIX)/bin/krobot-joystick install -m 0755 _build/clients/krobot_controller.best $(PREFIX)/bin/krobot-controller - install -m 0755 _build/services/hard_stop.best $(PREFIX)/bin/krobot-hard-stop + install -m 0755 _build/services/krobot_hard_stop.best $(PREFIX)/bin/krobot-hard-stop install -m 0755 _build/driver/krobot_driver.best $(PREFIX)/bin/krobot-driver .PHONY: uninstall diff --git a/PC_Mainboard/_tags b/PC_Mainboard/_tags index 6eaf178..4f33d64 100644 --- a/PC_Mainboard/_tags +++ b/PC_Mainboard/_tags @@ -52,8 +52,8 @@ # | Tools | # +------------------------------------------------------------------+ -<tools/forward_dbus.ml>: syntax_camlp4o, pkg_lwt.syntax, pkg_lwt.syntax.log, pkg_obus.syntax -<tools/forward_dbus.*>: pkg_obus +<tools/krobot_forward_dbus.ml>: syntax_camlp4o, pkg_lwt.syntax, pkg_lwt.syntax.log, pkg_obus.syntax +<tools/krobot_forward_dbus.*>: pkg_obus # +------------------------------------------------------------------+ # | Tests | diff --git a/PC_Mainboard/card_tools/boardname.mli b/PC_Mainboard/card_tools/boardname.mli deleted file mode 100644 index 23b0032..0000000 --- a/PC_Mainboard/card_tools/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/boardname.mll b/PC_Mainboard/card_tools/boardname.mll deleted file mode 100644 index 08df665..0000000 --- a/PC_Mainboard/card_tools/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" | "Battery Monitoring ") [^'\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 deleted file mode 100644 index 35b407e..0000000 --- a/PC_Mainboard/card_tools/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:PcInterface.usb_vid - ~product_id:PcInterface.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 PcInterface.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 PcInterface.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] <> PcInterface.erase_flash then - failwith (UnexpectedReply (receive_buffer, String.make 1 (char_of_int PcInterface.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 PcInterface.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] <> PcInterface.write_flash then - failwith (UnexpectedReply (receive_buffer, String.make 1 (char_of_int PcInterface.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 PcInterface.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 deleted file mode 100644 index 5c746e0..0000000 --- a/PC_Mainboard/card_tools/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/hexfile.ml b/PC_Mainboard/card_tools/hexfile.ml deleted file mode 100644 index a667957..0000000 --- a/PC_Mainboard/card_tools/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 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 deleted file mode 100644 index c6fa563..0000000 --- a/PC_Mainboard/card_tools/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/krobot_boardname.mli b/PC_Mainboard/card_tools/krobot_boardname.mli new file mode 100644 index 0000000..51dc1b5 --- /dev/null +++ b/PC_Mainboard/card_tools/krobot_boardname.mli @@ -0,0 +1,12 @@ +(* + * krobot_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/krobot_boardname.mll b/PC_Mainboard/card_tools/krobot_boardname.mll new file mode 100644 index 0000000..96b39b6 --- /dev/null +++ b/PC_Mainboard/card_tools/krobot_boardname.mll @@ -0,0 +1,22 @@ +(* + * krobot_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" | "Battery Monitoring ") [^'\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/krobot_bootloader.ml b/PC_Mainboard/card_tools/krobot_bootloader.ml new file mode 100644 index 0000000..1deb632 --- /dev/null +++ b/PC_Mainboard/card_tools/krobot_bootloader.ml @@ -0,0 +1,184 @@ +(* + * krobot_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:PcInterface.usb_vid + ~product_id:PcInterface.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 PcInterface.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 PcInterface.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] <> PcInterface.erase_flash then + failwith (UnexpectedReply (receive_buffer, String.make 1 (char_of_int PcInterface.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 PcInterface.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] <> PcInterface.write_flash then + failwith (UnexpectedReply (receive_buffer, String.make 1 (char_of_int PcInterface.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 PcInterface.reset; + lwt () = send_receive_packet k send_buffer 1 receive_buffer 64 5. 5. in + return () diff --git a/PC_Mainboard/card_tools/krobot_dump_memory.ml b/PC_Mainboard/card_tools/krobot_dump_memory.ml new file mode 100644 index 0000000..91b80d1 --- /dev/null +++ b/PC_Mainboard/card_tools/krobot_dump_memory.ml @@ -0,0 +1,28 @@ +(* + * krobot_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 + +lwt () = + lwt k = Krobot_bootloader.open_card () in + try_lwt + lwt data = Krobot_bootloader.get_flash k ~address:0x0 ~length:0x8000 in + let msg = match Krobot_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 + | Krobot_bootloader.Error e -> + eprintlf "%s" (Krobot_bootloader.string_of_error e) + | e -> + eprintlf "%s" (Printexc.to_string e) diff --git a/PC_Mainboard/card_tools/krobot_hexfile.ml b/PC_Mainboard/card_tools/krobot_hexfile.ml new file mode 100644 index 0000000..2d2c361 --- /dev/null +++ b/PC_Mainboard/card_tools/krobot_hexfile.ml @@ -0,0 +1,112 @@ +(* + * krobot_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/krobot_hexfile.mli b/PC_Mainboard/card_tools/krobot_hexfile.mli new file mode 100644 index 0000000..932e32e --- /dev/null +++ b/PC_Mainboard/card_tools/krobot_hexfile.mli @@ -0,0 +1,26 @@ +(* + * krobot_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/krobot_send_firmware.ml b/PC_Mainboard/card_tools/krobot_send_firmware.ml new file mode 100644 index 0000000..82261c5 --- /dev/null +++ b/PC_Mainboard/card_tools/krobot_send_firmware.ml @@ -0,0 +1,69 @@ +(* + * krobot_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 = Krobot_hexfile.parse_file filename in + let memory = + let buffer = String.make 0x8000 '\255' in + Krobot_hexfile.validate_and_copy hex 0x0 buffer 0 0x8000; + buffer + in + let firmware_name = Krobot_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 = Krobot_bootloader.open_card () in + lwt () = printf "Card opened\n" in + lwt data = Krobot_bootloader.get_flash k ~address:0x0 ~length:0x8000 in + let board_name = Krobot_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 () = Krobot_bootloader.erase_flash k ~address ~length in + lwt () = printf "Flash erased\n" in + lwt () = Krobot_bootloader.write_flash k ~address memory address length in + lwt () = printf "Flashing completed\n" in + lwt () = Krobot_bootloader.reset_board k in + return () + +lwt () = + 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 + try_lwt + do_flash !force filename + with + | Krobot_bootloader.Error e -> + eprintl (Krobot_bootloader.string_of_error e) + | e -> + eprintl (Printexc.to_string e) diff --git a/PC_Mainboard/card_tools/send_firmware.ml b/PC_Mainboard/card_tools/send_firmware.ml deleted file mode 100644 index 321edb6..0000000 --- a/PC_Mainboard/card_tools/send_firmware.ml +++ /dev/null @@ -1,70 +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 - lwt () = Bootloader.reset_board k 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/driver/krobot_driver.ml b/PC_Mainboard/driver/krobot_driver.ml index 85b8d0b..7998bdd 100644 --- a/PC_Mainboard/driver/krobot_driver.ml +++ b/PC_Mainboard/driver/krobot_driver.ml @@ -69,10 +69,10 @@ struct if data <> dev.data then begin dev.data <- data; lwt () = value dev data in - lwt () = Lwt_unix.sleep Krobot_config.update_delay in + lwt () = Lwt_unix.sleep (Krobot_config.update_delay *. 2.) in loop dev end else - lwt () = Lwt_unix.sleep Krobot_config.update_delay in + lwt () = Lwt_unix.sleep (Krobot_config.update_delay *. 2.) in loop dev let make card path = @@ -222,7 +222,7 @@ struct OL_method GripClose : unit = fun dev -> set_ax12 dev [{ aa_id = 2; aa_position = 510; aa_velocity = 100 }; - { aa_id = 3; aa_position = 465; aa_velocity = 200 }] + { aa_id = 3; aa_position = 390; aa_velocity = 200 }] let make card path = return { diff --git a/PC_Mainboard/myocamlbuild.ml b/PC_Mainboard/myocamlbuild.ml index a182489..42a97e6 100644 --- a/PC_Mainboard/myocamlbuild.ml +++ b/PC_Mainboard/myocamlbuild.ml @@ -57,8 +57,8 @@ let targets = List.filter_opt (function (true, target) -> Some target | (false, (have_lwt_unix && have_usb && have_obus, "driver/krobot_driver.best"); (* Card tools *) - (have_lwt_unix && have_usb, "card_tools/send_firmware.best"); - (have_lwt_unix && have_usb, "card_tools/dump_memory.best"); + (have_lwt_unix && have_usb, "card_tools/krobot_send_firmware.best"); + (have_lwt_unix && have_usb, "card_tools/krobot_dump_memory.best"); (* Krobot client library *) (have_lwt_unix && have_obus, "krobot.cma"); @@ -66,7 +66,7 @@ let targets = List.filter_opt (function (true, target) -> Some target | (false, (have_lwt_unix && have_obus && have_native, "krobot.cmxs"); (* Tools *) - (have_lwt_unix && have_obus, "tools/forward_dbus.best"); + (have_lwt_unix && have_obus, "tools/krobot_forward_dbus.best"); (* Clients *) (have_lwt_unix && have_obus, "clients/krobot_info.best"); @@ -75,7 +75,7 @@ let targets = List.filter_opt (function (true, target) -> Some target | (false, (have_lwt_unix && have_obus && have_sdl, "clients/krobot_joy_control.best"); (* Services *) - (have_lwt_unix && have_obus, "services/hard_stop.best"); + (have_lwt_unix && have_obus, "services/krobot_hard_stop.best"); (* Tests *) (have_lwt_unix && have_obus, "tests/double_move.best"); diff --git a/PC_Mainboard/services/hard_stop.ml b/PC_Mainboard/services/hard_stop.ml deleted file mode 100644 index 1a0bcb5..0000000 --- a/PC_Mainboard/services/hard_stop.ml +++ /dev/null @@ -1,70 +0,0 @@ -(* - * hard_stop.ml - * ------------ - * Copyright : (c) 2010, Jeremie Dimino <je...@di...> - * Licence : BSD3 - * - * This file is a part of [kro]bot. - *) - -(* Stop the robot on collisions *) - -open Lwt - -(* Duration of an inhibition: *) -let duration = 1.0 - -let foreground = ref false -let args = [ - "-n", Arg.Set foreground, "do not daemonize"; -] -let usage = Printf.sprintf "Usage: %s [-n]\n\noptions are:" (Filename.basename (Sys.argv.(0))) - -type state = OK | Stopped - -let handle_collide krobot sensors = - try_lwt - join [ - (if Krobot_util.front_collide sensors then begin - lwt () = Lwt_log.notice "front collision detected, inhibit motors" in - Krobot.inhibit_forward krobot duration - end else - return ()); - (if Krobot_util.back_collide sensors then begin - lwt () = Lwt_log.notice "back collision detected, inhibit motors" in - Krobot.inhibit_backward krobot duration - end else - return ()); - ] - with exn -> - Lwt_log.info_f "collision handling failed with: %s" (Printexc.to_string exn) - -lwt () = - Arg.parse args ignore usage; - - lwt bus = Lazy.force Krobot.bus in - (* Ensure there is only one running instance of the service: *) - lwt () = Krobot_util.single_instance bus "fr.krobot.HardStop" in - - lwt () = - if !foreground then - Lwt_log.info "starting krobot hard stopper in foreground mode" - else begin - lwt () = Lwt_log.info "starting krobot hard stopper in daemon mode" in - Lwt_daemon.daemonize (); - return () - end - in - - lwt krobot = Krobot.create () in - - (* Stop motors as soon as possible: *) - Lwt_signal.always_notify_p (handle_collide krobot) (Krobot.logic_sensors krobot); - - (* Continue the inhibition: *) - let rec loop () = - lwt () = handle_collide krobot (React.S.value (Krobot.logic_sensors krobot)) in - lwt () = Lwt_unix.sleep (duration /. 2.) in - loop () - in - loop () diff --git a/PC_Mainboard/services/krobot_hard_stop.ml b/PC_Mainboard/services/krobot_hard_stop.ml new file mode 100644 index 0000000..51b832c --- /dev/null +++ b/PC_Mainboard/services/krobot_hard_stop.ml @@ -0,0 +1,70 @@ +(* + * krobot_hard_stop.ml + * ------------------- + * Copyright : (c) 2010, Jeremie Dimino <je...@di...> + * Licence : BSD3 + * + * This file is a part of [kro]bot. + *) + +(* Stop the robot on collisions *) + +open Lwt + +(* Duration of an inhibition: *) +let duration = 1.0 + +let foreground = ref false +let args = [ + "-n", Arg.Set foreground, "do not daemonize"; +] +let usage = Printf.sprintf "Usage: %s [-n]\n\noptions are:" (Filename.basename (Sys.argv.(0))) + +type state = OK | Stopped + +let handle_collide krobot sensors = + try_lwt + join [ + (if Krobot_util.front_collide sensors then begin + lwt () = Lwt_log.notice "front collision detected, inhibit motors" in + Krobot.inhibit_forward krobot duration + end else + return ()); + (if Krobot_util.back_collide sensors then begin + lwt () = Lwt_log.notice "back collision detected, inhibit motors" in + Krobot.inhibit_backward krobot duration + end else + return ()); + ] + with exn -> + Lwt_log.info_f "collision handling failed with: %s" (Printexc.to_string exn) + +lwt () = + Arg.parse args ignore usage; + + lwt bus = Lazy.force Krobot.bus in + (* Ensure there is only one running instance of the service: *) + lwt () = Krobot_util.single_instance bus "fr.krobot.HardStop" in + + lwt () = + if !foreground then + Lwt_log.info "starting krobot hard stopper in foreground mode" + else begin + lwt () = Lwt_log.info "starting krobot hard stopper in daemon mode" in + Lwt_daemon.daemonize (); + return () + end + in + + lwt krobot = Krobot.create () in + + (* Stop motors as soon as possible: *) + Lwt_signal.always_notify_p (handle_collide krobot) (Krobot.logic_sensors krobot); + + (* Continue the inhibition: *) + let rec loop () = + lwt () = handle_collide krobot (React.S.value (Krobot.logic_sensors krobot)) in + lwt () = Lwt_unix.sleep (duration /. 2.) in + loop () + in + loop () diff --git a/PC_Mainboard/tools/forward_dbus.ml b/PC_Mainboard/tools/forward_dbus.ml deleted file mode 100644 index 8685578..0000000 --- a/PC_Mainboard/tools/forward_dbus.ml +++ /dev/null @@ -1,27 +0,0 @@ -(* - * forward_dbus.ml - * --------------- - * Copyright : (c) 2010, Jeremie Dimino <je...@di...> - * Licence : BSD3 - * - * This file is a part of [kro]bot. - *) - -open Lwt - -let rec copy ta tb = - lwt msg = OBus_transport.recv ta in - lwt () = OBus_transport.send tb msg in - copy ta tb - -lwt () = - let addresses = OBus_address.of_string Krobot_config.bus_address in - lwt (_, ta) = OBus_transport.of_addresses addresses in - let tb = - OBus_transport.make - ~send:(fun msg -> OBus_wire.write_message Lwt_io.stdout msg) - ~recv:(fun () -> OBus_wire.read_message Lwt_io.stdin) - ~shutdown:return - () - in - copy ta tb <&> copy tb ta diff --git a/PC_Mainboard/tools/krobot_forward_dbus.ml b/PC_Mainboard/tools/krobot_forward_dbus.ml new file mode 100644 index 0000000..383e3af --- /dev/null +++ b/PC_Mainboard/tools/krobot_forward_dbus.ml @@ -0,0 +1,30 @@ +(* + * krobot_forward_dbus.ml + * ---------------------- + * Copyright : (c) 2010, Jeremie Dimino <je...@di...> + * Licence : BSD3 + * + * This file is a part of [kro]bot. + *) + +open Lwt + +let rec copy ta tb = + lwt msg = OBus_transport.recv ta in + lwt () = OBus_transport.send tb msg in + copy ta tb + +lwt () = + let addresses = OBus_address.of_string Krobot_config.bus_address in + lwt (_, ta) = OBus_transport.of_addresses addresses in + let tb = + OBus_transport.make + ~send:(fun msg -> OBus_wire.write_message Lwt_io.stdout msg) + ~recv:(fun () -> OBus_wire.read_message Lwt_io.stdin) + ~shutdown:return + () + in + try_lwt + copy ta tb <&> copy tb ta + with End_of_file -> + return () hooks/post-receive -- krobot |
From: Jérémie D. <Ba...@us...> - 2010-03-27 22:04: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 55d744ede328cc22f5e3cd1f4904183472907936 (commit) from 97792d3aaa42612b4802aeea5afdd929f8bb1dac (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 55d744ede328cc22f5e3cd1f4904183472907936 Author: Jérémie Dimino <je...@di...> Date: Sat Mar 27 19:56:22 2010 +0100 add grip.{open,close} ----------------------------------------------------------------------- Changes: diff --git a/PC_Mainboard/clients/krobot_joy_control.ml b/PC_Mainboard/clients/krobot_joy_control.ml index cfdd224..cda7129 100644 --- a/PC_Mainboard/clients/krobot_joy_control.ml +++ b/PC_Mainboard/clients/krobot_joy_control.ml @@ -126,7 +126,7 @@ let child_loop pipe joy = let axis_coef = 6 let axis_coef_turn = 4 -let accelerations = (800, 800) +let accelerations = (400, 400) let duration = 0.2 let try_call action f = diff --git a/PC_Mainboard/clients/krobot_script.ml b/PC_Mainboard/clients/krobot_script.ml index 02483bc..59de7aa 100644 --- a/PC_Mainboard/clients/krobot_script.ml +++ b/PC_Mainboard/clients/krobot_script.ml @@ -324,6 +324,12 @@ let () = register ~path:["grip"] "down" f0 (fun logger krobot -> Krobot.grip_down krobot); + register ~path:["grip"] "open" f0 + (fun logger krobot -> + Krobot.grip_open krobot); + register ~path:["grip"] "close" f0 + (fun logger krobot -> + Krobot.grip_close krobot); (* +---------------------------------------------------------------+ | Claws | diff --git a/PC_Mainboard/driver/krobot_driver.ml b/PC_Mainboard/driver/krobot_driver.ml index 252f17f..85b8d0b 100644 --- a/PC_Mainboard/driver/krobot_driver.ml +++ b/PC_Mainboard/driver/krobot_driver.ml @@ -216,6 +216,14 @@ struct OL_method GripDown : unit = fun dev -> set_ax12 dev [{ aa_id = Krobot_config.ax12_grip_up_down; aa_position = Krobot_config.grip_down_position; aa_velocity = Krobot_config.ax12_default_velocity }] + OL_method GripOpen : unit = fun dev -> + set_ax12 dev [{ aa_id = 2; aa_position = 610; aa_velocity = 100 }; + { aa_id = 3; aa_position = 265; aa_velocity = 200 }] + + OL_method GripClose : unit = fun dev -> + set_ax12 dev [{ aa_id = 2; aa_position = 510; aa_velocity = 100 }; + { aa_id = 3; aa_position = 465; aa_velocity = 200 }] + let make card path = return { obus = OBus.make ~interfaces:[Unsafe.ol_interface; ol_interface] path; diff --git a/PC_Mainboard/lib_krobot/krobot.ml b/PC_Mainboard/lib_krobot/krobot.ml index 8f4fa4d..acfb6df 100644 --- a/PC_Mainboard/lib_krobot/krobot.ml +++ b/PC_Mainboard/lib_krobot/krobot.ml @@ -235,6 +235,8 @@ let op_interface = AX12.make_interface "fr.krobot.Device.AX12" OP_method SetAX12 : Krobot_types.ax12_action structure list -> unit OP_method GripUp : unit OP_method GripDown : unit +OP_method GripOpen : unit +OP_method GripClose : unit (* +-----------------------------------------------------------------+ | Servo | diff --git a/PC_Mainboard/lib_krobot/krobot.mli b/PC_Mainboard/lib_krobot/krobot.mli index be978b1..7c7fed3 100644 --- a/PC_Mainboard/lib_krobot/krobot.mli +++ b/PC_Mainboard/lib_krobot/krobot.mli @@ -91,6 +91,9 @@ val set_ax12 : t -> Krobot_types.ax12_action list -> unit Lwt.t val grip_up : t -> unit Lwt.t val grip_down : t -> unit Lwt.t +val grip_open : t -> unit Lwt.t +val grip_close : t -> unit Lwt.t + (** {6 Servos} *) hooks/post-receive -- krobot |
From: Jérémie D. <Ba...@us...> - 2010-03-27 18:30:25
|
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 97792d3aaa42612b4802aeea5afdd929f8bb1dac (commit) via 86e37475f215d62edeb3cdda992dcc02ba2b25f1 (commit) via 92152484454786e5e2f36841745b0100dc07623b (commit) via 0de37ddedc0baa63f25ab0e6d3acef644e9bcf01 (commit) via 3a024f443c2a13abef136d70835ff61e1bf2e2a6 (commit) via bf8c11d3e4acae60ca475122d1ff50f9ae85a355 (commit) via 07363dd0c2175d46d92366e3724bfd0a4179727c (commit) via c6a7926d6ae6d5541db0f695c26e71162d8a9f85 (commit) via cd1da3d474aa2226d1fdc69e177fefd94df4d7c8 (commit) from 134938c3b102c12c90c8f5777222edcbbf3e1d5c (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 97792d3aaa42612b4802aeea5afdd929f8bb1dac Author: Jérémie Dimino <je...@di...> Date: Sat Mar 27 19:19:20 2010 +0100 add claws-take commit 86e37475f215d62edeb3cdda992dcc02ba2b25f1 Author: Jérémie Dimino <je...@di...> Date: Sat Mar 27 18:58:54 2010 +0100 typo commit 92152484454786e5e2f36841745b0100dc07623b Author: Jérémie Dimino <je...@di...> Date: Sat Mar 27 18:56:18 2010 +0100 add script commands for claws commit 0de37ddedc0baa63f25ab0e6d3acef644e9bcf01 Author: Jérémie Dimino <je...@di...> Date: Sat Mar 27 18:52:57 2010 +0100 add high level commands to control servos commit 3a024f443c2a13abef136d70835ff61e1bf2e2a6 Author: Jérémie Dimino <je...@di...> Date: Sat Mar 27 18:35:03 2010 +0100 fix unsafe interface names commit bf8c11d3e4acae60ca475122d1ff50f9ae85a355 Author: Jérémie Dimino <je...@di...> Date: Sat Mar 27 18:28:00 2010 +0100 add servo manipulation in the driver commit 07363dd0c2175d46d92366e3724bfd0a4179727c Author: Jérémie Dimino <je...@di...> Date: Sat Mar 27 18:21:53 2010 +0100 fix servo commands commit c6a7926d6ae6d5541db0f695c26e71162d8a9f85 Author: Jérémie Dimino <je...@di...> Date: Sat Mar 27 18:17:09 2010 +0100 change distances commit cd1da3d474aa2226d1fdc69e177fefd94df4d7c8 Author: Jérémie Dimino <je...@di...> Date: Sat Mar 27 18:15:56 2010 +0100 add set_servo_state ----------------------------------------------------------------------- Changes: diff --git a/PC_Mainboard/clients/krobot_script.ml b/PC_Mainboard/clients/krobot_script.ml index 6f55c8a..02483bc 100644 --- a/PC_Mainboard/clients/krobot_script.ml +++ b/PC_Mainboard/clients/krobot_script.ml @@ -323,7 +323,27 @@ let () = Krobot.grip_up krobot); register ~path:["grip"] "down" f0 (fun logger krobot -> - Krobot.grip_down krobot) + Krobot.grip_down krobot); + + (* +---------------------------------------------------------------+ + | Claws | + +---------------------------------------------------------------+ *) + + register ~path:["claws"] "open" f0 + (fun logger krobot -> + Krobot.claws_open krobot); + register ~path:["claws"] "close" f0 + (fun logger krobot -> + Krobot.claws_close krobot); + register ~path:["claws"] "enable" f0 + (fun logger krobot -> + Krobot.claws_enable krobot); + register ~path:["claws"] "disable" f0 + (fun logger krobot -> + Krobot.claws_disable krobot); + register ~path:["claws"] "take" f0 + (fun logger krobot -> + Krobot.claws_take krobot) let () = Krobot_script_unsafe.register () diff --git a/PC_Mainboard/driver/krobot_driver.ml b/PC_Mainboard/driver/krobot_driver.ml index cc69393..252f17f 100644 --- a/PC_Mainboard/driver/krobot_driver.ml +++ b/PC_Mainboard/driver/krobot_driver.ml @@ -134,6 +134,49 @@ struct end (* +-----------------------------------------------------------------+ + | Servo | + +-----------------------------------------------------------------+ *) + +module Servo = +struct + type t = { + obus : OBus_object.t; + card : Krobot_card.t; + } + + module OBus = OBus_object.Make(struct + type obj = t + let cast obj = obj.obus + end) + + module Unsafe = Krobot_exports.Servo(OBus)(struct let get dev = dev.card end) + + let ol_interface = OBus.make_interface "fr.krobot.Device.Servo" + + OL_method ClawsEnable : unit = fun dev -> + Unsafe.set_config dev 0b10100 0 + + OL_method ClawsDisable : unit = fun dev -> + Unsafe.set_config dev 0 0xff + + OL_method ClawsOpen : unit = fun dev -> + Unsafe.set_state dev 0b10100 0 0 18 0 (-69) + + OL_method ClawsClose : unit = fun dev -> + Unsafe.set_state dev 0b10100 0 0 (-100) 0 45 + + OL_method ClawsTake : unit = fun dev -> + Unsafe.set_state dev 0b10100 0 0 (-40) 0 (-20) + + let make card path = + let dev = { + obus = OBus.make ~interfaces:[Unsafe.ol_interface; ol_interface] path; + card = card; + } in + return dev +end + +(* +-----------------------------------------------------------------+ | AX12 | +-----------------------------------------------------------------+ *) @@ -836,12 +879,13 @@ lwt () = ignore begin monitor_card ~name:"interface" ~vendor_id:PcInterface.usb_vid ~product_id:PcInterface.usb_pid_robot_interface ~set:set_card_interface (fun card -> - lwt () = Krobot_commands.Servo.enable card `Both in - lwt () = Compass.OBus.export bus =|< Compass.make card ["fr"; "krobot"; "Devices"; "Compass"] + lwt () = Servo.OBus.export bus =|< Servo.make card ["fr"; "krobot"; "Devices"; "Servo"] + and () = Compass.OBus.export bus =|< Compass.make card ["fr"; "krobot"; "Devices"; "Compass"] and () = AX12.OBus.export bus =|< AX12.make card ["fr"; "krobot"; "Devices"; "AX12"] and () = LCD.OBus.export bus =|< LCD.make card ["fr"; "krobot"; "Devices"; "LCD"] in return ()) (fun () -> + OBus_object.remove_by_path bus ["fr"; "krobot"; "Devices"; "Servo"]; OBus_object.remove_by_path bus ["fr"; "krobot"; "Devices"; "Compass"]; OBus_object.remove_by_path bus ["fr"; "krobot"; "Devices"; "AX12"]; OBus_object.remove_by_path bus ["fr"; "krobot"; "Devices"; "LCD"]; diff --git a/PC_Mainboard/generators/gen_dbus_exports.ml b/PC_Mainboard/generators/gen_dbus_exports.ml index 03ffdc5..e938a5b 100644 --- a/PC_Mainboard/generators/gen_dbus_exports.ml +++ b/PC_Mainboard/generators/gen_dbus_exports.ml @@ -31,7 +31,7 @@ let () = (fun (path, items) -> print "module $(uid:path)(M : OBus_object.S)(Get : sig val get : M.obj -> Krobot_card.t end) = struct" ~env:["path", path]; - print " let ol_interface = M.make_interface \"fr.krobot.Device.$(uid:path)\"" + print " let ol_interface = M.make_interface \"fr.krobot.Device.$(uid:path).Unsafe\"" ~env:["path", path]; List.iter (print_item path) items; print "end") diff --git a/PC_Mainboard/generators/gen_dbus_imports.ml b/PC_Mainboard/generators/gen_dbus_imports.ml index cc8f961..383a11b 100644 --- a/PC_Mainboard/generators/gen_dbus_imports.ml +++ b/PC_Mainboard/generators/gen_dbus_imports.ml @@ -41,7 +41,7 @@ let () = print " let cast krobot = Krobot.device krobot \"$(caml-case:path)\"" ~env; print " let make _ = failwith \"not implemented\""; print " end)"; - print " let op_interface = Proxy.make_interface \"fr.krobot.Device.$(caml-case:path)%s.Unsafe\"" ~env; + print " let op_interface = Proxy.make_interface \"fr.krobot.Device.$(caml-case:path).Unsafe\"" ~env; List.iter print_item items; print "end") interfaces diff --git a/PC_Mainboard/lib_krobot/krobot.ml b/PC_Mainboard/lib_krobot/krobot.ml index 1628d57..8f4fa4d 100644 --- a/PC_Mainboard/lib_krobot/krobot.ml +++ b/PC_Mainboard/lib_krobot/krobot.ml @@ -57,7 +57,7 @@ let card krobot card = | `Monitoring -> "Monitoring" )] let device krobot name = - OBus_proxy.make krobot.peer ["fr"; "krobot"; "Deivces"; name] + OBus_proxy.make krobot.peer ["fr"; "krobot"; "Devices"; name] (* +-----------------------------------------------------------------+ | Helpers | @@ -237,6 +237,19 @@ OP_method GripUp : unit OP_method GripDown : unit (* +-----------------------------------------------------------------+ + | Servo | + +-----------------------------------------------------------------+ *) + +module Servo = Make_device(struct let name = "Servo" end) +let op_interface = Servo.make_interface "fr.krobot.Device.Servo" + +OP_method ClawsEnable : unit +OP_method ClawsDisable : unit +OP_method ClawsOpen : unit +OP_method ClawsClose : unit +OP_method ClawsTake : unit + +(* +-----------------------------------------------------------------+ | Motors | +-----------------------------------------------------------------+ *) diff --git a/PC_Mainboard/lib_krobot/krobot.mli b/PC_Mainboard/lib_krobot/krobot.mli index 5d4dbda..be978b1 100644 --- a/PC_Mainboard/lib_krobot/krobot.mli +++ b/PC_Mainboard/lib_krobot/krobot.mli @@ -92,6 +92,14 @@ val set_ax12 : t -> Krobot_types.ax12_action list -> unit Lwt.t val grip_up : t -> unit Lwt.t val grip_down : t -> unit Lwt.t +(** {6 Servos} *) + +val claws_enable : t -> unit Lwt.t +val claws_disable : t -> unit Lwt.t +val claws_open : t -> unit Lwt.t +val claws_close : t -> unit Lwt.t +val claws_take : t -> unit Lwt.t + (** {6 Motors} *) val motors_state : t -> string Lwt.t diff --git a/PC_Mainboard/protocol/protocol.ml b/PC_Mainboard/protocol/protocol.ml index 5ede00e..65da143 100644 --- a/PC_Mainboard/protocol/protocol.ml +++ b/PC_Mainboard/protocol/protocol.ml @@ -550,31 +550,23 @@ let interfaces = [ ]); ("servo", [ - Type("motor", - enum uint8 - [("left", PcInterface.motor_left); - ("both", PcInterface.motor_both); - ("right", PcInterface.motor_right)]); command - ~name:"enable" - ~command:PcInterface.cmd_motor - ~request:PcInterface.motor_enable - ~send:[("motor", alias "motor")] - (); - command - ~name:"disable" - ~command:PcInterface.cmd_motor - ~request:PcInterface.motor_disable - ~send:[("motor", alias "motor")] - (); - command - ~name:"move" - ~command:PcInterface.cmd_motor - ~request:PcInterface.motor_move - ~send:[("motor", alias "motor"); - ("sens", uint8); - ("velocity", uint8); - ("duration", uint32)] + ~name:"set-config" + ~command:PcInterface.cmd_set + ~request:PcInterface.set_servo_config + ~send:[("mask-disable", uint8); + ("mask-enable", uint8)] + (); + command + ~name:"set-state" + ~command:PcInterface.cmd_set + ~request:PcInterface.set_servo_state + ~send:[("mask", uint8); + ("angle0", sint8); + ("angle1", sint8); + ("angle2", sint8); + ("angle3", sint8); + ("angle4", sint8)] (); ]); diff --git a/PC_Mainboard/tests/move.ml b/PC_Mainboard/tests/move.ml index 489acd9..04e7216 100644 --- a/PC_Mainboard/tests/move.ml +++ b/PC_Mainboard/tests/move.ml @@ -12,13 +12,13 @@ open Printf open Krobot_move let graph = List.fold_left (fun graph edge -> add_edge edge graph) empty [ - ({ vx = 0; vy = 0 }, { vx = 0; vy = 10 }); - ({ vx = 0; vy = 10 }, { vx = 10; vy = 10 }); - ({ vx = 10; vy = 10 }, { vx = 10; vy = 20 }); + ({ vx = 0; vy = 0 }, { vx = 0; vy = 100 }); + ({ vx = 0; vy = 100 }, { vx = 100; vy = 100 }); + ({ vx = 100; vy = 100 }, { vx = 100; vy = 200 }); ] let init = { vx = 0; vy = 0 } -let dest = { vx = 10; vy = 20 } +let dest = { vx = 100; vy = 200 } let rec loop krobot position angle = if position = dest then @@ -33,12 +33,12 @@ let rec loop krobot position angle = | Some krobot -> lwt () = if diff <> 0 then - lwt _ = Krobot.turn krobot ~angle:diff ~velocity:400 ~acceleration:800 in + lwt _ = Krobot.turn krobot ~angle:diff ~velocity:400 ~acceleration:400 in return () else return () in - lwt _ = Krobot.move krobot ~distance:(Krobot_move.distance position next) ~velocity:400 ~acceleration:800 in + lwt _ = Krobot.move krobot ~distance:(Krobot_move.distance position next) ~velocity:400 ~acceleration:400 in return () | None -> return () hooks/post-receive -- krobot |
From: Xavier L. <Ba...@us...> - 2010-03-27 16:49: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 134938c3b102c12c90c8f5777222edcbbf3e1d5c (commit) from 7558393126f5f1a81a625ac777ee1875348d37e0 (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 134938c3b102c12c90c8f5777222edcbbf3e1d5c Author: Xavier Lagorce <Xav...@cr...> Date: Sat Mar 27 17:48:38 2010 +0100 Changed LCD screen address on I2C bus Added compiled firmwares from previous patch ----------------------------------------------------------------------- Changes: diff --git a/USB_Module/Robot_Interface/Firmware/main.c b/USB_Module/Robot_Interface/Firmware/main.c index 5bdfba6..2addeb9 100644 --- a/USB_Module/Robot_Interface/Firmware/main.c +++ b/USB_Module/Robot_Interface/Firmware/main.c @@ -94,7 +94,7 @@ #include "lcd.h" -#define ADD_LCD 0x00 +#define ADD_LCD 0x07 /* VARIABLES ******************************************************/ #pragma udata diff --git a/USB_Module/Robot_Interface/Firmware/output/Robot_Interface.cof b/USB_Module/Robot_Interface/Firmware/output/Robot_Interface.cof index cd3f773..0c2c36b 100644 Binary files a/USB_Module/Robot_Interface/Firmware/output/Robot_Interface.cof and b/USB_Module/Robot_Interface/Firmware/output/Robot_Interface.cof differ diff --git a/USB_Module/Robot_Interface/Firmware/output/Robot_Interface.hex b/USB_Module/Robot_Interface/Firmware/output/Robot_Interface.hex index 8af7f83..7ec98f4 100644 --- a/USB_Module/Robot_Interface/Firmware/output/Robot_Interface.hex +++ b/USB_Module/Robot_Interface/Firmware/output/Robot_Interface.hex @@ -1,273 +1,273 @@ :020000040000FA -:060000008BEF20F012005E +:0600000094EF20F0120055 :0600080004EF04F01200F9 :060018000CEF04F01200E1 -:060800008BEF20F0120056 +:0608000094EF20F012004D :0608080034EF04F01200C1 :0608180072EF04F0120073 -:06082A000500AD410000D5 -:1008300086000000240000008C410000CB00000076 -:1008400021000000834100001301000009000000A6 -:1008500073410000EC000000100000006A4100003D +:06082A000500BF410000C3 +:1008300086000000240000009E410000CB00000064 +:100840002100000095410000130100000900000094 +:1008500085410000EC000000100000007C41000019 :080860000A010000090000007C :0808680017EC0DF000EE22F088 :10087000140EE80403E3EECFE4FFFBD700EE00F034 :10088000220EE80403E3EECFE4FFFBD73FEC0DF0CC -:10089000A1A203D021EC1AF0A1929EAA03D051ECA0 -:1008A00013F09E9A9EA003D0F5EC18F09E9052ECA7 +:10089000A1A203D02AEC1AF0A1929EAA03D05AEC8E +:1008A00013F09E9A9EA003D0FEEC18F09E9052EC9E :1008B0000DF002E2E16AE55250EC0DF0E55200EE77 :1008C00021F0220EE80403E3E5CFEDFFFBD700EEB5 :1008D00035F0140EE80403E3E5CFEDFFFBD72CEC75 :1008E0000DF01100D8CFE4FFE0CFE4FFE46E17EC89 :1008F0000DF000EE22F0140EE80403E3EECFE4FF67 :10090000FBD700EE00F0220EE80403E3EECFE4FF95 -:10091000FBD73FEC0DF0F2A403D0DCEC18F0F2941E +:10091000FBD73FEC0DF0F2A403D0E5EC18F0F29415 :1009200052EC0DF002E2E16AE55250EC0DF0E552B6 :1009300000EE21F0220EE80403E3E5CFEDFFFBD744 :1009400000EE35F0140EE80403E3E5CFEDFFFBD72E :100950002CEC0DF0E550E5CFE0FFE5CFD8FF10001F -:1009600004D8DCEC0DF058D8FCD70F0EC11202D819 -:10097000A6EF0DF081EC0DF0E6529EEC0CF00001BC -:10098000FC6F070EFC5D10E1E66A21EC1EF0E552FB -:10099000DF6E000EDF805AEC0DF0E66A5DEC20F0B1 +:1009600004D8E5EC0DF059D8FCD70F0EC11202D80F +:10097000AFEF0DF08AEC0DF0E6529EEC0CF00001AA +:10098000FC6F070EFC5D10E1E66A2AEC1EF0E552F2 +:10099000DF6E000EDF805AEC0DF0E66A66EC20F0A8 :1009A000E552DF705AEC0DF093809382948C948E14 -:1009B000D08EF28EF28C770EC86EE66AD1EC1BF008 -:1009C000E5523F0E8A1693160101136B146B156BDB -:1009D000166B010E176F4CEC13F0E30E9516929206 -:1009E0009492A082FD0EE66EE5EC1EF0E552000E3C -:1009F000E66EE66A84EC1FF0E552E5528394839636 -:100A0000839880928292E66A9FEC18F0E5523DEC62 -:100A10001BF0E55292EF0DF0D9CFE6FFE1CFD9FF01 -:100A2000170EE126160EDB6A0101175102E08BEC6E -:100A30000BF0200E0001605D03E36D50020B02E03D -:100A400081EF0BF0160EDB5036E087EC19F0000951 -:100A500032E001011551161102E1000E08D015C156 -:100A6000E9FF16C1EAFFEF50800B01E0010E00091B -:100A700022E10501406B01011851182B0501416F5E -:100A800005010C0E426F0501436B400EE66E400EF1 -:100A9000E66E050EE66E010EE66E010EE66EF7ECF2 -:100AA00011F0006E050EE15E0050F3CF15F1F4CFAA -:100AB00016F1160EDB6A01011551161102E1000E46 -:100AC00008D015C1E9FF16C1EAFFEF50800B01E025 -:100AD000010E00093DE101011951EA6ACB0FE96EEF -:100AE000000EEA22EF5034E00501406B010118517D -:100AF000182B0501416F0501040E426F01011951C8 -:100B0000EA6ACB0FE96E000EEA22EFCF43F5400E02 -:100B1000E66E400EE66E050EE66E010EE66E010E06 -:100B2000E66EF7EC11F0006E050EE15E0050F3CFBB -:100B300015F1F4CF16F101011951EA6ACB0FE96EF4 -:100B4000000EEA22EF6A010119291F0B0101196F3A -:100B500001011351141102E1000E08D013C1E9FF85 -:100B600014C1EAFFEF50800B01E0010E000902E022 -:100B700081EF0BF005010251070A02E1E7EF0AF0ED -:100B8000020A02E1B9EF0AF00E0A02E160EF0AF090 -:100B9000060A02E1EDEF09F0040A01E110D20F0AA2 -:100BA00001E165D1040A1AE0030A07E0010A02E044 -:100BB00040EF0BF0FF0081EF0BF0E66A21EC1EF036 -:100BC000E552DF6E000EDB80DFCFE6FFE66A01EC68 -:100BD0001EF0E552E552FF0081EF0BF001011551C7 -:100BE000161102E1000E08D015C1E9FF16C1EAFF97 -:100BF000EF50800B01E0010E000901E036D100C585 -:100C000040F50501416B0501030E426F0501436B81 -:100C1000050108510A0A01E17ED00E0A71E0070AB7 -:100C200064E0010A20E0030A06E0010A01E0F3D0D3 -:100C3000FCC048F5F3D00501486BE30E006E3E0E94 -:100C4000016E026A00C0E6FF01C0E6FF02C0E6FFD7 -:100C5000480EE66E050EE66EE5EC1DF0036E050E21 -:100C6000E15E0350DBD00501486BD70E006E3E0EEF -:100C7000016E026A00C0E6FF01C0E6FF02C0E6FFA7 -:100C8000480EE66E050EE66EE5EC1DF0036E050EF1 -:100C9000E15E0350D50E006E3E0E016E026A00C08A -:100CA000E6FF01C0E6FF02C0E6FF480EE66E050E55 -:100CB000E66EE5EC1DF0036E050EE15E0350CC0E12 -:100CC000006E3E0E016E026A00C0E6FF01C0E6FF44 -:100CD00002C0E6FF480EE66E050EE66EE5EC1DF07E -:100CE000036E050EE15E035099D092CF48F593CF85 -:100CF00049F594CF4AF595CF4BF596CF4CF58ED06C -:100D000080CF48F581CF49F582CF4AF583CF4BF5A7 -:100D100084CF4CF583D0800EE66E080EE66E0FECA5 -:100D200020F0E552E552C580A4EC20F0C00EE66E3E -:100D300048EC1FF0E552E66A48EC1FF0E552C58228 -:100D4000A4EC20F0C10EE66E48EC1FF0E552010E57 -:100D5000DB6A020EDB6A010EDBCF00F0020EDBCF96 -:100D600001F0040E005C000E01584FE2010EF36E1C -:100D7000150EF3CFDBFFC586130EDB6A140EDB6A9C -:100D8000130EDBCF00F0140EDBCF01F0E80E005C99 -:100D9000030E015817E2C7A00FD0010EDBCFE9FF09 -:100DA000020EDBCFEAFF480EE926050EEA22C9CF84 -:100DB000EFFF150EDB6A06D0130EDB2A140E01E3DB -:100DC000DB2ADED7150EDB5008E00501080E436F65 -:100DD000C58AC588A4EC20F018D0010EDBCF00F046 -:100DE000020EDBCF01F0030E005C000E015803E29F -:100DF000C59AC58802D0C58AC588A4EC20F0010E2A -:100E0000DB2A020E01E3DB2AA6D7C584A4EC20F07E -:100E1000B2EC20F003D00501020E436F400EE66EE7 -:100E2000400EE66E050EE66E010EE66E010EE66EF3 -:100E3000F7EC11F0006E050EE15E0050F3CF15F1F6 -:100E4000F4CF16F1400EE66E000EE66E050EE66E6D -:100E5000E66A010EE66EF7EC11F0006E050EE15E3B -:100E60000050F3CF13F1F4CF14F181EF0BF0050133 -:100E70000851050A54E0010A49E0070A37E0010A6F -:100E800025E0030A13E0010A01E080D005010951C1 -:100E9000921205010A51931205010B51941205019A -:100EA0000C51951205010D51961275D00501091DC1 -:100EB000921605010A1D931605010B1D94160501D6 -:100EC0000C1D951605010D1D961665D00501091D11 -:100ED000891605010A1D8A1605010B1D8B160501D1 -:100EE0000C1D8C1605010D1D8D1655D005010951DF -:100EF000891205010A518A1205010B518B12050155 -:100F00000C518C1205010D518D1245D0050109516E -:100F100001010F1B05010A5101010F133CD005010E -:100F200009A107D00AC5E6FFE66AB9EC1AF0E55256 -:100F3000E552050109A308D00BC5E6FF010EE66ED8 -:100F4000B9EC1AF0E552E552050109A508D00CC527 -:100F5000E6FF020EE66EB9EC1AF0E552E552050125 -:100F600009A708D00DC5E6FF030EE66EB9EC1AF02E -:100F7000E552E552050109A908D00EC5E6FF040EA9 -:100F8000E66EB9EC1AF0E552E55205D0030EE66EB6 -:100F90002AEC20F0E552400EE66E000EE66E050EDD -:100FA000E66EE66A010EE66EF7EC11F0006E050ED5 -:100FB000E15E0050F3CF13F1F4CF14F1A2D301019D -:100FC0001551161102E1000E08D015C1E9FF16C136 -:100FD000EAFFEF50800B01E0010E000901E0FCD1B7 -:100FE00000C540F50501416B0501030E426F050187 -:100FF000436B050108510C0A01E1BED1070A01E16A -:10100000B5D1010A01E1ACD1030A01E183D1010AA2 -:1010100001E1E3D00F0A01E1C5D0010A01E1AAD044 -:10102000030A01E18FD0010A6AE0070A42E0010ADF -:1010300011E0030A01E0A6D105010A51E66EE66A55 -:1010400009C5E6FF64EC14F0E552E552E5520501EE -:10105000486F9BD105010B051BE105010C51E66EA4 -:10106000E66A0AC5E6FF09C5E6FF21EC15F0E55280 -:10107000E552E552E5520F0EF3CFDBFF100EF4CF31 -:10108000DBFF100EDBCF48F50F0EDBCF49F510D09C -:1010900005010C51E66EE66A0AC5E6FF09C5E6FFE2 -:1010A000BEEC14F0E552E552E552E5520501486FF9 -:1010B0006CD105010B0517E1100E0CC5DBFF0F0EFF -:1010C0000DC5DBFF0F0EDBCFE6FF100EDBCFE6FF1B -:1010D0000AC5E6FF09C5E6FFB7EC14F0E552E55294 -:1010E000E552E5520BD00CC5E6FF0AC5E6FF09C57F -:1010F000E6FFB3EC14F0E552E552E55246D1100E8E -:101100000AC5DBFF0F0E0BC5DBFF120E0CC5DBFFA4 -:10111000110E0DC5DBFF0EC5E6FF110EDBCFE6FF9E -:10112000120EDBCFE6FF0F0EDBCFE6FF100EDBCF9C -:10113000E6FF09C5E6FFA2EC15F0006E060EE15EC3 -:10114000005023D105010A51E66EE66A09C5E6FFA3 -:10115000C5EC15F0E552E552E5520F0EF3CFDBFF7B -:10116000100EF4CFDBFF100EDBCF48F50F0EDBCFF8 -:1011700049F50BD105010A51E66EE66A09C5E6FF9D -:10118000C8EC15F0E552E552E5520F0EF3CFDBFF48 -:10119000100EF4CFDBFF100EDBCF48F50F0EDBCFC8 -:1011A00049F5F3D005010A51E66EE66A280EE66EAF -:1011B00009C5E6FF21EC15F0E552E552E552E5528E -:1011C0000F0EF3CFDBFF100EF4CFDBFF100EDBCFE3 -:1011D00048F50F0EDBCF49F5D8D005010A51E66E70 -:1011E000E66A09C5E6FFC5EC15F0E552E552E552A1 -:1011F0000F0EF3CFDBFF100EF4CFDBFF100EDBCFB3 -:1012000048F50F0EDBCF49F505010A51E66EE66A97 -:1012100009C5E6FFC8EC15F0E552E552E5520F0EA0 -:10122000F3CFDBFF100EF4CFDBFF100EDBCF4AF560 -:101230000F0EDBCF4BF505010A51E66EE66A280E6C -:10124000E66E09C5E6FF21EC15F0E552E552E552E0 -:10125000E5520F0EF3CFDBFF100EF4CFDBFF100EC5 -:10126000DBCF4CF50F0EDBCF4DF505010A51E66ED5 -:10127000E66A2A0EE66E09C5E6FFBEEC14F0E552FA -:10128000E552E552E55205014E6F05010A51E66E41 -:10129000E66A2B0EE66E09C5E6FFBEEC14F0E552D9 -:1012A000E552E552E55205014F6F05010A51E66E20 -:1012B000E66A060EE66E09C5E6FF21EC15F0E5527A -:1012C000E552E552E5520F0EF3CFDBFF100EF4CFDF -:1012D000DBFF100EDBCF50F50F0EDBCF51F5050114 -:1012E0000A51E66EE66A080EE66E09C5E6FF21ECD5 -:1012F00015F0E552E552E552E5520F0EF3CFDBFF54 -:10130000100EF4CFDBFF100EDBCF52F50F0EDBCF4C -:1013100053F53BD005010B0517E1100E0CC5DBFFA3 -:101320000F0E0DC5DBFF0F0EDBCFE6FF100EDBCF80 -:10133000E6FF0AC5E6FF09C5E6FF95EC15F0E552A4 -:10134000E552E552E5520BD00CC5E6FF0AC5E6FFB3 -:1013500009C5E6FF91EC15F0E552E552E55215D0CE -:1013600009C5E6FF9DEC15F0E5520FD009C5E6FF73 -:10137000AEEC14F0E55209D009C5E6FF52EC14F0CA -:10138000E55203D00501010E436F400EE66E400E9C -:10139000E66E050EE66E010EE66E010EE66EF7ECE9 -:1013A00011F0006E050EE15E0050F3CF15F1F4CFA1 -:1013B00016F1400EE66E000EE66E050EE66EE66A6B -:1013C000010EE66EF7EC11F0006E050EE15E0050C6 -:1013D000F3CF13F1F4CF14F194D105010851070AAA -:1013E00048E0010A3BE0030A2EE0010A25E0070A73 -:1013F0001BE0010A12E0030A08E0010A01E047D0FD -:10140000E66AD8EC1BF0E55247D0010EE66EE66ABC -:10141000DBEC1BF0E552E5523FD0E66AE66ADBEC16 -:101420001BF0E552E55238D0010EE66EE66AE3ECB9 -:101430001BF0E552E55230D0E66AE66AE3EC1BF0B9 -:10144000E552E55229D00AC5E6FF09C5E6FFE66A7E -:10145000EEEC1BF0E552E552E5521ED0090EE66EA9 -:10146000050EE66EE66AFBEC1BF0E552E552E5522E -:1014700013D00A0EE66E050EE66E09C5E6FFE66AB3 -:1014800001EC1CF0E552E552E552E55205D0010EA3 -:10149000E66E2AEC20F0E552400EE66E000EE66E97 -:1014A000050EE66EE66A010EE66EF7EC11F0006ED0 -:1014B000050EE15E0050F3CF13F1F4CF14F121D10A -:1014C00005010851030A11E0010A09E0030A01E0DD -:1014D00037D009C5E6FF0EEC19F0E55236D009C544 -:1014E000E6FF14EC19F0E55230D00E0E0CC5DBFF10 -:1014F0000D0E0DC5DBFF0C0E0EC5DBFF0B0E0FC571 -:10150000DBFFD9500B0FE96EDACFEAFFEECFE6FF33 -:10151000EECFE6FFEECFE6FFEFCFE6FF0BC5E6FF2F -:101520000AC5E6FF09C5E6FF1AEC19F0006E070EC2 -:10153000E15E0050010EF36E160EF3CFDBFF05D017 -:10154000010EE66E2AEC20F0E552400EE66E000E2B -:10155000E66E050EE66EE66A010EE66EF7EC11F039 -:10156000006E050EE15E0050F3CF13F1F4CF14F1DD -:10157000C8D0800EE66E080EE66E0FEC20F0E55245 -:10158000E552C580A4EC20F0E66A48EC1FF0E55275 -:10159000080EE66E050EE66E90EC1DF0E552E55283 -:1015A000C584B2EC20F0400EE66E000EE66E050E2D -:1015B000E66EE66A010EE66EF7EC11F0006E050EBF -:1015C000E15E0050F3CF13F1F4CF14F19AD04F0E37 -:1015D000AB16AC9ACF0E9D16020EE66EE66A7C0E36 -:1015E000E66E4BEC1DF0E552E552E552040EE66E58 -:1015F000E66A46EC14F0E552E552100EE66E010E76 -:10160000E66E46EC14F0E552E552020EE66E030E6D -:10161000E66E010EE66EC1EC13F0E552E552E552BE -:10162000040EE66EE66A46EC14F0E552E552100E42 -:10163000E66E010EE66E46EC14F0E552E552020E3F -:10164000E66E030EE66E010EE66EC1EC13F0E55297 -:10165000E552E5524CEC13F0400EE66E000EE66EDD -:10166000050EE66EE66A010EE66EF7EC11F0006E0E -:10167000050EE15E0050F3CF13F1F4CF14F141D029 -:1016800001011551161102E1000E08D015C1E9FF44 -:1016900016C1EAFFEF50800B01E0010E000931E1B5 -:1016A00000C540F50501416B0501030E426F0501C0 -:1016B000010E436F400EE66E400EE66E050EE66EBE -:1016C000010EE66E010EE66EF7EC11F0006E050EEF -:1016D000E15E0050F3CF15F1F4CF16F1400EE66E47 -:1016E000000EE66E050EE66EE66A010EE66EF7EC9B -:1016F00011F0006E050EE15E0050F3CF13F1F4CF50 -:1017000014F1170EE15C02E2E16AE552E16EE55286 -:10171000E7CFD9FF120001011A511B1104E1100E8D -:101720001A6F270E1B6F1A07000E1B5B6DA207D0E6 -:101730001A511B112EE18A7C8ABC13D027D00001DC -:10174000605102E18A9C22D0600502E18A8C09D0B6 -:10175000020E605D02E18A8C19D0040E605D03E127 -:101760008A9C8A8E1200100E605D06E101011A51FA -:101770001B110FE18A7C0AD0200E605D0AE1010195 -:101780001A511B1106E18A7C8AAC02D08A9E120093 -:101790008A8E120016D9210EC1D9500EA8D9CFD9E0 -:1017A000630E77D9630EEE6E740EEE6E690EEE6EFA -:1017B000760EEE6E690EEE6E740E8BD9A7D92AD90D -:1017C0002CD9E66ADBEC1BF0E552E552E66ADCD880 -:1017D00002E2E16AE55250EF0DF0F3D82D0E9ED9EA -:1017E000430E57D9780EEE6E690EEE6E6F0EEE6EEA -:1017F0006E0EEE6E200E7BD9740E9DD9620EEE6ECB -:101800006C0EEE6E690E65D9EE6E80D9EE6E93D9D0 -:10181000760E6DD9630EEE6E200EEE6E6C0E8BD9C9 -:10182000200EEE6EFAD8D8EC1BF0E552E66AE66AB6 -:10183000DBEC1BF0E552E552010EE66EA5D802E2A4 -:10184000E16AE55250EF0DF0120012003DEF1CF07E -:1018500012001E0EE66E010EE66EC5EC11F0E552AA +:1009B000D08EF28EF28C770EC86E070EE66EDAECF1 +:1009C0001BF0E5523F0E8A1693160101136B146B50 +:1009D000156B166B010E176F55EC13F0E30E9516A1 +:1009E00092929492A082FD0EE66EEEEC1EF0E5521D +:1009F000000EE66EE66A8DEC1FF0E552E552839438 +:100A00008396839880928292E66AA8EC18F0E55269 +:100A100046EC1BF0E5529BEF0DF0D9CFE6FFE1CF9E +:100A2000D9FF170EE126160EDB6A0101175102E00D +:100A300092EC0BF0200E0001605D03E36D50020BA1 +:100A400002E088EF0BF0160EDB5036E090EC19F068 +:100A5000000932E001011551161102E1000E08D023 +:100A600015C1E9FF16C1EAFFEF50800B01E0010E4E +:100A7000000922E10501406B01011851182B050105 +:100A8000416F05010C0E426F0501436B400EE66E8F +:100A9000400EE66E050EE66E010EE66E010EE66E87 +:100AA00000EC12F0006E050EE15E0050F3CF15F180 +:100AB000F4CF16F1160EDB6A01011551161102E191 +:100AC000000E08D015C1E9FF16C1EAFFEF50800BF8 +:100AD00001E0010E00093DE101011951EA6ACB0F65 +:100AE000E96E000EEA22EF5034E00501406B01018F +:100AF0001851182B0501416F0501040E426F0101C9 +:100B00001951EA6ACB0FE96E000EEA22EFCF43F5E6 +:100B1000400EE66E400EE66E050EE66E010EE66EC7 +:100B2000010EE66E00EC12F0006E050EE15E005064 +:100B3000F3CF15F1F4CF16F101011951EA6ACB0F89 +:100B4000E96E000EEA22EF6A010119291F0B01016B +:100B5000196F01011351141102E1000E08D013C1E5 +:100B6000E9FF14C1EAFFEF50800B01E0010E00091C +:100B700002E088EF0BF005010251070A02E1EEEFF7 +:100B80000AF0020A02E1C0EF0AF00E0A02E167EF82 +:100B90000AF0060A02E1ECEF09F0040A01E110D2C2 +:100BA0000F0A01E165D1040A1AE0030A07E0010A0D +:100BB00002E047EF0BF0FF0088EF0BF0E66A2AEC4B +:100BC0001EF0E552DF6E000EDB80DFCFE6FFE66A47 +:100BD0000AEC1EF0E552E552FF0088EF0BF0010130 +:100BE0001551161102E1000E08D015C1E9FF16C11A +:100BF000EAFFEF50800B01E0010E000901E036D161 +:100C000000C540F50501416B0501030E426F05016A +:100C1000436B050108510A0A01E17ED00E0A71E01A +:100C2000070A64E0010A20E0030A06E0010A01E085 +:100C3000F3D0FCC048F5F3D00501486BF50E006E0B +:100C40003E0E016E026A00C0E6FF01C0E6FF02C070 +:100C5000E6FF480EE66E050EE66EEEEC1DF0036E46 +:100C6000050EE15E0350DBD00501486BE90E006E16 +:100C70003E0E016E026A00C0E6FF01C0E6FF02C040 +:100C8000E6FF480EE66E050EE66EEEEC1DF0036E16 +:100C9000050EE15E0350E70E006E3E0E016E026A25 +:100CA00000C0E6FF01C0E6FF02C0E6FF480EE66EA8 +:100CB000050EE66EEEEC1DF0036E050EE15E0350D0 +:100CC000DE0E006E3E0E016E026A00C0E6FF01C03D +:100CD000E6FF02C0E6FF480EE66E050EE66EEEEC9D +:100CE0001DF0036E050EE15E035099D092CF48F5DA +:100CF00093CF49F594CF4AF595CF4BF596CF4CF568 +:100D00008ED080CF48F581CF49F582CF4AF583CF89 +:100D10004BF584CF4CF583D0800EE66E080EE66E60 +:100D200018EC20F0E552E552C580ADEC20F0C00E85 +:100D3000E66E51EC1FF0E552E66A51EC1FF0E55209 +:100D4000C582ADEC20F0C10EE66E51EC1FF0E5520D +:100D5000010EDB6A020EDB6A010EDBCF00F0020E31 +:100D6000DBCF01F0040E005C000E01584FE2010ED3 +:100D7000F36E150EF3CFDBFFC586130EDB6A140E80 +:100D8000DB6A130EDBCF00F0140EDBCF01F0E80EB0 +:100D9000005C030E015817E2C7A00FD0010EDBCF95 +:100DA000E9FF020EDBCFEAFF480EE926050EEA2234 +:100DB000C9CFEFFF150EDB6A06D0130EDB2A140E27 +:100DC00001E3DB2ADED7150EDB5008E00501080E33 +:100DD000436FC58AC588ADEC20F018D0010EDBCF7B +:100DE00000F0020EDBCF01F0030E005C000E015894 +:100DF00003E2C59AC58802D0C58AC588ADEC20F04B +:100E0000010EDB2A020E01E3DB2AA6D7C584ADEC76 +:100E100020F0BBEC20F003D00501020E436F400E22 +:100E2000E66E400EE66E050EE66E010EE66E010EF3 +:100E3000E66E00EC12F0006E050EE15E0050F3CF9E +:100E400015F1F4CF16F1400EE66E000EE66E050EBB +:100E5000E66EE66A010EE66E00EC12F0006E050E1C +:100E6000E15E0050F3CF13F1F4CF14F188EF0BF0F3 +:100E700005010851050A54E0010A49E0070A37E074 +:100E8000010A25E0030A13E0010A01E080D0050110 +:100E90000951921205010A51931205010B51941246 +:100EA00005010C51951205010D51961275D00501E1 +:100EB000091D921605010A1D931605010B1D9416B6 +:100EC00005010C1D951605010D1D961665D0050131 +:100ED000091D891605010A1D8A1605010B1D8B16B1 +:100EE00005010C1D8C1605010D1D8D1655D0050133 +:100EF0000951891205010A518A1205010B518B1201 +:100F000005010C518C1205010D518D1245D00501C2 +:100F1000095101010F1B05010A5101010F133CD0BA +:100F2000050109A107D00AC5E6FFE66AC2EC1AF07E +:100F3000E552E552050109A308D00BC5E6FF010EF5 +:100F4000E66EC2EC1AF0E552E552050109A508D09B +:100F50000CC5E6FF020EE66EC2EC1AF0E552E55251 +:100F6000050109A708D00DC5E6FF030EE66EC2EC29 +:100F70001AF0E552E552050109A908D00EC5E6FFB1 +:100F8000040EE66EC2EC1AF0E552E55205D0030EEF +:100F9000E66E33EC20F0E552400EE66E000EE66E93 +:100FA000050EE66EE66A010EE66E00EC12F0006ECB +:100FB000050EE15E0050F3CF13F1F4CF14F1A8D386 +:100FC00001011551161102E1000E08D015C1E9FF0B +:100FD00016C1EAFFEF50800B01E0010E000901E0AD +:100FE000FAD100C540F50501416B0501030E426FC2 +:100FF0000501436B050108510F0A01E1BCD1010A4B +:1010000001E1B3D1030A01E1AAD1010A01E190D1C2 +:10101000070A01E181D1010A01E1E1D0030A01E1FE +:10102000C3D0010A01E1A8D00F0A01E18DD0010A65 +:1010300068E0030A4FE0010A41E0070A24E0010AE0 +:1010400011E0030A01E09DD105010A51E66EE66A4E +:1010500009C5E6FF6DEC14F0E552E552E5520501D5 +:10106000486F92D105010C51E66EE66A0AC5E6FFAB +:1010700009C5E6FFC7EC14F0E552E552E552E5522A +:101080000501486F81D105010C51E66EE66A0AC57B +:10109000E6FF09C5E6FF2AEC15F0E552E552E552F8 +:1010A000E5520F0EF3CFDBFF100EF4CFDBFF100E77 +:1010B000DBCF48F50F0EDBCF49F566D10CC5E6FF57 +:1010C0000AC5E6FF09C5E6FFBCEC14F0E552E5529F +:1010D000E5525AD1100E0CC5DBFF0F0E0DC5DBFF1C +:1010E0000F0EDBCFE6FF100EDBCFE6FF0AC5E6FFF3 +:1010F00009C5E6FFC0EC14F0E552E552E552E552B1 +:1011000043D1100E0AC5DBFF0F0E0BC5DBFF120E1D +:101110000CC5DBFF110E0DC5DBFF0EC5E6FF110E82 +:10112000DBCFE6FF120EDBCFE6FF0F0EDBCFE6FFD5 +:10113000100EDBCFE6FF09C5E6FFABEC15F0006E45 +:10114000060EE15E005020D105010A51E66EE66A06 +:1011500009C5E6FFCEEC15F0E552E552E5520F0E5B +:10116000F3CFDBFF100EF4CFDBFF100EDBCF48F523 +:101170000F0EDBCF49F508D105010A51E66EE66A8C +:1011800009C5E6FFD1EC15F0E552E552E5520F0E28 +:10119000F3CFDBFF100EF4CFDBFF100EDBCF48F5F3 +:1011A0000F0EDBCF49F5F0D005010A51E66EE66A75 +:1011B000280EE66E09C5E6FF2AEC15F0E552E55269 +:1011C000E552E5520F0EF3CFDBFF100EF4CFDBFF3D +:1011D000100EDBCF48F50F0EDBCF49F5D5D005015A +:1011E0000A51E66EE66A09C5E6FFCEEC15F0E55257 +:1011F000E552E5520F0EF3CFDBFF100EF4CFDBFF0D +:10120000100EDBCF48F50F0EDBCF49F505010A5173 +:10121000E66EE66A09C5E6FFD1EC15F0E552E55247 +:10122000E5520F0EF3CFDBFF100EF4CFDBFF100EF5 +:10123000DBCF4AF50F0EDBCF4BF505010A51E66E09 +:10124000E66A280EE66E09C5E6FF2AEC15F0E552BF +:10125000E552E552E5520F0EF3CFDBFF100EF4CF4F +:10126000DBFF100EDBCF4CF50F0EDBCF4DF505018C +:101270000A51E66EE66A2A0EE66E09C5E6FFC7EC7D +:1012800014F0E552E552E552E55205014E6F0501B5 +:101290000A51E66EE66A2B0EE66E09C5E6FFC7EC5C +:1012A00014F0E552E552E552E55205014F6F050194 +:1012B0000A51E66EE66A060EE66E09C5E6FF2AECFE +:1012C00015F0E552E552E552E5520F0EF3CFDBFF84 +:1012D000100EF4CFDBFF100EDBCF50F50F0EDBCF7F +:1012E00051F505010A51E66EE66A080EE66E09C57B +:1012F000E6FF2AEC15F0E552E552E552E5520F0EF5 +:10130000F3CFDBFF100EF4CFDBFF100EDBCF52F577 +:101310000F0EDBCF53F538D00CC5E6FF0AC5E6FF4C +:1013200009C5E6FF9AEC15F0E552E552E5522CD0DE +:10133000100E0CC5DBFF0F0E0DC5DBFF0F0EDBCF54 +:10134000E6FF100EDBCFE6FF0AC5E6FF09C5E6FFA4 +:101350009EEC15F0E552E552E552E55215D009C56F +:10136000E6FFA6EC15F0E5520FD009C5E6FFB7EC95 +:1013700014F0E55209D009C5E6FF5BEC14F0E55224 +:1013800003D00501010E436F400EE66E400EE66E7F +:10139000050EE66E010EE66E010EE66E00EC12F032 +:1013A000006E050EE15E0050F3CF15F1F4CF16F19B +:1013B000400EE66E000EE66E050EE66EE66A010E63 +:1013C000E66E00EC12F0006E050EE15E0050F3CF09 +:1013D00013F1F4CF14F19CD105010851070A4FE035 +:1013E000010A41E0030A33E0010A29E0070A1EE08E +:1013F000010A14E0030A09E0010A01E04FD0070ED8 +:10140000E66EE1EC1BF0E5524ED0010EE66E070EE3 +:10141000E66EE4EC1BF0E552E55245D0E66A070EB5 +:10142000E66EE4EC1BF0E552E5523DD0010EE66EAF +:10143000070EE66EECEC1BF0E552E55234D0E66A9E +:10144000070EE66EECEC1BF0E552E5522CD00AC517 +:10145000E6FF09C5E6FF070EE66EF7EC1BF0E55266 +:10146000E552E55220D0090EE66E050EE66E070E37 +:10147000E66E04EC1CF0E552E552E55214D00A0E7B +:10148000E66E050EE66E09C5E6FF070EE66E0AEC8F +:101490001CF0E552E552E552E55205D0010EE66E2C +:1014A00033EC20F0E552400EE66E000EE66E050EBF +:1014B000E66EE66A010EE66E00EC12F0006E050EB6 +:1014C000E15E0050F3CF13F1F4CF14F121D1050107 +:1014D0000851030A11E0010A09E0030A01E037D0CC +:1014E00009C5E6FF17EC19F0E55236D009C5E6FF4D +:1014F0001DEC19F0E55230D00E0E0CC5DBFF0D0EC1 +:101500000DC5DBFF0C0E0EC5DBFF0B0E0FC5DBFFA1 +:10151000D9500B0FE96EDACFEAFFEECFE6FFEECF40 +:10152000E6FFEECFE6FFEFCFE6FF0BC5E6FF0AC50D +:10153000E6FF09C5E6FF23EC19F0006E070EE15E39 +:101540000050010EF36E160EF3CFDBFF05D0010E37 +:10155000E66E33EC20F0E552400EE66E000EE66ECD +:10156000050EE66EE66A010EE66E00EC12F0006E05 +:10157000050EE15E0050F3CF13F1F4CF14F1C8D0A3 +:10158000800EE66E080EE66E18EC20F0E552E5528D +:10159000C580ADEC20F0E66A51EC1FF0E552080E74 +:1015A000E66E050EE66E99EC1DF0E552E552C58437 +:1015B000BBEC20F0400EE66E000EE66E050EE66E09 +:1015C000E66A010EE66E00EC12F0006E050EE15EBA +:1015D0000050F3CF13F1F4CF14F19AD04F0EAB16A5 +:1015E000AC9ACF0E9D16020EE66EE66A7C0EE66E93 +:1015F00054EC1DF0E552E552E552040EE66EE66A43 +:101600004FEC14F0E552E552100EE66E010EE66E58 +:101610004FEC14F0E552E552020EE66E030EE66E54 +:10162000010EE66ECAEC13F0E552E552E552040EE7 +:10163000E66EE66A4FEC14F0E552E552100EE66EE7 +:10164000010EE66E4FEC14F0E552E552020EE66E26 +:10165000030EE66E010EE66ECAEC13F0E552E5529B +:10166000E55255EC13F0400EE66E000EE66E050EE8 +:10167000E66EE66A010EE66E00EC12F0006E050EF4 +:10168000E15E0050F3CF13F1F4CF14F141D001012A +:101690001551161102E1000E08D015C1E9FF16C15F +:1016A000EAFFEF50800B01E0010E000931E100C5B7 +:1016B00040F50501416B0501030E426F0501010E66 +:1016C000436F400EE66E400EE66E050EE66E010EAE +:1016D000E66E010EE66E00EC12F0006E050EE15EA5 +:1016E0000050F3CF15F1F4CF16F1400EE66E000E68 +:1016F000E66E050EE66EE66A010EE66E00EC12F08E +:10170000006E050EE15E0050F3CF13F1F4CF14F13B +:10171000170EE15C02E2E16AE552E16EE552E7CFC5 +:10172000D9FF120001011A511B1104E1100E1A6FAA +:10173000270E1B6F1A07000E1B5B6DA207D01A51F4 +:101740001B112EE18A7C8ABC13D027D00001605186 +:1017500002E18A9C22D0600502E18A8C09D0020E47 +:10176000605D02E18A8C19D0040E605D03E18A9C01 +:101770008A8E1200100E605D06E101011A511B11E4 +:101780000FE18A7C0AD0200E605D0AE101011A5146 +:101790001B1106E18A7C8AAC02D08A9E12008A8ED6 +:1017A000120010D9210EC3D9500EAAD9D1D9630E77 +:1017B00070D9630EEE6E740EEE6E690EEE6E760EDE +:1017C000EE6E690EEE6E740E8CD9A9D924D926D985 +:1017D00079D9E66AD9D802E2E16AE55250EF0DF014 +:1017E000F1D82D0EA4D9430E54D9780EEE6E690EA1 +:1017F000EE6E6F0EEE6E6E0EEE6E200E81D9740ED2 +:10180000A3D9620EEE6E6C0EEE6E690E6AD9EE6EA4 +:1018100086D9EE6E99D9760E73D9630EEE6E200ED0 +:10182000EE6E6C0E91D9200EEE6EF8D8070EE66EB5 +:10183000E1EC1BF0E55246D9010EE66EA5D802E2B6 +:10184000E16AE55250EF0DF01200120046EF1CF075 +:1018500012001E0EE66E010EE66ECEEC11F0E552A1 :10186000E552400EE66E000EE66E050EE66EE66A86 -:10187000010EE66EF7EC11F0006E050EE15E005011 +:10187000010EE66E00EC12F0006E050EE15E005007 :10188000F3CF13F1F4CF14F112006D840001080EB0 :10189000FD6F070EFE6FFD07000EFE5BFD51FE1192 :1018A000FAE16D941200D9CFE6FFE1CFD9FFFD0E2A @@ -277,696 +277,698 @@ :1018E0002B501DE0020E2A1801E12B5016E0170EB6 :1018F0002A1801E12B500FE0160E2A1801E12B5097 :1019000008E0150E2A1801E12B5001E010D0A1DFEC -:101910000FD09EDF0DD09ADF0BD096DF09D03ADFD3 -:1019200007D05BDF05D091DF03D0000001D000D0ED -:10193000010E00D0E552E7CFD9FF1200E2D8E652FF +:101910000FD09EDF0DD09ADF0BD096DF09D041DFCC +:1019200007D05EDF05D091DF03D0000001D000D0EA +:10193000010E00D0E552E7CFD9FF1200EBD8E652F6 :10194000D0B202D0010E15D0D0B802D0020E11D004 :10195000D0B002D0030E0DD0D0B602D0040E09D004 :10196000FCAE02D0050E05D0FCAC02D0060E01D0B4 :10197000070EDF6ED088D086D084D082D080FC9EC7 -:10198000FC9CDF50E552CED0E66AE3EC1BF0E5525A -:10199000E552D9CFE6FFDACFE6FF010E9FD8D95046 -:1019A000150FC4D8020E9AD8D9502A0FBFD8030EEB -:1019B00095D8D9503F0FBAD8040E90D8540EE15C98 -:1019C00012009FD8540EE126D9CFE9FFDACFEAFF03 -:1019D0005B0EEE6E4B0EEE6E720EEE6E6F0EEE6ED8 -:1019E0005D0EEE6E620EEE6E6F0EEE6E740EEE6EAD -:1019F000200E81D8EE6EEE6E570E9DD86C0EEE6EF8 -:101A0000EE6E790EEE6EEE6AD950150FE96EDACFF2 -:101A1000EAFF120070D87BEF0DF0630E8CD88FD8E0 -:101A20006D0E65D8720E63D8EE6AE66A1200DACFE0 +:10198000FC9CDF50E552D7D0070EE66EECEC1BF066 +:10199000E552E552D9CFE6FFDACFE6FF010EA6D831 +:1019A000D950150FCCD8020EA1D8D9502A0FC7D8BC +:1019B000030E9CD8D9503F0FC2D8040E97D8540EAE +:1019C000E15C1200A7D8540EE126D9CFE9FFDACFA7 +:1019D000EAFF5B0EEE6E4B0EEE6E720EEE6E6F0E4B +:1019E000EE6E5D0EEE6E620EEE6E6F0EEE6E740EAD +:1019F000EE6E200E89D8EE6EEE6E570EA5D86C0EE8 +:101A0000EE6EEE6E790EEE6EEE6AD950150FE96E3F +:101A1000DACFEAFF120078D884EF0DF0630E94D885 +:101A200097D86D0E6DD8720E6BD8EE6A1200DACFB1 :101A3000E4FFE2CFDAFFE9CFE4FFEACFE4FFF6CF3D :101A4000E4FFF7CFE4FFF5CFE4FFF3CFE4FFF4CFFB :101A5000E4FFFACFE4FF1200E5CFFAFFE5CFF4FF91 :101A6000E5CFF3FFE5CFF5FFE5CFF7FFE5CFF6FFD5 :101A7000E5CFEAFFE5CFE9FFE5CFDAFF1200E65256 -:101A800040D8020EE126F350DF6E010EF4CFDBFFEB -:101A90001200EE6E6F0EEE6E6E0EEE6E77EF0DF0C4 -:101AA000E16E40D0DF50F36E010EDB50F46E020E9B -:101AB000E15C1200DFCFE6FFE66A01EC1EF0E552C2 -:101AC000E5521200EE6AD9502A0FE96EDACFEAFF2A -:101AD00012000DD8200EEE6EEE6E1200E66EE66A73 -:101AE00001EC1CF0E552E552E552E5521200EE6EB3 -:101AF000650EEE6E1200EE6EEE6EEE6EEE6EEE6E39 -:101B00001200D9CFE6FFE1CFD9FF1200EE6AD9501B -:101B10003F0FE96EDACFEAFF200E12007BDF7ADF9B -:101B200062EF0DF0E552E7CFD9FF1200E66E000E2E -:101B3000DA20E66E1200EE6E610EEE6E1200720E8C -:0C1B4000EE6E740ED4DF200EEE6E12006C -:041B4C009EEC12F009 -:101B50006A6A686AD1EC12F06D8C6E6A81EC12F0E0 -:101B60006D9CDF6AB2EC12F010E2DF50040DF3CF8F -:101B7000E9FFF4CFEAFF000EE926040EEA22EE6A3E -:101B8000EE6AEE6AEE6ADF2AEDD7160E706E68A670 -:101B900004D0030E47EC12F0FAD70001736B786B98 -:101BA000796B7A6B6D98080E6B6F040E6C6F616BBE -:101BB000606BE5525CEF12F09EEC12F00001605198 -:101BC0000BE16D6A696AD1EC12F06DB602D06D86D8 -:101BD000FCD70001010E606F600508E16DBA06D008 -:101BE000686A696A69806988020E606F6850040BD0 -:101BF00007E06950040B04E0020E47EC12F089D8AC -:101C00006DB247D06850010B14E06950010B11E030 -:101C10009DDF0001040E606F0401200E026F040EB0 -:101C2000036F080E016F006B8C0E0013E66A10EC58 -:101C300013F06850100B07E06950100B04E060D8F7 -:101C4000040E47EC12F06850400B0BE06950400B5B -:101C500008E0D8EC12F0020E4FEC12F0060E47EC42 -:101C600012F06850200B04E06950200B01E035D8D9 -:101C70006850020B0AE06950020B07E0D8EC12F042 -:101C8000E668E66830EC13F06A6A040E0001605DF5 -:101C900002E2A19A1FD069A61CD0DF6A040EDF5CA5 -:101CA00018E268A616D06CCF80F0030E47EC12F055 -:101CB000780E0001801502E138D809D0000EE66EDA -:101CC000E66A800EE66E000EE66E010EE8DBDF2AA5 -:101CD000E5D7A19AE5525CEF12F070A00ED06AEC45 -:101CE00012F0EF50800808E1D5DBEF50840804E1E2 -:101CF0006AEC12F08C0EEF6E7090050E47EF12F04A -:101D00006984040EC4DB6D828AEC12F0040E4FEF7E -:101D100012F08AEC12F0030EC2DB6D92699468A493 -:101D200003D0020EB4DBFBD712009EEC12F0FD0EC6 -:101D3000000180153DE17E0E8015E8407F0B040D0B -:101D4000F3CF63F0F4CF64F0000E6327040E642336 -:101D500063C065F064C066F06575BCDBEF503C0B9A -:101D6000E842E8420D0822E1B5DB07EC13F0EECFC4 -:101D700000F0EFCF01F0280E001816E1040E011854 -:101D800013E141EC13F0DF6AEDDB0EE2DF50BAEC59 -:101D900012F0DF50EA6A200FE96E040EEA22E552E3 -:101DA000E750EF6EDF2AF0D70AD807D01AD805D04F -:101DB000FD0E8015040801E122D8E5527DD36ADBCF -:101DC000EF50800B02E066DBEF6A00016F6B706B17 -:101DD000746B756B736B64D89DDB170E60DB85EFDE -:101DE00010F0020E0001705D02E112EF11F034D824 -:101DF0000001815102E10CEF13F0816B12009EDBB8 -:101E000049DBEF50400B01E0010EDF6E00016B7506 -:101E1000080E605D09E122C46EFF6E50000802E208 -:101E2000100E01D0040E606F700513E145EC13F045 -:101E3000A6D9020E00016F5D03E12CDB840E07D0F2 -:101E4000DF5003E127DBC80E02D024DB880EEF6EE3 -:101E500001D002D8E55230D32BDB0001706B1ADBC6 -:101E6000EF6A040E6B19006E6CC001F0DE6E6CC080 -:101E7000DDFF19DBEF6A78AF0CD07B517C1107E0F6 -:101E800005D07CC0FAFF00017B51F96EFADF00013A -:101E9000789F020EE15C02E2E16AE552E16E0CD34A -:101EA00004012051600BE842E842E842E842E8427F -:101EB000000901E0120021510C0A45E00B0A3FE045 -:101EC0000C0A31E0010A22E00B0A1EE0020A1CE0C3 -:101ED000030A18E0080A10E0010A0CE00F0A08E003 -:101EE000030A01E012000001738F080E606F1200F8 -:101EF00005EF10F06EEF11F00001610E716F000E32 -:101F0000726F0CD046EF10F0A4EF0FF024510001D7 -:101F1000716F726B620E7127000E72237381010E56 -:101F2000746F738F12000001738F04012451EA6AE9 -:101F3000620FE96E000EEA2222C4EFFF1200EADA15 -:101F4000160E4FEF12F012007EDB040EE1260401A4 -:101F5000220510E120511F0B00090CE10001738FD5 -:101F6000030E0401215D04E10001010E7F6F02D028 -:101F700000017F6B0401225141E120511F0B020837 -:101F80003DE124510F0B000939E00001738F04017A -:101F900024BF05D0A4DA670EE926000E04D09FDA2C -:101FA0006B0EE926000ED2DA030E215D03E17BDA27 -:101FB000840E23D024510F0B016A700F006E0F0E98 -:101FC0000122020E00C0DBFF030E01C0DBFF020E88 -:101FD000DBCFE9FF030EDBCFEAFFEE90ED5224AF3B -:101FE00006D061DAEF6ADF745EDA400E06D05BDAA3 -:101FF000880EEF6EDF7457DAC80EEF6E040EE15CE8 -:1020000002E2E16AE552E16E57D2800E0401205DE2 -:102010003CE10001C00E736F04012351030A1EE06E -:10202000010A09E0030A2FE10001480E716F390E21 -:10203000726F120E22D0C3DAF00EF626390EA2DA33 -:10204000020E0001F76A7125F66E7251F72209003F -:10205000F5CF74F00A00F5CF75F01200030E225D83 -:102060000FE2ADDAF20EF626390E8CDA71C0F6FF09 -:1020700072C0F7FF0800F5500001746F756B120015 -:102080000001736B12000001736B120011DA04017E -:10209000286B296B20511F0B020A11E0030A0CE088 -:1020A000010A22E10001738F0401288100017F05EC -:1020B0001BE10401288318D00001738F15D00001A3 -:1020C000738F040124BF05D00ADA670EE926000EDB -:1020D00004D005DA6B0EE926000E38DAE4D9EF50A9 -:1020E000040B02E0010E286F000173AF07D0280E29 -:1020F000716F040E726F7381020E746F020EE15CD9 -:1021000002E2E16AE552E16ED7D16D98000173BF3A -:1021100008D078AF02D061DA2AD07EDABBD9840E3B -:1021200027D078BF2BD0040120AF24D000017451F8 -:102130000401265D000175510401275904E226C4FB -:1021400074F027C475F01BD80001010E706FA1DA7E -:10215000800EEF6E816BBED9EE52080EEF6E91DAF3 -:10216000B9D9840EEF6E010E816F8FDA93D9C80E44 -:10217000EF6E1200000131DAC80EEF6E120098D92E -:102180000001080E745D000E75590DE274C0DEFF8B -:1021900075C0DDFF6F5102E1010E03D06F0506E14E -:1021A000020E6F6F03D0080EDE6EDD6A73D9EF92F8 -:1021B00071D9EF906FD9010EDB50EF126BD9EE524F -:1021C000DFCFEFFF000EDB50745F010EDB50755B5D -:1021D000280E7D6F040E7E6F73B10FD0F7D91BE010 -:1021E00071C0F6FF72C0F7FF712B000E722308005A -:1021F000F55096D9F3E2DB06F1D7E8D90CE071C0CF -:10220000E9FF72C0EAFF712B000E7223EF5088D9EC -:10221000F4E2DB06F2D7020EE15C02E2E16AE5528B -:10222000E16E4AD145D956D9EE52EFCFDFFFDFCF6D -:1022300000F000500001795D000E7A5903E279C088 -:10224000DFFF09D0DF50006E016AE850795D796FD9 -:1022500001507A597A6F010EDB6ADF50F36E010E7E -:10226000DBCFF4FFF350F45C10E2010EDB5082D9B7 -:1022700076C0E9FF77C0EAFF762B000E7723E552A0 -:10228000E750EF6E010EDB2AE8D7000ED8807955B3 -:10229000000E7A550DE2F4D854D91CD9EF50400BFA -:1022A00003E1EAD9C80E02D0E7D9880EEF6E0FD04D -:1022B000F0D9840EEF6E7B517C1107E005D07CC015 -:1022C000FAFF00017B51F96EFADF0001789F020EE0 -:1022D000E15C02E2E16AE552E16EEED00001738F4B -:1022E00010D9010EE66EE66AE66A620EE66E000E30 -:1022F000AFD922C461F00401225104E10001100EA3 -:10230000606F12000001200E606F04D9150E4FEFB0 -:1023100012F0CED8000EDE6E040EDD6EE8D8040D8D -:10232000F350006E016A020E0F0B05E0D8900132E7 -:102330000032E806FBE1D89000360136D89000362E -:102340000136D9CFE9FFDACFEAFF0050EE2601507F -:10235000ED22A9D8EF9EFD0EDB5002E16AD901D033 -:102360006DD9EA22DECFEEFFDDCFEDFF9CD8EF9CEA -:102370009AD8040EE926000EEA22EF8C020EE15CE8 -:1023800002E2E16AE552E16E97D092D8FE0EDB5090 -:10239000016A700F006E0F0EDFD885D8FD0EDBCFFF -:1023A000EFFFDBA402D0E66AF5D8FD0EDBA203D076 -:1023B000010EE66EEFD8020EE15C02E2E16AE55240 -:1023C000E16E7AD075D8FE0EDB5005E125D962D8D2 -:1023D000840EEF6E05D08BD80CD989D8010F09D99E -:1023E000020EE15C02E2E16AE552E16E65D060D87E -:1023F000FD0EDB5002E022D901D01BD9A7D853D85B -:1024000006D9FB0EDBCFEEFFFC0EDBCFEDFF4BD88A -:10241000EE52FA0EDBCFEFFF400E45D8E850EF1634 -:10242000880E41D8E850EF12FD0EDB5002E006D9CD -:1024300001D0FFD8EA22EF74DECF00F0DDCF01F04B -:1024400000C0F3FF01C0F4FF020EE15C02E2E16AAA -:10245000E552E16E31D0F7D8010EF36EFC0EDB5081 -:1024600004E0D890F336E806FCE1F31C006EFD0EA4 -:10247000DBCFE9FFFE0EDBCFEAFF0050EF161CD0EA -:10248000FBD8EE52080EEF6EF7D807EF13F0E66EAA -:1024900010EF13F06BC0E9FF6CC0EAFF1200E66EAC -:1024A000E66A30EF13F0DECFE9FFDDCFEAFF12007E -:1024B000CAD8020EE1261200E552E7CFD9FF12007A -:1024C000D6D83CEF13F0FE0EEA6ADB34FE0BEA3698 -:1024D000E96E120063C0E9FF64C0EAFF12002451F4 -:1024E0000F0BE96EEA6AD890E936EA361200FD0E63 -:1024F000DB50E824026EFE0EDB50040DF350022484 -:102500001200000EE66EE66AE66A710EE66E0F0EC7 -:1025100028EF13F0000EE66EE66AE66EE66A120039 -:10252000E66E7DC0E9FF7EC0EAFF7D2B000E7E23B4 -:10253000E552E750EF6EDF06010E120084D8E65236 -:102540001200280EEE6E040EED6E1200EA22EECF9F -:10255000DEFFEDCFDDFF1200012200C0DEFF01C073 -:10256000DDFF1200DF50006E016A080E005C000EF5 -:1025700001581200EA6A280FE96E040EEA22EF50B1 -:10258000E66E1200F7220900F5CF71F00A00F5CFD0 -:1025900072F01200FE0EDBCFE6FFBBDEE552E55225 -:1025A0001200160E6F6E9F0E6B6E7B0E696E120020 -:1025B000010EE66EE66A000EE66EE66A1200225131 -:1025C000F66EF76AD890F636F7361200D9CFE9FFE3 -:1025D000DACFEAFFEE50ED101200020E706F5ADFF4 -:1025E000EE52EF6A57DFC80EEF6E4ADFAADF3CEF0C -:1025F00013F0040DF3CF00F0F4CF01F0000E00262D -:10260000040EAADF840E4FDFE850EF121200020E14 -:10261000E926000EEA2212003CD88C0EEF6E120062 -:10262000680EE66E0F0EE66E16DFE552E552E552D5 -:10263000120049DF670EE926000E120044DF6B0E20 -:10264000E926000E1200D9CFE6FFE1CFD9FF120034 -:10265000E66ECBEC1DF0006E050EE15E0050120040 -:1026600053EC0CF0006E060EE15E00501200200EDE -:10267000EE6E040EED6E120065C0E9FF66C0EAFF63 -:10268000120028DFC4DF37EF13F004DFC0DFA1EF53 -:0826900012F0F6DE60EF12F01B -:08269800959A838A190EF3EFF5 -:1026A00015F0CFDA030EE126ACA2FED729EC1FF01D -:1026B000DF6E0001A85104E1865102E1010EA96F0D -:1026C000A90558E1A851A8DADFCFEFFF020EA85DF7 -:1026D00008E2FF0EDF5C05E0050EABDA0001A96B36 -:1026E000A86B030EA85D04E1030EDF240001CA6F8E -:1026F000030E0001A85D3DE30001CA510001A85D81 -:1027000038E1010EDB6A020EDB6E0001CA51F36E86 -:10271000020EDBCFF4FFF350F45C0EE2020EDB504E -:102720007BDA010EDBCFE7FFEF50E726010EE7CFA4 -:10273000DBFF020EDB2AE9D7CA516EDAEFCF00F0D9 -:10274000010EDB1C005C05E0070E73DA0001866BEE -:102750000DD000018B5102E0060E6BDA8BC0E6FF54 -:102760002AEC20F0E5520001010E866FA96BA86BE0 -:1027700001D0A82B030EE15C02E2E16AE552E16EB2 -:1027800024D25FDA220EE126010EDB68020EDB683E -:10279000FE0EDB50E76E030EE7CFDBFFFC0EDB50D7 -:1027A000020FE76E040EE7CFDBFFFD0EDB50E76E96 -:1027B000050EE7CFDBFFDF6AFC0EDB50DF5C13E2C8 -:1027C000DF50EA6AAA0FE96E000EEA22EF50E66EC9 -:1027D000D950010F006E050EDF2410DAE552E750E4 -:1027E000EF6EDF2AE9D7210EDB6A020EDF6EFC0EE8 -:1027F000DB50050FDF5C0FE2D950010F006EDF5098 -:10280000FDD9210EDBCFE7FFEF50E726210EE7CF02 -:10281000DBFFDF2AECD7210EDB1CE66ED950010F5F -:10282000006EFC0EDB50050FE9D9E552E750EF6E64 -:10283000839ADF6AFC0EDB50060FDF5C11E2ACA26C -:10284000FED7D950010F006EDACF01F0DF500F0133 -:10285000D5D9EF50E66E74EC20F0E552DF2AEAD7C6 -:10286000ACA2FED7838A0001866B220EE15C02E2F5 -:10287000E16AE552E16EA9D1000186511200000122 -:10288000A751120000018651FDE01200DAD9FE0EB8 -:10289000DB50EA6AAA0FE96E000EEA22FD0EDBCFDA -:1028A000EFFF93D1CED9020E9ED9A4D9A3D988D94E -:1028B00087D9190E98D984D983D987D10001865137 -:1028C00002E08B511200000CD9CFE6FFE1CFD9FF17 -:1028D000020EE126E66A010EE66EFE0EDBCFE6FF93 -:1028E00050DFE552E552E552DE6ADD6ADECF00F0E8 -:1028F000DDCF01F0FC0EDBCF02F0FD0EDBCF03F0ED -:102900000250005C0350015818E20001865104E0B7 -:102910000001A76B010E16D00000000000000000AF -:1029200000000000000000000000000000000000A7 -:10293000DF2A010E01E3DB2AD9D70001010EA76FC0 -:10294000000E00D0006E020EE15C02E2E16AE55288 -:10295000E16E0050E552E7CFD9FF120072D9E66A66 -:10296000060E19D932D135D9030E15D92ED119D960 -:1029700082D902E2E16AE552E16E27D1D9CFE6FFC2 -:10298000E1CFD9FF020EE126FD0EDBCFE6FFE66ABE -:102990007DDFE552E552010EE66E010EE66E76DF52 -:1029A000E552E552020EE66E020EE66EFE0EDBCF3B -:1029B000E6FFE7DEE552E552E552DE6ADD6ADECF8C -:1029C00000F0DDCF01F00A0E2A6E2B6AFB0EDBCF82 -:1029D0002FF0FC0EDBCF30F0CCEC17F028C002F06B -:1029E00029C003F00250005C0350015819E20001B5 -:1029F000865105E00001A76B00018C5116D0000044 -:102A000000000000000000000000000000000000C6 -:102A1000000000000000DF2A010E01E3DB2ACFD70F -:102A20000001010EA76F000E00D0006E020EE15CE7 -:102A300002E2E16AE552E16E0050E552E7CFD9FFCC -:102A40001200D9CFE6FFE1CFD9FF040EE126FD0E3B -:102A5000DBCFE6FFE66A1ADFE552E552020EE66ECC -:102A6000010EE66E13DFE552E552020EE66E020E2F -:102A7000E66EFE0EDBCFE6FF84DEE552E552E55260 -:102A8000DE6ADD6ADECF00F0DDCF01F00A0E2A6ECD -:102A90002B6AFB0EDBCF2FF0FC0EDBCF30F0CCEC43 -:102AA00017F028C002F029C003F00250005C035068 -:102AB000015827E20001865113E00001A76B030EC5 -:102AC0008DC0DBFF020E8CC0DBFF020EDBCF00F0FF -:102AD000030EDBCF01F000C0F3FF01C0F4FF17D0FD -:102AE00000000000000000000000000000000000E6 -:102AF0000000000000000000DF2A010E01E3DB2AD5 -:102B0000C1D70001010EA76FF36AF46A00D0040E6A -:102B1000E15C02E2E16AE552E16EE552E7CFD9FFFE -:102B2000120057D8040E37D850D03BD8040EA3D883 -:102B300002E2E16AE552E16E48D083D8E66A050E0A -:102B40002AD843D07ED8020EE1261E0EE66EE66A33 -:102B50009ED8FC0E67D893D8FA0E64D8030E6ED8B0 -:102B6000010EDBCFE6FF040E69D8F90EDB5004E15D -:102B7000050EE66E030E03D0050EE66E040E7BD83E -:102B800002E2E16AE552E16E20D03ED8240E5ED02A -:102B90003BD8260E5BD0E66EFE0EDBCFE6FFF1DD06 -:102BA0007AD04FD8020EE126FB0EDBCFDEFFDBCF63 -:102BB000DDFF5BD8DFCFE6FF62D8030EE66E1200C2 -:102BC000FE0EDBCFE6FF030E4BD0E552E7CFD9FF79 -:102BD000120037D84AD8FC0EDBCFE6FF010E2ED804 -:102BE000020EE66E1200E66EE66A7C0EE66E4BECB6 -:102BF0001DF051D0100EE66E040E32D00024E96EA6 -:102C0000000EDA20EA6E12001CD8FC0EDBCFE6FFC5 -:102C1000FD0EDBCFE6FF1200EA6A870FE96E000EB9 -:102C2000EA221200DBCFDEFFDBCFDDFFDFCFE6FFE6 -:102C30001200E66E2AEC20F0E5521200E66E47EF35 -:102C400016F0D9CFE6FFE1CFD9FF1200E66EFE0EF7 -:102C5000DBCFE6FFF6DEE552E552E552E552B5D7A9 -:102C6000E66EFE0EE66E7FDE16D0FD0EDBCFE6FFD3 -:102C7000E66A47EF16F08FDF020EE15C1200010EEC -:102C8000DDDF010EDBCFE6FF020E1EEF16F0FEDDEC -:0E2C9000E552E5521200E552E552E5521200FF -:022C9E00239E73 -:102CA00005D0239E2BAE02D02B6C238E2BC025F09B -:102CB000246A356A346A860E266E276A35EF18F064 -:102CC000239E08D0239E2BAE05D02A6C2B1EE86ACB -:102CD0002B22238E2BC025F02AC024F0356A346ABB -:102CE0008E0E266E276A35EF18F0317E236A71EC5E -:102CF00018F089EC18F023B619EF18F023A20AD0C7 -:102D000023AA03D023BE19EF18F023A425EF18F04F -:102D100022EF18F023AA05D023AC25EF18F022EFFC -:102D200018F023A00AD023A808D023BE04D023A4DF -:102D300002D02EEF18F032EF18F0346A276A3150C3 -:102D40002C5C336E10E329C035F02AC024F02BC070 -:102D500025F02CC032F02EC029F02FC02AF030C050 -:102D60002BF0233A09D02EC035F02FC024F030C00C -:102D700025F031C032F0336C239E23BC238E32C049 -:102D800026F023B061EF18F01A0E336061EF18F0EF -:102D9000266A2C6A23A408D0296C2A1E2B1E2C1EFE -:102DA000E86A2A222B222C2223AC08D0356C241E60 -:102DB000251E261EE86A242225222622286A33524E -:102DC00007E02C342B322A3229322832332EF9D71D -:102DD000295035262A5024222B5025222C502622D9 -:102DE00028C034F0239E26AE0BD0346C351E241E32 -:102DF000251E261EE86A3522242225222622238E1D -:102E000026A006D0D8802532243235323432322AF8 -:102E100032C026F035EF18F0236A71EC18F089EC17 -:102E200018F023B619EF18F023A205D023BA19EF32 -:102E300018F020EF18F023BA2CEF18F023A005D0DB -:102E400023B819EF18F02CEF18F023B820EF18F082 -:102E5000276A7F0E2C24266EE86A27223150265ED0 -:102E6000E86A275A1A0E326E2C6A346A356A246A66 -:102E7000256A2E50295E2F502A5A30502B5A000EA8 -:102E80002C5A09E72E5029262F502A2230502B2267 -:102E9000000E2C2201D0348AD89029362A362B36BF -:102EA0002C36D8903436353624362536322EE1D7B6 -:102EB0002B502A102910D8A4348A35EF18F0236A31 -:102EC00071EC18F089EC18F023B619EF18F023A272 -:102ED00005D023B819EF18F020EF18F023AA05D079 -:102EE00023B019EF18F020EF18F023B002D023A878 -:102EF00002D02CEF18F0276A31502C24266EE86A95 -:102F000027227E0E265EE86A275A346A356A246ACA -:102F1000256A30502B02F4CF25F0F3CF24F02F5048 -:102F20002B02F3503526F4502422000E2522305077 -:102F30002A02F3503526F4502422000E25222E506A -:102F40002B02F3503426F4503522000E2422252281 -:102F50002F502A02F3503426F4503522000E24223A -:102F6000252230502902F3503426F4503522000E29 -:102F7000242225222E502A02F4503426000E352217 -:102F8000242225222F502902F4503426000E352207 -:102F90002422252235EF18F02AC034F02A502F02BF -:102FA000F4CF29F0F3CF28F02B503002F4CF2BF0E0 -:102FB000F3CF2AF02F02F3502926F4502A22E86A90 -:102FC0002B2234503002F3502926F4502A22E86A8A -:102FD0002B22000C236A71EC18F023B6F4EF17F0E3 -:102FE00023A20ED023B405D07F0E2B6EFF0E2A6EC7 -:102FF0001FD0800E2B6E2A6A1BD02B6A2A6A18D02B -:1030000023B0FBD78F0E2C60EDD77E0E2C64F5D746 -:103010008E0E2C5C05E0D8902B322A322C2AF8D761 -:1030200023A406D02A6C2B1EE86A2B222BAEE5D7F0 -:1030300012007F0E2C6EFF0E2B6E2A6E296E120070 -:103040007F0E23BEFF0E2C6E02D07F0E2C6E800EE4 -:103050002B6E2A6A296AF3D723AE04D0800E2C6E19 -:103060002B6AF7D72C6A2B6AF4D725502410351019 -:103070003410F8E027BEF0D725BE0CD0265027101C -:10308000EBE0D89034363536243625362606D8A0DF -:103090002706F2D72750D4E12628D2E034AE11D04B -:1030A0007F0E341402E135A00CD0352AE86A2422C0 -:1030B000252207E3D880253224323532262A2628D5 -:1030C000BFE02650C9E035C029F024C02AF02534DD -:1030D0002B6E26302C6E2B322C9E23BE2C8E1FEF97 -:1030E00018F02B362C3602E32384237E06E123805E -:1030F0002C6A2B6A2A6A296A12002C2803E0D880DD -:103100002B321200D8902B3202E123821200238648 -:1031100012003036313602E3238C237E06E1238809 -:10312000316A306A2F6A2E6A1200312803E0D88093 -:0E31300030321200D8903032EAE1238A1200C9 -:02313E00D9CFE7 -:10314000E6FFE1CFD9FF9290C30E93169494060E3A -:10315000E66EF4EC1FF0E552FE0EDBA00CD0AF0ED5 -:10316000E66ED8EC1FF0E552000EE66EE66ABCECA7 -:103170001FF0E55204D0820EE66ED8EC1FF0E55247 -:10318000F194FE0EDBA20CD0C70EE66E08EC1FF029 -:10319000E552000EE66EE66AA0EC1FF0E55204D0A0 -:1031A000F50EE66E08EC1FF0E5528194819A80904E -:1031B00081988294819641D128D9D880000E00014F -:1031C000F455000EF555000EF655000EF7550CE2BD -:1031D000F407000EF55BF65BF75BF451F511F611A1 -:1031E000F71102E1BD6A8294120018D9D880000E4E -:1031F0000001F855000EF955000EFA55000EFB556A -:103200000CE2F807000EF95BFA5BFB5BF851F91171 -:10321000FA11FB1102E1BA6A8196120008D9DBB0FB -:103220008184DBB2818A09D102D9DBB08194DBB21F -:10323000819A03D1FCD8DBA033D0F80EDBCFF4F0B9 -:10324000F90EDBCFF5F0FA0EDBCFF6F0FB0EDBCF9D -:10325000F7F0280E2D6E2E6A2F6A306AF4C028F01F -:10326000F5C029F0F6C02AF0F7C02BF0C1EC1EF033 -:1032700028C0F4F029C0F5F02AC0F6F02BC0F7F012 -:10328000C4D8FD0EDB50E8B08080E8A080904A0EE4 -:10329000E66E45EC20F050D866EC1EF0E552E552A3 -:1032A000FE0EDBA233D0F80EDBCFF8F0F90EDBCF49 -:1032B000F9F0FA0EDBCFFAF0FB0EDBCFFBF0280EB5 -:1032C0002D6E2E6A2F6A306AF8C028F0F9C029F0F6 -:1032D000FAC02AF0FBC02BF0C1EC1EF028C0F8F0B9 -:1032E00029C0F9F02AC0FAF02BC0FBF097D8FD0EE8 -:1032F000DB50E8B08188E8A081984A0EE66E95EC34 -:103300001EF01AD837EC1EF0E552E55296D08050E8 -:10331000010B03E08350400B06E08050010B0BE1F2 -:103320008350800B08E1BD6A82940001F46BF56B59 -:10333000F66BF76B010C000CE552FC0EDBCF16F0C0 -:1033400016C02BF04FEC16F029C012F02AC013F073 -:103350002BC014F02CC015F02E6A2F6A7F0E306E31 -:10336000430E316E0CEC17F029C00EF02AC00FF09E -:103370002BC010F02CC011F02E6A2F6A200E306E78 -:103380003F0E316E5FEC17F029C00AF02AC00BF037 -:103390002BC00CF02CC00DF02E6A1B0E2F6E370EBA -:1033A000306E4C0E316E5FEC17F029C006F02AC06B -:1033B00007F02BC008F02CC009F02E6A400E2F6ECB -:1033C0001C0E306E460E316E0CEC17F0EAEC17F066 -:1033D00060EC16F029C002F02AC003F02BC004F004 -:1033E0002CC005F02E6A2F6A800E306E410E316EB1 -:1033F0000CEC17F0EAEC17F02AC000F02BC001F03B -:103400002AC0E6FF2BC0E6FF1200A00EE66E150EE6 -:10341000E66EBCEC1FF0E552E5521200A00EE66E1F -:10342000150EE66EA0EC1FF0E552E5521200D9CF62 -:10343000E6FFE1CFD9FFFE0E1200E552E7CFD9FF3C -:02344000120078 -:0E34420083948396839880928292050E0101F6 -:10345000105D0EE2010E10C1E7FFE75204E0E846FE -:10346000FE0BE706FCE101010F1502E1102BEED780 -:10347000050E105D60E21051040A10E0070A0CE02E -:10348000010A08E0030A04E0010A09E1838407D085 -:10349000838605D0838803D0808201D08282105138 -:1034A000D9D8EFCF02F0036A02BE03680A0E2A6E73 -:1034B0002B6A02C02FF003C030F0CCEC17F028C00C -:1034C00000F029C001F0DC0E0026050E012200509C -:1034D0000101112701501223A9D8800E126EBB0ED4 -:1034E000136E440E146E196A1A6A200E1B6E410E7A -:1034F0001C6E1051AFD8EFCF21F021C02BF051EC52 -:1035000016F029C01DF02AC01EF02BC01FF02CC0E1 -:1035100020F0AAD819C029F01AC02AF01BC02BF03D -:103520001CC02CF05FEC17F06FD876EC16F040D88A -:103530000101102B1200106B200E115D4E0E12595E -:1035400015E274D8400E126E9C0E136E460E146E69 -:1035500011C12AF012C12BF060EC16F055D875ECB1 -:1035600016F026D80101116B126B1200116B126B51 -:103570006DD7D9CFE6FFE1CFD9FFFE0EDB506AD879 -:10358000FD0EDBCFEFFF6CD05CD804E0D890F336B3 -:10359000E806FCE1F35001010F1362D052D804E0B9 -:1035A000D890F336E806FCE1F35001010F1B58D028 -:1035B00029C00DF02AC00EF02BC00FF02CC010F067 -:1035C00053D809C029F00AC02AF00BC02BF00CC058 -:1035D0002CF05FEC17F0EAEC17F02AC006F02BC0D5 -:1035E00007F0086A2A50035C006E2B500458016EE5 -:1035F00008500558026E00C0E6FF01C0E6FF84ECEB -:103600001FF0E552E552120029C015F02AC016F04D -:103610002BC017F02CC018F027D811C029F012C009 -:103620002AF013C02BF014C02CF0120003680468B9 -:10363000056A096A0A6AC00E0B6E3F0E0C6E116AAB -:103640001200D9CFE6FFE1CFD9FF010EF36EFE0ED7 -:10365000DB501200EA6A0A0FE96E010EEA2212003C -:10366000E552E7CFD9FF120029C02EF02AC02FF073 -:0A3670002BC030F02CC031F0120026 -:06367A00050EE66E060ECF -:103680008CD8070E8AD8080E88D8090E7ED80A0E64 -:1036900080D80B0E7AD80C0E7CD80D0E76D80E0E74 -:1036A00078D80F0E72D8100E74D8110EA9EF1BF037 -:1036B000D9CFE6FFE1CFD9FF51D8FD0EDBCFE6FF32 -:1036C00048EC1FF0E552C584B2EC20F0E552E7CF9C -:1036D000D9FF1200D9CFE6FFE1CFD9FF030EE126D3 -:1036E000020EDB6A3BD8C582A4EC20F0E90EE66E40 -:1036F00048EC1FF0E552C586DE6ADD6ADECF00F0D9 -:10370000DDCF01F0E80E005C030E01580BE2C7A00C -:1037100004D0020EC9CFDBFF05D0DF2A010EEEE395 -:10372000DB2AECD7C58AC588A4EC20F0C584A4ECBC -:1037300020F0B2EC20F0020EDB50006E030EE15CD4 -:1037400002E2E16AE552E16E0050E552E7CFD9FFAF -:103750001200E66EADDFE552E5521200800EE66E15 -:10376000080EE66E0FEC20F0E552E552C580A4ECA1 -:1037700020F0E80EE66E48EC1FF0E552FE0EDBCFBF -:10378000E6FF48EC1FF0E5521200E3DFC40EE66EE0 -:103790001200DFDF090EE66E1200DBDF050EE66EBB -:0237A000120015 -:0E37A20036D857D856D855D84DD8430E54D0E7 -:1037B00057D8430E51D054D8FD0EDB5002E0530EC3 -:1037C00001D0730E49D04CD8FD0EDB5002E0420E02 -:1037D00001D0620E41D044D8480E3ED041D84C0EA4 -:1037E000E66E48EC1FF0E55231D8FC0EDBCFE6FF69 -:1037F00048EC1FF020D00CD8FC0EDBCFE6FFFD0E0E -:1038000036D006D823D8FB0EDBCFE6FFFC0E2FD038 -:10381000D9CFE6FFE1CFD9FF800EE66E080EE66E47 -:103820000FEC20F0E552E552C580A4EC20F0FE0E2E -:10383000DBCFE6FF18D0E552C584B2EC20F0E552AC -:10384000E7CFD9FF12001B0EE66E0DD0FD0EDBCFC9 -:10385000E6FF09D0E66A07D0E66E48EC1FF0EBD72A -:10386000D7DF23EF1CF048EC1FF0E5521200DBCF4E -:0A387000E6FF90EC1DF0E552DED7F4 -:06387A00040120511F0BA8 -:10388000010801E01200245101E01200060E215D42 -:1038900021E12351230A1BE0010A0CE0030A1AE18B -:1038A0000001610517E100016C0E716F390E726F36 -:1038B000090E09D0000161050DE10001D30E716F01 -:1038C000390E726F1D0E746F756BC00E02D0000141 -:1038D000800E736F04012051600BE842E842E84219 -:1038E000E842E842010801E0120021510B0A26E0FB -:1038F000080A19E0090A11E0080A05E00B0A23E0AA -:10390000080A21E0120000011C0E716F010E726F97 -:10391000010E746F756BC10E0FD00001800E736FB6 -:1039200023C41CF1120000011D0E716F010E726F95 -:10393000010E746F756B810E736F12000001800EA3 -:08394000736F22C41DF1120097 -:0839480012010002000000085A -:10395000D80404000200010200010902290001014B -:1039600000C0320904000002030000000921110117 -:103970000001221D00070581034000010705010326 -:10398000400001040309042C034D006F006200692C -:10399000006C006500200052006F0062006F007430 -:1039A00000200050006C006100740066006F00721F -:1039B000006D00200352006F0062006F0074002051 -:1039C0000049006E007400650072006600610063CB -:1039D0000065000600FF0901A10119012940150039 -:1039E00026FF00750895408100190129409100C00B -:0839F0005A3983398739B339D4 -:0839F8002A0EF66E080EF76EB0 -:103A0000000EF86E01010900F550056F0900F55030 -:103A1000066F03E1056701D03DD00900F550006F46 -:103A20000900F550016F0900F550026F0900090007 -:103A3000F550E96E0900F550EA6E09000900090029 -:103A4000F550036F0900F550046F09000900F6CF27 -:103A500007F1F7CF08F1F8CF09F100C1F6FF01C176 -:103A6000F7FF02C1F8FF0101035302E1045307E02D -:103A70000900F550EE6E0307F8E20407F9D707C115 -:103A8000F6FF08C1F7FF09C1F8FF01010507000EA5 -:063A9000065BBFD7120027 -:0A3A9600D9CFE6FFDACFE6FFE1CF5B -:103AA000D9FFE2CFDAFFAC6AAB6AFD0EDBB0AC88BF -:103AB000DBA202D0AC8CAB8CDBB4AC8EDBA602D02C -:103AC000AB8801D0AB8ADBB8AC849E98DBBAAC86FD -:103AD000DBAC02D09D8A01D09D9A9E9ADBAE02D0CB -:103AE0009D8801D09D98FB0EDB50AF6EFB0EFC0E47 -:103AF000DBCF01F001C000F0016A0050B06EAC8A6B -:103B0000AB8E949C948EAC50100B04E0AC50800BA8 -:103B100001E1948CE552E5CFDAFFE7CFD9FF12003F -:103B2000D9CFE6FFDACFE6FFE1CFD9FFE2CFDAFF68 -:103B3000E65229D820E0C6A60AD025D8E66E48EC81 -:103B40001FF0E552DF6EDF5010E0DF5015D09E967B -:103B50001AD8C96EC6889EA6FED7C750040B05E1C9 -:103B6000C750010B02E1FE0E07D0FC0EDB2AFD0E52 -:103B7000E0E3DB2ADED7000EE552E552E5CFDAFFBF -:103B8000E7CFD9FF1200FC0EDBCFE9FFFD0EDBCF44 -:063B9000EAFFEF501200F5 -:0A3B9600FE0EE3CFE9FFFF0EE3CFC0 -:103BA000EAFFE9CFF3FFEACFF4FFFB0EE35003E1B6 -:103BB000FC0EE35009E0FB0EE30602E2FC0EE30616 -:103BC000FD0EE350EE6EF1D71200FB0EE3CFF6FFD1 -:103BD000FC0EE3CFF7FFFD0EE3CFF8FFFE0EE3CFC1 -:103BE000E9FFFF0EE3CFEAFFE9CFF3FFEACFF4FFEF -:103BF000EE66FED7ED520900F5CFEFFFEE66FBD77C -:023C00001200B0 -:0E3C02002DD8FD0EDB50A86EA69EA69CA684B3 -:103C1000F250800B01E0010E01011E6FF29E550E65 -:103C2000A76EAA0EA76EA6821E51E8B0F28EE8A07B -:103C3000F29EA6B2FED7A198A694E552E7CFD9FF8F -:103C400012000DD8A69EA69CA680020EE66E99ECE8 -:103C500020F0E552A850E552E7CFD9FF1200D9CFA6 -:0E3C6000E6FFE1CFD9FFFE0EDB50A96E120089 -:023C6E00D9CFAC -:103C7000E6FFDACFE6FFE1CFD9FFE2CFDAFFE65287 -:103C8000E652FC0EDBCF00F0FD0EDBCF01F0060E9E -:103C9000D89000360136E804FBE100C0DEFF01C029 -:103CA000DDFF010EDB50BB6EDF50E840E8403F0B0C -:103CB000300B006ECF0EBA140010BA6EE552E5520A -:0C3CC000E552E5CFDAFFE7CFD9FF120094 -:043CCC00D9CFE6FF67 -:103CD000DACFE6FFE1CFD9FFE2CFDAFFE652E652D4 -:103CE000FC0EDBCF00F0FD0EDBCF01F0060ED8900E -:103CF00000360136E804FBE100C0DEFF01C0DDFF55 -:103D0000010EDB50BE6EDF50E840E8403F0B300B49 -:103D1000006ECF0EBD140010BD6EE552E552E552A7 -:0A3D2000E5CFDAFFE7CFD9FF12006C -:063D2A00D9CFE6FFDACF5D -:103D3000E6FFE1CFD9FFE2CFDAFFE652E6520C0E02 -:103D4000BA6E050EF66EF76A300EF86E0800F55082 -:103D5000010B03E0010EDB6802D0010EDB6ADB50D1 -:103D600002E0949201D09396CA94FD0EDB50CB6E84 -:103D7000CA84E552E552E552E5CFDAFFE7CFD9FF35 -:023D800012002F -:0E3D8200276A266A256A246A200EE76ED8900A -:103D9000283629362A362B36243625362636273637 -:103DA0002D50245C2E5025582F502658305027581F -:103DB00009E32D50245E2E50255A2F50265A30509C -:0A3DC000275A282AE72EE4D7120044 -:063DCA00D9CFE6FFDACFBD -:103DD000E6FFE1CFD9FFE2CFDAFFFD0EDB50360B75 -:103DE000B16EB36AB26AA192FD0EDBAE02D0A082C0 -:103DF00001D0A092DBB2CD86DBA002D0B18E01D083 -:103E0000B19EB180E552E5CFDAFFE7CFD9FF1200CE -:103E1000D9CFE6FFDACFE6FFE1CFD9FFE2CFDAFF75 -:103E2000FD0EDB507E0BCD6EFD0EDBAC02D0CD8ED9 -:103E300001D0CD9ECF6ACE6A9E90DBAE02D09D802F -:103E400001D09D90CD80E552E5CFDAFFE7CFD9FFD5 -:023E500012005E -:0E3E5200D9CFE6FFDACFE6FFE1CFD9FFE2CF0E -:103E6000DAFFE652F20E0001FF17ABAC03D0FF9170 -:103E7000ABB0FF81ABB4FF85ABB2FF87AE50DF6E56 -:103E8000DF50E552E552E5CFDAFFE7CFD9FF120068 -:103E9000D9CFE6FFDACFE6FFE1CFD9FFE2CFDAFFF5 -:103EA000FD0EDB50C96EC6AE02D0FF0E09D0C7B002 -:103EB000FED7A4EC20F0C5AC02D0FE0E01D0000E5F -:0C3EC000E552E5CFDAFFE7CFD9FF120092 -:043ECC0031343A3221 -:103ED000333A33320020004D6172203230203230CC -:103EE000313000526F626F7420496E746572666182 -:103EF000636520312E300A4F6C6976696572204205 -:073F00004943484C45520003 -:083F0800D9CFE6FFDACFE6FF96 -:103F1000E1CFD9FFE2CFDAFFE652E652FC0EDBCF6B -:103F2000DEFFDBCFDDFF010EDB50B36EDF50B26E84 -:103F3000E552E552E552E5CFDAFFE7CFD9FF1200AF -:103F4000D9CFE6FFDACFE6FFE1CFD9FFE2CFDAFF44 -:103F5000E652E652FC0EDBCFDEFFDBCFDDFF010ECB -:103F6000DB50CF6EDF50CE6EE552E552E552E5CF25 -:083F7000DAFFE7CFD9FF1200D0 -:083F7800D9CFE6FFDACFE6FF26 -:103F8000E1CFD9FFE2CFDAFFE652E652FC0EDBCFFB -:103F9000DEFFDBCFDDFF010EDB50D76EDF50D66ECC -:103FA000E552E552E552E5CFDAFFE7CFD9FF12003F -:103FB000D9CFE6FFDACFE6FFE1CFD9FFE2CFDAFFD4 -:103FC000FD0EDB507F0BD56ED76AD66AF294FD0EDC -:103FD000DBAE02D0F28A01D0F29AD58EE552E5CF5F -:083FE000DAFFE7CFD9FF120060 -:083FE800D9CFE6FFDACFE6FFB6 -:103FF000E1CFD9FFE2CFDAFFFD0EDB50FB0BCA6E3B -:10400000CC6A9E92FD0EDBAE02D09D8201D09D92C5 -:0E401000CA84E552E5CFDAFFE7CFD9FF1200F0 -:02401E00D9CFF8 -:10402000E6FFDACFE6FFE1CFD9FFE2CFDAFF3F0EBE -:10403000C716C66AC56AFD0EDB50C612FC0EDB5001 -:10404000C71293829380C68AE552E5CFDAFFE7CFA5 -:04405000D9FF120082 -:0C405400D9CFE6FFE1CFD9FF00010ED864 -:10406000EF50000803E2EB291F0BEB6F07D8FE0EA1 -:10407000DBCFEFFFE552E7CFD9FF1200EB51EA6A41 -:0A408000CB0FE96E000EEA221200D9 -:06408A00D9CFE6FFDACFFA -:10409000E6FFE1CFD9FFE2CFDAFF0C0EBD12949418 -:1040A000CA94FD0EDB50CB6ECA84E552E5CFDAFF31 -:0A40B000E7CFD9FF1200949412002C -:0640BA00FF0EE350376E1B -:1040C000EF0E01D0F30EE76EE72E64EF20F00C0E3A -:1040D000366EE76AE72E6AEF20F0362E69EF20F0A1 -:0840E000372E62EF20F0120000 -:0840E800D9CFE6FFDACFE6FFB5 -:1040F000E1CFD9FFE2CFDAFFACAC04D0AC90000145 -:10410000FFB3AC80FD0EDB50AD6EE552E5CFDAFFBC -:06411000E7CFD9FF120009 -:0A41160013EE00F023EE00F0F86A4B -:10412000239CFCEC1CF0B4EC20F0B0EC04F0FBD7CA -:0241300012007B -:0E413200FF0EE350E84E1200000000D000D057 -:0841400000D0E82EFAD71200AE -:084148001F0EC514FDE1C75074 -:06415000040BFAE112006D -:0A41560000EE00F00F0EEE6AEA62C0 -:04416000FDD7120075 -:04416400C69A1200E5 -:02416800120043 -:06416A000000000000004F -:034170000000004C -:0D417300000000000000000000000000003F -:034180000000003C -:0941830000000000010000000032 -:04418C00000000002F -:10419000000000000000000000000000000000001F -:0D41A0000000000000000000000000000012 -:0341AD000000000F -:1041B00000000000000000000000000000000000FF +:101A800049D8020EE126F350DF6E010EF4CFDBFFE2 +:101A90001200EE6E6F0EEE6E6E0EEE6E80EF0DF0BB +:101AA000E16E49D0DF50F36E010EDB50F46E020E92 +:101AB000E15C1200DFCFE6FFE66A0AEC1EF0E552B9 +:101AC000E5521200E66A070EE66EE4EC1BF0E55202 +:101AD000E5521200EE6AD9502A0FE96EDACFEAFF1A +:101AE00012000ED8200EEE6EEE6E1200E66E070E9D +:101AF000E66E0AEC1CF0E552E552E552E5521200A2 +:101B0000EE6E650EEE6E1200EE6EEE6EEE6EEE6E28 +:101B1000EE6E1200D9CFE6FFE1CFD9FF1200EE6AD8 +:101B2000D9503F0FE96EDACFEAFF200E120073DFC3 +:101B300072DF6AEF0DF0E552E7CFD9FF1200E66ED3 +:101B4000000EDA20E66E1200EE6E610EEE6E1200EE +:0E1B5000720EEE6E740ED4DF200EEE6E1200DA +:021B5E00A7ECF2 +:101B600012F06A6A686ADAEC12F06D8C6E6A8AECBE +:101B700012F06D9CDF6ABBEC12F010E2DF50040D36 +:101B8000F3CFE9FFF4CFEAFF000EE926040EEA22C4 +:101B9000EE6AEE6AEE6AEE6ADF2AEDD7160E706E16 +:101BA00068A604D0030E50EC12F0FAD70001736B54 +:101BB000786B796B7A6B6D98080E6B6F040E6C6F97 +:101BC000616B606BE55265EF12F0A7EC12F000015B +:101BD00060510BE16D6A696ADAEC12F06DB602D001 +:101BE0006D86FCD70001010E606F600508E16DBADB +:101BF00006D0686A696A69806988020E606F6850F9 +:101C0000040B07E06950040B04E0020E50EC12F0E4 +:101C100089D86DB247D06850010B14E06950010BB0 +:101C200011E09DDF0001040E606F0401200E026FC1 +:101C3000040E036F080E016F006B8C0E0013E66A32 +:101C400019EC13F06850100B07E06950100B04E01A +:101C500060D8040E50EC12F06850400B0BE0695055 +:101C6000400B08E0E1EC12F0020E58EC12F0060E08 +:101C700050EC12F06850200B04E06950200B01E09A +:101C800035D86850020B0AE06950020B07E0E1EC1E +:101C900012F0E668E66839EC13F06A6A040E000197 +:101CA000605D02E2A19A1FD069A61CD0DF6A040E13 +:101CB000DF5C18E268A616D06CCF80F0030E50EC03 +:101CC00012F0780E0001801502E138D809D0000E1C +:101CD000E66EE66A800EE66E000EE66E010EE8DB4A +:101CE000DF2AE5D7A19AE55265EF12F070A00ED079 +:101CF00073EC12F0EF50800808E1D5DBEF50840858 +:101D000004E173EC12F08C0EEF6E7090050E50EF44 +:101D100012F06984040EC4DB6D8293EC12F0040EA1 +:101D200058EF12F093EC12F0030EC2DB6D9269943F +:101D300068A403D0020EB4DBFBD71200A7EC12F0AC +:101D4000FD0E000180153DE17E0E8015E8407F0B01 +:101D5000040DF3CF63F0F4CF64F0000E6327040E9C +:101D6000642363C065F064C066F06575BCDBEF504A +:101D70003C0BE842E8420D0822E1B5DB10EC13F021 +:101D8000EECF00F0EFCF01F0280E001816E1040EA0 +:101D9000011813E14AEC13F0DF6AEDDB0EE2DF50CD +:101DA000C3EC12F0DF50EA6A200FE96E040EEA225B +:101DB000E552E750EF6EDF2AF0D70AD807D01AD8DD +:101DC00005D0FD0E8015040801E122D8E5527DD32F +:101DD0006ADBEF50800B02E066DBEF6A00016F6B9D +:101DE000706B746B756B736B64D89DDB170E60DB67 +:101DF0008EEF10F0020E0001705D02E11BEF11F09A +:101E000034D80001815102E115EF13F0816B12000B +:101E10009EDB49DBEF50400B01E0010EDF6E00015D +:101E20006B75080E605D09E122C46EFF6E500008FC +:101E300002E2100E01D0040E606F700513E14EEC4B +:101E400013F0A6D9020E00016F5D03E12CDB840EB6 +:101E500007D0DF5003E127DBC80E02D024DB880E59 +:101E6000EF6E01D002D8E55230D32BDB0001706B4E +:101E70001ADBEF6A040E6B19006E6CC001F0DE6EA7 +:101E80006CC0DDFF19DBEF6A78AF0CD07B517C11A1 +:101E900007E005D07CC0FAFF00017B51F96EFADF44 +:101EA0000001789F020EE15C02E2E16AE552E16E18 +:101EB0000CD304012051600BE842E842E842E842BA +:101EC000E842000901E0120021510C0A45E00B0A2A +:101ED0003FE00C0A31E0010A22E00B0A1EE0020A90 +:101EE0001CE0030A18E0080A10E0010A0CE00F0ADF +:101EF00008E0030A01E012000001738F080E606F12 +:101F000012000EEF10F077EF11F00001610E716F0B +:101F1000000E726F0CD04FEF10F0ADEF0FF02451A8 +:101F20000001716F726B620E7127000E7223738154 +:101F3000010E746F738F12000001738F040124511E +:101F4000EA6A620FE96E000EEA2222C4EFFF120075 +:101F5000EADA160E58EF12F012007EDB040EE126CC +:101F60000401220510E120511F0B00090CE10001C2 +:101F7000738F030E0401215D04E10001010E7F6FE8 +:101F800002D000017F6B0401225141E120511F0B... [truncated message content] |
From: Jérémie D. <Ba...@us...> - 2010-03-27 15:56:26
|
This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "krobot". The branch, master has been updated via 7558393126f5f1a81a625ac777ee1875348d37e0 (commit) from 412d97271818ea4c3dd581b190b7ef306decf027 (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 7558393126f5f1a81a625ac777ee1875348d37e0 Author: Jérémie Dimino <je...@di...> Date: Sat Mar 27 16:55:46 2010 +0100 Trajectory along a graph ----------------------------------------------------------------------- Changes: diff --git a/PC_Mainboard/krobot.mllib b/PC_Mainboard/krobot.mllib index 6116255..03fb8f1 100644 --- a/PC_Mainboard/krobot.mllib +++ b/PC_Mainboard/krobot.mllib @@ -1,4 +1,5 @@ lib_krobot/Krobot lib_krobot/Krobot_unsafe +lib_krobot/Krobot_move common/Krobot_types common/Krobot_config diff --git a/PC_Mainboard/lib_krobot/krobot_move.ml b/PC_Mainboard/lib_krobot/krobot_move.ml new file mode 100644 index 0000000..69840f3 --- /dev/null +++ b/PC_Mainboard/lib_krobot/krobot_move.ml @@ -0,0 +1,92 @@ +(* + * krobot_move.ml + * -------------- + * Copyright : (c) 2010, Jeremie Dimino <je...@di...> + * Licence : BSD3 + * + * This file is a part of [kro]bot. + *) + +type vertex = { + vx : int; + vy : int; +} + +module Vertex = +struct + type t = vertex + let compare = compare +end + +module Edge = +struct + type t = vertex * vertex + let compare = compare +end + +module Vertex_set = Set.Make(Vertex) +module Edge_set = Set.Make(Edge) +module Vertex_map = Map.Make(Vertex) + +type graph = Edge_set.t + +let empty = + Edge_set.empty + +let add_edge (a, b) graph = + Edge_set.add (a, b) (Edge_set.add (b, a) graph) + +let square x = x * x + +let distance a b = truncate (sqrt (float_of_int (square (a.vx - b.vy) + square (a.vy - b.vy)))) +let angle a b = truncate (atan2 (float_of_int (b.vy - a.vy)) (float_of_int (b.vx - a.vx)) *. 180. /. 3.14159265) - 90 + +type vertex_search_info = { + vsi_distance : int; + (* The lemgth of the smallest path reaching this vertex *) + + vsi_initial : vertex; + (* The vertex that was initially choosen for this path *) +} + +let move ~graph ~position ~destination = + (* [visited] is a mapping from already visited vertexs to the length + of the smallest path to reach them, and the initial edge that was + choosen. *) + let rec search visited lastly_added = + if Vertex_set.is_empty lastly_added then + Vertex_map.find destination visited + else begin + let visited, newly_added = + Edge_set.fold + (fun (a, b) (visited, newly_added) -> + if Vertex_set.mem a lastly_added then + let vsi_a = Vertex_map.find a visited in + let dist = vsi_a.vsi_distance + distance a b in + try + if (Vertex_map.find b visited).vsi_distance < dist then + (visited, newly_added) + else + (Vertex_map.add b { vsi_a with vsi_distance = dist } visited, newly_added) + with Not_found -> + (Vertex_map.add b { vsi_a with vsi_distance = dist } visited, Vertex_set.add b newly_added) + else + (visited, newly_added)) + graph (visited, Vertex_set.empty) + in + search visited newly_added + end + in + let visited, newly_added = + Edge_set.fold + (fun (a, b) (visited, newly_added) -> + if a = position then + (Vertex_map.add b { vsi_distance = distance a b; vsi_initial = b } visited, + Vertex_set.add b newly_added) + else + (visited, newly_added)) + graph + (Vertex_map.add position { vsi_initial = position; vsi_distance = 0 } Vertex_map.empty, + Vertex_set.empty) + in + (search visited newly_added).vsi_initial diff --git a/PC_Mainboard/lib_krobot/krobot_move.mli b/PC_Mainboard/lib_krobot/krobot_move.mli new file mode 100644 index 0000000..415ce1e --- /dev/null +++ b/PC_Mainboard/lib_krobot/krobot_move.mli @@ -0,0 +1,27 @@ +(* + * krobot_move.mli + * --------------- + * Copyright : (c) 2010, Jeremie Dimino <je...@di...> + * Licence : BSD3 + * + * This file is a part of [kro]bot. + *) + +(** Make the robot to move along a graph *) + +type graph + +type vertex = { + vx : int; + vy : int; +} + +val empty : graph +val add_edge : vertex * vertex -> graph -> graph + +val move : graph : graph -> position : vertex -> destination : vertex -> vertex + (** [move ~graph ~position ~destination] returns the next step to + reach [destination] *) + +val distance : vertex -> vertex -> int +val angle : vertex -> vertex -> int diff --git a/PC_Mainboard/myocamlbuild.ml b/PC_Mainboard/myocamlbuild.ml index 9d3c31b..a182489 100644 --- a/PC_Mainboard/myocamlbuild.ml +++ b/PC_Mainboard/myocamlbuild.ml @@ -81,6 +81,7 @@ let targets = List.filter_opt (function (true, target) -> Some target | (false, (have_lwt_unix && have_obus, "tests/double_move.best"); (have_lwt_unix && have_obus, "tests/stop_and_restart.best"); (have_lwt_unix && have_obus, "tests/trajectories.best"); + (have_lwt_unix && have_obus, "tests/move.best"); ] (* +-----------------------------------------------------------------+ diff --git a/PC_Mainboard/tests/move.ml b/PC_Mainboard/tests/move.ml new file mode 100644 index 0000000..489acd9 --- /dev/null +++ b/PC_Mainboard/tests/move.ml @@ -0,0 +1,58 @@ +(* + * move.ml + * ------- + * Copyright : (c) 2010, Jeremie Dimino <je...@di...> + * Licence : BSD3 + * + * This file is a part of [kro]bot. + *) + +open Lwt +open Printf +open Krobot_move + +let graph = List.fold_left (fun graph edge -> add_edge edge graph) empty [ + ({ vx = 0; vy = 0 }, { vx = 0; vy = 10 }); + ({ vx = 0; vy = 10 }, { vx = 10; vy = 10 }); + ({ vx = 10; vy = 10 }, { vx = 10; vy = 20 }); +] + +let init = { vx = 0; vy = 0 } +let dest = { vx = 10; vy = 20 } + +let rec loop krobot position angle = + if position = dest then + return () + else begin + let next = Krobot_move.move graph position dest in + printf "(%d, %d) -> (%d, %d)\n" position.vx position.vy next.vx next.vy; + let diff = Krobot_move.angle position next - angle in + printf " current; %d, diff: %d\n" angle diff; + lwt () = + match krobot with + | Some krobot -> + lwt () = + if diff <> 0 then + lwt _ = Krobot.turn krobot ~angle:diff ~velocity:400 ~acceleration:800 in + return () + else + return () + in + lwt _ = Krobot.move krobot ~distance:(Krobot_move.distance position next) ~velocity:400 ~acceleration:800 in + return () + | None -> + return () + in + loop krobot next (angle + diff) + end + +lwt () = + lwt krobot = + match Array.to_list Sys.argv with + | _ :: "real" :: _ -> + lwt krobot = Krobot.create () in + return (Some krobot) + | _ -> + return None + in + loop krobot init 0 hooks/post-receive -- krobot |
From: Jérémie D. <Ba...@us...> - 2010-03-27 12:17: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 412d97271818ea4c3dd581b190b7ef306decf027 (commit) from 9ae8e3247695968ddd35f81e1296c609669ead2f (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 412d97271818ea4c3dd581b190b7ef306decf027 Author: Jérémie Dimino <je...@di...> Date: Sat Mar 27 13:16:35 2010 +0100 Synchronise PcInterface.h ----------------------------------------------------------------------- Changes: diff --git a/PC_Mainboard/python/dev/USB_Com_Layer/src/PcInterface.h b/PC_Mainboard/python/dev/USB_Com_Layer/src/PcInterface.h index a24b00c..d681bb5 100644 --- a/PC_Mainboard/python/dev/USB_Com_Layer/src/PcInterface.h +++ b/PC_Mainboard/python/dev/USB_Com_Layer/src/PcInterface.h @@ -125,20 +125,20 @@ typedef struct _UP { // CMD_AX12 #define AX12_PING 1 -#define AX12_READ 2 -#define AX12_WRITE 3 -#define AX12_GOTO 4 -#define AX12_GET_POS 5 -#define AX12_GET_SPEED 6 -#define AX12_GET_LOAD 7 -#define AX12_GET_STATS 8 -#define AX12_WRITE_REG 9 -#define AX12_ACTION 10 -#define AX12_RESET 11 -#define AX12_CONFIG 12 - -#define AX12_VALUE8 0x00 -#define AX12_VALUE16 0x01 +#define AX12_READ8 2 +#define AX12_READ16 3 +#define AX12_WRITE8 4 +#define AX12_WRITE16 5 +#define AX12_GOTO 6 +#define AX12_GET_POS 7 +#define AX12_GET_SPEED 8 +#define AX12_GET_LOAD 9 +#define AX12_GET_STATS 10 +#define AX12_WRITE_REG8 11 +#define AX12_WRITE_REG16 12 +#define AX12_ACTION 13 +#define AX12_RESET 14 +#define AX12_CONFIG 15 #define AX12_EXEC_NOW 0x00 #define AX12_EXEC_ACTION 0x01 diff --git a/PC_Mainboard/python/dev/User_Interface/PcInterface.h b/PC_Mainboard/python/dev/User_Interface/PcInterface.h index a24b00c..d681bb5 100644 --- a/PC_Mainboard/python/dev/User_Interface/PcInterface.h +++ b/PC_Mainboard/python/dev/User_Interface/PcInterface.h @@ -125,20 +125,20 @@ typedef struct _UP { // CMD_AX12 #define AX12_PING 1 -#define AX12_READ 2 -#define AX12_WRITE 3 -#define AX12_GOTO 4 -#define AX12_GET_POS 5 -#define AX12_GET_SPEED 6 -#define AX12_GET_LOAD 7 -#define AX12_GET_STATS 8 -#define AX12_WRITE_REG 9 -#define AX12_ACTION 10 -#define AX12_RESET 11 -#define AX12_CONFIG 12 - -#define AX12_VALUE8 0x00 -#define AX12_VALUE16 0x01 +#define AX12_READ8 2 +#define AX12_READ16 3 +#define AX12_WRITE8 4 +#define AX12_WRITE16 5 +#define AX12_GOTO 6 +#define AX12_GET_POS 7 +#define AX12_GET_SPEED 8 +#define AX12_GET_LOAD 9 +#define AX12_GET_STATS 10 +#define AX12_WRITE_REG8 11 +#define AX12_WRITE_REG16 12 +#define AX12_ACTION 13 +#define AX12_RESET 14 +#define AX12_CONFIG 15 #define AX12_EXEC_NOW 0x00 #define AX12_EXEC_ACTION 0x01 diff --git a/USB_Dev_Board/Firmware/PcInterface.h b/USB_Dev_Board/Firmware/PcInterface.h index a24b00c..d681bb5 100644 --- a/USB_Dev_Board/Firmware/PcInterface.h +++ b/USB_Dev_Board/Firmware/PcInterface.h @@ -125,20 +125,20 @@ typedef struct _UP { // CMD_AX12 #define AX12_PING 1 -#define AX12_READ 2 -#define AX12_WRITE 3 -#define AX12_GOTO 4 -#define AX12_GET_POS 5 -#define AX12_GET_SPEED 6 -#define AX12_GET_LOAD 7 -#define AX12_GET_STATS 8 -#define AX12_WRITE_REG 9 -#define AX12_ACTION 10 -#define AX12_RESET 11 -#define AX12_CONFIG 12 - -#define AX12_VALUE8 0x00 -#define AX12_VALUE16 0x01 +#define AX12_READ8 2 +#define AX12_READ16 3 +#define AX12_WRITE8 4 +#define AX12_WRITE16 5 +#define AX12_GOTO 6 +#define AX12_GET_POS 7 +#define AX12_GET_SPEED 8 +#define AX12_GET_LOAD 9 +#define AX12_GET_STATS 10 +#define AX12_WRITE_REG8 11 +#define AX12_WRITE_REG16 12 +#define AX12_ACTION 13 +#define AX12_RESET 14 +#define AX12_CONFIG 15 #define AX12_EXEC_NOW 0x00 #define AX12_EXEC_ACTION 0x01 diff --git a/USB_Module/Battery_Monitoring/Firmware/PcInterface.h b/USB_Module/Battery_Monitoring/Firmware/PcInterface.h index a24b00c..d681bb5 100644 --- a/USB_Module/Battery_Monitoring/Firmware/PcInterface.h +++ b/USB_Module/Battery_Monitoring/Firmware/PcInterface.h @@ -125,20 +125,20 @@ typedef struct _UP { // CMD_AX12 #define AX12_PING 1 -#define AX12_READ 2 -#define AX12_WRITE 3 -#define AX12_GOTO 4 -#define AX12_GET_POS 5 -#define AX12_GET_SPEED 6 -#define AX12_GET_LOAD 7 -#define AX12_GET_STATS 8 -#define AX12_WRITE_REG 9 -#define AX12_ACTION 10 -#define AX12_RESET 11 -#define AX12_CONFIG 12 - -#define AX12_VALUE8 0x00 -#define AX12_VALUE16 0x01 +#define AX12_READ8 2 +#define AX12_READ16 3 +#define AX12_WRITE8 4 +#define AX12_WRITE16 5 +#define AX12_GOTO 6 +#define AX12_GET_POS 7 +#define AX12_GET_SPEED 8 +#define AX12_GET_LOAD 9 +#define AX12_GET_STATS 10 +#define AX12_WRITE_REG8 11 +#define AX12_WRITE_REG16 12 +#define AX12_ACTION 13 +#define AX12_RESET 14 +#define AX12_CONFIG 15 #define AX12_EXEC_NOW 0x00 #define AX12_EXEC_ACTION 0x01 diff --git a/USB_Module/Motor_Controller/Firmware/PcInterface.h b/USB_Module/Motor_Controller/Firmware/PcInterface.h index a24b00c..d681bb5 100644 --- a/USB_Module/Motor_Controller/Firmware/PcInterface.h +++ b/USB_Module/Motor_Controller/Firmware/PcInterface.h @@ -125,20 +125,20 @@ typedef struct _UP { // CMD_AX12 #define AX12_PING 1 -#define AX12_READ 2 -#define AX12_WRITE 3 -#define AX12_GOTO 4 -#define AX12_GET_POS 5 -#define AX12_GET_SPEED 6 -#define AX12_GET_LOAD 7 -#define AX12_GET_STATS 8 -#define AX12_WRITE_REG 9 -#define AX12_ACTION 10 -#define AX12_RESET 11 -#define AX12_CONFIG 12 - -#define AX12_VALUE8 0x00 -#define AX12_VALUE16 0x01 +#define AX12_READ8 2 +#define AX12_READ16 3 +#define AX12_WRITE8 4 +#define AX12_WRITE16 5 +#define AX12_GOTO 6 +#define AX12_GET_POS 7 +#define AX12_GET_SPEED 8 +#define AX12_GET_LOAD 9 +#define AX12_GET_STATS 10 +#define AX12_WRITE_REG8 11 +#define AX12_WRITE_REG16 12 +#define AX12_ACTION 13 +#define AX12_RESET 14 +#define AX12_CONFIG 15 #define AX12_EXEC_NOW 0x00 #define AX12_EXEC_ACTION 0x01 diff --git a/USB_Module/Proximity_Sensor/Firmware/PcInterface.h b/USB_Module/Proximity_Sensor/Firmware/PcInterface.h index a24b00c..d681bb5 100644 --- a/USB_Module/Proximity_Sensor/Firmware/PcInterface.h +++ b/USB_Module/Proximity_Sensor/Firmware/PcInterface.h @@ -125,20 +125,20 @@ typedef struct _UP { // CMD_AX12 #define AX12_PING 1 -#define AX12_READ 2 -#define AX12_WRITE 3 -#define AX12_GOTO 4 -#define AX12_GET_POS 5 -#define AX12_GET_SPEED 6 -#define AX12_GET_LOAD 7 -#define AX12_GET_STATS 8 -#define AX12_WRITE_REG 9 -#define AX12_ACTION 10 -#define AX12_RESET 11 -#define AX12_CONFIG 12 - -#define AX12_VALUE8 0x00 -#define AX12_VALUE16 0x01 +#define AX12_READ8 2 +#define AX12_READ16 3 +#define AX12_WRITE8 4 +#define AX12_WRITE16 5 +#define AX12_GOTO 6 +#define AX12_GET_POS 7 +#define AX12_GET_SPEED 8 +#define AX12_GET_LOAD 9 +#define AX12_GET_STATS 10 +#define AX12_WRITE_REG8 11 +#define AX12_WRITE_REG16 12 +#define AX12_ACTION 13 +#define AX12_RESET 14 +#define AX12_CONFIG 15 #define AX12_EXEC_NOW 0x00 #define AX12_EXEC_ACTION 0x01 diff --git a/USB_Module/Robot_Interface/Firmware/PcInterface.h b/USB_Module/Robot_Interface/Firmware/PcInterface.h index a24b00c..d681bb5 100644 --- a/USB_Module/Robot_Interface/Firmware/PcInterface.h +++ b/USB_Module/Robot_Interface/Firmware/PcInterface.h @@ -125,20 +125,20 @@ typedef struct _UP { // CMD_AX12 #define AX12_PING 1 -#define AX12_READ 2 -#define AX12_WRITE 3 -#define AX12_GOTO 4 -#define AX12_GET_POS 5 -#define AX12_GET_SPEED 6 -#define AX12_GET_LOAD 7 -#define AX12_GET_STATS 8 -#define AX12_WRITE_REG 9 -#define AX12_ACTION 10 -#define AX12_RESET 11 -#define AX12_CONFIG 12 - -#define AX12_VALUE8 0x00 -#define AX12_VALUE16 0x01 +#define AX12_READ8 2 +#define AX12_READ16 3 +#define AX12_WRITE8 4 +#define AX12_WRITE16 5 +#define AX12_GOTO 6 +#define AX12_GET_POS 7 +#define AX12_GET_SPEED 8 +#define AX12_GET_LOAD 9 +#define AX12_GET_STATS 10 +#define AX12_WRITE_REG8 11 +#define AX12_WRITE_REG16 12 +#define AX12_ACTION 13 +#define AX12_RESET 14 +#define AX12_CONFIG 15 #define AX12_EXEC_NOW 0x00 #define AX12_EXEC_ACTION 0x01 hooks/post-receive -- krobot |
From: Jérémie D. <Ba...@us...> - 2010-03-27 00:37:08
|
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 9ae8e3247695968ddd35f81e1296c609669ead2f (commit) from 18c7915f2a9ef5e87d54d6403c22c59fbb032fa6 (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 9ae8e3247695968ddd35f81e1296c609669ead2f Author: Jérémie Dimino <je...@di...> Date: Sat Mar 27 01:36:48 2010 +0100 fix Makefile ----------------------------------------------------------------------- Changes: diff --git a/PC_Mainboard/Makefile b/PC_Mainboard/Makefile index 026a6a4..079e436 100644 --- a/PC_Mainboard/Makefile +++ b/PC_Mainboard/Makefile @@ -35,11 +35,11 @@ install: install -m 0755 _build/card_tools/send_firmware.best $(PREFIX)/bin/krobot-send-firmware install -m 0755 _build/card_tools/dump_memory.best $(PREFIX)/bin/krobot-dump-memory install -m 0755 _build/tools/forward_dbus.best $(PREFIX)/bin/krobot-forward-dbus - install -m 0755 _build/clients/info.best $(PREFIX)/bin/krobot-info - install -m 0755 _build/clients/joy_control.best $(PREFIX)/bin/krobot-joystick - install -m 0755 _build/clients/controller.best $(PREFIX)/bin/krobot-controller + install -m 0755 _build/clients/krobot_info.best $(PREFIX)/bin/krobot-info + install -m 0755 _build/clients/krobot_joy_control.best $(PREFIX)/bin/krobot-joystick + install -m 0755 _build/clients/krobot_controller.best $(PREFIX)/bin/krobot-controller install -m 0755 _build/services/hard_stop.best $(PREFIX)/bin/krobot-hard-stop - install -m 0755 _build/driver/driver.best $(PREFIX)/bin/krobot-driver + install -m 0755 _build/driver/krobot_driver.best $(PREFIX)/bin/krobot-driver .PHONY: uninstall uninstall: hooks/post-receive -- krobot |
From: Jérémie D. <Ba...@us...> - 2010-03-27 00:17:13
|
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 18c7915f2a9ef5e87d54d6403c22c59fbb032fa6 (commit) from 88fdac751bdee68f38724e833e8091651cec68d6 (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 18c7915f2a9ef5e87d54d6403c22c59fbb032fa6 Author: Jérémie Dimino <je...@di...> Date: Sat Mar 27 01:16:49 2010 +0100 Add Gen_print ----------------------------------------------------------------------- Changes: diff --git a/PC_Mainboard/generators/gen_print.ml b/PC_Mainboard/generators/gen_print.ml new file mode 100644 index 0000000..2fb2305 --- /dev/null +++ b/PC_Mainboard/generators/gen_print.ml @@ -0,0 +1,42 @@ +(* + * gen_print.ml + * ------------ + * Copyright : (c) 2010, Jeremie Dimino <je...@di...> + * Licence : BSD3 + * + * This file is a part of [kro]bot. + *) + +type template = string + +exception Unbound + +let print ?env template = + match env with + | None -> + print_string template; + print_char '\n' + | Some env -> + let buf = Buffer.create 42 in + let env name = + try + List.assoc name env + with Not_found -> + Printf.ksprintf failwith "Gen_print.print: unbound variable %S" name + in + let eval expr = + try + let i = String.index expr ':' in + let command = String.sub expr 0 i + and var = String.sub expr (i + 1) (String.length expr - (i + 1)) in + match command with + | "lid" -> Gen.lid (env var) + | "uid" -> Gen.uid (env var) + | "caml-case" -> Gen.caml_case (env var) + | _ -> Printf.ksprintf failwith "Gen_print.print: unknown command %S" command + with Not_found -> + env expr + in + Buffer.add_substitute buf eval template; + Buffer.add_char buf '\n'; + Buffer.output_buffer stdout buf diff --git a/PC_Mainboard/generators/gen_print.mli b/PC_Mainboard/generators/gen_print.mli new file mode 100644 index 0000000..684a60d --- /dev/null +++ b/PC_Mainboard/generators/gen_print.mli @@ -0,0 +1,23 @@ +(* + * gen_print.mli + * ------------- + * Copyright : (c) 2010, Jeremie Dimino <je...@di...> + * Licence : BSD3 + * + * This file is a part of [kro]bot. + *) + +(** Helpers for printing code *) + +type template = string + (** A string nthat may contains variables of the form: + + - [$(var)] + - [$(uid:var)] + - [$(lid:var)] + - [$(caml-case:var)] + *) + +val print : ?env : (string * string) list -> template -> unit + (** [print ?env template] prints the instantiation of [template] + using [env] on stdout *) hooks/post-receive -- krobot |
From: Jérémie D. <Ba...@us...> - 2010-03-27 00:08:15
|
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 88fdac751bdee68f38724e833e8091651cec68d6 (commit) from f46b6a4fb008c1e1abd85d728f02cd2c6dfe0deb (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 88fdac751bdee68f38724e833e8091651cec68d6 Author: Jérémie Dimino <je...@di...> Date: Sat Mar 27 01:07:25 2010 +0100 refactoring ----------------------------------------------------------------------- Changes: diff --git a/PC_Mainboard/_tags b/PC_Mainboard/_tags index 0d628c0..6eaf178 100644 --- a/PC_Mainboard/_tags +++ b/PC_Mainboard/_tags @@ -23,9 +23,9 @@ <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*>: pkg_text +<clients/krobot_joy_control.*>: pkg_sdl +<clients/krobot_controller.*>: pkg_lwt.text +<clients/krobot_script*>: pkg_text # +------------------------------------------------------------------+ # | Services | @@ -38,8 +38,8 @@ # | Common | # +------------------------------------------------------------------+ -<common/{krobot_types,util}.{ml,mli}>: syntax_camlp4o, pkg_obus.syntax, pkg_lwt.syntax -<common/{krobot_types,util}.*>: pkg_obus +<common/krobot_{types,util}.{ml,mli}>: syntax_camlp4o, pkg_obus.syntax, pkg_lwt.syntax +<common/krobot_{types,util}.*>: pkg_obus # +------------------------------------------------------------------+ # | Driver | diff --git a/PC_Mainboard/clients/controller.ml b/PC_Mainboard/clients/controller.ml deleted file mode 100644 index bd8bba0..0000000 --- a/PC_Mainboard/clients/controller.ml +++ /dev/null @@ -1,447 +0,0 @@ -(* - * controller.ml - * ------------- - * Copyright : (c) 2010, Jeremie Dimino <je...@di...> - * Licence : BSD3 - * - * This file is a part of [kro]bot. - *) - -(* Prints status continuously *) - -open Lwt -open Lwt_term -open Lwt_read_line - -module TextSet = Set.Make(Text) - -(* Maximum number of refresh by seconds: *) -let refresh_rate = 10 - -(* +-----------------------------------------------------------------+ - | Logging | - +-----------------------------------------------------------------+ *) - -(* Maximum number of lines to keep in logs: *) -let log_count = 16384 - -(* Signal holding the current logs: *) -let logs, set_logs = React.S.create [] - -let add_date line = - let buffer = Buffer.create 42 in - Lwt_log.render ~buffer ~level:Lwt_log.Info ~message:"" ~template:"$(date): " ~section:Lwt_log.Section.main; - text (Buffer.contents buffer) :: line - -(* Add a list of lines to logs *) -let log_add_lines lines = - let rec truncate n = function - | [] -> - [] - | line :: rest -> - if n = log_count then - [] - else - line :: truncate (n + 1) rest - in - set_logs (truncate 0 (List.rev_map add_date lines @ (React.S.value logs))) - -let log_add_line line = - log_add_lines [line] - -(* Redirect stderr to logs *) -let redirect_stderr () = - let rec copy_logs ic = - lwt line = Lwt_io.read_line ic in - log_add_line [text line]; - copy_logs ic - in - let fdr, fdw = Unix.pipe () in - Unix.dup2 fdw Unix.stderr; - Unix.close fdw; - ignore (copy_logs (Lwt_io.of_unix_fd ~mode:Lwt_io.input fdr)) - -(* Make the default logger to logs into the log buffer *) -let init_logger () = - Lwt_log.default := - Lwt_log.make - ~output:(fun section level lines -> - log_add_lines - (List.map - (fun line -> - if level >= Lwt_log.Warning then - (* Colorize error in red: *) - [fg lred; text line] - else - [text line]) - lines); - return ()) - ~close:return - -(* +-----------------------------------------------------------------+ - | Read-line | - +-----------------------------------------------------------------+ *) - -let engine_state, set_engine_state = React.S.create (Engine.init []) -let box, set_box = React.S.create Terminal.Box_empty - -let () = - Lwt_signal.always_notify - (function - | Engine.Edition(before, after) -> - let comp = Script.complete before after in - set_box (Terminal.Box_words(comp.comp_words, 0)) - | Engine.Selection _ -> - set_box (Terminal.Box_message "<selection>") - | Engine.Search _ -> - set_box (Terminal.Box_message "<backward search>")) - (React.S.map (fun state -> state.Engine.mode) engine_state) - -let history_file_name = - Filename.concat (try Unix.getenv "HOME" with _ -> "") ".krobot-controller-history" - -let save_history history = - Lwt_read_line.save_history history_file_name history - -let rec loop krobot history = - lwt key = read_key () in - if key = key_escape then - save_history history - else - match Command.of_key key with - | Command.Accept_line -> - let line = Text.strip (Engine.all_input (React.S.value engine_state)) in - if line = "exit" then - save_history history - else if line <> "" then begin - let history = Lwt_read_line.add_entry line history in - set_engine_state (Engine.init history); - lwt () = Lwt_log.notice line in - ignore (Script.exec ~krobot ~logger:(fun line -> log_add_line line; return ()) ~command:line); - loop krobot history - end else - loop krobot history - | Command.Complete -> - let engine_state = Engine.reset (React.S.value engine_state) in - let before, after = Engine.edition_state engine_state in - let comp = Script.complete before after in - set_engine_state { engine_state with Engine.mode = Engine.Edition comp.comp_state }; - loop krobot history - | command -> - set_engine_state (Engine.update (React.S.value engine_state) command ()); - loop krobot history - -(* +-----------------------------------------------------------------+ - | Service monitoring | - +-----------------------------------------------------------------+ *) - -let services, set_services = React.S.create ~eq:TextSet.equal TextSet.empty - -let check_services bus = - lwt l = OBus_bus.list_names bus in - set_services (List.fold_left (fun set name -> - if Text.starts_with name "fr.krobot." then - TextSet.add (String.sub name 10 (String.length name - 10)) set - else - set) TextSet.empty l); - return () - -(* +-----------------------------------------------------------------+ - | Drawing | - +-----------------------------------------------------------------+ *) - -(* Thread currently redrawing the screen: *) -let renderer = ref (return ()) - -(* Draw the whole screen *) -let rec draw krobot = - let size = React.S.value Lwt_term.size in - - let screen = Zone.make ~width:size.columns ~height:size.lines in - let points = Zone.points screen in - - let line_color = lblue in - let line = { blank with style = { blank.style with foreground = line_color } } in - let name_color = lwhite in - - (* ===== Borders ===== *) - - for i = 1 to size.columns - 2 do - points.(0).(i) <- { line with char = "─" }; - points.(size.lines - 1).(i) <- { line with char = "─" } - done; - for i = 1 to size.lines - 2 do - points.(i).(0) <- { line with char = "│" }; - points.(i).(size.columns - 1) <- { line with char = "│" } - done; - points.(0).(0) <- { line with char = "┌" }; - points.(size.lines - 1).(0) <- { line with char = "└" }; - points.(size.lines - 1).(size.columns - 1) <- { line with char = "┘" }; - points.(0).(size.columns - 1) <- { line with char = "┐" }; - - (* ===== Status ===== *) - - Draw.textc screen 1 0 [fg line_color; text "─[ "; - fg name_color; text "Range finders"; - fg line_color; text " ]─┬─[ "; - fg name_color; text "Logic Sensors"; - fg line_color; text " ]─┬─[ "; - fg name_color; text "Services"; - fg line_color; text " ]─┬─[ "; - fg name_color; text "Cards"; - fg line_color; text " ]─┬─[ "; - fg name_color; text "Status"; - fg line_color; text " ]─"]; - points.(9).(0) <- { line with char = "├" }; - points.(9).(size.columns - 1) <- { line with char = "┤" }; - for i = 1 to size.columns - 2 do - points.(9).(i) <- { line with char = "─" } - done; - for i = 1 to 8 do - points.(i).(20) <- { line with char = "│" }; - points.(i).(40) <- { line with char = "│" }; - points.(i).(55) <- { line with char = "│" }; - points.(i).(67) <- { line with char = "│" } - done; - Draw.textc screen 1 9 [fg line_color; text "───────────────────┴───────────────────┴──────────────┴───────────┴"]; - - let zone = Zone.inner screen in - - let range_finders = React.S.value (Krobot.range_finders krobot) in - for i = 0 to Array.length range_finders - 1 do - Draw.textc zone 0 i [textf "%d : " i; text (Text.repeat (range_finders.(i) * 14 / 3146) "=")] - done; - - let logic_sensors = React.S.value (Krobot.logic_sensors krobot) in - for i = 0 to Array.length logic_sensors / 2 - 1 do - let j = i * 2 in - Draw.textf zone 20 i "%02d : %s %02d : %s" - (j + 0) (if logic_sensors.(j + 0) then "O" else ".") - (j + 1) (if logic_sensors.(j + 1) then "O" else ".") - done; - - let zone' = Zone.sub ~zone ~x:40 ~y:0 ~width:14 ~height:8 in - let rec loop y = function - | [] -> - () - | name :: rest -> - Draw.text ~zone:zone' ~x:0 ~y ~text:name; - loop (y + 1) rest - in - loop 0 (TextSet.elements (React.S.value services)); - - let x = 55 in - let text_of_state name = function - | `Absent -> [fg lred; text name] - | `Present -> [text name] - in - Draw.textc zone x 0 (text_of_state "interface" (React.S.value (Krobot.Card.state (krobot, `Interface)))); - Draw.textc zone x 1 (text_of_state "sensor" (React.S.value (Krobot.Card.state (krobot, `Sensor)))); - Draw.textc zone x 2 (text_of_state "motor" (React.S.value (Krobot.Card.state (krobot, `Motor)))); - Draw.textc zone x 3 (text_of_state "monitoring" (React.S.value (Krobot.Card.state (krobot, `Monitoring)))); - let x = x + 12 in - Draw.textf zone x 0 "team = %s" (match React.S.value (Krobot.team krobot) with - | Krobot.Team_red -> "red" - | Krobot.Team_green -> "green"); - Draw.textf zone x 1 "jack = %s" (if React.S.value (Krobot.jack krobot) then "present" else "absent"); - Draw.textf zone x 2 "compass = %d" (React.S.value (Krobot.compass krobot)); - let date = Unix.gettimeofday () in - let text_of_motor_state mode until = - if date < until then - [text mode; fg lyellow; text "inhibited"] - else - [text mode; text "OK"] - in - Draw.textc zone x 3 (text_of_motor_state "move forward: " (React.S.value (Krobot.inhibited_forward_until krobot))); - Draw.textc zone x 4 (text_of_motor_state "move backward: " (React.S.value (Krobot.inhibited_backward_until krobot))); - - (* ===== History ===== *) - - let zone = Zone.sub ~zone:screen ~x:1 ~y:10 ~width:(Zone.width screen - 2) ~height:(Zone.height screen - 15) in - let rec loop y = function - | [] -> - () - | line :: rest -> - if y < 0 then - () - else begin - Draw.textc zone 0 y line; - loop (y - 1) rest - end - in - loop (Zone.height zone - 1) (React.S.value logs); - - (* ===== Read-line ===== *) - - points.(size.lines - 3).(0) <- { line with char = "├" }; - points.(size.lines - 3).(size.columns - 1) <- { line with char = "┤" }; - points.(size.lines - 5).(0) <- { line with char = "├" }; - points.(size.lines - 5).(size.columns - 1) <- { line with char = "┤" }; - for i = 1 to size.columns - 2 do - points.(size.lines - 5).(i) <- { line with char = "─" }; - points.(size.lines - 3).(i) <- { line with char = "─" } - done; - - let zone = Zone.sub ~zone:screen ~x:1 ~y:(size.lines - 4) ~width:(size.columns - 2) ~height:1 in - let engine_state = React.S.value engine_state in - let cursor_position = - match engine_state.Engine.mode with - | Engine.Edition(before, after) -> - let len = Text.length before in - Draw.textc zone 0 0 [Text before; Text after]; - len - | Engine.Selection state -> - let a = min state.Engine.sel_cursor state.Engine.sel_mark - and b = max state.Engine.sel_cursor state.Engine.sel_mark in - let part_before = Text.chunk (Text.pointer_l state.Engine.sel_text) a - and part_selected = Text.chunk a b - and part_after = Text.chunk (Text.pointer_r state.Engine.sel_text) b in - Draw.textc zone 0 0 [Text part_before; Underlined; Text part_selected; Reset; Text part_after]; - if state.Engine.sel_cursor < state.Engine.sel_mark then - Text.length part_before - else - Text.length part_before + Text.length part_selected - | Engine.Search state -> - let len = Text.length state.Engine.search_word in - Draw.text zone 0 0 (Printf.sprintf "(reverse-i-search)'%s'" state.Engine.search_word); - begin match state.Engine.search_history with - | [] -> - 19 + len - | phrase :: _ -> - let ptr_start = match Text.find phrase state.Engine.search_word with - | Some ptr -> - ptr - | None -> - assert false - in - let ptr_end = Text.move len ptr_start in - let before = Text.chunk (Text.pointer_l phrase) ptr_start - and selected = Text.chunk ptr_start ptr_end - and after = Text.chunk ptr_end (Text.pointer_r phrase) in - Draw.textc zone (20 + len) 0 [ - Text ": "; - Text before; - Underlined; - Text selected; - Reset; - Text after; - ]; - 19 + len - end - in - Draw.map zone cursor_position 0 (fun point -> { point with style = { point.style with inverse = true } }); - - let zone = Zone.sub ~zone:screen ~x:1 ~y:(size.lines - 3) ~width:(size.columns - 2) ~height:3 in - begin - match React.S.value box with - | Terminal.Box_none | Terminal.Box_empty -> - () - | Terminal.Box_message msg -> - Draw.text zone 0 1 msg - | Terminal.Box_words(words, _) -> - ignore (TextSet.fold - (fun word i -> - let len = Text.length word in - Draw.text zone i 1 word; - let i = i + len in - Draw.textc zone i 0 [fg line_color; text "┬"]; - Draw.textc zone i 1 [fg line_color; text "│"]; - Draw.textc zone i 2 [fg line_color; text "┴"]; - i + 1) - words 0) - end; - - Lwt.cancel !renderer; - renderer := Lwt_term.render (Zone.points screen) - -(* Wether the screen need to be refreshed *) -let refresh_needed = ref false - -(* Program a refresh before the next main loop iteration *) -let refresh krobot = - if !refresh_needed then - return () - else begin - refresh_needed := true; - lwt () = Lwt.pause () in - refresh_needed := false; - draw krobot; - return () - end - -(* +-----------------------------------------------------------------+ - | Entry point | - +-----------------------------------------------------------------+ *) - -lwt () = - lwt () = Lwt_log.notice "connecting to the krobot bus..." in - lwt bus = Lazy.force Krobot.bus in - lwt krobot = Krobot.create () in - - (* Put the terminal into drawing mode: *) - lwt () = Lwt_term.enter_drawing_mode () in - lwt () = Lwt_term.hide_cursor () in - - init_logger (); - redirect_stderr (); - - (* Dump all logs to stdout on abnormal exit: *) - let node = - Lwt_sequence.add_l - (fun () -> - lwt () = Lwt_term.leave_drawing_mode () in - Lwt_list.iter_s printlc (List.rev (React.S.value logs))) - Lwt_main.exit_hooks - in - - (* Service monitoring *) - lwt () = check_services bus in - Lwt_event.always_notify_p (fun _ -> check_services bus) (OBus_bus.name_owner_changed bus)#event; - - (* Minimum delay to wait between two screen redrawing *) - let delay = 1.0 /. (float_of_int refresh_rate) in - (* Event which refresh the screen when it occurs: *) - let event, push = React.E.create () in - Lwt_event.always_notify_p - (fun () -> refresh krobot) - (* Limit the number of redraw per seconds: *) - (Lwt_event.limit (fun () -> Lwt_unix.sleep delay) event); - (* Ask for a refresh when [signal] changes: *) - let notify signal = Lwt_signal.always_notify (fun _ -> push ()) signal in - notify box; - notify logs; - notify (Krobot.compass krobot); - notify (Krobot.logic_sensors krobot); - notify (Krobot.range_finders krobot); - notify (Krobot.team krobot); - notify (Krobot.jack krobot); - notify (Krobot.inhibited_forward_until krobot); - notify (Krobot.inhibited_backward_until krobot); - notify (Krobot.Card.state (krobot, `Interface)); - notify (Krobot.Card.state (krobot, `Sensor)); - notify (Krobot.Card.state (krobot, `Motor)); - notify services; - - List.iter - (fun card -> - Lwt_event.always_notify - (fun error -> log_add_line [fg lred; textf "error on card %s: %s" (Krobot.Card.name card) error]) - (Krobot.Card.errors (krobot, card))) - [`Interface; `Sensor; `Motor; `Monitoring]; - - (* Redraw immedlatly the screen when [signal] changes: *) - let urgent signal = Lwt_signal.always_notify_p (fun _ -> refresh krobot) signal in - urgent Lwt_term.size; - urgent engine_state; - - lwt history = Lwt_read_line.load_history history_file_name in - set_engine_state (Engine.init history); - - (* User input loop *) - lwt () = Lwt_term.with_raw_mode (fun () -> loop krobot history) in - - (* Normal exit, do not dump logs on stdout: *) - Lwt_sequence.remove node; - - (* Leave drawing mode *) - Lwt_term.leave_drawing_mode () diff --git a/PC_Mainboard/clients/info.ml b/PC_Mainboard/clients/info.ml deleted file mode 100644 index f2e8501..0000000 --- a/PC_Mainboard/clients/info.ml +++ /dev/null @@ -1,36 +0,0 @@ -(* - * info.ml - * ------- - * Copyright : (c) 2010, Jeremie Dimino <je...@di...> - * Licence : BSD3 - * - * This file is a part of [kro]bot. - *) - -(* Print cards informations *) - -open Lwt -open Lwt_io - -let print_card krobot card = - match React.S.value (Krobot.Card.state (krobot, card)) with - | `Present -> - lwt firmware_build = Krobot.Card.get_firmware_build (krobot, card) - and board_info = Krobot.Card.get_board_info (krobot, card) in - let name = Krobot.Card.name card in - lwt () = printl "==========" in - lwt () = printlf "card.%s.state = present" name in - lwt () = printlf "card.%s.firmware_build = %s" name firmware_build in - lwt () = printlf "card.%s.board_info = %s" name board_info in - return () - | `Absent -> - lwt () = printl "==========" in - printlf "card.%s.state = absent" (Krobot.Card.name card) - -lwt () = - lwt krobot = Krobot.create () in - lwt () = print_card krobot `Interface in - lwt () = print_card krobot `Sensor in - lwt () = print_card krobot `Motor in - lwt () = print_card krobot `Monitoring in - return () diff --git a/PC_Mainboard/clients/init_position.ml b/PC_Mainboard/clients/init_position.ml deleted file mode 100644 index 85a69bd..0000000 --- a/PC_Mainboard/clients/init_position.ml +++ /dev/null @@ -1,41 +0,0 @@ -(* - * init_position.ml - * ---------------- - * Copyright : (c) 2010, Jeremie Dimino <je...@di...> - * Licence : BSD3 - * - * This file is a part of [kro]bot. - *) - -(* Put the robot into its initial state *) - -open Lwt - -let move_backward_slowly krobot = - lwt () = Lwt_log.notice "moving backward" in - Krobot.move krobot ~distance:(-1000) ~velocity:100 ~acceleration:100 >>= function - | `OK -> - lwt () = Lwt_log.error "where am i ???" in - exit 1 - | `Stopped -> - Lwt_log.notice "backward colisiton dectected" - -lwt () = - lwt krobot = Krobot.create () in - - lwt () = move_backward_slowly krobot in - - lwt () = Lwt_log.notice "going to initial position on first axis" in - lwt _ = Krobot.move krobot ~distance:Krobot_config.initial_position ~velocity:400 ~acceleration:800 in - - lwt () = Lwt_log.notice "turning" in - lwt _ = Krobot.turn krobot ~angle:(-90) ~velocity:400 ~acceleration:800 in - - lwt () = move_backward_slowly krobot in - - lwt () = Lwt_log.notice "going to initial position on second axis" in - lwt _ = Krobot.move krobot ~distance:Krobot_config.initial_position ~velocity:400 ~acceleration:800 in - - lwt () = Lwt_log.notice "turning" in - lwt _ = Krobot.turn krobot ~angle:45 ~velocity:400 ~acceleration:800 in - return () diff --git a/PC_Mainboard/clients/joy_control.ml b/PC_Mainboard/clients/joy_control.ml deleted file mode 100644 index 2247147..0000000 --- a/PC_Mainboard/clients/joy_control.ml +++ /dev/null @@ -1,226 +0,0 @@ -(* - * joy_control.ml - * -------------- - * Copyright : (c) 2010, Jeremie Dimino <je...@di...> - * Licence : BSD3 - * - * This file is a part of [kro]bot. - *) - -(* Control the robot with a joystick *) - -open Lwt -open Sdljoystick -open Sdlevent -open Sdlkey - -(* +-----------------------------------------------------------------+ - | Joystick events | - +-----------------------------------------------------------------+ *) - -type button = - | ButtonCross - | ButtonSquare - | ButtonTriangle - | ButtonCircle - | ButtonDown - | ButtonLeft - | ButtonUp - | ButtonRight - | ButtonSelect - | ButtonStart - | ButtonR1 - | ButtonR2 - | ButtonL1 - | ButtonL2 - | ButtonPS3 - | ButtonLAxis - | ButtonRAxis - -type event = - | JoyRAxisV of int - | JoyLAxisV of int - | JoyRAxisH of int - | JoyLAxisH of int - | JoyButtonPressed of button - | JoyButtonReleased of button - | KeyPressed of Sdlkey.t - | KeyReleased of Sdlkey.t - -(* +-----------------------------------------------------------------+ - | int --> button | - +-----------------------------------------------------------------+ *) - -let raxis_v = 3 -let raxis_h = 2 -let laxis_v = 1 -let laxis_h = 0 - -let axis_min = -32768 -let axis_max = 32767 - -let button_of_num = function - | 14 -> ButtonCross - | 15 -> ButtonSquare - | 12 -> ButtonTriangle - | 13 -> ButtonCircle - | 6 -> ButtonDown - | 7 -> ButtonLeft - | 4 -> ButtonUp - | 5 -> ButtonRight - | 0 -> ButtonSelect - | 3 -> ButtonStart - | 11 -> ButtonR1 - | 9 -> ButtonR2 - | 10 -> ButtonL1 - | 8 -> ButtonL2 - | 16 -> ButtonPS3 - | 1 -> ButtonLAxis - | 2 -> ButtonRAxis - | n -> Printf.ksprintf failwith "unknown button %d" n - -(* +-----------------------------------------------------------------+ - | SDL events (executed in a child process) | - +-----------------------------------------------------------------+ *) - -let child_loop pipe joy = - let axis_state = Array.init (num_axes joy) (get_axis joy) in - let send ev = - Pervasives.output_value pipe ev; - Pervasives.flush pipe - in - while true do - match wait_event () with - | KEYDOWN { keysym = key } -> - send (KeyPressed key); - if key = KEY_ESCAPE then begin - Sdl.quit (); - exit 0 - end - | JOYAXISMOTION { jae_axis = axis; jae_value = value } -> - let value = 100 - ((value - axis_min) * 200 / (axis_max - axis_min)) in - if value <> axis_state.(axis) then begin - axis_state.(axis) <- value; - if axis = laxis_h then - send (JoyLAxisH value) - else if axis = laxis_v then - send (JoyLAxisV value) - else if axis = raxis_h then - send (JoyRAxisH value) - else if axis = raxis_v then - send (JoyRAxisV value) - else - () - end - | JOYBUTTONUP { jbe_button = button } -> - send (JoyButtonPressed(button_of_num button)) - | JOYBUTTONDOWN { jbe_button = button } -> - send (JoyButtonReleased(button_of_num button)) - | _ -> - () - done - -(* +-----------------------------------------------------------------+ - | Handling events (in the parent process) | - +-----------------------------------------------------------------+ *) - -let axis_coef = 6 -let axis_coef_turn = 4 -let accelerations = (800, 800) -let duration = 0.2 - -let try_call action f = - try_lwt - f () - with Failure msg -> - lwt () = Lwt_log.error_f "action %s failed with: %s" action msg in - return () - -let rec set_velocities krobot velocities = - lwt () = Lwt_log.info_f "set-velocities: left=%d right=%d" (fst velocities) (snd velocities) in - lwt () = - try_call "set-velocities" - (fun () -> - Krobot.set_velocities krobot ~velocities ~accelerations ~duration) - in - if velocities = (0, 0) then - return () - else begin - lwt () = Lwt_unix.sleep (duration /. 2.) in - set_velocities krobot velocities - end - -let parent_loop krobot pipe = - let stop = ref false in - let thread = ref (return ()) in - let raxis_h = ref 0 - and raxis_v = ref 0 - and laxis_h = ref 0 - and laxis_v = ref 0 in - let set_velocities () = - cancel !thread; - if not !stop then - thread := - set_velocities krobot - (!laxis_v * axis_coef - !raxis_h * axis_coef_turn, - !laxis_v * axis_coef + !raxis_h * axis_coef_turn) - in - let rec loop () = - Lwt_io.read_value pipe >>= function - | KeyPressed KEY_ESCAPE -> - return () - | JoyLAxisV n -> - laxis_v := n; - set_velocities (); - loop () - | JoyLAxisH n -> - laxis_h := n; - set_velocities (); - loop () - | JoyRAxisV n -> - raxis_v := n; - set_velocities (); - loop () - | JoyRAxisH n -> - raxis_h := n; - set_velocities (); - loop () - | JoyButtonPressed ButtonSquare -> - stop := true; - cancel !thread; - lwt () = try_call "stop-motors" (fun () -> Krobot.stop_motors krobot ~mode:`Abrupt) in - loop () - | JoyButtonReleased ButtonSquare -> - stop := false; - loop () - | _ -> - loop () - in - loop () - -(* +-----------------------------------------------------------------+ - | Entry-point | - +-----------------------------------------------------------------+ *) - -let () = - let fd_r, fd_w = Unix.pipe () in - match Unix.fork () with - | 0 -> - Unix.close fd_r; - Sdl.init [`JOYSTICK;`VIDEO]; - Sdljoystick.set_event_state true; - let joy = - try - open_joystick 0 - with exn -> - Printf.eprintf "cannot open joystick: %s\n%!" (Printexc.to_string exn); - raise exn - in - child_loop (Unix.out_channel_of_descr fd_w) joy - | pid -> - Unix.close fd_w; - Lwt_main.run begin - lwt krobot = Krobot.create () in - lwt () = Lwt_log.notice "ready to process event" in - parent_loop krobot (Lwt_io.of_unix_fd ~mode:Lwt_io.input fd_r) - end diff --git a/PC_Mainboard/clients/krobot_controller.ml b/PC_Mainboard/clients/krobot_controller.ml new file mode 100644 index 0000000..f40fcf8 --- /dev/null +++ b/PC_Mainboard/clients/krobot_controller.ml @@ -0,0 +1,447 @@ +(* + * krobot_controller.ml + * -------------------- + * Copyright : (c) 2010, Jeremie Dimino <je...@di...> + * Licence : BSD3 + * + * This file is a part of [kro]bot. + *) + +(* Prints status continuously *) + +open Lwt +open Lwt_term +open Lwt_read_line + +module TextSet = Set.Make(Text) + +(* Maximum number of refresh by seconds: *) +let refresh_rate = 10 + +(* +-----------------------------------------------------------------+ + | Logging | + +-----------------------------------------------------------------+ *) + +(* Maximum number of lines to keep in logs: *) +let log_count = 16384 + +(* Signal holding the current logs: *) +let logs, set_logs = React.S.create [] + +let add_date line = + let buffer = Buffer.create 42 in + Lwt_log.render ~buffer ~level:Lwt_log.Info ~message:"" ~template:"$(date): " ~section:Lwt_log.Section.main; + text (Buffer.contents buffer) :: line + +(* Add a list of lines to logs *) +let log_add_lines lines = + let rec truncate n = function + | [] -> + [] + | line :: rest -> + if n = log_count then + [] + else + line :: truncate (n + 1) rest + in + set_logs (truncate 0 (List.rev_map add_date lines @ (React.S.value logs))) + +let log_add_line line = + log_add_lines [line] + +(* Redirect stderr to logs *) +let redirect_stderr () = + let rec copy_logs ic = + lwt line = Lwt_io.read_line ic in + log_add_line [text line]; + copy_logs ic + in + let fdr, fdw = Unix.pipe () in + Unix.dup2 fdw Unix.stderr; + Unix.close fdw; + ignore (copy_logs (Lwt_io.of_unix_fd ~mode:Lwt_io.input fdr)) + +(* Make the default logger to logs into the log buffer *) +let init_logger () = + Lwt_log.default := + Lwt_log.make + ~output:(fun section level lines -> + log_add_lines + (List.map + (fun line -> + if level >= Lwt_log.Warning then + (* Colorize error in red: *) + [fg lred; text line] + else + [text line]) + lines); + return ()) + ~close:return + +(* +-----------------------------------------------------------------+ + | Read-line | + +-----------------------------------------------------------------+ *) + +let engine_state, set_engine_state = React.S.create (Engine.init []) +let box, set_box = React.S.create Terminal.Box_empty + +let () = + Lwt_signal.always_notify + (function + | Engine.Edition(before, after) -> + let comp = Krobot_script.complete before after in + set_box (Terminal.Box_words(comp.comp_words, 0)) + | Engine.Selection _ -> + set_box (Terminal.Box_message "<selection>") + | Engine.Search _ -> + set_box (Terminal.Box_message "<backward search>")) + (React.S.map (fun state -> state.Engine.mode) engine_state) + +let history_file_name = + Filename.concat (try Unix.getenv "HOME" with _ -> "") ".krobot-controller-history" + +let save_history history = + Lwt_read_line.save_history history_file_name history + +let rec loop krobot history = + lwt key = read_key () in + if key = key_escape then + save_history history + else + match Command.of_key key with + | Command.Accept_line -> + let line = Text.strip (Engine.all_input (React.S.value engine_state)) in + if line = "exit" then + save_history history + else if line <> "" then begin + let history = Lwt_read_line.add_entry line history in + set_engine_state (Engine.init history); + lwt () = Lwt_log.notice line in + ignore (Krobot_script.exec ~krobot ~logger:(fun line -> log_add_line line; return ()) ~command:line); + loop krobot history + end else + loop krobot history + | Command.Complete -> + let engine_state = Engine.reset (React.S.value engine_state) in + let before, after = Engine.edition_state engine_state in + let comp = Krobot_script.complete before after in + set_engine_state { engine_state with Engine.mode = Engine.Edition comp.comp_state }; + loop krobot history + | command -> + set_engine_state (Engine.update (React.S.value engine_state) command ()); + loop krobot history + +(* +-----------------------------------------------------------------+ + | Service monitoring | + +-----------------------------------------------------------------+ *) + +let services, set_services = React.S.create ~eq:TextSet.equal TextSet.empty + +let check_services bus = + lwt l = OBus_bus.list_names bus in + set_services (List.fold_left (fun set name -> + if Text.starts_with name "fr.krobot." then + TextSet.add (String.sub name 10 (String.length name - 10)) set + else + set) TextSet.empty l); + return () + +(* +-----------------------------------------------------------------+ + | Drawing | + +-----------------------------------------------------------------+ *) + +(* Thread currently redrawing the screen: *) +let renderer = ref (return ()) + +(* Draw the whole screen *) +let rec draw krobot = + let size = React.S.value Lwt_term.size in + + let screen = Zone.make ~width:size.columns ~height:size.lines in + let points = Zone.points screen in + + let line_color = lblue in + let line = { blank with style = { blank.style with foreground = line_color } } in + let name_color = lwhite in + + (* ===== Borders ===== *) + + for i = 1 to size.columns - 2 do + points.(0).(i) <- { line with char = "─" }; + points.(size.lines - 1).(i) <- { line with char = "─" } + done; + for i = 1 to size.lines - 2 do + points.(i).(0) <- { line with char = "│" }; + points.(i).(size.columns - 1) <- { line with char = "│" } + done; + points.(0).(0) <- { line with char = "┌" }; + points.(size.lines - 1).(0) <- { line with char = "└" }; + points.(size.lines - 1).(size.columns - 1) <- { line with char = "┘" }; + points.(0).(size.columns - 1) <- { line with char = "┐" }; + + (* ===== Status ===== *) + + Draw.textc screen 1 0 [fg line_color; text "─[ "; + fg name_color; text "Range finders"; + fg line_color; text " ]─┬─[ "; + fg name_color; text "Logic Sensors"; + fg line_color; text " ]─┬─[ "; + fg name_color; text "Services"; + fg line_color; text " ]─┬─[ "; + fg name_color; text "Cards"; + fg line_color; text " ]─┬─[ "; + fg name_color; text "Status"; + fg line_color; text " ]─"]; + points.(9).(0) <- { line with char = "├" }; + points.(9).(size.columns - 1) <- { line with char = "┤" }; + for i = 1 to size.columns - 2 do + points.(9).(i) <- { line with char = "─" } + done; + for i = 1 to 8 do + points.(i).(20) <- { line with char = "│" }; + points.(i).(40) <- { line with char = "│" }; + points.(i).(55) <- { line with char = "│" }; + points.(i).(67) <- { line with char = "│" } + done; + Draw.textc screen 1 9 [fg line_color; text "───────────────────┴───────────────────┴──────────────┴───────────┴"]; + + let zone = Zone.inner screen in + + let range_finders = React.S.value (Krobot.range_finders krobot) in + for i = 0 to Array.length range_finders - 1 do + Draw.textc zone 0 i [textf "%d : " i; text (Text.repeat (range_finders.(i) * 14 / 3146) "=")] + done; + + let logic_sensors = React.S.value (Krobot.logic_sensors krobot) in + for i = 0 to Array.length logic_sensors / 2 - 1 do + let j = i * 2 in + Draw.textf zone 20 i "%02d : %s %02d : %s" + (j + 0) (if logic_sensors.(j + 0) then "O" else ".") + (j + 1) (if logic_sensors.(j + 1) then "O" else ".") + done; + + let zone' = Zone.sub ~zone ~x:40 ~y:0 ~width:14 ~height:8 in + let rec loop y = function + | [] -> + () + | name :: rest -> + Draw.text ~zone:zone' ~x:0 ~y ~text:name; + loop (y + 1) rest + in + loop 0 (TextSet.elements (React.S.value services)); + + let x = 55 in + let text_of_state name = function + | `Absent -> [fg lred; text name] + | `Present -> [text name] + in + Draw.textc zone x 0 (text_of_state "interface" (React.S.value (Krobot.Card.state (krobot, `Interface)))); + Draw.textc zone x 1 (text_of_state "sensor" (React.S.value (Krobot.Card.state (krobot, `Sensor)))); + Draw.textc zone x 2 (text_of_state "motor" (React.S.value (Krobot.Card.state (krobot, `Motor)))); + Draw.textc zone x 3 (text_of_state "monitoring" (React.S.value (Krobot.Card.state (krobot, `Monitoring)))); + let x = x + 12 in + Draw.textf zone x 0 "team = %s" (match React.S.value (Krobot.team krobot) with + | Krobot.Team_red -> "red" + | Krobot.Team_green -> "green"); + Draw.textf zone x 1 "jack = %s" (if React.S.value (Krobot.jack krobot) then "present" else "absent"); + Draw.textf zone x 2 "compass = %d" (React.S.value (Krobot.compass krobot)); + let date = Unix.gettimeofday () in + let text_of_motor_state mode until = + if date < until then + [text mode; fg lyellow; text "inhibited"] + else + [text mode; text "OK"] + in + Draw.textc zone x 3 (text_of_motor_state "move forward: " (React.S.value (Krobot.inhibited_forward_until krobot))); + Draw.textc zone x 4 (text_of_motor_state "move backward: " (React.S.value (Krobot.inhibited_backward_until krobot))); + + (* ===== History ===== *) + + let zone = Zone.sub ~zone:screen ~x:1 ~y:10 ~width:(Zone.width screen - 2) ~height:(Zone.height screen - 15) in + let rec loop y = function + | [] -> + () + | line :: rest -> + if y < 0 then + () + else begin + Draw.textc zone 0 y line; + loop (y - 1) rest + end + in + loop (Zone.height zone - 1) (React.S.value logs); + + (* ===== Read-line ===== *) + + points.(size.lines - 3).(0) <- { line with char = "├" }; + points.(size.lines - 3).(size.columns - 1) <- { line with char = "┤" }; + points.(size.lines - 5).(0) <- { line with char = "├" }; + points.(size.lines - 5).(size.columns - 1) <- { line with char = "┤" }; + for i = 1 to size.columns - 2 do + points.(size.lines - 5).(i) <- { line with char = "─" }; + points.(size.lines - 3).(i) <- { line with char = "─" } + done; + + let zone = Zone.sub ~zone:screen ~x:1 ~y:(size.lines - 4) ~width:(size.columns - 2) ~height:1 in + let engine_state = React.S.value engine_state in + let cursor_position = + match engine_state.Engine.mode with + | Engine.Edition(before, after) -> + let len = Text.length before in + Draw.textc zone 0 0 [Text before; Text after]; + len + | Engine.Selection state -> + let a = min state.Engine.sel_cursor state.Engine.sel_mark + and b = max state.Engine.sel_cursor state.Engine.sel_mark in + let part_before = Text.chunk (Text.pointer_l state.Engine.sel_text) a + and part_selected = Text.chunk a b + and part_after = Text.chunk (Text.pointer_r state.Engine.sel_text) b in + Draw.textc zone 0 0 [Text part_before; Underlined; Text part_selected; Reset; Text part_after]; + if state.Engine.sel_cursor < state.Engine.sel_mark then + Text.length part_before + else + Text.length part_before + Text.length part_selected + | Engine.Search state -> + let len = Text.length state.Engine.search_word in + Draw.text zone 0 0 (Printf.sprintf "(reverse-i-search)'%s'" state.Engine.search_word); + begin match state.Engine.search_history with + | [] -> + 19 + len + | phrase :: _ -> + let ptr_start = match Text.find phrase state.Engine.search_word with + | Some ptr -> + ptr + | None -> + assert false + in + let ptr_end = Text.move len ptr_start in + let before = Text.chunk (Text.pointer_l phrase) ptr_start + and selected = Text.chunk ptr_start ptr_end + and after = Text.chunk ptr_end (Text.pointer_r phrase) in + Draw.textc zone (20 + len) 0 [ + Text ": "; + Text before; + Underlined; + Text selected; + Reset; + Text after; + ]; + 19 + len + end + in + Draw.map zone cursor_position 0 (fun point -> { point with style = { point.style with inverse = true } }); + + let zone = Zone.sub ~zone:screen ~x:1 ~y:(size.lines - 3) ~width:(size.columns - 2) ~height:3 in + begin + match React.S.value box with + | Terminal.Box_none | Terminal.Box_empty -> + () + | Terminal.Box_message msg -> + Draw.text zone 0 1 msg + | Terminal.Box_words(words, _) -> + ignore (TextSet.fold + (fun word i -> + let len = Text.length word in + Draw.text zone i 1 word; + let i = i + len in + Draw.textc zone i 0 [fg line_color; text "┬"]; + Draw.textc zone i 1 [fg line_color; text "│"]; + Draw.textc zone i 2 [fg line_color; text "┴"]; + i + 1) + words 0) + end; + + Lwt.cancel !renderer; + renderer := Lwt_term.render (Zone.points screen) + +(* Wether the screen need to be refreshed *) +let refresh_needed = ref false + +(* Program a refresh before the next main loop iteration *) +let refresh krobot = + if !refresh_needed then + return () + else begin + refresh_needed := true; + lwt () = Lwt.pause () in + refresh_needed := false; + draw krobot; + return () + end + +(* +-----------------------------------------------------------------+ + | Entry point | + +-----------------------------------------------------------------+ *) + +lwt () = + lwt () = Lwt_log.notice "connecting to the krobot bus..." in + lwt bus = Lazy.force Krobot.bus in + lwt krobot = Krobot.create () in + + (* Put the terminal into drawing mode: *) + lwt () = Lwt_term.enter_drawing_mode () in + lwt () = Lwt_term.hide_cursor () in + + init_logger (); + redirect_stderr (); + + (* Dump all logs to stdout on abnormal exit: *) + let node = + Lwt_sequence.add_l + (fun () -> + lwt () = Lwt_term.leave_drawing_mode () in + Lwt_list.iter_s printlc (List.rev (React.S.value logs))) + Lwt_main.exit_hooks + in + + (* Service monitoring *) + lwt () = check_services bus in + Lwt_event.always_notify_p (fun _ -> check_services bus) (OBus_bus.name_owner_changed bus)#event; + + (* Minimum delay to wait between two screen redrawing *) + let delay = 1.0 /. (float_of_int refresh_rate) in + (* Event which refresh the screen when it occurs: *) + let event, push = React.E.create () in + Lwt_event.always_notify_p + (fun () -> refresh krobot) + (* Limit the number of redraw per seconds: *) + (Lwt_event.limit (fun () -> Lwt_unix.sleep delay) event); + (* Ask for a refresh when [signal] changes: *) + let notify signal = Lwt_signal.always_notify (fun _ -> push ()) signal in + notify box; + notify logs; + notify (Krobot.compass krobot); + notify (Krobot.logic_sensors krobot); + notify (Krobot.range_finders krobot); + notify (Krobot.team krobot); + notify (Krobot.jack krobot); + notify (Krobot.inhibited_forward_until krobot); + notify (Krobot.inhibited_backward_until krobot); + notify (Krobot.Card.state (krobot, `Interface)); + notify (Krobot.Card.state (krobot, `Sensor)); + notify (Krobot.Card.state (krobot, `Motor)); + notify services; + + List.iter + (fun card -> + Lwt_event.always_notify + (fun error -> log_add_line [fg lred; textf "error on card %s: %s" (Krobot.Card.name card) error]) + (Krobot.Card.errors (krobot, card))) + [`Interface; `Sensor; `Motor; `Monitoring]; + + (* Redraw immedlatly the screen when [signal] changes: *) + let urgent signal = Lwt_signal.always_notify_p (fun _ -> refresh krobot) signal in + urgent Lwt_term.size; + urgent engine_state; + + lwt history = Lwt_read_line.load_history history_file_name in + set_engine_state (Engine.init history); + + (* User input loop *) + lwt () = Lwt_term.with_raw_mode (fun () -> loop krobot history) in + + (* Normal exit, do not dump logs on stdout: *) + Lwt_sequence.remove node; + + (* Leave drawing mode *) + Lwt_term.leave_drawing_mode () diff --git a/PC_Mainboard/clients/krobot_info.ml b/PC_Mainboard/clients/krobot_info.ml new file mode 100644 index 0000000..b0906dc --- /dev/null +++ b/PC_Mainboard/clients/krobot_info.ml @@ -0,0 +1,36 @@ +(* + * krobot_info.ml + * -------------- + * Copyright : (c) 2010, Jeremie Dimino <je...@di...> + * Licence : BSD3 + * + * This file is a part of [kro]bot. + *) + +(* Print cards informations *) + +open Lwt +open Lwt_io + +let print_card krobot card = + match React.S.value (Krobot.Card.state (krobot, card)) with + | `Present -> + lwt firmware_build = Krobot.Card.get_firmware_build (krobot, card) + and board_info = Krobot.Card.get_board_info (krobot, card) in + let name = Krobot.Card.name card in + lwt () = printl "==========" in + lwt () = printlf "card.%s.state = present" name in + lwt () = printlf "card.%s.firmware_build = %s" name firmware_build in + lwt () = printlf "card.%s.board_info = %s" name board_info in + return () + | `Absent -> + lwt () = printl "==========" in + printlf "card.%s.state = absent" (Krobot.Card.name card) + +lwt () = + lwt krobot = Krobot.create () in + lwt () = print_card krobot `Interface in + lwt () = print_card krobot `Sensor in + lwt () = print_card krobot `Motor in + lwt () = print_card krobot `Monitoring in + return () diff --git a/PC_Mainboard/clients/krobot_init_position.ml b/PC_Mainboard/clients/krobot_init_position.ml new file mode 100644 index 0000000..9343f77 --- /dev/null +++ b/PC_Mainboard/clients/krobot_init_position.ml @@ -0,0 +1,41 @@ +(* + * krobot_init_position.ml + * ----------------------- + * Copyright : (c) 2010, Jeremie Dimino <je...@di...> + * Licence : BSD3 + * + * This file is a part of [kro]bot. + *) + +(* Put the robot into its initial state *) + +open Lwt + +let move_backward_slowly krobot = + lwt () = Lwt_log.notice "moving backward" in + Krobot.move krobot ~distance:(-1000) ~velocity:100 ~acceleration:100 >>= function + | `OK -> + lwt () = Lwt_log.error "where am i ???" in + exit 1 + | `Stopped -> + Lwt_log.notice "backward colisiton dectected" + +lwt () = + lwt krobot = Krobot.create () in + + lwt () = move_backward_slowly krobot in + + lwt () = Lwt_log.notice "going to initial position on first axis" in + lwt _ = Krobot.move krobot ~distance:Krobot_config.initial_position ~velocity:400 ~acceleration:800 in + + lwt () = Lwt_log.notice "turning" in + lwt _ = Krobot.turn krobot ~angle:(-90) ~velocity:400 ~acceleration:800 in + + lwt () = move_backward_slowly krobot in + + lwt () = Lwt_log.notice "going to initial position on second axis" in + lwt _ = Krobot.move krobot ~distance:Krobot_config.initial_position ~velocity:400 ~acceleration:800 in + + lwt () = Lwt_log.notice "turning" in + lwt _ = Krobot.turn krobot ~angle:45 ~velocity:400 ~acceleration:800 in + return () diff --git a/PC_Mainboard/clients/krobot_joy_control.ml b/PC_Mainboard/clients/krobot_joy_control.ml new file mode 100644 index 0000000..cfdd224 --- /dev/null +++ b/PC_Mainboard/clients/krobot_joy_control.ml @@ -0,0 +1,226 @@ +(* + * krobot_joy_control.ml + * --------------------- + * Copyright : (c) 2010, Jeremie Dimino <je...@di...> + * Licence : BSD3 + * + * This file is a part of [kro]bot. + *) + +(* Control the robot with a joystick *) + +open Lwt +open Sdljoystick +open Sdlevent +open Sdlkey + +(* +-----------------------------------------------------------------+ + | Joystick events | + +-----------------------------------------------------------------+ *) + +type button = + | ButtonCross + | ButtonSquare + | ButtonTriangle + | ButtonCircle + | ButtonDown + | ButtonLeft + | ButtonUp + | ButtonRight + | ButtonSelect + | ButtonStart + | ButtonR1 + | ButtonR2 + | ButtonL1 + | ButtonL2 + | ButtonPS3 + | ButtonLAxis + | ButtonRAxis + +type event = + | JoyRAxisV of int + | JoyLAxisV of int + | JoyRAxisH of int + | JoyLAxisH of int + | JoyButtonPressed of button + | JoyButtonReleased of button + | KeyPressed of Sdlkey.t + | KeyReleased of Sdlkey.t + +(* +-----------------------------------------------------------------+ + | int --> button | + +-----------------------------------------------------------------+ *) + +let raxis_v = 3 +let raxis_h = 2 +let laxis_v = 1 +let laxis_h = 0 + +let axis_min = -32768 +let axis_max = 32767 + +let button_of_num = function + | 14 -> ButtonCross + | 15 -> ButtonSquare + | 12 -> ButtonTriangle + | 13 -> ButtonCircle + | 6 -> ButtonDown + | 7 -> ButtonLeft + | 4 -> ButtonUp + | 5 -> ButtonRight + | 0 -> ButtonSelect + | 3 -> ButtonStart + | 11 -> ButtonR1 + | 9 -> ButtonR2 + | 10 -> ButtonL1 + | 8 -> ButtonL2 + | 16 -> ButtonPS3 + | 1 -> ButtonLAxis + | 2 -> ButtonRAxis + | n -> Printf.ksprintf failwith "unknown button %d" n + +(* +-----------------------------------------------------------------+ + | SDL events (executed in a child process) | + +-----------------------------------------------------------------+ *) + +let child_loop pipe joy = + let axis_state = Array.init (num_axes joy) (get_axis joy) in + let send ev = + Pervasives.output_value pipe ev; + Pervasives.flush pipe + in + while true do + match wait_event () with + | KEYDOWN { keysym = key } -> + send (KeyPressed key); + if key = KEY_ESCAPE then begin + Sdl.quit (); + exit 0 + end + | JOYAXISMOTION { jae_axis = axis; jae_value = value } -> + let value = 100 - ((value - axis_min) * 200 / (axis_max - axis_min)) in + if value <> axis_state.(axis) then begin + axis_state.(axis) <- value; + if axis = laxis_h then + send (JoyLAxisH value) + else if axis = laxis_v then + send (JoyLAxisV value) + else if axis = raxis_h then + send (JoyRAxisH value) + else if axis = raxis_v then + send (JoyRAxisV value) + else + () + end + | JOYBUTTONUP { jbe_button = button } -> + send (JoyButtonPressed(button_of_num button)) + | JOYBUTTONDOWN { jbe_button = button } -> + send (JoyButtonReleased(button_of_num button)) + | _ -> + () + done + +(* +-----------------------------------------------------------------+ + | Handling events (in the parent process) | + +-----------------------------------------------------------------+ *) + +let axis_coef = 6 +let axis_coef_turn = 4 +let accelerations = (800, 800) +let duration = 0.2 + +let try_call action f = + try_lwt + f () + with Failure msg -> + lwt () = Lwt_log.error_f "action %s failed with: %s" action msg in + return () + +let rec set_velocities krobot velocities = + lwt () = Lwt_log.info_f "set-velocities: left=%d right=%d" (fst velocities) (snd velocities) in + lwt () = + try_call "set-velocities" + (fun () -> + Krobot.set_velocities krobot ~velocities ~accelerations ~duration) + in + if velocities = (0, 0) then + return () + else begin + lwt () = Lwt_unix.sleep (duration /. 2.) in + set_velocities krobot velocities + end + +let parent_loop krobot pipe = + let stop = ref false in + let thread = ref (return ()) in + let raxis_h = ref 0 + and raxis_v = ref 0 + and laxis_h = ref 0 + and laxis_v = ref 0 in + let set_velocities () = + cancel !thread; + if not !stop then + thread := + set_velocities krobot + (!laxis_v * axis_coef - !raxis_h * axis_coef_turn, + !laxis_v * axis_coef + !raxis_h * axis_coef_turn) + in + let rec loop () = + Lwt_io.read_value pipe >>= function + | KeyPressed KEY_ESCAPE -> + return () + | JoyLAxisV n -> + laxis_v := n; + set_velocities (); + loop () + | JoyLAxisH n -> + laxis_h := n; + set_velocities (); + loop () + | JoyRAxisV n -> + raxis_v := n; + set_velocities (); + loop () + | JoyRAxisH n -> + raxis_h := n; + set_velocities (); + loop () + | JoyButtonPressed ButtonSquare -> + stop := true; + cancel !thread; + lwt () = try_call "stop-motors" (fun () -> Krobot.stop_motors krobot ~mode:`Abrupt) in + loop () + | JoyButtonReleased ButtonSquare -> + stop := false; + loop () + | _ -> + loop () + in + loop () + +(* +-----------------------------------------------------------------+ + | Entry-point | + +-----------------------------------------------------------------+ *) + +let () = + let fd_r, fd_w = Unix.pipe () in + match Unix.fork () with + | 0 -> + Unix.close fd_r; + Sdl.init [`JOYSTICK;`VIDEO]; + Sdljoystick.set_event_state true; + let joy = + try + open_joystick 0 + with exn -> + Printf.eprintf "cannot open joystick: %s\n%!" (Printexc.to_string exn); + raise exn + in + child_loop (Unix.out_channel_of_descr fd_w) joy + | pid -> + Unix.close fd_w; + Lwt_main.run begin + lwt krobot = Krobot.create () in + lwt () = Lwt_log.notice "ready to process event" in + parent_loop krobot (Lwt_io.of_unix_fd ~mode:Lwt_io.input fd_r) + end diff --git a/PC_Mainboard/clients/krobot_script.ml b/PC_Mainboard/clients/krobot_script.ml new file mode 100644 index 0000000..6f55c8a --- /dev/null +++ b/PC_Mainboard/clients/krobot_script.ml @@ -0,0 +1,329 @@ +(* + * krobot_script.ml + * ---------------- + * Copyright : (c) 2010, Jeremie Dimino <je...@di...> + * Licence : BSD3 + * + * This file is a part of [kro]bot. + *) + +open Lwt +open Lwt_term +open Krobot_script_types + +module TextSet = Set.Make(Text) + +let set_of_list l = List.fold_left (fun set x -> TextSet.add x set) TextSet.empty l + +(* +-----------------------------------------------------------------+ + | Completion | + +-----------------------------------------------------------------+ *) + +let decompose name = + match Text.rev_split ~sep:"." ~max:2 name with + | [] -> + ([], "") + | [name] -> + ([], name) + | [path; name] -> + (Text.split ~sep:"." path, name) + | _ -> + assert false + +let args_of_command name = + let path, name = decompose name in + let rec loop = function + | cmd :: _ when cmd.c_path = path && cmd.c_name = name -> + Some cmd.c_args + | _ :: rest -> + loop rest + | [] -> + None + in + loop !commands + +let rec after_prefix prefix path = + match prefix, path with + | [], path -> + Some path + | e1 :: p1, e2 :: p2 when e1 = e2 -> + after_prefix p1 p2 + | [e1], e2 :: p2 when Text.starts_with e2 e1 -> + Some path + | _ -> + None + +let complete ~before ~after = + try + match Krobot_script_lexer.partial_command (Lexing.from_string before) with + | `Command(before, name) -> begin + let full_path, path, basename = + match Text.rev_split ~sep:"." ~max:2 name with + | [] -> + ("", [], "") + | [name] -> + ("", [], name) + | [path; name] -> + (path ^ ".", Text.split ~sep:"." path, name) + | _ -> + assert false + in + let paths, names = + (List.fold_left + (fun (paths, names) command -> + match after_prefix path command.c_path with + | None -> + (paths, names) + | Some [] -> + (paths, TextSet.add command.c_name names) + | Some (name :: rest) -> + (TextSet.add name paths, names)) + (TextSet.empty, TextSet.empty) !commands) + in + let prefix, words = Lwt_read_line.lookup basename (TextSet.union paths names) in + match TextSet.cardinal words with + | 0 -> + { Lwt_read_line.comp_state = (before ^ name, after); + Lwt_read_line.comp_words = words } + | 1 -> + { Lwt_read_line.comp_state = (before ^ full_path ^ prefix ^ + (if TextSet.mem (TextSet.choose words) paths then "." else " "), + after); + Lwt_read_line.comp_words = words } + | _ -> + { Lwt_read_line.comp_state = (before ^ full_path ^ prefix, after); + Lwt_read_line.comp_words = words } + end + + | `Arg(before, name, args, `Key key) -> begin + match args_of_command name with + | None -> + raise Exit + | Some args' -> + let args' = set_of_list (List.map fst args') in + (* Remove already passed arguments *) + let args = TextSet.diff args' args in + Lwt_read_line.complete ~suffix:"=" before key after args + end + | `Arg(before, name, args, `Value(key, value)) -> begin + match args_of_command name with + | None -> + raise Exit + | Some args' -> + try + match List.assoc key args' with + | Keyword words -> + Lwt_read_line.complete ~suffix:" " before value after (set_of_list words) + | _ -> + raise Exit + with Not_found -> + raise Exit + end + | `Arg(before, name, args, `Nothing) -> + raise Exit + with Exit | Krobot_script_lexer.Parse_failure _ -> + { Lwt_read_line.comp_state = (before, after); + Lwt_read_line.comp_words = TextSet.empty } + +(* +-----------------------------------------------------------------+ + | Execution | + +-----------------------------------------------------------------+ *) + +let exec ~krobot ~logger ~comma... [truncated message content] |
From: Olivier B. <Ba...@us...> - 2010-03-25 11:58: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 f46b6a4fb008c1e1abd85d728f02cd2c6dfe0deb (commit) from ef58523cf3879c3656edd8fb2d833acfe0cc5ee2 (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 f46b6a4fb008c1e1abd85d728f02cd2c6dfe0deb Author: unknown <Olivier@.(none)> Date: Thu Mar 25 12:58:06 2010 +0100 Fixed board not sending trajectory completed message ----------------------------------------------------------------------- Changes: diff --git a/USB_Module/Motor_Controller/Firmware/lm629.c b/USB_Module/Motor_Controller/Firmware/lm629.c index 9af3e9e..5e04c4f 100644 --- a/USB_Module/Motor_Controller/Firmware/lm629.c +++ b/USB_Module/Motor_Controller/Firmware/lm629.c @@ -456,12 +456,7 @@ initLM_RESET: // Activation de certaines interruptions writeCommand(axis, LM_CMD_MSKI); - - #if defined(LM_INTERRUPT) - writeDataWord(axis, LM_COMMAND_ERROR | LM_TRAJECTORY_COMPLETE | LM_POSITION_ERROR | LM_BREAKPOINT); - #else - writeDataWord(axis, 0); - #endif + writeDataWord(axis, LM_COMMAND_ERROR | LM_TRAJECTORY_COMPLETE | LM_POSITION_ERROR | LM_BREAKPOINT); // Reset des interruptions resetAllInterrupt(axis); diff --git a/USB_Module/Motor_Controller/Firmware/output/Motor_controller.cof b/USB_Module/Motor_Controller/Firmware/output/Motor_controller.cof index 2b9d89e..79c9e16 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 8697d12..828daf6 100644 --- a/USB_Module/Motor_Controller/Firmware/output/Motor_controller.hex +++ b/USB_Module/Motor_Controller/Firmware/output/Motor_controller.hex @@ -136,7 +136,7 @@ :10101000F29E7EEF0FF095EC12F001E0010E01015F :101020004D6FF29E4BEC10F084080DE04BEC10F08D :10103000C40809E0E66A9FEC13F04EEC11F028ECCE -:1010400034F0E552EFD71C0E3CEC0FF0000E99EC9B +:1010400034F0E552EFD71C0E3CEC0FF0660E99EC35 :1010500012F055EC11F04BEC10F0800804E04BEC72 :1010600010F0C008E7E14BEC10F0C00802E155ECCD :1010700011F01E0E3CEC0FF00F0E99EC12F0C2ECCA @@ -1541,8 +1541,8 @@ :1067000000C02DF001C02EF002C02FF003C030F009 :10671000E552E552E552E5CFDAFFE7CFD9FF1200A7 :10672000436F6D6D616E64652054455354207265EE -:10673000E775650031363A35383A32350020004D7C -:106740006172203230203230313000436172746522 +:10673000E775650031323A35363A30360020004D83 +:10674000617220323520323031300043617274651D :106750002064276173736572762E20312E310A4FC3 :0F6760006C697669657220424943484C45520086 :10677000D9CFE6FFDACFE6FFE1CFD9FFE2CFDAFFEC diff --git a/USB_Module/Motor_Controller/Firmware/output/Motor_controller.map b/USB_Module/Motor_Controller/Firmware/output/Motor_controller.map index 85143e4..bb296b3 100644 --- a/USB_Module/Motor_Controller/Firmware/output/Motor_controller.map +++ b/USB_Module/Motor_Controller/Firmware/output/Motor_controller.map @@ -1,5 +1,5 @@ MPLINK 4.21, Linker -Linker Map File - Created Sat Mar 20 16:58:30 2010 +Linker Map File - Created Thu Mar 25 12:56:12 2010 Section Info Section Type Address Location Size(Bytes) hooks/post-receive -- krobot |
From: oiffrig <Ba...@us...> - 2010-03-24 22:53:20
|
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 ef58523cf3879c3656edd8fb2d833acfe0cc5ee2 (commit) from d959904fc8c84cf918b665d5e1f587a860223a61 (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 ef58523cf3879c3656edd8fb2d833acfe0cc5ee2 Author: Olivier Iffrig <if...@cr...> Date: Wed Mar 24 23:50:53 2010 +0100 Mise à jour robot Jr ----------------------------------------------------------------------- Changes: diff --git a/Robot_Jr/Meca/Assemblage.CATProduct b/Robot_Jr/Meca/Assemblage.CATProduct index 9e0fd5d..f279861 100644 Binary files a/Robot_Jr/Meca/Assemblage.CATProduct and b/Robot_Jr/Meca/Assemblage.CATProduct differ diff --git a/Robot_Jr/Meca/Base.CATPart b/Robot_Jr/Meca/Base.CATPart index 9151406..964f29a 100644 Binary files a/Robot_Jr/Meca/Base.CATPart and b/Robot_Jr/Meca/Base.CATPart differ diff --git a/Robot_Jr/Meca/Etage 1.CATPart b/Robot_Jr/Meca/Etage 1.CATPart new file mode 100644 index 0000000..e38dd3d Binary files /dev/null and b/Robot_Jr/Meca/Etage 1.CATPart differ diff --git a/Robot_Jr/Meca/Guide porte.CATPart b/Robot_Jr/Meca/Guide porte.CATPart new file mode 100644 index 0000000..c949213 Binary files /dev/null and b/Robot_Jr/Meca/Guide porte.CATPart differ diff --git a/Robot_Jr/Meca/L plan incline long.CATPart b/Robot_Jr/Meca/L plan incline long.CATPart new file mode 100644 index 0000000..d60429b Binary files /dev/null and b/Robot_Jr/Meca/L plan incline long.CATPart differ diff --git a/Robot_Jr/Meca/L plan incline.CATPart b/Robot_Jr/Meca/L plan incline.CATPart new file mode 100644 index 0000000..fd0b939 Binary files /dev/null and b/Robot_Jr/Meca/L plan incline.CATPart differ diff --git a/Robot_Jr/Meca/Mais sur plan incline.CATProduct b/Robot_Jr/Meca/Mais sur plan incline.CATProduct deleted file mode 100644 index 8c4f472..0000000 Binary files a/Robot_Jr/Meca/Mais sur plan incline.CATProduct and /dev/null differ diff --git a/Robot_Jr/Meca/Plan incline.CATPart b/Robot_Jr/Meca/Plan incline.CATPart deleted file mode 100644 index 1dea997..0000000 Binary files a/Robot_Jr/Meca/Plan incline.CATPart and /dev/null differ diff --git a/Robot_Jr/Meca/Plaque horizontale.CATPart b/Robot_Jr/Meca/Plaque horizontale.CATPart new file mode 100644 index 0000000..196ecdd Binary files /dev/null and b/Robot_Jr/Meca/Plaque horizontale.CATPart differ diff --git a/Robot_Jr/Meca/Plaque porte.CATPart b/Robot_Jr/Meca/Plaque porte.CATPart new file mode 100644 index 0000000..3cbad6d Binary files /dev/null and b/Robot_Jr/Meca/Plaque porte.CATPart differ diff --git a/Robot_Jr/Meca/Plaque verticale.CATPart b/Robot_Jr/Meca/Plaque verticale.CATPart new file mode 100644 index 0000000..1d7975e Binary files /dev/null and b/Robot_Jr/Meca/Plaque verticale.CATPart differ hooks/post-receive -- krobot |
From: Jérémie D. <Ba...@us...> - 2010-03-24 22:13:41
|
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 d959904fc8c84cf918b665d5e1f587a860223a61 (commit) from 76537af4b98b2564c9d1371b574a493c3056f4e4 (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 d959904fc8c84cf918b665d5e1f587a860223a61 Author: Jérémie Dimino <je...@di...> Date: Wed Mar 24 23:10:50 2010 +0100 send all errors to clients ----------------------------------------------------------------------- Changes: diff --git a/PC_Mainboard/driver/driver.ml b/PC_Mainboard/driver/driver.ml index fcb947a..e983f39 100644 --- a/PC_Mainboard/driver/driver.ml +++ b/PC_Mainboard/driver/driver.ml @@ -835,7 +835,7 @@ lwt () = in ignore begin - monitor_card ~name:"interace" ~vendor_id:PcInterface.usb_vid ~product_id:PcInterface.usb_pid_robot_interface ~set:set_card_interface + monitor_card ~name:"interface" ~vendor_id:PcInterface.usb_vid ~product_id:PcInterface.usb_pid_robot_interface ~set:set_card_interface (fun card -> lwt () = USB_commands.Servo.enable card `Both in lwt () = Compass.OBus.export bus =|< Compass.make card ["fr"; "krobot"; "Devices"; "Compass"] diff --git a/PC_Mainboard/driver/krobot_card.ml b/PC_Mainboard/driver/krobot_card.ml index 5b23d9d..772d47b 100644 --- a/PC_Mainboard/driver/krobot_card.ml +++ b/PC_Mainboard/driver/krobot_card.ml @@ -220,6 +220,12 @@ let rec dispatch card = return () end else begin let msg = parse_message buffer in + if msg.error <> 0 then begin + if msg.command = PcInterface.cmd_respond then + card.push_error ("response: " ^ error_message msg.error) + else + card.push_error ("spontaneous: " ^ error_message msg.error) + end; if msg.command = PcInterface.cmd_respond then begin match try Some(Int_map.find msg.host_serial card.reply_waiters) with Not_found -> None with | Some wakener -> @@ -242,10 +248,7 @@ let rec dispatch card = ignore (Lwt_log.exn_f ~section ~exn "pushing event %d from %s card failed with" msg.command card.wrapper.name)) seq | None -> - if msg.error <> 0 then - card.push_error (error_message msg.error) - else - ignore (dropped "command" card msg) + ignore (dropped "command" card msg) end; dispatch card end hooks/post-receive -- krobot |
From: Jérémie D. <Ba...@us...> - 2010-03-24 21:56: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 76537af4b98b2564c9d1371b574a493c3056f4e4 (commit) from f39fcb227d0c9db8e22c34a31f4f791c9f52080c (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 76537af4b98b2564c9d1371b574a493c3056f4e4 Author: Kro[bot] <krobot@wally.(none)> Date: Wed Mar 24 21:54:30 2010 +0000 new logs ----------------------------------------------------------------------- Changes: diff --git a/PC_Mainboard/clients/controller.ml b/PC_Mainboard/clients/controller.ml index 8c58876..bd8bba0 100644 --- a/PC_Mainboard/clients/controller.ml +++ b/PC_Mainboard/clients/controller.ml @@ -9,8 +9,6 @@ (* Prints status continuously *) -module Log = Lwt_log.Make(struct let section = "" end) - open Lwt open Lwt_term open Lwt_read_line @@ -32,7 +30,7 @@ let logs, set_logs = React.S.create [] let add_date line = let buffer = Buffer.create 42 in - Lwt_log.render ~buffer ~level:Lwt_log.Info ~message:"" ~template:"$(date): "; + Lwt_log.render ~buffer ~level:Lwt_log.Info ~message:"" ~template:"$(date): " ~section:Lwt_log.Section.main; text (Buffer.contents buffer) :: line (* Add a list of lines to logs *) @@ -67,7 +65,7 @@ let redirect_stderr () = let init_logger () = Lwt_log.default := Lwt_log.make - ~output:(fun level lines -> + ~output:(fun section level lines -> log_add_lines (List.map (fun line -> @@ -79,7 +77,6 @@ let init_logger () = lines); return ()) ~close:return - () (* +-----------------------------------------------------------------+ | Read-line | @@ -119,7 +116,7 @@ let rec loop krobot history = else if line <> "" then begin let history = Lwt_read_line.add_entry line history in set_engine_state (Engine.init history); - lwt () = Log.notice line in + lwt () = Lwt_log.notice line in ignore (Script.exec ~krobot ~logger:(fun line -> log_add_line line; return ()) ~command:line); loop krobot history end else @@ -377,7 +374,7 @@ let refresh krobot = +-----------------------------------------------------------------+ *) lwt () = - lwt () = Log.notice "connecting to the krobot bus..." in + lwt () = Lwt_log.notice "connecting to the krobot bus..." in lwt bus = Lazy.force Krobot.bus in lwt krobot = Krobot.create () in diff --git a/PC_Mainboard/clients/init_position.ml b/PC_Mainboard/clients/init_position.ml index 4e74d75..85a69bd 100644 --- a/PC_Mainboard/clients/init_position.ml +++ b/PC_Mainboard/clients/init_position.ml @@ -9,35 +9,33 @@ (* Put the robot into its initial state *) -module Log = Lwt_log.Make(struct let section = "" end) - open Lwt let move_backward_slowly krobot = - lwt () = Log.notice "moving backward" in + lwt () = Lwt_log.notice "moving backward" in Krobot.move krobot ~distance:(-1000) ~velocity:100 ~acceleration:100 >>= function | `OK -> - lwt () = Log.error "where am i ???" in + lwt () = Lwt_log.error "where am i ???" in exit 1 | `Stopped -> - Log.notice "backward colisiton dectected" + Lwt_log.notice "backward colisiton dectected" lwt () = lwt krobot = Krobot.create () in lwt () = move_backward_slowly krobot in - lwt () = Log.notice "going to initial position on first axis" in + lwt () = Lwt_log.notice "going to initial position on first axis" in lwt _ = Krobot.move krobot ~distance:Krobot_config.initial_position ~velocity:400 ~acceleration:800 in - lwt () = Log.notice "turning" in + lwt () = Lwt_log.notice "turning" in lwt _ = Krobot.turn krobot ~angle:(-90) ~velocity:400 ~acceleration:800 in lwt () = move_backward_slowly krobot in - lwt () = Log.notice "going to initial position on second axis" in + lwt () = Lwt_log.notice "going to initial position on second axis" in lwt _ = Krobot.move krobot ~distance:Krobot_config.initial_position ~velocity:400 ~acceleration:800 in - lwt () = Log.notice "turning" in + lwt () = Lwt_log.notice "turning" in lwt _ = Krobot.turn krobot ~angle:45 ~velocity:400 ~acceleration:800 in return () diff --git a/PC_Mainboard/clients/joy_control.ml b/PC_Mainboard/clients/joy_control.ml index a31a0b7..2247147 100644 --- a/PC_Mainboard/clients/joy_control.ml +++ b/PC_Mainboard/clients/joy_control.ml @@ -9,8 +9,6 @@ (* Control the robot with a joystick *) -module Log = Lwt_log.Make(struct let section = "" end) - open Lwt open Sdljoystick open Sdlevent @@ -135,11 +133,11 @@ let try_call action f = try_lwt f () with Failure msg -> - lwt () = Log.error_f "action %s failed with: %s" action msg in + lwt () = Lwt_log.error_f "action %s failed with: %s" action msg in return () let rec set_velocities krobot velocities = - lwt () = Log.info_f "set-velocities: left=%d right=%d" (fst velocities) (snd velocities) in + lwt () = Lwt_log.info_f "set-velocities: left=%d right=%d" (fst velocities) (snd velocities) in lwt () = try_call "set-velocities" (fun () -> @@ -223,6 +221,6 @@ let () = Unix.close fd_w; Lwt_main.run begin lwt krobot = Krobot.create () in - lwt () = Log.notice "ready to process event" in + lwt () = Lwt_log.notice "ready to process event" in parent_loop krobot (Lwt_io.of_unix_fd ~mode:Lwt_io.input fd_r) end diff --git a/PC_Mainboard/driver/driver.ml b/PC_Mainboard/driver/driver.ml index 41c7c76..fcb947a 100644 --- a/PC_Mainboard/driver/driver.ml +++ b/PC_Mainboard/driver/driver.ml @@ -9,7 +9,7 @@ (* Driver for USB cards *) -module Log = Lwt_log.Make(struct let section = "driver" end) +let section = Lwt_log.Section.make "driver" open OBus_pervasives open Krobot_types @@ -363,18 +363,18 @@ struct let move dev dist velocity acc = lwt () = - Log.info_f "move: distance=%d velocity=%d acceleration=%d" + Lwt_log.info_f ~section "move: distance=%d velocity=%d acceleration=%d" dist velocity acc in match dev.state with | Trajectory _ -> - lwt () = Log.info "move: state=trajectory" in + lwt () = Lwt_log.info ~section "move: state=trajectory" in fail (Failure "already in a trajectory") | Manual _ -> - lwt () = Log.info "move: state=manual" in + lwt () = Lwt_log.info ~section "move: state=manual" in fail (Failure "currently in manual mode") | Static -> - lwt () = Log.info "move: state=static" in + lwt () = Lwt_log.info ~section "move: state=static" in 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") @@ -403,18 +403,18 @@ struct let turn dev angle velocity acc = lwt () = - Log.info_f "turn: angle=%d velocity=%d acceleration=%d" + Lwt_log.info_f ~section "turn: angle=%d velocity=%d acceleration=%d" angle velocity acc in match dev.state with | Trajectory _ -> - lwt () = Log.info "turn: state=trajectory" in + lwt () = Lwt_log.info ~section "turn: state=trajectory" in fail (Failure "already in a trajectory") | Manual _ -> - lwt () = Log.info "turn: state=manual" in + lwt () = Lwt_log.info ~section "turn: state=manual" in fail (Failure "currently in manual mode") | Static -> - lwt () = Log.info "turn: state=static" in + lwt () = Lwt_log.info ~section "turn: state=static" in let waiter, wakener = Lwt.wait () in let trajectory = { abort = wakener; @@ -443,18 +443,18 @@ struct let goto dev x y velocity acc mode bypass_distance = lwt () = - Log.info_f "goto: x=%d y=%d velocity=%d acceleration=%d mode=%s bypass_distance=%d" + Lwt_log.info_f ~section "goto: x=%d y=%d velocity=%d acceleration=%d mode=%s bypass_distance=%d" x y velocity acc (string_of_goto_mode mode) bypass_distance in match dev.state with | Trajectory _ -> - lwt () = Log.info "goto: state=trajectory" in + lwt () = Lwt_log.info ~section "goto: state=trajectory" in fail (Failure "already in a trajectory") | Manual _ -> - lwt () = Log.info "goto: state=manual" in + lwt () = Lwt_log.info ~section "goto: state=manual" in fail (Failure "currently in manual mode") | Static -> - lwt () = Log.info "goto: state=static" in + lwt () = Lwt_log.info ~section "goto: state=static" in let date = Unix.gettimeofday () in if date < dev.inhibit_forward_until then fail (Failure "inhibited move") @@ -497,22 +497,22 @@ struct | `Off -> "off" let stop_motors dev mode = - lwt () = Log.info_f "stop-motors: mode=%s" (string_of_stop_mode mode) in + lwt () = Lwt_log.info_f ~section "stop-motors: mode=%s" (string_of_stop_mode mode) in match dev.state with | Trajectory trajectory -> - lwt () = Log.info "stop-motors: state=trajectory" in + lwt () = Lwt_log.info ~section "stop-motors: state=trajectory" in trajectory.stopped <- true; lwt () = USB_commands.Motors.traj_stop dev.card `Both mode in wakeup trajectory.abort (); return () | Manual(stopper, left, right) -> - lwt () = Log.info "stop-motors: state=manual" in + lwt () = Lwt_log.info ~section "stop-motors: state=manual" in lwt () = USB_commands.Motors.traj_stop dev.card `Both mode in dev.state <- Static; cancel stopper; return () | Static -> - lwt () = Log.info "stop-motors: state=static" in + lwt () = Lwt_log.info ~section "stop-motors: state=static" in USB_commands.Motors.traj_stop dev.card `Both mode let _set_velocities dev stopper (settings_l, settings_r) (velocity_l, velocity_r) (acceleration_l, acceleration_r) duration = @@ -546,20 +546,20 @@ struct let set_velocities dev velocities accelerations duration = lwt () = - Log.info_f "set-velocities: velocities=(%d, %d) accelerations=(%d, %d) duration=%f" + Lwt_log.info_f ~section "set-velocities: velocities=(%d, %d) accelerations=(%d, %d) duration=%f" (fst velocities) (snd velocities) (fst accelerations) (snd accelerations) duration in match dev.state with | Trajectory _ -> - lwt () = Log.info "set-velocities: state=trajectory" in + lwt () = Lwt_log.info ~section "set-velocities: state=trajectory" in fail (Failure "currently in trajectory mode") | Manual(stopper, left, right) -> - lwt () = Log.info "set-velocities: state=manual" in + lwt () = Lwt_log.info ~section "set-velocities: state=manual" in _set_velocities dev stopper (left, right) velocities accelerations duration | Static -> - lwt () = Log.info "set-velocities: state=static" in + lwt () = Lwt_log.info ~section "set-velocities: state=static" in let static = { velocity = 0; acceleration = 0; direction = `Forward } in _set_velocities dev (return ()) (static, static) velocities accelerations duration @@ -654,7 +654,7 @@ struct state card_monitoring) OL_method Shutdown : OBus_connection.t -> unit = fun manager connection -> - lwt () = Log.info "exiting" in + lwt () = Lwt_log.info ~section "exiting" in quit := true; lwt () = close card_interface and () = close card_sensor @@ -749,10 +749,10 @@ end let rec monitor_card ~name ~vendor_id ~product_id ~set on_up on_down = match try `Handle(USB.open_device_with ~vendor_id ~product_id) with exn -> `Error exn with | `Error exn -> - lwt () = Log.info_f "failed to open %s card: %s" name (Printexc.to_string exn) in + lwt () = Lwt_log.info_f ~section "failed to open %s card: %s" name (Printexc.to_string exn) in restart_card ~name ~vendor_id ~product_id ~set on_up on_down | `Handle handle -> - lwt () = Log.info_f "%s card opened" name in + lwt () = Lwt_log.info_f ~section "%s card opened" name in begin try_lwt lwt card = Krobot_card.make name handle in @@ -761,7 +761,7 @@ let rec monitor_card ~name ~vendor_id ~product_id ~set on_up on_down = return (`Error exn) end >>= function | `Krobot_card card -> - lwt () = Log.info_f "%s card is up and running" name in + lwt () = Lwt_log.info_f ~section "%s card is up and running" name in set (Some card); lwt () = on_up card in lwt result = Krobot_card.watch card in @@ -772,11 +772,11 @@ let rec monitor_card ~name ~vendor_id ~product_id ~set on_up on_down = | `Closed -> return () | `Error exn -> - Log.info_f "%s card crashed: %s" name (Printexc.to_string exn) + Lwt_log.info_f ~section "%s card crashed: %s" name (Printexc.to_string exn) in restart_card ~name ~vendor_id ~product_id ~set on_up on_down | `Error exn -> - lwt () = Log.exn_f exn "failed to make %s card" name in + lwt () = Lwt_log.exn_f ~section ~exn "failed to make %s card" name in restart_card ~name ~vendor_id ~product_id ~set on_up on_down and restart_card ~name ~vendor_id ~product_id ~set on_up on_down = @@ -805,7 +805,7 @@ lwt () = lwt () = try_lwt - lwt () = Log.info "Killing any running driver" in + lwt () = Lwt_log.info ~section "Killing any running driver" in OBus_connection.method_call bus ~path:["fr"; "krobot"; "Manager"] ~interface:"fr.krobot.Manager" @@ -826,9 +826,9 @@ lwt () = lwt () = if !foreground then (* Running foreground, prints message on stderr: *) - Log.notice "starting krobot driver in foreground mode" + Lwt_log.notice ~section "starting krobot driver in foreground mode" else begin - lwt () = Log.notice "starting krobot driver in daemon mode" in + lwt () = Lwt_log.notice ~section "starting krobot driver in daemon mode" in Lwt_daemon.daemonize (); return () end @@ -889,7 +889,7 @@ lwt () = OBus_object.export bus Manager.manager; - lwt () = Log.notice "ready, waiting for requests" in + lwt () = Lwt_log.notice ~section "ready, waiting for requests" in lwt () = done_waiter in OBus_connection.close bus end diff --git a/PC_Mainboard/driver/krobot_card.ml b/PC_Mainboard/driver/krobot_card.ml index f12da8b..5b23d9d 100644 --- a/PC_Mainboard/driver/krobot_card.ml +++ b/PC_Mainboard/driver/krobot_card.ml @@ -7,7 +7,7 @@ * This file is a part of [kro]bot. *) -module Log = Lwt_log.Make(struct let section = "card" end) +let section = Lwt_log.Section.make "card" open Lwt @@ -186,14 +186,14 @@ let abort wrapper exn = +-----------------------------------------------------------------+ *) let dropped typ card msg = - lwt () = Log.warning_f "%s dropped on card %s" typ card.wrapper.name in - lwt () = Log.warning_f "===== + lwt () = Lwt_log.warning_f ~section "%s dropped on card %s" typ card.wrapper.name in + lwt () = Lwt_log.warning_f ~section "===== host_serial = %d device_serial = %d command = %d error = %s data:" msg.host_serial msg.device_serial msg.command (if msg.error <> 0 then error_message msg.error else "none") in - Lwt_stream.iter_s (fun line -> Log.warning line) (Lwt_stream.hexdump (Lwt_stream.of_string msg.data)) + Lwt_stream.iter_s (fun line -> Lwt_log.warning ~section line) (Lwt_stream.hexdump (Lwt_stream.of_string msg.data)) (* Dispatch incomming messages continously *) let rec dispatch card = @@ -209,13 +209,13 @@ let rec dispatch card = return (`Error exn) end >>= function | `Error exn -> - lwt () = Log.exn_f exn "stop dispatching on %s card" card.wrapper.name in + lwt () = Lwt_log.exn_f ~section ~exn "stop dispatching on %s card" card.wrapper.name in 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 - lwt () = Log.error msg in + lwt () = Lwt_log.error ~section msg in lwt _ = abort card.wrapper (Card_crashed msg) in return () end else begin @@ -239,7 +239,7 @@ let rec dispatch card = try push msg.data with exn -> - ignore (Log.exn_f exn "pushing event %d from %s card failed with" msg.command card.wrapper.name)) + ignore (Lwt_log.exn_f ~section ~exn "pushing event %d from %s card failed with" msg.command card.wrapper.name)) seq | None -> if msg.error <> 0 then @@ -309,7 +309,7 @@ let send card buffer = lwt len = pick [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 - lwt () = Log.error msg in + lwt () = Lwt_log.error ~section msg in fail =<< abort card.wrapper (Card_crashed msg) end else return () @@ -343,7 +343,7 @@ let rec send_request wrapper command data = | Canceled -> fail Canceled | exn -> - lwt () = Log.exn_f exn "write to %s card failed with" wrapper.name in + lwt () = Lwt_log.exn_f ~section ~exn "write to %s card failed with" wrapper.name in fail =<< abort wrapper exn (* Send a command without waiting for the reply: *) @@ -360,7 +360,7 @@ let rec send_command wrapper command data = | Canceled -> fail Canceled | exn -> - lwt () = Log.exn_f exn "write to %s card failed with" wrapper.name in + lwt () = Lwt_log.exn_f ~section ~exn "write to %s card failed with" wrapper.name in fail =<< abort wrapper exn let connect wrapper command = match wrapper.state with diff --git a/PC_Mainboard/lib_krobot/krobot.ml b/PC_Mainboard/lib_krobot/krobot.ml index 54647ed..ef40608 100644 --- a/PC_Mainboard/lib_krobot/krobot.ml +++ b/PC_Mainboard/lib_krobot/krobot.ml @@ -7,7 +7,7 @@ * This file is a part of [kro]bot. *) -module Log = Lwt_log.Make(struct let section = "krobot" end) +let section = Lwt_log.Section.make "krobot" open OBus_pervasives open Lwt @@ -89,7 +89,7 @@ let bus = lazy( match try Some(Sys.getenv "KROBOT") with Not_found -> None with | Some command -> begin try_lwt - lwt () = Log.info_f "connecting to the krobot with command %S" command in + lwt () = Lwt_log.info_f ~section "connecting to the krobot with command %S" command in let process = Lwt_process.open_process (Lwt_process.shell command) in let transport = OBus_transport.make @@ -102,15 +102,15 @@ let bus = lazy( lwt () = OBus_bus.register_connection connection in return connection with exn -> - lwt () = Log.exn exn "failed to create remote transport" in + lwt () = Lwt_log.exn ~section ~exn "failed to create remote transport" in fail exn end | None -> try_lwt - lwt () = Log.info "connecting to the krobot with the local krobot bus" in + lwt () = Lwt_log.info ~section "connecting to the krobot with the local krobot bus" in OBus_bus.of_addresses (OBus_address.of_string Krobot_config.bus_address) with exn -> - lwt () = Log.exn exn "failed to connect to the local krobot bus" in + lwt () = Lwt_log.exn ~section ~exn "failed to connect to the local krobot bus" in fail exn ) diff --git a/PC_Mainboard/services/hard_stop.ml b/PC_Mainboard/services/hard_stop.ml index c457125..f72269a 100644 --- a/PC_Mainboard/services/hard_stop.ml +++ b/PC_Mainboard/services/hard_stop.ml @@ -9,8 +9,6 @@ (* Stop the robot on collisions *) -module Log = Lwt_log.Make(struct let section = "" end) - open Lwt (* Duration of an inhibition: *) @@ -28,18 +26,18 @@ let handle_collide krobot sensors = try_lwt join [ (if Util.front_collide sensors then begin - lwt () = Log.notice "front collision detected, inhibit motors" in + lwt () = Lwt_log.notice "front collision detected, inhibit motors" in Krobot.inhibit_forward krobot duration end else return ()); (if Util.back_collide sensors then begin - lwt () = Log.notice "back collision detected, inhibit motors" in + lwt () = Lwt_log.notice "back collision detected, inhibit motors" in Krobot.inhibit_backward krobot duration end else return ()); ] with exn -> - Log.info_f "collision handling failed with: %s" (Printexc.to_string exn) + Lwt_log.info_f "collision handling failed with: %s" (Printexc.to_string exn) lwt () = Arg.parse args ignore usage; @@ -50,9 +48,9 @@ lwt () = lwt () = if !foreground then - Log.info "starting krobot hard stopper in foreground mode" + Lwt_log.info "starting krobot hard stopper in foreground mode" else begin - lwt () = Log.info "starting krobot hard stopper in daemon mode" in + lwt () = Lwt_log.info "starting krobot hard stopper in daemon mode" in Lwt_daemon.daemonize (); return () end hooks/post-receive -- krobot |
From: Olivier B. <Ba...@us...> - 2010-03-20 16:02:01
|
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 f39fcb227d0c9db8e22c34a31f4f791c9f52080c (commit) from 8dc0a8c11338c9b18afbe9bd3473370afc110dd7 (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 f39fcb227d0c9db8e22c34a31f4f791c9f52080c Author: Olivier BICHLER <oli...@gm...> Date: Sat Mar 20 17:01:28 2010 +0100 - Disabled interruptions during LM commands - LM Interrupt method permanently disabled (non-functional with the current board) - Only poll LM when LM interrupt pin is high ----------------------------------------------------------------------- Changes: diff --git a/USB_Module/Motor_Controller/Firmware/lm629.c b/USB_Module/Motor_Controller/Firmware/lm629.c index cdf6eba..9af3e9e 100644 --- a/USB_Module/Motor_Controller/Firmware/lm629.c +++ b/USB_Module/Motor_Controller/Firmware/lm629.c @@ -159,6 +159,10 @@ void waitBusyLM(char axis) { */ void writeCommand(char axis, BYTE command) { BYTE_VAL cmd = {command}; + static unsigned char GIE_Status; + + GIE_Status = INTCONbits.GIE; // Save global interrupt enable bit + INTCONbits.GIE = 0; // Disable global interrupts waitBusyLM(axis); dataBusDirection(DATA_OUT); @@ -181,7 +185,8 @@ void writeCommand(char axis, BYTE command) { Nop(); Nop(); // attends 2 cycles, 8 MHz / 4 = 166 ns (> 100 ns + 50 ns) LM_WRITE = 1; // attendre au moins 30 ns avant LM_PS = PS_DATA + attendre au moins 120 ns avant de changer les donn - Nop(); Nop(); // attends 2 cycles, 8 MHz / 4 = 166 ns (> 120 ns) + + INTCONbits.GIE = GIE_Status; // Restore the original global interrupt status } /** @@ -197,6 +202,10 @@ void writeCommand(char axis, BYTE command) { */ void writeDataWord(char axis, WORD data) { WORD_VAL word = {data}; + static unsigned char GIE_Status; + + GIE_Status = INTCONbits.GIE; // Save global interrupt enable bit + INTCONbits.GIE = 0; // Disable global interrupts waitBusyLM(axis); dataBusDirection(DATA_OUT); @@ -235,7 +244,8 @@ void writeDataWord(char axis, WORD data) { Nop(); Nop(); // attends 2 cycles, 8 MHz / 4 = 166 ns (> 100 ns + 50 ns) LM_WRITE = 1; // attendre au moins 120 ns avant de changer les donn - Nop(); Nop(); // attends 2 cycles, 8 MHz / 4 = 166 ns (> 120 ns) + + INTCONbits.GIE = GIE_Status; // Restore the original global interrupt status } /** @@ -251,12 +261,16 @@ void writeDataWord(char axis, WORD data) { */ WORD readDataWord(char axis) { WORD_VAL word; + static unsigned char GIE_Status; if (axis != MOTOR_RIGHT && axis != MOTOR_LEFT) { error(ERR_INVALID_AXIS); return 0; } else { + GIE_Status = INTCONbits.GIE; // Save global interrupt enable bit + INTCONbits.GIE = 0; // Disable global interrupts + waitBusyLM(axis); dataBusDirection(DATA_IN); @@ -280,6 +294,7 @@ WORD readDataWord(char axis) { LM_READ = 1; // attendre au moins 30 ns avant une autre action + INTCONbits.GIE = GIE_Status; // Restore the original global interrupt status return word.Val; } } @@ -297,12 +312,16 @@ WORD readDataWord(char axis) { */ BYTE readStatus(char axis) { BYTE status = 0; + static unsigned char GIE_Status; if (axis != MOTOR_RIGHT && axis != MOTOR_LEFT) { error(ERR_INVALID_AXIS); return 0; } else { + GIE_Status = INTCONbits.GIE; // Save global interrupt enable bit + INTCONbits.GIE = 0; // Disable global interrupts + waitBusyLM(axis); dataBusDirection(DATA_IN); @@ -318,7 +337,8 @@ BYTE readStatus(char axis) { status = LM_DATA_BUS; LM_READ = 1; // attendre au moins 30 ns avant une autre action - + + INTCONbits.GIE = GIE_Status; // Restore the original global interrupt status return status; } } @@ -363,8 +383,15 @@ BOOL readStatusBit(char axis, BYTE type) { * @param type type d'interruption esetter */ void resetInterrupt(char axis, WORD type) { + static unsigned char GIE_Status; + + GIE_Status = INTCONbits.GIE; // Save global interrupt enable bit + INTCONbits.GIE = 0; // Disable global interrupts + writeCommand(axis, LM_CMD_RSTI); writeDataWord(axis, ~type); + + INTCONbits.GIE = GIE_Status; // Restore the original global interrupt status } /** @@ -376,8 +403,15 @@ void resetInterrupt(char axis, WORD type) { * #MOTOR_BOTH les 2 moteurs */ void resetAllInterrupt(char axis) { + static unsigned char GIE_Status; + + GIE_Status = INTCONbits.GIE; // Save global interrupt enable bit + INTCONbits.GIE = 0; // Disable global interrupts + writeCommand(axis, LM_CMD_RSTI); writeDataWord(axis, 0x0000); + + INTCONbits.GIE = GIE_Status; // Restore the original global interrupt status } /** @@ -408,6 +442,11 @@ void resetAllInterrupt(char axis) { * @param il limite d'intation, sur 16 bits */ void initLM(char axis, WORD kp, WORD ki, WORD kd, WORD il) { + static unsigned char GIE_Status; + + GIE_Status = INTCONbits.GIE; // Save global interrupt enable bit + INTCONbits.GIE = 0; // Disable global interrupts + // Reset du LM (si nssaire) while (readStatus(axis) != 0x84 && readStatus(axis) != 0xC4) { initLM_RESET: @@ -451,6 +490,8 @@ initLM_RESET: trajLoaded = 0; trajEngaged = 0; trajCompleted = 0; + + INTCONbits.GIE = GIE_Status; // Restore the original global interrupt status } /** @@ -515,6 +556,10 @@ void newPosition(char axis, DWORD pos, DWORD vel, DWORD acc) { DWORD_VAL posData; DWORD_VAL velData = {vel}; DWORD_VAL accData = {acc}; + static unsigned char GIE_Status; + + GIE_Status = INTCONbits.GIE; // Save global interrupt enable bit + INTCONbits.GIE = 0; // Disable global interrupts writeCommand(axis, LM_CMD_LTRJ); @@ -550,6 +595,7 @@ void newPosition(char axis, DWORD pos, DWORD vel, DWORD acc) { } trajLoaded = 1; + INTCONbits.GIE = GIE_Status; // Restore the original global interrupt status } /** @@ -573,6 +619,10 @@ void newVelocity(char axis, DWORD vel, DWORD acc, char dir) { DWORD_VAL velData = {vel}; DWORD_VAL accData = {acc}; WORD arg = LM_LTRJ_LOAD_VEL | LM_LTRJ_VEL_MODE; + static unsigned char GIE_Status; + + GIE_Status = INTCONbits.GIE; // Save global interrupt enable bit + INTCONbits.GIE = 0; // Disable global interrupts writeCommand(axis, LM_CMD_LTRJ); @@ -613,6 +663,7 @@ void newVelocity(char axis, DWORD vel, DWORD acc, char dir) { writeDataWord(axis, velData.word.LW); trajLoaded = 1; + INTCONbits.GIE = GIE_Status; // Restore the original global interrupt status } /** @@ -668,12 +719,19 @@ void start(char axis) { * #LM_LTRJ_STOP_SMOOTH arrdoux */ void stop(char axis, WORD type) { + static unsigned char GIE_Status; + + GIE_Status = INTCONbits.GIE; // Save global interrupt enable bit + INTCONbits.GIE = 0; // Disable global interrupts + writeCommand(axis, LM_CMD_LTRJ); writeDataWord(axis, type); writeCommand(axis, LM_CMD_STT); trajEngaged = 1; trajCompleted = 0; + + INTCONbits.GIE = GIE_Status; // Restore the original global interrupt status } /** @@ -689,6 +747,10 @@ void stop(char axis, WORD type) { */ void setBreakpoint(char axis, DWORD pos, BOOL rel) { DWORD_VAL posData; + static unsigned char GIE_Status; + + GIE_Status = INTCONbits.GIE; // Save global interrupt enable bit + INTCONbits.GIE = 0; // Disable global interrupts if (rel) { posData.Val = pos; @@ -711,6 +773,8 @@ void setBreakpoint(char axis, DWORD pos, BOOL rel) { writeDataWord(MOTOR_RIGHT, posData.word.LW); } } + + INTCONbits.GIE = GIE_Status; // Restore the original global interrupt status } /** @@ -727,15 +791,21 @@ void setBreakpoint(char axis, DWORD pos, BOOL rel) { */ DWORD getDesiredPosition(char axis) { DWORD_VAL posData; + static unsigned char GIE_Status; if (axis != MOTOR_RIGHT && axis != MOTOR_LEFT) { error(ERR_INVALID_AXIS); return 0; } else { + GIE_Status = INTCONbits.GIE; // Save global interrupt enable bit + INTCONbits.GIE = 0; // Disable global interrupts + writeCommand(axis, LM_CMD_RDDP); posData.word.HW = readDataWord(axis); posData.word.LW = readDataWord(axis); + + INTCONbits.GIE = GIE_Status; // Restore the original global interrupt status return posData.Val; } } @@ -752,15 +822,21 @@ DWORD getDesiredPosition(char axis) { */ DWORD getRealPosition(char axis) { DWORD_VAL posData; + static unsigned char GIE_Status; if (axis != MOTOR_RIGHT && axis != MOTOR_LEFT) { error(ERR_INVALID_AXIS); return 0; } else { + GIE_Status = INTCONbits.GIE; // Save global interrupt enable bit + INTCONbits.GIE = 0; // Disable global interrupts + writeCommand(axis, LM_CMD_RDRP); posData.word.HW = readDataWord(axis); posData.word.LW = readDataWord(axis); + + INTCONbits.GIE = GIE_Status; // Restore the original global interrupt status return posData.Val; } } @@ -779,15 +855,21 @@ DWORD getRealPosition(char axis) { */ DWORD getDesiredVelocity(char axis) { DWORD_VAL velData; + static unsigned char GIE_Status; if (axis != MOTOR_RIGHT && axis != MOTOR_LEFT) { error(ERR_INVALID_AXIS); return 0; } else { + GIE_Status = INTCONbits.GIE; // Save global interrupt enable bit + INTCONbits.GIE = 0; // Disable global interrupts + writeCommand(axis, LM_CMD_RDDV); velData.word.HW = readDataWord(axis); velData.word.LW = readDataWord(axis); + + INTCONbits.GIE = GIE_Status; // Restore the original global interrupt status return velData.Val; } } @@ -804,15 +886,21 @@ DWORD getDesiredVelocity(char axis) { */ DWORD getRealVelocity(char axis) { DWORD_VAL velData; + static unsigned char GIE_Status; if (axis != MOTOR_RIGHT && axis != MOTOR_LEFT) { error(ERR_INVALID_AXIS); return 0; } else { + GIE_Status = INTCONbits.GIE; // Save global interrupt enable bit + INTCONbits.GIE = 0; // Disable global interrupts + writeCommand(axis, LM_CMD_RDRV); velData.word.HW = readDataWord(axis); velData.word.LW = 0; + + INTCONbits.GIE = GIE_Status; // Restore the original global interrupt status return velData.Val; } } @@ -828,13 +916,22 @@ DWORD getRealVelocity(char axis) { * @return WORD la valeur de l'intation, sur 16 bits */ WORD getIntegrationSum(char axis) { + WORD data; + static unsigned char GIE_Status; + if (axis != MOTOR_RIGHT && axis != MOTOR_LEFT) { error(ERR_INVALID_AXIS); return 0; } else { + GIE_Status = INTCONbits.GIE; // Save global interrupt enable bit + INTCONbits.GIE = 0; // Disable global interrupts + writeCommand(axis, LM_CMD_RDSUM); - return readDataWord(axis); + data = readDataWord(axis); + + INTCONbits.GIE = GIE_Status; // Restore the original global interrupt status + return data; } } diff --git a/USB_Module/Motor_Controller/Firmware/lm629.h b/USB_Module/Motor_Controller/Firmware/lm629.h index 94a7b96..47ba379 100644 --- a/USB_Module/Motor_Controller/Firmware/lm629.h +++ b/USB_Module/Motor_Controller/Firmware/lm629.h @@ -22,7 +22,7 @@ // Parames graux #define LM_CLOCK 8e6 ///< Frence horloge LM (en Hz) -- forcnt 6 ou 8 MHz selon la rrence du composant -//#define LM_INTERRUPT +//#define LM_INTERRUPT // Non-functional, bug in the card schematic (RB2 and RB3 pins are not interruptible on change...) #define LM_POLLING #if defined(KROBOT_2010) diff --git a/USB_Module/Motor_Controller/Firmware/main.c b/USB_Module/Motor_Controller/Firmware/main.c index bc5d400..250c65d 100644 --- a/USB_Module/Motor_Controller/Firmware/main.c +++ b/USB_Module/Motor_Controller/Firmware/main.c @@ -214,6 +214,7 @@ char ResetSource(void); void YourHighPriorityISRCode() { unsigned char sProdL, sProdH; + char dummy; // sauvegarde du contenu des registres de calcul sProdL = PRODL; @@ -245,7 +246,9 @@ char ResetSource(void); checkLM629Interrupt(); // On rtorise l'interruption + dummy = PORTB; // Read PORTB to clear mismatch condition INTCONbits.RBIF = 0; + dummy = PORTB; // Read PORTB to clear mismatch condition (see: http://www.xargs.com/pic/portb-change-bug.html) } #endif @@ -501,6 +504,7 @@ static void InitializeSystem(void) void UserInit(void) { BYTE eeprom; + char dummy; // ResetSource() permet de connaitre l'origine du dernier reset tout en ritialisant correctement // les registres pour le prochain reset. Si elle n'est pas appelhaque drrage du PIC, les @@ -520,19 +524,10 @@ void UserInit(void) WriteEEPROM(0x00, eeprom); } - // Initialisation des PIN non utilisdu port B en sortie, pour ne pas dencher des interruptions sur - // le port B de mani aloire... - TRISB&= 0b00011100; - // Configuration interruptions - RCONbits.IPEN = 1; // Enable priority levels on interrupts INTCONbits.GIE = 1; // Enables all high priority interrupts INTCONbits.PEIE = 1; // Enables all low priority peripheral interrupts - #if defined(LM_INTERRUPT) - INTCONbits.RBIE = 1; // Enable PORTB Interrupt-on-change - #endif - // Configuration de l'I2C // OpenI2C(MASTER, SLEW_OFF); @@ -566,6 +561,15 @@ void UserInit(void) ); WriteTimer1(57536); // 2^16 - 8 000 : la prochaine interruption a lieu dans 8 000 cycles = 1 ms + #if defined(LM_INTERRUPT) + // Initialisation des PIN non utilisdu port B en sortie, pour ne pas dencher des interruptions sur + // le port B de mani aloire... + TRISB&= 0b00011100; + + dummy = PORTB; // Read PORTB to clear mismatch condition + INTCONbits.RBIE = 1; // Enable PORTB Interrupt-on-change + #endif + }//end UserInit /** @@ -594,7 +598,8 @@ void ProcessIO(void) { } #if defined(LM_POLLING) - checkLM629Interrupt(); + if (PORTBbits.RB2 || PORTBbits.RB3) + checkLM629Interrupt(); #endif if (!HIDTxHandleBusy(USBInHandle) && err[errno] > 0) { diff --git a/USB_Module/Motor_Controller/Firmware/output/Motor_controller.cof b/USB_Module/Motor_Controller/Firmware/output/Motor_controller.cof index a74276b..2b9d89e 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 f2e25bf..8697d12 100644 --- a/USB_Module/Motor_Controller/Firmware/output/Motor_controller.hex +++ b/USB_Module/Motor_Controller/Firmware/output/Motor_controller.hex @@ -1,31 +1,31 @@ :020000040000FA -:0600000064EF33F0120072 +:0600000055EF34F0120080 :0600080004EF04F01200F9 :060018000CEF04F01200E1 -:0608000064EF33F012006A -:060808002CEF13F01200BA -:0608180094EF13F0120042 -:06082A0004005D67000000 -:100830002601000021000000526700005401000062 -:100840000B00000045670000470100000D0000009C -:0C085000426700006C0100000300000083 -:04085C00A4EC0EF00A -:10086000030EE126010EE66EE1DAE552DF6E020EBE -:10087000E66EDCDAE552E76E010EE7CFDBFF020E33 -:10088000DF1404E1010EDB50020B06E00A0E9DECC2 -:1008900011F0020ED8EC11F0020EDB6ADFB4DB803F -:1008A000010EDBA402D0020EDB8263EC10F0E8AE96 +:0608000055EF34F0120078 +:060808000FEF14F01200D6 +:060818007EEF14F0120057 +:06082A0004003F6900001C +:10083000260100002100000034690000640100006E +:100840000B00000027690000570100000D000000A8 +:0C085000246900007C010000030000008F +:04085C0079EC0FF034 +:10086000030EE126010EE66E04DBE552DF6E020E9A +:10087000E66EFFDAE552E76E010EE7CFDBFF020E10 +:10088000DF1404E1010EDB50020B06E00A0E76ECE9 +:1008900012F0020EB5EC12F0020EDB6ADFB4DB8060 +:1008A000010EDBA402D0020EDB8247EC11F0E8AEB1 :1008B00002D0003403D0E750D880005407E2020E83 -:1008C000DB5001015613040EE0EC12F0200EDF1491 -:1008D00004E1010EDB50200B06E00B0E9DEC11F045 -:1008E000200ED8EC11F0020EDB6ADFBCDB80010EBB -:1008F000DBAC02D0020EDB8263EC10F0E8AE02D07B -:10090000003403D0E750D88000540BE20101545169 -:1009100005E0CFEC11F031EC09F0E552400EE0ECCF -:1009200012F0030EE15C02E2E16AE552E16EA9EF2A -:100930000EF0A4EC0EF0FE0EDB5006E1F80E96165B +:1008C000DB5001016613040EBDEC13F0200EDF14A3 +:1008D00004E1010EDB50200B06E00B0E76EC12F06B +:1008E000200EB5EC12F0020EDB6ADFBCDB80010EDD +:1008F000DBAC02D0020EDB8247EC11F0E8AE02D096 +:10090000003403D0E750D88000540BE20101645159 +:1009100005E0A5EC12F09AEC09F0E552400EBDECB2 +:1009200013F0030EE15C02E2E16AE552E16E7EEF54 +:100930000FF079EC0FF0FE0EDB5006E1F80E961684 :100940003C0E9416959808D0FE0EDB0405E1070EC8 -:100950009612C30E94129588A9EF0EF0D9CFE6FF38 +:100950009612C30E941295887EEF0FF0D9CFE6FF62 :10096000E1CFD9FFE652010EE66EE3DFE552809853 :10097000FE0EDBA00FD0839C808A0000839E0000C7 :10098000000000008450010BDF6E838E0000000029 @@ -33,1534 +33,1561 @@ :1009A000839E0000000000008450010BDF6E838EE8 :1009B00000000000DF04F4E0E552E552E7CFD9FF84 :1009C0001200D9CFE6FFE1CFD9FFE652FD0EDB5092 -:1009D000DF6EFE0EDBCFE6FFC1DFE552E66AA9DF80 -:1009E000E552FE0EDB50010B02E0000E01D0010EBD -:1009F000E8B0838CE8A0839CFE0EDB50020B02E083 -:100A0000000E01D0010EE8B0808AE8A0809A80989C -:100A100000008096D9CFE9FFDACFEAFFEF50010B53 -:100A200002E0848001D08490D9CFE9FFDACFEAFFD9 -:100A3000EF50020B02E0848201D08492D9CFE9FF0B -:100A4000DACFEAFFEF50040B02E0848401D08494F3 -:100A5000D9CFE9FFDACFEAFFEF50080B02E0838835 -:100A600001D08398D9CFE9FFDACFEAFFEF50100B1E -:100A700002E0828201D08292D9CFE9FFDACFEAFF89 -:100A8000EF50200B02E0828E01D0829ED9CFE9FF89 -:100A9000DACFEAFFEF50400B02E0828001D0829073 -:100AA000D9CFE9FFDACFEAFFEF50800B02E0828C6A -:100AB00001D0829C00000000808600000000E5520A -:100AC000E552E7CFD9FF1200D9CFE6FFE1CFD9FF3A -:100AD000020EE126FC0EDBCFDEFFDBCFDDFFFE0EDC -:100AE000DBCFE6FF3BDFE552E66A23DFE552FE0E91 -:100AF000DB50010B02E0000E01D0010EE8B0838C48 -:100B0000E8A0839CFE0EDB50020B02E0000E01D039 -:100B1000010EE8B0808AE8A0809A80880000809664 -:100B2000D9CFE9FFDACFEAFFEE52EF50010B02E036 -:100B3000848001D08490D9CFE9FFDACFEAFFEE526A -:100B4000EF50020B02E0848201D08492D9CFE9FFFA -:100B5000DACFEAFFEE52EF50040B02E0848401D0BA -:100B60008494D9CFE9FFDACFEAFFEE52EF50080BB9 -:100B700002E0838801D08398D9CFE9FFDACFEAFF7A -:100B8000EE52EF50100B02E0828201D08292D9CF58 -:100B9000E9FFDACFEAFFEE52EF50200B02E0828E3F -:100BA00001D0829ED9CFE9FFDACFEAFFEE52EF50B3 -:100BB000400B02E0828001D08290D9CFE9FFDACFEA -:100BC000EAFFEE52EF50800B02E0828C01D0829C53 -:100BD000000000008086000000008096D9CFE9FF69 -:100BE000DACFEAFFEF50010B02E0848001D084905D -:100BF000D9CFE9FFDACFEAFFEF50020B02E084829F -:100C000001D08492D9CFE9FFDACFEAFFEF50040B8D -:100C100002E0848401D08494D9CFE9FFDACFEAFFDF -:100C2000EF50080B02E0838801D08398D9CFE9FF09 -:100C3000DACFEAFFEF50100B02E0828201D08292FD -:100C4000D9CFE9FFDACFEAFFEF50200B02E0828E26 -:100C500001D0829ED9CFE9FFDACFEAFFEF50400BF7 -:100C600002E0828001D08290D9CFE9FFDACFEAFF9B -:100C7000EF50800B02E0828C01D0829C00000000CB -:100C8000808600000000020EE15C02E2E16AE552AB -:100C9000E16EE552E7CFD9FF1200D9CFE6FFE1CFF1 -:100CA000D9FF020EE126FE0EDB040DE0FE0EDB5046 -:100CB000020809E00C0EE66E04EC33F0E552F36A2C -:100CC000F46AAAD0A9D0FE0EDBCFE6FF47DEE552DC -:100CD000010EE66E2EDEE552FE0EDB50020B02E147 -:100CE000000E01D0010EE8B0838CE8A0839CFE0EBC -:100CF000DB50010B02E1000E01D0010EE8B0808A4A -:100D0000E8A0809A80880000839E00000000000018 -:100D10008450010B066E8450020B01E0010EE824A2 -:100D2000056E8450040B01E0010E040DF3CF04F0B6 -:100D30008350100B01E0010E080DF3CF03F0825039 -:100D4000020B01E0010E100DF3CF02F08250800B78 -:100D500001E0010E200DF3CF01F08250010B400D98 -:100D6000F3CF00F08250400B01E0010E800DF350F4 -:100D70000010011002100310041005100610E76E99 -:100D8000010EE7CFDBFF838E00000000839E000092 -:100D9000000000008450010B066E8450020B01E03D -:100DA000010EE824056E8450040B01E0010E040DD1 -:100DB000F3CF04F08350100B01E0010E080DF3CFC8 -:100DC00003F08250020B01E0010E100DF3CF02F090 -:100DD0008250800B01E0010E200DF3CF01F0825014 -:100DE000010B400DF3CF00F08250400B01E0010EEB -:100DF000800DF350001001100210031004100510B4 -:100E00000610DF6E838EDECF00F0DDCF01F000C074 -:100E1000F3FF01C0F4FF00D0020EE15C02E2E16AE0 -:100E2000E552E16EE552E7CFD9FF1200D9CFE6FFD8 -:100E3000E1CFD9FFE652DF6AFE0EDB040CE0FE0EC6 -:100E4000DB50020808E00C0EE66E04EC33F0E552CD -:100E5000000E61D060D0FE0EDBCFE6FF7FDDE552F5 -:100E6000010EE66E66DDE552FE0EDB50020B02E17E -:100E7000000E01D0010EE8B0838CE8A0839CFE0E2A -:100E8000DB50010B02E1000E01D0010EE8B0808AB8 -:100E9000E8A0809A80980000839E00000000000077 -:100EA0008450010B066E8450020B01E0010EE82411 -:100EB000056E8450040B01E0010E040DF3CF04F025 -:100EC0008350100B01E0010E080DF3CF03F08250A8 -:100ED000020B01E0010E100DF3CF02F08250800BE7 -:100EE00001E0010E200DF3CF01F08250010B400D07 -:100EF000F3CF00F08250400B01E0010E800DF35063 -:100F00000010011002100310041005100610DF6E0F -:100F1000838EDF5000D0E552E552E7CFD9FF1200B3 -:100F2000F9EC11F007E052EC10F004E00C0E9DEC2F -:100F300011F008D0FD0EDBCFE6FF67EC0FF0E552B5 -:100F4000E71402E1000E01D0010EA9EF0EF0A4ECAF -:100F50000EF01D0E5EEC0EF0FC0EDB1C006EFD0EA6 -:100F6000DB1C016E00C0E6FFE66E51EC0EF0A9EF4F -:100F70000EF0A4EC0EF01D0E5EEC0EF0000EC3ECB5 -:100F800011F0A9EF0EF0A4EC0EF067EC0FF084085E -:100F90000DE067EC0FF0C40809E0E66AC2EC12F05D -:100FA0006AEC10F037EC33F0E552EFD71C0E5EEC34 -:100FB0000EF0000EC3EC11F071EC10F067EC0FF0C6 -:100FC000800804E067EC0FF0C008E7E167EC0FF081 -:100FD000C00802E171EC10F01E0E5EEC0EF00F0E78 -:100FE000C3EC11F0E5EC12F0FA0EDBCFE6FFFB0EDE -:100FF0002BEC11F0F80EDBCFE6FFF90E2BEC11F025 -:10100000F60EDBCFE6FFF70E2BEC11F0040E5EECD4 -:101010000EF01A0E5EEC0EF0100EE66E270EE66E67 -:1010200051EC0EF00101546B556B566BA9EF0EF0AD -:10103000A4EC0EF0080EE126010EBAEC0EF0010E43 -:10104000E7CFDBFF020EFDEC11F0DF6E030EBAEC12 -:101050000EF0030EE7CFDBFF040EBAEC0EF0020E2B -:10106000E7CFDBFF050EBAEC0EF0050EE7CFDBFF96 -:10107000060EBAEC0EF0040EE7CFDBFF070EBAEC5B -:101080000EF0070EE7CFDBFF080EBAEC0EF03EECD9 -:101090000FF0010E56EC10F0090EBAEC0EF0010E36 -:1010A000E7CFDBFF0A0EFDEC11F0DF6E0B0EBAECA2 -:1010B0000EF0030EE7CFDBFF0C0EBAEC0EF0020EC3 -:1010C000E7CFDBFF0D0EBAEC0EF0050EE7CFDBFF2E -:1010D0000E0EBAEC0EF0040EE7CFDBFF0F0EBAECEB -:1010E0000EF0070EE7CFDBFF100EBAEC0EF03EEC71 -:1010F0000FF0020E56EC10F0020EE66E030EE66ED6 -:101100006AEC10F0010E76EC10F005E1020EE66ECE -:1011100076EC10F002E0000E01D0010E006E080E19 -:10112000E15C02E2E16AE552E16E0050A9EF0EF0E7 -:10113000A4EC0EF00C0EE12670EC0FF0D950F20F7B -:10114000C7EC11F0080EEECFDBFF090EEECFDBFF90 -:101150000A0EEECFDBFF0B0EEECFDBFF1F0E5EECB9 -:101160000EF0D1EC0FF000500110021003100CE053 -:101170002B0EC3EC11F00A0EDBCFE6FF0B0E2BECAF -:1011800011F07DEC10F003D00B0EE66EE66A51EC28 -:101190000EF0AAEC12F0BDEC0EF0F9EC0EF051ECF2 -:1011A0000EF0D9EC12F00C0EE15C02E2E16AE552BD -:1011B000E16EA9EF0EF0A4EC0EF00A0EE12698EC19 -:1011C0000FF070EC0FF0080EF36EDB6E090EF3CF2C -:1011D000DBFF1F0E5EEC0EF087EC0FF007E0D9503E -:1011E000080FE96EDACFEAFFEE8AED52F50EDB501A -:1011F000FF0807E1D950080FE96EDACFEAFFEE5297 -:10120000ED887DEC10F051EC0EF087EC0FF002E071 -:10121000AAEC12F0CFEC11F0030E2BEC11F0D9EC8C -:1012200012F00A0EE15C02E2E16AE552E16EA9EF1A -:101230000EF0A4EC0EF0F90EDBCFE6FFE66AE66AEC -:10124000E66AE66AD950FA0FC7EC11F0ABEC11F080 -:10125000C2EC12F0B0DF006E0A0EE15E0050A9EFA2 -:101260000EF0A4EC0EF0FE0EDBA00BD0010E43EC52 -:1012700010F02DC057F12EC058F12FC059F130C0D9 -:101280005AF1FE0EDBA20BD0020E43EC10F02DC083 -:101290005BF12EC05CF12FC05DF130C05EF1010149 -:1012A000546BB4EF11F0A4EC0EF01F0E5EEC0EF0D8 -:1012B000E5EC12F0B4EF11F0A4EC0EF0040EE12610 -:1012C000F90EDB500FE098EC0FF0210E5EEC0EF003 -:1012D000CFEC11F0030E2BEC11F0A2EC11F0C2ECEC -:1012E00012F023D0200E5EEC0EF0FE0EDBA20ED02C -:1012F000BDEC0EF05B0EE96E010E70EC11F0020E0B -:101300001EEC10F0020EE66E7FEC11F0FE0EDBA07C -:101310000ED0BDEC0EF0570EE96E010E70EC11F020 -:10132000010E1EEC10F0010EE66E7FEC11F0040EC3 -:10133000E15C02E2E16AE552E16EA9EF0EF0CCEC6D -:1013400011F006E052EC10F003E052EC0FF003D085 -:10135000080E02EC12F0040EE15C02E2E16AE552D2 -:10136000E16EA9EF0EF0CCEC11F006E052EC10F0BB -:1013700003E052EC0FF003D00A0E02EC12F0040E60 -:10138000E15C02E2E16AE552E16EA9EF0EF0CCEC1D -:1013900011F006E052EC10F003E052EC0FF003D035 -:1013A000070E02EC12F0040EE15C02E2E16AE55283 -:1013B000E16EA9EF0EF0CCEC11F006E052EC10F06B -:1013C00003E052EC0FF00BD00B0E5EEC0EF054EC81 -:1013D00011F0DEEC11F0DE6ADD6A82EC11F0040E31 -:1013E000E15C02E2E16AE552E16EA9EF0EF0F9EC90 -:1013F00011F006E052EC10F003E05EEC10F005D0C6 -:101400000D0E5EEC0EF054EC11F0A9EF0EF0F9ECBD -:1014100011F00FE1010E43EC10F0010157512D5C6A -:101420000A6E58512E580B6E59512F580C6E5A5146 -:1014300011D052EC10F032E1020E43EC10F0010139 -:101440005B512D5C0A6E5C512E580B6E5D512F580E -:101450000C6E5E5130580D6E0AC02DF00BC02EF090 -:101460000CC02FF0306E8EEC24F030EC0FF04BEC13 -:1014700012F03EEC25F02EC002F02FC003F030C079 -:1014800004F031C005F080EC0FF091EC25F0FEEC9B -:1014900025F02FC0F3FF30C0F4FF02D05EEC10F057 -:1014A000A9EF0EF0E5EC11F047EC12F0030E5CEC46 -:1014B0000FF0A9EF0EF0E5EC11F01FEC0FF0030EAA -:1014C0005CEC0FF0A9EF0EF0A4EC0EF095EC10F030 -:1014D0001FEC0FF0010EF9EC12F04DEC10F095EC52 -:1014E00010F059EC0FF07BEF11F0A4EC0EF095EC3E -:1014F00010F063EC0FF04DEC10F095EC10F01FECD9 -:101500000FF0020E7BEF11F0A4EC0EF01C0EE126A2 -:10151000F60EDB501EE0006A800E016E010E026EB8 -:10152000430E036E17EC13F0336A346AC80E356E3F -:10153000420E366E3EEC25F058EC12F0A9DB94EC2E -:1015400012F0FEEC25F0F70E2FC0DBFFF80E30C0D6 -:10155000DBFF59EC11F0E8DBE9EC11F00C6A800ECE -:101560000D6E010E0E6E430E0F6ED4EC12F054ECA5 -:1015700012F019EC11F022EC10F08ADB94EC12F06E -:101580002EC0DEFF2FC0DEFF30C0DEFF31C0DDFF2A -:10159000DD52DD52A9EC0FF080EC0FF091EC25F05C -:1015A00058EC12F0E9EC11F0106A800E116E010E89 -:1015B000126E430E136ED4EC12F027EC11F00BEC0C -:1015C00013F094EC12F0040E2EC0DBFF050E2FC0BA -:1015D000DBFF060E30C0DBFF070E31C0DBFFDECFC6 -:1015E0002EF0DECF2FF0DECF30F0DDCF31F0DD5248 -:1015F000DD52040EDBCF33F0050EDBCF34F0060EE8 -:10160000DBCF35F0070EEBEC12F0080E2EC0DBFF3F -:10161000090E2FC0DBFF0A0E30C0DBFF0B0E31C0FE -:10162000DBFF080EDBCF04F0090EDBCF05F00A0E5E -:10163000DBCF06F00B0EDBCF07F0336A346A356A76 -:10164000366A4DDB64EC26F0010A03E0D1EC0FF0C2 -:1016500013D0080EDBCF08F0090EDBCF09F00A0E1D -:10166000DBCF0AF00B0EDBCF0BF080EC0FF098EC29 -:1016700012F091EC25F019DB080E00C0DBFF090E1B -:1016800001C0DBFF0A0E02C0DBFF0B0E03C0DBFF55 -:1016900097DBACEC0FF08CEC10F0E8EC10F0F8EC11 -:1016A0000FF0046A056A066A400E076E5EEC11F0E0 -:1016B00054EC12F08CEC10F0BCEC12F0F6DA0C0EDC -:1016C000DBCF0CF00D0EDBCF0DF00E0EDBCF0EF0EE -:1016D0000F0EDBCF0FF026EC10F0DEEC0FF070DB1E -:1016E00058EC12F0FCEC12F0E8EC10F0AFEC0FF05C -:1016F000066A400E076EFCEC12F0BCEC12F005EC32 -:1017000012F026EC10F0EBEC0FF0140EDBCF08F02B -:10171000150EDBCF09F0160EDBCF0AF0170EF6DA46 -:101720000C0EDBCF14F00D0EDBCF15F00E0EDBCF61 -:1017300016F00F0EF2DAD9CFE9FFDACFEAFFEECFDB -:1017400020F0EECF21F0EECF22F0EFCF23F047ECE8 -:1017500011F0B9DB246E0D0EE15E2450180EDBCFC4 -:1017600008F0190EDBCF09F01A0EDBCF0AF01B0EC2 -:10177000CDDA100EDBCF14F0110EDBCF15F0120E08 -:10178000DBCF16F0130EC9DA040EDBCF20F0050E06 -:10179000DBCF21F0060EDBCF22F0070EDBCF23F0EC -:1017A00047EC11F086DBF9EC12F0246E0D0EE15ED1 -:1017B0002450CEEC12F01C0EE15C02E2E16AE5522C -:1017C000E16EC7D2C1DA3C0EE126C3DB22EC13F096 -:1017D00061EC12F098EC12F091EC25F0BDDB7DECA1 -:1017E00012F05EEC11F054EC12F034EC10F050DA20 -:1017F0002FEC11F04DDA73DAA8EC24F056DA336AE4 -:10180000346A800E19EC10F0380E2EC0DBFF390E52 -:101810002FC0DBFF3A0E30C0DBFF3B0E31C0DBFFD9 -:1018200022EC13F042DA58DB5EEC11F07DDA54DB87 -:10183000E9EC2DF0086E080EE15E0850080E2DC090 -:10184000DBFF090E2EC0DBFF0A0E2FC0DBFF0B0EE5 -:1018500030C0DBFFF60EDB5007E0D950F40FC7ECC9 -:1018600011F0EE50ED1039E1BCDA080EDBCF0EF0CE -:10187000090EDBCF0FF00A0EDBCF10F00B0EB0EC31 -:1018800010F0DFD963EC11F02E6A2F6A800E306EF3 -:10189000400E316E380EDBCF33F0390EDBCF34F033 -:1018A0003A0EDBCF35F03B0EA7EC11F0D9DA14DBA2 -:1018B0006EDB2DC002F02EC003F02FC004F030C04C -:1018C00005F02DC02EF0EEEC11F08DEC11F0EADDFC -:1018D0000A6E060EE15E0A50A3D1380EDBCF04F08B -:1018E000390EDBCF05F03A0EDBCF06F03B0EDBCF37 -:1018F00007F0C3DB25EC13F091EC25F08CEC10F035 -:1019000003EC13F0B6DAB0DB08EC12F07DEC12F069 -:10191000BFD9DCD9A8EC24F022DB0BEC12F059EC97 -:1019200011F027EC11F094EC12F055DB046A056A13 -:101930000BEC12F05EEC11F027EC11F094EC12F0CD -:101940001C0E2EC0DBFF1D0E2FC0DBFF1E0E30C095 -:10195000DBFF1F0E31C0DBFF1C0EDBCF00F01D0EC6 -:10196000DBCF01F01E0EDBCF02F01F0EDBCF03F04A -:10197000C7DA94EC12F0200E2EC0DBFF210E2FC030 -:10198000DBFF220E30C0DBFF230E31C0DBFFD9505E -:10199000180FE96EDACFEAFF240EEECFDBFF250E3B -:1019A000EECFDBFF260EEECFDBFF270EEECFDBFF09 -:1019B00059EC11F0B5EC12F0200EDBCF33F0210E14 -:1019C000DBCF34F0220EDBCF35F0230EF1EC12F03A -:1019D000280E2EC0DBFF290E2FC0DBFF2A0E30C0E1 -:1019E000DBFF2B0E31C0DBFF5EEC11F0B5EC12F02B -:1019F000240EDBCF33F0250EDBCF34F0260EDBCF09 -:101A000035F0270EF1EC12F02C0E2EC0DBFF2D0E60 -:101A10002FC0DBFF2E0E30C0DBFF2F0E31C0DBFFEF -:101A20002C0EDBCF04F02D0EDBCF05F02E0EDBCF1E -:101A300006F02F0EDBCF07F063DA51D991EC25F0D9 -:101A40003BEC11F0300E2EC0DBFF310E2FC0DBFF60 -:101A5000320E30C0DBFF330E31C0DBFF280EDBCF90 -:101A60002EF0290EDBCF2FF02A0EDBCF30F02B0E1D -:101A7000DBCF31F03BEC11F0340E2EC0DBFF350E26 -:101A80002FC0DBFF360E30C0DBFF370E31C0DBFF6F -:101A9000D950300F87D9D950340F84D9E9EC2DF0C3 -:101AA000006E080EE15E00500C0E2DC0DBFF0D0E27 -:101AB0002EC0DBFF0E0E2FC0DBFF0F0E30C0DBFF92 -:101AC000006A016A026A400E036E00C0E6FF01C0B0 -:101AD000E6FF02C0E6FFE66E9CD925EC13F0B2DA11 -:101AE000FBD998EC11F02DC014F02EC015F02FC0CA -:101AF00016F030C017F047EC12F0E9EC2DF0186E3C -:101B0000080EE15E1850E552E7CF03F0E552E7CF4B -:101B100002F0E552E7CF01F0E552E7CF00F02DC02B -:101B200004F02EC005F02FC006F030C007F026DA12 -:101B300094EC12F043DAF60EDB5002081FE186EC5B -:101B400012F0A7EC24F0C6EC12F0A8EC24F005D9B2 -:101B50005CDA060E2FC0DBFF070E30C0DBFF000E85 -:101B6000DFCF2FF0010EE0D8020ED3EC11F0D4DA63 -:101B700064DB040E2FC0DBFF050E35D021D995D8CC -:101B80000C0EDBCF04F00D0EDBCF05F00E0EDBCF1D -:101B900006F00F0EDBCF07F004C033F005C034F0C1 -:101BA00006C035F007C036F0A7EC24F021DA86EC49 -:101BB00012F0A8EC24F0C6EC12F0A7EC24F0CDD87B -:101BC00024DA040E2FC0DBFF050E30C0DBFF020E4F -:101BD000DBCF2FF0030EA8D8CEDB9EDA2EDB060E6D -:101BE0002FC0DBFF070E30C0DBFF2BD881D8040EDF -:101BF000DBCF2FF0050E88DA47EC12F0BCDB33D8D0 -:101C000062D9206E0D0EE15E205072D8060EDBCF39 -:101C10002FF0070E79DA4DD9C6DB25D84AD94CD931 -:101C20003C0EE15C02E2E16AE552E16E92D0010E07 -:101C30000101561505E0020E561502E0556B010C28 -:101C4000000CF5DF0009FDE0120001015551120002 -:101C5000FCEC12F04BEC12F0A5DA30DB55DA47EC75 -:101C600012F027DB8ED32EC01CF02FC01DF030C029 -:101C70001EF031C01FF04BEC12F028EC13F02DC019 -:101C800018F02EC019F02FC01AF030C01BF012004F -:101C90002EC033F02FC034F030C035F031C036F0F4 -:101CA0001200C2EC12F07FEF11F02EC000F02FC036 -:101CB00001F030C002F031C003F01200E66EC2EC59 -:101CC00012F0E1EC04F0E552E552120000C02EF0F3 -:101CD00001C02FF002C030F003C031F0120004C088 -:101CE0002EF005C02FF006C030F007C031F0120012 -:101CF00017EC13F0D0DBD2EF10F0D6DA5FDBD4DADA -:101D0000F3CFDEFFF4CFDDFF82EF11F0DBCF0BF07E -:101D1000C2DB98EC12F0D2EF10F0DBCF17F0BBDB98 -:101D20009EDAD9DB47EF12F0BFDB58EF12F002C0AA -:101D30002EF054DBA7EC24F0F0DA64EC0AF0126E1B -:101D4000060EE15E12501200D9CFE6FFE1CFD9FFB7 -:101D50001200E552E7CFD9FF1200100EDBCF33F0AF -:101D6000110EDBCF34F0120EDBCF35F0130EEFDAAD -:101D7000FEEF25F042DBE76E1200FA0EDBCF00F03B -:101D8000FB0EDBCF01F0FC0EDBCF02F0FD0EDBCF54 -:101D900003F0000E006C011E0122021E0222031E2F -:101DA00003221200E96EDACFEAFFABEF11F00CC0AC -:101DB0002EF00DC02FF00EC030F00FC031F0120029 -:101DC0002E6A2F6A306A400E316E080EDBCF33F078 -:101DD000090EDBCF34F00A0EDBCF35F00B0EA7EF88 -:101DE00011F071DA026A036AB40E046E420E056ED7 -:101DF000120000C0DFFF010E01C0DBFF020E02C0B7 -:101E0000DBFF030E03C0DBFFCADA030EDBCFE6FF06 -:101E10001200140EDBCF0CF0150EDBCF0DF0160EFA -:101E2000DBCF0EF0170EDBCF0FF01200350E336E46 -:101E3000FA0E346E0E0E356E3C0E366E1200000E2B -:101E4000186C191E19221A1E1A221B1E1B2218C0DA -:101E5000E6FF19C0E6FF1AC0E6FF1BC0E6FF12004E -:101E60002EC006F02FC007F030C008F031C009F0D6 -:101E70001200F40EDBCF2FF0F50E83D2060EE7CF63 -:101E8000DBFFDBCFE6FF070EDBCFE6FF040EDBCF89 -:101E9000E6FF050EDBCFE6FF82DA030EDBCFE6FFBF -:101EA000A2EF11F00C0E49DA2D6A2E6A2F6A306A01 -:101EB0001200EDDA020E12009CDB206E0D0EE15EC8 -:101EC0002050CEEF12F0E3DA010EF9EF12F05ADBF8 -:101ED00016EC07F0E5521200AEDB31C0E6FF12004F -:101EE000D950F60F54DA040EEECFDBFF050EEECF1D -:101EF000DBFF060EEECFDBFF070EEECFDBFF12009F -:101F0000336A346A800E356EBF0E366E1200040ED0 -:101F1000DBCF00F0050EDBCF01F0060EDBCF02F0C9 -:101F2000070EDBCF03F00050011002100310120067 -:101F3000D9CFE9FFDACFEAFFFA0EDBCFEEFFFB0ED7 -:101F4000DBCFEEFFFC0EDBCFEEFFFD0EDBCFEEFFB7 -:101F5000120078DB8CEF10F0ABDAB0D912D2140E8D -:101F60002EC0DBFF150E2FC0DBFF160E30C0DBFFCF -:101F7000170E31C0DBFF046A056A12002DC033F072 -:101F80002EC034F02FC035F030C036F0120003EC14 -:101F90002AF0E5522AD3336A346A356A400E366E27 -:101FA0001200080EDBCF00F0090EDBCF01F00A0EA5 -:101FB000DBCF02F00B0EDBCF03F01200100E2EC0B1 -:101FC000DBFF110E2FC0DBFF120E30C0DBFF130E44 -:101FD00031C0DBFF1200180E2EC0DBFF190E2FC020 -:101FE000DBFF1A0E30C0DBFF1B0E31C0DBFF12001F -:101FF0000C0E2EC0DBFF0D0E2FC0DBFF0E0E30C00F -:10200000DBFF0F0E31C0DBFF1200020E2FC0DBFF23 -:10201000030E30C0DBFFF90EDBCF2FF0FA0EDBCF63 -:1020200030F01200356E430E366E1200A7EC07F04A -:10203000DCD2356E400E366E3EEF25F0E66E5FD98F -:10204000A2EF11F0A7EC24F08CEF10F00CC033F0ED -:102050000DC034F00EC035F00FC036F0A7EF24F0FD -:10206000336A800E346E12002EC018F02FC019F0A3 -:1020700030C01AF031C01BF012000C6A0D6A0E6AF3 -:10208000400E0F6E1200E66EB3EC09F0E55212003E -:10209000040EE126FE0EDB041200286E0D0EE15E3A -:1020A00028501200FE0EDB5002081200E66EC3EC50 -:1020B00007F0006E090EE15E005012000C0E3DD9D3 -:1020C000F36AF46A1200020EDBCF00F0000EE76E36 -:1020D00000181200E1EC04F0E552E552020EE66E43 -:1020E000120050DAB9EC07F0E5521200E66E90ECFF -:1020F00007F0E552E55200091200080EDBCFE6FFBB -:10210000090EDBCFE6FF1200CFD9F7D9C4D991EC85 -:1021100025F017DA6BEF12F02EC008F02FC009F08F -:1021200030C00AF031C00BF0120092DD2EC024F056 -:102130002FC025F030C026F031C027F077DE91ECBB -:1021400025F02EC020F02FC021F030C022F031C089 -:1021500023F086DF810E66DF91EC25F033EF0EF081 -:10216000DBCF11F0336A346A340E5CDF0EC02EF020 -:102170000FC02FF010C030F011C031F091EC25F0FD -:102180002EC00AF02FC00BF030C00CF031C00DF0A3 -:10219000DB0E336E0F0E346E490E4BDF61DE78DDE1 -:1021A00097EF0EF091EC25F083D9CC0E336EBC0E78 -:1021B000346E8C0E356E3B0E366E4ADA2DC000F052 -:1021C0002EC001F02FC002F030C003F047EF12F034 -:1021D000D3D96BDD106A116A800E126E3F0E136E3A -:1021E000080EDBCF14F0090EDBCF15F00A0EDBCFA3 -:1021F00016F00B0EDBCF17F014C033F015C034F01F -:1022000016C035F017C036F006DA60DD3EEF25F077 -:10221000140EDBCF00F0150EDBCF01F0160EDBCF76 -:1022200002F0170EDBCF03F01BDF010EFBDE66EFC3 -:102230000EF087D92DDDD7EF0EF0E5D9F90EDBCF03 -:102240002FF0FA0E31D93DD96FD9FEEF25F02CD9F8 -:1022500054D948EF0EF0DBCFE6FF51EF0EF014C07B -:102260002EF015C02FF016C030F017C031F091ECF1 -:1022700025F0A1EF12F0140EDBCF33F0150EDBCFFB -:1022800034F0160EDBCF35F0170EEBEF12F0CEDD8B -:1022900020C02EF021C02FF022C030F023C031F03A -:1022A00091EC25F033EF0EF06DD94DEC06F0E552D0 -:1022B0001200FD0EDBCF2FF0FE0E1200FB0EDBCF67 -:1022C0002FF0FC0E1200F70EDBCFE6FFF80EDBCF8F -:1022D000E6FFF90EDBCFE6FFFA0EDBCFE6FF1200DA -:1022E000EA6EEE500026EE500122EE500222EE5031 -:1022F0000322F9EF0EF07DD9D0DE50D92AD564EC57 -:1023000005F073D1DECF2DF0DECF2EF0DECF2FF033 -:10231000DDCF30F0DD52DD521200FEEC25F02FC093 -:1023200000F030C001F02FC0E6FF30C0E6FF120021 -:10233000D950380F37DDC7EF0FF0E66E04EC33F0FD -:10234000E5521200DECFE6FFDDCFE6FF1200DBCF65 -:1023500036F091EF25F0EECFE6FFEECFE6FFEECFC1 -:10236000E6FFEFCFE6FF1200010EA8DC0101010E2F -:10237000556F566BEED4000EDFCF2FF0010E54EFE9 -:1023800012F054EF12F0E66EE66A51EF0EF0E96ECD -:10239000FF0EDA20EA6E1200D7DC48EF10F0020ED2 -:1023A000DBCFE6FF1200DBCF2FF0030E54EF12F06D -:1023B000E66EE66A030EE66E16EF10F0020EF3CF3D -:1023C000DBFF030EF4CFDBFF1200BEDC41DC33EF9A -:1023D0000EF0E1DD91EC25F055EF0EF003C02FF08B -:1023E00004C030F005C031F0120052DC6FDCA7EF02 -:1023F00024F0AADCFE0EDB041200E66E56EC32F08E -:10240000E55212005BDC7DEF0EF04FDC09EF0FF0C0 -:10241000C2DD3EEF25F0800E066E3F0E076E2DDE0C -:1024200004C0E6FF05C0E6FF06C0E6FF07C0E6FF02 -:102430000CC0E6FF0DC0E6FF0EC0E6FFE66E78DFDB -:10244000E552E7CF0FF0E552E7CF0EF0E552E7CFC8 -:102450000DF0E552E7CF0CF0E552E7CF07F0E5527B -:10246000E7CF06F0E552E7CF05F0E552E7CF04F0FD -:102470002DC010F02EC011F02FC012F030C013F09C -:102480007DDD95DC91EC25F047DE03EF13F02DC0E8 -:10249000E6FF1BEF13F0330E336EE20E346EC20E06 -:1024A000356E420E366E1200DBCF30F079EF24F03D -:1024B0002EC004F02FC005F030C006F031C007F088 -:1024C00012002EC00CF02FC00DF030C00EF031C045 -:1024D0000FF048EF0EF0BD0E336E370E346E860EE1 -:1024E000356E410E366EB4D82DC00CF02EC00DF0F6 -:1024F0002FC00EF030C00FF012002EC014F02FC00D -:1025000015F030C016F031C017F012006ADC0C0E66 -:10251000DBCF0EF00D0EDBCF0FF00E0EDBCF10F089 -:102520000F0E1EDE08EF11F066EC0EF091EF25F0B5 -:1025300008C02EF009C02FF00AC030F00BC031F0F7 -:1025400012002EC010F02FC011F030C012F031C0B8 -:1025500013F01200060EDBCFE6FF070E7CDE040E42 -:10256000DBCFE6FF050E2BEF11F094EC0EF050DF01 -:102570004CDF6BD8A7EF24F048EC0EF06FEC0EF0B8 -:1025800091EF25F0FE0EDBCFE6FF1200ADEC0EF072 -:102590002FC0DEFF30C0DDFF08EF11F0030EE66E46 -:1025A00031EC09F0E5521200F70EDBCF2FF0F80EF8 -:1025B0001200C8DE51EC0EF00101010E546F120042 -:1025C000E66EE66AECDE16EF10F0FC0EDBCFE6FFFF -:1025D000FD0E2BEF11F0DBCF36F03EEC25F055EF82 -:1025E0000EF0B5DE99DDF5EF11F0E552E552E5525A -:1025F0001200E66E98EF08F0F90EDBCF2FF0FA0E1E -:1026000053DF8CEF10F048EC0EF06FEC0EF03EEC68 -:1026100025F055EF0EF010C02EF011C02FF012C0B3 -:1026200030F013C031F0A8EC24F061EF12F0BCDF01 -:102630003BDF8CEF10F02EC0E6FF2FC0E6FF30C06E -:10264000E6FF120036DE54EF12F013DC19EF11F042 -:0826500091EC25F02DEF26F0BE -:08265800DACFE4FFE2CFDAFF64 -:10266000E9CFE4FFEACFE4FFF6CFE4FFF7CFE4FFE2 -:10267000F5CFE4FFF3CFE4FFF4CFE4FFFACFE4FFBC -:1026800000EE29F0140EE80403E3EECFE4FFFBD7DD -:1026900000EE00F0290EE80403E3EECFE4FFFBD7E1 -:1026A000A9EC1EF09EA013D0B3EC1EF001014D2B3F -:1026B000000E4E23E80E4D5D030E4E5905E34D6BA3 -:1026C0004E6B4F2B000E502324EC2CF09E90BCEC54 -:1026D0001EF002E2E16AE552E16EE552E7CFD9FF72 -:1026E000E55200EE28F0290EE80403E3E5CFEDFF04 -:1026F000FBD700EE3CF0140EE80403E3E5CFEDFF5A -:10270000FBD7E5CFFAFFE5CFF4FFE5CFF3FFE5CF49 -:10271000F5FFE5CFF7FFE5CFF6FFE5CFEAFFE5CF21 -:10272000E9FFE5CFDAFF1100D8CFE4FFE0CFE4FF07 -:10273000E46EDACFE4FFE2CFDAFFF3CFE4FFF4CFC9 -:10274000E4FFA9EC1EF0BCEC1EF002E2E16AE552E7 -:10275000E16EE552E7CFD9FFE552E5CFF4FFE5CFD3 -:10276000F3FFE5CFDAFFE550E5CFE0FFE5CFD8FF97 -:10277000100004D807EC1FF062D8FCD70F0EC1126E -:1027800002D8D1EF1EF0CCEC1EF0E65280EC1EF029 -:102790000101696F070E695D10E1E66A56EC32F0DF -:1027A000E552DF6E000EDF80C4EC1EF0E66A37EC07 -:1027B00033F0E552DF70C4EC1EF01C0E9316D08E81 -:1027C000F28EF28CF30E8C1695160101476B486B56 -:1027D000496B4A6B010E4B6F929480949398819849 -:1027E0000D0EE66E7C0EE66EE10EE66EC9EC31F083 -:1027F000E552E552E552C70E921694943F0E951697 -:10280000010EE66E99EC04F0E552838C808A828496 -:102810008088838E80868294010EE66E72EC33F09F -:10282000E55282849D80C50EE66EC7EC32F0E5521B -:10283000B3EC1EF0E552E552E7CFD9FF1200D9CF35 -:10284000E6FFE1CFD9FF0F0EE12601014B5102E077 -:10285000C5EC1DF0200E0101005D03E36D50020B7D -:1028600012E025EC0EF000090CE0E66A010EE66EBF -:10287000030EE66E53EC09F0E552E552E55221EC09 -:102880000EF0BBEF1DF02EEC04F0010149514A118E -:1028900002E1000E08D049C1E9FF4AC1EAFFEF504A -:1028A000800B01E0010E000947E101014651EA6A8F -:1028B000260FE96E010EEA22EF5000083DE2050105 -:1028C000406B01014C514C2B0501416F0501040E79 -:1028D000426F01014651EA6A260FE96E010EEA22B3 -:1028E000EFCF43F5400EE66E400EE66E050EE66E47 -:1028F000010EE66E010EE66E22EC23F0006E050E70 -:10290000E15E0050F3CF49F1F4CF4AF101014651A5 -:10291000EA6A260FE96E010EEA22EF6A01014651CA -:10292000000803E20101460707D0010145510008F4 -:1029300003E201011F0E466F010149514A1102E1F4 -:10294000000E08D049C1E9FF4AC1EAFFEF50800BF1 -:1029500001E0010E00092BE125EC0EF0000927E053 -:1029600017EC0EF0000923E00501406B01014C510A -:102970004C2B0501416F05010A0E426F0501436BA7 -:102980000501010E486F400EE66E400EE66E050E24 -:10299000E66E010EE66E010EE66E22EC23F0006E8E -:1029A000050EE15E0050F3CF49F1F4CF4AF1010189 -:1029B0005151020A10E0030A01E021D0030EE66E35 -:1029C0007BEC2DF0E55218EC08F0000903E0010162 -:1029D000020E516F16D0200EE66E030EE66EC80E84 -:1029E000E66EE66AE80EE66E030EE66E52EC0AF05C -:1029F000006E060EE15E00500101516B02D0010134 -:102A0000516B01014751481102E1000E08D047C146 -:102A1000E9FF48C1EAFFEF50800B01E0010E000919 -:102A200002E0BBEF1DF005010251070A02E11CEFB5 -:102A30001DF00D0A01E16AD2010A01E12AD20D0A54 -:102A400001E1C2D1040A1AE0030A07E0010A02E028 -:102A50007AEF1DF0FF00BBEF1DF0E66A56EC32F096 -:102A6000E552DF6E000EDB80DFCFE6FFE66A36EC74 -:102A700032F0E552E552FF00BBEF1DF00101495174 -:102A80004A1102E1000E08D049C1E9FF4AC1EAFF3C -:102A9000EF50800B01E0010E000901E093D100C569 -:102AA00040F50501416B0501030E426F0501436BC3 -:102AB00005010851100A01E138D11F0A01E1FAD0DD -:102AC000080A01E1BCD0010A01E17ED0020A71E0EE -:102AD000070A64E0010A20E0030A06E0010A01E0B7 -:102AE00047D169C148F547D10501486B690E006EB1 -:102AF000650E016E026A00C0E6FF01C0E6FF02C07B -:102B0000E6FF480EE66E050EE66E1AEC32F0036E36 -:102B1000050EE15E03502FD10501486B5D0E006E7E -:102B2000650E016E026A00C0E6FF01C0E6FF02C04A -:102B3000E6FF480EE66E050EE66E1AEC32F0036E06 -:102B4000050EE15E03505B0E006E650E016E026ABB -:102B500000C0E6FF01C0E6FF02C0E6FF480EE66ED9 -:102B6000050EE66E1AEC32F0036E050EE15E0350C0 -:102B7000520E006E650E016E026A00C0E6FF01C0D3 -:102B8000E6FF02C0E6FF480EE66E050EE66E1AECA2 -:102B900032F0036E050EE15E0350EDD092CF48F5A2 -:102BA00093CF49F594CF4AF595CF4BF596CF4CF599 -:102BB000E2D080CF48F581CF49F582CF4AF583CF67 -:102BC0004BF584CF4CF5D7D0010EE66ECAEC2CF055 -:102BD000E552010E2DC0DBFF020E2EC0DBFF030EFF -:102BE0002FC0DBFF040E30C0DBFF040EDBCF48F547 -:102BF000030EDBCF49F5020EDBCF4AF5010EDBCF2A -:102C00004BF5020EE66ECAEC2CF0E552010E2DC01B -:102C1000DBFF020E2EC0DBFF030E2FC0DBFF040E16 -:102C200030C0DBFF040EDBCF4CF5030EDBCF4DF5E0 -:102C3000020EDBCF4EF5010EDBCF4FF59CD0010E1F -:102C4000E66EB3EC09F0E552010E2DC0DBFF020E7B -:102C50002EC0DBFF030E2FC0DBFF040E30C0DBFFF6 -:102C6000040EDBCF48F5030EDBCF49F5020EDBCFB8 -:102C70004AF5010EDBCF4BF5020EE66EB3EC09F020 -:102C8000E552010E2DC0DBFF020E2EC0DBFF030E4E -:102C90002FC0DBFF040E30C0DBFF040EDBCF4CF592 -:102CA000030EDBCF4DF5020EDBCF4EF5010EDBCF71 -:102CB0004FF561D0010EE66EDBEC09F0E552010E36 -:102CC0002DC0DBFF020E2EC0DBFF030E2FC0DBFF8B -:102CD000040E30C0DBFF040EDBCF48F5030EDBCF64 -:102CE00049F5020EDBCF4AF5010EDBCF4BF5020EA4 -:102CF000E66EDBEC09F0E552010E2DC0DBFF020EA3 -:102D00002EC0DBFF030E2FC0DBFF040E30C0DBFF45 -:102D1000040EDBCF4CF5030EDBCF4DF5020EDBCFFF -:102D20004EF5010EDBCF4FF526D0010EE66EF7EC27 -:102D300009F0E552050EF3CFDBFF060EF4CFDBFF03 -:102D4000060EDBCF48F5050EDBCF49F5020EE66E29 -:102D5000F7EC09F0E552050EF3CFDBFF060EF4CFDA -:102D6000DBFF060EDBCF4AF5050EDBCF4BF503D0BC -:102D70000501020E436F400EE66E400EE66E050E34 -:102D8000E66E010EE66E010EE66E22EC23F0006E9A -:102D9000050EE15E0050F3CF49F1F4CF4AF1400E49 -:102DA000E66E000EE66E050EE66EE66A010EE66E53 -:102DB00022EC23F0006E050EE15E0050F3CF47F1E8 -:102DC000F4CF48F1BBEF1DF005010851030A37E0CD -:102DD000010A25E0030A13E0010A01E040D00501E1 -:102DE0000951921205010A51931205010B519412D7 -:102DF00005010C51951205010D51961235D00501B2 -:102E0000091D921605010A1D931605010B1D941646 -:102E100005010C1D951605010D1D961625D0050101 -:102E2000091D891605010A1D8A1605010B1D8B1641 -:102E300005010C1D8C1605010D1D8D1615D0050103 -:102E40000951891205010A518A1205010B518B1291 -:102E500005010C518C1205010D518D1205D0030E88 -:102E6000E66E04EC33F0E552400EE66E000EE66EC0 -:102E7000050EE66EE66A010EE66E22EC23F0006EA9 -:102E8000050EE15E0050F3CF47F1F4CF48F1BBEF00 -:102E90001DF005010851020A09E0030A01E01CD0F7 -:102EA00009C5E6FF7BEC2DF0E5521BD009C5E6FF16 -:102EB00082EC2DF0E55225EC0EF000090CE0E66AFC -:102EC000010EE66E030EE66E53EC09F0E552E55294 -:102ED000E55221EC0EF005D0010EE66E04EC33F065 -:102EE000E552400EE66E000EE66E050EE66EE66AF0 -:102EF000010EE66E22EC23F0006E050EE15E00503E -:102F0000F3CF47F1F4CF48F1BBEF1DF005010851B5 -:102F1000060A02E1DBEF1CF0080A02E19BEF1CF05D -:102F2000030A02E195EF1CF0070A02E136EF1CF0FC -:102F3000030A01E1E8D3010A01E1FAD20F0A01E133 -:102F4000E3D2020A01E19BD2150A01E15FD2140A21 -:102F500001E131D2070A01E103D2010A01E1D5D131 -:102F6000030A01E1A7D1010A01E1A1D10C0A01E1A3 -:102F700027D1030A01E195D0040A02E003EF1DF016 -:102F80000501090504E0030E0501095D40E10AC5DC -:102F9000E6FF010EE66E36EC32F0E552E5520BC567 -:102FA000E6FF020EE66E36EC32F0E552E5520CC555 -:102FB000E6FF030EE66E36EC32F0E552E5520DC543 -:102FC000E6FF040EE66E36EC32F0E552E5520EC531 -:102FD000E6FF050EE66E36EC32F0E552E5520FC51F -:102FE000E6FF060EE66E36EC32F0E552E55210C50D -:102FF000E6FF070EE66E36EC32F0E552E55211C5FB -:10300000E6FF080EE66E36EC32F0E552E552020EAF -:103010000501095D04E0030E0501095D40E10AC5F3 -:10302000E6FF090EE66E36EC32F0E552E5520BC5CE -:10303000E6FF0A0EE66E36EC32F0E552E5520CC5BC -:10304000E6FF0B0EE66E36EC32F0E552E5520DC5AA -:10305000E6FF0C0EE66E36EC32F0E552E5520EC598 -:10306000E6FF0D0EE66E36EC32F0E552E5520FC586 -:10307000E6FF0E0EE66E36EC32F0E552E55210C574 -:10308000E6FF0F0EE66E36EC32F0E552E55211C562 -:10309000E6FF100EE66E36EC32F0E552E55208EF30 -:1030A0001DF000C540F50501416B0501030E426F9F -:1030B0000501436B010EE66E56EC32F0E552050158 -:1030C000486F020EE66E56EC32F0E5520501496F8C -:1030D000030EE66E56EC32F0E55205014A6F040E1F -:1030E000E66E56EC32F0E55205014B6F050EE66ECA -:1030F00056EC32F0E55205014C6F060EE66E56ECCA -:1031000032F0E55205014D6F070EE66E56EC32F0D7 -:10311000E55205014E6F080EE66E56EC32F0E552B0 -:1031200005014F6F090EE66E56EC32F0E5520501CF -:10313000506F0A0EE66E56EC32F0E5520501516F03 -:103140000B0EE66E56EC32F0E5520501526F0C0E96 -:10315000E66E56EC32F0E5520501536F0D0EE66E49 -:1031600056EC32F0E5520501546F0E0EE66E56EC49 -:1031700032F0E5520501556F0F0EE66E56EC32F057 -:10318000E5520501566F100EE66E56EC32F0E55230 -:103190000501576F400EE66E400EE66E050EE66EB8 -:1031A000010EE66E010EE66E22EC23F0006E050EB7 -:1031B000E15E0050F3CF49F1F4CF4AF108EF1DF082 -:1031C000E66A010EE66E36EC32F0E552E552010E8B -:1031D000E66E020EE66E36EC32F0E552E552E66A35 -:1031E000030EE66E36EC32F0E552E552E66A040E66 -:1031F000E66E36EC32F0E552E552E66A050EE66E12 -:1032000036EC32F0E552E552E66A060EE66E36EC32 -:1032100032F0E552E552030EE66E070EE66E36EC2E -:1032200032F0E552E552E80EE66E080EE66E36EC38 -:1032300032F0E552E552E66A090EE66E36EC32F0FF -:10324000E552E552010EE66E0A0EE66E36EC32F0FD -:10325000E552E552E66A0B0EE66E36EC32F0E552C8 -:10326000E552E66A0C0EE66E36EC32F0E552E552B7 -:10327000E66A0D0EE66E36EC32F0E552E552E66A8D -:103280000E0EE66E36EC32F0E552E552030EE66EB7 -:103290000F0EE66E36EC32F0E552E552E80EE66EC1 -:1032A000100EE66E36EC32F0E552E552B1D318EC72 -:1032B00008F0AED3060E09C5DBFF050E0AC5DBFF1D -:1032C000080E0BC5DBFF070E0CC5DBFF0A0E0DC594 -:1032D000DBFF090E0EC5DBFF090EDBCFE6FF0A0E92 -:1032E000DBCFE6FF070EDBCFE6FF080EDBCFE6FF06 -:1032F000050EDBCFE6FF060EDBCFE6FF52EC0AF051 -:10330000006E060EE15E005083D3060E09C5DBFF9A -:10331000050E0AC5DBFF080E0BC5DBFF070E0CC54B -:10332000DBFF0A0E0DC5DBFF090E0EC5DBFF090E24 -:10333000DBCFE6FF0A0EDBCFE6FF070EDBCFE6FFB3 -:10334000080EDBCFE6FF050EDBCFE6FF060EDBCF78 -:10335000E6FF5BEC0AF0006E060EE15E005058D30B -:10336000060E09C5DBFF050E0AC5DBFF080E0BC5FF -:10337000DBFF070E0CC5DBFF0A0E0DC5DBFF090ED8 -:103380000EC5DBFF090EDBCFE6FF0A0EDBCFE6FF43 -:10339000070EDBCFE6FF080EDBCFE6FF050EDBCF27 -:1033A000E6FF060EDBCFE6FF64EC0AF0006E060EC9 -:1033B000E15E00502DD3060E09C5DBFF050E0AC5E0 -:1033C000DBFF080E0BC5DBFF070E0CC5DBFF0A0E8B -:1033D0000DC5DBFF090E0EC5DBFF090EDBCFE6FFD7 -:1033E0000A0EDBCFE6FF070EDBCFE6FF080EDBCFD2 -:1033F000E6FF050EDBCFE6FF060EDBCFE6FF75EC42 -:103400000AF0006E060EE15E005002D3060E09C5FA -:10341000DBFF050E0AC5DBFF080E0BC5DBFF070E41 -:103420000CC5DBFF0A0E0DC5DBFF090E0EC5DBFF69 -:103430000C0E0FC5DBFF0B0E10C5DBFF11C5E6FF41 -:103440000B0EDBCFE6FF0C0EDBCFE6FF090EDBCF6A -:10345000E6FF0A0EDBCFE6FF070EDBCFE6FF080E26 -:10346000DBCFE6FF050EDBCFE6FF060EDBCFE6FF88 -:1034700084EC0AF0006E090EE15E0050C9D2060E1F -:1034800009C5DBFF050E0AC5DBFF080E0BC5DBFF18 -:10349000070E0CC5DBFF0A0E0DC5DBFF090E0EC5BE -:1034A000DBFF0C0E0FC5DBFF0B0E10C5DBFF0E0E96 -:1034B00012C5DBFF0D0E13C5DBFF0D0EDBCFE6FFE4 -:1034C0000E0EDBCFE6FF11C5E6FF0B0EDBCFE6FFEE -:1034D0000C0EDBCFE6FF090EDBCFE6FF0A0EDBCFDB -:1034E000E6FF070EDBCFE6FF080EDBCFE6FF050E9B -:1034F000DBCFE6FF060EDBCFE6FFE2EC0BF0006E63 -:103500000B0EE15E005084D2060E0AC5DBFF050EED -:103510000BC5DBFF050EDBCFE6FF060EDBCFE6FFBC -:1035200009C5E6FF53EC09F0E552E552E55270D2C9 -:10353000060E0AC5DBFF050E0BC5DBFF080E0CC52A -:10354000DBFF070E0DC5DBFF0A0E0EC5DBFF090E04 -:103550000FC5DBFF090EDBCF2FF00A0EDBCF30F0FB -:1035600077EC24F02EC008F02FC009F030C00AF02C -:1035700031C00BF0330E336EE20E346EC20E356E78 -:10358000420E366E08C02EF009C02FF00AC030F08F -:103590000BC031F091EC25F02EC004F02FC005F0E7 -:1035A00030C006F031C007F0CC0E336EBC0E346E66 -:1035B0008C0E356E3B0E366E04C02EF005C02FF01B -:1035C00006C030F007C031F091EC25F02DEC26F06C -:1035D0002DC000F02EC001F02FC002F030C003F06B -:1035E00000C0E6FF01C0E6FF02C0E6FF03C0E6FF41 -:1035F000070EDBCF2FF0080EDBCF30F077EC24F096 -:103600002EC014F02FC015F030C016F031C017F0E6 -:10361000330E336EE20E346EC20E356E420E366ECF -:1036200014C02EF015C02FF016C030F017C031F0C6 -:1036300091EC25F02EC010F02FC011F030C012F028 -:1036400031C013F0BD0E336E370E346E860E356EFC -:10365000410E366E10C02EF011C02FF012C030F0A7 -:1036600013C031F091EC25F02DEC26F02DC00CF0BC -:103670002EC00DF02FC00EF030C00FF00CC0E6FFD2 -:103680000DC0E6FF0EC0E6FF0FC0E6FF050EDBCF64 -:103690002FF0060EDBCF30F077EC24F02EC01CF0BC -:1036A0002FC01DF030C01EF031C01FF0330E336E3E -:1036B000E20E346EC20E356E420E366E1CC02EF017 -:1036C0001DC02FF01EC030F01FC031F091EC25F06E -:1036D0002DEC26F02DC018F02EC019F02FC01AF0D6 -:1036E00030C01BF018C0E6FF19C0E6FF1AC0E6FFA5 -:1036F0001BC0E6FF09C5E6FF98EC08F0206E0D0E32 -:10370000E15E205085D1060E0AC5DBFF050E0BC514 -:10371000DBFF080E0CC5DBFF070E0DC5DBFF0EC57A -:10372000E6FF070EDBCF2FF0080EDBCF30F077EC93 -:1037300024F02EC008F02FC009F030C00AF031C0CC -:103740000BF0330E336EE20E346EC20E356E420E47 -:10375000366E08C02EF009C02FF00AC030F00BC042 -:1037600031F091EC25F02EC004F02FC005F030C0F0 -:1037700006F031C007F0CC0E336EBC0E346E8C0EEA -:10378000356E3B0E366E04C02EF005C02FF006C01D -:1037900030F007C031F091EC25F02DEC26F02DC073 -:1037A00000F02EC001F02FC002F030C003F000C0C6 -:1037B000E6FF01C0E6FF02C0E6FF03C0E6FF050E1C -:1037C000DBCF2FF0060EDBCF30F077EC24F02EC0ED -:1037D00014F02FC015F030C016F031C017F0330EC2 -:1037E000336EE20E346EC20E356E420E366E14C06B -:1037F0002EF015C02FF016C030F017C031F091EC4C -:1038000025F02EC010F02FC011F030C012F031C0E2 -:1038100013F0BD0E336E370E346E860E356E410ECC -:10382000366E10C02EF011C02FF012C030F013C051 -:1038300031F091EC25F02DEC26F02DC00CF02EC0CF -:103840000DF02FC00EF030C00FF00CC0E6FF0DC021 -:10385000E6FF0EC0E6FF0FC0E6FF09C5E6FFDBECA2 -:1038600008F0186E0A0EE15E1850D2D0060E0AC596 -:10387000DBFF050E0BC5DBFF0CC5E6FF050EDBCF3E -:103880002FF0060EDBCF30F077EC24F02EC008F0DE -:103890002FC009F030C00AF031C00BF0330E336E88 -:1038A000E20E346EC20E356E420E366E08C02EF039 -:1038B00009C02FF00AC030F00BC031F091EC25F0B8 -:1038C0002EC004F02FC005F030C006F031C007F064 -:1038D000BD0E336E370E346E860E356E410E366E6B -:1038E00004C02EF005C02FF006C030F007C031F044 -:1038F00091EC25F02DEC26F02DC000F02EC001F04B -:103900002FC002F030C003F000C0E6FF01C0E6FFA8 -:1039100002C0E6FF03C0E6FF09C5E6FF19EC09F0A7 -:103920000C6E060EE15E0C5073D009C5E6FF31EC5B -:1039300009F0E5526DD000C540F50501416B050168 -:10394000030E426F0501436B010EE66E07EC0AF0B1 -:10395000E552050EF3CFDBFF060EF4CFDBFF060EBC -:10396000DBCF48F5050EDBCF49F5020EE66E07EC1E -:103970000AF0E552050EF3CFDBFF060EF4CFDBFFB6 -:10398000080EDBCF4AF5070EDBCF4BF5400EE66E97 -:10399000400EE66E050EE66E010EE66E010EE66E58 -:1039A00022EC23F0006E050EE15E0050F3CF49F1EA -:1039B000F4CF4AF12DD000C540F50501416B05015A -:1039C000030E426F0501436B17EC0EF0000904E093 -:1039D0000501010E486F02D00501486B400EE66EEE -:1039E000400EE66E050EE66E010EE66E010EE66E08 -:1039F00022EC23F0006E050EE15E0050F3CF49F19A -:103A0000F4CF4AF105D0010EE66E04EC33F0E55236 -:103A1000400EE66E000EE66E050EE66EE66A010EDC -:103A2000E66E22EC23F0006E050EE15E0050F3CF4F -:103A300047F1F4CF48F19FD0010149514A1102E109 -:103A4000000E08D049C1E9FF4AC1EAFFEF50800BE0 -:103A500001E0010E00094DE10101010E516F050168 -:103A6000406B01014C514C2B0501416F0501050EC6 -:103A7000426F0501436B0501486B3E0E006E650EFB -:103A8000016E026A00C0E6FF01C0E6FF02C0E6FF69 -:103A9000480EE66E050EE66E1AEC32F0036E050E69 -:103AA000E15E0350400EE66E400EE66E050EE66ED9 -:103AB000010EE66E010EE66E22EC23F0006E050E9E -:103AC000E15E0050F3CF49F1F4CF4AF1400EE66ECB -:103AD000000EE66E050EE66EE66A010EE66E22EC5C -:103AE00023F0006E050EE15E0050F3CF47F1F4CFF6 -:103AF00048F141D0010149514A1102E1000E08D0BC -:103B000049C1E9FF4AC1EAFFEF50800B01E0010E15 -:103B1000000931E100C540F50501416B0501030EC7 -:103B2000426F0501010E436F400EE66E400EE66ED9 -:103B3000050EE66E010EE66E010EE66E22EC23F037 -:103B4000006E050EE15E0050F3CF49F1F4CF4AF16B -:103B5000400EE66E000EE66E050EE66EE66A010E9B -:103B6000E66E22EC23F0006E050EE15E0050F3CF0E -:103B700047F1F4CF48F10F0EE15C02E2E16AE55251 -:103B8000E16EE552E7CFD9FF120001015251531106 -:103B900004E1100E526F270E536F5207000E535B55 -:103BA0006DA207D0525153112EE18C748CB413D0F6 -:103BB00027D00101005102E18C9422D0000502E1DE -:103BC0008C8409D0020E005D02E18C8419D0040EB1 -:103BD000005D03E18C948C861200100E005D06E1FE -:103BE0000101525153110FE18C740AD0200E005D77 -:103BF0000AE101015251531106E18C748CA402D0E8 -:103C00008C9612008C861200120012001200120014 -:103C1000BAEF30F012001E0EE66E010EE66EF0EC0A -:103C200022F0E552E552400EE66E000EE66E050EFD -:103C3000E66EE66A010EE66E22EC23F0006E050EDB -:103C4000E15E0050F3CF47F1F4CF48F112006D84EC -:103C50000101080E6A6F070E6B6F6A07000E6B5B3F -:103C60006A516B11FAE16D941200D9CFE6FFE1CFF2 -:103C7000D9FFFD0EDBCF2FF0FE0EDBCF30F0010EB3 -:103C80002F1801E1305033E0E8682F1802E1E868AE -:103C900030182BE0030E2F1801E1305024E0040E01 -:103CA0002F1801E130501DE0020E2F1801E13050B5 -:103CB00016E0170E2F1801E130500FE0160E2F18E6 -:103CC00001E1305008E0150E2F1801E1305001E0FD -:103CD00010D0A1DF0FD09EDF0DD09ADF0BD096DF82 -:103CE00009D092DF07D091DF05D091DF03D000002B -:103CF00001D000D0010E00D0E552E7CFD9FF12006D -:103D00004BD8E652D0B202D0010E15D0D0B802D0B6 -:103D1000020E11D0D0B002D0030E0DD0D0B602D01A -:103D2000040E09D0FCAE02D0050E05D0FCAC02D0CA -:103D3000060E01D0070EDF6ED088D086D084D082E8 -:103D4000D080FC9EFC9CDF50E552E552E7CFD9FFC6 -:103D50001200E65221D8020EE126F350DF6E010E6A -:103D6000F4CFDBFF1200C00EE66EE00EE66EE8EC6C -:103D700032F0E552E5521200DF50F36E010EDB50D7 -:103D8000F46E020EE15C1200DFCFE6FFE66A36EC6D -:103D900032F0E552E5521200D9CFE6FFE1CFD9FF6C -:023DA00012000F -:0E3DA200C9EC23F06A6A686AFCEC23F06D8CB1 -:103DB0006E6AACEC23F06D9CDF6ADDEC23F010E260 -:103DC000DF50040DF3CFE9FFF4CFEAFF000EE92640 -:103DD000040EEA22EE6AEE6AEE6AEE6ADF2AEDD798 -:103DE000160E706E68A604D0030E72EC23F0FAD79C -:103DF0000101136B186B196B1A6B6D98080E0B6F22 -:103E0000040E0C6F016B006BE55287EF23F0C9ECD9 -:103E100023F0010100510BE16D6A696AFCEC23F0AB -:103E20006DB602D06D86FCD70101010E006F000552 -:103E300008E16DBA06D0686A696A69806988020E0D -:103E4000006F6850040B07E06950040B04E0020E99 -:103E500072EC23F089D86DB247D06850010B14E0A2 -:103E60006950010B11E09DDF0101040E006F040198 -:103E7000200E026F040E036F080E016F006B8C0E94 -:103E80000013E66A3BEC24F06850100B07E0695021 -:103E9000100B04E060D8040E72EC23F06850400B65 -:103EA0000BE06950400B08E003EC24F0020E7AECC2 -:103EB00023F0060E72EC23F06850200B04E06950EA -:103EC000200B01E035D86850020B0AE06950020B64 -:103ED00007E003EC24F0E668E6685BEC24F06A6A2D -:103EE000040E0101005D02E2A19A1FD069A61CD058 -:103EF000DF6A040EDF5C18E268A616D06CCF20F1F2 -:103F0000030E72EC23F0780E0101201502E138D87F -:103F100009D0000EE66EE66A200EE66E010EE66E31 -:103F2000010EE8DBDF2AE5D7A19AE55287EF23F0FF -:103F300070A00ED095EC23F0EF50800808E1D5DB9F -:103F4000EF50840804E195EC23F08C0EEF6E709036 -:103F5000050E72EF23F06984040EC4DB6D82B5ECAC -:103F600023F0040E7AEF23F0B5EC23F0030EC2DB4E -:103F70006D92699468A403D0020EB4DBFBD71200E3 -:103F8000C9EC23F0FD0E010120153DE17E0E201548 -:103F9000E8407F0B040DF3CF03F1F4CF04F1000EE2 -:103FA0000327040E042303C105F104C106F10575BE -:103FB000BCDBEF503C0BE842E8420D0822E1B5DBE8 -:103FC00032EC24F0EECF00F0EFCF01F0280E001815 -:103FD00016E1040E011813E16CEC24F0DF6AEDDB4E -:103FE0000EE2DF50E5EC23F0DF50EA6A200FE96EC5 -:103FF000040EEA22E552E750EF6EDF2AF0D70AD826 -:1040000007D01AD805D0FD0E2015040801E122D8EA -:10401000E5527DD36ADBEF50800B02E066DBEF6A8E -:1040200001010F6B106B146B156B136B64D89DDB68 -:10403000170E60DBB0EF21F0020E0101105D02E10E -:104040003DEF22F034D80101215102E137EF24F095 -:10405000216B12009EDB49DBEF50400B01E0010EAB -:10406000DF6E01010B75080E005D09E122C46EFFD1 -:104070006E50000802E2100E01D0040E006F100511 -:1040800013E170EC24F0A6D9020E01010F5D03E1EB -:104090002CDB840E07D0DF5003E127DBC80E02D0F3 -:1040A00024DB880EEF6E01D002D8E55230D32BDB33 -:1040B0000101106B1ADBEF6A040E0B19006E0CC1C4 -:1040C00001F0DE6E0CC1DDFF19DBEF6A18AF0CD01A -:1040D0001B511C1107E005D01CC1FAFF01011B5147 -:1040E000F96EFADF0101189F020EE15C02E2E16A5B -:1040F000E552E16E0CD304012051600BE842E84226 -:10410000E842E842E842000901E0120021510C0AAD -:1041100045E00B0A3FE00C0A31E0010A22E00B0AFD -:104120001EE0020A1CE0030A18E0080A10E0010A77 -:104130000CE00F0A08E0030A01E012000101138FEE -:10414000080E006F120030EF21F099EF22F001010C -:10415000010E116F010E126F0CD071EF21F0CFEF35 -:1041600020F024510101116F126B020E1127010E74 -:1041700012231381010E146F138F12000101138F8C -:1041800004012451EA6A020FE96E010EEA2222C4F8 -:10419000EFFF1200EADA160E7AEF23F012007EDB50 -:1041A000040EE1260401220510E120511F0B000935 -:1041B0000CE10101138F030E0401215D04E10101F3 -:1041C000010E1F6F02D001011F6B0401225141E15A -:1041D00020511F0B02083DE124510F0B000939E06B -:1041E0000101138F040124BF05D0A4DA070EE926CC -:1041F000010E04D09FDA0B0EE926010ED2DA030E6F -:10420000215D03E17BDA840E23D024510F0B016A78 -:10421000700F006E0F0E0122020E00C0DBFF030EB6 -:1042200001C0DBFF020EDBCFE9FF030EDBCFEAFFAD -:10423000EE90ED5224AF06D061DAEF6ADF745EDAF9 -:10424000400E06D05BDA880EEF6EDF7457DAC80EC8 -:10425000EF6E040EE15C02E2E16AE552E16E57D2D4 -:10426000800E0401205D3CE10101C00E136F0401CA -:104270002351030A1EE0010A09E0030A2FE10101AC -:10428000420E116F620E126F120E22D0C3DAEC0EC4 -:10429000F626620EA2DA020E0101F76A1125F66E09 -:1042A0001251F7220900F5CF14F10A00F5CF15F1EC -:1042B0001200030E225D0FE2ADDAEE0EF626620E5C -:104... [truncated message content] |