Support a massively-enhanced SEND_STRING equivalent

This commit is contained in:
Josh Klar 2018-09-30 21:14:30 -07:00
parent 96b5c4ee03
commit 2c05efa805
No known key found for this signature in database
GPG Key ID: 220F99BD7DB7A99E
4 changed files with 62 additions and 53 deletions
kmk
common
micropython
user_keymaps/klardotsh

@ -513,11 +513,38 @@ ALL_KEYS = KC = AttrDict({
}) })
char_lookup = { char_lookup = {
"\n": (Keycodes.Common.KC_ENTER,), "\n": Common.KC_ENTER,
"\t": (Keycodes.Common.KC_TAB,), "\t": Common.KC_TAB,
' ': (Keycodes.Common.KC_SPACE,), ' ': Common.KC_SPACE,
'-': (Keycodes.Common.KC_MINUS,), '-': Common.KC_MINUS,
'=': (Keycodes.Common.KC_EQUAL,), '=': Common.KC_EQUAL,
'+': (Keycodes.Common.KC_EQUAL, Keycodes.Modifiers.KC_LSHIFT), '[': Common.KC_LBRACKET,
'~': (Keycodes.Common.KC_GRAVE,), ']': Common.KC_RBRACKET,
"\\": Common.KC_BACKSLASH,
';': Common.KC_SEMICOLON,
"'": Common.KC_QUOTE,
'`': Common.KC_GRAVE,
',': Common.KC_COMMA,
'.': Common.KC_DOT,
'~': ShiftedKeycodes.KC_TILDE,
'!': ShiftedKeycodes.KC_EXCLAIM,
'@': ShiftedKeycodes.KC_AT,
'#': ShiftedKeycodes.KC_HASH,
'$': ShiftedKeycodes.KC_DOLLAR,
'%': ShiftedKeycodes.KC_PERCENT,
'^': ShiftedKeycodes.KC_CIRCUMFLEX,
'&': ShiftedKeycodes.KC_AMPERSAND,
'*': ShiftedKeycodes.KC_ASTERISK,
'(': ShiftedKeycodes.KC_LEFT_PAREN,
')': ShiftedKeycodes.KC_RIGHT_PAREN,
'_': ShiftedKeycodes.KC_UNDERSCORE,
'+': ShiftedKeycodes.KC_PLUS,
'{': ShiftedKeycodes.KC_LEFT_CURLY_BRACE,
'}': ShiftedKeycodes.KC_RIGHT_CURLY_BRACE,
'|': ShiftedKeycodes.KC_PIPE,
':': ShiftedKeycodes.KC_COLON,
'"': ShiftedKeycodes.KC_DOUBLE_QUOTE,
'<': ShiftedKeycodes.KC_LEFT_ANGLE_BRACKET,
'>': ShiftedKeycodes.KC_RIGHT_ANGLE_BRACKET,
'?': ShiftedKeycodes.KC_QUESTION,
} }

@ -1,5 +1,8 @@
import string
from kmk.common.event_defs import (hid_report_event, keycode_down_event, from kmk.common.event_defs import (hid_report_event, keycode_down_event,
keycode_up_event) keycode_up_event)
from kmk.common.keycodes import Keycodes, char_lookup
from kmk.common.macros import KMKMacro from kmk.common.macros import KMKMacro
@ -15,3 +18,22 @@ def simple_key_sequence(seq):
yield hid_report_event() yield hid_report_event()
return KMKMacro(keydown=_simple_key_sequence) return KMKMacro(keydown=_simple_key_sequence)
def send_string(message):
seq = []
for char in message:
kc = None
if char in char_lookup:
kc = char_lookup[char]
elif char in string.ascii_letters + string.digits:
kc = getattr(Keycodes.Common, 'KC_{}'.format(char.upper()))
if char.isupper():
kc = Keycodes.Modifiers.KC_LSHIFT(kc)
seq.append(kc)
return simple_key_sequence(seq)

@ -1,12 +1,11 @@
import logging import logging
import string
from pyb import USB_HID, delay, hid_keyboard from pyb import USB_HID, delay, hid_keyboard
from kmk.common.consts import HID_REPORT_STRUCTURE, HIDReportTypes from kmk.common.consts import HID_REPORT_STRUCTURE, HIDReportTypes
from kmk.common.event_defs import HID_REPORT_EVENT from kmk.common.event_defs import HID_REPORT_EVENT
from kmk.common.keycodes import (FIRST_KMK_INTERNAL_KEYCODE, ConsumerKeycode, from kmk.common.keycodes import (FIRST_KMK_INTERNAL_KEYCODE, ConsumerKeycode,
Keycodes, ModifierKeycode, char_lookup) ModifierKeycode)
def generate_pyb_hid_descriptor(): def generate_pyb_hid_descriptor():
@ -16,14 +15,6 @@ def generate_pyb_hid_descriptor():
class HIDHelper: class HIDHelper:
'''
Most methods here return `self` upon completion, allowing chaining:
```python
myhid = HIDHelper()
myhid.send_string('testing').send_string(' ... and testing again')
```
'''
def __init__(self, store, log_level=logging.NOTSET): def __init__(self, store, log_level=logging.NOTSET):
self.logger = logging.getLogger(__name__) self.logger = logging.getLogger(__name__)
self.logger.setLevel(log_level) self.logger.setLevel(log_level)
@ -111,39 +102,6 @@ class HIDHelper:
return self return self
def send_string(self, message):
'''
Clears the HID report, and sends along a string of arbitrary length.
All keys will be removed at the completion of the string. Modifiers
are not really supported here, though Shift will be added if
necessary to output the key.
'''
self.clear_all()
self.send()
for char in message:
kc = None
modifier = None
if char in char_lookup:
kc, modifier = char_lookup[char]
elif char in string.ascii_letters + string.digits:
kc = getattr(Keycodes.Common, 'KC_{}'.format(char.upper()))
modifier = Keycodes.Modifiers.KC_SHIFT if char.isupper() else None
if modifier:
self.add_modifier(modifier)
self.add_key(kc)
self.send()
# Release all keys or we'll forever hold whatever the last keyadd was
self.clear_all()
self.send()
return self
def clear_all(self): def clear_all(self):
for idx, _ in enumerate(self.report_keys): for idx, _ in enumerate(self.report_keys):
self.report_keys[idx] = 0x00 self.report_keys[idx] = 0x00

@ -2,7 +2,7 @@ import machine
from kmk.common.consts import DiodeOrientation, UnicodeModes from kmk.common.consts import DiodeOrientation, UnicodeModes
from kmk.common.keycodes import KC from kmk.common.keycodes import KC
from kmk.common.macros.simple import simple_key_sequence from kmk.common.macros.simple import send_string, simple_key_sequence
from kmk.common.macros.unicode import unicode_sequence from kmk.common.macros.unicode import unicode_sequence
from kmk.entrypoints.handwire.pyboard import main from kmk.entrypoints.handwire.pyboard import main
@ -13,7 +13,7 @@ rows = (p.X1, p.X2, p.X3)
diode_orientation = DiodeOrientation.COLUMNS diode_orientation = DiodeOrientation.COLUMNS
unicode_mode = UnicodeModes.LINUX unicode_mode = UnicodeModes.LINUX
MACRO_TEST_STRING = simple_key_sequence([ MACRO_TEST_SIMPLE = simple_key_sequence([
KC.LSHIFT(KC.H), KC.LSHIFT(KC.H),
KC.E, KC.E,
KC.L, KC.L,
@ -28,6 +28,8 @@ MACRO_TEST_STRING = simple_key_sequence([
KC.EXCLAIM, KC.EXCLAIM,
]) ])
MACRO_TEST_STRING = send_string("Hello! from, uhhhh, send_string | and some other WEIRD STUFF` \\ like this' \"\t[]")
ANGRY_TABLE_FLIP = unicode_sequence([ ANGRY_TABLE_FLIP = unicode_sequence([
"28", "28",
"30ce", "30ce",
@ -55,7 +57,7 @@ keymap = [
], ],
[ [
[KC.VOLU, KC.MUTE, ANGRY_TABLE_FLIP], [KC.VOLU, KC.MUTE, ANGRY_TABLE_FLIP],
[KC.TRNS, KC.PIPE, KC.MEDIA_PLAY_PAUSE], [KC.TRNS, KC.PIPE, MACRO_TEST_SIMPLE],
[KC.VOLD, KC.P, MACRO_TEST_STRING], [KC.VOLD, KC.P, MACRO_TEST_STRING],
], ],
[ [