Browse Source

Configure keyboard matrix from info.json (#10817)

* Make parameters from info.json available to the build system

* move all clueboard settings to info.json

* code formatting

* make flake8 happy

* make flake8 happy

* make qmk lint happy

* Add support for specifying led indicators in json

* move led indicators to the clueboard info.json

* Apply suggestions from code review

Co-authored-by: Erovia <Erovia@users.noreply.github.com>

* add missing docstring

Co-authored-by: Erovia <Erovia@users.noreply.github.com>
master
Zach White 1 year ago committed by GitHub
parent
commit
47b9b11009
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 4
      Makefile
  2. 33
      build_keyboard.mk
  3. 157
      docs/reference_info_json.md
  4. 33
      keyboards/clueboard/17/17.h
  5. 69
      keyboards/clueboard/17/config.h
  6. 79
      keyboards/clueboard/17/info.json
  7. 1
      keyboards/clueboard/17/keymaps/default/readme.md
  8. 10
      keyboards/clueboard/17/rules.mk
  9. 74
      keyboards/clueboard/2x1800/2018/2018.h
  10. 172
      keyboards/clueboard/2x1800/2018/config.h
  11. 444
      keyboards/clueboard/2x1800/2018/info.json
  12. 12
      keyboards/clueboard/2x1800/2018/rules.mk
  13. 221
      keyboards/clueboard/2x1800/2019/2019.h
  14. 168
      keyboards/clueboard/2x1800/2019/config.h
  15. 2368
      keyboards/clueboard/2x1800/2019/info.json
  16. 2
      keyboards/clueboard/2x1800/2019/keymaps/default/keymap.json
  17. 13
      keyboards/clueboard/2x1800/2019/rules.mk
  18. 5
      keyboards/clueboard/2x1800/info.json
  19. 87
      keyboards/clueboard/60/60.h
  20. 98
      keyboards/clueboard/60/config.h
  21. 387
      keyboards/clueboard/60/info.json
  22. 13
      keyboards/clueboard/60/rules.mk
  23. 34
      keyboards/clueboard/66/info.json
  24. 59
      keyboards/clueboard/66/rev1/config.h
  25. 273
      keyboards/clueboard/66/rev1/info.json
  26. 15
      keyboards/clueboard/66/rev1/readme.md
  27. 72
      keyboards/clueboard/66/rev1/rev1.h
  28. 18
      keyboards/clueboard/66/rev1/rules.mk
  29. 56
      keyboards/clueboard/66/rev2/config.h
  30. 273
      keyboards/clueboard/66/rev2/info.json
  31. 15
      keyboards/clueboard/66/rev2/readme.md
  32. 90
      keyboards/clueboard/66/rev2/rev2.h
  33. 14
      keyboards/clueboard/66/rev2/rules.mk
  34. 58
      keyboards/clueboard/66/rev3/config.h
  35. 273
      keyboards/clueboard/66/rev3/info.json
  36. 15
      keyboards/clueboard/66/rev3/readme.md
  37. 90
      keyboards/clueboard/66/rev3/rev3.h
  38. 14
      keyboards/clueboard/66/rev3/rules.mk
  39. 54
      keyboards/clueboard/66/rev4/config.h
  40. 270
      keyboards/clueboard/66/rev4/info.json
  41. 13
      keyboards/clueboard/66/rev4/keymaps/keymap.c
  42. 13
      keyboards/clueboard/66/rev4/keymaps/mine/keymap.c
  43. 13
      keyboards/clueboard/66/rev4/mine/keymap.c
  44. 91
      keyboards/clueboard/66/rev4/rev4.h
  45. 19
      keyboards/clueboard/66/rev4/rules.mk
  46. 23
      keyboards/clueboard/66_hotswap/config.h
  47. 25
      keyboards/clueboard/66_hotswap/gen1/config.h
  48. 71
      keyboards/clueboard/66_hotswap/gen1/gen1.h
  49. 337
      keyboards/clueboard/66_hotswap/gen1/info.json
  50. 16
      keyboards/clueboard/66_hotswap/gen1/readme.md
  51. 20
      keyboards/clueboard/66_hotswap/gen1/rules.mk
  52. 30
      keyboards/clueboard/66_hotswap/prototype/config.h
  53. 437
      keyboards/clueboard/66_hotswap/prototype/info.json
  54. 83
      keyboards/clueboard/66_hotswap/prototype/prototype.h
  55. 16
      keyboards/clueboard/66_hotswap/prototype/readme.md
  56. 13
      keyboards/clueboard/66_hotswap/prototype/rules.mk
  57. 18
      keyboards/clueboard/california/california.h
  58. 21
      keyboards/clueboard/california/config.h
  59. 24
      keyboards/clueboard/california/info.json
  60. 1
      keyboards/clueboard/california/keymaps/default/readme.md
  61. 16
      keyboards/clueboard/card/card.h
  62. 129
      keyboards/clueboard/card/config.h
  63. 62
      keyboards/clueboard/card/info.json
  64. 14
      keyboards/clueboard/card/rules.mk
  65. 6
      keyboards/clueboard/info.json
  66. 3
      lib/python/qmk/cli/c2json.py
  67. 8
      lib/python/qmk/cli/chibios/confmigrate.py
  68. 4
      lib/python/qmk/cli/generate/__init__.py
  69. 14
      lib/python/qmk/cli/generate/api.py
  70. 277
      lib/python/qmk/cli/generate/config_h.py
  71. 49
      lib/python/qmk/cli/generate/info_json.py
  72. 93
      lib/python/qmk/cli/generate/layouts.py
  73. 59
      lib/python/qmk/cli/generate/rules_mk.py
  74. 7
      lib/python/qmk/cli/info.py
  75. 51
      lib/python/qmk/cli/kle2json.py
  76. 11
      lib/python/qmk/constants.py
  77. 355
      lib/python/qmk/info.py
  78. 96
      lib/python/qmk/info_json_encoder.py
  79. 3
      message.mk

4
Makefile

@ -501,8 +501,8 @@ endef @@ -501,8 +501,8 @@ endef
%:
# Check if we have the CMP tool installed
cmp $(ROOT_DIR)/Makefile $(ROOT_DIR)/Makefile >/dev/null 2>&1; if [ $$? -gt 0 ]; then printf "$(MSG_NO_CMP)"; exit 1; fi;
# Ensure that bin/qmk works. This will be a failing check after the next develop merge
if ! bin/qmk hello 1> /dev/null 2>&1; then printf "$(MSG_PYTHON_MISSING)"; fi
# Ensure that bin/qmk works.
if ! bin/qmk hello 1> /dev/null 2>&1; then printf "$(MSG_PYTHON_MISSING)"; exit 1; fi
# Check if the submodules are dirty, and display a warning if they are
ifndef SKIP_GIT
if [ ! -e lib/chibios ]; then git submodule sync lib/chibios && git submodule update --depth 50 --init lib/chibios; fi

33
build_keyboard.mk

@ -90,13 +90,16 @@ ifneq ("$(wildcard $(KEYBOARD_PATH_1)/rules.mk)","") @@ -90,13 +90,16 @@ ifneq ("$(wildcard $(KEYBOARD_PATH_1)/rules.mk)","")
include $(KEYBOARD_PATH_1)/rules.mk
endif
MAIN_KEYMAP_PATH_1 := $(KEYBOARD_PATH_1)/keymaps/$(KEYMAP)
MAIN_KEYMAP_PATH_2 := $(KEYBOARD_PATH_2)/keymaps/$(KEYMAP)
MAIN_KEYMAP_PATH_3 := $(KEYBOARD_PATH_3)/keymaps/$(KEYMAP)
MAIN_KEYMAP_PATH_4 := $(KEYBOARD_PATH_4)/keymaps/$(KEYMAP)
MAIN_KEYMAP_PATH_5 := $(KEYBOARD_PATH_5)/keymaps/$(KEYMAP)
# Pull in rules from info.json
INFO_RULES_MK = $(shell bin/qmk generate-rules-mk --quiet --keyboard $(KEYBOARD) --output $(KEYBOARD_OUTPUT)/src/rules.mk)
include $(INFO_RULES_MK)
# Check for keymap.json first, so we can regenerate keymap.c
include build_json.mk
@ -290,6 +293,32 @@ ifneq ("$(wildcard $(KEYMAP_PATH)/config.h)","") @@ -290,6 +293,32 @@ ifneq ("$(wildcard $(KEYMAP_PATH)/config.h)","")
CONFIG_H += $(KEYMAP_PATH)/config.h
endif
# Pull in stuff from info.json
INFO_JSON_FILES :=
ifneq ("$(wildcard $(KEYBOARD_PATH_1)/info.json)","")
INFO_JSON_FILES += $(KEYBOARD_PATH_1)/info.json
endif
ifneq ("$(wildcard $(KEYBOARD_PATH_2)/info.json)","")
INFO_JSON_FILES += $(KEYBOARD_PATH_2)/info.json
endif
ifneq ("$(wildcard $(KEYBOARD_PATH_3)/info.json)","")
INFO_JSON_FILES += $(KEYBOARD_PATH_3)/info.json
endif
ifneq ("$(wildcard $(KEYBOARD_PATH_4)/info.json)","")
INFO_JSON_FILES += $(KEYBOARD_PATH_4)/info.json
endif
ifneq ("$(wildcard $(KEYBOARD_PATH_5)/info.json)","")
INFO_JSON_FILES += $(KEYBOARD_PATH_5)/info.json
endif
CONFIG_H += $(KEYBOARD_OUTPUT)/src/info_config.h $(KEYBOARD_OUTPUT)/src/layouts.h
$(KEYBOARD_OUTPUT)/src/info_config.h: $(INFO_JSON_FILES)
bin/qmk generate-config-h --quiet --keyboard $(KEYBOARD) --output $(KEYBOARD_OUTPUT)/src/info_config.h
$(KEYBOARD_OUTPUT)/src/layouts.h: $(INFO_JSON_FILES)
bin/qmk generate-layouts --quiet --keyboard $(KEYBOARD) --output $(KEYBOARD_OUTPUT)/src/layouts.h
# project specific files
SRC += $(KEYBOARD_SRC) \
$(KEYMAP_C) \
@ -364,7 +393,7 @@ all: @@ -364,7 +393,7 @@ all:
echo "skipped" >&2
endif
build: elf cpfirmware
build: $(KEYBOARD_OUTPUT)/src/info_config.h $(KEYBOARD_OUTPUT)/src/layouts.h elf cpfirmware
check-size: build
objs-size: build

157
docs/reference_info_json.md

@ -19,8 +19,20 @@ The `info.json` file is a JSON formatted dictionary with the following keys avai @@ -19,8 +19,20 @@ The `info.json` file is a JSON formatted dictionary with the following keys avai
* Width of the board in Key Units
* `height`
* Height of the board in Key Units
* `debounce`
* How many milliseconds (ms) to wait for debounce to happen. (Default: 5)
* `diode_direction`
* The direction diodes face. See [`DIRECT_PINS` in the hardware configuration](https://docs.qmk.fm/#/config_options?id=hardware-options) for more details.
* `layout_aliases`
* A dictionary containing layout aliases. The key is the alias and the value is a layout in `layouts` it maps to.
* `layouts`
* Physical Layout representations. See the next section for more detail.
* Physical Layout representations. See the [Layout Format](#layout_format) section for more detail.
* `matrix_pins`
* Configure the pins corresponding to columns and rows, or direct pins. See [Matrix Pins](#matrix_pins) for more detail.
* `rgblight`
* Configure the [RGB Lighting feature](feature_rgblight.md). See the [RGB Lighting](#rgb_lighting) section for more detail.
* `usb`
* Configure USB VID, PID, and other parameters. See [USB](#USB) for more detail.
### Layout Format
@ -49,25 +61,128 @@ All key positions and rotations are specified in relation to the top-left corner @@ -49,25 +61,128 @@ All key positions and rotations are specified in relation to the top-left corner
* The width of the key, in Key Units. Ignored if `ks` is provided. Default: `1`
* `h`
* The height of the key, in Key Units. Ignored if `ks` is provided. Default: `1`
* `r`
* How many degrees clockwise to rotate the key.
* `rx`
* The absolute position of the point to rotate the key around in the horizontal axis. Default: `x`
* `ry`
* The absolute position of the point to rotate the key around in the vertical axis. Default: `y`
* `ks`
* Key Shape: define a polygon by providing a list of points, in Key Units.
* **Important**: These are relative to the top-left of the key, not absolute.
* Example ISO Enter: `[ [0,0], [1.5,0], [1.5,2], [0.25,2], [0.25,1], [0,1], [0,0] ]`
* `label`
* What to name this position in the matrix.
* This should usually be the same name as what is silkscreened on the PCB at this location.
## How is the Metadata Exposed?
This metadata is primarily used in two ways:
* To allow web-based configurators to dynamically generate UI
* To support the new `make keyboard:keymap:qmk` target, which bundles this metadata up with the firmware to allow QMK Toolbox to be smarter.
Configurator authors can see the [QMK Compiler](https://docs.api.qmk.fm/using-the-api) docs for more information on using the JSON API.
* This should usually correspond to the keycode for the first layer of the default keymap.
* `matrix`
* A 2 item list describing the row and column location for this key.
### Matrix Pins
Currently QMK supports connecting switches either directly to GPIO pins or via a switch matrix. At this time you can not combine these, they are mutually exclusive.
#### Switch Matrix
Most keyboards use a switch matrix to connect keyswitches to the MCU. You can define your pin columns and rows to configure your switch matrix. When defining switch matrices you should also define your `diode_direction`.
Example:
```json
{
"diode_direction": "COL2ROW",
"matrix_pins": {
"cols": ["F4", "E6", "B1", "D2"],
"rows": ["B0", "D3", "D5", "D4", "D6"]
}
}
```
#### Direct Pins
Direct pins are when you connect one side of the switch to GND and the other side to a GPIO pin on your MCU. No diode is required, but there is a 1:1 mapping between switches and pins.
When specifying direct pins you need to arrange them in nested arrays. The outer array consists of rows, while the inner array is a text string corresponding to a pin. You can use `null` to indicate an empty spot in the matrix.
Example:
```json
{
"matrix_pins": {
"direct": [
["A10", "A9"],
["A0", "B8"],
[null, "B11"],
["B9", "A8"],
["A7", "B1"],
[null, "B2"]
]
}
```
### RGB Lighting
This section controls the legacy WS2812 support in QMK. This should not be confused with the RGB Matrix feature, which can be used to control both WS2812 and ISSI RGB LEDs.
The following items can be set. Not every value is required.
* `led_count`
* The number of LEDs in your strip
* `pin`
* The GPIO pin that your LED strip is connected to
* `animations`
* A dictionary that lists enabled and disabled animations. See [RGB Light Animations](#rgb_light_animations) below.
* `sleep`
* Set to `true` to enable lighting during host sleep
* `split`
* Set to `true` to enable synchronization functionality between split halves
* `split_count`
* For split keyboards, the number of LEDs on each side
* `max_brightness`
* (0-255) What the maxmimum brightness (value) level is
* `hue_steps`
* How many steps of adjustment to have for hue
* `saturation_steps`
* How many steps of adjustment to have for saturation
* `brightness_steps`
* How many steps of adjustment to have for brightness (value)
Example:
```json
{
"rgblight": {
"led_count": 4,
"pin": "F6",
"hue_steps": 10,
"saturation_steps": 17,
"brightness_steps": 17,
"animations": {
"all": true
}
}
}
```
#### RGB Light Animations
The following animations can be enabled:
| Key | Description |
|-----|-------------|
| `all` | Enable all additional animation modes. |
| `alternating` | Enable alternating animation mode. |
| `breathing` | Enable breathing animation mode. |
| `christmas` | Enable christmas animation mode. |
| `knight` | Enable knight animation mode. |
| `rainbow_mood` | Enable rainbow mood animation mode. |
| `rainbow_swirl` | Enable rainbow swirl animation mode. |
| `rgb_test` | Enable RGB test animation mode. |
| `snake` | Enable snake animation mode. |
| `static_gradient` | Enable static gradient mode. |
| `twinkle` | Enable twinkle animation mode. |
### USB
Every USB keyboard needs to have its USB parmaters defined. At a minimum you need to set vid, pid, and device version.
Example:
```json
{
"usb": {
"vid": "0xC1ED",
"pid": "0x23B0",
"device_ver": "0x0001"
}
}
```

33
keyboards/clueboard/17/17.h

@ -3,37 +3,4 @@ @@ -3,37 +3,4 @@
#include "quantum.h"
/* Cluepad matrix layout
* .-------------------.
* |NLCK| /| *| -|
* |-------------------|
* | 7| 8| 9| |
* |--------------| |
* | 4| 5| 6| +|
* |-------------------|
* | 1| 2| 3| |
* |--------------| |
* | 0| .| Ent|
* '-------------------'
*/
// The first section contains all of the arguments
// The second converts the arguments into a two-dimensional array
#define LAYOUT_numpad_5x4( \
k00, k01, k02, k03, \
k10, k11, k12, \
k20, k21, k22, k13, \
k30, k31, k32, \
k40, k42, k33 \
) { \
{ k00, k01, k02, k03 }, \
{ k10, k11, k12, k13 }, \
{ k20, k21, k22, KC_NO }, \
{ k30, k31, k32, k33 }, \
{ k40, KC_NO, k42, KC_NO } \
}
#define LAYOUT LAYOUT_numpad_5x4
#define KEYMAP LAYOUT_numpad_5x4
#endif

69
keyboards/clueboard/17/config.h

@ -20,76 +20,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. @@ -20,76 +20,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include "config_common.h"
/* USB Device descriptor parameter */
#define VENDOR_ID 0xC1ED
#define PRODUCT_ID 0x2312
#define DEVICE_VER 0x0001
#define MANUFACTURER Clueboard
#define PRODUCT Cluepad with RGB Underlighting
#define DESCRIPTION QMK keyboard firmware for Cluepad
/* key matrix size */
#define MATRIX_ROWS 5
#define MATRIX_COLS 4
// ROWS: Top to bottom, COLS: Left to right
/* Row pin configuration
* row: 0 1 2 3 4
* pin:
*/
#define MATRIX_ROW_PINS { B0, D3, D5, D4, D6 }
/* Column pin configuration
* col: 0 1 2 3
* pin: F4 E6 B1 D2
*/
#define MATRIX_COL_PINS { F4, E6, B1, D2 }
#define UNUSED_PINS
/* COL2ROW or ROW2COL */
#define DIODE_DIRECTION COL2ROW
/* define if matrix has ghost */
//#define MATRIX_HAS_GHOST
/* Set 0 if debouncing isn't needed */
#define DEBOUNCE 5
/* Number of backlighting levels */
#define BACKLIGHT_LEVELS 3
/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
#define LOCKING_SUPPORT_ENABLE
/* Locking resynchronize hack */
#define LOCKING_RESYNC_ENABLE
/* Underlight configuration
*/
#define RGB_DI_PIN F6
#define RGBLIGHT_ANIMATIONS
#define RGBLED_NUM 4 // Number of LEDs
#define RGBLIGHT_HUE_STEP 10
#define RGBLIGHT_SAT_STEP 17
#define RGBLIGHT_VAL_STEP 17
/*
* Feature disable options
* These options are also useful to firmware size reduction.
*/
/* disable debug print */
//#define NO_DEBUG
/* Debug forcibly enabled */
#define ALWAYS_DEBUG
/* disable print */
//#define NO_PRINT
/* disable action features */
//#define NO_ACTION_LAYER
//#define NO_ACTION_TAPPING
//#define NO_ACTION_ONESHOT
//#define NO_ACTION_MACRO
//#define NO_ACTION_FUNCTION
#endif

79
keyboards/clueboard/17/info.json

@ -1,30 +1,67 @@ @@ -1,30 +1,67 @@
{
"manufacturer": "Clueboard",
"keyboard_name": "Clueboard 17% (Cluepad)",
"keyboard_folder": "clueboard/17",
"url": "",
"maintainer": "qmk",
"width": 4,
"maintainer": "skullydazed",
"height": 5,
"width": 4,
"diode_direction": "COL2ROW",
"features": {
"backlight": true,
"bootmagic": false,
"command": false,
"console": true,
"extrakey": true,
"midi": false,
"mousekey": true,
"nkro": true,
"rgblight": true,
"unicode": false
},
"matrix_pins": {
"cols": ["F4", "E6", "B1", "D2"],
"rows": ["B0", "D3", "D5", "D4", "D6"]
},
"rgblight": {
"animations": {
"all": true
},
"brightness_steps": "17",
"hue_steps": "10",
"led_count": "4",
"pin": "F6",
"saturation_steps": "17"
},
"url": "",
"usb": {
"device_ver": "0x0001",
"pid": "0x2312",
"vid": "0xC1ED"
},
"layout_aliases": {
"KEYMAP": "LAYOUT_numpad_5x4",
"LAYOUT": "LAYOUT_numpad_5x4"
},
"layouts": {
"LAYOUT_numpad_5x4": {
"key_count": 17,
"layout": [
{"label":"Num Lock", "x":0, "y":0},
{"label":"/", "x":1, "y":0},
{"label":"*", "x":2, "y":0},
{"label":"-", "x":3, "y":0},
{"label":"7", "x":0, "y":1},
{"label":"8", "x":1, "y":1},
{"label":"9", "x":2, "y":1},
{"label":"4", "x":0, "y":2},
{"label":"5", "x":1, "y":2},
{"label":"6", "x":2, "y":2},
{"label":"+", "x":3, "y":1, "h":2},
{"label":"1", "x":0, "y":3},
{"label":"2", "x":1, "y":3},
{"label":"3", "x":2, "y":3},
{"label":"0", "x":0, "y":4, "w":2},
{"label":".", "x":2, "y":4},
{"label":"Enter", "x":3, "y":3, "h":2}
{ "label": "Num Lock", "matrix": [0, 0], "w": 1, "x": 0, "y": 0 },
{ "label": "/", "matrix": [0, 1], "w": 1, "x": 1, "y": 0 },
{ "label": "*", "matrix": [0, 2], "w": 1, "x": 2, "y": 0 },
{ "label": "-", "matrix": [0, 3], "w": 1, "x": 3, "y": 0 },
{ "label": "7", "matrix": [1, 0], "w": 1, "x": 0, "y": 1 },
{ "label": "8", "matrix": [1, 1], "w": 1, "x": 1, "y": 1 },
{ "label": "9", "matrix": [1, 2], "w": 1, "x": 2, "y": 1 },
{ "label": "4", "matrix": [2, 0], "w": 1, "x": 0, "y": 2 },
{ "label": "5", "matrix": [2, 1], "w": 1, "x": 1, "y": 2 },
{ "label": "6", "matrix": [2, 2], "w": 1, "x": 2, "y": 2 },
{ "h": 2, "label": "+", "matrix": [1, 3], "w": 1, "x": 3, "y": 1 },
{ "label": "1", "matrix": [3, 0], "w": 1, "x": 0, "y": 3 },
{ "label": "2", "matrix": [3, 1], "w": 1, "x": 1, "y": 3 },
{ "label": "3", "matrix": [3, 2], "w": 1, "x": 2, "y": 3 },
{ "label": "0", "matrix": [4, 0], "w": 2, "x": 0, "y": 4 },
{ "label": ".", "matrix": [4, 2], "w": 1, "x": 2, "y": 4 },
{ "h": 2, "label": "Enter", "matrix": [3, 3], "w": 1, "x": 3, "y": 3 }
]
}
}

1
keyboards/clueboard/17/keymaps/default/readme.md

@ -0,0 +1 @@ @@ -0,0 +1 @@
Default keymap for the Clueboard 17.

10
keyboards/clueboard/17/rules.mk

@ -12,14 +12,4 @@ MCU = atmega32u4 @@ -12,14 +12,4 @@ MCU = atmega32u4
BOOTLOADER = atmel-dfu
# Build Options
BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration
MOUSEKEY_ENABLE = yes # Mouse keys
EXTRAKEY_ENABLE = yes # Audio control and System control
CONSOLE_ENABLE = yes # Console for debug
COMMAND_ENABLE = no # Commands for debug and configuration
NKRO_ENABLE = yes # USB Nkey Rollover
BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality
BACKLIGHT_DRIVER = custom
RGBLIGHT_ENABLE = yes # Enable keyboard RGB underglow
MIDI_ENABLE = no # MIDI support
UNICODE_ENABLE = no # Unicode

74
keyboards/clueboard/2x1800/2018/2018.h

@ -18,78 +18,4 @@ @@ -18,78 +18,4 @@
#include "quantum.h"
// This a shortcut to help you visually see your layout.
// The first section contains all of the arguments
// The second converts the arguments into a two-dimensional array
#define LAYOUT_all( \
k00, k01, k02, k03, k04, k06, k07, k08, k09, k0a, k60, k61, k62, k63, k64, k65, k66, k67, k68, k69, k6a, \
k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k70, k71, k72, k73, k74, k75, k76, k77, k78, k79, k7a, \
k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k80, k81, k82, k83, k84, k85, k86, k87, k88, k89, k8a, \
k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k90, k91, k92, k93, k94, k95, k97, k98, k99, \
k40, k41, k42, k43, k44, k45, k46, k47, k48, k49, k4a, ka0, ka1, ka2, ka3, ka4, ka5, k96, ka7, ka8, ka9, kaa, \
k51, k52, k53, k54, k55, k56, k57, k58, k59, k5a, kb0, kb1, kb2, kb3, kb4, kb5, ka6, kb6, kb7, kb8, kb9 \
) \
{ \
{ k00, k01, k02, k03, k04, KC_NO, k06, k07, k08, k09, k0a }, \
{ k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a }, \
{ k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a }, \
{ KC_NO, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a }, \
{ k40, k41, k42, k43, k44, k45, k46, k47, k48, k49, k4a }, \
{ KC_NO, k51, k52, k53, k54, k55, k56, k57, k58, k59, k5a }, \
{ k60, k61, k62, k63, k64, k65, k66, k67, k68, k69, k6a }, \
{ k70, k71, k72, k73, k74, k75, k76, k77, k78, k79, k7a }, \
{ k80, k81, k82, k83, k84, k85, k86, k87, k88, k89, k8a }, \
{ k90, k91, k92, k93, k94, k95, k96, k97, k98, k99, KC_NO }, \
{ ka0, ka1, ka2, ka3, ka4, ka5, ka6, ka7, ka8, ka9, kaa }, \
{ kb0, kb1, kb2, kb3, kb4, kb5, kb6, kb7, kb8, kb9, KC_NO } \
}
#define LAYOUT_4u_space( \
k00, k01, k02, k03, k04, k06, k07, k08, k09, k0a, k60, k61, k62, k63, k64, k65, k66, k67, k68, k69, k6a, \
k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k70, k71, k72, k73, k74, k75, k76, k77, k78, k79, k7a, \
k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k80, k81, k82, k83, k84, k85, k86, k87, k88, k89, k8a, \
k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k90, k91, k92, k93, k94, k95, k97, k98, k99, \
k40, k41, k42, k43, k44, k45, k46, k47, k48, k49, k4a, ka0, ka1, ka2, ka3, ka4, ka5, k96, ka7, ka8, ka9, kaa, \
k51, k52, k53, k54, k55, k56, k57, k58, kb0, kb2, kb3, kb4, kb5, ka6, kb6, kb7, kb8, kb9 \
) \
{ \
{ k00, k01, k02, k03, k04, KC_NO, k06, k07, k08, k09, k0a }, \
{ k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a }, \
{ k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a }, \
{ KC_NO, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a }, \
{ k40, k41, k42, k43, k44, k45, k46, k47, k48, k49, k4a }, \
{ KC_NO, k51, k52, k53, k54, k55, k56, k57, k58, KC_NO, KC_NO }, \
{ k60, k61, k62, k63, k64, k65, k66, k67, k68, k69, k6a }, \
{ k70, k71, k72, k73, k74, k75, k76, k77, k78, k79, k7a }, \
{ k80, k81, k82, k83, k84, k85, k86, k87, k88, k89, k8a }, \
{ k90, k91, k92, k93, k94, k95, k96, k97, k98, k99, KC_NO }, \
{ ka0, ka1, ka2, ka3, ka4, ka5, ka6, ka7, ka8, ka9, kaa }, \
{ kb0, KC_NO, kb2, kb3, kb4, kb5, kb6, kb7, kb8, kb9, KC_NO } \
}
#define LAYOUT_7u_space( \
k00, k01, k02, k03, k04, k06, k07, k08, k09, k0a, k60, k61, k62, k63, k64, k65, k66, k67, k68, k69, k6a, \
k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k70, k71, k72, k73, k74, k75, k76, k77, k78, k79, k7a, \
k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k80, k81, k82, k83, k84, k85, k86, k87, k88, k89, k8a, \
k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k90, k91, k92, k93, k94, k95, k97, k98, k99, \
k40, k41, k42, k43, k44, k45, k46, k47, k48, k49, k4a, ka0, ka1, ka2, ka3, ka4, ka5, k96, ka7, ka8, ka9, kaa, \
k51, k52, k53, k54, k55, k56, k57, kb0, kb4, kb5, ka6, kb6, kb7, kb8, kb9 \
) \
{ \
{ k00, k01, k02, k03, k04, KC_NO, k06, k07, k08, k09, k0a }, \
{ k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a }, \
{ k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a }, \
{ KC_NO, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a }, \
{ k40, k41, k42, k43, k44, k45, k46, k47, k48, k49, k4a }, \
{ KC_NO, k51, k52, k53, k54, k55, k56, k57, KC_NO, KC_NO, KC_NO }, \
{ k60, k61, k62, k63, k64, k65, k66, k67, k68, k69, k6a }, \
{ k70, k71, k72, k73, k74, k75, k76, k77, k78, k79, k7a }, \
{ k80, k81, k82, k83, k84, k85, k86, k87, k88, k89, k8a }, \
{ k90, k91, k92, k93, k94, k95, k96, k97, k98, k99, KC_NO }, \
{ ka0, ka1, ka2, ka3, ka4, ka5, ka6, ka7, ka8, ka9, kaa }, \
{ kb0, KC_NO, KC_NO, KC_NO, kb4, kb5, kb6, kb7, kb8, kb9, KC_NO } \
}
#define LAYOUT LAYOUT_all
#endif

172
keyboards/clueboard/2x1800/2018/config.h

@ -15,185 +15,17 @@ You should have received a copy of the GNU General Public License @@ -15,185 +15,17 @@ You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef CONFIG_H
#define CONFIG_H
#pragma once
#include "config_common.h"
/* USB Device descriptor parameter */
#define VENDOR_ID 0xC1ED
#define PRODUCT_ID 0x23A0
#define DEVICE_VER 0x0001
#define MANUFACTURER Clueboard
#define PRODUCT 2x1800 2018
#define DESCRIPTION What does it mean?
/* key matrix size */
#define MATRIX_ROWS 12
#define MATRIX_COLS 11
/*
* Keyboard Matrix Assignments
*
* Change this to how you wired your keyboard
* COLS: AVR pins used for columns, left to right
* ROWS: AVR pins used for rows, top to bottom
* DIODE_DIRECTION: COL2ROW = COL = Anode (+), ROW = Cathode (-, marked on diode)
* ROW2COL = ROW = Anode (+), COL = Cathode (-, marked on diode)
*
*/
#define MATRIX_ROW_PINS { C0, C1, C2, C3, C7, F7, B1, F2, F3, F4, F5, F6 }
#define MATRIX_COL_PINS { D2, D3, D4, D5, D7, E0, E1, B0, E6, B3, B2 }
#define UNUSED_PINS { D0, D1, D6, C5, C6, E4, E5, E7, F0, F1, A0, A1, A2, A3, A4, A5, A6, A7 }
/* COL2ROW, ROW2COL*/
#define DIODE_DIRECTION ROW2COL
/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */
#define DEBOUNCE 5
/* define if matrix has ghost (lacks anti-ghosting diodes) */
//#define MATRIX_HAS_GHOST
/* audio support */
#define B7_AUDIO
#define C4_AUDIO
#define AUDIO_CLICKY
#define LED_NUM_LOCK_PIN B4
#define LED_CAPS_LOCK_PIN B5
#define LED_SCROLL_LOCK_PIN B6
/* number of backlight levels */
// #define BACKLIGHT_PIN B7
// #define BACKLIGHT_BREATHING
// #define BACKLIGHT_LEVELS 3
/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
#define LOCKING_SUPPORT_ENABLE
/* Locking resynchronize hack */
#define LOCKING_RESYNC_ENABLE
#define RGB_DI_PIN C6
#define RGBLIGHT_ANIMATIONS
#define RGBLED_NUM 16
#define RGBLIGHT_HUE_STEP 8
#define RGBLIGHT_SAT_STEP 8
#define RGBLIGHT_VAL_STEP 8
/* If defined, GRAVE_ESC will always act as ESC when CTRL is held.
* This is userful for the Windows task manager shortcut (ctrl+shift+esc).
*/
// #define GRAVE_ESC_CTRL_OVERRIDE
/*
* Force NKRO
*
* Force NKRO (nKey Rollover) to be enabled by default, regardless of the saved
* state in the bootmagic EEPROM settings. (Note that NKRO must be enabled in the
* makefile for this to work.)
*
* If forced on, NKRO can be disabled via magic key (default = LShift+RShift+N)
* until the next keyboard reset.
*
* NKRO may prevent your keystrokes from being detected in the BIOS, but it is
* fully operational during normal computer usage.
*
* For a less heavy-handed approach, enable NKRO via magic key (LShift+RShift+N)
* or via bootmagic (hold SPACE+N while plugging in the keyboard). Once set by
* bootmagic, NKRO mode will always be enabled until it is toggled again during a
* power-up.
*
*/
//#define FORCE_NKRO
/*
* Magic Key Options
*
* Magic keys are hotkey commands that allow control over firmware functions of
* the keyboard. They are best used in combination with the HID Listen program,
* found here: https://www.pjrc.com/teensy/hid_listen.html
*
* The options below allow the magic key functionality to be changed. This is
* useful if your keyboard/keypad is missing keys and you want magic key support.
*
*/
/* control how magic key switches layers */
//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS true
//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS true
//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM false
/* override magic key keymap */
//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS
//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS
//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM
//#define MAGIC_KEY_HELP1 H
//#define MAGIC_KEY_HELP2 SLASH
//#define MAGIC_KEY_DEBUG D
//#define MAGIC_KEY_DEBUG_MATRIX X
//#define MAGIC_KEY_DEBUG_KBD K
//#define MAGIC_KEY_DEBUG_MOUSE M
//#define MAGIC_KEY_VERSION V
//#define MAGIC_KEY_STATUS S
//#define MAGIC_KEY_CONSOLE C
//#define MAGIC_KEY_LAYER0_ALT1 ESC
//#define MAGIC_KEY_LAYER0_ALT2 GRAVE
//#define MAGIC_KEY_LAYER0 0
//#define MAGIC_KEY_LAYER1 1
//#define MAGIC_KEY_LAYER2 2
//#define MAGIC_KEY_LAYER3 3
//#define MAGIC_KEY_LAYER4 4
//#define MAGIC_KEY_LAYER5 5
//#define MAGIC_KEY_LAYER6 6
//#define MAGIC_KEY_LAYER7 7
//#define MAGIC_KEY_LAYER8 8
//#define MAGIC_KEY_LAYER9 9
//#define MAGIC_KEY_BOOTLOADER PAUSE
//#define MAGIC_KEY_LOCK CAPS
//#define MAGIC_KEY_EEPROM E
//#define MAGIC_KEY_NKRO N
//#define MAGIC_KEY_SLEEP_LED Z
/*
* Feature disable options
* These options are also useful to firmware size reduction.
*/
/* disable debug print */
//#define NO_DEBUG
/* disable print */
//#define NO_PRINT
/* disable action features */
//#define NO_ACTION_LAYER
//#define NO_ACTION_TAPPING
//#define NO_ACTION_ONESHOT
//#define NO_ACTION_MACRO
//#define NO_ACTION_FUNCTION
/*
* MIDI options
*/
/* Prevent use of disabled MIDI features in the keymap */
//#define MIDI_ENABLE_STRICT 1
/* enable basic MIDI features:
- MIDI notes can be sent when in Music mode is on
*/
//#define MIDI_BASIC
/* enable advanced MIDI features:
- MIDI notes can be added to the keymap
- Octave shift and transpose
- Virtual sustain, portamento, and modulation wheel
- etc.
*/
//#define MIDI_ADVANCED
/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */
//#define MIDI_TONE_KEYCODE_OCTAVES 1
#endif

444
keyboards/clueboard/2x1800/2018/info.json

@ -1,41 +1,435 @@ @@ -1,41 +1,435 @@
{
"keyboard_name": "Clueboard 2x1800",
"url": "",
"manufacturer": "Clueboard",
"keyboard_name": "Clueboard 2x1800 2018",
"maintainer": "skullydazed",
"width": 24,
"height": 6.5,
"width": 24,
"debounce": "5",
"diode_direction": "ROW2COL",
"features": {
"audio": true,
"bootmagic": false,
"command": false,
"console": true,
"extrakey": true,
"midi": false,
"mousekey": true,
"nkro": true,
"rgblight": true,
"unicode": false
},
"indicators": {
"num_lock": "B4",
"caps_lock": "B5",
"scroll_lock": "B6"
},
"matrix_pins": {
"cols": ["D2", " D3", " D4", " D5", " D7", " E0", " E1", " B0", " E6", " B3", " B2"],
"rows": ["C0", " C1", " C2", " C3", " C7", " F7", " B1", " F2", " F3", " F4", " F5", " F6"]
},
"rgblight": {
"animations": {
"all": true
},
"brightness_steps": "8",
"hue_steps": "8",
"led_count": "16",
"pin": "C6",
"saturation_steps": "8"
},
"usb": {
"pid": "0x23A0"
},
"layout_aliases": {
"KEYMAP": "LAYOUT_all",
"LAYOUT": "LAYOUT_all"
},
"layouts": {
"LAYOUT": {
"key_count": 127,
"LAYOUT_4u_space": {
"key_count": 124,
"layout": [
{"label":"Home", "x":0, "y":0}, {"label":"End", "x":1, "y":0}, {"label":"PgUp", "x":2, "y":0}, {"label":"PgDn", "x":3, "y":0}, {"label":"Esc", "x":4.75, "y":0}, {"label":"F1", "x":6.25, "y":0}, {"label":"F2", "x":7.25, "y":0}, {"label":"F3", "x":8.25, "y":0}, {"label":"F4", "x":9.25, "y":0}, {"label":"F5", "x":10.75, "y":0}, {"label":"F6", "x":11.75, "y":0}, {"label":"F7", "x":12.75, "y":0}, {"label":"F8", "x":13.75, "y":0}, {"label":"F9", "x":15.25, "y":0}, {"label":"F10", "x":16.25, "y":0}, {"label":"F11", "x":17.25, "y":0}, {"label":"F12", "x":18.25, "y":0}, {"label":"PrtSc", "x":20, "y":0}, {"label":"Scroll Lock", "x":21, "y":0}, {"label":"Pause", "x":22, "y":0}, {"label":"Insert", "x":23, "y":0},
{"label":"-", "x":0, "y":1.25}, {"label":"Num Lock", "x":1, "y":1.25}, {"label":"/", "x":2, "y":1.25}, {"label":"*", "x":3, "y":1.25}, {"label":"~", "x":4.5, "y":1.25}, {"label":"!", "x":5.5, "y":1.25}, {"label":"@", "x":6.5, "y":1.25}, {"label":"#", "x":7.5, "y":1.25}, {"label":"$", "x":8.5, "y":1.25}, {"label":"%", "x":9.5, "y":1.25}, {"label":"^", "x":10.5, "y":1.25}, {"label":"&", "x":11.5, "y":1.25}, {"label":"*", "x":12.5, "y":1.25}, {"label":"(", "x":13.5, "y":1.25}, {"label":")", "x":14.5, "y":1.25}, {"label":"_", "x":15.5, "y":1.25}, {"label":"+", "x":16.5, "y":1.25}, {"label":"Backspace", "x":17.5, "y":1.25, "w":2}, {"label":"Num Lock", "x":20, "y":1.25}, {"label":"/", "x":21, "y":1.25}, {"label":"*", "x":22, "y":1.25}, {"label":"-", "x":23, "y":1.25},
{"label":"+", "x":0, "y":2.25, "h":2}, {"label":"7", "x":1, "y":2.25}, {"label":"8", "x":2, "y":2.25}, {"label":"9", "x":3, "y":2.25}, {"label":"Tab", "x":4.5, "y":2.25, "w":1.5}, {"label":"Q", "x":6, "y":2.25}, {"label":"W", "x":7, "y":2.25}, {"label":"E", "x":8, "y":2.25}, {"label":"R", "x":9, "y":2.25}, {"label":"T", "x":10, "y":2.25}, {"label":"Y", "x":11, "y":2.25}, {"label":"U", "x":12, "y":2.25}, {"label":"I", "x":13, "y":2.25}, {"label":"O", "x":14, "y":2.25}, {"label":"P", "x":15, "y":2.25}, {"label":"{", "x":16, "y":2.25}, {"label":"}", "x":17, "y":2.25}, {"label":"|", "x":18, "y":2.25, "w":1.5}, {"label":"7", "x":20, "y":2.25}, {"label":"8", "x":21, "y":2.25}, {"label":"9", "x":22, "y":2.25}, {"label":"+", "x":23, "y":2.25, "h":2},
{"label":"4", "x":1, "y":3.25}, {"label":"5", "x":2, "y":3.25}, {"label":"6", "x":3, "y":3.25}, {"label":"Caps Lock", "x":4.5, "y":3.25, "w":1.75}, {"label":"A", "x":6.25, "y":3.25}, {"label":"S", "x":7.25, "y":3.25}, {"label":"D", "x":8.25, "y":3.25}, {"label":"F", "x":9.25, "y":3.25}, {"label":"G", "x":10.25, "y":3.25}, {"label":"H", "x":11.25, "y":3.25}, {"label":"J", "x":12.25, "y":3.25}, {"label":"K", "x":13.25, "y":3.25}, {"label":"L", "x":14.25, "y":3.25}, {"label":":", "x":15.25, "y":3.25}, {"label":"\"", "x":16.25, "y":3.25}, {"label":"Enter", "x":17.25, "y":3.25, "w":2.25}, {"label":"4", "x":20, "y":3.25}, {"label":"5", "x":21, "y":3.25}, {"label":"6", "x":22, "y":3.25},
{"label":"Enter", "x":0, "y":4.25, "h":2}, {"label":"1", "x":1, "y":4.25}, {"label":"2", "x":2, "y":4.25}, {"label":"3", "x":3, "y":4.25}, {"label":"\\u2191", "x":4.25, "y":4.5}, {"label":"Shift", "x":5.5, "y":4.25, "w":1.25}, {"label":"Z", "x":6.75, "y":4.25}, {"label":"X", "x":7.75, "y":4.25}, {"label":"C", "x":8.75, "y":4.25}, {"label":"V", "x":9.75, "y":4.25}, {"label":"B", "x":10.75, "y":4.25}, {"label":"N", "x":11.75, "y":4.25}, {"label":"M", "x":12.75, "y":4.25}, {"label":"<", "x":13.75, "y":4.25}, {"label":">", "x":14.75, "y":4.25}, {"label":"?", "x":15.75, "y":4.25}, {"label":"Shift", "x":16.75, "y":4.25, "w":1.75}, {"label":"\\u2191", "x":18.75, "y":4.5}, {"label":"1", "x":20, "y":4.25}, {"label":"2", "x":21, "y":4.25}, {"label":"3", "x":22, "y":4.25}, {"label":"Enter", "x":23, "y":4.25, "h":2},
{"label":"0", "x":1, "y":5.25}, {"label":".", "x":2, "y":5.25}, {"label":"\\u2190", "x":3.25, "y":5.5}, {"label":"\\u2193", "x":4.25, "y":5.5}, {"label":"\\u2192", "x":5.25, "y":5.5}, {"label":"Ctrl", "x":6.5, "y":5.25}, {"label":"Win", "x":7.5, "y":5.25}, {"label":"Alt", "x":8.5, "y":5.25}, {"label":"1u", "x":9.5, "y":5.25}, {"label":"1u", "x":10.5, "y":5.25}, {"label":"1u", "x":11.5, "y":5.25}, {"label":"1u", "x":12.5, "y":5.25}, {"label":"Alt", "x":13.5, "y":5.25}, {"label":"Win", "x":14.5, "y":5.25}, {"label":"Menu", "x":15.5, "y":5.25}, {"label":"Ctrl", "x":16.5, "y":5.25}, {"label":"\\u2190", "x":17.75, "y":5.5}, {"label":"\\u2193", "x":18.75, "y":5.5}, {"label":"\\u2192", "x":19.75, "y":5.5}, {"label":"0", "x":21, "y":5.25}, {"label":".", "x":22, "y":5.25}
{ "matrix": [0, 0], "w": 1, "x": 0, "y": 0 },
{ "matrix": [0, 1], "w": 1, "x": 1, "y": 0 },
{ "matrix": [0, 2], "w": 1, "x": 2, "y": 0 },
{ "matrix": [0, 3], "w": 1, "x": 3, "y": 0 },
{ "matrix": [0, 4], "w": 1, "x": 4.75, "y": 0 },
{ "matrix": [0, 6], "w": 1, "x": 6.25, "y": 0 },
{ "matrix": [0, 7], "w": 1, "x": 7.25, "y": 0 },
{ "matrix": [0, 8], "w": 1, "x": 8.25, "y": 0 },
{ "matrix": [0, 9], "w": 1, "x": 9.25, "y": 0 },
{ "matrix": [0, 10], "w": 1, "x": 10.75, "y": 0 },
{ "matrix": [6, 0], "w": 1, "x": 11.75, "y": 0 },
{ "matrix": [6, 1], "w": 1, "x": 12.75, "y": 0 },
{ "matrix": [6, 2], "w": 1, "x": 13.75, "y": 0 },
{ "matrix": [6, 3], "w": 1, "x": 15.25, "y": 0 },
{ "matrix": [6, 4], "w": 1, "x": 16.25, "y": 0 },
{ "matrix": [6, 5], "w": 1, "x": 17.25, "y": 0 },
{ "matrix": [6, 6], "w": 1, "x": 18.25, "y": 0 },
{ "matrix": [6, 7], "w": 1, "x": 20, "y": 0 },
{ "matrix": [6, 8], "w": 1, "x": 21, "y": 0 },
{ "matrix": [6, 9], "w": 1, "x": 22, "y": 0 },
{ "matrix": [6, 10], "w": 1, "x": 23, "y": 0 },
{ "matrix": [1, 0], "w": 1, "x": 0, "y": 1.25 },
{ "matrix": [1, 1], "w": 1, "x": 1, "y": 1.25 },
{ "matrix": [1, 2], "w": 1, "x": 2, "y": 1.25 },
{ "matrix": [1, 3], "w": 1, "x": 3, "y": 1.25 },
{ "matrix": [1, 4], "w": 1, "x": 4.5, "y": 1.25 },
{ "matrix": [1, 5], "w": 1, "x": 5.5, "y": 1.25 },
{ "matrix": [1, 6], "w": 1, "x": 6.5, "y": 1.25 },
{ "matrix": [1, 7], "w": 1, "x": 7.5, "y": 1.25 },
{ "matrix": [1, 8], "w": 1, "x": 8.5, "y": 1.25 },
{ "matrix": [1, 9], "w": 1, "x": 9.5, "y": 1.25 },
{ "matrix": [1, 10], "w": 1, "x": 10.5, "y": 1.25 },
{ "matrix": [7, 0], "w": 1, "x": 11.5, "y": 1.25 },
{ "matrix": [7, 1], "w": 1, "x": 12.5, "y": 1.25 },
{ "matrix": [7, 2], "w": 1, "x": 13.5, "y": 1.25 },
{ "matrix": [7, 3], "w": 1, "x": 14.5, "y": 1.25 },
{ "matrix": [7, 4], "w": 1, "x": 15.5, "y": 1.25 },
{ "matrix": [7, 5], "w": 1, "x": 16.5, "y": 1.25 },
{ "matrix": [7, 6], "w": 2, "x": 17.5, "y": 1.25 },
{ "matrix": [7, 7], "w": 1, "x": 20, "y": 1.25 },
{ "matrix": [7, 8], "w": 1, "x": 21, "y": 1.25 },
{ "matrix": [7, 9], "w": 1, "x": 22, "y": 1.25 },
{ "matrix": [7, 10], "w": 1, "x": 23, "y": 1.25 },
{ "h": 2, "matrix": [2, 0], "w": 1, "x": 0, "y": 2.25 },
{ "matrix": [2, 1], "w": 1, "x": 1, "y": 2.25 },
{ "matrix": [2, 2], "w": 1, "x": 2, "y": 2.25 },
{ "matrix": [2, 3], "w": 1, "x": 3, "y": 2.25 },
{ "matrix": [2, 4], "w": 1.5, "x": 4.5, "y": 2.25 },
{ "matrix": [2, 5], "w": 1, "x": 6, "y": 2.25 },
{ "matrix": [2, 6], "w": 1, "x": 7, "y": 2.25 },
{ "matrix": [2, 7], "w": 1, "x": 8, "y": 2.25 },
{ "matrix": [2, 8], "w": 1, "x": 9, "y": 2.25 },
{ "matrix": [2, 9], "w": 1, "x": 10, "y": 2.25 },
{ "matrix": [2, 10], "w": 1, "x": 11, "y": 2.25 },
{ "matrix": [8, 0], "w": 1, "x": 12, "y": 2.25 },
{ "matrix": [8, 1], "w": 1, "x": 13, "y": 2.25 },
{ "matrix": [8, 2], "w": 1, "x": 14, "y": 2.25 },
{ "matrix": [8, 3], "w": 1, "x": 15, "y": 2.25 },
{ "matrix": [8, 4], "w": 1, "x": 16, "y": 2.25 },
{ "matrix": [8, 5], "w": 1, "x": 17, "y": 2.25 },
{ "matrix": [8, 6], "w": 1.5, "x": 18, "y": 2.25 },
{ "matrix": [8, 7], "w": 1, "x": 20, "y": 2.25 },
{ "matrix": [8, 8], "w": 1, "x": 21, "y": 2.25 },
{ "matrix": [8, 9], "w": 1, "x": 22, "y": 2.25 },
{ "h": 2, "matrix": [8, 10], "w": 1, "x": 23, "y": 2.25 },
{ "matrix": [3, 1], "w": 1, "x": 1, "y": 3.25 },
{ "matrix": [3, 2], "w": 1, "x": 2, "y": 3.25 },
{ "matrix": [3, 3], "w": 1, "x": 3, "y": 3.25 },
{ "matrix": [3, 4], "w": 1.75, "x": 4.5, "y": 3.25 },
{ "matrix": [3, 5], "w": 1, "x": 6.25, "y": 3.25 },
{ "matrix": [3, 6], "w": 1, "x": 7.25, "y": 3.25 },
{ "matrix": [3, 7], "w": 1, "x": 8.25, "y": 3.25 },
{ "matrix": [3, 8], "w": 1, "x": 9.25, "y": 3.25 },
{ "matrix": [3, 9], "w": 1, "x": 10.25, "y": 3.25 },
{ "matrix": [3, 10], "w": 1, "x": 11.25, "y": 3.25 },
{ "matrix": [9, 0], "w": 1, "x": 12.25, "y": 3.25 },
{ "matrix": [9, 1], "w": 1, "x": 13.25, "y": 3.25 },
{ "matrix": [9, 2], "w": 1, "x": 14.25, "y": 3.25 },
{ "matrix": [9, 3], "w": 1, "x": 15.25, "y": 3.25 },
{ "matrix": [9, 4], "w": 1, "x": 16.25, "y": 3.25 },
{ "matrix": [9, 5], "w": 2.25, "x": 17.25, "y": 3.25 },
{ "matrix": [9, 7], "w": 1, "x": 20, "y": 3.25 },
{ "matrix": [9, 8], "w": 1, "x": 21, "y": 3.25 },
{ "matrix": [9, 9], "w": 1, "x": 22, "y": 3.25 },
{ "h": 2, "matrix": [4, 0], "w": 1, "x": 0, "y": 4.25 },
{ "matrix": [4, 1], "w": 1, "x": 1, "y": 4.25 },
{ "matrix": [4, 2], "w": 1, "x": 2, "y": 4.25 },
{ "matrix": [4, 3], "w": 1, "x": 3, "y": 4.25 },
{ "matrix": [4, 4], "w": 1.25, "x": 5.5, "y": 4.25 },
{ "matrix": [4, 5], "w": 1, "x": 6.75, "y": 4.25 },
{ "matrix": [4, 6], "w": 1, "x": 7.75, "y": 4.25 },
{ "matrix": [4, 7], "w": 1, "x": 8.75, "y": 4.25 },
{ "matrix": [4, 8], "w": 1, "x": 9.75, "y": 4.25 },
{ "matrix": [4, 9], "w": 1, "x": 10.75, "y": 4.25 },
{ "matrix": [4, 10], "w": 1, "x": 11.75, "y": 4.25 },
{ "matrix": [10, 0], "w": 1, "x": 12.75, "y": 4.25 },
{ "matrix": [10, 1], "w": 1, "x": 13.75, "y": 4.25 },
{ "matrix": [10, 2], "w": 1, "x": 14.75, "y": 4.25 },
{ "matrix": [10, 3], "w": 1, "x": 15.75, "y": 4.25 },
{ "matrix": [10, 4], "w": 1.75, "x": 16.75, "y": 4.25 },
{ "matrix": [10, 5], "w": 1, "x": 20, "y": 4.25 },
{ "matrix": [9, 6], "w": 1, "x": 21, "y": 4.25 },
{ "matrix": [10, 7], "w": 1, "x": 22, "y": 4.25 },
{ "h": 2, "matrix": [10, 8], "w": 1, "x": 23, "y": 4.25 },
{ "matrix": [10, 9], "w": 1, "x": 4.25, "y": 4.5 },
{ "matrix": [10, 10], "w": 1, "x": 18.75, "y": 4.5 },
{ "matrix": [5, 1], "w": 1, "x": 1, "y": 5.25 },
{ "matrix": [5, 2], "w": 1, "x": 2, "y": 5.25 },
{ "matrix": [5, 3], "w": 1, "x": 6.5, "y": 5.25 },
{ "matrix": [5, 4], "w": 1, "x": 7.5, "y": 5.25 },
{ "matrix": [5, 5], "w": 1, "x": 8.5, "y": 5.25 },
{ "matrix": [5, 6], "w": 4, "x": 9.5, "y": 5.25 },
{ "matrix": [5, 7], "w": 1, "x": 13.5, "y": 5.25 },
{ "matrix": [5, 8], "w": 1, "x": 14.5, "y": 5.25 },
{ "matrix": [11, 0], "w": 1, "x": 15.5, "y": 5.25 },
{ "matrix": [11, 2], "w": 1, "x": 16.5, "y": 5.25 },
{ "matrix": [11, 3], "w": 1, "x": 21, "y": 5.25 },
{ "matrix": [11, 4], "w": 1, "x": 22, "y": 5.25 },
{ "matrix": [11, 5], "w": 1, "x": 3.25, "y": 5.5 },
{ "matrix": [10, 6], "w": 1, "x": 4.25, "y": 5.5 },
{ "matrix": [11, 6], "w": 1, "x": 5.25, "y": 5.5 },
{ "matrix": [11, 7], "w": 1, "x": 17.75, "y": 5.5 },
{ "matrix": [11, 8], "w": 1, "x": 18.75, "y": 5.5 },
{ "matrix": [11, 9], "w": 1, "x": 19.75, "y": 5.5 }
]
},
"LAYOUT_7u_space": {
"key_count": 121,
"layout": [
{"label":"k00", "x":0, "y":0}, {"label":"k01", "x":1, "y":0}, {"label":"k02", "x":2, "y":0}, {"label":"k03", "x":3, "y":0}, {"label":"k04", "x":4.75, "y":0}, {"label":"k06", "x":6.25, "y":0}, {"label":"k07", "x":7.25, "y":0}, {"label":"k08", "x":8.25, "y":0}, {"label":"k09", "x":9.25, "y":0}, {"label":"k0a", "x":10.75, "y":0}, {"label":"k60", "x":11.75, "y":0}, {"label":"k61", "x":12.75, "y":0}, {"label":"k62", "x":13.75, "y":0}, {"label":"k63", "x":15.25, "y":0}, {"label":"k64", "x":16.25, "y":0}, {"label":"k65", "x":17.25, "y":0}, {"label":"k66", "x":18.25, "y":0}, {"label":"k67", "x":20, "y":0}, {"label":"k68", "x":21, "y":0}, {"label":"k69", "x":22, "y":0}, {"label":"k6a", "x":23, "y":0},
{"label":"k10", "x":0, "y":1.25}, {"label":"k11", "x":1, "y":1.25}, {"label":"k12", "x":2, "y":1.25}, {"label":"k13", "x":3, "y":1.25}, {"label":"k14", "x":4.5, "y":1.25}, {"label":"k15", "x":5.5, "y":1.25}, {"label":"k16", "x":6.5, "y":1.25}, {"label":"k17", "x":7.5, "y":1.25}, {"label":"k18", "x":8.5, "y":1.25}, {"label":"k19", "x":9.5, "y":1.25}, {"label":"k0a", "x":10.5, "y":1.25}, {"label":"k70", "x":11.5, "y":1.25}, {"label":"k71", "x":12.5, "y":1.25}, {"label":"k72", "x":13.5, "y":1.25}, {"label":"k73", "x":14.5, "y":1.25}, {"label":"k74", "x":15.5, "y":1.25}, {"label":"k75", "x":16.5, "y":1.25}, {"label":"k76", "x":17.5, "y":1.25, "w":2}, {"label":"k77", "x":20, "y":1.25}, {"label":"k78", "x":21, "y":1.25}, {"label":"k79", "x":22, "y":1.25}, {"label":"k7a", "x":23, "y":1.25},
{"label":"k20", "x":0, "y":2.25, "h":2}, {"label":"k21", "x":1, "y":2.25}, {"label":"k22", "x":2, "y":2.25}, {"label":"k23", "x":3, "y":2.25}, {"label":"k24", "x":4.5, "y":2.25, "w":1.5}, {"label":"k25", "x":6, "y":2.25}, {"label":"k26", "x":7, "y":2.25}, {"label":"k27", "x":8, "y":2.25}, {"label":"k28", "x":9, "y":2.25}, {"label":"k29", "x":10, "y":2.25}, {"label":"k2a", "x":11, "y":2.25}, {"label":"k80", "x":12, "y":2.25}, {"label":"k81", "x":13, "y":2.25}, {"label":"k82", "x":14, "y":2.25}, {"label":"k83", "x":15, "y":2.25}, {"label":"k84", "x":16, "y":2.25}, {"label":"k85", "x":17, "y":2.25}, {"label":"k86", "x":18, "y":2.25, "w":1.5}, {"label":"k87", "x":20, "y":2.25}, {"label":"k88", "x":21, "y":2.25}, {"label":"k89", "x":22, "y":2.25}, {"label":"k8a", "x":23, "y":2.25, "h":2},
{"label":"k31", "x":1, "y":3.25}, {"label":"k32", "x":2, "y":3.25}, {"label":"k33", "x":3, "y":3.25}, {"label":"k34", "x":4.5, "y":3.25, "w":1.75}, {"label":"k35", "x":6.25, "y":3.25}, {"label":"k36", "x":7.25, "y":3.25}, {"label":"k37", "x":8.25, "y":3.25}, {"label":"k38", "x":9.25, "y":3.25}, {"label":"k39", "x":10.25, "y":3.25}, {"label":"k3a", "x":11.25, "y":3.25}, {"label":"k90", "x":12.25, "y":3.25}, {"label":"k91", "x":13.25, "y":3.25}, {"label":"k92", "x":14.25, "y":3.25}, {"label":"k93", "x":15.25, "y":3.25}, {"label":"k94", "x":16.25, "y":3.25}, {"label":"k95", "x":17.25, "y":3.25, "w":2.25}, {"label":"k97", "x":20, "y":3.25}, {"label":"k98", "x":21, "y":3.25}, {"label":"k99", "x":22, "y":3.25},
{"label":"k40", "x":0, "y":4.25, "h":2}, {"label":"k41", "x":1, "y":4.25}, {"label":"k42", "x":2, "y":4.25}, {"label":"k43", "x":3, "y":4.25}, {"label":"k45", "x":5.5, "y":4.25, "w":1.25}, {"label":"k46", "x":6.75, "y":4.25}, {"label":"k47", "x":7.75, "y":4.25}, {"label":"k48", "x":8.75, "y":4.25}, {"label":"k49", "x":9.75, "y":4.25}, {"label":"k4a", "x":10.75, "y":4.25}, {"label":"ka0", "x":11.75, "y":4.25}, {"label":"ka1", "x":12.75, "y":4.25}, {"label":"ka2", "x":13.75, "y":4.25}, {"label":"ka3", "x":14.75, "y":4.25}, {"label":"ka4", "x":15.75, "y":4.25}, {"label":"ka5", "x":16.75, "y":4.25, "w":1.75}, {"label":"ka7", "x":20, "y":4.25}, {"label":"ka8", "x":21, "y":4.25}, {"label":"ka9", "x":22, "y":4.25}, {"label":"kaa", "x":23, "y":4.25, "h":2}, {"label":"k44", "x":4.25, "y":4.5}, {"label":"k96", "x":18.75, "y":4.5},
{"label":"k51", "x":1, "y":5.25}, {"label":"k52", "x":2, "y":5.25}, {"label":"k56", "x":6.5, "y":5.25}, {"label":"k57", "x":7.5, "y":5.25}, {"label":"kb0", "x":8.5, "y":5.25, "w":7}, {"label":"kb4", "x":15.5, "y":5.25}, {"label":"kb5", "x":16.5, "y":5.25}, {"label":"kb8", "x":21, "y":5.25}, {"label":"kb9", "x":22, "y":5.25}, {"label":"k53", "x":3.25, "y":5.5}, {"label":"k54", "x":4.25, "y":5.5}, {"label":"k55", "x":5.25, "y":5.5}, {"label":"ka6", "x":17.75, "y":5.5}, {"label":"kb6", "x":18.75, "y":5.5}, {"label":"kb7", "x":19.75, "y":5.5}
{ "matrix": [0, 0], "w": 1, "x": 0, "y": 0 },
{ "matrix": [0, 1], "w": 1, "x": 1, "y": 0 },
{ "matrix": [0, 2], "w": 1, "x": 2, "y": 0 },
{ "matrix": [0, 3], "w": 1, "x": 3, "y": 0 },
{ "matrix": [0, 4], "w": 1, "x": 4.75, "y": 0 },
{ "matrix": [0, 6], "w": 1, "x": 6.25, "y": 0 },
{ "matrix": [0, 7], "w": 1, "x": 7.25, "y": 0 },
{ "matrix": [0, 8], "w": 1, "x": 8.25, "y": 0 },
{ "matrix": [0, 9], "w": 1, "x": 9.25, "y": 0 },
{ "matrix": [0, 10], "w": 1, "x": 10.75, "y": 0 },
{ "matrix": [6, 0], "w": 1, "x": 11.75, "y": 0 },
{ "matrix": [6, 1], "w": 1, "x": 12.75, "y": 0 },
{ "matrix": [6, 2], "w": 1, "x": 13.75, "y": 0 },
{ "matrix": [6, 3], "w": 1, "x": 15.25, "y": 0 },
{ "matrix": [6, 4], "w": 1, "x": 16.25, "y": 0 },
{ "matrix": [6, 5], "w": 1, "x": 17.25, "y": 0 },
{ "matrix": [6, 6], "w": 1, "x": 18.25, "y": 0 },
{ "matrix": [6, 7], "w": 1, "x": 20, "y": 0 },
{ "matrix": [6, 8], "w": 1, "x": 21, "y": 0 },
{ "matrix": [6, 9], "w": 1, "x": 22, "y": 0 },
{ "matrix": [6, 10], "w": 1, "x": 23, "y": 0 },
{ "matrix": [1, 0], "w": 1, "x": 0, "y": 1.25 },
{ "matrix": [1, 1], "w": 1, "x": 1, "y": 1.25 },
{ "matrix": [1, 2], "w": 1, "x": 2, "y": 1.25 },
{ "matrix": [1, 3], "w": 1, "x": 3, "y": 1.25 },
{ "matrix": [1, 4], "w": 1, "x": 4.5, "y": 1.25 },
{ "matrix": [1, 5], "w": 1, "x": 5.5, "y": 1.25 },
{ "matrix": [1, 6], "w": 1, "x": 6.5, "y": 1.25 },
{ "matrix": [1, 7], "w": 1, "x": 7.5, "y": 1.25 },
{ "matrix": [1, 8], "w": 1, "x": 8.5, "y": 1.25 },
{ "matrix": [1, 9], "w": 1, "x": 9.5, "y": 1.25 },
{ "matrix": [1, 10], "w": 1, "x": 10.5, "y": 1.25 },
{ "matrix": [7, 0], "w": 1, "x": 11.5, "y": 1.25 },
{ "matrix": [7, 1], "w": 1, "x": 12.5, "y": 1.25 },
{ "matrix": [7, 2], "w": 1, "x": 13.5, "y": 1.25 },
{ "matrix": [7, 3], "w": 1, "x": 14.5, "y": 1.25 },
{ "matrix": [7, 4], "w": 1, "x": 15.5, "y": 1.25 },
{ "matrix": [7, 5], "w": 1, "x": 16.5, "y": 1.25 },
{ "matrix": [7, 6], "w": 2, "x": 17.5, "y": 1.25 },
{ "matrix": [7, 7], "w": 1, "x": 20, "y": 1.25 },
{ "matrix": [7, 8], "w": 1, "x": 21, "y": 1.25 },
{ "matrix": [7, 9], "w": 1, "x": 22, "y": 1.25 },
{ "matrix": [7, 10], "w": 1, "x": 23, "y": 1.25 },
{ "h": 2, "matrix": [2, 0], "w": 1, "x": 0, "y": 2.25 },
{ "matrix": [2, 1], "w": 1, "x": 1, "y": 2.25 },
{ "matrix": [2, 2], "w": 1, "x": 2, "y": 2.25 },
{ "matrix": [2, 3], "w": 1, "x": 3, "y": 2.25 },
{ "matrix": [2, 4], "w": 1.5, "x": 4.5, "y": 2.25 },
{ "matrix": [2, 5], "w": 1, "x": 6, "y": 2.25 },
{ "matrix": [2, 6], "w": 1, "x": 7, "y": 2.25 },
{ "matrix": [2, 7], "w": 1, "x": 8, "y": 2.25 },
{ "matrix": [2, 8], "w": 1, "x": 9, "y": 2.25 },
{ "matrix": [2, 9], "w": 1, "x": 10, "y": 2.25 },
{ "matrix": [2, 10], "w": 1, "x": 11, "y": 2.25 },
{ "matrix": [8, 0], "w": 1, "x": 12, "y": 2.25 },
{ "matrix": [8, 1], "w": 1, "x": 13, "y": 2.25 },
{ "matrix": [8, 2], "w": 1, "x": 14, "y": 2.25 },
{ "matrix": [8, 3], "w": 1, "x": 15, "y": 2.25 },
{ "matrix": [8, 4], "w": 1, "x": 16, "y": 2.25 },
{ "matrix": [8, 5], "w": 1, "x": 17, "y": 2.25 },
{ "matrix": [8, 6], "w": 1.5, "x": 18, "y": 2.25 },
{ "matrix": [8, 7], "w": 1, "x": 20, "y": 2.25 },
{ "matrix": [8, 8], "w": 1, "x": 21, "y": 2.25 },
{ "matrix": [8, 9], "w": 1, "x": 22, "y": 2.25 },
{ "h": 2, "matrix": [8, 10], "w": 1, "x": 23, "y": 2.25 },
{ "matrix": [3, 1], "w": 1, "x": 1, "y": 3.25 },
{ "matrix": [3, 2], "w": 1, "x": 2, "y": 3.25 },
{ "matrix": [3, 3], "w": 1, "x": 3, "y": 3.25 },
{ "matrix": [3, 4], "w": 1.75, "x": 4.5, "y": 3.25 },
{ "matrix": [3, 5], "w": 1, "x": 6.25, "y": 3.25 },
{ "matrix": [3, 6], "w": 1, "x": 7.25, "y": 3.25 },
{ "matrix": [3, 7], "w": 1, "x": 8.25, "y": 3.25 },
{ "matrix": [3, 8], "w": 1, "x": 9.25, "y": 3.25 },
{ "matrix": [3, 9], "w": 1, "x": 10.25, "y": 3.25 },
{ "matrix": [3, 10], "w": 1, "x": 11.25, "y": 3.25 },
{ "matrix": [9, 0], "w": 1, "x": 12.25, "y": 3.25 },
{ "matrix": [9, 1], "w": 1, "x": 13.25, "y": 3.25 },
{ "matrix": [9, 2], "w": 1, "x": 14.25, "y": 3.25 },
{ "matrix": [9, 3], "w": 1, "x": 15.25, "y": 3.25 },
{ "matrix": [9, 4], "w": 1, "x": 16.25, "y": 3.25 },
{ "matrix": [9, 5], "w": 2.25, "x": 17.25, "y": 3.25 },
{ "matrix": [9, 7], "w": 1, "x": 20, "y": 3.25 },
{ "matrix": [9, 8], "w": 1, "x": 21, "y": 3.25 },
{ "matrix": [9, 9], "w": 1, "x": 22, "y": 3.25 },
{ "h": 2, "matrix": [4, 0], "w": 1, "x": 0, "y": 4.25 },
{ "matrix": [4, 1], "w": 1, "x": 1, "y": 4.25 },
{ "matrix": [4, 2], "w": 1, "x": 2, "y": 4.25 },
{ "matrix": [4, 3], "w": 1, "x": 3, "y": 4.25 },
{ "matrix": [4, 4], "w": 1.25, "x": 5.5, "y": 4.25 },
{ "matrix": [4, 5], "w": 1, "x": 6.75, "y": 4.25 },
{ "matrix": [4, 6], "w": 1, "x": 7.75, "y": 4.25 },
{ "matrix": [4, 7], "w": 1, "x": 8.75, "y": 4.25 },
{ "matrix": [4, 8], "w": 1, "x": 9.75, "y": 4.25 },
{ "matrix": [4, 9], "w": 1, "x": 10.75, "y": 4.25 },
{ "matrix": [4, 10], "w": 1, "x": 11.75, "y": 4.25 },
{ "matrix": [10, 0], "w": 1, "x": 12.75, "y": 4.25 },
{ "matrix": [10, 1], "w": 1, "x": 13.75, "y": 4.25 },
{ "matrix": [10, 2], "w": 1, "x": 14.75, "y": 4.25 },
{ "matrix": [10, 3], "w": 1, "x": 15.75, "y": 4.25 },
{ "matrix": [10, 4], "w": 1.75, "x": 16.75, "y": 4.25 },
{ "matrix": [10, 5], "w": 1, "x": 20, "y": 4.25 },
{ "matrix": [9, 6], "w": 1, "x": 21, "y": 4.25 },
{ "matrix": [10, 7], "w": 1, "x": 22, "y": 4.25 },
{ "h": 2, "matrix": [10, 8], "w": 1, "x": 23, "y": 4.25 },
{ "matrix": [10, 9], "w": 1, "x": 4.25, "y": 4.5 },
{ "matrix": [10, 10], "w": 1, "x": 18.75, "y": 4.5 },
{ "matrix": [5, 1], "w": 1, "x": 1, "y": 5.25 },
{ "matrix": [5, 2], "w": 1, "x": 2, "y": 5.25 },
{ "matrix": [5, 3], "w": 1, "x": 6.5, "y": 5.25 },
{ "matrix": [5, 4], "w": 1, "x": 7.5, "y": 5.25 },
{ "matrix": [5, 5], "w": 7, "x": 8.5, "y": 5.25 },
{ "matrix": [5, 6], "w": 1, "x": 15.5, "y": 5.25 },
{ "matrix": [5, 7], "w": 1, "x": 16.5, "y": 5.25 },
{ "matrix": [11, 0], "w": 1, "x": 21, "y": 5.25 },
{ "matrix": [11, 4], "w": 1, "x": 22, "y": 5.25 },
{ "matrix": [11, 5], "w": 1, "x": 3.25, "y": 5.5 },
{ "matrix": [10, 6], "w": 1, "x": 4.25, "y": 5.5 },
{ "matrix": [11, 6], "w": 1, "x": 5.25, "y": 5.5 },
{ "matrix": [11, 7], "w": 1, "x": 17.75, "y": 5.5 },
{ "matrix": [11, 8], "w": 1, "x": 18.75, "y": 5.5 },
{ "matrix": [11, 9], "w": 1, "x": 19.75, "y": 5.5 }
]
},
"LAYOUT_4u_space": {
"key_count": 124,
"LAYOUT_all": {
"key_count": 127,
"layout": [
{"label":"k00", "x":0, "y":0}, {"label":"k01", "x":1, "y":0}, {"label":"k02", "x":2, "y":0}, {"label":"k03", "x":3, "y":0}, {"label":"k04", "x":4.75, "y":0}, {"label":"k06", "x":6.25, "y":0}, {"label":"k07", "x":7.25, "y":0}, {"label":"k08", "x":8.25, "y":0}, {"label":"k09", "x":9.25, "y":0}, {"label":"k0a", "x":10.75, "y":0}, {"label":"k60", "x":11.75, "y":0}, {"label":"k61", "x":12.75, "y":0}, {"label":"k62", "x":13.75, "y":0}, {"label":"k63", "x":15.25, "y":0}, {"label":"k64", "x":16.25, "y":0}, {"label":"k65", "x":17.25, "y":0}, {"label":"k66", "x":18.25, "y":0}, {"label":"k67", "x":20, "y":0}, {"label":"k68", "x":21, "y":0}, {"label":"k69", "x":22, "y":0}, {"label":"k6a", "x":23, "y":0},
{"label":"k10", "x":0, "y":1.25}, {"label":"k11", "x":1, "y":1.25<