From 6c28cedf23e5f56b4999305ff1fe50863ece425d Mon Sep 17 00:00:00 2001 From: Peter Wu Date: Sat, 27 Apr 2013 15:12:55 +0200 Subject: [PATCH 1/3] Make BooleanValidator accept bytes too besides int Previously, only the first parameter byte can be read or written. After this patch, it is possible to select/write more bytes by specifying a mask of type bytes with the appropriate length. --- lib/logitech/unifying_receiver/settings.py | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/lib/logitech/unifying_receiver/settings.py b/lib/logitech/unifying_receiver/settings.py index 11519c6c..fa9078e8 100644 --- a/lib/logitech/unifying_receiver/settings.py +++ b/lib/logitech/unifying_receiver/settings.py @@ -121,9 +121,18 @@ class _BooleanValidator(object): self.mask = mask self.write_returns_value = write_returns_value + def _validate_value(self, reply_bytes, expected_value): + if isinstance(expected_value, int): + return ord(reply_bytes[:1]) & self.mask == expected_value + else: + for i in range(0, len(self.mask)): + masked_value = ord(reply_bytes[i:i+1]) & ord(self.mask[i:i+1]) + if masked_value != ord(expected_value[i:i+1]): + return False + return True + def validate_read(self, reply_bytes): - reply_value = ord(reply_bytes[:1]) & self.mask - return reply_value == self.true_value + return self._validate_value(reply_bytes, self.true_value) def prepare_write(self, value): # FIXME: this does not work right when there is more than one flag in @@ -132,8 +141,7 @@ class _BooleanValidator(object): def validate_write(self, value, reply_bytes): if self.write_returns_value: - reply_value = ord(reply_bytes[:1]) & self.mask - return reply_value == self.true_value + return self._validate_value(reply_bytes, self.true_value) # just assume the value was written correctly, otherwise there would not # be any reply_bytes to check From 95a97ad776e27c6fa68d711f965edae13a883b2f Mon Sep 17 00:00:00 2001 From: Peter Wu Date: Sat, 27 Apr 2013 15:13:42 +0200 Subject: [PATCH 2/3] Support FN keys swap for K800 --- lib/logitech/unifying_receiver/descriptors.py | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/lib/logitech/unifying_receiver/descriptors.py b/lib/logitech/unifying_receiver/descriptors.py index 83eeec2a..deb1d6ee 100644 --- a/lib/logitech/unifying_receiver/descriptors.py +++ b/lib/logitech/unifying_receiver/descriptors.py @@ -23,6 +23,12 @@ _FN_SWAP = ('fn-swap', 'Swap Fx function', ('When set, the F1..F12 keys will act 'When unset, the F1..F12 keys will activate their standard function,\n' 'and you must hold the FN key to activate their special function.')) +# this register is only applicable to HID++ 1.0 devices, it should not exist with HID++ 2.0 devices +# using Features +def _register_fn_swap(register, true_value, mask): + return _settings.register_toggle(_FN_SWAP[0], register, true_value=true_value, mask=mask, + label=_FN_SWAP[1], description=_FN_SWAP[2]) + def _register_smooth_scroll(register, true_value, mask): return _settings.register_toggle(_SMOOTH_SCROLL[0], register, true_value=true_value, mask=mask, @@ -85,7 +91,11 @@ _D('Wireless Keyboard K350') _D('Wireless Keyboard K360') _D('Wireless Touch Keyboard K400') _D('Wireless Solar Keyboard K750') -_D('Wireless Illuminated Keyboard K800') +_D('Wireless Illuminated Keyboard K800', + settings=[ + _register_fn_swap(0x09, true_value=b'\x00\x01', mask=b'\x00\x01'), + ], + ) _D('Zone Touch Mouse T400') _D('Wireless Rechargeable Touchpad T650') _D('Logitech Cube', kind='mouse') From c79ad65d37e71ed86861ea7cf05b57a961c5e27f Mon Sep 17 00:00:00 2001 From: Peter Wu Date: Sat, 27 Apr 2013 15:17:05 +0200 Subject: [PATCH 3/3] Add K710 with FN key swap support (pwr/Solaar#18) The K710 keyboard is (according to the issue reporter) part of a MK710 combo (which also contains a M705 mouse). Observing a succesful 07 register read, I think that it is a HID++ 1.0 device too that uses the same register for FN key swapping as K800. --- lib/logitech/unifying_receiver/descriptors.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lib/logitech/unifying_receiver/descriptors.py b/lib/logitech/unifying_receiver/descriptors.py index deb1d6ee..32dfac90 100644 --- a/lib/logitech/unifying_receiver/descriptors.py +++ b/lib/logitech/unifying_receiver/descriptors.py @@ -91,6 +91,11 @@ _D('Wireless Keyboard K350') _D('Wireless Keyboard K360') _D('Wireless Touch Keyboard K400') _D('Wireless Solar Keyboard K750') +_D('Wireless Keyboard K710', + settings=[ + _register_fn_swap(0x09, true_value=b'\x00\x01', mask=b'\x00\x01'), + ], + ) _D('Wireless Illuminated Keyboard K800', settings=[ _register_fn_swap(0x09, true_value=b'\x00\x01', mask=b'\x00\x01'),