logitech_receiver: split Test condition
This commit is contained in:
parent
54b79d9f13
commit
f327e3ad38
|
@ -83,22 +83,22 @@ string argument. Alternatively, if the argument is a list `[name, action]` wher
|
|||
is either `'pressed'` or `'released'`, the key down or key up events of `name` argument are
|
||||
matched, respectively. Logitech key and button names are shown in the `Key/Button Diversion`
|
||||
setting. Some keyboards have Gn, Mn, or MR keys, which are diverted using the 'Divert G Keys' setting.
|
||||
`Test` conditions are true if their test evaluates to true on the feature,
|
||||
`Test` and `TestBytes` conditions are true if their test evaluates to true on the feature,
|
||||
report, and data of the current notification.
|
||||
Test conditions can return a number instead of a boolean.
|
||||
|
||||
Test conditions consisting of a sequence of three or four integers use the first
|
||||
`TestBytes` conditions consist of a sequence of three or four integers and use the first
|
||||
two to select bytes of the notification data.
|
||||
Writing this kind of test condition is not trivial.
|
||||
Three-element test conditions are true if the selected bytes bit-wise anded
|
||||
Three-element `TestBytes` conditions are true if the selected bytes bit-wise anded
|
||||
with its third element is non-zero.
|
||||
The value of these test conditions is the result of the and.
|
||||
Four-element test conditions are true if the selected bytes form a signed
|
||||
Four-element `TestBytes` conditions are true if the selected bytes form a signed
|
||||
integer between the third and fourth elements.
|
||||
The value of these test condition is the signed value of the selected bytes
|
||||
if that is non-zero otherwise True.
|
||||
|
||||
The other test conditions are mnemonic shorthands for meaningful feature,
|
||||
`Test` conditions are mnemonic shorthands for meaningful feature,
|
||||
report, and data combinations in notifications.
|
||||
A `crown_right` test is the rotation amount of a `CROWN` right rotation notification.
|
||||
A `crown_left` test is the rotation amount of a `CROWN` left rotation notification.
|
||||
|
|
|
@ -553,11 +553,10 @@ class Test(Condition):
|
|||
else:
|
||||
_log.warn('rule Test string argument not name of a test: %s', test)
|
||||
self.function = TESTS['False']
|
||||
elif (
|
||||
isinstance(test, list) and 2 < len(test) <= 4 and all(isinstance(t, int) for t in test) and test[0] >= 0
|
||||
and test[0] <= 16 and test[1] >= 0 and test[1] <= 16 and test[0] < test[1]
|
||||
):
|
||||
self.function = bit_test(*test) if len(test) == 3 else range_test(*test)
|
||||
elif isinstance(test, list) and all(isinstance(t, int) for t in test):
|
||||
_log.warn('Test rules consisting of numbers are deprecated, converting to a TestBytes condition')
|
||||
self.__class__ = TestBytes
|
||||
self.__init__(test)
|
||||
else:
|
||||
_log.warn('rule Test argument not valid %s', test)
|
||||
|
||||
|
@ -571,6 +570,27 @@ class Test(Condition):
|
|||
return {'Test': str(self.test)}
|
||||
|
||||
|
||||
class TestBytes(Condition):
|
||||
def __init__(self, test):
|
||||
self.test = test
|
||||
if (
|
||||
isinstance(test, list) and 2 < len(test) <= 4 and all(isinstance(t, int) for t in test) and test[0] >= 0
|
||||
and test[0] <= 16 and test[1] >= 0 and test[1] <= 16 and test[0] < test[1]
|
||||
):
|
||||
self.function = bit_test(*test) if len(test) == 3 else range_test(*test)
|
||||
else:
|
||||
_log.warn('rule TestBytes argument not valid %s', test)
|
||||
|
||||
def __str__(self):
|
||||
return 'TestBytes: ' + str(self.test)
|
||||
|
||||
def evaluate(self, feature, notification, device, status, last_result):
|
||||
return self.function(feature, notification.address, notification.data)
|
||||
|
||||
def data(self):
|
||||
return {'TestBytes': str(self.test)}
|
||||
|
||||
|
||||
class MouseGesture(Condition):
|
||||
MOVEMENTS = [
|
||||
'Mouse Up', 'Mouse Down', 'Mouse Left', 'Mouse Right', 'Mouse Up-left', 'Mouse Up-right', 'Mouse Down-left',
|
||||
|
@ -860,6 +880,7 @@ COMPONENTS = {
|
|||
'Modifiers': Modifiers,
|
||||
'Key': Key,
|
||||
'Test': Test,
|
||||
'TestBytes': TestBytes,
|
||||
'MouseGesture': MouseGesture,
|
||||
'KeyPress': KeyPress,
|
||||
'MouseScroll': MouseScroll,
|
||||
|
|
Loading…
Reference in New Issue