diff options
author | Sascha Silbe <silbe@activitycentral.com> | 2011-02-24 21:17:11 (GMT) |
---|---|---|
committer | Gonzalo Odiard <godiard@sugarlabs.org> | 2011-02-24 16:47:20 (GMT) |
commit | 222d9d8a444c694b0e380c644eae454f73007076 (patch) | |
tree | 28ded1ec5dbc65b97d3ee3f8284d8f9741831785 | |
parent | 56c6c1ce47ea385717fcd441925b009765f1f5a3 (diff) |
battery display (fullscreen mode): replace HAL with UPower
HAL is deprecated, UPower is the designated replacement w.r.t. power
supplies.
Tested on XO-1.5 running Debian Squeeze with stock UPower (0.9.5-5) and a
2.6.35 OLPC kernel.
Signed-off-by: Sascha Silbe <silbe@activitycentral.com>
-rw-r--r-- | readtopbar.py | 152 |
1 files changed, 42 insertions, 110 deletions
diff --git a/readtopbar.py b/readtopbar.py index af7da4c..9725525 100644 --- a/readtopbar.py +++ b/readtopbar.py @@ -26,97 +26,10 @@ from sugar.graphics.icon import Icon, get_icon_state from gettext import gettext as _ -_LEVEL_PROP = 'battery.charge_level.percentage' -_CHARGING_PROP = 'battery.rechargeable.is_charging' -_DISCHARGING_PROP = 'battery.rechargeable.is_discharging' -_PRESENT_PROP = 'battery.present' - _ICON_NAME = 'battery' - -# Taken from sugar/extensions/deviceicon/battery.py -class BattMan(gobject.GObject): - - __gproperties__ = { - 'level': (int, None, None, 0, 100, 0, gobject.PARAM_READABLE), - 'charging': (bool, None, None, False, gobject.PARAM_READABLE), - 'discharging': (bool, None, None, False, gobject.PARAM_READABLE), - 'present': (bool, None, None, False, gobject.PARAM_READABLE), - } - - def __init__(self, udi): - gobject.GObject.__init__(self) - - bus = dbus.Bus(dbus.Bus.TYPE_SYSTEM) - proxy = bus.get_object('org.freedesktop.Hal', udi, - follow_name_owner_changes=True) - self._battery = dbus.Interface(proxy, 'org.freedesktop.Hal.Device') - bus.add_signal_receiver(self._battery_changed, - 'PropertyModified', - 'org.freedesktop.Hal.Device', - 'org.freedesktop.Hal', - udi) - - self._level = self._get_level() - self._charging = self._get_charging() - self._discharging = self._get_discharging() - self._present = self._get_present() - - def _get_level(self): - try: - return self._battery.GetProperty(_LEVEL_PROP) - except dbus.DBusException: - logging.error('Cannot access %s' % _LEVEL_PROP) - return 0 - - def _get_charging(self): - try: - return self._battery.GetProperty(_CHARGING_PROP) - except dbus.DBusException: - logging.error('Cannot access %s' % _CHARGING_PROP) - return False - - def _get_discharging(self): - try: - return self._battery.GetProperty(_DISCHARGING_PROP) - except dbus.DBusException: - logging.error('Cannot access %s' % _DISCHARGING_PROP) - return False - - def _get_present(self): - try: - return self._battery.GetProperty(_PRESENT_PROP) - except dbus.DBusException: - logging.error('Cannot access %s' % _PRESENT_PROP) - return False - - def do_get_property(self, pspec): - if pspec.name == 'level': - return self._level - if pspec.name == 'charging': - return self._charging - if pspec.name == 'discharging': - return self._discharging - if pspec.name == 'present': - return self._present - - def get_type(self): - return 'battery' - - def _battery_changed(self, num_changes, changes_list): - for change in changes_list: - if change[0] == _LEVEL_PROP: - self._level = self._get_level() - self.notify('level') - elif change[0] == _CHARGING_PROP: - self._charging = self._get_charging() - self.notify('charging') - elif change[0] == _DISCHARGING_PROP: - self._discharging = self._get_discharging() - self.notify('discharging') - elif change[0] == _PRESENT_PROP: - self._present = self._get_present() - self.notify('present') +_UP_DEVICE_IFACE = 'org.freedesktop.UPower.Device' +_UP_TYPE_BATTERY = 2 class _TopBar(gtk.HBox): @@ -133,25 +46,32 @@ class _TopBar(gtk.HBox): self._completion_level = 0 self._progressbar = None + self._icon = None + self._battery_props = None try: bus = dbus.Bus(dbus.Bus.TYPE_SYSTEM) - proxy = bus.get_object('org.freedesktop.Hal', - '/org/freedesktop/Hal/Manager') - hal_manager = dbus.Interface(proxy, 'org.freedesktop.Hal.Manager') - udis = hal_manager.FindDeviceByCapability('battery') - if len(udis) > 0: - self._battery = BattMan(udis[0]) # TODO: Support more than one battery - self._battery.connect('notify::level', \ - self._battery_level_changed_cb) - else: - self._battery = None - except dbus.exceptions.DBusException: - self._battery = None - logging.warning('Hardware manager service not found, no idle \ - suspend.') + up_proxy = bus.get_object('org.freedesktop.UPower', + '/org/freedesktop/UPower') + upower = dbus.Interface(up_proxy, 'org.freedesktop.UPower') + + for device_path in upower.EnumerateDevices(): + device = bus.get_object('org.freedesktop.UPower', device_path) + device_prop_iface = dbus.Interface(device, dbus.PROPERTIES_IFACE) + device_type = device_prop_iface.Get(_UP_DEVICE_IFACE, 'Type') + if device_type != _UP_TYPE_BATTERY: + continue + + device.connect_to_signal('Changed', + self.__battery_properties_changed_cb, + dbus_interface=_UP_DEVICE_IFACE) + self._battery_props = dbus.Interface(device, + dbus.PROPERTIES_IFACE) + break - self._icon = None + except dbus.DBusException: + logging.warning("Could not connect to UPower, won't show battery" + "level.") self._setup() @@ -171,18 +91,30 @@ class _TopBar(gtk.HBox): self._completion_level = value self._progressbar.set_fraction(self._completion_level / 100.0) + def _get_battery_level(self): + try: + return self._battery_props.Get(_UP_DEVICE_IFACE, + 'Percentage') + except dbus.DBusException: + logging.exception('Error determining battery level:') + return 0 + def _setup(self): self._progressbar = gtk.ProgressBar() self._progressbar.props.discrete_blocks = 10 self._progressbar.set_fraction(self._completion_level / 100.0) self.pack_start(self._progressbar, expand=True, fill=True) - if self._battery is not None: - icon_name = get_icon_state(_ICON_NAME, self._battery.props.level, step=-5) - self._icon = Icon(icon_name=icon_name) - self.pack_start(self._icon, expand=False, fill=False) + if self._battery_props is None: + return + + level = self._get_battery_level() + icon_name = get_icon_state(_ICON_NAME, level, step=-5) + self._icon = Icon(icon_name=icon_name) + self.pack_start(self._icon, expand=False, fill=False) - def _battery_level_changed_cb(self, pspec, param): - icon_name = get_icon_state(_ICON_NAME, self._battery.props.level, step=-5) + def __battery_properties_changed_cb(self): + level = self._get_battery_level() + icon_name = get_icon_state(_ICON_NAME, level, step=-5) self._icon.props.icon_name = icon_name |