1
2
3
4 """
5 Power monitor: fires events when AC power becomes (un)available; and
6 fires an event when the power becomes critically low.
7 """
8
9 import dbus
10
11 from twisted.application import service
12 from sparked import events
13
14
16 """
17 A service which monitors the power state of the computer. It fires
18 "available" and "low" events when the power state changes. On the
19 startup of the service, these signals get fired once to ensure a
20 valid system state.
21 """
22
25
26
28
29 try:
30 bus = dbus.Bus()
31 hal_interface = 'org.freedesktop.PowerManagement'
32 hal_udi = '/org/freedesktop/PowerManagement'
33
34 managerObj = bus.get_object(hal_interface, hal_udi)
35 bus.add_signal_receiver(self.powerEvent,
36 dbus_interface=hal_interface,
37 signal_name='OnBatteryChanged')
38 bus.add_signal_receiver(self.lowpowerEvent,
39 dbus_interface=hal_interface,
40 signal_name='LowBatteryChanged')
41 manager = dbus.Interface(managerObj, hal_interface)
42
43 self.powerEvent(manager.GetOnBattery())
44 self.lowpowerEvent(manager.GetLowBattery())
45
46 except dbus.exceptions.DBusException:
47
48 try:
49 bus = dbus.SystemBus()
50 dk_interface = 'org.freedesktop.DeviceKit.Power'
51 dk_udi = '/org/freedesktop/DeviceKit/Power'
52
53 managerObj = bus.get_object(dk_interface, dk_udi)
54 bus.add_signal_receiver(self.dkPowerChanged,
55 dbus_interface=dk_interface,
56 signal_name='Changed')
57 manager = dbus.Interface(managerObj, dk_interface)
58 self.dk_properties = dbus.Interface(managerObj, 'org.freedesktop.DBus.Properties')
59 self.dkPowerChanged()
60
61 except dbus.exceptions.DBusException:
62
63 bus = dbus.SystemBus()
64 dk_interface = 'org.freedesktop.UPower'
65 dk_udi = '/org/freedesktop/UPower'
66
67 managerObj = bus.get_object(dk_interface, dk_udi)
68 bus.add_signal_receiver(self.upPowerChanged,
69 dbus_interface=dk_interface,
70 signal_name='Changed')
71 manager = dbus.Interface(managerObj, dk_interface)
72 self.up_properties = dbus.Interface(managerObj, 'org.freedesktop.DBus.Properties')
73 self.upPowerChanged()
74
75
77 """
78 Called when UPower signals that something with the power has changed.
79 """
80 dk_interface = 'org.freedesktop.UPower'
81 self.powerEvent(self.up_properties.Get(dk_interface, "OnBattery"))
82 self.lowpowerEvent(self.up_properties.Get(dk_interface, "OnLowBattery"))
83
84
86 """
87 Called when DeviceKit signals that something with the power has changed.
88 """
89 dk_interface = 'org.freedesktop.DeviceKit.Power'
90 self.powerEvent(self.dk_properties.Get(dk_interface, "on-battery"))
91 self.lowpowerEvent(self.dk_properties.Get(dk_interface, "on-low-battery"))
92
93
95 """
96 Called when the power state switches between running on battery and
97 running on mains. The 'available' field contains a flag which is True
98 when the computer is running on mains (AC) power.
99 """
100 powerEvents.dispatch("available", not onBattery)
101
102
104 """
105 Called when the battery state becomes critically low, or
106 changes from critical back to normal. When the 'low' field of
107 the event is True, the power is critically low. Triggers a
108 'low' event on this module's dispatcher.
109 """
110 powerEvents.dispatch("low", low)
111
112
113 powerEvents = events.EventDispatcher()
114