* 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
		
			
				
	
	
		
			337 lines
		
	
	
		
			No EOL
		
	
	
		
			11 KiB
		
	
	
	
		
			JSON
		
	
	
	
	
	
			
		
		
	
	
			337 lines
		
	
	
		
			No EOL
		
	
	
		
			11 KiB
		
	
	
	
		
			JSON
		
	
	
	
	
	
{
 | 
						|
  "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": ""
 | 
						|
    }
 | 
						|
  }
 | 
						|
} |