hidpp20: features: add BATTERY_VOLTAGE (0x1001) support
Signed-off-by: Filipe Laíns <lains@archlinux.org> Co-authored-by: Filipe Laíns <lains@archlinux.org>
This commit is contained in:
parent
82915eea4b
commit
430b70711b
|
|
@ -57,6 +57,7 @@ FEATURE = _NamedInts(
|
||||||
DFUCONTROL_2=0x00C1,
|
DFUCONTROL_2=0x00C1,
|
||||||
DFU=0x00D0,
|
DFU=0x00D0,
|
||||||
BATTERY_STATUS=0x1000,
|
BATTERY_STATUS=0x1000,
|
||||||
|
BATTERY_VOLTAGE=0x1001,
|
||||||
LED_CONTROL=0x1300,
|
LED_CONTROL=0x1300,
|
||||||
CHANGE_HOST=0x1814,
|
CHANGE_HOST=0x1814,
|
||||||
BACKLIGHT=0x1981,
|
BACKLIGHT=0x1981,
|
||||||
|
|
@ -141,6 +142,22 @@ BATTERY_STATUS = _NamedInts(
|
||||||
invalid_battery=0x05,
|
invalid_battery=0x05,
|
||||||
thermal_error=0x06)
|
thermal_error=0x06)
|
||||||
|
|
||||||
|
CHARGE_STATUS = _NamedInts(
|
||||||
|
charging=0x00,
|
||||||
|
full=0x01,
|
||||||
|
not_charging=0x02,
|
||||||
|
error=0x07)
|
||||||
|
|
||||||
|
CHARGE_LEVEL = _NamedInts(
|
||||||
|
average=0x00,
|
||||||
|
full=0x01,
|
||||||
|
critical=0x02)
|
||||||
|
|
||||||
|
CHARGE_TYPE = _NamedInts(
|
||||||
|
standard=0x00,
|
||||||
|
fast=0x01,
|
||||||
|
slow=0x02)
|
||||||
|
|
||||||
ERROR = _NamedInts(
|
ERROR = _NamedInts(
|
||||||
unknown=0x01,
|
unknown=0x01,
|
||||||
invalid_argument=0x02,
|
invalid_argument=0x02,
|
||||||
|
|
@ -463,6 +480,37 @@ def get_battery(device):
|
||||||
return discharge, BATTERY_STATUS[status]
|
return discharge, BATTERY_STATUS[status]
|
||||||
|
|
||||||
|
|
||||||
|
def get_voltage(device):
|
||||||
|
battery_voltage = feature_request(device, FEATURE.BATTERY_VOLTAGE)
|
||||||
|
if battery_voltage:
|
||||||
|
voltage, flags = _unpack('>HB', battery_voltage[:3])
|
||||||
|
charging = False
|
||||||
|
charge_sts = ERROR.unknown
|
||||||
|
charge_lvl = CHARGE_LEVEL.average
|
||||||
|
charge_type = CHARGE_TYPE.standard
|
||||||
|
|
||||||
|
if flags & (1 << 7):
|
||||||
|
charging = True
|
||||||
|
charge_sts = CHARGE_STATUS[flags & 0x03]
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
|
||||||
def get_keys(device):
|
def get_keys(device):
|
||||||
# TODO: add here additional variants for other REPROG_CONTROLS
|
# TODO: add here additional variants for other REPROG_CONTROLS
|
||||||
count = feature_request(device, FEATURE.REPROG_CONTROLS)
|
count = feature_request(device, FEATURE.REPROG_CONTROLS)
|
||||||
|
|
|
||||||
|
|
@ -166,6 +166,7 @@ def _print_device(dev):
|
||||||
print (' %s, pos:%d, group:%1d, gmask:%d' % ( ', '.join(flags), k.pos, k.group, k.group_mask))
|
print (' %s, pos:%d, group:%1d, gmask:%d' % ( ', '.join(flags), k.pos, k.group, k.group_mask))
|
||||||
if dev.online:
|
if dev.online:
|
||||||
battery = _hidpp20.get_battery(dev)
|
battery = _hidpp20.get_battery(dev)
|
||||||
|
(voltage, charging, charge_sts, charge_lvl, charge_type) = _hidpp20.get_voltage(dev)
|
||||||
if battery is None:
|
if battery is None:
|
||||||
battery = _hidpp10.get_battery(dev)
|
battery = _hidpp10.get_battery(dev)
|
||||||
if battery is not None:
|
if battery is not None:
|
||||||
|
|
@ -179,6 +180,8 @@ def _print_device(dev):
|
||||||
else:
|
else:
|
||||||
text = 'N/A'
|
text = 'N/A'
|
||||||
print (' Battery: %s, %s.' % (text, status))
|
print (' Battery: %s, %s.' % (text, status))
|
||||||
|
elif voltage:
|
||||||
|
print (' Battery: %smV, %s.' % (voltage, 'Charging' if charging else 'Discharging'))
|
||||||
else:
|
else:
|
||||||
print (' Battery status unavailable.')
|
print (' Battery status unavailable.')
|
||||||
else:
|
else:
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue