diff --git a/kmk/common/keycodes.py b/kmk/common/keycodes.py index 498801b..a1ecbc9 100644 --- a/kmk/common/keycodes.py +++ b/kmk/common/keycodes.py @@ -513,11 +513,38 @@ ALL_KEYS = KC = AttrDict({ }) char_lookup = { - "\n": (Keycodes.Common.KC_ENTER,), - "\t": (Keycodes.Common.KC_TAB,), - ' ': (Keycodes.Common.KC_SPACE,), - '-': (Keycodes.Common.KC_MINUS,), - '=': (Keycodes.Common.KC_EQUAL,), - '+': (Keycodes.Common.KC_EQUAL, Keycodes.Modifiers.KC_LSHIFT), - '~': (Keycodes.Common.KC_GRAVE,), + "\n": Common.KC_ENTER, + "\t": Common.KC_TAB, + ' ': Common.KC_SPACE, + '-': Common.KC_MINUS, + '=': Common.KC_EQUAL, + '[': Common.KC_LBRACKET, + ']': 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, } diff --git a/kmk/common/macros/simple.py b/kmk/common/macros/simple.py index b901338..91e6680 100644 --- a/kmk/common/macros/simple.py +++ b/kmk/common/macros/simple.py @@ -1,5 +1,8 @@ +import string + from kmk.common.event_defs import (hid_report_event, keycode_down_event, keycode_up_event) +from kmk.common.keycodes import Keycodes, char_lookup from kmk.common.macros import KMKMacro @@ -15,3 +18,22 @@ def simple_key_sequence(seq): yield hid_report_event() 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) diff --git a/kmk/micropython/pyb_hid.py b/kmk/micropython/pyb_hid.py index 1d6eb72..49e2977 100644 --- a/kmk/micropython/pyb_hid.py +++ b/kmk/micropython/pyb_hid.py @@ -1,12 +1,11 @@ import logging -import string from pyb import USB_HID, delay, hid_keyboard from kmk.common.consts import HID_REPORT_STRUCTURE, HIDReportTypes from kmk.common.event_defs import HID_REPORT_EVENT from kmk.common.keycodes import (FIRST_KMK_INTERNAL_KEYCODE, ConsumerKeycode, - Keycodes, ModifierKeycode, char_lookup) + ModifierKeycode) def generate_pyb_hid_descriptor(): @@ -16,14 +15,6 @@ def generate_pyb_hid_descriptor(): 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): self.logger = logging.getLogger(__name__) self.logger.setLevel(log_level) @@ -111,39 +102,6 @@ class HIDHelper: 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): for idx, _ in enumerate(self.report_keys): self.report_keys[idx] = 0x00 diff --git a/user_keymaps/klardotsh/threethree_matrix_pyboard.py b/user_keymaps/klardotsh/threethree_matrix_pyboard.py index 5c27bdb..772a5c8 100644 --- a/user_keymaps/klardotsh/threethree_matrix_pyboard.py +++ b/user_keymaps/klardotsh/threethree_matrix_pyboard.py @@ -2,7 +2,7 @@ import machine from kmk.common.consts import DiodeOrientation, UnicodeModes 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.entrypoints.handwire.pyboard import main @@ -13,7 +13,7 @@ rows = (p.X1, p.X2, p.X3) diode_orientation = DiodeOrientation.COLUMNS unicode_mode = UnicodeModes.LINUX -MACRO_TEST_STRING = simple_key_sequence([ +MACRO_TEST_SIMPLE = simple_key_sequence([ KC.LSHIFT(KC.H), KC.E, KC.L, @@ -28,6 +28,8 @@ MACRO_TEST_STRING = simple_key_sequence([ 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([ "28", "30ce", @@ -55,7 +57,7 @@ keymap = [ ], [ [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], ], [