blob: 216126d89748a9a69daff6d5d3dcc0287159dd7f (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
|
(*
* battery_monitoring.ml
* ---------------------
* Copyright : (c) 2011, Jeremie Dimino <jeremie@dimino.org>
* Licence : BSD3
*
* This file is a part of obus, an ocaml implementation of D-Bus.
*)
open Lwt_react
open Lwt
open Lwt_io
(* List of monitored batteries. *)
let batteries = ref []
let print_state device state =
printlf "state of %s: %s"
(OBus_path.to_string (OBus_proxy.path (UPower_device.to_proxy device)))
(match state with
| `Unknown -> "unknown"
| `Charging -> "charging"
| `Discharging -> "discharging"
| `Empty -> "empty"
| `Fully_charged -> "fully charged"
| `Pending_charge -> "pending charge"
| `Pending_discharge -> "pending discharge")
(* Handle device addition. *)
let monitor_device device =
if List.exists (fun (device', _, _) -> device = device') !batteries then
return ()
else begin
let switch = Lwt_switch.create () in
let%lwt signal = OBus_property.monitor (UPower_device.state device) in
let%lwt s = S.map_s (print_state device) signal in
batteries := (device, switch, s) :: !batteries;
return ()
end
(* Handle device removal. *)
let unmonitor_device device =
let%lwt () =
Lwt_list.iter_p
(fun (device', switch, s) ->
if device = device' then begin
S.stop s;
Lwt_switch.turn_off switch
end else
return ())
!batteries
in
batteries := List.filter (fun (device', _, _) -> device <> device') !batteries;
return ()
let () = Lwt_main.run begin
(* Get the manager proxy. *)
let%lwt manager = UPower.daemon () in
(* Handle device addition/removal. *)
let%lwt () =
OBus_signal.connect (UPower.device_added manager)
>|= E.map_p monitor_device
>|= E.keep
and () =
OBus_signal.connect (UPower.device_removed manager)
>|= E.map_p unmonitor_device
>|= E.keep
in
(* Monitor all the batteries initially present on the system. *)
let%lwt devices = UPower.enumerate_devices manager in
let%lwt () = Lwt_list.iter_p monitor_device devices in
fst (wait ())
end
|