diff --git a/kmk/common/keycodes.py b/kmk/common/keycodes.py index a1ecbc9..0a83005 100644 --- a/kmk/common/keycodes.py +++ b/kmk/common/keycodes.py @@ -40,12 +40,15 @@ class RawKeycodes: KC_UC_MODE = 1109 + KC_MACRO_SLEEP_MS = 1110 + # These shouldn't have all the fancy shenanigans Keycode allows # such as no_press, because they modify KMK internal state in # ways we need to tightly control. Thus, we can get away with # a lighter-weight namedtuple implementation here LayerKeycode = namedtuple('LayerKeycode', ('code', 'layer')) +MacroSleepKeycode = namedtuple('MacroSleepKeycode', ('code', 'ms')) class UnicodeModeKeycode(namedtuple('UnicodeModeKeycode', ('code', 'mode'))): @@ -455,6 +458,10 @@ class KMK(KeycodeCategory): ) KC_UC_MODE_WINC = UnicodeModeKeycode.from_mode_const(UnicodeModes.WINC) + @staticmethod + def KC_MACRO_SLEEP_MS(ms): + return MacroSleepKeycode(RawKeycodes.KC_MACRO_SLEEP_MS, ms) + class Layers(KeycodeCategory): @staticmethod diff --git a/kmk/common/macros/simple.py b/kmk/common/macros/simple.py index 91e6680..128779b 100644 --- a/kmk/common/macros/simple.py +++ b/kmk/common/macros/simple.py @@ -2,13 +2,18 @@ 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.keycodes import Keycodes, RawKeycodes, char_lookup from kmk.common.macros import KMKMacro +from kmk.common.util import sleep_ms def simple_key_sequence(seq): def _simple_key_sequence(state): for key in seq: + if key.code == RawKeycodes.KC_MACRO_SLEEP_MS: + sleep_ms(key.ms) + continue + if not getattr(key, 'no_press', None): yield keycode_down_event(key) yield hid_report_event() diff --git a/kmk/common/util.py b/kmk/common/util.py index 2ff06d1..e90d85b 100644 --- a/kmk/common/util.py +++ b/kmk/common/util.py @@ -29,3 +29,16 @@ def reset_bootloader(): import microcontroller microcontroller.on_next_reset(microcontroller.RunMode.BOOTLOADER) microcontroller.reset() + + +def sleep_ms(ms): + ''' + Tries to sleep for a number of milliseconds in a cross-implementation + way. Will raise an ImportError if time is not available on the platform. + ''' + try: + import time + time.sleep_ms(ms) + except AttributeError: + import time + time.sleep(ms / 1000) diff --git a/user_keymaps/klardotsh/threethree_matrix_pyboard.py b/user_keymaps/klardotsh/threethree_matrix_pyboard.py index 772a5c8..cb48d77 100644 --- a/user_keymaps/klardotsh/threethree_matrix_pyboard.py +++ b/user_keymaps/klardotsh/threethree_matrix_pyboard.py @@ -22,6 +22,8 @@ MACRO_TEST_SIMPLE = simple_key_sequence([ KC.SPACE, + KC.MACRO_SLEEP_MS(500), + KC.LSHIFT(KC.K), KC.LSHIFT(KC.M), KC.LSHIFT(KC.K),