From e409fb47f27f9cf56479928ed86eb2eb346eec54 Mon Sep 17 00:00:00 2001 From: DennyTom Date: Tue, 7 Apr 2020 04:13:17 -0700 Subject: DennyTom's buttery_engine (#8138) * Selectively adding pieces * Adding georgi keymap * Adding more files, fixing make * Smaller makefiles * Fixing make rules * README more inline with QMK's guidelines * Turning off buggy assert * Improving documentation based on a user feedback. * Slightly better schema * Resurrected state machine diagram --- .../chording_engine/keymap_def.schema.json | 337 +++++++++++++++++++++ 1 file changed, 337 insertions(+) create mode 100644 users/dennytom/chording_engine/keymap_def.schema.json (limited to 'users/dennytom/chording_engine/keymap_def.schema.json') diff --git a/users/dennytom/chording_engine/keymap_def.schema.json b/users/dennytom/chording_engine/keymap_def.schema.json new file mode 100644 index 0000000000..9f9a8c5cbc --- /dev/null +++ b/users/dennytom/chording_engine/keymap_def.schema.json @@ -0,0 +1,337 @@ +{ + "definitions": {}, + "$schema": "http://json-schema.org/draft-07/schema#", + "type": "object", + "title": "The Keymap definition", + "required": [ + "keys", + "parameters", + "layers", + "chord_sets", + "pseudolayers", + "leader_sequences", + "extra_code", + "extra_dependencies" + ], + "properties": { + "keys": { + "type": "array", + "title": "The Internal Keycodes", + "description": "Name Keycodes for the Chording Engine. These can be any string except already valid QMK keycodes.", + "items": { + "type": "string", + "title": "Individual Keycode", + "examples": [ + "L1", + "R1", + "TOP1", + "THUMB_3", + "Bottom_6" + ] + } + }, + "parameters": { + "type": "object", + "title": "Keyboard Parameters", + "description": "Keyboard, user and layout specific parameters like timers, max length for buffers and default pseudolayer.", + "required": [ + "layout_function_name", + "chord_timeout", + "dance_timeout", + "leader_timeout", + "tap_timeout", + "command_max_length", + "leader_max_length", + "dynamic_macro_max_length", + "string_max_length", + "long_press_multiplier", + "default_pseudolayer" + ], + "properties": { + "layout_function_name": { + "type": "string", + "examples": [ + "LAYOUT_ginny", + "" + ] + }, + "chord_timeout": { + "type": "integer", + "title": "The Chord Timeout", + "description": "The time in ms you have to press additional keys before the engine assumes you finished pressing keys that are part of a chord.", + "default": 100 + }, + "dance_timeout": { + "type": "integer", + "title": "The Dance Timeout", + "description": "The time in ms you have to repeatedly activate a chord before the engine assumes you finished a dance.", + "default": 200 + }, + "leader_timeout": { + "type": "integer", + "title": "The Leader Timeout", + "description": "The time in ms you have to activate additional chords before the engine assumes you finished adding chords to a leader sequence.", + "default": 750 + }, + "tap_timeout": { + "type": "integer", + "title": "The Tap Timeout", + "description": "The time in ms you have to finish pressing a chord before the engine assumes that you didn't just tap it but are holding it down.", + "default": 50 + }, + "command_max_length": { + "type": "integer", + "title": "Command Max Length", + "description": "The maximum length for chords buffered in command mode.", + "default": 5 + }, + "leader_max_length": { + "type": "integer", + "title": "Leader Max Length", + "description": "The maximum length of leader sequences you can define in your keymap", + "default": 5 + }, + "dynamic_macro_max_length": { + "type": "integer", + "title": "Dynamic Macro Max Length", + "description": "The maximum number of chords (including Dynamic Macro Next) you can record to a Dynamic Macro", + "default": 20 + }, + "string_max_length": { + "type": "integer", + "title": "String Max Length", + "description": "The maximum length of a string that the STR() chord can accept.", + "default": 16 + }, + "long_press_multiplier": { + "type": "integer", + "title": "Long Press Multiplier", + "description": "How many times does the chord timer have expire before a chord is registered as not only held but in a long press (for example for Autoshift). Has to be integer.", + "default": 3 + }, + "default_pseudolayer": { + "type": "string", + "title": "Default Pseudolayer", + "description": "Which pseudolayer should be active when the keyboard starts / restarts.", + "examples": [ + "BASE", + "QWERTY" + ] + } + } + }, + "layers": { + "type": "array", + "title": "QMK Layers", + "description": "The layers QMK needs to know about. Can contain chording engine's internal keycodes or QMK's keycodes. Do not define chords here, those belong in pseudolayers.", + "minItems": 1, + "uniqueItems": false, + "items": { + "type": "object", + "title": "Individual Layers", + "required": [ + "type" + ], + "properties": { + "type": { + "type": "string", + "title": "Type of Individual Layers", + "description": "Auto layer fills all keycodes to be chording engine's internal keycodes, manual let's you place internal and QMK's keycodes however you wish.", + "examples": [ + "auto", + "manual" + ] + }, + "keycodes": { + "type": "array", + "title": "Individual Chord", + "description": "A list of of keys that need to be pressed to activate this chord", + "items": { + "type": "string", + "title": "Individual Keycodes", + "description": "A keycode that is a part of the individual chord. Has to be an internal keycode." + } + } + } + } + }, + "chord_sets": { + "type": "array", + "title": "Chord Sets Definitions", + "description": "Describes predefined sets of chords to ease defining a number of chords in a pseudolayer.", + "items": { + "type": "object", + "required": [ + "name", + "chords" + ], + "properties": { + "name": { + "type": "string", + "title": "Name of the Set", + "examples": [ + "rows", + "asetniop" + ] + }, + "chords": { + "type": "array", + "title": "Chords", + "description": "List of all chords in this set", + "minItems": 1, + "uniqueItems": true, + "items": { + "type": "array", + "title": "Individual Chord", + "description": "A list of of keys that need to be pressed to activate this chord", + "items": { + "type": "string", + "title": "Individual Keycodes", + "description": "A keycode that is a part of the individual chord. Has to be an internal keycode." + } + } + } + } + } + }, + "pseudolayers": { + "type": "array", + "title": "Pseudolayers", + "description": "The pseudolayers holding the chords to be processed by the chording engine.", + "minItems": 1, + "uniqueItems": true, + "items": { + "type": "object", + "required": [ + "name" + ], + "properties": { + "name": { + "type": "string", + "title": "Name of the Pseudolayer", + "default": null, + "examples": [ + "ALWAYS_ON", + "QWERTY" + ] + }, + "chords": { + "type": "array", + "title": "Chords", + "description": "List of chords belonging on the pseudolayer.", + "items": { + "type": "object", + "required": [ + "type" + ], + "properties": { + "type": { + "type": "string", + "title": "Type of the chord array", + "description": "Defines how this objects describes one or more chords.", + "examples": [ + "visual_array", + "visual", + "simple", + "chord_set" + ] + }, + "keys": { + "type": "array", + "title": "Subset of keys", + "description": "Subset of internal keycodes that will be used when defining the chords. For visual_array type only.", + "examples": [ + "[\"L1\", \"L2\", \"L3\", \"L4\", \"R1\", \"R2\", \"R3\", \"R4\"]" + ], + "items": { + "type": "string" + } + }, + "dictionary": { + "type": "array", + "title": "Dictionary", + "description": "A table. Each row defines in a visual way which keys have to be pressed and what is the desired outcome. For visual_array type only.", + "items": { + "type": "array", + "items": { + "type": "string", + "examples": [ + "[\"X"\, \" "\, \" "\, \"X"\, \"X"\, \" "\, \" "\, \"X"\, \"MO(BASE, NUM)\"] + ] + } + } + }, + "keycode": { + "type": "string", + "title": "Keycode", + "description": "A keycode to be assigned to the chord when it is registered. For simple and visual types only." + }, + "set": { + "type": "string", + "title": "Chord set", + "description": "Name of the chord set to be used. Has to be one already defined in the chord_sets array. For chord_set type only." + }, + "keycodes": { + "type": "array", + "title": "Keycodes", + "description": "List of keycodes to be assigned to each chord when it is registered. For set type only.", + "items": { + "type": "string" + } + }, + "chord": { + "type": "array", + "title": "Chord", + "description": "Array of \"X\"'s and \" \"'s that shows which keys have to be pressed to activate the chord. For visual type only ", + "items": { + "type": "string" + } + } + } + } + } + } + } + }, + "leader_sequences": { + "type": "array", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string", + "examples": ["fn_L1"] + }, + "function": { + "type": "string", + "description": "C code the sequence should run. Instead of here, can be defined in extra_dependencies or extra_code", + "examples": ["void fn_L1(void) { SEND(KC_LCTL); SEND(KC_LALT); SEND(KC_DEL); }"] + }, + "sequence": { + "type": "array", + "items": { + "type": "string" + }, + "examples": [["KC_Q", "KC_Z"]] + } + } + } + }, + "extra_code": { + "type": "string", + "label": "Extra Code", + "description": "C code to be inserted into the generated keymap", + "examples": ["void fn_L1(void) {\n SEND(KC_LCTL);\n SEND(KC_LALT);\n SEND(KC_DEL);\n}\n"], + "default": "" + }, + "extra_dependencies": { + "type": "array", + "label": "Extra Dependencies", + "description": "List of files to be #include'd in the generated keymap", + "examples": [ + "[\"user_functions.c\"]" + ], + "default": "" + } + } +} \ No newline at end of file -- cgit v1.2.3