settings: add binary read prefix to handle fancy fn-swap setting
This commit is contained in:
parent
538ab9c947
commit
39a5350f30
|
@ -534,26 +534,30 @@ class RegisterRW(object):
|
||||||
|
|
||||||
|
|
||||||
class FeatureRW(object):
|
class FeatureRW(object):
|
||||||
__slots__ = ('feature', 'read_fnid', 'write_fnid', 'no_reply')
|
__slots__ = ('feature', 'read_fnid', 'write_fnid', 'prefix', 'no_reply')
|
||||||
|
|
||||||
kind = _NamedInt(0x02, 'feature')
|
kind = _NamedInt(0x02, 'feature')
|
||||||
default_read_fnid = 0x00
|
default_read_fnid = 0x00
|
||||||
default_write_fnid = 0x10
|
default_write_fnid = 0x10
|
||||||
|
default_prefix = b''
|
||||||
|
|
||||||
def __init__(self, feature, read_fnid=default_read_fnid, write_fnid=default_write_fnid, no_reply=False):
|
def __init__(
|
||||||
|
self, feature, read_fnid=default_read_fnid, write_fnid=default_write_fnid, prefix=default_prefix, no_reply=False
|
||||||
|
):
|
||||||
assert isinstance(feature, _NamedInt)
|
assert isinstance(feature, _NamedInt)
|
||||||
self.feature = feature
|
self.feature = feature
|
||||||
self.read_fnid = read_fnid
|
self.read_fnid = read_fnid
|
||||||
self.write_fnid = write_fnid
|
self.write_fnid = write_fnid
|
||||||
self.no_reply = no_reply
|
self.no_reply = no_reply
|
||||||
|
self.prefix = prefix
|
||||||
|
|
||||||
def read(self, device, data_bytes=b''):
|
def read(self, device, data_bytes=b''):
|
||||||
assert self.feature is not None
|
assert self.feature is not None
|
||||||
return device.feature_request(self.feature, self.read_fnid, data_bytes)
|
return device.feature_request(self.feature, self.read_fnid, self.prefix, data_bytes)
|
||||||
|
|
||||||
def write(self, device, data_bytes):
|
def write(self, device, data_bytes):
|
||||||
assert self.feature is not None
|
assert self.feature is not None
|
||||||
reply = device.feature_request(self.feature, self.write_fnid, data_bytes, no_reply=self.no_reply)
|
reply = device.feature_request(self.feature, self.write_fnid, self.prefix, data_bytes, no_reply=self.no_reply)
|
||||||
return reply if not self.no_reply else True
|
return reply if not self.no_reply else True
|
||||||
|
|
||||||
|
|
||||||
|
@ -597,15 +601,16 @@ class FeatureRWMap(FeatureRW):
|
||||||
|
|
||||||
|
|
||||||
class BooleanValidator(object):
|
class BooleanValidator(object):
|
||||||
__slots__ = ('true_value', 'false_value', 'mask', 'needs_current_value')
|
__slots__ = ('true_value', 'false_value', 'read_offset', 'mask', 'needs_current_value')
|
||||||
|
|
||||||
kind = KIND.toggle
|
kind = KIND.toggle
|
||||||
default_true = 0x01
|
default_true = 0x01
|
||||||
default_false = 0x00
|
default_false = 0x00
|
||||||
# mask specifies all the affected bits in the value
|
# mask specifies all the affected bits in the value
|
||||||
default_mask = 0xFF
|
default_mask = 0xFF
|
||||||
|
default_read_offset = 0
|
||||||
|
|
||||||
def __init__(self, true_value=default_true, false_value=default_false, mask=default_mask):
|
def __init__(self, true_value=default_true, false_value=default_false, mask=default_mask, read_offset=default_read_offset):
|
||||||
if isinstance(true_value, int):
|
if isinstance(true_value, int):
|
||||||
assert isinstance(false_value, int)
|
assert isinstance(false_value, int)
|
||||||
if mask is None:
|
if mask is None:
|
||||||
|
@ -639,8 +644,10 @@ class BooleanValidator(object):
|
||||||
self.true_value = true_value
|
self.true_value = true_value
|
||||||
self.false_value = false_value
|
self.false_value = false_value
|
||||||
self.mask = mask
|
self.mask = mask
|
||||||
|
self.read_offset = read_offset
|
||||||
|
|
||||||
def validate_read(self, reply_bytes):
|
def validate_read(self, reply_bytes):
|
||||||
|
reply_bytes = reply_bytes[self.read_offset:]
|
||||||
if isinstance(self.mask, int):
|
if isinstance(self.mask, int):
|
||||||
reply_value = ord(reply_bytes[:1]) & self.mask
|
reply_value = ord(reply_bytes[:1]) & self.mask
|
||||||
if _log.isEnabledFor(_DEBUG):
|
if _log.isEnabledFor(_DEBUG):
|
||||||
|
@ -683,6 +690,7 @@ class BooleanValidator(object):
|
||||||
to_write |= ord(current_value[:1]) & (0xFF ^ self.mask)
|
to_write |= ord(current_value[:1]) & (0xFF ^ self.mask)
|
||||||
if current_value is not None and to_write == ord(current_value[:1]):
|
if current_value is not None and to_write == ord(current_value[:1]):
|
||||||
return None
|
return None
|
||||||
|
to_write = bytes([to_write])
|
||||||
else:
|
else:
|
||||||
to_write = bytearray(to_write)
|
to_write = bytearray(to_write)
|
||||||
count = len(self.mask)
|
count = len(self.mask)
|
||||||
|
|
|
@ -291,8 +291,8 @@ def _feature_new_fn_swap():
|
||||||
# ignore the capabilities part of the feature - all devices should be able to swap Fn state
|
# ignore the capabilities part of the feature - all devices should be able to swap Fn state
|
||||||
# just use the current host (first byte = 0xFF) part of the feature to read and set the Fn state
|
# just use the current host (first byte = 0xFF) part of the feature to read and set the Fn state
|
||||||
def _feature_k375s_fn_swap():
|
def _feature_k375s_fn_swap():
|
||||||
validator = _BooleanV(true_value=b'\xFF\x01', false_value=b'\xFF\x00')
|
validator = _BooleanV(true_value=b'\x01', false_value=b'\x00', read_offset=1)
|
||||||
return _Setting(_FN_SWAP, _FeatureRW(_F.K375S_FN_INVERSION), validator, device_kind=(_DK.keyboard, ))
|
return _Setting(_FN_SWAP, _FeatureRW(_F.K375S_FN_INVERSION, prefix=b'\xFF'), validator, device_kind=(_DK.keyboard, ))
|
||||||
|
|
||||||
|
|
||||||
# FIXME: This will enable all supported backlight settings,
|
# FIXME: This will enable all supported backlight settings,
|
||||||
|
|
Loading…
Reference in New Issue