From cbdc0bd99bd1281a5f8460cc9eaeaa026a06d292 Mon Sep 17 00:00:00 2001 From: Daniel Pavel Date: Mon, 3 Jun 2013 21:40:15 +0200 Subject: [PATCH] very low battery level should trigger an attention event --- lib/logitech/unifying_receiver/status.py | 22 ++++++++++++++-------- lib/solaar/gtk.py | 6 +++++- 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/lib/logitech/unifying_receiver/status.py b/lib/logitech/unifying_receiver/status.py index 6c45e138..de84f877 100644 --- a/lib/logitech/unifying_receiver/status.py +++ b/lib/logitech/unifying_receiver/status.py @@ -28,7 +28,7 @@ from . import hidpp20 as _hidpp20 # # -ALERT = _NamedInts(NONE=0x00, NOTIFICATION=0x01, SHOW_WINDOW=0x02, ALL=0xFF) +ALERT = _NamedInts(NONE=0x00, NOTIFICATION=0x01, SHOW_WINDOW=0x02, ATTENTION=0x04, ALL=0xFF) # device properties that may be reported ENCRYPTED='encrypted' @@ -38,6 +38,10 @@ BATTERY_CHARGING='battery-charging' LIGHT_LEVEL='light-level' ERROR='error' +# if the battery charge is under this percentage, trigger an attention event +# (blink systray icon) +_BATTERY_ATTENTION_LEVEL = 5 + # if not updates have been receiver from the device for a while, assume # it has gone offline and clear all its know properties. _STATUS_TIMEOUT = 5 * 60 # seconds @@ -155,9 +159,9 @@ class DeviceStatus(dict): changed = old_level != level or old_status != status or old_charging != charging alert, reason = ALERT.NONE, None - if not _hidpp20.BATTERY_OK(status) or level <= 5: + if not _hidpp20.BATTERY_OK(status) or level <= _BATTERY_ATTENTION_LEVEL: _log.warn("%s: battery %d%%, ALERT %s", self._device, level, status) - alert = ALERT.NOTIFICATION + alert = ALERT.NOTIFICATION | ALERT.ATTENTION reason = 'Battery: %d%% (%s)' % (level, status) if changed or reason: @@ -170,11 +174,13 @@ class DeviceStatus(dict): if battery is None and d.protocol >= 2.0: battery = _hidpp20.get_battery(d) - # really unnecessary, if the device has SOLAR_DASHBOARD it should be - # broadcasting it's battery status anyway, it will just take a little while - # if battery is None and _hidpp20.FEATURE.SOLAR_DASHBOARD in d.features: - # d.feature_request(_hidpp20.FEATURE.SOLAR_DASHBOARD, 0x00, 1, 1) - # return + # really unnecessary, if the device has SOLAR_DASHBOARD it should be + # broadcasting it's battery status anyway, it will just take a little while + # however, when the device has just been detected, it will not show + # any battery status for a while (broadcasts happen every 90 seconds) + if battery is None and _hidpp20.FEATURE.SOLAR_DASHBOARD in d.features: + d.feature_request(_hidpp20.FEATURE.SOLAR_DASHBOARD, 0x00, 1, 1) + return if battery: level, status = battery diff --git a/lib/solaar/gtk.py b/lib/solaar/gtk.py index 462f8464..7cc89cf4 100644 --- a/lib/solaar/gtk.py +++ b/lib/solaar/gtk.py @@ -93,7 +93,11 @@ def _run(args): # print ("status changed", device, reason) GLib.idle_add(ui.status_icon.update, status_icon, device) - GLib.idle_add(ui.main_window.update, device, alert & ALERT.SHOW_WINDOW, status_icon) + if alert & ALERT.ATTENTION: + GLib.idle_add(ui.status_icon.attention, status_icon) + + popup_window = alert & (ALERT.SHOW_WINDOW | ALERT.ATTENTION) + GLib.idle_add(ui.main_window.update, device, popup_window, status_icon) if alert & ALERT.NOTIFICATION: GLib.idle_add(ui.notify.show, device, reason)