From 174d0388cad72d8189c542c6dd2477ce5e40fbc1 Mon Sep 17 00:00:00 2001 From: "Peter F. Patel-Schneider" Date: Fri, 17 Dec 2021 20:04:49 -0500 Subject: [PATCH] ui: display percentage estimates from battery voltage --- lib/logitech_receiver/hidpp20.py | 24 ++++++++++++++++++++++++ lib/solaar/ui/window.py | 4 ++-- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/lib/logitech_receiver/hidpp20.py b/lib/logitech_receiver/hidpp20.py index ff57aa46..45531aa3 100644 --- a/lib/logitech_receiver/hidpp20.py +++ b/lib/logitech_receiver/hidpp20.py @@ -1170,6 +1170,25 @@ def get_voltage(device): return decipher_voltage(battery_voltage) +# voltage to remaining charge from Logitech +battery_voltage_remaining = ( + (4186, 100), + (4067, 90), + (3989, 80), + (3922, 70), + (3859, 60), + (3811, 50), + (3778, 40), + (3751, 30), + (3717, 20), + (3671, 10), + (3646, 5), + (3579, 2), + (3500, 0), + (-1000, 0), +) + + # modified to be much closer to battery reports def decipher_voltage(voltage_report): voltage, flags = _unpack('>HB', voltage_report[:3]) @@ -1194,6 +1213,11 @@ def decipher_voltage(voltage_report): elif (flags & (1 << 5)): charge_lvl = CHARGE_LEVEL.critical + for level in battery_voltage_remaining: + if level[0] < voltage: + charge_lvl = level[1] + break + if _log.isEnabledFor(_DEBUG): _log.debug( 'device ???, battery voltage %d mV, charging = %s, charge status %d = %s, charge level %s, charge type %s', diff --git a/lib/solaar/ui/window.py b/lib/solaar/ui/window.py index cc20f9c8..e95c91bd 100644 --- a/lib/solaar/ui/window.py +++ b/lib/solaar/ui/window.py @@ -695,7 +695,7 @@ def _update_device_panel(device, panel, buttons, full=False): if battery_voltage is not None: panel._battery._label.set_text(_('Battery Voltage')) - text = '%(battery_voltage)dmV' % {'battery_voltage': battery_voltage} + text = '%(voltage)dmV, %(level)d%%' % {'voltage': battery_voltage, 'level': battery_level} tooltip_text = _('Voltage reported by battery') elif isinstance(battery_level, _NamedInt): panel._battery._label.set_text(_('Battery Level')) @@ -909,7 +909,7 @@ def update_device(device, item, selected_device_id, need_popup, full=False): _model.set_value(item, _COLUMN.STATUS_TEXT, _CAN_SET_ROW_NONE) _model.set_value(item, _COLUMN.STATUS_ICON, _CAN_SET_ROW_NONE) else: - if battery_voltage is not None: + if battery_voltage is not None and False: # Use levels instead of voltage here status_text = '%(battery_voltage)dmV' % {'battery_voltage': battery_voltage} elif isinstance(battery_level, _NamedInt): status_text = _(str(battery_level))