Compare commits
4 Commits
Author | SHA1 | Date |
---|---|---|
|
027c075be5 | |
|
3cadd95e65 | |
|
88fb7d18db | |
|
42b97aeea7 |
60
code.py
60
code.py
|
@ -19,6 +19,7 @@
|
|||
import time
|
||||
import board
|
||||
import digitalio
|
||||
import rotaryio
|
||||
import usb_hid
|
||||
|
||||
# Regular keys
|
||||
|
@ -26,42 +27,55 @@ from adafruit_hid.keyboard import Keyboard
|
|||
from keyboard_layout_win_fr import KeyboardLayout
|
||||
from keycode_win_fr import Keycode
|
||||
|
||||
# Rotary encoder setup
|
||||
enc = rotaryio.IncrementalEncoder(board.GP0, board.GP1)
|
||||
last_pos = 0
|
||||
# Keys sent on rotary encoder rotation
|
||||
rot_right = Keycode.A
|
||||
rot_left = Keycode.Z
|
||||
|
||||
# When in ALT mode, buttons use an alternative keycode.
|
||||
ALT = False
|
||||
|
||||
# KB setup
|
||||
keyboard = Keyboard(usb_hid.devices)
|
||||
keyboard_layout = KeyboardLayout(keyboard)
|
||||
keyboard_layout = KeyboardLayout(keyboard)
|
||||
|
||||
# Buttons setup
|
||||
buttons_gpio = {
|
||||
# name GPIO Keycode_1 Keycode_2(ALT mode) State DigitalIO (switch)
|
||||
"red" : dict(gpio=board.GP18, keycode_1=Keycode.DELETE, keycode_2=Keycode.E, state=False, DIO=None),
|
||||
"green" : dict(gpio=board.GP19, keycode_1=Keycode.SPACEBAR, keycode_2=Keycode.RETURN, state=False, DIO=None),
|
||||
"blue" : dict(gpio=board.GP16, keycode_1=Keycode.RIGHT_ARROW, keycode_2=Keycode.UP_ARROW, state=False, DIO=None),
|
||||
"black" : dict(gpio=board.GP20, keycode_1=Keycode.O, keycode_2=Keycode.R, state=False, DIO=None),
|
||||
"yellow": dict(gpio=board.GP17, keycode_1=Keycode.LEFT_ARROW, keycode_2=Keycode.DOWN_ARROW,state=False, DIO=None),
|
||||
"switch": dict(gpio=board.GP21, keycode_1=None, keycode_2=None, state=False, DIO=None, switch_setup=dict(gpio=board.GP7, state=False, DIO=None)),
|
||||
"fn_1": dict(gpio=board.GP15, keycode_1=Keycode.W, keycode_2=Keycode.X, state=False, DIO=None),
|
||||
"fn_2": dict(gpio=board.GP14, keycode_1=Keycode.L, keycode_2=Keycode.F, state=False, DIO=None),
|
||||
# name GPIO Keycode_1 Keycode_2(ALT mode) State DigitalIO Pull (Switch)
|
||||
"red" : dict(gpio=board.GP18, keycode_1=Keycode.DELETE, keycode_2=Keycode.E, state=False, DIO=None, pullr=digitalio.Pull.DOWN),
|
||||
"green" : dict(gpio=board.GP19, keycode_1=Keycode.SPACEBAR, keycode_2=Keycode.RETURN, state=False, DIO=None, pullr=digitalio.Pull.DOWN),
|
||||
"blue" : dict(gpio=board.GP16, keycode_1=Keycode.RIGHT_ARROW, keycode_2=Keycode.UP_ARROW, state=False, DIO=None, pullr=digitalio.Pull.DOWN),
|
||||
"black" : dict(gpio=board.GP20, keycode_1=Keycode.O, keycode_2=Keycode.R, state=False, DIO=None, pullr=digitalio.Pull.DOWN),
|
||||
"yellow": dict(gpio=board.GP17, keycode_1=Keycode.LEFT_ARROW, keycode_2=Keycode.DOWN_ARROW,state=False, DIO=None, pullr=digitalio.Pull.DOWN),
|
||||
"switch": dict(gpio=board.GP21, keycode_1=None, keycode_2=None, state=False, DIO=None, pullr=digitalio.Pull.DOWN, switch_setup=dict(gpio=board.GP7, state=False, DIO=None)),
|
||||
"fn_1": dict(gpio=board.GP15, keycode_1=Keycode.W, keycode_2=Keycode.X, state=False, DIO=None, pullr=digitalio.Pull.DOWN),
|
||||
"fn_2": dict(gpio=board.GP14, keycode_1=Keycode.L, keycode_2=Keycode.F, state=False, DIO=None, pullr=digitalio.Pull.DOWN),
|
||||
# This one is reversed (True when not pressed) so we need some logic to interpret a HIGH as False
|
||||
"rot": dict(gpio=board.GP6, keycode_1=Keycode.Q, keycode_2=Keycode.S, state=False, DIO=None, pullr=digitalio.Pull.UP, reverse=True),
|
||||
}
|
||||
|
||||
# GPIO setup
|
||||
for btn in buttons_gpio:
|
||||
buttons_gpio[btn]['DIO'] = digitalio.DigitalInOut(buttons_gpio[btn]['gpio'])
|
||||
buttons_gpio[btn]['DIO'].direction = digitalio.Direction.INPUT
|
||||
buttons_gpio[btn]['DIO'].pull = digitalio.Pull.DOWN
|
||||
buttons_gpio[btn]['DIO'].pull = buttons_gpio[btn]['pullr']
|
||||
# Switch setup
|
||||
if 'switch_setup' in buttons_gpio[btn]:
|
||||
buttons_gpio[btn]['switch_setup']['DIO'] = digitalio.DigitalInOut(buttons_gpio[btn]['switch_setup']['gpio'])
|
||||
buttons_gpio[btn]['switch_setup']['DIO'].direction = digitalio.Direction.OUTPUT
|
||||
|
||||
btn_scan_delay = 1/200
|
||||
btn_scan_delay = 1.0/200
|
||||
|
||||
while True:
|
||||
for btn in buttons_gpio:
|
||||
# If digital input is high and was not pressed previously
|
||||
if buttons_gpio[btn]['DIO'].value and not buttons_gpio[btn]['state']:
|
||||
# Logic for switches that read True when not pressed
|
||||
if 'reverse' in buttons_gpio[btn]:
|
||||
btn_value = not buttons_gpio[btn]['DIO'].value
|
||||
else:
|
||||
btn_value = buttons_gpio[btn]['DIO'].value
|
||||
# If digital input is true and was not pressed previously
|
||||
if btn_value and not buttons_gpio[btn]['state']:
|
||||
if ALT:
|
||||
if buttons_gpio[btn]['keycode_2'] is not None:
|
||||
keyboard.press(buttons_gpio[btn]['keycode_2'])
|
||||
|
@ -74,8 +88,8 @@ while True:
|
|||
if not buttons_gpio[btn]['switch_setup']['DIO'].value:
|
||||
buttons_gpio[btn]['switch_setup']['DIO'].value = True
|
||||
ALT = True
|
||||
# If digital input is down and was pressed previously
|
||||
if not buttons_gpio[btn]['DIO'].value and buttons_gpio[btn]['state']:
|
||||
# If digital input is false and was pressed previously
|
||||
if not btn_value and buttons_gpio[btn]['state']:
|
||||
if ALT:
|
||||
if buttons_gpio[btn]['keycode_2'] is not None:
|
||||
keyboard.release(buttons_gpio[btn]['keycode_2'])
|
||||
|
@ -88,4 +102,16 @@ while True:
|
|||
if buttons_gpio[btn]['switch_setup']['DIO'].value:
|
||||
buttons_gpio[btn]['switch_setup']['DIO'].value = False
|
||||
ALT = False
|
||||
pos = enc.position
|
||||
if pos > last_pos:
|
||||
if ALT:
|
||||
keyboard.send(Keycode.LEFT_SHIFT, rot_right)
|
||||
else:
|
||||
keyboard.send(rot_right)
|
||||
elif pos < last_pos:
|
||||
if ALT:
|
||||
keyboard.send(Keycode.LEFT_SHIFT, rot_left)
|
||||
else:
|
||||
keyboard.send(rot_left)
|
||||
last_pos = pos
|
||||
time.sleep(btn_scan_delay)
|
||||
|
|
Loading…
Reference in New Issue