Merge pull request #214 from KMKfw/josh/topic-corne-2040-plus-plus

Fix many broken keys
This commit is contained in:
Josh Klar 2021-07-12 18:19:02 +00:00 committed by GitHub
commit eb5756f530
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 350 additions and 704 deletions

29
boards/crkbd/kb_rp2040.py Normal file
View File

@ -0,0 +1,29 @@
import board
from kmk.kmk_keyboard import KMKKeyboard as _KMKKeyboard
from kmk.matrix import DiodeOrientation
from kmk.matrix import intify_coordinate as ic
class KMKKeyboard(_KMKKeyboard):
col_pins = (
board.A3,
board.A2,
board.A1,
board.A0,
board.SCK,
board.MISO,
)
row_pins = (board.D4, board.D5, board.D6, board.D7)
diode_orientation = DiodeOrientation.COLUMNS
data_pin = board.RX
rgb_pixel_pin = board.D0
i2c = board.I2C
coord_mapping = []
coord_mapping.extend(ic(0, x) for x in range(12))
coord_mapping.extend(ic(1, x) for x in range(12))
coord_mapping.extend(ic(2, x) for x in range(12))
# And now, to handle R3, which at this point is down to just six keys
coord_mapping.extend(ic(3, x) for x in range(3, 9))

View File

@ -1,4 +1,4 @@
from kb import KMKKeyboard, rgb_pixel_pin
from kb import KMKKeyboard
from kmk.extensions.rgb import RGB
from kmk.keys import KC
from kmk.modules.layers import Layers
@ -7,7 +7,7 @@ from kmk.modules.split import Split, SplitSide, SplitType
keyboard = KMKKeyboard()
# Adding extensions
rgb = RGB(pixel_pin=rgb_pixel_pin, num_pixels=27, val_limit=100, hue_default=190, sat_default=100, val_default=5)
rgb = RGB(pixel_pin=keyboard.rgb_pixel_pin, num_pixels=27, val_limit=100, hue_default=190, sat_default=100, val_default=5)
# TODO Comment one of these on each side
split_side = SplitSide.LEFT

View File

@ -10,6 +10,8 @@ from kmk.key_validators import (
)
from kmk.types import AttrDict, UnicodeModeKeyMeta
DEBUG_OUTPUT = False
FIRST_KMK_INTERNAL_KEY = const(1000)
NEXT_AVAILABLE_KEY = 1000
@ -17,416 +19,85 @@ KEY_SIMPLE = const(0)
KEY_MODIFIER = const(1)
KEY_CONSUMER = const(2)
ALL_ALPHAS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
ALL_NUMBERS = '1234567890'
# since KC.1 isn't valid Python, alias to KC.N1
ALL_NUMBER_ALIASES = tuple(f'N{x}' for x in ALL_NUMBERS)
class InfiniteLoopDetected(Exception):
pass
# this is a bit of an FP style thing - combining a pipe operator a-la F# with
# a bootleg Maybe monad to clean up these make_key sequences
def left_pipe_until_some(candidate, functor, *args_iter):
for args in args_iter:
result = functor(candidate, *args)
if result is not None:
return result
def first_truthy(candidate, *funcs):
for func in funcs:
result = func(candidate)
if result is not None:
return result
def maybe_make_mod_key(candidate, code, names):
if candidate in names:
return make_mod_key(code=code, names=names)
def maybe_make_key(candidate, code, names):
if candidate in names:
return make_key(code=code, names=names)
def maybe_make_shifted_key(candidate, target_name, names):
if candidate in names:
return make_shifted_key(target_name=target_name, names=names)
def maybe_make_consumer_key(candidate, code, names):
if candidate in names:
return make_consumer_key(code=code, names=names)
class KeyAttrDict(AttrDict):
def __getattr__(self, key):
def __getattr__(self, key, depth=0):
if depth > 1:
raise InfiniteLoopDetected()
try:
return super(KeyAttrDict, self).__getattr__(key)
except Exception:
pass
# Modifiers
if key in ('LEFT_CONTROL', 'LCTRL', 'LCTL'):
make_mod_key(code=0x01, names=('LEFT_CONTROL', 'LCTRL', 'LCTL'))
elif key in ('LEFT_SHIFT', 'LSHIFT', 'LSFT'):
make_mod_key(code=0x02, names=('LEFT_SHIFT', 'LSHIFT', 'LSFT'))
elif key in ('LEFT_ALT', 'LALT'):
make_mod_key(code=0x04, names=('LEFT_ALT', 'LALT'))
elif key in ('LEFT_SUPER', 'LGUI', 'LCMD', 'LWIN'):
make_mod_key(code=0x08, names=('LEFT_SUPER', 'LGUI', 'LCMD', 'LWIN'))
elif key in ('RIGHT_CONTROL', 'RCTRL', 'RCTL'):
make_mod_key(code=0x10, names=('RIGHT_CONTROL', 'RCTRL', 'RCTL'))
elif key in ('RIGHT_SHIFT', 'RSHIFT', 'RSFT'):
make_mod_key(code=0x20, names=('RIGHT_SHIFT', 'RSHIFT', 'RSFT'))
elif key in ('RIGHT_ALT', 'RALT'):
make_mod_key(code=0x40, names=('RIGHT_ALT', 'RALT'))
elif key in ('RIGHT_SUPER', 'RGUI', 'RCMD', 'RWIN'):
make_mod_key(code=0x80, names=('RIGHT_SUPER', 'RGUI', 'RCMD', 'RWIN'))
# MEH = LCTL | LALT | LSFT# MEH = LCTL |
elif key in ('MEH',):
make_mod_key(code=0x07, names=('MEH',))
# HYPR = LCTL | LALT | LSFT | LGUI
elif key in ('HYPER', 'HYPR'):
make_mod_key(code=0x0F, names=('HYPER', 'HYPR'))
# Basic ASCII letters
elif key in ('A',):
make_key(code=4, names=('A',))
elif key in ('B',):
make_key(code=5, names=('B',))
elif key in ('C',):
make_key(code=6, names=('C',))
elif key in ('D',):
make_key(code=7, names=('D',))
elif key in ('E',):
make_key(code=8, names=('E',))
elif key in ('F',):
make_key(code=9, names=('F',))
elif key in ('G',):
make_key(code=10, names=('G',))
elif key in ('H',):
make_key(code=11, names=('H',))
elif key in ('I',):
make_key(code=12, names=('I',))
elif key in ('J',):
make_key(code=13, names=('J',))
elif key in ('K',):
make_key(code=14, names=('K',))
elif key in ('L',):
make_key(code=15, names=('L',))
elif key in ('M',):
make_key(code=16, names=('M',))
elif key in ('N',):
make_key(code=17, names=('N',))
elif key in ('O',):
make_key(code=18, names=('O',))
elif key in ('P',):
make_key(code=19, names=('P',))
elif key in ('Q',):
make_key(code=20, names=('Q',))
elif key in ('R',):
make_key(code=21, names=('R',))
elif key in ('S',):
make_key(code=22, names=('S',))
elif key in ('T',):
make_key(code=23, names=('T',))
elif key in ('U',):
make_key(code=24, names=('U',))
elif key in ('V',):
make_key(code=25, names=('V',))
elif key in ('W',):
make_key(code=26, names=('W',))
elif key in ('X',):
make_key(code=27, names=('X',))
elif key in ('Y',):
make_key(code=28, names=('Y',))
elif key in ('Z',):
make_key(code=29, names=('Z',))
# Basic ASCII letters/numbers don't need anything fancy, so check those
# in the laziest way
if key in ALL_ALPHAS:
make_key(code=4 + ALL_ALPHAS.index(key), names=(key,))
elif key in ALL_NUMBERS or key in ALL_NUMBER_ALIASES:
try:
offset = ALL_NUMBERS.index(key)
except ValueError:
offset = ALL_NUMBER_ALIASES.index(key)
# Numbers
# Aliases to play nicely with AttrDict, since KC.1 isn't a valid
# attribute key in Python, but KC.N1 is
elif key in ('1', 'N1'):
make_key(code=30, names=('1', 'N1'))
elif key in ('2', 'N2'):
make_key(code=31, names=('2', 'N2'))
elif key in ('3', 'N3'):
make_key(code=32, names=('3', 'N3'))
elif key in ('4', 'N4'):
make_key(code=33, names=('4', 'N4'))
elif key in ('5', 'N5'):
make_key(code=34, names=('5', 'N5'))
elif key in ('6', 'N6'):
make_key(code=35, names=('6', 'N6'))
elif key in ('7', 'N7'):
make_key(code=36, names=('7', 'N7'))
elif key in ('8', 'N8'):
make_key(code=37, names=('8', 'N8'))
elif key in ('9', 'N9'):
make_key(code=38, names=('9', 'N9'))
elif key in ('0', 'N0'):
make_key(code=39, names=('0', 'N0'))
names = (ALL_NUMBERS[offset], ALL_NUMBER_ALIASES[offset])
make_key(code=30 + offset, names=names)
# More ASCII standard keys
elif key in ('ENTER', 'ENT', '\n'):
make_key(code=40, names=('ENTER', 'ENT', '\n'))
elif key in ('ESCAPE', 'ESC'):
make_key(code=41, names=('ESCAPE', 'ESC'))
elif key in ('BACKSPACE', 'BSPC', 'BKSP'):
make_key(code=42, names=('BACKSPACE', 'BSPC', 'BKSP'))
elif key in ('TAB', '\t'):
make_key(code=43, names=('TAB', '\t'))
elif key in ('SPACE', 'SPC', ' '):
make_key(code=44, names=('SPACE', 'SPC', ' '))
elif key in ('MINUS', 'MINS', '-'):
make_key(code=45, names=('MINUS', 'MINS', '-'))
elif key in ('EQUAL', 'EQL', '='):
make_key(code=46, names=('EQUAL', 'EQL', '='))
elif key in ('LBRACKET', 'LBRC', '['):
make_key(code=47, names=('LBRACKET', 'LBRC', '['))
elif key in ('RBRACKET', 'RBRC', ']'):
make_key(code=48, names=('RBRACKET', 'RBRC', ']'))
elif key in ('BACKSLASH', 'BSLASH', 'BSLS', '\\'):
make_key(code=49, names=('BACKSLASH', 'BSLASH', 'BSLS', '\\'))
elif key in ('SEMICOLON', 'SCOLON', 'SCLN', ';'):
make_key(code=51, names=('SEMICOLON', 'SCOLON', 'SCLN', ';'))
elif key in ('QUOTE', 'QUOT', "'"):
make_key(code=52, names=('QUOTE', 'QUOT', "'"))
elif key in ('GRAVE', 'GRV', 'ZKHK', '`'):
make_key(code=53, names=('GRAVE', 'GRV', 'ZKHK', '`'))
elif key in ('COMMA', 'COMM', ','):
make_key(code=54, names=('COMMA', 'COMM', ','))
elif key in ('DOT', '.'):
make_key(code=55, names=('DOT', '.'))
elif key in ('SLASH', 'SLSH'):
make_key(code=56, names=('SLASH', 'SLSH'))
# Function Keys
elif key in ('F1',):
make_key(code=58, names=('F1',))
elif key in ('F2',):
make_key(code=59, names=('F2',))
elif key in ('F3',):
make_key(code=60, names=('F3',))
elif key in ('F4',):
make_key(code=61, names=('F4',))
elif key in ('F5',):
make_key(code=62, names=('F5',))
elif key in ('F6',):
make_key(code=63, names=('F6',))
elif key in ('F7',):
make_key(code=64, names=('F7',))
elif key in ('F8',):
make_key(code=65, names=('F8',))
elif key in ('F9',):
make_key(code=66, names=('F9',))
elif key in ('F10',):
make_key(code=67, names=('F10',))
elif key in ('F11',):
make_key(code=68, names=('F11',))
elif key in ('F12',):
make_key(code=69, names=('F12',))
elif key in ('F13',):
make_key(code=104, names=('F13',))
elif key in ('F14',):
make_key(code=105, names=('F14',))
elif key in ('F15',):
make_key(code=106, names=('F15',))
elif key in ('F16',):
make_key(code=107, names=('F16',))
elif key in ('F17',):
make_key(code=108, names=('F17',))
elif key in ('F18',):
make_key(code=109, names=('F18',))
elif key in ('F19',):
make_key(code=110, names=('F19',))
elif key in ('F20',):
make_key(code=111, names=('F20',))
elif key in ('F21',):
make_key(code=112, names=('F21',))
elif key in ('F22',):
make_key(code=113, names=('F22',))
elif key in ('F23',):
make_key(code=114, names=('F23',))
elif key in ('F24',):
make_key(code=115, names=('F24',))
# Lock Keys, Navigation, etc.
elif key in ('CAPS_LOCK', 'CAPSLOCK', 'CLCK', 'CAPS'):
make_key(code=57, names=('CAPS_LOCK', 'CAPSLOCK', 'CLCK', 'CAPS'))
# FIXME: Investigate whether this key actually works, and
# uncomment when/if it does.
# elif key in ('LOCKING_CAPS', 'LCAP'):
# # make_key(code=130, names=('LOCKING_CAPS', 'LCAP'))
elif key in ('PRINT_SCREEN', 'PSCREEN', 'PSCR'):
make_key(code=70, names=('PRINT_SCREEN', 'PSCREEN', 'PSCR'))
elif key in ('SCROLL_LOCK', 'SCROLLLOCK', 'SLCK'):
make_key(code=71, names=('SCROLL_LOCK', 'SCROLLLOCK', 'SLCK'))
# FIXME: Investigate whether this key actually works, and
# uncomment when/if it does.
# elif key in ('LOCKING_SCROLL', 'LSCRL'):
# make_key(code=132, names=('LOCKING_SCROLL', 'LSCRL'))
elif key in ('PAUSE', 'PAUS', 'BRK'):
make_key(code=72, names=('PAUSE', 'PAUS', 'BRK'))
elif key in ('INSERT', 'INS'):
make_key(code=73, names=('INSERT', 'INS'))
elif key in ('HOME',):
make_key(code=74, names=('HOME',))
elif key in ('PGUP',):
make_key(code=75, names=('PGUP',))
elif key in ('DELETE', 'DEL'):
make_key(code=76, names=('DELETE', 'DEL'))
elif key in ('END',):
make_key(code=77, names=('END',))
elif key in ('PGDOWN', 'PGDN'):
make_key(code=78, names=('PGDOWN', 'PGDN'))
elif key in ('RIGHT', 'RGHT'):
make_key(code=79, names=('RIGHT', 'RGHT'))
elif key in ('LEFT',):
make_key(code=80, names=('LEFT',))
elif key in ('DOWN',):
make_key(code=81, names=('DOWN',))
elif key in ('UP',):
make_key(code=82, names=('UP',))
# Numpad
elif key in ('NUM_LOCK', 'NUMLOCK', 'NLCK'):
make_key(code=83, names=('NUM_LOCK', 'NUMLOCK', 'NLCK'))
# FIXME: Investigate whether this key actually works, and
# uncomment when/if it does.
# elif key in ('LOCKING_NUM', 'LNUM'):
# make_key(code=131, names=('LOCKING_NUM', 'LNUM'))
elif key in ('KP_SLASH', 'NUMPAD_SLASH', 'PSLS'):
make_key(code=84, names=('KP_SLASH', 'NUMPAD_SLASH', 'PSLS'))
elif key in ('KP_ASTERISK', 'NUMPAD_ASTERISK', 'PAST'):
make_key(code=85, names=('KP_ASTERISK', 'NUMPAD_ASTERISK', 'PAST'))
elif key in ('KP_MINUS', 'NUMPAD_MINUS', 'PMNS'):
make_key(code=86, names=('KP_MINUS', 'NUMPAD_MINUS', 'PMNS'))
elif key in ('KP_PLUS', 'NUMPAD_PLUS', 'PPLS'):
make_key(code=87, names=('KP_PLUS', 'NUMPAD_PLUS', 'PPLS'))
elif key in ('KP_ENTER', 'NUMPAD_ENTER', 'PENT'):
make_key(code=88, names=('KP_ENTER', 'NUMPAD_ENTER', 'PENT'))
elif key in ('KP_1', 'P1', 'NUMPAD_1'):
make_key(code=89, names=('KP_1', 'P1', 'NUMPAD_1'))
elif key in ('KP_2', 'P2', 'NUMPAD_2'):
make_key(code=90, names=('KP_2', 'P2', 'NUMPAD_2'))
elif key in ('KP_3', 'P3', 'NUMPAD_3'):
make_key(code=91, names=('KP_3', 'P3', 'NUMPAD_3'))
elif key in ('KP_4', 'P4', 'NUMPAD_4'):
make_key(code=92, names=('KP_4', 'P4', 'NUMPAD_4'))
elif key in ('KP_5', 'P5', 'NUMPAD_5'):
make_key(code=93, names=('KP_5', 'P5', 'NUMPAD_5'))
elif key in ('KP_6', 'P6', 'NUMPAD_6'):
make_key(code=94, names=('KP_6', 'P6', 'NUMPAD_6'))
elif key in ('KP_7', 'P7', 'NUMPAD_7'):
make_key(code=95, names=('KP_7', 'P7', 'NUMPAD_7'))
elif key in ('KP_8', 'P8', 'NUMPAD_8'):
make_key(code=96, names=('KP_8', 'P8', 'NUMPAD_8'))
elif key in ('KP_9', 'P9', 'NUMPAD_9'):
make_key(code=97, names=('KP_9', 'P9', 'NUMPAD_9'))
elif key in ('KP_0', 'P0', 'NUMPAD_0'):
make_key(code=98, names=('KP_0', 'P0', 'NUMPAD_0'))
elif key in ('KP_DOT', 'PDOT', 'NUMPAD_DOT'):
make_key(code=99, names=('KP_DOT', 'PDOT', 'NUMPAD_DOT'))
elif key in ('KP_EQUAL', 'PEQL', 'NUMPAD_EQUAL'):
make_key(code=103, names=('KP_EQUAL', 'PEQL', 'NUMPAD_EQUAL'))
elif key in ('KP_COMMA', 'PCMM', 'NUMPAD_COMMA'):
make_key(code=133, names=('KP_COMMA', 'PCMM', 'NUMPAD_COMMA'))
elif key in ('KP_EQUAL_AS400', 'NUMPAD_EQUAL_AS400'):
make_key(code=134, names=('KP_EQUAL_AS400', 'NUMPAD_EQUAL_AS400'))
# Making life better for folks on tiny keyboards especially: exposes
# the 'shifted' keys as raw keys. Under the hood we're still
# sending Shift+(whatever key is normally pressed) to get these, so
# for example `KC_AT` will hold shift and press 2.
elif key in ('TILDE', 'TILD', '~'):
make_shifted_key('GRAVE', names=('TILDE', 'TILD', '~'))
elif key in ('EXCLAIM', 'EXLM', '!'):
make_shifted_key('1', names=('EXCLAIM', 'EXLM', '!'))
elif key in ('AT', '@'):
make_shifted_key('2', names=('AT', '@'))
elif key in ('HASH', 'POUND', '#'):
make_shifted_key('3', names=('HASH', 'POUND', '#'))
elif key in ('DOLLAR', 'DLR', '$'):
make_shifted_key('4', names=('DOLLAR', 'DLR', '$'))
elif key in ('PERCENT', 'PERC', '%'):
make_shifted_key('5', names=('PERCENT', 'PERC', '%'))
elif key in ('CIRCUMFLEX', 'CIRC', '^'):
make_shifted_key('6', names=('CIRCUMFLEX', 'CIRC', '^'))
elif key in ('AMPERSAND', 'AMPR', '&'):
make_shifted_key('7', names=('AMPERSAND', 'AMPR', '&'))
elif key in ('ASTERISK', 'ASTR', '*'):
make_shifted_key('8', names=('ASTERISK', 'ASTR', '*'))
elif key in ('LEFT_PAREN', 'LPRN', '('):
make_shifted_key('9', names=('LEFT_PAREN', 'LPRN', '('))
elif key in ('RIGHT_PAREN', 'RPRN', ')'):
make_shifted_key('0', names=('RIGHT_PAREN', 'RPRN', ')'))
elif key in ('UNDERSCORE', 'UNDS', '_'):
make_shifted_key('MINUS', names=('UNDERSCORE', 'UNDS', '_'))
elif key in ('PLUS', '+'):
make_shifted_key('EQUAL', names=('PLUS', '+'))
elif key in ('LEFT_CURLY_BRACE', 'LCBR', '{'):
make_shifted_key('LBRACKET', names=('LEFT_CURLY_BRACE', 'LCBR', '{'))
elif key in ('RIGHT_CURLY_BRACE', 'RCBR', '}'):
make_shifted_key('RBRACKET', names=('RIGHT_CURLY_BRACE', 'RCBR', '}'))
elif key in ('PIPE', '|'):
make_shifted_key('BACKSLASH', names=('PIPE', '|'))
elif key in ('COLON', 'COLN', ':'):
make_shifted_key('SEMICOLON', names=('COLON', 'COLN', ':'))
elif key in ('DOUBLE_QUOTE', 'DQUO', 'DQT', '"'):
make_shifted_key('QUOTE', names=('DOUBLE_QUOTE', 'DQUO', 'DQT', '"'))
elif key in ('LEFT_ANGLE_BRACKET', 'LABK', '<'):
make_shifted_key('COMMA', names=('LEFT_ANGLE_BRACKET', 'LABK', '<'))
elif key in ('RIGHT_ANGLE_BRACKET', 'RABK', '>'):
make_shifted_key('DOT', names=('RIGHT_ANGLE_BRACKET', 'RABK', '>'))
elif key in ('QUESTION', 'QUES', '?'):
make_shifted_key('SLSH', names=('QUESTION', 'QUES', '?'))
# International
elif key in ('NONUS_HASH', 'NUHS'):
make_key(code=50, names=('NONUS_HASH', 'NUHS'))
elif key in ('NONUS_BSLASH', 'NUBS'):
make_key(code=100, names=('NONUS_BSLASH', 'NUBS'))
elif key in ('APP', 'APPLICATION', 'SEL', 'WINMENU'):
make_key(code=101, names=('APP', 'APPLICATION', 'SEL', 'WINMENU'))
elif key in ('INT1', 'RO'):
make_key(code=135, names=('INT1', 'RO'))
elif key in ('INT2', 'KANA'):
make_key(code=136, names=('INT2', 'KANA'))
elif key in ('INT3', 'JYEN'):
make_key(code=137, names=('INT3', 'JYEN'))
elif key in ('INT4', 'HENK'):
make_key(code=138, names=('INT4', 'HENK'))
elif key in ('INT5', 'MHEN'):
make_key(code=139, names=('INT5', 'MHEN'))
elif key in ('INT6',):
make_key(code=140, names=('INT6',))
elif key in ('INT7',):
make_key(code=141, names=('INT7',))
elif key in ('INT8',):
make_key(code=142, names=('INT8',))
elif key in ('INT9',):
make_key(code=143, names=('INT9',))
elif key in ('LANG1', 'HAEN'):
make_key(code=144, names=('LANG1', 'HAEN'))
elif key in ('LANG2', 'HAEJ'):
make_key(code=145, names=('LANG2', 'HAEJ'))
elif key in ('LANG3',):
make_key(code=146, names=('LANG3',))
elif key in ('LANG4',):
make_key(code=147, names=('LANG4',))
elif key in ('LANG5',):
make_key(code=148, names=('LANG5',))
elif key in ('LANG6',):
make_key(code=149, names=('LANG6',))
elif key in ('LANG7',):
make_key(code=150, names=('LANG7',))
elif key in ('LANG8',):
make_key(code=151, names=('LANG8',))
elif key in ('LANG9',):
make_key(code=152, names=('LANG9',))
# Consumer ("media") keys. Most known keys aren't supported here. A much
# longer list used to exist in this file, but the codes were almost certainly
# incorrect, conflicting with each other, or otherwise 'weird'. We'll add them
# back in piecemeal as needed. PRs welcome.
#
# A super useful reference for these is http://www.freebsddiary.org/APC/usb_hid_usages.php
# Note that currently we only have the PC codes. Recent MacOS versions seem to
# support PC media keys, so I don't know how much value we would get out of
# adding the old Apple-specific consumer codes, but again, PRs welcome if the
# lack of them impacts you.
elif key in ('AUDIO_MUTE', 'MUTE'):
make_consumer_key(code=226, names=('AUDIO_MUTE', 'MUTE')) # 0xE2
elif key in ('AUDIO_VOL_UP', 'VOLU'):
make_consumer_key(code=233, names=('AUDIO_VOL_UP', 'VOLU')) # 0xE9
elif key in ('AUDIO_VOL_DOWN', 'VOLD'):
make_consumer_key(code=234, names=('AUDIO_VOL_DOWN', 'VOLD')) # 0xEA
elif key in ('MEDIA_NEXT_TRACK', 'MNXT'):
make_consumer_key(code=181, names=('MEDIA_NEXT_TRACK', 'MNXT')) # 0xB5
elif key in ('MEDIA_PREV_TRACK', 'MPRV'):
make_consumer_key(code=182, names=('MEDIA_PREV_TRACK', 'MPRV')) # 0xB6
elif key in ('MEDIA_STOP', 'MSTP'):
make_consumer_key(code=183, names=('MEDIA_STOP', 'MSTP')) # 0xB7
elif key in ('MEDIA_PLAY_PAUSE', 'MPLY'):
make_consumer_key(
code=205, names=('MEDIA_PLAY_PAUSE', 'MPLY')
) # 0xCD (this may not be right)
elif key in ('MEDIA_EJECT', 'EJCT'):
make_consumer_key(code=184, names=('MEDIA_EJECT', 'EJCT')) # 0xB8
elif key in ('MEDIA_FAST_FORWARD', 'MFFD'):
make_consumer_key(code=179, names=('MEDIA_FAST_FORWARD', 'MFFD')) # 0xB3
elif key in ('MEDIA_REWIND', 'MRWD'):
make_consumer_key(code=180, names=('MEDIA_REWIND', 'MRWD')) # 0xB4
# Now try all the other weird special cases to get them out of our way:
# Internal, diagnostic, or auxiliary/enhanced keys
# NO and TRNS are functionally identical in how they (don't) mutate
# the state, but are tracked semantically separately, so create
# two keys with the exact same functionality
elif key in ('NO',):
elif key in ('NO', 'XXXXXXX'):
make_key(
names=('NO',),
names=('NO', 'XXXXXXX'),
on_press=handlers.passthrough,
on_release=handlers.passthrough,
)
@ -447,12 +118,6 @@ class KeyAttrDict(AttrDict):
on_press=handlers.debug_pressed,
on_release=handlers.passthrough,
)
elif key in ('GESC',):
make_key(
names=('GESC',),
on_press=handlers.gesc_pressed,
on_release=handlers.gesc_released,
)
elif key in ('BKDL',):
make_key(
names=('BKDL',),
@ -514,8 +179,204 @@ class KeyAttrDict(AttrDict):
elif key in ('HID_SWITCH', 'HID'):
make_key(names=('HID_SWITCH', 'HID'), on_press=handlers.hid_switch)
else:
raise ValueError('Invalid key')
return self.__getattr__(key)
maybe_key = first_truthy(
key,
# Modifiers
lambda key: left_pipe_until_some(
key,
maybe_make_mod_key,
(0x01, ('LEFT_CONTROL', 'LCTRL', 'LCTL')),
(0x02, ('LEFT_SHIFT', 'LSHIFT', 'LSFT')),
(0x04, ('LEFT_ALT', 'LALT')),
(0x08, ('LEFT_SUPER', 'LGUI', 'LCMD', 'LWIN')),
(0x10, ('RIGHT_CONTROL', 'RCTRL', 'RCTL')),
(0x20, ('RIGHT_SHIFT', 'RSHIFT', 'RSFT')),
(0x40, ('RIGHT_ALT', 'RALT')),
(0x80, ('RIGHT_SUPER', 'RGUI', 'RCMD', 'RWIN')),
# MEH = LCTL | LALT | LSFT# MEH = LCTL |
(0x07, ('MEH',)),
# HYPR = LCTL | LALT | LSFT | LGUI
(0x0F, ('HYPER', 'HYPR')),
),
lambda key: left_pipe_until_some(
key,
maybe_make_key,
# More ASCII standard keys
(40, ('ENTER', 'ENT', '\n')),
(41, ('ESCAPE', 'ESC')),
(42, ('BACKSPACE', 'BSPC', 'BKSP')),
(43, ('TAB', '\t')),
(44, ('SPACE', 'SPC', ' ')),
(45, ('MINUS', 'MINS', '-')),
(46, ('EQUAL', 'EQL', '=')),
(47, ('LBRACKET', 'LBRC', '[')),
(48, ('RBRACKET', 'RBRC', ']')),
(49, ('BACKSLASH', 'BSLASH', 'BSLS', '\\')),
(51, ('SEMICOLON', 'SCOLON', 'SCLN', ';')),
(52, ('QUOTE', 'QUOT', "'")),
(53, ('GRAVE', 'GRV', 'ZKHK', '`')),
(54, ('COMMA', 'COMM', ',')),
(55, ('DOT', '.')),
(56, ('SLASH', 'SLSH')),
# Function Keys
(58, ('F1',)),
(59, ('F2',)),
(60, ('F3',)),
(61, ('F4',)),
(62, ('F5',)),
(63, ('F6',)),
(64, ('F7',)),
(65, ('F8',)),
(66, ('F9',)),
(67, ('F10',)),
(68, ('F11',)),
(69, ('F12',)),
(104, ('F13',)),
(105, ('F14',)),
(106, ('F15',)),
(107, ('F16',)),
(108, ('F17',)),
(109, ('F18',)),
(110, ('F19',)),
(111, ('F20',)),
(112, ('F21',)),
(113, ('F22',)),
(114, ('F23',)),
(115, ('F24',)),
# Lock Keys, Navigation, etc.
(57, ('CAPS_LOCK', 'CAPSLOCK', 'CLCK', 'CAPS')),
# FIXME: Investigate whether this key actually works, and
# uncomment when/if it does.
# (130, ('LOCKING_CAPS', 'LCAP')),
(70, ('PRINT_SCREEN', 'PSCREEN', 'PSCR')),
(71, ('SCROLL_LOCK', 'SCROLLLOCK', 'SLCK')),
# FIXME: Investigate whether this key actually works, and
# uncomment when/if it does.
# (132, ('LOCKING_SCROLL', 'LSCRL')),
(72, ('PAUSE', 'PAUS', 'BRK')),
(73, ('INSERT', 'INS')),
(74, ('HOME',)),
(75, ('PGUP',)),
(76, ('DELETE', 'DEL')),
(77, ('END',)),
(78, ('PGDOWN', 'PGDN')),
(79, ('RIGHT', 'RGHT')),
(80, ('LEFT',)),
(81, ('DOWN',)),
(82, ('UP',)),
# Numpad
(83, ('NUM_LOCK', 'NUMLOCK', 'NLCK')),
# FIXME: Investigate whether this key actually works, and
# uncomment when/if it does.
# (131, names=('LOCKING_NUM', 'LNUM')),
(84, ('KP_SLASH', 'NUMPAD_SLASH', 'PSLS')),
(85, ('KP_ASTERISK', 'NUMPAD_ASTERISK', 'PAST')),
(86, ('KP_MINUS', 'NUMPAD_MINUS', 'PMNS')),
(87, ('KP_PLUS', 'NUMPAD_PLUS', 'PPLS')),
(88, ('KP_ENTER', 'NUMPAD_ENTER', 'PENT')),
(89, ('KP_1', 'P1', 'NUMPAD_1')),
(90, ('KP_2', 'P2', 'NUMPAD_2')),
(91, ('KP_3', 'P3', 'NUMPAD_3')),
(92, ('KP_4', 'P4', 'NUMPAD_4')),
(93, ('KP_5', 'P5', 'NUMPAD_5')),
(94, ('KP_6', 'P6', 'NUMPAD_6')),
(95, ('KP_7', 'P7', 'NUMPAD_7')),
(96, ('KP_8', 'P8', 'NUMPAD_8')),
(97, ('KP_9', 'P9', 'NUMPAD_9')),
(98, ('KP_0', 'P0', 'NUMPAD_0')),
(99, ('KP_DOT', 'PDOT', 'NUMPAD_DOT')),
(103, ('KP_EQUAL', 'PEQL', 'NUMPAD_EQUAL')),
(133, ('KP_COMMA', 'PCMM', 'NUMPAD_COMMA')),
(134, ('KP_EQUAL_AS400', 'NUMPAD_EQUAL_AS400')),
),
# Making life better for folks on tiny keyboards especially: exposes
# the 'shifted' keys as raw keys. Under the hood we're still
# sending Shift+(whatever key is normally pressed) to get these, so
# for example `KC_AT` will hold shift and press 2.
lambda key: left_pipe_until_some(
key,
maybe_make_shifted_key,
('GRAVE', ('TILDE', 'TILD', '~')),
('1', ('EXCLAIM', 'EXLM', '!')),
('2', ('AT', '@')),
('3', ('HASH', 'POUND', '#')),
('4', ('DOLLAR', 'DLR', '$')),
('5', ('PERCENT', 'PERC', '%')),
('6', ('CIRCUMFLEX', 'CIRC', '^')),
('7', ('AMPERSAND', 'AMPR', '&')),
('8', ('ASTERISK', 'ASTR', '*')),
('9', ('LEFT_PAREN', 'LPRN', '(')),
('0', ('RIGHT_PAREN', 'RPRN', ')')),
('MINUS', ('UNDERSCORE', 'UNDS', '_')),
('EQUAL', ('PLUS', '+')),
('LBRACKET', ('LEFT_CURLY_BRACE', 'LCBR', '{')),
('RBRACKET', ('RIGHT_CURLY_BRACE', 'RCBR', '}')),
('BACKSLASH', ('PIPE', '|')),
('SEMICOLON', ('COLON', 'COLN', ':')),
('QUOTE', ('DOUBLE_QUOTE', 'DQUO', 'DQT', '"')),
('COMMA', ('LEFT_ANGLE_BRACKET', 'LABK', '<')),
('DOT', ('RIGHT_ANGLE_BRACKET', 'RABK', '>')),
('SLSH', ('QUESTION', 'QUES', '?')),
),
# International
lambda key: left_pipe_until_some(
key,
maybe_make_key,
(50, ('NONUS_HASH', 'NUHS')),
(100, ('NONUS_BSLASH', 'NUBS')),
(101, ('APP', 'APPLICATION', 'SEL', 'WINMENU')),
(135, ('INT1', 'RO')),
(136, ('INT2', 'KANA')),
(137, ('INT3', 'JYEN')),
(138, ('INT4', 'HENK')),
(139, ('INT5', 'MHEN')),
(140, ('INT6',)),
(141, ('INT7',)),
(142, ('INT8',)),
(143, ('INT9',)),
(144, ('LANG1', 'HAEN')),
(145, ('LANG2', 'HAEJ')),
(146, ('LANG3',)),
(147, ('LANG4',)),
(148, ('LANG5',)),
(149, ('LANG6',)),
(150, ('LANG7',)),
(151, ('LANG8',)),
(152, ('LANG9',)),
),
# Consumer ("media") keys. Most known keys aren't supported here. A much
# longer list used to exist in this file, but the codes were almost certainly
# incorrect, conflicting with each other, or otherwise 'weird'. We'll add them
# back in piecemeal as needed. PRs welcome.
#
# A super useful reference for these is http://www.freebsddiary.org/APC/usb_hid_usages.php
# Note that currently we only have the PC codes. Recent MacOS versions seem to
# support PC media keys, so I don't know how much value we would get out of
# adding the old Apple-specific consumer codes, but again, PRs welcome if the
# lack of them impacts you.
lambda key: left_pipe_until_some(
key,
maybe_make_consumer_key,
(226, ('AUDIO_MUTE', 'MUTE')), # 0xE2
(233, ('AUDIO_VOL_UP', 'VOLU')), # 0xE9
(234, ('AUDIO_VOL_DOWN', 'VOLD')), # 0xEA
(181, ('MEDIA_NEXT_TRACK', 'MNXT')), # 0xB5
(182, ('MEDIA_PREV_TRACK', 'MPRV')), # 0xB6
(183, ('MEDIA_STOP', 'MSTP')), # 0xB7
(205, ('MEDIA_PLAY_PAUSE', 'MPLY')), # 0xCD (this may not be right)
(184, ('MEDIA_EJECT', 'EJCT')), # 0xB8
(179, ('MEDIA_FAST_FORWARD', 'MFFD')), # 0xB3
(180, ('MEDIA_REWIND', 'MRWD')), # 0xB4
),
)
if DEBUG_OUTPUT:
print(f'{key}: {maybe_key}')
if not maybe_key:
raise ValueError('Invalid key')
return self.__getattr__(key, depth=depth + 1)
# Global state, will be filled in througout this file, and
@ -810,12 +671,19 @@ def make_key(code=None, names=tuple(), type=KEY_SIMPLE, **kwargs): # NOQA
return key
def make_mod_key(*args, **kwargs):
return make_key(*args, **kwargs, type=KEY_MODIFIER)
def make_mod_key(code, names, *args, **kwargs):
return make_key(code, names, *args, **kwargs, type=KEY_MODIFIER)
def make_shifted_key(target_name, names=tuple()): # NOQA
key = KC.LSFT(KC[target_name])
# For... probably a few years, a bug existed here where keys were looked
# up by `KC[...]`, but that's incorrect: an AttrDit exposes a dictionary
# with attributes, but key-based dictionary access with brackets does
# *not* implicitly call __getattr__. We got away with this when key defs
# were not lazily created, but now that they are, shifted keys would
# sometimes break, complaining that they couldn't find their underlying
# key to shift. Fixed!
key = KC.LSFT(getattr(KC, target_name))
register_key_names(key, names)

View File

@ -64,7 +64,7 @@ class Split(Module):
self.UARTService = UARTService
except ImportError:
print('BLE Import error')
pass # BLE isn't supported on this platform
return # BLE isn't supported on this platform
self._ble = BLERadio()
self._ble_last_scan = ticks_ms() - 5000
self._connection_count = 0

View File

@ -7,11 +7,9 @@ import board
# from adafruit_display_text import label
from kb import KMKKeyboard
from kmk.extensions.rgb import RGB
from kmk.hid import HIDModes
from kmk.keys import KC
from kmk.modules.layers import Layers
from kmk.modules.power import Power
from kmk.modules.split import Split, SplitType
keyboard = KMKKeyboard()
@ -20,36 +18,10 @@ keyboard = KMKKeyboard()
keyboard.tap_time = 320
keyboard.debug_enabled = False
rgb_ext = RGB(
pixel_pin=keyboard.rgb_pixel_pin,
num_pixels=6,
val_limit=100,
hue_default=190,
sat_default=100,
val_default=5,
)
split = Split(split_type=SplitType.BLE)
power = Power(powersave_pin=keyboard.powersave_pin)
split = Split(split_type=SplitType.UART)
layers = Layers()
keyboard.modules = [split, power, layers]
keyboard.extensions = [rgb_ext]
enable_oled = False
'''
if enable_oled:
displayio.release_displays()
i2c = board.I2C()
display_bus = displayio.I2CDisplay(i2c, device_address=0x3c)
display = adafruit_displayio_ssd1306.SSD1306(display_bus, width=128, height=32)
splash = displayio.Group(max_size=10)
display.show(splash)
else:
displayio.release_displays()
'''
keyboard.i2c_deinit_count += 1
keyboard.modules = [split, layers]
_______ = KC.TRNS
XXXXXXX = KC.NO
@ -74,49 +46,12 @@ keyboard.keymap = [
#
[
# DVORAK
KC.GESC,
KC.QUOT,
KC.COMM,
KC.DOT,
KC.P,
KC.Y,
KC.F,
KC.G,
KC.C,
KC.R,
KC.L,
KC.BSPC,
TAB_SB,
KC.A,
KC.O,
KC.E,
KC.U,
KC.I,
KC.D,
KC.H,
KC.T,
KC.N,
KC.S,
KC.ENT,
KC.LSFT,
KC.SCLN,
KC.Q,
KC.J,
KC.K,
KC.X,
KC.B,
KC.M,
KC.W,
KC.V,
KC.Z,
KC.SLSH,
KC.LALT,
SUPER_L,
LT1_SP,
LT2_SP,
KC.LCTL,
KC.N0,
KC.GESC, KC.QUOT, KC.COMM, KC.DOT, KC.P, KC.Y, KC.F, KC.G, KC.C, KC.R, KC.L, KC.BSPC, \
TAB_SB, KC.A, KC.O, KC.E, KC.U, KC.I, KC.D, KC.H, KC.T, KC.N, KC.S, KC.ENT, \
KC.LSFT, KC.SCLN, KC.Q, KC.J, KC.K, KC.X, KC.B, KC.M, KC.W, KC.V, KC.Z, KC.SLSH, \
KC.LALT, SUPER_L, LT1_SP, LT2_SP, KC.LCTL, KC.NO,
],
# GAMING
# ,-----------------------------------------. ,-----------------------------------------.
# | Tab | ' | , | . | P | Y | | F | G | C | R | L | BKSP |
@ -131,48 +66,10 @@ keyboard.keymap = [
#
[
# GAMING
KC.ESC,
KC.QUOT,
KC.COMM,
KC.DOT,
KC.P,
KC.Y,
KC.F,
KC.G,
KC.C,
KC.R,
KC.L,
KC.BSPC,
KC.LCTL,
KC.A,
KC.O,
KC.E,
KC.U,
KC.I,
KC.D,
KC.H,
KC.T,
KC.N,
KC.S,
KC.ENT,
KC.LSFT,
KC.SCLN,
KC.Q,
KC.J,
KC.K,
KC.X,
KC.B,
KC.M,
KC.W,
KC.V,
KC.Z,
KC.SLSH,
KC.LALT,
KC.SPC,
KC.SPC,
LT2_SP,
KC.LCTL,
KC.UP,
KC.ESC, KC.QUOT, KC.COMM, KC.DOT, KC.P, KC.Y, KC.F, KC.G, KC.C, KC.R, KC.L, KC.BSPC, \
KC.LCTL, KC.A, KC.O, KC.E, KC.U, KC.I, KC.D, KC.H, KC.T, KC.N, KC.S, KC.ENT, \
KC.LSFT, KC.SCLN, KC.Q, KC.J, KC.K, KC.X, KC.B, KC.M, KC.W, KC.V, KC.Z, KC.SLSH, \
KC.LALT, KC.SPC, KC.SPC, LT2_SP, KC.LCTL, KC.UP,
],
# RAISE1
# ,-----------------------------------------. ,-----------------------------------------.
@ -188,48 +85,10 @@ keyboard.keymap = [
#
[
# RAISE1
_______,
_______,
_______,
_______,
_______,
_______,
KC.PS_TOG,
XXXXXXX,
KC.N7,
KC.N8,
KC.N9,
KC.DEL,
_______,
_______,
_______,
_______,
_______,
_______,
XXXXXXX,
XXXXXXX,
KC.N4,
KC.N5,
KC.N6,
KC.BSLS,
_______,
_______,
_______,
_______,
_______,
_______,
XXXXXXX,
XXXXXXX,
KC.N1,
KC.N2,
KC.N3,
KC.MINS,
_______,
_______,
_______,
_______,
KC.EQL,
KC.N0,
_______, _______, _______, _______, _______, _______, XXXXXXX, XXXXXXX, KC.N7, KC.N8, KC.N9, KC.DEL, \
_______, _______, _______, _______, _______, _______, XXXXXXX, XXXXXXX, KC.N4, KC.N5, KC.N6, KC.BSLS, \
_______, _______, _______, _______, _______, _______, XXXXXXX, XXXXXXX, KC.N1, KC.N2, KC.N3, KC.MINS, \
_______, _______, _______, _______, KC.EQL, KC.N0,
],
# RAISE2
# ,-----------------------------------------. ,-----------------------------------------.
@ -243,50 +102,13 @@ keyboard.keymap = [
# | | |/ / \ \ | | |
# `---------------------' '------''-------------'
#
[
# RAISE2
_______,
KC.F9,
KC.F10,
KC.F11,
KC.F12,
_______,
_______,
_______,
_______,
KC.LBRC,
KC.RBRC,
KC.LSHIFT(KC.INS),
_______,
KC.F5,
KC.F6,
KC.F7,
KC.F8,
_______,
KC.HOME,
KC.LEFT,
KC.DOWN,
KC.UP,
KC.RGHT,
KC.END,
_______,
KC.F1,
KC.F2,
KC.F3,
KC.F4,
_______,
_______,
_______,
_______,
_______,
_______,
KC.BSLS,
_______,
_______,
_______,
_______,
KC.DF(0),
KC.DF(1),
_______, KC.F9, KC.F10, KC.F11, KC.F12, _______, _______, _______, _______, KC.LBRC, KC.RBRC, KC.LSHIFT(KC.INS), \
_______, KC.F5, KC.F6, KC.F7, KC.F8, _______, KC.HOME, KC.LEFT, KC.DOWN, KC.UP, KC.RGHT, KC.END, \
_______, KC.F1, KC.F2, KC.F3, KC.F4, _______, _______, _______, _______, _______, _______, KC.BSLS, \
_______, _______, _______, _______, KC.DF(0), KC.DF(1),
],
# GUI
# ,-----------------------------------------. ,-----------------------------------------.
@ -299,109 +121,36 @@ keyboard.keymap = [
# | LALT | LGUI | /LT1_SP / \LT2_SP\ | | |
# | | |/ / \ \ | | |
# `---------------------' '------''-------------'
[
# GUI
_______,
KC.N1,
KC.N2,
KC.N3,
KC.N4,
KC.N5,
_______,
_______,
_______,
_______,
_______,
_______,
_______,
KC.N6,
KC.N7,
KC.N8,
KC.N9,
KC.N0,
_______,
_______,
_______,
_______,
_______,
_______,
_______,
_______,
_______,
_______,
_______,
_______,
_______,
_______,
_______,
_______,
_______,
_______,
_______,
_______,
_______,
_______,
_______,
_______,
_______, KC.N1, KC.N2, KC.N3, KC.N4, KC.N5, _______, _______, _______, _______, _______, _______, \
_______, KC.N6, KC.N7, KC.N8, KC.N9, KC.N0, _______, _______, _______, _______, _______, _______, \
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
_______, _______, _______, _______, _______, _______ \
],
# SYMBOLS
# ,-----------------------------------------. ,-----------------------------------------.
# | | ! | @ | # | $ | % | | ^ | & | * | ( | ) | Del |
# |------+------+------+------+------+------| |------+------+------+------+------+------|
# | | | | | | | | | | | [ | ] | |
# |------+------+------+------+------+------| |------+------+------+------+------+------|
# | | | | | | |-------. ,-------| | | | | | |
# `-----------------------------------------/ / \ \-----------------------------------------'
# | LALT | LGUI | /LT1_SP / \LT2_SP\ | | |
# | | |/ / \ \ | | |
# `---------------------' '------''-------------'
#
# SYMBOLS
# ,-----------------------------------------. ,-----------------------------------------.
# | | ! | @ | # | $ | % | | ^ | & | * | ( | ) | Del |
# |------+------+------+------+------+------| |------+------+------+------+------+------|
# | | | | | | | | | | | [ | ] | |
# |------+------+------+------+------+------| |------+------+------+------+------+------|
# | | | | | | |-------. ,-------| | | | | | |
# `-----------------------------------------/ / \ \-----------------------------------------'
# | LALT | LGUI | /LT1_SP / \LT2_SP\ | | |
# | | |/ / \ \ | | |
# `---------------------' '------''-------------'
#
[
# SYMBOLS
_______,
KC.EXLM,
KC.AT,
KC.HASH,
KC.DLR,
KC.PERC,
KC.CIRC,
KC.AMPR,
KC.ASTR,
KC.LPRN,
KC.RPRN,
KC.DEL,
_______,
KC.RGB_HUI,
KC.RGB_HUD,
KC.RGB_VAI,
KC.RGB_VAD,
_______,
_______,
_______,
_______,
KC.LBRC,
KC.RBRC,
_______,
_______,
KC.RGB_RST,
_______,
_______,
_______,
_______,
_______,
_______,
_______,
_______,
_______,
_______,
KC.RGB_TOG,
_______,
_______,
_______,
_______,
_______,
],
_______, KC.EXLM, KC.AT, KC.HASH, KC.DLR, KC.PERC, KC.CIRC, KC.AMPR, KC.ASTR, KC.LPRN, KC.RPRN, KC.DEL, \
_______, _______, _______, _______, _______, _______, _______, _______, _______, KC.LBRC, KC.RBRC, _______, \
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \
_______, _______, _______, _______, _______, _______,
]
]
if __name__ == '__main__':
keyboard.go(hid_type=HIDModes.BLE)
keyboard.go(hid_type=HIDModes.USB)