Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Lotus58 glow #20386

Merged
merged 21 commits into from
Apr 15, 2023
Merged
Show file tree
Hide file tree
Changes from 5 commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
7276bb7
Added Keyboard Lotus58Glow
TweetyDaBird Mar 28, 2023
ed31c5c
renamed folder
TweetyDaBird Mar 29, 2023
26148a7
Merge branch 'qmk:master' into Lotus58Glow
TweetyDaBird Mar 30, 2023
3207e95
Cleanup
TweetyDaBird Apr 9, 2023
b82a25d
Merge branch 'qmk:master' into Lotus58Glow
TweetyDaBird Apr 9, 2023
a902172
Update keyboards/tweetydabird/lotus58/info.json
TweetyDaBird Apr 10, 2023
2d21362
Update keyboards/tweetydabird/lotus58/lotus58.c
TweetyDaBird Apr 10, 2023
3483506
Update keyboards/tweetydabird/lotus58/lotus58.c
TweetyDaBird Apr 10, 2023
d1fe51a
removed whitespace
TweetyDaBird Apr 10, 2023
cb8455f
Update keyboards/tweetydabird/lotus58/config.h
TweetyDaBird Apr 11, 2023
6fdb9ad
Update keyboards/tweetydabird/lotus58/info.json
TweetyDaBird Apr 11, 2023
73c0b2b
Renamed folders, removed keymap info.json, bootmagic
TweetyDaBird Apr 11, 2023
0a90ac0
Update keyboards/tweetydabird/lotus58/info.json
TweetyDaBird Apr 11, 2023
a2a4544
Update keyboards/tweetydabird/lotus58/info.json
TweetyDaBird Apr 11, 2023
a00f3a0
Single keymap folder
TweetyDaBird Apr 13, 2023
48146c6
Merge branch 'Lotus58Glow' of https://github.com/TweetyDaBird/qmk_fir…
TweetyDaBird Apr 13, 2023
06d5ed1
Update keyboards/tweetydabird/lotus58/info.json
TweetyDaBird Apr 15, 2023
13eb733
Update keyboards/tweetydabird/lotus58/keymaps/default/keymap.c
TweetyDaBird Apr 15, 2023
1085faa
rules.mk -> info.json
TweetyDaBird Apr 15, 2023
b76c808
Merge branch 'Lotus58Glow' of https://github.com/TweetyDaBird/qmk_fir…
TweetyDaBird Apr 15, 2023
eea7770
Review comments
zvecr Apr 15, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 13 additions & 0 deletions keyboards/tweetydabird/lotus58/atmeldfu/keymaps/default/info.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
{
TweetyDaBird marked this conversation as resolved.
Show resolved Hide resolved
"features": {
"encoder_map": true,
"auto_shift": true,
},
"qmk": {
"tap_keycode_delay": 10
},
"tapping": {
"term": 175,
"toggle": 2
},
}
91 changes: 91 additions & 0 deletions keyboards/tweetydabird/lotus58/atmeldfu/keymaps/default/keymap.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
// Copyright 2022 Markus Knutsson (@TweetyDaBird)
// SPDX-License-Identifier: GPL-2.0-or-later
#include QMK_KEYBOARD_H

const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[0] = LAYOUT(
KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_MPLY, KC_MPLY, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS,
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_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT,
LCTL_T(KC_LEFT), KC_Z, KC_X, KC_C, KC_V, KC_B, KC_DOWN, KC_UP, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, RCTL_T(KC_RGHT),
KC_LGUI, TG(2), KC_LALT, LSFT_T(KC_SPC),RSFT_T(KC_ENT), KC_RALT, TG(1), MT(MOD_RGUI,KC_BSPC)
),

[1] = LAYOUT(
_______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, _______, _______, KC_CIRC, KC_KP_7, KC_KP_8, KC_KP_9, XXXXXXX, XXXXXXX,
_______, XXXXXXX, KC_UP, XXXXXXX, XXXXXXX, XXXXXXX, KC_HASH, KC_KP_4, KC_KP_5, KC_KP_6, XXXXXXX, XXXXXXX,
XXXXXXX, KC_LEFT, KC_DOWN, KC_RIGHT, KC_LBRC, KC_RBRC, KC_AMPR, KC_KP_1, KC_KP_2, KC_KP_3, XXXXXXX, XXXXXXX,
_______, XXXXXXX, KC_PAST, KC_PPLS, KC_PSLS, KC_EQL, _______, _______, KC_DLR, KC_KP_0, KC_KP_DOT, KC_COLN, KC_PMNS, _______,
_______, _______, _______, _______, _______, _______, _______, _______
),

[2] = LAYOUT(
_______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, _______, _______, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______
),

[3] = LAYOUT(
XXXXXXX, XXXXXXX, XXXXXXX , XXXXXXX, XXXXXXX, XXXXXXX, _______, _______, XXXXXXX, XXXXXXX, XXXXXXX, RGB_MOD, RGB_SAI, RGB_TOG,
QK_BOOT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, RGB_RMOD, RGB_SAD, RGB_M_P,
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_CAPS, XXXXXXX, XXXXXXX, XXXXXXX, RGB_HUI, RGB_VAI, RGB_M_B,
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, RGB_HUD, RGB_VAD, RGB_M_R,
_______, _______, _______, _______, _______, _______, _______, _______
)
};

#if defined(ENCODER_MAP_ENABLE)
const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][2] = {
[0] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU), ENCODER_CCW_CW(KC_VOLD, KC_VOLU) },
[1] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU), ENCODER_CCW_CW(KC_VOLD, KC_VOLU) },
[2] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU), ENCODER_CCW_CW(KC_VOLD, KC_VOLU) },
[3] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU), ENCODER_CCW_CW(KC_VOLD, KC_VOLU) }
};
#endif

static void print_status_narrow(void) {
// Create OLED content
oled_write_P(PSTR("\n"), false);
oled_write_P(PSTR(""), false);
oled_write_P(PSTR("Lotus -58-"), false);
oled_write_P(PSTR("\n"), false);

// Print current layer
oled_write_P(PSTR("Layer"), false);
switch (get_highest_layer(layer_state)) {
case 0:
oled_write_P(PSTR("-Base\n"), false);
break;
case 1:
oled_write_P(PSTR("-Num \n"), false);
break;
case 2:
oled_write_P(PSTR("-Func\n"), false);
break;
case 3:
oled_write_P(PSTR("-Sys \n"), false);
break;
default:
oled_write_P(PSTR("Undef"), false);
}

// Display autoshift
oled_write_P(PSTR("\n"), false);
led_t led_usb_state = host_keyboard_led_state();
oled_write_ln_P(PSTR("Caps- lock"), led_usb_state.caps_lock);

}

bool oled_task_user(void) {
// Render the OLED
if (is_keyboard_left()) {
print_status_narrow();
//render_logo();
} else {
print_status_narrow();
//render_logo();
}
return false;
}
1 change: 1 addition & 0 deletions keyboards/tweetydabird/lotus58/atmeldfu/rules.mk
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
BOOTLOADER = atmel-dfu
13 changes: 13 additions & 0 deletions keyboards/tweetydabird/lotus58/caterina/keymaps/default/info.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
{
"features": {
"encoder_map": true,
"auto_shift": true,
},
"qmk": {
"tap_keycode_delay": 10
},
"tapping": {
"term": 175,
"toggle": 2
},
}
91 changes: 91 additions & 0 deletions keyboards/tweetydabird/lotus58/caterina/keymaps/default/keymap.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
// Copyright 2022 Markus Knutsson (@TweetyDaBird)
// SPDX-License-Identifier: GPL-2.0-or-later
#include QMK_KEYBOARD_H

const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[0] = LAYOUT(
KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_MPLY, KC_MPLY, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS,
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_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT,
LCTL_T(KC_LEFT), KC_Z, KC_X, KC_C, KC_V, KC_B, KC_DOWN, KC_UP, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, RCTL_T(KC_RGHT),
KC_LGUI, TG(2), KC_LALT, LSFT_T(KC_SPC),RSFT_T(KC_ENT), KC_RALT, TG(1), MT(MOD_RGUI,KC_BSPC)
),

[1] = LAYOUT(
_______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, _______, _______, KC_CIRC, KC_KP_7, KC_KP_8, KC_KP_9, XXXXXXX, XXXXXXX,
_______, XXXXXXX, KC_UP, XXXXXXX, XXXXXXX, XXXXXXX, KC_HASH, KC_KP_4, KC_KP_5, KC_KP_6, XXXXXXX, XXXXXXX,
XXXXXXX, KC_LEFT, KC_DOWN, KC_RIGHT, KC_LBRC, KC_RBRC, KC_AMPR, KC_KP_1, KC_KP_2, KC_KP_3, XXXXXXX, XXXXXXX,
_______, XXXXXXX, KC_PAST, KC_PPLS, KC_PSLS, KC_EQL, _______, _______, KC_DLR, KC_KP_0, KC_KP_DOT, KC_COLN, KC_PMNS, _______,
_______, _______, _______, _______, _______, _______, _______, _______
),

[2] = LAYOUT(
_______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, _______, _______, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______
),

[3] = LAYOUT(
XXXXXXX, XXXXXXX, XXXXXXX , XXXXXXX, XXXXXXX, XXXXXXX, _______, _______, XXXXXXX, XXXXXXX, XXXXXXX, RGB_MOD, RGB_SAI, RGB_TOG,
QK_BOOT, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, RGB_RMOD, RGB_SAD, RGB_M_P,
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_CAPS, XXXXXXX, XXXXXXX, XXXXXXX, RGB_HUI, RGB_VAI, RGB_M_B,
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, RGB_HUD, RGB_VAD, RGB_M_R,
_______, _______, _______, _______, _______, _______, _______, _______
)
};

#if defined(ENCODER_MAP_ENABLE)
const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][2] = {
[0] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU), ENCODER_CCW_CW(KC_VOLD, KC_VOLU) },
[1] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU), ENCODER_CCW_CW(KC_VOLD, KC_VOLU) },
[2] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU), ENCODER_CCW_CW(KC_VOLD, KC_VOLU) },
[3] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU), ENCODER_CCW_CW(KC_VOLD, KC_VOLU) }
};
#endif

static void print_status_narrow(void) {
// Create OLED content
oled_write_P(PSTR("\n"), false);
oled_write_P(PSTR(""), false);
oled_write_P(PSTR("Lotus -58-"), false);
oled_write_P(PSTR("\n"), false);

// Print current layer
oled_write_P(PSTR("Layer"), false);
switch (get_highest_layer(layer_state)) {
case 0:
oled_write_P(PSTR("-Base\n"), false);
break;
case 1:
oled_write_P(PSTR("-Num \n"), false);
break;
case 2:
oled_write_P(PSTR("-Func\n"), false);
break;
case 3:
oled_write_P(PSTR("-Sys \n"), false);
break;
default:
oled_write_P(PSTR("Undef"), false);
}

// Display autoshift
oled_write_P(PSTR("\n"), false);
led_t led_usb_state = host_keyboard_led_state();
oled_write_ln_P(PSTR("Caps- lock"), led_usb_state.caps_lock);

}

bool oled_task_user(void) {
// Render the OLED
if (is_keyboard_left()) {
print_status_narrow();
//render_logo();
} else {
print_status_narrow();
//render_logo();
}
return false;
}
1 change: 1 addition & 0 deletions keyboards/tweetydabird/lotus58/caterina/rules.mk
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
BOOTLOADER = caterina
20 changes: 20 additions & 0 deletions keyboards/tweetydabird/lotus58/config.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
// Copyright 2022 Markus Knutsson (@TweetyDaBird)
// SPDX-License-Identifier: GPL-2.0-or-later

#pragma once

// Bootmagic Lite key configuration (these do not transfer to Vial in info.json)
#define BOOTMAGIC_LITE_ROW 0
#define BOOTMAGIC_LITE_COLUMN 0
#define BOOTMAGIC_LITE_ROW_RIGHT 5
#define BOOTMAGIC_LITE_COLUMN_RIGHT 0

TweetyDaBird marked this conversation as resolved.
Show resolved Hide resolved
// Options not yet fully implemented in info.json
#define RGBLIGHT_LIMIT_VAL 175
#define RGBLIGHT_DEFAULT_VAL ( RGBLIGHT_LIMIT_VAL / 2 )
#define RGBLIGHT_SLEEP

#define SPLIT_HAND_PIN B5
#define SPLIT_LAYER_STATE_ENABLE
#define SPLIT_LED_STATE_ENABLE
#define SPLIT_OLED_ENABLE
154 changes: 154 additions & 0 deletions keyboards/tweetydabird/lotus58/info.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,154 @@
{
"manufacturer": "Tweetys Wild Thinking",
"keyboard_name": "Lotus 58 Glow (QMK)",
"maintainer": "TweetyDaBird",
"bootloader_instructions": "Short marked pads on PCB, or hold top-outer key when plugging in each hand.",
"build": {
"lto": true
},
"diode_direction": "COL2ROW",
"encoder": {
"rotary": [
{
"pin_a": "F5",
"pin_b": "F4",
"resolution": 2
}
]
},
"features": {
"audio": false,
"bootmagic": true,
"command": false,
"console": false,
"encoder": true,
"extrakey": true,
"grave_esc": false,
"magic": false,
"mousekey": false,
"nkro": true,
"oled": true,
"rgblight": true,
"space_cadet": false,
"split": true,
"tap_dance": false,
"tri_layer": true
TweetyDaBird marked this conversation as resolved.
Show resolved Hide resolved
},
"matrix_pins": {
"cols": ["B1", "B2", "B3", "B6", "F7", "F6"],
"rows": ["D4", "C6", "D7", "E6", "B4"]
},
"matrix_size": {
"cols": 6,
"rows": 10
},
TweetyDaBird marked this conversation as resolved.
Show resolved Hide resolved
"pin_compatible": "promicro",
"processor": "atmega32u4",
"rgblight": {
"brightness_steps": 17,
"hue_steps": 17,
TweetyDaBird marked this conversation as resolved.
Show resolved Hide resolved
"led_count": 70,
"pin": "D3",
"saturation_steps": 17,
TweetyDaBird marked this conversation as resolved.
Show resolved Hide resolved
"split": true,
"split_count": [35, 35]
},
"split": {
"enabled": true,
"encoder": {
"right": {
"rotary": [
{
"pin_a": "F4",
"pin_b": "F5",
"resolution": 2
}
]
}
},
TweetyDaBird marked this conversation as resolved.
Show resolved Hide resolved
"soft_serial_pin": "D2",
"transport": {
"protocol": "serial",
"sync_matrix_state": true,
"sync_modifiers": true
},
"usb_detect": {
"enabled": true,
"polling_interval": 10,
"timeout": 2000
}
},
"url": "https://lectronz.com/stores/tweetys-wild-thinking",
"usb": {
"device_version": "1.2.3",
"force_nkro": true,
"pid": "0x23B0",
"vid": "0xFEED"
},
"layouts": {
"LAYOUT": {
"layout": [
{ "label": "Esc", "matrix": [0, 0], "x": 0, "y": 0.75 },
{ "label": "1", "matrix": [0, 1], "x": 1, "y": 0.5 },
{ "label": "2", "matrix": [0, 2], "x": 2, "y": 0.25 },
{ "label": "3", "matrix": [0, 3], "x": 3, "y": 0 },
{ "label": "4", "matrix": [0, 4], "x": 4, "y": 0.25 },
{ "label": "5", "matrix": [0, 5], "x": 5, "y": 0.5 },
{ "label": "Left ENC", "matrix": [4, 0], "x": 6.25, "y": 0.75 },
{ "label": "Right ENC", "matrix": [9, 0], "x": 7.75, "y": 0.75 },
{ "label": "6", "matrix": [5, 5], "x": 9, "y": 0.5 },
{ "label": "7", "matrix": [5, 4], "x": 10, "y": 0.25 },
{ "label": "8", "matrix": [5, 3], "x": 11, "y": 0 },
{ "label": "9", "matrix": [5, 2], "x": 12, "y": 0.25 },
{ "label": "0", "matrix": [5, 1], "x": 13, "y": 0.5 },
{ "label": "-", "matrix": [5, 0], "x": 14, "y": 0.75 },
{ "label": "Tab", "matrix": [1, 0], "x": 0, "y": 1.75 },
{ "label": "Q", "matrix": [1, 1], "x": 1, "y": 1.5 },
{ "label": "W", "matrix": [1, 2], "x": 2, "y": 1.25 },
{ "label": "E", "matrix": [1, 3], "x": 3, "y": 1 },
{ "label": "R", "matrix": [1, 4], "x": 4, "y": 1.25 },
{ "label": "T", "matrix": [1, 5], "x": 5, "y": 1.5 },
{ "label": "Y", "matrix": [6, 5], "x": 9, "y": 1.5 },
{ "label": "U", "matrix": [6, 4], "x": 10, "y": 1.25 },
{ "label": "I", "matrix": [6, 3], "x": 11, "y": 1 },
{ "label": "O", "matrix": [6, 2], "x": 12, "y": 1.25 },
{ "label": "P", "matrix": [6, 1], "x": 13, "y": 1.5 },
{ "label": "{", "matrix": [6, 0], "x": 14, "y": 1.75 },
{ "label": "Caps Lock", "matrix": [2, 0], "x": 0, "y": 2.75 },
{ "label": "A", "matrix": [2, 1], "x": 1, "y": 2.5 },
{ "label": "S", "matrix": [2, 2], "x": 2, "y": 2.25 },
{ "label": "D", "matrix": [2, 3], "x": 3, "y": 2 },
{ "label": "F", "matrix": [2, 4], "x": 4, "y": 2.25 },
{ "label": "G", "matrix": [2, 5], "x": 5, "y": 2.5 },
{ "label": "H", "matrix": [7, 5], "x": 9, "y": 2.5 },
{ "label": "J", "matrix": [7, 4], "x": 10, "y": 2.25 },
{ "label": "K", "matrix": [7, 3], "x": 11, "y": 2 },
{ "label": "L", "matrix": [7, 2], "x": 12, "y": 2.25 },
{ "label": ":", "matrix": [7, 1], "x": 13, "y": 2.5 },
{ "label": "\"", "matrix": [7, 0], "x": 14, "y": 2.75 },
{ "label": "L_Ctrl", "matrix": [3, 0], "x": 0, "y": 3.75 },
{ "label": "Z", "matrix": [3, 1], "x": 1, "y": 3.5 },
{ "label": "X", "matrix": [3, 2], "x": 2, "y": 3.25 },
{ "label": "C", "matrix": [3, 3], "x": 3, "y": 3 },
{ "label": "V", "matrix": [3, 4], "x": 4, "y": 3.25 },
{ "label": "B", "matrix": [3, 5], "x": 5, "y": 3.5 },
{ "label": "Down", "matrix": [4, 5], "x": 6, "y": 3 },
{ "label": "Up", "matrix": [9, 5], "x": 8, "y": 3 },
{ "label": "N", "matrix": [8, 5], "x": 9, "y": 3.5 },
{ "label": "M", "matrix": [8, 4], "x": 10, "y": 3.25 },
{ "label": ",", "matrix": [8, 3], "x": 11, "y": 3 },
{ "label": ".", "matrix": [8, 2], "x": 12, "y": 3.25 },
{ "label": "?", "matrix": [8, 1], "x": 13, "y": 3.5 },
{ "label": "R_Ctrl", "matrix": [8, 0], "x": 14, "y": 3.75 },
{ "label": "Win", "matrix": [4, 1], "x": 2.5, "y": 4.25 },
{ "label": "Lower", "matrix": [4, 2], "x": 3.5, "y": 4.25 },
{ "label": "Alt", "matrix": [4, 3], "x": 4.5, "y": 4.5 },
{ "h": 1.25, "label": "Space", "matrix": [4, 4], "x": 6, "y": 4.25 },
{ "h": 1.25, "label": "Enter", "matrix": [9, 4], "x": 8, "y": 4.25 },
{ "label": "AltGr", "matrix": [9, 3], "x": 9.5, "y": 4.5 },
{ "label": "Raise", "matrix": [9, 2], "x": 10.5, "y": 4.25 },
{ "label": "BckSp", "matrix": [9, 1], "x": 11.5, "y": 4.25 }
]
}
}
}
Loading