receiver: process battery voltage notifications

This commit is contained in:
Peter F. Patel-Schneider 2020-06-06 07:19:12 -04:00
parent 013f383bc8
commit 579b09619b
4 changed files with 40 additions and 27 deletions

View File

@ -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):

View File

@ -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:

View File

@ -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

View File

@ -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: