aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZach White <skullydazed@gmail.com>2020-12-30 10:27:37 -0800
committerGitHub <noreply@github.com>2020-12-30 10:27:37 -0800
commit47b9b110097a864d6ab76516b2213afd59948527 (patch)
tree44c4e034c71b361af0cf865b735e09162bbc9656
parentf231f24ddaac9781201a4ec9d0171c65af788839 (diff)
downloadqmk_firmware-47b9b110097a864d6ab76516b2213afd59948527.tar.gz
qmk_firmware-47b9b110097a864d6ab76516b2213afd59948527.zip
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>
-rw-r--r--Makefile4
-rw-r--r--build_keyboard.mk33
-rw-r--r--docs/reference_info_json.md157
-rw-r--r--keyboards/clueboard/17/17.h33
-rw-r--r--keyboards/clueboard/17/config.h69
-rw-r--r--keyboards/clueboard/17/info.json79
-rw-r--r--keyboards/clueboard/17/keymaps/default/readme.md1
-rw-r--r--keyboards/clueboard/17/rules.mk10
-rw-r--r--keyboards/clueboard/2x1800/2018/2018.h74
-rw-r--r--keyboards/clueboard/2x1800/2018/config.h172
-rw-r--r--keyboards/clueboard/2x1800/2018/info.json444
-rw-r--r--keyboards/clueboard/2x1800/2018/rules.mk12
-rw-r--r--keyboards/clueboard/2x1800/2019/2019.h221
-rw-r--r--keyboards/clueboard/2x1800/2019/config.h168
-rw-r--r--keyboards/clueboard/2x1800/2019/info.json2368
-rw-r--r--keyboards/clueboard/2x1800/2019/keymaps/default/keymap.json2
-rw-r--r--keyboards/clueboard/2x1800/2019/rules.mk13
-rw-r--r--keyboards/clueboard/2x1800/info.json5
-rw-r--r--keyboards/clueboard/60/60.h87
-rw-r--r--keyboards/clueboard/60/config.h98
-rw-r--r--keyboards/clueboard/60/info.json387
-rw-r--r--keyboards/clueboard/60/rules.mk13
-rw-r--r--keyboards/clueboard/66/info.json34
-rw-r--r--keyboards/clueboard/66/rev1/config.h59
-rw-r--r--keyboards/clueboard/66/rev1/info.json273
-rw-r--r--keyboards/clueboard/66/rev1/readme.md15
-rw-r--r--keyboards/clueboard/66/rev1/rev1.h72
-rw-r--r--keyboards/clueboard/66/rev1/rules.mk18
-rw-r--r--keyboards/clueboard/66/rev2/config.h56
-rw-r--r--keyboards/clueboard/66/rev2/info.json273
-rw-r--r--keyboards/clueboard/66/rev2/readme.md15
-rw-r--r--keyboards/clueboard/66/rev2/rev2.h90
-rw-r--r--keyboards/clueboard/66/rev2/rules.mk14
-rw-r--r--keyboards/clueboard/66/rev3/config.h58
-rw-r--r--keyboards/clueboard/66/rev3/info.json273
-rw-r--r--keyboards/clueboard/66/rev3/readme.md15
-rw-r--r--keyboards/clueboard/66/rev3/rev3.h90
-rw-r--r--keyboards/clueboard/66/rev3/rules.mk14
-rw-r--r--keyboards/clueboard/66/rev4/config.h54
-rw-r--r--keyboards/clueboard/66/rev4/info.json270
-rw-r--r--keyboards/clueboard/66/rev4/keymaps/keymap.c13
-rw-r--r--keyboards/clueboard/66/rev4/keymaps/mine/keymap.c13
-rw-r--r--keyboards/clueboard/66/rev4/mine/keymap.c13
-rw-r--r--keyboards/clueboard/66/rev4/rev4.h91
-rw-r--r--keyboards/clueboard/66/rev4/rules.mk19
-rw-r--r--keyboards/clueboard/66_hotswap/config.h23
-rw-r--r--keyboards/clueboard/66_hotswap/gen1/config.h25
-rw-r--r--keyboards/clueboard/66_hotswap/gen1/gen1.h71
-rw-r--r--keyboards/clueboard/66_hotswap/gen1/info.json337
-rw-r--r--keyboards/clueboard/66_hotswap/gen1/readme.md16
-rw-r--r--keyboards/clueboard/66_hotswap/gen1/rules.mk20
-rw-r--r--keyboards/clueboard/66_hotswap/prototype/config.h30
-rw-r--r--keyboards/clueboard/66_hotswap/prototype/info.json437
-rw-r--r--keyboards/clueboard/66_hotswap/prototype/prototype.h83
-rw-r--r--keyboards/clueboard/66_hotswap/prototype/readme.md16
-rw-r--r--keyboards/clueboard/66_hotswap/prototype/rules.mk13
-rw-r--r--keyboards/clueboard/california/california.h18
-rw-r--r--keyboards/clueboard/california/config.h21
-rw-r--r--keyboards/clueboard/california/info.json24
-rw-r--r--keyboards/clueboard/california/keymaps/default/readme.md1
-rw-r--r--keyboards/clueboard/card/card.h16
-rw-r--r--keyboards/clueboard/card/config.h129
-rw-r--r--keyboards/clueboard/card/info.json62
-rw-r--r--keyboards/clueboard/card/rules.mk14
-rw-r--r--keyboards/clueboard/info.json6
-rw-r--r--lib/python/qmk/cli/c2json.py3
-rw-r--r--lib/python/qmk/cli/chibios/confmigrate.py8
-rw-r--r--lib/python/qmk/cli/generate/__init__.py4
-rwxr-xr-xlib/python/qmk/cli/generate/api.py14
-rwxr-xr-xlib/python/qmk/cli/generate/config_h.py277
-rwxr-xr-xlib/python/qmk/cli/generate/info_json.py49
-rwxr-xr-xlib/python/qmk/cli/generate/layouts.py93
-rwxr-xr-xlib/python/qmk/cli/generate/rules_mk.py59
-rwxr-xr-xlib/python/qmk/cli/info.py7
-rwxr-xr-xlib/python/qmk/cli/kle2json.py51
-rw-r--r--lib/python/qmk/constants.py11
-rw-r--r--lib/python/qmk/info.py355
-rwxr-xr-xlib/python/qmk/info_json_encoder.py96
-rw-r--r--message.mk3
79 files changed, 4787 insertions, 3897 deletions
diff --git a/Makefile b/Makefile
index e4f7b5b51..91ab9e4e8 100644
--- a/Makefile
+++ b/Makefile
@@ -501,8 +501,8 @@ endef
501%: 501%:
502 # Check if we have the CMP tool installed 502 # Check if we have the CMP tool installed
503 cmp $(ROOT_DIR)/Makefile $(ROOT_DIR)/Makefile >/dev/null 2>&1; if [ $$? -gt 0 ]; then printf "$(MSG_NO_CMP)"; exit 1; fi; 503 cmp $(ROOT_DIR)/Makefile $(ROOT_DIR)/Makefile >/dev/null 2>&1; if [ $$? -gt 0 ]; then printf "$(MSG_NO_CMP)"; exit 1; fi;
504 # Ensure that bin/qmk works. This will be a failing check after the next develop merge 504 # Ensure that bin/qmk works.
505 if ! bin/qmk hello 1> /dev/null 2>&1; then printf "$(MSG_PYTHON_MISSING)"; fi 505 if ! bin/qmk hello 1> /dev/null 2>&1; then printf "$(MSG_PYTHON_MISSING)"; exit 1; fi
506 # Check if the submodules are dirty, and display a warning if they are 506 # Check if the submodules are dirty, and display a warning if they are
507ifndef SKIP_GIT 507ifndef SKIP_GIT
508 if [ ! -e lib/chibios ]; then git submodule sync lib/chibios && git submodule update --depth 50 --init lib/chibios; fi 508 if [ ! -e lib/chibios ]; then git submodule sync lib/chibios && git submodule update --depth 50 --init lib/chibios; fi
diff --git a/build_keyboard.mk b/build_keyboard.mk
index 8d018f2e3..816681bd0 100644
--- a/build_keyboard.mk
+++ b/build_keyboard.mk
@@ -90,13 +90,16 @@ ifneq ("$(wildcard $(KEYBOARD_PATH_1)/rules.mk)","")
90 include $(KEYBOARD_PATH_1)/rules.mk 90 include $(KEYBOARD_PATH_1)/rules.mk
91endif 91endif
92 92
93
94MAIN_KEYMAP_PATH_1 := $(KEYBOARD_PATH_1)/keymaps/$(KEYMAP) 93MAIN_KEYMAP_PATH_1 := $(KEYBOARD_PATH_1)/keymaps/$(KEYMAP)
95MAIN_KEYMAP_PATH_2 := $(KEYBOARD_PATH_2)/keymaps/$(KEYMAP) 94MAIN_KEYMAP_PATH_2 := $(KEYBOARD_PATH_2)/keymaps/$(KEYMAP)
96MAIN_KEYMAP_PATH_3 := $(KEYBOARD_PATH_3)/keymaps/$(KEYMAP) 95MAIN_KEYMAP_PATH_3 := $(KEYBOARD_PATH_3)/keymaps/$(KEYMAP)
97MAIN_KEYMAP_PATH_4 := $(KEYBOARD_PATH_4)/keymaps/$(KEYMAP) 96MAIN_KEYMAP_PATH_4 := $(KEYBOARD_PATH_4)/keymaps/$(KEYMAP)
98MAIN_KEYMAP_PATH_5 := $(KEYBOARD_PATH_5)/keymaps/$(KEYMAP) 97MAIN_KEYMAP_PATH_5 := $(KEYBOARD_PATH_5)/keymaps/$(KEYMAP)
99 98
99# Pull in rules from info.json
100INFO_RULES_MK = $(shell bin/qmk generate-rules-mk --quiet --keyboard $(KEYBOARD) --output $(KEYBOARD_OUTPUT)/src/rules.mk)
101include $(INFO_RULES_MK)
102
100# Check for keymap.json first, so we can regenerate keymap.c 103# Check for keymap.json first, so we can regenerate keymap.c
101include build_json.mk 104include build_json.mk
102 105
@@ -290,6 +293,32 @@ ifneq ("$(wildcard $(KEYMAP_PATH)/config.h)","")
290 CONFIG_H += $(KEYMAP_PATH)/config.h 293 CONFIG_H += $(KEYMAP_PATH)/config.h
291endif 294endif
292 295
296# Pull in stuff from info.json
297INFO_JSON_FILES :=
298ifneq ("$(wildcard $(KEYBOARD_PATH_1)/info.json)","")
299 INFO_JSON_FILES += $(KEYBOARD_PATH_1)/info.json
300endif
301ifneq ("$(wildcard $(KEYBOARD_PATH_2)/info.json)","")
302 INFO_JSON_FILES += $(KEYBOARD_PATH_2)/info.json
303endif
304ifneq ("$(wildcard $(KEYBOARD_PATH_3)/info.json)","")
305 INFO_JSON_FILES += $(KEYBOARD_PATH_3)/info.json
306endif
307ifneq ("$(wildcard $(KEYBOARD_PATH_4)/info.json)","")
308 INFO_JSON_FILES += $(KEYBOARD_PATH_4)/info.json
309endif
310ifneq ("$(wildcard $(KEYBOARD_PATH_5)/info.json)","")
311 INFO_JSON_FILES += $(KEYBOARD_PATH_5)/info.json
312endif
313
314CONFIG_H += $(KEYBOARD_OUTPUT)/src/info_config.h $(KEYBOARD_OUTPUT)/src/layouts.h
315
316$(KEYBOARD_OUTPUT)/src/info_config.h: $(INFO_JSON_FILES)
317 bin/qmk generate-config-h --quiet --keyboard $(KEYBOARD) --output $(KEYBOARD_OUTPUT)/src/info_config.h
318
319$(KEYBOARD_OUTPUT)/src/layouts.h: $(INFO_JSON_FILES)
320 bin/qmk generate-layouts --quiet --keyboard $(KEYBOARD) --output $(KEYBOARD_OUTPUT)/src/layouts.h
321
293# project specific files 322# project specific files
294SRC += $(KEYBOARD_SRC) \ 323SRC += $(KEYBOARD_SRC) \
295 $(KEYMAP_C) \ 324 $(KEYMAP_C) \
@@ -364,7 +393,7 @@ all:
364 echo "skipped" >&2 393 echo "skipped" >&2
365endif 394endif
366 395
367build: elf cpfirmware 396build: $(KEYBOARD_OUTPUT)/src/info_config.h $(KEYBOARD_OUTPUT)/src/layouts.h elf cpfirmware
368check-size: build 397check-size: build
369objs-size: build 398objs-size: build
370 399
diff --git a/docs/reference_info_json.md b/docs/reference_info_json.md
index 3ca62c719..47506bc92 100644
--- a/docs/reference_info_json.md
+++ b/docs/reference_info_json.md
@@ -19,8 +19,20 @@ The `info.json` file is a JSON formatted dictionary with the following keys avai
19 * Width of the board in Key Units 19 * Width of the board in Key Units
20* `height` 20* `height`
21 * Height of the board in Key Units 21 * Height of the board in Key Units
22* `debounce`
23 * How many milliseconds (ms) to wait for debounce to happen. (Default: 5)
24* `diode_direction`
25 * The direction diodes face. See [`DIRECT_PINS` in the hardware configuration](https://docs.qmk.fm/#/config_options?id=hardware-options) for more details.
26* `layout_aliases`
27 * A dictionary containing layout aliases. The key is the alias and the value is a layout in `layouts` it maps to.
22* `layouts` 28* `layouts`
23 * Physical Layout representations. See the next section for more detail. 29 * Physical Layout representations. See the [Layout Format](#layout_format) section for more detail.
30* `matrix_pins`
31 * Configure the pins corresponding to columns and rows, or direct pins. See [Matrix Pins](#matrix_pins) for more detail.
32* `rgblight`
33 * Configure the [RGB Lighting feature](feature_rgblight.md). See the [RGB Lighting](#rgb_lighting) section for more detail.
34* `usb`
35 * Configure USB VID, PID, and other parameters. See [USB](#USB) for more detail.
24 36
25### Layout Format 37### Layout Format
26 38
@@ -49,25 +61,128 @@ All key positions and rotations are specified in relation to the top-left corner
49 * The width of the key, in Key Units. Ignored if `ks` is provided. Default: `1` 61 * The width of the key, in Key Units. Ignored if `ks` is provided. Default: `1`
50* `h` 62* `h`
51 * The height of the key, in Key Units. Ignored if `ks` is provided. Default: `1` 63 * The height of the key, in Key Units. Ignored if `ks` is provided. Default: `1`
52* `r`
53 * How many degrees clockwise to rotate the key.
54* `rx`
55 * The absolute position of the point to rotate the key around in the horizontal axis. Default: `x`
56* `ry`
57 * The absolute position of the point to rotate the key around in the vertical axis. Default: `y`
58* `ks`
59 * Key Shape: define a polygon by providing a list of points, in Key Units.
60 * **Important**: These are relative to the top-left of the key, not absolute.
61 * Example ISO Enter: `[ [0,0], [1.5,0], [1.5,2], [0.25,2], [0.25,1], [0,1], [0,0] ]`
62* `label` 64* `label`
63 * What to name this position in the matrix. 65 * What to name this position in the matrix.
64 * This should usually be the same name as what is silkscreened on the PCB at this location. 66 * This should usually correspond to the keycode for the first layer of the default keymap.
65 67* `matrix`
66## How is the Metadata Exposed? 68 * A 2 item list describing the row and column location for this key.
67 69
68This metadata is primarily used in two ways: 70### Matrix Pins
69 71
70* To allow web-based configurators to dynamically generate UI 72Currently 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.
71* To support the new `make keyboard:keymap:qmk` target, which bundles this metadata up with the firmware to allow QMK Toolbox to be smarter. 73
72 74#### Switch Matrix
73Configurator authors can see the [QMK Compiler](https://docs.api.qmk.fm/using-the-api) docs for more information on using the JSON API. 75
76Most 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`.
77
78Example:
79
80```json
81{
82 "diode_direction": "COL2ROW",
83 "matrix_pins": {
84 "cols": ["F4", "E6", "B1", "D2"],
85 "rows": ["B0", "D3", "D5", "D4", "D6"]
86 }
87}
88```
89
90#### Direct Pins
91
92Direct 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.
93
94When 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.
95
96Example:
97
98```json
99{
100 "matrix_pins": {
101 "direct": [
102 ["A10", "A9"],
103 ["A0", "B8"],
104 [null, "B11"],
105 ["B9", "A8"],
106 ["A7", "B1"],
107 [null, "B2"]
108 ]
109}
110```
111
112### RGB Lighting
113
114This 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.
115
116The following items can be set. Not every value is required.
117
118* `led_count`
119 * The number of LEDs in your strip
120* `pin`
121 * The GPIO pin that your LED strip is connected to
122* `animations`
123 * A dictionary that lists enabled and disabled animations. See [RGB Light Animations](#rgb_light_animations) below.
124* `sleep`
125 * Set to `true` to enable lighting during host sleep
126* `split`
127 * Set to `true` to enable synchronization functionality between split halves
128* `split_count`
129 * For split keyboards, the number of LEDs on each side
130* `max_brightness`
131 * (0-255) What the maxmimum brightness (value) level is
132* `hue_steps`
133 * How many steps of adjustment to have for hue
134* `saturation_steps`
135 * How many steps of adjustment to have for saturation
136* `brightness_steps`
137 * How many steps of adjustment to have for brightness (value)
138
139Example:
140
141```json
142{
143 "rgblight": {
144 "led_count": 4,
145 "pin": "F6",
146 "hue_steps": 10,
147 "saturation_steps": 17,
148 "brightness_steps": 17,
149 "animations": {
150 "all": true
151 }
152 }
153}
154```
155
156#### RGB Light Animations
157
158The following animations can be enabled:
159
160| Key | Description |
161|-----|-------------|
162| `all` | Enable all additional animation modes. |
163| `alternating` | Enable alternating animation mode. |
164| `breathing` | Enable breathing animation mode. |
165| `christmas` | Enable christmas animation mode. |
166| `knight` | Enable knight animation mode. |
167| `rainbow_mood` | Enable rainbow mood animation mode. |
168| `rainbow_swirl` | Enable rainbow swirl animation mode. |
169| `rgb_test` | Enable RGB test animation mode. |
170| `snake` | Enable snake animation mode. |
171| `static_gradient` | Enable static gradient mode. |
172| `twinkle` | Enable twinkle animation mode. |
173
174### USB
175
176Every USB keyboard needs to have its USB parmaters defined. At a minimum you need to set vid, pid, and device version.
177
178Example:
179
180```json
181{
182 "usb": {
183 "vid": "0xC1ED",
184 "pid": "0x23B0",
185 "device_ver": "0x0001"
186 }
187}
188```
diff --git a/keyboards/clueboard/17/17.h b/keyboards/clueboard/17/17.h
index af3be4f5a..ebf208386 100644
--- a/keyboards/clueboard/17/17.h
+++ b/keyboards/clueboard/17/17.h
@@ -3,37 +3,4 @@
3 3
4#include "quantum.h" 4#include "quantum.h"
5 5
6
7/* Cluepad matrix layout
8 * .-------------------.
9 * |NLCK| /| *| -|
10 * |-------------------|
11 * | 7| 8| 9| |
12 * |--------------| |
13 * | 4| 5| 6| +|
14 * |-------------------|
15 * | 1| 2| 3| |
16 * |--------------| |
17 * | 0| .| Ent|
18 * '-------------------'
19 */
20// The first section contains all of the arguments
21// The second converts the arguments into a two-dimensional array
22#define LAYOUT_numpad_5x4( \
23 k00, k01, k02, k03, \
24 k10, k11, k12, \
25 k20, k21, k22, k13, \
26 k30, k31, k32, \
27 k40, k42, k33 \
28) { \
29 { k00, k01, k02, k03 }, \
30 { k10, k11, k12, k13 }, \
31 { k20, k21, k22, KC_NO }, \
32 { k30, k31, k32, k33 }, \
33 { k40, KC_NO, k42, KC_NO } \
34}
35
36#define LAYOUT LAYOUT_numpad_5x4
37#define KEYMAP LAYOUT_numpad_5x4
38
39#endif 6#endif
diff --git a/keyboards/clueboard/17/config.h b/keyboards/clueboard/17/config.h
index b7e28cbb9..877f47869 100644
--- a/keyboards/clueboard/17/config.h
+++ b/keyboards/clueboard/17/config.h
@@ -20,76 +20,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
20 20
21#include "config_common.h" 21#include "config_common.h"
22 22
23/* USB Device descriptor parameter */
24#define VENDOR_ID 0xC1ED
25#define PRODUCT_ID 0x2312
26#define DEVICE_VER 0x0001
27#define MANUFACTURER Clueboard
28#define PRODUCT Cluepad with RGB Underlighting
29#define DESCRIPTION QMK keyboard firmware for Cluepad
30
31/* key matrix size */
32#define MATRIX_ROWS 5
33#define MATRIX_COLS 4
34
35// ROWS: Top to bottom, COLS: Left to right
36/* Row pin configuration
37* row: 0 1 2 3 4
38* pin:
39*/
40#define MATRIX_ROW_PINS { B0, D3, D5, D4, D6 }
41/* Column pin configuration
42 * col: 0 1 2 3
43 * pin: F4 E6 B1 D2
44 */
45#define MATRIX_COL_PINS { F4, E6, B1, D2 }
46#define UNUSED_PINS
47
48/* COL2ROW or ROW2COL */
49#define DIODE_DIRECTION COL2ROW
50
51/* define if matrix has ghost */
52//#define MATRIX_HAS_GHOST
53
54/* Set 0 if debouncing isn't needed */
55#define DEBOUNCE 5
56
57/* Number of backlighting levels */ 23/* Number of backlighting levels */
58#define BACKLIGHT_LEVELS 3 24#define BACKLIGHT_LEVELS 3
59 25
60/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
61#define LOCKING_SUPPORT_ENABLE
62/* Locking resynchronize hack */
63#define LOCKING_RESYNC_ENABLE
64
65/* Underlight configuration
66 */
67#define RGB_DI_PIN F6
68#define RGBLIGHT_ANIMATIONS
69#define RGBLED_NUM 4 // Number of LEDs
70#define RGBLIGHT_HUE_STEP 10
71#define RGBLIGHT_SAT_STEP 17
72#define RGBLIGHT_VAL_STEP 17
73
74/*
75 * Feature disable options
76 * These options are also useful to firmware size reduction.
77 */
78
79/* disable debug print */
80//#define NO_DEBUG
81
82/* Debug forcibly enabled */
83#define ALWAYS_DEBUG
84
85/* disable print */
86//#define NO_PRINT
87
88/* disable action features */
89//#define NO_ACTION_LAYER
90//#define NO_ACTION_TAPPING
91//#define NO_ACTION_ONESHOT
92//#define NO_ACTION_MACRO
93//#define NO_ACTION_FUNCTION
94
95#endif 26#endif
diff --git a/keyboards/clueboard/17/info.json b/keyboards/clueboard/17/info.json
index 12338ae1d..46510c48c 100644
--- a/keyboards/clueboard/17/info.json
+++ b/keyboards/clueboard/17/info.json
@@ -1,30 +1,67 @@
1{ 1{
2 "manufacturer": "Clueboard",
2 "keyboard_name": "Clueboard 17% (Cluepad)", 3 "keyboard_name": "Clueboard 17% (Cluepad)",
3 "keyboard_folder": "clueboard/17", 4 "maintainer": "skullydazed",
4 "url": "",
5 "maintainer": "qmk",
6 "width": 4,
7 "height": 5, 5 "height": 5,
6 "width": 4,
7 "diode_direction": "COL2ROW",
8 "features": {
9 "backlight": true,
10 "bootmagic": false,
11 "command": false,
12 "console": true,
13 "extrakey": true,
14 "midi": false,
15 "mousekey": true,
16 "nkro": true,
17 "rgblight": true,
18 "unicode": false
19 },
20 "matrix_pins": {
21 "cols": ["F4", "E6", "B1", "D2"],
22 "rows": ["B0", "D3", "D5", "D4", "D6"]
23 },
24 "rgblight": {
25 "animations": {
26 "all": true
27 },
28 "brightness_steps": "17",
29 "hue_steps": "10",
30 "led_count": "4",
31 "pin": "F6",
32 "saturation_steps": "17"
33 },
34 "url": "",
35 "usb": {
36 "device_ver": "0x0001",
37 "pid": "0x2312",
38 "vid": "0xC1ED"
39 },
40 "layout_aliases": {
41 "KEYMAP": "LAYOUT_numpad_5x4",
42 "LAYOUT": "LAYOUT_numpad_5x4"
43 },
8 "layouts": { 44 "layouts": {
9 "LAYOUT_numpad_5x4": { 45 "LAYOUT_numpad_5x4": {
46 "key_count": 17,
10 "layout": [ 47 "layout": [
11 {"label":"Num Lock", "x":0, "y":0}, 48 { "label": "Num Lock", "matrix": [0, 0], "w": 1, "x": 0, "y": 0 },
12 {"label":"/", "x":1, "y":0}, 49 { "label": "/", "matrix": [0, 1], "w": 1, "x": 1, "y": 0 },
13 {"label":"*", "x":2, "y":0}, 50 { "label": "*", "matrix": [0, 2], "w": 1, "x": 2, "y": 0 },
14 {"label":"-", "x":3, "y":0}, 51 { "label": "-", "matrix": [0, 3], "w": 1, "x": 3, "y": 0 },
15 {"label":"7", "x":0, "y":1}, 52 { "label": "7", "matrix": [1, 0], "w": 1, "x": 0, "y": 1 },
16 {"label":"8", "x":1, "y":1}, 53 { "label": "8", "matrix": [1, 1], "w": 1, "x": 1, "y": 1 },
17 {"label":"9", "x":2, "y":1}, 54 { "label": "9", "matrix": [1, 2], "w": 1, "x": 2, "y": 1 },
18 {"label":"4", "x":0, "y":2}, 55 { "label": "4", "matrix": [2, 0], "w": 1, "x": 0, "y": 2 },
19 {"label":"5", "x":1, "y":2}, 56 { "label": "5", "matrix": [2, 1], "w": 1, "x": 1, "y": 2 },
20 {"label":"6", "x":2, "y":2}, 57 { "label": "6", "matrix": [2, 2], "w": 1, "x": 2, "y": 2 },
21 {"label":"+", "x":3, "y":1, "h":2}, 58 { "h": 2, "label": "+", "matrix": [1, 3], "w": 1, "x": 3, "y": 1 },
22 {"label":"1", "x":0, "y":3}, 59 { "label": "1", "matrix": [3, 0], "w": 1, "x": 0, "y": 3 },
23 {"label":"2", "x":1, "y":3}, 60 { "label": "2", "matrix": [3, 1], "w": 1, "x": 1, "y": 3 },
24 {"label":"3", "x":2, "y":3}, 61 { "label": "3", "matrix": [3, 2], "w": 1, "x": 2, "y": 3 },
25 {"label":"0", "x":0, "y":4, "w":2}, 62 { "label": "0", "matrix": [4, 0], "w": 2, "x": 0, "y": 4 },
26 {"label":".", "x":2, "y":4}, 63 { "label": ".", "matrix": [4, 2], "w": 1, "x": 2, "y": 4 },
27 {"label":"Enter", "x":3, "y":3, "h":2} 64 { "h": 2, "label": "Enter", "matrix": [3, 3], "w": 1, "x": 3, "y": 3 }
28 ] 65 ]
29 } 66 }
30 } 67 }
diff --git a/keyboards/clueboard/17/keymaps/default/readme.md b/keyboards/clueboard/17/keymaps/default/readme.md
new file mode 100644
index 000000000..4fc9092b3
--- /dev/null
+++ b/keyboards/clueboard/17/keymaps/default/readme.md
@@ -0,0 +1 @@
Default keymap for the Clueboard 17.
diff --git a/keyboards/clueboard/17/rules.mk b/keyboards/clueboard/17/rules.mk
index 703bf3d2d..75fb718e3 100644
--- a/keyboards/clueboard/17/rules.mk
+++ b/keyboards/clueboard/17/rules.mk
@@ -12,14 +12,4 @@ MCU = atmega32u4
12BOOTLOADER = atmel-dfu 12BOOTLOADER = atmel-dfu
13 13
14# Build Options 14# Build Options
15BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration
16MOUSEKEY_ENABLE = yes # Mouse keys
17EXTRAKEY_ENABLE = yes # Audio control and System control
18CONSOLE_ENABLE = yes # Console for debug
19COMMAND_ENABLE = no # Commands for debug and configuration
20NKRO_ENABLE = yes # USB Nkey Rollover
21BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality
22BACKLIGHT_DRIVER = custom 15BACKLIGHT_DRIVER = custom
23RGBLIGHT_ENABLE = yes # Enable keyboard RGB underglow
24MIDI_ENABLE = no # MIDI support
25UNICODE_ENABLE = no # Unicode
diff --git a/keyboards/clueboard/2x1800/2018/2018.h b/keyboards/clueboard/2x1800/2018/2018.h
index 818ceed80..c6e152ad4 100644
--- a/keyboards/clueboard/2x1800/2018/2018.h
+++ b/keyboards/clueboard/2x1800/2018/2018.h
@@ -18,78 +18,4 @@
18 18
19#include "quantum.h" 19#include "quantum.h"
20 20
21// This a shortcut to help you visually see your layout.
22// The first section contains all of the arguments
23// The second converts the arguments into a two-dimensional array
24#define LAYOUT_all( \
25 k00, k01, k02, k03, k04, k06, k07, k08, k09, k0a, k60, k61, k62, k63, k64, k65, k66, k67, k68, k69, k6a, \
26 k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k70, k71, k72, k73, k74, k75, k76, k77, k78, k79, k7a, \
27 k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k80, k81, k82, k83, k84, k85, k86, k87, k88, k89, k8a, \
28 k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k90, k91, k92, k93, k94, k95, k97, k98, k99, \
29 k40, k41, k42, k43, k44, k45, k46, k47, k48, k49, k4a, ka0, ka1, ka2, ka3, ka4, ka5, k96, ka7, ka8, ka9, kaa, \
30 k51, k52, k53, k54, k55, k56, k57, k58, k59, k5a, kb0, kb1, kb2, kb3, kb4, kb5, ka6, kb6, kb7, kb8, kb9 \
31) \
32{ \
33 { k00, k01, k02, k03, k04, KC_NO, k06, k07, k08, k09, k0a }, \
34 { k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a }, \
35 { k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a }, \
36 { KC_NO, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a }, \
37 { k40, k41, k42, k43, k44, k45, k46, k47, k48, k49, k4a }, \
38 { KC_NO, k51, k52, k53, k54, k55, k56, k57, k58, k59, k5a }, \
39 { k60, k61, k62, k63, k64, k65, k66, k67, k68, k69, k6a }, \
40 { k70, k71, k72, k73, k74, k75, k76, k77, k78, k79, k7a }, \
41 { k80, k81, k82, k83, k84, k85, k86, k87, k88, k89, k8a }, \
42 { k90, k91, k92, k93, k94, k95, k96, k97, k98, k99, KC_NO }, \
43 { ka0, ka1, ka2, ka3, ka4, ka5, ka6, ka7, ka8, ka9, kaa }, \
44 { kb0, kb1, kb2, kb3, kb4, kb5, kb6, kb7, kb8, kb9, KC_NO } \
45}
46
47#define LAYOUT_4u_space( \
48 k00, k01, k02, k03, k04, k06, k07, k08, k09, k0a, k60, k61, k62, k63, k64, k65, k66, k67, k68, k69, k6a, \
49 k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k70, k71, k72, k73, k74, k75, k76, k77, k78, k79, k7a, \
50 k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k80, k81, k82, k83, k84, k85, k86, k87, k88, k89, k8a, \
51 k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k90, k91, k92, k93, k94, k95, k97, k98, k99, \
52 k40, k41, k42, k43, k44, k45, k46, k47, k48, k49, k4a, ka0, ka1, ka2, ka3, ka4, ka5, k96, ka7, ka8, ka9, kaa, \
53 k51, k52, k53, k54, k55, k56, k57, k58, kb0, kb2, kb3, kb4, kb5, ka6, kb6, kb7, kb8, kb9 \
54) \
55{ \
56 { k00, k01, k02, k03, k04, KC_NO, k06, k07, k08, k09, k0a }, \
57 { k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a }, \
58 { k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a }, \
59 { KC_NO, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a }, \
60 { k40, k41, k42, k43, k44, k45, k46, k47, k48, k49, k4a }, \
61 { KC_NO, k51, k52, k53, k54, k55, k56, k57, k58, KC_NO, KC_NO }, \
62 { k60, k61, k62, k63, k64, k65, k66, k67, k68, k69, k6a }, \
63 { k70, k71, k72, k73, k74, k75, k76, k77, k78, k79, k7a }, \
64 { k80, k81, k82, k83, k84, k85, k86, k87, k88, k89, k8a }, \
65 { k90, k91, k92, k93, k94, k95, k96, k97, k98, k99, KC_NO }, \
66 { ka0, ka1, ka2, ka3, ka4, ka5, ka6, ka7, ka8, ka9, kaa }, \
67 { kb0, KC_NO, kb2, kb3, kb4, kb5, kb6, kb7, kb8, kb9, KC_NO } \
68}
69
70#define LAYOUT_7u_space( \
71 k00, k01, k02, k03, k04, k06, k07, k08, k09, k0a, k60, k61, k62, k63, k64, k65, k66, k67, k68, k69, k6a, \
72 k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k70, k71, k72, k73, k74, k75, k76, k77, k78, k79, k7a, \
73 k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k80, k81, k82, k83, k84, k85, k86, k87, k88, k89, k8a, \
74 k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k90, k91, k92, k93, k94, k95, k97, k98, k99, \
75 k40, k41, k42, k43, k44, k45, k46, k47, k48, k49, k4a, ka0, ka1, ka2, ka3, ka4, ka5, k96, ka7, ka8, ka9, kaa, \
76 k51, k52, k53, k54, k55, k56, k57, kb0, kb4, kb5, ka6, kb6, kb7, kb8, kb9 \
77) \
78{ \
79 { k00, k01, k02, k03, k04, KC_NO, k06, k07, k08, k09, k0a }, \
80 { k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a }, \
81 { k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a }, \
82 { KC_NO, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a }, \
83 { k40, k41, k42, k43, k44, k45, k46, k47, k48, k49, k4a }, \
84 { KC_NO, k51, k52, k53, k54, k55, k56, k57, KC_NO, KC_NO, KC_NO }, \
85 { k60, k61, k62, k63, k64, k65, k66, k67, k68, k69, k6a }, \
86 { k70, k71, k72, k73, k74, k75, k76, k77, k78, k79, k7a }, \
87 { k80, k81, k82, k83, k84, k85, k86, k87, k88, k89, k8a }, \
88 { k90, k91, k92, k93, k94, k95, k96, k97, k98, k99, KC_NO }, \
89 { ka0, ka1, ka2, ka3, ka4, ka5, ka6, ka7, ka8, ka9, kaa }, \
90 { kb0, KC_NO, KC_NO, KC_NO, kb4, kb5, kb6, kb7, kb8, kb9, KC_NO } \
91}
92
93#define LAYOUT LAYOUT_all
94
95#endif 21#endif
diff --git a/keyboards/clueboard/2x1800/2018/config.h b/keyboards/clueboard/2x1800/2018/config.h
index 0c57b4324..40486379e 100644
--- a/keyboards/clueboard/2x1800/2018/config.h
+++ b/keyboards/clueboard/2x1800/2018/config.h
@@ -15,185 +15,17 @@ You should have received a copy of the GNU General Public License
15along with this program. If not, see <http://www.gnu.org/licenses/>. 15along with this program. If not, see <http://www.gnu.org/licenses/>.
16*/ 16*/
17 17
18#ifndef CONFIG_H 18#pragma once
19#define CONFIG_H
20 19
21#include "config_common.h" 20#include "config_common.h"
22 21
23/* USB Device descriptor parameter */
24#define VENDOR_ID 0xC1ED
25#define PRODUCT_ID 0x23A0
26#define DEVICE_VER 0x0001
27#define MANUFACTURER Clueboard
28#define PRODUCT 2x1800 2018
29#define DESCRIPTION What does it mean?
30
31/* key matrix size */
32#define MATRIX_ROWS 12
33#define MATRIX_COLS 11
34
35/*
36 * Keyboard Matrix Assignments
37 *
38 * Change this to how you wired your keyboard
39 * COLS: AVR pins used for columns, left to right
40 * ROWS: AVR pins used for rows, top to bottom
41 * DIODE_DIRECTION: COL2ROW = COL = Anode (+), ROW = Cathode (-, marked on diode)
42 * ROW2COL = ROW = Anode (+), COL = Cathode (-, marked on diode)
43 *
44*/
45#define MATRIX_ROW_PINS { C0, C1, C2, C3, C7, F7, B1, F2, F3, F4, F5, F6 }
46#define MATRIX_COL_PINS { D2, D3, D4, D5, D7, E0, E1, B0, E6, B3, B2 }
47#define UNUSED_PINS { D0, D1, D6, C5, C6, E4, E5, E7, F0, F1, A0, A1, A2, A3, A4, A5, A6, A7 }
48
49/* COL2ROW, ROW2COL*/
50#define DIODE_DIRECTION ROW2COL
51
52/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */
53#define DEBOUNCE 5
54
55/* define if matrix has ghost (lacks anti-ghosting diodes) */
56//#define MATRIX_HAS_GHOST
57
58/* audio support */ 22/* audio support */
59#define B7_AUDIO 23#define B7_AUDIO
60#define C4_AUDIO 24#define C4_AUDIO
61#define AUDIO_CLICKY 25#define AUDIO_CLICKY
62 26
63#define LED_NUM_LOCK_PIN B4
64#define LED_CAPS_LOCK_PIN B5
65#define LED_SCROLL_LOCK_PIN B6
66
67/* number of backlight levels */
68// #define BACKLIGHT_PIN B7
69// #define BACKLIGHT_BREATHING
70// #define BACKLIGHT_LEVELS 3
71
72/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */ 27/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
73#define LOCKING_SUPPORT_ENABLE 28#define LOCKING_SUPPORT_ENABLE
29
74/* Locking resynchronize hack */ 30/* Locking resynchronize hack */
75#define LOCKING_RESYNC_ENABLE 31#define LOCKING_RESYNC_ENABLE
76
77#define RGB_DI_PIN C6
78#define RGBLIGHT_ANIMATIONS
79#define RGBLED_NUM 16
80#define RGBLIGHT_HUE_STEP 8
81#define RGBLIGHT_SAT_STEP 8
82#define RGBLIGHT_VAL_STEP 8
83
84/* If defined, GRAVE_ESC will always act as ESC when CTRL is held.
85 * This is userful for the Windows task manager shortcut (ctrl+shift+esc).
86 */
87// #define GRAVE_ESC_CTRL_OVERRIDE
88
89/*
90 * Force NKRO
91 *
92 * Force NKRO (nKey Rollover) to be enabled by default, regardless of the saved
93 * state in the bootmagic EEPROM settings. (Note that NKRO must be enabled in the
94 * makefile for this to work.)
95 *
96 * If forced on, NKRO can be disabled via magic key (default = LShift+RShift+N)
97 * until the next keyboard reset.
98 *
99 * NKRO may prevent your keystrokes from being detected in the BIOS, but it is
100 * fully operational during normal computer usage.
101 *
102 * For a less heavy-handed approach, enable NKRO via magic key (LShift+RShift+N)
103 * or via bootmagic (hold SPACE+N while plugging in the keyboard). Once set by
104 * bootmagic, NKRO mode will always be enabled until it is toggled again during a
105 * power-up.
106 *
107 */
108//#define FORCE_NKRO
109
110/*
111 * Magic Key Options
112 *
113 * Magic keys are hotkey commands that allow control over firmware functions of
114 * the keyboard. They are best used in combination with the HID Listen program,
115 * found here: https://www.pjrc.com/teensy/hid_listen.html
116 *
117 * The options below allow the magic key functionality to be changed. This is
118 * useful if your keyboard/keypad is missing keys and you want magic key support.
119 *
120 */
121
122/* control how magic key switches layers */
123//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS true
124//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS true
125//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM false
126
127/* override magic key keymap */
128//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS
129//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS
130//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM
131//#define MAGIC_KEY_HELP1 H
132//#define MAGIC_KEY_HELP2 SLASH
133//#define MAGIC_KEY_DEBUG D
134//#define MAGIC_KEY_DEBUG_MATRIX X
135//#define MAGIC_KEY_DEBUG_KBD K
136//#define MAGIC_KEY_DEBUG_MOUSE M
137//#define MAGIC_KEY_VERSION V
138//#define MAGIC_KEY_STATUS S
139//#define MAGIC_KEY_CONSOLE C
140//#define MAGIC_KEY_LAYER0_ALT1 ESC
141//#define MAGIC_KEY_LAYER0_ALT2 GRAVE
142//#define MAGIC_KEY_LAYER0 0
143//#define MAGIC_KEY_LAYER1 1
144//#define MAGIC_KEY_LAYER2 2
145//#define MAGIC_KEY_LAYER3 3
146//#define MAGIC_KEY_LAYER4 4
147//#define MAGIC_KEY_LAYER5 5
148//#define MAGIC_KEY_LAYER6 6
149//#define MAGIC_KEY_LAYER7 7
150//#define MAGIC_KEY_LAYER8 8
151//#define MAGIC_KEY_LAYER9 9
152//#define MAGIC_KEY_BOOTLOADER PAUSE
153//#define MAGIC_KEY_LOCK CAPS
154//#define MAGIC_KEY_EEPROM E
155//#define MAGIC_KEY_NKRO N
156//#define MAGIC_KEY_SLEEP_LED Z
157
158/*
159 * Feature disable options
160 * These options are also useful to firmware size reduction.
161 */
162
163/* disable debug print */
164//#define NO_DEBUG
165
166/* disable print */
167//#define NO_PRINT
168
169/* disable action features */
170//#define NO_ACTION_LAYER
171//#define NO_ACTION_TAPPING
172//#define NO_ACTION_ONESHOT
173//#define NO_ACTION_MACRO
174//#define NO_ACTION_FUNCTION
175
176/*
177 * MIDI options
178 */
179
180/* Prevent use of disabled MIDI features in the keymap */
181//#define MIDI_ENABLE_STRICT 1
182
183/* enable basic MIDI features:
184 - MIDI notes can be sent when in Music mode is on
185*/
186//#define MIDI_BASIC
187
188/* enable advanced MIDI features:
189 - MIDI notes can be added to the keymap
190 - Octave shift and transpose
191 - Virtual sustain, portamento, and modulation wheel
192 - etc.
193*/
194//#define MIDI_ADVANCED
195
196/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */
197//#define MIDI_TONE_KEYCODE_OCTAVES 1
198
199#endif
diff --git a/keyboards/clueboard/2x1800/2018/info.json b/keyboards/clueboard/2x1800/2018/info.json
index 0e3bb36a9..b67117407 100644
--- a/keyboards/clueboard/2x1800/2018/info.json
+++ b/keyboards/clueboard/2x1800/2018/info.json
@@ -1,41 +1,435 @@
1{ 1{
2 "keyboard_name": "Clueboard 2x1800", 2 "manufacturer": "Clueboard",
3 "url": "", 3 "keyboard_name": "Clueboard 2x1800 2018",
4 "maintainer": "skullydazed", 4 "maintainer": "skullydazed",
5 "width": 24,
6 "height": 6.5, 5 "height": 6.5,
6 "width": 24,
7 "debounce": "5",
8 "diode_direction": "ROW2COL",
9 "features": {
10 "audio": true,
11 "bootmagic": false,
12 "command": false,
13 "console": true,
14 "extrakey": true,
15 "midi": false,
16 "mousekey": true,
17 "nkro": true,
18 "rgblight": true,
19 "unicode": false
20 },
21 "indicators": {
22 "num_lock": "B4",
23 "caps_lock": "B5",
24 "scroll_lock": "B6"
25 },
26 "matrix_pins": {
27 "cols": ["D2", " D3", " D4", " D5", " D7", " E0", " E1", " B0", " E6", " B3", " B2"],
28 "rows": ["C0", " C1", " C2", " C3", " C7", " F7", " B1", " F2", " F3", " F4", " F5", " F6"]
29 },
30 "rgblight": {
31 "animations": {
32 "all": true
33 },
34 "brightness_steps": "8",
35 "hue_steps": "8",
36 "led_count": "16",
37 "pin": "C6",
38 "saturation_steps": "8"
39 },
40 "usb": {
41 "pid": "0x23A0"
42 },
43 "layout_aliases": {
44 "KEYMAP": "LAYOUT_all",
45 "LAYOUT": "LAYOUT_all"
46 },
7 "layouts": { 47 "layouts": {
8 "LAYOUT": { 48 "LAYOUT_4u_space": {
9 "key_count": 127, 49 "key_count": 124,
10 "layout": [ 50 "layout": [
11 {"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}, 51 { "matrix": [0, 0], "w": 1, "x": 0, "y": 0 },
12 {"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}, 52 { "matrix": [0, 1], "w": 1, "x": 1, "y": 0 },
13 {"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}, 53 { "matrix": [0, 2], "w": 1, "x": 2, "y": 0 },
14 {"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}, 54 { "matrix": [0, 3], "w": 1, "x": 3, "y": 0 },
15 {"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}, 55 { "matrix": [0, 4], "w": 1, "x": 4.75, "y": 0 },
16 {"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} 56 { "matrix": [0, 6], "w": 1, "x": 6.25, "y": 0 },
57 { "matrix": [0, 7], "w": 1, "x": 7.25, "y": 0 },
58 { "matrix": [0, 8], "w": 1, "x": 8.25, "y": 0 },
59 { "matrix": [0, 9], "w": 1, "x": 9.25, "y": 0 },
60 { "matrix": [0, 10], "w": 1, "x": 10.75, "y": 0 },
61 { "matrix": [6, 0], "w": 1, "x": 11.75, "y": 0 },
62 { "matrix": [6, 1], "w": 1, "x": 12.75, "y": 0 },
63 { "matrix": [6, 2], "w": 1, "x": 13.75, "y": 0 },
64 { "matrix": [6, 3], "w": 1, "x": 15.25, "y": 0 },
65 { "matrix": [6, 4], "w": 1, "x": 16.25, "y": 0 },
66 { "matrix": [6, 5], "w": 1, "x": 17.25, "y": 0 },
67 { "matrix": [6, 6], "w": 1, "x": 18.25, "y": 0 },
68 { "matrix": [6, 7], "w": 1, "x": 20, "y": 0 },
69 { "matrix": [6, 8], "w": 1, "x": 21, "y": 0 },
70 { "matrix": [6, 9], "w": 1, "x": 22, "y": 0 },
71 { "matrix": [6, 10], "w": 1, "x": 23, "y": 0 },
72 { "matrix": [1, 0], "w": 1, "x": 0, "y": 1.25 },
73 { "matrix": [1, 1], "w": 1, "x": 1, "y": 1.25 },
74 { "matrix": [1, 2], "w": 1, "x": 2, "y": 1.25 },
75 { "matrix": [1, 3], "w": 1, "x": 3, "y": 1.25 },
76 { "matrix": [1, 4], "w": 1, "x": 4.5, "y": 1.25 },
77 { "matrix": [1, 5], "w": 1, "x": 5.5, "y": 1.25 },
78 { "matrix": [1, 6], "w": 1, "x": 6.5, "y": 1.25 },
79 { "matrix": [1, 7], "w": 1, "x": 7.5, "y": 1.25 },
80 { "matrix": [1, 8], "w": 1, "x": 8.5, "y": 1.25 },
81 { "matrix": [1, 9], "w": 1, "x": 9.5, "y": 1.25 },
82 { "matrix": [1, 10], "w": 1, "x": 10.5, "y": 1.25 },
83 { "matrix": [7, 0], "w": 1, "x": 11.5, "y": 1.25 },
84 { "matrix": [7, 1], "w": 1, "x": 12.5, "y": 1.25 },
85 { "matrix": [7, 2], "w": 1, "x": 13.5, "y": 1.25 },
86 { "matrix": [7, 3], "w": 1, "x": 14.5, "y": 1.25 },
87 { "matrix": [7, 4], "w": 1, "x": 15.5, "y": 1.25 },
88 { "matrix": [7, 5], "w": 1, "x": 16.5, "y": 1.25 },
89 { "matrix": [7, 6], "w": 2, "x": 17.5, "y": 1.25 },
90 { "matrix": [7, 7], "w": 1, "x": 20, "y": 1.25 },
91 { "matrix": [7, 8], "w": 1, "x": 21, "y": 1.25 },
92 { "matrix": [7, 9], "w": 1, "x": 22, "y": 1.25 },
93 { "matrix": [7, 10], "w": 1, "x": 23, "y": 1.25 },
94 { "h": 2, "matrix": [2, 0], "w": 1, "x": 0, "y": 2.25 },
95 { "matrix": [2, 1], "w": 1, "x": 1, "y": 2.25 },
96 { "matrix": [2, 2], "w": 1, "x": 2, "y": 2.25 },
97 { "matrix": [2, 3], "w": 1, "x": 3, "y": 2.25 },
98 { "matrix": [2, 4], "w": 1.5, "x": 4.5, "y": 2.25 },
99 { "matrix": [2, 5], "w": 1, "x": 6, "y": 2.25 },
100 { "matrix": [2, 6], "w": 1, "x": 7, "y": 2.25 },
101 { "matrix": [2, 7], "w": 1, "x": 8, "y": 2.25 },
102 { "matrix": [2, 8], "w": 1, "x": 9, "y": 2.25 },
103 { "matrix": [2, 9], "w": 1, "x": 10, "y": 2.25 },
104 { "matrix": [2, 10], "w": 1, "x": 11, "y": 2.25 },
105 { "matrix": [8, 0], "w": 1, "x": 12, "y": 2.25 },
106 { "matrix": [8, 1], "w": 1, "x": 13, "y": 2.25 },
107 { "matrix": [8, 2], "w": 1, "x": 14, "y": 2.25 },
108 { "matrix": [8, 3], "w": 1, "x": 15, "y": 2.25 },
109 { "matrix": [8, 4], "w": 1, "x": 16, "y": 2.25 },
110 { "matrix": [8, 5], "w": 1, "x": 17, "y": 2.25 },
111 { "matrix": [8, 6], "w": 1.5, "x": 18, "y": 2.25 },
112 { "matrix": [8, 7], "w": 1, "x": 20, "y": 2.25 },
113 { "matrix": [8, 8], "w": 1, "x": 21, "y": 2.25 },
114 { "matrix": [8, 9], "w": 1, "x": 22, "y": 2.25 },
115 { "h": 2, "matrix": [8, 10], "w": 1, "x": 23, "y": 2.25 },
116 { "matrix": [3, 1], "w": 1, "x": 1, "y": 3.25 },
117 { "matrix": [3, 2], "w": 1, "x": 2, "y": 3.25 },
118 { "matrix": [3, 3], "w": 1, "x": 3, "y": 3.25 },
119 { "matrix": [3, 4], "w": 1.75, "x": 4.5, "y": 3.25 },
120 { "matrix": [3, 5], "w": 1, "x": 6.25, "y": 3.25 },
121 { "matrix": [3, 6], "w": 1, "x": 7.25, "y": 3.25 },
122 { "matrix": [3, 7], "w": 1, "x": 8.25, "y": 3.25 },
123 { "matrix": [3, 8], "w": 1, "x": 9.25, "y": 3.25 },
124 { "matrix": [3, 9], "w": 1, "x": 10.25, "y": 3.25 },
125 { "matrix": [3, 10], "w": 1, "x": 11.25, "y": 3.25 },
126 { "matrix": [9, 0], "w": 1, "x": 12.25, "y": 3.25 },
127 { "matrix": [9, 1], "w": 1, "x": 13.25, "y": 3.25 },
128 { "matrix": [9, 2], "w": 1, "x": 14.25, "y": 3.25 },
129 { "matrix": [9, 3], "w": 1, "x": 15.25, "y": 3.25 },
130 { "matrix": [9, 4], "w": 1, "x": 16.25, "y": 3.25 },
131 { "matrix": [9, 5], "w": 2.25, "x": 17.25, "y": 3.25 },
132 { "matrix": [9, 7], "w": 1, "x": 20, "y": 3.25 },
133 { "matrix": [9, 8], "w": 1, "x": 21, "y": 3.25 },
134 { "matrix": [9, 9], "w": 1, "x": 22, "y": 3.25 },
135 { "h": 2, "matrix": [4, 0], "w": 1, "x": 0, "y": 4.25 },
136 { "matrix": [4, 1], "w": 1, "x": 1, "y": 4.25 },
137 { "matrix": [4, 2], "w": 1, "x": 2, "y": 4.25 },
138 { "matrix": [4, 3], "w": 1, "x": 3, "y": 4.25 },
139 { "matrix": [4, 4], "w": 1.25, "x": 5.5, "y": 4.25 },
140 { "matrix": [4, 5], "w": 1, "x": 6.75, "y": 4.25 },
141 { "matrix": [4, 6], "w": 1, "x": 7.75, "y": 4.25 },
142 { "matrix": [4, 7], "w": 1, "x": 8.75, "y": 4.25 },
143 { "matrix": [4, 8], "w": 1, "x": 9.75, "y": 4.25 },
144 { "matrix": [4, 9], "w": 1, "x": 10.75, "y": 4.25 },
145 { "matrix": [4, 10], "w": 1, "x": 11.75, "y": 4.25 },
146 { "matrix": [10, 0], "w": 1, "x": 12.75, "y": 4.25 },
147 { "matrix": [10, 1], "w": 1, "x": 13.75, "y": 4.25 },
148 { "matrix": [10, 2], "w": 1, "x": 14.75, "y": 4.25 },
149 { "matrix": [10, 3], "w": 1, "x": 15.75, "y": 4.25 },
150 { "matrix": [10, 4], "w": 1.75, "x": 16.75, "y": 4.25 },
151 { "matrix": [10, 5], "w": 1, "x": 20, "y": 4.25 },
152 { "matrix": [9, 6], "w": 1, "x": 21, "y": 4.25 },
153 { "matrix": [10, 7], "w": 1, "x": 22, "y": 4.25 },
154 { "h": 2, "matrix": [10, 8], "w": 1, "x": 23, "y": 4.25 },
155 { "matrix": [10, 9], "w": 1, "x": 4.25, "y": 4.5 },
156 { "matrix": [10, 10], "w": 1, "x": 18.75, "y": 4.5 },
157 { "matrix": [5, 1], "w": 1, "x": 1, "y": 5.25 },
158 { "matrix": [5, 2], "w": 1, "x": 2, "y": 5.25 },
159 { "matrix": [5, 3], "w": 1, "x": 6.5, "y": 5.25 },
160 { "matrix": [5, 4], "w": 1, "x": 7.5, "y": 5.25 },
161 { "matrix": [5, 5], "w": 1, "x": 8.5, "y": 5.25 },
162 { "matrix": [5, 6], "w": 4, "x": 9.5, "y": 5.25 },
163 { "matrix": [5, 7], "w": 1, "x": 13.5, "y": 5.25 },
164 { "matrix": [5, 8], "w": 1, "x": 14.5, "y": 5.25 },
165 { "matrix": [11, 0], "w": 1, "x": 15.5, "y": 5.25 },
166 { "matrix": [11, 2], "w": 1, "x": 16.5, "y": 5.25 },
167 { "matrix": [11, 3], "w": 1, "x": 21, "y": 5.25 },
168 { "matrix": [11, 4], "w": 1, "x": 22, "y": 5.25 },
169 { "matrix": [11, 5], "w": 1, "x": 3.25, "y": 5.5 },
170 { "matrix": [10, 6], "w": 1, "x": 4.25, "y": 5.5 },
171 { "matrix": [11, 6], "w": 1, "x": 5.25, "y": 5.5 },
172 { "matrix": [11, 7], "w": 1, "x": 17.75, "y": 5.5 },
173 { "matrix": [11, 8], "w": 1, "x": 18.75, "y": 5.5 },
174 { "matrix": [11, 9], "w": 1, "x": 19.75, "y": 5.5 }
17 ] 175 ]
18 }, 176 },
19 "LAYOUT_7u_space": { 177 "LAYOUT_7u_space": {
20 "key_count": 121, 178 "key_count": 121,
21 "layout": [ 179 "layout": [
22 {"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}, 180 { "matrix": [0, 0], "w": 1, "x": 0, "y": 0 },
23 {"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}, 181 { "matrix": [0, 1], "w": 1, "x": 1, "y": 0 },
24 {"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}, 182 { "matrix": [0, 2], "w": 1, "x": 2, "y": 0 },
25 {"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}, 183 { "matrix": [0, 3], "w": 1, "x": 3, "y": 0 },
26 {"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}, 184 { "matrix": [0, 4], "w": 1, "x": 4.75, "y": 0 },
27 {"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} 185 { "matrix": [0, 6], "w": 1, "x": 6.25, "y": 0 },
186 { "matrix": [0, 7], "w": 1, "x": 7.25, "y": 0 },
187 { "matrix": [0, 8], "w": 1, "x": 8.25, "y": 0 },
188 { "matrix": [0, 9], "w": 1, "x": 9.25, "y": 0 },
189 { "matrix": [0, 10], "w": 1, "x": 10.75, "y": 0 },
190 { "matrix": [6, 0], "w": 1, "x": 11.75, "y": 0 },
191 { "matrix": [6, 1], "w": 1, "x": 12.75, "y": 0 },
192 { "matrix": [6, 2], "w": 1, "x": 13.75, "y": 0 },
193 { "matrix": [6, 3], "w": 1, "x": 15.25, "y": 0 },
194 { "matrix": [6, 4], "w": 1, "x": 16.25, "y": 0 },
195 { "matrix": [6, 5], "w": 1, "x": 17.25, "y": 0 },
196 { "matrix": [6, 6], "w": 1, "x": 18.25, "y": 0 },
197 { "matrix": [6, 7], "w": 1, "x": 20, "y": 0 },
198 { "matrix": [6, 8], "w": 1, "x": 21, "y": 0 },
199 { "matrix": [6, 9], "w": 1, "x": 22, "y": 0 },
200 { "matrix": [6, 10], "w": 1, "x": 23, "y": 0 },
201 { "matrix": [1, 0], "w": 1, "x": 0, "y": 1.25 },
202 { "matrix": [1, 1], "w": 1, "x": 1, "y": 1.25 },
203 { "matrix": [1, 2], "w": 1, "x": 2, "y": 1.25 },
204 { "matrix": [1, 3], "w": 1, "x": 3, "y": 1.25 },
205 { "matrix": [1, 4], "w": 1, "x": 4.5, "y": 1.25 },
206 { "matrix": [1, 5], "w": 1, "x": 5.5, "y": 1.25 },
207 { "matrix": [1, 6], "w": 1, "x": 6.5, "y": 1.25 },
208 { "matrix": [1, 7], "w": 1, "x": 7.5, "y": 1.25 },
209 { "matrix": [1, 8], "w": 1, "x": 8.5, "y": 1.25 },
210 { "matrix": [1, 9], "w": 1, "x": 9.5, "y": 1.25 },
211 { "matrix": [1, 10], "w": 1, "x": 10.5, "y": 1.25 },
212 { "matrix": [7, 0], "w": 1, "x": 11.5, "y": 1.25 },
213 { "matrix": [7, 1], "w": 1, "x": 12.5, "y": 1.25 },
214 { "matrix": [7, 2], "w": 1, "x": 13.5, "y": 1.25 },
215 { "matrix": [7, 3], "w": 1, "x": 14.5, "y": 1.25 },
216 { "matrix": [7, 4], "w": 1, "x": 15.5, "y": 1.25 },
217 { "matrix": [7, 5], "w": 1, "x": 16.5, "y": 1.25 },
218 { "matrix": [7, 6], "w": 2, "x": 17.5, "y": 1.25 },
219 { "matrix": [7, 7], "w": 1, "x": 20, "y": 1.25 },
220 { "matrix": [7, 8], "w": 1, "x": 21, "y": 1.25 },
221 { "matrix": [7, 9], "w": 1, "x": 22, "y": 1.25 },
222 { "matrix": [7, 10], "w": 1, "x": 23, "y": 1.25 },
223 { "h": 2, "matrix": [2, 0], "w": 1, "x": 0, "y": 2.25 },
224 { "matrix": [2, 1], "w": 1, "x": 1, "y": 2.25 },
225 { "matrix": [2, 2], "w": 1, "x": 2, "y": 2.25 },
226 { "matrix": [2, 3], "w": 1, "x": 3, "y": 2.25 },
227 { "matrix": [2, 4], "w": 1.5, "x": 4.5, "y": 2.25 },
228 { "matrix": [2, 5], "w": 1, "x": 6, "y": 2.25 },
229 { "matrix": [2, 6], "w": 1, "x": 7, "y": 2.25 },
230 { "matrix": [2, 7], "w": 1, "x": 8, "y": 2.25 },
231 { "matrix": [2, 8], "w": 1, "x": 9, "y": 2.25 },
232 { "matrix": [2, 9], "w": 1, "x": 10, "y": 2.25 },
233 { "matrix": [2, 10], "w": 1, "x": 11, "y": 2.25 },
234 { "matrix": [8, 0], "w": 1, "x": 12, "y": 2.25 },
235 { "matrix": [8, 1], "w": 1, "x": 13, "y": 2.25 },
236 { "matrix": [8, 2], "w": 1, "x": 14, "y": 2.25 },
237 { "matrix": [8, 3], "w": 1, "x": 15, "y": 2.25 },
238 { "matrix": [8, 4], "w": 1, "x": 16, "y": 2.25 },
239 { "matrix": [8, 5], "w": 1, "x": 17, "y": 2.25 },
240 { "matrix": [8, 6], "w": 1.5, "x": 18, "y": 2.25 },
241 { "matrix": [8, 7], "w": 1, "x": 20, "y": 2.25 },
242 { "matrix": [8, 8], "w": 1, "x": 21, "y": 2.25 },
243 { "matrix": [8, 9], "w": 1, "x": 22, "y": 2.25 },
244 { "h": 2, "matrix": [8, 10], "w": 1, "x": 23, "y": 2.25 },
245 { "matrix": [3, 1], "w": 1, "x": 1, "y": 3.25 },
246 { "matrix": [3, 2], "w": 1, "x": 2, "y": 3.25 },
247 { "matrix": [3, 3], "w": 1, "x": 3, "y": 3.25 },
248 { "matrix": [3, 4], "w": 1.75, "x": 4.5, "y": 3.25 },
249 { "matrix": [3, 5], "w": 1, "x": 6.25, "y": 3.25 },
250 { "matrix": [3, 6], "w": 1, "x": 7.25, "y": 3.25 },
251 { "matrix": [3, 7], "w": 1, "x": 8.25, "y": 3.25 },
252 { "matrix": [3, 8], "w": 1, "x": 9.25, "y": 3.25 },
253 { "matrix": [3, 9], "w": 1, "x": 10.25, "y": 3.25 },
254 { "matrix": [3, 10], "w": 1, "x": 11.25, "y": 3.25 },
255 { "matrix": [9, 0], "w": 1, "x": 12.25, "y": 3.25 },
256 { "matrix": [9, 1], "w": 1, "x": 13.25, "y": 3.25 },
257 { "matrix": [9, 2], "w": 1, "x": 14.25, "y": 3.25 },
258 { "matrix": [9, 3], "w": 1, "x": 15.25, "y": 3.25 },
259 { "matrix": [9, 4], "w": 1, "x": 16.25, "y": 3.25 },
260 { "matrix": [9, 5], "w": 2.25, "x": 17.25, "y": 3.25 },
261 { "matrix": [9, 7], "w": 1, "x": 20, "y": 3.25 },
262 { "matrix": [9, 8], "w": 1, "x": 21, "y": 3.25 },
263 { "matrix": [9, 9], "w": 1, "x": 22, "y": 3.25 },
264 { "h": 2, "matrix": [4, 0], "w": 1, "x": 0, "y": 4.25 },
265 { "matrix": [4, 1], "w": 1, "x": 1, "y": 4.25 },
266 { "matrix": [4, 2], "w": 1, "x": 2, "y": 4.25 },
267 { "matrix": [4, 3], "w": 1, "x": 3, "y": 4.25 },
268 { "matrix": [4, 4], "w": 1.25, "x": 5.5, "y": 4.25 },
269 { "matrix": [4, 5], "w": 1, "x": 6.75, "y": 4.25 },
270 { "matrix": [4, 6], "w": 1, "x": 7.75, "y": 4.25 },
271 { "matrix": [4, 7], "w": 1, "x": 8.75, "y": 4.25 },
272 { "matrix": [4, 8], "w": 1, "x": 9.75, "y": 4.25 },
273 { "matrix": [4, 9], "w": 1, "x": 10.75, "y": 4.25 },
274 { "matrix": [4, 10], "w": 1, "x": 11.75, "y": 4.25 },
275 { "matrix": [10, 0], "w": 1, "x": 12.75, "y": 4.25 },
276 { "matrix": [10, 1], "w": 1, "x": 13.75, "y": 4.25 },
277 { "matrix": [10, 2], "w": 1, "x": 14.75, "y": 4.25 },
278 { "matrix": [10, 3], "w": 1, "x": 15.75, "y": 4.25 },
279 { "matrix": [10, 4], "w": 1.75, "x": 16.75, "y": 4.25 },
280 { "matrix": [10, 5], "w": 1, "x": 20, "y": 4.25 },
281 { "matrix": [9, 6], "w": 1, "x": 21, "y": 4.25 },
282 { "matrix": [10, 7], "w": 1, "x": 22, "y": 4.25 },
283 { "h": 2, "matrix": [10, 8], "w": 1, "x": 23, "y": 4.25 },
284 { "matrix": [10, 9], "w": 1, "x": 4.25, "y": 4.5 },
285 { "matrix": [10, 10], "w": 1, "x": 18.75, "y": 4.5 },
286 { "matrix": [5, 1], "w": 1, "x": 1, "y": 5.25 },
287 { "matrix": [5, 2], "w": 1, "x": 2, "y": 5.25 },
288 { "matrix": [5, 3], "w": 1, "x": 6.5, "y": 5.25 },
289 { "matrix": [5, 4], "w": 1, "x": 7.5, "y": 5.25 },
290 { "matrix": [5, 5], "w": 7, "x": 8.5, "y": 5.25 },
291 { "matrix": [5, 6], "w": 1, "x": 15.5, "y": 5.25 },
292 { "matrix": [5, 7], "w": 1, "x": 16.5, "y": 5.25 },
293 { "matrix": [11, 0], "w": 1, "x": 21, "y": 5.25 },
294 { "matrix": [11, 4], "w": 1, "x": 22, "y": 5.25 },
295 { "matrix": [11, 5], "w": 1, "x": 3.25, "y": 5.5 },
296 { "matrix": [10, 6], "w": 1, "x": 4.25, "y": 5.5 },
297 { "matrix": [11, 6], "w": 1, "x": 5.25, "y": 5.5 },
298 { "matrix": [11, 7], "w": 1, "x": 17.75, "y": 5.5 },
299 { "matrix": [11, 8], "w": 1, "x": 18.75, "y": 5.5 },
300 { "matrix": [11, 9], "w": 1, "x": 19.75, "y": 5.5 }
28 ] 301 ]
29 }, 302 },
30 "LAYOUT_4u_space": { 303 "LAYOUT_all": {
31 "key_count": 124, 304 "key_count": 127,
32 "layout": [ 305 "layout": [
33 {"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}, 306 { "label": "Home", "matrix": [0, 0], "w": 1, "x": 0, "y": 0 },
34 {"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}, 307 { "label": "End", "matrix": [0, 1], "w": 1, "x": 1, "y": 0 },
35 {"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}, 308 { "label": "PgUp", "matrix": [0, 2], "w": 1, "x": 2, "y": 0 },
36 {"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}, 309 { "label": "PgDn", "matrix": [0, 3], "w": 1, "x": 3, "y": 0 },
37 {"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}, 310 { "label": "Esc", "matrix": [0, 4], "w": 1, "x": 4.75, "y": 0 },
38 {"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":"k58", "x":8.5, "y":5.25}, {"label":"kb0", "x":9.5, "y":5.25, "w":4}, {"label":"kb2", "x":13.5, "y":5.25}, {"label":"kb3", "x":14.5, "y":5.25}, {"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} 311 { "label": "F1", "matrix": [0, 6], "w": 1, "x": 6.25, "y": 0 },
312 { "label": "F2", "matrix": [0, 7], "w": 1, "x": 7.25, "y": 0 },
313 { "label": "F3", "matrix": [0, 8], "w": 1, "x": 8.25, "y": 0 },
314 { "label": "F4", "matrix": [0, 9], "w": 1, "x": 9.25, "y": 0 },
315 { "label": "F5", "matrix": [0, 10], "w": 1, "x": 10.75, "y": 0 },
316 { "label": "F6", "matrix": [6, 0], "w": 1, "x": 11.75, "y": 0 },
317 { "label": "F7", "matrix": [6, 1], "w": 1, "x": 12.75, "y": 0 },
318 { "label": "F8", "matrix": [6, 2], "w": 1, "x": 13.75, "y": 0 },
319 { "label": "F9", "matrix": [6, 3], "w": 1, "x": 15.25, "y": 0 },
320 { "label": "F10", "matrix": [6, 4], "w": 1, "x": 16.25, "y": 0 },
321 { "label": "F11", "matrix": [6, 5], "w": 1, "x": 17.25, "y": 0 },
322 { "label": "F12", "matrix": [6, 6], "w": 1, "x": 18.25, "y": 0 },
323 { "label": "PrtSc", "matrix": [6, 7], "w": 1, "x": 20, "y": 0 },
324 { "label": "Scroll Lock", "matrix": [6, 8], "w": 1, "x": 21, "y": 0 },
325 { "label": "Pause", "matrix": [6, 9], "w": 1, "x": 22, "y": 0 },
326 { "label": "Insert", "matrix": [6, 10], "w": 1, "x": 23, "y": 0 },
327 { "label": "-", "matrix": [1, 0], "w": 1, "x": 0, "y": 1.25 },
328 { "label": "Num Lock", "matrix": [1, 1], "w": 1, "x": 1, "y": 1.25 },
329 { "label": "/", "matrix": [1, 2], "w": 1, "x": 2, "y": 1.25 },
330 { "label": "*", "matrix": [1, 3], "w": 1, "x": 3, "y": 1.25 },
331 { "label": "~", "matrix": [1, 4], "w": 1, "x": 4.5, "y": 1.25 },
332 { "label": "!", "matrix": [1, 5], "w": 1, "x": 5.5, "y": 1.25 },
333 { "label": "@", "matrix": [1, 6], "w": 1, "x": 6.5, "y": 1.25 },
334 { "label": "#", "matrix": [1, 7], "w": 1, "x": 7.5, "y": 1.25 },
335 { "label": "$", "matrix": [1, 8], "w": 1, "x": 8.5, "y": 1.25 },
336 { "label": "%", "matrix": [1, 9], "w": 1, "x": 9.5, "y": 1.25 },
337 { "label": "^", "matrix": [1, 10], "w": 1, "x": 10.5, "y": 1.25 },
338 { "label": "&", "matrix": [7, 0], "w": 1, "x": 11.5, "y": 1.25 },
339 { "label": "*", "matrix": [7, 1], "w": 1, "x": 12.5, "y": 1.25 },
340 { "label": "(", "matrix": [7, 2], "w": 1, "x": 13.5, "y": 1.25 },
341 { "label": ")", "matrix": [7, 3], "w": 1, "x": 14.5, "y": 1.25 },
342 { "label": "_", "matrix": [7, 4], "w": 1, "x": 15.5, "y": 1.25 },
343 { "label": "+", "matrix": [7, 5], "w": 1, "x": 16.5, "y": 1.25 },
344 { "label": "Backspace", "matrix": [7, 6], "w": 2, "x": 17.5, "y": 1.25 },
345 { "label": "Num Lock", "matrix": [7, 7], "w": 1, "x": 20, "y": 1.25 },
346 { "label": "/", "matrix": [7, 8], "w": 1, "x": 21, "y": 1.25 },
347 { "label": "*", "matrix": [7, 9], "w": 1, "x": 22, "y": 1.25 },
348 { "label": "-", "matrix": [7, 10], "w": 1, "x": 23, "y": 1.25 },
349 { "h": 2, "label": "+", "matrix": [2, 0], "w": 1, "x": 0, "y": 2.25 },
350 { "label": "7", "matrix": [2, 1], "w": 1, "x": 1, "y": 2.25 },
351 { "label": "8", "matrix": [2, 2], "w": 1, "x": 2, "y": 2.25 },
352 { "label": "9", "matrix": [2, 3], "w": 1, "x": 3, "y": 2.25 },
353 { "label": "Tab", "matrix": [2, 4], "w": 1.5, "x": 4.5, "y": 2.25 },
354 { "label": "Q", "matrix": [2, 5], "w": 1, "x": 6, "y": 2.25 },
355 { "label": "W", "matrix": [2, 6], "w": 1, "x": 7, "y": 2.25 },
356 { "label": "E", "matrix": [2, 7], "w": 1, "x": 8, "y": 2.25 },
357 { "label": "R", "matrix": [2, 8], "w": 1, "x": 9, "y": 2.25 },
358 { "label": "T", "matrix": [2, 9], "w": 1, "x": 10, "y": 2.25 },
359 { "label": "Y", "matrix": [2, 10], "w": 1, "x": 11, "y": 2.25 },
360 { "label": "U", "matrix": [8, 0], "w": 1, "x": 12, "y": 2.25 },
361 { "label": "I", "matrix": [8, 1], "w": 1, "x": 13, "y": 2.25 },
362 { "label": "O", "matrix": [8, 2], "w": 1, "x": 14, "y": 2.25 },
363 { "label": "P", "matrix": [8, 3], "w": 1, "x": 15, "y": 2.25 },
364 { "label": "{", "matrix": [8, 4], "w": 1, "x": 16, "y": 2.25 },
365 { "label": "}", "matrix": [8, 5], "w": 1, "x": 17, "y": 2.25 },
366 { "label": "|", "matrix": [8, 6], "w": 1.5, "x": 18, "y": 2.25 },
367 { "label": "7", "matrix": [8, 7], "w": 1, "x": 20, "y": 2.25 },
368 { "label": "8", "matrix": [8, 8], "w": 1, "x": 21, "y": 2.25 },
369 { "label": "9", "matrix": [8, 9], "w": 1, "x": 22, "y": 2.25 },
370 { "h": 2, "label": "+", "matrix": [8, 10], "w": 1, "x": 23, "y": 2.25 },
371 { "label": "4", "matrix": [3, 1], "w": 1, "x": 1, "y": 3.25 },
372 { "label": "5", "matrix": [3, 2], "w": 1, "x": 2, "y": 3.25 },
373 { "label": "6", "matrix": [3, 3], "w": 1, "x": 3, "y": 3.25 },
374 { "label": "Caps Lock", "matrix": [3, 4], "w": 1.75, "x": 4.5, "y": 3.25 },
375 { "label": "A", "matrix": [3, 5], "w": 1, "x": 6.25, "y": 3.25 },
376 { "label": "S", "matrix": [3, 6], "w": 1, "x": 7.25, "y": 3.25 },
377 { "label": "D", "matrix": [3, 7], "w": 1, "x": 8.25, "y": 3.25 },
378 { "label": "F", "matrix": [3, 8], "w": 1, "x": 9.25, "y": 3.25 },
379 { "label": "G", "matrix": [3, 9], "w": 1, "x": 10.25, "y": 3.25 },
380 { "label": "H", "matrix": [3, 10], "w": 1, "x": 11.25, "y": 3.25 },
381 { "label": "J", "matrix": [9, 0], "w": 1, "x": 12.25, "y": 3.25 },
382 { "label": "K", "matrix": [9, 1], "w": 1, "x": 13.25, "y": 3.25 },
383 { "label": "L", "matrix": [9, 2], "w": 1, "x": 14.25, "y": 3.25 },
384 { "label": ":", "matrix": [9, 3], "w": 1, "x": 15.25, "y": 3.25 },
385 { "label": "\"", "matrix": [9, 4], "w": 1, "x": 16.25, "y": 3.25 },
386 { "label": "Enter", "matrix": [9, 5], "w": 2.25, "x": 17.25, "y": 3.25 },
387 { "label": "4", "matrix": [9, 7], "w": 1, "x": 20, "y": 3.25 },
388 { "label": "5", "matrix": [9, 8], "w": 1, "x": 21, "y": 3.25 },
389 { "label": "6", "matrix": [9, 9], "w": 1, "x": 22, "y": 3.25 },
390 { "h": 2, "label": "Enter", "matrix": [4, 0], "w": 1, "x": 0, "y": 4.25 },
391 { "label": "1", "matrix": [4, 1], "w": 1, "x": 1, "y": 4.25 },
392 { "label": "2", "matrix": [4, 2], "w": 1, "x": 2, "y": 4.25 },
393 { "label": "3", "matrix": [4, 3], "w": 1, "x": 3, "y": 4.25 },
394 { "label": "\\u2191", "matrix": [4, 4], "w": 1, "x": 4.25, "y": 4.5 },
395 { "label": "Shift", "matrix": [4, 5], "w": 1.25, "x": 5.5, "y": 4.25 },
396 { "label": "Z", "matrix": [4, 6], "w": 1, "x": 6.75, "y": 4.25 },
397 { "label": "X", "matrix": [4, 7], "w": 1, "x": 7.75, "y": 4.25 },
398 { "label": "C", "matrix": [4, 8], "w": 1, "x": 8.75, "y": 4.25 },
399 { "label": "V", "matrix": [4, 9], "w": 1, "x": 9.75, "y": 4.25 },
400 { "label": "B", "matrix": [4, 10], "w": 1, "x": 10.75, "y": 4.25 },
401 { "label": "N", "matrix": [10, 0], "w": 1, "x": 11.75, "y": 4.25 },
402 { "label": "M", "matrix": [10, 1], "w": 1, "x": 12.75, "y": 4.25 },
403 { "label": "<", "matrix": [10, 2], "w": 1, "x": 13.75, "y": 4.25 },
404 { "label": ">", "matrix": [10, 3], "w": 1, "x": 14.75, "y": 4.25 },
405 { "label": "?", "matrix": [10, 4], "w": 1, "x": 15.75, "y": 4.25 },
406 { "label": "Shift", "matrix": [10, 5], "w": 1.75, "x": 16.75, "y": 4.25 },
407 { "label": "\\u2191", "matrix": [9, 6], "w": 1, "x": 18.75, "y": 4.5 },
408 { "label": "1", "matrix": [10, 7], "w": 1, "x": 20, "y": 4.25 },
409 { "label": "2", "matrix": [10, 8], "w": 1, "x": 21, "y": 4.25 },
410 { "label": "3", "matrix": [10, 9], "w": 1, "x": 22, "y": 4.25 },
411 { "h": 2, "label": "Enter", "matrix": [10, 10], "w": 1, "x": 23, "y": 4.25 },
412 { "label": "0", "matrix": [5, 1], "w": 1, "x": 1, "y": 5.25 },
413 { "label": ".", "matrix": [5, 2], "w": 1, "x": 2, "y": 5.25 },
414 { "label": "\\u2190", "matrix": [5, 3], "w": 1, "x": 3.25, "y": 5.5 },
415 { "label": "\\u2193", "matrix": [5, 4], "w": 1, "x": 4.25, "y": 5.5 },
416 { "label": "\\u2192", "matrix": [5, 5], "w": 1, "x": 5.25, "y": 5.5 },
417 { "label": "Ctrl", "matrix": [5, 6], "w": 1, "x": 6.5, "y": 5.25 },
418 { "label": "Win", "matrix": [5, 7], "w": 1, "x": 7.5, "y": 5.25 },
419 { "label": "Alt", "matrix": [5, 8], "w": 1, "x": 8.5, "y": 5.25 },
420 { "label": "1u", "matrix": [5, 9], "w": 1, "x": 9.5, "y": 5.25 },
421 { "label": "1u", "matrix": [5, 10], "w": 1, "x": 10.5, "y": 5.25 },
422 { "label": "1u", "matrix": [11, 0], "w": 1, "x": 11.5, "y": 5.25 },
423 { "label": "1u", "matrix": [11, 1], "w": 1, "x": 12.5, "y": 5.25 },
424 { "label": "Alt", "matrix": [11, 2], "w": 1, "x": 13.5, "y": 5.25 },
425 { "label": "Win", "matrix": [11, 3], "w": 1, "x": 14.5, "y": 5.25 },
426 { "label": "Menu", "matrix": [11, 4], "w": 1, "x": 15.5, "y": 5.25 },
427 { "label": "Ctrl", "matrix": [11, 5], "w": 1, "x": 16.5, "y": 5.25 },
428 { "label": "\\u2190", "matrix": [10, 6], "w": 1, "x": 17.75, "y": 5.5 },
429 { "label": "\\u2193", "matrix": [11, 6], "w": 1, "x": 18.75, "y": 5.5 },
430 { "label": "\\u2192", "matrix": [11, 7], "w": 1, "x": 19.75, "y": 5.5 },
431 { "label": "0", "matrix": [11, 8], "w": 1, "x": 21, "y": 5.25 },
432 { "label": ".", "matrix": [11, 9], "w": 1, "x": 22, "y": 5.25 }
39 ] 433 ]
40 } 434 }
41 } 435 }
diff --git a/keyboards/clueboard/2x1800/2018/rules.mk b/keyboards/clueboard/2x1800/2018/rules.mk
index 34d9c2a24..c421eb862 100644
--- a/keyboards/clueboard/2x1800/2018/rules.mk
+++ b/keyboards/clueboard/2x1800/2018/rules.mk
@@ -10,15 +10,3 @@ MCU = at90usb1286
10# ATmega32A bootloadHID 10# ATmega32A bootloadHID
11# ATmega328P USBasp 11# ATmega328P USBasp
12BOOTLOADER = halfkay 12BOOTLOADER = halfkay
13
14# Build Options
15BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration
16MOUSEKEY_ENABLE = yes # Mouse keys
17EXTRAKEY_ENABLE = yes # Audio control and System control
18CONSOLE_ENABLE = yes # Console for debug
19COMMAND_ENABLE = no # Commands for debug and configuration
20NKRO_ENABLE = yes # USB Nkey Rollover
21MIDI_ENABLE = no # MIDI support
22UNICODE_ENABLE = no # Unicode
23RGBLIGHT_ENABLE = yes # RGB on port C6
24AUDIO_ENABLE = yes # Audio output on port C4 and B7
diff --git a/keyboards/clueboard/2x1800/2019/2019.h b/keyboards/clueboard/2x1800/2019/2019.h
index b9151071f..e4738a4b9 100644
--- a/keyboards/clueboard/2x1800/2019/2019.h
+++ b/keyboards/clueboard/2x1800/2019/2019.h
@@ -28,227 +28,6 @@ enum TWOx1800_keycodes {
28#undef SAFE_RANGE 28#undef SAFE_RANGE
29#define SAFE_RANGE NEW_SAFE_RANGE 29#define SAFE_RANGE NEW_SAFE_RANGE
30 30
31// This a shortcut to help you visually see your layout.
32// The first section contains all of the arguments
33// The second converts the arguments into a two-dimensional array
34#define LAYOUT_all( \
35 e00, e01, e02, e03, \
36 k00, k01, k02, k03, k04, k06, k07, k08, k09, k0a, k60, k61, k62, k63, k64, k65, k66, k67, k68, k69, k6a, \
37 k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k70, k71, k72, k73, k74, k75, k76, k77, k78, k79, k7a, \
38 k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k80, k81, k82, k83, k84, k85, k86, k87, k88, k89, k8a, \
39 k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k90, k91, k92, k93, k94, k9a, k95, k97, k98, k99, \
40 k40, k41, k42, k43, k44, k45, k46, k47, k48, k49, k4a, ka0, ka1, ka2, ka3, ka4, ka5, k96, ka7, ka8, ka9, kaa, \
41 k51, k52, k53, k54, k55, k56, k57, k58, k59, k5a, kb0, kb1, kb2, kb3, kb4, kb5, ka6, kb6, kb7, kb8, kb9 \
42) { \
43 { k00, k01, k02, k03, k04, KC_NO, k06, k07, k08, k09, k0a }, \
44 { k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a }, \
45 { k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a }, \
46 { KC_NO, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a }, \
47 { k40, k41, k42, k43, k44, k45, k46, k47, k48, k49, k4a }, \
48 { KC_NO, k51, k52, k53, k54, k55, k56, k57, k58, k59, k5a }, \
49 { k60, k61, k62, k63, k64, k65, k66, k67, k68, k69, k6a }, \
50 { k70, k71, k72, k73, k74, k75, k76, k77, k78, k79, k7a }, \
51 { k80, k81, k82, k83, k84, k85, k86, k87, k88, k89, k8a }, \
52 { k90, k91, k92, k93, k94, k95, k96, k97, k98, k99, k9a }, \
53 { ka0, ka1, ka2, ka3, ka4, ka5, ka6, ka7, ka8, ka9, kaa }, \
54 { kb0, kb1, kb2, kb3, kb4, kb5, kb6, kb7, kb8, kb9, KC_NO }, \
55 { KC_NO, KC_NO, KC_NO, e00, e01, KC_NO, KC_NO, KC_NO, KC_NO, e02, e03 } \
56}
57
58#define LAYOUT_1u_ansi( \
59 e00, e01, e02, e03, \
60 k00, k01, k02, k03, k04, k06, k07, k08, k09, k0a, k60, k61, k62, k63, k64, k65, k66, k67, k68, k69, k6a, \
61 k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k70, k71, k72, k73, k74, k75, k76, k77, k78, k79, k7a, \
62 k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k80, k81, k82, k83, k84, k85, k86, k87, k88, k89, k8a, \
63 k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k90, k91, k92, k93, k94, k95, k97, k98, k99, \
64 k40, k41, k42, k43, k44, k45, k46, k47, k48, k49, k4a, ka0, ka1, ka2, ka3, ka4, ka5, k96, ka7, ka8, ka9, kaa, \
65 k51, k52, k53, k54, k55, k56, k57, k58, k59, k5a, kb0, kb1, kb2, kb3, kb4, kb5, ka6, kb6, kb7, kb8, kb9 \
66) { \
67 { k00, k01, k02, k03, k04, KC_NO, k06, k07, k08, k09, k0a }, \
68 { k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a }, \
69 { k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a }, \
70 { KC_NO, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a }, \
71 { k40, k41, k42, k43, k44, k45, k46, k47, k48, k49, k4a }, \
72 { KC_NO, k51, k52, k53, k54, k55, k56, k57, k58, k59, k5a }, \
73 { k60, k61, k62, k63, k64, k65, k66, k67, k68, k69, k6a }, \
74 { k70, k71, k72, k73, k74, k75, k76, k77, k78, k79, k7a }, \
75 { k80, k81, k82, k83, k84, k85, k86, k87, k88, k89, k8a }, \
76 { k90, k91, k92, k93, k94, k95, k96, k97, k98, k99, KC_NO }, \
77 { ka0, ka1, ka2, ka3, ka4, ka5, ka6, ka7, ka8, ka9, kaa }, \
78 { kb0, kb1, kb2, kb3, kb4, kb5, kb6, kb7, kb8, kb9, KC_NO }, \
79 { KC_NO, KC_NO, KC_NO, e00, e01, KC_NO, KC_NO, KC_NO, KC_NO, e02, e03 } \
80}
81
82#define LAYOUT_1u_iso( \
83 e00, e01, e02, e03, \
84 k00, k01, k02, k03, k04, k06, k07, k08, k09, k0a, k60, k61, k62, k63, k64, k65, k66, k67, k68, k69, k6a, \
85 k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k70, k71, k72, k73, k74, k75, k76, k77, k78, k79, k7a, \
86 k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k80, k81, k82, k83, k84, k85, k87, k88, k89, k8a, \
87 k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k90, k91, k92, k93, k94, k9a, k95, k97, k98, k99, \
88 k40, k41, k42, k43, k44, k45, k46, k47, k48, k49, k4a, ka0, ka1, ka2, ka3, ka4, ka5, k96, ka7, ka8, ka9, kaa, \
89 k51, k52, k53, k54, k55, k56, k57, k58, k59, k5a, kb0, kb1, kb2, kb3, kb4, kb5, ka6, kb6, kb7, kb8, kb9 \
90) { \
91 { k00, k01, k02, k03, k04, KC_NO, k06, k07, k08, k09, k0a }, \
92 { k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a }, \
93 { k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a }, \
94 { KC_NO, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a }, \
95 { k40, k41, k42, k43, k44, k45, k46, k47, k48, k49, k4a }, \
96 { KC_NO, k51, k52, k53, k54, k55, k56, k57, k58, k59, k5a }, \
97 { k60, k61, k62, k63, k64, k65, k66, k67, k68, k69, k6a }, \
98 { k70, k71, k72, k73, k74, k75, k76, k77, k78, k79, k7a }, \
99 { k80, k81, k82, k83, k84, k85, KC_NO, k87, k88, k89, k8a }, \
100 { k90, k91, k92, k93, k94, k95, k96, k97, k98, k99, k9a }, \
101 { ka0, ka1, ka2, ka3, ka4, ka5, ka6, ka7, ka8, ka9, kaa }, \
102 { kb0, kb1, kb2, kb3, kb4, kb5, kb6, kb7, kb8, kb9, KC_NO }, \
103 { KC_NO, KC_NO, KC_NO, e00, e01, KC_NO, KC_NO, KC_NO, KC_NO, e02, e03 } \
104}
105
106#define LAYOUT_2u_ansi( \
107 e00, e01, e02, e03, \
108 k00, k01, k02, k03, k04, k06, k07, k08, k09, k0a, k60, k61, k62, k63, k64, k65, k66, k67, k68, k69, k6a, \
109 k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k70, k71, k72, k73, k74, k75, k76, k77, k78, k79, k7a, \
110 k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k80, k81, k82, k83, k84, k85, k86, k87, k88, k89, k8a, \
111 k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k90, k91, k92, k93, k94, k95, k97, k98, k99, \
112 k40, k41, k42, k43, k44, k45, k46, k47, k48, k49, k4a, ka0, ka1, ka2, ka3, ka4, ka5, k96, ka7, ka8, ka9, kaa, \
113 k51, k52, k53, k54, k55, k56, k57, k58, k59, kb0, kb1, kb2, kb3, kb4, kb5, ka6, kb6, kb7, kb8, kb9 \
114) { \
115 { k00, k01, k02, k03, k04, KC_NO, k06, k07, k08, k09, k0a }, \
116 { k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a }, \
117 { k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a }, \
118 { KC_NO, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a }, \
119 { k40, k41, k42, k43, k44, k45, k46, k47, k48, k49, k4a }, \
120 { KC_NO, k51, k52, k53, k54, k55, k56, k57, k58, k59, KC_NO }, \
121 { k60, k61, k62, k63, k64, k65, k66, k67, k68, k69, k6a }, \
122 { k70, k71, k72, k73, k74, k75, k76, k77, k78, k79, k7a }, \
123 { k80, k81, k82, k83, k84, k85, k86, k87, k88, k89, k8a }, \
124 { k90, k91, k92, k93, k94, k95, k96, k97, k98, k99, KC_NO }, \
125 { ka0, ka1, ka2, ka3, ka4, ka5, ka6, ka7, ka8, ka9, kaa }, \
126 { kb0, kb1, kb2, kb3, kb4, kb5, kb6, kb7, kb8, kb9, KC_NO }, \
127 { KC_NO, KC_NO, KC_NO, e00, e01, KC_NO, KC_NO, KC_NO, KC_NO, e02, e03 } \
128}
129
130#define LAYOUT_2u_iso( \
131 e00, e01, e02, e03, \
132 k00, k01, k02, k03, k04, k06, k07, k08, k09, k0a, k60, k61, k62, k63, k64, k65, k66, k67, k68, k69, k6a, \
133 k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k70, k71, k72, k73, k74, k75, k76, k77, k78, k79, k7a, \
134 k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k80, k81, k82, k83, k84, k85, k87, k88, k89, k8a, \
135 k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k90, k91, k92, k93, k94, k9a, k95, k97, k98, k99, \
136 k40, k41, k42, k43, k44, k45, k46, k47, k48, k49, k4a, ka0, ka1, ka2, ka3, ka4, ka5, k96, ka7, ka8, ka9, kaa, \
137 k51, k52, k53, k54, k55, k56, k57, k58, k59, kb0, kb1, kb2, kb3, kb4, kb5, ka6, kb6, kb7, kb8, kb9 \
138) { \
139 { k00, k01, k02, k03, k04, KC_NO, k06, k07, k08, k09, k0a }, \
140 { k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a }, \
141 { k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a }, \
142 { KC_NO, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a }, \
143 { k40, k41, k42, k43, k44, k45, k46, k47, k48, k49, k4a }, \
144 { KC_NO, k51, k52, k53, k54, k55, k56, k57, k58, k59, KC_NO }, \
145 { k60, k61, k62, k63, k64, k65, k66, k67, k68, k69, k6a }, \
146 { k70, k71, k72, k73, k74, k75, k76, k77, k78, k79, k7a }, \
147 { k80, k81, k82, k83, k84, k85, KC_NO, k87, k88, k89, k8a }, \
148 { k90, k91, k92, k93, k94, k95, k96, k97, k98, k99, k9a }, \
149 { ka0, ka1, ka2, ka3, ka4, ka5, ka6, ka7, ka8, ka9, kaa }, \
150 { kb0, kb1, kb2, kb3, kb4, kb5, kb6, kb7, kb8, kb9, KC_NO }, \
151 { KC_NO, KC_NO, KC_NO, e00, e01, KC_NO, KC_NO, KC_NO, KC_NO, e02, e03 } \
152}
153
154#define LAYOUT_4u_ansi( \
155 e00, e01, e02, e03, \
156 k00, k01, k02, k03, k04, k06, k07, k08, k09, k0a, k60, k61, k62, k63, k64, k65, k66, k67, k68, k69, k6a, \
157 k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k70, k71, k72, k73, k74, k75, k76, k77, k78, k79, k7a, \
158 k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k80, k81, k82, k83, k84, k85, k86, k87, k88, k89, k8a, \
159 k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k90, k91, k92, k93, k94, k95, k97, k98, k99, \
160 k40, k41, k42, k43, k44, k45, k46, k47, k48, k49, k4a, ka0, ka1, ka2, ka3, ka4, ka5, k96, ka7, ka8, ka9, kaa, \
161 k51, k52, k53, k54, k55, k56, k57, k58, kb0, kb2, kb3, kb4, kb5, ka6, kb6, kb7, kb8, kb9 \
162) { \
163 { k00, k01, k02, k03, k04, KC_NO, k06, k07, k08, k09, k0a }, \
164 { k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a }, \
165 { k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a }, \
166 { KC_NO, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a }, \
167 { k40, k41, k42, k43, k44, k45, k46, k47, k48, k49, k4a }, \
168 { KC_NO, k51, k52, k53, k54, k55, k56, k57, k58, KC_NO, KC_NO }, \
169 { k60, k61, k62, k63, k64, k65, k66, k67, k68, k69, k6a }, \
170 { k70, k71, k72, k73, k74, k75, k76, k77, k78, k79, k7a }, \
171 { k80, k81, k82, k83, k84, k85, k86, k87, k88, k89, k8a }, \
172 { k90, k91, k92, k93, k94, k95, k96, k97, k98, k99, KC_NO }, \
173 { ka0, ka1, ka2, ka3, ka4, ka5, ka6, ka7, ka8, ka9, kaa }, \
174 { kb0, KC_NO, kb2, kb3, kb4, kb5, kb6, kb7, kb8, kb9, KC_NO }, \
175 { KC_NO, KC_NO, KC_NO, e00, e01, KC_NO, KC_NO, KC_NO, KC_NO, e02, e03 } \
176}
177
178#define LAYOUT_4u_iso( \
179 e00, e01, e02, e03, \
180 k00, k01, k02, k03, k04, k06, k07, k08, k09, k0a, k60, k61, k62, k63, k64, k65, k66, k67, k68, k69, k6a, \
181 k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k70, k71, k72, k73, k74, k75, k76, k77, k78, k79, k7a, \
182 k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k80, k81, k82, k83, k84, k85, k87, k88, k89, k8a, \
183 k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k90, k91, k92, k93, k94, k9a, k95, k97, k98, k99, \
184 k40, k41, k42, k43, k44, k45, k46, k47, k48, k49, k4a, ka0, ka1, ka2, ka3, ka4, ka5, k96, ka7, ka8, ka9, kaa, \
185 k51, k52, k53, k54, k55, k56, k57, k58, kb0, kb2, kb3, kb4, kb5, ka6, kb6, kb7, kb8, kb9 \
186) { \
187 { k00, k01, k02, k03, k04, KC_NO, k06, k07, k08, k09, k0a }, \
188 { k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a }, \
189 { k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a }, \
190 { KC_NO, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a }, \
191 { k40, k41, k42, k43, k44, k45, k46, k47, k48, k49, k4a }, \
192 { KC_NO, k51, k52, k53, k54, k55, k56, k57, k58, KC_NO, KC_NO }, \
193 { k60, k61, k62, k63, k64, k65, k66, k67, k68, k69, k6a }, \
194 { k70, k71, k72, k73, k74, k75, k76, k77, k78, k79, k7a }, \
195 { k80, k81, k82, k83, k84, k85, KC_NO, k87, k88, k89, k8a }, \
196 { k90, k91, k92, k93, k94, k95, k96, k97, k98, k99, k9a }, \
197 { ka0, ka1, ka2, ka3, ka4, ka5, ka6, ka7, ka8, ka9, kaa }, \
198 { kb0, KC_NO, kb2, kb3, kb4, kb5, kb6, kb7, kb8, kb9, KC_NO }, \
199 { KC_NO, KC_NO, KC_NO, e00, e01, KC_NO, KC_NO, KC_NO, KC_NO, e02, e03 } \
200}
201
202#define LAYOUT_7u_ansi( \
203 e00, e01, e02, e03, \
204 k00, k01, k02, k03, k04, k06, k07, k08, k09, k0a, k60, k61, k62, k63, k64, k65, k66, k67, k68, k69, k6a, \
205 k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k70, k71, k72, k73, k74, k75, k76, k77, k78, k79, k7a, \
206 k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k80, k81, k82, k83, k84, k85, k86, k87, k88, k89, k8a, \
207 k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k90, k91, k92, k93, k94, k95, k97, k98, k99, \
208 k40, k41, k42, k43, k44, k45, k46, k47, k48, k49, k4a, ka0, ka1, ka2, ka3, ka4, ka5, k96, ka7, ka8, ka9, kaa, \
209 k51, k52, k53, k54, k55, k56, k57, kb0, kb4, kb5, ka6, kb6, kb7, kb8, kb9 \
210) { \
211 { k00, k01, k02, k03, k04, KC_NO, k06, k07, k08, k09, k0a }, \
212 { k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a }, \
213 { k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a }, \
214 { KC_NO, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a }, \
215 { k40, k41, k42, k43, k44, k45, k46, k47, k48, k49, k4a }, \
216 { KC_NO, k51, k52, k53, k54, k55, k56, k57, KC_NO, KC_NO, KC_NO }, \
217 { k60, k61, k62, k63, k64, k65, k66, k67, k68, k69, k6a }, \
218 { k70, k71, k72, k73, k74, k75, k76, k77, k78, k79, k7a }, \
219 { k80, k81, k82, k83, k84, k85, k86, k87, k88, k89, k8a }, \
220 { k90, k91, k92, k93, k94, k95, k96, k97, k98, k99, KC_NO }, \
221 { ka0, ka1, ka2, ka3, ka4, ka5, ka6, ka7, ka8, ka9, kaa }, \
222 { kb0, KC_NO, KC_NO, KC_NO, kb4, kb5, kb6, kb7, kb8, kb9, KC_NO }, \
223 { KC_NO, KC_NO, KC_NO, e00, e01, KC_NO, KC_NO, KC_NO, KC_NO, e02, e03 } \
224}
225
226#define LAYOUT_7u_iso( \
227 e00, e01, e02, e03, \
228 k00, k01, k02, k03, k04, k06, k07, k08, k09, k0a, k60, k61, k62, k63, k64, k65, k66, k67, k68, k69, k6a, \
229 k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k70, k71, k72, k73, k74, k75, k76, k77, k78, k79, k7a, \
230 k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k80, k81, k82, k83, k84, k85, k87, k88, k89, k8a, \
231 k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k90, k91, k92, k93, k94, k9a, k95, k97, k98, k99, \
232 k40, k41, k42, k43, k44, k45, k46, k47, k48, k49, k4a, ka0, ka1, ka2, ka3, ka4, ka5, k96, ka7, ka8, ka9, kaa, \
233 k51, k52, k53, k54, k55, k56, k57, kb0, kb4, kb5, ka6, kb6, kb7, kb8, kb9 \
234) { \
235 { k00, k01, k02, k03, k04, KC_NO, k06, k07, k08, k09, k0a }, \
236 { k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a }, \
237 { k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a }, \
238 { KC_NO, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a }, \
239 { k40, k41, k42, k43, k44, k45, k46, k47, k48, k49, k4a }, \
240 { KC_NO, k51, k52, k53, k54, k55, k56, k57, KC_NO, KC_NO, KC_NO }, \
241 { k60, k61, k62, k63, k64, k65, k66, k67, k68, k69, k6a }, \
242 { k70, k71, k72, k73, k74, k75, k76, k77, k78, k79, k7a }, \
243 { k80, k81, k82, k83, k84, k85, KC_NO, k87, k88, k89, k8a }, \
244 { k90, k91, k92, k93, k94, k95, k96, k97, k98, k99, k9a }, \
245 { ka0, ka1, ka2, ka3, ka4, ka5, ka6, ka7, ka8, ka9, kaa }, \
246 { kb0, KC_NO, KC_NO, KC_NO, kb4, kb5, kb6, kb7, kb8, kb9, KC_NO }, \
247 { KC_NO, KC_NO, KC_NO, e00, e01, KC_NO, KC_NO, KC_NO, KC_NO, e02, e03 } \
248}
249
250#define LAYOUT LAYOUT_all
251
252// Encoder update function that returns true/false 31// Encoder update function that returns true/false
253__attribute__ ((weak)) 32__attribute__ ((weak))
254bool encoder_update_keymap(int8_t index, bool clockwise); 33bool encoder_update_keymap(int8_t index, bool clockwise);
diff --git a/keyboards/clueboard/2x1800/2019/config.h b/keyboards/clueboard/2x1800/2019/config.h
index b9e087f62..595dc6108 100644
--- a/keyboards/clueboard/2x1800/2019/config.h
+++ b/keyboards/clueboard/2x1800/2019/config.h
@@ -19,182 +19,18 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
19 19
20#include "config_common.h" 20#include "config_common.h"
21 21
22/* USB Device descriptor parameter */
23#define VENDOR_ID 0xC1ED
24#define PRODUCT_ID 0x23A0
25#define DEVICE_VER 0x0002
26#define MANUFACTURER Clueboard
27#define PRODUCT 2x1800 2019
28#define DESCRIPTION Mechanical Drawing Toy Edition
29
30/* key matrix size */
31#define MATRIX_ROWS 13
32#define MATRIX_COLS 11
33
34/* 22/*
35 * Keyboard Matrix Assignments 23 * Encoder Assignments
36 * 24 */
37 * Change this to how you wired your keyboard
38 * COLS: AVR pins used for columns, left to right
39 * ROWS: AVR pins used for rows, top to bottom
40 * DIODE_DIRECTION: COL2ROW = COL = Anode (+), ROW = Cathode (-, marked on diode)
41 * ROW2COL = ROW = Anode (+), COL = Cathode (-, marked on diode)
42 *
43*/
44#define MATRIX_ROW_PINS { C0, C1, C2, C3, C7, F7, B1, F2, F3, F4, F5, F6, C6 }
45#define MATRIX_COL_PINS { D2, D3, D4, D5, D7, E0, E1, B0, E6, B3, B2 }
46#define UNUSED_PINS { D0, D1, D6, C5, E7, F0, F1 }
47
48#define ENCODERS_PAD_A { A5, A4, A2, A1 } 25#define ENCODERS_PAD_A { A5, A4, A2, A1 }
49#define ENCODERS_PAD_B { A6, A7, A3, A0 } 26#define ENCODERS_PAD_B { A6, A7, A3, A0 }
50#define ENCODER_RESOLUTION 4 27#define ENCODER_RESOLUTION 4
51 28
52/* COL2ROW, ROW2COL*/
53#define DIODE_DIRECTION ROW2COL
54
55/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */
56#define DEBOUNCE 5
57
58/* define if matrix has ghost (lacks anti-ghosting diodes) */
59//#define MATRIX_HAS_GHOST
60
61/* audio support */ 29/* audio support */
62#define B7_AUDIO 30#define B7_AUDIO
63#define C4_AUDIO 31#define C4_AUDIO
64#define AUDIO_CLICKY 32#define AUDIO_CLICKY
65 33
66/* number of backlight levels */
67// #define BACKLIGHT_PIN B7
68// #define BACKLIGHT_BREATHING
69// #define BACKLIGHT_LEVELS 3
70
71/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
72#define LOCKING_SUPPORT_ENABLE
73/* Locking resynchronize hack */
74#define LOCKING_RESYNC_ENABLE
75
76#define RGB_DI_PIN C5
77#define RGBLIGHT_ANIMATIONS
78#define RGBLED_NUM 16
79#define RGBLIGHT_HUE_STEP 8
80#define RGBLIGHT_SAT_STEP 8
81#define RGBLIGHT_VAL_STEP 8
82
83/* If defined, GRAVE_ESC will always act as ESC when CTRL is held.
84 * This is userful for the Windows task manager shortcut (ctrl+shift+esc).
85 */
86// #define GRAVE_ESC_CTRL_OVERRIDE
87
88/*
89 * Force NKRO
90 *
91 * Force NKRO (nKey Rollover) to be enabled by default, regardless of the saved
92 * state in the bootmagic EEPROM settings. (Note that NKRO must be enabled in the
93 * makefile for this to work.)
94 *
95 * If forced on, NKRO can be disabled via magic key (default = LShift+RShift+N)
96 * until the next keyboard reset.
97 *
98 * NKRO may prevent your keystrokes from being detected in the BIOS, but it is
99 * fully operational during normal computer usage.
100 *
101 * For a less heavy-handed approach, enable NKRO via magic key (LShift+RShift+N)
102 * or via bootmagic (hold SPACE+N while plugging in the keyboard). Once set by
103 * bootmagic, NKRO mode will always be enabled until it is toggled again during a
104 * power-up.
105 *
106 */
107//#define FORCE_NKRO
108
109/*
110 * Magic Key Options
111 *
112 * Magic keys are hotkey commands that allow control over firmware functions of
113 * the keyboard. They are best used in combination with the HID Listen program,
114 * found here: https://www.pjrc.com/teensy/hid_listen.html
115 *
116 * The options below allow the magic key functionality to be changed. This is
117 * useful if your keyboard/keypad is missing keys and you want magic key support.
118 *
119 */
120
121/* control how magic key switches layers */
122//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS true
123//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS true
124//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM false
125
126/* override magic key keymap */
127//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS
128//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS
129//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM
130//#define MAGIC_KEY_HELP1 H
131//#define MAGIC_KEY_HELP2 SLASH
132//#define MAGIC_KEY_DEBUG D
133//#define MAGIC_KEY_DEBUG_MATRIX X
134//#define MAGIC_KEY_DEBUG_KBD K
135//#define MAGIC_KEY_DEBUG_MOUSE M
136//#define MAGIC_KEY_VERSION V
137//#define MAGIC_KEY_STATUS S
138//#define MAGIC_KEY_CONSOLE C
139//#define MAGIC_KEY_LAYER0_ALT1 ESC
140//#define MAGIC_KEY_LAYER0_ALT2 GRAVE
141//#define MAGIC_KEY_LAYER0 0
142//#define MAGIC_KEY_LAYER1 1
143//#define MAGIC_KEY_LAYER2 2
144//#define MAGIC_KEY_LAYER3 3
145//#define MAGIC_KEY_LAYER4 4
146//#define MAGIC_KEY_LAYER5 5
147//#define MAGIC_KEY_LAYER6 6
148//#define MAGIC_KEY_LAYER7 7
149//#define MAGIC_KEY_LAYER8 8
150//#define MAGIC_KEY_LAYER9 9
151//#define MAGIC_KEY_BOOTLOADER PAUSE
152//#define MAGIC_KEY_LOCK CAPS
153//#define MAGIC_KEY_EEPROM E
154//#define MAGIC_KEY_NKRO N
155//#define MAGIC_KEY_SLEEP_LED Z
156
157/*
158 * Feature disable options
159 * These options are also useful to firmware size reduction.
160 */
161
162/* disable debug print */
163//#define NO_DEBUG
164
165/* disable print */
166//#define NO_PRINT
167
168/* disable action features */
169//#define NO_ACTION_LAYER
170//#define NO_ACTION_TAPPING
171//#define NO_ACTION_ONESHOT
172//#define NO_ACTION_MACRO
173//#define NO_ACTION_FUNCTION
174
175/*
176 * MIDI options
177 */
178
179/* Prevent use of disabled MIDI features in the keymap */
180//#define MIDI_ENABLE_STRICT 1
181
182/* enable basic MIDI features:
183 - MIDI notes can be sent when in Music mode is on
184*/
185//#define MIDI_BASIC
186
187/* enable advanced MIDI features:
188 - MIDI notes can be added to the keymap
189 - Octave shift and transpose
190 - Virtual sustain, portamento, and modulation wheel
191 - etc.
192*/
193//#define MIDI_ADVANCED
194
195/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */
196//#define MIDI_TONE_KEYCODE_OCTAVES 1
197
198/* 34/*
199 * Drawing mode 35 * Drawing mode
200 */ 36 */
diff --git a/keyboards/clueboard/2x1800/2019/info.json b/keyboards/clueboard/2x1800/2019/info.json
index dcd153c86..1d6d8c6ba 100644
--- a/keyboards/clueboard/2x1800/2019/info.json
+++ b/keyboards/clueboard/2x1800/2019/info.json
@@ -1,1204 +1,1240 @@
1{ 1{
2 "manufacturer": "Clueboard",
2 "keyboard_name": "Clueboard 2x1800 2019", 3 "keyboard_name": "Clueboard 2x1800 2019",
3 "url": "",
4 "maintainer": "skullydazed", 4 "maintainer": "skullydazed",
5 "width": 24,
6 "height": 8, 5 "height": 8,
6 "width": 24,
7 "debounce": "5",
8 "diode_direction": "ROW2COL",
9 "features": {
10 "audio": true,
11 "bootmagic": false,
12 "command": true,
13 "console": true,
14 "encoder": true,
15 "extrakey": true,
16 "midi": false,
17 "mousekey": true,
18 "nkro": true,
19 "rgblight": true,
20 "unicode": false
21 },
22 "matrix_pins": {
23 "cols": ["D2", "D3", "D4", "D5", "D7", "E0", "E1", "B0", "E6", "B3", "B2"],
24 "rows": ["C0", "C1", "C2", "C3", "C7", "F7", "B1", "F2", "F3", "F4", "F5", "F6", "C6"]
25 },
26 "usb": {
27 "device_ver": "0x0001",
28 "pid": "0x23A0",
29 "vid": "0xC1ED"
30 },
31 "layout_aliases": {
32 "LAYOUT": "LAYOUT_all"
33 },
7 "layouts": { 34 "layouts": {
8 "LAYOUT_all": {
9 "layout": [
10 {"label":"e00", "x":3, "y":0},
11 {"label":"e01", "x":4, "y":0},
12 {"label":"e02", "x":19, "y":0},
13 {"label":"e03", "x":20, "y":0},
14 {"label":"k00", "x":0, "y":1.5},
15 {"label":"k01", "x":1, "y":1.5},
16 {"label":"k02", "x":2, "y":1.5},
17 {"label":"k03", "x":3, "y":1.5},
18 {"label":"k04", "x":4.75, "y":1.5},
19 {"label":"k06", "x":6.25, "y":1.5},
20 {"label":"k07", "x":7.25, "y":1.5},
21 {"label":"k08", "x":8.25, "y":1.5},
22 {"label":"k09", "x":9.25, "y":1.5},
23 {"label":"k0a", "x":10.75, "y":1.5},
24 {"label":"k60", "x":11.75, "y":1.5},
25 {"label":"k61", "x":12.75, "y":1.5},
26 {"label":"k62", "x":13.75, "y":1.5},
27 {"label":"k63", "x":15.25, "y":1.5},
28 {"label":"k64", "x":16.25, "y":1.5},
29 {"label":"k65", "x":17.25, "y":1.5},
30 {"label":"k66", "x":18.25, "y":1.5},
31 {"label":"k67", "x":20, "y":1.5},
32 {"label":"k68", "x":21, "y":1.5},
33 {"label":"k69", "x":22, "y":1.5},
34 {"label":"k6a", "x":23, "y":1.5},
35 {"label":"k10", "x":0, "y":2.75},
36 {"label":"k11", "x":1, "y":2.75},
37 {"label":"k12", "x":2, "y":2.75},
38 {"label":"k13", "x":3, "y":2.75},
39 {"label":"k14", "x":4.5, "y":2.75},
40 {"label":"k15", "x":5.5, "y":2.75},
41 {"label":"k16", "x":6.5, "y":2.75},
42 {"label":"k17", "x":7.5, "y":2.75},
43 {"label":"k18", "x":8.5, "y":2.75},
44 {"label":"k19", "x":9.5, "y":2.75},
45 {"label":"k1a", "x":10.5, "y":2.75},
46 {"label":"k70", "x":11.5, "y":2.75},
47 {"label":"k71", "x":12.5, "y":2.75},
48 {"label":"k72", "x":13.5, "y":2.75},
49 {"label":"k73", "x":14.5, "y":2.75},
50 {"label":"k74", "x":15.5, "y":2.75},
51 {"label":"k75", "x":16.5, "y":2.75},
52 {"label":"k76", "x":17.5, "y":2.75, "w":2},
53 {"label":"k77", "x":20, "y":2.75},
54 {"label":"k78", "x":21, "y":2.75},
55 {"label":"k79", "x":22, "y":2.75},
56 {"label":"k7a", "x":23, "y":2.75},
57 {"label":"k20", "x":0, "y":3.75, "h":2},
58 {"label":"k21", "x":1, "y":3.75},
59 {"label":"k22", "x":2, "y":3.75},
60 {"label":"k23", "x":3, "y":3.75},
61 {"label":"k24", "x":4.5, "y":3.75, "w":1.5},
62 {"label":"k25", "x":6, "y":3.75},
63 {"label":"k26", "x":7, "y":3.75},
64 {"label":"k27", "x":8, "y":3.75},
65 {"label":"k28", "x":9, "y":3.75},
66 {"label":"k29", "x":10, "y":3.75},
67 {"label":"k2a", "x":11, "y":3.75},
68 {"label":"k80", "x":12, "y":3.75},
69 {"label":"k81", "x":13, "y":3.75},
70 {"label":"k82", "x":14, "y":3.75},
71 {"label":"k83", "x":15, "y":3.75},
72 {"label":"k84", "x":16, "y":3.75},
73 {"label":"k85", "x":17, "y":3.75},
74 {"label":"k86", "x":18, "y":3.75, "w":1.5},
75 {"label":"k87", "x":20, "y":3.75},
76 {"label":"k88", "x":21, "y":3.75},
77 {"label":"k89", "x":22, "y":3.75},
78 {"label":"k8a", "x":23, "y":3.75, "h":2},
79 {"label":"k31", "x":1, "y":4.75},
80 {"label":"k32", "x":2, "y":4.75},
81 {"label":"k33", "x":3, "y":4.75},
82 {"label":"k34", "x":4.5, "y":4.75, "w":1.75},
83 {"label":"k35", "x":6.25, "y":4.75},
84 {"label":"k36", "x":7.25, "y":4.75},
85 {"label":"k37", "x":8.25, "y":4.75},
86 {"label":"k38", "x":9.25, "y":4.75},
87 {"label":"k39", "x":10.25, "y":4.75},
88 {"label":"k3a", "x":11.25, "y":4.75},
89 {"label":"k90", "x":12.25, "y":4.75},
90 {"label":"k91", "x":13.25, "y":4.75},
91 {"label":"k92", "x":14.25, "y":4.75},
92 {"label":"k93", "x":15.25, "y":4.75},
93 {"label":"k94", "x":16.25, "y":4.75},
94 {"label":"k9a", "x":17.25, "y":4.75},
95 {"label":"k95", "x":18.25, "y":4.75, "w":1.25},
96 {"label":"k97", "x":20, "y":4.75},
97 {"label":"k98", "x":21, "y":4.75},
98 {"label":"k99", "x":22, "y":4.75},
99 {"label":"k40", "x":0, "y":5.75, "h":2},
100 {"label":"k41", "x":1, "y":5.75},
101 {"label":"k42", "x":2, "y":5.75},
102 {"label":"k43", "x":3, "y":5.75},
103 {"label":"k44", "x":4.25, "y":6},
104 {"label":"k45", "x":5.5, "y":5.75, "w":1.25},
105 {"label":"k46", "x":6.75, "y":5.75},
106 {"label":"k47", "x":7.75, "y":5.75},
107 {"label":"k48", "x":8.75, "y":5.75},
108 {"label":"k49", "x":9.75, "y":5.75},
109 {"label":"k4a", "x":10.75, "y":5.75},
110 {"label":"ka0", "x":11.75, "y":5.75},
111 {"label":"ka1", "x":12.75, "y":5.75},
112 {"label":"ka2", "x":13.75, "y":5.75},
113 {"label":"ka3", "x":14.75, "y":5.75},
114 {"label":"ka4", "x":15.75, "y":5.75},
115 {"label":"ka5", "x":16.75, "y":5.75, "w":1.75},
116 {"label":"k96", "x":18.75, "y":6},
117 {"label":"ka7", "x":20, "y":5.75},
118 {"label":"ka8", "x":21, "y":5.75},
119 {"label":"ka9", "x":22, "y":5.75},
120 {"label":"kaa", "x":23, "y":5.75, "h":2},
121 {"label":"k51", "x":1, "y":6.75},
122 {"label":"k52", "x":2, "y":6.75},
123 {"label":"k53", "x":3.25, "y":7},
124 {"label":"k54", "x":4.25, "y":7},
125 {"label":"k55", "x":5.25, "y":7},
126 {"label":"k56", "x":6.5, "y":6.75},
127 {"label":"k57", "x":7.5, "y":6.75},
128 {"label":"k58", "x":8.5, "y":6.75},
129 {"label":"k59", "x":9.5, "y":6.75},
130 {"label":"k5a", "x":10.5, "y":6.75},
131 {"label":"kb0", "x":11.5, "y":6.75},
132 {"label":"kb1", "x":12.5, "y":6.75},
133 {"label":"kb2", "x":13.5, "y":6.75},
134 {"label":"kb3", "x":14.5, "y":6.75},
135 {"label":"kb4", "x":15.5, "y":6.75},
136 {"label":"kb5", "x":16.5, "y":6.75},
137 {"label":"ka6", "x":17.75, "y":7},
138 {"label":"kb6", "x":18.75, "y":7},
139 {"label":"kb7", "x":19.75, "y":7},
140 {"label":"kb8", "x":21, "y":6.75},
141 {"label":"kb9", "x":22, "y":6.75}
142 ]
143 },
144 "LAYOUT_1u_ansi": { 35 "LAYOUT_1u_ansi": {
36 "key_count": 131,
145 "layout": [ 37 "layout": [
146 {"label":"e00", "x":3, "y":0}, 38 { "matrix": [12, 3], "w": 1, "x": 3, "y": 0 },
147 {"label":"e01", "x":4, "y":0}, 39 { "matrix": [12, 4], "w": 1, "x": 4, "y": 0 },
148 {"label":"e02", "x":19, "y":0}, 40 { "matrix": [12, 9], "w": 1, "x": 19, "y": 0 },
149 {"label":"e03", "x":20, "y":0}, 41 { "matrix": [12, 10], "w": 1, "x": 20, "y": 0 },
150 {"label":"k00", "x":0, "y":1.5}, 42 { "matrix": [0, 0], "w": 1, "x": 0, "y": 1.5 },
151 {"label":"k01", "x":1, "y":1.5}, 43 { "matrix": [0, 1], "w": 1, "x": 1, "y": 1.5 },
152 {"label":"k02", "x":2, "y":1.5}, 44 { "matrix": [0, 2], "w": 1, "x": 2, "y": 1.5 },
153 {"label":"k03", "x":3, "y":1.5}, 45 { "matrix": [0, 3], "w": 1, "x": 3, "y": 1.5 },
154 {"label":"k04", "x":4.75, "y":1.5}, 46 { "matrix": [0, 4], "w": 1, "x": 4.75, "y": 1.5 },
155 {"label":"k06", "x":6.25, "y":1.5}, 47 { "matrix": [0, 6], "w": 1, "x": 6.25, "y": 1.5 },
156 {"label":"k07", "x":7.25, "y":1.5}, 48 { "matrix": [0, 7], "w": 1, "x": 7.25, "y": 1.5 },
157 {"label":"k08", "x":8.25, "y":1.5}, 49 { "matrix": [0, 8], "w": 1, "x": 8.25, "y": 1.5 },
158 {"label":"k09", "x":9.25, "y":1.5}, 50 { "matrix": [0, 9], "w": 1, "x": 9.25, "y": 1.5 },
159 {"label":"k0a", "x":10.75, "y":1.5}, 51 { "matrix": [0, 10], "w": 1, "x": 10.75, "y": 1.5 },
160 {"label":"k60", "x":11.75, "y":1.5}, 52 { "matrix": [6, 0], "w": 1, "x": 11.75, "y": 1.5 },
161 {"label":"k61", "x":12.75, "y":1.5}, 53 { "matrix": [6, 1], "w": 1, "x": 12.75, "y": 1.5 },
162 {"label":"k62", "x":13.75, "y":1.5}, 54 { "matrix": [6, 2], "w": 1, "x": 13.75, "y": 1.5 },
163 {"label":"k63", "x":15.25, "y":1.5}, 55 { "matrix": [6, 3], "w": 1, "x": 15.25, "y": 1.5 },
164 {"label":"k64", "x":16.25, "y":1.5}, 56 { "matrix": [6, 4], "w": 1, "x": 16.25, "y": 1.5 },
165 {"label":"k65", "x":17.25, "y":1.5}, 57 { "matrix": [6, 5], "w": 1, "x": 17.25, "y": 1.5 },
166 {"label":"k66", "x":18.25, "y":1.5}, 58 { "matrix": [6, 6], "w": 1, "x": 18.25, "y": 1.5 },
167 {"label":"k67", "x":20, "y":1.5}, 59 { "matrix": [6, 7], "w": 1, "x": 20, "y": 1.5 },
168 {"label":"k68", "x":21, "y":1.5}, 60 { "matrix": [6, 8], "w": 1, "x": 21, "y": 1.5 },
169 {"label":"k69", "x":22, "y":1.5}, 61 { "matrix": [6, 9], "w": 1, "x": 22, "y": 1.5 },
170 {"label":"k6a", "x":23, "y":1.5}, 62 { "matrix": [6, 10], "w": 1, "x": 23, "y": 1.5 },
171 {"label":"k10", "x":0, "y":2.75}, 63 { "matrix": [1, 0], "w": 1, "x": 0, "y": 2.75 },
172 {"label":"k11", "x":1, "y":2.75}, 64 { "matrix": [1, 1], "w": 1, "x": 1, "y": 2.75 },
173 {"label":"k12", "x":2, "y":2.75}, 65 { "matrix": [1, 2], "w": 1, "x": 2, "y": 2.75 },
174 {"label":"k13", "x":3, "y":2.75}, 66 { "matrix": [1, 3], "w": 1, "x": 3, "y": 2.75 },
175 {"label":"k14", "x":4.5, "y":2.75}, 67 { "matrix": [1, 4], "w": 1, "x": 4.5, "y": 2.75 },
176 {"label":"k15", "x":5.5, "y":2.75}, 68 { "matrix": [1, 5], "w": 1, "x": 5.5, "y": 2.75 },
177 {"label":"k16", "x":6.5, "y":2.75}, 69 { "matrix": [1, 6], "w": 1, "x": 6.5, "y": 2.75 },
178 {"label":"k17", "x":7.5, "y":2.75}, 70 { "matrix": [1, 7], "w": 1, "x": 7.5, "y": 2.75 },
179 {"label":"k18", "x":8.5, "y":2.75}, 71 { "matrix": [1, 8], "w": 1, "x": 8.5, "y": 2.75 },
180 {"label":"k19", "x":9.5, "y":2.75}, 72 { "matrix": [1, 9], "w": 1, "x": 9.5, "y": 2.75 },
181 {"label":"k1a", "x":10.5, "y":2.75}, 73 { "matrix": [1, 10], "w": 1, "x": 10.5, "y": 2.75 },
182 {"label":"k70", "x":11.5, "y":2.75}, 74 { "matrix": [7, 0], "w": 1, "x": 11.5, "y": 2.75 },
183 {"label":"k71", "x":12.5, "y":2.75}, 75 { "matrix": [7, 1], "w": 1, "x": 12.5, "y": 2.75 },
184 {"label":"k72", "x":13.5, "y":2.75}, 76 { "matrix": [7, 2], "w": 1, "x": 13.5, "y": 2.75 },
185 {"label":"k73", "x":14.5, "y":2.75}, 77 { "matrix": [7, 3], "w": 1, "x": 14.5, "y": 2.75 },
186 {"label":"k74", "x":15.5, "y":2.75}, 78 { "matrix": [7, 4], "w": 1, "x": 15.5, "y": 2.75 },
187 {"label":"k75", "x":16.5, "y":2.75}, 79 { "matrix": [7, 5], "w": 1, "x": 16.5, "y": 2.75 },
188 {"label":"k76", "x":17.5, "y":2.75, "w":2}, 80 { "matrix": [7, 6], "w": 2, "x": 17.5, "y": 2.75 },
189 {"label":"k77", "x":20, "y":2.75}, 81 { "matrix": [7, 7], "w": 1, "x": 20, "y": 2.75 },
190 {"label":"k78", "x":21, "y":2.75}, 82 { "matrix": [7, 8], "w": 1, "x": 21, "y": 2.75 },
191 {"label":"k79", "x":22, "y":2.75}, 83 { "matrix": [7, 9], "w": 1, "x": 22, "y": 2.75 },
192 {"label":"k7a", "x":23, "y":2.75}, 84 { "matrix": [7, 10], "w": 1, "x": 23, "y": 2.75 },
193 {"label":"k20", "x":0, "y":3.75, "h":2}, 85 { "h": 2, "matrix": [2, 0], "w": 1, "x": 0, "y": 3.75 },
194 {"label":"k21", "x":1, "y":3.75}, 86 { "matrix": [2, 1], "w": 1, "x": 1, "y": 3.75 },
195 {"label":"k22", "x":2, "y":3.75}, 87 { "matrix": [2, 2], "w": 1, "x": 2, "y": 3.75 },
196 {"label":"k23", "x":3, "y":3.75}, 88 { "matrix": [2, 3], "w": 1, "x": 3, "y": 3.75 },
197 {"label":"k24", "x":4.5, "y":3.75, "w":1.5}, 89 { "matrix": [2, 4], "w": 1.5, "x": 4.5, "y": 3.75 },
198 {"label":"k25", "x":6, "y":3.75}, 90 { "matrix": [2, 5], "w": 1, "x": 6, "y": 3.75 },
199 {"label":"k26", "x":7, "y":3.75}, 91 { "matrix": [2, 6], "w": 1, "x": 7, "y": 3.75 },
200 {"label":"k27", "x":8, "y":3.75}, 92 { "matrix": [2, 7], "w": 1, "x": 8, "y": 3.75 },
201 {"label":"k28", "x":9, "y":3.75}, 93 { "matrix": [2, 8], "w": 1, "x": 9, "y": 3.75 },
202 {"label":"k29", "x":10, "y":3.75}, 94 { "matrix": [2, 9], "w": 1, "x": 10, "y": 3.75 },
203 {"label":"k2a", "x":11, "y":3.75}, 95 { "matrix": [2, 10], "w": 1, "x": 11, "y": 3.75 },
204 {"label":"k80", "x":12, "y":3.75}, 96 { "matrix": [8, 0], "w": 1, "x": 12, "y": 3.75 },
205 {"label":"k81", "x":13, "y":3.75}, 97 { "matrix": [8, 1], "w": 1, "x": 13, "y": 3.75 },
206 {"label":"k82", "x":14, "y":3.75}, 98 { "matrix": [8, 2], "w": 1, "x": 14, "y": 3.75 },
207 {"label":"k83", "x":15, "y":3.75}, 99 { "matrix": [8, 3], "w": 1, "x": 15, "y": 3.75 },
208 {"label":"k84", "x":16, "y":3.75}, 100 { "matrix": [8, 4], "w": 1, "x": 16, "y": 3.75 },
209 {"label":"k85", "x":17, "y":3.75}, 101 { "matrix": [8, 5], "w": 1, "x": 17, "y": 3.75 },
210 {"label":"k86", "x":18, "y":3.75, "w":1.5}, 102 { "matrix": [8, 6], "w": 1.5, "x": 18, "y": 3.75 },
211 {"label":"k87", "x":20, "y":3.75}, 103 { "matrix": [8, 7], "w": 1, "x": 20, "y": 3.75 },
212 {"label":"k88", "x":21, "y":3.75}, 104 { "matrix": [8, 8], "w": 1, "x": 21, "y": 3.75 },
213 {"label":"k89", "x":22, "y":3.75}, 105 { "matrix": [8, 9], "w": 1, "x": 22, "y": 3.75 },
214 {"label":"k8a", "x":23, "y":3.75, "h":2}, 106 { "h": 2, "matrix": [8, 10], "w": 1, "x": 23, "y": 3.75 },
215 {"label":"k31", "x":1, "y":4.75}, 107 { "matrix": [3, 1], "w": 1, "x": 1, "y": 4.75 },
216 {"label":"k32", "x":2, "y":4.75}, 108 { "matrix": [3, 2], "w": 1, "x": 2, "y": 4.75 },
217 {"label":"k33", "x":3, "y":4.75}, 109 { "matrix": [3, 3], "w": 1, "x": 3, "y": 4.75 },
218 {"label":"k34", "x":4.5, "y":4.75, "w":1.75}, 110 { "matrix": [3, 4], "w": 1.75, "x": 4.5, "y": 4.75 },
219 {"label":"k35", "x":6.25, "y":4.75}, 111 { "matrix": [3, 5], "w": 1, "x": 6.25, "y": 4.75 },
220 {"label":"k36", "x":7.25, "y":4.75}, 112 { "matrix": [3, 6], "w": 1, "x": 7.25, "y": 4.75 },
221 {"label":"k37", "x":8.25, "y":4.75}, 113 { "matrix": [3, 7], "w": 1, "x": 8.25, "y": 4.75 },
222 {"label":"k38", "x":9.25, "y":4.75}, 114 { "matrix": [3, 8], "w": 1, "x": 9.25, "y": 4.75 },
223 {"label":"k39", "x":10.25, "y":4.75}, 115 { "matrix": [3, 9], "w": 1, "x": 10.25, "y": 4.75 },
224 {"label":"k3a", "x":11.25, "y":4.75}, 116 { "matrix": [3, 10], "w": 1, "x": 11.25, "y": 4.75 },
225 {"label":"k90", "x":12.25, "y":4.75}, 117 { "matrix": [9, 0], "w": 1, "x": 12.25, "y": 4.75 },
226 {"label":"k91", "x":13.25, "y":4.75}, 118 { "matrix": [9, 1], "w": 1, "x": 13.25, "y": 4.75 },
227 {"label":"k92", "x":14.25, "y":4.75}, 119 { "matrix": [9, 2], "w": 1, "x": 14.25, "y": 4.75 },
228 {"label":"k93", "x":15.25, "y":4.75}, 120 { "matrix": [9, 3], "w": 1, "x": 15.25, "y": 4.75 },
229 {"label":"k94", "x":16.25, "y":4.75}, 121 { "matrix": [9, 4], "w": 1, "x": 16.25, "y": 4.75 },
230 {"label":"k95", "x":17.25, "y":4.75, "w":2.25}, 122 { "matrix": [9, 5], "w": 2.25, "x": 17.25, "y": 4.75 },
231 {"label":"k97", "x":20, "y":4.75}, 123 { "matrix": [9, 7], "w": 1, "x": 20, "y": 4.75 },
232 {"label":"k98", "x":21, "y":4.75}, 124 { "matrix": [9, 8], "w": 1, "x": 21, "y": 4.75 },
233 {"label":"k99", "x":22, "y":4.75}, 125 { "matrix": [9, 9], "w": 1, "x": 22, "y": 4.75 },
234 {"label":"k40", "x":0, "y":5.75, "h":2}, 126 { "h": 2, "matrix": [4, 0], "w": 1, "x": 0, "y": 5.75 },
235 {"label":"k41", "x":1, "y":5.75}, 127 { "matrix": [4, 1], "w": 1, "x": 1, "y": 5.75 },
236 {"label":"k42", "x":2, "y":5.75}, 128 { "matrix": [4, 2], "w": 1, "x": 2, "y": 5.75 },
237 {"label":"k43", "x":3, "y":5.75}, 129 { "matrix": [4, 3], "w": 1, "x": 3, "y": 5.75 },
238 {"label":"k44", "x":4.25, "y":6}, 130 { "matrix": [4, 4], "w": 1, "x": 4.25, "y": 6 },
239 {"label":"k45", "x":5.5, "y":5.75, "w":1.25}, 131 { "matrix": [4, 5], "w": 1.25, "x": 5.5, "y": 5.75 },
240 {"label":"k46", "x":6.75, "y":5.75}, 132 { "matrix": [4, 6], "w": 1, "x": 6.75, "y": 5.75 },
241 {"label":"k47", "x":7.75, "y":5.75}, 133 { "matrix": [4, 7], "w": 1, "x": 7.75, "y": 5.75 },
242 {"label":"k48", "x":8.75, "y":5.75}, 134 { "matrix": [4, 8], "w": 1, "x": 8.75, "y": 5.75 },
243 {"label":"k49", "x":9.75, "y":5.75}, 135 { "matrix": [4, 9], "w": 1, "x": 9.75, "y": 5.75 },
244 {"label":"k4a", "x":10.75, "y":5.75}, 136 { "matrix": [4, 10], "w": 1, "x": 10.75, "y": 5.75 },
245 {"label":"ka0", "x":11.75, "y":5.75}, 137 { "matrix": [10, 0], "w": 1, "x": 11.75, "y": 5.75 },
246 {"label":"ka1", "x":12.75, "y":5.75}, 138 { "matrix": [10, 1], "w": 1, "x": 12.75, "y": 5.75 },
247 {"label":"ka2", "x":13.75, "y":5.75}, 139 { "matrix": [10, 2], "w": 1, "x": 13.75, "y": 5.75 },
248 {"label":"ka3", "x":14.75, "y":5.75}, 140 { "matrix": [10, 3], "w": 1, "x": 14.75, "y": 5.75 },
249 {"label":"ka4", "x":15.75, "y":5.75}, 141 { "matrix": [10, 4], "w": 1, "x": 15.75, "y": 5.75 },
250 {"label":"ka5", "x":16.75, "y":5.75, "w":1.75}, 142 { "matrix": [10, 5], "w": 1.75, "x": 16.75, "y": 5.75 },
251 {"label":"k96", "x":18.75, "y":6}, 143 { "matrix": [9, 6], "w": 1, "x": 18.75, "y": 6 },
252 {"label":"ka7", "x":20, "y":5.75}, 144 { "matrix": [10, 7], "w": 1, "x": 20, "y": 5.75 },
253 {"label":"ka8", "x":21, "y":5.75}, 145 { "matrix": [10, 8], "w": 1, "x": 21, "y": 5.75 },
254 {"label":"ka9", "x":22, "y":5.75}, 146 { "matrix": [10, 9], "w": 1, "x": 22, "y": 5.75 },
255 {"label":"kaa", "x":23, "y":5.75, "h":2}, 147 { "h": 2, "matrix": [10, 10], "w": 1, "x": 23, "y": 5.75 },
256 {"label":"k51", "x":1, "y":6.75}, 148 { "matrix": [5, 1], "w": 1, "x": 1, "y": 6.75 },
257 {"label":"k52", "x":2, "y":6.75}, 149 { "matrix": [5, 2], "w": 1, "x": 2, "y": 6.75 },
258 {"label":"k53", "x":3.25, "y":7}, 150 { "matrix": [5, 3], "w": 1, "x": 3.25, "y": 7 },
259 {"label":"k54", "x":4.25, "y":7}, 151 { "matrix": [5, 4], "w": 1, "x": 4.25, "y": 7 },
260 {"label":"k55", "x":5.25, "y":7}, 152 { "matrix": [5, 5], "w": 1, "x": 5.25, "y": 7 },
261 {"label":"k56", "x":6.5, "y":6.75}, 153 { "matrix": [5, 6], "w": 1, "x": 6.5, "y": 6.75 },
262 {"label":"k57", "x":7.5, "y":6.75}, 154 { "matrix": [5, 7], "w": 1, "x": 7.5, "y": 6.75 },
263 {"label":"k58", "x":8.5, "y":6.75}, 155 { "matrix": [5, 8], "w": 1, "x": 8.5, "y": 6.75 },
264 {"label":"k59", "x":9.5, "y":6.75}, 156 { "matrix": [5, 9], "w": 1, "x": 9.5, "y": 6.75 },
265 {"label":"k5a", "x":10.5, "y":6.75}, 157 { "matrix": [5, 10], "w": 1, "x": 10.5, "y": 6.75 },
266 {"label":"kb0", "x":11.5, "y":6.75}, 158 { "matrix": [11, 0], "w": 1, "x": 11.5, "y": 6.75 },
267 {"label":"kb1", "x":12.5, "y":6.75}, 159 { "matrix": [11, 1], "w": 1, "x": 12.5, "y": 6.75 },
268 {"label":"kb2", "x":13.5, "y":6.75}, 160 { "matrix": [11, 2], "w": 1, "x": 13.5, "y": 6.75 },
269 {"label":"kb3", "x":14.5, "y":6.75}, 161 { "matrix": [11, 3], "w": 1, "x": 14.5, "y": 6.75 },
270 {"label":"kb4", "x":15.5, "y":6.75}, 162 { "matrix": [11, 4], "w": 1, "x": 15.5, "y": 6.75 },
271 {"label":"kb5", "x":16.5, "y":6.75}, 163 { "matrix": [11, 5], "w": 1, "x": 16.5, "y": 6.75 },
272 {"label":"ka6", "x":17.75, "y":7}, 164 { "matrix": [10, 6], "w": 1, "x": 17.75, "y": 7 },
273 {"label":"kb6", "x":18.75, "y":7}, 165 { "matrix": [11, 6], "w": 1, "x": 18.75, "y": 7 },
274 {"label":"kb7", "x":19.75, "y":7}, 166 { "matrix": [11, 7], "w": 1, "x": 19.75, "y": 7 },
275 {"label":"kb8", "x":21, "y":6.75}, 167 { "matrix": [11, 8], "w": 1, "x": 21, "y": 6.75 },
276 {"label":"kb9", "x":22, "y":6.75} 168 { "matrix": [11, 9], "w": 1, "x": 22, "y": 6.75 }
277 ] 169 ]
278 }, 170 },
279 "LAYOUT_1u_iso": { 171 "LAYOUT_1u_iso": {
172 "key_count": 131,
280 "layout": [ 173 "layout": [
281 {"label":"e00", "x":3, "y":0}, 174 { "matrix": [12, 3], "w": 1, "x": 3, "y": 0 },
282 {"label":"e01", "x":4, "y":0}, 175 { "matrix": [12, 4], "w": 1, "x": 4, "y": 0 },
283 {"label":"e02", "x":19, "y":0}, 176 { "matrix": [12, 9], "w": 1, "x": 19, "y": 0 },
284 {"label":"e03", "x":20, "y":0}, 177 { "matrix": [12, 10], "w": 1, "x": 20, "y": 0 },
285 {"label":"k00", "x":0, "y":1.5}, 178 { "matrix": [0, 0], "w": 1, "x": 0, "y": 1.5 },
286 {"label":"k01", "x":1, "y":1.5}, 179 { "matrix": [0, 1], "w": 1, "x": 1, "y": 1.5 },
287 {"label":"k02", "x":2, "y":1.5}, 180 { "matrix": [0, 2], "w": 1, "x": 2, "y": 1.5 },
288 {"label":"k03", "x":3, "y":1.5}, 181 { "matrix": [0, 3], "w": 1, "x": 3, "y": 1.5 },
289 {"label":"k04", "x":4.75, "y":1.5}, 182 { "matrix": [0, 4], "w": 1, "x": 4.75, "y": 1.5 },
290 {"label":"k06", "x":6.25, "y":1.5}, 183 { "matrix": [0, 6], "w": 1, "x": 6.25, "y": 1.5 },
291 {"label":"k07", "x":7.25, "y":1.5}, 184 { "matrix": [0, 7], "w": 1, "x": 7.25, "y": 1.5 },
292 {"label":"k08", "x":8.25, "y":1.5}, 185 { "matrix": [0, 8], "w": 1, "x": 8.25, "y": 1.5 },
293 {"label":"k09", "x":9.25, "y":1.5}, 186 { "matrix": [0, 9], "w": 1, "x": 9.25, "y": 1.5 },
294 {"label":"k0a", "x":10.75, "y":1.5}, 187 { "matrix": [0, 10], "w": 1, "x": 10.75, "y": 1.5 },
295 {"label":"k60", "x":11.75, "y":1.5}, 188 { "matrix": [6, 0], "w": 1, "x": 11.75, "y": 1.5 },
296 {"label":"k61", "x":12.75, "y":1.5}, 189 { "matrix": [6, 1], "w": 1, "x": 12.75, "y": 1.5 },
297 {"label":"k62", "x":13.75, "y":1.5}, 190 { "matrix": [6, 2], "w": 1, "x": 13.75, "y": 1.5 },
298 {"label":"k63", "x":15.25, "y":1.5}, 191 { "matrix": [6, 3], "w": 1, "x": 15.25, "y": 1.5 },
299 {"label":"k64", "x":16.25, "y":1.5}, 192 { "matrix": [6, 4], "w": 1, "x": 16.25, "y": 1.5 },
300 {"label":"k65", "x":17.25, "y":1.5}, 193 { "matrix": [6, 5], "w": 1, "x": 17.25, "y": 1.5 },
301 {"label":"k66", "x":18.25, "y":1.5}, 194 { "matrix": [6, 6], "w": 1, "x": 18.25, "y": 1.5 },
302 {"label":"k67", "x":20, "y":1.5}, 195 { "matrix": [6, 7], "w": 1, "x": 20, "y": 1.5 },
303 {"label":"k68", "x":21, "y":1.5}, 196 { "matrix": [6, 8], "w": 1, "x": 21, "y": 1.5 },
304 {"label":"k69", "x":22, "y":1.5}, 197 { "matrix": [6, 9], "w": 1, "x": 22, "y": 1.5 },
305 {"label":"k6a", "x":23, "y":1.5}, 198 { "matrix": [6, 10], "w": 1, "x": 23, "y": 1.5 },
306 {"label":"k10", "x":0, "y":2.75}, 199 { "matrix": [1, 0], "w": 1, "x": 0, "y": 2.75 },
307 {"label":"k11", "x":1, "y":2.75}, 200 { "matrix": [1, 1], "w": 1, "x": 1, "y": 2.75 },
308 {"label":"k12", "x":2, "y":2.75}, 201 { "matrix": [1, 2], "w": 1, "x": 2, "y": 2.75 },
309 {"label":"k13", "x":3, "y":2.75}, 202 { "matrix": [1, 3], "w": 1, "x": 3, "y": 2.75 },
310 {"label":"k14", "x":4.5, "y":2.75}, 203 { "matrix": [1, 4], "w": 1, "x": 4.5, "y": 2.75 },
311 {"label":"k15", "x":5.5, "y":2.75}, 204 { "matrix": [1, 5], "w": 1, "x": 5.5, "y": 2.75 },
312 {"label":"k16", "x":6.5, "y":2.75}, 205 { "matrix": [1, 6], "w": 1, "x": 6.5, "y": 2.75 },
313 {"label":"k17", "x":7.5, "y":2.75}, 206 { "matrix": [1, 7], "w": 1, "x": 7.5, "y": 2.75 },
314 {"label":"k18", "x":8.5, "y":2.75}, 207 { "matrix": [1, 8], "w": 1, "x": 8.5, "y": 2.75 },
315 {"label":"k19", "x":9.5, "y":2.75}, 208 { "matrix": [1, 9], "w": 1, "x": 9.5, "y": 2.75 },
316 {"label":"k1a", "x":10.5, "y":2.75}, 209 { "matrix": [1, 10], "w": 1, "x": 10.5, "y": 2.75 },
317 {"label":"k70", "x":11.5, "y":2.75}, 210 { "matrix": [7, 0], "w": 1, "x": 11.5, "y": 2.75 },
318 {"label":"k71", "x":12.5, "y":2.75}, 211 { "matrix": [7, 1], "w": 1, "x": 12.5, "y": 2.75 },
319 {"label":"k72", "x":13.5, "y":2.75}, 212 { "matrix": [7, 2], "w": 1, "x": 13.5, "y": 2.75 },
320 {"label":"k73", "x":14.5, "y":2.75}, 213 { "matrix": [7, 3], "w": 1, "x": 14.5, "y": 2.75 },
321 {"label":"k74", "x":15.5, "y":2.75}, 214 { "matrix": [7, 4], "w": 1, "x": 15.5, "y": 2.75 },
322 {"label":"k75", "x":16.5, "y":2.75}, 215 { "matrix": [7, 5], "w": 1, "x": 16.5, "y": 2.75 },
323 {"label":"k76", "x":17.5, "y":2.75, "w":2}, 216 { "matrix": [7, 6], "w": 2, "x": 17.5, "y": 2.75 },
324 {"label":"k77", "x":20, "y":2.75}, 217 { "matrix": [7, 7], "w": 1, "x": 20, "y": 2.75 },
325 {"label":"k78", "x":21, "y":2.75}, 218 { "matrix": [7, 8], "w": 1, "x": 21, "y": 2.75 },
326 {"label":"k79", "x":22, "y":2.75}, 219 { "matrix": [7, 9], "w": 1, "x": 22, "y": 2.75 },
327 {"label":"k7a", "x":23, "y":2.75}, 220 { "matrix": [7, 10], "w": 1, "x": 23, "y": 2.75 },
328 {"label":"k20", "x":0, "y":3.75, "h":2}, 221 { "h": 2, "matrix": [2, 0], "w": 1, "x": 0, "y": 3.75 },
329 {"label":"k21", "x":1, "y":3.75}, 222 { "matrix": [2, 1], "w": 1, "x": 1, "y": 3.75 },
330 {"label":"k22", "x":2, "y":3.75}, 223 { "matrix": [2, 2], "w": 1, "x": 2, "y": 3.75 },
331 {"label":"k23", "x":3, "y":3.75}, 224 { "matrix": [2, 3], "w": 1, "x": 3, "y": 3.75 },
332 {"label":"k24", "x":4.5, "y":3.75, "w":1.5}, 225 { "matrix": [2, 4], "w": 1.5, "x": 4.5, "y": 3.75 },
333 {"label":"k25", "x":6, "y":3.75}, 226 { "matrix": [2, 5], "w": 1, "x": 6, "y": 3.75 },
334 {"label":"k26", "x":7, "y":3.75}, 227 { "matrix": [2, 6], "w": 1, "x": 7, "y": 3.75 },
335 {"label":"k27", "x":8, "y":3.75}, 228 { "matrix": [2, 7], "w": 1, "x": 8, "y": 3.75 },
336 {"label":"k28", "x":9, "y":3.75}, 229 { "matrix": [2, 8], "w": 1, "x": 9, "y": 3.75 },
337 {"label":"k29", "x":10, "y":3.75}, 230 { "matrix": [2, 9], "w": 1, "x": 10, "y": 3.75 },
338 {"label":"k2a", "x":11, "y":3.75}, 231 { "matrix": [2, 10], "w": 1, "x": 11, "y": 3.75 },
339 {"label":"k80", "x":12, "y":3.75}, 232 { "matrix": [8, 0], "w": 1, "x": 12, "y": 3.75 },
340 {"label":"k81", "x":13, "y":3.75}, 233 { "matrix": [8, 1], "w": 1, "x": 13, "y": 3.75 },
341 {"label":"k82", "x":14, "y":3.75}, 234 { "matrix": [8, 2], "w": 1, "x": 14, "y": 3.75 },
342 {"label":"k83", "x":15, "y":3.75}, 235 { "matrix": [8, 3], "w": 1, "x": 15, "y": 3.75 },
343 {"label":"k84", "x":16, "y":3.75}, 236 { "matrix": [8, 4], "w": 1, "x": 16, "y": 3.75 },
344 {"label":"k85", "x":17, "y":3.75}, 237 { "matrix": [8, 5], "w": 1, "x": 17, "y": 3.75 },
345 {"label":"k87", "x":20, "y":3.75}, 238 { "matrix": [8, 7], "w": 1, "x": 20, "y": 3.75 },
346 {"label":"k88", "x":21, "y":3.75}, 239 { "matrix": [8, 8], "w": 1, "x": 21, "y": 3.75 },
347 {"label":"k89", "x":22, "y":3.75}, 240 { "matrix": [8, 9], "w": 1, "x": 22, "y": 3.75 },
348 {"label":"k8a", "x":23, "y":3.75, "h":2}, 241 { "h": 2, "matrix": [8, 10], "w": 1, "x": 23, "y": 3.75 },
349 {"label":"k31", "x":1, "y":4.75}, 242 { "matrix": [3, 1], "w": 1, "x": 1, "y": 4.75 },
350 {"label":"k32", "x":2, "y":4.75}, 243 { "matrix": [3, 2], "w": 1, "x": 2, "y": 4.75 },
351 {"label":"k33", "x":3, "y":4.75}, 244 { "matrix": [3, 3], "w": 1, "x": 3, "y": 4.75 },
352 {"label":"k34", "x":4.5, "y":4.75, "w":1.75}, 245 { "matrix": [3, 4], "w": 1.75, "x": 4.5, "y": 4.75 },
353 {"label":"k35", "x":6.25, "y":4.75}, 246 { "matrix": [3, 5], "w": 1, "x": 6.25, "y": 4.75 },
354 {"label":"k36", "x":7.25, "y":4.75}, 247 { "matrix": [3, 6], "w": 1, "x": 7.25, "y": 4.75 },
355 {"label":"k37", "x":8.25, "y":4.75}, 248 { "matrix": [3, 7], "w": 1, "x": 8.25, "y": 4.75 },
356 {"label":"k38", "x":9.25, "y":4.75}, 249 { "matrix": [3, 8], "w": 1, "x": 9.25, "y": 4.75 },
357 {"label":"k39", "x":10.25, "y":4.75}, 250 { "matrix": [3, 9], "w": 1, "x": 10.25, "y": 4.75 },
358 {"label":"k3a", "x":11.25, "y":4.75}, 251 { "matrix": [3, 10], "w": 1, "x": 11.25, "y": 4.75 },
359 {"label":"k90", "x":12.25, "y":4.75}, 252 { "matrix": [9, 0], "w": 1, "x": 12.25, "y": 4.75 },
360 {"label":"k91", "x":13.25, "y":4.75}, 253 { "matrix": [9, 1], "w": 1, "x": 13.25, "y": 4.75 },
361 {"label":"k92", "x":14.25, "y":4.75}, 254 { "matrix": [9, 2], "w": 1, "x": 14.25, "y": 4.75 },
362 {"label":"k93", "x":15.25, "y":4.75}, 255 { "matrix": [9, 3], "w": 1, "x": 15.25, "y": 4.75 },
363 {"label":"k94", "x":16.25, "y":4.75}, 256 { "matrix": [9, 4], "w": 1, "x": 16.25, "y": 4.75 },
364 {"label":"k9a", "x":17.25, "y":4.75}, 257 { "matrix": [9, 10], "w": 1, "x": 17.25, "y": 4.75 },
365 {"label":"k95", "x":18.25, "y":3.75, "w":1.25, "h":2}, 258 { "h": 2, "matrix": [9, 5], "w": 1.25, "x": 18.25, "y": 3.75 },
366 {"label":"k97", "x":20, "y":4.75}, 259 { "matrix": [9, 7], "w": 1, "x": 20, "y": 4.75 },
367 {"label":"k98", "x":21, "y":4.75}, 260 { "matrix": [9, 8], "w": 1, "x": 21, "y": 4.75 },
368 {"label":"k99", "x":22, "y":4.75}, 261 { "matrix": [9, 9], "w": 1, "x": 22, "y": 4.75 },
369 {"label":"k40", "x":0, "y":5.75, "h":2}, 262 { "h": 2, "matrix": [4, 0], "w": 1, "x": 0, "y": 5.75 },
370 {"label":"k41", "x":1, "y":5.75}, 263 { "matrix": [4, 1], "w": 1, "x": 1, "y": 5.75 },
371 {"label":"k42", "x":2, "y":5.75}, 264 { "matrix": [4, 2], "w": 1, "x": 2, "y": 5.75 },
372 {"label":"k43", "x":3, "y":5.75}, 265 { "matrix": [4, 3], "w": 1, "x": 3, "y": 5.75 },
373 {"label":"k44", "x":4.25, "y":6}, 266 { "matrix": [4, 4], "w": 1, "x": 4.25, "y": 6 },
374 {"label":"k45", "x":5.5, "y":5.75, "w":1.25}, 267 { "matrix": [4, 5], "w": 1.25, "x": 5.5, "y": 5.75 },
375 {"label":"k46", "x":6.75, "y":5.75}, 268 { "matrix": [4, 6], "w": 1, "x": 6.75, "y": 5.75 },
376 {"label":"k47", "x":7.75, "y":5.75}, 269 { "matrix": [4, 7], "w": 1, "x": 7.75, "y": 5.75 },
377 {"label":"k48", "x":8.75, "y":5.75}, 270 { "matrix": [4, 8], "w": 1, "x": 8.75, "y": 5.75 },
378 {"label":"k49", "x":9.75, "y":5.75}, 271 { "matrix": [4, 9], "w": 1, "x": 9.75, "y": 5.75 },
379 {"label":"k4a", "x":10.75, "y":5.75}, 272 { "matrix": [4, 10], "w": 1, "x": 10.75, "y": 5.75 },
380 {"label":"ka0", "x":11.75, "y":5.75}, 273 { "matrix": [10, 0], "w": 1, "x": 11.75, "y": 5.75 },
381 {"label":"ka1", "x":12.75, "y":5.75}, 274 { "matrix": [10, 1], "w": 1, "x": 12.75, "y": 5.75 },
382 {"label":"ka2", "x":13.75, "y":5.75}, 275 { "matrix": [10, 2], "w": 1, "x": 13.75, "y": 5.75 },
383 {"label":"ka3", "x":14.75, "y":5.75}, 276 { "matrix": [10, 3], "w": 1, "x": 14.75, "y": 5.75 },
384 {"label":"ka4", "x":15.75, "y":5.75}, 277 { "matrix": [10, 4], "w": 1, "x": 15.75, "y": 5.75 },
385 {"label":"ka5", "x":16.75, "y":5.75, "w":1.75}, 278 { "matrix": [10, 5], "w": 1.75, "x": 16.75, "y": 5.75 },
386 {"label":"k96", "x":18.75, "y":6}, 279 { "matrix": [9, 6], "w": 1, "x": 18.75, "y": 6 },
387 {"label":"ka7", "x":20, "y":5.75}, 280 { "matrix": [10, 7], "w": 1, "x": 20, "y": 5.75 },
388 {"label":"ka8", "x":21, "y":5.75}, 281 { "matrix": [10, 8], "w": 1, "x": 21, "y": 5.75 },
389 {"label":"ka9", "x":22, "y":5.75}, 282 { "matrix": [10, 9], "w": 1, "x": 22, "y": 5.75 },
390 {"label":"kaa", "x":23, "y":5.75, "h":2}, 283 { "h": 2, "matrix": [10, 10], "w": 1, "x": 23, "y": 5.75 },
391 {"label":"k51", "x":1, "y":6.75}, 284 { "matrix": [5, 1], "w": 1, "x": 1, "y": 6.75 },
392 {"label":"k52", "x":2, "y":6.75}, 285 { "matrix": [5, 2], "w": 1, "x": 2, "y": 6.75 },
393 {"label":"k53", "x":3.25, "y":7}, 286 { "matrix": [5, 3], "w": 1, "x": 3.25, "y": 7 },
394 {"label":"k54", "x":4.25, "y":7}, 287 { "matrix": [5, 4], "w": 1, "x": 4.25, "y": 7 },
395 {"label":"k55", "x":5.25, "y":7}, 288 { "matrix": [5, 5], "w": 1, "x": 5.25, "y": 7 },
396 {"label":"k56", "x":6.5, "y":6.75}, 289 { "matrix": [5, 6], "w": 1, "x": 6.5, "y": 6.75 },
397 {"label":"k57", "x":7.5, "y":6.75}, 290 { "matrix": [5, 7], "w": 1, "x": 7.5, "y": 6.75 },
398 {"label":"k58", "x":8.5, "y":6.75}, 291 { "matrix": [5, 8], "w": 1, "x": 8.5, "y": 6.75 },
399 {"label":"k59", "x":9.5, "y":6.75}, 292 { "matrix": [5, 9], "w": 1, "x": 9.5, "y": 6.75 },
400 {"label":"k5a", "x":10.5, "y":6.75}, 293 { "matrix": [5, 10], "w": 1, "x": 10.5, "y": 6.75 },
401 {"label":"kb0", "x":11.5, "y":6.75}, 294 { "matrix": [11, 0], "w": 1, "x": 11.5, "y": 6.75 },
402 {"label":"kb1", "x":12.5, "y":6.75}, 295 { "matrix": [11, 1], "w": 1, "x": 12.5, "y": 6.75 },
403 {"label":"kb2", "x":13.5, "y":6.75}, 296 { "matrix": [11, 2], "w": 1, "x": 13.5, "y": 6.75 },
404 {"label":"kb3", "x":14.5, "y":6.75}, 297 { "matrix": [11, 3], "w": 1, "x": 14.5, "y": 6.75 },
405 {"label":"kb4", "x":15.5, "y":6.75}, 298 { "matrix": [11, 4], "w": 1, "x": 15.5, "y": 6.75 },
406 {"label":"kb5", "x":16.5, "y":6.75}, 299 { "matrix": [11, 5], "w": 1, "x": 16.5, "y": 6.75 },
407 {"label":"ka6", "x":17.75, "y":7}, 300 { "matrix": [10, 6], "w": 1, "x": 17.75, "y": 7 },
408 {"label":"kb6", "x":18.75, "y":7}, 301 { "matrix": [11, 6], "w": 1, "x": 18.75, "y": 7 },
409 {"label":"kb7", "x":19.75, "y":7}, 302 { "matrix": [11, 7], "w": 1, "x": 19.75, "y": 7 },
410 {"label":"kb8", "x":21, "y":6.75}, 303 { "matrix": [11, 8], "w": 1, "x": 21, "y": 6.75 },
411 {"label":"kb9", "x":22, "y":6.75} 304 { "matrix": [11, 9], "w": 1, "x": 22, "y": 6.75 }
412 ] 305 ]
413 }, 306 },
414 "LAYOUT_2u_ansi": { 307 "LAYOUT_2u_ansi": {
308 "key_count": 130,
415 "layout": [ 309 "layout": [
416 {"label":"e00", "x":3, "y":0}, 310 { "matrix": [12, 3], "w": 1, "x": 3, "y": 0 },
417 {"label":"e01", "x":4, "y":0}, 311 { "matrix": [12, 4], "w": 1, "x": 4, "y": 0 },
418 {"label":"e02", "x":19, "y":0}, 312 { "matrix": [12, 9], "w": 1, "x": 19, "y": 0 },
419 {"label":"e03", "x":20, "y":0}, 313 { "matrix": [12, 10], "w": 1, "x": 20, "y": 0 },
420 {"label":"k00", "x":0, "y":1.5}, 314 { "matrix": [0, 0], "w": 1, "x": 0, "y": 1.5 },
421 {"label":"k01", "x":1, "y":1.5}, 315 { "matrix": [0, 1], "w": 1, "x": 1, "y": 1.5 },
422 {"label":"k02", "x":2, "y":1.5}, 316 { "matrix": [0, 2], "w": 1, "x": 2, "y": 1.5 },
423 {"label":"k03", "x":3, "y":1.5}, 317 { "matrix": [0, 3], "w": 1, "x": 3, "y": 1.5 },
424 {"label":"k04", "x":4.75, "y":1.5}, 318 { "matrix": [0, 4], "w": 1, "x": 4.75, "y": 1.5 },
425 {"label":"k06", "x":6.25, "y":1.5}, 319 { "matrix": [0, 6], "w": 1, "x": 6.25, "y": 1.5 },
426 {"label":"k07", "x":7.25, "y":1.5}, 320 { "matrix": [0, 7], "w": 1, "x": 7.25, "y": 1.5 },
427 {"label":"k08", "x":8.25, "y":1.5}, 321 { "matrix": [0, 8], "w": 1, "x": 8.25, "y": 1.5 },
428 {"label":"k09", "x":9.25, "y":1.5}, 322 { "matrix": [0, 9], "w": 1, "x": 9.25, "y": 1.5 },
429 {"label":"k0a", "x":10.75, "y":1.5}, 323 { "matrix": [0, 10], "w": 1, "x": 10.75, "y": 1.5 },
430 {"label":"k60", "x":11.75, "y":1.5}, 324 { "matrix": [6, 0], "w": 1, "x": 11.75, "y": 1.5 },
431 {"label":"k61", "x":12.75, "y":1.5}, 325 { "matrix": [6, 1], "w": 1, "x": 12.75, "y": 1.5 },
432 {"label":"k62", "x":13.75, "y":1.5}, 326 { "matrix": [6, 2], "w": 1, "x": 13.75, "y": 1.5 },
433 {"label":"k63", "x":15.25, "y":1.5}, 327 { "matrix": [6, 3], "w": 1, "x": 15.25, "y": 1.5 },
434 {"label":"k64", "x":16.25, "y":1.5}, 328 { "matrix": [6, 4], "w": 1, "x": 16.25, "y": 1.5 },
435 {"label":"k65", "x":17.25, "y":1.5}, 329 { "matrix": [6, 5], "w": 1, "x": 17.25, "y": 1.5 },
436 {"label":"k66", "x":18.25, "y":1.5}, 330 { "matrix": [6, 6], "w": 1, "x": 18.25, "y": 1.5 },
437 {"label":"k67", "x":20, "y":1.5}, 331 { "matrix": [6, 7], "w": 1, "x": 20, "y": 1.5 },
438 {"label":"k68", "x":21, "y":1.5}, 332 { "matrix": [6, 8], "w": 1, "x": 21, "y": 1.5 },
439 {"label":"k69", "x":22, "y":1.5}, 333 { "matrix": [6, 9], "w": 1, "x": 22, "y": 1.5 },
440 {"label":"k6a", "x":23, "y":1.5}, 334 { "matrix": [6, 10], "w": 1, "x": 23, "y": 1.5 },
441 {"label":"k10", "x":0, "y":2.75}, 335 { "matrix": [1, 0], "w": 1, "x": 0, "y": 2.75 },
442 {"label":"k11", "x":1, "y":2.75}, 336 { "matrix": [1, 1], "w": 1, "x": 1, "y": 2.75 },
443 {"label":"k12", "x":2, "y":2.75}, 337 { "matrix": [1, 2], "w": 1, "x": 2, "y": 2.75 },
444 {"label":"k13", "x":3, "y":2.75}, 338 { "matrix": [1, 3], "w": 1, "x": 3, "y": 2.75 },
445 {"label":"k14", "x":4.5, "y":2.75}, 339 { "matrix": [1, 4], "w": 1, "x": 4.5, "y": 2.75 },
446 {"label":"k15", "x":5.5, "y":2.75}, 340 { "matrix": [1, 5], "w": 1, "x": 5.5, "y": 2.75 },
447 {"label":"k16", "x":6.5, "y":2.75}, 341 { "matrix": [1, 6], "w": 1, "x": 6.5, "y": 2.75 },
448 {"label":"k17", "x":7.5, "y":2.75}, 342 { "matrix": [1, 7], "w": 1, "x": 7.5, "y": 2.75 },
449 {"label":"k18", "x":8.5, "y":2.75}, 343 { "matrix": [1, 8], "w": 1, "x": 8.5, "y": 2.75 },
450 {"label":"k19", "x":9.5, "y":2.75}, 344 { "matrix": [1, 9], "w": 1, "x": 9.5, "y": 2.75 },
451 {"label":"k1a", "x":10.5, "y":2.75}, 345 { "matrix": [1, 10], "w": 1, "x": 10.5, "y": 2.75 },
452 {"label":"k70", "x":11.5, "y":2.75}, 346 { "matrix": [7, 0], "w": 1, "x": 11.5, "y": 2.75 },
453 {"label":"k71", "x":12.5, "y":2.75}, 347 { "matrix": [7, 1], "w": 1, "x": 12.5, "y": 2.75 },
454 {"label":"k72", "x":13.5, "y":2.75}, 348 { "matrix": [7, 2], "w": 1, "x": 13.5, "y": 2.75 },
455 {"label":"k73", "x":14.5, "y":2.75}, 349 { "matrix": [7, 3], "w": 1, "x": 14.5, "y": 2.75 },
456 {"label":"k74", "x":15.5, "y":2.75}, 350 { "matrix": [7, 4], "w": 1, "x": 15.5, "y": 2.75 },
457 {"label":"k75", "x":16.5, "y":2.75}, 351 { "matrix": [7, 5], "w": 1, "x": 16.5, "y": 2.75 },
458 {"label":"k76", "x":17.5, "y":2.75, "w":2}, 352 { "matrix": [7, 6], "w": 2, "x": 17.5, "y": 2.75 },
459 {"label":"k77", "x":20, "y":2.75}, 353 { "matrix": [7, 7], "w": 1, "x": 20, "y": 2.75 },
460 {"label":"k78", "x":21, "y":2.75}, 354 { "matrix": [7, 8], "w": 1, "x": 21, "y": 2.75 },
461 {"label":"k79", "x":22, "y":2.75}, 355 { "matrix": [7, 9], "w": 1, "x": 22, "y": 2.75 },
462 {"label":"k7a", "x":23, "y":2.75}, 356 { "matrix": [7, 10], "w": 1, "x": 23, "y": 2.75 },
463 {"label":"k20", "x":0, "y":3.75, "h":2}, 357 { "h": 2, "matrix": [2, 0], "w": 1, "x": 0, "y": 3.75 },
464 {"label":"k21", "x":1, "y":3.75}, 358 { "matrix": [2, 1], "w": 1, "x": 1, "y": 3.75 },
465 {"label":"k22", "x":2, "y":3.75}, 359 { "matrix": [2, 2], "w": 1, "x": 2, "y": 3.75 },
466 {"label":"k23", "x":3, "y":3.75}, 360 { "matrix": [2, 3], "w": 1, "x": 3, "y": 3.75 },
467 {"label":"k24", "x":4.5, "y":3.75, "w":1.5}, 361 { "matrix": [2, 4], "w": 1.5, "x": 4.5, "y": 3.75 },
468 {"label":"k25", "x":6, "y":3.75}, 362 { "matrix": [2, 5], "w": 1, "x": 6, "y": 3.75 },
469 {"label":"k26", "x":7, "y":3.75}, 363 { "matrix": [2, 6], "w": 1, "x": 7, "y": 3.75 },
470 {"label":"k27", "x":8, "y":3.75}, 364 { "matrix": [2, 7], "w": 1, "x": 8, "y": 3.75 },
471 {"label":"k28", "x":9, "y":3.75}, 365 { "matrix": [2, 8], "w": 1, "x": 9, "y": 3.75 },
472 {"label":"k29", "x":10, "y":3.75}, 366 { "matrix": [2, 9], "w": 1, "x": 10, "y": 3.75 },
473 {"label":"k2a", "x":11, "y":3.75}, 367 { "matrix": [2, 10], "w": 1, "x": 11, "y": 3.75 },
474 {"label":"k80", "x":12, "y":3.75}, 368 { "matrix": [8, 0], "w": 1, "x": 12, "y": 3.75 },
475 {"label":"k81", "x":13, "y":3.75}, 369 { "matrix": [8, 1], "w": 1, "x": 13, "y": 3.75 },
476 {"label":"k82", "x":14, "y":3.75}, 370 { "matrix": [8, 2], "w": 1, "x": 14, "y": 3.75 },
477 {"label":"k83", "x":15, "y":3.75}, 371 { "matrix": [8, 3], "w": 1, "x": 15, "y": 3.75 },
478 {"label":"k84", "x":16, "y":3.75}, 372 { "matrix": [8, 4], "w": 1, "x": 16, "y": 3.75 },
479 {"label":"k85", "x":17, "y":3.75}, 373 { "matrix": [8, 5], "w": 1, "x": 17, "y": 3.75 },
480 {"label":"k86", "x":18, "y":3.75, "w":1.5}, 374 { "matrix": [8, 6], "w": 1.5, "x": 18, "y": 3.75 },
481 {"label":"k87", "x":20, "y":3.75}, 375 { "matrix": [8, 7], "w": 1, "x": 20, "y": 3.75 },
482 {"label":"k88", "x":21, "y":3.75}, 376 { "matrix": [8, 8], "w": 1, "x": 21, "y": 3.75 },
483 {"label":"k89", "x":22, "y":3.75}, 377 { "matrix": [8, 9], "w": 1, "x": 22, "y": 3.75 },
484 {"label":"k8a", "x":23, "y":3.75, "h":2}, 378 { "h": 2, "matrix": [8, 10], "w": 1, "x": 23, "y": 3.75 },
485 {"label":"k31", "x":1, "y":4.75}, 379 { "matrix": [3, 1], "w": 1, "x": 1, "y": 4.75 },
486 {"label":"k32", "x":2, "y":4.75}, 380 { "matrix": [3, 2], "w": 1, "x": 2, "y": 4.75 },
487 {"label":"k33", "x":3, "y":4.75}, 381 { "matrix": [3, 3], "w": 1, "x": 3, "y": 4.75 },
488 {"label":"k34", "x":4.5, "y":4.75, "w":1.75}, 382 { "matrix": [3, 4], "w": 1.75, "x": 4.5, "y": 4.75 },
489 {"label":"k35", "x":6.25, "y":4.75}, 383 { "matrix": [3, 5], "w": 1, "x": 6.25, "y": 4.75 },
490 {"label":"k36", "x":7.25, "y":4.75}, 384 { "matrix": [3, 6], "w": 1, "x": 7.25, "y": 4.75 },
491 {"label":"k37", "x":8.25, "y":4.75}, 385 { "matrix": [3, 7], "w": 1, "x": 8.25, "y": 4.75 },
492 {"label":"k38", "x":9.25, "y":4.75}, 386 { "matrix": [3, 8], "w": 1, "x": 9.25, "y": 4.75 },
493 {"label":"k39", "x":10.25, "y":4.75}, 387 { "matrix": [3, 9], "w": 1, "x": 10.25, "y": 4.75 },
494 {"label":"k3a", "x":11.25, "y":4.75}, 388 { "matrix": [3, 10], "w": 1, "x": 11.25, "y": 4.75 },
495 {"label":"k90", "x":12.25, "y":4.75}, 389 { "matrix": [9, 0], "w": 1, "x": 12.25, "y": 4.75 },
496 {"label":"k91", "x":13.25, "y":4.75}, 390 { "matrix": [9, 1], "w": 1, "x": 13.25, "y": 4.75 },
497 {"label":"k92", "x":14.25, "y":4.75}, 391 { "matrix": [9, 2], "w": 1, "x": 14.25, "y": 4.75 },
498 {"label":"k93", "x":15.25, "y":4.75}, 392 { "matrix": [9, 3], "w": 1, "x": 15.25, "y": 4.75 },
499 {"label":"k94", "x":16.25, "y":4.75}, 393 { "matrix": [9, 4], "w": 1, "x": 16.25, "y": 4.75 },
500 {"label":"k95", "x":17.25, "y":4.75, "w":2.25}, 394 { "matrix": [9, 5], "w": 2.25, "x": 17.25, "y": 4.75 },
501 {"label":"k97", "x":20, "y":4.75}, 395 { "matrix": [9, 7], "w": 1, "x": 20, "y": 4.75 },
502 {"label":"k98", "x":21, "y":4.75}, 396 { "matrix": [9, 8], "w": 1, "x": 21, "y": 4.75 },
503 {"label":"k99", "x":22, "y":4.75}, 397 { "matrix": [9, 9], "w": 1, "x": 22, "y": 4.75 },
504 {"label":"k40", "x":0, "y":5.75, "h":2}, 398 { "h": 2, "matrix": [4, 0], "w": 1, "x": 0, "y": 5.75 },
505 {"label":"k41", "x":1, "y":5.75}, 399 { "matrix": [4, 1], "w": 1, "x": 1, "y": 5.75 },
506 {"label":"k42", "x":2, "y":5.75}, 400 { "matrix": [4, 2], "w": 1, "x": 2, "y": 5.75 },
507 {"label":"k43", "x":3, "y":5.75}, 401 { "matrix": [4, 3], "w": 1, "x": 3, "y": 5.75 },
508 {"label":"k44", "x":4.25, "y":6}, 402 { "matrix": [4, 4], "w": 1, "x": 4.25, "y": 6 },
509 {"label":"k45", "x":5.5, "y":5.75, "w":1.25}, 403 { "matrix": [4, 5], "w": 1.25, "x": 5.5, "y": 5.75 },
510 {"label":"k46", "x":6.75, "y":5.75}, 404 { "matrix": [4, 6], "w": 1, "x": 6.75, "y": 5.75 },
511 {"label":"k47", "x":7.75, "y":5.75}, 405 { "matrix": [4, 7], "w": 1, "x": 7.75, "y": 5.75 },
512 {"label":"k48", "x":8.75, "y":5.75}, 406 { "matrix": [4, 8], "w": 1, "x": 8.75, "y": 5.75 },
513 {"label":"k49", "x":9.75, "y":5.75}, 407 { "matrix": [4, 9], "w": 1, "x": 9.75, "y": 5.75 },
514 {"label":"k4a", "x":10.75, "y":5.75}, 408 { "matrix": [4, 10], "w": 1, "x": 10.75, "y": 5.75 },
515 {"label":"ka0", "x":11.75, "y":5.75}, 409 { "matrix": [10, 0], "w": 1, "x": 11.75, "y": 5.75 },
516 {"label":"ka1", "x":12.75, "y":5.75}, 410 { "matrix": [10, 1], "w": 1, "x": 12.75, "y": 5.75 },
517 {"label":"ka2", "x":13.75, "y":5.75}, 411 { "matrix": [10, 2], "w": 1, "x": 13.75, "y": 5.75 },
518 {"label":"ka3", "x":14.75, "y":5.75}, 412 { "matrix": [10, 3], "w": 1, "x": 14.75, "y": 5.75 },
519 {"label":"ka4", "x":15.75, "y":5.75}, 413 { "matrix": [10, 4], "w": 1, "x": 15.75, "y": 5.75 },
520 {"label":"ka5", "x":16.75, "y":5.75, "w":1.75}, 414 { "matrix": [10, 5], "w": 1.75, "x": 16.75, "y": 5.75 },
521 {"label":"k96", "x":18.75, "y":6}, 415 { "matrix": [9, 6], "w": 1, "x": 18.75, "y": 6 },
522 {"label":"ka7", "x":20, "y":5.75}, 416 { "matrix": [10, 7], "w": 1, "x": 20, "y": 5.75 },
523 {"label":"ka8", "x":21, "y":5.75}, 417 { "matrix": [10, 8], "w": 1, "x": 21, "y": 5.75 },
524 {"label":"ka9", "x":22, "y":5.75}, 418 { "matrix": [10, 9], "w": 1, "x": 22, "y": 5.75 },
525 {"label":"kaa", "x":23, "y":5.75, "h":2}, 419 { "h": 2, "matrix": [10, 10], "w": 1, "x": 23, "y": 5.75 },
526 {"label":"k51", "x":1, "y":6.75}, 420 { "matrix": [5, 1], "w": 1, "x": 1, "y": 6.75 },
527 {"label":"k52", "x":2, "y":6.75}, 421 { "matrix": [5, 2], "w": 1, "x": 2, "y": 6.75 },
528 {"label":"k53", "x":3.25, "y":7}, 422 { "matrix": [5, 3], "w": 1, "x": 3.25, "y": 7 },
529 {"label":"k54", "x":4.25, "y":7}, 423 { "matrix": [5, 4], "w": 1, "x": 4.25, "y": 7 },
530 {"label":"k55", "x":5.25, "y":7}, 424 { "matrix": [5, 5], "w": 1, "x": 5.25, "y": 7 },
531 {"label":"k56", "x":6.5, "y":6.75}, 425 { "matrix": [5, 6], "w": 1, "x": 6.5, "y": 6.75 },
532 {"label":"k57", "x":7.5, "y":6.75}, 426 { "matrix": [5, 7], "w": 1, "x": 7.5, "y": 6.75 },
533 {"label":"k58", "x":8.5, "y":6.75}, 427 { "matrix": [5, 8], "w": 1, "x": 8.5, "y": 6.75 },
534 {"label":"k59", "x":9.5, "y":6.75}, 428 { "matrix": [5, 9], "w": 1, "x": 9.5, "y": 6.75 },
535 {"label":"kb0", "x":10.5, "y":6.75, "w":2}, 429 { "matrix": [11, 0], "w": 2, "x": 10.5, "y": 6.75 },
536 {"label":"kb1", "x":12.5, "y":6.75}, 430 { "matrix": [11, 1], "w": 1, "x": 12.5, "y": 6.75 },
537 {"label":"kb2", "x":13.5, "y":6.75}, 431 { "matrix": [11, 2], "w": 1, "x": 13.5, "y": 6.75 },
538 {"label":"kb3", "x":14.5, "y":6.75}, 432 { "matrix": [11, 3], "w": 1, "x": 14.5, "y": 6.75 },
539 {"label":"kb4", "x":15.5, "y":6.75}, 433 { "matrix": [11, 4], "w": 1, "x": 15.5, "y": 6.75 },
540 {"label":"kb5", "x":16.5, "y":6.75}, 434 { "matrix": [11, 5], "w": 1, "x": 16.5, "y": 6.75 },
541 {"label":"ka6", "x":17.75, "y":7}, 435 { "matrix": [10, 6], "w": 1, "x": 17.75, "y": 7 },
542 {"label":"kb6", "x":18.75, "y":7}, 436 { "matrix": [11, 6], "w": 1, "x": 18.75, "y": 7 },
543 {"label":"kb7", "x":19.75, "y":7}, 437 { "matrix": [11, 7], "w": 1, "x": 19.75, "y": 7 },
544 {"label":"kb8", "x":21, "y":6.75}, 438 { "matrix": [11, 8], "w": 1, "x": 21, "y": 6.75 },
545 {"label":"kb9", "x":22, "y":6.75} 439 { "matrix": [11, 9], "w": 1, "x": 22, "y": 6.75 }
546 ] 440 ]
547 }, 441 },
548 "LAYOUT_2u_iso": { 442 "LAYOUT_2u_iso": {
443 "key_count": 130,
549 "layout": [ 444 "layout": [
550 {"label":"e00", "x":3, "y":0}, 445 { "matrix": [12, 3], "w": 1, "x": 3, "y": 0 },
551 {"label":"e01", "x":4, "y":0}, 446 { "matrix": [12, 4], "w": 1, "x": 4, "y": 0 },
552 {"label":"e02", "x":19, "y":0}, 447 { "matrix": [12, 9], "w": 1, "x": 19, "y": 0 },
553 {"label":"e03", "x":20, "y":0}, 448 { "matrix": [12, 10], "w": 1, "x": 20, "y": 0 },
554 {"label":"k00", "x":0, "y":1.5}, 449 { "matrix": [0, 0], "w": 1, "x": 0, "y": 1.5 },
555 {"label":"k01", "x":1, "y":1.5}, 450 { "matrix": [0, 1], "w": 1, "x": 1, "y": 1.5 },
556 {"label":"k02", "x":2, "y":1.5}, 451 { "matrix": [0, 2], "w": 1, "x": 2, "y": 1.5 },
557 {"label":"k03", "x":3, "y":1.5}, 452 { "matrix": [0, 3], "w": 1, "x": 3, "y": 1.5 },
558 {"label":"k04", "x":4.75, "y":1.5}, 453 { "matrix": [0, 4], "w": 1, "x": 4.75, "y": 1.5 },
559 {"label":"k06", "x":6.25, "y":1.5}, 454 { "matrix": [0, 6], "w": 1, "x": 6.25, "y": 1.5 },
560 {"label":"k07", "x":7.25, "y":1.5}, 455 { "matrix": [0, 7], "w": 1, "x": 7.25, "y": 1.5 },
561 {"label":"k08", "x":8.25, "y":1.5}, 456 { "matrix": [0, 8], "w": 1, "x": 8.25, "y": 1.5 },
562 {"label":"k09", "x":9.25, "y":1.5}, 457 { "matrix": [0, 9], "w": 1, "x": 9.25, "y": 1.5 },
563 {"label":"k0a", "x":10.75, "y":1.5}, 458 { "matrix": [0, 10], "w": 1, "x": 10.75, "y": 1.5 },
564 {"label":"k60", "x":11.75, "y":1.5}, 459 { "matrix": [6, 0], "w": 1, "x": 11.75, "y": 1.5 },
565 {"label":"k61", "x":12.75, "y":1.5}, 460 { "matrix": [6, 1], "w": 1, "x": 12.75, "y": 1.5 },
566 {"label":"k62", "x":13.75, "y":1.5}, 461 { "matrix": [6, 2], "w": 1, "x": 13.75, "y": 1.5 },
567 {"label":"k63", "x":15.25, "y":1.5}, 462 { "matrix": [6, 3], "w": 1, "x": 15.25, "y": 1.5 },
568 {"label":"k64", "x":16.25, "y":1.5}, 463 { "matrix": [6, 4], "w": 1, "x": 16.25, "y": 1.5 },
569 {"label":"k65", "x":17.25, "y":1.5}, 464 { "matrix": [6, 5], "w": 1, "x": 17.25, "y": 1.5 },
570 {"label":"k66", "x":18.25, "y":1.5}, 465 { "matrix": [6, 6], "w": 1, "x": 18.25, "y": 1.5 },
571 {"label":"k67", "x":20, "y":1.5}, 466 { "matrix": [6, 7], "w": 1, "x": 20, "y": 1.5 },
572 {"label":"k68", "x":21, "y":1.5}, 467 { "matrix": [6, 8], "w": 1, "x": 21, "y": 1.5 },
573 {"label":"k69", "x":22, "y":1.5}, 468 { "matrix": [6, 9], "w": 1, "x": 22, "y": 1.5 },
574 {"label":"k6a", "x":23, "y":1.5}, 469 { "matrix": [6, 10], "w": 1, "x": 23, "y": 1.5 },
575 {"label":"k10", "x":0, "y":2.75}, 470 { "matrix": [1, 0], "w": 1, "x": 0, "y": 2.75 },
576 {"label":"k11", "x":1, "y":2.75}, 471 { "matrix": [1, 1], "w": 1, "x": 1, "y": 2.75 },
577 {"label":"k12", "x":2, "y":2.75}, 472 { "matrix": [1, 2], "w": 1, "x": 2, "y": 2.75 },
578 {"label":"k13", "x":3, "y":2.75}, 473 { "matrix": [1, 3], "w": 1, "x": 3, "y": 2.75 },
579 {"label":"k14", "x":4.5, "y":2.75}, 474 { "matrix": [1, 4], "w": 1, "x": 4.5, "y": 2.75 },
580 {"label":"k15", "x":5.5, "y":2.75}, 475 { "matrix": [1, 5], "w": 1, "x": 5.5, "y": 2.75 },
581 {"label":"k16", "x":6.5, "y":2.75}, 476 { "matrix": [1, 6], "w": 1, "x": 6.5, "y": 2.75 },
582 {"label":"k17", "x":7.5, "y":2.75}, 477 { "matrix": [1, 7], "w": 1, "x": 7.5, "y": 2.75 },
583 {"label":"k18", "x":8.5, "y":2.75}, 478 { "matrix": [1, 8], "w": 1, "x": 8.5, "y": 2.75 },
584 {"label":"k19", "x":9.5, "y":2.75}, 479 { "matrix": [1, 9], "w": 1, "x": 9.5, "y": 2.75 },
585 {"label":"k1a", "x":10.5, "y":2.75}, 480 { "matrix": [1, 10], "w": 1, "x": 10.5, "y": 2.75 },
586 {"label":"k70", "x":11.5, "y":2.75}, 481 { "matrix": [7, 0], "w": 1, "x": 11.5, "y": 2.75 },
587 {"label":"k71", "x":12.5, "y":2.75}, 482 { "matrix": [7, 1], "w": 1, "x": 12.5, "y": 2.75 },
588 {"label":"k72", "x":13.5, "y":2.75}, 483 { "matrix": [7, 2], "w": 1, "x": 13.5, "y": 2.75 },
589 {"label":"k73", "x":14.5, "y":2.75}, 484 { "matrix": [7, 3], "w": 1, "x": 14.5, "y": 2.75 },
590 {"label":"k74", "x":15.5, "y":2.75}, 485 { "matrix": [7, 4], "w": 1, "x": 15.5, "y": 2.75 },
591 {"label":"k75", "x":16.5, "y":2.75}, 486 { "matrix": [7, 5], "w": 1, "x": 16.5, "y": 2.75 },
592 {"label":"k76", "x":17.5, "y":2.75, "w":2}, 487 { "matrix": [7, 6], "w": 2, "x": 17.5, "y": 2.75 },
593 {"label":"k77", "x":20, "y":2.75}, 488 { "matrix": [7, 7], "w": 1, "x": 20, "y": 2.75 },
594 {"label":"k78", "x":21, "y":2.75}, 489 { "matrix": [7, 8], "w": 1, "x": 21, "y": 2.75 },
595 {"label":"k79", "x":22, "y":2.75}, 490 { "matrix": [7, 9], "w": 1, "x": 22, "y": 2.75 },
596 {"label":"k7a", "x":23, "y":2.75}, 491 { "matrix": [7, 10], "w": 1, "x": 23, "y": 2.75 },
597 {"label":"k20", "x":0, "y":3.75, "h":2}, 492 { "h": 2, "matrix": [2, 0], "w": 1, "x": 0, "y": 3.75 },
598 {"label":"k21", "x":1, "y":3.75}, 493 { "matrix": [2, 1], "w": 1, "x": 1, "y": 3.75 },
599 {"label":"k22", "x":2, "y":3.75}, 494 { "matrix": [2, 2], "w": 1, "x": 2, "y": 3.75 },
600 {"label":"k23", "x":3, "y":3.75}, 495 { "matrix": [2, 3], "w": 1, "x": 3, "y": 3.75 },
601 {"label":"k24", "x":4.5, "y":3.75, "w":1.5}, 496 { "matrix": [2, 4], "w": 1.5, "x": 4.5, "y": 3.75 },
602 {"label":"k25", "x":6, "y":3.75}, 497 { "matrix": [2, 5], "w": 1, "x": 6, "y": 3.75 },
603 {"label":"k26", "x":7, "y":3.75}, 498 { "matrix": [2, 6], "w": 1, "x": 7, "y": 3.75 },
604 {"label":"k27", "x":8, "y":3.75}, 499 { "matrix": [2, 7], "w": 1, "x": 8, "y": 3.75 },
605 {"label":"k28", "x":9, "y":3.75}, 500 { "matrix": [2, 8], "w": 1, "x": 9, "y": 3.75 },
606 {"label":"k29", "x":10, "y":3.75}, 501 { "matrix": [2, 9], "w": 1, "x": 10, "y": 3.75 },
607 {"label":"k2a", "x":11, "y":3.75}, 502 { "matrix": [2, 10], "w": 1, "x": 11, "y": 3.75 },
608 {"label":"k80", "x":12, "y":3.75}, 503 { "matrix": [8, 0], "w": 1, "x": 12, "y": 3.75 },
609 {"label":"k81", "x":13, "y":3.75}, 504 { "matrix": [8, 1], "w": 1, "x": 13, "y": 3.75 },
610 {"label":"k82", "x":14, "y":3.75}, 505 { "matrix": [8, 2], "w": 1, "x": 14, "y": 3.75 },
611 {"label":"k83", "x":15, "y":3.75}, 506 { "matrix": [8, 3], "w": 1, "x": 15, "y": 3.75 },
612 {"label":"k84", "x":16, "y":3.75}, 507 { "matrix": [8, 4], "w": 1, "x": 16, "y": 3.75 },
613 {"label":"k85", "x":17, "y":3.75}, 508 { "matrix": [8, 5], "w": 1, "x": 17, "y": 3.75 },
614 {"label":"k87", "x":20, "y":3.75}, 509 { "matrix": [8, 7], "w": 1, "x": 20, "y": 3.75 },
615 {"label":"k88", "x":21, "y":3.75}, 510 { "matrix": [8, 8], "w": 1, "x": 21, "y": 3.75 },
616 {"label":"k89", "x":22, "y":3.75}, 511 { "matrix": [8, 9], "w": 1, "x": 22, "y": 3.75 },
617 {"label":"k8a", "x":23, "y":3.75, "h":2}, 512 { "h": 2, "matrix": [8, 10], "w": 1, "x": 23, "y": 3.75 },
618 {"label":"k31", "x":1, "y":4.75}, 513 { "matrix": [3, 1], "w": 1, "x": 1, "y": 4.75 },
619 {"label":"k32", "x":2, "y":4.75}, 514 { "matrix": [3, 2], "w": 1, "x": 2, "y": 4.75 },
620 {"label":"k33", "x":3, "y":4.75}, 515 { "matrix": [3, 3], "w": 1, "x": 3, "y": 4.75 },
621 {"label":"k34", "x":4.5, "y":4.75, "w":1.75}, 516 { "matrix": [3, 4], "w": 1.75, "x": 4.5, "y": 4.75 },
622 {"label":"k35", "x":6.25, "y":4.75}, 517 { "matrix": [3, 5], "w": 1, "x": 6.25, "y": 4.75 },
623 {"label":"k36", "x":7.25, "y":4.75}, 518 { "matrix": [3, 6], "w": 1, "x": 7.25, "y": 4.75 },
624 {"label":"k37", "x":8.25, "y":4.75}, 519 { "matrix": [3, 7], "w": 1, "x": 8.25, "y": 4.75 },
625 {"label":"k38", "x":9.25, "y":4.75}, 520 { "matrix": [3, 8], "w": 1, "x": 9.25, "y": 4.75 },
626 {"label":"k39", "x":10.25, "y":4.75}, 521 { "matrix": [3, 9], "w": 1, "x": 10.25, "y": 4.75 },
627 {"label":"k3a", "x":11.25, "y":4.75}, 522 { "matrix": [3, 10], "w": 1, "x": 11.25, "y": 4.75 },
628 {"label":"k90", "x":12.25, "y":4.75}, 523 { "matrix": [9, 0], "w": 1, "x": 12.25, "y": 4.75 },
629 {"label":"k91", "x":13.25, "y":4.75}, 524 { "matrix": [9, 1], "w": 1, "x": 13.25, "y": 4.75 },
630 {"label":"k92", "x":14.25, "y":4.75}, 525 { "matrix": [9, 2], "w": 1, "x": 14.25, "y": 4.75 },
631 {"label":"k93", "x":15.25, "y":4.75}, 526 { "matrix": [9, 3], "w": 1, "x": 15.25, "y": 4.75 },
632 {"label":"k94", "x":16.25, "y":4.75}, 527 { "matrix": [9, 4], "w": 1, "x": 16.25, "y": 4.75 },
633 {"label":"k9a", "x":17.25, "y":4.75}, 528 { "matrix": [9, 10], "w": 1, "x": 17.25, "y": 4.75 },
634 {"label":"k95", "x":18.25, "y":3.75, "w":1.25, "h":2}, 529 { "h": 2, "matrix": [9, 5], "w": 1.25, "x": 18.25, "y": 3.75 },
635 {"label":"k97", "x":20, "y":4.75}, 530 { "matrix": [9, 7], "w": 1, "x": 20, "y": 4.75 },
636 {"label":"k98", "x":21, "y":4.75}, 531 { "matrix": [9, 8], "w": 1, "x": 21, "y": 4.75 },
637 {"label":"k99", "x":22, "y":4.75}, 532 { "matrix": [9, 9], "w": 1, "x": 22, "y": 4.75 },
638 {"label":"k40", "x":0, "y":5.75, "h":2}, 533 { "h": 2, "matrix": [4, 0], "w": 1, "x": 0, "y": 5.75 },
639 {"label":"k41", "x":1, "y":5.75}, 534 { "matrix": [4, 1], "w": 1, "x": 1, "y": 5.75 },
640 {"label":"k42", "x":2, "y":5.75}, 535 { "matrix": [4, 2], "w": 1, "x": 2, "y": 5.75 },
641 {"label":"k43", "x":3, "y":5.75}, 536 { "matrix": [4, 3], "w": 1, "x": 3, "y": 5.75 },
642 {"label":"k44", "x":4.25, "y":6}, 537 { "matrix": [4, 4], "w": 1, "x": 4.25, "y": 6 },
643 {"label":"k45", "x":5.5, "y":5.75, "w":1.25}, 538 { "matrix": [4, 5], "w": 1.25, "x": 5.5, "y": 5.75 },
644 {"label":"k46", "x":6.75, "y":5.75}, 539 { "matrix": [4, 6], "w": 1, "x": 6.75, "y": 5.75 },
645 {"label":"k47", "x":7.75, "y":5.75}, 540 { "matrix": [4, 7], "w": 1, "x": 7.75, "y": 5.75 },
646 {"label":"k48", "x":8.75, "y":5.75}, 541 { "matrix": [4, 8], "w": 1, "x": 8.75, "y": 5.75 },
647 {"label":"k49", "x":9.75, "y":5.75}, 542 { "matrix": [4, 9], "w": 1, "x": 9.75, "y": 5.75 },
648 {"label":"k4a", "x":10.75, "y":5.75}, 543 { "matrix": [4, 10], "w": 1, "x": 10.75, "y": 5.75 },
649 {"label":"ka0", "x":11.75, "y":5.75}, 544 { "matrix": [10, 0], "w": 1, "x": 11.75, "y": 5.75 },
650 {"label":"ka1", "x":12.75, "y":5.75}, 545 { "matrix": [10, 1], "w": 1, "x": 12.75, "y": 5.75 },
651 {"label":"ka2", "x":13.75, "y":5.75}, 546 { "matrix": [10, 2], "w": 1, "x": 13.75, "y": 5.75 },
652 {"label":"ka3", "x":14.75, "y":5.75}, 547 { "matrix": [10, 3], "w": 1, "x": 14.75, "y": 5.75 },
653 {"label":"ka4", "x":15.75, "y":5.75}, 548 { "matrix": [10, 4], "w": 1, "x": 15.75, "y": 5.75 },
654 {"label":"ka5", "x":16.75, "y":5.75, "w":1.75}, 549 { "matrix": [10, 5], "w": 1.75, "x": 16.75, "y": 5.75 },
655 {"label":"k96", "x":18.75, "y":6}, 550 { "matrix": [9, 6], "w": 1, "x": 18.75, "y": 6 },
656 {"label":"ka7", "x":20, "y":5.75}, 551 { "matrix": [10, 7], "w": 1, "x": 20, "y": 5.75 },
657 {"label":"ka8", "x":21, "y":5.75}, 552 { "matrix": [10, 8], "w": 1, "x": 21, "y": 5.75 },
658 {"label":"ka9", "x":22, "y":5.75}, 553 { "matrix": [10, 9], "w": 1, "x": 22, "y": 5.75 },
659 {"label":"kaa", "x":23, "y":5.75, "h":2}, 554 { "h": 2, "matrix": [10, 10], "w": 1, "x": 23, "y": 5.75 },
660 {"label":"k51", "x":1, "y":6.75}, 555 { "matrix": [5, 1], "w": 1, "x": 1, "y": 6.75 },
661 {"label":"k52", "x":2, "y":6.75}, 556 { "matrix": [5, 2], "w": 1, "x": 2, "y": 6.75 },
662 {"label":"k53", "x":3.25, "y":7}, 557 { "matrix": [5, 3], "w": 1, "x": 3.25, "y": 7 },
663 {"label":"k54", "x":4.25, "y":7}, 558 { "matrix": [5, 4], "w": 1, "x": 4.25, "y": 7 },
664 {"label":"k55", "x":5.25, "y":7}, 559 { "matrix": [5, 5], "w": 1, "x": 5.25, "y": 7 },
665 {"label":"k56", "x":6.5, "y":6.75}, 560 { "matrix": [5, 6], "w": 1, "x": 6.5, "y": 6.75 },
666 {"label":"k57", "x":7.5, "y":6.75}, 561 { "matrix": [5, 7], "w": 1, "x": 7.5, "y": 6.75 },
667 {"label":"k58", "x":8.5, "y":6.75}, 562 { "matrix": [5, 8], "w": 1, "x": 8.5, "y": 6.75 },
668 {"label":"k59", "x":9.5, "y":6.75}, 563 { "matrix": [5, 9], "w": 1, "x": 9.5, "y": 6.75 },
669 {"label":"kb0", "x":10.5, "y":6.75, "w":2}, 564 { "matrix": [11, 0], "w": 2, "x": 10.5, "y": 6.75 },
670 {"label":"kb1", "x":12.5, "y":6.75}, 565 { "matrix": [11, 1], "w": 1, "x": 12.5, "y": 6.75 },
671 {"label":"kb2", "x":13.5, "y":6.75}, 566 { "matrix": [11, 2], "w": 1, "x": 13.5, "y": 6.75 },
672 {"label":"kb3", "x":14.5, "y":6.75}, 567 { "matrix": [11, 3], "w": 1, "x": 14.5, "y": 6.75 },
673 {"label":"kb4", "x":15.5, "y":6.75}, 568 { "matrix": [11, 4], "w": 1, "x": 15.5, "y": 6.75 },
674 {"label":"kb5", "x":16.5, "y":6.75}, 569 { "matrix": [11, 5], "w": 1, "x": 16.5, "y": 6.75 },
675 {"label":"ka6", "x":17.75, "y":7}, 570 { "matrix": [10, 6], "w": 1, "x": 17.75, "y": 7 },
676 {"label":"kb6", "x":18.75, "y":7}, 571 { "matrix": [11, 6], "w": 1, "x": 18.75, "y": 7 },
677 {"label":"kb7", "x":19.75, "y":7}, 572 { "matrix": [11, 7], "w": 1, "x": 19.75, "y": 7 },
678 {"label":"kb8", "x":21, "y":6.75}, 573 { "matrix": [11, 8], "w": 1, "x": 21, "y": 6.75 },
679 {"label":"kb9", "x":22, "y":6.75} 574 { "matrix": [11, 9], "w": 1, "x": 22, "y": 6.75 }
680 ] 575 ]
681 }, 576 },
682 "LAYOUT_4u_ansi": { 577 "LAYOUT_4u_ansi": {
578 "key_count": 128,
683 "layout": [ 579 "layout": [
684 {"label":"e00", "x":3, "y":0}, 580 { "matrix": [12, 3], "w": 1, "x": 3, "y": 0 },
685 {"label":"e01", "x":4, "y":0}, 581 { "matrix": [12, 4], "w": 1, "x": 4, "y": 0 },
686 {"label":"e02", "x":19, "y":0}, 582 { "matrix": [12, 9], "w": 1, "x": 19, "y": 0 },
687 {"label":"e03", "x":20, "y":0}, 583 { "matrix": [12, 10], "w": 1, "x": 20, "y": 0 },
688 {"label":"k00", "x":0, "y":1.5}, 584 { "matrix": [0, 0], "w": 1, "x": 0, "y": 1.5 },
689 {"label":"k01", "x":1, "y":1.5}, 585 { "matrix": [0, 1], "w": 1, "x": 1, "y": 1.5 },
690 {"label":"k02", "x":2, "y":1.5}, 586 { "matrix": [0, 2], "w": 1, "x": 2, "y": 1.5 },
691 {"label":"k03", "x":3, "y":1.5}, 587 { "matrix": [0, 3], "w": 1, "x": 3, "y": 1.5 },
692 {"label":"k04", "x":4.75, "y":1.5}, 588 { "matrix": [0, 4], "w": 1, "x": 4.75, "y": 1.5 },
693 {"label":"k06", "x":6.25, "y":1.5}, 589 { "matrix": [0, 6], "w": 1, "x": 6.25, "y": 1.5 },
694 {"label":"k07", "x":7.25, "y":1.5}, 590 { "matrix": [0, 7], "w": 1, "x": 7.25, "y": 1.5 },
695 {"label":"k08", "x":8.25, "y":1.5}, 591 { "matrix": [0, 8], "w": 1, "x": 8.25, "y": 1.5 },
696 {"label":"k09", "x":9.25, "y":1.5}, 592 { "matrix": [0, 9], "w": 1, "x": 9.25, "y": 1.5 },
697 {"label":"k0a", "x":10.75, "y":1.5}, 593 { "matrix": [0, 10], "w": 1, "x": 10.75, "y": 1.5 },
698 {"label":"k60", "x":11.75, "y":1.5}, 594 { "matrix": [6, 0], "w": 1, "x": 11.75, "y": 1.5 },
699 {"label":"k61", "x":12.75, "y":1.5}, 595 { "matrix": [6, 1], "w": 1, "x": 12.75, "y": 1.5 },
700 {"label":"k62", "x":13.75, "y":1.5}, 596 { "matrix": [6, 2], "w": 1, "x": 13.75, "y": 1.5 },
701 {"label":"k63", "x":15.25, "y":1.5}, 597 { "matrix": [6, 3], "w": 1, "x": 15.25, "y": 1.5 },
702 {"label":"k64", "x":16.25, "y":1.5}, 598 { "matrix": [6, 4], "w": 1, "x": 16.25, "y": 1.5 },
703 {"label":"k65", "x":17.25, "y":1.5}, 599 { "matrix": [6, 5], "w": 1, "x": 17.25, "y": 1.5 },
704 {"label":"k66", "x":18.25, "y":1.5}, 600 { "matrix": [6, 6], "w": 1, "x": 18.25, "y": 1.5 },
705 {"label":"k67", "x":20, "y":1.5}, 601 { "matrix": [6, 7], "w": 1, "x": 20, "y": 1.5 },
706 {"label":"k68", "x":21, "y":1.5}, 602 { "matrix": [6, 8], "w": 1, "x": 21, "y": 1.5 },
707 {"label":"k69", "x":22, "y":1.5}, 603 { "matrix": [6, 9], "w": 1, "x": 22, "y": 1.5 },
708 {"label":"k6a", "x":23, "y":1.5}, 604 { "matrix": [6, 10], "w": 1, "x": 23, "y": 1.5 },
709 {"label":"k10", "x":0, "y":2.75}, 605 { "matrix": [1, 0], "w": 1, "x": 0, "y": 2.75 },
710 {"label":"k11", "x":1, "y":2.75}, 606 { "matrix": [1, 1], "w": 1, "x": 1, "y": 2.75 },
711 {"label":"k12", "x":2, "y":2.75}, 607 { "matrix": [1, 2], "w": 1, "x": 2, "y": 2.75 },
712 {"label":"k13", "x":3, "y":2.75}, 608 { "matrix": [1, 3], "w": 1, "x": 3, "y": 2.75 },
713 {"label":"k14", "x":4.5, "y":2.75}, 609 { "matrix": [1, 4], "w": 1, "x": 4.5, "y": 2.75 },
714 {"label":"k15", "x":5.5, "y":2.75}, 610 { "matrix": [1, 5], "w": 1, "x": 5.5, "y": 2.75 },
715 {"label":"k16", "x":6.5, "y":2.75}, 611 { "matrix": [1, 6], "w": 1, "x": 6.5, "y": 2.75 },
716 {"label":"k17", "x":7.5, "y":2.75}, 612 { "matrix": [1, 7], "w": 1, "x": 7.5, "y": 2.75 },
717 {"label":"k18", "x":8.5, "y":2.75}, 613 { "matrix": [1, 8], "w": 1, "x": 8.5, "y": 2.75 },
718 {"label":"k19", "x":9.5, "y":2.75}, 614 { "matrix": [1, 9], "w": 1, "x": 9.5, "y": 2.75 },
719 {"label":"k1a", "x":10.5, "y":2.75}, 615 { "matrix": [1, 10], "w": 1, "x": 10.5, "y": 2.75 },
720 {"label":"k70", "x":11.5, "y":2.75}, 616 { "matrix": [7, 0], "w": 1, "x": 11.5, "y": 2.75 },
721 {"label":"k71", "x":12.5, "y":2.75}, 617 { "matrix": [7, 1], "w": 1, "x": 12.5, "y": 2.75 },
722 {"label":"k72", "x":13.5, "y":2.75}, 618 { "matrix": [7, 2], "w": 1, "x": 13.5, "y": 2.75 },
723 {"label":"k73", "x":14.5, "y":2.75}, 619 { "matrix": [7, 3], "w": 1, "x": 14.5, "y": 2.75 },
724 {"label":"k74", "x":15.5, "y":2.75}, 620 { "matrix": [7, 4], "w": 1, "x": 15.5, "y": 2.75 },
725 {"label":"k75", "x":16.5, "y":2.75}, 621 { "matrix": [7, 5], "w": 1, "x": 16.5, "y": 2.75 },
726 {"label":"k76", "x":17.5, "y":2.75, "w":2}, 622 { "matrix": [7, 6], "w": 2, "x": 17.5, "y": 2.75 },
727 {"label":"k77", "x":20, "y":2.75}, 623 { "matrix": [7, 7], "w": 1, "x": 20, "y": 2.75 },
728 {"label":"k78", "x":21, "y":2.75}, 624 { "matrix": [7, 8], "w": 1, "x": 21, "y": 2.75 },
729 {"label":"k79", "x":22, "y":2.75}, 625 { "matrix": [7, 9], "w": 1, "x": 22, "y": 2.75 },
730 {"label":"k7a", "x":23, "y":2.75}, 626 { "matrix": [7, 10], "w": 1, "x": 23, "y": 2.75 },
731 {"label":"k20", "x":0, "y":3.75, "h":2}, 627 { "h": 2, "matrix": [2, 0], "w": 1, "x": 0, "y": 3.75 },
732 {"label":"k21", "x":1, "y":3.75}, 628 { "matrix": [2, 1], "w": 1, "x": 1, "y": 3.75 },
733 {"label":"k22", "x":2, "y":3.75}, 629 { "matrix": [2, 2], "w": 1, "x": 2, "y": 3.75 },
734 {"label":"k23", "x":3, "y":3.75}, 630 { "matrix": [2, 3], "w": 1, "x": 3, "y": 3.75 },
735 {"label":"k24", "x":4.5, "y":3.75, "w":1.5}, 631 { "matrix": [2, 4], "w": 1.5, "x": 4.5, "y": 3.75 },
736 {"label":"k25", "x":6, "y":3.75}, 632 { "matrix": [2, 5], "w": 1, "x": 6, "y": 3.75 },
737 {"label":"k26", "x":7, "y":3.75}, 633 { "matrix": [2, 6], "w": 1, "x": 7, "y": 3.75 },
738 {"label":"k27", "x":8, "y":3.75}, 634 { "matrix": [2, 7], "w": 1, "x": 8, "y": 3.75 },
739 {"label":"k28", "x":9, "y":3.75}, 635 { "matrix": [2, 8], "w": 1, "x": 9, "y": 3.75 },
740 {"label":"k29", "x":10, "y":3.75}, 636 { "matrix": [2, 9], "w": 1, "x": 10, "y": 3.75 },
741 {"label":"k2a", "x":11, "y":3.75}, 637 { "matrix": [2, 10], "w": 1, "x": 11, "y": 3.75 },
742 {"label":"k80", "x":12, "y":3.75}, 638 { "matrix": [8, 0], "w": 1, "x": 12, "y": 3.75 },
743 {"label":"k81", "x":13, "y":3.75}, 639 { "matrix": [8, 1], "w": 1, "x": 13, "y": 3.75 },
744 {"label":"k82", "x":14, "y":3.75}, 640 { "matrix": [8, 2], "w": 1, "x": 14, "y": 3.75 },
745 {"label":"k83", "x":15, "y":3.75}, 641 { "matrix": [8, 3], "w": 1, "x": 15, "y": 3.75 },
746 {"label":"k84", "x":16, "y":3.75}, 642 { "matrix": [8, 4], "w": 1, "x": 16, "y": 3.75 },
747 {"label":"k85", "x":17, "y":3.75}, 643 { "matrix": [8, 5], "w": 1, "x": 17, "y": 3.75 },
748 {"label":"k86", "x":18, "y":3.75, "w":1.5}, 644 { "matrix": [8, 6], "w": 1.5, "x": 18, "y": 3.75 },
749 {"label":"k87", "x":20, "y":3.75}, 645 { "matrix": [8, 7], "w": 1, "x": 20, "y": 3.75 },
750 {"label":"k88", "x":21, "y":3.75}, 646 { "matrix": [8, 8], "w": 1, "x": 21, "y": 3.75 },
751 {"label":"k89", "x":22, "y":3.75}, 647 { "matrix": [8, 9], "w": 1, "x": 22, "y": 3.75 },
752 {"label":"k8a", "x":23, "y":3.75, "h":2}, 648 { "h": 2, "matrix": [8, 10], "w": 1, "x": 23, "y": 3.75 },
753 {"label":"k31", "x":1, "y":4.75}, 649 { "matrix": [3, 1], "w": 1, "x": 1, "y": 4.75 },
754 {"label":"k32", "x":2, "y":4.75}, 650 { "matrix": [3, 2], "w": 1, "x": 2, "y": 4.75 },
755 {"label":"k33", "x":3, "y":4.75}, 651 { "matrix": [3, 3], "w": 1, "x": 3, "y": 4.75 },
756 {"label":"k34", "x":4.5, "y":4.75, "w":1.75}, 652 { "matrix": [3, 4], "w": 1.75, "x": 4.5, "y": 4.75 },
757 {"label":"k35", "x":6.25, "y":4.75}, 653 { "matrix": [3, 5], "w": 1, "x": 6.25, "y": 4.75 },
758 {"label":"k36", "x":7.25, "y":4.75}, 654 { "matrix": [3, 6], "w": 1, "x": 7.25, "y": 4.75 },
759 {"label":"k37", "x":8.25, "y":4.75}, 655 { "matrix": [3, 7], "w": 1, "x": 8.25, "y": 4.75 },
760 {"label":"k38", "x":9.25, "y":4.75}, 656 { "matrix": [3, 8], "w": 1, "x": 9.25, "y": 4.75 },
761 {"label":"k39", "x":10.25, "y":4.75}, 657 { "matrix": [3, 9], "w": 1, "x": 10.25, "y": 4.75 },
762 {"label":"k3a", "x":11.25, "y":4.75}, 658 { "matrix": [3, 10], "w": 1, "x": 11.25, "y": 4.75 },
763 {"label":"k90", "x":12.25, "y":4.75}, 659 { "matrix": [9, 0], "w": 1, "x": 12.25, "y": 4.75 },
764 {"label":"k91", "x":13.25, "y":4.75}, 660 { "matrix": [9, 1], "w": 1, "x": 13.25, "y": 4.75 },
765 {"label":"k92", "x":14.25, "y":4.75}, 661 { "matrix": [9, 2], "w": 1, "x": 14.25, "y": 4.75 },
766 {"label":"k93", "x":15.25, "y":4.75}, 662 { "matrix": [9, 3], "w": 1, "x": 15.25, "y": 4.75 },
767 {"label":"k94", "x":16.25, "y":4.75}, 663 { "matrix": [9, 4], "w": 1, "x": 16.25, "y": 4.75 },
768 {"label":"k95", "x":17.25, "y":4.75, "w":2.25}, 664 { "matrix": [9, 5], "w": 2.25, "x": 17.25, "y": 4.75 },
769 {"label":"k97", "x":20, "y":4.75}, 665 { "matrix": [9, 7], "w": 1, "x": 20, "y": 4.75 },
770 {"label":"k98", "x":21, "y":4.75}, 666 { "matrix": [9, 8], "w": 1, "x": 21, "y": 4.75 },
771 {"label":"k99", "x":22, "y":4.75}, 667 { "matrix": [9, 9], "w": 1, "x": 22, "y": 4.75 },
772 {"label":"k40", "x":0, "y":5.75, "h":2}, 668 { "h": 2, "matrix": [4, 0], "w": 1, "x": 0, "y": 5.75 },
773 {"label":"k41", "x":1, "y":5.75}, 669 { "matrix": [4, 1], "w": 1, "x": 1, "y": 5.75 },
774 {"label":"k42", "x":2, "y":5.75}, 670 { "matrix": [4, 2], "w": 1, "x": 2, "y": 5.75 },
775 {"label":"k43", "x":3, "y":5.75}, 671 { "matrix": [4, 3], "w": 1, "x": 3, "y": 5.75 },
776 {"label":"k44", "x":4.25, "y":6}, 672 { "matrix": [4, 4], "w": 1, "x": 4.25, "y": 6 },
777 {"label":"k45", "x":5.5, "y":5.75, "w":1.25}, 673 { "matrix": [4, 5], "w": 1.25, "x": 5.5, "y": 5.75 },
778 {"label":"k46", "x":6.75, "y":5.75}, 674 { "matrix": [4, 6], "w": 1, "x": 6.75, "y": 5.75 },
779 {"label":"k47", "x":7.75, "y":5.75}, 675 { "matrix": [4, 7], "w": 1, "x": 7.75, "y": 5.75 },
780 {"label":"k48", "x":8.75, "y":5.75}, 676 { "matrix": [4, 8], "w": 1, "x": 8.75, "y": 5.75 },
781 {"label":"k49", "x":9.75, "y":5.75}, 677 { "matrix": [4, 9], "w": 1, "x": 9.75, "y": 5.75 },
782 {"label":"k4a", "x":10.75, "y":5.75}, 678 { "matrix": [4, 10], "w": 1, "x": 10.75, "y": 5.75 },
783 {"label":"ka0", "x":11.75, "y":5.75}, 679 { "matrix": [10, 0], "w": 1, "x": 11.75, "y": 5.75 },
784 {"label":"ka1", "x":12.75, "y":5.75}, 680 { "matrix": [10, 1], "w": 1, "x": 12.75, "y": 5.75 },
785 {"label":"ka2", "x":13.75, "y":5.75}, 681 { "matrix": [10, 2], "w": 1, "x": 13.75, "y": 5.75 },
786 {"label":"ka3", "x":14.75, "y":5.75}, 682 { "matrix": [10, 3], "w": 1, "x": 14.75, "y": 5.75 },
787 {"label":"ka4", "x":15.75, "y":5.75}, 683 { "matrix": [10, 4], "w": 1, "x": 15.75, "y": 5.75 },
788 {"label":"ka5", "x":16.75, "y":5.75, "w":1.75}, 684 { "matrix": [10, 5], "w": 1.75, "x": 16.75, "y": 5.75 },
789 {"label":"k96", "x":18.75, "y":6}, 685 { "matrix": [9, 6], "w": 1, "x": 18.75, "y": 6 },
790 {"label":"ka7", "x":20, "y":5.75}, 686 { "matrix": [10, 7], "w": 1, "x": 20, "y": 5.75 },
791 {"label":"ka8", "x":21, "y":5.75}, 687 { "matrix": [10, 8], "w": 1, "x": 21, "y": 5.75 },
792 {"label":"ka9", "x":22, "y":5.75}, 688 { "matrix": [10, 9], "w": 1, "x": 22, "y": 5.75 },
793 {"label":"kaa", "x":23, "y":5.75, "h":2}, 689 { "h": 2, "matrix": [10, 10], "w": 1, "x": 23, "y": 5.75 },
794 {"label":"k51", "x":1, "y":6.75}, 690 { "matrix": [5, 1], "w": 1, "x": 1, "y": 6.75 },
795 {"label":"k52", "x":2, "y":6.75}, 691 { "matrix": [5, 2], "w": 1, "x": 2, "y": 6.75 },
796 {"label":"k53", "x":3.25, "y":7}, 692 { "matrix": [5, 3], "w": 1, "x": 3.25, "y": 7 },
797 {"label":"k54", "x":4.25, "y":7}, 693 { "matrix": [5, 4], "w": 1, "x": 4.25, "y": 7 },
798 {"label":"k55", "x":5.25, "y":7}, 694 { "matrix": [5, 5], "w": 1, "x": 5.25, "y": 7 },
799 {"label":"k56", "x":6.5, "y":6.75}, 695 { "matrix": [5, 6], "w": 1, "x": 6.5, "y": 6.75 },
800 {"label":"k57", "x":7.5, "y":6.75}, 696 { "matrix": [5, 7], "w": 1, "x": 7.5, "y": 6.75 },
801 {"label":"k58", "x":8.5, "y":6.75}, 697 { "matrix": [5, 8], "w": 1, "x": 8.5, "y": 6.75 },
802 {"label":"kb0", "x":9.5, "y":6.75, "w":4}, 698 { "matrix": [11, 0], "w": 4, "x": 9.5, "y": 6.75 },
803 {"label":"kb2", "x":13.5, "y":6.75}, 699 { "matrix": [11, 2], "w": 1, "x": 13.5, "y": 6.75 },
804 {"label":"kb3", "x":14.5, "y":6.75}, 700 { "matrix": [11, 3], "w": 1, "x": 14.5, "y": 6.75 },
805 {"label":"kb4", "x":15.5, "y":6.75}, 701 { "matrix": [11, 4], "w": 1, "x": 15.5, "y": 6.75 },
806 {"label":"kb5", "x":16.5, "y":6.75}, 702 { "matrix": [11, 5], "w": 1, "x": 16.5, "y": 6.75 },
807 {"label":"ka6", "x":17.75, "y":7}, 703 { "matrix": [10, 6], "w": 1, "x": 17.75, "y": 7 },
808 {"label":"kb6", "x":18.75, "y":7}, 704 { "matrix": [11, 6], "w": 1, "x": 18.75, "y": 7 },
809 {"label":"kb7", "x":19.75, "y":7}, 705 { "matrix": [11, 7], "w": 1, "x": 19.75, "y": 7 },
810 {"label":"kb8", "x":21, "y":6.75}, 706 { "matrix": [11, 8], "w": 1, "x": 21, "y": 6.75 },
811 {"label":"kb9", "x":22, "y":6.75} 707 { "matrix": [11, 9], "w": 1, "x": 22, "y": 6.75 }
812 ] 708 ]
813 }, 709 },
814 "LAYOUT_4u_iso": { 710 "LAYOUT_4u_iso": {
711 "key_count": 128,
815 "layout": [ 712 "layout": [
816 {"label":"e00", "x":3, "y":0}, 713 { "matrix": [12, 3], "w": 1, "x": 3, "y": 0 },
817 {"label":"e01", "x":4, "y":0}, 714 { "matrix": [12, 4], "w": 1, "x": 4, "y": 0 },
818 {"label":"e02", "x":19, "y":0}, 715 { "matrix": [12, 9], "w": 1, "x": 19, "y": 0 },
819 {"label":"e03", "x":20, "y":0}, 716 { "matrix": [12, 10], "w": 1, "x": 20, "y": 0 },
820 {"label":"k00", "x":0, "y":1.5}, 717 { "matrix": [0, 0], "w": 1, "x": 0, "y": 1.5 },
821 {"label":"k01", "x":1, "y":1.5}, 718 { "matrix": [0, 1], "w": 1, "x": 1, "y": 1.5 },
822 {"label":"k02", "x":2, "y":1.5}, 719 { "matrix": [0, 2], "w": 1, "x": 2, "y": 1.5 },
823 {"label":"k03", "x":3, "y":1.5}, 720 { "matrix": [0, 3], "w": 1, "x": 3, "y": 1.5 },
824 {"label":"k04", "x":4.75, "y":1.5}, 721 { "matrix": [0, 4], "w": 1, "x": 4.75, "y": 1.5 },
825 {"label":"k06", "x":6.25, "y":1.5}, 722 { "matrix": [0, 6], "w": 1, "x": 6.25, "y": 1.5 },
826 {"label":"k07", "x":7.25, "y":1.5}, 723 { "matrix": [0, 7], "w": 1, "x": 7.25, "y": 1.5 },
827 {"label":"k08", "x":8.25, "y":1.5}, 724 { "matrix": [0, 8], "w": 1, "x": 8.25, "y": 1.5 },
828 {"label":"k09", "x":9.25, "y":1.5}, 725 { "matrix": [0, 9], "w": 1, "x": 9.25, "y": 1.5 },
829 {"label":"k0a", "x":10.75, "y":1.5}, 726 { "matrix": [0, 10], "w": 1, "x": 10.75, "y": 1.5 },
830 {"label":"k60", "x":11.75, "y":1.5}, 727 { "matrix": [6, 0], "w": 1, "x": 11.75, "y": 1.5 },
831 {"label":"k61", "x":12.75, "y":1.5}, 728 { "matrix": [6, 1], "w": 1, "x": 12.75, "y": 1.5 },
832 {"label":"k62", "x":13.75, "y":1.5}, 729 { "matrix": [6, 2], "w": 1, "x": 13.75, "y": 1.5 },
833 {"label":"k63", "x":15.25, "y":1.5}, 730 { "matrix": [6, 3], "w": 1, "x": 15.25, "y": 1.5 },
834 {"label":"k64", "x":16.25, "y":1.5}, 731 { "matrix": [6, 4], "w": 1, "x": 16.25, "y": 1.5 },
835 {"label":"k65", "x":17.25, "y":1.5}, 732 { "matrix": [6, 5], "w": 1, "x": 17.25, "y": 1.5 },
836 {"label":"k66", "x":18.25, "y":1.5}, 733 { "matrix": [6, 6], "w": 1, "x": 18.25, "y": 1.5 },
837 {"label":"k67", "x":20, "y":1.5}, 734 { "matrix": [6, 7], "w": 1, "x": 20, "y": 1.5 },
838 {"label":"k68", "x":21, "y":1.5}, 735 { "matrix": [6, 8], "w": 1, "x": 21, "y": 1.5 },
839 {"label":"k69", "x":22, "y":1.5}, 736 { "matrix": [6, 9], "w": 1, "x": 22, "y": 1.5 },
840 {"label":"k6a", "x":23, "y":1.5}, 737 { "matrix": [6, 10], "w": 1, "x": 23, "y": 1.5 },
841 {"label":"k10", "x":0, "y":2.75}, 738 { "matrix": [1, 0], "w": 1, "x": 0, "y": 2.75 },
842 {"label":"k11", "x":1, "y":2.75}, 739 { "matrix": [1, 1], "w": 1, "x": 1, "y": 2.75 },
843 {"label":"k12", "x":2, "y":2.75}, 740 { "matrix": [1, 2], "w": 1, "x": 2, "y": 2.75 },
844 {"label":"k13", "x":3, "y":2.75}, 741 { "matrix": [1, 3], "w": 1, "x": 3, "y": 2.75 },
845 {"label":"k14", "x":4.5, "y":2.75}, 742 { "matrix": [1, 4], "w": 1, "x": 4.5, "y": 2.75 },
846 {"label":"k15", "x":5.5, "y":2.75}, 743 { "matrix": [1, 5], "w": 1, "x": 5.5, "y": 2.75 },
847 {"label":"k16", "x":6.5, "y":2.75}, 744 { "matrix": [1, 6], "w": 1, "x": 6.5, "y": 2.75 },
848 {"label":"k17", "x":7.5, "y":2.75}, 745 { "matrix": [1, 7], "w": 1, "x": 7.5, "y": 2.75 },
849 {"label":"k18", "x":8.5, "y":2.75}, 746 { "matrix": [1, 8], "w": 1, "x": 8.5, "y": 2.75 },
850 {"label":"k19", "x":9.5, "y":2.75}, 747 { "matrix": [1, 9], "w": 1, "x": 9.5, "y": 2.75 },
851 {"label":"k1a", "x":10.5, "y":2.75}, 748 { "matrix": [1, 10], "w": 1, "x": 10.5, "y": 2.75 },
852 {"label":"k70", "x":11.5, "y":2.75}, 749 { "matrix": [7, 0], "w": 1, "x": 11.5, "y": 2.75 },
853 {"label":"k71", "x":12.5, "y":2.75}, 750 { "matrix": [7, 1], "w": 1, "x": 12.5, "y": 2.75 },
854 {"label":"k72", "x":13.5, "y":2.75}, 751 { "matrix": [7, 2], "w": 1, "x": 13.5, "y": 2.75 },
855 {"label":"k73", "x":14.5, "y":2.75}, 752 { "matrix": [7, 3], "w": 1, "x": 14.5, "y": 2.75 },
856 {"label":"k74", "x":15.5, "y":2.75}, 753 { "matrix": [7, 4], "w": 1, "x": 15.5, "y": 2.75 },
857 {"label":"k75", "x":16.5, "y":2.75}, 754 { "matrix": [7, 5], "w": 1, "x": 16.5, "y": 2.75 },
858 {"label":"k76", "x":17.5, "y":2.75, "w":2}, 755 { "matrix": [7, 6], "w": 2, "x": 17.5, "y": 2.75 },
859 {"label":"k77", "x":20, "y":2.75}, 756 { "matrix": [7, 7], "w": 1, "x": 20, "y": 2.75 },
860 {"label":"k78", "x":21, "y":2.75}, 757 { "matrix": [7, 8], "w": 1, "x": 21, "y": 2.75 },
861 {"label":"k79", "x":22, "y":2.75}, 758 { "matrix": [7, 9], "w": 1, "x": 22, "y": 2.75 },
862 {"label":"k7a", "x":23, "y":2.75}, 759 { "matrix": [7, 10], "w": 1, "x": 23, "y": 2.75 },
863 {"label":"k20", "x":0, "y":3.75, "h":2}, 760 { "h": 2, "matrix": [2, 0], "w": 1, "x": 0, "y": 3.75 },
864 {"label":"k21", "x":1, "y":3.75}, 761 { "matrix": [2, 1], "w": 1, "x": 1, "y": 3.75 },
865 {"label":"k22", "x":2, "y":3.75}, 762 { "matrix": [2, 2], "w": 1, "x": 2, "y": 3.75 },
866 {"label":"k23", "x":3, "y":3.75}, 763 { "matrix": [2, 3], "w": 1, "x": 3, "y": 3.75 },
867 {"label":"k24", "x":4.5, "y":3.75, "w":1.5}, 764 { "matrix": [2, 4], "w": 1.5, "x": 4.5, "y": 3.75 },
868 {"label":"k25", "x":6, "y":3.75}, 765 { "matrix": [2, 5], "w": 1, "x": 6, "y": 3.75 },
869 {"label":"k26", "x":7, "y":3.75}, 766 { "matrix": [2, 6], "w": 1, "x": 7, "y": 3.75 },
870 {"label":"k27", "x":8, "y":3.75}, 767 { "matrix": [2, 7], "w": 1, "x": 8, "y": 3.75 },
871 {"label":"k28", "x":9, "y":3.75}, 768 { "matrix": [2, 8], "w": 1, "x": 9, "y": 3.75 },
872 {"label":"k29", "x":10, "y":3.75}, 769 { "matrix": [2, 9], "w": 1, "x": 10, "y": 3.75 },
873 {"label":"k2a", "x":11, "y":3.75}, 770 { "matrix": [2, 10], "w": 1, "x": 11, "y": 3.75 },
874 {"label":"k80", "x":12, "y":3.75}, 771 { "matrix": [8, 0], "w": 1, "x": 12, "y": 3.75 },
875 {"label":"k81", "x":13, "y":3.75}, 772 { "matrix": [8, 1], "w": 1, "x": 13, "y": 3.75 },
876 {"label":"k82", "x":14, "y":3.75}, 773 { "matrix": [8, 2], "w": 1, "x": 14, "y": 3.75 },
877 {"label":"k83", "x":15, "y":3.75}, 774 { "matrix": [8, 3], "w": 1, "x": 15, "y": 3.75 },
878 {"label":"k84", "x":16, "y":3.75}, 775 { "matrix": [8, 4], "w": 1, "x": 16, "y": 3.75 },
879 {"label":"k85", "x":17, "y":3.75}, 776 { "matrix": [8, 5], "w": 1, "x": 17, "y": 3.75 },
880 {"label":"k87", "x":20, "y":3.75}, 777 { "matrix": [8, 7], "w": 1, "x": 20, "y": 3.75 },
881 {"label":"k88", "x":21, "y":3.75}, 778 { "matrix": [8, 8], "w": 1, "x": 21, "y": 3.75 },
882 {"label":"k89", "x":22, "y":3.75}, 779 { "matrix": [8, 9], "w": 1, "x": 22, "y": 3.75 },
883 {"label":"k8a", "x":23, "y":3.75, "h":2}, 780 { "h": 2, "matrix": [8, 10], "w": 1, "x": 23, "y": 3.75 },
884 {"label":"k31", "x":1, "y":4.75}, 781 { "matrix": [3, 1], "w": 1, "x": 1, "y": 4.75 },
885 {"label":"k32", "x":2, "y":4.75}, 782 { "matrix": [3, 2], "w": 1, "x": 2, "y": 4.75 },
886 {"label":"k33", "x":3, "y":4.75}, 783 { "matrix": [3, 3], "w": 1, "x": 3, "y": 4.75 },
887 {"label":"k34", "x":4.5, "y":4.75, "w":1.75}, 784 { "matrix": [3, 4], "w": 1.75, "x": 4.5, "y": 4.75 },
888 {"label":"k35", "x":6.25, "y":4.75}, 785 { "matrix": [3, 5], "w": 1, "x": 6.25, "y": 4.75 },
889 {"label":"k36", "x":7.25, "y":4.75}, 786 { "matrix": [3, 6], "w": 1, "x": 7.25, "y": 4.75 },
890 {"label":"k37", "x":8.25, "y":4.75}, 787 { "matrix": [3, 7], "w": 1, "x": 8.25, "y": 4.75 },
891 {"label":"k38", "x":9.25, "y":4.75}, 788 { "matrix": [3, 8], "w": 1, "x": 9.25, "y": 4.75 },
892 {"label":"k39", "x":10.25, "y":4.75}, 789 { "matrix": [3, 9], "w": 1, "x": 10.25, "y": 4.75 },
893 {"label":"k3a", "x":11.25, "y":4.75}, 790 { "matrix": [3, 10], "w": 1, "x": 11.25, "y": 4.75 },
894 {"label":"k90", "x":12.25, "y":4.75}, 791 { "matrix": [9, 0], "w": 1, "x": 12.25, "y": 4.75 },
895 {"label":"k91", "x":13.25, "y":4.75}, 792 { "matrix": [9, 1], "w": 1, "x": 13.25, "y": 4.75 },
896 {"label":"k92", "x":14.25, "y":4.75}, 793 { "matrix": [9, 2], "w": 1, "x": 14.25, "y": 4.75 },
897 {"label":"k93", "x":15.25, "y":4.75}, 794 { "matrix": [9, 3], "w": 1, "x": 15.25, "y": 4.75 },
898 {"label":"k94", "x":16.25, "y":4.75}, 795 { "matrix": [9, 4], "w": 1, "x": 16.25, "y": 4.75 },
899 {"label":"k9a", "x":17.25, "y":4.75}, 796 { "matrix": [9, 10], "w": 1, "x": 17.25, "y": 4.75 },
900 {"label":"k95", "x":18.25, "y":3.75, "w":1.25, "h":2}, 797 { "h": 2, "matrix": [9, 5], "w": 1.25, "x": 18.25, "y": 3.75 },
901 {"label":"k97", "x":20, "y":4.75}, 798 { "matrix": [9, 7], "w": 1, "x": 20, "y": 4.75 },
902 {"label":"k98", "x":21, "y":4.75}, 799 { "matrix": [9, 8], "w": 1, "x": 21, "y": 4.75 },
903 {"label":"k99", "x":22, "y":4.75}, 800 { "matrix": [9, 9], "w": 1, "x": 22, "y": 4.75 },
904 {"label":"k40", "x":0, "y":5.75, "h":2}, 801 { "h": 2, "matrix": [4, 0], "w": 1, "x": 0, "y": 5.75 },
905 {"label":"k41", "x":1, "y":5.75}, 802 { "matrix": [4, 1], "w": 1, "x": 1, "y": 5.75 },
906 {"label":"k42", "x":2, "y":5.75}, 803 { "matrix": [4, 2], "w": 1, "x": 2, "y": 5.75 },
907 {"label":"k43", "x":3, "y":5.75}, 804 { "matrix": [4, 3], "w": 1, "x": 3, "y": 5.75 },
908 {"label":"k44", "x":4.25, "y":6}, 805 { "matrix": [4, 4], "w": 1, "x": 4.25, "y": 6 },
909 {"label":"k45", "x":5.5, "y":5.75, "w":1.25}, 806 { "matrix": [4, 5], "w": 1.25, "x": 5.5, "y": 5.75 },
910 {"label":"k46", "x":6.75, "y":5.75}, 807 { "matrix": [4, 6], "w": 1, "x": 6.75, "y": 5.75 },
911 {"label":"k47", "x":7.75, "y":5.75}, 808 { "matrix": [4, 7], "w": 1, "x": 7.75, "y": 5.75 },
912 {"label":"k48", "x":8.75, "y":5.75}, 809 { "matrix": [4, 8], "w": 1, "x": 8.75, "y": 5.75 },
913 {"label":"k49", "x":9.75, "y":5.75}, 810 { "matrix": [4, 9], "w": 1, "x": 9.75, "y": 5.75 },
914 {"label":"k4a", "x":10.75, "y":5.75}, 811 { "matrix": [4, 10], "w": 1, "x": 10.75, "y": 5.75 },
915 {"label":"ka0", "x":11.75, "y":5.75}, 812 { "matrix": [10, 0], "w": 1, "x": 11.75, "y": 5.75 },
916 {"label":"ka1", "x":12.75, "y":5.75}, 813 { "matrix": [10, 1], "w": 1, "x": 12.75, "y": 5.75 },
917 {"label":"ka2", "x":13.75, "y":5.75}, 814 { "matrix": [10, 2], "w": 1, "x": 13.75, "y": 5.75 },
918 {"label":"ka3", "x":14.75, "y":5.75}, 815 { "matrix": [10, 3], "w": 1, "x": 14.75, "y": 5.75 },
919 {"label":"ka4", "x":15.75, "y":5.75}, 816 { "matrix": [10, 4], "w": 1, "x": 15.75, "y": 5.75 },
920 {"label":"ka5", "x":16.75, "y":5.75, "w":1.75}, 817 { "matrix": [10, 5], "w": 1.75, "x": 16.75, "y": 5.75 },
921 {"label":"k96", "x":18.75, "y":6}, 818 { "matrix": [9, 6], "w": 1, "x": 18.75, "y": 6 },
922 {"label":"ka7", "x":20, "y":5.75}, 819 { "matrix": [10, 7], "w": 1, "x": 20, "y": 5.75 },
923 {"label":"ka8", "x":21, "y":5.75}, 820 { "matrix": [10, 8], "w": 1, "x": 21, "y": 5.75 },
924 {"label":"ka9", "x":22, "y":5.75}, 821 { "matrix": [10, 9], "w": 1, "x": 22, "y": 5.75 },
925 {"label":"kaa", "x":23, "y":5.75, "h":2}, 822 { "h": 2, "matrix": [10, 10], "w": 1, "x": 23, "y": 5.75 },
926 {"label":"k51", "x":1, "y":6.75}, 823 { "matrix": [5, 1], "w": 1, "x": 1, "y": 6.75 },
927 {"label":"k52", "x":2, "y":6.75}, 824 { "matrix": [5, 2], "w": 1, "x": 2, "y": 6.75 },
928 {"label":"k53", "x":3.25, "y":7}, 825 { "matrix": [5, 3], "w": 1, "x": 3.25, "y": 7 },
929 {"label":"k54", "x":4.25, "y":7}, 826 { "matrix": [5, 4], "w": 1, "x": 4.25, "y": 7 },
930 {"label":"k55", "x":5.25, "y":7}, 827 { "matrix": [5, 5], "w": 1, "x": 5.25, "y": 7 },
931 {"label":"k56", "x":6.5, "y":6.75}, 828 { "matrix": [5, 6], "w": 1, "x": 6.5, "y": 6.75 },
932 {"label":"k57", "x":7.5, "y":6.75}, 829 { "matrix": [5, 7], "w": 1, "x": 7.5, "y": 6.75 },
933 {"label":"k58", "x":8.5, "y":6.75}, 830 { "matrix": [5, 8], "w": 1, "x": 8.5, "y": 6.75 },
934 {"label":"kb0", "x":9.5, "y":6.75, "w":4}, 831 { "matrix": [11, 0], "w": 4, "x": 9.5, "y": 6.75 },
935 {"label":"kb2", "x":13.5, "y":6.75}, 832 { "matrix": [11, 2], "w": 1, "x": 13.5, "y": 6.75 },
936 {"label":"kb3", "x":14.5, "y":6.75}, 833 { "matrix": [11, 3], "w": 1, "x": 14.5, "y": 6.75 },
937 {"label":"kb4", "x":15.5, "y":6.75}, 834 { "matrix": [11, 4], "w": 1, "x": 15.5, "y": 6.75 },
938 {"label":"kb5", "x":16.5, "y":6.75}, 835 { "matrix": [11, 5], "w": 1, "x": 16.5, "y": 6.75 },
939 {"label":"ka6", "x":17.75, "y":7}, 836 { "matrix": [10, 6], "w": 1, "x": 17.75, "y": 7 },
940 {"label":"kb6", "x":18.75, "y":7}, 837 { "matrix": [11, 6], "w": 1, "x": 18.75, "y": 7 },
941 {"label":"kb7", "x":19.75, "y":7}, 838 { "matrix": [11, 7], "w": 1, "x": 19.75, "y": 7 },
942 {"label":"kb8", "x":21, "y":6.75}, 839 { "matrix": [11, 8], "w": 1, "x": 21, "y": 6.75 },
943 {"label":"kb9", "x":22, "y":6.75} 840 { "matrix": [11, 9], "w": 1, "x": 22, "y": 6.75 }
944 ] 841 ]
945 }, 842 },
946 "LAYOUT_7u_ansi": { 843 "LAYOUT_7u_ansi": {
844 "key_count": 125,
947 "layout": [ 845 "layout": [
948 {"label":"e00", "x":3, "y":0}, 846 { "matrix": [12, 3], "w": 1, "x": 3, "y": 0 },
949 {"label":"e01", "x":4, "y":0}, 847 { "matrix": [12, 4], "w": 1, "x": 4, "y": 0 },
950 {"label":"e02", "x":19, "y":0}, 848 { "matrix": [12, 9], "w": 1, "x": 19, "y": 0 },
951 {"label":"e03", "x":20, "y":0}, 849 { "matrix": [12, 10], "w": 1, "x": 20, "y": 0 },
952 {"label":"k00", "x":0, "y":1.5}, 850 { "matrix": [0, 0], "w": 1, "x": 0, "y": 1.5 },
953 {"label":"k01", "x":1, "y":1.5}, 851 { "matrix": [0, 1], "w": 1, "x": 1, "y": 1.5 },
954 {"label":"k02", "x":2, "y":1.5}, 852 { "matrix": [0, 2], "w": 1, "x": 2, "y": 1.5 },
955 {"label":"k03", "x":3, "y":1.5}, 853 { "matrix": [0, 3], "w": 1, "x": 3, "y": 1.5 },
956 {"label":"k04", "x":4.75, "y":1.5}, 854 { "matrix": [0, 4], "w": 1, "x": 4.75, "y": 1.5 },
957 {"label":"k06", "x":6.25, "y":1.5}, 855 { "matrix": [0, 6], "w": 1, "x": 6.25, "y": 1.5 },
958 {"label":"k07", "x":7.25, "y":1.5}, 856 { "matrix": [0, 7], "w": 1, "x": 7.25, "y": 1.5 },
959 {"label":"k08", "x":8.25, "y":1.5}, 857 { "matrix": [0, 8], "w": 1, "x": 8.25, "y": 1.5 },
960 {"label":"k09", "x":9.25, "y":1.5}, 858 { "matrix": [0, 9], "w": 1, "x": 9.25, "y": 1.5 },
961 {"label":"k0a", "x":10.75, "y":1.5}, 859 { "matrix": [0, 10], "w": 1, "x": 10.75, "y": 1.5 },
962 {"label":"k60", "x":11.75, "y":1.5}, 860 { "matrix": [6, 0], "w": 1, "x": 11.75, "y": 1.5 },
963 {"label":"k61", "x":12.75, "y":1.5}, 861 { "matrix": [6, 1], "w": 1, "x": 12.75, "y": 1.5 },
964 {"label":"k62", "x":13.75, "y":1.5}, 862 { "matrix": [6, 2], "w": 1, "x": 13.75, "y": 1.5 },
965 {"label":"k63", "x":15.25, "y":1.5}, 863 { "matrix": [6, 3], "w": 1, "x": 15.25, "y": 1.5 },
966 {"label":"k64", "x":16.25, "y":1.5}, 864 { "matrix": [6, 4], "w": 1, "x": 16.25, "y": 1.5 },
967 {"label":"k65", "x":17.25, "y":1.5}, 865 { "matrix": [6, 5], "w": 1, "x": 17.25, "y": 1.5 },
968 {"label":"k66", "x":18.25, "y":1.5}, 866 { "matrix": [6, 6], "w": 1, "x": 18.25, "y": 1.5 },
969 {"label":"k67", "x":20, "y":1.5}, 867 { "matrix": [6, 7], "w": 1, "x": 20, "y": 1.5 },
970 {"label":"k68", "x":21, "y":1.5}, 868 { "matrix": [6, 8], "w": 1, "x": 21, "y": 1.5 },
971 {"label":"k69", "x":22, "y":1.5}, 869 { "matrix": [6, 9], "w": 1, "x": 22, "y": 1.5 },
972 {"label":"k6a", "x":23, "y":1.5}, 870 { "matrix": [6, 10], "w": 1, "x": 23, "y": 1.5 },
973 {"label":"k10", "x":0, "y":2.75}, 871 { "matrix": [1, 0], "w": 1, "x": 0, "y": 2.75 },
974 {"label":"k11", "x":1, "y":2.75}, 872 { "matrix": [1, 1], "w": 1, "x": 1, "y": 2.75 },
975 {"label":"k12", "x":2, "y":2.75}, 873 { "matrix": [1, 2], "w": 1, "x": 2, "y": 2.75 },
976 {"label":"k13", "x":3, "y":2.75}, 874 { "matrix": [1, 3], "w": 1, "x": 3, "y": 2.75 },
977 {"label":"k14", "x":4.5, "y":2.75}, 875 { "matrix": [1, 4], "w": 1, "x": 4.5, "y": 2.75 },
978 {"label":"k15", "x":5.5, "y":2.75}, 876 { "matrix": [1, 5], "w": 1, "x": 5.5, "y": 2.75 },
979 {"label":"k16", "x":6.5, "y":2.75}, 877 { "matrix": [1, 6], "w": 1, "x": 6.5, "y": 2.75 },
980 {"label":"k17", "x":7.5, "y":2.75}, 878 { "matrix": [1, 7], "w": 1, "x": 7.5, "y": 2.75 },
981 {"label":"k18", "x":8.5, "y":2.75}, 879 { "matrix": [1, 8], "w": 1, "x": 8.5, "y": 2.75 },
982 {"label":"k19", "x":9.5, "y":2.75}, 880 { "matrix": [1, 9], "w": 1, "x": 9.5, "y": 2.75 },
983 {"label":"k1a", "x":10.5, "y":2.75}, 881 { "matrix": [1, 10], "w": 1, "x": 10.5, "y": 2.75 },
984 {"label":"k70", "x":11.5, "y":2.75}, 882 { "matrix": [7, 0], "w": 1, "x": 11.5, "y": 2.75 },
985 {"label":"k71", "x":12.5, "y":2.75}, 883 { "matrix": [7, 1], "w": 1, "x": 12.5, "y": 2.75 },
986 {"label":"k72", "x":13.5, "y":2.75}, 884 { "matrix": [7, 2], "w": 1, "x": 13.5, "y": 2.75 },
987 {"label":"k73", "x":14.5, "y":2.75}, 885 { "matrix": [7, 3], "w": 1, "x": 14.5, "y": 2.75 },
988 {"label":"k74", "x":15.5, "y":2.75}, 886 { "matrix": [7, 4], "w": 1, "x": 15.5, "y": 2.75 },
989 {"label":"k75", "x":16.5, "y":2.75}, 887 { "matrix": [7, 5], "w": 1, "x": 16.5, "y": 2.75 },
990 {"label":"k76", "x":17.5, "y":2.75, "w":2}, 888 { "matrix": [7, 6], "w": 2, "x": 17.5, "y": 2.75 },
991 {"label":"k77", "x":20, "y":2.75}, 889 { "matrix": [7, 7], "w": 1, "x": 20, "y": 2.75 },
992 {"label":"k78", "x":21, "y":2.75}, 890 { "matrix": [7, 8], "w": 1, "x": 21, "y": 2.75 },
993 {"label":"k79", "x":22, "y":2.75}, 891 { "matrix": [7, 9], "w": 1, "x": 22, "y": 2.75 },
994 {"label":"k7a", "x":23, "y":2.75}, 892 { "matrix": [7, 10], "w": 1, "x": 23, "y": 2.75 },
995 {"label":"k20", "x":0, "y":3.75, "h":2}, 893 { "h": 2, "matrix": [2, 0], "w": 1, "x": 0, "y": 3.75 },
996 {"label":"k21", "x":1, "y":3.75}, 894 { "matrix": [2, 1], "w": 1, "x": 1, "y": 3.75 },
997 {"label":"k22", "x":2, "y":3.75}, 895 { "matrix": [2, 2], "w": 1, "x": 2, "y": 3.75 },
998 {"label":"k23", "x":3, "y":3.75}, 896 { "matrix": [2, 3], "w": 1, "x": 3, "y": 3.75 },
999 {"label":"k24", "x":4.5, "y":3.75, "w":1.5}, 897 { "matrix": [2, 4], "w": 1.5, "x": 4.5, "y": 3.75 },
1000 {"label":"k25", "x":6, "y":3.75}, 898 { "matrix": [2, 5], "w": 1, "x": 6, "y": 3.75 },
1001 {"label":"k26", "x":7, "y":3.75}, 899 { "matrix": [2, 6], "w": 1, "x": 7, "y": 3.75 },
1002 {"label":"k27", "x":8, "y":3.75}, 900 { "matrix": [2, 7], "w": 1, "x": 8, "y": 3.75 },
1003 {"label":"k28", "x":9, "y":3.75}, 901 { "matrix": [2, 8], "w": 1, "x": 9, "y": 3.75 },
1004 {"label":"k29", "x":10, "y":3.75}, 902 { "matrix": [2, 9], "w": 1, "x": 10, "y": 3.75 },
1005 {"label":"k2a", "x":11, "y":3.75}, 903 { "matrix": [2, 10], "w": 1, "x": 11, "y": 3.75 },
1006 {"label":"k80", "x":12, "y":3.75}, 904 { "matrix": [8, 0], "w": 1, "x": 12, "y": 3.75 },
1007 {"label":"k81", "x":13, "y":3.75}, 905 { "matrix": [8, 1], "w": 1, "x": 13, "y": 3.75 },
1008 {"label":"k82", "x":14, "y":3.75}, 906 { "matrix": [8, 2], "w": 1, "x": 14, "y": 3.75 },
1009 {"label":"k83", "x":15, "y":3.75}, 907 { "matrix": [8, 3], "w": 1, "x": 15, "y": 3.75 },
1010 {"label":"k84", "x":16, "y":3.75}, 908 { "matrix": [8, 4], "w": 1, "x": 16, "y": 3.75 },
1011 {"label":"k85", "x":17, "y":3.75}, 909 { "matrix": [8, 5], "w": 1, "x": 17, "y": 3.75 },
1012 {"label":"k86", "x":18, "y":3.75, "w":1.5}, 910 { "matrix": [8, 6], "w": 1.5, "x": 18, "y": 3.75 },
1013 {"label":"k87", "x":20, "y":3.75}, 911 { "matrix": [8, 7], "w": 1, "x": 20, "y": 3.75 },
1014 {"label":"k88", "x":21, "y":3.75}, 912 { "matrix": [8, 8], "w": 1, "x": 21, "y": 3.75 },
1015 {"label":"k89", "x":22, "y":3.75}, 913 { "matrix": [8, 9], "w": 1, "x": 22, "y": 3.75 },
1016 {"label":"k8a", "x":23, "y":3.75, "h":2}, 914 { "h": 2, "matrix": [8, 10], "w": 1, "x": 23, "y": 3.75 },
1017 {"label":"k31", "x":1, "y":4.75}, 915 { "matrix": [3, 1], "w": 1, "x": 1, "y": 4.75 },
1018 {"label":"k32", "x":2, "y":4.75}, 916 { "matrix": [3, 2], "w": 1, "x": 2, "y": 4.75 },
1019 {"label":"k33", "x":3, "y":4.75}, 917 { "matrix": [3, 3], "w": 1, "x": 3, "y": 4.75 },
1020 {"label":"k34", "x":4.5, "y":4.75, "w":1.75}, 918 { "matrix": [3, 4], "w": 1.75, "x": 4.5, "y": 4.75 },
1021 {"label":"k35", "x":6.25, "y":4.75}, 919 { "matrix": [3, 5], "w": 1, "x": 6.25, "y": 4.75 },
1022 {"label":"k36", "x":7.25, "y":4.75}, 920 { "matrix": [3, 6], "w": 1, "x": 7.25, "y": 4.75 },
1023 {"label":"k37", "x":8.25, "y":4.75}, 921 { "matrix": [3, 7], "w": 1, "x": 8.25, "y": 4.75 },
1024 {"label":"k38", "x":9.25, "y":4.75}, 922 { "matrix": [3, 8], "w": 1, "x": 9.25, "y": 4.75 },
1025 {"label":"k39", "x":10.25, "y":4.75}, 923 { "matrix": [3, 9], "w": 1, "x": 10.25, "y": 4.75 },
1026 {"label":"k3a", "x":11.25, "y":4.75}, 924 { "matrix": [3, 10], "w": 1, "x": 11.25, "y": 4.75 },
1027 {"label":"k90", "x":12.25, "y":4.75}, 925 { "matrix": [9, 0], "w": 1, "x": 12.25, "y": 4.75 },
1028 {"label":"k91", "x":13.25, "y":4.75}, 926 { "matrix": [9, 1], "w": 1, "x": 13.25, "y": 4.75 },
1029 {"label":"k92", "x":14.25, "y":4.75}, 927 { "matrix": [9, 2], "w": 1, "x": 14.25, "y": 4.75 },
1030 {"label":"k93", "x":15.25, "y":4.75}, 928 { "matrix": [9, 3], "w": 1, "x": 15.25, "y": 4.75 },
1031 {"label":"k94", "x":16.25, "y":4.75}, 929 { "matrix": [9, 4], "w": 1, "x": 16.25, "y": 4.75 },
1032 {"label":"k95", "x":17.25, "y":4.75, "w":2.25}, 930 { "matrix": [9, 5], "w": 2.25, "x": 17.25, "y": 4.75 },
1033 {"label":"k97", "x":20, "y":4.75}, 931 { "matrix": [9, 7], "w": 1, "x": 20, "y": 4.75 },
1034 {"label":"k98", "x":21, "y":4.75}, 932 { "matrix": [9, 8], "w": 1, "x": 21, "y": 4.75 },
1035 {"label":"k99", "x":22, "y":4.75}, 933 { "matrix": [9, 9], "w": 1, "x": 22, "y": 4.75 },
1036 {"label":"k40", "x":0, "y":5.75, "h":2}, 934 { "h": 2, "matrix": [4, 0], "w": 1, "x": 0, "y": 5.75 },
1037 {"label":"k41", "x":1, "y":5.75}, 935 { "matrix": [4, 1], "w": 1, "x": 1, "y": 5.75 },
1038 {"label":"k42", "x":2, "y":5.75}, 936 { "matrix": [4, 2], "w": 1, "x": 2, "y": 5.75 },
1039 {"label":"k43", "x":3, "y":5.75}, 937 { "matrix": [4, 3], "w": 1, "x": 3, "y": 5.75 },
1040 {"label":"k44", "x":4.25, "y":6}, 938 { "matrix": [4, 4], "w": 1, "x": 4.25, "y": 6 },
1041 {"label":"k45", "x":5.5, "y":5.75, "w":1.25}, 939 { "matrix": [4, 5], "w": 1.25, "x": 5.5, "y": 5.75 },
1042 {"label":"k46", "x":6.75, "y":5.75}, 940 { "matrix": [4, 6], "w": 1, "x": 6.75, "y": 5.75 },
1043 {"label":"k47", "x":7.75, "y":5.75}, 941 { "matrix": [4, 7], "w": 1, "x": 7.75, "y": 5.75 },
1044 {"label":"k48", "x":8.75, "y":5.75}, 942 { "matrix": [4, 8], "w": 1, "x": 8.75, "y": 5.75 },
1045 {"label":"k49", "x":9.75, "y":5.75}, 943 { "matrix": [4, 9], "w": 1, "x": 9.75, "y": 5.75 },
1046 {"label":"k4a", "x":10.75, "y":5.75}, 944 { "matrix": [4, 10], "w": 1, "x": 10.75, "y": 5.75 },
1047 {"label":"ka0", "x":11.75, "y":5.75}, 945 { "matrix": [10, 0], "w": 1, "x": 11.75, "y": 5.75 },
1048 {"label":"ka1", "x":12.75, "y":5.75}, 946 { "matrix": [10, 1], "w": 1, "x": 12.75, "y": 5.75 },
1049 {"label":"ka2", "x":13.75, "y":5.75}, 947 { "matrix": [10, 2], "w": 1, "x": 13.75, "y": 5.75 },
1050 {"label":"ka3", "x":14.75, "y":5.75}, 948 { "matrix": [10, 3], "w": 1, "x": 14.75, "y": 5.75 },
1051 {"label":"ka4", "x":15.75, "y":5.75}, 949 { "matrix": [10, 4], "w": 1, "x": 15.75, "y": 5.75 },
1052 {"label":"ka5", "x":16.75, "y":5.75, "w":1.75}, 950 { "matrix": [10, 5], "w": 1.75, "x": 16.75, "y": 5.75 },
1053 {"label":"k96", "x":18.75, "y":6}, 951 { "matrix": [9, 6], "w": 1, "x": 18.75, "y": 6 },
1054 {"label":"ka7", "x":20, "y":5.75}, 952 { "matrix": [10, 7], "w": 1, "x": 20, "y": 5.75 },
1055 {"label":"ka8", "x":21, "y":5.75}, 953 { "matrix": [10, 8], "w": 1, "x": 21, "y": 5.75 },
1056 {"label":"ka9", "x":22, "y":5.75}, 954 { "matrix": [10, 9], "w": 1, "x": 22, "y": 5.75 },
1057 {"label":"kaa", "x":23, "y":5.75, "h":2}, 955 { "h": 2, "matrix": [10, 10], "w": 1, "x": 23, "y": 5.75 },
1058 {"label":"k51", "x":1, "y":6.75}, 956 { "matrix": [5, 1], "w": 1, "x": 1, "y": 6.75 },
1059 {"label":"k52", "x":2, "y":6.75}, 957 { "matrix": [5, 2], "w": 1, "x": 2, "y": 6.75 },
1060 {"label":"k53", "x":3.25, "y":7}, 958 { "matrix": [5, 3], "w": 1, "x": 3.25, "y": 7 },
1061 {"label":"k54", "x":4.25, "y":7}, 959 { "matrix": [5, 4], "w": 1, "x": 4.25, "y": 7 },
1062 {"label":"k55", "x":5.25, "y":7}, 960 { "matrix": [5, 5], "w": 1, "x": 5.25, "y": 7 },
1063 {"label":"k56", "x":6.5, "y":6.75}, 961 { "matrix": [5, 6], "w": 1, "x": 6.5, "y": 6.75 },
1064 {"label":"k57", "x":7.5, "y":6.75}, 962 { "matrix": [5, 7], "w": 1, "x": 7.5, "y": 6.75 },
1065 {"label":"kb0", "x":8.5, "y":6.75, "w":7}, 963 { "matrix": [11, 0], "w": 7, "x": 8.5, "y": 6.75 },
1066 {"label":"kb4", "x":15.5, "y":6.75}, 964 { "matrix": [11, 4], "w": 1, "x": 15.5, "y": 6.75 },
1067 {"label":"kb5", "x":16.5, "y":6.75}, 965 { "matrix": [11, 5], "w": 1, "x": 16.5, "y": 6.75 },
1068 {"label":"ka6", "x":17.75, "y":7}, 966 { "matrix": [10, 6], "w": 1, "x": 17.75, "y": 7 },
1069 {"label":"kb6", "x":18.75, "y":7}, 967 { "matrix": [11, 6], "w": 1, "x": 18.75, "y": 7 },
1070 {"label":"kb7", "x":19.75, "y":7}, 968 { "matrix": [11, 7], "w": 1, "x": 19.75, "y": 7 },
1071 {"label":"kb8", "x":21, "y":6.75}, 969 { "matrix": [11, 8], "w": 1, "x": 21, "y": 6.75 },
1072 {"label":"kb9", "x":22, "y":6.75} 970 { "matrix": [11, 9], "w": 1, "x": 22, "y": 6.75 }
1073 ] 971 ]
1074 }, 972 },
1075 "LAYOUT_7u_iso": { 973 "LAYOUT_7u_iso": {
974 "key_count": 125,
975 "layout": [
976 { "matrix": [12, 3], "w": 1, "x": 3, "y": 0 },
977 { "matrix": [12, 4], "w": 1, "x": 4, "y": 0 },
978 { "matrix": [12, 9], "w": 1, "x": 19, "y": 0 },
979 { "matrix": [12, 10], "w": 1, "x": 20, "y": 0 },
980 { "matrix": [0, 0], "w": 1, "x": 0, "y": 1.5 },
981 { "matrix": [0, 1], "w": 1, "x": 1, "y": 1.5 },
982 { "matrix": [0, 2], "w": 1, "x": 2, "y": 1.5 },
983 { "matrix": [0, 3], "w": 1, "x": 3, "y": 1.5 },
984 { "matrix": [0, 4], "w": 1, "x": 4.75, "y": 1.5 },
985 { "matrix": [0, 6], "w": 1, "x": 6.25, "y": 1.5 },
986 { "matrix": [0, 7], "w": 1, "x": 7.25, "y": 1.5 },
987 { "matrix": [0, 8], "w": 1, "x": 8.25, "y": 1.5 },
988 { "matrix": [0, 9], "w": 1, "x": 9.25, "y": 1.5 },
989 { "matrix": [0, 10], "w": 1, "x": 10.75, "y": 1.5 },
990 { "matrix": [6, 0], "w": 1, "x": 11.75, "y": 1.5 },
991 { "matrix": [6, 1], "w": 1, "x": 12.75, "y": 1.5 },
992 { "matrix": [6, 2], "w": 1, "x": 13.75, "y": 1.5 },
993 { "matrix": [6, 3], "w": 1, "x": 15.25, "y": 1.5 },
994 { "matrix": [6, 4], "w": 1, "x": 16.25, "y": 1.5 },
995 { "matrix": [6, 5], "w": 1, "x": 17.25, "y": 1.5 },
996 { "matrix": [6, 6], "w": 1, "x": 18.25, "y": 1.5 },
997 { "matrix": [6, 7], "w": 1, "x": 20, "y": 1.5 },
998 { "matrix": [6, 8], "w": 1, "x": 21, "y": 1.5 },
999 { "matrix": [6, 9], "w": 1, "x": 22, "y": 1.5 },
1000 { "matrix": [6, 10], "w": 1, "x": 23, "y": 1.5 },
1001 { "matrix": [1, 0], "w": 1, "x": 0, "y": 2.75 },
1002 { "matrix": [1, 1], "w": 1, "x": 1, "y": 2.75 },
1003 { "matrix": [1, 2], "w": 1, "x": 2, "y": 2.75 },
1004 { "matrix": [1, 3], "w": 1, "x": 3, "y": 2.75 },
1005 { "matrix": [1, 4], "w": 1, "x": 4.5, "y": 2.75 },
1006 { "matrix": [1, 5], "w": 1, "x": 5.5, "y": 2.75 },
1007 { "matrix": [1, 6], "w": 1, "x": 6.5, "y": 2.75 },
1008 { "matrix": [1, 7], "w": 1, "x": 7.5, "y": 2.75 },
1009 { "matrix": [1, 8], "w": 1, "x": 8.5, "y": 2.75 },
1010 { "matrix": [1, 9], "w": 1, "x": 9.5, "y": 2.75 },
1011 { "matrix": [1, 10], "w": 1, "x": 10.5, "y": 2.75 },
1012 { "matrix": [7, 0], "w": 1, "x": 11.5, "y": 2.75 },
1013 { "matrix": [7, 1], "w": 1, "x": 12.5, "y": 2.75 },
1014 { "matrix": [7, 2], "w": 1, "x": 13.5, "y": 2.75 },
1015 { "matrix": [7, 3], "w": 1, "x": 14.5, "y": 2.75 },
1016 { "matrix": [7, 4], "w": 1, "x": 15.5, "y": 2.75 },
1017 { "matrix": [7, 5], "w": 1, "x": 16.5, "y": 2.75 },
1018 { "matrix": [7, 6], "w": 2, "x": 17.5, "y": 2.75 },
1019 { "matrix": [7, 7], "w": 1, "x": 20, "y": 2.75 },
1020 { "matrix": [7, 8], "w": 1, "x": 21, "y": 2.75 },
1021 { "matrix": [7, 9], "w": 1, "x": 22, "y": 2.75 },
1022 { "matrix": [7, 10], "w": 1, "x": 23, "y": 2.75 },
1023 { "h": 2, "matrix": [2, 0], "w": 1, "x": 0, "y": 3.75 },
1024 { "matrix": [2, 1], "w": 1, "x": 1, "y": 3.75 },
1025 { "matrix": [2, 2], "w": 1, "x": 2, "y": 3.75 },
1026 { "matrix": [2, 3], "w": 1, "x": 3, "y": 3.75 },
1027 { "matrix": [2, 4], "w": 1.5, "x": 4.5, "y": 3.75 },
1028 { "matrix": [2, 5], "w": 1, "x": 6, "y": 3.75 },
1029 { "matrix": [2, 6], "w": 1, "x": 7, "y": 3.75 },
1030 { "matrix": [2, 7], "w": 1, "x": 8, "y": 3.75 },
1031 { "matrix": [2, 8], "w": 1, "x": 9, "y": 3.75 },
1032 { "matrix": [2, 9], "w": 1, "x": 10, "y": 3.75 },
1033 { "matrix": [2, 10], "w": 1, "x": 11, "y": 3.75 },
1034 { "matrix": [8, 0], "w": 1, "x": 12, "y": 3.75 },
1035 { "matrix": [8, 1], "w": 1, "x": 13, "y": 3.75 },
1036 { "matrix": [8, 2], "w": 1, "x": 14, "y": 3.75 },
1037 { "matrix": [8, 3], "w": 1, "x": 15, "y": 3.75 },
1038 { "matrix": [8, 4], "w": 1, "x": 16, "y": 3.75 },
1039 { "matrix": [8, 5], "w": 1, "x": 17, "y": 3.75 },
1040 { "matrix": [8, 7], "w": 1, "x": 20, "y": 3.75 },
1041 { "matrix": [8, 8], "w": 1, "x": 21, "y": 3.75 },
1042 { "matrix": [8, 9], "w": 1, "x": 22, "y": 3.75 },
1043 { "h": 2, "matrix": [8, 10], "w": 1, "x": 23, "y": 3.75 },
1044 { "matrix": [3, 1], "w": 1, "x": 1, "y": 4.75 },
1045 { "matrix": [3, 2], "w": 1, "x": 2, "y": 4.75 },
1046 { "matrix": [3, 3], "w": 1, "x": 3, "y": 4.75 },
1047 { "matrix": [3, 4], "w": 1.75, "x": 4.5, "y": 4.75 },
1048 { "matrix": [3, 5], "w": 1, "x": 6.25, "y": 4.75 },
1049 { "matrix": [3, 6], "w": 1, "x": 7.25, "y": 4.75 },
1050 { "matrix": [3, 7], "w": 1, "x": 8.25, "y": 4.75 },
1051 { "matrix": [3, 8], "w": 1, "x": 9.25, "y": 4.75 },
1052 { "matrix": [3, 9], "w": 1, "x": 10.25, "y": 4.75 },
1053 { "matrix": [3, 10], "w": 1, "x": 11.25, "y": 4.75 },
1054 { "matrix": [9, 0], "w": 1, "x": 12.25, "y": 4.75 },
1055 { "matrix": [9, 1], "w": 1, "x": 13.25, "y": 4.75 },
1056 { "matrix": [9, 2], "w": 1, "x": 14.25, "y": 4.75 },
1057 { "matrix": [9, 3], "w": 1, "x": 15.25, "y": 4.75 },
1058 { "matrix": [9, 4], "w": 1, "x": 16.25, "y": 4.75 },
1059 { "matrix": [9, 10], "w": 1, "x": 17.25, "y": 4.75 },
1060 { "h": 2, "matrix": [9, 5], "w": 1.25, "x": 18.25, "y": 3.75 },
1061 { "matrix": [9, 7], "w": 1, "x": 20, "y": 4.75 },
1062 { "matrix": [9, 8], "w": 1, "x": 21, "y": 4.75 },
1063 { "matrix": [9, 9], "w": 1, "x": 22, "y": 4.75 },
1064 { "h": 2, "matrix": [4, 0], "w": 1, "x": 0, "y": 5.75 },
1065 { "matrix": [4, 1], "w": 1, "x": 1, "y": 5.75 },
1066 { "matrix": [4, 2], "w": 1, "x": 2, "y": 5.75 },
1067 { "matrix": [4, 3], "w": 1, "x": 3, "y": 5.75 },
1068 { "matrix": [4, 4], "w": 1, "x": 4.25, "y": 6 },
1069 { "matrix": [4, 5], "w": 1.25, "x": 5.5, "y": 5.75 },
1070 { "matrix": [4, 6], "w": 1, "x": 6.75, "y": 5.75 },
1071 { "matrix": [4, 7], "w": 1, "x": 7.75, "y": 5.75 },
1072 { "matrix": [4, 8], "w": 1, "x": 8.75, "y": 5.75 },
1073 { "matrix": [4, 9], "w": 1, "x": 9.75, "y": 5.75 },
1074 { "matrix": [4, 10], "w": 1, "x": 10.75, "y": 5.75 },
1075 { "matrix": [10, 0], "w": 1, "x": 11.75, "y": 5.75 },
1076 { "matrix": [10, 1], "w": 1, "x": 12.75, "y": 5.75 },
1077 { "matrix": [10, 2], "w": 1, "x": 13.75, "y": 5.75 },
1078 { "matrix": [10, 3], "w": 1, "x": 14.75, "y": 5.75 },
1079 { "matrix": [10, 4], "w": 1, "x": 15.75, "y": 5.75 },
1080 { "matrix": [10, 5], "w": 1.75, "x": 16.75, "y": 5.75 },
1081 { "matrix": [9, 6], "w": 1, "x": 18.75, "y": 6 },
1082 { "matrix": [10, 7], "w": 1, "x": 20, "y": 5.75 },
1083 { "matrix": [10, 8], "w": 1, "x": 21, "y": 5.75 },
1084 { "matrix": [10, 9], "w": 1, "x": 22, "y": 5.75 },
1085 { "h": 2, "matrix": [10, 10], "w": 1, "x": 23, "y": 5.75 },
1086 { "matrix": [5, 1], "w": 1, "x": 1, "y": 6.75 },
1087 { "matrix": [5, 2], "w": 1, "x": 2, "y": 6.75 },
1088 { "matrix": [5, 3], "w": 1, "x": 3.25, "y": 7 },
1089 { "matrix": [5, 4], "w": 1, "x": 4.25, "y": 7 },
1090 { "matrix": [5, 5], "w": 1, "x": 5.25, "y": 7 },
1091 { "matrix": [5, 6], "w": 1, "x": 6.5, "y": 6.75 },
1092 { "matrix": [5, 7], "w": 1, "x": 7.5, "y": 6.75 },
1093 { "matrix": [11, 0], "w": 7, "x": 8.5, "y": 6.75 },
1094 { "matrix": [11, 4], "w": 1, "x": 15.5, "y": 6.75 },
1095 { "matrix": [11, 5], "w": 1, "x": 16.5, "y": 6.75 },
1096 { "matrix": [10, 6], "w": 1, "x": 17.75, "y": 7 },
1097 { "matrix": [11, 6], "w": 1, "x": 18.75, "y": 7 },
1098 { "matrix": [11, 7], "w": 1, "x": 19.75, "y": 7 },
1099 { "matrix": [11, 8], "w": 1, "x": 21, "y": 6.75 },
1100 { "matrix": [11, 9], "w": 1, "x": 22, "y": 6.75 }
1101 ]
1102 },
1103 "LAYOUT_all": {
1104 "key_count": 132,
1076 "layout": [ 1105 "layout": [
1077 {"label":"e00", "x":3, "y":0}, 1106 { "matrix": [12, 3], "w": 1, "x": 3, "y": 0 },
1078 {"label":"e01", "x":4, "y":0}, 1107 { "matrix": [12, 4], "w": 1, "x": 4, "y": 0 },
1079 {"label":"e02", "x":19, "y":0}, 1108 { "matrix": [12, 9], "w": 1, "x": 19, "y": 0 },
1080 {"label":"e03", "x":20, "y":0}, 1109 { "matrix": [12, 10], "w": 1, "x": 20, "y": 0 },
1081 {"label":"k00", "x":0, "y":1.5}, 1110 { "matrix": [0, 0], "w": 1, "x": 0, "y": 1.5 },
1082 {"label":"k01", "x":1, "y":1.5}, 1111 { "matrix": [0, 1], "w": 1, "x": 1, "y": 1.5 },
1083 {"label":"k02", "x":2, "y":1.5}, 1112 { "matrix": [0, 2], "w": 1, "x": 2, "y": 1.5 },
1084 {"label":"k03", "x":3, "y":1.5}, 1113 { "matrix": [0, 3], "w": 1, "x": 3, "y": 1.5 },
1085 {"label":"k04", "x":4.75, "y":1.5}, 1114 { "matrix": [0, 4], "w": 1, "x": 4.75, "y": 1.5 },
1086 {"label":"k06", "x":6.25, "y":1.5}, 1115 { "matrix": [0, 6], "w": 1, "x": 6.25, "y": 1.5 },
1087 {"label":"k07", "x":7.25, "y":1.5}, 1116 { "matrix": [0, 7], "w": 1, "x": 7.25, "y": 1.5 },
1088 {"label":"k08", "x":8.25, "y":1.5}, 1117 { "matrix": [0, 8], "w": 1, "x": 8.25, "y": 1.5 },
1089 {"label":"k09", "x":9.25, "y":1.5}, 1118 { "matrix": [0, 9], "w": 1, "x": 9.25, "y": 1.5 },
1090 {"label":"k0a", "x":10.75, "y":1.5}, 1119 { "matrix": [0, 10], "w": 1, "x": 10.75, "y": 1.5 },
1091 {"label":"k60", "x":11.75, "y":1.5}, 1120 { "matrix": [6, 0], "w": 1, "x": 11.75, "y": 1.5 },
1092 {"label":"k61", "x":12.75, "y":1.5}, 1121 { "matrix": [6, 1], "w": 1, "x": 12.75, "y": 1.5 },
1093 {"label":"k62", "x":13.75, "y":1.5}, 1122 { "matrix": [6, 2], "w": 1, "x": 13.75, "y": 1.5 },
1094 {"label":"k63", "x":15.25, "y":1.5}, 1123 { "matrix": [6, 3], "w": 1, "x": 15.25, "y": 1.5 },
1095 {"label":"k64", "x":16.25, "y":1.5}, 1124 { "matrix": [6, 4], "w": 1, "x": 16.25, "y": 1.5 },
1096 {"label":"k65", "x":17.25, "y":1.5}, 1125 { "matrix": [6, 5], "w": 1, "x": 17.25, "y": 1.5 },
1097 {"label":"k66", "x":18.25, "y":1.5}, 1126 { "matrix": [6, 6], "w": 1, "x": 18.25, "y": 1.5 },
1098 {"label":"k67", "x":20, "y":1.5}, 1127 { "matrix": [6, 7], "w": 1, "x": 20, "y": 1.5 },
1099 {"label":"k68", "x":21, "y":1.5}, 1128 { "matrix": [6, 8], "w": 1, "x": 21, "y": 1.5 },
1100 {"label":"k69", "x":22, "y":1.5}, 1129 { "matrix": [6, 9], "w": 1, "x": 22, "y": 1.5 },
1101 {"label":"k6a", "x":23, "y":1.5}, 1130 { "matrix": [6, 10], "w": 1, "x": 23, "y": 1.5 },
1102 {"label":"k10", "x":0, "y":2.75}, 1131 { "matrix": [1, 0], "w": 1, "x": 0, "y": 2.75 },
1103 {"label":"k11", "x":1, "y":2.75}, 1132 { "matrix": [1, 1], "w": 1, "x": 1, "y": 2.75 },
1104 {"label":"k12", "x":2, "y":2.75}, 1133 { "matrix": [1, 2], "w": 1, "x": 2, "y": 2.75 },
1105 {"label":"k13", "x":3, "y":2.75}, 1134 { "matrix": [1, 3], "w": 1, "x": 3, "y": 2.75 },
1106 {"label":"k14", "x":4.5, "y":2.75}, 1135 { "matrix": [1, 4], "w": 1, "x": 4.5, "y": 2.75 },
1107 {"label":"k15", "x":5.5, "y":2.75}, 1136 { "matrix": [1, 5], "w": 1, "x": 5.5, "y": 2.75 },
1108 {"label":"k16", "x":6.5, "y":2.75}, 1137 { "matrix": [1, 6], "w": 1, "x": 6.5, "y": 2.75 },
1109 {"label":"k17", "x":7.5, "y":2.75}, 1138 { "matrix": [1, 7], "w": 1, "x": 7.5, "y": 2.75 },
1110 {"label":"k18", "x":8.5, "y":2.75}, 1139 { "matrix": [1, 8], "w": 1, "x": 8.5, "y": 2.75 },
1111 {"label":"k19", "x":9.5, "y":2.75}, 1140 { "matrix": [1, 9], "w": 1, "x": 9.5, "y": 2.75 },
1112 {"label":"k1a", "x":10.5, "y":2.75}, 1141 { "matrix": [1, 10], "w": 1, "x": 10.5, "y": 2.75 },
1113 {"label":"k70", "x":11.5, "y":2.75}, 1142 { "matrix": [7, 0], "w": 1, "x": 11.5, "y": 2.75 },
1114 {"label":"k71", "x":12.5, "y":2.75}, 1143 { "matrix": [7, 1], "w": 1, "x": 12.5, "y": 2.75 },
1115 {"label":"k72", "x":13.5, "y":2.75}, 1144 { "matrix": [7, 2], "w": 1, "x": 13.5, "y": 2.75 },
1116 {"label":"k73", "x":14.5, "y":2.75}, 1145 { "matrix": [7, 3], "w": 1, "x": 14.5, "y": 2.75 },
1117 {"label":"k74", "x":15.5, "y":2.75}, 1146 { "matrix": [7, 4], "w": 1, "x": 15.5, "y": 2.75 },
1118 {"label":"k75", "x":16.5, "y":2.75}, 1147 { "matrix": [7, 5], "w": 1, "x": 16.5, "y": 2.75 },
1119 {"label":"k76", "x":17.5, "y":2.75, "w":2}, 1148 { "matrix": [7, 6], "w": 2, "x": 17.5, "y": 2.75 },
1120 {"label":"k77", "x":20, "y":2.75}, 1149 { "matrix": [7, 7], "w": 1, "x": 20, "y": 2.75 },
1121 {"label":"k78", "x":21, "y":2.75}, 1150 { "matrix": [7, 8], "w": 1, "x": 21, "y": 2.75 },
1122 {"label":"k79", "x":22, "y":2.75}, 1151 { "matrix": [7, 9], "w": 1, "x": 22, "y": 2.75 },
1123 {"label":"k7a", "x":23, "y":2.75}, 1152 { "matrix": [7, 10], "w": 1, "x": 23, "y": 2.75 },
1124 {"label":"k20", "x":0, "y":3.75, "h":2}, 1153 { "h": 2, "matrix": [2, 0], "w": 1, "x": 0, "y": 3.75 },
1125 {"label":"k21", "x":1, "y":3.75}, 1154 { "matrix": [2, 1], "w": 1, "x": 1, "y": 3.75 },
1126 {"label":"k22", "x":2, "y":3.75}, 1155 { "matrix": [2, 2], "w": 1, "x": 2, "y": 3.75 },
1127 {"label":"k23", "x":3, "y":3.75}, 1156 { "matrix": [2, 3], "w": 1, "x": 3, "y": 3.75 },
1128 {"label":"k24", "x":4.5, "y":3.75, "w":1.5}, 1157 { "matrix": [2, 4], "w": 1.5, "x": 4.5, "y": 3.75 },
1129 {"label":"k25", "x":6, "y":3.75}, 1158 { "matrix": [2, 5], "w": 1, "x": 6, "y": 3.75 },
1130 {"label":"k26", "x":7, "y":3.75}, 1159 { "matrix": [2, 6], "w": 1, "x": 7, "y": 3.75 },
1131 {"label":"k27", "x":8, "y":3.75}, 1160 { "matrix": [2, 7], "w": 1, "x": 8, "y": 3.75 },
1132 {"label":"k28", "x":9, "y":3.75}, 1161 { "matrix": [2, 8], "w": 1, "x": 9, "y": 3.75 },
1133 {"label":"k29", "x":10, "y":3.75}, 1162 { "matrix": [2, 9], "w": 1, "x": 10, "y": 3.75 },
1134 {"label":"k2a", "x":11, "y":3.75}, 1163 { "matrix": [2, 10], "w": 1, "x": 11, "y": 3.75 },
1135 {"label":"k80", "x":12, "y":3.75}, 1164 { "matrix": [8, 0], "w": 1, "x": 12, "y": 3.75 },
1136 {"label":"k81", "x":13, "y":3.75}, 1165 { "matrix": [8, 1], "w": 1, "x": 13, "y": 3.75 },
1137 {"label":"k82", "x":14, "y":3.75}, 1166 { "matrix": [8, 2], "w": 1, "x": 14, "y": 3.75 },
1138 {"label":"k83", "x":15, "y":3.75}, 1167 { "matrix": [8, 3], "w": 1, "x": 15, "y": 3.75 },
1139 {"label":"k84", "x":16, "y":3.75}, 1168 { "matrix": [8, 4], "w": 1, "x": 16, "y": 3.75 },
1140 {"label":"k85", "x":17, "y":3.75}, 1169 { "matrix": [8, 5], "w": 1, "x": 17, "y": 3.75 },
1141 {"label":"k87", "x":20, "y":3.75}, 1170 { "matrix": [8, 6], "w": 1.5, "x": 18, "y": 3.75 },
1142 {"label":"k88", "x":21, "y":3.75}, 1171 { "matrix": [8, 7], "w": 1, "x": 20, "y": 3.75 },
1143 {"label":"k89", "x":22, "y":3.75}, 1172 { "matrix": [8, 8], "w": 1, "x": 21, "y": 3.75 },
1144 {"label":"k8a", "x":23, "y":3.75, "h":2}, 1173 { "matrix": [8, 9], "w": 1, "x": 22, "y": 3.75 },
1145 {"label":"k31", "x":1, "y":4.75}, 1174 { "h": 2, "matrix": [8, 10], "w": 1, "x": 23, "y": 3.75 },
1146 {"label":"k32", "x":2, "y":4.75}, 1175 { "matrix": [3, 1], "w": 1, "x": 1, "y": 4.75 },
1147 {"label":"k33", "x":3, "y":4.75}, 1176 { "matrix": [3, 2], "w": 1, "x": 2, "y": 4.75 },
1148 {"label":"k34", "x":4.5, "y":4.75, "w":1.75}, 1177 { "matrix": [3, 3], "w": 1, "x": 3, "y": 4.75 },
1149 {"label":"k35", "x":6.25, "y":4.75}, 1178 { "matrix": [3, 4], "w": 1.75, "x": 4.5, "y": 4.75 },
1150 {"label":"k36", "x":7.25, "y":4.75}, 1179 { "matrix": [3, 5], "w": 1, "x": 6.25, "y": 4.75 },
1151 {"label":"k37", "x":8.25, "y":4.75}, 1180 { "matrix": [3, 6], "w": 1, "x": 7.25, "y": 4.75 },
1152 {"label":"k38", "x":9.25, "y":4.75}, 1181 { "matrix": [3, 7], "w": 1, "x": 8.25, "y": 4.75 },
1153 {"label":"k39", "x":10.25, "y":4.75}, 1182 { "matrix": [3, 8], "w": 1, "x": 9.25, "y": 4.75 },
1154 {"label":"k3a", "x":11.25, "y":4.75}, 1183 { "matrix": [3, 9], "w": 1, "x": 10.25, "y": 4.75 },
1155 {"label":"k90", "x":12.25, "y":4.75}, 1184 { "matrix": [3, 10], "w": 1, "x": 11.25, "y": 4.75 },
1156 {"label":"k91", "x":13.25, "y":4.75}, 1185 { "matrix": [9, 0], "w": 1, "x": 12.25, "y": 4.75 },
1157 {"label":"k92", "x":14.25, "y":4.75}, 1186 { "matrix": [9, 1], "w": 1, "x": 13.25, "y": 4.75 },
1158 {"label":"k93", "x":15.25, "y":4.75}, 1187 { "matrix": [9, 2], "w": 1, "x": 14.25, "y": 4.75 },
1159 {"label":"k94", "x":16.25, "y":4.75}, 1188 { "matrix": [9, 3], "w": 1, "x": 15.25, "y": 4.75 },
1160 {"label":"k9a", "x":17.25, "y":4.75}, 1189 { "matrix": [9, 4], "w": 1, "x": 16.25, "y": 4.75 },
1161 {"label":"k95", "x":18.25, "y":3.75, "w":1.25, "h":2}, 1190 { "matrix": [9, 10], "w": 1, "x": 17.25, "y": 4.75 },
1162 {"label":"k97", "x":20, "y":4.75}, 1191 { "matrix": [9, 5], "w": 1.25, "x": 18.25, "y": 4.75 },
1163 {"label":"k98", "x":21, "y":4.75}, 1192 { "matrix": [9, 7], "w": 1, "x": 20, "y": 4.75 },
1164 {"label":"k99", "x":22, "y":4.75}, 1193 { "matrix": [9, 8], "w": 1, "x": 21, "y": 4.75 },
1165 {"label":"k40", "x":0, "y":5.75, "h":2}, 1194 { "matrix": [9, 9], "w": 1, "x": 22, "y": 4.75 },
1166 {"label":"k41", "x":1, "y":5.75}, 1195 { "h": 2, "matrix": [4, 0], "w": 1, "x": 0, "y": 5.75 },
1167 {"label":"k42", "x":2, "y":5.75}, 1196 { "matrix": [4, 1], "w": 1, "x": 1, "y": 5.75 },
1168 {"label":"k43", "x":3, "y":5.75}, 1197 { "matrix": [4, 2], "w": 1, "x": 2, "y": 5.75 },
1169 {"label":"k44", "x":4.25, "y":6}, 1198 { "matrix": [4, 3], "w": 1, "x": 3, "y": 5.75 },
1170 {"label":"k45", "x":5.5, "y":5.75, "w":1.25}, 1199 { "matrix": [4, 4], "w": 1, "x": 4.25, "y": 6 },
1171 {"label":"k46", "x":6.75, "y":5.75}, 1200 { "matrix": [4, 5], "w": 1.25, "x": 5.5, "y": 5.75 },
1172 {"label":"k47", "x":7.75, "y":5.75}, 1201 { "matrix": [4, 6], "w": 1, "x": 6.75, "y": 5.75 },
1173 {"label":"k48", "x":8.75, "y":5.75}, 1202 { "matrix": [4, 7], "w": 1, "x": 7.75, "y": 5.75 },
1174 {"label":"k49", "x":9.75, "y":5.75}, 1203 { "matrix": [4, 8], "w": 1, "x": 8.75, "y": 5.75 },
1175 {"label":"k4a", "x":10.75, "y":5.75}, 1204 { "matrix": [4, 9], "w": 1, "x": 9.75, "y": 5.75 },
1176 {"label":"ka0", "x":11.75, "y":5.75}, 1205 { "matrix": [4, 10], "w": 1, "x": 10.75, "y": 5.75 },
1177 {"label":"ka1", "x":12.75, "y":5.75}, 1206 { "matrix": [10, 0], "w": 1, "x": 11.75, "y": 5.75 },
1178 {"label":"ka2", "x":13.75, "y":5.75}, 1207 { "matrix": [10, 1], "w": 1, "x": 12.75, "y": 5.75 },
1179 {"label":"ka3", "x":14.75, "y":5.75}, 1208 { "matrix": [10, 2], "w": 1, "x": 13.75, "y": 5.75 },
1180 {"label":"ka4", "x":15.75, "y":5.75}, 1209 { "matrix": [10, 3], "w": 1, "x": 14.75, "y": 5.75 },
1181 {"label":"ka5", "x":16.75, "y":5.75, "w":1.75}, 1210 { "matrix": [10, 4], "w": 1, "x": 15.75, "y": 5.75 },
1182 {"label":"k96", "x":18.75, "y":6}, 1211 { "matrix": [10, 5], "w": 1.75, "x": 16.75, "y": 5.75 },
1183 {"label":"ka7", "x":20, "y":5.75}, 1212 { "matrix": [9, 6], "w": 1, "x": 18.75, "y": 6 },
1184 {"label":"ka8", "x":21, "y":5.75}, 1213 { "matrix": [10, 7], "w": 1, "x": 20, "y": 5.75 },
1185 {"label":"ka9", "x":22, "y":5.75}, 1214 { "matrix": [10, 8], "w": 1, "x": 21, "y": 5.75 },
1186 {"label":"kaa", "x":23, "y":5.75, "h":2}, 1215 { "matrix": [10, 9], "w": 1, "x": 22, "y": 5.75 },
1187 {"label":"k51", "x":1, "y":6.75}, 1216 { "h": 2, "matrix": [10, 10], "w": 1, "x": 23, "y": 5.75 },
1188 {"label":"k52", "x":2, "y":6.75}, 1217 { "matrix": [5, 1], "w": 1, "x": 1, "y": 6.75 },
1189 {"label":"k53", "x":3.25, "y":7}, 1218 { "matrix": [5, 2], "w": 1, "x": 2, "y": 6.75 },
1190 {"label":"k54", "x":4.25, "y":7}, 1219 { "matrix": [5, 3], "w": 1, "x": 3.25, "y": 7 },
1191 {"label":"k55", "x":5.25, "y":7}, 1220 { "matrix": [5, 4], "w": 1, "x": 4.25, "y": 7 },
1192 {"label":"k56", "x":6.5, "y":6.75}, 1221 { "matrix": [5, 5], "w": 1, "x": 5.25, "y": 7 },
1193 {"label":"k57", "x":7.5, "y":6.75}, 1222 { "matrix": [5, 6], "w": 1, "x": 6.5, "y": 6.75 },
1194 {"label":"kb0", "x":8.5, "y":6.75, "w":7}, 1223 { "matrix": [5, 7], "w": 1, "x": 7.5, "y": 6.75 },
1195 {"label":"kb4", "x":15.5, "y":6.75}, 1224 { "matrix": [5, 8], "w": 1, "x": 8.5, "y": 6.75 },
1196 {"label":"kb5", "x":16.5, "y":6.75}, 1225 { "matrix": [5, 9], "w": 1, "x": 9.5, "y": 6.75 },
1197 {"label":"ka6", "x":17.75, "y":7}, 1226 { "matrix": [5, 10], "w": 1, "x": 10.5, "y": 6.75 },
1198 {"label":"kb6", "x":18.75, "y":7}, 1227 { "matrix": [11, 0], "w": 1, "x": 11.5, "y": 6.75 },
1199 {"label":"kb7", "x":19.75, "y":7}, 1228 { "matrix": [11, 1], "w": 1, "x": 12.5, "y": 6.75 },
1200 {"label":"kb8", "x":21, "y":6.75}, 1229 { "matrix": [11, 2], "w": 1, "x": 13.5, "y": 6.75 },
1201 {"label":"kb9", "x":22, "y":6.75} 1230 { "matrix": [11, 3], "w": 1, "x": 14.5, "y": 6.75 },
1231 { "matrix": [11, 4], "w": 1, "x": 15.5, "y": 6.75 },
1232 { "matrix": [11, 5], "w": 1, "x": 16.5, "y": 6.75 },
1233 { "matrix": [10, 6], "w": 1, "x": 17.75, "y": 7 },
1234 { "matrix": [11, 6], "w": 1, "x": 18.75, "y": 7 },
1235 { "matrix": [11, 7], "w": 1, "x": 19.75, "y": 7 },
1236 { "matrix": [11, 8], "w": 1, "x": 21, "y": 6.75 },
1237 { "matrix": [11, 9], "w": 1, "x": 22, "y": 6.75 }
1202 ] 1238 ]
1203 } 1239 }
1204 } 1240 }
diff --git a/keyboards/clueboard/2x1800/2019/keymaps/default/keymap.json b/keyboards/clueboard/2x1800/2019/keymaps/default/keymap.json
index f5d901ab6..3a60ce9c8 100644
--- a/keyboards/clueboard/2x1800/2019/keymaps/default/keymap.json
+++ b/keyboards/clueboard/2x1800/2019/keymaps/default/keymap.json
@@ -1,7 +1,7 @@
1{ 1{
2 "keyboard":"clueboard/2x1800/2019", 2 "keyboard":"clueboard/2x1800/2019",
3 "keymap":"default", 3 "keymap":"default",
4 "layout":"LAYOUT", 4 "layout":"LAYOUT_all",
5 "layers":[ 5 "layers":[
6 ["ENC_BTN1","ENC_BTN2","ENC_BTN3","ENC_BTN4","KC_HOME","KC_END","KC_PGUP","KC_PGDN","KC_ESC","KC_F1","KC_F2","KC_F3","KC_F4","KC_F5","KC_F6","KC_F7","KC_F8","KC_F9","KC_F10","KC_F11","KC_F12","KC_PSCR","KC_SLCK","KC_PAUS","KC_INS","KC_PMNS","KC_NLCK","KC_PSLS","KC_PAST","KC_GRV","KC_1","KC_2","KC_3","KC_4","KC_5","KC_6","KC_7","KC_8","KC_9","KC_0","KC_MINS","KC_EQL","KC_BSPC","KC_NLCK","KC_PSLS","KC_PAST","KC_PMNS","KC_PPLS","KC_P7","KC_P8","KC_P9","KC_TAB","KC_Q","KC_W","KC_E","KC_R","KC_T","KC_Y","KC_U","KC_I","KC_O","KC_P","KC_LBRC","KC_RBRC","KC_BSLS","KC_P7","KC_P8","KC_P9","KC_PSLS","KC_P4","KC_P5","KC_P6","KC_CAPS","KC_A","KC_S","KC_D","KC_F","KC_G","KC_H","KC_J","KC_K","KC_L","KC_SCLN","KC_QUOT","KC_NUHS","KC_ENT","KC_P4","KC_P5","KC_P6","KC_PENT","KC_P1","KC_P2","KC_P3","KC_UP","KC_LSFT","KC_Z","KC_X","KC_C","KC_V","KC_B","KC_N","KC_M","KC_SLSH","KC_COMM","KC_DOT","KC_RSFT","KC_UP","KC_P1","KC_P2","KC_P3","KC_PENT","KC_P0","KC_PDOT","KC_LEFT","KC_DOWN","KC_RGHT","KC_LCTL","KC_LGUI","KC_LALT","KC_SPC","KC_SPC","KC_SPC","KC_SPC","KC_RALT","KC_RGUI","KC_APP","KC_RCTL","KC_LEFT","KC_DOWN","KC_RGHT","KC_P0","KC_PDOT"] 6 ["ENC_BTN1","ENC_BTN2","ENC_BTN3","ENC_BTN4","KC_HOME","KC_END","KC_PGUP","KC_PGDN","KC_ESC","KC_F1","KC_F2","KC_F3","KC_F4","KC_F5","KC_F6","KC_F7","KC_F8","KC_F9","KC_F10","KC_F11","KC_F12","KC_PSCR","KC_SLCK","KC_PAUS","KC_INS","KC_PMNS","KC_NLCK","KC_PSLS","KC_PAST","KC_GRV","KC_1","KC_2","KC_3","KC_4","KC_5","KC_6","KC_7","KC_8","KC_9","KC_0","KC_MINS","KC_EQL","KC_BSPC","KC_NLCK","KC_PSLS","KC_PAST","KC_PMNS","KC_PPLS","KC_P7","KC_P8","KC_P9","KC_TAB","KC_Q","KC_W","KC_E","KC_R","KC_T","KC_Y","KC_U","KC_I","KC_O","KC_P","KC_LBRC","KC_RBRC","KC_BSLS","KC_P7","KC_P8","KC_P9","KC_PSLS","KC_P4","KC_P5","KC_P6","KC_CAPS","KC_A","KC_S","KC_D","KC_F","KC_G","KC_H","KC_J","KC_K","KC_L","KC_SCLN","KC_QUOT","KC_NUHS","KC_ENT","KC_P4","KC_P5","KC_P6","KC_PENT","KC_P1","KC_P2","KC_P3","KC_UP","KC_LSFT","KC_Z","KC_X","KC_C","KC_V","KC_B","KC_N","KC_M","KC_SLSH","KC_COMM","KC_DOT","KC_RSFT","KC_UP","KC_P1","KC_P2","KC_P3","KC_PENT","KC_P0","KC_PDOT","KC_LEFT","KC_DOWN","KC_RGHT","KC_LCTL","KC_LGUI","KC_LALT","KC_SPC","KC_SPC","KC_SPC","KC_SPC","KC_RALT","KC_RGUI","KC_APP","KC_RCTL","KC_LEFT","KC_DOWN","KC_RGHT","KC_P0","KC_PDOT"]
7 ], 7 ],
diff --git a/keyboards/clueboard/2x1800/2019/rules.mk b/keyboards/clueboard/2x1800/2019/rules.mk
index dcad3ec90..c421eb862 100644
--- a/keyboards/clueboard/2x1800/2019/rules.mk
+++ b/keyboards/clueboard/2x1800/2019/rules.mk
@@ -10,16 +10,3 @@ MCU = at90usb1286
10# ATmega32A bootloadHID 10# ATmega32A bootloadHID
11# ATmega328P USBasp 11# ATmega328P USBasp
12BOOTLOADER = halfkay 12BOOTLOADER = halfkay
13
14# Build Options
15BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration
16MOUSEKEY_ENABLE = yes # Mouse keys
17EXTRAKEY_ENABLE = yes # Audio control and System control
18CONSOLE_ENABLE = yes # Console for debug
19COMMAND_ENABLE = yes # Commands for debug and configuration
20ENCODER_ENABLE = yes # Rotary encoder (knob) support
21NKRO_ENABLE = yes # USB Nkey Rollover
22MIDI_ENABLE = no # MIDI support
23UNICODE_ENABLE = no # Unicode
24RGBLIGHT_ENABLE = yes # RGB on pin C5
25AUDIO_ENABLE = yes # Audio output on pin C4 and B7
diff --git a/keyboards/clueboard/2x1800/info.json b/keyboards/clueboard/2x1800/info.json
index 785743a30..55207e2b4 100644
--- a/keyboards/clueboard/2x1800/info.json
+++ b/keyboards/clueboard/2x1800/info.json
@@ -1,5 +1,4 @@
1{ 1{
2 "keyboard_name": "Clueboard 2x1800", 2 "diode_direction": "ROW2COL",
3 "url": "", 3 "width": 24
4 "maintainer": "skullydazed"
5} 4}
diff --git a/keyboards/clueboard/60/60.h b/keyboards/clueboard/60/60.h
index 713f0d42b..0345f419f 100644
--- a/keyboards/clueboard/60/60.h
+++ b/keyboards/clueboard/60/60.h
@@ -18,91 +18,4 @@
18 18
19#include "quantum.h" 19#include "quantum.h"
20 20
21/*
22 * These are shortcuts to help you work with the various layout options. If your
23 * keymap works with one of the LAYOUT_...() macros you are encouraged to use that
24 * and to contribute your keymap to the corresponding layout in
25 * `qmk_firmware/layouts/community`.
26 */
27
28/* The fully-featured LAYOUT_all() that has every single key available in the matrix.
29 */
30#define LAYOUT_all(\
31 k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, k0c, k0d, k0e, \
32 k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, k1e, \
33 k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c, k2e, \
34 k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, k3c, k3e, \
35 k40, k41, k42, k47, k4a, k4b, k4c, k4e \
36) { \
37 { k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, k0c, k0d, k0e, }, \
38 { k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, KC_NO, k1e, }, \
39 { k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c, KC_NO, k2e, }, \
40 { k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, k3c, KC_NO, k3e, }, \
41 { k40, k41, k42, KC_NO, KC_NO, KC_NO, KC_NO, k47, KC_NO, KC_NO, k4a, k4b, k4c, KC_NO, k4e, }, \
42}
43
44/* A layout that matches the Apple Extended Keyboard's main area. No split keys,
45 * 3 mods on either side of the spacebar.
46 */
47#define LAYOUT_aek(\
48 k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, k0c, k0e, \
49 k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, k1e, \
50 k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2e, \
51 k30, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, k3c, \
52 k40, k41, k42, k47, k4b, k4c, k4e \
53) { \
54 { k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, k0c, KC_NO, k0e, }, \
55 { k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, KC_NO, k1e, }, \
56 { k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, KC_NO, KC_NO, k2e, }, \
57 { k30, KC_NO, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, k3c, KC_NO, KC_NO, }, \
58 { k40, k41, k42, KC_NO, KC_NO, KC_NO, KC_NO, k47, KC_NO, KC_NO, KC_NO, k4b, k4c, KC_NO, k4e, }, \
59}
60
61/* Standard 60% ANSI layout */
62#define LAYOUT_60_ansi(\
63 k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, k0c, k0e, \
64 k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, k1e, \
65 k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2e, \
66 k30, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, k3c, \
67 k40, k41, k42, k47, k4a, k4b, k4c, k4e \
68) { \
69 { k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, k0c, KC_NO, k0e, }, \
70 { k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, KC_NO, k1e, }, \
71 { k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, KC_NO, KC_NO, k2e, }, \
72 { k30, KC_NO, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, k3c, KC_NO, KC_NO, }, \
73 { k40, k41, k42, KC_NO, KC_NO, KC_NO, KC_NO, k47, KC_NO, KC_NO, k4a, k4b, k4c, KC_NO, k4e, }, \
74}
75
76/* Standard 60% ISO layout */
77#define LAYOUT_60_iso(\
78 k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, k0c, k0e, \
79 k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, \
80 k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c, k2e, \
81 k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, k3c, \
82 k40, k41, k42, k47, k4a, k4b, k4c, k4e \
83) { \
84 { k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, k0c, KC_NO, k0e, }, \
85 { k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, KC_NO, KC_NO, }, \
86 { k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2c, KC_NO, k2e, }, \
87 { k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, k3c, KC_NO, KC_NO, }, \
88 { k40, k41, k42, KC_NO, KC_NO, KC_NO, KC_NO, k47, KC_NO, KC_NO, k4a, k4b, k4c, KC_NO, k4e, }, \
89}
90
91/* Split Backspace and Right Shift ANSI layout. */
92#define LAYOUT_60_ansi_split_bs_rshift(\
93 k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, k0c, k0d, k0e, \
94 k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, k1e, \
95 k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, k2e, \
96 k30, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, k3c, k3e, \
97 k40, k41, k42, k47, k4a, k4b, k4c, k4e \
98) { \
99 { k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0a, k0b, k0c, k0d, k0e, }, \
100 { k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1a, k1b, k1c, KC_NO, k1e, }, \
101 { k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2a, k2b, KC_NO, KC_NO, k2e, }, \
102 { k30, KC_NO, k32, k33, k34, k35, k36, k37, k38, k39, k3a, k3b, k3c, KC_NO, k3e, }, \
103 { k40, k41, k42, KC_NO, KC_NO, KC_NO, KC_NO, k47, KC_NO, KC_NO, k4a, k4b, k4c, KC_NO, k4e, }, \
104}
105
106#define LAYOUT LAYOUT_all
107#define KEYMAP LAYOUT_all
108#endif 21#endif
diff --git a/keyboards/clueboard/60/config.h b/keyboards/clueboard/60/config.h
index 3f54d0a9d..1ca9d9844 100644
--- a/keyboards/clueboard/60/config.h
+++ b/keyboards/clueboard/60/config.h
@@ -19,110 +19,12 @@
19 19
20#include "config_common.h" 20#include "config_common.h"
21 21
22/* USB Device descriptor parameter */
23#define VENDOR_ID 0xC1ED
24#define PRODUCT_ID 0x2350
25#define DEVICE_VER 0x0001
26#define MANUFACTURER Clueboard
27#define PRODUCT Clueboard 60%
28#define DESCRIPTION Clueboard 60%
29
30/* Address for jumping to bootloader on STM32 chips. */ 22/* Address for jumping to bootloader on STM32 chips. */
31/* It is chip dependent, the correct number can be looked up here: 23/* It is chip dependent, the correct number can be looked up here:
32 * http://www.st.com/web/en/resource/technical/document/application_note/CD00167594.pdf 24 * http://www.st.com/web/en/resource/technical/document/application_note/CD00167594.pdf
33 */ 25 */
34#define STM32_BOOTLOADER_ADDRESS 0x1FFFD800 26#define STM32_BOOTLOADER_ADDRESS 0x1FFFD800
35 27
36/* key matrix size */
37#define MATRIX_ROWS 5
38#define MATRIX_COLS 15
39
40/*
41 * Keyboard Matrix Assignments
42 *
43 * COLS: Pins used for columns, left to right
44 * ROWS: Pins used for rows, top to bottom
45 * DIODE_DIRECTION: COL2ROW = COL = Anode (+), ROW = Cathode (-, marked on diode)
46 * ROW2COL = ROW = Anode (+), COL = Cathode (-, marked on diode)
47 *
48*/
49#define MATRIX_ROW_PINS { B0, B1, B2, A15, A10 }
50#define MATRIX_COL_PINS { A2, A3, A6, B14, B15, A8, A9, A7, B3, B4, C15, C14, C13, B5, B6 }
51#define UNUSED_PINS { A0, A1, A9, B7, B8, B9, B10, B11, B12, B13 }
52#define DIODE_DIRECTION COL2ROW
53
54/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */
55#define DEBOUNCE 6
56
57/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
58//#define LOCKING_SUPPORT_ENABLE
59/* Locking resynchronize hack */
60//#define LOCKING_RESYNC_ENABLE
61
62/*
63 * Force NKRO
64 *
65 * Force NKRO (nKey Rollover) to be enabled by default, regardless of the saved
66 * state in the bootmagic EEPROM settings. (Note that NKRO must be enabled in the
67 * makefile for this to work.)
68 *
69 * If forced on, NKRO can be disabled via magic key (default = LShift+RShift+N)
70 * until the next keyboard reset.
71 *
72 * NKRO may prevent your keystrokes from being detected in the BIOS, but it is
73 * fully operational during normal computer usage.
74 *
75 * For a less heavy-handed approach, enable NKRO via magic key (LShift+RShift+N)
76 * or via bootmagic (hold SPACE+N while plugging in the keyboard). Once set by
77 * bootmagic, NKRO mode will always be enabled until it is toggled again during a
78 * power-up.
79 *
80 */
81//#define FORCE_NKRO
82
83/*
84 * Feature disable options
85 * These options are also useful to firmware size reduction.
86 */
87
88/* disable debug print */
89//#define NO_DEBUG
90
91/* disable print */
92//#define NO_PRINT
93
94/* disable action features */
95//#define NO_ACTION_LAYER
96//#define NO_ACTION_TAPPING
97//#define NO_ACTION_ONESHOT
98//#define NO_ACTION_MACRO
99//#define NO_ACTION_FUNCTION
100
101/*
102 * MIDI options
103 */
104
105/* Prevent use of disabled MIDI features in the keymap */
106//#define MIDI_ENABLE_STRICT 1
107
108/* enable basic MIDI features:
109 - MIDI notes can be sent when in Music mode is on
110*/
111//#define MIDI_BASIC
112
113/* enable advanced MIDI features:
114 - MIDI notes can be added to the keymap
115 - Octave shift and transpose
116 - Virtual sustain, portamento, and modulation wheel
117 - etc.
118*/
119//#define MIDI_ADVANCED
120
121/* override number of MIDI tone keycodes (each octave adds 12 keycodes and allocates 12 bytes) */
122//#define MIDI_TONE_KEYCODE_OCTAVES 1
123
124#define LED_CAPS_LOCK_PIN B7
125
126/* Backlight configuration 28/* Backlight configuration
127 */ 29 */
128#define BACKLIGHT_LEVELS 1 30#define BACKLIGHT_LEVELS 1
diff --git a/keyboards/clueboard/60/info.json b/keyboards/clueboard/60/info.json
index aed18b6f0..1df0512ad 100644
--- a/keyboards/clueboard/60/info.json
+++ b/keyboards/clueboard/60/info.json
@@ -1,58 +1,373 @@
1{ 1{
2 "keyboard_name": "clueboard/60", 2 "manufacturer": "Clueboard",
3 "keyboard_name": "Clueboard 60%",
3 "maintainer": "skullydazed", 4 "maintainer": "skullydazed",
4 "url": "",
5 "width": 15,
6 "height": 5, 5 "height": 5,
6 "width": 15,
7 "debounce": "6",
8 "diode_direction": "COL2ROW",
9 "features": {
10 "audio": true,
11 "backlight": false,
12 "bootmagic": false,
13 "command": false,
14 "console": true,
15 "extrakey": true,
16 "mousekey": true,
17 "nkro": true
18 },
19 "indicators": {
20 "caps_lock": "B7"
21 },
22 "matrix_pins": {
23 "cols": ["A2", "A3", "A6", "B14", "B15", "A8", "A9", "A7", "B3", "B4", "C15", "C14", "C13", "B5", "B6"],
24 "rows": ["B0", "B1", "B2", "A15", "A10"]
25 },
26 "usb": {
27 "device_ver": "0x0001",
28 "pid": "0x2350",
29 "vid": "0xC1ED"
30 },
31 "community_layouts": ["60_ansi", "60_ansi_split_bs_rshift", "60_iso"],
32 "layout_aliases": {
33 "KEYMAP": "LAYOUT_all",
34 "LAYOUT": "LAYOUT_all"
35 },
7 "layouts": { 36 "layouts": {
8 "LAYOUT_60_ansi": { 37 "LAYOUT_60_ansi": {
9 "key_count": 61, 38 "key_count": 61,
10 "layout": [ 39 "layout": [
11 {"label": "~", "x": 0, "y": 0}, {"label": "!", "x": 1, "y": 0}, {"label": "@", "x": 2, "y": 0}, {"label": "#", "x": 3, "y": 0}, {"label": "$", "x": 4, "y": 0}, {"label": "%", "x": 5, "y": 0}, {"label": "^", "x": 6, "y": 0}, {"label": "&", "x": 7, "y": 0}, {"label": "*", "x": 8, "y": 0}, {"label": "(", "x": 9, "y": 0}, {"label": ")", "x": 10, "y": 0}, {"label": "_", "x": 11, "y": 0}, {"label": "+", "x": 12, "y": 0}, {"label": "Backspace", "x": 13, "y": 0, "w": 2}, 40 { "label": "~", "matrix": [0, 0], "w": 1, "x": 0, "y": 0 },
12 {"label": "Tab", "x": 0, "y": 1, "w": 1.5}, {"label": "Q", "x": 1.5, "y": 1}, {"label": "W", "x": 2.5, "y": 1}, {"label": "E", "x": 3.5, "y": 1}, {"label": "R", "x": 4.5, "y": 1}, {"label": "T", "x": 5.5, "y": 1}, {"label": "Y", "x": 6.5, "y": 1}, {"label": "U", "x": 7.5, "y": 1}, {"label": "I", "x": 8.5, "y": 1}, {"label": "O", "x": 9.5, "y": 1}, {"label": "P", "x": 10.5, "y": 1}, {"label": "{", "x": 11.5, "y": 1}, {"label": "}", "x": 12.5, "y": 1}, {"label": "|", "x": 13.5, "y": 1, "w": 1.5}, 41 { "label": "!", "matrix": [0, 1], "w": 1, "x": 1, "y": 0 },
13 {"label": "Caps Lock", "x": 0, "y": 2, "w": 1.75}, {"label": "A", "x": 1.75, "y": 2}, {"label": "S", "x": 2.75, "y": 2}, {"label": "D", "x": 3.75, "y": 2}, {"label": "F", "x": 4.75, "y": 2}, {"label": "G", "x": 5.75, "y": 2}, {"label": "H", "x": 6.75, "y": 2}, {"label": "J", "x": 7.75, "y": 2}, {"label": "K", "x": 8.75, "y": 2}, {"label": "L", "x": 9.75, "y": 2}, {"label": ":", "x": 10.75, "y": 2}, {"label": "\"", "x": 11.75, "y": 2}, {"label": "Enter", "x": 12.75, "y": 2, "w": 2.25}, 42 { "label": "@", "matrix": [0, 2], "w": 1, "x": 2, "y": 0 },
14 {"label": "Shift", "x": 0, "y": 3, "w": 2.25}, {"label": "Z", "x": 2.25, "y": 3}, {"label": "X", "x": 3.25, "y": 3}, {"label": "C", "x": 4.25, "y": 3}, {"label": "V", "x": 5.25, "y": 3}, {"label": "B", "x": 6.25, "y": 3}, {"label": "N", "x": 7.25, "y": 3}, {"label": "M", "x": 8.25, "y": 3}, {"label": "<", "x": 9.25, "y": 3}, {"label": ">", "x": 10.25, "y": 3}, {"label": "?", "x": 11.25, "y": 3}, {"label": "Shift", "x": 12.25, "y": 3, "w": 2.75}, 43 { "label": "#", "matrix": [0, 3], "w": 1, "x": 3, "y": 0 },
15 {"label": "Ctrl", "x": 0, "y": 4, "w": 1.25}, {"label": "Win", "x": 1.25, "y": 4, "w": 1.25}, {"label": "Alt", "x": 2.5, "y": 4, "w": 1.25}, {"x": 3.75, "y": 4, "w": 6.25}, {"label": "Alt", "x": 10, "y": 4, "w": 1.25}, {"label": "Win", "x": 11.25, "y": 4, "w": 1.25}, {"label": "Menu", "x": 12.5, "y": 4, "w": 1.25}, {"label": "Ctrl", "x": 13.75, "y": 4, "w": 1.25 } 44 { "label": "$", "matrix": [0, 4], "w": 1, "x": 4, "y": 0 },
45 { "label": "%", "matrix": [0, 5], "w": 1, "x": 5, "y": 0 },
46 { "label": "^", "matrix": [0, 6], "w": 1, "x": 6, "y": 0 },
47 { "label": "&", "matrix": [0, 7], "w": 1, "x": 7, "y": 0 },
48 { "label": "*", "matrix": [0, 8], "w": 1, "x": 8, "y": 0 },
49 { "label": "(", "matrix": [0, 9], "w": 1, "x": 9, "y": 0 },
50 { "label": ")", "matrix": [0, 10], "w": 1, "x": 10, "y": 0 },
51 { "label": "_", "matrix": [0, 11], "w": 1, "x": 11, "y": 0 },
52 { "label": "+", "matrix": [0, 12], "w": 1, "x": 12, "y": 0 },
53 { "label": "Backspace", "matrix": [0, 14], "w": 2, "x": 13, "y": 0 },
54 { "label": "Tab", "matrix": [1, 0], "w": 1.5, "x": 0, "y": 1 },
55 { "label": "Q", "matrix": [1, 1], "w": 1, "x": 1.5, "y": 1 },
56 { "label": "W", "matrix": [1, 2], "w": 1, "x": 2.5, "y": 1 },
57 { "label": "E", "matrix": [1, 3], "w": 1, "x": 3.5, "y": 1 },
58 { "label": "R", "matrix": [1, 4], "w": 1, "x": 4.5, "y": 1 },
59 { "label": "T", "matrix": [1, 5], "w": 1, "x": 5.5, "y": 1 },
60 { "label": "Y", "matrix": [1, 6], "w": 1, "x": 6.5, "y": 1 },
61 { "label": "U", "matrix": [1, 7], "w": 1, "x": 7.5, "y": 1 },
62 { "label": "I", "matrix": [1, 8], "w": 1, "x": 8.5, "y": 1 },
63 { "label": "O", "matrix": [1, 9], "w": 1, "x": 9.5, "y": 1 },
64 { "label": "P", "matrix": [1, 10], "w": 1, "x": 10.5, "y": 1 },
65 { "label": "{", "matrix": [1, 11], "w": 1, "x": 11.5, "y": 1 },
66 { "label": "}", "matrix": [1, 12], "w": 1, "x": 12.5, "y": 1 },
67 { "label": "|", "matrix": [1, 14], "w": 1.5, "x": 13.5, "y": 1 },
68 { "label": "Caps Lock", "matrix": [2, 0], "w": 1.75, "x": 0, "y": 2 },
69 { "label": "A", "matrix": [2, 1], "w": 1, "x": 1.75, "y": 2 },
70 { "label": "S", "matrix": [2, 2], "w": 1, "x": 2.75, "y": 2 },
71 { "label": "D", "matrix": [2, 3], "w": 1, "x": 3.75, "y": 2 },
72 { "label": "F", "matrix": [2, 4], "w": 1, "x": 4.75, "y": 2 },
73 { "label": "G", "matrix": [2, 5], "w": 1, "x": 5.75, "y": 2 },
74 { "label": "H", "matrix": [2, 6], "w": 1, "x": 6.75, "y": 2 },
75 { "label": "J", "matrix": [2, 7], "w": 1, "x": 7.75, "y": 2 },
76 { "label": "K", "matrix": [2, 8], "w": 1, "x": 8.75, "y": 2 },
77 { "label": "L", "matrix": [2, 9], "w": 1, "x": 9.75, "y": 2 },
78 { "label": ":", "matrix": [2, 10], "w": 1, "x": 10.75, "y": 2 },
79 { "label": "\"", "matrix": [2, 11], "w": 1, "x": 11.75, "y": 2 },
80 { "label": "Enter", "matrix": [2, 14], "w": 2.25, "x": 12.75, "y": 2 },
81 { "label": "Shift", "matrix": [3, 0], "w": 2.25, "x": 0, "y": 3 },
82 { "label": "Z", "matrix": [3, 2], "w": 1, "x": 2.25, "y": 3 },
83 { "label": "X", "matrix": [3, 3], "w": 1, "x": 3.25, "y": 3 },
84 { "label": "C", "matrix": [3, 4], "w": 1, "x": 4.25, "y": 3 },
85 { "label": "V", "matrix": [3, 5], "w": 1, "x": 5.25, "y": 3 },
86 { "label": "B", "matrix": [3, 6], "w": 1, "x": 6.25, "y": 3 },
87 { "label": "N", "matrix": [3, 7], "w": 1, "x": 7.25, "y": 3 },
88 { "label": "M", "matrix": [3, 8], "w": 1, "x": 8.25, "y": 3 },
89 { "label": "<", "matrix": [3, 9], "w": 1, "x": 9.25, "y": 3 },
90 { "label": ">", "matrix": [3, 10], "w": 1, "x": 10.25, "y": 3 },
91 { "label": "?", "matrix": [3, 11], "w": 1, "x": 11.25, "y": 3 },
92 { "label": "Shift", "matrix": [3, 12], "w": 2.75, "x": 12.25, "y": 3 },
93 { "label": "Ctrl", "matrix": [4, 0], "w": 1.25, "x": 0, "y": 4 },
94 { "label": "Win", "matrix": [4, 1], "w": 1.25, "x": 1.25, "y": 4 },
95 { "label": "Alt", "matrix": [4, 2], "w": 1.25, "x": 2.5, "y": 4 },
96 { "label": "k47", "matrix": [4, 7], "w": 6.25, "x": 3.75, "y": 4 },
97 { "label": "Alt", "matrix": [4, 10], "w": 1.25, "x": 10, "y": 4 },
98 { "label": "Win", "matrix": [4, 11], "w": 1.25, "x": 11.25, "y": 4 },
99 { "label": "Menu", "matrix": [4, 12], "w": 1.25, "x": 12.5, "y": 4 },
100 { "label": "Ctrl", "matrix": [4, 14], "w": 1.25, "x": 13.75, "y": 4 }
101 ]
102 },
103 "LAYOUT_60_ansi_split_bs_rshift": {
104 "key_count": 63,
105 "layout": [
106 { "label": "~", "matrix": [0, 0], "w": 1, "x": 0, "y": 0 },
107 { "label": "!", "matrix": [0, 1], "w": 1, "x": 1, "y": 0 },
108 { "label": "@", "matrix": [0, 2], "w": 1, "x": 2, "y": 0 },
109 { "label": "#", "matrix": [0, 3], "w": 1, "x": 3, "y": 0 },
110 { "label": "$", "matrix": [0, 4], "w": 1, "x": 4, "y": 0 },
111 { "label": "%", "matrix": [0, 5], "w": 1, "x": 5, "y": 0 },
112 { "label": "^", "matrix": [0, 6], "w": 1, "x": 6, "y": 0 },
113 { "label": "&", "matrix": [0, 7], "w": 1, "x": 7, "y": 0 },
114 { "label": "*", "matrix": [0, 8], "w": 1, "x": 8, "y": 0 },
115 { "label": "(", "matrix": [0, 9], "w": 1, "x": 9, "y": 0 },
116 { "label": ")", "matrix": [0, 10], "w": 1, "x": 10, "y": 0 },
117 { "label": "_", "matrix": [0, 11], "w": 1, "x": 11, "y": 0 },
118 { "label": "+", "matrix": [0, 12], "w": 1, "x": 12, "y": 0 },
119 { "label": "k0d", "matrix": [0, 13], "w": 1, "x": 13, "y": 0 },
120 { "label": "Back", "matrix": [0, 14], "w": 1, "x": 14, "y": 0 },
121 { "label": "Tab", "matrix": [1, 0], "w": 1.5, "x": 0, "y": 1 },
122 { "label": "Q", "matrix": [1, 1], "w": 1, "x": 1.5, "y": 1 },
123 { "label": "W", "matrix": [1, 2], "w": 1, "x": 2.5, "y": 1 },
124 { "label": "E", "matrix": [1, 3], "w": 1, "x": 3.5, "y": 1 },
125 { "label": "R", "matrix": [1, 4], "w": 1, "x": 4.5, "y": 1 },
126 { "label": "T", "matrix": [1, 5], "w": 1, "x": 5.5, "y": 1 },
127 { "label": "Y", "matrix": [1, 6], "w": 1, "x": 6.5, "y": 1 },
128 { "label": "U", "matrix": [1, 7], "w": 1, "x": 7.5, "y": 1 },
129 { "label": "I", "matrix": [1, 8], "w": 1, "x": 8.5, "y": 1 },
130 { "label": "O", "matrix": [1, 9], "w": 1, "x": 9.5, "y": 1 },
131 { "label": "P", "matrix": [1, 10], "w": 1, "x": 10.5, "y": 1 },
132 { "label": "{", "matrix": [1, 11], "w": 1, "x": 11.5, "y": 1 },
133 { "label": "}", "matrix": [1, 12], "w": 1, "x": 12.5, "y": 1 },
134 { "label": "|", "matrix": [1, 14], "w": 1.5, "x": 13.5, "y": 1 },
135 { "label": "Caps Lock", "matrix": [2, 0], "w": 1.75, "x": 0, "y": 2 },
136 { "label": "A", "matrix": [2, 1], "w": 1, "x": 1.75, "y": 2 },
137 { "label": "S", "matrix": [2, 2], "w": 1, "x": 2.75, "y": 2 },
138 { "label": "D", "matrix": [2, 3], "w": 1, "x": 3.75, "y": 2 },
139 { "label": "F", "matrix": [2, 4], "w": 1, "x": 4.75, "y": 2 },
140 { "label": "G", "matrix": [2, 5], "w": 1, "x": 5.75, "y": 2 },
141 { "label": "H", "matrix": [2, 6], "w": 1, "x": 6.75, "y": 2 },
142 { "label": "J", "matrix": [2, 7], "w": 1, "x": 7.75, "y": 2 },
143 { "label": "K", "matrix": [2, 8], "w": 1, "x": 8.75, "y": 2 },
144 { "label": "L", "matrix": [2, 9], "w": 1, "x": 9.75, "y": 2 },
145 { "label": ":", "matrix": [2, 10], "w": 1, "x": 10.75, "y": 2 },
146 { "label": "\"", "matrix": [2, 11], "w": 1, "x": 11.75, "y": 2 },
147 { "label": "Enter", "matrix": [2, 14], "w": 2.25, "x": 12.75, "y": 2 },
148 { "label": "Shift", "matrix": [3, 0], "w": 2.25, "x": 0, "y": 3 },
149 { "label": "Z", "matrix": [3, 2], "w": 1, "x": 2.25, "y": 3 },
150 { "label": "X", "matrix": [3, 3], "w": 1, "x": 3.25, "y": 3 },
151 { "label": "C", "matrix": [3, 4], "w": 1, "x": 4.25, "y": 3 },
152 { "label": "V", "matrix": [3, 5], "w": 1, "x": 5.25, "y": 3 },
153 { "label": "B", "matrix": [3, 6], "w": 1, "x": 6.25, "y": 3 },
154 { "label": "N", "matrix": [3, 7], "w": 1, "x": 7.25, "y": 3 },
155 { "label": "M", "matrix": [3, 8], "w": 1, "x": 8.25, "y": 3 },
156 { "label": "<", "matrix": [3, 9], "w": 1, "x": 9.25, "y": 3 },
157 { "label": ">", "matrix": [3, 10], "w": 1, "x": 10.25, "y": 3 },
158 { "label": "?", "matrix": [3, 11], "w": 1, "x": 11.25, "y": 3 },
159 { "label": "Shift", "matrix": [3, 12], "w": 1.75, "x": 12.25, "y": 3 },
160 { "label": "k3e", "matrix": [3, 14], "w": 1, "x": 14, "y": 3 },
161 { "label": "Ctrl", "matrix": [4, 0], "w": 1.25, "x": 0, "y": 4 },
162 { "label": "Win", "matrix": [4, 1], "w": 1.25, "x": 1.25, "y": 4 },
163 { "label": "Alt", "matrix": [4, 2], "w": 1.25, "x": 2.5, "y": 4 },
164 { "label": "k47", "matrix": [4, 7], "w": 6.25, "x": 3.75, "y": 4 },
165 { "label": "Alt", "matrix": [4, 10], "w": 1.25, "x": 10, "y": 4 },
166 { "label": "Win", "matrix": [4, 11], "w": 1.25, "x": 11.25, "y": 4 },
167 { "label": "Menu", "matrix": [4, 12], "w": 1.25, "x": 12.5, "y": 4 },
168 { "label": "Ctrl", "matrix": [4, 14], "w": 1.25, "x": 13.75, "y": 4 }
16 ] 169 ]
17 }, 170 },
18 "LAYOUT_60_iso": { 171 "LAYOUT_60_iso": {
19 "key_count": 62, 172 "key_count": 62,
20 "layout": [ 173 "layout": [
21 {"label": "\\u00ac", "x": 0, "y": 0}, {"label": "!", "x": 1, "y": 0}, {"label": "\"", "x": 2, "y": 0}, {"label": "\\u00a3", "x": 3, "y": 0}, {"label": "$", "x": 4, "y": 0}, {"label": "%", "x": 5, "y": 0}, {"label": "^", "x": 6, "y": 0}, {"label": "&", "x": 7, "y": 0}, {"label": "*", "x": 8, "y": 0}, {"label": "(", "x": 9, "y": 0}, {"label": ")", "x": 10, "y": 0}, {"label": "_", "x": 11, "y": 0}, {"label": "+", "x": 12, "y": 0}, {"label": "Backspace", "x": 13, "y": 0, "w": 2}, 174 { "label": "\\u00ac", "matrix": [0, 0], "w": 1, "x": 0, "y": 0 },
22 {"label": "Tab", "x": 0, "y": 1, "w": 1.5}, {"label": "Q", "x": 1.5, "y": 1}, {"label": "W", "x": 2.5, "y": 1}, {"label": "E", "x": 3.5, "y": 1}, {"label": "R", "x": 4.5, "y": 1}, {"label": "T", "x": 5.5, "y": 1}, {"label": "Y", "x": 6.5, "y": 1}, {"label": "U", "x": 7.5, "y": 1}, {"label": "I", "x": 8.5, "y": 1}, {"label": "O", "x": 9.5, "y": 1}, {"label": "P", "x": 10.5, "y": 1}, {"label": "{", "x": 11.5, "y": 1}, {"label": "}", "x": 12.5, "y": 1}, {"label": "Enter", "x": 13.75, "y": 1, "w": 1.25, "h": 2}, 175 { "label": "!", "matrix": [0, 1], "w": 1, "x": 1, "y": 0 },
23 {"label": "Caps Lock", "x": 0, "y": 2, "w": 1.75}, {"label": "A", "x": 1.75, "y": 2}, {"label": "S", "x": 2.75, "y": 2}, {"label": "D", "x": 3.75, "y": 2}, {"label": "F", "x": 4.75, "y": 2}, {"label": "G", "x": 5.75, "y": 2}, {"label": "H", "x": 6.75, "y": 2}, {"label": "J", "x": 7.75, "y": 2}, {"label": "K", "x": 8.75, "y": 2}, {"label": "L", "x": 9.75, "y": 2}, {"label": ":", "x": 10.75, "y": 2}, {"label": "@", "x": 11.75, "y": 2}, {"label": "~", "x": 12.75, "y": 2}, 176 { "label": "\"", "matrix": [0, 2], "w": 1, "x": 2, "y": 0 },
24 {"label": "Shift", "x": 0, "y": 3, "w": 1.25}, {"label": "|", "x": 1.25, "y": 3}, {"label": "Z", "x": 2.25, "y": 3}, {"label": "X", "x": 3.25, "y": 3}, {"label": "C", "x": 4.25, "y": 3}, {"label": "V", "x": 5.25, "y": 3}, {"label": "B", "x": 6.25, "y": 3}, {"label": "N", "x": 7.25, "y": 3}, {"label": "M", "x": 8.25, "y": 3}, {"label": "<", "x": 9.25, "y": 3}, {"label": ">", "x": 10.25, "y": 3}, {"label": "?", "x": 11.25, "y": 3}, {"label": "Shift", "x": 12.25, "y": 3, "w": 2.75}, 177 { "label": "\\u00a3", "matrix": [0, 3], "w": 1, "x": 3, "y": 0 },
25 {"label": "Ctrl", "x": 0, "y": 4, "w": 1.25}, {"label": "Win", "x": 1.25, "y": 4, "w": 1.25}, {"label": "Alt", "x": 2.5, "y": 4, "w": 1.25}, {"x": 3.75, "y": 4, "w": 6.25}, {"label": "AltGr", "x": 10, "y": 4, "w": 1.25}, {"label": "Win", "x": 11.25, "y": 4, "w": 1.25}, {"label": "Menu", "x": 12.5, "y": 4, "w": 1.25}, {"label": "Ctrl", "x": 13.75, "y": 4, "w": 1.25 } 178 { "label": "$", "matrix": [0, 4], "w": 1, "x": 4, "y": 0 },
179 { "label": "%", "matrix": [0, 5], "w": 1, "x": 5, "y": 0 },
180 { "label": "^", "matrix": [0, 6], "w": 1, "x": 6, "y": 0 },
181 { "label": "&", "matrix": [0, 7], "w": 1, "x": 7, "y": 0 },
182 { "label": "*", "matrix": [0, 8], "w": 1, "x": 8, "y": 0 },
183 { "label": "(", "matrix": [0, 9], "w": 1, "x": 9, "y": 0 },
184 { "label": ")", "matrix": [0, 10], "w": 1, "x": 10, "y": 0 },
185 { "label": "_", "matrix": [0, 11], "w": 1, "x": 11, "y": 0 },
186 { "label": "+", "matrix": [0, 12], "w": 1, "x": 12, "y": 0 },
187 { "label": "Backspace", "matrix": [0, 14], "w": 2, "x": 13, "y": 0 },
188 { "label": "Tab", "matrix": [1, 0], "w": 1.5, "x": 0, "y": 1 },
189 { "label": "Q", "matrix": [1, 1], "w": 1, "x": 1.5, "y": 1 },
190 { "label": "W", "matrix": [1, 2], "w": 1, "x": 2.5, "y": 1 },
191 { "label": "E", "matrix": [1, 3], "w": 1, "x": 3.5, "y": 1 },
192 { "label": "R", "matrix": [1, 4], "w": 1, "x": 4.5, "y": 1 },
193 { "label": "T", "matrix": [1, 5], "w": 1, "x": 5.5, "y": 1 },
194 { "label": "Y", "matrix": [1, 6], "w": 1, "x": 6.5, "y": 1 },
195 { "label": "U", "matrix": [1, 7], "w": 1, "x": 7.5, "y": 1 },
196 { "label": "I", "matrix": [1, 8], "w": 1, "x": 8.5, "y": 1 },
197 { "label": "O", "matrix": [1, 9], "w": 1, "x": 9.5, "y": 1 },
198 { "label": "P", "matrix": [1, 10], "w": 1, "x": 10.5, "y": 1 },
199 { "label": "{", "matrix": [1, 11], "w": 1, "x": 11.5, "y": 1 },
200 { "label": "}", "matrix": [1, 12], "w": 1, "x": 12.5, "y": 1 },
201 { "h": 2, "label": "Enter", "matrix": [2, 0], "w": 1.25, "x": 13.75, "y": 1 },
202 { "label": "Caps Lock", "matrix": [2, 1], "w": 1.75, "x": 0, "y": 2 },
203 { "label": "A", "matrix": [2, 2], "w": 1, "x": 1.75, "y": 2 },
204 { "label": "S", "matrix": [2, 3], "w": 1, "x": 2.75, "y": 2 },
205 { "label": "D", "matrix": [2, 4], "w": 1, "x": 3.75, "y": 2 },
206 { "label": "F", "matrix": [2, 5], "w": 1, "x": 4.75, "y": 2 },
207 { "label": "G", "matrix": [2, 6], "w": 1, "x": 5.75, "y": 2 },
208 { "label": "H", "matrix": [2, 7], "w": 1, "x": 6.75, "y": 2 },
209 { "label": "J", "matrix": [2, 8], "w": 1, "x": 7.75, "y": 2 },
210 { "label": "K", "matrix": [2, 9], "w": 1, "x": 8.75, "y": 2 },
211 { "label": "L", "matrix": [2, 10], "w": 1, "x": 9.75, "y": 2 },
212 { "label": ":", "matrix": [2, 11], "w": 1, "x": 10.75, "y": 2 },
213 { "label": "@", "matrix": [2, 12], "w": 1, "x": 11.75, "y": 2 },
214 { "label": "~", "matrix": [2, 14], "w": 1, "x": 12.75, "y": 2 },
215 { "label": "Shift", "matrix": [3, 0], "w": 1.25, "x": 0, "y": 3 },
216 { "label": "|", "matrix": [3, 1], "w": 1, "x": 1.25, "y": 3 },
217 { "label": "Z", "matrix": [3, 2], "w": 1, "x": 2.25, "y": 3 },
218 { "label": "X", "matrix": [3, 3], "w": 1, "x": 3.25, "y": 3 },
219 { "label": "C", "matrix": [3, 4], "w": 1, "x": 4.25, "y": 3 },
220 { "label": "V", "matrix": [3, 5], "w": 1, "x": 5.25, "y": 3 },
221 { "label": "B", "matrix": [3, 6], "w": 1, "x": 6.25, "y": 3 },
222 { "label": "N", "matrix": [3, 7], "w": 1, "x": 7.25, "y": 3 },
223 { "label": "M", "matrix": [3, 8], "w": 1, "x": 8.25, "y": 3 },
224 { "label": "<", "matrix": [3, 9], "w": 1, "x": 9.25, "y": 3 },
225 { "label": ">", "matrix": [3, 10], "w": 1, "x": 10.25, "y": 3 },
226 { "label": "?", "matrix": [3, 11], "w": 1, "x": 11.25, "y": 3 },
227 { "label": "Shift", "matrix": [3, 12], "w": 2.75, "x": 12.25, "y": 3 },
228 { "label": "Ctrl", "matrix": [4, 0], "w": 1.25, "x": 0, "y": 4 },
229 { "label": "Win", "matrix": [4, 1], "w": 1.25, "x": 1.25, "y": 4 },
230 { "label": "Alt", "matrix": [4, 2], "w": 1.25, "x": 2.5, "y": 4 },
231 { "label": "k47", "matrix": [4, 7], "w": 6.25, "x": 3.75, "y": 4 },
232 { "label": "AltGr", "matrix": [4, 10], "w": 1.25, "x": 10, "y": 4 },
233 { "label": "Win", "matrix": [4, 11], "w": 1.25, "x": 11.25, "y": 4 },
234 { "label": "Menu", "matrix": [4, 12], "w": 1.25, "x": 12.5, "y": 4 },
235 { "label": "Ctrl", "matrix": [4, 14], "w": 1.25, "x": 13.75, "y": 4 }
26 ] 236 ]
27 }, 237 },
28 "LAYOUT_aek": { 238 "LAYOUT_aek": {
29 "key_count": 60, 239 "key_count": 60,
30 "layout": [ 240 "layout": [
31 {"label": "~", "x": 0, "y": 0}, {"label": "!", "x": 1, "y": 0}, {"label": "@", "x": 2, "y": 0}, {"label": "#", "x": 3, "y": 0}, {"label": "$", "x": 4, "y": 0}, {"label": "%", "x": 5, "y": 0}, {"label": "^", "x": 6, "y": 0}, {"label": "&", "x": 7, "y": 0}, {"label": "*", "x": 8, "y": 0}, {"label": "(", "x": 9, "y": 0}, {"label": ")", "x": 10, "y": 0}, {"label": "_", "x": 11, "y": 0}, {"label": "+", "x": 12, "y": 0}, {"label": "Backspace", "x": 13, "y": 0, "w": 2}, 241 { "label": "~", "matrix": [0, 0], "w": 1, "x": 0, "y": 0 },
32 {"label": "Tab", "x": 0, "y": 1, "w": 1.5}, {"label": "Q", "x": 1.5, "y": 1}, {"label": "W", "x": 2.5, "y": 1}, {"label": "E", "x": 3.5, "y": 1}, {"label": "R", "x": 4.5, "y": 1}, {"label": "T", "x": 5.5, "y": 1}, {"label": "Y", "x": 6.5, "y": 1}, {"label": "U", "x": 7.5, "y": 1}, {"label": "I", "x": 8.5, "y": 1}, {"label": "O", "x": 9.5, "y": 1}, {"label": "P", "x": 10.5, "y": 1}, {"label": "{", "x": 11.5, "y": 1}, {"label": "}", "x": 12.5, "y": 1}, {"label": "|", "x": 13.5, "y": 1, "w": 1.5}, 242 { "label": "!", "matrix": [0, 1], "w": 1, "x": 1, "y": 0 },
33 {"label": "Caps Lock", "x": 0, "y": 2, "w": 1.75}, {"label": "A", "x": 1.75, "y": 2}, {"label": "S", "x": 2.75, "y": 2}, {"label": "D", "x": 3.75, "y": 2}, {"label": "F", "x": 4.75, "y": 2}, {"label": "G", "x": 5.75, "y": 2}, {"label": "H", "x": 6.75, "y": 2}, {"label": "J", "x": 7.75, "y": 2}, {"label": "K", "x": 8.75, "y": 2}, {"label": "L", "x": 9.75, "y": 2}, {"label": ":", "x": 10.75, "y": 2}, {"label": "\"", "x": 11.75, "y": 2}, {"label": "Enter", "x": 12.75, "y": 2, "w": 2.25}, 243 { "label": "@", "matrix": [0, 2], "w": 1, "x": 2, "y": 0 },
34 {"label": "Shift", "x": 0, "y": 3, "w": 2.25}, {"label": "Z", "x": 2.25, "y": 3}, {"label": "X", "x": 3.25, "y": 3}, {"label": "C", "x": 4.25, "y": 3}, {"label": "V", "x": 5.25, "y": 3}, {"label": "B", "x": 6.25, "y": 3}, {"label": "N", "x": 7.25, "y": 3}, {"label": "M", "x": 8.25, "y": 3}, {"label": "<", "x": 9.25, "y": 3}, {"label": ">", "x": 10.25, "y": 3}, {"label": "?", "x": 11.25, "y": 3}, {"label": "Shift", "x": 12.25, "y": 3, "w": 2.75}, 244 { "label": "#", "matrix": [0, 3], "w": 1, "x": 3, "y": 0 },
35 {"label": "Ctrl", "x": 0, "y": 4, "w": 1.5}, {"label": "Win", "x": 1.5, "y": 4, "w": 1.25}, {"label": "Alt", "x": 2.75, "y": 4, "w": 1.5}, {"x": 4.25, "y": 4, "w": 6.5}, {"label": "AltGr", "x": 10.75, "y": 4, "w": 1.5}, {"label": "Win", "x": 12.25, "y": 4, "w": 1.25}, {"label": "Ctrl", "x": 13.5, "y": 4, "w": 1.5 } 245 { "label": "$", "matrix": [0, 4], "w": 1, "x": 4, "y": 0 },
246 { "label": "%", "matrix": [0, 5], "w": 1, "x": 5, "y": 0 },
247 { "label": "^", "matrix": [0, 6], "w": 1, "x": 6, "y": 0 },
248 { "label": "&", "matrix": [0, 7], "w": 1, "x": 7, "y": 0 },
249 { "label": "*", "matrix": [0, 8], "w": 1, "x": 8, "y": 0 },
250 { "label": "(", "matrix": [0, 9], "w": 1, "x": 9, "y": 0 },
251 { "label": ")", "matrix": [0, 10], "w": 1, "x": 10, "y": 0 },
252 { "label": "_", "matrix": [0, 11], "w": 1, "x": 11, "y": 0 },
253 { "label": "+", "matrix": [0, 12], "w": 1, "x": 12, "y": 0 },
254 { "label": "Backspace", "matrix": [0, 14], "w": 2, "x": 13, "y": 0 },
255 { "label": "Tab", "matrix": [1, 0], "w": 1.5, "x": 0, "y": 1 },
256 { "label": "Q", "matrix": [1, 1], "w": 1, "x": 1.5, "y": 1 },
257 { "label": "W", "matrix": [1, 2], "w": 1, "x": 2.5, "y": 1 },
258 { "label": "E", "matrix": [1, 3], "w": 1, "x": 3.5, "y": 1 },
259 { "label": "R", "matrix": [1, 4], "w": 1, "x": 4.5, "y": 1 },
260 { "label": "T", "matrix": [1, 5], "w": 1, "x": 5.5, "y": 1 },
261 { "label": "Y", "matrix": [1, 6], "w": 1, "x": 6.5, "y": 1 },
262 { "label": "U", "matrix": [1, 7], "w": 1, "x": 7.5, "y": 1 },
263 { "label": "I", "matrix": [1, 8], "w": 1, "x": 8.5, "y": 1 },
264 { "label": "O", "matrix": [1, 9], "w": 1, "x": 9.5, "y": 1 },
265 { "label": "P", "matrix": [1, 10], "w": 1, "x": 10.5, "y": 1 },
266 { "label": "{", "matrix": [1, 11], "w": 1, "x": 11.5, "y": 1 },
267 { "label": "}", "matrix": [1, 12], "w": 1, "x": 12.5, "y": 1 },
268 { "label": "|", "matrix": [1, 14], "w": 1.5, "x": 13.5, "y": 1 },
269 { "label": "Caps Lock", "matrix": [2, 0], "w": 1.75, "x": 0, "y": 2 },
270 { "label": "A", "matrix": [2, 1], "w": 1, "x": 1.75, "y": 2 },
271 { "label": "S", "matrix": [2, 2], "w": 1, "x": 2.75, "y": 2 },
272 { "label": "D", "matrix": [2, 3], "w": 1, "x": 3.75, "y": 2 },
273 { "label": "F", "matrix": [2, 4], "w": 1, "x": 4.75, "y": 2 },
274 { "label": "G", "matrix": [2, 5], "w": 1, "x": 5.75, "y": 2 },
275 { "label": "H", "matrix": [2, 6], "w": 1, "x": 6.75, "y": 2 },
276 { "label": "J", "matrix": [2, 7], "w": 1, "x": 7.75, "y": 2 },
277 { "label": "K", "matrix": [2, 8], "w": 1, "x": 8.75, "y": 2 },
278 { "label": "L", "matrix": [2, 9], "w": 1, "x": 9.75, "y": 2 },
279 { "label": ":", "matrix": [2, 10], "w": 1, "x": 10.75, "y": 2 },
280 { "label": "\"", "matrix": [2, 11], "w": 1, "x": 11.75, "y": 2 },
281 { "label": "Enter", "matrix": [2, 14], "w": 2.25, "x": 12.75, "y": 2 },
282 { "label": "Shift", "matrix": [3, 0], "w": 2.25, "x": 0, "y": 3 },
283 { "label": "Z", "matrix": [3, 2], "w": 1, "x": 2.25, "y": 3 },
284 { "label": "X", "matrix": [3, 3], "w": 1, "x": 3.25, "y": 3 },
285 { "label": "C", "matrix": [3, 4], "w": 1, "x": 4.25, "y": 3 },
286 { "label": "V", "matrix": [3, 5], "w": 1, "x": 5.25, "y": 3 },
287 { "label": "B", "matrix": [3, 6], "w": 1, "x": 6.25, "y": 3 },
288 { "label": "N", "matrix": [3, 7], "w": 1, "x": 7.25, "y": 3 },
289 { "label": "M", "matrix": [3, 8], "w": 1, "x": 8.25, "y": 3 },
290 { "label": "<", "matrix": [3, 9], "w": 1, "x": 9.25, "y": 3 },
291 { "label": ">", "matrix": [3, 10], "w": 1, "x": 10.25, "y": 3 },
292 { "label": "?", "matrix": [3, 11], "w": 1, "x": 11.25, "y": 3 },
293 { "label": "Shift", "matrix": [3, 12], "w": 2.75, "x": 12.25, "y": 3 },
294 { "label": "Ctrl", "matrix": [4, 0], "w": 1.5, "x": 0, "y": 4 },
295 { "label": "Win", "matrix": [4, 1], "w": 1.25, "x": 1.5, "y": 4 },
296 { "label": "Alt", "matrix": [4, 2], "w": 1.5, "x": 2.75, "y": 4 },
297 { "label": "k47", "matrix": [4, 7], "w": 6.5, "x": 4.25, "y": 4 },
298 { "label": "AltGr", "matrix": [4, 11], "w": 1.5, "x": 10.75, "y": 4 },
299 { "label": "Win", "matrix": [4, 12], "w": 1.25, "x": 12.25, "y": 4 },
300 { "label": "Ctrl", "matrix": [4, 14], "w": 1.5, "x": 13.5, "y": 4 }
36 ] 301 ]
37 }, 302 },
38 "LAYOUT_all": { 303 "LAYOUT_all": {
39 "key_count": 65, 304 "key_count": 65,
40 "layout": [ 305 "layout": [
41 {"label": "~", "x": 0, "y": 0}, {"label": "!", "x": 1, "y": 0}, {"label": "@", "x": 2, "y": 0}, {"label": "#", "x": 3, "y": 0}, {"label": "$", "x": 4, "y": 0}, {"label": "%", "x": 5, "y": 0}, {"label": "^", "x": 6, "y": 0}, {"label": "&", "x": 7, "y": 0}, {"label": "*", "x": 8, "y": 0}, {"label": "(", "x": 9, "y": 0}, {"label": ")", "x": 10, "y": 0}, {"label": "_", "x": 11, "y": 0}, {"label": "+", "x": 12, "y": 0}, {"x": 13, "y": 0}, {"label": "Back", "x": 14, "y": 0}, 306 { "label": "~", "matrix": [0, 0], "w": 1, "x": 0, "y": 0 },
42 {"label": "Tab", "x": 0, "y": 1, "w": 1.5}, {"label": "Q", "x": 1.5, "y": 1}, {"label": "W", "x": 2.5, "y": 1}, {"label": "E", "x": 3.5, "y": 1}, {"label": "R", "x": 4.5, "y": 1}, {"label": "T", "x": 5.5, "y": 1}, {"label": "Y", "x": 6.5, "y": 1}, {"label": "U", "x": 7.5, "y": 1}, {"label": "I", "x": 8.5, "y": 1}, {"label": "O", "x": 9.5, "y": 1}, {"label": "P", "x": 10.5, "y": 1}, {"label": "{", "x": 11.5, "y": 1}, {"label": "}", "x": 12.5, "y": 1}, {"label": "|", "x": 13.5, "y": 1, "w": 1.5}, 307 { "label": "!", "matrix": [0, 1], "w": 1, "x": 1, "y": 0 },
43 {"label": "Caps Lock", "x": 0, "y": 2, "w": 1.75}, {"label": "A", "x": 1.75, "y": 2}, {"label": "S", "x": 2.75, "y": 2}, {"label": "D", "x": 3.75, "y": 2}, {"label": "F", "x": 4.75, "y": 2}, {"label": "G", "x": 5.75, "y": 2}, {"label": "H", "x": 6.75, "y": 2}, {"label": "J", "x": 7.75, "y": 2}, {"label": "K", "x": 8.75, "y": 2}, {"label": "L", "x": 9.75, "y": 2}, {"label": ":", "x": 10.75, "y": 2}, {"label": "\"", "x": 11.75, "y": 2}, {"x": 12.75, "y": 2}, {"label": "Enter", "x": 13.75, "y": 2, "w": 1.25}, 308 { "label": "@", "matrix": [0, 2], "w": 1, "x": 2, "y": 0 },
44 {"x": 0, "y": 3}, {"label": "Shift", "x": 1, "y": 3, "w": 1.25}, {"label": "Z", "x": 2.25, "y": 3}, {"label": "X", "x": 3.25, "y": 3}, {"label": "C", "x": 4.25, "y": 3}, {"label": "V", "x": 5.25, "y": 3}, {"label": "B", "x": 6.25, "y": 3}, {"label": "N", "x": 7.25, "y": 3}, {"label": "M", "x": 8.25, "y": 3}, {"label": "<", "x": 9.25, "y": 3}, {"label": ">", "x": 10.25, "y": 3}, {"label": "?", "x": 11.25, "y": 3}, {"label": "Shift", "x": 12.25, "y": 3, "w": 1.75}, {"x": 14, "y": 3}, 309 { "label": "#", "matrix": [0, 3], "w": 1, "x": 3, "y": 0 },
45 {"label": "Ctrl", "x": 0, "y": 4, "w": 1.25}, {"label": "Win", "x": 1.25, "y": 4, "w": 1.25}, {"label": "Alt", "x": 2.5, "y": 4, "w": 1.25}, {"x": 3.75, "y": 4, "w": 6.25}, {"label": "Alt", "x": 10, "y": 4, "w": 1.25}, {"label": "Win", "x": 11.25, "y": 4, "w": 1.25}, {"label": "Menu", "x": 12.5, "y": 4, "w": 1.25}, {"label": "Ctrl", "x": 13.75, "y": 4, "w": 1.25 } 310 { "label": "$", "matrix": [0, 4], "w": 1, "x": 4, "y": 0 },
46 ] 311 { "label": "%", "matrix": [0, 5], "w": 1, "x": 5, "y": 0 },
47 }, 312 { "label": "^", "matrix": [0, 6], "w": 1, "x": 6, "y": 0 },
48 "LAYOUT_60_ansi_split_bs_rshift": { 313 { "label": "&", "matrix": [0, 7], "w": 1, "x": 7, "y": 0 },
49 "key_count": 63, 314 { "label": "*", "matrix": [0, 8], "w": 1, "x": 8, "y": 0 },
50 "layout": [ 315 { "label": "(", "matrix": [0, 9], "w": 1, "x": 9, "y": 0 },
51 {"label": "~", "x": 0, "y": 0}, {"label": "!", "x": 1, "y": 0}, {"label": "@", "x": 2, "y": 0}, {"label": "#", "x": 3, "y": 0}, {"label": "$", "x": 4, "y": 0}, {"label": "%", "x": 5, "y": 0}, {"label": "^", "x": 6, "y": 0}, {"label": "&", "x": 7, "y": 0}, {"label": "*", "x": 8, "y": 0}, {"label": "(", "x": 9, "y": 0}, {"label": ")", "x": 10, "y": 0}, {"label": "_", "x": 11, "y": 0}, {"label": "+", "x": 12, "y": 0}, {"x": 13, "y": 0}, {"label": "Back", "x": 14, "y": 0}, 316 { "label": ")", "matrix": [0, 10], "w": 1, "x": 10, "y": 0 },
52 {"label": "Tab", "x": 0, "y": 1, "w": 1.5}, {"label": "Q", "x": 1.5, "y": 1}, {"label": "W", "x": 2.5, "y": 1}, {"label": "E", "x": 3.5, "y": 1}, {"label": "R", "x": 4.5, "y": 1}, {"label": "T", "x": 5.5, "y": 1}, {"label": "Y", "x": 6.5, "y": 1}, {"label": "U", "x": 7.5, "y": 1}, {"label": "I", "x": 8.5, "y": 1}, {"label": "O", "x": 9.5, "y": 1}, {"label": "P", "x": 10.5, "y": 1}, {"label": "{", "x": 11.5, "y": 1}, {"label": "}", "x": 12.5, "y": 1}, {"label": "|", "x": 13.5, "y": 1, "w": 1.5}, 317 { "label": "_", "matrix": [0, 11], "w": 1, "x": 11, "y": 0 },
53 {"label": "Caps Lock", "x": 0, "y": 2, "w": 1.75}, {"label": "A", "x": 1.75, "y": 2}, {"label": "S", "x": 2.75, "y": 2}, {"label": "D", "x": 3.75, "y": 2}, {"label": "F", "x": 4.75, "y": 2}, {"label": "G", "x": 5.75, "y": 2}, {"label": "H", "x": 6.75, "y": 2}, {"label": "J", "x": 7.75, "y": 2}, {"label": "K", "x": 8.75, "y": 2}, {"label": "L", "x": 9.75, "y": 2}, {"label": ":", "x": 10.75, "y": 2}, {"label": "\"", "x": 11.75, "y": 2}, {"label": "Enter", "x": 12.75, "y": 2, "w": 2.25}, 318 { "label": "+", "matrix": [0, 12], "w": 1, "x": 12, "y": 0 },
54 {"label": "Shift", "x": 0, "y": 3, "w": 2.25}, {"label": "Z", "x": 2.25, "y": 3}, {"label": "X", "x": 3.25, "y": 3}, {"label": "C", "x": 4.25, "y": 3}, {"label": "V", "x": 5.25, "y": 3}, {"label": "B", "x": 6.25, "y": 3}, {"label": "N", "x": 7.25, "y": 3}, {"label": "M", "x": 8.25, "y": 3}, {"label": "<", "x": 9.25, "y": 3}, {"label": ">", "x": 10.25, "y": 3}, {"label": "?", "x": 11.25, "y": 3}, {"label": "Shift", "x": 12.25, "y": 3, "w": 1.75}, {"x": 14, "y": 3}, 319 { "label": "k0d", "matrix": [0, 13], "w": 1, "x": 13, "y": 0 },
55 {"label": "Ctrl", "x": 0, "y": 4, "w": 1.25}, {"label": "Win", "x": 1.25, "y": 4, "w": 1.25}, {"label": "Alt", "x": 2.5, "y": 4, "w": 1.25}, {"x": 3.75, "y": 4, "w": 6.25}, {"label": "Alt", "x": 10, "y": 4, "w": 1.25}, {"label": "Win", "x": 11.25, "y": 4, "w": 1.25}, {"label": "Menu", "x": 12.5, "y": 4, "w": 1.25}, {"label": "Ctrl", "x": 13.75, "y": 4, "w": 1.25} 320 { "label": "Back", "matrix": [0, 14], "w": 1, "x": 14, "y": 0 },
321 { "label": "Tab", "matrix": [1, 0], "w": 1.5, "x": 0, "y": 1 },
322 { "label": "Q", "matrix": [1, 1], "w": 1, "x": 1.5, "y": 1 },
323 { "label": "W", "matrix": [1, 2], "w": 1, "x": 2.5, "y": 1 },
324 { "label": "E", "matrix": [1, 3], "w": 1, "x": 3.5, "y": 1 },
325 { "label": "R", "matrix": [1, 4], "w": 1, "x": 4.5, "y": 1 },
326 { "label": "T", "matrix": [1, 5], "w": 1, "x": 5.5, "y": 1 },
327 { "label": "Y", "matrix": [1, 6], "w": 1, "x": 6.5, "y": 1 },
328 { "label": "U", "matrix": [1, 7], "w": 1, "x": 7.5, "y": 1 },
329 { "label": "I", "matrix": [1, 8], "w": 1, "x": 8.5, "y": 1 },
330 { "label": "O", "matrix": [1, 9], "w": 1, "x": 9.5, "y": 1 },
331 { "label": "P", "matrix": [1, 10], "w": 1, "x": 10.5, "y": 1 },
332 { "label": "{", "matrix": [1, 11], "w": 1, "x": 11.5, "y": 1 },
333 { "label": "}", "matrix": [1, 12], "w": 1, "x": 12.5, "y": 1 },
334 { "label": "|", "matrix": [1, 14], "w": 1.5, "x": 13.5, "y": 1 },
335 { "label": "Caps Lock", "matrix": [2, 0], "w": 1.75, "x": 0, "y": 2 },
336 { "label": "A", "matrix": [2, 1], "w": 1, "x": 1.75, "y": 2 },
337 { "label": "S", "matrix": [2, 2], "w": 1, "x": 2.75, "y": 2 },
338 { "label": "D", "matrix": [2, 3], "w": 1, "x": 3.75, "y": 2 },
339 { "label": "F", "matrix": [2, 4], "w": 1, "x": 4.75, "y": 2 },
340 { "label": "G", "matrix": [2, 5], "w": 1, "x": 5.75, "y": 2 },
341 { "label": "H", "matrix": [2, 6], "w": 1, "x": 6.75, "y": 2 },
342 { "label": "J", "matrix": [2, 7], "w": 1, "x": 7.75, "y": 2 },
343 { "label": "K", "matrix": [2, 8], "w": 1, "x": 8.75, "y": 2 },
344 { "label": "L", "matrix": [2, 9], "w": 1, "x": 9.75, "y": 2 },
345 { "label": ":", "matrix": [2, 10], "w": 1, "x": 10.75, "y": 2 },
346 { "label": "\"", "matrix": [2, 11], "w": 1, "x": 11.75, "y": 2 },
347 { "label": "k2c", "matrix": [2, 12], "w": 1, "x": 12.75, "y": 2 },
348 { "label": "Enter", "matrix": [2, 14], "w": 1.25, "x": 13.75, "y": 2 },
349 { "label": "k30", "matrix": [3, 0], "w": 1, "x": 0, "y": 3 },
350 { "label": "Shift", "matrix": [3, 1], "w": 1.25, "x": 1, "y": 3 },
351 { "label": "Z", "matrix": [3, 2], "w": 1, "x": 2.25, "y": 3 },
352 { "label": "X", "matrix": [3, 3], "w": 1, "x": 3.25, "y": 3 },
353 { "label": "C", "matrix": [3, 4], "w": 1, "x": 4.25, "y": 3 },
354 { "label": "V", "matrix": [3, 5], "w": 1, "x": 5.25, "y": 3 },
355 { "label": "B", "matrix": [3, 6], "w": 1, "x": 6.25, "y": 3 },
356 { "label": "N", "matrix": [3, 7], "w": 1, "x": 7.25, "y": 3 },
357 { "label": "M", "matrix": [3, 8], "w": 1, "x": 8.25, "y": 3 },
358 { "label": "<", "matrix": [3, 9], "w": 1, "x": 9.25, "y": 3 },
359 { "label": ">", "matrix": [3, 10], "w": 1, "x": 10.25, "y": 3 },
360 { "label": "?", "matrix": [3, 11], "w": 1, "x": 11.25, "y": 3 },
361 { "label": "Shift", "matrix": [3, 12], "w": 1.75, "x": 12.25, "y": 3 },
362 { "label": "k3e", "matrix": [3, 14], "w": 1, "x": 14, "y": 3 },
363 { "label": "Ctrl", "matrix": [4, 0], "w": 1.25, "x": 0, "y": 4 },
364 { "label": "Win", "matrix": [4, 1], "w": 1.25, "x": 1.25, "y": 4 },
365 { "label": "Alt", "matrix": [4, 2], "w": 1.25, "x": 2.5, "y": 4 },
366 { "label": "k47", "matrix": [4, 7], "w": 6.25, "x": 3.75, "y": 4 },
367 { "label": "Alt", "matrix": [4, 10], "w": 1.25, "x": 10, "y": 4 },
368 { "label": "Win", "matrix": [4, 11], "w": 1.25, "x": 11.25, "y": 4 },
369 { "label": "Menu", "matrix": [4, 12], "w": 1.25, "x": 12.5, "y": 4 },
370 { "label": "Ctrl", "matrix": [4, 14], "w": 1.25, "x": 13.75, "y": 4 }
56 ] 371 ]
57 } 372 }
58 } 373 }
diff --git a/keyboards/clueboard/60/rules.mk b/keyboards/clueboard/60/rules.mk
index 87f56692f..7e85acec6 100644
--- a/keyboards/clueboard/60/rules.mk
+++ b/keyboards/clueboard/60/rules.mk
@@ -2,18 +2,5 @@
2MCU = STM32F303 2MCU = STM32F303
3BOARD = QMK_PROTON_C 3BOARD = QMK_PROTON_C
4 4
5# Build Options
6# comment out to disable the options.
7#
8BACKLIGHT_ENABLE = no
9BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration
10MOUSEKEY_ENABLE = yes # Mouse keys
11EXTRAKEY_ENABLE = yes # Audio control and System control
12CONSOLE_ENABLE = yes # Console for debug
13COMMAND_ENABLE = no # Commands for debug and configuration
14NKRO_ENABLE = yes # USB Nkey Rollover
15AUDIO_ENABLE = yes
16
17# project specific files 5# project specific files
18SRC = led.c 6SRC = led.c
19LAYOUTS += 60_ansi 60_ansi_split_bs_rshift 60_iso
diff --git a/keyboards/clueboard/66/info.json b/keyboards/clueboard/66/info.json
index 514ba456d..df88648d8 100644
--- a/keyboards/clueboard/66/info.json
+++ b/keyboards/clueboard/66/info.json
@@ -1,36 +1,4 @@
1{ 1{
2 "keyboard_name": "Clueboard 66%",
3 "width": 16.5, 2 "width": 16.5,
4 "height": 5, 3 "height": 5
5 "layouts": {
6 "LAYOUT_all": {
7 "layout": [
8 {"x": 0, "y": 0, "w": 1, "label": "GRAVE"}, {"x": 1, "y": 0, "w": 1, "label": "1"}, {"x": 2, "y": 0, "w": 1, "label": "2"}, {"x": 3, "y": 0, "w": 1, "label": "3"}, {"x": 4, "y": 0, "w": 1, "label": "4"}, {"x": 5, "y": 0, "w": 1, "label": "5"}, {"x": 6, "y": 0, "w": 1, "label": "6"}, {"x": 7, "y": 0, "w": 1, "label": "7"}, {"x": 8, "y": 0, "w": 1, "label": "8"}, {"x": 9, "y": 0, "w": 1, "label": "9"}, {"x": 10, "y": 0, "w": 1, "label": "0"}, {"x": 11, "y": 0, "w": 1, "label": "DASH"}, {"x": 12, "y": 0, "w": 1, "label": "EQUALSIGN"}, {"x": 13, "y": 0, "w": 1, "label": "YEN"}, {"x": 14, "y": 0, "w": 1, "label": "BACKSPACE"}, {"x": 15.5, "y": 0, "w": 1, "label": "PAGEUP"},
9 {"x": 0, "y": 1, "w": 1.5, "label": "TAB"}, {"x": 1.5, "y": 1, "w": 1, "label": "Q"}, {"x": 2.5, "y": 1, "w": 1, "label": "W"}, {"x": 3.5, "y": 1, "w": 1, "label": "E"}, {"x": 4.5, "y": 1, "w": 1, "label": "R"}, {"x": 5.5, "y": 1, "w": 1, "label": "T"}, {"x": 6.5, "y": 1, "w": 1, "label": "Y"}, {"x": 7.5, "y": 1, "w": 1, "label": "U"}, {"x": 8.5, "y": 1, "w": 1, "label": "I"}, {"x": 9.5, "y": 1, "w": 1, "label": "O"}, {"x": 10.5, "y": 1, "w": 1, "label": "P"}, {"x": 11.5, "y": 1, "w": 1, "label": "LBRACKET"}, {"x": 12.5, "y": 1, "w": 1, "label": "RBRACKET"}, {"x": 13.5, "y": 1, "w": 1.5, "label": "BACKSLASH"}, {"x": 15.5, "y": 1, "w": 1, "label": "PAGEDOWN"},
10 {"x": 0, "y": 2, "w": 1.75, "label": "CAPSLOCK"}, {"x": 1.75, "y": 2, "w": 1, "label": "A"}, {"x": 2.75, "y": 2, "w": 1, "label": "S"}, {"x": 3.75, "y": 2, "w": 1, "label": "D"}, {"x": 4.75, "y": 2, "w": 1, "label": "F"}, {"x": 5.75, "y": 2, "w": 1, "label": "G"}, {"x": 6.75, "y": 2, "w": 1, "label": "H"}, {"x": 7.75, "y": 2, "w": 1, "label": "J"}, {"x": 8.75, "y": 2, "w": 1, "label": "K"}, {"x": 9.75, "y": 2, "w": 1, "label": "L"}, {"x": 10.75, "y": 2, "w": 1, "label": "SEMICOLON"}, {"x": 11.75, "y": 2, "w": 1, "label": "QUOTE"}, {"x": 12.75, "y": 2, "w": 1, "label": "ISOHASH"}, {"x": 13.75, "y": 2, "w": 1.25, "label": "ENTER"},
11 {"x": 0, "y": 3, "w": 1.25, "label": "LSHIFT"}, {"x": 1.25, "y": 3, "w": 1, "label": "ISOBACKSLASH"}, {"x": 2.25, "y": 3, "w": 1, "label": "Z"}, {"x": 3.25, "y": 3, "w": 1, "label": "X"}, {"x": 4.25, "y": 3, "w": 1, "label": "C"}, {"x": 5.25, "y": 3, "w": 1, "label": "V"}, {"x": 6.25, "y": 3, "w": 1, "label": "B"}, {"x": 7.25, "y": 3, "w": 1, "label": "N"}, {"x": 8.25, "y": 3, "w": 1, "label": "M"}, {"x": 9.25, "y": 3, "w": 1, "label": "COMMA"}, {"x": 10.25, "y": 3, "w": 1, "label": "PERIOD"}, {"x": 11.25, "y": 3, "w": 1, "label": "SLASH"}, {"x": 12.25, "y": 3, "w": 1, "label": "JPBACKSLASH"}, {"x": 13.25, "y": 3, "w": 1.25, "label": "RSHIFT"}, {"x": 14.5, "y": 3, "w": 1, "label": "UP"},
12 {"x": 0, "y": 4, "w": 1.25, "label": "LCTRL"}, {"x": 1.25, "y": 4, "w": 1, "label": "LALT"}, {"x": 2.25, "y": 4, "w": 1.25, "label": "LCMD"}, {"x": 3.5, "y": 4, "w": 1.25, "label": "MUHENKAN"}, {"x": 4.75, "y": 4, "w": 2, "label": "SPACE1"}, {"x": 6.75, "y": 4, "w": 2, "label": "SPACE2"}, {"x": 8.75, "y": 4, "w": 1.25, "label": "HENKAN"}, {"x": 10, "y": 4, "w": 1.25, "label": "RCMD"}, {"x": 11.25, "y": 4, "w": 1, "label": "RCTRL"}, {"x": 12.25, "y": 4, "w": 1.25, "label": "FN"}, {"x": 13.5, "y": 4, "w": 1, "label": "LEFT"}, {"x": 14.5, "y": 4, "w": 1, "label": "DOWN"}, {"x": 15.5, "y": 4, "w": 1, "label": "RIGHT"}
13 ]
14 },
15
16 "LAYOUT_66_ansi": {
17 "layout": [
18 {"label":"~", "x":0, "y":0}, {"label":"!", "x":1, "y":0}, {"label":"@", "x":2, "y":0}, {"label":"#", "x":3, "y":0}, {"label":"$", "x":4, "y":0}, {"label":"%", "x":5, "y":0}, {"label":"^", "x":6, "y":0}, {"label":"&", "x":7, "y":0}, {"label":"*", "x":8, "y":0}, {"label":"(", "x":9, "y":0}, {"label":")", "x":10, "y":0}, {"label":"_", "x":11, "y":0}, {"label":"+", "x":12, "y":0}, {"label":"Backspace", "x":13, "y":0, "w":2}, {"x":15.5, "y":0},
19 {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"{", "x":11.5, "y":1}, {"label":"}", "x":12.5, "y":1}, {"label":"|", "x":13.5, "y":1, "w":1.5}, {"x":15.5, "y":1},
20 {"label":"Caps Lock", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":":", "x":10.75, "y":2}, {"label":"\"", "x":11.75, "y":2}, {"label":"Enter", "x":12.75, "y":2, "w":2.25},
21 {"label":"Shift", "x":0, "y":3, "w":2.25}, {"label":"Z", "x":2.25, "y":3}, {"label":"X", "x":3.25, "y":3}, {"label":"C", "x":4.25, "y":3}, {"label":"V", "x":5.25, "y":3}, {"label":"B", "x":6.25, "y":3}, {"label":"N", "x":7.25, "y":3}, {"label":"M", "x":8.25, "y":3}, {"label":"<", "x":9.25, "y":3}, {"label":">", "x":10.25, "y":3}, {"label":"?", "x":11.25, "y":3}, {"label":"Shift", "x":12.25, "y":3, "w":2.25}, {"x":14.5, "y":3},
22 {"label":"Ctrl", "x":0, "y":4, "w":1.25}, {"label":"Win", "x":1.25, "y":4, "w":1.25}, {"label":"Alt", "x":2.5, "y":4, "w":1.25}, {"x":3.75, "y":4, "w":6}, {"label":"Alt", "x":9.75, "y":4, "w":1.25}, {"label":"Win", "x":11, "y":4, "w":1.25}, {"label":"Menu", "x":12.25, "y":4, "w":1.25}, {"x":13.5, "y":4}, {"x":14.5, "y":4}, {"x":15.5, "y":4}
23 ]
24 },
25
26 "LAYOUT_66_iso": {
27 "layout": [
28 {"label":"~", "x":0, "y":0}, {"label":"!", "x":1, "y":0}, {"label":"@", "x":2, "y":0}, {"label":"#", "x":3, "y":0}, {"label":"$", "x":4, "y":0}, {"label":"%", "x":5, "y":0}, {"label":"^", "x":6, "y":0}, {"label":"&", "x":7, "y":0}, {"label":"*", "x":8, "y":0}, {"label":"(", "x":9, "y":0}, {"label":")", "x":10, "y":0}, {"label":"_", "x":11, "y":0}, {"label":"+", "x":12, "y":0}, {"label":"Backspace", "x":13, "y":0, "w":2}, {"label":"Insert", "x":15.5, "y":0},
29 {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"{", "x":11.5, "y":1}, {"label":"}", "x":12.5, "y":1}, {"label":"Delete", "x":15.5, "y":1},
30 {"label":"Caps Lock", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":":", "x":10.75, "y":2}, {"label":"\"", "x":11.75, "y":2}, {"label":"", "x":12.75, "y":2}, {"label":"Enter", "x":13.75, "y":1, "w":1.25, "h":2},
31 {"label":"Shift", "x":0, "y":3, "w":1.25}, {"label":"\\", "x":1.25, "y":3, "w":1}, {"label":"Z", "x":2.25, "y":3}, {"label":"X", "x":3.25, "y":3}, {"label":"C", "x":4.25, "y":3}, {"label":"V", "x":5.25, "y":3}, {"label":"B", "x":6.25, "y":3}, {"label":"N", "x":7.25, "y":3}, {"label":"M", "x":8.25, "y":3}, {"label":"<", "x":9.25, "y":3}, {"label":">", "x":10.25, "y":3}, {"label":"?", "x":11.25, "y":3}, {"label":"Shift", "x":12.25, "y":3, "w":2.25}, {"label":"\u2191", "x":14.5, "y":3},
32 {"label":"Ctrl", "x":0, "y":4, "w":1.25}, {"label":"Win", "x":1.25, "y":4, "w":1.25}, {"label":"Alt", "x":2.5, "y":4, "w":1.25}, {"x":3.75, "y":4, "w":6}, {"label":"Alt", "x":9.75, "y":4, "w":1.25}, {"label":"Ctrl", "x":11, "y":4, "w":1.25}, {"label":"Menu", "x":12.25, "y":4, "w":1.25}, {"label":"\u2190", "x":13.5, "y":4}, {"label":"\u2193", "x":14.5, "y":4}, {"label":"\u2192", "x":15.5, "y":4}
33 ]
34 }
35 }
36} 4}
diff --git a/keyboards/clueboard/66/rev1/config.h b/keyboards/clueboard/66/rev1/config.h
index 6b61ca4d1..b8c5759db 100644
--- a/keyboards/clueboard/66/rev1/config.h
+++ b/keyboards/clueboard/66/rev1/config.h
@@ -1,62 +1,3 @@
1#pragma once 1#pragma once
2 2
3#include "config_common.h" 3#include "config_common.h"
4
5/* USB Device descriptor parameter */
6#define VENDOR_ID 0xC1ED
7#define PRODUCT_ID 0x2301
8#define DEVICE_VER 0x0003
9#define MANUFACTURER Clueboard
10#define PRODUCT Clueboard
11#define DESCRIPTION QMK keyboard firmware for Clueboard
12
13/* key matrix size
14 */
15#define MATRIX_ROWS 5
16#define MATRIX_COLS 16
17
18/* ROWS: Top to bottom, COLS: Left to right
19 */
20#define MATRIX_COL_PINS { B3, F1, F4, F5, F6, C7, C6, B6, B5, B4, D7, D6, D4, F7, B0, B1 }
21#define MATRIX_ROW_PINS { D1, D0, D2, D5, D3 }
22#define UNUSED_PINS
23
24/* COL2ROW or ROW2COL */
25#define DIODE_DIRECTION COL2ROW
26
27/* Set 0 if debouncing isn't needed */
28#define DEBOUNCE 5
29
30/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
31#define LOCKING_SUPPORT_ENABLE
32/* Locking resynchronize hack */
33#define LOCKING_RESYNC_ENABLE
34
35/*
36 * Feature disable options
37 * These options are also useful to firmware size reduction.
38 */
39
40/* disable debug print */
41//#define NO_DEBUG
42
43/* disable print */
44//#define NO_PRINT
45
46/* disable action features */
47//#define NO_ACTION_LAYER
48//#define NO_ACTION_TAPPING
49//#define NO_ACTION_ONESHOT
50//#define NO_ACTION_MACRO
51//#define NO_ACTION_FUNCTION
52
53#define LED_CAPS_LOCK_PIN F0
54
55/* Underlight configuration
56 */
57#define RGB_DI_PIN B2
58#define RGBLIGHT_ANIMATIONS
59#define RGBLED_NUM 14 // Number of LEDs
60#define RGBLIGHT_HUE_STEP 10
61#define RGBLIGHT_SAT_STEP 17
62#define RGBLIGHT_VAL_STEP 17
diff --git a/keyboards/clueboard/66/rev1/info.json b/keyboards/clueboard/66/rev1/info.json
new file mode 100644
index 000000000..f67e5baf7
--- /dev/null
+++ b/keyboards/clueboard/66/rev1/info.json
@@ -0,0 +1,273 @@
1{
2 "manufacturer": "Clueboard",
3 "keyboard_name": "Clueboard 66%",
4 "maintainer": "skullydazed",
5 "height": 5,
6 "width": 16.5,
7 "debounce": "5",
8 "diode_direction": "COL2ROW",
9 "features": {
10 "audio": false,
11 "backlight": false,
12 "bluetooth": false,
13 "bootmagic": false,
14 "command": false,
15 "console": true,
16 "extrakey": true,
17 "midi": false,
18 "mousekey": true,
19 "nkro": true,
20 "rgblight": false,
21 "unicode": false
22 },
23 "indicators": {
24 "caps_lock": "F0"
25 },
26 "matrix_pins": {
27 "cols": ["B3", " F1", " F4", " F5", " F6", " C7", " C6", " B6", " B5", " B4", " D7", " D6", " D4", " F7", " B0", " B1"],
28 "rows": ["D1", " D0", " D2", " D5", " D3"]
29 },
30 "rgblight": {
31 "animations": {
32 "all": true
33 },
34 "brightness_steps": "17",
35 "hue_steps": "10",
36 "led_count": "14",
37 "pin": "B2",
38 "saturation_steps": "17"
39 },
40 "usb": {
41 "device_ver": "0x0001",
42 "pid": "0x2301",
43 "vid": "0xC1ED"
44 },
45 "community_layouts": ["66_ansi", "66_iso"],
46 "layout_aliases": {
47 "KEYMAP": "LAYOUT_all",
48 "LAYOUT": "LAYOUT_all"
49 },
50 "layouts": {
51 "LAYOUT_66_ansi": {
52 "key_count": 66,
53 "layout": [
54 { "label": "~", "matrix": [0, 0], "w": 1, "x": 0, "y": 0 },
55 { "label": "!", "matrix": [0, 1], "w": 1, "x": 1, "y": 0 },
56 { "label": "@", "matrix": [0, 2], "w": 1, "x": 2, "y": 0 },
57 { "label": "#", "matrix": [0, 3], "w": 1, "x": 3, "y": 0 },
58 { "label": "$", "matrix": [0, 4], "w": 1, "x": 4, "y": 0 },
59 { "label": "%", "matrix": [0, 5], "w": 1, "x": 5, "y": 0 },
60 { "label": "^", "matrix": [0, 6], "w": 1, "x": 6, "y": 0 },
61 { "label": "&", "matrix": [0, 7], "w": 1, "x": 7, "y": 0 },
62 { "label": "*", "matrix": [0, 8], "w": 1, "x": 8, "y": 0 },
63 { "label": "(", "matrix": [0, 9], "w": 1, "x": 9, "y": 0 },
64 { "label": ")", "matrix": [0, 10], "w": 1, "x": 10, "y": 0 },
65 { "label": "_", "matrix": [0, 11], "w": 1, "x": 11, "y": 0 },
66 { "label": "+", "matrix": [0, 12], "w": 1, "x": 12, "y": 0 },
67 { "label": "Backspace", "matrix": [0, 14], "w": 2, "x": 13, "y": 0 },
68 { "label": "k0F", "matrix": [0, 15], "w": 1, "x": 15.5, "y": 0 },
69 { "label": "Tab", "matrix": [1, 0], "w": 1.5, "x": 0, "y": 1 },
70 { "label": "Q", "matrix": [1, 1], "w": 1, "x": 1.5, "y": 1 },
71 { "label": "W", "matrix": [1, 2], "w": 1, "x": 2.5, "y": 1 },
72 { "label": "E", "matrix": [1, 3], "w": 1, "x": 3.5, "y": 1 },
73 { "label": "R", "matrix": [1, 4], "w": 1, "x": 4.5, "y": 1 },
74 { "label": "T", "matrix": [1, 5], "w": 1, "x": 5.5, "y": 1 },
75 { "label": "Y", "matrix": [1, 6], "w": 1, "x": 6.5, "y": 1 },
76 { "label": "U", "matrix": [1, 7], "w": 1, "x": 7.5, "y": 1 },
77 { "label": "I", "matrix": [1, 8], "w": 1, "x": 8.5, "y": 1 },
78 { "label": "O", "matrix": [1, 9], "w": 1, "x": 9.5, "y": 1 },
79 { "label": "P", "matrix": [1, 10], "w": 1, "x": 10.5, "y": 1 },
80 { "label": "{", "matrix": [1, 11], "w": 1, "x": 11.5, "y": 1 },
81 { "label": "}", "matrix": [1, 12], "w": 1, "x": 12.5, "y": 1 },
82 { "label": "|", "matrix": [1, 13], "w": 1.5, "x": 13.5, "y": 1 },
83 { "label": "k1F", "matrix": [1, 15], "w": 1, "x": 15.5, "y": 1 },
84 { "label": "Caps Lock", "matrix": [2, 0], "w": 1.75, "x": 0, "y": 2 },
85 { "label": "A", "matrix": [2, 1], "w": 1, "x": 1.75, "y": 2 },
86 { "label": "S", "matrix": [2, 2], "w": 1, "x": 2.75, "y": 2 },
87 { "label": "D", "matrix": [2, 3], "w": 1, "x": 3.75, "y": 2 },
88 { "label": "F", "matrix": [2, 4], "w": 1, "x": 4.75, "y": 2 },
89 { "label": "G", "matrix": [2, 5], "w": 1, "x": 5.75, "y": 2 },
90 { "label": "H", "matrix": [2, 6], "w": 1, "x": 6.75, "y": 2 },
91 { "label": "J", "matrix": [2, 7], "w": 1, "x": 7.75, "y": 2 },
92 { "label": "K", "matrix": [2, 8], "w": 1, "x": 8.75, "y": 2 },
93 { "label": "L", "matrix": [2, 9], "w": 1, "x": 9.75, "y": 2 },
94 { "label": ":", "matrix": [2, 10], "w": 1, "x": 10.75, "y": 2 },
95 { "label": "\"", "matrix": [2, 11], "w": 1, "x": 11.75, "y": 2 },
96 { "label": "Enter", "matrix": [2, 13], "w": 2.25, "x": 12.75, "y": 2 },
97 { "label": "Shift", "matrix": [3, 0], "w": 2.25, "x": 0, "y": 3 },
98 { "label": "Z", "matrix": [3, 2], "w": 1, "x": 2.25, "y": 3 },
99 { "label": "X", "matrix": [3, 3], "w": 1, "x": 3.25, "y": 3 },
100 { "label": "C", "matrix": [3, 4], "w": 1, "x": 4.25, "y": 3 },
101 { "label": "V", "matrix": [3, 5], "w": 1, "x": 5.25, "y": 3 },
102 { "label": "B", "matrix": [3, 6], "w": 1, "x": 6.25, "y": 3 },
103 { "label": "N", "matrix": [3, 7], "w": 1, "x": 7.25, "y": 3 },
104 { "label": "M", "matrix": [3, 8], "w": 1, "x": 8.25, "y": 3 },
105 { "label": "<", "matrix": [3, 9], "w": 1, "x": 9.25, "y": 3 },
106 { "label": ">", "matrix": [3, 10], "w": 1, "x": 10.25, "y": 3 },
107 { "label": "?", "matrix": [3, 11], "w": 1, "x": 11.25, "y": 3 },
108 { "label": "Shift", "matrix": [3, 13], "w": 2.25, "x": 12.25, "y": 3 },
109 { "label": "k3E", "matrix": [3, 14], "w": 1, "x": 14.5, "y": 3 },
110 { "label": "Ctrl", "matrix": [4, 0], "w": 1.25, "x": 0, "y": 4 },
111 { "label": "Win", "matrix": [4, 1], "w": 1.25, "x": 1.25, "y": 4 },
112 { "label": "Alt", "matrix": [4, 2], "w": 1.25, "x": 2.5, "y": 4 },
113 { "label": "k46", "matrix": [4, 6], "w": 6, "x": 3.75, "y": 4 },
114 { "label": "Alt", "matrix": [4, 10], "w": 1.25, "x": 9.75, "y": 4 },
115 { "label": "Win", "matrix": [4, 11], "w": 1.25, "x": 11, "y": 4 },
116 { "label": "Menu", "matrix": [4, 12], "w": 1.25, "x": 12.25, "y": 4 },
117 { "label": "k4D", "matrix": [4, 13], "w": 1, "x": 13.5, "y": 4 },
118 { "label": "k4E", "matrix": [4, 14], "w": 1, "x": 14.5, "y": 4 },
119 { "label": "k4F", "matrix": [4, 15], "w": 1, "x": 15.5, "y": 4 }
120 ]
121 },
122 "LAYOUT_66_iso": {
123 "key_count": 67,
124 "layout": [
125 { "label": "~", "matrix": [0, 0], "w": 1, "x": 0, "y": 0 },
126 { "label": "!", "matrix": [0, 1], "w": 1, "x": 1, "y": 0 },
127 { "label": "@", "matrix": [0, 2], "w": 1, "x": 2, "y": 0 },
128 { "label": "#", "matrix": [0, 3], "w": 1, "x": 3, "y": 0 },
129 { "label": "$", "matrix": [0, 4], "w": 1, "x": 4, "y": 0 },
130 { "label": "%", "matrix": [0, 5], "w": 1, "x": 5, "y": 0 },
131 { "label": "^", "matrix": [0, 6], "w": 1, "x": 6, "y": 0 },
132 { "label": "&", "matrix": [0, 7], "w": 1, "x": 7, "y": 0 },
133 { "label": "*", "matrix": [0, 8], "w": 1, "x": 8, "y": 0 },
134 { "label": "(", "matrix": [0, 9], "w": 1, "x": 9, "y": 0 },
135 { "label": ")", "matrix": [0, 10], "w": 1, "x": 10, "y": 0 },
136 { "label": "_", "matrix": [0, 11], "w": 1, "x": 11, "y": 0 },
137 { "label": "+", "matrix": [0, 12], "w": 1, "x": 12, "y": 0 },
138 { "label": "Backspace", "matrix": [0, 14], "w": 2, "x": 13, "y": 0 },
139 { "label": "Insert", "matrix": [0, 15], "w": 1, "x": 15.5, "y": 0 },
140 { "label": "Tab", "matrix": [1, 0], "w": 1.5, "x": 0, "y": 1 },
141 { "label": "Q", "matrix": [1, 1], "w": 1, "x": 1.5, "y": 1 },
142 { "label": "W", "matrix": [1, 2], "w": 1, "x": 2.5, "y": 1 },
143 { "label": "E", "matrix": [1, 3], "w": 1, "x": 3.5, "y": 1 },
144 { "label": "R", "matrix": [1, 4], "w": 1, "x": 4.5, "y": 1 },
145 { "label": "T", "matrix": [1, 5], "w": 1, "x": 5.5, "y": 1 },
146 { "label": "Y", "matrix": [1, 6], "w": 1, "x": 6.5, "y": 1 },
147 { "label": "U", "matrix": [1, 7], "w": 1, "x": 7.5, "y": 1 },
148 { "label": "I", "matrix": [1, 8], "w": 1, "x": 8.5, "y": 1 },
149 { "label": "O", "matrix": [1, 9], "w": 1, "x": 9.5, "y": 1 },
150 { "label": "P", "matrix": [1, 10], "w": 1, "x": 10.5, "y": 1 },
151 { "label": "{", "matrix": [1, 11], "w": 1, "x": 11.5, "y": 1 },
152 { "label": "}", "matrix": [1, 12], "w": 1, "x": 12.5, "y": 1 },
153 { "label": "Delete", "matrix": [1, 15], "w": 1, "x": 15.5, "y": 1 },
154 { "label": "Caps Lock", "matrix": [2, 0], "w": 1.75, "x": 0, "y": 2 },
155 { "label": "A", "matrix": [2, 1], "w": 1, "x": 1.75, "y": 2 },
156 { "label": "S", "matrix": [2, 2], "w": 1, "x": 2.75, "y": 2 },
157 { "label": "D", "matrix": [2, 3], "w": 1, "x": 3.75, "y": 2 },
158 { "label": "F", "matrix": [2, 4], "w": 1, "x": 4.75, "y": 2 },
159 { "label": "G", "matrix": [2, 5], "w": 1, "x": 5.75, "y": 2 },
160 { "label": "H", "matrix": [2, 6], "w": 1, "x": 6.75, "y": 2 },
161 { "label": "J", "matrix": [2, 7], "w": 1, "x": 7.75, "y": 2 },
162 { "label": "K", "matrix": [2, 8], "w": 1, "x": 8.75, "y": 2 },
163 { "label": "L", "matrix": [2, 9], "w": 1, "x": 9.75, "y": 2 },
164 { "label": ":", "matrix": [2, 10], "w": 1, "x": 10.75, "y": 2 },
165 { "label": "\"", "matrix": [2, 11], "w": 1, "x": 11.75, "y": 2 },
166 { "label": "", "matrix": [2, 12], "w": 1, "x": 12.75, "y": 2 },
167 { "h": 2, "label": "Enter", "matrix": [2, 13], "w": 1.25, "x": 13.75, "y": 1 },
168 { "label": "Shift", "matrix": [3, 0], "w": 1.25, "x": 0, "y": 3 },
169 { "label": "\\", "matrix": [3, 1], "w": 1, "x": 1.25, "y": 3 },
170 { "label": "Z", "matrix": [3, 2], "w": 1, "x": 2.25, "y": 3 },
171 { "label": "X", "matrix": [3, 3], "w": 1, "x": 3.25, "y": 3 },
172 { "label": "C", "matrix": [3, 4], "w": 1, "x": 4.25, "y": 3 },
173 { "label": "V", "matrix": [3, 5], "w": 1, "x": 5.25, "y": 3 },
174 { "label": "B", "matrix": [3, 6], "w": 1, "x": 6.25, "y": 3 },
175 { "label": "N", "matrix": [3, 7], "w": 1, "x": 7.25, "y": 3 },
176 { "label": "M", "matrix": [3, 8], "w": 1, "x": 8.25, "y": 3 },
177 { "label": "<", "matrix": [3, 9], "w": 1, "x": 9.25, "y": 3 },
178 { "label": ">", "matrix": [3, 10], "w": 1, "x": 10.25, "y": 3 },
179 { "label": "?", "matrix": [3, 11], "w": 1, "x": 11.25, "y": 3 },
180 { "label": "Shift", "matrix": [3, 13], "w": 2.25, "x": 12.25, "y": 3 },
181 { "label": "\u2191", "matrix": [3, 14], "w": 1, "x": 14.5, "y": 3 },
182 { "label": "Ctrl", "matrix": [4, 0], "w": 1.25, "x": 0, "y": 4 },
183 { "label": "Win", "matrix": [4, 1], "w": 1.25, "x": 1.25, "y": 4 },
184 { "label": "Alt", "matrix": [4, 2], "w": 1.25, "x": 2.5, "y": 4 },
185 { "label": "k46", "matrix": [4, 6], "w": 6, "x": 3.75, "y": 4 },
186 { "label": "Alt", "matrix": [4, 10], "w": 1.25, "x": 9.75, "y": 4 },
187 { "label": "Ctrl", "matrix": [4, 11], "w": 1.25, "x": 11, "y": 4 },
188 { "label": "Menu", "matrix": [4, 12], "w": 1.25, "x": 12.25, "y": 4 },
189 { "label": "\u2190", "matrix": [4, 13], "w": 1, "x": 13.5, "y": 4 },
190 { "label": "\u2193", "matrix": [4, 14], "w": 1, "x": 14.5, "y": 4 },
191 { "label": "\u2192", "matrix": [4, 15], "w": 1, "x": 15.5, "y": 4 }
192 ]
193 },
194 "LAYOUT_all": {
195 "key_count": 73,
196 "layout": [
197 { "label": "GRAVE", "matrix": [0, 0], "w": 1, "x": 0, "y": 0 },
198 { "label": "1", "matrix": [0, 1], "w": 1, "x": 1, "y": 0 },
199 { "label": "2", "matrix": [0, 2], "w": 1, "x": 2, "y": 0 },
200 { "label": "3", "matrix": [0, 3], "w": 1, "x": 3, "y": 0 },
201 { "label": "4", "matrix": [0, 4], "w": 1, "x": 4, "y": 0 },
202 { "label": "5", "matrix": [0, 5], "w": 1, "x": 5, "y": 0 },
203 { "label": "6", "matrix": [0, 6], "w": 1, "x": 6, "y": 0 },
204 { "label": "7", "matrix": [0, 7], "w": 1, "x": 7, "y": 0 },
205 { "label": "8", "matrix": [0, 8], "w": 1, "x": 8, "y": 0 },
206 { "label": "9", "matrix": [0, 9], "w": 1, "x": 9, "y": 0 },
207 { "label": "0", "matrix": [0, 10], "w": 1, "x": 10, "y": 0 },
208 { "label": "DASH", "matrix": [0, 11], "w": 1, "x": 11, "y": 0 },
209 { "label": "EQUALSIGN", "matrix": [0, 12], "w": 1, "x": 12, "y": 0 },
210 { "label": "YEN", "matrix": [0, 13], "w": 1, "x": 13, "y": 0 },
211 { "label": "BACKSPACE", "matrix": [0, 14], "w": 1, "x": 14, "y": 0 },
212 { "label": "PAGEUP", "matrix": [0, 15], "w": 1, "x": 15.5, "y": 0 },
213 { "label": "TAB", "matrix": [1, 0], "w": 1.5, "x": 0, "y": 1 },
214 { "label": "Q", "matrix": [1, 1], "w": 1, "x": 1.5, "y": 1 },
215 { "label": "W", "matrix": [1, 2], "w": 1, "x": 2.5, "y": 1 },
216 { "label": "E", "matrix": [1, 3], "w": 1, "x": 3.5, "y": 1 },
217 { "label": "R", "matrix": [1, 4], "w": 1, "x": 4.5, "y": 1 },
218 { "label": "T", "matrix": [1, 5], "w": 1, "x": 5.5, "y": 1 },
219 { "label": "Y", "matrix": [1, 6], "w": 1, "x": 6.5, "y": 1 },
220 { "label": "U", "matrix": [1, 7], "w": 1, "x": 7.5, "y": 1 },
221 { "label": "I", "matrix": [1, 8], "w": 1, "x": 8.5, "y": 1 },
222 { "label": "O", "matrix": [1, 9], "w": 1, "x": 9.5, "y": 1 },
223 { "label": "P", "matrix": [1, 10], "w": 1, "x": 10.5, "y": 1 },
224 { "label": "LBRACKET", "matrix": [1, 11], "w": 1, "x": 11.5, "y": 1 },
225 { "label": "RBRACKET", "matrix": [1, 12], "w": 1, "x": 12.5, "y": 1 },
226 { "label": "BACKSLASH", "matrix": [1, 13], "w": 1.5, "x": 13.5, "y": 1 },
227 { "label": "PAGEDOWN", "matrix": [1, 15], "w": 1, "x": 15.5, "y": 1 },
228 { "label": "CAPSLOCK", "matrix": [2, 0], "w": 1.75, "x": 0, "y": 2 },
229 { "label": "A", "matrix": [2, 1], "w": 1, "x": 1.75, "y": 2 },
230 { "label": "S", "matrix": [2, 2], "w": 1, "x": 2.75, "y": 2 },
231 { "label": "D", "matrix": [2, 3], "w": 1, "x": 3.75, "y": 2 },
232 { "label": "F", "matrix": [2, 4], "w": 1, "x": 4.75, "y": 2 },
233 { "label": "G", "matrix": [2, 5], "w": 1, "x": 5.75, "y": 2 },
234 { "label": "H", "matrix": [2, 6], "w": 1, "x": 6.75, "y": 2 },
235 { "label": "J", "matrix": [2, 7], "w": 1, "x": 7.75, "y": 2 },
236 { "label": "K", "matrix": [2, 8], "w": 1, "x": 8.75, "y": 2 },
237 { "label": "L", "matrix": [2, 9], "w": 1, "x": 9.75, "y": 2 },
238 { "label": "SEMICOLON", "matrix": [2, 10], "w": 1, "x": 10.75, "y": 2 },
239 { "label": "QUOTE", "matrix": [2, 11], "w": 1, "x": 11.75, "y": 2 },
240 { "label": "ISOHASH", "matrix": [2, 12], "w": 1, "x": 12.75, "y": 2 },
241 { "label": "ENTER", "matrix": [2, 13], "w": 1.25, "x": 13.75, "y": 2 },
242 { "label": "LSHIFT", "matrix": [3, 0], "w": 1.25, "x": 0, "y": 3 },
243 { "label": "ISOBACKSLASH", "matrix": [3, 1], "w": 1, "x": 1.25, "y": 3 },
244 { "label": "Z", "matrix": [3, 2], "w": 1, "x": 2.25, "y": 3 },
245 { "label": "X", "matrix": [3, 3], "w": 1, "x": 3.25, "y": 3 },
246 { "label": "C", "matrix": [3, 4], "w": 1, "x": 4.25, "y": 3 },
247 { "label": "V", "matrix": [3, 5], "w": 1, "x": 5.25, "y": 3 },
248 { "label": "B", "matrix": [3, 6], "w": 1, "x": 6.25, "y": 3 },
249 { "label": "N", "matrix": [3, 7], "w": 1, "x": 7.25, "y": 3 },
250 { "label": "M", "matrix": [3, 8], "w": 1, "x": 8.25, "y": 3 },
251 { "label": "COMMA", "matrix": [3, 9], "w": 1, "x": 9.25, "y": 3 },
252 { "label": "PERIOD", "matrix": [3, 10], "w": 1, "x": 10.25, "y": 3 },
253 { "label": "SLASH", "matrix": [3, 11], "w": 1, "x": 11.25, "y": 3 },
254 { "label": "JPBACKSLASH", "matrix": [3, 12], "w": 1, "x": 12.25, "y": 3 },
255 { "label": "RSHIFT", "matrix": [3, 13], "w": 1.25, "x": 13.25, "y": 3 },
256 { "label": "UP", "matrix": [3, 14], "w": 1, "x": 14.5, "y": 3 },
257 { "label": "LCTRL", "matrix": [4, 0], "w": 1.25, "x": 0, "y": 4 },
258 { "label": "LALT", "matrix": [4, 1], "w": 1, "x": 1.25, "y": 4 },
259 { "label": "LCMD", "matrix": [4, 2], "w": 1.25, "x": 2.25, "y": 4 },
260 { "label": "MUHENKAN", "matrix": [4, 3], "w": 1.25, "x": 3.5, "y": 4 },
261 { "label": "SPACE1", "matrix": [4, 5], "w": 2, "x": 4.75, "y": 4 },
262 { "label": "SPACE2", "matrix": [4, 6], "w": 2, "x": 6.75, "y": 4 },
263 { "label": "HENKAN", "matrix": [4, 9], "w": 1.25, "x": 8.75, "y": 4 },
264 { "label": "RCMD", "matrix": [4, 10], "w": 1.25, "x": 10, "y": 4 },
265 { "label": "RCTRL", "matrix": [4, 11], "w": 1, "x": 11.25, "y": 4 },
266 { "label": "FN", "matrix": [4, 12], "w": 1.25, "x": 12.25, "y": 4 },
267 { "label": "LEFT", "matrix": [4, 13], "w": 1, "x": 13.5, "y": 4 },
268 { "label": "DOWN", "matrix": [4, 14], "w": 1, "x": 14.5, "y": 4 },
269 { "label": "RIGHT", "matrix": [4, 15], "w": 1, "x": 15.5, "y": 4 }
270 ]
271 }
272 }
273}
diff --git a/keyboards/clueboard/66/rev1/readme.md b/keyboards/clueboard/66/rev1/readme.md
new file mode 100644
index 000000000..ba6013128
--- /dev/null
+++ b/keyboards/clueboard/66/rev1/readme.md
@@ -0,0 +1,15 @@
1# Clueboard 66%
2
3![Clueboard](https://i.imgur.com/hLePwJu.jpg)
4
5A fully customizable 66% keyboard.
6
7* Keyboard Maintainer: [Zach White](https://github.com/skullydazed)
8* Hardware Supported: Clueboard 66% PCB rev1 (atmega32u4)
9* Hardware Availability: [clueboard.co](https://clueboard.co/)
10
11Make example for this keyboard (after setting up your build environment):
12
13 make clueboard/66/rev1:default
14
15See [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) then the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
diff --git a/keyboards/clueboard/66/rev1/rev1.h b/keyboards/clueboard/66/rev1/rev1.h
index e071f4c79..ef5b3f3e0 100644
--- a/keyboards/clueboard/66/rev1/rev1.h
+++ b/keyboards/clueboard/66/rev1/rev1.h
@@ -1,75 +1,3 @@
1#pragma once 1#pragma once
2 2
3#include "quantum.h" 3#include "quantum.h"
4
5/* Clueboard matrix layout
6 * ,-----------------------------------------------------------. ,---.
7 * | 00| 01| 02| 03| 04| 05| 06| 07| 08| 09| 0A| 0B| 0C| 0D| 0E| | 0F|
8 * |-----------------------------------------------------------| |---|
9 * | 10| 11| 12| 13| 14| 15| 16| 17| 18| 19| 1A| 1B| 1C| 1D| | 1F|
10 * |-----------------------------------------------------------| `---'
11 * | 20| 21| 22| 23| 24| 25| 26| 27| 28| 29| 2A| 2B| 2C| 2D|
12 * |------------------------------------------------------------.
13 * | 30| 31| 32| 33| 34| 35| 36| 37| 38| 39| 3A| 3B| 3C| 3D|3E|
14 * |------------------------------------------------------------------.
15 * | 40| 41| 42| 43| 45| 46| 49| 4A| 4B| 4C| 4D| 4E| 4F|
16 * `------------------------------------------------------------------'
17 * ,-----------------------------------------------------------. ,---.
18 * | `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Yen| BS| |Ins|
19 * |-----------------------------------------------------------| |---|
20 * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \| |Del|
21 * |-----------------------------------------------------------| `---'
22 * |Caps | A| S| D| F| G| H| J| k| L| ;| '| # | Ent|
23 * |--------------------------------------------------------------.
24 * |Shift| \| Z| X| C| V| B| N| M| ,| .| /| \|Shift| Up|
25 * |------------------------------------------------------------------.
26 * |Ctrl|Alt|Gui |MHen| Space| Space|Henk|Gui |Ctrl| Fn|Left|Down|Rgt|
27 * `------------------------------------------------------------------'
28 */
29// The first section contains all of the arguements
30// The second converts the arguments into a two-dimensional array
31
32#define LAYOUT_all( \
33 k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0A, k0B, k0C, k0D, k0E, k0F, \
34 k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1A, k1B, k1C, k1D, k1F, \
35 k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2A, k2B, k2C, k2D, \
36 k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3A, k3B, k3C, k3D, k3E, \
37 k40, k41, k42, k43, k45, k46, k49, k4A, k4B, k4C, k4D, k4E, k4F \
38) { \
39 { k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0A, k0B, k0C, k0D, k0E, k0F }, \
40 { k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1A, k1B, k1C, k1D, KC_NO, k1F }, \
41 { k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2A, k2B, k2C, k2D }, \
42 { k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3A, k3B, k3C, k3D, k3E }, \
43 { k40, k41, k42, k43, KC_NO, k45, k46, KC_NO, KC_NO, k49, k4A, k4B, k4C, k4D, k4E, k4F } \
44}
45
46#define LAYOUT_66_ansi( \
47 k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0A, k0B, k0C, k0E, k0F, \
48 k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1A, k1B, k1C, k1D, k1F, \
49 k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2A, k2B, k2D, \
50 k30, k32, k33, k34, k35, k36, k37, k38, k39, k3A, k3B, k3D, k3E, \
51 k40, k41, k42, k46, k4A, k4B, k4C, k4D, k4E, k4F \
52) { \
53 { k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0A, k0B, k0C, KC_NO, k0E, k0F }, \
54 { k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1A, k1B, k1C, k1D, KC_NO, k1F }, \
55 { k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2A, k2B, KC_NO, k2D }, \
56 { k30, KC_NO, k32, k33, k34, k35, k36, k37, k38, k39, k3A, k3B, KC_NO, k3D, k3E }, \
57 { k40, k41, k42, KC_NO, KC_NO, KC_NO, k46, KC_NO, KC_NO, KC_NO, k4A, k4B, k4C, k4D, k4E, k4F } \
58}
59
60#define LAYOUT_66_iso( \
61 k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0A, k0B, k0C, k0E, k0F, \
62 k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1A, k1B, k1C, k1F, \
63 k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2A, k2B, k2C, k2D, \
64 k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3A, k3B, k3D, k3E, \
65 k40, k41, k42, k46, k4A, k4B, k4C, k4D, k4E, k4F \
66) { \
67 { k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0A, k0B, k0C, KC_NO, k0E, k0F }, \
68 { k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1A, k1B, k1C, KC_NO, KC_NO, k1F }, \
69 { k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2A, k2B, k2C, k2D }, \
70 { k30, k31, k32, k33, k34, k35, k36, k37, k38, k39, k3A, k3B, KC_NO, k3D, k3E }, \
71 { k40, k41, k42, KC_NO, KC_NO, KC_NO, k46, KC_NO, KC_NO, KC_NO, k4A, k4B, k4C, k4D, k4E, k4F } \
72}
73
74#define KEYMAP LAYOUT_all
75#define LAYOUT LAYOUT_all
diff --git a/keyboards/clueboard/66/rev1/rules.mk b/keyboards/clueboard/66/rev1/rules.mk
index 84b5dee21..2f20507d4 100644
--- a/keyboards/clueboard/66/rev1/rules.mk
+++ b/keyboards/clueboard/66/rev1/rules.mk
@@ -10,21 +10,3 @@ MCU = atmega32u4
10# ATmega32A bootloadHID 10# ATmega32A bootloadHID
11# ATmega328P USBasp 11# ATmega328P USBasp
12BOOTLOADER = atmel-dfu 12BOOTLOADER = atmel-dfu
13
14# Build Options
15# comment out to disable the options.
16#
17BACKLIGHT_ENABLE = no
18BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration
19MOUSEKEY_ENABLE = yes # Mouse keys
20EXTRAKEY_ENABLE = yes # Audio control and System control
21CONSOLE_ENABLE = yes # Console for debug
22COMMAND_ENABLE = no # Commands for debug and configuration
23NKRO_ENABLE = yes # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
24AUDIO_ENABLE = no
25RGBLIGHT_ENABLE = no # Enable keyboard underlight functionality
26MIDI_ENABLE = no # MIDI controls
27UNICODE_ENABLE = no # Unicode
28BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
29
30LAYOUTS = 66_ansi 66_iso
diff --git a/keyboards/clueboard/66/rev2/config.h b/keyboards/clueboard/66/rev2/config.h
index a1e4804ca..e226d71ea 100644
--- a/keyboards/clueboard/66/rev2/config.h
+++ b/keyboards/clueboard/66/rev2/config.h
@@ -2,68 +2,12 @@
2 2
3#include "config_common.h" 3#include "config_common.h"
4 4
5/* USB Device descriptor parameter */
6#define VENDOR_ID 0xC1ED
7#define PRODUCT_ID 0x2320
8#define DEVICE_VER 0x0001
9#define MANUFACTURER Clueboard
10#define PRODUCT Clueboard
11#define DESCRIPTION QMK keyboard firmware for Clueboard
12
13/* key matrix size */
14#define MATRIX_ROWS 10
15#define MATRIX_COLS 8
16
17/* ROWS: Top to bottom, COLS: Left to right
18*/
19#define MATRIX_ROW_PINS { B2, C7, C6, B6, B5, B0, B3, D5, D3, D2 }
20#define MATRIX_COL_PINS { F0, F1, F4, F5, F6, F7, E6, B1 }
21#define UNUSED_PINS
22
23/* COL2ROW or ROW2COL */
24#define DIODE_DIRECTION COL2ROW
25
26/* Set 0 if debouncing isn't needed */
27#define DEBOUNCE 5
28
29/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
30#define LOCKING_SUPPORT_ENABLE
31/* Locking resynchronize hack */
32#define LOCKING_RESYNC_ENABLE
33
34/*
35 * Feature disable options
36 * These options are also useful to firmware size reduction.
37 */
38
39/* disable debug print */
40//#define NO_DEBUG
41
42/* disable print */
43//#define NO_PRINT
44
45/* disable action features */
46//#define NO_ACTION_LAYER
47//#define NO_ACTION_TAPPING
48//#define NO_ACTION_ONESHOT
49//#define NO_ACTION_MACRO
50//#define NO_ACTION_FUNCTION
51
52#define LED_CAPS_LOCK_PIN B4
53
54/* Backlight configuration 5/* Backlight configuration
55 */ 6 */
56#define BACKLIGHT_LEVELS 1 7#define BACKLIGHT_LEVELS 1
57 8
58/* Underlight configuration 9/* Underlight configuration
59 */ 10 */
60#define RGB_DI_PIN D7
61#define RGBLED_NUM 14 // Number of LEDs
62#define RGBLIGHT_HUE_STEP 32
63#define RGBLIGHT_SAT_STEP 17
64#define RGBLIGHT_VAL_STEP 17
65
66#define RGBLIGHT_ANIMATIONS
67#define RGBLIGHT_EFFECT_BREATHE_CENTER 1 11#define RGBLIGHT_EFFECT_BREATHE_CENTER 1
68#define RGBLIGHT_EFFECT_BREATHE_MAX 200 12#define RGBLIGHT_EFFECT_BREATHE_MAX 200
69#define RGBLIGHT_EFFECT_CHRISTMAS_INTERVAL 666*2 13#define RGBLIGHT_EFFECT_CHRISTMAS_INTERVAL 666*2
diff --git a/keyboards/clueboard/66/rev2/info.json b/keyboards/clueboard/66/rev2/info.json
new file mode 100644
index 000000000..4560ec7e8
--- /dev/null
+++ b/keyboards/clueboard/66/rev2/info.json
@@ -0,0 +1,273 @@
1{
2 "manufacturer": "Clueboard",
3 "keyboard_name": "Clueboard 66%",
4 "maintainer": "skullydazed",
5 "height": 5,
6 "width": 16.5,
7 "debounce": "5",
8 "diode_direction": "COL2ROW",
9 "features": {
10 "audio": false,
11 "backlight": true,
12 "bluetooth": false,
13 "bootmagic": false,
14 "command": false,
15 "console": true,
16 "extrakey": true,
17 "midi": false,
18 "mousekey": true,
19 "nkro": true,
20 "rgblight": true,
21 "unicode": false
22 },
23 "indicators": {
24 "caps_lock": "B4"
25 },
26 "matrix_pins": {
27 "cols": ["F0", " F1", " F4", " F5", " F6", " F7", " E6", " B1"],
28 "rows": ["B2", " C7", " C6", " B6", " B5", " B0", " B3", " D5", " D3", " D2"]
29 },
30 "rgblight": {
31 "animations": {
32 "all": true
33 },
34 "brightness_steps": "17",
35 "hue_steps": "32",
36 "led_count": "14",
37 "pin": "D7",
38 "saturation_steps": "17"
39 },
40 "usb": {
41 "device_ver": "0x0001",
42 "pid": "0x2320",
43 "vid": "0xC1ED"
44 },
45 "community_layouts": ["66_ansi", "66_iso"],
46 "layout_aliases": {
47 "KEYMAP": "LAYOUT_all",
48 "LAYOUT": "LAYOUT_all"
49 },
50 "layouts": {
51 "LAYOUT_66_ansi": {
52 "key_count": 66,
53 "layout": [
54 { "label": "~", "matrix": [0, 0], "w": 1, "x": 0, "y": 0 },
55 { "label": "!", "matrix": [0, 1], "w": 1, "x": 1, "y": 0 },
56 { "label": "@", "matrix": [0, 2], "w": 1, "x": 2, "y": 0 },
57 { "label": "#", "matrix": [0, 3], "w": 1, "x": 3, "y": 0 },
58 { "label": "$", "matrix": [0, 4], "w": 1, "x": 4, "y": 0 },
59 { "label": "%", "matrix": [0, 5], "w": 1, "x": 5, "y": 0 },
60 { "label": "^", "matrix": [0, 6], "w": 1, "x": 6, "y": 0 },
61 { "label": "&", "matrix": [0, 7], "w": 1, "x": 7, "y": 0 },
62 { "label": "*", "matrix": [5, 0], "w": 1, "x": 8, "y": 0 },
63 { "label": "(", "matrix": [5, 1], "w": 1, "x": 9, "y": 0 },
64 { "label": ")", "matrix": [5, 2], "w": 1, "x": 10, "y": 0 },
65 { "label": "_", "matrix": [5, 3], "w": 1, "x": 11, "y": 0 },
66 { "label": "+", "matrix": [5, 4], "w": 1, "x": 12, "y": 0 },
67 { "label": "Backspace", "matrix": [5, 6], "w": 2, "x": 13, "y": 0 },
68 { "label": "k57", "matrix": [5, 7], "w": 1, "x": 15.5, "y": 0 },
69 { "label": "Tab", "matrix": [1, 0], "w": 1.5, "x": 0, "y": 1 },
70 { "label": "Q", "matrix": [1, 1], "w": 1, "x": 1.5, "y": 1 },
71 { "label": "W", "matrix": [1, 2], "w": 1, "x": 2.5, "y": 1 },
72 { "label": "E", "matrix": [1, 3], "w": 1, "x": 3.5, "y": 1 },
73 { "label": "R", "matrix": [1, 4], "w": 1, "x": 4.5, "y": 1 },
74 { "label": "T", "matrix": [1, 5], "w": 1, "x": 5.5, "y": 1 },
75 { "label": "Y", "matrix": [1, 6], "w": 1, "x": 6.5, "y": 1 },
76 { "label": "U", "matrix": [1, 7], "w": 1, "x": 7.5, "y": 1 },
77 { "label": "I", "matrix": [6, 0], "w": 1, "x": 8.5, "y": 1 },
78 { "label": "O", "matrix": [6, 1], "w": 1, "x": 9.5, "y": 1 },
79 { "label": "P", "matrix": [6, 2], "w": 1, "x": 10.5, "y": 1 },
80 { "label": "{", "matrix": [6, 3], "w": 1, "x": 11.5, "y": 1 },
81 { "label": "}", "matrix": [6, 4], "w": 1, "x": 12.5, "y": 1 },
82 { "label": "|", "matrix": [6, 5], "w": 1.5, "x": 13.5, "y": 1 },
83 { "label": "k67", "matrix": [6, 7], "w": 1, "x": 15.5, "y": 1 },
84 { "label": "Caps Lock", "matrix": [2, 0], "w": 1.75, "x": 0, "y": 2 },
85 { "label": "A", "matrix": [2, 1], "w": 1, "x": 1.75, "y": 2 },
86 { "label": "S", "matrix": [2, 2], "w": 1, "x": 2.75, "y": 2 },
87 { "label": "D", "matrix": [2, 3], "w": 1, "x": 3.75, "y": 2 },
88 { "label": "F", "matrix": [2, 4], "w": 1, "x": 4.75, "y": 2 },
89 { "label": "G", "matrix": [2, 5], "w": 1, "x": 5.75, "y": 2 },
90 { "label": "H", "matrix": [2, 6], "w": 1, "x": 6.75, "y": 2 },
91 { "label": "J", "matrix": [2, 7], "w": 1, "x": 7.75, "y": 2 },
92 { "label": "K", "matrix": [7, 0], "w": 1, "x": 8.75, "y": 2 },
93 { "label": "L", "matrix": [7, 1], "w": 1, "x": 9.75, "y": 2 },
94 { "label": ":", "matrix": [7, 2], "w": 1, "x": 10.75, "y": 2 },
95 { "label": "\"", "matrix": [7, 3], "w": 1, "x": 11.75, "y": 2 },
96 { "label": "Enter", "matrix": [7, 5], "w": 2.25, "x": 12.75, "y": 2 },
97 { "label": "Shift", "matrix": [3, 0], "w": 2.25, "x": 0, "y": 3 },
98 { "label": "Z", "matrix": [3, 2], "w": 1, "x": 2.25, "y": 3 },
99 { "label": "X", "matrix": [3, 3], "w": 1, "x": 3.25, "y": 3 },
100 { "label": "C", "matrix": [3, 4], "w": 1, "x": 4.25, "y": 3 },
101 { "label": "V", "matrix": [3, 5], "w": 1, "x": 5.25, "y": 3 },
102 { "label": "B", "matrix": [3, 6], "w": 1, "x": 6.25, "y": 3 },
103 { "label": "N", "matrix": [3, 7], "w": 1, "x": 7.25, "y": 3 },
104 { "label": "M", "matrix": [8, 0], "w": 1, "x": 8.25, "y": 3 },
105 { "label": "<", "matrix": [8, 1], "w": 1, "x": 9.25, "y": 3 },
106 { "label": ">", "matrix": [8, 2], "w": 1, "x": 10.25, "y": 3 },
107 { "label": "?", "matrix": [8, 3], "w": 1, "x": 11.25, "y": 3 },
108 { "label": "Shift", "matrix": [8, 5], "w": 2.25, "x": 12.25, "y": 3 },
109 { "label": "k86", "matrix": [8, 6], "w": 1, "x": 14.5, "y": 3 },
110 { "label": "Ctrl", "matrix": [4, 0], "w": 1.25, "x": 0, "y": 4 },
111 { "label": "Win", "matrix": [4, 1], "w": 1.25, "x": 1.25, "y": 4 },
112 { "label": "Alt", "matrix": [4, 2], "w": 1.25, "x": 2.5, "y": 4 },
113 { "label": "k46", "matrix": [4, 6], "w": 6, "x": 3.75, "y": 4 },
114 { "label": "Alt", "matrix": [9, 2], "w": 1.25, "x": 9.75, "y": 4 },
115 { "label": "Win", "matrix": [9, 3], "w": 1.25, "x": 11, "y": 4 },
116 { "label": "Menu", "matrix": [9, 4], "w": 1.25, "x": 12.25, "y": 4 },
117 { "label": "k95", "matrix": [9, 5], "w": 1, "x": 13.5, "y": 4 },
118 { "label": "k96", "matrix": [9, 6], "w": 1, "x": 14.5, "y": 4 },
119 { "label": "k97", "matrix": [9, 7], "w": 1, "x": 15.5, "y": 4 }
120 ]
121 },
122 "LAYOUT_66_iso": {
123 "key_count": 67,
124 "layout": [
125 { "label": "~", "matrix": [0, 0], "w": 1, "x": 0, "y": 0 },
126 { "label": "!", "matrix": [0, 1], "w": 1, "x": 1, "y": 0 },
127 { "label": "@", "matrix": [0, 2], "w": 1, "x": 2, "y": 0 },
128 { "label": "#", "matrix": [0, 3], "w": 1, "x": 3, "y": 0 },
129 { "label": "$", "matrix": [0, 4], "w": 1, "x": 4, "y": 0 },
130 { "label": "%", "matrix": [0, 5], "w": 1, "x": 5, "y": 0 },
131 { "label": "^", "matrix": [0, 6], "w": 1, "x": 6, "y": 0 },
132 { "label": "&", "matrix": [0, 7], "w": 1, "x": 7, "y": 0 },
133 { "label": "*", "matrix": [5, 0], "w": 1, "x": 8, "y": 0 },
134 { "label": "(", "matrix": [5, 1], "w": 1, "x": 9, "y": 0 },
135 { "label": ")", "matrix": [5, 2], "w": 1, "x": 10, "y": 0 },
136 { "label": "_", "matrix": [5, 3], "w": 1, "x": 11, "y": 0 },
137 { "label": "+", "matrix": [5, 4], "w": 1, "x": 12, "y": 0 },
138 { "label": "Backspace", "matrix": [5, 6], "w": 2, "x": 13, "y": 0 },
139 { "label": "Insert", "matrix": [5, 7], "w": 1, "x": 15.5, "y": 0 },
140 { "label": "Tab", "matrix": [1, 0], "w": 1.5, "x": 0, "y": 1 },
141 { "label": "Q", "matrix": [1, 1], "w": 1, "x": 1.5, "y": 1 },
142 { "label": "W", "matrix": [1, 2], "w": 1, "x": 2.5, "y": 1 },
143 { "label": "E", "matrix": [1, 3], "w": 1, "x": 3.5, "y": 1 },
144 { "label": "R", "matrix": [1, 4], "w": 1, "x": 4.5, "y": 1 },
145 { "label": "T", "matrix": [1, 5], "w": 1, "x": 5.5, "y": 1 },
146 { "label": "Y", "matrix": [1, 6], "w": 1, "x": 6.5, "y": 1 },
147 { "label": "U", "matrix": [1, 7], "w": 1, "x": 7.5, "y": 1 },
148 { "label": "I", "matrix": [6, 0], "w": 1, "x": 8.5, "y": 1 },
149 { "label": "O", "matrix": [6, 1], "w": 1, "x": 9.5, "y": 1 },
150 { "label": "P", "matrix": [6, 2], "w": 1, "x": 10.5, "y": 1 },
151 { "label": "{", "matrix": [6, 3], "w": 1, "x": 11.5, "y": 1 },
152 { "label": "}", "matrix": [6, 4], "w": 1, "x": 12.5, "y": 1 },
153 { "label": "Delete", "matrix": [6, 7], "w": 1, "x": 15.5, "y": 1 },
154 { "label": "Caps Lock", "matrix": [2, 0], "w": 1.75, "x": 0, "y": 2 },
155 { "label": "A", "matrix": [2, 1], "w": 1, "x": 1.75, "y": 2 },
156 { "label": "S", "matrix": [2, 2], "w": 1, "x": 2.75, "y": 2 },
157 { "label": "D", "matrix": [2, 3], "w": 1, "x": 3.75, "y": 2 },
158 { "label": "F", "matrix": [2, 4], "w": 1, "x": 4.75, "y": 2 },
159 { "label": "G", "matrix": [2, 5], "w": 1, "x": 5.75, "y": 2 },
160 { "label": "H", "matrix": [2, 6], "w": 1, "x": 6.75, "y": 2 },
161 { "label": "J", "matrix": [2, 7], "w": 1, "x": 7.75, "y": 2 },
162 { "label": "K", "matrix": [7, 0], "w": 1, "x": 8.75, "y": 2 },
163 { "label": "L", "matrix": [7, 1], "w": 1, "x": 9.75, "y": 2 },
164 { "label": ":", "matrix": [7, 2], "w": 1, "x": 10.75, "y": 2 },
165 { "label": "\"", "matrix": [7, 3], "w": 1, "x": 11.75, "y": 2 },
166 { "label": "", "matrix": [7, 4], "w": 1, "x": 12.75, "y": 2 },
167 { "h": 2, "label": "Enter", "matrix": [7, 5], "w": 1.25, "x": 13.75, "y": 1 },
168 { "label": "Shift", "matrix": [3, 0], "w": 1.25, "x": 0, "y": 3 },
169 { "label": "\\", "matrix": [3, 1], "w": 1, "x": 1.25, "y": 3 },
170 { "label": "Z", "matrix": [3, 2], "w": 1, "x": 2.25, "y": 3 },
171 { "label": "X", "matrix": [3, 3], "w": 1, "x": 3.25, "y": 3 },
172 { "label": "C", "matrix": [3, 4], "w": 1, "x": 4.25, "y": 3 },
173 { "label": "V", "matrix": [3, 5], "w": 1, "x": 5.25, "y": 3 },
174 { "label": "B", "matrix": [3, 6], "w": 1, "x": 6.25, "y": 3 },
175 { "label": "N", "matrix": [3, 7], "w": 1, "x": 7.25, "y": 3 },
176 { "label": "M", "matrix": [8, 0], "w": 1, "x": 8.25, "y": 3 },
177 { "label": "<", "matrix": [8, 1], "w": 1, "x": 9.25, "y": 3 },
178 { "label": ">", "matrix": [8, 2], "w": 1, "x": 10.25, "y": 3 },
179 { "label": "?", "matrix": [8, 3], "w": 1, "x": 11.25, "y": 3 },
180 { "label": "Shift", "matrix": [8, 5], "w": 2.25, "x": 12.25, "y": 3 },
181 { "label": "\u2191", "matrix": [8, 6], "w": 1, "x": 14.5, "y": 3 },
182 { "label": "Ctrl", "matrix": [4, 0], "w": 1.25, "x": 0, "y": 4 },
183 { "label": "Win", "matrix": [4, 1], "w": 1.25, "x": 1.25, "y": 4 },
184 { "label": "Alt", "matrix": [4, 2], "w": 1.25, "x": 2.5, "y": 4 },
185 { "label": "k46", "matrix": [4, 6], "w": 6, "x": 3.75, "y": 4 },
186 { "label": "Alt", "matrix": [9, 2], "w": 1.25, "x": 9.75, "y": 4 },
187 { "label": "Ctrl", "matrix": [9, 3], "w": 1.25, "x": 11, "y": 4 },
188 { "label": "Menu", "matrix": [9, 4], "w": 1.25, "x": 12.25, "y": 4 },
189 { "label": "\u2190", "matrix": [9, 5], "w": 1, "x": 13.5, "y": 4 },
190 { "label": "\u2193", "matrix": [9, 6], "w": 1, "x": 14.5, "y": 4 },
191 { "label": "\u2192", "matrix": [9, 7], "w": 1, "x": 15.5, "y": 4 }
192 ]
193 },
194 "LAYOUT_all": {
195 "key_count": 73,
196 "layout": [
197 { "label": "GRAVE", "matrix": [0, 0], "w": 1, "x": 0, "y": 0 },
198 { "label": "1", "matrix": [0, 1], "w": 1, "x": 1, "y": 0 },
199 { "label": "2", "matrix": [0, 2], "w": 1, "x": 2, "y": 0 },
200 { "label": "3", "matrix": [0, 3], "w": 1, "x": 3, "y": 0 },
201 { "label": "4", "matrix": [0, 4], "w": 1, "x": 4, "y": 0 },
202 { "label": "5", "matrix": [0, 5], "w": 1, "x": 5, "y": 0 },
203 { "label": "6", "matrix": [0, 6], "w": 1, "x": 6, "y": 0 },
204 { "label": "7", "matrix": [0, 7], "w": 1, "x": 7, "y": 0 },
205 { "label": "8", "matrix": [5, 0], "w": 1, "x": 8, "y": 0 },
206 { "label": "9", "matrix": [5, 1], "w": 1, "x": 9, "y": 0 },
207 { "label": "0", "matrix": [5, 2], "w": 1, "x": 10, "y": 0 },
208 { "label": "DASH", "matrix": [5, 3], "w": 1, "x": 11, "y": 0 },
209 { "label": "EQUALSIGN", "matrix": [5, 4], "w": 1, "x": 12, "y": 0 },
210 { "label": "YEN", "matrix": [5, 5], "w": 1, "x": 13, "y": 0 },
211 { "label": "BACKSPACE", "matrix": [5, 6], "w": 1, "x": 14, "y": 0 },
212 { "label": "PAGEUP", "matrix": [5, 7], "w": 1, "x": 15.5, "y": 0 },
213 { "label": "TAB", "matrix": [1, 0], "w": 1.5, "x": 0, "y": 1 },
214 { "label": "Q", "matrix": [1, 1], "w": 1, "x": 1.5, "y": 1 },
215 { "label": "W", "matrix": [1, 2], "w": 1, "x": 2.5, "y": 1 },
216 { "label": "E", "matrix": [1, 3], "w": 1, "x": 3.5, "y": 1 },
217 { "label": "R", "matrix": [1, 4], "w": 1, "x": 4.5, "y": 1 },
218 { "label": "T", "matrix": [1, 5], "w": 1, "x": 5.5, "y": 1 },
219 { "label": "Y", "matrix": [1, 6], "w": 1, "x": 6.5, "y": 1 },
220 { "label": "U", "matrix": [1, 7], "w": 1, "x": 7.5, "y": 1 },
221 { "label": "I", "matrix": [6, 0], "w": 1, "x": 8.5, "y": 1 },
222 { "label": "O", "matrix": [6, 1], "w": 1, "x": 9.5, "y": 1 },
223 { "label": "P", "matrix": [6, 2], "w": 1, "x": 10.5, "y": 1 },
224 { "label": "LBRACKET", "matrix": [6, 3], "w": 1, "x": 11.5, "y": 1 },
225 { "label": "RBRACKET", "matrix": [6, 4], "w": 1, "x": 12.5, "y": 1 },
226 { "label": "BACKSLASH", "matrix": [6, 5], "w": 1.5, "x": 13.5, "y": 1 },
227 { "label": "PAGEDOWN", "matrix": [6, 7], "w": 1, "x": 15.5, "y": 1 },
228 { "label": "CAPSLOCK", "matrix": [2, 0], "w": 1.75, "x": 0, "y": 2 },
229 { "label": "A", "matrix": [2, 1], "w": 1, "x": 1.75, "y": 2 },
230 { "label": "S", "matrix": [2, 2], "w": 1, "x": 2.75, "y": 2 },
231 { "label": "D", "matrix": [2, 3], "w": 1, "x": 3.75, "y": 2 },
232 { "label": "F", "matrix": [2, 4], "w": 1, "x": 4.75, "y": 2 },
233 { "label": "G", "matrix": [2, 5], "w": 1, "x": 5.75, "y": 2 },
234 { "label": "H", "matrix": [2, 6], "w": 1, "x": 6.75, "y": 2 },
235 { "label": "J", "matrix": [2, 7], "w": 1, "x": 7.75, "y": 2 },
236 { "label": "K", "matrix": [7, 0], "w": 1, "x": 8.75, "y": 2 },
237 { "label": "L", "matrix": [7, 1], "w": 1, "x": 9.75, "y": 2 },
238 { "label": "SEMICOLON", "matrix": [7, 2], "w": 1, "x": 10.75, "y": 2 },
239 { "label": "QUOTE", "matrix": [7, 3], "w": 1, "x": 11.75, "y": 2 },
240 { "label": "ISOHASH", "matrix": [7, 4], "w": 1, "x": 12.75, "y": 2 },
241 { "label": "ENTER", "matrix": [7, 5], "w": 1.25, "x": 13.75, "y": 2 },
242 { "label": "LSHIFT", "matrix": [3, 0], "w": 1.25, "x": 0, "y": 3 },
243 { "label": "ISOBACKSLASH", "matrix": [3, 1], "w": 1, "x": 1.25, "y": 3 },
244 { "label": "Z", "matrix": [3, 2], "w": 1, "x": 2.25, "y": 3 },
245 { "label": "X", "matrix": [3, 3], "w": 1, "x": 3.25, "y": 3 },
246 { "label": "C", "matrix": [3, 4], "w": 1, "x": 4.25, "y": 3 },
247 { "label": "V", "matrix": [3, 5], "w": 1, "x": 5.25, "y": 3 },
248 { "label": "B", "matrix": [3, 6], "w": 1, "x": 6.25, "y": 3 },
249 { "label": "N", "matrix": [3, 7], "w": 1, "x": 7.25, "y": 3 },
250 { "label": "M", "matrix": [8, 0], "w": 1, "x": 8.25, "y": 3 },
251 { "label": "COMMA", "matrix": [8, 1], "w": 1, "x": 9.25, "y": 3 },
252 { "label": "PERIOD", "matrix": [8, 2], "w": 1, "x": 10.25, "y": 3 },
253 { "label": "SLASH", "matrix": [8, 3], "w": 1, "x": 11.25, "y": 3 },
254 { "label": "JPBACKSLASH", "matrix": [8, 4], "w": 1, "x": 12.25, "y": 3 },
255 { "label": "RSHIFT", "matrix": [8, 5], "w": 1.25, "x": 13.25, "y": 3 },
256 { "label": "UP", "matrix": [8, 6], "w": 1, "x": 14.5, "y": 3 },
257 { "label": "LCTRL", "matrix": [4, 0], "w": 1.25, "x": 0, "y": 4 },
258 { "label": "LALT", "matrix": [4, 1], "w": 1, "x": 1.25, "y": 4 },
259 { "label": "LCMD", "matrix": [4, 2], "w": 1.25, "x": 2.25, "y": 4 },
260 { "label": "MUHENKAN", "matrix": [4, 3], "w": 1.25, "x": 3.5, "y": 4 },
261 { "label": "SPACE1", "matrix": [4, 5], "w": 2, "x": 4.75, "y": 4 },
262 { "label": "SPACE2", "matrix": [4, 6], "w": 2, "x": 6.75, "y": 4 },
263 { "label": "HENKAN", "matrix": [9, 0], "w": 1.25, "x": 8.75, "y": 4 },
264 { "label": "RCMD", "matrix": [9, 2], "w": 1.25, "x": 10, "y": 4 },
265 { "label": "RCTRL", "matrix": [9, 3], "w": 1, "x": 11.25, "y": 4 },
266 { "label": "FN", "matrix": [9, 4], "w": 1.25, "x": 12.25, "y": 4 },
267 { "label": "LEFT", "matrix": [9, 5], "w": 1, "x": 13.5, "y": 4 },
268 { "label": "DOWN", "matrix": [9, 6], "w": 1, "x": 14.5, "y": 4 },
269 { "label": "RIGHT", "matrix": [9, 7], "w": 1, "x": 15.5, "y": 4 }
270 ]
271 }
272 }
273}
diff --git a/keyboards/clueboard/66/rev2/readme.md b/keyboards/clueboard/66/rev2/readme.md
new file mode 100644
index 000000000..9943ec695
--- /dev/null
+++ b/keyboards/clueboard/66/rev2/readme.md
@@ -0,0 +1,15 @@
1# Clueboard 66%
2
3![Clueboard](https://i.imgur.com/hLePwJu.jpg)
4
5A fully customizable 66% keyboard.
6
7* Keyboard Maintainer: [Zach White](https://github.com/skullydazed)
8* Hardware Supported: Clueboard 66% PCB rev2 (atmega32u4)
9* Hardware Availability: [clueboard.co](https://clueboard.co/)
10
11Make example for this keyboard (after setting up your build environment):
12
13 make clueboard/66/rev2:default
14
15See [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) then the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
diff --git a/keyboards/clueboard/66/rev2/rev2.h b/keyboards/clueboard/66/rev2/rev2.h
index 86688c7a1..00bdf1e03 100644
--- a/keyboards/clueboard/66/rev2/rev2.h
+++ b/keyboards/clueboard/66/rev2/rev2.h
@@ -2,93 +2,3 @@
2 2
3#include "quantum.h" 3#include "quantum.h"
4 4
5/* Clueboard matrix layout
6 * ,-----------------------------------------------------------. ,---.
7 * | 00| 01| 02| 03| 04| 05| 06| 07| 50| 51| 52| 53| 54| 55| 56| | 57|
8 * |-----------------------------------------------------------| |---|
9 * | 10| 11| 12| 13| 14| 15| 16| 17| 60| 61| 62| 63| 64| 65| | 67|
10 * |-----------------------------------------------------------| `---'
11 * | 20| 21| 22| 23| 24| 25| 26| 27| 70| 71| 72| 73| 74| 75|
12 * |------------------------------------------------------------.
13 * | 30| 31| 32| 33| 34| 35| 36| 37| 80| 81| 82| 83| 84| 85|86|
14 * |------------------------------------------------------------------.
15 * | 40| 41| 42| 43| 45| 46| 90| 92| 93| 94| 95| 96| 97|
16 * `------------------------------------------------------------------'
17 * ,-----------------------------------------------------------. ,---.
18 * | `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Yen| BS| |Ins|
19 * |-----------------------------------------------------------| |---|
20 * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \| |Del|
21 * |-----------------------------------------------------------| `---'
22 * |Caps | A| S| D| F| G| H| J| k| L| ;| '| # | Ent|
23 * |--------------------------------------------------------------.
24 * |Shift| \| Z| X| C| V| B| N| M| ,| .| /| \|Shift| Up|
25 * |------------------------------------------------------------------.
26 * |Ctrl|Alt|Gui |MHen| Space| Space|Henk|Gui |Ctrl| Fn|Left|Down|Rgt|
27 * `------------------------------------------------------------------'
28 */
29// The first section contains all of the arguments
30// The second converts the arguments into a two-dimensional array
31
32#define LAYOUT_all( \
33 k00, k01, k02, k03, k04, k05, k06, k07, k50, k51, k52, k53, k54, k55, k56, k57, \
34 k10, k11, k12, k13, k14, k15, k16, k17, k60, k61, k62, k63, k64, k65, k67, \
35 k20, k21, k22, k23, k24, k25, k26, k27, k70, k71, k72, k73, k74, k75, \
36 k30, k31, k32, k33, k34, k35, k36, k37, k80, k81, k82, k83, k84, k85, k86, \
37 k40, k41, k42, k43, k45, k46, k90, k92, k93, k94, k95, k96, k97 \
38) { \
39 { k00, k01, k02, k03, k04, k05, k06, k07 }, \
40 { k10, k11, k12, k13, k14, k15, k16, k17 }, \
41 { k20, k21, k22, k23, k24, k25, k26, k27 }, \
42 { k30, k31, k32, k33, k34, k35, k36, k37 }, \
43 { k40, k41, k42, k43, KC_NO, k45, k46, KC_NO }, \
44 { k50, k51, k52, k53, k54, k55, k56, k57 }, \
45 { k60, k61, k62, k63, k64, k65, KC_NO, k67 }, \
46 { k70, k71, k72, k73, k74, k75, KC_NO, KC_NO }, \
47 { k80, k81, k82, k83, k84, k85, k86, KC_NO }, \
48 { k90, KC_NO, k92, k93, k94, k95, k96, k97 } \
49}
50
51/* LAYOUT_66_ansi, standard 66 key ANSI layout
52 */
53#define LAYOUT_66_ansi( \
54 k00, k01, k02, k03, k04, k05, k06, k07, k50, k51, k52, k53, k54, k56, k57, \
55 k10, k11, k12, k13, k14, k15, k16, k17, k60, k61, k62, k63, k64, k65, k67, \
56 k20, k21, k22, k23, k24, k25, k26, k27, k70, k71, k72, k73, k75, \
57 k30, k32, k33, k34, k35, k36, k37, k80, k81, k82, k83, k85, k86, \
58 k40, k41, k42, k46, k92, k93, k94, k95, k96, k97 \
59) { \
60 { k00, k01, k02, k03, k04, k05, k06, k07 }, \
61 { k10, k11, k12, k13, k14, k15, k16, k17 }, \
62 { k20, k21, k22, k23, k24, k25, k26, k27 }, \
63 { k30, KC_NO, k32, k33, k34, k35, k36, k37 }, \
64 { k40, k41, k42, KC_NO, KC_NO, KC_NO, k46, KC_NO }, \
65 { k50, k51, k52, k53, k54, KC_NO, k56, k57 }, \
66 { k60, k61, k62, k63, k64, k65, KC_NO, k67 }, \
67 { k70, k71, k72, k73, KC_NO, k75, KC_NO, KC_NO }, \
68 { k80, k81, k82, k83, KC_NO, k85, k86, KC_NO }, \
69 { KC_NO, KC_NO, k92, k93, k94, k95, k96, k97 } \
70}
71
72/* LAYOUT_66_iso, standard 67 key ISO layout
73 */
74#define LAYOUT_66_iso( \
75 k00, k01, k02, k03, k04, k05, k06, k07, k50, k51, k52, k53, k54, k56, k57, \
76 k10, k11, k12, k13, k14, k15, k16, k17, k60, k61, k62, k63, k64, k67, \
77 k20, k21, k22, k23, k24, k25, k26, k27, k70, k71, k72, k73, k74, k75, \
78 k30, k31, k32, k33, k34, k35, k36, k37, k80, k81, k82, k83, k85, k86, \
79 k40, k41, k42, k46, k92, k93, k94, k95, k96, k97 \
80) { \
81 { k00, k01, k02, k03, k04, k05, k06, k07 }, \
82 { k10, k11, k12, k13, k14, k15, k16, k17 }, \
83 { k20, k21, k22, k23, k24, k25, k26, k27 }, \
84 { k30, k31, k32, k33, k34, k35, k36, k37 }, \
85 { k40, k41, k42, KC_NO, KC_NO, KC_NO, k46, KC_NO }, \
86 { k50, k51, k52, k53, k54, KC_NO, k56, k57 }, \
87 { k60, k61, k62, k63, k64, KC_NO, KC_NO, k67 }, \
88 { k70, k71, k72, k73, k74, k75, KC_NO, KC_NO }, \
89 { k80, k81, k82, k83, KC_NO, k85, k86, KC_NO }, \
90 { KC_NO, KC_NO, k92, k93, k94, k95, k96, k97 } \
91}
92
93#define KEYMAP LAYOUT_all
94#define LAYOUT LAYOUT_all
diff --git a/keyboards/clueboard/66/rev2/rules.mk b/keyboards/clueboard/66/rev2/rules.mk
index 16d9251d6..75fb718e3 100644
--- a/keyboards/clueboard/66/rev2/rules.mk
+++ b/keyboards/clueboard/66/rev2/rules.mk
@@ -12,18 +12,4 @@ MCU = atmega32u4
12BOOTLOADER = atmel-dfu 12BOOTLOADER = atmel-dfu
13 13
14# Build Options 14# Build Options
15BACKLIGHT_ENABLE = yes
16BACKLIGHT_DRIVER = custom 15BACKLIGHT_DRIVER = custom
17BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration
18MOUSEKEY_ENABLE = yes # Mouse keys
19EXTRAKEY_ENABLE = yes # Audio control and System control
20CONSOLE_ENABLE = yes # Console for debug
21COMMAND_ENABLE = no # Commands for debug and configuration
22NKRO_ENABLE = yes # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
23AUDIO_ENABLE = no
24RGBLIGHT_ENABLE = yes # Enable keyboard underlight functionality
25MIDI_ENABLE = no # MIDI controls
26UNICODE_ENABLE = no # Unicode
27BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
28
29LAYOUTS = 66_ansi 66_iso
diff --git a/keyboards/clueboard/66/rev3/config.h b/keyboards/clueboard/66/rev3/config.h
index 2d063d4e6..6ba11f512 100644
--- a/keyboards/clueboard/66/rev3/config.h
+++ b/keyboards/clueboard/66/rev3/config.h
@@ -2,68 +2,10 @@
2 2
3#include "config_common.h" 3#include "config_common.h"
4 4
5/* USB Device descriptor parameter */
6#define VENDOR_ID 0xC1ED
7#define PRODUCT_ID 0x2370
8#define DEVICE_VER 0x0001
9#define MANUFACTURER Clueboard
10#define PRODUCT Clueboard
11#define DESCRIPTION QMK keyboard firmware for Clueboard
12
13/* key matrix size */
14#define MATRIX_ROWS 10
15#define MATRIX_COLS 8
16
17/* ROWS: Top to bottom, COLS: Left to right
18*/
19#define MATRIX_ROW_PINS { B2, C7, C6, B6, B5, B0, B3, D5, D3, D2 }
20#define MATRIX_COL_PINS { F0, F1, F4, F5, F6, F7, E6, B1 }
21#define UNUSED_PINS
22
23/* COL2ROW or ROW2COL */
24#define DIODE_DIRECTION COL2ROW
25
26/* Set 0 if debouncing isn't needed */
27#define DEBOUNCE 5
28
29/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
30#define LOCKING_SUPPORT_ENABLE
31/* Locking resynchronize hack */
32#define LOCKING_RESYNC_ENABLE
33
34/*
35 * Feature disable options
36 * These options are also useful to firmware size reduction.
37 */
38
39/* disable debug print */
40//#define NO_DEBUG
41
42/* disable print */
43//#define NO_PRINT
44
45/* disable action features */
46//#define NO_ACTION_LAYER
47//#define NO_ACTION_TAPPING
48//#define NO_ACTION_ONESHOT
49//#define NO_ACTION_MACRO
50//#define NO_ACTION_FUNCTION
51
52#define LED_CAPS_LOCK_PIN B4
53
54/* Backlight configuration 5/* Backlight configuration
55 */ 6 */
56#define BACKLIGHT_LEVELS 1 7#define BACKLIGHT_LEVELS 1
57 8
58/* Underlight configuration
59 */
60#define RGB_DI_PIN D7
61#define RGBLED_NUM 18 // Number of LEDs
62#define RGBLIGHT_HUE_STEP 32
63#define RGBLIGHT_SAT_STEP 17
64#define RGBLIGHT_VAL_STEP 17
65
66#define RGBLIGHT_ANIMATIONS
67#define RGBLIGHT_EFFECT_BREATHE_CENTER 1 9#define RGBLIGHT_EFFECT_BREATHE_CENTER 1
68#define RGBLIGHT_EFFECT_BREATHE_MAX 200 10#define RGBLIGHT_EFFECT_BREATHE_MAX 200
69#define RGBLIGHT_EFFECT_CHRISTMAS_INTERVAL 666*2 11#define RGBLIGHT_EFFECT_CHRISTMAS_INTERVAL 666*2
diff --git a/keyboards/clueboard/66/rev3/info.json b/keyboards/clueboard/66/rev3/info.json
new file mode 100644
index 000000000..4b9694a2b
--- /dev/null
+++ b/keyboards/clueboard/66/rev3/info.json
@@ -0,0 +1,273 @@
1{
2 "manufacturer": "Clueboard",
3 "keyboard_name": "Clueboard 66% rev3",
4 "maintainer": "skullydazed",
5 "height": 5,
6 "width": 16.5,
7 "debounce": "5",
8 "diode_direction": "COL2ROW",
9 "features": {
10 "audio": false,
11 "backlight": true,
12 "bluetooth": false,
13 "bootmagic": false,
14 "command": false,
15 "console": true,
16 "extrakey": true,
17 "midi": false,
18 "mousekey": true,
19 "nkro": true,
20 "rgblight": true,
21 "unicode": false
22 },
23 "indicators": {
24 "caps_lock": "B4"
25 },
26 "matrix_pins": {
27 "cols": ["F0", " F1", " F4", " F5", " F6", " F7", " E6", " B1"],
28 "rows": ["B2", " C7", " C6", " B6", " B5", " B0", " B3", " D5", " D3", " D2"]
29 },
30 "rgblight": {
31 "animations": {
32 "all": true
33 },
34 "brightness_steps": "17",
35 "hue_steps": "32",
36 "led_count": "18",
37 "pin": "D7",
38 "saturation_steps": "17"
39 },
40 "usb": {
41 "device_ver": "0x0001",
42 "pid": "0x2370",
43 "vid": "0xC1ED"
44 },
45 "community_layouts": ["66_ansi", "66_iso"],
46 "layout_aliases": {
47 "KEYMAP": "LAYOUT_all",
48 "LAYOUT": "LAYOUT_all"
49 },
50 "layouts": {
51 "LAYOUT_66_ansi": {
52 "key_count": 66,
53 "layout": [
54 { "label": "~", "matrix": [0, 0], "w": 1, "x": 0, "y": 0 },
55 { "label": "!", "matrix": [0, 1], "w": 1, "x": 1, "y": 0 },
56 { "label": "@", "matrix": [0, 2], "w": 1, "x": 2, "y": 0 },
57 { "label": "#", "matrix": [0, 3], "w": 1, "x": 3, "y": 0 },
58 { "label": "$", "matrix": [0, 4], "w": 1, "x": 4, "y": 0 },
59 { "label": "%", "matrix": [0, 5], "w": 1, "x": 5, "y": 0 },
60 { "label": "^", "matrix": [0, 6], "w": 1, "x": 6, "y": 0 },
61 { "label": "&", "matrix": [0, 7], "w": 1, "x": 7, "y": 0 },
62 { "label": "*", "matrix": [5, 0], "w": 1, "x": 8, "y": 0 },
63 { "label": "(", "matrix": [5, 1], "w": 1, "x": 9, "y": 0 },
64 { "label": ")", "matrix": [5, 2], "w": 1, "x": 10, "y": 0 },
65 { "label": "_", "matrix": [5, 3], "w": 1, "x": 11, "y": 0 },
66 { "label": "+", "matrix": [5, 4], "w": 1, "x": 12, "y": 0 },
67 { "label": "Backspace", "matrix": [5, 6], "w": 2, "x": 13, "y": 0 },
68 { "label": "k57", "matrix": [5, 7], "w": 1, "x": 15.5, "y": 0 },
69 { "label": "Tab", "matrix": [1, 0], "w": 1.5, "x": 0, "y": 1 },
70 { "label": "Q", "matrix": [1, 1], "w": 1, "x": 1.5, "y": 1 },
71 { "label": "W", "matrix": [1, 2], "w": 1, "x": 2.5, "y": 1 },
72 { "label": "E", "matrix": [1, 3], "w": 1, "x": 3.5, "y": 1 },
73 { "label": "R", "matrix": [1, 4], "w": 1, "x": 4.5, "y": 1 },
74 { "label": "T", "matrix": [1, 5], "w": 1, "x": 5.5, "y": 1 },
75 { "label": "Y", "matrix": [1, 6], "w": 1, "x": 6.5, "y": 1 },
76 { "label": "U", "matrix": [1, 7], "w": 1, "x": 7.5, "y": 1 },
77 { "label": "I", "matrix": [6, 0], "w": 1, "x": 8.5, "y": 1 },
78 { "label": "O", "matrix": [6, 1], "w": 1, "x": 9.5, "y": 1 },
79 { "label": "P", "matrix": [6, 2], "w": 1, "x": 10.5, "y": 1 },
80 { "label": "{", "matrix": [6, 3], "w": 1, "x": 11.5, "y": 1 },
81 { "label": "}", "matrix": [6, 4], "w": 1, "x": 12.5, "y": 1 },
82 { "label": "|", "matrix": [6, 5], "w": 1.5, "x": 13.5, "y": 1 },
83 { "label": "k67", "matrix": [6, 7], "w": 1, "x": 15.5, "y": 1 },
84 { "label": "Caps Lock", "matrix": [2, 0], "w": 1.75, "x": 0, "y": 2 },
85 { "label": "A", "matrix": [2, 1], "w": 1, "x": 1.75, "y": 2 },
86 { "label": "S", "matrix": [2, 2], "w": 1, "x": 2.75, "y": 2 },
87 { "label": "D", "matrix": [2, 3], "w": 1, "x": 3.75, "y": 2 },
88 { "label": "F", "matrix": [2, 4], "w": 1, "x": 4.75, "y": 2 },
89 { "label": "G", "matrix": [2, 5], "w": 1, "x": 5.75, "y": 2 },
90 { "label": "H", "matrix": [2, 6], "w": 1, "x": 6.75, "y": 2 },
91 { "label": "J", "matrix": [2, 7], "w": 1, "x": 7.75, "y": 2 },
92 { "label": "K", "matrix": [7, 0], "w": 1, "x": 8.75, "y": 2 },
93 { "label": "L", "matrix": [7, 1], "w": 1, "x": 9.75, "y": 2 },
94 { "label": ":", "matrix": [7, 2], "w": 1, "x": 10.75, "y": 2 },
95 { "label": "\"", "matrix": [7, 3], "w": 1, "x": 11.75, "y": 2 },
96 { "label": "Enter", "matrix": [7, 5], "w": 2.25, "x": 12.75, "y": 2 },
97 { "label": "Shift", "matrix": [3, 0], "w": 2.25, "x": 0, "y": 3 },
98 { "label": "Z", "matrix": [3, 2], "w": 1, "x": 2.25, "y": 3 },
99 { "label": "X", "matrix": [3, 3], "w": 1, "x": 3.25, "y": 3 },
100 { "label": "C", "matrix": [3, 4], "w": 1, "x": 4.25, "y": 3 },
101 { "label": "V", "matrix": [3, 5], "w": 1, "x": 5.25, "y": 3 },
102 { "label": "B", "matrix": [3, 6], "w": 1, "x": 6.25, "y": 3 },
103 { "label": "N", "matrix": [3, 7], "w": 1, "x": 7.25, "y": 3 },
104 { "label": "M", "matrix": [8, 0], "w": 1, "x": 8.25, "y": 3 },
105 { "label": "<", "matrix": [8, 1], "w": 1, "x": 9.25, "y": 3 },
106 { "label": ">", "matrix": [8, 2], "w": 1, "x": 10.25, "y": 3 },
107 { "label": "?", "matrix": [8, 3], "w": 1, "x": 11.25, "y": 3 },
108 { "label": "Shift", "matrix": [8, 5], "w": 2.25, "x": 12.25, "y": 3 },
109 { "label": "k86", "matrix": [8, 6], "w": 1, "x": 14.5, "y": 3 },
110 { "label": "Ctrl", "matrix": [4, 0], "w": 1.25, "x": 0, "y": 4 },
111 { "label": "Win", "matrix": [4, 1], "w": 1.25, "x": 1.25, "y": 4 },
112 { "label": "Alt", "matrix": [4, 2], "w": 1.25, "x": 2.5, "y": 4 },
113 { "label": "k46", "matrix": [4, 6], "w": 6, "x": 3.75, "y": 4 },
114 { "label": "Alt", "matrix": [9, 2], "w": 1.25, "x": 9.75, "y": 4 },
115 { "label": "Win", "matrix": [9, 3], "w": 1.25, "x": 11, "y": 4 },
116 { "label": "Menu", "matrix": [9, 4], "w": 1.25, "x": 12.25, "y": 4 },
117 { "label": "k95", "matrix": [9, 5], "w": 1, "x": 13.5, "y": 4 },
118 { "label": "k96", "matrix": [9, 6], "w": 1, "x": 14.5, "y": 4 },
119 { "label": "k97", "matrix": [9, 7], "w": 1, "x": 15.5, "y": 4 }
120 ]
121 },
122 "LAYOUT_66_iso": {
123 "key_count": 67,
124 "layout": [
125 { "label": "~", "matrix": [0, 0], "w": 1, "x": 0, "y": 0 },
126 { "label": "!", "matrix": [0, 1], "w": 1, "x": 1, "y": 0 },
127 { "label": "@", "matrix": [0, 2], "w": 1, "x": 2, "y": 0 },
128 { "label": "#", "matrix": [0, 3], "w": 1, "x": 3, "y": 0 },
129 { "label": "$", "matrix": [0, 4], "w": 1, "x": 4, "y": 0 },
130 { "label": "%", "matrix": [0, 5], "w": 1, "x": 5, "y": 0 },
131 { "label": "^", "matrix": [0, 6], "w": 1, "x": 6, "y": 0 },
132 { "label": "&", "matrix": [0, 7], "w": 1, "x": 7, "y": 0 },
133 { "label": "*", "matrix": [5, 0], "w": 1, "x": 8, "y": 0 },
134 { "label": "(", "matrix": [5, 1], "w": 1, "x": 9, "y": 0 },
135 { "label": ")", "matrix": [5, 2], "w": 1, "x": 10, "y": 0 },
136 { "label": "_", "matrix": [5, 3], "w": 1, "x": 11, "y": 0 },
137 { "label": "+", "matrix": [5, 4], "w": 1, "x": 12, "y": 0 },
138 { "label": "Backspace", "matrix": [5, 6], "w": 2, "x": 13, "y": 0 },
139 { "label": "Insert", "matrix": [5, 7], "w": 1, "x": 15.5, "y": 0 },
140 { "label": "Tab", "matrix": [1, 0], "w": 1.5, "x": 0, "y": 1 },
141 { "label": "Q", "matrix": [1, 1], "w": 1, "x": 1.5, "y": 1 },
142 { "label": "W", "matrix": [1, 2], "w": 1, "x": 2.5, "y": 1 },
143 { "label": "E", "matrix": [1, 3], "w": 1, "x": 3.5, "y": 1 },
144 { "label": "R", "matrix": [1, 4], "w": 1, "x": 4.5, "y": 1 },
145 { "label": "T", "matrix": [1, 5], "w": 1, "x": 5.5, "y": 1 },
146 { "label": "Y", "matrix": [1, 6], "w": 1, "x": 6.5, "y": 1 },
147 { "label": "U", "matrix": [1, 7], "w": 1, "x": 7.5, "y": 1 },
148 { "label": "I", "matrix": [6, 0], "w": 1, "x": 8.5, "y": 1 },
149 { "label": "O", "matrix": [6, 1], "w": 1, "x": 9.5, "y": 1 },
150 { "label": "P", "matrix": [6, 2], "w": 1, "x": 10.5, "y": 1 },
151 { "label": "{", "matrix": [6, 3], "w": 1, "x": 11.5, "y": 1 },
152 { "label": "}", "matrix": [6, 4], "w": 1, "x": 12.5, "y": 1 },
153 { "label": "Delete", "matrix": [6, 7], "w": 1, "x": 15.5, "y": 1 },
154 { "label": "Caps Lock", "matrix": [2, 0], "w": 1.75, "x": 0, "y": 2 },
155 { "label": "A", "matrix": [2, 1], "w": 1, "x": 1.75, "y": 2 },
156 { "label": "S", "matrix": [2, 2], "w": 1, "x": 2.75, "y": 2 },
157 { "label": "D", "matrix": [2, 3], "w": 1, "x": 3.75, "y": 2 },
158 { "label": "F", "matrix": [2, 4], "w": 1, "x": 4.75, "y": 2 },
159 { "label": "G", "matrix": [2, 5], "w": 1, "x": 5.75, "y": 2 },
160 { "label": "H", "matrix": [2, 6], "w": 1, "x": 6.75, "y": 2 },
161 { "label": "J", "matrix": [2, 7], "w": 1, "x": 7.75, "y": 2 },
162 { "label": "K", "matrix": [7, 0], "w": 1, "x": 8.75, "y": 2 },
163 { "label": "L", "matrix": [7, 1], "w": 1, "x": 9.75, "y": 2 },
164 { "label": ":", "matrix": [7, 2], "w": 1, "x": 10.75, "y": 2 },
165 { "label": "\"", "matrix": [7, 3], "w": 1, "x": 11.75, "y": 2 },
166 { "label": "", "matrix": [7, 4], "w": 1, "x": 12.75, "y": 2 },
167 { "h": 2, "label": "Enter", "matrix": [7, 5], "w": 1.25, "x": 13.75, "y": 1 },
168 { "label": "Shift", "matrix": [3, 0], "w": 1.25, "x": 0, "y": 3 },
169 { "label": "\\", "matrix": [3, 1], "w": 1, "x": 1.25, "y": 3 },
170 { "label": "Z", "matrix": [3, 2], "w": 1, "x": 2.25, "y": 3 },
171 { "label": "X", "matrix": [3, 3], "w": 1, "x": 3.25, "y": 3 },
172 { "label": "C", "matrix": [3, 4], "w": 1, "x": 4.25, "y": 3 },
173 { "label": "V", "matrix": [3, 5], "w": 1, "x": 5.25, "y": 3 },
174 { "label": "B", "matrix": [3, 6], "w": 1, "x": 6.25, "y": 3 },
175 { "label": "N", "matrix": [3, 7], "w": 1, "x": 7.25, "y": 3 },
176 { "label": "M", "matrix": [8, 0], "w": 1, "x": 8.25, "y": 3 },
177 { "label": "<", "matrix": [8, 1], "w": 1, "x": 9.25, "y": 3 },
178 { "label": ">", "matrix": [8, 2], "w": 1, "x": 10.25, "y": 3 },
179 { "label": "?", "matrix": [8, 3], "w": 1, "x": 11.25, "y": 3 },
180 { "label": "Shift", "matrix": [8, 5], "w": 2.25, "x": 12.25, "y": 3 },
181 { "label": "\u2191", "matrix": [8, 6], "w": 1, "x": 14.5, "y": 3 },
182 { "label": "Ctrl", "matrix": [4, 0], "w": 1.25, "x": 0, "y": 4 },
183 { "label": "Win", "matrix": [4, 1], "w": 1.25, "x": 1.25, "y": 4 },
184 { "label": "Alt", "matrix": [4, 2], "w": 1.25, "x": 2.5, "y": 4 },
185 { "label": "k46", "matrix": [4, 6], "w": 6, "x": 3.75, "y": 4 },
186 { "label": "Alt", "matrix": [9, 2], "w": 1.25, "x": 9.75, "y": 4 },
187 { "label": "Ctrl", "matrix": [9, 3], "w": 1.25, "x": 11, "y": 4 },
188 { "label": "Menu", "matrix": [9, 4], "w": 1.25, "x": 12.25, "y": 4 },
189 { "label": "\u2190", "matrix": [9, 5], "w": 1, "x": 13.5, "y": 4 },
190 { "label": "\u2193", "matrix": [9, 6], "w": 1, "x": 14.5, "y": 4 },
191 { "label": "\u2192", "matrix": [9, 7], "w": 1, "x": 15.5, "y": 4 }
192 ]
193 },
194 "LAYOUT_all": {
195 "key_count": 73,
196 "layout": [
197 { "label": "GRAVE", "matrix": [0, 0], "w": 1, "x": 0, "y": 0 },
198 { "label": "1", "matrix": [0, 1], "w": 1, "x": 1, "y": 0 },
199 { "label": "2", "matrix": [0, 2], "w": 1, "x": 2, "y": 0 },
200 { "label": "3", "matrix": [0, 3], "w": 1, "x": 3, "y": 0 },
201 { "label": "4", "matrix": [0, 4], "w": 1, "x": 4, "y": 0 },
202 { "label": "5", "matrix": [0, 5], "w": 1, "x": 5, "y": 0 },
203 { "label": "6", "matrix": [0, 6], "w": 1, "x": 6, "y": 0 },
204 { "label": "7", "matrix": [0, 7], "w": 1, "x": 7, "y": 0 },
205 { "label": "8", "matrix": [5, 0], "w": 1, "x": 8, "y": 0 },
206 { "label": "9", "matrix": [5, 1], "w": 1, "x": 9, "y": 0 },
207 { "label": "0", "matrix": [5, 2], "w": 1, "x": 10, "y": 0 },
208 { "label": "DASH", "matrix": [5, 3], "w": 1, "x": 11, "y": 0 },
209 { "label": "EQUALSIGN", "matrix": [5, 4], "w": 1, "x": 12, "y": 0 },
210 { "label": "YEN", "matrix": [5, 5], "w": 1, "x": 13, "y": 0 },
211 { "label": "BACKSPACE", "matrix": [5, 6], "w": 1, "x": 14, "y": 0 },
212 { "label": "PAGEUP", "matrix": [5, 7], "w": 1, "x": 15.5, "y": 0 },
213 { "label": "TAB", "matrix": [1, 0], "w": 1.5, "x": 0, "y": 1 },
214 { "label": "Q", "matrix": [1, 1], "w": 1, "x": 1.5, "y": 1 },
215 { "label": "W", "matrix": [1, 2], "w": 1, "x": 2.5, "y": 1 },
216 { "label": "E", "matrix": [1, 3], "w": 1, "x": 3.5, "y": 1 },
217 { "label": "R", "matrix": [1, 4], "w": 1, "x": 4.5, "y": 1 },
218 { "label": "T", "matrix": [1, 5], "w": 1, "x": 5.5, "y": 1 },
219 { "label": "Y", "matrix": [1, 6], "w": 1, "x": 6.5, "y": 1 },
220 { "label": "U", "matrix": [1, 7], "w": 1, "x": 7.5, "y": 1 },
221 { "label": "I", "matrix": [6, 0], "w": 1, "x": 8.5, "y": 1 },
222 { "label": "O", "matrix": [6, 1], "w": 1, "x": 9.5, "y": 1 },
223 { "label": "P", "matrix": [6, 2], "w": 1, "x": 10.5, "y": 1 },
224 { "label": "LBRACKET", "matrix": [6, 3], "w": 1, "x": 11.5, "y": 1 },
225 { "label": "RBRACKET", "matrix": [6, 4], "w": 1, "x": 12.5, "y": 1 },
226 { "label": "BACKSLASH", "matrix": [6, 5], "w": 1.5, "x": 13.5, "y": 1 },
227 { "label": "PAGEDOWN", "matrix": [6, 7], "w": 1, "x": 15.5, "y": 1 },
228 { "label": "CAPSLOCK", "matrix": [2, 0], "w": 1.75, "x": 0, "y": 2 },
229 { "label": "A", "matrix": [2, 1], "w": 1, "x": 1.75, "y": 2 },
230 { "label": "S", "matrix": [2, 2], "w": 1, "x": 2.75, "y": 2 },
231 { "label": "D", "matrix": [2, 3], "w": 1, "x": 3.75, "y": 2 },
232 { "label": "F", "matrix": [2, 4], "w": 1, "x": 4.75, "y": 2 },
233 { "label": "G", "matrix": [2, 5], "w": 1, "x": 5.75, "y": 2 },
234 { "label": "H", "matrix": [2, 6], "w": 1, "x": 6.75, "y": 2 },
235 { "label": "J", "matrix": [2, 7], "w": 1, "x": 7.75, "y": 2 },
236 { "label": "K", "matrix": [7, 0], "w": 1, "x": 8.75, "y": 2 },
237 { "label": "L", "matrix": [7, 1], "w": 1, "x": 9.75, "y": 2 },
238 { "label": "SEMICOLON", "matrix": [7, 2], "w": 1, "x": 10.75, "y": 2 },
239 { "label": "QUOTE", "matrix": [7, 3], "w": 1, "x": 11.75, "y": 2 },
240 { "label": "ISOHASH", "matrix": [7, 4], "w": 1, "x": 12.75, "y": 2 },
241 { "label": "ENTER", "matrix": [7, 5], "w": 1.25, "x": 13.75, "y": 2 },
242 { "label": "LSHIFT", "matrix": [3, 0], "w": 1.25, "x": 0, "y": 3 },
243 { "label": "ISOBACKSLASH", "matrix": [3, 1], "w": 1, "x": 1.25, "y": 3 },
244 { "label": "Z", "matrix": [3, 2], "w": 1, "x": 2.25, "y": 3 },
245 { "label": "X", "matrix": [3, 3], "w": 1, "x": 3.25, "y": 3 },
246 { "label": "C", "matrix": [3, 4], "w": 1, "x": 4.25, "y": 3 },
247 { "label": "V", "matrix": [3, 5], "w": 1, "x": 5.25, "y": 3 },
248 { "label": "B", "matrix": [3, 6], "w": 1, "x": 6.25, "y": 3 },
249 { "label": "N", "matrix": [3, 7], "w": 1, "x": 7.25, "y": 3 },
250 { "label": "M", "matrix": [8, 0], "w": 1, "x": 8.25, "y": 3 },
251 { "label": "COMMA", "matrix": [8, 1], "w": 1, "x": 9.25, "y": 3 },
252 { "label": "PERIOD", "matrix": [8, 2], "w": 1, "x": 10.25, "y": 3 },
253 { "label": "SLASH", "matrix": [8, 3], "w": 1, "x": 11.25, "y": 3 },
254 { "label": "JPBACKSLASH", "matrix": [8, 4], "w": 1, "x": 12.25, "y": 3 },
255 { "label": "RSHIFT", "matrix": [8, 5], "w": 1.25, "x": 13.25, "y": 3 },
256 { "label": "UP", "matrix": [8, 6], "w": 1, "x": 14.5, "y": 3 },
257 { "label": "LCTRL", "matrix": [4, 0], "w": 1.25, "x": 0, "y": 4 },
258 { "label": "LALT", "matrix": [4, 1], "w": 1, "x": 1.25, "y": 4 },
259 { "label": "LCMD", "matrix": [4, 2], "w": 1.25, "x": 2.25, "y": 4 },
260 { "label": "MUHENKAN", "matrix": [4, 3], "w": 1.25, "x": 3.5, "y": 4 },
261 { "label": "SPACE1", "matrix": [4, 5], "w": 2, "x": 4.75, "y": 4 },
262 { "label": "SPACE2", "matrix": [4, 6], "w": 2, "x": 6.75, "y": 4 },
263 { "label": "HENKAN", "matrix": [9, 0], "w": 1.25, "x": 8.75, "y": 4 },
264 { "label": "RCMD", "matrix": [9, 2], "w": 1.25, "x": 10, "y": 4 },
265 { "label": "RCTRL", "matrix": [9, 3], "w": 1, "x": 11.25, "y": 4 },
266 { "label": "FN", "matrix": [9, 4], "w": 1.25, "x": 12.25, "y": 4 },
267 { "label": "LEFT", "matrix": [9, 5], "w": 1, "x": 13.5, "y": 4 },
268 { "label": "DOWN", "matrix": [9, 6], "w": 1, "x": 14.5, "y": 4 },
269 { "label": "RIGHT", "matrix": [9, 7], "w": 1, "x": 15.5, "y": 4 }
270 ]
271 }
272 }
273}
diff --git a/keyboards/clueboard/66/rev3/readme.md b/keyboards/clueboard/66/rev3/readme.md
new file mode 100644
index 000000000..5d7ecd41c
--- /dev/null
+++ b/keyboards/clueboard/66/rev3/readme.md
@@ -0,0 +1,15 @@
1# Clueboard 66%
2
3![Clueboard](https://i.imgur.com/hLePwJu.jpg)
4
5A fully customizable 66% keyboard.
6
7* Keyboard Maintainer: [Zach White](https://github.com/skullydazed)
8* Hardware Supported: Clueboard 66% PCB rev3 (atmega32u4)
9* Hardware Availability: [clueboard.co](https://clueboard.co/)
10
11Make example for this keyboard (after setting up your build environment):
12
13 make clueboard/66/rev3:default
14
15See [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) then the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
diff --git a/keyboards/clueboard/66/rev3/rev3.h b/keyboards/clueboard/66/rev3/rev3.h
index 86688c7a1..00bdf1e03 100644
--- a/keyboards/clueboard/66/rev3/rev3.h
+++ b/keyboards/clueboard/66/rev3/rev3.h
@@ -2,93 +2,3 @@
2 2
3#include "quantum.h" 3#include "quantum.h"
4 4
5/* Clueboard matrix layout
6 * ,-----------------------------------------------------------. ,---.
7 * | 00| 01| 02| 03| 04| 05| 06| 07| 50| 51| 52| 53| 54| 55| 56| | 57|
8 * |-----------------------------------------------------------| |---|
9 * | 10| 11| 12| 13| 14| 15| 16| 17| 60| 61| 62| 63| 64| 65| | 67|
10 * |-----------------------------------------------------------| `---'
11 * | 20| 21| 22| 23| 24| 25| 26| 27| 70| 71| 72| 73| 74| 75|
12 * |------------------------------------------------------------.
13 * | 30| 31| 32| 33| 34| 35| 36| 37| 80| 81| 82| 83| 84| 85|86|
14 * |------------------------------------------------------------------.
15 * | 40| 41| 42| 43| 45| 46| 90| 92| 93| 94| 95| 96| 97|
16 * `------------------------------------------------------------------'
17 * ,-----------------------------------------------------------. ,---.
18 * | `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Yen| BS| |Ins|
19 * |-----------------------------------------------------------| |---|
20 * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \| |Del|
21 * |-----------------------------------------------------------| `---'
22 * |Caps | A| S| D| F| G| H| J| k| L| ;| '| # | Ent|
23 * |--------------------------------------------------------------.
24 * |Shift| \| Z| X| C| V| B| N| M| ,| .| /| \|Shift| Up|
25 * |------------------------------------------------------------------.
26 * |Ctrl|Alt|Gui |MHen| Space| Space|Henk|Gui |Ctrl| Fn|Left|Down|Rgt|
27 * `------------------------------------------------------------------'
28 */
29// The first section contains all of the arguments
30// The second converts the arguments into a two-dimensional array
31
32#define LAYOUT_all( \
33 k00, k01, k02, k03, k04, k05, k06, k07, k50, k51, k52, k53, k54, k55, k56, k57, \
34 k10, k11, k12, k13, k14, k15, k16, k17, k60, k61, k62, k63, k64, k65, k67, \
35 k20, k21, k22, k23, k24, k25, k26, k27, k70, k71, k72, k73, k74, k75, \
36 k30, k31, k32, k33, k34, k35, k36, k37, k80, k81, k82, k83, k84, k85, k86, \
37 k40, k41, k42, k43, k45, k46, k90, k92, k93, k94, k95, k96, k97 \
38) { \
39 { k00, k01, k02, k03, k04, k05, k06, k07 }, \
40 { k10, k11, k12, k13, k14, k15, k16, k17 }, \
41 { k20, k21, k22, k23, k24, k25, k26, k27 }, \
42 { k30, k31, k32, k33, k34, k35, k36, k37 }, \
43 { k40, k41, k42, k43, KC_NO, k45, k46, KC_NO }, \
44 { k50, k51, k52, k53, k54, k55, k56, k57 }, \
45 { k60, k61, k62, k63, k64, k65, KC_NO, k67 }, \
46 { k70, k71, k72, k73, k74, k75, KC_NO, KC_NO }, \
47 { k80, k81, k82, k83, k84, k85, k86, KC_NO }, \
48 { k90, KC_NO, k92, k93, k94, k95, k96, k97 } \
49}
50
51/* LAYOUT_66_ansi, standard 66 key ANSI layout
52 */
53#define LAYOUT_66_ansi( \
54 k00, k01, k02, k03, k04, k05, k06, k07, k50, k51, k52, k53, k54, k56, k57, \
55 k10, k11, k12, k13, k14, k15, k16, k17, k60, k61, k62, k63, k64, k65, k67, \
56 k20, k21, k22, k23, k24, k25, k26, k27, k70, k71, k72, k73, k75, \
57 k30, k32, k33, k34, k35, k36, k37, k80, k81, k82, k83, k85, k86, \
58 k40, k41, k42, k46, k92, k93, k94, k95, k96, k97 \
59) { \
60 { k00, k01, k02, k03, k04, k05, k06, k07 }, \
61 { k10, k11, k12, k13, k14, k15, k16, k17 }, \
62 { k20, k21, k22, k23, k24, k25, k26, k27 }, \
63 { k30, KC_NO, k32, k33, k34, k35, k36, k37 }, \
64 { k40, k41, k42, KC_NO, KC_NO, KC_NO, k46, KC_NO }, \
65 { k50, k51, k52, k53, k54, KC_NO, k56, k57 }, \
66 { k60, k61, k62, k63, k64, k65, KC_NO, k67 }, \
67 { k70, k71, k72, k73, KC_NO, k75, KC_NO, KC_NO }, \
68 { k80, k81, k82, k83, KC_NO, k85, k86, KC_NO }, \
69 { KC_NO, KC_NO, k92, k93, k94, k95, k96, k97 } \
70}
71
72/* LAYOUT_66_iso, standard 67 key ISO layout
73 */
74#define LAYOUT_66_iso( \
75 k00, k01, k02, k03, k04, k05, k06, k07, k50, k51, k52, k53, k54, k56, k57, \
76 k10, k11, k12, k13, k14, k15, k16, k17, k60, k61, k62, k63, k64, k67, \
77 k20, k21, k22, k23, k24, k25, k26, k27, k70, k71, k72, k73, k74, k75, \
78 k30, k31, k32, k33, k34, k35, k36, k37, k80, k81, k82, k83, k85, k86, \
79 k40, k41, k42, k46, k92, k93, k94, k95, k96, k97 \
80) { \
81 { k00, k01, k02, k03, k04, k05, k06, k07 }, \
82 { k10, k11, k12, k13, k14, k15, k16, k17 }, \
83 { k20, k21, k22, k23, k24, k25, k26, k27 }, \
84 { k30, k31, k32, k33, k34, k35, k36, k37 }, \
85 { k40, k41, k42, KC_NO, KC_NO, KC_NO, k46, KC_NO }, \
86 { k50, k51, k52, k53, k54, KC_NO, k56, k57 }, \
87 { k60, k61, k62, k63, k64, KC_NO, KC_NO, k67 }, \
88 { k70, k71, k72, k73, k74, k75, KC_NO, KC_NO }, \
89 { k80, k81, k82, k83, KC_NO, k85, k86, KC_NO }, \
90 { KC_NO, KC_NO, k92, k93, k94, k95, k96, k97 } \
91}
92
93#define KEYMAP LAYOUT_all
94#define LAYOUT LAYOUT_all
diff --git a/keyboards/clueboard/66/rev3/rules.mk b/keyboards/clueboard/66/rev3/rules.mk
index 55f3050e3..76e161e36 100644
--- a/keyboards/clueboard/66/rev3/rules.mk
+++ b/keyboards/clueboard/66/rev3/rules.mk
@@ -14,18 +14,4 @@ BOOTLOADER = atmel-dfu
14# Build Options 14# Build Options
15# comment out to disable the options. 15# comment out to disable the options.
16# 16#
17BACKLIGHT_ENABLE = yes
18BACKLIGHT_DRIVER = custom 17BACKLIGHT_DRIVER = custom
19BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration
20MOUSEKEY_ENABLE = yes # Mouse keys
21EXTRAKEY_ENABLE = yes # Audio control and System control
22CONSOLE_ENABLE = yes # Console for debug
23COMMAND_ENABLE = no # Commands for debug and configuration
24NKRO_ENABLE = yes # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
25AUDIO_ENABLE = no
26RGBLIGHT_ENABLE = yes # Enable keyboard underlight functionality
27MIDI_ENABLE = no # MIDI controls
28UNICODE_ENABLE = no # Unicode
29BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
30
31LAYOUTS = 66_ansi 66_iso
diff --git a/keyboards/clueboard/66/rev4/config.h b/keyboards/clueboard/66/rev4/config.h
index 8ed140478..c745b5a11 100644
--- a/keyboards/clueboard/66/rev4/config.h
+++ b/keyboards/clueboard/66/rev4/config.h
@@ -2,72 +2,18 @@
2 2
3#include "config_common.h" 3#include "config_common.h"
4 4
5/* USB Device descriptor parameter */
6#define VENDOR_ID 0xC1ED
7#define PRODUCT_ID 0x2390
8#define DEVICE_VER 0x0001
9#define MANUFACTURER Clueboard
10#define PRODUCT Clueboard 66% rev4
11#define DESCRIPTION QMK keyboard firmware for Clueboard
12
13/* Address for jumping to bootloader on STM32 chips. */ 5/* Address for jumping to bootloader on STM32 chips. */
14/* It is chip dependent, the correct number can be looked up here: 6/* It is chip dependent, the correct number can be looked up here:
15 * http://www.st.com/web/en/resource/technical/document/application_note/CD00167594.pdf 7 * http://www.st.com/web/en/resource/technical/document/application_note/CD00167594.pdf
16 */ 8 */
17#define STM32_BOOTLOADER_ADDRESS 0x1FFFD800 9#define STM32_BOOTLOADER_ADDRESS 0x1FFFD800
18 10
19/* key matrix size */
20#define MATRIX_ROWS 10
21#define MATRIX_COLS 8
22
23/* ROWS: Top to bottom, COLS: Left to right
24*/
25#define MATRIX_ROW_PINS { B11, A6, A3, A2, A1, B7, B6, C15, C14, C13 }
26#define MATRIX_COL_PINS { B10, B2, B1, B0, A7, B4, B3, B5 }
27#define UNUSED_PINS { B15, B14, B13, B12, B9, B8, A15, A10, A9, A8 }
28
29/* COL2ROW or ROW2COL */
30#define DIODE_DIRECTION COL2ROW
31
32/* Set 0 if debouncing isn't needed */
33#define DEBOUNCE 5
34
35/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
36#define LOCKING_SUPPORT_ENABLE
37/* Locking resynchronize hack */
38#define LOCKING_RESYNC_ENABLE
39
40/*
41 * Feature disable options
42 * These options are also useful to firmware size reduction.
43 */
44
45/* disable debug print */
46//#define NO_DEBUG
47
48/* disable print */
49//#define NO_PRINT
50
51/* disable action features */
52//#define NO_ACTION_LAYER
53//#define NO_ACTION_TAPPING
54//#define NO_ACTION_ONESHOT
55//#define NO_ACTION_MACRO
56//#define NO_ACTION_FUNCTION
57
58 /* Backlight configuration 11 /* Backlight configuration
59 */ 12 */
60#define BACKLIGHT_LEVELS 1 13#define BACKLIGHT_LEVELS 1
61 14
62/* Underlight configuration 15/* Underlight configuration
63 */ 16 */
64#define RGB_DI_PIN D7
65#define RGBLED_NUM 18 // Number of LEDs
66#define RGBLIGHT_HUE_STEP 32
67#define RGBLIGHT_SAT_STEP 17
68#define RGBLIGHT_VAL_STEP 17
69
70#define RGBLIGHT_ANIMATIONS
71#define RGBLIGHT_EFFECT_BREATHE_CENTER 1 17#define RGBLIGHT_EFFECT_BREATHE_CENTER 1
72#define RGBLIGHT_EFFECT_BREATHE_MAX 200 18#define RGBLIGHT_EFFECT_BREATHE_MAX 200
73#define RGBLIGHT_EFFECT_CHRISTMAS_INTERVAL 666*2 19#define RGBLIGHT_EFFECT_CHRISTMAS_INTERVAL 666*2
diff --git a/keyboards/clueboard/66/rev4/info.json b/keyboards/clueboard/66/rev4/info.json
new file mode 100644
index 000000000..90c721e31
--- /dev/null
+++ b/keyboards/clueboard/66/rev4/info.json
@@ -0,0 +1,270 @@
1{
2 "manufacturer": "Clueboard",
3 "keyboard_name": "Clueboard 66% rev4",
4 "maintainer": "skullydazed",
5 "height": 5,
6 "width": 16.5,
7 "debounce": "5",
8 "diode_direction": "COL2ROW",
9 "features": {
10 "audio": true,
11 "backlight": false,
12 "bluetooth": false,
13 "bootmagic": false,
14 "command": false,
15 "console": true,
16 "extrakey": true,
17 "midi": false,
18 "mousekey": true,
19 "nkro": true,
20 "rgblight": false,
21 "unicode": false
22 },
23 "matrix_pins": {
24 "cols": ["B10", " B2", " B1", " B0", " A7", " B4", " B3", " B5"],
25 "rows": ["B11", " A6", " A3", " A2", " A1", " B7", " B6", " C15", " C14", " C13"]
26 },
27 "rgblight": {
28 "animations": {
29 "all": true
30 },
31 "brightness_steps": "17",
32 "hue_steps": "32",
33 "led_count": "18",
34 "pin": "D7",
35 "saturation_steps": "17"
36 },
37 "usb": {
38 "device_ver": "0x0001",
39 "pid": "0x2390",
40 "vid": "0xC1ED"
41 },
42 "community_layouts": ["66_ansi", "66_iso"],
43 "layout_aliases": {
44 "KEYMAP": "LAYOUT_all",
45 "LAYOUT": "LAYOUT_all"
46 },
47 "layouts": {
48 "LAYOUT_66_ansi": {
49 "key_count": 66,
50 "layout": [
51 { "label": "~", "matrix": [0, 0], "w": 1, "x": 0, "y": 0 },
52 { "label": "!", "matrix": [0, 1], "w": 1, "x": 1, "y": 0 },
53 { "label": "@", "matrix": [0, 2], "w": 1, "x": 2, "y": 0 },
54 { "label": "#", "matrix": [0, 3], "w": 1, "x": 3, "y": 0 },
55 { "label": "$", "matrix": [0, 4], "w": 1, "x": 4, "y": 0 },
56 { "label": "%", "matrix": [0, 5], "w": 1, "x": 5, "y": 0 },
57 { "label": "^", "matrix": [0, 6], "w": 1, "x": 6, "y": 0 },
58 { "label": "&", "matrix": [0, 7], "w": 1, "x": 7, "y": 0 },
59 { "label": "*", "matrix": [5, 0], "w": 1, "x": 8, "y": 0 },
60 { "label": "(", "matrix": [5, 1], "w": 1, "x": 9, "y": 0 },
61 { "label": ")", "matrix": [5, 2], "w": 1, "x": 10, "y": 0 },
62 { "label": "_", "matrix": [5, 3], "w": 1, "x": 11, "y": 0 },
63 { "label": "+", "matrix": [5, 4], "w": 1, "x": 12, "y": 0 },
64 { "label": "Backspace", "matrix": [5, 6], "w": 2, "x": 13, "y": 0 },
65 { "label": "Page Up", "matrix": [5, 7], "w": 1, "x": 15.5, "y": 0 },
66 { "label": "Tab", "matrix": [1, 0], "w": 1.5, "x": 0, "y": 1 },
67 { "label": "Q", "matrix": [1, 1], "w": 1, "x": 1.5, "y": 1 },
68 { "label": "W", "matrix": [1, 2], "w": 1, "x": 2.5, "y": 1 },
69 { "label": "E", "matrix": [1, 3], "w": 1, "x": 3.5, "y": 1 },
70 { "label": "R", "matrix": [1, 4], "w": 1, "x": 4.5, "y": 1 },
71 { "label": "T", "matrix": [1, 5], "w": 1, "x": 5.5, "y": 1 },
72 { "label": "Y", "matrix": [1, 6], "w": 1, "x": 6.5, "y": 1 },
73 { "label": "U", "matrix": [1, 7], "w": 1, "x": 7.5, "y": 1 },
74 { "label": "I", "matrix": [6, 0], "w": 1, "x": 8.5, "y": 1 },
75 { "label": "O", "matrix": [6, 1], "w": 1, "x": 9.5, "y": 1 },
76 { "label": "P", "matrix": [6, 2], "w": 1, "x": 10.5, "y": 1 },
77 { "label": "{", "matrix": [6, 3], "w": 1, "x": 11.5, "y": 1 },
78 { "label": "}", "matrix": [6, 4], "w": 1, "x": 12.5, "y": 1 },
79 { "label": "|", "matrix": [6, 5], "w": 1.5, "x": 13.5, "y": 1 },
80 { "label": "Page Down", "matrix": [6, 7], "w": 1, "x": 15.5, "y": 1 },
81 { "label": "Caps Lock", "matrix": [2, 0], "w": 1.75, "x": 0, "y": 2 },
82 { "label": "A", "matrix": [2, 1], "w": 1, "x": 1.75, "y": 2 },
83 { "label": "S", "matrix": [2, 2], "w": 1, "x": 2.75, "y": 2 },
84 { "label": "D", "matrix": [2, 3], "w": 1, "x": 3.75, "y": 2 },
85 { "label": "F", "matrix": [2, 4], "w": 1, "x": 4.75, "y": 2 },
86 { "label": "G", "matrix": [2, 5], "w": 1, "x": 5.75, "y": 2 },
87 { "label": "H", "matrix": [2, 6], "w": 1, "x": 6.75, "y": 2 },
88 { "label": "J", "matrix": [2, 7], "w": 1, "x": 7.75, "y": 2 },
89 { "label": "K", "matrix": [7, 0], "w": 1, "x": 8.75, "y": 2 },
90 { "label": "L", "matrix": [7, 1], "w": 1, "x": 9.75, "y": 2 },
91 { "label": ":", "matrix": [7, 2], "w": 1, "x": 10.75, "y": 2 },
92 { "label": "\"", "matrix": [7, 3], "w": 1, "x": 11.75, "y": 2 },
93 { "label": "Enter", "matrix": [7, 5], "w": 2.25, "x": 12.75, "y": 2 },
94 { "label": "Shift", "matrix": [3, 0], "w": 2.25, "x": 0, "y": 3 },
95 { "label": "Z", "matrix": [3, 2], "w": 1, "x": 2.25, "y": 3 },
96 { "label": "X", "matrix": [3, 3], "w": 1, "x": 3.25, "y": 3 },
97 { "label": "C", "matrix": [3, 4], "w": 1, "x": 4.25, "y": 3 },
98 { "label": "V", "matrix": [3, 5], "w": 1, "x": 5.25, "y": 3 },
99 { "label": "B", "matrix": [3, 6], "w": 1, "x": 6.25, "y": 3 },
100 { "label": "N", "matrix": [3, 7], "w": 1, "x": 7.25, "y": 3 },
101 { "label": "M", "matrix": [8, 0], "w": 1, "x": 8.25, "y": 3 },
102 { "label": "<", "matrix": [8, 1], "w": 1, "x": 9.25, "y": 3 },
103 { "label": ">", "matrix": [8, 2], "w": 1, "x": 10.25, "y": 3 },
104 { "label": "?", "matrix": [8, 3], "w": 1, "x": 11.25, "y": 3 },
105 { "label": "Shift", "matrix": [8, 5], "w": 2.25, "x": 12.25, "y": 3 },
106 { "label": "Up", "matrix": [8, 6], "w": 1, "x": 14.5, "y": 3 },
107 { "label": "Ctrl", "matrix": [4, 0], "w": 1.25, "x": 0, "y": 4 },
108 { "label": "Win", "matrix": [4, 1], "w": 1.25, "x": 1.25, "y": 4 },
109 { "label": "Alt", "matrix": [4, 2], "w": 1.25, "x": 2.5, "y": 4 },
110 { "label": "Space", "matrix": [4, 6], "w": 6, "x": 3.75, "y": 4 },
111 { "label": "Alt", "matrix": [9, 2], "w": 1.25, "x": 9.75, "y": 4 },
112 { "label": "Win", "matrix": [9, 3], "w": 1.25, "x": 11, "y": 4 },
113 { "label": "Menu", "matrix": [9, 4], "w": 1.25, "x": 12.25, "y": 4 },
114 { "label": "Left", "matrix": [9, 5], "w": 1, "x": 13.5, "y": 4 },
115 { "label": "Down", "matrix": [9, 6], "w": 1, "x": 14.5, "y": 4 },
116 { "label": "Up", "matrix": [9, 7], "w": 1, "x": 15.5, "y": 4 }
117 ]
118 },
119 "LAYOUT_66_iso": {
120 "key_count": 67,
121 "layout": [
122 { "label": "~", "matrix": [0, 0], "w": 1, "x": 0, "y": 0 },
123 { "label": "!", "matrix": [0, 1], "w": 1, "x": 1, "y": 0 },
124 { "label": "@", "matrix": [0, 2], "w": 1, "x": 2, "y": 0 },
125 { "label": "#", "matrix": [0, 3], "w": 1, "x": 3, "y": 0 },
126 { "label": "$", "matrix": [0, 4], "w": 1, "x": 4, "y": 0 },
127 { "label": "%", "matrix": [0, 5], "w": 1, "x": 5, "y": 0 },
128 { "label": "^", "matrix": [0, 6], "w": 1, "x": 6, "y": 0 },
129 { "label": "&", "matrix": [0, 7], "w": 1, "x": 7, "y": 0 },
130 { "label": "*", "matrix": [5, 0], "w": 1, "x": 8, "y": 0 },
131 { "label": "(", "matrix": [5, 1], "w": 1, "x": 9, "y": 0 },
132 { "label": ")", "matrix": [5, 2], "w": 1, "x": 10, "y": 0 },
133 { "label": "_", "matrix": [5, 3], "w": 1, "x": 11, "y": 0 },
134 { "label": "+", "matrix": [5, 4], "w": 1, "x": 12, "y": 0 },
135 { "label": "Backspace", "matrix": [5, 6], "w": 2, "x": 13, "y": 0 },
136 { "label": "Insert", "matrix": [5, 7], "w": 1, "x": 15.5, "y": 0 },
137 { "label": "Tab", "matrix": [1, 0], "w": 1.5, "x": 0, "y": 1 },
138 { "label": "Q", "matrix": [1, 1], "w": 1, "x": 1.5, "y": 1 },
139 { "label": "W", "matrix": [1, 2], "w": 1, "x": 2.5, "y": 1 },
140 { "label": "E", "matrix": [1, 3], "w": 1, "x": 3.5, "y": 1 },
141 { "label": "R", "matrix": [1, 4], "w": 1, "x": 4.5, "y": 1 },
142 { "label": "T", "matrix": [1, 5], "w": 1, "x": 5.5, "y": 1 },
143 { "label": "Y", "matrix": [1, 6], "w": 1, "x": 6.5, "y": 1 },
144 { "label": "U", "matrix": [1, 7], "w": 1, "x": 7.5, "y": 1 },
145 { "label": "I", "matrix": [6, 0], "w": 1, "x": 8.5, "y": 1 },
146 { "label": "O", "matrix": [6, 1], "w": 1, "x": 9.5, "y": 1 },
147 { "label": "P", "matrix": [6, 2], "w": 1, "x": 10.5, "y": 1 },
148 { "label": "{", "matrix": [6, 3], "w": 1, "x": 11.5, "y": 1 },
149 { "label": "}", "matrix": [6, 4], "w": 1, "x": 12.5, "y": 1 },
150 { "label": "Delete", "matrix": [6, 7], "w": 1, "x": 15.5, "y": 1 },
151 { "label": "Caps Lock", "matrix": [2, 0], "w": 1.75, "x": 0, "y": 2 },
152 { "label": "A", "matrix": [2, 1], "w": 1, "x": 1.75, "y": 2 },
153 { "label": "S", "matrix": [2, 2], "w": 1, "x": 2.75, "y": 2 },
154 { "label": "D", "matrix": [2, 3], "w": 1, "x": 3.75, "y": 2 },
155 { "label": "F", "matrix": [2, 4], "w": 1, "x": 4.75, "y": 2 },
156 { "label": "G", "matrix": [2, 5], "w": 1, "x": 5.75, "y": 2 },
157 { "label": "H", "matrix": [2, 6], "w": 1, "x": 6.75, "y": 2 },
158 { "label": "J", "matrix": [2, 7], "w": 1, "x": 7.75, "y": 2 },
159 { "label": "K", "matrix": [7, 0], "w": 1, "x": 8.75, "y": 2 },
160 { "label": "L", "matrix": [7, 1], "w": 1, "x": 9.75, "y": 2 },
161 { "label": ":", "matrix": [7, 2], "w": 1, "x": 10.75, "y": 2 },
162 { "label": "\"", "matrix": [7, 3], "w": 1, "x": 11.75, "y": 2 },
163 { "label": "", "matrix": [7, 4], "w": 1, "x": 12.75, "y": 2 },
164 { "h": 2, "label": "Enter", "matrix": [7, 5], "w": 1.25, "x": 13.75, "y": 1 },
165 { "label": "Shift", "matrix": [3, 0], "w": 1.25, "x": 0, "y": 3 },
166 { "label": "\\", "matrix": [3, 1], "w": 1, "x": 1.25, "y": 3 },
167 { "label": "Z", "matrix": [3, 2], "w": 1, "x": 2.25, "y": 3 },
168 { "label": "X", "matrix": [3, 3], "w": 1, "x": 3.25, "y": 3 },
169 { "label": "C", "matrix": [3, 4], "w": 1, "x": 4.25, "y": 3 },
170 { "label": "V", "matrix": [3, 5], "w": 1, "x": 5.25, "y": 3 },
171 { "label": "B", "matrix": [3, 6], "w": 1, "x": 6.25, "y": 3 },
172 { "label": "N", "matrix": [3, 7], "w": 1, "x": 7.25, "y": 3 },
173 { "label": "M", "matrix": [8, 0], "w": 1, "x": 8.25, "y": 3 },
174 { "label": "<", "matrix": [8, 1], "w": 1, "x": 9.25, "y": 3 },
175 { "label": ">", "matrix": [8, 2], "w": 1, "x": 10.25, "y": 3 },
176 { "label": "?", "matrix": [8, 3], "w": 1, "x": 11.25, "y": 3 },
177 { "label": "Shift", "matrix": [8, 5], "w": 2.25, "x": 12.25, "y": 3 },
178 { "label": "\u2191", "matrix": [8, 6], "w": 1, "x": 14.5, "y": 3 },
179 { "label": "Ctrl", "matrix": [4, 0], "w": 1.25, "x": 0, "y": 4 },
180 { "label": "Win", "matrix": [4, 1], "w": 1.25, "x": 1.25, "y": 4 },
181 { "label": "Alt", "matrix": [4, 2], "w": 1.25, "x": 2.5, "y": 4 },
182 { "label": "Space", "matrix": [4, 6], "w": 6, "x": 3.75, "y": 4 },
183 { "label": "Alt", "matrix": [9, 2], "w": 1.25, "x": 9.75, "y": 4 },
184 { "label": "Ctrl", "matrix": [9, 3], "w": 1.25, "x": 11, "y": 4 },
185 { "label": "Menu", "matrix": [9, 4], "w": 1.25, "x": 12.25, "y": 4 },
186 { "label": "\u2190", "matrix": [9, 5], "w": 1, "x": 13.5, "y": 4 },
187 { "label": "\u2193", "matrix": [9, 6], "w": 1, "x": 14.5, "y": 4 },
188 { "label": "\u2192", "matrix": [9, 7], "w": 1, "x": 15.5, "y": 4 }
189 ]
190 },
191 "LAYOUT_all": {
192 "key_count": 73,
193 "layout": [
194 { "label": "GRAVE", "matrix": [0, 0], "w": 1, "x": 0, "y": 0 },
195 { "label": "1", "matrix": [0, 1], "w": 1, "x": 1, "y": 0 },
196 { "label": "2", "matrix": [0, 2], "w": 1, "x": 2, "y": 0 },
197 { "label": "3", "matrix": [0, 3], "w": 1, "x": 3, "y": 0 },
198 { "label": "4", "matrix": [0, 4], "w": 1, "x": 4, "y": 0 },
199 { "label": "5", "matrix": [0, 5], "w": 1, "x": 5, "y": 0 },
200 { "label": "6", "matrix": [0, 6], "w": 1, "x": 6, "y": 0 },
201 { "label": "7", "matrix": [0, 7], "w": 1, "x": 7, "y": 0 },
202 { "label": "8", "matrix": [5, 0], "w": 1, "x": 8, "y": 0 },
203 { "label": "9", "matrix": [5, 1], "w": 1, "x": 9, "y": 0 },
204 { "label": "0", "matrix": [5, 2], "w": 1, "x": 10, "y": 0 },
205 { "label": "DASH", "matrix": [5, 3], "w": 1, "x": 11, "y": 0 },
206 { "label": "EQUALSIGN", "matrix": [5, 4], "w": 1, "x": 12, "y": 0 },
207 { "label": "YEN", "matrix": [5, 5], "w": 1, "x": 13, "y": 0 },
208 { "label": "BACKSPACE", "matrix": [5, 6], "w": 1, "x": 14, "y": 0 },
209 { "label": "PAGEUP", "matrix": [5, 7], "w": 1, "x": 15.5, "y": 0 },
210 { "label": "TAB", "matrix": [1, 0], "w": 1.5, "x": 0, "y": 1 },
211 { "label": "Q", "matrix": [1, 1], "w": 1, "x": 1.5, "y": 1 },
212 { "label": "W", "matrix": [1, 2], "w": 1, "x": 2.5, "y": 1 },
213 { "label": "E", "matrix": [1, 3], "w": 1, "x": 3.5, "y": 1 },
214 { "label": "R", "matrix": [1, 4], "w": 1, "x": 4.5, "y": 1 },
215 { "label": "T", "matrix": [1, 5], "w": 1, "x": 5.5, "y": 1 },
216 { "label": "Y", "matrix": [1, 6], "w": 1, "x": 6.5, "y": 1 },
217 { "label": "U", "matrix": [1, 7], "w": 1, "x": 7.5, "y": 1 },
218 { "label": "I", "matrix": [6, 0], "w": 1, "x": 8.5, "y": 1 },
219 { "label": "O", "matrix": [6, 1], "w": 1, "x": 9.5, "y": 1 },
220 { "label": "P", "matrix": [6, 2], "w": 1, "x": 10.5, "y": 1 },
221 { "label": "LBRACKET", "matrix": [6, 3], "w": 1, "x": 11.5, "y": 1 },
222 { "label": "RBRACKET", "matrix": [6, 4], "w": 1, "x": 12.5, "y": 1 },
223 { "label": "BACKSLASH", "matrix": [6, 5], "w": 1.5, "x": 13.5, "y": 1 },
224 { "label": "PAGEDOWN", "matrix": [6, 7], "w": 1, "x": 15.5, "y": 1 },
225 { "label": "CAPSLOCK", "matrix": [2, 0], "w": 1.75, "x": 0, "y": 2 },
226 { "label": "A", "matrix": [2, 1], "w": 1, "x": 1.75, "y": 2 },
227 { "label": "S", "matrix": [2, 2], "w": 1, "x": 2.75, "y": 2 },
228 { "label": "D", "matrix": [2, 3], "w": 1, "x": 3.75, "y": 2 },
229 { "label": "F", "matrix": [2, 4], "w": 1, "x": 4.75, "y": 2 },
230 { "label": "G", "matrix": [2, 5], "w": 1, "x": 5.75, "y": 2 },
231 { "label": "H", "matrix": [2, 6], "w": 1, "x": 6.75, "y": 2 },
232 { "label": "J", "matrix": [2, 7], "w": 1, "x": 7.75, "y": 2 },
233 { "label": "K", "matrix": [7, 0], "w": 1, "x": 8.75, "y": 2 },
234 { "label": "L", "matrix": [7, 1], "w": 1, "x": 9.75, "y": 2 },
235 { "label": "SEMICOLON", "matrix": [7, 2], "w": 1, "x": 10.75, "y": 2 },
236 { "label": "QUOTE", "matrix": [7, 3], "w": 1, "x": 11.75, "y": 2 },
237 { "label": "ISOHASH", "matrix": [7, 4], "w": 1, "x": 12.75, "y": 2 },
238 { "label": "ENTER", "matrix": [7, 5], "w": 1.25, "x": 13.75, "y": 2 },
239 { "label": "LSHIFT", "matrix": [3, 0], "w": 1.25, "x": 0, "y": 3 },
240 { "label": "ISOBACKSLASH", "matrix": [3, 1], "w": 1, "x": 1.25, "y": 3 },
241 { "label": "Z", "matrix": [3, 2], "w": 1, "x": 2.25, "y": 3 },
242 { "label": "X", "matrix": [3, 3], "w": 1, "x": 3.25, "y": 3 },
243 { "label": "C", "matrix": [3, 4], "w": 1, "x": 4.25, "y": 3 },
244 { "label": "V", "matrix": [3, 5], "w": 1, "x": 5.25, "y": 3 },
245 { "label": "B", "matrix": [3, 6], "w": 1, "x": 6.25, "y": 3 },
246 { "label": "N", "matrix": [3, 7], "w": 1, "x": 7.25, "y": 3 },
247 { "label": "M", "matrix": [8, 0], "w": 1, "x": 8.25, "y": 3 },
248 { "label": "COMMA", "matrix": [8, 1], "w": 1, "x": 9.25, "y": 3 },
249 { "label": "PERIOD", "matrix": [8, 2], "w": 1, "x": 10.25, "y": 3 },
250 { "label": "SLASH", "matrix": [8, 3], "w": 1, "x": 11.25, "y": 3 },
251 { "label": "JPBACKSLASH", "matrix": [8, 4], "w": 1, "x": 12.25, "y": 3 },
252 { "label": "RSHIFT", "matrix": [8, 5], "w": 1.25, "x": 13.25, "y": 3 },
253 { "label": "UP", "matrix": [8, 6], "w": 1, "x": 14.5, "y": 3 },
254 { "label": "LCTRL", "matrix": [4, 0], "w": 1.25, "x": 0, "y": 4 },
255 { "label": "LALT", "matrix": [4, 1], "w": 1, "x": 1.25, "y": 4 },
256 { "label": "LCMD", "matrix": [4, 2], "w": 1.25, "x": 2.25, "y": 4 },
257 { "label": "MUHENKAN", "matrix": [4, 3], "w": 1.25, "x": 3.5, "y": 4 },
258 { "label": "SPACE1", "matrix": [4, 5], "w": 2, "x": 4.75, "y": 4 },
259 { "label": "SPACE2", "matrix": [4, 6], "w": 2, "x": 6.75, "y": 4 },
260 { "label": "HENKAN", "matrix": [9, 0], "w": 1.25, "x": 8.75, "y": 4 },
261 { "label": "RCMD", "matrix": [9, 2], "w": 1.25, "x": 10, "y": 4 },
262 { "label": "RCTRL", "matrix": [9, 3], "w": 1, "x": 11.25, "y": 4 },
263 { "label": "FN", "matrix": [9, 4], "w": 1.25, "x": 12.25, "y": 4 },
264 { "label": "LEFT", "matrix": [9, 5], "w": 1, "x": 13.5, "y": 4 },
265 { "label": "DOWN", "matrix": [9, 6], "w": 1, "x": 14.5, "y": 4 },
266 { "label": "RIGHT", "matrix": [9, 7], "w": 1, "x": 15.5, "y": 4 }
267 ]
268 }
269 }
270}
diff --git a/keyboards/clueboard/66/rev4/keymaps/keymap.c b/keyboards/clueboard/66/rev4/keymaps/keymap.c
new file mode 100644
index 000000000..df145eb48
--- /dev/null
+++ b/keyboards/clueboard/66/rev4/keymaps/keymap.c
@@ -0,0 +1,13 @@
1#include QMK_KEYBOARD_H
2
3/* THIS FILE WAS GENERATED!
4 *
5 * This file was generated by qmk json2c. You may or may not want to
6 * edit it directly.
7 */
8
9const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
10 [0] = LAYOUT(KC_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_GRV, KC_BSPC, KC_PGUP, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_PGDN, KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NUHS, KC_ENT, KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RO, KC_RSFT, KC_UP, KC_LCTL, KC_LGUI, KC_LALT, KC_MHEN, KC_SPC, KC_SPC, KC_HENK, KC_RALT, MO(1), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT),
11 [1] = LAYOUT(KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_TRNS, KC_DEL, KC_VOLU, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPRV, KC_MPLY, KC_MNXT, KC_TRNS, KC_MUTE, KC_VOLD, KC_TRNS, KC_TRNS, MO(2), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PGUP, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, MO(1), KC_TRNS, KC_HOME, KC_PGDN, KC_END),
12 [2] = LAYOUT(BL_STEP, RGB_M_P, RGB_M_B, RGB_M_R, RGB_M_SW, RGB_M_SN, RGB_M_K, RGB_M_X, RGB_M_G, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_TOG, RGB_VAI, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RESET, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_VAD, KC_TRNS, KC_TRNS, MO(2), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, MO(1), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_SAI, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_MOD, RGB_MOD, KC_TRNS, KC_TRNS, MO(1), KC_TRNS, RGB_HUD, RGB_SAD, RGB_HUI)
13};
diff --git a/keyboards/clueboard/66/rev4/keymaps/mine/keymap.c b/keyboards/clueboard/66/rev4/keymaps/mine/keymap.c
new file mode 100644
index 000000000..df145eb48
--- /dev/null
+++ b/keyboards/clueboard/66/rev4/keymaps/mine/keymap.c
@@ -0,0 +1,13 @@
1#include QMK_KEYBOARD_H
2
3/* THIS FILE WAS GENERATED!
4 *
5 * This file was generated by qmk json2c. You may or may not want to
6 * edit it directly.
7 */
8
9const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
10 [0] = LAYOUT(KC_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_GRV, KC_BSPC, KC_PGUP, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_PGDN, KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NUHS, KC_ENT, KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RO, KC_RSFT, KC_UP, KC_LCTL, KC_LGUI, KC_LALT, KC_MHEN, KC_SPC, KC_SPC, KC_HENK, KC_RALT, MO(1), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT),
11 [1] = LAYOUT(KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_TRNS, KC_DEL, KC_VOLU, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPRV, KC_MPLY, KC_MNXT, KC_TRNS, KC_MUTE, KC_VOLD, KC_TRNS, KC_TRNS, MO(2), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PGUP, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, MO(1), KC_TRNS, KC_HOME, KC_PGDN, KC_END),
12 [2] = LAYOUT(BL_STEP, RGB_M_P, RGB_M_B, RGB_M_R, RGB_M_SW, RGB_M_SN, RGB_M_K, RGB_M_X, RGB_M_G, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_TOG, RGB_VAI, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RESET, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_VAD, KC_TRNS, KC_TRNS, MO(2), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, MO(1), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_SAI, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_MOD, RGB_MOD, KC_TRNS, KC_TRNS, MO(1), KC_TRNS, RGB_HUD, RGB_SAD, RGB_HUI)
13};
diff --git a/keyboards/clueboard/66/rev4/mine/keymap.c b/keyboards/clueboard/66/rev4/mine/keymap.c
new file mode 100644
index 000000000..df145eb48
--- /dev/null
+++ b/keyboards/clueboard/66/rev4/mine/keymap.c
@@ -0,0 +1,13 @@
1#include QMK_KEYBOARD_H
2
3/* THIS FILE WAS GENERATED!
4 *
5 * This file was generated by qmk json2c. You may or may not want to
6 * edit it directly.
7 */
8
9const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
10 [0] = LAYOUT(KC_GESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_GRV, KC_BSPC, KC_PGUP, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_PGDN, KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NUHS, KC_ENT, KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RO, KC_RSFT, KC_UP, KC_LCTL, KC_LGUI, KC_LALT, KC_MHEN, KC_SPC, KC_SPC, KC_HENK, KC_RALT, MO(1), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT),
11 [1] = LAYOUT(KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_TRNS, KC_DEL, KC_VOLU, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MPRV, KC_MPLY, KC_MNXT, KC_TRNS, KC_MUTE, KC_VOLD, KC_TRNS, KC_TRNS, MO(2), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PGUP, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, MO(1), KC_TRNS, KC_HOME, KC_PGDN, KC_END),
12 [2] = LAYOUT(BL_STEP, RGB_M_P, RGB_M_B, RGB_M_R, RGB_M_SW, RGB_M_SN, RGB_M_K, RGB_M_X, RGB_M_G, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_TOG, RGB_VAI, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RESET, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_VAD, KC_TRNS, KC_TRNS, MO(2), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, MO(1), KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_SAI, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RGB_MOD, RGB_MOD, KC_TRNS, KC_TRNS, MO(1), KC_TRNS, RGB_HUD, RGB_SAD, RGB_HUI)
13};
diff --git a/keyboards/clueboard/66/rev4/rev4.h b/keyboards/clueboard/66/rev4/rev4.h
index 86688c7a1..ef5b3f3e0 100644
--- a/keyboards/clueboard/66/rev4/rev4.h
+++ b/keyboards/clueboard/66/rev4/rev4.h
@@ -1,94 +1,3 @@
1#pragma once 1#pragma once
2 2
3#include "quantum.h" 3#include "quantum.h"
4
5/* Clueboard matrix layout
6 * ,-----------------------------------------------------------. ,---.
7 * | 00| 01| 02| 03| 04| 05| 06| 07| 50| 51| 52| 53| 54| 55| 56| | 57|
8 * |-----------------------------------------------------------| |---|
9 * | 10| 11| 12| 13| 14| 15| 16| 17| 60| 61| 62| 63| 64| 65| | 67|
10 * |-----------------------------------------------------------| `---'
11 * | 20| 21| 22| 23| 24| 25| 26| 27| 70| 71| 72| 73| 74| 75|
12 * |------------------------------------------------------------.
13 * | 30| 31| 32| 33| 34| 35| 36| 37| 80| 81| 82| 83| 84| 85|86|
14 * |------------------------------------------------------------------.
15 * | 40| 41| 42| 43| 45| 46| 90| 92| 93| 94| 95| 96| 97|
16 * `------------------------------------------------------------------'
17 * ,-----------------------------------------------------------. ,---.
18 * | `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Yen| BS| |Ins|
19 * |-----------------------------------------------------------| |---|
20 * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \| |Del|
21 * |-----------------------------------------------------------| `---'
22 * |Caps | A| S| D| F| G| H| J| k| L| ;| '| # | Ent|
23 * |--------------------------------------------------------------.
24 * |Shift| \| Z| X| C| V| B| N| M| ,| .| /| \|Shift| Up|
25 * |------------------------------------------------------------------.
26 * |Ctrl|Alt|Gui |MHen| Space| Space|Henk|Gui |Ctrl| Fn|Left|Down|Rgt|
27 * `------------------------------------------------------------------'
28 */
29// The first section contains all of the arguments
30// The second converts the arguments into a two-dimensional array
31
32#define LAYOUT_all( \
33 k00, k01, k02, k03, k04, k05, k06, k07, k50, k51, k52, k53, k54, k55, k56, k57, \
34 k10, k11, k12, k13, k14, k15, k16, k17, k60, k61, k62, k63, k64, k65, k67, \
35 k20, k21, k22, k23, k24, k25, k26, k27, k70, k71, k72, k73, k74, k75, \
36 k30, k31, k32, k33, k34, k35, k36, k37, k80, k81, k82, k83, k84, k85, k86, \
37 k40, k41, k42, k43, k45, k46, k90, k92, k93, k94, k95, k96, k97 \
38) { \
39 { k00, k01, k02, k03, k04, k05, k06, k07 }, \
40 { k10, k11, k12, k13, k14, k15, k16, k17 }, \
41 { k20, k21, k22, k23, k24, k25, k26, k27 }, \
42 { k30, k31, k32, k33, k34, k35, k36, k37 }, \
43 { k40, k41, k42, k43, KC_NO, k45, k46, KC_NO }, \
44 { k50, k51, k52, k53, k54, k55, k56, k57 }, \
45 { k60, k61, k62, k63, k64, k65, KC_NO, k67 }, \
46 { k70, k71, k72, k73, k74, k75, KC_NO, KC_NO }, \
47 { k80, k81, k82, k83, k84, k85, k86, KC_NO }, \
48 { k90, KC_NO, k92, k93, k94, k95, k96, k97 } \
49}
50
51/* LAYOUT_66_ansi, standard 66 key ANSI layout
52 */
53#define LAYOUT_66_ansi( \
54 k00, k01, k02, k03, k04, k05, k06, k07, k50, k51, k52, k53, k54, k56, k57, \
55 k10, k11, k12, k13, k14, k15, k16, k17, k60, k61, k62, k63, k64, k65, k67, \
56 k20, k21, k22, k23, k24, k25, k26, k27, k70, k71, k72, k73, k75, \
57 k30, k32, k33, k34, k35, k36, k37, k80, k81, k82, k83, k85, k86, \
58 k40, k41, k42, k46, k92, k93, k94, k95, k96, k97 \
59) { \
60 { k00, k01, k02, k03, k04, k05, k06, k07 }, \
61 { k10, k11, k12, k13, k14, k15, k16, k17 }, \
62 { k20, k21, k22, k23, k24, k25, k26, k27 }, \
63 { k30, KC_NO, k32, k33, k34, k35, k36, k37 }, \
64 { k40, k41, k42, KC_NO, KC_NO, KC_NO, k46, KC_NO }, \
65 { k50, k51, k52, k53, k54, KC_NO, k56, k57 }, \
66 { k60, k61, k62, k63, k64, k65, KC_NO, k67 }, \
67 { k70, k71, k72, k73, KC_NO, k75, KC_NO, KC_NO }, \
68 { k80, k81, k82, k83, KC_NO, k85, k86, KC_NO }, \
69 { KC_NO, KC_NO, k92, k93, k94, k95, k96, k97 } \
70}
71
72/* LAYOUT_66_iso, standard 67 key ISO layout
73 */
74#define LAYOUT_66_iso( \
75 k00, k01, k02, k03, k04, k05, k06, k07, k50, k51, k52, k53, k54, k56, k57, \
76 k10, k11, k12, k13, k14, k15, k16, k17, k60, k61, k62, k63, k64, k67, \
77 k20, k21, k22, k23, k24, k25, k26, k27, k70, k71, k72, k73, k74, k75, \
78 k30, k31, k32, k33, k34, k35, k36, k37, k80, k81, k82, k83, k85, k86, \
79 k40, k41, k42, k46, k92, k93, k94, k95, k96, k97 \
80) { \
81 { k00, k01, k02, k03, k04, k05, k06, k07 }, \
82 { k10, k11, k12, k13, k14, k15, k16, k17 }, \
83 { k20, k21, k22, k23, k24, k25, k26, k27 }, \
84 { k30, k31, k32, k33, k34, k35, k36, k37 }, \
85 { k40, k41, k42, KC_NO, KC_NO, KC_NO, k46, KC_NO }, \
86 { k50, k51, k52, k53, k54, KC_NO, k56, k57 }, \
87 { k60, k61, k62, k63, k64, KC_NO, KC_NO, k67 }, \
88 { k70, k71, k72, k73, k74, k75, KC_NO, KC_NO }, \
89 { k80, k81, k82, k83, KC_NO, k85, k86, KC_NO }, \
90 { KC_NO, KC_NO, k92, k93, k94, k95, k96, k97 } \
91}
92
93#define KEYMAP LAYOUT_all
94#define LAYOUT LAYOUT_all
diff --git a/keyboards/clueboard/66/rev4/rules.mk b/keyboards/clueboard/66/rev4/rules.mk
index f6120c929..4e157baed 100644
--- a/keyboards/clueboard/66/rev4/rules.mk
+++ b/keyboards/clueboard/66/rev4/rules.mk
@@ -1,22 +1,3 @@
1# MCU name 1# MCU name
2MCU = STM32F303 2MCU = STM32F303
3BOARD = QMK_PROTON_C 3BOARD = QMK_PROTON_C
4
5# Build Options
6# comment out to disable the options.
7#
8BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration
9MOUSEKEY_ENABLE = yes # Mouse keys
10EXTRAKEY_ENABLE = yes # Audio control and System control
11CONSOLE_ENABLE = yes # Console for debug
12COMMAND_ENABLE = no # Commands for debug and configuration
13NKRO_ENABLE = yes # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
14AUDIO_ENABLE = no
15BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
16RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow
17MIDI_ENABLE = no # MIDI controls
18UNICODE_ENABLE = no # Unicode
19BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
20AUDIO_ENABLE = yes
21
22LAYOUTS = 66_ansi 66_iso
diff --git a/keyboards/clueboard/66_hotswap/config.h b/keyboards/clueboard/66_hotswap/config.h
index b25686fa1..9b1dba3dc 100644
--- a/keyboards/clueboard/66_hotswap/config.h
+++ b/keyboards/clueboard/66_hotswap/config.h
@@ -18,32 +18,9 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
18#pragma once 18#pragma once
19#include "config_common.h" 19#include "config_common.h"
20 20
21/* USB Device descriptor parameter */
22#define VENDOR_ID 0xC1ED
23#define MANUFACTURER Clueboard
24#define PRODUCT Clueboard 66% HotSwap
25#define DESCRIPTION QMK keyboard firmware for Clueboard 66%
26
27/* COL2ROW or ROW2COL */
28#define DIODE_DIRECTION COL2ROW
29
30/* Set 0 if debouncing isn't needed */
31#define DEBOUNCE 5
32
33/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
34#define LOCKING_SUPPORT_ENABLE
35/* Locking resynchronize hack */
36#define LOCKING_RESYNC_ENABLE
37
38/* 21/*
39 * Feature disable options 22 * Feature disable options
40 * These options are also useful to firmware size reduction. 23 * These options are also useful to firmware size reduction.
41 */ 24 */
42
43//#define NO_DEBUG
44//#define NO_PRINT
45//#define NO_ACTION_LAYER
46//#define NO_ACTION_TAPPING
47#define NO_ACTION_ONESHOT 25#define NO_ACTION_ONESHOT
48#define NO_ACTION_MACRO 26#define NO_ACTION_MACRO
49//#define NO_ACTION_FUNCTION
diff --git a/keyboards/clueboard/66_hotswap/gen1/config.h b/keyboards/clueboard/66_hotswap/gen1/config.h
index 7c90d05b3..98d972887 100644
--- a/keyboards/clueboard/66_hotswap/gen1/config.h
+++ b/keyboards/clueboard/66_hotswap/gen1/config.h
@@ -18,37 +18,12 @@
18#pragma once 18#pragma once
19#include "config_common.h" 19#include "config_common.h"
20 20
21/* USB Device descriptor parameter */
22#define VENDOR_ID 0xC1ED
23#define PRODUCT_ID 0x2391
24#define DEVICE_VER 0x0001
25#define MANUFACTURER Clueboard
26
27/* Address for jumping to bootloader on STM32 chips. */ 21/* Address for jumping to bootloader on STM32 chips. */
28/* It is chip dependent, the correct number can be looked up here: 22/* It is chip dependent, the correct number can be looked up here:
29 * http://www.st.com/web/en/resource/technical/document/application_note/CD00167594.pdf 23 * http://www.st.com/web/en/resource/technical/document/application_note/CD00167594.pdf
30 */ 24 */
31#define STM32_BOOTLOADER_ADDRESS 0x1FFFD800 25#define STM32_BOOTLOADER_ADDRESS 0x1FFFD800
32 26
33/* key matrix size */
34#define MATRIX_ROWS 10
35#define MATRIX_COLS 8
36
37/*
38 * Keyboard Matrix Assignments
39 *
40 * Change this to how you wired your keyboard
41 * COLS: AVR pins used for columns, left to right
42 * ROWS: AVR pins used for rows, top to bottom
43 * DIODE_DIRECTION: COL2ROW = COL = Anode (+), ROW = Cathode (-, marked on diode)
44 * ROW2COL = ROW = Anode (+), COL = Cathode (-, marked on diode)
45 *
46*/
47#define MATRIX_ROW_PINS { B11, A6, A3, A2, A1, B5, B6, C15, C14, C13 }
48#define MATRIX_COL_PINS { B10, B2, B1, B0, A7, B4, B3, B7 }
49#define UNUSED_PINS { A0, A8, A15, B12, B13, B14, B15 }
50#define DIODE_DIRECTION COL2ROW
51
52/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */ 27/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */
53// #define DEBOUNCE 6 28// #define DEBOUNCE 6
54 29
diff --git a/keyboards/clueboard/66_hotswap/gen1/gen1.h b/keyboards/clueboard/66_hotswap/gen1/gen1.h
index 05adf4983..98f9ba142 100644
--- a/keyboards/clueboard/66_hotswap/gen1/gen1.h
+++ b/keyboards/clueboard/66_hotswap/gen1/gen1.h
@@ -16,74 +16,3 @@
16#pragma once 16#pragma once
17#include "quantum.h" 17#include "quantum.h"
18 18
19/*
20 * These are shortcuts to help you work with the various layout options. If your
21 * keymap works with one of the LAYOUT_...() macros you are encouraged to use that
22 * and to contribute your keymap to the corresponding layout in
23 * `qmk_firmware/layouts/community`.
24 */
25
26/* Clueboard matrix layout
27 * ,-----------------------------------------------------------. ,---.
28 * | 00| 01| 02| 03| 04| 05| 06| 07| 50| 51| 52| 53| 54| 56 | | 57|
29 * |-----------------------------------------------------------| |---|
30 * | 10| 11| 12| 13| 14| 15| 16| 17| 60| 61| 62| 63| 64| 65| | 67|
31 * |-----------------------------------------------------------| `---'
32 * | 20| 21| 22| 23| 24| 25| 26| 27| 70| 71| 72| 73| 75|
33 * |--------------------------------------------------------------.
34 * | 30 | 32| 33| 34| 35| 36| 37| 80| 81| 82| 83| 85 |86|
35 * |------------------------------------------------------------------.
36 * | 40| 41| 42| 45| 46| 90| 92| 93| 94| 95|96| 97|
37 * `------------------------------------------------------------------'
38 * ,-----------------------------------------------------------. ,---.
39 * | `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Backsp | |Ins|
40 * |-----------------------------------------------------------| |---|
41 * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \| |Del|
42 * |-----------------------------------------------------------| `---'
43 * |Caps | A| S| D| F| G| H| J| k| L| ;| '|Enter |
44 * |--------------------------------------------------------------.
45 * |Shift | Z| X| C| V| B| N| M| ,| .| /| Shift| Up|
46 * |------------------------------------------------------------------.
47 * |Ctrl|Alt|Gui | Space| Space|Gui |Alt |Fn |Ctrl|Left|Down|Rgt|
48 * `------------------------------------------------------------------'
49 */
50// The first section contains all of the arguments
51// The second converts the arguments into a two-dimensional array
52
53#define LAYOUT( \
54 k00, k01, k02, k03, k04, k05, k06, k07, k50, k51, k52, k53, k54, k55, k57, \
55 k10, k11, k12, k13, k14, k15, k16, k17, k60, k61, k62, k63, k64, k65, k67, \
56 k20, k21, k22, k23, k24, k25, k26, k27, k70, k71, k72, k73, k75, \
57 k30, k32, k33, k34, k35, k36, k37, k80, k81, k82, k83, k85, k86, \
58 k40, k41, k42, k45, k46, k90, k92, k93, k94, k95, k96, k97 \
59) { \
60 { k00, k01, k02, k03, k04, k05, k06, k07 }, \
61 { k10, k11, k12, k13, k14, k15, k16, k17 }, \
62 { k20, k21, k22, k23, k24, k25, k26, k27 }, \
63 { k30, KC_NO, k32, k33, k34, k35, k36, k37 }, \
64 { k40, k41, k42, KC_NO, KC_NO, k45, k46, KC_NO }, \
65 { k50, k51, k52, k53, k54, k55, KC_NO, k57 }, \
66 { k60, k61, k62, k63, k64, k65, KC_NO, k67 }, \
67 { k70, k71, k72, k73, KC_NO, k75, KC_NO, KC_NO }, \
68 { k80, k81, k82, k83, KC_NO, k85, k86, KC_NO }, \
69 { k90, KC_NO, k92, k93, k94, k95, k96, k97 } \
70}
71
72#define LAYOUT_66_ansi( \
73 k00, k01, k02, k03, k04, k05, k06, k07, k50, k51, k52, k53, k54, k55, k57, \
74 k10, k11, k12, k13, k14, k15, k16, k17, k60, k61, k62, k63, k64, k65, k67, \
75 k20, k21, k22, k23, k24, k25, k26, k27, k70, k71, k72, k73, k75, \
76 k30, k32, k33, k34, k35, k36, k37, k80, k81, k82, k83, k85, k86, \
77 k40, k41, k42, k46, k92, k93, k94, k95, k96, k97 \
78) { \
79 { k00, k01, k02, k03, k04, k05, k06, k07 }, \
80 { k10, k11, k12, k13, k14, k15, k16, k17 }, \
81 { k20, k21, k22, k23, k24, k25, k26, k27 }, \
82 { k30, KC_NO, k32, k33, k34, k35, k36, k37 }, \
83 { k40, k41, k42, KC_NO, KC_NO, KC_NO, k46, KC_NO }, \
84 { k50, k51, k52, k53, k54, k55, KC_NO, k57 }, \
85 { k60, k61, k62, k63, k64, k65, KC_NO, k67 }, \
86 { k70, k71, k72, k73, KC_NO, k75, KC_NO, KC_NO }, \
87 { k80, k81, k82, k83, KC_NO, k85, k86, KC_NO }, \
88 { KC_NO, KC_NO, k92, k93, k94, k95, k96, k97 } \
89}
diff --git a/keyboards/clueboard/66_hotswap/gen1/info.json b/keyboards/clueboard/66_hotswap/gen1/info.json
index 76c2b4420..76352b077 100644
--- a/keyboards/clueboard/66_hotswap/gen1/info.json
+++ b/keyboards/clueboard/66_hotswap/gen1/info.json
@@ -1,165 +1,178 @@
1{ 1{
2 "keyboard_name": "Clueboard 66% HotSwap Gen1", 2 "manufacturer": "Clueboard",
3 "maintainer": "skullydazed", 3 "keyboard_name": "Clueboard 66% HotSwap Gen1",
4 "width": 16.5, 4 "maintainer": "skullydazed",
5 "height": 5, 5 "height": 5,
6 "layouts": { 6 "width": 16.5,
7 "LAYOUT": { 7 "debounce": "5",
8 "layout": [ 8 "diode_direction": "COL2ROW",
9 {"x": 0, "y": 0}, 9 "features": {
10 {"x": 1, "y": 0}, 10 "audio": true,
11 {"x": 2, "y": 0}, 11 "bootmagic": true,
12 {"x": 3, "y": 0}, 12 "command": true,
13 {"x": 4, "y": 0}, 13 "console": true,
14 {"x": 5, "y": 0}, 14 "extrakey": true,
15 {"x": 6, "y": 0}, 15 "led_matrix": "IS31FL3731",
16 {"x": 7, "y": 0}, 16 "mousekey": true,
17 {"x": 8, "y": 0}, 17 "nkro": true
18 {"x": 9, "y": 0}, 18 },
19 {"x": 10, "y": 0}, 19 "matrix_pins": {
20 {"x": 11, "y": 0}, 20 "cols": ["B10", " B2", " B1", " B0", " A7", " B4", " B3", " B7"],
21 {"x": 12, "y": 0}, 21 "rows": ["B11", " A6", " A3", " A2", " A1", " B5", " B6", " C15", " C14", " C13"]
22 {"x": 13, "y": 0, "w": 2}, 22 },
23 23 "usb": {
24 {"x": 15.5, "y": 0}, 24 "device_ver": "0x0001",
25 25 "pid": "0x2391",
26 {"x": 0, "y": 1, "w": 1.5}, 26 "vid": "0xC1ED"
27 {"x": 1.5, "y": 1}, 27 },
28 {"x": 2.5, "y": 1}, 28 "community_layouts": [],
29 {"x": 3.5, "y": 1}, 29 "layout_aliases": {
30 {"x": 4.5, "y": 1}, 30 "LAYOUT": "LAYOUT_all"
31 {"x": 5.5, "y": 1}, 31 },
32 {"x": 6.5, "y": 1}, 32 "layouts": {
33 {"x": 7.5, "y": 1}, 33 "LAYOUT_66_ansi": {
34 {"x": 8.5, "y": 1}, 34 "key_count": 66,
35 {"x": 9.5, "y": 1}, 35 "layout": [
36 {"x": 10.5, "y": 1}, 36 { "label": "k00", "matrix": [0, 0], "w": 1, "x": 0, "y": 0 },
37 {"x": 11.5, "y": 1}, 37 { "label": "k01", "matrix": [0, 1], "w": 1, "x": 1, "y": 0 },
38 {"x": 12.5, "y": 1}, 38 { "label": "k02", "matrix": [0, 2], "w": 1, "x": 2, "y": 0 },
39 {"x": 13.5, "y": 1, "w": 1.5}, 39 { "label": "k03", "matrix": [0, 3], "w": 1, "x": 3, "y": 0 },
40 40 { "label": "k04", "matrix": [0, 4], "w": 1, "x": 4, "y": 0 },
41 {"x": 15.5, "y": 1}, 41 { "label": "k05", "matrix": [0, 5], "w": 1, "x": 5, "y": 0 },
42 42 { "label": "k06", "matrix": [0, 6], "w": 1, "x": 6, "y": 0 },
43 {"x": 0, "y": 2, "w": 1.75}, 43 { "label": "k07", "matrix": [0, 7], "w": 1, "x": 7, "y": 0 },
44 {"x": 1.75, "y": 2}, 44 { "label": "k50", "matrix": [5, 0], "w": 1, "x": 8, "y": 0 },
45 {"x": 2.75, "y": 2}, 45 { "label": "k51", "matrix": [5, 1], "w": 1, "x": 9, "y": 0 },
46 {"x": 3.75, "y": 2}, 46 { "label": "k52", "matrix": [5, 2], "w": 1, "x": 10, "y": 0 },
47 {"x": 4.75, "y": 2}, 47 { "label": "k53", "matrix": [5, 3], "w": 1, "x": 11, "y": 0 },
48 {"x": 5.75, "y": 2}, 48 { "label": "k54", "matrix": [5, 4], "w": 1, "x": 12, "y": 0 },
49 {"x": 6.75, "y": 2}, 49 { "label": "k55", "matrix": [5, 5], "w": 2, "x": 13, "y": 0 },
50 {"x": 7.75, "y": 2}, 50 { "label": "k57", "matrix": [5, 7], "w": 1, "x": 15.5, "y": 0 },
51 {"x": 8.75, "y": 2}, 51 { "label": "k10", "matrix": [1, 0], "w": 1.5, "x": 0, "y": 1 },
52 {"x": 9.75, "y": 2}, 52 { "label": "k11", "matrix": [1, 1], "w": 1, "x": 1.5, "y": 1 },
53 {"x": 10.75, "y": 2}, 53 { "label": "k12", "matrix": [1, 2], "w": 1, "x": 2.5, "y": 1 },
54 {"x": 11.75, "y": 2}, 54 { "label": "k13", "matrix": [1, 3], "w": 1, "x": 3.5, "y": 1 },
55 {"x": 12.75, "y": 2, "w": 2.25}, 55 { "label": "k14", "matrix": [1, 4], "w": 1, "x": 4.5, "y": 1 },
56 56 { "label": "k15", "matrix": [1, 5], "w": 1, "x": 5.5, "y": 1 },
57 {"x": 0, "y": 3, "w": 2.25}, 57 { "label": "k16", "matrix": [1, 6], "w": 1, "x": 6.5, "y": 1 },
58 {"x": 2.25, "y": 3}, 58 { "label": "k17", "matrix": [1, 7], "w": 1, "x": 7.5, "y": 1 },
59 {"x": 3.25, "y": 3}, 59 { "label": "k60", "matrix": [6, 0], "w": 1, "x": 8.5, "y": 1 },
60 {"x": 4.25, "y": 3}, 60 { "label": "k61", "matrix": [6, 1], "w": 1, "x": 9.5, "y": 1 },
61 {"x": 5.25, "y": 3}, 61 { "label": "k62", "matrix": [6, 2], "w": 1, "x": 10.5, "y": 1 },
62 {"x": 6.25, "y": 3}, 62 { "label": "k63", "matrix": [6, 3], "w": 1, "x": 11.5, "y": 1 },
63 {"x": 7.25, "y": 3}, 63 { "label": "k64", "matrix": [6, 4], "w": 1, "x": 12.5, "y": 1 },
64 {"x": 8.25, "y": 3}, 64 { "label": "k65", "matrix": [6, 5], "w": 1.5, "x": 13.5, "y": 1 },
65 {"x": 9.25, "y": 3}, 65 { "label": "k67", "matrix": [6, 7], "w": 1, "x": 15.5, "y": 1 },
66 {"x": 10.25, "y": 3}, 66 { "label": "k20", "matrix": [2, 0], "w": 1.75, "x": 0, "y": 2 },
67 {"x": 11.25, "y": 3}, 67 { "label": "k21", "matrix": [2, 1], "w": 1, "x": 1.75, "y": 2 },
68 {"x": 12.25, "y": 3, "w": 2.25}, 68 { "label": "k22", "matrix": [2, 2], "w": 1, "x": 2.75, "y": 2 },
69 69 { "label": "k23", "matrix": [2, 3], "w": 1, "x": 3.75, "y": 2 },
70 {"x": 14.5, "y": 3}, 70 { "label": "k24", "matrix": [2, 4], "w": 1, "x": 4.75, "y": 2 },
71 71 { "label": "k25", "matrix": [2, 5], "w": 1, "x": 5.75, "y": 2 },
72 {"x": 0, "y": 4, "w": 1.25}, 72 { "label": "k26", "matrix": [2, 6], "w": 1, "x": 6.75, "y": 2 },
73 {"x": 1.25, "y": 4, "w": 1.25}, 73 { "label": "k27", "matrix": [2, 7], "w": 1, "x": 7.75, "y": 2 },
74 {"x": 2.5, "y": 4, "w": 1.25}, 74 { "label": "k70", "matrix": [7, 0], "w": 1, "x": 8.75, "y": 2 },
75 {"x": 3.75, "y": 4, "w": 2.75}, 75 { "label": "k71", "matrix": [7, 1], "w": 1, "x": 9.75, "y": 2 },
76 {"x": 6.5, "y": 4, "w": 2.25}, 76 { "label": "k72", "matrix": [7, 2], "w": 1, "x": 10.75, "y": 2 },
77 {"x": 8.75, "y": 4, "w": 1.25}, 77 { "label": "k73", "matrix": [7, 3], "w": 1, "x": 11.75, "y": 2 },
78 {"x": 10, "y": 4, "w": 1.25}, 78 { "label": "k75", "matrix": [7, 5], "w": 2.25, "x": 12.75, "y": 2 },
79 {"x": 11.25, "y": 4}, 79 { "label": "k30", "matrix": [3, 0], "w": 2.25, "x": 0, "y": 3 },
80 {"x": 12.25, "y": 4, "w": 1.25}, 80 { "label": "k32", "matrix": [3, 2], "w": 1, "x": 2.25, "y": 3 },
81 {"x": 13.5, "y": 4}, 81 { "label": "k33", "matrix": [3, 3], "w": 1, "x": 3.25, "y": 3 },
82 {"x": 14.5, "y": 4}, 82 { "label": "k34", "matrix": [3, 4], "w": 1, "x": 4.25, "y": 3 },
83 {"x": 15.5, "y": 4} 83 { "label": "k35", "matrix": [3, 5], "w": 1, "x": 5.25, "y": 3 },
84 ] 84 { "label": "k36", "matrix": [3, 6], "w": 1, "x": 6.25, "y": 3 },
85 }, 85 { "label": "k37", "matrix": [3, 7], "w": 1, "x": 7.25, "y": 3 },
86 "LAYOUT_66_ansi": { 86 { "label": "k80", "matrix": [8, 0], "w": 1, "x": 8.25, "y": 3 },
87 "layout": [ 87 { "label": "k81", "matrix": [8, 1], "w": 1, "x": 9.25, "y": 3 },
88 {"x": 0, "y": 0}, 88 { "label": "k82", "matrix": [8, 2], "w": 1, "x": 10.25, "y": 3 },
89 {"x": 1, "y": 0}, 89 { "label": "k83", "matrix": [8, 3], "w": 1, "x": 11.25, "y": 3 },
90 {"x": 2, "y": 0}, 90 { "label": "k85", "matrix": [8, 5], "w": 2.25, "x": 12.25, "y": 3 },
91 {"x": 3, "y": 0}, 91 { "label": "k86", "matrix": [8, 6], "w": 1, "x": 14.5, "y": 3 },
92 {"x": 4, "y": 0}, 92 { "label": "k40", "matrix": [4, 0], "w": 1.25, "x": 0, "y": 4 },
93 {"x": 5, "y": 0}, 93 { "label": "k41", "matrix": [4, 1], "w": 1.25, "x": 1.25, "y": 4 },
94 {"x": 6, "y": 0}, 94 { "label": "k42", "matrix": [4, 2], "w": 1.25, "x": 2.5, "y": 4 },
95 {"x": 7, "y": 0}, 95 { "label": "k46", "matrix": [4, 6], "w": 6.25, "x": 3.75, "y": 4 },
96 {"x": 8, "y": 0}, 96 { "label": "k92", "matrix": [9, 2], "w": 1.25, "x": 10, "y": 4 },
97 {"x": 9, "y": 0}, 97 { "label": "k93", "matrix": [9, 3], "w": 1, "x": 11.25, "y": 4 },
98 {"x": 10, "y": 0}, 98 { "label": "k94", "matrix": [9, 4], "w": 1.25, "x": 12.25, "y": 4 },
99 {"x": 11, "y": 0}, 99 { "label": "k95", "matrix": [9, 5], "w": 1, "x": 13.5, "y": 4 },
100 {"x": 12, "y": 0}, 100 { "label": "k96", "matrix": [9, 6], "w": 1, "x": 14.5, "y": 4 },
101 {"x": 13, "y": 0, "w": 2}, 101 { "label": "k97", "matrix": [9, 7], "w": 1, "x": 15.5, "y": 4 }
102 102 ]
103 {"x": 15.5, "y": 0}, 103 },
104 104 "LAYOUT_all": {
105 {"x": 0, "y": 1, "w": 1.5}, 105 "key_count": 68,
106 {"x": 1.5, "y": 1}, 106 "layout": [
107 {"x": 2.5, "y": 1}, 107 { "label": "k00", "matrix": [0, 0], "w": 1, "x": 0, "y": 0 },
108 {"x": 3.5, "y": 1}, 108 { "label": "k01", "matrix": [0, 1], "w": 1, "x": 1, "y": 0 },
109 {"x": 4.5, "y": 1}, 109 { "label": "k02", "matrix": [0, 2], "w": 1, "x": 2, "y": 0 },
110 {"x": 5.5, "y": 1}, 110 { "label": "k03", "matrix": [0, 3], "w": 1, "x": 3, "y": 0 },
111 {"x": 6.5, "y": 1}, 111 { "label": "k04", "matrix": [0, 4], "w": 1, "x": 4, "y": 0 },
112 {"x": 7.5, "y": 1}, 112 { "label": "k05", "matrix": [0, 5], "w": 1, "x": 5, "y": 0 },
113 {"x": 8.5, "y": 1}, 113 { "label": "k06", "matrix": [0, 6], "w": 1, "x": 6, "y": 0 },
114 {"x": 9.5, "y": 1}, 114 { "label": "k07", "matrix": [0, 7], "w": 1, "x": 7, "y": 0 },
115 {"x": 10.5, "y": 1}, 115 { "label": "k50", "matrix": [5, 0], "w": 1, "x": 8, "y": 0 },
116 {"x": 11.5, "y": 1}, 116 { "label": "k51", "matrix": [5, 1], "w": 1, "x": 9, "y": 0 },
117 {"x": 12.5, "y": 1}, 117 { "label": "k52", "matrix": [5, 2], "w": 1, "x": 10, "y": 0 },
118 {"x": 13.5, "y": 1, "w": 1.5}, 118 { "label": "k53", "matrix": [5, 3], "w": 1, "x": 11, "y": 0 },
119 119 { "label": "k54", "matrix": [5, 4], "w": 1, "x": 12, "y": 0 },
120 {"x": 15.5, "y": 1}, 120 { "label": "k55", "matrix": [5, 5], "w": 2, "x": 13, "y": 0 },
121 121 { "label": "k57", "matrix": [5, 7], "w": 1, "x": 15.5, "y": 0 },
122 {"x": 0, "y": 2, "w": 1.75}, 122 { "label": "k10", "matrix": [1, 0], "w": 1.5, "x": 0, "y": 1 },
123 {"x": 1.75, "y": 2}, 123 { "label": "k11", "matrix": [1, 1], "w": 1, "x": 1.5, "y": 1 },
124 {"x": 2.75, "y": 2}, 124 { "label": "k12", "matrix": [1, 2], "w": 1, "x": 2.5, "y": 1 },
125 {"x": 3.75, "y": 2}, 125 { "label": "k13", "matrix": [1, 3], "w": 1, "x": 3.5, "y": 1 },
126 {"x": 4.75, "y": 2}, 126 { "label": "k14", "matrix": [1, 4], "w": 1, "x": 4.5, "y": 1 },
127 {"x": 5.75, "y": 2}, 127 { "label": "k15", "matrix": [1, 5], "w": 1, "x": 5.5, "y": 1 },
128 {"x": 6.75, "y": 2}, 128 { "label": "k16", "matrix": [1, 6], "w": 1, "x": 6.5, "y": 1 },
129 {"x": 7.75, "y": 2}, 129 { "label": "k17", "matrix": [1, 7], "w": 1, "x": 7.5, "y": 1 },
130 {"x": 8.75, "y": 2}, 130 { "label": "k60", "matrix": [6, 0], "w": 1, "x": 8.5, "y": 1 },
131 {"x": 9.75, "y": 2}, 131 { "label": "k61", "matrix": [6, 1], "w": 1, "x": 9.5, "y": 1 },
132 {"x": 10.75, "y": 2}, 132 { "label": "k62", "matrix": [6, 2], "w": 1, "x": 10.5, "y": 1 },
133 {"x": 11.75, "y": 2}, 133 { "label": "k63", "matrix": [6, 3], "w": 1, "x": 11.5, "y": 1 },
134 {"x": 12.75, "y": 2, "w": 2.25}, 134 { "label": "k64", "matrix": [6, 4], "w": 1, "x": 12.5, "y": 1 },
135 135 { "label": "k65", "matrix": [6, 5], "w": 1.5, "x": 13.5, "y": 1 },
136 {"x": 0, "y": 3, "w": 2.25}, 136 { "label": "k67", "matrix": [6, 7], "w": 1, "x": 15.5, "y": 1 },
137 {"x": 2.25, "y": 3}, 137 { "label": "k20", "matrix": [2, 0], "w": 1.75, "x": 0, "y": 2 },
138 {"x": 3.25, "y": 3}, 138 { "label": "k21", "matrix": [2, 1], "w": 1, "x": 1.75, "y": 2 },
139 {"x": 4.25, "y": 3}, 139 { "label": "k22", "matrix": [2, 2], "w": 1, "x": 2.75, "y": 2 },
140 {"x": 5.25, "y": 3}, 140 { "label": "k23", "matrix": [2, 3], "w": 1, "x": 3.75, "y": 2 },
141 {"x": 6.25, "y": 3}, 141 { "label": "k24", "matrix": [2, 4], "w": 1, "x": 4.75, "y": 2 },
142 {"x": 7.25, "y": 3}, 142 { "label": "k25", "matrix": [2, 5], "w": 1, "x": 5.75, "y": 2 },
143 {"x": 8.25, "y": 3}, 143 { "label": "k26", "matrix": [2, 6], "w": 1, "x": 6.75, "y": 2 },
144 {"x": 9.25, "y": 3}, 144 { "label": "k27", "matrix": [2, 7], "w": 1, "x": 7.75, "y": 2 },
145 {"x": 10.25, "y": 3}, 145 { "label": "k70", "matrix": [7, 0], "w": 1, "x": 8.75, "y": 2 },
146 {"x": 11.25, "y": 3}, 146 { "label": "k71", "matrix": [7, 1], "w": 1, "x": 9.75, "y": 2 },
147 {"x": 12.25, "y": 3, "w": 2.25}, 147 { "label": "k72", "matrix": [7, 2], "w": 1, "x": 10.75, "y": 2 },
148 148 { "label": "k73", "matrix": [7, 3], "w": 1, "x": 11.75, "y": 2 },
149 {"x": 14.5, "y": 3}, 149 { "label": "k75", "matrix": [7, 5], "w": 2.25, "x": 12.75, "y": 2 },
150 150 { "label": "k30", "matrix": [3, 0], "w": 2.25, "x": 0, "y": 3 },
151 {"x": 0, "y": 4, "w": 1.25}, 151 { "label": "k32", "matrix": [3, 2], "w": 1, "x": 2.25, "y": 3 },
152 {"x": 1.25, "y": 4, "w": 1.25}, 152 { "label": "k33", "matrix": [3, 3], "w": 1, "x": 3.25, "y": 3 },
153 {"x": 2.5, "y": 4, "w": 1.25}, 153 { "label": "k34", "matrix": [3, 4], "w": 1, "x": 4.25, "y": 3 },
154 {"x": 3.75, "y": 4, "w": 6.25}, 154 { "label": "k35", "matrix": [3, 5], "w": 1, "x": 5.25, "y": 3 },
155 {"x": 10, "y": 4, "w": 1.25}, 155 { "label": "k36", "matrix": [3, 6], "w": 1, "x": 6.25, "y": 3 },
156 {"x": 11.25, "y": 4}, 156 { "label": "k37", "matrix": [3, 7], "w": 1, "x": 7.25, "y": 3 },
157 {"x": 12.25, "y": 4, "w": 1.25}, 157 { "label": "k80", "matrix": [8, 0], "w": 1, "x": 8.25, "y": 3 },
158 158 { "label": "k81", "matrix": [8, 1], "w": 1, "x": 9.25, "y": 3 },
159 {"x": 13.5, "y": 4}, 159 { "label": "k82", "matrix": [8, 2], "w": 1, "x": 10.25, "y": 3 },
160 {"x": 14.5, "y": 4}, 160 { "label": "k83", "matrix": [8, 3], "w": 1, "x": 11.25, "y": 3 },
161 {"x": 15.5, "y": 4} 161 { "label": "k85", "matrix": [8, 5], "w": 2.25, "x": 12.25, "y": 3 },
162 ] 162 { "label": "k86", "matrix": [8, 6], "w": 1, "x": 14.5, "y": 3 },
163 } 163 { "label": "k40", "matrix": [4, 0], "w": 1.25, "x": 0, "y": 4 },
164 { "label": "k41", "matrix": [4, 1], "w": 1.25, "x": 1.25, "y": 4 },
165 { "label": "k42", "matrix": [4, 2], "w": 1.25, "x": 2.5, "y": 4 },
166 { "label": "k45", "matrix": [4, 5], "w": 2.75, "x": 3.75, "y": 4 },
167 { "label": "k46", "matrix": [4, 6], "w": 2.25, "x": 6.5, "y": 4 },
168 { "label": "k90", "matrix": [9, 0], "w": 1.25, "x": 8.75, "y": 4 },
169 { "label": "k92", "matrix": [9, 2], "w": 1.25, "x": 10, "y": 4 },
170 { "label": "k93", "matrix": [9, 3], "w": 1, "x": 11.25, "y": 4 },
171 { "label": "k94", "matrix": [9, 4], "w": 1.25, "x": 12.25, "y": 4 },
172 { "label": "k95", "matrix": [9, 5], "w": 1, "x": 13.5, "y": 4 },
173 { "label": "k96", "matrix": [9, 6], "w": 1, "x": 14.5, "y": 4 },
174 { "label": "k97", "matrix": [9, 7], "w": 1, "x": 15.5, "y": 4 }
175 ]
164 } 176 }
177 }
165} 178}
diff --git a/keyboards/clueboard/66_hotswap/gen1/readme.md b/keyboards/clueboard/66_hotswap/gen1/readme.md
new file mode 100644
index 000000000..036df01c6
--- /dev/null
+++ b/keyboards/clueboard/66_hotswap/gen1/readme.md
@@ -0,0 +1,16 @@
1# Clueboard 66% HotSwap
2
3![Clueboard](https://i.imgur.com/8UmBoNx.jpg)
4
5A fully customizable 66% keyboard with Hot Swap sockets.
6
7* Keyboard Maintainer: [Zach White](https://github.com/skullydazed)
8* Hardware Supported: Clueboard 66% HotSwap PCB
9 * 2.9 (gen1)
10* Hardware Availability: [clueboard.co](https://clueboard.co/)
11
12Make example for this keyboard (after setting up your build environment):
13
14 make clueboard/66_hotswap/gen1:default
15
16See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
diff --git a/keyboards/clueboard/66_hotswap/gen1/rules.mk b/keyboards/clueboard/66_hotswap/gen1/rules.mk
index 18e01fcd1..7e85acec6 100644
--- a/keyboards/clueboard/66_hotswap/gen1/rules.mk
+++ b/keyboards/clueboard/66_hotswap/gen1/rules.mk
@@ -2,21 +2,5 @@
2MCU = STM32F303 2MCU = STM32F303
3BOARD = QMK_PROTON_C 3BOARD = QMK_PROTON_C
4 4
5# LED Configuration 5# project specific files
6LED_MATRIX_ENABLE = yes 6SRC = led.c
7LED_MATRIX_DRIVER = IS31FL3731
8
9# Build Options
10# comment out to disable the options.
11#
12BOOTMAGIC_ENABLE = yes # Virtual DIP switch configuration
13MOUSEKEY_ENABLE = yes # Mouse keys
14EXTRAKEY_ENABLE = yes # Audio control and System control
15CONSOLE_ENABLE = yes # Console for debug
16COMMAND_ENABLE = yes # Commands for debug and configuration
17#SLEEP_LED_ENABLE = yes # Breathing sleep LED during USB suspend
18NKRO_ENABLE = yes # USB Nkey Rollover
19AUDIO_ENABLE = yes
20# SERIAL_LINK_ENABLE = yes
21
22LAYOUTS = 66_ansi
diff --git a/keyboards/clueboard/66_hotswap/prototype/config.h b/keyboards/clueboard/66_hotswap/prototype/config.h
index f6ab6ba53..5c22b927a 100644
--- a/keyboards/clueboard/66_hotswap/prototype/config.h
+++ b/keyboards/clueboard/66_hotswap/prototype/config.h
@@ -1,27 +1,6 @@
1#pragma once 1#pragma once
2#include "config_common.h" 2#include "config_common.h"
3 3
4#define PRODUCT_ID 0x2390
5#define DEVICE_VER 0x0001
6
7/* key matrix size */
8#define MATRIX_ROWS 10
9#define MATRIX_COLS 8
10
11// ROWS: Top to bottom, COLS: Left to right
12/* Row pin configuration
13* row: 0 1 2 3 4 5 6 7 8 9
14* pin: B2 C7 C6 B6 B5 B0 B3 D5 D3 D2
15*/
16
17#define MATRIX_ROW_PINS { B2, C7, C6, B6, B5, B0, B3, D5, D3, D2 }
18/* Column pin configuration
19 * col: 0 1 2 3 4 5 6 7
20 * pin: F0 F1 F4 F5 F6 F7 E6 B1
21 */
22#define MATRIX_COL_PINS { F0, F1, F4, F5, F6, F7, E6, B1 }
23#define UNUSED_PINS
24
25/* Speaker configuration 4/* Speaker configuration
26 */ 5 */
27#define B7_AUDIO 6#define B7_AUDIO
@@ -32,21 +11,12 @@
32 */ 11 */
33#define NO_ACTION_TAPPING 12#define NO_ACTION_TAPPING
34 13
35#define LED_CAPS_LOCK_PIN B4
36
37/* Backlight configuration 14/* Backlight configuration
38 */ 15 */
39#define BACKLIGHT_LEVELS 1 16#define BACKLIGHT_LEVELS 1
40 17
41/* Underlight configuration 18/* Underlight configuration
42 */ 19 */
43#define RGB_DI_PIN D7
44#define RGBLED_NUM 26 // Number of LEDs
45#define RGBLIGHT_HUE_STEP 32
46#define RGBLIGHT_SAT_STEP 17
47#define RGBLIGHT_VAL_STEP 17
48
49#define RGBLIGHT_ANIMATIONS
50#define RGBLIGHT_EFFECT_BREATHE_CENTER 1 20#define RGBLIGHT_EFFECT_BREATHE_CENTER 1
51#define RGBLIGHT_EFFECT_BREATHE_MAX 200 21#define RGBLIGHT_EFFECT_BREATHE_MAX 200
52#define RGBLIGHT_EFFECT_CHRISTMAS_INTERVAL 666*2 22#define RGBLIGHT_EFFECT_CHRISTMAS_INTERVAL 666*2
diff --git a/keyboards/clueboard/66_hotswap/prototype/info.json b/keyboards/clueboard/66_hotswap/prototype/info.json
index 32bd51d09..157222359 100644
--- a/keyboards/clueboard/66_hotswap/prototype/info.json
+++ b/keyboards/clueboard/66_hotswap/prototype/info.json
@@ -1,245 +1,198 @@
1{ 1{
2 "keyboard_name": "Clueboard 66% HotSwap Prototype", 2 "manufacturer": "Clueboard",
3 "maintainer": "skullydazed", 3 "keyboard_name": "Clueboard 66% HotSwap Prototype",
4 "width": 16.5, 4 "maintainer": "skullydazed",
5 "height": 5, 5 "height": 5,
6 "layouts": { 6 "width": 16.5,
7 "LAYOUT_all": { 7 "debounce": "5",
8 "layout": [ 8 "diode_direction": "COL2ROW",
9 {"x": 0, "y": 0}, 9 "features": {
10 {"x": 1, "y": 0}, 10 "audio": true,
11 {"x": 2, "y": 0}, 11 "backlight": true,
12 {"x": 3, "y": 0}, 12 "bluetooth": false,
13 {"x": 4, "y": 0}, 13 "bootmagic": false,
14 {"x": 5, "y": 0}, 14 "command": false,
15 {"x": 6, "y": 0}, 15 "console": true,
16 {"x": 7, "y": 0}, 16 "extrakey": true,
17 {"x": 8, "y": 0}, 17 "midi": false,
18 {"x": 9, "y": 0}, 18 "mousekey": false,
19 {"x": 10, "y": 0}, 19 "nkro": true,
20 {"x": 11, "y": 0}, 20 "rgblight": true,
21 {"x": 12, "y": 0}, 21 "unicode": false
22 {"x": 13, "y": 0, "w": 2}, 22 },
23 23 "indicators": {
24 {"x": 15.5, "y": 0}, 24 "caps_lock": "B4"
25 25 },
26 {"x": 0, "y": 1, "w": 1.5}, 26 "matrix_pins": {
27 {"x": 1.5, "y": 1}, 27 "cols": ["F0", " F1", " F4", " F5", " F6", " F7", " E6", " B1"],
28 {"x": 2.5, "y": 1}, 28 "rows": ["B2", " C7", " C6", " B6", " B5", " B0", " B3", " D5", " D3", " D2"]
29 {"x": 3.5, "y": 1}, 29 },
30 {"x": 4.5, "y": 1}, 30 "rgblight": {
31 {"x": 5.5, "y": 1}, 31 "animations": {
32 {"x": 6.5, "y": 1}, 32 "all": true
33 {"x": 7.5, "y": 1}, 33 },
34 {"x": 8.5, "y": 1}, 34 "brightness_steps": "17",
35 {"x": 9.5, "y": 1}, 35 "hue_steps": "32",
36 {"x": 10.5, "y": 1}, 36 "led_count": "26",
37 {"x": 11.5, "y": 1}, 37 "pin": "D7",
38 {"x": 12.5, "y": 1}, 38 "saturation_steps": "17"
39 {"x": 13.5, "y": 1, "w": 1.5}, 39 },
40 40 "usb": {
41 {"x": 15.5, "y": 1}, 41 "device_ver": "0x0001",
42 42 "pid": "0x2390",
43 {"x": 0, "y": 2, "w": 1.75}, 43 "vid": "0xC1ED"
44 {"x": 1.75, "y": 2}, 44 },
45 {"x": 2.75, "y": 2}, 45 "community_layouts": ["66_ansi"],
46 {"x": 3.75, "y": 2}, 46 "layout_aliases": {
47 {"x": 4.75, "y": 2}, 47 "KEYMAP": "LAYOUT_all",
48 {"x": 5.75, "y": 2}, 48 "LAYOUT": "LAYOUT_all"
49 {"x": 6.75, "y": 2}, 49 },
50 {"x": 7.75, "y": 2}, 50 "layouts": {
51 {"x": 8.75, "y": 2}, 51 "LAYOUT_66_ansi": {
52 {"x": 9.75, "y": 2}, 52 "key_count": 66,
53 {"x": 10.75, "y": 2}, 53 "layout": [
54 {"x": 11.75, "y": 2}, 54 { "label": "k00", "matrix": [0, 0], "w": 1, "x": 0, "y": 0 },
55 {"x": 12.75, "y": 2, "w": 2.25}, 55 { "label": "k01", "matrix": [0, 1], "w": 1, "x": 1, "y": 0 },
56 56 { "label": "k02", "matrix": [0, 2], "w": 1, "x": 2, "y": 0 },
57 {"x": 0, "y": 3, "w": 1.25}, 57 { "label": "k03", "matrix": [0, 3], "w": 1, "x": 3, "y": 0 },
58 {"x": 1.25, "y": 3}, 58 { "label": "k04", "matrix": [0, 4], "w": 1, "x": 4, "y": 0 },
59 {"x": 2.25, "y": 3}, 59 { "label": "k05", "matrix": [0, 5], "w": 1, "x": 5, "y": 0 },
60 {"x": 3.25, "y": 3}, 60 { "label": "k06", "matrix": [0, 6], "w": 1, "x": 6, "y": 0 },
61 {"x": 4.25, "y": 3}, 61 { "label": "k07", "matrix": [0, 7], "w": 1, "x": 7, "y": 0 },
62 {"x": 5.25, "y": 3}, 62 { "label": "k50", "matrix": [5, 0], "w": 1, "x": 8, "y": 0 },
63 {"x": 6.25, "y": 3}, 63 { "label": "k51", "matrix": [5, 1], "w": 1, "x": 9, "y": 0 },
64 {"x": 7.25, "y": 3}, 64 { "label": "k52", "matrix": [5, 2], "w": 1, "x": 10, "y": 0 },
65 {"x": 8.25, "y": 3}, 65 { "label": "k53", "matrix": [5, 3], "w": 1, "x": 11, "y": 0 },
66 {"x": 9.25, "y": 3}, 66 { "label": "k54", "matrix": [5, 4], "w": 1, "x": 12, "y": 0 },
67 {"x": 10.25, "y": 3}, 67 { "label": "k56", "matrix": [5, 6], "w": 2, "x": 13, "y": 0 },
68 {"x": 11.25, "y": 3}, 68 { "label": "k57", "matrix": [5, 7], "w": 1, "x": 15.5, "y": 0 },
69 {"x": 12.25, "y": 3}, 69 { "label": "k10", "matrix": [1, 0], "w": 1.5, "x": 0, "y": 1 },
70 {"x": 13.25, "y": 3, "w": 1.25}, 70 { "label": "k11", "matrix": [1, 1], "w": 1, "x": 1.5, "y": 1 },
71 {"x": 14.5, "y": 3}, 71 { "label": "k12", "matrix": [1, 2], "w": 1, "x": 2.5, "y": 1 },
72 72 { "label": "k13", "matrix": [1, 3], "w": 1, "x": 3.5, "y": 1 },
73 {"x": 0, "y": 4, "w": 1.25}, 73 { "label": "k14", "matrix": [1, 4], "w": 1, "x": 4.5, "y": 1 },
74 {"x": 1.25, "y": 4, "w": 1.25}, 74 { "label": "k15", "matrix": [1, 5], "w": 1, "x": 5.5, "y": 1 },
75 {"x": 2.5, "y": 4, "w": 1.25}, 75 { "label": "k16", "matrix": [1, 6], "w": 1, "x": 6.5, "y": 1 },
76 {"x": 3.75, "y": 4, "w": 2.75}, 76 { "label": "k17", "matrix": [1, 7], "w": 1, "x": 7.5, "y": 1 },
77 {"x": 6.5, "y": 4, "w": 2.25}, 77 { "label": "k60", "matrix": [6, 0], "w": 1, "x": 8.5, "y": 1 },
78 {"x": 8.75, "y": 4, "w": 1.25}, 78 { "label": "k61", "matrix": [6, 1], "w": 1, "x": 9.5, "y": 1 },
79 {"x": 10, "y": 4, "w": 1.25}, 79 { "label": "k62", "matrix": [6, 2], "w": 1, "x": 10.5, "y": 1 },
80 {"x": 11.25, "y": 4}, 80 { "label": "k63", "matrix": [6, 3], "w": 1, "x": 11.5, "y": 1 },
81 {"x": 12.25, "y": 4, "w": 1.25}, 81 { "label": "k64", "matrix": [6, 4], "w": 1, "x": 12.5, "y": 1 },
82 {"x": 13.5, "y": 4}, 82 { "label": "k65", "matrix": [6, 5], "w": 1.5, "x": 13.5, "y": 1 },
83 {"x": 14.5, "y": 4}, 83 { "label": "k67", "matrix": [6, 7], "w": 1, "x": 15.5, "y": 1 },
84 {"x": 15.5, "y": 4} 84 { "label": "k20", "matrix": [2, 0], "w": 1.75, "x": 0, "y": 2 },
85 ] 85 { "label": "k21", "matrix": [2, 1], "w": 1, "x": 1.75, "y": 2 },
86 }, 86 { "label": "k22", "matrix": [2, 2], "w": 1, "x": 2.75, "y": 2 },
87 "LAYOUT": { 87 { "label": "k23", "matrix": [2, 3], "w": 1, "x": 3.75, "y": 2 },
88 "layout": [ 88 { "label": "k24", "matrix": [2, 4], "w": 1, "x": 4.75, "y": 2 },
89 {"x": 0, "y": 0}, 89 { "label": "k25", "matrix": [2, 5], "w": 1, "x": 5.75, "y": 2 },
90 {"x": 1, "y": 0}, 90 { "label": "k26", "matrix": [2, 6], "w": 1, "x": 6.75, "y": 2 },
91 {"x": 2, "y": 0}, 91 { "label": "k27", "matrix": [2, 7], "w": 1, "x": 7.75, "y": 2 },
92 {"x": 3, "y": 0}, 92 { "label": "k70", "matrix": [7, 0], "w": 1, "x": 8.75, "y": 2 },
93 {"x": 4, "y": 0}, 93 { "label": "k71", "matrix": [7, 1], "w": 1, "x": 9.75, "y": 2 },
94 {"x": 5, "y": 0}, 94 { "label": "k72", "matrix": [7, 2], "w": 1, "x": 10.75, "y": 2 },
95 {"x": 6, "y": 0}, 95 { "label": "k73", "matrix": [7, 3], "w": 1, "x": 11.75, "y": 2 },
96 {"x": 7, "y": 0}, 96 { "label": "k75", "matrix": [7, 5], "w": 2.25, "x": 12.75, "y": 2 },
97 {"x": 8, "y": 0}, 97 { "label": "k30", "matrix": [3, 0], "w": 2.25, "x": 0, "y": 3 },
98 {"x": 9, "y": 0}, 98 { "label": "k32", "matrix": [3, 2], "w": 1, "x": 2.25, "y": 3 },
99 {"x": 10, "y": 0}, 99 { "label": "k33", "matrix": [3, 3], "w": 1, "x": 3.25, "y": 3 },
100 {"x": 11, "y": 0}, 100 { "label": "k34", "matrix": [3, 4], "w": 1, "x": 4.25, "y": 3 },
101 {"x": 12, "y": 0}, 101 { "label": "k35", "matrix": [3, 5], "w": 1, "x": 5.25, "y": 3 },
102 {"x": 13, "y": 0, "w": 2}, 102 { "label": "k36", "matrix": [3, 6], "w": 1, "x": 6.25, "y": 3 },
103 103 { "label": "k37", "matrix": [3, 7], "w": 1, "x": 7.25, "y": 3 },
104 {"x": 15.5, "y": 0}, 104 { "label": "k80", "matrix": [8, 0], "w": 1, "x": 8.25, "y": 3 },
105 105 { "label": "k81", "matrix": [8, 1], "w": 1, "x": 9.25, "y": 3 },
106 {"x": 0, "y": 1, "w": 1.5}, 106 { "label": "k82", "matrix": [8, 2], "w": 1, "x": 10.25, "y": 3 },
107 {"x": 1.5, "y": 1}, 107 { "label": "k83", "matrix": [8, 3], "w": 1, "x": 11.25, "y": 3 },
108 {"x": 2.5, "y": 1}, 108 { "label": "k85", "matrix": [8, 5], "w": 2.25, "x": 12.25, "y": 3 },
109 {"x": 3.5, "y": 1}, 109 { "label": "k86", "matrix": [8, 6], "w": 1, "x": 14.5, "y": 3 },
110 {"x": 4.5, "y": 1}, 110 { "label": "k40", "matrix": [4, 0], "w": 1.25, "x": 0, "y": 4 },
111 {"x": 5.5, "y": 1}, 111 { "label": "k41", "matrix": [4, 1], "w": 1.25, "x": 1.25, "y": 4 },
112 {"x": 6.5, "y": 1}, 112 { "label": "k42", "matrix": [4, 2], "w": 1.25, "x": 2.5, "y": 4 },
113 {"x": 7.5, "y": 1}, 113 { "label": "k46", "matrix": [4, 6], "w": 6.25, "x": 3.75, "y": 4 },
114 {"x": 8.5, "y": 1}, 114 { "label": "k92", "matrix": [9, 2], "w": 1.25, "x": 10, "y": 4 },
115 {"x": 9.5, "y": 1}, 115 { "label": "k93", "matrix": [9, 3], "w": 1, "x": 11.25, "y": 4 },
116 {"x": 10.5, "y": 1}, 116 { "label": "k94", "matrix": [9, 4], "w": 1.25, "x": 12.25, "y": 4 },
117 {"x": 11.5, "y": 1}, 117 { "label": "k95", "matrix": [9, 5], "w": 1, "x": 13.5, "y": 4 },
118 {"x": 12.5, "y": 1}, 118 { "label": "k96", "matrix": [9, 6], "w": 1, "x": 14.5, "y": 4 },
119 {"x": 13.5, "y": 1, "w": 1.5}, 119 { "label": "k97", "matrix": [9, 7], "w": 1, "x": 15.5, "y": 4 }
120 120 ]
121 {"x": 15.5, "y": 1}, 121 },
122 122 "LAYOUT_all": {
123 {"x": 0, "y": 2, "w": 1.75}, 123 "key_count": 70,
124 {"x": 1.75, "y": 2}, 124 "layout": [
125 {"x": 2.75, "y": 2}, 125 { "label": "k00", "matrix": [0, 0], "w": 1, "x": 0, "y": 0 },
126 {"x": 3.75, "y": 2}, 126 { "label": "k01", "matrix": [0, 1], "w": 1, "x": 1, "y": 0 },
127 {"x": 4.75, "y": 2}, 127 { "label": "k02", "matrix": [0, 2], "w": 1, "x": 2, "y": 0 },
128 {"x": 5.75, "y": 2}, 128 { "label": "k03", "matrix": [0, 3], "w": 1, "x": 3, "y": 0 },
129 {"x": 6.75, "y": 2}, 129 { "label": "k04", "matrix": [0, 4], "w": 1, "x": 4, "y": 0 },
130 {"x": 7.75, "y": 2}, 130 { "label": "k05", "matrix": [0, 5], "w": 1, "x": 5, "y": 0 },
131 {"x": 8.75, "y": 2}, 131 { "label": "k06", "matrix": [0, 6], "w": 1, "x": 6, "y": 0 },
132 {"x": 9.75, "y": 2}, 132 { "label": "k07", "matrix": [0, 7], "w": 1, "x": 7, "y": 0 },
133 {"x": 10.75, "y": 2}, 133 { "label": "k50", "matrix": [5, 0], "w": 1, "x": 8, "y": 0 },
134 {"x": 11.75, "y": 2}, 134 { "label": "k51", "matrix": [5, 1], "w": 1, "x": 9, "y": 0 },
135 {"x": 12.75, "y": 2, "w": 2.25}, 135 { "label": "k52", "matrix": [5, 2], "w": 1, "x": 10, "y": 0 },
136 136 { "label": "k53", "matrix": [5, 3], "w": 1, "x": 11, "y": 0 },
137 {"x": 0, "y": 3, "w": 2.25}, 137 { "label": "k54", "matrix": [5, 4], "w": 1, "x": 12, "y": 0 },
138 {"x": 2.25, "y": 3}, 138 { "label": "k56", "matrix": [5, 6], "w": 2, "x": 13, "y": 0 },
139 {"x": 3.25, "y": 3}, 139 { "label": "k57", "matrix": [5, 7], "w": 1, "x": 15.5, "y": 0 },
140 {"x": 4.25, "y": 3}, 140 { "label": "k10", "matrix": [1, 0], "w": 1.5, "x": 0, "y": 1 },
141 {"x": 5.25, "y": 3}, 141 { "label": "k11", "matrix": [1, 1], "w": 1, "x": 1.5, "y": 1 },
142 {"x": 6.25, "y": 3}, 142 { "label": "k12", "matrix": [1, 2], "w": 1, "x": 2.5, "y": 1 },
143 {"x": 7.25, "y": 3}, 143 { "label": "k13", "matrix": [1, 3], "w": 1, "x": 3.5, "y": 1 },
144 {"x": 8.25, "y": 3}, 144 { "label": "k14", "matrix": [1, 4], "w": 1, "x": 4.5, "y": 1 },
145 {"x": 9.25, "y": 3}, 145 { "label": "k15", "matrix": [1, 5], "w": 1, "x": 5.5, "y": 1 },
146 {"x": 10.25, "y": 3}, 146 { "label": "k16", "matrix": [1, 6], "w": 1, "x": 6.5, "y": 1 },
147 {"x": 11.25, "y": 3}, 147 { "label": "k17", "matrix": [1, 7], "w": 1, "x": 7.5, "y": 1 },
148 {"x": 12.25, "y": 3, "w": 2.25}, 148 { "label": "k60", "matrix": [6, 0], "w": 1, "x": 8.5, "y": 1 },
149 149 { "label": "k61", "matrix": [6, 1], "w": 1, "x": 9.5, "y": 1 },
150 {"x": 14.5, "y": 3}, 150 { "label": "k62", "matrix": [6, 2], "w": 1, "x": 10.5, "y": 1 },
151 151 { "label": "k63", "matrix": [6, 3], "w": 1, "x": 11.5, "y": 1 },
152 {"x": 0, "y": 4, "w": 1.25}, 152 { "label": "k64", "matrix": [6, 4], "w": 1, "x": 12.5, "y": 1 },
153 {"x": 1.25, "y": 4, "w": 1.25}, 153 { "label": "k65", "matrix": [6, 5], "w": 1.5, "x": 13.5, "y": 1 },
154 {"x": 2.5, "y": 4, "w": 1.25}, 154 { "label": "k67", "matrix": [6, 7], "w": 1, "x": 15.5, "y": 1 },
155 {"x": 3.75, "y": 4, "w": 2.75}, 155 { "label": "k20", "matrix": [2, 0], "w": 1.75, "x": 0, "y": 2 },
156 {"x": 6.5, "y": 4, "w": 2.25}, 156 { "label": "k21", "matrix": [2, 1], "w": 1, "x": 1.75, "y": 2 },
157 {"x": 8.75, "y": 4, "w": 1.25}, 157 { "label": "k22", "matrix": [2, 2], "w": 1, "x": 2.75, "y": 2 },
158 {"x": 10, "y": 4, "w": 1.25}, 158 { "label": "k23", "matrix": [2, 3], "w": 1, "x": 3.75, "y": 2 },
159 {"x": 11.25, "y": 4}, 159 { "label": "k24", "matrix": [2, 4], "w": 1, "x": 4.75, "y": 2 },
160 {"x": 12.25, "y": 4, "w": 1.25}, 160 { "label": "k25", "matrix": [2, 5], "w": 1, "x": 5.75, "y": 2 },
161 {"x": 13.5, "y": 4}, 161 { "label": "k26", "matrix": [2, 6], "w": 1, "x": 6.75, "y": 2 },
162 {"x": 14.5, "y": 4}, 162 { "label": "k27", "matrix": [2, 7], "w": 1, "x": 7.75, "y": 2 },
163 {"x": 15.5, "y": 4} 163 { "label": "k70", "matrix": [7, 0], "w": 1, "x": 8.75, "y": 2 },
164 ] 164 { "label": "k71", "matrix": [7, 1], "w": 1, "x": 9.75, "y": 2 },
165 }, 165 { "label": "k72", "matrix": [7, 2], "w": 1, "x": 10.75, "y": 2 },
166 "LAYOUT_66_ansi": { 166 { "label": "k73", "matrix": [7, 3], "w": 1, "x": 11.75, "y": 2 },
167 "layout": [ 167 { "label": "k75", "matrix": [7, 5], "w": 2.25, "x": 12.75, "y": 2 },
168 {"x": 0, "y": 0}, 168 { "label": "k30", "matrix": [3, 0], "w": 1.25, "x": 0, "y": 3 },
169 {"x": 1, "y": 0}, 169 { "label": "k31", "matrix": [3, 1], "w": 1, "x": 1.25, "y": 3 },
170 {"x": 2, "y": 0}, 170 { "label": "k32", "matrix": [3, 2], "w": 1, "x": 2.25, "y": 3 },
171 {"x": 3, "y": 0}, 171 { "label": "k33", "matrix": [3, 3], "w": 1, "x": 3.25, "y": 3 },
172 {"x": 4, "y": 0}, 172 { "label": "k34", "matrix": [3, 4], "w": 1, "x": 4.25, "y": 3 },
173 {"x": 5, "y": 0}, 173 { "label": "k35", "matrix": [3, 5], "w": 1, "x": 5.25, "y": 3 },
174 {"x": 6, "y": 0}, 174 { "label": "k36", "matrix": [3, 6], "w": 1, "x": 6.25, "y": 3 },
175 {"x": 7, "y": 0}, 175 { "label": "k37", "matrix": [3, 7], "w": 1, "x": 7.25, "y": 3 },
176 {"x": 8, "y": 0}, 176 { "label": "k80", "matrix": [8, 0], "w": 1, "x": 8.25, "y": 3 },
177 {"x": 9, "y": 0}, 177 { "label": "k81", "matrix": [8, 1], "w": 1, "x": 9.25, "y": 3 },
178 {"x": 10, "y": 0}, 178 { "label": "k82", "matrix": [8, 2], "w": 1, "x": 10.25, "y": 3 },
179 {"x": 11, "y": 0}, 179 { "label": "k83", "matrix": [8, 3], "w": 1, "x": 11.25, "y": 3 },
180 {"x": 12, "y": 0}, 180 { "label": "k84", "matrix": [8, 4], "w": 1, "x": 12.25, "y": 3 },
181 {"x": 13, "y": 0, "w": 2}, 181 { "label": "k85", "matrix": [8, 5], "w": 1.25, "x": 13.25, "y": 3 },
182 182 { "label": "k86", "matrix": [8, 6], "w": 1, "x": 14.5, "y": 3 },
183 {"x": 15.5, "y": 0}, 183 { "label": "k40", "matrix": [4, 0], "w": 1.25, "x": 0, "y": 4 },
184 184 { "label": "k41", "matrix": [4, 1], "w": 1.25, "x": 1.25, "y": 4 },
185 {"x": 0, "y": 1, "w": 1.5}, 185 { "label": "k42", "matrix": [4, 2], "w": 1.25, "x": 2.5, "y": 4 },
186 {"x": 1.5, "y": 1}, 186 { "label": "k45", "matrix": [4, 5], "w": 2.75, "x": 3.75, "y": 4 },
187 {"x": 2.5, "y": 1}, 187 { "label": "k46", "matrix": [4, 6], "w": 2.25, "x": 6.5, "y": 4 },
188 {"x": 3.5, "y": 1}, 188 { "label": "k90", "matrix": [9, 0], "w": 1.25, "x": 8.75, "y": 4 },
189 {"x": 4.5, "y": 1}, 189 { "label": "k92", "matrix": [9, 2], "w": 1.25, "x": 10, "y": 4 },
190 {"x": 5.5, "y": 1}, 190 { "label": "k93", "matrix": [9, 3], "w": 1, "x": 11.25, "y": 4 },
191 {"x": 6.5, "y": 1}, 191 { "label": "k94", "matrix": [9, 4], "w": 1.25, "x": 12.25, "y": 4 },
192 {"x": 7.5, "y": 1}, 192 { "label": "k95", "matrix": [9, 5], "w": 1, "x": 13.5, "y": 4 },
193 {"x": 8.5, "y": 1}, 193 { "label": "k96", "matrix": [9, 6], "w": 1, "x": 14.5, "y": 4 },
194 {"x": 9.5, "y": 1}, 194 { "label": "k97", "matrix": [9, 7], "w": 1, "x": 15.5, "y": 4 }
195 {"x": 10.5, "y": 1}, 195 ]
196 {"x": 11.5, "y": 1},
197 {"x": 12.5, "y": 1},
198 {"x": 13.5, "y": 1, "w": 1.5},
199
200 {"x": 15.5, "y": 1},
201
202 {"x": 0, "y": 2, "w": 1.75},
203 {"x": 1.75, "y": 2},
204 {"x": 2.75, "y": 2},
205 {"x": 3.75, "y": 2},
206 {"x": 4.75, "y": 2},
207 {"x": 5.75, "y": 2},
208 {"x": 6.75, "y": 2},
209 {"x": 7.75, "y": 2},
210 {"x": 8.75, "y": 2},
211 {"x": 9.75, "y": 2},
212 {"x": 10.75, "y": 2},
213 {"x": 11.75, "y": 2},
214 {"x": 12.75, "y": 2, "w": 2.25},
215
216 {"x": 0, "y": 3, "w": 2.25},
217 {"x": 2.25, "y": 3},
218 {"x": 3.25, "y": 3},
219 {"x": 4.25, "y": 3},
220 {"x": 5.25, "y": 3},
221 {"x": 6.25, "y": 3},
222 {"x": 7.25, "y": 3},
223 {"x": 8.25, "y": 3},
224 {"x": 9.25, "y": 3},
225 {"x": 10.25, "y": 3},
226 {"x": 11.25, "y": 3},
227 {"x": 12.25, "y": 3, "w": 2.25},
228
229 {"x": 14.5, "y": 3},
230
231 {"x": 0, "y": 4, "w": 1.25},
232 {"x": 1.25, "y": 4, "w": 1.25},
233 {"x": 2.5, "y": 4, "w": 1.25},
234 {"x": 3.75, "y": 4, "w": 6.25},
235 {"x": 10, "y": 4, "w": 1.25},
236 {"x": 11.25, "y": 4},
237 {"x": 12.25, "y": 4, "w": 1.25},
238
239 {"x": 13.5, "y": 4},
240 {"x": 14.5, "y": 4},
241 {"x": 15.5, "y": 4}
242 ]
243 }
244 } 196 }
197 }
245} 198}
diff --git a/keyboards/clueboard/66_hotswap/prototype/prototype.h b/keyboards/clueboard/66_hotswap/prototype/prototype.h
index b1d483b40..1277cfbba 100644
--- a/keyboards/clueboard/66_hotswap/prototype/prototype.h
+++ b/keyboards/clueboard/66_hotswap/prototype/prototype.h
@@ -1,86 +1,3 @@
1#pragma once 1#pragma once
2#include "quantum.h" 2#include "quantum.h"
3 3
4/* Clueboard matrix layout
5 * ,-----------------------------------------------------------. ,---.
6 * | 00| 01| 02| 03| 04| 05| 06| 07| 50| 51| 52| 53| 54| 56 | | 57|
7 * |-----------------------------------------------------------| |---|
8 * | 10| 11| 12| 13| 14| 15| 16| 17| 60| 61| 62| 63| 64| 65| | 67|
9 * |-----------------------------------------------------------| `---'
10 * | 20| 21| 22| 23| 24| 25| 26| 27| 70| 71| 72| 73| 74| 75|
11 * |------------------------------------------------------------.
12 * | 30| 31| 32| 33| 34| 35| 36| 37| 80| 81| 82| 83| 84| 85|86|
13 * |------------------------------------------------------------------.
14 * | 40| 41| 42| 43| 45| 46| 90| 92| 93| 94| 95| 96| 97|
15 * `------------------------------------------------------------------'
16 * ,-----------------------------------------------------------. ,---.
17 * | `| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Backsp | |Ins|
18 * |-----------------------------------------------------------| |---|
19 * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \| |Del|
20 * |-----------------------------------------------------------| `---'
21 * |Caps | A| S| D| F| G| H| J| k| L| ;| '|Enter |
22 * |--------------------------------------------------------------.
23 * |Shift| \| Z| X| C| V| B| N| M| ,| .| /| \|Shift| Up|
24 * |------------------------------------------------------------------.
25 * |Ctrl|Alt|Gui | Space| Space|Gui |Alt |Fn |Ctrl|Left|Down|Rgt|
26 * `------------------------------------------------------------------'
27 */
28// The first section contains all of the arguments
29// The second converts the arguments into a two-dimensional array
30
31#define LAYOUT_all( \
32 k00, k01, k02, k03, k04, k05, k06, k07, k50, k51, k52, k53, k54, k56, k57, \
33 k10, k11, k12, k13, k14, k15, k16, k17, k60, k61, k62, k63, k64, k65, k67, \
34 k20, k21, k22, k23, k24, k25, k26, k27, k70, k71, k72, k73, k75, \
35 k30, k31, k32, k33, k34, k35, k36, k37, k80, k81, k82, k83, k84, k85, k86, \
36 k40, k41, k42, k45, k46, k90, k92, k93, k94, k95, k96, k97 \
37) { \
38 { k00, k01, k02, k03, k04, k05, k06, k07 }, \
39 { k10, k11, k12, k13, k14, k15, k16, k17 }, \
40 { k20, k21, k22, k23, k24, k25, k26, k27 }, \
41 { k30, k31, k32, k33, k34, k35, k36, k37 }, \
42 { k40, k41, k42, KC_NO, KC_NO, k45, k46, KC_NO }, \
43 { k50, k51, k52, k53, k54, KC_NO, k56, k57 }, \
44 { k60, k61, k62, k63, k64, k65, KC_NO, k67 }, \
45 { k70, k71, k72, k73, KC_NO, k75, KC_NO, KC_NO }, \
46 { k80, k81, k82, k83, k84, k85, k86, KC_NO }, \
47 { k90, KC_NO, k92, k93, k94, k95, k96, k97 } \
48}
49
50#define LAYOUT( \
51 k00, k01, k02, k03, k04, k05, k06, k07, k50, k51, k52, k53, k54, k56, k57, \
52 k10, k11, k12, k13, k14, k15, k16, k17, k60, k61, k62, k63, k64, k65, k67, \
53 k20, k21, k22, k23, k24, k25, k26, k27, k70, k71, k72, k73, k75, \
54 k30, k32, k33, k34, k35, k36, k37, k80, k81, k82, k83, k85, k86, \
55 k40, k41, k42, k45, k46, k90, k92, k93, k94, k95, k96, k97 \
56) { \
57 { k00, k01, k02, k03, k04, k05, k06, k07 }, \
58 { k10, k11, k12, k13, k14, k15, k16, k17 }, \
59 { k20, k21, k22, k23, k24, k25, k26, k27 }, \
60 { k30, KC_NO, k32, k33, k34, k35, k36, k37 }, \
61 { k40, k41, k42, KC_NO, KC_NO, k45, k46, KC_NO }, \
62 { k50, k51, k52, k53, k54, KC_NO, k56, k57 }, \
63 { k60, k61, k62, k63, k64, k65, KC_NO, k67 }, \
64 { k70, k71, k72, k73, KC_NO, k75, KC_NO, KC_NO }, \
65 { k80, k81, k82, k83, KC_NO, k85, k86, KC_NO }, \
66 { k90, KC_NO, k92, k93, k94, k95, k96, k97 } \
67}
68
69#define LAYOUT_66_ansi( \
70 k00, k01, k02, k03, k04, k05, k06, k07, k50, k51, k52, k53, k54, k56, k57, \
71 k10, k11, k12, k13, k14, k15, k16, k17, k60, k61, k62, k63, k64, k65, k67, \
72 k20, k21, k22, k23, k24, k25, k26, k27, k70, k71, k72, k73, k75, \
73 k30, k32, k33, k34, k35, k36, k37, k80, k81, k82, k83, k85, k86, \
74 k40, k41, k42, k46, k92, k93, k94, k95, k96, k97 \
75) { \
76 { k00, k01, k02, k03, k04, k05, k06, k07 }, \
77 { k10, k11, k12, k13, k14, k15, k16, k17 }, \
78 { k20, k21, k22, k23, k24, k25, k26, k27 }, \
79 { k30, KC_NO, k32, k33, k34, k35, k36, k37 }, \
80 { k40, k41, k42, KC_NO, KC_NO, KC_NO, k46, KC_NO }, \
81 { k50, k51, k52, k53, k54, KC_NO, k56, k57 }, \
82 { k60, k61, k62, k63, k64, k65, KC_NO, k67 }, \
83 { k70, k71, k72, k73, KC_NO, k75, KC_NO, KC_NO }, \
84 { k80, k81, k82, k83, KC_NO, k85, k86, KC_NO }, \
85 { KC_NO, KC_NO, k92, k93, k94, k95, k96, k97 } \
86}
diff --git a/keyboards/clueboard/66_hotswap/prototype/readme.md b/keyboards/clueboard/66_hotswap/prototype/readme.md
new file mode 100644
index 000000000..5c76a5714
--- /dev/null
+++ b/keyboards/clueboard/66_hotswap/prototype/readme.md
@@ -0,0 +1,16 @@
1# Clueboard 66% HotSwap
2
3![Clueboard](https://i.imgur.com/8UmBoNx.jpg)
4
5A fully customizable 66% keyboard with Hot Swap sockets.
6
7* Keyboard Maintainer: [Zach White](https://github.com/skullydazed)
8* Hardware Supported: Clueboard 66% HotSwap Prototype PCB
9 * 2.8 (prototype)
10* Hardware Availability: [clueboard.co](https://clueboard.co/)
11
12Make example for this keyboard (after setting up your build environment):
13
14 make clueboard/66_hotswap/prototype:default
15
16See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
diff --git a/keyboards/clueboard/66_hotswap/prototype/rules.mk b/keyboards/clueboard/66_hotswap/prototype/rules.mk
index 7f5afcf73..63dd64f7c 100644
--- a/keyboards/clueboard/66_hotswap/prototype/rules.mk
+++ b/keyboards/clueboard/66_hotswap/prototype/rules.mk
@@ -14,19 +14,6 @@ BOOTLOADER = atmel-dfu
14# Build Options 14# Build Options
15# comment out to disable the options. 15# comment out to disable the options.
16# 16#
17BACKLIGHT_ENABLE = yes
18BACKLIGHT_DRIVER = custom 17BACKLIGHT_DRIVER = custom
19BOOTMAGIC_ENABLE = no
20MOUSEKEY_ENABLE = no
21EXTRAKEY_ENABLE = yes
22CONSOLE_ENABLE = yes
23COMMAND_ENABLE = no
24NKRO_ENABLE = yes
25AUDIO_ENABLE = yes
26RGBLIGHT_ENABLE = yes
27MIDI_ENABLE = no
28UNICODE_ENABLE = no
29BLUETOOTH_ENABLE = no
30 18
31EXTRAFLAGS += -flto 19EXTRAFLAGS += -flto
32LAYOUTS = 66_ansi
diff --git a/keyboards/clueboard/california/california.h b/keyboards/clueboard/california/california.h
index 853b360e2..ef5b3f3e0 100644
--- a/keyboards/clueboard/california/california.h
+++ b/keyboards/clueboard/california/california.h
@@ -1,21 +1,3 @@
1#pragma once 1#pragma once
2 2
3#include "quantum.h" 3#include "quantum.h"
4
5// Any changes to the layout names and/or definitions must also be made to info.json
6
7#define LAYOUT( \
8 K00, K01, \
9 K10, K11, \
10 K21, \
11 K30, K31, \
12 K40, K41, \
13 K51 \
14) { \
15 { K00, K01 }, \
16 { K10, K11 }, \
17 { KC_NO, K21 }, \
18 { K30, K31 }, \
19 { K40, K41 }, \
20 { KC_NO, K51 } \
21}
diff --git a/keyboards/clueboard/california/config.h b/keyboards/clueboard/california/config.h
index b1426cea4..b8c5759db 100644
--- a/keyboards/clueboard/california/config.h
+++ b/keyboards/clueboard/california/config.h
@@ -1,24 +1,3 @@
1#pragma once 1#pragma once
2 2
3#include "config_common.h" 3#include "config_common.h"
4
5/* USB Device descriptor parameter */
6#define VENDOR_ID 0xC1ED
7#define PRODUCT_ID 0x23B0
8#define DEVICE_VER 0x0001
9#define MANUFACTURER Clueboard
10#define PRODUCT California Macropad
11#define DESCRIPTION A 10-key macropad shaped like California
12
13/* key matrix pins */
14#define MATRIX_ROWS 6
15#define MATRIX_COLS 2
16#define DIRECT_PINS { \
17 { A10, A9 }, \
18 { A0, B8 }, \
19 { NO_PIN, B11 }, \
20 { B9, A8 }, \
21 { A7, B1 }, \
22 { NO_PIN, B2 } \
23}
24#define UNUSED_PINS
diff --git a/keyboards/clueboard/california/info.json b/keyboards/clueboard/california/info.json
index 2a9ced6e9..f376643cd 100644
--- a/keyboards/clueboard/california/info.json
+++ b/keyboards/clueboard/california/info.json
@@ -2,9 +2,31 @@
2 "keyboard_name": "Clueboard California", 2 "keyboard_name": "Clueboard California",
3 "url": "", 3 "url": "",
4 "maintainer": "skullydazed", 4 "maintainer": "skullydazed",
5 "matrix_pins": {
6 "direct": [
7 ["A10", "A9"],
8 ["A0", "B8"],
9 [null, "B11"],
10 ["B9", "A8"],
11 ["A7", "B1"],
12 [null, "B2"]
13 ]
14 },
15 "usb": {"pid": "0x23B0"},
5 "layouts": { 16 "layouts": {
6 "LAYOUT": { 17 "LAYOUT": {
7 "layout": [{"x":0, "y":0}, {"x":1, "y":0}, {"x":0, "y":1}, {"x":1, "y":1}, {"x":1, "y":2}, {"x":1.25, "y":3}, {"x":2.25, "y":3}, {"x":2, "y":4}, {"x":3, "y":4}, {"x":3.75, "y":5}] 18 "layout": [
19 {"x": 0, "y": 0, "w": 1, "matrix": [0, 0]},
20 {"x": 1, "y": 0, "w": 1, "matrix": [0, 1]},
21 {"x": 0, "y": 1, "w": 1, "matrix": [1, 0]},
22 {"x": 1, "y": 1, "w": 1, "matrix": [1, 1]},
23 {"x": 1, "y": 2, "w": 1, "matrix": [2, 1]},
24 {"x": 1.25, "y": 3, "w": 1, "matrix": [3, 0]},
25 {"x": 2.25, "y": 3, "w": 1, "matrix": [3, 1]},
26 {"x": 2, "y": 4, "w": 1, "matrix": [4, 0]},
27 {"x": 3, "y": 4, "w": 1, "matrix": [4, 1]},
28 {"x": 3.75, "y": 5, "w": 1, "matrix": [5, 1]}
29 ]
8 } 30 }
9 } 31 }
10} 32}
diff --git a/keyboards/clueboard/california/keymaps/default/readme.md b/keyboards/clueboard/california/keymaps/default/readme.md
new file mode 100644
index 000000000..f79b015f7
--- /dev/null
+++ b/keyboards/clueboard/california/keymaps/default/readme.md
@@ -0,0 +1 @@
Default keymap for the Clueboard California Macropad.
diff --git a/keyboards/clueboard/card/card.h b/keyboards/clueboard/card/card.h
index a09285eb0..ef5b3f3e0 100644
--- a/keyboards/clueboard/card/card.h
+++ b/keyboards/clueboard/card/card.h
@@ -1,19 +1,3 @@
1#pragma once 1#pragma once
2 2
3#include "quantum.h" 3#include "quantum.h"
4
5// This a shortcut to help you visually see your layout.
6// The first section contains all of the arguements
7// The second converts the arguments into a two-dimensional array
8#define LAYOUT( \
9 k00, k01, k02, \
10 k10, k12, \
11 k20, k21, k22, \
12 k11, \
13 k30, k31, k32 \
14) { \
15 { k00, k01, k02, }, \
16 { k10, k11, k12, }, \
17 { k20, k21, k22, }, \
18 { k30, k31, k32, } \
19}
diff --git a/keyboards/clueboard/card/config.h b/keyboards/clueboard/card/config.h
index b69ae640e..67ddb5e25 100644
--- a/keyboards/clueboard/card/config.h
+++ b/keyboards/clueboard/card/config.h
@@ -19,137 +19,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
19 19
20#include "config_common.h" 20#include "config_common.h"
21 21
22/* USB Device descriptor parameter */
23#define VENDOR_ID 0xC1ED
24#define PRODUCT_ID 0x2330
25#define DEVICE_VER 0x0001
26#define MANUFACTURER Clueboard
27#define PRODUCT ATMEGA32U4 Firmware Dev Kit
28#define DESCRIPTION A small board to help you hack on QMK.
29
30/* key matrix size */
31#define MATRIX_ROWS 4
32#define MATRIX_COLS 3
33
34/* Keyboard Matrix Assignments
35*/
36#define MATRIX_ROW_PINS { F0, F5, F4, B4 }
37#define MATRIX_COL_PINS { F1, F7, F6 }
38#define UNUSED_PINS
39
40/* COL2ROW or ROW2COL */
41#define DIODE_DIRECTION ROW2COL
42
43/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */
44#define DEBOUNCE 20
45
46/* define if matrix has ghost (lacks anti-ghosting diodes) */
47//#define MATRIX_HAS_GHOST
48
49/* number of backlight levels */ 22/* number of backlight levels */
50#define BACKLIGHT_LEVELS 6 23#define BACKLIGHT_LEVELS 6
51 24
52/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
53//#define LOCKING_SUPPORT_ENABLE
54/* Locking resynchronize hack */
55//#define LOCKING_RESYNC_ENABLE
56
57/*
58 * Force NKRO
59 *
60 * Force NKRO (nKey Rollover) to be enabled by default, regardless of the saved
61 * state in the bootmagic EEPROM settings. (Note that NKRO must be enabled in the
62 * makefile for this to work.)
63 *
64 * If forced on, NKRO can be disabled via magic key (default = LShift+RShift+N)
65 * until the next keyboard reset.
66 *
67 * NKRO may prevent your keystrokes from being detected in the BIOS, but it is
68 * fully operational during normal computer usage.
69 *
70 * For a less heavy-handed approach, enable NKRO via magic key (LShift+RShift+N)
71 * or via bootmagic (hold SPACE+N while plugging in the keyboard). Once set by
72 * bootmagic, NKRO mode will always be enabled until it is toggled again during a
73 * power-up.
74 *
75 */
76//#define FORCE_NKRO
77
78/*
79 * Magic Key Options
80 *
81 * Magic keys are hotkey commands that allow control over firmware functions of
82 * the keyboard. They are best used in combination with the HID Listen program,
83 * found here: https://www.pjrc.com/teensy/hid_listen.html
84 *
85 * The options below allow the magic key functionality to be changed. This is
86 * useful if your keyboard/keypad is missing keys and you want magic key support.
87 *
88 */
89
90/* control how magic key switches layers */
91//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS true
92//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS true
93//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM false
94
95/* override magic key keymap */
96//#define MAGIC_KEY_SWITCH_LAYER_WITH_FKEYS
97//#define MAGIC_KEY_SWITCH_LAYER_WITH_NKEYS
98//#define MAGIC_KEY_SWITCH_LAYER_WITH_CUSTOM
99//#define MAGIC_KEY_HELP1 H
100//#define MAGIC_KEY_HELP2 SLASH
101//#define MAGIC_KEY_DEBUG D
102//#define MAGIC_KEY_DEBUG_MATRIX X
103//#define MAGIC_KEY_DEBUG_KBD K
104//#define MAGIC_KEY_DEBUG_MOUSE M
105//#define MAGIC_KEY_VERSION V
106//#define MAGIC_KEY_STATUS S
107//#define MAGIC_KEY_CONSOLE C
108//#define MAGIC_KEY_LAYER0_ALT1 ESC
109//#define MAGIC_KEY_LAYER0_ALT2 GRAVE
110//#define MAGIC_KEY_LAYER0 0
111//#define MAGIC_KEY_LAYER1 1
112//#define MAGIC_KEY_LAYER2 2
113//#define MAGIC_KEY_LAYER3 3
114//#define MAGIC_KEY_LAYER4 4
115//#define MAGIC_KEY_LAYER5 5
116//#define MAGIC_KEY_LAYER6 6
117//#define MAGIC_KEY_LAYER7 7
118//#define MAGIC_KEY_LAYER8 8
119//#define MAGIC_KEY_LAYER9 9
120//#define MAGIC_KEY_BOOTLOADER PAUSE
121//#define MAGIC_KEY_LOCK CAPS
122//#define MAGIC_KEY_EEPROM E
123//#define MAGIC_KEY_NKRO N
124//#define MAGIC_KEY_SLEEP_LED Z
125
126/* Underlight configuration
127 */
128#define RGB_DI_PIN E6
129//#define RGBLIGHT_ANIMATIONS
130#define RGBLED_NUM 4 // Number of LEDs
131#define RGBLIGHT_HUE_STEP 10
132#define RGBLIGHT_SAT_STEP 17
133#define RGBLIGHT_VAL_STEP 17
134
135/*
136 * Feature disable options
137 * These options are also useful to firmware size reduction.
138 */
139
140/* disable debug print */
141//#define NO_DEBUG
142
143/* disable print */
144//#define NO_PRINT
145
146/* disable action features */
147//#define NO_ACTION_LAYER
148//#define NO_ACTION_TAPPING
149//#define NO_ACTION_ONESHOT
150//#define NO_ACTION_MACRO
151//#define NO_ACTION_FUNCTION
152
153
154// Enable audio 25// Enable audio
155#define C6_AUDIO 26#define C6_AUDIO
diff --git a/keyboards/clueboard/card/info.json b/keyboards/clueboard/card/info.json
index 8dfa03599..e46237175 100644
--- a/keyboards/clueboard/card/info.json
+++ b/keyboards/clueboard/card/info.json
@@ -1,19 +1,61 @@
1{ 1{
2 "manufacturer": "Clueboard",
2 "keyboard_name": "Cluecard", 3 "keyboard_name": "Cluecard",
3 "keyboard_folder": "clueboard/card",
4 "url": "",
5 "maintainer": "skullydazed", 4 "maintainer": "skullydazed",
6 "width": 10,
7 "height": 8, 5 "height": 8,
6 "width": 10,
7 "debounce": "20",
8 "diode_direction": "ROW2COL",
9 "features": {
10 "audio": true,
11 "backlight": true,
12 "bluetooth": false,
13 "bootmagic": false,
14 "command": true,
15 "console": true,
16 "extrakey": true,
17 "lto": true,
18 "midi": false,
19 "mousekey": true,
20 "nkro": false,
21 "rgblight": true,
22 "unicode": false
23 },
24 "matrix_pins": {
25 "cols": ["F1", " F7", " F6"],
26 "rows": ["F0", " F5", " F4", " B4"]
27 },
28 "rgblight": {
29 "brightness_steps": "17",
30 "hue_steps": "10",
31 "led_count": "4",
32 "pin": "E6",
33 "saturation_steps": "17"
34 },
35 "usb": {
36 "device_ver": "0x0001",
37 "pid": "0x2330",
38 "vid": "0xC1ED"
39 },
40 "layout_aliases": {
41 "LAYOUT": "LAYOUT_all"
42 },
8 "layouts": { 43 "layouts": {
9 "LAYOUT": { 44 "LAYOUT_all": {
45 "key_count": 12,
10 "layout": [ 46 "layout": [
11 {"label":"ON/OFF", "x":0, "y":0}, {"label":"SAT+", "x":4, "y":0}, {"label":"BRIGHT+", "x":8, "y":0}, 47 { "label": "ON/OFF", "matrix": [0, 0], "w": 1, "x": 0, "y": 0 },
12 {"label":"HUE-", "x":2, "y":1}, {"label":"HUE+", "x":6, "y":1}, 48 { "label": "SAT+", "matrix": [0, 1], "w": 1, "x": 4, "y": 0 },
13 {"label":"MODE", "x":0, "y":2}, {"label":"SAT-", "x":4, "y":2}, {"label":"BRIGHT-", "x":8, "y":2}, 49 { "label": "BRIGHT+", "matrix": [0, 2], "w": 1, "x": 8, "y": 0 },
14 {"label":"LAYER", "x":2, "y":4}, 50 { "label": "HUE-", "matrix": [1, 0], "w": 1, "x": 2, "y": 1 },
15 51 { "label": "HUE+", "matrix": [1, 2], "w": 1, "x": 6, "y": 1 },
16 {"label":"MX1", "x":4, "y":6, "w":2, "h":2}, {"label":"MX2", "x":6, "y":6, "w":2, "h":2}, {"label":"MX3", "x":8, "y":6, "w":2, "h":2} 52 { "label": "MODE", "matrix": [2, 0], "w": 1, "x": 0, "y": 2 },
53 { "label": "SAT-", "matrix": [2, 1], "w": 1, "x": 4, "y": 2 },
54 { "label": "BRIGHT-", "matrix": [2, 2], "w": 1, "x": 8, "y": 2 },
55 { "label": "LAYER", "matrix": [1, 1], "w": 1, "x": 2, "y": 4 },
56 { "h": 2, "label": "MX1", "matrix": [3, 0], "w": 2, "x": 4, "y": 6 },
57 { "h": 2, "label": "MX2", "matrix": [3, 1], "w": 2, "x": 6, "y": 6 },
58 { "h": 2, "label": "MX3", "matrix": [3, 2], "w": 2, "x": 8, "y": 6 }
17 ] 59 ]
18 } 60 }
19 } 61 }
diff --git a/keyboards/clueboard/card/rules.mk b/keyboards/clueboard/card/rules.mk
index a1b003f29..75fb718e3 100644
--- a/keyboards/clueboard/card/rules.mk
+++ b/keyboards/clueboard/card/rules.mk
@@ -12,18 +12,4 @@ MCU = atmega32u4
12BOOTLOADER = atmel-dfu 12BOOTLOADER = atmel-dfu
13 13
14# Build Options 14# Build Options
15BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration
16MOUSEKEY_ENABLE = yes # Mouse keys
17EXTRAKEY_ENABLE = yes # Audio control and System control
18CONSOLE_ENABLE = yes # Console for debug
19COMMAND_ENABLE = yes # Commands for debug and configuration
20NKRO_ENABLE = no # USB Nkey Rollover
21RGBLIGHT_ENABLE = yes # Enable keyboard underlight functionality
22BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality
23BACKLIGHT_DRIVER = custom 15BACKLIGHT_DRIVER = custom
24MIDI_ENABLE = no # MIDI controls
25UNICODE_ENABLE = no # Unicode
26BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID
27AUDIO_ENABLE = yes # Audio output on port C6
28
29LTO_ENABLE = yes
diff --git a/keyboards/clueboard/info.json b/keyboards/clueboard/info.json
index 52cee1ccb..47514f280 100644
--- a/keyboards/clueboard/info.json
+++ b/keyboards/clueboard/info.json
@@ -1,4 +1,8 @@
1{ 1{
2 "manufacturer": "Clueboard", 2 "manufacturer": "Clueboard",
3 "maintainer": "skullydazed" 3 "maintainer": "skullydazed",
4 "usb": {
5 "device_ver": "0x0001",
6 "vid": "0xC1ED"
7 }
4} 8}
diff --git a/lib/python/qmk/cli/c2json.py b/lib/python/qmk/cli/c2json.py
index 2b3bb774f..8f9d8dc38 100644
--- a/lib/python/qmk/cli/c2json.py
+++ b/lib/python/qmk/cli/c2json.py
@@ -6,6 +6,7 @@ from milc import cli
6 6
7import qmk.keymap 7import qmk.keymap
8import qmk.path 8import qmk.path
9from qmk.info_json_encoder import InfoJSONEncoder
9 10
10 11
11@cli.argument('--no-cpp', arg_only=True, action='store_false', help='Do not use \'cpp\' on keymap.c') 12@cli.argument('--no-cpp', arg_only=True, action='store_false', help='Do not use \'cpp\' on keymap.c')
@@ -47,7 +48,7 @@ def c2json(cli):
47 cli.args.output.parent.mkdir(parents=True, exist_ok=True) 48 cli.args.output.parent.mkdir(parents=True, exist_ok=True)
48 if cli.args.output.exists(): 49 if cli.args.output.exists():
49 cli.args.output.replace(cli.args.output.name + '.bak') 50 cli.args.output.replace(cli.args.output.name + '.bak')
50 cli.args.output.write_text(json.dumps(keymap_json)) 51 cli.args.output.write_text(json.dumps(keymap_json, cls=InfoJSONEncoder))
51 52
52 if not cli.args.quiet: 53 if not cli.args.quiet:
53 cli.log.info('Wrote keymap to %s.', cli.args.output) 54 cli.log.info('Wrote keymap to %s.', cli.args.output)
diff --git a/lib/python/qmk/cli/chibios/confmigrate.py b/lib/python/qmk/cli/chibios/confmigrate.py
index eae294a0c..b9cfda961 100644
--- a/lib/python/qmk/cli/chibios/confmigrate.py
+++ b/lib/python/qmk/cli/chibios/confmigrate.py
@@ -13,7 +13,7 @@ def eprint(*args, **kwargs):
13 print(*args, file=sys.stderr, **kwargs) 13 print(*args, file=sys.stderr, **kwargs)
14 14
15 15
16fileHeader = """\ 16file_header = """\
17/* Copyright 2020 QMK 17/* Copyright 2020 QMK
18 * 18 *
19 * This program is free software: you can redistribute it and/or modify 19 * This program is free software: you can redistribute it and/or modify
@@ -77,7 +77,7 @@ def check_diffs(input_defs, reference_defs):
77 77
78 78
79def migrate_chconf_h(to_override, outfile): 79def migrate_chconf_h(to_override, outfile):
80 print(fileHeader.format(cli.args.input.relative_to(QMK_FIRMWARE), cli.args.reference.relative_to(QMK_FIRMWARE)), file=outfile) 80 print(file_header.format(cli.args.input.relative_to(QMK_FIRMWARE), cli.args.reference.relative_to(QMK_FIRMWARE)), file=outfile)
81 81
82 for override in to_override: 82 for override in to_override:
83 print("#define %s %s" % (override[0], override[1]), file=outfile) 83 print("#define %s %s" % (override[0], override[1]), file=outfile)
@@ -87,7 +87,7 @@ def migrate_chconf_h(to_override, outfile):
87 87
88 88
89def migrate_halconf_h(to_override, outfile): 89def migrate_halconf_h(to_override, outfile):
90 print(fileHeader.format(cli.args.input.relative_to(QMK_FIRMWARE), cli.args.reference.relative_to(QMK_FIRMWARE)), file=outfile) 90 print(file_header.format(cli.args.input.relative_to(QMK_FIRMWARE), cli.args.reference.relative_to(QMK_FIRMWARE)), file=outfile)
91 91
92 for override in to_override: 92 for override in to_override:
93 print("#define %s %s" % (override[0], override[1]), file=outfile) 93 print("#define %s %s" % (override[0], override[1]), file=outfile)
@@ -97,7 +97,7 @@ def migrate_halconf_h(to_override, outfile):
97 97
98 98
99def migrate_mcuconf_h(to_override, outfile): 99def migrate_mcuconf_h(to_override, outfile):
100 print(fileHeader.format(cli.args.input.relative_to(QMK_FIRMWARE), cli.args.reference.relative_to(QMK_FIRMWARE)), file=outfile) 100 print(file_header.format(cli.args.input.relative_to(QMK_FIRMWARE), cli.args.reference.relative_to(QMK_FIRMWARE)), file=outfile)
101 101
102 print("#include_next <mcuconf.h>\n", file=outfile) 102 print("#include_next <mcuconf.h>\n", file=outfile)
103 103
diff --git a/lib/python/qmk/cli/generate/__init__.py b/lib/python/qmk/cli/generate/__init__.py
index f9585bfb5..bd75b044c 100644
--- a/lib/python/qmk/cli/generate/__init__.py
+++ b/lib/python/qmk/cli/generate/__init__.py
@@ -1,3 +1,7 @@
1from . import api 1from . import api
2from . import config_h
2from . import docs 3from . import docs
4from . import info_json
5from . import layouts
3from . import rgb_breathe_table 6from . import rgb_breathe_table
7from . import rules_mk
diff --git a/lib/python/qmk/cli/generate/api.py b/lib/python/qmk/cli/generate/api.py
index 66db37cb5..6d111f244 100755
--- a/lib/python/qmk/cli/generate/api.py
+++ b/lib/python/qmk/cli/generate/api.py
@@ -8,6 +8,7 @@ from milc import cli
8 8
9from qmk.datetime import current_datetime 9from qmk.datetime import current_datetime
10from qmk.info import info_json 10from qmk.info import info_json
11from qmk.info_json_encoder import InfoJSONEncoder
11from qmk.keyboard import list_keyboards 12from qmk.keyboard import list_keyboards
12 13
13 14
@@ -44,15 +45,16 @@ def generate_api(cli):
44 if 'usb' in kb_all['keyboards'][keyboard_name]: 45 if 'usb' in kb_all['keyboards'][keyboard_name]:
45 usb = kb_all['keyboards'][keyboard_name]['usb'] 46 usb = kb_all['keyboards'][keyboard_name]['usb']
46 47
47 if usb['vid'] not in usb_list['devices']: 48 if 'vid' in usb and usb['vid'] not in usb_list['devices']:
48 usb_list['devices'][usb['vid']] = {} 49 usb_list['devices'][usb['vid']] = {}
49 50
50 if usb['pid'] not in usb_list['devices'][usb['vid']]: 51 if 'pid' in usb and usb['pid'] not in usb_list['devices'][usb['vid']]:
51 usb_list['devices'][usb['vid']][usb['pid']] = {} 52 usb_list['devices'][usb['vid']][usb['pid']] = {}
52 53
53 usb_list['devices'][usb['vid']][usb['pid']][keyboard_name] = usb 54 if 'vid' in usb and 'pid' in usb:
55 usb_list['devices'][usb['vid']][usb['pid']][keyboard_name] = usb
54 56
55 # Write the global JSON files 57 # Write the global JSON files
56 keyboard_list.write_text(json.dumps({'last_updated': current_datetime(), 'keyboards': sorted(kb_all['keyboards'])})) 58 keyboard_list.write_text(json.dumps({'last_updated': current_datetime(), 'keyboards': sorted(kb_all['keyboards'])}, cls=InfoJSONEncoder))
57 keyboard_all.write_text(json.dumps(kb_all)) 59 keyboard_all.write_text(json.dumps(kb_all, cls=InfoJSONEncoder))
58 usb_file.write_text(json.dumps(usb_list)) 60 usb_file.write_text(json.dumps(usb_list, cls=InfoJSONEncoder))
diff --git a/lib/python/qmk/cli/generate/config_h.py b/lib/python/qmk/cli/generate/config_h.py
new file mode 100755
index 000000000..4d734017a
--- /dev/null
+++ b/lib/python/qmk/cli/generate/config_h.py
@@ -0,0 +1,277 @@
1"""Used by the make system to generate info_config.h from info.json.
2"""
3from milc import cli
4
5from qmk.constants import LED_INDICATORS
6from qmk.decorators import automagic_keyboard, automagic_keymap
7from qmk.info import info_json, rgblight_animations, rgblight_properties, rgblight_toggles
8from qmk.path import is_keyboard, normpath
9
10usb_properties = {
11 'vid': 'VENDOR_ID',
12 'pid': 'PRODUCT_ID',
13 'device_ver': 'DEVICE_VER',
14}
15
16
17def debounce(debounce):
18 """Return the config.h lines that set debounce
19 """
20 return """
21#ifndef DEBOUNCE
22# define DEBOUNCE %s
23#endif // DEBOUNCE
24""" % debounce
25
26
27def diode_direction(diode_direction):
28 """Return the config.h lines that set diode direction
29 """
30 return """
31#ifndef DIODE_DIRECTION
32# define DIODE_DIRECTION %s
33#endif // DIODE_DIRECTION
34""" % diode_direction
35
36
37def keyboard_name(keyboard_name):
38 """Return the config.h lines that set the keyboard's name.
39 """
40 return """
41#ifndef DESCRIPTION
42# define DESCRIPTION %s
43#endif // DESCRIPTION
44
45#ifndef PRODUCT
46# define PRODUCT %s
47#endif // PRODUCT
48""" % (keyboard_name, keyboard_name)
49
50
51def manufacturer(manufacturer):
52 """Return the config.h lines that set the manufacturer.
53 """
54 return """
55#ifndef MANUFACTURER
56# define MANUFACTURER %s
57#endif // MANUFACTURER
58""" % (manufacturer)
59
60
61def direct_pins(direct_pins):
62 """Return the config.h lines that set the direct pins.
63 """
64 rows = []
65
66 for row in direct_pins:
67 cols = ','.join([col or 'NO_PIN' for col in row])
68 rows.append('{' + cols + '}')
69
70 col_count = len(direct_pins[0])
71 row_count = len(direct_pins)
72
73 return """
74#ifndef MATRIX_COLS
75# define MATRIX_COLS %s
76#endif // MATRIX_COLS
77
78#ifndef MATRIX_ROWS
79# define MATRIX_ROWS %s
80#endif // MATRIX_ROWS
81
82#ifndef DIRECT_PINS
83# define DIRECT_PINS {%s}
84#endif // DIRECT_PINS
85""" % (col_count, row_count, ','.join(rows))
86
87
88def col_pins(col_pins):
89 """Return the config.h lines that set the column pins.
90 """
91 cols = ','.join(col_pins)
92 col_num = len(col_pins)
93
94 return """
95#ifndef MATRIX_COLS
96# define MATRIX_COLS %s
97#endif // MATRIX_COLS
98
99#ifndef MATRIX_COL_PINS
100# define MATRIX_COL_PINS {%s}
101#endif // MATRIX_COL_PINS
102""" % (col_num, cols)
103
104
105def row_pins(row_pins):
106 """Return the config.h lines that set the row pins.
107 """
108 rows = ','.join(row_pins)
109 row_num = len(row_pins)
110
111 return """
112#ifndef MATRIX_ROWS
113# define MATRIX_ROWS %s
114#endif // MATRIX_ROWS
115
116#ifndef MATRIX_ROW_PINS
117# define MATRIX_ROW_PINS {%s}
118#endif // MATRIX_ROW_PINS
119""" % (row_num, rows)
120
121
122def indicators(config):
123 """Return the config.h lines that setup LED indicators.
124 """
125 defines = []
126
127 for led, define in LED_INDICATORS.items():
128 if led in config:
129 defines.append('')
130 defines.append('#ifndef %s' % (define,))
131 defines.append('# define %s %s' % (define, config[led]))
132 defines.append('#endif // %s' % (define,))
133
134 return '\n'.join(defines)
135
136
137def layout_aliases(layout_aliases):
138 """Return the config.h lines that setup layout aliases.
139 """
140 defines = []
141
142 for alias, layout in layout_aliases.items():
143 defines.append('')
144 defines.append('#ifndef %s' % (alias,))
145 defines.append('# define %s %s' % (alias, layout))
146 defines.append('#endif // %s' % (alias,))
147
148 return '\n'.join(defines)
149
150
151def matrix_pins(matrix_pins):
152 """Add the matrix config to the config.h.
153 """
154 pins = []
155
156 if 'direct' in matrix_pins:
157 pins.append(direct_pins(matrix_pins['direct']))
158
159 if 'cols' in matrix_pins:
160 pins.append(col_pins(matrix_pins['cols']))
161
162 if 'rows' in matrix_pins:
163 pins.append(row_pins(matrix_pins['rows']))
164
165 return '\n'.join(pins)
166
167
168def rgblight(config):
169 """Return the config.h lines that setup rgblight.
170 """
171 rgblight_config = []
172
173 for json_key, config_key in rgblight_properties.items():
174 if json_key in config:
175 rgblight_config.append('')
176 rgblight_config.append('#ifndef %s' % (config_key,))
177 rgblight_config.append('# define %s %s' % (config_key, config[json_key]))
178 rgblight_config.append('#endif // %s' % (config_key,))
179
180 for json_key, config_key in rgblight_toggles.items():
181 if config.get(json_key):
182 rgblight_config.append('')
183 rgblight_config.append('#ifndef %s' % (config_key,))
184 rgblight_config.append('# define %s' % (config_key,))
185 rgblight_config.append('#endif // %s' % (config_key,))
186
187 for json_key, config_key in rgblight_animations.items():
188 if 'animations' in config and config['animations'].get(json_key):
189 rgblight_config.append('')
190 rgblight_config.append('#ifndef %s' % (config_key,))
191 rgblight_config.append('# define %s' % (config_key,))
192 rgblight_config.append('#endif // %s' % (config_key,))
193
194 return '\n'.join(rgblight_config)
195
196
197def usb_properties(usb_props):
198 """Return the config.h lines that setup USB params.
199 """
200 usb_lines = []
201
202 for info_name, config_name in usb_props.items():
203 if info_name in usb_props:
204 usb_lines.append('')
205 usb_lines.append('#ifndef ' + config_name)
206 usb_lines.append('# define %s %s' % (config_name, usb_props[info_name]))
207 usb_lines.append('#endif // ' + config_name)
208
209 return '\n'.join(usb_lines)
210
211
212@cli.argument('-o', '--output', arg_only=True, type=normpath, help='File to write to')
213@cli.argument('-q', '--quiet', arg_only=True, action='store_true', help="Quiet mode, only output error messages")
214@cli.argument('-kb', '--keyboard', help='Keyboard to generate config.h for.')
215@cli.subcommand('Used by the make system to generate info_config.h from info.json', hidden=True)
216@automagic_keyboard
217@automagic_keymap
218def generate_config_h(cli):
219 """Generates the info_config.h file.
220 """
221 # Determine our keyboard(s)
222 if not cli.config.generate_config_h.keyboard:
223 cli.log.error('Missing paramater: --keyboard')
224 cli.subcommands['info'].print_help()
225 return False
226
227 if not is_keyboard(cli.config.generate_config_h.keyboard):
228 cli.log.error('Invalid keyboard: "%s"', cli.config.generate_config_h.keyboard)
229 return False
230
231 # Build the info.json file
232 kb_info_json = info_json(cli.config.generate_config_h.keyboard)
233
234 # Build the info_config.h file.
235 config_h_lines = ['/* This file was generated by `qmk generate-config-h`. Do not edit or copy.' ' */', '', '#pragma once']
236
237 if 'debounce' in kb_info_json:
238 config_h_lines.append(debounce(kb_info_json['debounce']))
239
240 if 'diode_direction' in kb_info_json:
241 config_h_lines.append(diode_direction(kb_info_json['diode_direction']))
242
243 if 'indicators' in kb_info_json:
244 config_h_lines.append(indicators(kb_info_json['indicators']))
245
246 if 'keyboard_name' in kb_info_json:
247 config_h_lines.append(keyboard_name(kb_info_json['keyboard_name']))
248
249 if 'layout_aliases' in kb_info_json:
250 config_h_lines.append(layout_aliases(kb_info_json['layout_aliases']))
251
252 if 'manufacturer' in kb_info_json:
253 config_h_lines.append(manufacturer(kb_info_json['manufacturer']))
254
255 if 'rgblight' in kb_info_json:
256 config_h_lines.append(rgblight(kb_info_json['rgblight']))
257
258 if 'matrix_pins' in kb_info_json:
259 config_h_lines.append(matrix_pins(kb_info_json['matrix_pins']))
260
261 if 'usb' in kb_info_json:
262 config_h_lines.append(usb_properties(kb_info_json['usb']))
263
264 # Show the results
265 config_h = '\n'.join(config_h_lines)
266
267 if cli.args.output:
268 cli.args.output.parent.mkdir(parents=True, exist_ok=True)
269 if cli.args.output.exists():
270 cli.args.output.replace(cli.args.output.name + '.bak')
271 cli.args.output.write_text(config_h)
272
273 if not cli.args.quiet:
274 cli.log.info('Wrote info_config.h to %s.', cli.args.output)
275
276 else:
277 print(config_h)
diff --git a/lib/python/qmk/cli/generate/info_json.py b/lib/python/qmk/cli/generate/info_json.py
new file mode 100755
index 000000000..7e6654e45
--- /dev/null
+++ b/lib/python/qmk/cli/generate/info_json.py
@@ -0,0 +1,49 @@
1"""Keyboard information script.
2
3Compile an info.json for a particular keyboard and pretty-print it.
4"""
5import json
6
7from milc import cli
8
9from qmk.info_json_encoder import InfoJSONEncoder
10from qmk.decorators import automagic_keyboard, automagic_keymap
11from qmk.info import info_json
12from qmk.path import is_keyboard
13
14
15@cli.argument('-kb', '--keyboard', help='Keyboard to show info for.')
16@cli.argument('-km', '--keymap', help='Show the layers for a JSON keymap too.')
17@cli.subcommand('Generate an info.json file for a keyboard.', hidden=False if cli.config.user.developer else True)
18@automagic_keyboard
19@automagic_keymap
20def generate_info_json(cli):
21 """Generate an info.json file for a keyboard
22 """
23 # Determine our keyboard(s)
24 if not cli.config.generate_info_json.keyboard:
25 cli.log.error('Missing paramater: --keyboard')
26 cli.subcommands['info'].print_help()
27 return False
28
29 if not is_keyboard(cli.config.generate_info_json.keyboard):
30 cli.log.error('Invalid keyboard: "%s"', cli.config.generate_info_json.keyboard)
31 return False
32
33 # Build the info.json file
34 kb_info_json = info_json(cli.config.generate_info_json.keyboard)
35 pared_down_json = {}
36
37 for key in ('manufacturer', 'maintainer', 'usb', 'keyboard_name', 'width', 'height', 'debounce', 'diode_direction', 'features', 'community_layouts', 'layout_aliases', 'matrix_pins', 'rgblight', 'url'):
38 if key in kb_info_json:
39 pared_down_json[key] = kb_info_json[key]
40
41 pared_down_json['layouts'] = {}
42 if 'layouts' in pared_down_json:
43 for layout_name, layout in kb_info_json['layouts'].items():
44 pared_down_json['layouts'][layout_name] = {}
45 pared_down_json['layouts'][layout_name]['key_count'] = layout.get('key_count', len(layout['layout']))
46 pared_down_json['layouts'][layout_name]['layout'] = layout['layout']
47
48 # Display the results
49 print(json.dumps(pared_down_json, indent=2, cls=InfoJSONEncoder))
diff --git a/lib/python/qmk/cli/generate/layouts.py b/lib/python/qmk/cli/generate/layouts.py
new file mode 100755
index 000000000..809f0ef7e
--- /dev/null
+++ b/lib/python/qmk/cli/generate/layouts.py
@@ -0,0 +1,93 @@
1"""Used by the make system to generate layouts.h from info.json.
2"""
3from milc import cli
4
5from qmk.constants import COL_LETTERS, ROW_LETTERS
6from qmk.decorators import automagic_keyboard, automagic_keymap
7from qmk.info import info_json
8from qmk.path import is_keyboard, normpath
9
10usb_properties = {
11 'vid': 'VENDOR_ID',
12 'pid': 'PRODUCT_ID',
13 'device_ver': 'DEVICE_VER',
14}
15
16
17@cli.argument('-o', '--output', arg_only=True, type=normpath, help='File to write to')
18@cli.argument('-q', '--quiet', arg_only=True, action='store_true', help="Quiet mode, only output error messages")
19@cli.argument('-kb', '--keyboard', help='Keyboard to generate config.h for.')
20@cli.subcommand('Used by the make system to generate layouts.h from info.json', hidden=True)
21@automagic_keyboard
22@automagic_keymap
23def generate_layouts(cli):
24 """Generates the layouts.h file.
25 """
26 # Determine our keyboard(s)
27 if not cli.config.generate_layouts.keyboard:
28 cli.log.error('Missing paramater: --keyboard')
29 cli.subcommands['info'].print_help()
30 return False
31
32 if not is_keyboard(cli.config.generate_layouts.keyboard):
33 cli.log.error('Invalid keyboard: "%s"', cli.config.generate_layouts.keyboard)
34 return False
35
36 # Build the info.json file
37 kb_info_json = info_json(cli.config.generate_layouts.keyboard)
38
39 # Build the layouts.h file.
40 layouts_h_lines = ['/* This file was generated by `qmk generate-layouts`. Do not edit or copy.' ' */', '', '#pragma once']
41
42 if 'direct' in kb_info_json['matrix_pins']:
43 col_num = len(kb_info_json['matrix_pins']['direct'][0])
44 row_num = len(kb_info_json['matrix_pins']['direct'])
45 elif 'cols' in kb_info_json['matrix_pins'] and 'rows' in kb_info_json['matrix_pins']:
46 col_num = len(kb_info_json['matrix_pins']['cols'])
47 row_num = len(kb_info_json['matrix_pins']['rows'])
48 else:
49 cli.log.error('%s: Invalid matrix config.', cli.config.generate_layouts.keyboard)
50 return False
51
52 for layout_name in kb_info_json['layouts']:
53 if kb_info_json['layouts'][layout_name]['c_macro']:
54 continue
55
56 layout_keys = []
57 layout_matrix = [['KC_NO' for i in range(col_num)] for i in range(row_num)]
58
59 for i, key in enumerate(kb_info_json['layouts'][layout_name]['layout']):
60 row = key['matrix'][0]
61 col = key['matrix'][1]
62 identifier = 'k%s%s' % (ROW_LETTERS[row], COL_LETTERS[col])
63
64 try:
65 layout_matrix[row][col] = identifier
66 layout_keys.append(identifier)
67 except IndexError:
68 key_name = key.get('label', identifier)
69 cli.log.error('Matrix data out of bounds for layout %s at index %s (%s): %s, %s', layout_name, i, key_name, row, col)
70 return False
71
72 layouts_h_lines.append('')
73 layouts_h_lines.append('#define %s(%s) {\\' % (layout_name, ', '.join(layout_keys)))
74
75 rows = ', \\\n'.join(['\t {' + ', '.join(row) + '}' for row in layout_matrix])
76 rows += ' \\'
77 layouts_h_lines.append(rows)
78 layouts_h_lines.append('}')
79
80 # Show the results
81 layouts_h = '\n'.join(layouts_h_lines) + '\n'
82
83 if cli.args.output:
84 cli.args.output.parent.mkdir(parents=True, exist_ok=True)
85 if cli.args.output.exists():
86 cli.args.output.replace(cli.args.output.name + '.bak')
87 cli.args.output.write_text(layouts_h)
88
89 if not cli.args.quiet:
90 cli.log.info('Wrote info_config.h to %s.', cli.args.output)
91
92 else:
93 print(layouts_h)
diff --git a/lib/python/qmk/cli/generate/rules_mk.py b/lib/python/qmk/cli/generate/rules_mk.py
new file mode 100755
index 000000000..4268ae047
--- /dev/null
+++ b/lib/python/qmk/cli/generate/rules_mk.py
@@ -0,0 +1,59 @@
1"""Used by the make system to generate a rules.mk
2"""
3from milc import cli
4
5from qmk.decorators import automagic_keyboard, automagic_keymap
6from qmk.info import info_json
7from qmk.path import is_keyboard, normpath
8
9
10@cli.argument('-o', '--output', arg_only=True, type=normpath, help='File to write to')
11@cli.argument('-q', '--quiet', arg_only=True, action='store_true', help="Quiet mode, only output error messages")
12@cli.argument('-kb', '--keyboard', help='Keyboard to generate config.h for.')
13@cli.subcommand('Used by the make system to generate info_config.h from info.json', hidden=True)
14@automagic_keyboard
15@automagic_keymap
16def generate_rules_mk(cli):
17 """Generates a rules.mk file from info.json.
18 """
19 # Determine our keyboard(s)
20 if not cli.config.generate_rules_mk.keyboard:
21 cli.log.error('Missing paramater: --keyboard')
22 cli.subcommands['info'].print_help()
23 return False
24
25 if not is_keyboard(cli.config.generate_rules_mk.keyboard):
26 cli.log.error('Invalid keyboard: "%s"', cli.config.generate_rules_mk.keyboard)
27 return False
28
29 # Build the info.json file
30 kb_info_json = info_json(cli.config.generate_rules_mk.keyboard)
31 rules_mk_lines = ['# This file was generated by `qmk generate-rules-mk`. Do not edit or copy.', '']
32
33 # Find features that should be enabled
34 if 'features' in kb_info_json:
35 for feature, enabled in kb_info_json['features'].items():
36 feature = feature.upper()
37 enabled = 'yes' if enabled else 'no'
38 rules_mk_lines.append(f'{feature}_ENABLE := {enabled}')
39
40 # Add community layouts
41 if 'community_layouts' in kb_info_json:
42 rules_mk_lines.append(f'LAYOUTS = {" ".join(kb_info_json["community_layouts"])}')
43
44 # Show the results
45 rules_mk = '\n'.join(rules_mk_lines) + '\n'
46
47 if cli.args.output:
48 cli.args.output.parent.mkdir(parents=True, exist_ok=True)
49 if cli.args.output.exists():
50 cli.args.output.replace(cli.args.output.name + '.bak')
51 cli.args.output.write_text(rules_mk)
52
53 if cli.args.quiet:
54 print(cli.args.output)
55 else:
56 cli.log.info('Wrote info_config.h to %s.', cli.args.output)
57
58 else:
59 print(rules_mk)
diff --git a/lib/python/qmk/cli/info.py b/lib/python/qmk/cli/info.py
index 9ab299a21..87d7253d4 100755
--- a/lib/python/qmk/cli/info.py
+++ b/lib/python/qmk/cli/info.py
@@ -7,6 +7,8 @@ import platform
7 7
8from milc import cli 8from milc import cli
9 9
10from qmk.info_json_encoder import InfoJSONEncoder
11from qmk.constants import COL_LETTERS, ROW_LETTERS
10from qmk.decorators import automagic_keyboard, automagic_keymap 12from qmk.decorators import automagic_keyboard, automagic_keymap
11from qmk.keyboard import render_layouts, render_layout 13from qmk.keyboard import render_layouts, render_layout
12from qmk.keymap import locate_keymap 14from qmk.keymap import locate_keymap
@@ -15,9 +17,6 @@ from qmk.path import is_keyboard
15 17
16platform_id = platform.platform().lower() 18platform_id = platform.platform().lower()
17 19
18ROW_LETTERS = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnop'
19COL_LETTERS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijilmnopqrstuvwxyz'
20
21 20
22def show_keymap(kb_info_json, title_caps=True): 21def show_keymap(kb_info_json, title_caps=True):
23 """Render the keymap in ascii art. 22 """Render the keymap in ascii art.
@@ -149,7 +148,7 @@ def info(cli):
149 148
150 # Output in the requested format 149 # Output in the requested format
151 if cli.args.format == 'json': 150 if cli.args.format == 'json':
152 print(json.dumps(kb_info_json)) 151 print(json.dumps(kb_info_json, cls=InfoJSONEncoder))
153 elif cli.args.format == 'text': 152 elif cli.args.format == 'text':
154 print_text_output(kb_info_json) 153 print_text_output(kb_info_json)
155 elif cli.args.format == 'friendly': 154 elif cli.args.format == 'friendly':
diff --git a/lib/python/qmk/cli/kle2json.py b/lib/python/qmk/cli/kle2json.py
index 3d1bb8c43..66d504bfc 100755
--- a/lib/python/qmk/cli/kle2json.py
+++ b/lib/python/qmk/cli/kle2json.py
@@ -3,25 +3,12 @@
3import json 3import json
4import os 4import os
5from pathlib import Path 5from pathlib import Path
6from decimal import Decimal
7from collections import OrderedDict
8 6
9from milc import cli 7from milc import cli
10from kle2xy import KLE2xy 8from kle2xy import KLE2xy
11 9
12from qmk.converter import kle2qmk 10from qmk.converter import kle2qmk
13 11from qmk.info_json_encoder import InfoJSONEncoder
14
15class CustomJSONEncoder(json.JSONEncoder):
16 def default(self, obj):
17 try:
18 if isinstance(obj, Decimal):
19 if obj % 2 in (Decimal(0), Decimal(1)):
20 return int(obj)
21 return float(obj)
22 except TypeError:
23 pass
24 return json.JSONEncoder.default(self, obj)
25 12
26 13
27@cli.argument('filename', help='The KLE raw txt to convert') 14@cli.argument('filename', help='The KLE raw txt to convert')
@@ -52,24 +39,22 @@ def kle2json(cli):
52 cli.log.error('Could not parse KLE raw data: %s', raw_code) 39 cli.log.error('Could not parse KLE raw data: %s', raw_code)
53 cli.log.exception(e) 40 cli.log.exception(e)
54 return False 41 return False
55 keyboard = OrderedDict( 42 keyboard = {
56 keyboard_name=kle.name, 43 'keyboard_name': kle.name,
57 url='', 44 'url': '',
58 maintainer='qmk', 45 'maintainer': 'qmk',
59 width=kle.columns, 46 'width': kle.columns,
60 height=kle.rows, 47 'height': kle.rows,
61 layouts={'LAYOUT': { 48 'layouts': {
62 'layout': 'LAYOUT_JSON_HERE' 49 'LAYOUT': {
63 }}, 50 'layout': kle2qmk(kle)
64 ) 51 }
65 # Initialize keyboard with json encoded from ordered dict 52 },
66 keyboard = json.dumps(keyboard, indent=4, separators=(', ', ': '), sort_keys=False, cls=CustomJSONEncoder) 53 }
67 # Initialize layout with kle2qmk from converter module 54
68 layout = json.dumps(kle2qmk(kle), separators=(', ', ':'), cls=CustomJSONEncoder)
69 # Replace layout in keyboard json
70 keyboard = keyboard.replace('"LAYOUT_JSON_HERE"', layout)
71 # Write our info.json 55 # Write our info.json
72 file = open(out_path / "info.json", "w") 56 keyboard = json.dumps(keyboard, indent=4, separators=(', ', ': '), sort_keys=False, cls=InfoJSONEncoder)
73 file.write(keyboard) 57 info_json_file = out_path / 'info.json'
74 file.close() 58
59 info_json_file.write_text(keyboard)
75 cli.log.info('Wrote out {fg_cyan}%s/info.json', out_path) 60 cli.log.info('Wrote out {fg_cyan}%s/info.json', out_path)
diff --git a/lib/python/qmk/constants.py b/lib/python/qmk/constants.py
index 94ab68e5e..675832c50 100644
--- a/lib/python/qmk/constants.py
+++ b/lib/python/qmk/constants.py
@@ -17,3 +17,14 @@ VUSB_PROCESSORS = 'atmega32a', 'atmega328p', 'atmega328', 'attiny85'
17DATE_FORMAT = '%Y-%m-%d' 17DATE_FORMAT = '%Y-%m-%d'
18DATETIME_FORMAT = '%Y-%m-%d %H:%M:%S %Z' 18DATETIME_FORMAT = '%Y-%m-%d %H:%M:%S %Z'
19TIME_FORMAT = '%H:%M:%S' 19TIME_FORMAT = '%H:%M:%S'
20
21# Used when generating matrix locations
22COL_LETTERS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijilmnopqrstuvwxyz'
23ROW_LETTERS = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnop'
24
25# Mapping between info.json and config.h keys
26LED_INDICATORS = {
27 'caps_lock': 'LED_CAPS_LOCK_PIN',
28 'num_lock': 'LED_NUM_LOCK_PIN',
29 'scrol_lock': 'LED_SCROLL_LOCK_PIN'
30}
diff --git a/lib/python/qmk/info.py b/lib/python/qmk/info.py
index f476dc666..d7b128aa6 100644
--- a/lib/python/qmk/info.py
+++ b/lib/python/qmk/info.py
@@ -6,13 +6,45 @@ from pathlib import Path
6 6
7from milc import cli 7from milc import cli
8 8
9from qmk.constants import CHIBIOS_PROCESSORS, LUFA_PROCESSORS, VUSB_PROCESSORS 9from qmk.constants import CHIBIOS_PROCESSORS, LUFA_PROCESSORS, VUSB_PROCESSORS, LED_INDICATORS
10from qmk.c_parse import find_layouts 10from qmk.c_parse import find_layouts
11from qmk.keyboard import config_h, rules_mk 11from qmk.keyboard import config_h, rules_mk
12from qmk.keymap import list_keymaps 12from qmk.keymap import list_keymaps
13from qmk.makefile import parse_rules_mk_file 13from qmk.makefile import parse_rules_mk_file
14from qmk.math import compute 14from qmk.math import compute
15 15
16rgblight_properties = {
17 'led_count': 'RGBLED_NUM',
18 'pin': 'RGB_DI_PIN',
19 'split_count': 'RGBLED_SPLIT',
20 'max_brightness': 'RGBLIGHT_LIMIT_VAL',
21 'hue_steps': 'RGBLIGHT_HUE_STEP',
22 'saturation_steps': 'RGBLIGHT_SAT_STEP',
23 'brightness_steps': 'RGBLIGHT_VAL_STEP'
24}
25
26rgblight_toggles = {
27 'sleep': 'RGBLIGHT_SLEEP',
28 'split': 'RGBLIGHT_SPLIT',
29}
30
31rgblight_animations = {
32 'all': 'RGBLIGHT_ANIMATIONS',
33 'alternating': 'RGBLIGHT_EFFECT_ALTERNATING',
34 'breathing': 'RGBLIGHT_EFFECT_BREATHING',
35 'christmas': 'RGBLIGHT_EFFECT_CHRISTMAS',
36 'knight': 'RGBLIGHT_EFFECT_KNIGHT',
37 'rainbow_mood': 'RGBLIGHT_EFFECT_RAINBOW_MOOD',
38 'rainbow_swirl': 'RGBLIGHT_EFFECT_RAINBOW_SWIRL',
39 'rgb_test': 'RGBLIGHT_EFFECT_RGB_TEST',
40 'snake': 'RGBLIGHT_EFFECT_SNAKE',
41 'static_gradient': 'RGBLIGHT_EFFECT_STATIC_GRADIENT',
42 'twinkle': 'RGBLIGHT_EFFECT_TWINKLE'
43}
44
45true_values = ['1', 'on', 'yes']
46false_values = ['0', 'off', 'no']
47
16 48
17def info_json(keyboard): 49def info_json(keyboard):
18 """Generate the info.json data for a specific keyboard. 50 """Generate the info.json data for a specific keyboard.
@@ -38,8 +70,9 @@ def info_json(keyboard):
38 info_data['keymaps'][keymap.name] = {'url': f'https://raw.githubusercontent.com/qmk/qmk_firmware/master/{keymap}/keymap.json'} 70 info_data['keymaps'][keymap.name] = {'url': f'https://raw.githubusercontent.com/qmk/qmk_firmware/master/{keymap}/keymap.json'}
39 71
40 # Populate layout data 72 # Populate layout data
41 for layout_name, layout_json in _find_all_layouts(info_data, keyboard, rules).items(): 73 for layout_name, layout_json in _find_all_layouts(info_data, keyboard).items():
42 if not layout_name.startswith('LAYOUT_kc'): 74 if not layout_name.startswith('LAYOUT_kc'):
75 layout_json['c_macro'] = True
43 info_data['layouts'][layout_name] = layout_json 76 info_data['layouts'][layout_name] = layout_json
44 77
45 # Merge in the data from info.json, config.h, and rules.mk 78 # Merge in the data from info.json, config.h, and rules.mk
@@ -47,34 +80,179 @@ def info_json(keyboard):
47 info_data = _extract_config_h(info_data) 80 info_data = _extract_config_h(info_data)
48 info_data = _extract_rules_mk(info_data) 81 info_data = _extract_rules_mk(info_data)
49 82
83 # Make sure we have at least one layout
84 if not info_data.get('layouts'):
85 _log_error(info_data, 'No LAYOUTs defined! Need at least one layout defined in the keyboard.h or info.json.')
86
87 # Make sure we supply layout macros for the community layouts we claim to support
88 # FIXME(skullydazed): This should be populated into info.json and read from there instead
89 if 'LAYOUTS' in rules and info_data.get('layouts'):
90 # Match these up against the supplied layouts
91 supported_layouts = rules['LAYOUTS'].strip().split()
92 for layout_name in sorted(info_data['layouts']):
93 layout_name = layout_name[7:]
94
95 if layout_name in supported_layouts:
96 supported_layouts.remove(layout_name)
97
98 if supported_layouts:
99 for supported_layout in supported_layouts:
100 _log_error(info_data, 'Claims to support community layout %s but no LAYOUT_%s() macro found' % (supported_layout, supported_layout))
101
50 return info_data 102 return info_data
51 103
52 104
53def _extract_config_h(info_data): 105def _extract_debounce(info_data, config_c):
54 """Pull some keyboard information from existing rules.mk files 106 """Handle debounce.
107 """
108 if 'debounce' in info_data and 'DEBOUNCE' in config_c:
109 _log_warning(info_data, 'Debounce is specified in both info.json and config.h, the config.h value wins.')
110
111 if 'DEBOUNCE' in config_c:
112 info_data['debounce'] = config_c.get('DEBOUNCE')
113
114 return info_data
115
116
117def _extract_diode_direction(info_data, config_c):
118 """Handle the diode direction.
119 """
120 if 'diode_direction' in info_data and 'DIODE_DIRECTION' in config_c:
121 _log_warning(info_data, 'Diode direction is specified in both info.json and config.h, the config.h value wins.')
122
123 if 'DIODE_DIRECTION' in config_c:
124 info_data['diode_direction'] = config_c.get('DIODE_DIRECTION')
125
126 return info_data
127
128
129def _extract_indicators(info_data, config_c):
130 """Find the LED indicator information.
131 """
132 for json_key, config_key in LED_INDICATORS.items():
133 if json_key in info_data.get('indicators', []) and config_key in config_c:
134 _log_warning(info_data, f'Indicator {json_key} is specified in both info.json and config.h, the config.h value wins.')
135
136 if config_key in config_c:
137 info_data['indicators'][json_key] = config_c.get(config_key)
138
139 return info_data
140
141
142def _extract_community_layouts(info_data, rules):
143 """Find the community layouts in rules.mk.
144 """
145 community_layouts = rules['LAYOUTS'].split() if 'LAYOUTS' in rules else []
146
147 if 'community_layouts' in info_data:
148 for layout in community_layouts:
149 if layout not in info_data['community_layouts']:
150 community_layouts.append(layout)
151
152 else:
153 info_data['community_layouts'] = community_layouts
154
155 return info_data
156
157
158def _extract_features(info_data, rules):
159 """Find all the features enabled in rules.mk.
160 """
161 for key, value in rules.items():
162 if key.endswith('_ENABLE'):
163 key = '_'.join(key.split('_')[:-1]).lower()
164 value = True if value in true_values else False if value in false_values else value
165
166 if 'config_h_features' not in info_data:
167 info_data['config_h_features'] = {}
168
169 if 'features' not in info_data:
170 info_data['features'] = {}
171
172 if key in info_data['features']:
173 _log_warning(info_data, 'Feature %s is specified in both info.json and rules.mk, the rules.mk value wins.' % (key,))
174
175 info_data['features'][key] = value
176 info_data['config_h_features'][key] = value
177
178 return info_data
179
180
181def _extract_rgblight(info_data, config_c):
182 """Handle the rgblight configuration
183 """
184 rgblight = info_data.get('rgblight', {})
185 animations = rgblight.get('animations', {})
186
187 for json_key, config_key in rgblight_properties.items():
188 if config_key in config_c:
189 if json_key in rgblight:
190 _log_warning(info_data, 'RGB Light: %s is specified in both info.json and config.h, the config.h value wins.' % (json_key,))
191
192 rgblight[json_key] = config_c[config_key]
193
194 for json_key, config_key in rgblight_toggles.items():
195 if config_key in config_c:
196 if json_key in rgblight:
197 _log_warning(info_data, 'RGB Light: %s is specified in both info.json and config.h, the config.h value wins.', json_key)
198
199 rgblight[json_key] = config_c[config_key]
200
201 for json_key, config_key in rgblight_animations.items():
202 if config_key in config_c:
203 if json_key in animations:
204 _log_warning(info_data, 'RGB Light: animations: %s is specified in both info.json and config.h, the config.h value wins.' % (json_key,))
205
206 animations[json_key] = config_c[config_key]
207
208 if animations:
209 rgblight['animations'] = animations
210
211 if rgblight:
212 info_data['rgblight'] = rgblight
213
214 return info_data
215
216
217def _extract_matrix_info(info_data, config_c):
218 """Populate the matrix information.
55 """ 219 """
56 config_c = config_h(info_data['keyboard_folder'])
57 row_pins = config_c.get('MATRIX_ROW_PINS', '').replace('{', '').replace('}', '').strip() 220 row_pins = config_c.get('MATRIX_ROW_PINS', '').replace('{', '').replace('}', '').strip()
58 col_pins = config_c.get('MATRIX_COL_PINS', '').replace('{', '').replace('}', '').strip() 221 col_pins = config_c.get('MATRIX_COL_PINS', '').replace('{', '').replace('}', '').strip()
59 direct_pins = config_c.get('DIRECT_PINS', '').replace(' ', '')[1:-1] 222 direct_pins = config_c.get('DIRECT_PINS', '').replace(' ', '')[1:-1]
60 223
61 info_data['diode_direction'] = config_c.get('DIODE_DIRECTION') 224 if 'MATRIX_ROWS' in config_c and 'MATRIX_COLS' in config_c:
62 info_data['matrix_size'] = { 225 if 'matrix_size' in info_data:
63 'rows': compute(config_c.get('MATRIX_ROWS', '0')), 226 _log_warning(info_data, 'Matrix size is specified in both info.json and config.h, the config.h values win.')
64 'cols': compute(config_c.get('MATRIX_COLS', '0')),
65 }
66 info_data['matrix_pins'] = {}
67 227
68 if row_pins: 228 info_data['matrix_size'] = {
69 info_data['matrix_pins']['rows'] = row_pins.split(',') 229 'rows': compute(config_c.get('MATRIX_ROWS', '0')),
70 if col_pins: 230 'cols': compute(config_c.get('MATRIX_COLS', '0')),
71 info_data['matrix_pins']['cols'] = col_pins.split(',') 231 }
232
233 if row_pins and col_pins:
234 if 'matrix_pins' in info_data:
235 _log_warning(info_data, 'Matrix pins are specified in both info.json and config.h, the config.h values win.')
236
237 info_data['matrix_pins'] = {}
238
239 if row_pins:
240 info_data['matrix_pins']['rows'] = row_pins.split(',')
241
242 if col_pins:
243 info_data['matrix_pins']['cols'] = col_pins.split(',')
72 244
73 if direct_pins: 245 if direct_pins:
246 if 'matrix_pins' in info_data:
247 _log_warning(info_data, 'Direct pins are specified in both info.json and config.h, the config.h values win.')
248
249 info_data['matrix_pins'] = {}
74 direct_pin_array = [] 250 direct_pin_array = []
251
75 for row in direct_pins.split('},{'): 252 for row in direct_pins.split('},{'):
76 if row.startswith('{'): 253 if row.startswith('{'):
77 row = row[1:] 254 row = row[1:]
255
78 if row.endswith('}'): 256 if row.endswith('}'):
79 row = row[:-1] 257 row = row[:-1]
80 258
@@ -86,15 +264,43 @@ def _extract_config_h(info_data):
86 264
87 direct_pin_array[-1].append(pin) 265 direct_pin_array[-1].append(pin)
88 266
89 info_data['matrix_pins']['direct'] = direct_pin_array 267 info_data['matrix_pins']['direct'] = direct_pin_array
90 268
91 info_data['usb'] = { 269 return info_data
92 'vid': config_c.get('VENDOR_ID'), 270
93 'pid': config_c.get('PRODUCT_ID'), 271
94 'device_ver': config_c.get('DEVICE_VER'), 272def _extract_usb_info(info_data, config_c):
95 'manufacturer': config_c.get('MANUFACTURER'), 273 """Populate the USB information.
96 'product': config_c.get('PRODUCT'), 274 """
97 } 275 usb_properties = {'vid': 'VENDOR_ID', 'pid': 'PRODUCT_ID', 'device_ver': 'DEVICE_VER'}
276
277 if 'usb' not in info_data:
278 info_data['usb'] = {}
279
280 for info_name, config_name in usb_properties.items():
281 if config_name in config_c:
282 if info_name in info_data['usb']:
283 _log_warning(info_data, '%s in config.h is overwriting usb.%s in info.json' % (config_name, info_name))
284
285 info_data['usb'][info_name] = config_c[config_name]
286
287 elif info_name not in info_data['usb']:
288 _log_error(info_data, '%s not specified in config.h, and %s not specified in info.json. One is required.' % (config_name, info_name))
289
290 return info_data
291
292
293def _extract_config_h(info_data):
294 """Pull some keyboard information from existing config.h files
295 """
296 config_c = config_h(info_data['keyboard_folder'])
297
298 _extract_debounce(info_data, config_c)
299 _extract_diode_direction(info_data, config_c)
300 _extract_indicators(info_data, config_c)
301 _extract_matrix_info(info_data, config_c)
302 _extract_usb_info(info_data, config_c)
303 _extract_rgblight(info_data, config_c)
98 304
99 return info_data 305 return info_data
100 306
@@ -106,16 +312,52 @@ def _extract_rules_mk(info_data):
106 mcu = rules.get('MCU') 312 mcu = rules.get('MCU')
107 313
108 if mcu in CHIBIOS_PROCESSORS: 314 if mcu in CHIBIOS_PROCESSORS:
109 return arm_processor_rules(info_data, rules) 315 arm_processor_rules(info_data, rules)
110 316
111 elif mcu in LUFA_PROCESSORS + VUSB_PROCESSORS: 317 elif mcu in LUFA_PROCESSORS + VUSB_PROCESSORS:
112 return avr_processor_rules(info_data, rules) 318 avr_processor_rules(info_data, rules)
319
320 else:
321 cli.log.warning("%s: Unknown MCU: %s" % (info_data['keyboard_folder'], mcu))
322 unknown_processor_rules(info_data, rules)
323
324 _extract_community_layouts(info_data, rules)
325 _extract_features(info_data, rules)
326
327 return info_data
113 328
114 msg = "Unknown MCU: " + str(mcu)
115 329
116 _log_warning(info_data, msg) 330def _merge_layouts(info_data, new_info_data):
331 """Merge new_info_data into info_data in an intelligent way.
332 """
333 for layout_name, layout_json in new_info_data['layouts'].items():
334 if layout_name in info_data['layouts']:
335 # Pull in layouts we have a macro for
336 if len(info_data['layouts'][layout_name]['layout']) != len(layout_json['layout']):
337 msg = '%s: %s: Number of elements in info.json does not match! info.json:%s != %s:%s'
338 _log_error(info_data, msg % (info_data['keyboard_folder'], layout_name, len(layout_json['layout']), layout_name, len(info_data['layouts'][layout_name]['layout'])))
339 else:
340 for i, key in enumerate(info_data['layouts'][layout_name]['layout']):
341 key.update(layout_json['layout'][i])
342 else:
343 # Pull in layouts that have matrix data
344 missing_matrix = False
345 for key in layout_json['layout']:
346 if 'matrix' not in key:
347 missing_matrix = True
348
349 if not missing_matrix:
350 if layout_name in info_data['layouts']:
351 # Update an existing layout with new data
352 for i, key in enumerate(info_data['layouts'][layout_name]['layout']):
353 key.update(layout_json['layout'][i])
117 354
118 return unknown_processor_rules(info_data, rules) 355 else:
356 # Copy in the new layout wholesale
357 layout_json['c_macro'] = False
358 info_data['layouts'][layout_name] = layout_json
359
360 return info_data
119 361
120 362
121def _search_keyboard_h(path): 363def _search_keyboard_h(path):
@@ -131,34 +373,21 @@ def _search_keyboard_h(path):
131 return layouts 373 return layouts
132 374
133 375
134def _find_all_layouts(info_data, keyboard, rules): 376def _find_all_layouts(info_data, keyboard):
135 """Looks for layout macros associated with this keyboard. 377 """Looks for layout macros associated with this keyboard.
136 """ 378 """
137 layouts = _search_keyboard_h(Path(keyboard)) 379 layouts = _search_keyboard_h(Path(keyboard))
138 380
139 if not layouts: 381 if not layouts:
140 # If we didn't find any layouts above we widen our search. This is error 382 # If we don't find any layouts from info.json or keyboard.h we widen our search. This is error prone which is why we want to encourage people to follow the standard above.
141 # prone which is why we want to encourage people to follow the standard above. 383 info_data['parse_warnings'].append('%s: Falling back to searching for KEYMAP/LAYOUT macros.' % (keyboard))
142 _log_warning(info_data, 'Falling back to searching for KEYMAP/LAYOUT macros.') 384
143 for file in glob('keyboards/%s/*.h' % keyboard): 385 for file in glob('keyboards/%s/*.h' % keyboard):
144 if file.endswith('.h'): 386 if file.endswith('.h'):
145 these_layouts = find_layouts(file) 387 these_layouts = find_layouts(file)
146 if these_layouts: 388 if these_layouts:
147 layouts.update(these_layouts) 389 layouts.update(these_layouts)
148 390
149 if 'LAYOUTS' in rules:
150 # Match these up against the supplied layouts
151 supported_layouts = rules['LAYOUTS'].strip().split()
152 for layout_name in sorted(layouts):
153 if not layout_name.startswith('LAYOUT_'):
154 continue
155 layout_name = layout_name[7:]
156 if layout_name in supported_layouts:
157 supported_layouts.remove(layout_name)
158
159 if supported_layouts:
160 _log_error(info_data, 'Missing LAYOUT() macro for %s' % (', '.join(supported_layouts)))
161
162 return layouts 391 return layouts
163 392
164 393
@@ -231,32 +460,40 @@ def merge_info_jsons(keyboard, info_data):
231 for info_file in find_info_json(keyboard): 460 for info_file in find_info_json(keyboard):
232 # Load and validate the JSON data 461 # Load and validate the JSON data
233 try: 462 try:
234 with info_file.open('r') as info_fd: 463 new_info_data = json.load(info_file.open('r'))
235 new_info_data = json.load(info_fd)
236 except Exception as e: 464 except Exception as e:
237 _log_error(info_data, "Invalid JSON in file %s: %s: %s" % (str(info_file), e.__class__.__name__, e)) 465 _log_error(info_data, "Invalid JSON in file %s: %s: %s" % (str(info_file), e.__class__.__name__, e))
238 continue 466 new_info_data = {}
239 467
240 if not isinstance(new_info_data, dict): 468 if not isinstance(new_info_data, dict):
241 _log_error(info_data, "Invalid file %s, root object should be a dictionary." % (str(info_file),)) 469 _log_error(info_data, "Invalid file %s, root object should be a dictionary." % (str(info_file),))
242 continue 470 continue
243 471
244 # Copy whitelisted keys into `info_data` 472 # Copy whitelisted keys into `info_data`
245 for key in ('keyboard_name', 'manufacturer', 'identifier', 'url', 'maintainer', 'processor', 'bootloader', 'width', 'height'): 473 for key in ('debounce', 'diode_direction', 'indicators', 'keyboard_name', 'manufacturer', 'identifier', 'url', 'maintainer', 'processor', 'bootloader', 'width', 'height'):
246 if key in new_info_data: 474 if key in new_info_data:
247 info_data[key] = new_info_data[key] 475 info_data[key] = new_info_data[key]
248 476
249 # Merge the layouts in 477 # Deep merge certain keys
478 # FIXME(skullydazed/anyone): this should be generalized more so that we can inteligently merge more than one level deep. It would be nice if we could filter on valid keys too. That may have to wait for a future where we use openapi or something.
479 for key in ('features', 'layout_aliases', 'matrix_pins', 'rgblight', 'usb'):
480 if key in new_info_data:
481 if key not in info_data:
482 info_data[key] = {}
483
484 info_data[key].update(new_info_data[key])
485
486 # Merge the layouts
487 if 'community_layouts' in new_info_data:
488 if 'community_layouts' in info_data:
489 for layout in new_info_data['community_layouts']:
490 if layout not in info_data['community_layouts']:
491 info_data['community_layouts'].append(layout)
492 else:
493 info_data['community_layouts'] = new_info_data['community_layouts']
494
250 if 'layouts' in new_info_data: 495 if 'layouts' in new_info_data:
251 for layout_name, json_layout in new_info_data['layouts'].items(): 496 _merge_layouts(info_data, new_info_data)
252 # Only pull in layouts we have a macro for
253 if layout_name in info_data['layouts']:
254 if info_data['layouts'][layout_name]['key_count'] != len(json_layout['layout']):
255 msg = '%s: Number of elements in info.json does not match! info.json:%s != %s:%s'
256 _log_error(info_data, msg % (layout_name, len(json_layout['layout']), layout_name, len(info_data['layouts'][layout_name]['layout'])))
257 else:
258 for i, key in enumerate(info_data['layouts'][layout_name]['layout']):
259 key.update(json_layout['layout'][i])
260 497
261 return info_data 498 return info_data
262 499
diff --git a/lib/python/qmk/info_json_encoder.py b/lib/python/qmk/info_json_encoder.py
new file mode 100755
index 000000000..60dae7247
--- /dev/null
+++ b/lib/python/qmk/info_json_encoder.py
@@ -0,0 +1,96 @@
1"""Class that pretty-prints QMK info.json files.
2"""
3import json
4from decimal import Decimal
5
6
7class InfoJSONEncoder(json.JSONEncoder):
8 """Custom encoder to make info.json's a little nicer to work with.
9 """
10 container_types = (list, tuple, dict)
11 indentation_char = " "
12
13 def __init__(self, *args, **kwargs):
14 super().__init__(*args, **kwargs)
15 self.indentation_level = 0
16
17 if not self.indent:
18 self.indent = 4
19
20 def encode(self, obj):
21 """Encode JSON objects for QMK.
22 """
23 if isinstance(obj, Decimal):
24 if obj == int(obj): # I can't believe Decimal objects don't have .is_integer()
25 return int(obj)
26 return float(obj)
27
28 elif isinstance(obj, (list, tuple)):
29 if self._primitives_only(obj):
30 return "[" + ", ".join(self.encode(element) for element in obj) + "]"
31
32 else:
33 self.indentation_level += 1
34 output = [self.indent_str + self.encode(element) for element in obj]
35 self.indentation_level -= 1
36 return "[\n" + ",\n".join(output) + "\n" + self.indent_str + "]"
37
38 elif isinstance(obj, dict):
39 if obj:
40 if self.indentation_level == 4:
41 # These are part of a layout, put them on a single line.
42 return "{ " + ", ".join(f"{self.encode(key)}: {self.encode(element)}" for key, element in sorted(obj.items())) + " }"
43
44 else:
45 self.indentation_level += 1
46 output = [self.indent_str + f"{json.dumps(key)}: {self.encode(value)}" for key, value in sorted(obj.items(), key=self.sort_root_dict)]
47 self.indentation_level -= 1
48 return "{\n" + ",\n".join(output) + "\n" + self.indent_str + "}"
49 else:
50 return "{}"
51 else:
52 return super().encode(obj)
53
54 def _primitives_only(self, obj):
55 """Returns true if the object doesn't have any container type objects (list, tuple, dict).
56 """
57 if isinstance(obj, dict):
58 obj = obj.values()
59
60 return not any(isinstance(element, self.container_types) for element in obj)
61
62 def sort_root_dict(self, key):
63 """Forces layout to the back of the sort order.
64 """
65 key = key[0]
66
67 if self.indentation_level == 1:
68 if key == 'manufacturer':
69 return '10keyboard_name'
70
71 elif key == 'keyboard_name':
72 return '11keyboard_name'
73
74 elif key == 'maintainer':
75 return '12maintainer'
76
77 elif key in ('height', 'width'):
78 return '40' + str(key)
79
80 elif key == 'community_layouts':
81 return '97community_layouts'
82
83 elif key == 'layout_aliases':
84 return '98layout_aliases'
85
86 elif key == 'layouts':
87 return '99layouts'
88
89 else:
90 return '50' + str(key)
91
92 return key
93
94 @property
95 def indent_str(self):
96 return self.indentation_char * (self.indentation_level * self.indent)
diff --git a/message.mk b/message.mk
index 84b23c1ba..3240c041b 100644
--- a/message.mk
+++ b/message.mk
@@ -86,8 +86,7 @@ MSG_FILE_TOO_BIG = $(ERROR_COLOR)The firmware is too large!$(NO_COLOR) $(CURRENT
86MSG_FILE_TOO_SMALL = The firmware is too small! $(CURRENT_SIZE)/$(MAX_SIZE)\n 86MSG_FILE_TOO_SMALL = The firmware is too small! $(CURRENT_SIZE)/$(MAX_SIZE)\n
87MSG_FILE_JUST_RIGHT = The firmware size is fine - $(CURRENT_SIZE)/$(MAX_SIZE) ($(PERCENT_SIZE)%%, $(FREE_SIZE) bytes free)\n 87MSG_FILE_JUST_RIGHT = The firmware size is fine - $(CURRENT_SIZE)/$(MAX_SIZE) ($(PERCENT_SIZE)%%, $(FREE_SIZE) bytes free)\n
88MSG_FILE_NEAR_LIMIT = The firmware size is approaching the maximum - $(CURRENT_SIZE)/$(MAX_SIZE) ($(PERCENT_SIZE)%%, $(FREE_SIZE) bytes free)\n 88MSG_FILE_NEAR_LIMIT = The firmware size is approaching the maximum - $(CURRENT_SIZE)/$(MAX_SIZE) ($(PERCENT_SIZE)%%, $(FREE_SIZE) bytes free)\n
89MSG_PYTHON_MISSING = $(WARN_COLOR)WARNING:$(NO_COLOR)\n \ 89MSG_PYTHON_MISSING = $(ERROR_COLOR)ERROR:$(NO_COLOR) Can not run bin/qmk!\n\n\
90 Can not run bin/qmk! This tool will be required when the develop branch is merged on 2020 Aug 29.\n\n\
91 Please run $(BOLD)util/qmk_install.sh$(NO_COLOR) to install all the dependencies QMK requires.\n\n 90 Please run $(BOLD)util/qmk_install.sh$(NO_COLOR) to install all the dependencies QMK requires.\n\n
92MSG_FLASH_BOOTLOADER = $(WARN_COLOR)WARNING:$(NO_COLOR) This board's bootloader is not specified or is not supported by the \":flash\" target at this time.\n\n 91MSG_FLASH_BOOTLOADER = $(WARN_COLOR)WARNING:$(NO_COLOR) This board's bootloader is not specified or is not supported by the \":flash\" target at this time.\n\n
93MSG_FLASH_ARCH = $(WARN_COLOR)WARNING:$(NO_COLOR) This board's architecture is not supported by the \":flash\" target at this time.\n\n 92MSG_FLASH_ARCH = $(WARN_COLOR)WARNING:$(NO_COLOR) This board's architecture is not supported by the \":flash\" target at this time.\n\n