forked from mirrors/qmk_firmware
Kintwin controller for kinesis keyboard, split layout (#21614)
Co-authored-by: Ryan <fauxpark@gmail.com>
This commit is contained in:
parent
3da773dbdb
commit
6f3beae895
29 changed files with 566 additions and 23 deletions
|
@ -1,3 +1,6 @@
|
||||||
|
// Copyright 2023 QMK
|
||||||
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
#include "alvicstep.h"
|
#include "alvicstep.h"
|
||||||
|
|
||||||
// begin section origin https://github.com/alvicstep/tmk_keyboard
|
// begin section origin https://github.com/alvicstep/tmk_keyboard
|
||||||
|
|
|
@ -1,3 +1,6 @@
|
||||||
|
// Copyright 2023 QMK
|
||||||
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "quantum.h"
|
#include "quantum.h"
|
||||||
|
|
|
@ -1,3 +1,6 @@
|
||||||
|
// Copyright 2023 QMK
|
||||||
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
/* key matrix size */
|
/* key matrix size */
|
||||||
|
|
|
@ -6,6 +6,16 @@
|
||||||
"pid": "0x6060",
|
"pid": "0x6060",
|
||||||
"device_version": "0.0.1"
|
"device_version": "0.0.1"
|
||||||
},
|
},
|
||||||
|
"features": {
|
||||||
|
"bootmagic": true,
|
||||||
|
"console": false,
|
||||||
|
"command": false,
|
||||||
|
"mousekey": true,
|
||||||
|
"extrakey": true,
|
||||||
|
"nkro": true,
|
||||||
|
"audio": false,
|
||||||
|
"backlight": false
|
||||||
|
},
|
||||||
"processor": "at90usb1286",
|
"processor": "at90usb1286",
|
||||||
"bootloader": "halfkay",
|
"bootloader": "halfkay",
|
||||||
"layouts": {
|
"layouts": {
|
||||||
|
|
135
keyboards/kinesis/keymaps/alvicstep/keymap.c
Normal file
135
keyboards/kinesis/keymaps/alvicstep/keymap.c
Normal file
|
@ -0,0 +1,135 @@
|
||||||
|
// Copyright 2023 Alex Stepanov (@alvicstep)
|
||||||
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
|
#include QMK_KEYBOARD_H
|
||||||
|
|
||||||
|
enum layer_names {
|
||||||
|
_BASE, // default layer
|
||||||
|
_KEYPAD, // arrow keys, shifted symbols, HOME, END, PGUP, PGDN, FKeys, CTRL(TAB)
|
||||||
|
_NUMPAD // numpad keys
|
||||||
|
};
|
||||||
|
|
||||||
|
/* ,------------------------------------------------------------------------------------------------------------------------.
|
||||||
|
* | Esc | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | | F9 | F10 | F11 | F12 |PSCR|SLCK|PAUS|KPAD|BOOT|
|
||||||
|
* |--------+------+------+------+-------+------+--------------------------------+------+------+------+------+------+--------|
|
||||||
|
* | -_ | 1! | 2@ | 3# | 4$ | 5% | | 6^ | 7& | 8* | 9( | 0) | =+ |
|
||||||
|
* |--------+------+------+------+-------+------| +------+------+------+------+------+--------|
|
||||||
|
* | Tab | Q | W | E | R | T | | Y | U | I | O | P | \| |
|
||||||
|
* |--------+------+------+------+-------+------| |------+------+------+------+------+--------|
|
||||||
|
* | Del | A | S | D | F | G | | H | J | K | L | ;: | '" |
|
||||||
|
* |--------+------+------+------+-------+------| |------+------+------+------+------+--------|
|
||||||
|
* | Shift | Z | X | C | V | B | | N | M | ,. | .> | /? |Sht/Ent |
|
||||||
|
* `--------+------+------+------+-------+------- `------+------+------+------+------+--------'
|
||||||
|
* | `~ | Gui | Esc |MO(Num)| | [{ | ]} | | |
|
||||||
|
* `----------------------------' `---------------------------'
|
||||||
|
* ,---------------. ,---------------.
|
||||||
|
* |Alt+Tab| Alt | | Alt |TO(Num)|
|
||||||
|
* ,------|------ |-------| |-------+-------+------.
|
||||||
|
* | | | Shift | | Shift | | |
|
||||||
|
* | BkSp | KPAD |-------| |------ | KPAD | Space|
|
||||||
|
* | | | Ctrl | | Ctrl | | |
|
||||||
|
* `----------------------' `----------------------'
|
||||||
|
*/
|
||||||
|
|
||||||
|
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
|
||||||
|
[_BASE] = LAYOUT(
|
||||||
|
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_SCRL,KC_PAUS,TO(_KEYPAD),QK_BOOT,
|
||||||
|
KC_MINS,KC_1,KC_2,KC_3,KC_4,KC_5, KC_6,KC_7,KC_8,KC_9,KC_0,KC_EQL,
|
||||||
|
KC_TAB,KC_Q,KC_W,KC_E,KC_R,KC_T, KC_Y,KC_U,KC_I,KC_O,KC_P,KC_BSLS,
|
||||||
|
KC_DEL,KC_A,KC_S,KC_D,KC_F,KC_G, KC_H,KC_J,KC_K,KC_L,KC_SCLN,KC_QUOT,
|
||||||
|
KC_LSFT,KC_Z,KC_X,KC_C,KC_V,KC_B, KC_N,KC_M,KC_COMM,KC_DOT,KC_SLSH,SC_SENT,
|
||||||
|
KC_GRV,KC_LGUI,KC_ESC,MO(_NUMPAD), KC_LBRC,KC_RBRC,KC_NO,KC_NO,
|
||||||
|
LALT(KC_TAB),KC_LALT, KC_RALT,TO(_NUMPAD),
|
||||||
|
KC_LSFT, KC_RSFT,
|
||||||
|
KC_BSPC,MO(_KEYPAD),KC_LCTL, KC_RCTL,MO(_KEYPAD),KC_SPC
|
||||||
|
),
|
||||||
|
/* ,------------------------------------------------------------------------------------------------------------------------.
|
||||||
|
* | | | | | | | | | | | | | | | | | TO(BASE) | |
|
||||||
|
* |--------+------+------+------+------+------+---------------------------------+------+------+------+------+------+--------|
|
||||||
|
* | _ | ! | @ | # | $ | % | | ^ | & | * | ( | ) | + |
|
||||||
|
* |--------+------+------+------+------+------| |------+------+------+------+------+--------|
|
||||||
|
* | | F1 | F2 | F3 | F4 | F5 | | | Home | Up | End | | | |
|
||||||
|
* |--------+------+------+------+------+------| |------+------+------+------+------+--------|
|
||||||
|
* | | F6 | F7 | F8 | F9 | F10 | | Pgup | Lft | Dwn | Rgt | : | " |
|
||||||
|
* |--------+------+------+------+------+------| |------+------+------+------+------+--------|
|
||||||
|
* | CapsLk | | | | F11 | F12 | | Pgdn | | < | > | ? | |
|
||||||
|
* `--------+------+------+------+------+------' `------+------+------+------+------+--------'
|
||||||
|
* | ~ | INS | | | | { | } | | |
|
||||||
|
* `---------------------------' `---------------------------'
|
||||||
|
* ,--------------. ,--------------------.
|
||||||
|
* |Ctl+Tab| | | | | |
|
||||||
|
* ,------|------ |------| |------+------+------.
|
||||||
|
* | | |Shift | |Shift | | |
|
||||||
|
* | | |------| |------| | |
|
||||||
|
* | | | Ctrl | | Ctrl | | |
|
||||||
|
* `-------------- ------' `--------------------'
|
||||||
|
*/
|
||||||
|
[_KEYPAD] = LAYOUT(
|
||||||
|
KC_NO,KC_NO,KC_NO,KC_NO,KC_NO,KC_NO,KC_NO,KC_NO,KC_NO, KC_NO,KC_NO,KC_NO,KC_NO,KC_NO,KC_NO,KC_NO,TO(_BASE),KC_NO,
|
||||||
|
KC_UNDS,KC_EXLM,KC_AT,KC_HASH,KC_DLR,KC_PERC, KC_CIRC,KC_AMPR,KC_ASTR,KC_LPRN,KC_RPRN,KC_PLUS,
|
||||||
|
KC_NO,KC_F1,KC_F2,KC_F3,KC_F4,KC_F5, KC_NO,KC_HOME,KC_UP,KC_END,KC_NO,KC_PIPE,
|
||||||
|
KC_CAPS,KC_F6,KC_F7,KC_F8,KC_F9,KC_F10, KC_PGUP,KC_LEFT,KC_DOWN,KC_RGHT,KC_COLN,KC_DQUO,
|
||||||
|
KC_NO,KC_NO,KC_NO,KC_NO,KC_F11,KC_F12, KC_PGDN,KC_NO,KC_LT,KC_GT,KC_QUES,KC_NO,
|
||||||
|
KC_TILD,KC_INS,KC_NO,KC_NO, KC_LCBR,KC_RCBR,KC_NO,KC_NO,
|
||||||
|
LCTL(KC_TAB),KC_NO, KC_NO,KC_NO,
|
||||||
|
KC_LSFT, KC_RSFT,
|
||||||
|
KC_NO,KC_NO,KC_LCTL, KC_RCTL,KC_NO,KC_NO
|
||||||
|
),
|
||||||
|
/*,--------+------+------+------+------+------+ +------+------+------+------+------+--------.
|
||||||
|
* | | | | | | | | | Base | = | / | * | |
|
||||||
|
* |--------+------+------+------+------+------| |------+------+------+------+------+--------|
|
||||||
|
* | | | | | | | | | 7 | 8 | 9 | - | |
|
||||||
|
* |--------+------+------+------+------+------| |------+------+------+------+------+--------|
|
||||||
|
* | Del | | | | | | | | 4 | 5 | 6 | + | |
|
||||||
|
* |--------+------+------+------+------+------| |------+------+------+------+------+--------|
|
||||||
|
* | BkSp | | | | | | | | 1 | 2 | 3 |Enter | Enter |
|
||||||
|
* `--------+------+------+------+------+------' `------+------+------+------+------+--------'
|
||||||
|
* | | | | | | . |Enter | | |
|
||||||
|
* `---------------------------' `---------------------------'
|
||||||
|
* ,-------------. ,-------------.
|
||||||
|
* | | | | | Base |
|
||||||
|
* ,------|------|------| |------+------+------.
|
||||||
|
* | | | | | | | |
|
||||||
|
* | BkSp | |------| |------| | 0 |
|
||||||
|
* | | | | | | | |
|
||||||
|
* `--------------------' `--------------------'
|
||||||
|
*/
|
||||||
|
|
||||||
|
[_NUMPAD] = LAYOUT(
|
||||||
|
KC_NO,KC_NO,KC_NO,KC_NO,KC_NO,KC_NO,KC_NO,KC_NO,KC_NO, KC_NO,KC_NO,KC_NO,KC_NO,KC_NO,KC_NO,KC_NO,KC_NO,KC_NO,
|
||||||
|
KC_NO,KC_NO,KC_NO,KC_NO,KC_NO,KC_NO, KC_NO,TO(_BASE),KC_EQL,KC_SLSH,KC_ASTR,KC_NO,
|
||||||
|
KC_NO,KC_NO,KC_NO,KC_NO,KC_NO,KC_NO, KC_NO,KC_7,KC_8,KC_9,KC_MINS,KC_NO,
|
||||||
|
KC_DEL,KC_NO,KC_NO,KC_NO,KC_NO,KC_NO, KC_NO,KC_4,KC_5,KC_6,KC_PLUS,KC_NO,
|
||||||
|
KC_BSPC,KC_NO,KC_NO,KC_NO,KC_NO,KC_NO, KC_NO,KC_1,KC_2,KC_3,KC_ENT,KC_ENT,
|
||||||
|
KC_NO,KC_NO,KC_NO,KC_NO, KC_DOT,KC_ENT,KC_NO,KC_NO,
|
||||||
|
KC_NO,KC_NO, KC_NO,TO(_BASE),
|
||||||
|
KC_NO, KC_NO,
|
||||||
|
KC_BSPC,KC_NO,KC_NO, KC_NO,KC_NO,KC_0
|
||||||
|
)
|
||||||
|
};
|
||||||
|
|
||||||
|
layer_state_t layer_state_set_user(layer_state_t state) {
|
||||||
|
//set LEDs which are triggered by a layer change
|
||||||
|
#ifdef LED_COMPOSE_PIN
|
||||||
|
writePin(LED_COMPOSE_PIN, !layer_state_cmp(state, _KEYPAD));
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef LED_NUM_LOCK_PIN
|
||||||
|
writePin(LED_NUM_LOCK_PIN, !layer_state_cmp(state, _NUMPAD));
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return state;
|
||||||
|
};
|
||||||
|
|
||||||
|
bool led_update_user(led_t led_state) {
|
||||||
|
#ifdef LED_CAPS_LOCK_PIN
|
||||||
|
writePin(LED_CAPS_LOCK_PIN, !led_state.caps_lock);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef LED_SCROLL_LOCK_PIN
|
||||||
|
writePin(LED_SCROLL_LOCK_PIN, !led_state.scroll_lock);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//disable default processing of LEDs
|
||||||
|
return false;
|
||||||
|
}
|
105
keyboards/kinesis/keymaps/alvicstep/readme.md
Normal file
105
keyboards/kinesis/keymaps/alvicstep/readme.md
Normal file
|
@ -0,0 +1,105 @@
|
||||||
|
## Custom Layout
|
||||||
|
Kinesis Contoured family of keyboards belong to a relatively small group of keyboards that utilize thumb clusters. The keycap profiles of thumb cluster keys make it easy to press multiple keys simultaneously by a thumb finger. Co-locating CTRL, SHIFT and KEYPAD modifiers in the thumb cluster gives truly unique capabilities to these keyboards.
|
||||||
|
|
||||||
|
### "alvicstep" Layout
|
||||||
|
The **alvicstep** layout is optimized for software development on a Windows machine. It is a result of many years of daily usage. It is a great starting point for your own design.
|
||||||
|
|
||||||
|
#### Layout Features
|
||||||
|
- 3 layers: default layer, keypad layer, numpad layer
|
||||||
|
- keypad layer allows for 2 finger operation using **arrow** keys together with
|
||||||
|
- **CTRL** and/or **SHIFT** modifiers OR
|
||||||
|
- **HOME/END** keys OR
|
||||||
|
- **PAGEUP/PAGEDOWN** keys.
|
||||||
|
- two finger operations can be achieved by holding up to 3 modifier keys (KEYPAD/SHIFT/CTRL) with a thumb finger and using index/middle/ring finger by pressing keywell keys. For example, you can fully control caret position and text selection of:
|
||||||
|
- each letter
|
||||||
|
- each word
|
||||||
|
- from a current caret position to the beginning of the line
|
||||||
|
- from a current caret position to the end of the line
|
||||||
|
- multiple lines
|
||||||
|
- multiple pages
|
||||||
|
- with little practice you will be able to string together different key combinations. For example, executing `KEYPAD + O` and then `KEYPAD + SHIFT + U` selects the whole line of text with barely any finger movement. The best part is that it works in any text editor!
|
||||||
|
- keypad layer allows accessing **F1-F12** and **ESC** keys by moving only a single finger away from the home row, making it very fast and convenient
|
||||||
|
- **KEYPAD** key can be used to access US ANSI Shifted Symbols instead of pressing a SHIFT key. This gives you two advantages: it makes KEYPAD key a "go to" key which is used in almost all operations unrelated to typing of letters. To understand the second advantage, compare pressing `SHIFT + 0` and `KEYPAD + 0` using the right hand
|
||||||
|
- **NUMPAD** "momentary" modifier key can be used to quickly switch to a numeric pad while typing alphanumeric strings. In a stock Kinesis firmware you would have to switch to KEYPAD layer and then press NUMLOCK key which makes it unusable for this task
|
||||||
|
- **NUMPAD** key in the right thumb cluster can be used to switch to a numeric pad for long numeric sequences
|
||||||
|
|
||||||
|
#### Layout Layers
|
||||||
|
|
||||||
|
![](https://i.imgur.com/86LCI3zh.jpg)
|
||||||
|
![](https://i.imgur.com/Gv4WBw7h.jpg)
|
||||||
|
![](https://i.imgur.com/gKXMUI2h.jpg)
|
||||||
|
|
||||||
|
#### Notes
|
||||||
|
- MO(1) - switch to **KEYPAD** layer while key is being pressed
|
||||||
|
- MO(2) - switch to **NUMPAD** layer while key is being pressed
|
||||||
|
- TO(0) - switch to **BASE** layer
|
||||||
|
- TO(2) - switch to **NUMPAD** layer
|
||||||
|
- Rsft(Enter) - acts as an ENTER key when pressed and released. Acts as a SHIFT modifier in combination with other keys
|
||||||
|
- Bt - enter bootloader mode
|
||||||
|
- Alt(Tab) - toggle between last two active applications
|
||||||
|
- Ctrl(Tab) - toggle between last two active tabs
|
||||||
|
|
||||||
|
|
||||||
|
### Differences From Stock
|
||||||
|
- **{}[]** keys are moved to the left side of the keywell to be easily accessible
|
||||||
|
- **-** and **+** keys are switched
|
||||||
|
- **CAPS LOCK** key is moved to **KEYPAD** layer and is mapped to **DELETE** on **BASE** layer
|
||||||
|
|
||||||
|
### Shortcuts
|
||||||
|
|
||||||
|
|
||||||
|
|Shortcut | Control Caret |
|
||||||
|
|---------------------|---------------------------------------|
|
||||||
|
|`KEYPAD + J` | move caret one character left |
|
||||||
|
|`KEYPAD + L` | move caret one character right |
|
||||||
|
|`KEYPAD + I` | move caret one line up |
|
||||||
|
|`KEYPAD + K` | move caret one line down |
|
||||||
|
|`KEYPAD + CTRL + J` | move caret one word to the left |
|
||||||
|
|`KEYPAD + CTRL + L` | move caret one word to the right |
|
||||||
|
|`KEYPAD + U` | move caret to the start of the line |
|
||||||
|
|`KEYPAD + O` | move caret to the end of the line |
|
||||||
|
|`KEYPAD + H` | move caret one page up |
|
||||||
|
|`KEYPAD + N` | move caret one page down |
|
||||||
|
|
||||||
|
|
||||||
|
|Shortcut | Scroll Lock |
|
||||||
|
|---------------------|---------------------------------------|
|
||||||
|
|`KEYPAD + CTRL + I` | scroll page up |
|
||||||
|
|`KEYPAD + CTRL + K` | scroll page down |
|
||||||
|
|
||||||
|
|
||||||
|
|Shortcut | Select Text |
|
||||||
|
|-----------------------------|-------------------------------|
|
||||||
|
|`KEYPAD + CTRL + SHIFT + J` | select one word to the left |
|
||||||
|
|`KEYPAD + CTRL + SHIFT + L` | select one word to the right |
|
||||||
|
|`KEYPAD + CTRL + SHIFT + I` | select one line up |
|
||||||
|
|`KEYPAD + CTRL + SHIFT + K` | select one line down |
|
||||||
|
|`KEYPAD + SHIFT + H` | select one page up |
|
||||||
|
|`KEYPAD + SHIFT + N` | select one page down |
|
||||||
|
|`KEYPAD + CTRL + SHIFT + U` | select from beginning of the file up to the caret position |
|
||||||
|
|`KEYPAD + CTRL + SHIFT + O` | select from caret position to the end of the file |
|
||||||
|
|
||||||
|
|
||||||
|
|Shortcut | US ANSI Shifted Symbols |
|
||||||
|
|---------------------|---------------------------------------|
|
||||||
|
|`KEYPAD + -` | _ |
|
||||||
|
|`KEYPAD + 1` | ! |
|
||||||
|
|`KEYPAD + 2` | @ |
|
||||||
|
|`KEYPAD + 3` | # |
|
||||||
|
|`KEYPAD + 4` | $ |
|
||||||
|
|`KEYPAD + 5` | % |
|
||||||
|
|`KEYPAD + 6` | ^ |
|
||||||
|
|`KEYPAD + 7` | & |
|
||||||
|
|`KEYPAD + 8` | * |
|
||||||
|
|`KEYPAD + 9` | ( |
|
||||||
|
|`KEYPAD + 0` | ) |
|
||||||
|
|`KEYPAD + =` | + |
|
||||||
|
|`KEYPAD + \` | \| |
|
||||||
|
|`KEYPAD + '` | " |
|
||||||
|
|`KEYPAD + ;` | : |
|
||||||
|
|`KEYPAD + /` | ? |
|
||||||
|
|`KEYPAD + [` | { |
|
||||||
|
|`KEYPAD + ]` | } |
|
||||||
|
|`KEYPAD + ,` | < |
|
||||||
|
|`KEYPAD + .` | > |
|
||||||
|
|`KEYPAD + BACKTICK` | ~ |
|
|
@ -1,3 +1,6 @@
|
||||||
|
// Copyright 2023 QMK
|
||||||
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
#include QMK_KEYBOARD_H
|
#include QMK_KEYBOARD_H
|
||||||
|
|
||||||
#define QWERTY 0 // Base qwerty
|
#define QWERTY 0 // Base qwerty
|
||||||
|
|
|
@ -1,3 +1,6 @@
|
||||||
|
// Copyright 2023 QMK
|
||||||
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
#include QMK_KEYBOARD_H
|
#include QMK_KEYBOARD_H
|
||||||
|
|
||||||
#define _DVORAK 0 // Base Dvorak layer
|
#define _DVORAK 0 // Base Dvorak layer
|
||||||
|
|
|
@ -1,3 +1,6 @@
|
||||||
|
// Copyright 2023 QMK
|
||||||
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
#include QMK_KEYBOARD_H
|
#include QMK_KEYBOARD_H
|
||||||
|
|
||||||
#define DVORAK_MAC_MODE 0 // Base Dvorak in Kinesis's Mac Mode with (Cmd, Option, Ctrl, Cmd) thumbkeys
|
#define DVORAK_MAC_MODE 0 // Base Dvorak in Kinesis's Mac Mode with (Cmd, Option, Ctrl, Cmd) thumbkeys
|
||||||
|
|
|
@ -1,3 +1,6 @@
|
||||||
|
// Copyright 2023 QMK
|
||||||
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
#include QMK_KEYBOARD_H
|
#include QMK_KEYBOARD_H
|
||||||
|
|
||||||
extern keymap_config_t keymap_config;
|
extern keymap_config_t keymap_config;
|
||||||
|
|
|
@ -1,3 +1,6 @@
|
||||||
|
// Copyright 2023 QMK
|
||||||
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
#include QMK_KEYBOARD_H
|
#include QMK_KEYBOARD_H
|
||||||
|
|
||||||
extern keymap_config_t keymap_config;
|
extern keymap_config_t keymap_config;
|
||||||
|
|
|
@ -1,3 +1,6 @@
|
||||||
|
// Copyright 2023 QMK
|
||||||
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
#include QMK_KEYBOARD_H
|
#include QMK_KEYBOARD_H
|
||||||
#include "keymap_german.h"
|
#include "keymap_german.h"
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,6 @@
|
||||||
|
// Copyright 2023 QMK
|
||||||
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
#include QMK_KEYBOARD_H
|
#include QMK_KEYBOARD_H
|
||||||
|
|
||||||
enum layer_names {
|
enum layer_names {
|
||||||
|
|
|
@ -7,6 +7,16 @@
|
||||||
"device_version": "0.0.2",
|
"device_version": "0.0.2",
|
||||||
"max_power": 100
|
"max_power": 100
|
||||||
},
|
},
|
||||||
|
"features": {
|
||||||
|
"bootmagic": true,
|
||||||
|
"console": false,
|
||||||
|
"command": false,
|
||||||
|
"mousekey": true,
|
||||||
|
"extrakey": true,
|
||||||
|
"nkro": true,
|
||||||
|
"audio": false,
|
||||||
|
"backlight": false
|
||||||
|
},
|
||||||
"build": {
|
"build": {
|
||||||
"debounce_type": "sym_eager_pk"
|
"debounce_type": "sym_eager_pk"
|
||||||
},
|
},
|
||||||
|
|
|
@ -7,6 +7,16 @@
|
||||||
"device_version": "0.0.1",
|
"device_version": "0.0.1",
|
||||||
"max_power": 100
|
"max_power": 100
|
||||||
},
|
},
|
||||||
|
"features": {
|
||||||
|
"bootmagic": true,
|
||||||
|
"console": false,
|
||||||
|
"command": false,
|
||||||
|
"mousekey": true,
|
||||||
|
"extrakey": true,
|
||||||
|
"nkro": true,
|
||||||
|
"audio": false,
|
||||||
|
"backlight": false
|
||||||
|
},
|
||||||
"build": {
|
"build": {
|
||||||
"debounce_type": "sym_eager_pk"
|
"debounce_type": "sym_eager_pk"
|
||||||
},
|
},
|
||||||
|
|
|
@ -7,6 +7,16 @@
|
||||||
"device_version": "0.0.1",
|
"device_version": "0.0.1",
|
||||||
"max_power": 100
|
"max_power": 100
|
||||||
},
|
},
|
||||||
|
"features": {
|
||||||
|
"bootmagic": true,
|
||||||
|
"console": false,
|
||||||
|
"command": false,
|
||||||
|
"mousekey": true,
|
||||||
|
"extrakey": true,
|
||||||
|
"nkro": true,
|
||||||
|
"audio": false,
|
||||||
|
"backlight": false
|
||||||
|
},
|
||||||
"build": {
|
"build": {
|
||||||
"debounce_type": "sym_eager_pk"
|
"debounce_type": "sym_eager_pk"
|
||||||
},
|
},
|
||||||
|
|
|
@ -7,6 +7,16 @@
|
||||||
"device_version": "0.0.1",
|
"device_version": "0.0.1",
|
||||||
"max_power": 50
|
"max_power": 50
|
||||||
},
|
},
|
||||||
|
"features": {
|
||||||
|
"bootmagic": true,
|
||||||
|
"console": false,
|
||||||
|
"command": false,
|
||||||
|
"mousekey": true,
|
||||||
|
"extrakey": true,
|
||||||
|
"nkro": true,
|
||||||
|
"audio": false,
|
||||||
|
"backlight": false
|
||||||
|
},
|
||||||
"build": {
|
"build": {
|
||||||
"debounce_type": "sym_eager_pk"
|
"debounce_type": "sym_eager_pk"
|
||||||
},
|
},
|
||||||
|
|
146
keyboards/kinesis/kintwin/info.json
Normal file
146
keyboards/kinesis/kintwin/info.json
Normal file
|
@ -0,0 +1,146 @@
|
||||||
|
{
|
||||||
|
"development_board": "blackpill_f401",
|
||||||
|
"keyboard_name": "Kinesis",
|
||||||
|
"url": "https://github.com/alvicstep/kintwin",
|
||||||
|
"manufacturer": "https://github.com/alvicstep/kintwin",
|
||||||
|
"maintainer": "Alex Stepanov",
|
||||||
|
"usb": {
|
||||||
|
"device_version": "0.0.1",
|
||||||
|
"vid": "0x4B53",
|
||||||
|
"pid": "0x0001",
|
||||||
|
"shared_endpoint": {
|
||||||
|
"keyboard": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"features": {
|
||||||
|
"bootmagic": true,
|
||||||
|
"console": false,
|
||||||
|
"command": false,
|
||||||
|
"mousekey": true,
|
||||||
|
"extrakey": true,
|
||||||
|
"nkro": true,
|
||||||
|
"audio": false,
|
||||||
|
"backlight": false
|
||||||
|
},
|
||||||
|
"matrix_pins": {
|
||||||
|
"rows": ["A0", "A1", "A2", "A3", "A4", "A5", "A6"],
|
||||||
|
"cols": ["A7", "B0", "B1", "B10", "B9", "B8", "B7", "B14", "B13", "B12", "C14", "C15", "B15", "B6", "B5"]
|
||||||
|
},
|
||||||
|
"diode_direction": "ROW2COL",
|
||||||
|
"indicators": {
|
||||||
|
"caps_lock": "A15",
|
||||||
|
"scroll_lock": "B3",
|
||||||
|
"num_lock": "B4",
|
||||||
|
"compose": "C13",
|
||||||
|
"on_state": 0
|
||||||
|
},
|
||||||
|
"layouts": {
|
||||||
|
"LAYOUT": {
|
||||||
|
"layout": [
|
||||||
|
{"matrix": [0, 12], "x": 0, "y": 0, "w": 0.69, "h": 0.85},
|
||||||
|
{"matrix": [0, 13], "x": 0.7, "y": 0, "w": 0.69, "h": 0.85},
|
||||||
|
{"matrix": [0, 14], "x": 1.39, "y": 0, "w": 0.69, "h": 0.85},
|
||||||
|
{"matrix": [1, 12], "x": 2.09, "y": 0, "w": 0.69, "h": 0.85},
|
||||||
|
{"matrix": [1, 13], "x": 2.78, "y": 0, "w": 0.69, "h": 0.85},
|
||||||
|
{"matrix": [1, 14], "x": 3.48, "y": 0, "w": 0.69, "h": 0.85},
|
||||||
|
{"matrix": [2, 12], "x": 4.17, "y": 0, "w": 0.69, "h": 0.85},
|
||||||
|
{"matrix": [2, 13], "x": 4.87, "y": 0, "w": 0.69, "h": 0.85},
|
||||||
|
{"matrix": [2, 14], "x": 5.56, "y": 0, "w": 0.69, "h": 0.85},
|
||||||
|
|
||||||
|
{"matrix": [3, 12], "x": 9.25, "y": 0, "w": 0.69, "h": 0.85},
|
||||||
|
{"matrix": [3, 13], "x": 9.95, "y": 0, "w": 0.69, "h": 0.85},
|
||||||
|
{"matrix": [3, 14], "x": 10.64, "y": 0, "w": 0.69, "h": 0.85},
|
||||||
|
{"matrix": [4, 12], "x": 11.34, "y": 0, "w": 0.69, "h": 0.85},
|
||||||
|
{"matrix": [4, 13], "x": 12.03, "y": 0, "w": 0.69, "h": 0.85},
|
||||||
|
{"matrix": [4, 14], "x": 12.73, "y": 0, "w": 0.69, "h": 0.85},
|
||||||
|
{"matrix": [5, 12], "x": 13.42, "y": 0, "w": 0.69, "h": 0.85},
|
||||||
|
{"matrix": [5, 14], "x": 14.12, "y": 0, "w": 0.69, "h": 0.85},
|
||||||
|
{"matrix": [5, 13], "x": 14.81, "y": 0, "w": 0.69, "h": 0.85},
|
||||||
|
|
||||||
|
{"matrix": [0, 0], "x": 0, "y": 1.25, "w": 1.25},
|
||||||
|
{"matrix": [0, 1], "x": 1.25, "y": 1.25},
|
||||||
|
{"matrix": [0, 2], "x": 2.25, "y": 1},
|
||||||
|
{"matrix": [0, 3], "x": 3.25, "y": 1},
|
||||||
|
{"matrix": [0, 4], "x": 4.25, "y": 1},
|
||||||
|
{"matrix": [0, 5], "x": 5.25, "y": 1},
|
||||||
|
|
||||||
|
{"matrix": [0, 6], "x": 9.25, "y": 1},
|
||||||
|
{"matrix": [0, 7], "x": 10.25, "y": 1},
|
||||||
|
{"matrix": [0, 8], "x": 11.25, "y": 1},
|
||||||
|
{"matrix": [0, 9], "x": 12.25, "y": 1},
|
||||||
|
{"matrix": [0, 10], "x": 13.25, "y": 1.25},
|
||||||
|
{"matrix": [0, 11], "x": 14.25, "y": 1.25, "w": 1.25},
|
||||||
|
|
||||||
|
{"matrix": [1, 0], "x": 0, "y": 2.25, "w": 1.25},
|
||||||
|
{"matrix": [1, 1], "x": 1.25, "y": 2.25},
|
||||||
|
{"matrix": [1, 2], "x": 2.25, "y": 2},
|
||||||
|
{"matrix": [1, 3], "x": 3.25, "y": 2},
|
||||||
|
{"matrix": [1, 4], "x": 4.25, "y": 2},
|
||||||
|
{"matrix": [1, 5], "x": 5.25, "y": 2},
|
||||||
|
|
||||||
|
{"matrix": [1, 6], "x": 11.25, "y": 2.25},
|
||||||
|
{"matrix": [1, 7], "x": 12.25, "y": 2.25},
|
||||||
|
{"matrix": [1, 8], "x": 13.25, "y": 2.25},
|
||||||
|
{"matrix": [1, 9], "x": 14.25, "y": 2.25},
|
||||||
|
{"matrix": [1, 10], "x": 15.25, "y": 2.25},
|
||||||
|
{"matrix": [1, 11], "x": 16.25, "y": 2.25, "w": 1.25},
|
||||||
|
|
||||||
|
{"matrix": [2, 0], "x": 0, "y": 3.25, "w": 1.25},
|
||||||
|
{"matrix": [2, 1], "x": 1.25, "y": 3.25},
|
||||||
|
{"matrix": [2, 2], "x": 2.25, "y": 3},
|
||||||
|
{"matrix": [2, 3], "x": 3.25, "y": 3},
|
||||||
|
{"matrix": [2, 4], "x": 4.25, "y": 3},
|
||||||
|
{"matrix": [2, 5], "x": 5.25, "y": 3},
|
||||||
|
|
||||||
|
{"matrix": [2, 6], "x": 9.25, "y": 3},
|
||||||
|
{"matrix": [2, 7], "x": 10.25, "y": 3},
|
||||||
|
{"matrix": [2, 8], "x": 11.25, "y": 3},
|
||||||
|
{"matrix": [2, 9], "x": 12.25, "y": 3},
|
||||||
|
{"matrix": [2, 10], "x": 13.25, "y": 3.25},
|
||||||
|
{"matrix": [2, 11], "x": 14.25, "y": 3.25, "w": 1.25},
|
||||||
|
|
||||||
|
{"matrix": [3, 0], "x": 0, "y": 4.25, "w": 1.25},
|
||||||
|
{"matrix": [3, 1], "x": 1.25, "y": 4.25},
|
||||||
|
{"matrix": [3, 2], "x": 2.25, "y": 4},
|
||||||
|
{"matrix": [3, 3], "x": 3.25, "y": 4},
|
||||||
|
{"matrix": [3, 4], "x": 4.25, "y": 4},
|
||||||
|
{"matrix": [3, 5], "x": 5.25, "y": 4},
|
||||||
|
|
||||||
|
{"matrix": [3, 6], "x": 9.25, "y": 4},
|
||||||
|
{"matrix": [3, 7], "x": 10.25, "y": 4},
|
||||||
|
{"matrix": [3, 8], "x": 11.25, "y": 4},
|
||||||
|
{"matrix": [3, 9], "x": 12.25, "y": 4},
|
||||||
|
{"matrix": [3, 10], "x": 13.25, "y": 4.25},
|
||||||
|
{"matrix": [3, 11], "x": 14.25, "y": 4.25, "w": 1.25},
|
||||||
|
|
||||||
|
{"matrix": [4, 1], "x": 1.25, "y": 5.25},
|
||||||
|
{"matrix": [4, 2], "x": 2.25, "y": 5},
|
||||||
|
{"matrix": [4, 3], "x": 3.25, "y": 5},
|
||||||
|
{"matrix": [4, 5], "x": 4.25, "y": 5},
|
||||||
|
|
||||||
|
{"matrix": [4, 6], "x": 10.25, "y": 5},
|
||||||
|
{"matrix": [4, 8], "x": 11.25, "y": 5},
|
||||||
|
{"matrix": [4, 9], "x": 12.25, "y": 5},
|
||||||
|
{"matrix": [4, 10], "x": 13.25, "y": 5.25},
|
||||||
|
|
||||||
|
{"matrix": [6, 5], "x": 5.25, "y": 6},
|
||||||
|
{"matrix": [5, 5], "x": 6.25, "y": 6},
|
||||||
|
|
||||||
|
{"matrix": [6, 9], "x": 8.25, "y": 6},
|
||||||
|
{"matrix": [5, 8], "x": 9.25, "y": 6},
|
||||||
|
|
||||||
|
{"matrix": [5, 3], "x": 6.25, "y": 7},
|
||||||
|
|
||||||
|
{"matrix": [6, 8], "x": 8.25, "y": 7},
|
||||||
|
|
||||||
|
{"matrix": [6, 3], "x": 4.25, "y": 7, "h": 2},
|
||||||
|
{"matrix": [6, 4], "x": 5.25, "y": 7, "h": 2},
|
||||||
|
{"matrix": [5, 2], "x": 6.25, "y": 8},
|
||||||
|
|
||||||
|
{"matrix": [6, 6], "x": 8.25, "y": 8},
|
||||||
|
{"matrix": [5, 7], "x": 9.25, "y": 7, "h": 2},
|
||||||
|
{"matrix": [5, 6], "x": 10.25, "y": 7, "h": 2}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
29
keyboards/kinesis/kintwin/kintwin.c
Normal file
29
keyboards/kinesis/kintwin/kintwin.c
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
// Copyright 2023 Alex Stepanov (@alvicstep)
|
||||||
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
|
#include "quantum.h"
|
||||||
|
|
||||||
|
void matrix_init_kb(void) {
|
||||||
|
|
||||||
|
uint8_t led_delay_ms = 80;
|
||||||
|
|
||||||
|
/* LED pins setup */
|
||||||
|
setPinOutput(LED_CAPS_LOCK_PIN);
|
||||||
|
writePinLow(LED_CAPS_LOCK_PIN);
|
||||||
|
|
||||||
|
wait_ms(led_delay_ms);
|
||||||
|
setPinOutput(LED_NUM_LOCK_PIN);
|
||||||
|
writePinLow(LED_NUM_LOCK_PIN);
|
||||||
|
wait_ms(led_delay_ms);
|
||||||
|
|
||||||
|
setPinOutput(LED_SCROLL_LOCK_PIN);
|
||||||
|
writePinLow(LED_SCROLL_LOCK_PIN);
|
||||||
|
wait_ms(led_delay_ms);
|
||||||
|
|
||||||
|
setPinOutput(LED_COMPOSE_PIN);
|
||||||
|
writePinLow(LED_COMPOSE_PIN);
|
||||||
|
wait_ms(led_delay_ms);
|
||||||
|
writePinHigh(LED_COMPOSE_PIN);
|
||||||
|
|
||||||
|
matrix_init_user();
|
||||||
|
}
|
32
keyboards/kinesis/kintwin/readme.md
Normal file
32
keyboards/kinesis/kintwin/readme.md
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
# KinTwin
|
||||||
|
[KinTwin](https://github.com/alvicstep/kintwin) is a drop-in replacement of a controller and thumb cluster PCB boards for [Kinesis Contoured keyboards](https://deskthority.net/wiki/Kinesis_Contoured). The controller board is a fork of [KinBP](https://github.com/DmNosachev/KinBP).
|
||||||
|
|
||||||
|
### Keyboard
|
||||||
|
![Kinesis keyboard](https://i.imgur.com/gmuYlUyh.jpg)
|
||||||
|
|
||||||
|
### Controller
|
||||||
|
![KinTwin controller](https://i.imgur.com/vu6pexwh.jpg)
|
||||||
|
|
||||||
|
The main difference between KinTwin and KinT controllers is that the former utilizes **Blackpill STM32F401** development board and the latter utilizes **Teensy** development boards.
|
||||||
|
|
||||||
|
* Keyboard Maintainer: Alex Stepanov
|
||||||
|
* Hardware Supported: KinTwin PCB, WeAct Black Pill STM32F401 micro controller
|
||||||
|
* Hardware Availability: [Open Source (CC-BY-SA)](https://github.com/alvicstep/kintwin)
|
||||||
|
|
||||||
|
Make example for this keyboard (after setting up your build environment):
|
||||||
|
|
||||||
|
make kinesis/kintwin:default
|
||||||
|
|
||||||
|
Flashing example for this keyboard:
|
||||||
|
|
||||||
|
make kinesis/kintwin:default:flash
|
||||||
|
|
||||||
|
See 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).
|
||||||
|
|
||||||
|
## Bootloader
|
||||||
|
|
||||||
|
Enter the bootloader in 3 ways:
|
||||||
|
|
||||||
|
* **Bootmagic reset**: Hold down the top left key and plug in the keyboard.
|
||||||
|
* **Physical reset button**. Hold 'boot0' button on MCU board, press 'reset', then release 'boot0'.
|
||||||
|
* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available
|
1
keyboards/kinesis/kintwin/rules.mk
Normal file
1
keyboards/kinesis/kintwin/rules.mk
Normal file
|
@ -0,0 +1 @@
|
||||||
|
# File intentionally blank
|
|
@ -1,3 +1,6 @@
|
||||||
|
// Copyright 2023 QMK
|
||||||
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
/* key matrix size */
|
/* key matrix size */
|
||||||
|
|
|
@ -6,6 +6,16 @@
|
||||||
"pid": "0x6060",
|
"pid": "0x6060",
|
||||||
"device_version": "0.0.3"
|
"device_version": "0.0.3"
|
||||||
},
|
},
|
||||||
|
"features": {
|
||||||
|
"bootmagic": true,
|
||||||
|
"console": false,
|
||||||
|
"command": true,
|
||||||
|
"mousekey": true,
|
||||||
|
"extrakey": true,
|
||||||
|
"nkro": true,
|
||||||
|
"audio": false,
|
||||||
|
"backlight": false
|
||||||
|
},
|
||||||
"indicators": {
|
"indicators": {
|
||||||
"caps_lock": "E6",
|
"caps_lock": "E6",
|
||||||
"num_lock": "D4",
|
"num_lock": "D4",
|
||||||
|
|
|
@ -1,3 +1,6 @@
|
||||||
|
// Copyright 2023 QMK
|
||||||
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
#include "matrix.h"
|
#include "matrix.h"
|
||||||
|
|
||||||
#include "quantum.h"
|
#include "quantum.h"
|
||||||
|
|
|
@ -1,11 +1,7 @@
|
||||||
# Build Options
|
# Build Options
|
||||||
# change yes to no to disable
|
# change yes to no to disable
|
||||||
#
|
#
|
||||||
BOOTMAGIC_ENABLE = yes # Enable Bootmagic Lite
|
|
||||||
MOUSEKEY_ENABLE = yes
|
|
||||||
EXTRAKEY_ENABLE = yes
|
|
||||||
COMMAND_ENABLE = yes
|
|
||||||
NKRO_ENABLE = yes # Enable N-Key Rollover
|
|
||||||
SLEEP_LED_ENABLE = yes
|
SLEEP_LED_ENABLE = yes
|
||||||
CUSTOM_MATRIX = lite
|
CUSTOM_MATRIX = lite
|
||||||
SRC += matrix.c
|
SRC += matrix.c
|
||||||
|
|
|
@ -1,12 +1,15 @@
|
||||||
# Firmware for the Kinesis Advantage/Contoured keyboard
|
# Firmware for the Kinesis Advantage/Contoured keyboard
|
||||||
|
|
||||||
There are at least two different ways to replace the controller in this keyboard.
|
There are at least three different ways to replace the controller in this keyboard.
|
||||||
|
|
||||||
The Stapelberg folder contains the docs and configuration for using the custom controller created by Michael Stapelberg.
|
1. The **stapelberg** directory contains the docs and configuration for using Teensy based controller created by Michael Stapelberg.
|
||||||
|
|
||||||
The alvicstep folder contains docs and configuration for directly wiring a Teensy2++ to the existing controller board. This follows the pinouts described in https://github.com/alvicstep/tmk_keyboard, which is where the name comes from.
|
2. The **alvicstep** directory contains docs and configuration for directly wiring a Teensy2++ to the existing controller board. This follows the pinouts described in https://github.com/alvicstep/tmk_keyboard, which is where the name comes from.
|
||||||
|
|
||||||
|
3. The **kintwin** directory contains the docs and configuration for using BlackPill based controller.
|
||||||
|
|
||||||
## Keymaps
|
## Keymaps
|
||||||
Both hardware solutions should work with the same keymaps
|
All three hardware solutions should work with the same keymaps
|
||||||
|
|
||||||
|
|
||||||
|
## Switch Modifications
|
||||||
|
In addition to the drop-in replacements of the stock controller above, the directory **"keyboards\kin80"** contains the files to support 80 switch modification of the keyboard, compared to original 86 switches. Kin80 keymaps are not compatible with keymaps that are located inside of **kinesis** directory.
|
|
@ -1,13 +0,0 @@
|
||||||
# Build Options
|
|
||||||
# change yes to no to disable
|
|
||||||
#
|
|
||||||
BOOTMAGIC_ENABLE = yes # Enable Bootmagic Lite
|
|
||||||
MOUSEKEY_ENABLE = yes # Mouse keys
|
|
||||||
EXTRAKEY_ENABLE = yes # Audio control and System control
|
|
||||||
CONSOLE_ENABLE = no # Console for debug
|
|
||||||
COMMAND_ENABLE = no
|
|
||||||
NKRO_ENABLE = no # Enable N-Key Rollover
|
|
||||||
BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
|
|
||||||
AUDIO_ENABLE = no # Audio output
|
|
||||||
|
|
||||||
DEFAULT_FOLDER = kinesis/alvicstep
|
|
|
@ -1,3 +1,6 @@
|
||||||
|
// Copyright 2023 QMK
|
||||||
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
/* don't know if this should be defined at the board or top level. Assuming board
|
/* don't know if this should be defined at the board or top level. Assuming board
|
||||||
|
|
|
@ -6,6 +6,16 @@
|
||||||
"pid": "0x6060",
|
"pid": "0x6060",
|
||||||
"device_version": "0.0.2"
|
"device_version": "0.0.2"
|
||||||
},
|
},
|
||||||
|
"features": {
|
||||||
|
"bootmagic": true,
|
||||||
|
"console": false,
|
||||||
|
"command": false,
|
||||||
|
"mousekey": true,
|
||||||
|
"extrakey": true,
|
||||||
|
"nkro": true,
|
||||||
|
"audio": false,
|
||||||
|
"backlight": false
|
||||||
|
},
|
||||||
"matrix_pins": {
|
"matrix_pins": {
|
||||||
"cols": ["B0", "B1", "B2", "B3", "B4", "B5", "B6"],
|
"cols": ["B0", "B1", "B2", "B3", "B4", "B5", "B6"],
|
||||||
"rows": ["D0", "D1", "D2", "D3", "D4", "D5", "D6", "D7", "C0", "C1", "C2", "C3", "C4", "C5", "C6"]
|
"rows": ["D0", "D1", "D2", "D3", "D4", "D5", "D6", "D7", "C0", "C1", "C2", "C3", "C4", "C5", "C6"]
|
||||||
|
|
Loading…
Reference in a new issue