Refactor for nicer pointing device axes handling
This commit is contained in:
parent
ca800331de
commit
9e5d2c24e1
16
kmk/hid.py
16
kmk/hid.py
@ -104,7 +104,7 @@ class AbstractHID:
|
||||
for mod in key.has_modifiers:
|
||||
self.add_modifier(mod)
|
||||
|
||||
for axis in axes.values():
|
||||
for axis in axes:
|
||||
self.move_axis(axis)
|
||||
|
||||
def hid_send(self, evt):
|
||||
@ -136,6 +136,7 @@ class AbstractHID:
|
||||
|
||||
self.remove_cc()
|
||||
self.remove_pd()
|
||||
self.clear_axis()
|
||||
|
||||
return self
|
||||
|
||||
@ -218,11 +219,14 @@ class AbstractHID:
|
||||
self._pd_report[1] = 0x00
|
||||
|
||||
def move_axis(self, axis):
|
||||
if axis.delta != 0 or self._pd_report[axis.code + 2] != 0:
|
||||
delta = clamp(axis.delta, -127, 127)
|
||||
axis.delta -= delta
|
||||
self._pd_report[axis.code + 2] = 0xFF & delta
|
||||
self._pd_pending = True
|
||||
delta = clamp(axis.delta, -127, 127)
|
||||
axis.delta -= delta
|
||||
self._pd_report[axis.code + 2] = 0xFF & delta
|
||||
self._pd_pending = True
|
||||
|
||||
def clear_axis(self):
|
||||
for idx in range(2, len(self._pd_report)):
|
||||
self._pd_report[idx] = 0x00
|
||||
|
||||
|
||||
class USBHID(AbstractHID):
|
||||
|
12
kmk/keys.py
12
kmk/keys.py
@ -43,8 +43,18 @@ class Axis:
|
||||
return f'Axis(code={self.code}, delta={self.delta})'
|
||||
|
||||
def move(self, keyboard: Keyboard, delta: int):
|
||||
keyboard.hid_pending = True
|
||||
self.delta += delta
|
||||
if self.delta:
|
||||
keyboard.axes.add(self)
|
||||
keyboard.hid_pending = True
|
||||
else:
|
||||
keyboard.axes.discard(self)
|
||||
|
||||
|
||||
class AX:
|
||||
W = Axis(2)
|
||||
X = Axis(0)
|
||||
Y = Axis(1)
|
||||
|
||||
|
||||
def maybe_make_key(
|
||||
|
@ -49,7 +49,7 @@ class KMKKeyboard:
|
||||
#####
|
||||
# Internal State
|
||||
keys_pressed = set()
|
||||
axes = {}
|
||||
axes = set()
|
||||
_coordkeys_pressed = {}
|
||||
hid_type = HIDModes.USB
|
||||
secondary_hid_type = None
|
||||
@ -102,12 +102,14 @@ class KMKKeyboard:
|
||||
if debug.enabled:
|
||||
debug(f'coordkeys_pressed={self._coordkeys_pressed}')
|
||||
debug(f'keys_pressed={self.keys_pressed}')
|
||||
# debug(f'axis={[ax for ax in self.axis.__iter__()]}')
|
||||
|
||||
def _send_hid(self) -> None:
|
||||
if not self._hid_send_enabled:
|
||||
return
|
||||
|
||||
if self.axes and debug.enabled:
|
||||
debug(f'axes={self.axes}')
|
||||
|
||||
self._hid_helper.create_report(self.keys_pressed, self.axes)
|
||||
try:
|
||||
self._hid_helper.send()
|
||||
@ -116,10 +118,9 @@ class KMKKeyboard:
|
||||
debug(f'HidNotFound(HIDReportType={e})')
|
||||
|
||||
self.hid_pending = False
|
||||
for axis in self.axes.values():
|
||||
if axis.delta != 0:
|
||||
self.hid_pending = True
|
||||
break
|
||||
|
||||
for axis in self.axes:
|
||||
axis.move(self, 0)
|
||||
|
||||
def _handle_matrix_report(self, kevent: KeyEvent) -> None:
|
||||
if kevent is not None:
|
||||
|
@ -1,5 +1,5 @@
|
||||
from kmk.hid import HID_REPORT_SIZES, HIDReportTypes
|
||||
from kmk.keys import Axis, make_key, make_mouse_key
|
||||
from kmk.keys import AX, make_key, make_mouse_key
|
||||
from kmk.kmktime import PeriodicTimer
|
||||
from kmk.modules import Module
|
||||
|
||||
@ -90,9 +90,6 @@ class MouseKeys(Module):
|
||||
)
|
||||
|
||||
def during_bootup(self, keyboard):
|
||||
keyboard.axes['W'] = Axis(2)
|
||||
keyboard.axes['X'] = Axis(0)
|
||||
keyboard.axes['Y'] = Axis(1)
|
||||
self._timer = PeriodicTimer(self.acc_interval)
|
||||
|
||||
def before_matrix_scan(self, keyboard):
|
||||
@ -106,18 +103,18 @@ class MouseKeys(Module):
|
||||
if self.move_step < self.max_speed:
|
||||
self.move_step = self.move_step + 1
|
||||
if self._right_activated:
|
||||
keyboard.axes['X'].move(keyboard, self.move_step)
|
||||
AX.X.move(keyboard, self.move_step)
|
||||
if self._left_activated:
|
||||
keyboard.axes['X'].move(keyboard, -self.move_step)
|
||||
AX.X.move(keyboard, -self.move_step)
|
||||
if self._up_activated:
|
||||
keyboard.axes['Y'].move(keyboard, -self.move_step)
|
||||
AX.Y.move(keyboard, -self.move_step)
|
||||
if self._down_activated:
|
||||
keyboard.axes['Y'].move(keyboard, self.move_step)
|
||||
AX.Y.move(keyboard, self.move_step)
|
||||
|
||||
if self._mw_up_activated:
|
||||
keyboard.axes['W'].move(keyboard, 1)
|
||||
AX.W.move(keyboard, 1)
|
||||
if self._mw_down_activated:
|
||||
keyboard.axes['W'].move(keyboard, -1)
|
||||
AX.W.move(keyboard, -1)
|
||||
|
||||
def before_hid_send(self, keyboard):
|
||||
return
|
||||
|
Loading…
Reference in New Issue
Block a user