From 579b09619b3682af439caa976a49527692dc25bb Mon Sep 17 00:00:00 2001 From: "Peter F. Patel-Schneider" Date: Sat, 6 Jun 2020 07:19:12 -0400 Subject: [PATCH] receiver: process battery voltage notifications --- lib/logitech_receiver/hidpp20.py | 52 ++++++++++++++------------ lib/logitech_receiver/notifications.py | 8 ++++ lib/logitech_receiver/status.py | 3 +- lib/solaar/cli/show.py | 4 +- 4 files changed, 40 insertions(+), 27 deletions(-) diff --git a/lib/logitech_receiver/hidpp20.py b/lib/logitech_receiver/hidpp20.py index 92296b7d..20a2868c 100644 --- a/lib/logitech_receiver/hidpp20.py +++ b/lib/logitech_receiver/hidpp20.py @@ -527,32 +527,38 @@ def get_battery(device): def get_voltage(device): battery_voltage = feature_request(device, FEATURE.BATTERY_VOLTAGE) if battery_voltage: - voltage, flags = _unpack('>HB', battery_voltage[:3]) - charging = False + return decipher_voltage(battery_voltage) + + +# modified to be much closer to battery reports +def decipher_voltage(voltage_report): + voltage, flags = _unpack('>HB', voltage_report[:3]) + status = BATTERY_STATUS.discharging + charge_sts = ERROR.unknown + charge_lvl = CHARGE_LEVEL.average + charge_type = CHARGE_TYPE.standard + + if flags & (1 << 7): + status = BATTERY_STATUS.recharging + charge_sts = CHARGE_STATUS[flags & 0x03] + if charge_sts is None: charge_sts = ERROR.unknown - charge_lvl = CHARGE_LEVEL.average - charge_type = CHARGE_TYPE.standard + elif charge_sts == CHARGE_STATUS.full: + charge_lvl = CHARGE_LEVEL.full + status = BATTERY_STATUS.full + if (flags & (1 << 3)): + charge_type = CHARGE_TYPE.fast + elif (flags & (1 << 4)): + charge_type = CHARGE_TYPE.slow + status = BATTERY_STATUS.slow_recharge + elif (flags & (1 << 5)): + charge_lvl = CHARGE_LEVEL.critical - if flags & (1 << 7): - charging = True - charge_sts = CHARGE_STATUS[flags & 0x03] + if _log.isEnabledFor(_DEBUG): + _log.debug("device %d, battery voltage %d mV, charging = %s, charge status %d = %s, charge level %s, charge type %s", + device.number, voltage, status, (flags & 0x03), charge_sts, charge_lvl, charge_type) - if charge_sts is None: - charge_sts = ERROR.unknown - elif charge_sts == CHARGE_STATUS.full: - charge_lvl = CHARGE_LEVEL.full - - if (flags & (1 << 3)): - charge_type = CHARGE_TYPE.fast - elif (flags & (1 << 4)): - charge_type = CHARGE_TYPE.slow - elif (flags & (1 << 5)): - charge_lvl = CHARGE_LEVEL.critical - - if _log.isEnabledFor(_DEBUG): - _log.debug("device %d, battery voltage %d mV, charging = %d, charge status %d = %s, charge level %s, charge type %s", - device.number, voltage, charging, (flags & 0x03), charge_sts, charge_lvl, charge_type) - return voltage, charging, charge_sts, charge_lvl, charge_type + return charge_lvl, status, voltage, charge_sts, charge_type def get_keys(device): diff --git a/lib/logitech_receiver/notifications.py b/lib/logitech_receiver/notifications.py index abb31aa4..a1ed718e 100644 --- a/lib/logitech_receiver/notifications.py +++ b/lib/logitech_receiver/notifications.py @@ -247,6 +247,14 @@ def _process_feature_notification(device, status, n, feature): _log.warn("%s: unknown BATTERY %s", device, n) return True + if feature == _F.BATTERY_VOLTAGE: + if n.address == 0x00: + level, status, voltage, _ignore, _ignore =_hidpp20.decipher_voltage(n.data) + status.set_battery_info(level, status, None, voltage) + else: + _log.warn("%s: unknown VOLTAGE %s", device, n) + return True + # TODO: what are REPROG_CONTROLS_V{2,3}? if feature == _F.REPROG_CONTROLS: if n.address == 0x00: diff --git a/lib/logitech_receiver/status.py b/lib/logitech_receiver/status.py index 9bf21612..726b84a5 100644 --- a/lib/logitech_receiver/status.py +++ b/lib/logitech_receiver/status.py @@ -238,8 +238,7 @@ class DeviceStatus(dict): if battery is None: v = _hidpp20.get_voltage(d) if v is not None: - voltage, charging, _ignore, level, _ignore = v - status = _hidpp20.BATTERY_STATUS.recharging if charging else _hidpp20.BATTERY_STATUS.discharging + level, status, voltage, _ignore, _ignore = v self.set_battery_keys( (level, status, None), voltage) return diff --git a/lib/solaar/cli/show.py b/lib/solaar/cli/show.py index f5ebd276..34172a6a 100644 --- a/lib/solaar/cli/show.py +++ b/lib/solaar/cli/show.py @@ -188,8 +188,8 @@ def _print_device(dev): else: battery_voltage = _hidpp20.get_voltage(dev) if battery_voltage : - (voltage, charging, charge_sts, charge_lvl, charge_type) = battery_voltage - print (' Battery: %smV, %s.' % (voltage, 'Charging' if charging else 'Discharging')) + (level, status, voltage, charge_sts, charge_type) = battery_voltage + print (' Battery: %smV, %s, %s.' % (voltage, status, level)) else: print (' Battery status unavailable.') else: