diff --git a/lib/logitech/devices/k750.py b/lib/logitech/devices/k750.py index d3dc37d7..54db5f60 100644 --- a/lib/logitech/devices/k750.py +++ b/lib/logitech/devices/k750.py @@ -30,7 +30,7 @@ def _charge_status(data, hasLux=False): def request_status(devinfo): reply = _api.request(devinfo.handle, devinfo.number, - feature=FEATURE.SOLAR_CHARGE, function=b'\x03', params=b'\x78\x01', + feature=FEATURE.SOLAR_CHARGE, function=b'\x06', params=b'\x78\x01', features=devinfo.features) if reply is None: return STATUS.UNAVAILABLE diff --git a/lib/logitech/unifying_receiver/api.py b/lib/logitech/unifying_receiver/api.py index ff7b288b..648cf69a 100644 --- a/lib/logitech/unifying_receiver/api.py +++ b/lib/logitech/unifying_receiver/api.py @@ -228,7 +228,7 @@ class Receiver(object): # # -def request(handle, devnumber, feature, function=b'\x00', params=b'', features=None): +def request(handle, devnumber, feature, function=b'\x04', params=b'', features=None): """Makes a feature call to the device, and returns the reply data. Basically a write() followed by (possibly multiple) reads, until a reply @@ -349,7 +349,7 @@ def get_device_features(handle, devnumber): # even if unknown. # get the number of active features the device has - features_count = _base.request(handle, devnumber, fs_index + b'\x00') + features_count = _base.request(handle, devnumber, fs_index + b'\x05') if not features_count: # this can happen if the device disappeard since the fs_index request # otherwise we should get at least a count of 1 (the FEATURE_SET we've just used above) @@ -362,7 +362,7 @@ def get_device_features(handle, devnumber): features = [None] * 0x20 for index in range(1, 1 + features_count): # for each index, get the feature residing at that index - feature = _base.request(handle, devnumber, fs_index + b'\x10', _pack('!B', index)) + feature = _base.request(handle, devnumber, fs_index + b'\x15', _pack('!B', index)) if feature: # feature_flags = ord(feature[2:3]) & 0xE0 feature = feature[0:2].upper() @@ -390,13 +390,13 @@ def get_device_firmware(handle, devnumber, features=None): if fw_fi is None: return None - fw_count = _base.request(handle, devnumber, _pack('!BB', fw_fi, 0x00)) + fw_count = _base.request(handle, devnumber, _pack('!BB', fw_fi, 0x05)) if fw_count: fw_count = ord(fw_count[:1]) fw = [] for index in range(0, fw_count): - fw_info = _base.request(handle, devnumber, _pack('!BB', fw_fi, 0x10), params=index) + fw_info = _base.request(handle, devnumber, _pack('!BB', fw_fi, 0x15), params=index) if fw_info: level = ord(fw_info[:1]) & 0x0F if level == 0 or level == 1: @@ -431,7 +431,7 @@ def get_device_kind(handle, devnumber, features=None): if name_fi is None: return None - d_kind = _base.request(handle, devnumber, _pack('!BB', name_fi, 0x20)) + d_kind = _base.request(handle, devnumber, _pack('!BB', name_fi, 0x25)) if d_kind: d_kind = ord(d_kind[:1]) # _log.debug("device %d type %d = %s", devnumber, d_kind, DEVICE_KIND[d_kind]) @@ -448,13 +448,13 @@ def get_device_name(handle, devnumber, features=None): if name_fi is None: return None - name_length = _base.request(handle, devnumber, _pack('!BB', name_fi, 0x00)) + name_length = _base.request(handle, devnumber, _pack('!BB', name_fi, 0x05)) if name_length: name_length = ord(name_length[:1]) d_name = b'' while len(d_name) < name_length: - name_fragment = _base.request(handle, devnumber, _pack('!BB', name_fi, 0x10), len(d_name)) + name_fragment = _base.request(handle, devnumber, _pack('!BB', name_fi, 0x15), len(d_name)) if name_fragment: name_fragment = name_fragment[:name_length - len(d_name)] d_name += name_fragment @@ -473,7 +473,7 @@ def get_device_battery_level(handle, devnumber, features=None): """ bat_fi = _get_feature_index(handle, devnumber, FEATURE.BATTERY, features) if bat_fi is not None: - battery = _base.request(handle, devnumber, _pack('!BB', bat_fi, 0)) + battery = _base.request(handle, devnumber, _pack('!BB', bat_fi, 0x05)) if battery: discharge, dischargeNext, status = _unpack('!BBB', battery[:3]) _log.debug("device %d battery %d%% charged, next level %d%% charge, status %d = %s", @@ -486,13 +486,13 @@ def get_device_keys(handle, devnumber, features=None): if rk_fi is None: return None - count = _base.request(handle, devnumber, _pack('!BB', rk_fi, 0)) + count = _base.request(handle, devnumber, _pack('!BB', rk_fi, 0x05)) if count: keys = [] count = ord(count[:1]) for index in range(0, count): - keydata = _base.request(handle, devnumber, _pack('!BB', rk_fi, 0x10), index) + keydata = _base.request(handle, devnumber, _pack('!BB', rk_fi, 0x15), index) if keydata: key, key_task, flags = _unpack('!HHB', keydata[:5]) rki = _ReprogrammableKeyInfo(index, key, KEY_NAME[key], key_task, KEY_NAME[key_task], flags) diff --git a/lib/logitech/unifying_receiver/base.py b/lib/logitech/unifying_receiver/base.py index 7c990276..ce54484d 100644 --- a/lib/logitech/unifying_receiver/base.py +++ b/lib/logitech/unifying_receiver/base.py @@ -4,7 +4,6 @@ # from struct import pack as _pack -from struct import unpack as _unpack from binascii import hexlify as _hexlify _hex = lambda d: _hexlify(d).decode('ascii').upper() @@ -313,7 +312,7 @@ def ping(handle, devnumber): context = request_context _unhandled = getattr(context, 'unhandled_hook') - context.write(handle, devnumber, b'\x00\x10\x00\x00\xAA') + context.write(handle, devnumber, b'\x00\x11\x00\x00\xAA') read_times = _MAX_READ_TIMES while read_times > 0: divisor = (1 + _MAX_READ_TIMES - read_times) @@ -335,14 +334,16 @@ def ping(handle, devnumber): _unhandled(reply_code, reply_devnumber, reply_data) continue - if reply_code == 0x11 and reply_data[:2] == b'\x00\x10' and reply_data[4:5] == b'\xAA': - major, minor = _unpack('!BB', reply_data[2:4]) - return major + minor / 10.0 + if reply_code == 0x11 and reply_data[:2] == b'\x00\x11' and reply_data[4:5] == b'\xAA': + # HID 2.0+ device, currently connected + return ord(reply_data[2:3]) + ord(reply_data[3:4]) / 10.0 - if reply_code == 0x10 and reply_data == b'\x8F\x00\x10\x01\x00': + if reply_code == 0x10 and reply_data == b'\x8F\x00\x11\x01\x00': + # HID 1.0 device, currently connected return 1.0 - if reply_code == 0x10 and reply_data[:3] == b'\x8F\x00\x10': + if reply_code == 0x10 and reply_data[:3] == b'\x8F\x00\x11': + # a disconnected device return None _log.warn("don't know how to interpret ping reply %s", reply)