44 lines
1,007 B
Python
44 lines
1,007 B
Python
import keypad
|
|
import rotaryio
|
|
|
|
from kmk.scanners import Scanner
|
|
|
|
|
|
class RotaryioEncoder(Scanner):
|
|
def __init__(self, pin_a, pin_b, divisor=4):
|
|
self.encoder = rotaryio.IncrementalEncoder(pin_a, pin_b, divisor)
|
|
self.position = 0
|
|
self._pressed = False
|
|
self._queue = []
|
|
|
|
@property
|
|
def key_count(self):
|
|
return 2
|
|
|
|
def scan_for_changes(self):
|
|
position = self.encoder.position
|
|
|
|
if position != self.position:
|
|
self._queue.append(position - self.position)
|
|
self.position = position
|
|
|
|
if not self._queue:
|
|
return
|
|
|
|
key_number = self.offset
|
|
if self._queue[0] > 0:
|
|
key_number += 1
|
|
|
|
if self._pressed:
|
|
self._queue[0] -= 1 if self._queue[0] > 0 else -1
|
|
|
|
if self._queue[0] == 0:
|
|
self._queue.pop(0)
|
|
|
|
self._pressed = False
|
|
|
|
else:
|
|
self._pressed = True
|
|
|
|
return keypad.Event(key_number, self._pressed)
|