1
0

Compare commits

..

7 Commits

Author SHA1 Message Date
Joel Challis
5bb7476400 Short term fix for skip_converter KeyError in 'qmk userspace-add' (#25798) 2025-11-19 03:45:29 +00:00
yiancar
6242c09f7d Hyper7 v4 (#25728) 2025-11-17 02:10:59 +00:00
Ivan Gromov
eb5703d12e Add imi60-HS (#25773) 2025-11-17 02:09:09 +00:00
Joel Challis
bb2ca21647 Fix detection of hid bootloader flashing tool (#25790) 2025-11-17 02:06:59 +00:00
Cipulot
ed343ddad4 VIA Keylog Change (#25504)
* WIP

* Update via.c

temptive fix in formatting for lint errors.

* Update via.c

let's try this one, thanks mobile GitHub app to not showing spaces right.

* Update quantum/via.c

Co-authored-by: Joel Challis <git@zvecr.com>

* Update quantum/via.c

Co-authored-by: Joel Challis <git@zvecr.com>

* Merge branch 'qmk:master' into via_keylog_change
2025-11-11 23:21:50 +11:00
Pablo Martínez
e7ad19bb95 [Bugfix] QP error handling (#25591)
* change QP so that any func can return error (`void` -> `bool` returns)
2025-11-11 23:20:48 +11:00
leyew
024c4ef853 [Keyboard] Add Rubrehaku (#24907) 2025-11-08 21:01:36 +00:00
35 changed files with 1838 additions and 73 deletions

View File

@@ -15,8 +15,9 @@ static bool dummy_comms_start(painter_device_t device) {
return true;
}
static void dummy_comms_stop(painter_device_t device) {
static bool dummy_comms_stop(painter_device_t device) {
// No-op.
return true;
}
uint32_t dummy_comms_send(painter_device_t device, const void *data, uint32_t byte_count) {

View File

@@ -35,7 +35,9 @@ uint32_t qp_comms_i2c_send_data(painter_device_t device, const void *data, uint3
return qp_comms_i2c_send_raw(device, data, byte_count);
}
void qp_comms_i2c_stop(painter_device_t device) {}
bool qp_comms_i2c_stop(painter_device_t device) {
return true;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Command+Data I2C support
@@ -43,9 +45,9 @@ void qp_comms_i2c_stop(painter_device_t device) {}
static const uint8_t cmd_byte = 0x00;
static const uint8_t data_byte = 0x40;
void qp_comms_i2c_cmddata_send_command(painter_device_t device, uint8_t cmd) {
bool qp_comms_i2c_cmddata_send_command(painter_device_t device, uint8_t cmd) {
uint8_t buf[2] = {cmd_byte, cmd};
qp_comms_i2c_send_raw(device, &buf, 2);
return qp_comms_i2c_send_raw(device, &buf, 2);
}
uint32_t qp_comms_i2c_cmddata_send_data(painter_device_t device, const void *data, uint32_t byte_count) {
@@ -58,7 +60,7 @@ uint32_t qp_comms_i2c_cmddata_send_data(painter_device_t device, const void *dat
return byte_count;
}
void qp_comms_i2c_bulk_command_sequence(painter_device_t device, const uint8_t *sequence, size_t sequence_len) {
bool qp_comms_i2c_bulk_command_sequence(painter_device_t device, const uint8_t *sequence, size_t sequence_len) {
uint8_t buf[32];
for (size_t i = 0; i < sequence_len;) {
uint8_t command = sequence[i];
@@ -67,12 +69,17 @@ void qp_comms_i2c_bulk_command_sequence(painter_device_t device, const uint8_t *
buf[0] = cmd_byte;
buf[1] = command;
memcpy(&buf[2], &sequence[i + 3], num_bytes);
qp_comms_i2c_send_raw(device, buf, num_bytes + 2);
if (!qp_comms_i2c_send_raw(device, buf, num_bytes + 2)) {
return false;
}
if (delay > 0) {
wait_ms(delay);
}
i += (3 + num_bytes);
}
return true;
}
const painter_comms_with_command_vtable_t i2c_comms_cmddata_vtable = {

View File

@@ -19,7 +19,7 @@ typedef struct qp_comms_i2c_config_t {
bool qp_comms_i2c_init(painter_device_t device);
bool qp_comms_i2c_start(painter_device_t device);
uint32_t qp_comms_i2c_send_data(painter_device_t device, const void* data, uint32_t byte_count);
void qp_comms_i2c_stop(painter_device_t device);
bool qp_comms_i2c_stop(painter_device_t device);
extern const painter_comms_with_command_vtable_t i2c_comms_cmddata_vtable;

View File

@@ -45,11 +45,12 @@ uint32_t qp_comms_spi_send_data(painter_device_t device, const void *data, uint3
return byte_count - bytes_remaining;
}
void qp_comms_spi_stop(painter_device_t device) {
bool qp_comms_spi_stop(painter_device_t device) {
painter_driver_t * driver = (painter_driver_t *)device;
qp_comms_spi_config_t *comms_config = (qp_comms_spi_config_t *)driver->comms_config;
spi_stop();
gpio_write_pin_high(comms_config->chip_select_pin);
return true;
}
const painter_comms_vtable_t spi_comms_vtable = {
@@ -97,14 +98,15 @@ uint32_t qp_comms_spi_dc_reset_send_data(painter_device_t device, const void *da
return qp_comms_spi_send_data(device, data, byte_count);
}
void qp_comms_spi_dc_reset_send_command(painter_device_t device, uint8_t cmd) {
bool qp_comms_spi_dc_reset_send_command(painter_device_t device, uint8_t cmd) {
painter_driver_t * driver = (painter_driver_t *)device;
qp_comms_spi_dc_reset_config_t *comms_config = (qp_comms_spi_dc_reset_config_t *)driver->comms_config;
gpio_write_pin_low(comms_config->dc_pin);
spi_write(cmd);
return true;
}
void qp_comms_spi_dc_reset_bulk_command_sequence(painter_device_t device, const uint8_t *sequence, size_t sequence_len) {
bool qp_comms_spi_dc_reset_bulk_command_sequence(painter_device_t device, const uint8_t *sequence, size_t sequence_len) {
painter_driver_t * driver = (painter_driver_t *)device;
qp_comms_spi_dc_reset_config_t *comms_config = (qp_comms_spi_dc_reset_config_t *)driver->comms_config;
for (size_t i = 0; i < sequence_len;) {
@@ -126,6 +128,8 @@ void qp_comms_spi_dc_reset_bulk_command_sequence(painter_device_t device, const
}
i += (3 + num_bytes);
}
return true;
}
const painter_comms_with_command_vtable_t spi_comms_with_dc_vtable = {

View File

@@ -22,7 +22,7 @@ typedef struct qp_comms_spi_config_t {
bool qp_comms_spi_init(painter_device_t device);
bool qp_comms_spi_start(painter_device_t device);
uint32_t qp_comms_spi_send_data(painter_device_t device, const void* data, uint32_t byte_count);
void qp_comms_spi_stop(painter_device_t device);
bool qp_comms_spi_stop(painter_device_t device);
extern const painter_comms_vtable_t spi_comms_vtable;
@@ -39,9 +39,9 @@ typedef struct qp_comms_spi_dc_reset_config_t {
} qp_comms_spi_dc_reset_config_t;
bool qp_comms_spi_dc_reset_init(painter_device_t device);
void qp_comms_spi_dc_reset_send_command(painter_device_t device, uint8_t cmd);
bool qp_comms_spi_dc_reset_send_command(painter_device_t device, uint8_t cmd);
uint32_t qp_comms_spi_dc_reset_send_data(painter_device_t device, const void* data, uint32_t byte_count);
void qp_comms_spi_dc_reset_bulk_command_sequence(painter_device_t device, const uint8_t* sequence, size_t sequence_len);
bool qp_comms_spi_dc_reset_bulk_command_sequence(painter_device_t device, const uint8_t* sequence, size_t sequence_len);
extern const painter_comms_with_command_vtable_t spi_comms_with_dc_vtable;

View File

@@ -32,7 +32,9 @@ __attribute__((weak)) bool qp_gc9107_init(painter_device_t device, painter_rotat
};
// clang-format on
qp_comms_bulk_command_sequence(device, gc9107_init_sequence, sizeof(gc9107_init_sequence));
if (!qp_comms_bulk_command_sequence(device, gc9107_init_sequence, sizeof(gc9107_init_sequence))) {
return false;
}
// Configure the rotation (i.e. the ordering and direction of memory writes in GRAM)
const uint8_t madctl[] = {
@@ -41,9 +43,7 @@ __attribute__((weak)) bool qp_gc9107_init(painter_device_t device, painter_rotat
[QP_ROTATION_180] = GC9XXX_MADCTL_BGR | GC9XXX_MADCTL_MX | GC9XXX_MADCTL_MY,
[QP_ROTATION_270] = GC9XXX_MADCTL_BGR | GC9XXX_MADCTL_MV | GC9XXX_MADCTL_MY,
};
qp_comms_command_databyte(device, GC9XXX_SET_MEM_ACS_CTL, madctl[rotation]);
return true;
return qp_comms_command_databyte(device, GC9XXX_SET_MEM_ACS_CTL, madctl[rotation]);
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

View File

@@ -45,7 +45,9 @@ __attribute__((weak)) bool qp_gc9a01_init(painter_device_t device, painter_rotat
};
// clang-format on
qp_comms_bulk_command_sequence(device, gc9a01_init_sequence, sizeof(gc9a01_init_sequence));
if (!qp_comms_bulk_command_sequence(device, gc9a01_init_sequence, sizeof(gc9a01_init_sequence))) {
return false;
}
// Configure the rotation (i.e. the ordering and direction of memory writes in GRAM)
const uint8_t madctl[] = {
@@ -54,9 +56,7 @@ __attribute__((weak)) bool qp_gc9a01_init(painter_device_t device, painter_rotat
[QP_ROTATION_180] = GC9XXX_MADCTL_BGR | GC9XXX_MADCTL_MX | GC9XXX_MADCTL_MY,
[QP_ROTATION_270] = GC9XXX_MADCTL_BGR | GC9XXX_MADCTL_MV | GC9XXX_MADCTL_MY,
};
qp_comms_command_databyte(device, GC9XXX_SET_MEM_ACS_CTL, madctl[rotation]);
return true;
return qp_comms_command_databyte(device, GC9XXX_SET_MEM_ACS_CTL, madctl[rotation]);
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

View File

@@ -41,7 +41,9 @@ __attribute__((weak)) bool qp_ili9163_init(painter_device_t device, painter_rota
ILI9XXX_CMD_DISPLAY_ON, 20, 0
};
// clang-format on
qp_comms_bulk_command_sequence(device, ili9163_init_sequence, sizeof(ili9163_init_sequence));
if (!qp_comms_bulk_command_sequence(device, ili9163_init_sequence, sizeof(ili9163_init_sequence))) {
return false;
}
// Configure the rotation (i.e. the ordering and direction of memory writes in GRAM)
const uint8_t madctl[] = {
@@ -50,9 +52,7 @@ __attribute__((weak)) bool qp_ili9163_init(painter_device_t device, painter_rota
[QP_ROTATION_180] = ILI9XXX_MADCTL_BGR | ILI9XXX_MADCTL_MX | ILI9XXX_MADCTL_MY,
[QP_ROTATION_270] = ILI9XXX_MADCTL_BGR | ILI9XXX_MADCTL_MV | ILI9XXX_MADCTL_MY,
};
qp_comms_command_databyte(device, ILI9XXX_SET_MEM_ACS_CTL, madctl[rotation]);
return true;
return qp_comms_command_databyte(device, ILI9XXX_SET_MEM_ACS_CTL, madctl[rotation]);
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

View File

@@ -48,7 +48,9 @@ __attribute__((weak)) bool qp_ili9341_init(painter_device_t device, painter_rota
ILI9XXX_CMD_DISPLAY_ON, 20, 0
};
// clang-format on
qp_comms_bulk_command_sequence(device, ili9341_init_sequence, sizeof(ili9341_init_sequence));
if (!qp_comms_bulk_command_sequence(device, ili9341_init_sequence, sizeof(ili9341_init_sequence))) {
return false;
}
// Configure the rotation (i.e. the ordering and direction of memory writes in GRAM)
const uint8_t madctl[] = {
@@ -57,9 +59,7 @@ __attribute__((weak)) bool qp_ili9341_init(painter_device_t device, painter_rota
[QP_ROTATION_180] = ILI9XXX_MADCTL_BGR | ILI9XXX_MADCTL_MX | ILI9XXX_MADCTL_MY,
[QP_ROTATION_270] = ILI9XXX_MADCTL_BGR | ILI9XXX_MADCTL_MV | ILI9XXX_MADCTL_MY,
};
qp_comms_command_databyte(device, ILI9XXX_SET_MEM_ACS_CTL, madctl[rotation]);
return true;
return qp_comms_command_databyte(device, ILI9XXX_SET_MEM_ACS_CTL, madctl[rotation]);
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

View File

@@ -37,7 +37,9 @@ bool qp_ili9486_init(painter_device_t device, painter_rotation_t rotation) {
ILI9XXX_SET_INVERSION_CTL, 0, 1, 0x02,
};
// clang-format on
qp_comms_bulk_command_sequence(device, ili9486_init_sequence, sizeof(ili9486_init_sequence));
if (!qp_comms_bulk_command_sequence(device, ili9486_init_sequence, sizeof(ili9486_init_sequence))) {
return false;
}
// Configure the rotation (i.e. the ordering and direction of memory writes in GRAM)
const uint8_t madctl[] = {
@@ -62,22 +64,22 @@ bool qp_ili9486_init(painter_device_t device, painter_rotation_t rotation) {
ILI9XXX_CMD_DISPLAY_ON, 5, 0,
};
// clang-format on
qp_comms_bulk_command_sequence(device, rotation_sequence, sizeof(rotation_sequence));
return true;
return qp_comms_bulk_command_sequence(device, rotation_sequence, sizeof(rotation_sequence));
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Driver vtable
// waveshare variant needs some tweaks due to shift registers
static void qp_comms_spi_dc_reset_send_command_odd_cs_pulse(painter_device_t device, uint8_t cmd) {
static bool qp_comms_spi_dc_reset_send_command_odd_cs_pulse(painter_device_t device, uint8_t cmd) {
painter_driver_t * driver = (painter_driver_t *)device;
qp_comms_spi_dc_reset_config_t *comms_config = (qp_comms_spi_dc_reset_config_t *)driver->comms_config;
gpio_write_pin_low(comms_config->spi_config.chip_select_pin);
qp_comms_spi_dc_reset_send_command(device, cmd);
gpio_write_pin_high(comms_config->spi_config.chip_select_pin);
return true;
}
static uint32_t qp_comms_spi_send_data_odd_cs_pulse(painter_device_t device, const void *data, uint32_t byte_count) {
@@ -124,7 +126,7 @@ static uint32_t qp_ili9486_send_data_toggling(painter_device_t device, const uin
return ret;
}
static void qp_comms_spi_send_command_sequence_odd_cs_pulse(painter_device_t device, const uint8_t *sequence, size_t sequence_len) {
static bool qp_comms_spi_send_command_sequence_odd_cs_pulse(painter_device_t device, const uint8_t *sequence, size_t sequence_len) {
for (size_t i = 0; i < sequence_len;) {
uint8_t command = sequence[i];
uint8_t delay = sequence[i + 1];
@@ -140,6 +142,8 @@ static void qp_comms_spi_send_command_sequence_odd_cs_pulse(painter_device_t dev
}
i += (3 + num_bytes);
}
return true;
}
static bool qp_ili9486_viewport(painter_device_t device, uint16_t left, uint16_t top, uint16_t right, uint16_t bottom) {

View File

@@ -41,7 +41,9 @@ __attribute__((weak)) bool qp_ili9488_init(painter_device_t device, painter_rota
ILI9XXX_CMD_DISPLAY_ON, 20, 0
};
// clang-format on
qp_comms_bulk_command_sequence(device, ili9488_init_sequence, sizeof(ili9488_init_sequence));
if (!qp_comms_bulk_command_sequence(device, ili9488_init_sequence, sizeof(ili9488_init_sequence))) {
return false;
}
// Configure the rotation (i.e. the ordering and direction of memory writes in GRAM)
const uint8_t madctl[] = {
@@ -50,9 +52,7 @@ __attribute__((weak)) bool qp_ili9488_init(painter_device_t device, painter_rota
[QP_ROTATION_180] = ILI9XXX_MADCTL_BGR | ILI9XXX_MADCTL_MX,
[QP_ROTATION_270] = ILI9XXX_MADCTL_BGR | ILI9XXX_MADCTL_MV,
};
qp_comms_command_databyte(device, ILI9XXX_SET_MEM_ACS_CTL, madctl[rotation]);
return true;
return qp_comms_command_databyte(device, ILI9XXX_SET_MEM_ACS_CTL, madctl[rotation]);
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

View File

@@ -10,7 +10,7 @@
#include "qp_surface.h"
#include "qp_surface_internal.h"
typedef void (*ld7032_driver_comms_send_command_and_data_func)(painter_device_t device, uint8_t cmd, uint8_t data);
typedef bool (*ld7032_driver_comms_send_command_and_data_func)(painter_device_t device, uint8_t cmd, uint8_t data);
typedef uint32_t (*ld7032_driver_comms_send_command_and_databuf_func)(painter_device_t device, uint8_t cmd, const void *data, uint32_t byte_count);
typedef struct ld7032_comms_with_command_vtable_t {
@@ -25,12 +25,13 @@ typedef struct ld7032_comms_with_command_vtable_t {
// LD7032 Internal API
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void ld7032_comms_i2c_send_command_and_data(painter_device_t device, uint8_t cmd, uint8_t data) {
#ifdef QUANTUM_PAINTER_LD7032_I2C_ENABLE
bool ld7032_comms_i2c_send_command_and_data(painter_device_t device, uint8_t cmd, uint8_t data) {
uint8_t buf[2] = {cmd, data};
qp_comms_i2c_send_data(device, buf, 2);
return qp_comms_i2c_send_data(device, buf, 2);
}
void ld7032_comms_i2c_bulk_command_sequence(painter_device_t device, const uint8_t *sequence, size_t sequence_len) {
bool ld7032_comms_i2c_bulk_command_sequence(painter_device_t device, const uint8_t *sequence, size_t sequence_len) {
uint8_t buf[32];
for (size_t i = 0; i < sequence_len;) {
uint8_t command = sequence[i];
@@ -38,12 +39,16 @@ void ld7032_comms_i2c_bulk_command_sequence(painter_device_t device, const uint8
uint8_t num_bytes = sequence[i + 2];
buf[0] = command;
memcpy(&buf[1], &sequence[i + 3], num_bytes);
qp_comms_i2c_send_data(device, buf, num_bytes + 1);
if (!qp_comms_i2c_send_data(device, buf, num_bytes + 1)) {
return false;
}
if (delay > 0) {
wait_ms(delay);
}
i += (3 + num_bytes);
}
return true;
}
uint32_t ld7032_comms_i2c_send_command_and_databuf(painter_device_t device, uint8_t cmd, const void *data, uint32_t byte_count) {
@@ -53,6 +58,7 @@ uint32_t ld7032_comms_i2c_send_command_and_databuf(painter_device_t device, uint
memcpy(&buf[1], data, byte_count);
return qp_comms_send(device, buf, byte_count + 1);
}
#endif // QUANTUM_PAINTER_LD7032_I2C_ENABLE
// Power control
bool qp_ld7032_power(painter_device_t device, bool power_on) {
@@ -201,7 +207,9 @@ __attribute__((weak)) bool qp_ld7032_init(painter_device_t device, painter_rotat
};
// clang-format on
qp_comms_bulk_command_sequence(device, ld7032_init_sequence, sizeof(ld7032_init_sequence));
if (!qp_comms_bulk_command_sequence(device, ld7032_init_sequence, sizeof(ld7032_init_sequence))) {
return false;
}
uint8_t display_y_start = 40 - driver->oled.base.panel_height;
uint8_t display_x_start = (128 - driver->oled.base.panel_width) / 2;
@@ -223,7 +231,9 @@ __attribute__((weak)) bool qp_ld7032_init(painter_device_t device, painter_rotat
ld7032_memory_setup[13] = ld7032_memory_setup[4] + 1;
ld7032_memory_setup[17] = driver->oled.base.panel_height;
qp_comms_bulk_command_sequence(device, ld7032_memory_setup, sizeof(ld7032_memory_setup));
if (!qp_comms_bulk_command_sequence(device, ld7032_memory_setup, sizeof(ld7032_memory_setup))) {
return false;
}
uint8_t write_direction = 0;
switch (rotation) {
@@ -245,7 +255,9 @@ __attribute__((weak)) bool qp_ld7032_init(painter_device_t device, painter_rotat
painter_driver_t * pdriver = (painter_driver_t *)device;
ld7032_comms_with_command_vtable_t *comms_vtable = (ld7032_comms_with_command_vtable_t *)pdriver->comms_vtable;
comms_vtable->send_command_data(device, LD7032_WRITE_DIRECTION, write_direction);
if (!comms_vtable->send_command_data(device, LD7032_WRITE_DIRECTION, write_direction)) {
return false;
}
qp_ld7032_power(device, true);

View File

@@ -71,8 +71,7 @@ __attribute__((weak)) bool qp_sh1106_init(painter_device_t device, painter_rotat
sh1106_init_sequence[20] = 0x02;
}
qp_comms_bulk_command_sequence(device, sh1106_init_sequence, sizeof(sh1106_init_sequence));
return true;
return qp_comms_bulk_command_sequence(device, sh1106_init_sequence, sizeof(sh1106_init_sequence));
}
// Screen flush

View File

@@ -73,8 +73,7 @@ __attribute__((weak)) bool qp_sh1107_init(painter_device_t device, painter_rotat
sh1107_init_sequence[20] = 0x02;
}
qp_comms_bulk_command_sequence(device, sh1107_init_sequence, sizeof(sh1107_init_sequence));
return true;
return qp_comms_bulk_command_sequence(device, sh1107_init_sequence, sizeof(sh1107_init_sequence));
}
// Screen flush

View File

@@ -44,7 +44,9 @@ __attribute__((weak)) bool qp_ssd1351_init(painter_device_t device, painter_rota
SSD1351_DISPLAYON, 5, 0,
};
// clang-format on
qp_comms_bulk_command_sequence(device, ssd1351_init_sequence, sizeof(ssd1351_init_sequence));
if (!qp_comms_bulk_command_sequence(device, ssd1351_init_sequence, sizeof(ssd1351_init_sequence))) {
return false;
}
// Configure the rotation (i.e. the ordering and direction of memory writes in GRAM)
const uint8_t madctl[] = {
@@ -53,10 +55,10 @@ __attribute__((weak)) bool qp_ssd1351_init(painter_device_t device, painter_rota
[QP_ROTATION_180] = SSD1351_MADCTL_BGR | SSD1351_MADCTL_MX,
[QP_ROTATION_270] = SSD1351_MADCTL_BGR | SSD1351_MADCTL_MV,
};
qp_comms_command_databyte(device, SSD1351_SETREMAP, madctl[rotation]);
qp_comms_command_databyte(device, SSD1351_STARTLINE, (rotation == QP_ROTATION_0 || rotation == QP_ROTATION_90) ? driver->base.panel_height : 0);
return true;
if (!qp_comms_command_databyte(device, SSD1351_SETREMAP, madctl[rotation])) {
return false;
}
return qp_comms_command_databyte(device, SSD1351_STARTLINE, (rotation == QP_ROTATION_0 || rotation == QP_ROTATION_90) ? driver->base.panel_height : 0);
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

View File

@@ -63,7 +63,9 @@ __attribute__((weak)) bool qp_st7735_init(painter_device_t device, painter_rotat
ST77XX_CMD_DISPLAY_ON, 20, 0
};
// clang-format on
qp_comms_bulk_command_sequence(device, st7735_init_sequence, sizeof(st7735_init_sequence));
if (!qp_comms_bulk_command_sequence(device, st7735_init_sequence, sizeof(st7735_init_sequence))) {
return false;
}
// Configure the rotation (i.e. the ordering and direction of memory writes in GRAM)
const uint8_t madctl[] = {
@@ -72,7 +74,9 @@ __attribute__((weak)) bool qp_st7735_init(painter_device_t device, painter_rotat
[QP_ROTATION_180] = ST77XX_MADCTL_BGR | ST77XX_MADCTL_MX | ST77XX_MADCTL_MY,
[QP_ROTATION_270] = ST77XX_MADCTL_BGR | ST77XX_MADCTL_MV | ST77XX_MADCTL_MY,
};
qp_comms_command_databyte(device, ST77XX_SET_MADCTL, madctl[rotation]);
if (!qp_comms_command_databyte(device, ST77XX_SET_MADCTL, madctl[rotation])) {
return false;
}
#ifndef ST7735_NO_AUTOMATIC_VIEWPORT_OFFSETS
st7735_automatic_viewport_offsets(device, rotation);

View File

@@ -60,7 +60,9 @@ __attribute__((weak)) bool qp_st7789_init(painter_device_t device, painter_rotat
ST77XX_CMD_DISPLAY_ON, 20, 0
};
// clang-format on
qp_comms_bulk_command_sequence(device, st7789_init_sequence, sizeof(st7789_init_sequence));
if (!qp_comms_bulk_command_sequence(device, st7789_init_sequence, sizeof(st7789_init_sequence))) {
return false;
}
// Configure the rotation (i.e. the ordering and direction of memory writes in GRAM)
const uint8_t madctl[] = {
@@ -69,7 +71,9 @@ __attribute__((weak)) bool qp_st7789_init(painter_device_t device, painter_rotat
[QP_ROTATION_180] = ST77XX_MADCTL_RGB | ST77XX_MADCTL_MX | ST77XX_MADCTL_MY,
[QP_ROTATION_270] = ST77XX_MADCTL_RGB | ST77XX_MADCTL_MV | ST77XX_MADCTL_MY,
};
qp_comms_command_databyte(device, ST77XX_SET_MADCTL, madctl[rotation]);
if (!qp_comms_command_databyte(device, ST77XX_SET_MADCTL, madctl[rotation])) {
return false;
}
#ifndef ST7789_NO_AUTOMATIC_VIEWPORT_OFFSETS
st7789_automatic_viewport_offsets(device, rotation);

View File

@@ -0,0 +1,292 @@
{
"manufacturer": "La-Versa x keyten",
"keyboard_name": "imi60-HS",
"maintainer": "key10iq",
"processor": "STM32F072",
"bootloader": "stm32-dfu",
"usb": {
"vid": "0xEB69",
"pid": "0x6009",
"device_version": "0.0.1"
},
"features": {
"bootmagic": true,
"extrakey": true,
"mousekey": true,
"nkro": true
},
"diode_direction": "COL2ROW",
"matrix_pins": {
"rows": ["B1", "B0", "A6", "A5", "B11"],
"cols": ["A3", "A4", "A7", "B2", "B10", "B9", "B8", "B7", "B6", "B5", "B4", "B3", "A15", "A14"]
},
"community_layouts": [
"60_ansi_wkl_split_bs_rshift",
"60_hhkb",
"60_ansi_tsangan_split_bs_rshift"
],
"layout_aliases": {
"LAYOUT_all": "LAYOUT_60_ansi_tsangan_split_bs_rshift"
},
"layouts": {
"LAYOUT_60_ansi_wkl_split_bs_rshift": {
"layout": [
{"matrix": [0, 0], "x": 0, "y": 0},
{"matrix": [0, 1], "x": 1, "y": 0},
{"matrix": [0, 2], "x": 2, "y": 0},
{"matrix": [0, 3], "x": 3, "y": 0},
{"matrix": [0, 4], "x": 4, "y": 0},
{"matrix": [0, 5], "x": 5, "y": 0},
{"matrix": [0, 6], "x": 6, "y": 0},
{"matrix": [0, 7], "x": 7, "y": 0},
{"matrix": [0, 8], "x": 8, "y": 0},
{"matrix": [0, 9], "x": 9, "y": 0},
{"matrix": [0, 10], "x": 10, "y": 0},
{"matrix": [0, 11], "x": 11, "y": 0},
{"matrix": [0, 12], "x": 12, "y": 0},
{"matrix": [0, 13], "x": 13, "y": 0},
{"matrix": [2, 13], "x": 14, "y": 0},
{"matrix": [1, 0], "x": 0, "y": 1, "w": 1.5},
{"matrix": [1, 1], "x": 1.5, "y": 1},
{"matrix": [1, 2], "x": 2.5, "y": 1},
{"matrix": [1, 3], "x": 3.5, "y": 1},
{"matrix": [1, 4], "x": 4.5, "y": 1},
{"matrix": [1, 5], "x": 5.5, "y": 1},
{"matrix": [1, 6], "x": 6.5, "y": 1},
{"matrix": [1, 7], "x": 7.5, "y": 1},
{"matrix": [1, 8], "x": 8.5, "y": 1},
{"matrix": [1, 9], "x": 9.5, "y": 1},
{"matrix": [1, 10], "x": 10.5, "y": 1},
{"matrix": [1, 11], "x": 11.5, "y": 1},
{"matrix": [1, 12], "x": 12.5, "y": 1},
{"matrix": [1, 13], "x": 13.5, "y": 1, "w": 1.5},
{"matrix": [2, 0], "x": 0, "y": 2, "w": 1.75},
{"matrix": [2, 1], "x": 1.75, "y": 2},
{"matrix": [2, 2], "x": 2.75, "y": 2},
{"matrix": [2, 3], "x": 3.75, "y": 2},
{"matrix": [2, 4], "x": 4.75, "y": 2},
{"matrix": [2, 5], "x": 5.75, "y": 2},
{"matrix": [2, 6], "x": 6.75, "y": 2},
{"matrix": [2, 7], "x": 7.75, "y": 2},
{"matrix": [2, 8], "x": 8.75, "y": 2},
{"matrix": [2, 9], "x": 9.75, "y": 2},
{"matrix": [2, 10], "x": 10.75, "y": 2},
{"matrix": [2, 11], "x": 11.75, "y": 2},
{"matrix": [2, 12], "x": 12.75, "y": 2, "w": 2.25},
{"matrix": [3, 0], "x": 0, "y": 3, "w": 2.25},
{"matrix": [3, 1], "x": 2.25, "y": 3},
{"matrix": [3, 2], "x": 3.25, "y": 3},
{"matrix": [3, 3], "x": 4.25, "y": 3},
{"matrix": [3, 4], "x": 5.25, "y": 3},
{"matrix": [3, 5], "x": 6.25, "y": 3},
{"matrix": [3, 6], "x": 7.25, "y": 3},
{"matrix": [3, 7], "x": 8.25, "y": 3},
{"matrix": [3, 8], "x": 9.25, "y": 3},
{"matrix": [3, 9], "x": 10.25, "y": 3},
{"matrix": [3, 10], "x": 11.25, "y": 3},
{"matrix": [4, 12], "x": 12.25, "y": 3, "w": 1.75},
{"matrix": [3, 13], "x": 14, "y": 3},
{"matrix": [4, 0], "x": 0, "y": 4, "w": 1.5},
{"matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.5},
{"matrix": [4, 6], "x": 4, "y": 4, "w": 7},
{"matrix": [4, 10], "x": 11, "y": 4, "w": 1.5},
{"matrix": [4, 13], "x": 13.5, "y": 4, "w": 1.5}
]
},
"LAYOUT_60_hhkb": {
"layout": [
{"matrix": [0, 0], "x": 0, "y": 0},
{"matrix": [0, 1], "x": 1, "y": 0},
{"matrix": [0, 2], "x": 2, "y": 0},
{"matrix": [0, 3], "x": 3, "y": 0},
{"matrix": [0, 4], "x": 4, "y": 0},
{"matrix": [0, 5], "x": 5, "y": 0},
{"matrix": [0, 6], "x": 6, "y": 0},
{"matrix": [0, 7], "x": 7, "y": 0},
{"matrix": [0, 8], "x": 8, "y": 0},
{"matrix": [0, 9], "x": 9, "y": 0},
{"matrix": [0, 10], "x": 10, "y": 0},
{"matrix": [0, 11], "x": 11, "y": 0},
{"matrix": [0, 12], "x": 12, "y": 0},
{"matrix": [0, 13], "x": 13, "y": 0},
{"matrix": [2, 13], "x": 14, "y": 0},
{"matrix": [1, 0], "x": 0, "y": 1, "w": 1.5},
{"matrix": [1, 1], "x": 1.5, "y": 1},
{"matrix": [1, 2], "x": 2.5, "y": 1},
{"matrix": [1, 3], "x": 3.5, "y": 1},
{"matrix": [1, 4], "x": 4.5, "y": 1},
{"matrix": [1, 5], "x": 5.5, "y": 1},
{"matrix": [1, 6], "x": 6.5, "y": 1},
{"matrix": [1, 7], "x": 7.5, "y": 1},
{"matrix": [1, 8], "x": 8.5, "y": 1},
{"matrix": [1, 9], "x": 9.5, "y": 1},
{"matrix": [1, 10], "x": 10.5, "y": 1},
{"matrix": [1, 11], "x": 11.5, "y": 1},
{"matrix": [1, 12], "x": 12.5, "y": 1},
{"matrix": [1, 13], "x": 13.5, "y": 1, "w": 1.5},
{"matrix": [2, 0], "x": 0, "y": 2, "w": 1.75},
{"matrix": [2, 1], "x": 1.75, "y": 2},
{"matrix": [2, 2], "x": 2.75, "y": 2},
{"matrix": [2, 3], "x": 3.75, "y": 2},
{"matrix": [2, 4], "x": 4.75, "y": 2},
{"matrix": [2, 5], "x": 5.75, "y": 2},
{"matrix": [2, 6], "x": 6.75, "y": 2},
{"matrix": [2, 7], "x": 7.75, "y": 2},
{"matrix": [2, 8], "x": 8.75, "y": 2},
{"matrix": [2, 9], "x": 9.75, "y": 2},
{"matrix": [2, 10], "x": 10.75, "y": 2},
{"matrix": [2, 11], "x": 11.75, "y": 2},
{"matrix": [2, 12], "x": 12.75, "y": 2, "w": 2.25},
{"matrix": [3, 0], "x": 0, "y": 3, "w": 2.25},
{"matrix": [3, 1], "x": 2.25, "y": 3},
{"matrix": [3, 2], "x": 3.25, "y": 3},
{"matrix": [3, 3], "x": 4.25, "y": 3},
{"matrix": [3, 4], "x": 5.25, "y": 3},
{"matrix": [3, 5], "x": 6.25, "y": 3},
{"matrix": [3, 6], "x": 7.25, "y": 3},
{"matrix": [3, 7], "x": 8.25, "y": 3},
{"matrix": [3, 8], "x": 9.25, "y": 3},
{"matrix": [3, 9], "x": 10.25, "y": 3},
{"matrix": [3, 10], "x": 11.25, "y": 3},
{"matrix": [4, 12], "x": 12.25, "y": 3, "w": 1.75},
{"matrix": [3, 13], "x": 14, "y": 3},
{"matrix": [4, 1], "x": 1.5, "y": 4},
{"matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.5},
{"matrix": [4, 6], "x": 4, "y": 4, "w": 7},
{"matrix": [4, 10], "x": 11, "y": 4, "w": 1.5},
{"matrix": [4, 11], "x": 12.5, "y": 4}
]
},
"LAYOUT_60_ansi_tsangan_split_bs_rshift": {
"layout": [
{"matrix": [0, 0], "x": 0, "y": 0},
{"matrix": [0, 1], "x": 1, "y": 0},
{"matrix": [0, 2], "x": 2, "y": 0},
{"matrix": [0, 3], "x": 3, "y": 0},
{"matrix": [0, 4], "x": 4, "y": 0},
{"matrix": [0, 5], "x": 5, "y": 0},
{"matrix": [0, 6], "x": 6, "y": 0},
{"matrix": [0, 7], "x": 7, "y": 0},
{"matrix": [0, 8], "x": 8, "y": 0},
{"matrix": [0, 9], "x": 9, "y": 0},
{"matrix": [0, 10], "x": 10, "y": 0},
{"matrix": [0, 11], "x": 11, "y": 0},
{"matrix": [0, 12], "x": 12, "y": 0},
{"matrix": [0, 13], "x": 13, "y": 0},
{"matrix": [2, 13], "x": 14, "y": 0},
{"matrix": [1, 0], "x": 0, "y": 1, "w": 1.5},
{"matrix": [1, 1], "x": 1.5, "y": 1},
{"matrix": [1, 2], "x": 2.5, "y": 1},
{"matrix": [1, 3], "x": 3.5, "y": 1},
{"matrix": [1, 4], "x": 4.5, "y": 1},
{"matrix": [1, 5], "x": 5.5, "y": 1},
{"matrix": [1, 6], "x": 6.5, "y": 1},
{"matrix": [1, 7], "x": 7.5, "y": 1},
{"matrix": [1, 8], "x": 8.5, "y": 1},
{"matrix": [1, 9], "x": 9.5, "y": 1},
{"matrix": [1, 10], "x": 10.5, "y": 1},
{"matrix": [1, 11], "x": 11.5, "y": 1},
{"matrix": [1, 12], "x": 12.5, "y": 1},
{"matrix": [1, 13], "x": 13.5, "y": 1, "w": 1.5},
{"matrix": [2, 0], "x": 0, "y": 2, "w": 1.75},
{"matrix": [2, 1], "x": 1.75, "y": 2},
{"matrix": [2, 2], "x": 2.75, "y": 2},
{"matrix": [2, 3], "x": 3.75, "y": 2},
{"matrix": [2, 4], "x": 4.75, "y": 2},
{"matrix": [2, 5], "x": 5.75, "y": 2},
{"matrix": [2, 6], "x": 6.75, "y": 2},
{"matrix": [2, 7], "x": 7.75, "y": 2},
{"matrix": [2, 8], "x": 8.75, "y": 2},
{"matrix": [2, 9], "x": 9.75, "y": 2},
{"matrix": [2, 10], "x": 10.75, "y": 2},
{"matrix": [2, 11], "x": 11.75, "y": 2},
{"matrix": [2, 12], "x": 12.75, "y": 2, "w": 2.25},
{"matrix": [3, 0], "x": 0, "y": 3, "w": 2.25},
{"matrix": [3, 1], "x": 2.25, "y": 3},
{"matrix": [3, 2], "x": 3.25, "y": 3},
{"matrix": [3, 3], "x": 4.25, "y": 3},
{"matrix": [3, 4], "x": 5.25, "y": 3},
{"matrix": [3, 5], "x": 6.25, "y": 3},
{"matrix": [3, 6], "x": 7.25, "y": 3},
{"matrix": [3, 7], "x": 8.25, "y": 3},
{"matrix": [3, 8], "x": 9.25, "y": 3},
{"matrix": [3, 9], "x": 10.25, "y": 3},
{"matrix": [3, 10], "x": 11.25, "y": 3},
{"matrix": [4, 12], "x": 12.25, "y": 3, "w": 1.75},
{"matrix": [3, 13], "x": 14, "y": 3},
{"matrix": [4, 0], "x": 0, "y": 4, "w": 1.5},
{"matrix": [4, 1], "x": 1.5, "y": 4},
{"matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.5},
{"matrix": [4, 6], "x": 4, "y": 4, "w": 7},
{"matrix": [4, 10], "x": 11, "y": 4, "w": 1.5},
{"matrix": [4, 11], "x": 12.5, "y": 4},
{"matrix": [4, 13], "x": 13.5, "y": 4, "w": 1.5}
]
},
"LAYOUT_60_ansi_tsangan_split_rshift": {
"layout": [
{"matrix": [0, 0], "x": 0, "y": 0},
{"matrix": [0, 1], "x": 1, "y": 0},
{"matrix": [0, 2], "x": 2, "y": 0},
{"matrix": [0, 3], "x": 3, "y": 0},
{"matrix": [0, 4], "x": 4, "y": 0},
{"matrix": [0, 5], "x": 5, "y": 0},
{"matrix": [0, 6], "x": 6, "y": 0},
{"matrix": [0, 7], "x": 7, "y": 0},
{"matrix": [0, 8], "x": 8, "y": 0},
{"matrix": [0, 9], "x": 9, "y": 0},
{"matrix": [0, 10], "x": 10, "y": 0},
{"matrix": [0, 11], "x": 11, "y": 0},
{"matrix": [0, 12], "x": 12, "y": 0},
{"matrix": [2, 13], "x": 13, "y": 0, "w": 2},
{"matrix": [1, 0], "x": 0, "y": 1, "w": 1.5},
{"matrix": [1, 1], "x": 1.5, "y": 1},
{"matrix": [1, 2], "x": 2.5, "y": 1},
{"matrix": [1, 3], "x": 3.5, "y": 1},
{"matrix": [1, 4], "x": 4.5, "y": 1},
{"matrix": [1, 5], "x": 5.5, "y": 1},
{"matrix": [1, 6], "x": 6.5, "y": 1},
{"matrix": [1, 7], "x": 7.5, "y": 1},
{"matrix": [1, 8], "x": 8.5, "y": 1},
{"matrix": [1, 9], "x": 9.5, "y": 1},
{"matrix": [1, 10], "x": 10.5, "y": 1},
{"matrix": [1, 11], "x": 11.5, "y": 1},
{"matrix": [1, 12], "x": 12.5, "y": 1},
{"matrix": [1, 13], "x": 13.5, "y": 1, "w": 1.5},
{"matrix": [2, 0], "x": 0, "y": 2, "w": 1.75},
{"matrix": [2, 1], "x": 1.75, "y": 2},
{"matrix": [2, 2], "x": 2.75, "y": 2},
{"matrix": [2, 3], "x": 3.75, "y": 2},
{"matrix": [2, 4], "x": 4.75, "y": 2},
{"matrix": [2, 5], "x": 5.75, "y": 2},
{"matrix": [2, 6], "x": 6.75, "y": 2},
{"matrix": [2, 7], "x": 7.75, "y": 2},
{"matrix": [2, 8], "x": 8.75, "y": 2},
{"matrix": [2, 9], "x": 9.75, "y": 2},
{"matrix": [2, 10], "x": 10.75, "y": 2},
{"matrix": [2, 11], "x": 11.75, "y": 2},
{"matrix": [2, 12], "x": 12.75, "y": 2, "w": 2.25},
{"matrix": [3, 0], "x": 0, "y": 3, "w": 2.25},
{"matrix": [3, 1], "x": 2.25, "y": 3},
{"matrix": [3, 2], "x": 3.25, "y": 3},
{"matrix": [3, 3], "x": 4.25, "y": 3},
{"matrix": [3, 4], "x": 5.25, "y": 3},
{"matrix": [3, 5], "x": 6.25, "y": 3},
{"matrix": [3, 6], "x": 7.25, "y": 3},
{"matrix": [3, 7], "x": 8.25, "y": 3},
{"matrix": [3, 8], "x": 9.25, "y": 3},
{"matrix": [3, 9], "x": 10.25, "y": 3},
{"matrix": [3, 10], "x": 11.25, "y": 3},
{"matrix": [4, 12], "x": 12.25, "y": 3, "w": 1.75},
{"matrix": [3, 13], "x": 14, "y": 3},
{"matrix": [4, 0], "x": 0, "y": 4, "w": 1.5},
{"matrix": [4, 1], "x": 1.5, "y": 4},
{"matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.5},
{"matrix": [4, 6], "x": 4, "y": 4, "w": 7},
{"matrix": [4, 10], "x": 11, "y": 4, "w": 1.5},
{"matrix": [4, 11], "x": 12.5, "y": 4},
{"matrix": [4, 13], "x": 13.5, "y": 4, "w": 1.5}
]
}
}
}

View File

@@ -0,0 +1,23 @@
// Copyright 2025 key10iq
// SPDX-License-Identifier: GPL-2.0-or-later
#include QMK_KEYBOARD_H
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[0] = LAYOUT_60_ansi_tsangan_split_bs_rshift(
KC_ESC, 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_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_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT,
KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, MO(1),
KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, KC_RCTL
),
[1] = LAYOUT_60_ansi_tsangan_split_bs_rshift(
QK_BOOT, 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_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_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
)
};

View File

@@ -0,0 +1,27 @@
# keyten imi60-HS
imi60-HS - 60% Hot-Swap PCB compatible with keyboards by La-Versa: Animi, Mirimi, Otsukimi and Abyss
![imi60-HS](https://live.staticflickr.com/65535/54904885051_339dbff9d8_b.jpg)
* Keyboard Maintainer: [keyten](https://github.com/key10iq)
* Hardware Supported: keyten imi60-HS
* Hardware Availability: private GB
Make example for this keyboard (after setting up your build environment):
make keyten/imi60_hs:default
Flashing example for this keyboard:
make keyten/imi60_hs: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 key at (0,0) in the matrix (usually the top left key or Escape) and plug in the keyboard
* Keycode in layout: Press the key mapped to `QK_BOOT` if it is available
* Physical reset button: Hold the button on the back of the PCB

View File

@@ -0,0 +1,5 @@
// Copyright 2025 Yiancar-Designs, Bit-Shifter
// SPDX-License-Identifier: GPL-2.0-or-later
#pragma once
#define DYNAMIC_KEYMAP_MACRO_COUNT 30

View File

@@ -0,0 +1,429 @@
{
"manufacturer": "Yiancar-Designs",
"keyboard_name": "Hyper7 v4",
"maintainer": "Yiancar-Designs",
"bootloader": "stm32-dfu",
"bootmagic": {
"matrix": [3, 0]
},
"diode_direction": "COL2ROW",
"features": {
"bootmagic": true,
"extrakey": true,
"mousekey": true,
"nkro": true
},
"matrix_pins": {
"cols": ["B11", "B10", "B2", "B1", "B0", "C5", "C4", "A7", "A6", "A5", "A4", "A3", "A2", "A1", "A0", "B12", "B13", "B14", "B15", "A8", "C9", "C8", "C7", "C6", "C11", "C10", "A15", "A14"],
"rows": ["C1", "C2", "C3", "A13", "C12", "B3", "B4", "B5"]
},
"processor": "STM32F072",
"url": "https://yiancar-designs.com",
"usb": {
"device_version": "0.0.1",
"pid": "0x6837",
"vid": "0x8968"
},
"layouts": {
"LAYOUT_modern": {
"layout": [
{"matrix": [0, 0], "x": 0, "y": 0, "w":2},
{"matrix": [0, 2], "x": 2, "y": 0, "w":2},
{"matrix": [0, 4], "x": 4.5, "y": 0, "w":2},
{"matrix": [0, 6], "x": 6.5, "y": 0, "w":2},
{"matrix": [0, 8], "x": 8.5, "y": 0, "w":2},
{"matrix": [0, 10], "x": 10.5, "y": 0, "w":2},
{"matrix": [0, 12], "x": 12.5, "y": 0, "w":2},
{"matrix": [0, 14], "x": 14.5, "y": 0, "w":2},
{"matrix": [0, 16], "x": 16.5, "y": 0, "w":2},
{"matrix": [0, 18], "x": 18.5, "y": 0, "w":2},
{"matrix": [0, 20], "x": 20.5, "y": 0, "w":2},
{"matrix": [0, 22], "x": 22.5, "y": 0, "w":2},
{"matrix": [0, 24], "x": 25, "y": 0, "w":2},
{"matrix": [0, 26], "x": 27, "y": 0, "w":2},
{"matrix": [1, 0], "x": 0, "y": 1, "w":2},
{"matrix": [1, 2], "x": 2, "y": 1, "w":2},
{"matrix": [1, 4], "x": 4.5, "y": 1, "w":2},
{"matrix": [1, 6], "x": 6.5, "y": 1, "w":2},
{"matrix": [1, 8], "x": 8.5, "y": 1, "w":2},
{"matrix": [1, 10], "x": 10.5, "y": 1, "w":2},
{"matrix": [1, 12], "x": 12.5, "y": 1, "w":2},
{"matrix": [1, 14], "x": 14.5, "y": 1, "w":2},
{"matrix": [1, 16], "x": 16.5, "y": 1, "w":2},
{"matrix": [1, 18], "x": 18.5, "y": 1, "w":2},
{"matrix": [1, 20], "x": 20.5, "y": 1, "w":2},
{"matrix": [1, 22], "x": 22.5, "y": 1, "w":2},
{"matrix": [1, 24], "x": 25, "y": 1, "w":2},
{"matrix": [1, 26], "x": 27, "y": 1, "w":2},
{"matrix": [2, 0], "x": 0, "y": 2},
{"matrix": [2, 1], "x": 1, "y": 2},
{"matrix": [2, 2], "x": 2, "y": 2},
{"matrix": [2, 3], "x": 3, "y": 2},
{"matrix": [2, 4], "x": 4.5, "y": 2, "w":2},
{"matrix": [2, 6], "x": 6.5, "y": 2},
{"matrix": [2, 7], "x": 7.5, "y": 2},
{"matrix": [2, 8], "x": 8.5, "y": 2},
{"matrix": [2, 9], "x": 9.5, "y": 2},
{"matrix": [2, 10], "x": 10.5, "y": 2},
{"matrix": [2, 11], "x": 11.5, "y": 2},
{"matrix": [2, 12], "x": 12.5, "y": 2},
{"matrix": [2, 13], "x": 13.5, "y": 2},
{"matrix": [2, 14], "x": 14.5, "y": 2},
{"matrix": [2, 15], "x": 15.5, "y": 2},
{"matrix": [2, 16], "x": 16.5, "y": 2},
{"matrix": [2, 17], "x": 17.5, "y": 2},
{"matrix": [2, 18], "x": 18.5, "y": 2},
{"matrix": [2, 19], "x": 19.5, "y": 2},
{"matrix": [2, 20], "x": 20.5, "y": 2},
{"matrix": [2, 21], "x": 21.5, "y": 2},
{"matrix": [2, 22], "x": 22.5, "y": 2, "w":2},
{"matrix": [2, 24], "x": 25, "y": 2},
{"matrix": [2, 25], "x": 26, "y": 2},
{"matrix": [2, 26], "x": 27, "y": 2},
{"matrix": [2, 27], "x": 28, "y": 2},
{"matrix": [3, 0], "x": 0, "y": 3.5},
{"matrix": [3, 1], "x": 1, "y": 3.5},
{"matrix": [3, 2], "x": 2, "y": 3.5},
{"matrix": [3, 3], "x": 3, "y": 3.5},
{"matrix": [3, 4], "x": 4.5, "y": 3.5, "w": 1.5},
{"matrix": [3, 6], "x": 6, "y": 3.5},
{"matrix": [3, 7], "x": 7, "y": 3.5},
{"matrix": [3, 8], "x": 8, "y": 3.5},
{"matrix": [3, 9], "x": 9, "y": 3.5},
{"matrix": [3, 10], "x": 10, "y": 3.5},
{"matrix": [3, 11], "x": 11, "y": 3.5},
{"matrix": [3, 12], "x": 12, "y": 3.5},
{"matrix": [3, 13], "x": 13, "y": 3.5},
{"matrix": [3, 14], "x": 14, "y": 3.5},
{"matrix": [3, 15], "x": 15, "y": 3.5},
{"matrix": [3, 16], "x": 16, "y": 3.5},
{"matrix": [3, 17], "x": 17, "y": 3.5},
{"matrix": [3, 18], "x": 18, "y": 3.5},
{"matrix": [3, 19], "x": 19, "y": 3.5},
{"matrix": [3, 20], "x": 20, "y": 3.5},
{"matrix": [3, 21], "x": 21, "y": 3.5},
{"matrix": [3, 22], "x": 22, "y": 3.5},
{"matrix": [3, 23], "x": 23, "y": 3.5, "w": 1.5},
{"matrix": [3, 24], "x": 25, "y": 3.5},
{"matrix": [3, 25], "x": 26, "y": 3.5},
{"matrix": [3, 26], "x": 27, "y": 3.5},
{"matrix": [3, 27], "x": 28, "y": 3.5},
{"matrix": [4, 0], "x": 0, "y": 4.5},
{"matrix": [4, 1], "x": 1, "y": 4.5},
{"matrix": [4, 2], "x": 2, "y": 4.5},
{"matrix": [4, 3], "x": 3, "y": 4.5},
{"matrix": [4, 4], "x": 4.5, "y": 4.5},
{"matrix": [4, 5], "x": 5.5, "y": 4.5, "w": 1.5},
{"matrix": [4, 7], "x": 7, "y": 4.5, "w": 1.5},
{"matrix": [4, 8], "x": 8.5, "y": 4.5},
{"matrix": [4, 9], "x": 9.5, "y": 4.5},
{"matrix": [4, 10], "x": 10.5, "y": 4.5},
{"matrix": [4, 11], "x": 11.5, "y": 4.5},
{"matrix": [4, 12], "x": 12.5, "y": 4.5},
{"matrix": [4, 13], "x": 13.5, "y": 4.5},
{"matrix": [4, 14], "x": 14.5, "y": 4.5},
{"matrix": [4, 15], "x": 15.5, "y": 4.5},
{"matrix": [4, 16], "x": 16.5, "y": 4.5},
{"matrix": [4, 17], "x": 17.5, "y": 4.5},
{"matrix": [4, 18], "x": 18.5, "y": 4.5},
{"matrix": [4, 19], "x": 19.5, "y": 4.5},
{"matrix": [4, 20], "x": 20.5, "y": 4.5, "w": 1.5},
{"matrix": [4, 22], "x": 22, "y": 4.5, "w": 1.5},
{"matrix": [4, 23], "x": 23.5, "y": 4.5},
{"matrix": [4, 24], "x": 25, "y": 4.5},
{"matrix": [4, 25], "x": 26, "y": 4.5},
{"matrix": [4, 26], "x": 27, "y": 4.5},
{"matrix": [4, 27], "x": 28, "y": 4.5},
{"matrix": [5, 0], "x": 0, "y": 5.5},
{"matrix": [5, 1], "x": 1, "y": 5.5},
{"matrix": [5, 2], "x": 2, "y": 5.5},
{"matrix": [5, 3], "x": 3, "y": 5.5},
{"matrix": [5, 4], "x": 4.5, "y": 5.5, "w": 1.5},
{"matrix": [5, 6], "x": 6, "y": 5.5, "w": 1.5},
{"matrix": [5, 7], "x": 7.5, "y": 5.5, "w": 1.5},
{"matrix": [5, 9], "x": 9, "y": 5.5},
{"matrix": [5, 10], "x": 10, "y": 5.5},
{"matrix": [5, 11], "x": 11, "y": 5.5},
{"matrix": [5, 12], "x": 12, "y": 5.5},
{"matrix": [5, 13], "x": 13, "y": 5.5},
{"matrix": [5, 14], "x": 14, "y": 5.5},
{"matrix": [5, 15], "x": 15, "y": 5.5},
{"matrix": [5, 16], "x": 16, "y": 5.5},
{"matrix": [5, 17], "x": 17, "y": 5.5},
{"matrix": [5, 18], "x": 18, "y": 5.5},
{"matrix": [5, 19], "x": 19, "y": 5.5},
{"matrix": [5, 20], "x": 20, "y": 5.5, "w": 1.5},
{"matrix": [5, 21], "x": 21.5, "y": 5.5, "w": 1.5},
{"matrix": [5, 23], "x": 23, "y": 5.5, "w": 1.5},
{"matrix": [5, 24], "x": 25, "y": 5.5},
{"matrix": [5, 25], "x": 26, "y": 5.5},
{"matrix": [5, 26], "x": 27, "y": 5.5},
{"matrix": [5, 27], "x": 28, "y": 5.5},
{"matrix": [6, 0], "x": 0, "y": 6.5},
{"matrix": [6, 1], "x": 1, "y": 6.5},
{"matrix": [6, 2], "x": 2, "y": 6.5},
{"matrix": [6, 3], "x": 3, "y": 6.5},
{"matrix": [6, 4], "x": 4.5, "y": 6.5},
{"matrix": [6, 5], "x": 5.5, "y": 6.5},
{"matrix": [6, 6], "x": 6.5, "y": 6.5, "w": 1.5},
{"matrix": [6, 8], "x": 8, "y": 6.5, "w": 1.5},
{"matrix": [6, 9], "x": 9.5, "y": 6.5},
{"matrix": [6, 10], "x": 10.5, "y": 6.5},
{"matrix": [6, 11], "x": 11.5, "y": 6.5},
{"matrix": [6, 12], "x": 12.5, "y": 6.5},
{"matrix": [6, 13], "x": 13.5, "y": 6.5},
{"matrix": [6, 14], "x": 14.5, "y": 6.5},
{"matrix": [6, 15], "x": 15.5, "y": 6.5},
{"matrix": [6, 16], "x": 16.5, "y": 6.5},
{"matrix": [6, 17], "x": 17.5, "y": 6.5},
{"matrix": [6, 18], "x": 18.5, "y": 6.5},
{"matrix": [6, 19], "x": 19.5, "y": 6.5, "w": 1.5},
{"matrix": [6, 21], "x": 21, "y": 6.5, "w": 1.5},
{"matrix": [6, 22], "x": 22.5, "y": 6.5},
{"matrix": [6, 23], "x": 23.5, "y": 6.5},
{"matrix": [6, 24], "x": 25, "y": 6.5},
{"matrix": [6, 25], "x": 26, "y": 6.5},
{"matrix": [6, 26], "x": 27, "y": 6.5},
{"matrix": [6, 27], "x": 28, "y": 6.5},
{"matrix": [7, 0], "x": 0, "y": 7.5},
{"matrix": [7, 1], "x": 1, "y": 7.5},
{"matrix": [7, 2], "x": 2, "y": 7.5},
{"matrix": [7, 3], "x": 3, "y": 7.5},
{"matrix": [7, 4], "x": 4.5, "y": 7.5},
{"matrix": [7, 5], "x": 5.5, "y": 7.5},
{"matrix": [7, 6], "x": 6.5, "y": 7.5},
{"matrix": [7, 7], "x": 7.5, "y": 7.5, "w": 1.5},
{"matrix": [7, 8], "x": 9, "y": 7.5, "w": 1.5},
{"matrix": [7, 13], "x": 10.5, "y": 7.5, "w": 7},
{"matrix": [7, 18], "x": 17.5, "y": 7.5},
{"matrix": [7, 19], "x": 18.5, "y": 7.5, "w": 1.5},
{"matrix": [7, 20], "x": 20, "y": 7.5, "w": 1.5},
{"matrix": [7, 21], "x": 21.5, "y": 7.5},
{"matrix": [7, 22], "x": 22.5, "y": 7.5},
{"matrix": [7, 23], "x": 23.5, "y": 7.5},
{"matrix": [7, 24], "x": 25, "y": 7.5},
{"matrix": [7, 25], "x": 26, "y": 7.5},
{"matrix": [7, 26], "x": 27, "y": 7.5},
{"matrix": [7, 27], "x": 28, "y": 7.5}
]
},
"LAYOUT_all": {
"layout": [
{"matrix": [0, 0], "x": 0, "y": 0},
{"matrix": [0, 1], "x": 1, "y": 0},
{"matrix": [0, 2], "x": 2, "y": 0},
{"matrix": [0, 3], "x": 3, "y": 0},
{"matrix": [0, 4], "x": 4.5, "y": 0},
{"matrix": [0, 5], "x": 5.5, "y": 0},
{"matrix": [0, 6], "x": 6.5, "y": 0},
{"matrix": [0, 7], "x": 7.5, "y": 0},
{"matrix": [0, 8], "x": 8.5, "y": 0},
{"matrix": [0, 9], "x": 9.5, "y": 0},
{"matrix": [0, 10], "x": 10.5, "y": 0},
{"matrix": [0, 11], "x": 11.5, "y": 0},
{"matrix": [0, 12], "x": 12.5, "y": 0},
{"matrix": [0, 13], "x": 13.5, "y": 0},
{"matrix": [0, 14], "x": 14.5, "y": 0},
{"matrix": [0, 15], "x": 15.5, "y": 0},
{"matrix": [0, 16], "x": 16.5, "y": 0},
{"matrix": [0, 17], "x": 17.5, "y": 0},
{"matrix": [0, 18], "x": 18.5, "y": 0},
{"matrix": [0, 19], "x": 19.5, "y": 0},
{"matrix": [0, 20], "x": 20.5, "y": 0},
{"matrix": [0, 21], "x": 21.5, "y": 0},
{"matrix": [0, 22], "x": 22.5, "y": 0},
{"matrix": [0, 23], "x": 23.5, "y": 0},
{"matrix": [0, 24], "x": 25, "y": 0},
{"matrix": [0, 25], "x": 26, "y": 0},
{"matrix": [0, 26], "x": 27, "y": 0},
{"matrix": [0, 27], "x": 28, "y": 0},
{"matrix": [1, 0], "x": 0, "y": 1},
{"matrix": [1, 1], "x": 1, "y": 1},
{"matrix": [1, 2], "x": 2, "y": 1},
{"matrix": [1, 3], "x": 3, "y": 1},
{"matrix": [1, 4], "x": 4.5, "y": 1},
{"matrix": [1, 5], "x": 5.5, "y": 1},
{"matrix": [1, 6], "x": 6.5, "y": 1},
{"matrix": [1, 7], "x": 7.5, "y": 1},
{"matrix": [1, 8], "x": 8.5, "y": 1},
{"matrix": [1, 9], "x": 9.5, "y": 1},
{"matrix": [1, 10], "x": 10.5, "y": 1},
{"matrix": [1, 11], "x": 11.5, "y": 1},
{"matrix": [1, 12], "x": 12.5, "y": 1},
{"matrix": [1, 13], "x": 13.5, "y": 1},
{"matrix": [1, 14], "x": 14.5, "y": 1},
{"matrix": [1, 15], "x": 15.5, "y": 1},
{"matrix": [1, 16], "x": 16.5, "y": 1},
{"matrix": [1, 17], "x": 17.5, "y": 1},
{"matrix": [1, 18], "x": 18.5, "y": 1},
{"matrix": [1, 19], "x": 19.5, "y": 1},
{"matrix": [1, 20], "x": 20.5, "y": 1},
{"matrix": [1, 21], "x": 21.5, "y": 1},
{"matrix": [1, 22], "x": 22.5, "y": 1},
{"matrix": [1, 23], "x": 23.5, "y": 1},
{"matrix": [1, 24], "x": 25, "y": 1},
{"matrix": [1, 25], "x": 26, "y": 1},
{"matrix": [1, 26], "x": 27, "y": 1},
{"matrix": [1, 27], "x": 28, "y": 1},
{"matrix": [2, 0], "x": 0, "y": 2},
{"matrix": [2, 1], "x": 1, "y": 2},
{"matrix": [2, 2], "x": 2, "y": 2},
{"matrix": [2, 3], "x": 3, "y": 2},
{"matrix": [2, 4], "x": 4.5, "y": 2},
{"matrix": [2, 5], "x": 5.5, "y": 2},
{"matrix": [2, 6], "x": 6.5, "y": 2},
{"matrix": [2, 7], "x": 7.5, "y": 2},
{"matrix": [2, 8], "x": 8.5, "y": 2},
{"matrix": [2, 9], "x": 9.5, "y": 2},
{"matrix": [2, 10], "x": 10.5, "y": 2},
{"matrix": [2, 11], "x": 11.5, "y": 2},
{"matrix": [2, 12], "x": 12.5, "y": 2},
{"matrix": [2, 13], "x": 13.5, "y": 2},
{"matrix": [2, 14], "x": 14.5, "y": 2},
{"matrix": [2, 15], "x": 15.5, "y": 2},
{"matrix": [2, 16], "x": 16.5, "y": 2},
{"matrix": [2, 17], "x": 17.5, "y": 2},
{"matrix": [2, 18], "x": 18.5, "y": 2},
{"matrix": [2, 19], "x": 19.5, "y": 2},
{"matrix": [2, 20], "x": 20.5, "y": 2},
{"matrix": [2, 21], "x": 21.5, "y": 2},
{"matrix": [2, 22], "x": 22.5, "y": 2},
{"matrix": [2, 23], "x": 23.5, "y": 2},
{"matrix": [2, 24], "x": 25, "y": 2},
{"matrix": [2, 25], "x": 26, "y": 2},
{"matrix": [2, 26], "x": 27, "y": 2},
{"matrix": [2, 27], "x": 28, "y": 2},
{"matrix": [3, 0], "x": 0, "y": 3.5},
{"matrix": [3, 1], "x": 1, "y": 3.5},
{"matrix": [3, 2], "x": 2, "y": 3.5},
{"matrix": [3, 3], "x": 3, "y": 3.5},
{"matrix": [3, 4], "x": 4.5, "y": 3.5, "w": 1.5},
{"matrix": [3, 6], "x": 6, "y": 3.5},
{"matrix": [3, 7], "x": 7, "y": 3.5},
{"matrix": [3, 8], "x": 8, "y": 3.5},
{"matrix": [3, 9], "x": 9, "y": 3.5},
{"matrix": [3, 10], "x": 10, "y": 3.5},
{"matrix": [3, 11], "x": 11, "y": 3.5},
{"matrix": [3, 12], "x": 12, "y": 3.5},
{"matrix": [3, 13], "x": 13, "y": 3.5},
{"matrix": [3, 14], "x": 14, "y": 3.5},
{"matrix": [3, 15], "x": 15, "y": 3.5},
{"matrix": [3, 16], "x": 16, "y": 3.5},
{"matrix": [3, 17], "x": 17, "y": 3.5},
{"matrix": [3, 18], "x": 18, "y": 3.5},
{"matrix": [3, 19], "x": 19, "y": 3.5},
{"matrix": [3, 20], "x": 20, "y": 3.5},
{"matrix": [3, 21], "x": 21, "y": 3.5},
{"matrix": [3, 22], "x": 22, "y": 3.5},
{"matrix": [3, 23], "x": 23, "y": 3.5, "w": 1.5},
{"matrix": [3, 24], "x": 25, "y": 3.5},
{"matrix": [3, 25], "x": 26, "y": 3.5},
{"matrix": [3, 26], "x": 27, "y": 3.5},
{"matrix": [3, 27], "x": 28, "y": 3.5},
{"matrix": [4, 0], "x": 0, "y": 4.5},
{"matrix": [4, 1], "x": 1, "y": 4.5},
{"matrix": [4, 2], "x": 2, "y": 4.5},
{"matrix": [4, 3], "x": 3, "y": 4.5},
{"matrix": [4, 4], "x": 4.5, "y": 4.5},
{"matrix": [4, 5], "x": 5.5, "y": 4.5, "w": 1.5},
{"matrix": [4, 7], "x": 7, "y": 4.5, "w": 1.5},
{"matrix": [4, 8], "x": 8.5, "y": 4.5},
{"matrix": [4, 9], "x": 9.5, "y": 4.5},
{"matrix": [4, 10], "x": 10.5, "y": 4.5},
{"matrix": [4, 11], "x": 11.5, "y": 4.5},
{"matrix": [4, 12], "x": 12.5, "y": 4.5},
{"matrix": [4, 13], "x": 13.5, "y": 4.5},
{"matrix": [4, 14], "x": 14.5, "y": 4.5},
{"matrix": [4, 15], "x": 15.5, "y": 4.5},
{"matrix": [4, 16], "x": 16.5, "y": 4.5},
{"matrix": [4, 17], "x": 17.5, "y": 4.5},
{"matrix": [4, 18], "x": 18.5, "y": 4.5},
{"matrix": [4, 19], "x": 19.5, "y": 4.5},
{"matrix": [4, 20], "x": 20.5, "y": 4.5, "w": 1.5},
{"matrix": [4, 22], "x": 22, "y": 4.5, "w": 1.5},
{"matrix": [4, 23], "x": 23.5, "y": 4.5},
{"matrix": [4, 24], "x": 25, "y": 4.5},
{"matrix": [4, 25], "x": 26, "y": 4.5},
{"matrix": [4, 26], "x": 27, "y": 4.5},
{"matrix": [4, 27], "x": 28, "y": 4.5},
{"matrix": [5, 0], "x": 0, "y": 5.5},
{"matrix": [5, 1], "x": 1, "y": 5.5},
{"matrix": [5, 2], "x": 2, "y": 5.5},
{"matrix": [5, 3], "x": 3, "y": 5.5},
{"matrix": [5, 4], "x": 4.5, "y": 5.5, "w": 1.5},
{"matrix": [5, 6], "x": 6, "y": 5.5, "w": 1.5},
{"matrix": [5, 7], "x": 7.5, "y": 5.5, "w": 1.5},
{"matrix": [5, 9], "x": 9, "y": 5.5},
{"matrix": [5, 10], "x": 10, "y": 5.5},
{"matrix": [5, 11], "x": 11, "y": 5.5},
{"matrix": [5, 12], "x": 12, "y": 5.5},
{"matrix": [5, 13], "x": 13, "y": 5.5},
{"matrix": [5, 14], "x": 14, "y": 5.5},
{"matrix": [5, 15], "x": 15, "y": 5.5},
{"matrix": [5, 16], "x": 16, "y": 5.5},
{"matrix": [5, 17], "x": 17, "y": 5.5},
{"matrix": [5, 18], "x": 18, "y": 5.5},
{"matrix": [5, 19], "x": 19, "y": 5.5},
{"matrix": [5, 20], "x": 20, "y": 5.5, "w": 1.5},
{"matrix": [5, 21], "x": 21.5, "y": 5.5, "w": 1.5},
{"matrix": [5, 23], "x": 23, "y": 5.5, "w": 1.5},
{"matrix": [5, 24], "x": 25, "y": 5.5},
{"matrix": [5, 25], "x": 26, "y": 5.5},
{"matrix": [5, 26], "x": 27, "y": 5.5},
{"matrix": [5, 27], "x": 28, "y": 5.5},
{"matrix": [6, 0], "x": 0, "y": 6.5},
{"matrix": [6, 1], "x": 1, "y": 6.5},
{"matrix": [6, 2], "x": 2, "y": 6.5},
{"matrix": [6, 3], "x": 3, "y": 6.5},
{"matrix": [6, 4], "x": 4.5, "y": 6.5},
{"matrix": [6, 5], "x": 5.5, "y": 6.5},
{"matrix": [6, 6], "x": 6.5, "y": 6.5, "w": 1.5},
{"matrix": [6, 8], "x": 8, "y": 6.5, "w": 1.5},
{"matrix": [6, 9], "x": 9.5, "y": 6.5},
{"matrix": [6, 10], "x": 10.5, "y": 6.5},
{"matrix": [6, 11], "x": 11.5, "y": 6.5},
{"matrix": [6, 12], "x": 12.5, "y": 6.5},
{"matrix": [6, 13], "x": 13.5, "y": 6.5},
{"matrix": [6, 14], "x": 14.5, "y": 6.5},
{"matrix": [6, 15], "x": 15.5, "y": 6.5},
{"matrix": [6, 16], "x": 16.5, "y": 6.5},
{"matrix": [6, 17], "x": 17.5, "y": 6.5},
{"matrix": [6, 18], "x": 18.5, "y": 6.5},
{"matrix": [6, 19], "x": 19.5, "y": 6.5, "w": 1.5},
{"matrix": [6, 21], "x": 21, "y": 6.5, "w": 1.5},
{"matrix": [6, 22], "x": 22.5, "y": 6.5},
{"matrix": [6, 23], "x": 23.5, "y": 6.5},
{"matrix": [6, 24], "x": 25, "y": 6.5},
{"matrix": [6, 25], "x": 26, "y": 6.5},
{"matrix": [6, 26], "x": 27, "y": 6.5},
{"matrix": [6, 27], "x": 28, "y": 6.5},
{"matrix": [7, 0], "x": 0, "y": 7.5},
{"matrix": [7, 1], "x": 1, "y": 7.5},
{"matrix": [7, 2], "x": 2, "y": 7.5},
{"matrix": [7, 3], "x": 3, "y": 7.5},
{"matrix": [7, 4], "x": 4.5, "y": 7.5},
{"matrix": [7, 5], "x": 5.5, "y": 7.5},
{"matrix": [7, 6], "x": 6.5, "y": 7.5},
{"matrix": [7, 7], "x": 7.5, "y": 7.5},
{"matrix": [7, 8], "x": 8.5, "y": 7.5, "w": 1.5},
{"matrix": [7, 10], "x": 10, "y": 7.5},
{"matrix": [7, 11], "x": 11, "y": 7.5, "w": 1.5},
{"matrix": [7, 12], "x": 12.5, "y": 7.5, "w": 1.5},
{"matrix": [7, 14], "x": 14, "y": 7.5},
{"matrix": [7, 15], "x": 15, "y": 7.5, "w": 1.5},
{"matrix": [7, 16], "x": 16.5, "y": 7.5, "w": 1.5},
{"matrix": [7, 18], "x": 18, "y": 7.5},
{"matrix": [7, 19], "x": 19, "y": 7.5, "w": 1.5},
{"matrix": [7, 20], "x": 20.5, "y": 7.5},
{"matrix": [7, 21], "x": 21.5, "y": 7.5},
{"matrix": [7, 22], "x": 22.5, "y": 7.5},
{"matrix": [7, 23], "x": 23.5, "y": 7.5},
{"matrix": [7, 24], "x": 25, "y": 7.5},
{"matrix": [7, 25], "x": 26, "y": 7.5},
{"matrix": [7, 26], "x": 27, "y": 7.5},
{"matrix": [7, 27], "x": 28, "y": 7.5},
{"matrix": [7, 13], "x": 11, "y": 8.5, "w": 7}
]
}
}
}

View File

@@ -0,0 +1,111 @@
// Copyright 2025 Yiancar-Designs, Bit-Shifter
// SPDX-License-Identifier: GPL-2.0-or-later
#include QMK_KEYBOARD_H
enum my_keycodes {
MACRO = QK_USER_0,
QUOTE,
CLRIN,
SQUAR,
CIRCL,
TRIAN,
DIAMO,
WRITE,
TTY,
PLUSM,
MODE,
};
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
switch (keycode) {
case MACRO:
if (record->event.pressed) {
// when keycode MACRO is pressed
SEND_STRING("Hyper7 is the best thing ever!");
}
break;
case QUOTE:
if (record->event.pressed) {
// when keycode QUOTE is pressed
SEND_STRING("\"\"" SS_TAP(X_LEFT));
}
break;
case CLRIN:
if (record->event.pressed) {
// when keycode CLRIN is pressed
SEND_STRING(SS_LCTL("a") SS_TAP(X_DEL));
}
break;
case SQUAR:
if (record->event.pressed) {
// when keycode SQUAR is pressed
SEND_STRING("I like squares");
}
break;
case CIRCL:
if (record->event.pressed) {
// when keycode CIRCL is pressed
SEND_STRING("I like circles");
}
break;
case TRIAN:
if (record->event.pressed) {
// when keycode TRIAN is pressed
SEND_STRING("I like the illuminati");
}
break;
case DIAMO:
if (record->event.pressed) {
// when keycode DIAMO is pressed
SEND_STRING("Everyone likes diamonds");
}
break;
case WRITE:
if (record->event.pressed) {
// when keycode WRITE is pressed
SEND_STRING(SS_LGUI("x") "notepad" SS_TAP(X_ENT));
}
break;
case TTY:
if (record->event.pressed) {
// when keycode TTY is pressed
SEND_STRING(SS_LGUI("x") "cmd" SS_TAP(X_ENT));
}
break;
case PLUSM:
if (record->event.pressed) {
// when keycode PLUSM is pressed
SEND_STRING("+-");
}
case MODE:
if (record->event.pressed) {
// when keycode MODE is pressed
SEND_STRING("Mode");
}
}
return true;
};
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[0] = LAYOUT_modern(
G(KC_F1), MACRO, RCS(KC_ESC), QUOTE, KC_INS, CLRIN, G(KC_D), C(KC_S), C(KC_C), A(KC_F4), KC_PAUS, C(KC_P), G(C(KC_Q)), LCA(KC_DEL),
G(KC_X), KC_WHOM, G(KC_PAUS), C(KC_R), A(KC_TAB), SQUAR, CIRCL, TRIAN, DIAMO, C(KC_Y), LAG(KC_R), RCS(KC_ESC), G(KC_L), KC_CAPS,
KC_F1, KC_F2, A(KC_F4), G(KC_R), KC_ESC, KC_QUES, KC_EXLM, KC_AT, KC_AT, KC_AT, KC_AT, KC_GRV, KC_GRV, KC_GRV, KC_GRV, KC_UNDS, KC_LABK, KC_RABK, KC_PIPE, KC_LCBR, KC_RCBR, C(KC_ENT), KC_CIRC, KC_PERC, KC_HASH, KC_DLR,
KC_F3, KC_F4, C(KC_F), WRITE, LSFT(KC_N), PLUSM, KC_TILD, 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_NUBS, KC_LBRC, KC_RBRC, C(KC_Z), KC_PMNS, KC_PSLS, KC_PAST, KC_PMNS,
KC_F5, KC_F6, C(KC_M), C(KC_Z), C(KC_V), C(KC_X), KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LCBR, KC_RCBR, KC_BSPC, KC_CLEAR, C(KC_HOME),KC_P7, KC_P8, KC_P9, KC_PPLS,
KC_F7, KC_F8, C(KC_A), KC_F12, MO(1), MODE, KC_PGUP, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_COLN, KC_QUOT, KC_ENT, KC_HOME, KC_PGDN, KC_P4, KC_P5, KC_P6, KC_AMPR,
KC_F9, KC_F10, TTY, G(KC_L), C(KC_HOME),KC_END, G(KC_DOT), KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, G(KC_DOT), KC_UP, KC_LGUI, KC_P1, KC_P2, KC_P3, KC_EQL,
KC_F11, KC_F12, KC_HOME, C(KC_END), C(KC_LEFT),C(KC_RGHT),G(KC_DOWN),KC_HYPR, KC_LALT, KC_SPC, KC_RGUI, KC_HYPR, KC_RALT, KC_LEFT, KC_DOWN, KC_RGHT, KC_DEL, KC_P0, KC_PDOT, KC_ENTER
),
[1] = LAYOUT_modern(
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, QK_BOOT, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______
),
};

View File

@@ -0,0 +1,25 @@
# Hyper7 v4
This is a very big pcb... It supports VIA.
* Keyboard Maintainer: [Yiancar](http://yiancar-designs.com/) and on [GitHub](https://github.com/yiancar)
* Hardware Supported: A very big keyboard with STM32F072RB
* Hardware Availability: https://mechboards.co.uk/
Make example for this keyboard (after setting up your build environment):
make yiancardesigns/hyper7/v4:default
Flashing example for this keyboard:
make yiancardesigns/hyper7/v4: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 key at (3,0) in the matrix (F3) and plug in the keyboard
* **Physical reset button**: Briefly press the button on the back of the PCB - some may have pads you must short instead
* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available

View File

@@ -0,0 +1,20 @@
/*
Copyright 2024 zeix (@itsme-zeix)
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#pragma once
#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET
#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET_TIMEOUT 500U

View File

@@ -0,0 +1,694 @@
{
"manufacturer": "KLC",
"keyboard_name": "Rubrehaku",
"maintainer": "itsme-zeix",
"bootloader": "rp2040",
"diode_direction": "COL2ROW",
"features": {
"bootmagic": true,
"extrakey": true,
"mousekey": true,
"nkro": true,
"rgblight": true
},
"indicators": {
"caps_lock": "GP29"
},
"matrix_pins": {
"cols": ["GP7", "GP6", "GP5", "GP4", "GP3", "GP2", "GP1", "GP0"],
"rows": ["GP27", "GP28", "GP10", "GP11", "GP18", "GP19", "GP23", "GP24", "GP25", "GP26"]
},
"processor": "RP2040",
"rgblight": {
"animations": {
"alternating": true,
"breathing": true,
"christmas": true,
"knight": true,
"rainbow_mood": true,
"rainbow_swirl": true,
"snake": true,
"static_gradient": true,
"twinkle": true
},
"default": {
"hue": 210,
"sat": 100,
"val": 8
},
"driver": "ws2812",
"led_count": 16,
"sleep": true
},
"url": "https://klc-playground.com",
"usb": {
"device_version": "0.0.1",
"pid": "0x8889",
"vid": "0x4C27"
},
"ws2812": {
"driver": "vendor",
"pin": "GP20"
},
"layouts": {
"LAYOUT_all": {
"layout": [
{"matrix": [0, 0], "x": 0, "y": 0},
{"matrix": [1, 0], "x": 1, "y": 0},
{"matrix": [0, 1], "x": 2, "y": 0},
{"matrix": [1, 1], "x": 3, "y": 0},
{"matrix": [0, 2], "x": 4, "y": 0},
{"matrix": [1, 2], "x": 5, "y": 0},
{"matrix": [0, 3], "x": 6, "y": 0},
{"matrix": [1, 3], "x": 7, "y": 0},
{"matrix": [0, 4], "x": 8, "y": 0},
{"matrix": [1, 4], "x": 9, "y": 0},
{"matrix": [0, 5], "x": 10, "y": 0},
{"matrix": [1, 5], "x": 11, "y": 0},
{"matrix": [0, 6], "x": 12, "y": 0},
{"matrix": [1, 6], "x": 13, "y": 0},
{"matrix": [0, 7], "x": 14, "y": 0},
{"matrix": [2, 0], "x": 0, "y": 1, "w": 1.5},
{"matrix": [3, 0], "x": 1.5, "y": 1},
{"matrix": [2, 1], "x": 2.5, "y": 1},
{"matrix": [3, 1], "x": 3.5, "y": 1},
{"matrix": [2, 2], "x": 4.5, "y": 1},
{"matrix": [3, 2], "x": 5.5, "y": 1},
{"matrix": [2, 3], "x": 6.5, "y": 1},
{"matrix": [3, 3], "x": 7.5, "y": 1},
{"matrix": [2, 4], "x": 8.5, "y": 1},
{"matrix": [3, 4], "x": 9.5, "y": 1},
{"matrix": [2, 5], "x": 10.5, "y": 1},
{"matrix": [3, 5], "x": 11.5, "y": 1},
{"matrix": [2, 6], "x": 12.5, "y": 1},
{"matrix": [3, 6], "x": 13.5, "y": 1, "w": 1.5},
{"matrix": [3, 7], "x": 15, "y": 1},
{"matrix": [4, 0], "x": 0, "y": 2, "w": 1.75},
{"matrix": [5, 0], "x": 1.75, "y": 2},
{"matrix": [4, 1], "x": 2.75, "y": 2},
{"matrix": [5, 1], "x": 3.75, "y": 2},
{"matrix": [4, 2], "x": 4.75, "y": 2},
{"matrix": [5, 2], "x": 5.75, "y": 2},
{"matrix": [4, 3], "x": 6.75, "y": 2},
{"matrix": [5, 3], "x": 7.75, "y": 2},
{"matrix": [4, 4], "x": 8.75, "y": 2},
{"matrix": [5, 4], "x": 9.75, "y": 2},
{"matrix": [4, 5], "x": 10.75, "y": 2},
{"matrix": [5, 5], "x": 11.75, "y": 2},
{"matrix": [4, 6], "x": 12.75, "y": 2},
{"matrix": [5, 6], "x": 13.75, "y": 2, "w": 1.25},
{"matrix": [5, 7], "x": 15, "y": 2},
{"matrix": [6, 0], "x": 0, "y": 3, "w": 1.25},
{"matrix": [7, 0], "x": 1.25, "y": 3},
{"matrix": [6, 1], "x": 2.25, "y": 3},
{"matrix": [7, 1], "x": 3.25, "y": 3},
{"matrix": [6, 2], "x": 4.25, "y": 3},
{"matrix": [7, 2], "x": 5.25, "y": 3},
{"matrix": [6, 3], "x": 6.25, "y": 3},
{"matrix": [7, 3], "x": 7.25, "y": 3},
{"matrix": [6, 4], "x": 8.25, "y": 3},
{"matrix": [7, 4], "x": 9.25, "y": 3},
{"matrix": [6, 5], "x": 10.25, "y": 3},
{"matrix": [7, 5], "x": 11.25, "y": 3},
{"matrix": [6, 6], "x": 12.25, "y": 3, "w": 1.75},
{"matrix": [7, 6], "x": 14, "y": 3},
{"matrix": [7, 7], "x": 15, "y": 3},
{"matrix": [8, 0], "x": 0, "y": 4, "w": 1.25},
{"matrix": [9, 0], "x": 1.25, "y": 4, "w": 1.25},
{"matrix": [8, 1], "x": 2.5, "y": 4, "w": 1.25},
{"matrix": [9, 2], "x": 3.75, "y": 4, "w": 2.75},
{"matrix": [8, 3], "x": 6.5, "y": 4, "w": 1.25},
{"matrix": [9, 4], "x": 7.75, "y": 4, "w": 2.25},
{"matrix": [8, 5], "x": 10, "y": 4, "w": 1.25},
{"matrix": [9, 5], "x": 11.25, "y": 4, "w": 1.25},
{"matrix": [8, 6], "x": 13, "y": 4},
{"matrix": [9, 6], "x": 14, "y": 4},
{"matrix": [9, 7], "x": 15, "y": 4}
]
},
"LAYOUT_ansi": {
"layout": [
{"matrix": [0, 0], "x": 0, "y": 0},
{"matrix": [1, 0], "x": 1, "y": 0},
{"matrix": [0, 1], "x": 2, "y": 0},
{"matrix": [1, 1], "x": 3, "y": 0},
{"matrix": [0, 2], "x": 4, "y": 0},
{"matrix": [1, 2], "x": 5, "y": 0},
{"matrix": [0, 3], "x": 6, "y": 0},
{"matrix": [1, 3], "x": 7, "y": 0},
{"matrix": [0, 4], "x": 8, "y": 0},
{"matrix": [1, 4], "x": 9, "y": 0},
{"matrix": [0, 5], "x": 10, "y": 0},
{"matrix": [1, 5], "x": 11, "y": 0},
{"matrix": [0, 6], "x": 12, "y": 0},
{"matrix": [0, 7], "x": 13, "y": 0, "w": 2},
{"matrix": [2, 0], "x": 0, "y": 1, "w": 1.5},
{"matrix": [3, 0], "x": 1.5, "y": 1},
{"matrix": [2, 1], "x": 2.5, "y": 1},
{"matrix": [3, 1], "x": 3.5, "y": 1},
{"matrix": [2, 2], "x": 4.5, "y": 1},
{"matrix": [3, 2], "x": 5.5, "y": 1},
{"matrix": [2, 3], "x": 6.5, "y": 1},
{"matrix": [3, 3], "x": 7.5, "y": 1},
{"matrix": [2, 4], "x": 8.5, "y": 1},
{"matrix": [3, 4], "x": 9.5, "y": 1},
{"matrix": [2, 5], "x": 10.5, "y": 1},
{"matrix": [3, 5], "x": 11.5, "y": 1},
{"matrix": [2, 6], "x": 12.5, "y": 1},
{"matrix": [3, 6], "x": 13.5, "y": 1, "w": 1.5},
{"matrix": [3, 7], "x": 15, "y": 1},
{"matrix": [4, 0], "x": 0, "y": 2, "w": 1.75},
{"matrix": [5, 0], "x": 1.75, "y": 2},
{"matrix": [4, 1], "x": 2.75, "y": 2},
{"matrix": [5, 1], "x": 3.75, "y": 2},
{"matrix": [4, 2], "x": 4.75, "y": 2},
{"matrix": [5, 2], "x": 5.75, "y": 2},
{"matrix": [4, 3], "x": 6.75, "y": 2},
{"matrix": [5, 3], "x": 7.75, "y": 2},
{"matrix": [4, 4], "x": 8.75, "y": 2},
{"matrix": [5, 4], "x": 9.75, "y": 2},
{"matrix": [4, 5], "x": 10.75, "y": 2},
{"matrix": [5, 5], "x": 11.75, "y": 2},
{"matrix": [5, 6], "x": 12.75, "y": 2, "w": 2.25},
{"matrix": [5, 7], "x": 15, "y": 2},
{"matrix": [6, 0], "x": 0, "y": 3, "w": 2.25},
{"matrix": [6, 1], "x": 2.25, "y": 3},
{"matrix": [7, 1], "x": 3.25, "y": 3},
{"matrix": [6, 2], "x": 4.25, "y": 3},
{"matrix": [7, 2], "x": 5.25, "y": 3},
{"matrix": [6, 3], "x": 6.25, "y": 3},
{"matrix": [7, 3], "x": 7.25, "y": 3},
{"matrix": [6, 4], "x": 8.25, "y": 3},
{"matrix": [7, 4], "x": 9.25, "y": 3},
{"matrix": [6, 5], "x": 10.25, "y": 3},
{"matrix": [7, 5], "x": 11.25, "y": 3},
{"matrix": [6, 6], "x": 12.25, "y": 3, "w": 1.75},
{"matrix": [7, 6], "x": 14, "y": 3},
{"matrix": [7, 7], "x": 15, "y": 3},
{"matrix": [8, 0], "x": 0, "y": 4, "w": 1.25},
{"matrix": [9, 0], "x": 1.25, "y": 4, "w": 1.25},
{"matrix": [8, 1], "x": 2.5, "y": 4, "w": 1.25},
{"matrix": [8, 3], "x": 3.75, "y": 4, "w": 6.25},
{"matrix": [8, 5], "x": 10, "y": 4, "w": 1.25},
{"matrix": [9, 5], "x": 11.25, "y": 4, "w": 1.25},
{"matrix": [8, 6], "x": 13, "y": 4},
{"matrix": [9, 6], "x": 14, "y": 4},
{"matrix": [9, 7], "x": 15, "y": 4}
]
},
"LAYOUT_ansi_split_bs": {
"layout": [
{"matrix": [0, 0], "x": 0, "y": 0},
{"matrix": [1, 0], "x": 1, "y": 0},
{"matrix": [0, 1], "x": 2, "y": 0},
{"matrix": [1, 1], "x": 3, "y": 0},
{"matrix": [0, 2], "x": 4, "y": 0},
{"matrix": [1, 2], "x": 5, "y": 0},
{"matrix": [0, 3], "x": 6, "y": 0},
{"matrix": [1, 3], "x": 7, "y": 0},
{"matrix": [0, 4], "x": 8, "y": 0},
{"matrix": [1, 4], "x": 9, "y": 0},
{"matrix": [0, 5], "x": 10, "y": 0},
{"matrix": [1, 5], "x": 11, "y": 0},
{"matrix": [0, 6], "x": 12, "y": 0},
{"matrix": [1, 6], "x": 13, "y": 0},
{"matrix": [0, 7], "x": 14, "y": 0},
{"matrix": [2, 0], "x": 0, "y": 1, "w": 1.5},
{"matrix": [3, 0], "x": 1.5, "y": 1},
{"matrix": [2, 1], "x": 2.5, "y": 1},
{"matrix": [3, 1], "x": 3.5, "y": 1},
{"matrix": [2, 2], "x": 4.5, "y": 1},
{"matrix": [3, 2], "x": 5.5, "y": 1},
{"matrix": [2, 3], "x": 6.5, "y": 1},
{"matrix": [3, 3], "x": 7.5, "y": 1},
{"matrix": [2, 4], "x": 8.5, "y": 1},
{"matrix": [3, 4], "x": 9.5, "y": 1},
{"matrix": [2, 5], "x": 10.5, "y": 1},
{"matrix": [3, 5], "x": 11.5, "y": 1},
{"matrix": [2, 6], "x": 12.5, "y": 1},
{"matrix": [3, 6], "x": 13.5, "y": 1, "w": 1.5},
{"matrix": [3, 7], "x": 15, "y": 1},
{"matrix": [4, 0], "x": 0, "y": 2, "w": 1.75},
{"matrix": [5, 0], "x": 1.75, "y": 2},
{"matrix": [4, 1], "x": 2.75, "y": 2},
{"matrix": [5, 1], "x": 3.75, "y": 2},
{"matrix": [4, 2], "x": 4.75, "y": 2},
{"matrix": [5, 2], "x": 5.75, "y": 2},
{"matrix": [4, 3], "x": 6.75, "y": 2},
{"matrix": [5, 3], "x": 7.75, "y": 2},
{"matrix": [4, 4], "x": 8.75, "y": 2},
{"matrix": [5, 4], "x": 9.75, "y": 2},
{"matrix": [4, 5], "x": 10.75, "y": 2},
{"matrix": [5, 5], "x": 11.75, "y": 2},
{"matrix": [5, 6], "x": 12.75, "y": 2, "w": 2.25},
{"matrix": [5, 7], "x": 15, "y": 2},
{"matrix": [6, 0], "x": 0, "y": 3, "w": 2.25},
{"matrix": [6, 1], "x": 2.25, "y": 3},
{"matrix": [7, 1], "x": 3.25, "y": 3},
{"matrix": [6, 2], "x": 4.25, "y": 3},
{"matrix": [7, 2], "x": 5.25, "y": 3},
{"matrix": [6, 3], "x": 6.25, "y": 3},
{"matrix": [7, 3], "x": 7.25, "y": 3},
{"matrix": [6, 4], "x": 8.25, "y": 3},
{"matrix": [7, 4], "x": 9.25, "y": 3},
{"matrix": [6, 5], "x": 10.25, "y": 3},
{"matrix": [7, 5], "x": 11.25, "y": 3},
{"matrix": [6, 6], "x": 12.25, "y": 3, "w": 1.75},
{"matrix": [7, 6], "x": 14, "y": 3},
{"matrix": [7, 7], "x": 15, "y": 3},
{"matrix": [8, 0], "x": 0, "y": 4, "w": 1.25},
{"matrix": [9, 0], "x": 1.25, "y": 4, "w": 1.25},
{"matrix": [8, 1], "x": 2.5, "y": 4, "w": 1.25},
{"matrix": [8, 3], "x": 3.75, "y": 4, "w": 6.25},
{"matrix": [8, 5], "x": 10, "y": 4, "w": 1.25},
{"matrix": [9, 5], "x": 11.25, "y": 4, "w": 1.25},
{"matrix": [8, 6], "x": 13, "y": 4},
{"matrix": [9, 6], "x": 14, "y": 4},
{"matrix": [9, 7], "x": 15, "y": 4}
]
},
"LAYOUT_ansi_tsangan": {
"layout": [
{"matrix": [0, 0], "x": 0, "y": 0},
{"matrix": [1, 0], "x": 1, "y": 0},
{"matrix": [0, 1], "x": 2, "y": 0},
{"matrix": [1, 1], "x": 3, "y": 0},
{"matrix": [0, 2], "x": 4, "y": 0},
{"matrix": [1, 2], "x": 5, "y": 0},
{"matrix": [0, 3], "x": 6, "y": 0},
{"matrix": [1, 3], "x": 7, "y": 0},
{"matrix": [0, 4], "x": 8, "y": 0},
{"matrix": [1, 4], "x": 9, "y": 0},
{"matrix": [0, 5], "x": 10, "y": 0},
{"matrix": [1, 5], "x": 11, "y": 0},
{"matrix": [0, 6], "x": 12, "y": 0},
{"matrix": [0, 7], "x": 13, "y": 0, "w": 2},
{"matrix": [2, 0], "x": 0, "y": 1, "w": 1.5},
{"matrix": [3, 0], "x": 1.5, "y": 1},
{"matrix": [2, 1], "x": 2.5, "y": 1},
{"matrix": [3, 1], "x": 3.5, "y": 1},
{"matrix": [2, 2], "x": 4.5, "y": 1},
{"matrix": [3, 2], "x": 5.5, "y": 1},
{"matrix": [2, 3], "x": 6.5, "y": 1},
{"matrix": [3, 3], "x": 7.5, "y": 1},
{"matrix": [2, 4], "x": 8.5, "y": 1},
{"matrix": [3, 4], "x": 9.5, "y": 1},
{"matrix": [2, 5], "x": 10.5, "y": 1},
{"matrix": [3, 5], "x": 11.5, "y": 1},
{"matrix": [2, 6], "x": 12.5, "y": 1},
{"matrix": [3, 6], "x": 13.5, "y": 1, "w": 1.5},
{"matrix": [3, 7], "x": 15, "y": 1},
{"matrix": [4, 0], "x": 0, "y": 2, "w": 1.75},
{"matrix": [5, 0], "x": 1.75, "y": 2},
{"matrix": [4, 1], "x": 2.75, "y": 2},
{"matrix": [5, 1], "x": 3.75, "y": 2},
{"matrix": [4, 2], "x": 4.75, "y": 2},
{"matrix": [5, 2], "x": 5.75, "y": 2},
{"matrix": [4, 3], "x": 6.75, "y": 2},
{"matrix": [5, 3], "x": 7.75, "y": 2},
{"matrix": [4, 4], "x": 8.75, "y": 2},
{"matrix": [5, 4], "x": 9.75, "y": 2},
{"matrix": [4, 5], "x": 10.75, "y": 2},
{"matrix": [5, 5], "x": 11.75, "y": 2},
{"matrix": [5, 6], "x": 12.75, "y": 2, "w": 2.25},
{"matrix": [5, 7], "x": 15, "y": 2},
{"matrix": [6, 0], "x": 0, "y": 3, "w": 2.25},
{"matrix": [6, 1], "x": 2.25, "y": 3},
{"matrix": [7, 1], "x": 3.25, "y": 3},
{"matrix": [6, 2], "x": 4.25, "y": 3},
{"matrix": [7, 2], "x": 5.25, "y": 3},
{"matrix": [6, 3], "x": 6.25, "y": 3},
{"matrix": [7, 3], "x": 7.25, "y": 3},
{"matrix": [6, 4], "x": 8.25, "y": 3},
{"matrix": [7, 4], "x": 9.25, "y": 3},
{"matrix": [6, 5], "x": 10.25, "y": 3},
{"matrix": [7, 5], "x": 11.25, "y": 3},
{"matrix": [6, 6], "x": 12.25, "y": 3, "w": 1.75},
{"matrix": [7, 6], "x": 14, "y": 3},
{"matrix": [7, 7], "x": 15, "y": 3},
{"matrix": [8, 0], "x": 0, "y": 4, "w": 1.5},
{"matrix": [9, 0], "x": 1.5, "y": 4},
{"matrix": [8, 1], "x": 2.5, "y": 4, "w": 1.5},
{"matrix": [8, 3], "x": 4, "y": 4, "w": 7},
{"matrix": [8, 5], "x": 11, "y": 4, "w": 1.5},
{"matrix": [8, 6], "x": 13, "y": 4},
{"matrix": [9, 6], "x": 14, "y": 4},
{"matrix": [9, 7], "x": 15, "y": 4}
]
},
"LAYOUT_ansi_tsangan_split_bs": {
"layout": [
{"matrix": [0, 0], "x": 0, "y": 0},
{"matrix": [1, 0], "x": 1, "y": 0},
{"matrix": [0, 1], "x": 2, "y": 0},
{"matrix": [1, 1], "x": 3, "y": 0},
{"matrix": [0, 2], "x": 4, "y": 0},
{"matrix": [1, 2], "x": 5, "y": 0},
{"matrix": [0, 3], "x": 6, "y": 0},
{"matrix": [1, 3], "x": 7, "y": 0},
{"matrix": [0, 4], "x": 8, "y": 0},
{"matrix": [1, 4], "x": 9, "y": 0},
{"matrix": [0, 5], "x": 10, "y": 0},
{"matrix": [1, 5], "x": 11, "y": 0},
{"matrix": [0, 6], "x": 12, "y": 0},
{"matrix": [1, 6], "x": 13, "y": 0},
{"matrix": [0, 7], "x": 14, "y": 0},
{"matrix": [2, 0], "x": 0, "y": 1, "w": 1.5},
{"matrix": [3, 0], "x": 1.5, "y": 1},
{"matrix": [2, 1], "x": 2.5, "y": 1},
{"matrix": [3, 1], "x": 3.5, "y": 1},
{"matrix": [2, 2], "x": 4.5, "y": 1},
{"matrix": [3, 2], "x": 5.5, "y": 1},
{"matrix": [2, 3], "x": 6.5, "y": 1},
{"matrix": [3, 3], "x": 7.5, "y": 1},
{"matrix": [2, 4], "x": 8.5, "y": 1},
{"matrix": [3, 4], "x": 9.5, "y": 1},
{"matrix": [2, 5], "x": 10.5, "y": 1},
{"matrix": [3, 5], "x": 11.5, "y": 1},
{"matrix": [2, 6], "x": 12.5, "y": 1},
{"matrix": [3, 6], "x": 13.5, "y": 1, "w": 1.5},
{"matrix": [3, 7], "x": 15, "y": 1},
{"matrix": [4, 0], "x": 0, "y": 2, "w": 1.75},
{"matrix": [5, 0], "x": 1.75, "y": 2},
{"matrix": [4, 1], "x": 2.75, "y": 2},
{"matrix": [5, 1], "x": 3.75, "y": 2},
{"matrix": [4, 2], "x": 4.75, "y": 2},
{"matrix": [5, 2], "x": 5.75, "y": 2},
{"matrix": [4, 3], "x": 6.75, "y": 2},
{"matrix": [5, 3], "x": 7.75, "y": 2},
{"matrix": [4, 4], "x": 8.75, "y": 2},
{"matrix": [5, 4], "x": 9.75, "y": 2},
{"matrix": [4, 5], "x": 10.75, "y": 2},
{"matrix": [5, 5], "x": 11.75, "y": 2},
{"matrix": [5, 6], "x": 12.75, "y": 2, "w": 2.25},
{"matrix": [5, 7], "x": 15, "y": 2},
{"matrix": [6, 0], "x": 0, "y": 3, "w": 2.25},
{"matrix": [6, 1], "x": 2.25, "y": 3},
{"matrix": [7, 1], "x": 3.25, "y": 3},
{"matrix": [6, 2], "x": 4.25, "y": 3},
{"matrix": [7, 2], "x": 5.25, "y": 3},
{"matrix": [6, 3], "x": 6.25, "y": 3},
{"matrix": [7, 3], "x": 7.25, "y": 3},
{"matrix": [6, 4], "x": 8.25, "y": 3},
{"matrix": [7, 4], "x": 9.25, "y": 3},
{"matrix": [6, 5], "x": 10.25, "y": 3},
{"matrix": [7, 5], "x": 11.25, "y": 3},
{"matrix": [6, 6], "x": 12.25, "y": 3, "w": 1.75},
{"matrix": [7, 6], "x": 14, "y": 3},
{"matrix": [7, 7], "x": 15, "y": 3},
{"matrix": [8, 0], "x": 0, "y": 4, "w": 1.5},
{"matrix": [9, 0], "x": 1.5, "y": 4},
{"matrix": [8, 1], "x": 2.5, "y": 4, "w": 1.5},
{"matrix": [8, 3], "x": 4, "y": 4, "w": 7},
{"matrix": [8, 5], "x": 11, "y": 4, "w": 1.5},
{"matrix": [8, 6], "x": 13, "y": 4},
{"matrix": [9, 6], "x": 14, "y": 4},
{"matrix": [9, 7], "x": 15, "y": 4}
]
},
"LAYOUT_iso": {
"layout": [
{"matrix": [0, 0], "x": 0, "y": 0},
{"matrix": [1, 0], "x": 1, "y": 0},
{"matrix": [0, 1], "x": 2, "y": 0},
{"matrix": [1, 1], "x": 3, "y": 0},
{"matrix": [0, 2], "x": 4, "y": 0},
{"matrix": [1, 2], "x": 5, "y": 0},
{"matrix": [0, 3], "x": 6, "y": 0},
{"matrix": [1, 3], "x": 7, "y": 0},
{"matrix": [0, 4], "x": 8, "y": 0},
{"matrix": [1, 4], "x": 9, "y": 0},
{"matrix": [0, 5], "x": 10, "y": 0},
{"matrix": [1, 5], "x": 11, "y": 0},
{"matrix": [0, 6], "x": 12, "y": 0},
{"matrix": [0, 7], "x": 13, "y": 0, "w": 2},
{"matrix": [2, 0], "x": 0, "y": 1, "w": 1.5},
{"matrix": [3, 0], "x": 1.5, "y": 1},
{"matrix": [2, 1], "x": 2.5, "y": 1},
{"matrix": [3, 1], "x": 3.5, "y": 1},
{"matrix": [2, 2], "x": 4.5, "y": 1},
{"matrix": [3, 2], "x": 5.5, "y": 1},
{"matrix": [2, 3], "x": 6.5, "y": 1},
{"matrix": [3, 3], "x": 7.5, "y": 1},
{"matrix": [2, 4], "x": 8.5, "y": 1},
{"matrix": [3, 4], "x": 9.5, "y": 1},
{"matrix": [2, 5], "x": 10.5, "y": 1},
{"matrix": [3, 5], "x": 11.5, "y": 1},
{"matrix": [2, 6], "x": 12.5, "y": 1},
{"matrix": [3, 7], "x": 15, "y": 1},
{"matrix": [4, 0], "x": 0, "y": 2, "w": 1.75},
{"matrix": [5, 0], "x": 1.75, "y": 2},
{"matrix": [4, 1], "x": 2.75, "y": 2},
{"matrix": [5, 1], "x": 3.75, "y": 2},
{"matrix": [4, 2], "x": 4.75, "y": 2},
{"matrix": [5, 2], "x": 5.75, "y": 2},
{"matrix": [4, 3], "x": 6.75, "y": 2},
{"matrix": [5, 3], "x": 7.75, "y": 2},
{"matrix": [4, 4], "x": 8.75, "y": 2},
{"matrix": [5, 4], "x": 9.75, "y": 2},
{"matrix": [4, 5], "x": 10.75, "y": 2},
{"matrix": [5, 5], "x": 11.75, "y": 2},
{"matrix": [4, 6], "x": 12.75, "y": 2},
{"matrix": [5, 6], "x": 13.75, "y": 1, "w": 1.25, "h": 2},
{"matrix": [5, 7], "x": 15, "y": 2},
{"matrix": [6, 0], "x": 0, "y": 3, "w": 1.25},
{"matrix": [7, 0], "x": 1.25, "y": 3},
{"matrix": [6, 1], "x": 2.25, "y": 3},
{"matrix": [7, 1], "x": 3.25, "y": 3},
{"matrix": [6, 2], "x": 4.25, "y": 3},
{"matrix": [7, 2], "x": 5.25, "y": 3},
{"matrix": [6, 3], "x": 6.25, "y": 3},
{"matrix": [7, 3], "x": 7.25, "y": 3},
{"matrix": [6, 4], "x": 8.25, "y": 3},
{"matrix": [7, 4], "x": 9.25, "y": 3},
{"matrix": [6, 5], "x": 10.25, "y": 3},
{"matrix": [7, 5], "x": 11.25, "y": 3},
{"matrix": [6, 6], "x": 12.25, "y": 3, "w": 1.75},
{"matrix": [7, 6], "x": 14, "y": 3},
{"matrix": [7, 7], "x": 15, "y": 3},
{"matrix": [8, 0], "x": 0, "y": 4, "w": 1.25},
{"matrix": [9, 0], "x": 1.25, "y": 4, "w": 1.25},
{"matrix": [8, 1], "x": 2.5, "y": 4, "w": 1.25},
{"matrix": [8, 3], "x": 3.75, "y": 4, "w": 6.25},
{"matrix": [8, 5], "x": 10, "y": 4, "w": 1.25},
{"matrix": [9, 5], "x": 11.25, "y": 4, "w": 1.25},
{"matrix": [8, 6], "x": 13, "y": 4},
{"matrix": [9, 6], "x": 14, "y": 4},
{"matrix": [9, 7], "x": 15, "y": 4}
]
},
"LAYOUT_iso_split_bs": {
"layout": [
{"matrix": [0, 0], "x": 0, "y": 0},
{"matrix": [1, 0], "x": 1, "y": 0},
{"matrix": [0, 1], "x": 2, "y": 0},
{"matrix": [1, 1], "x": 3, "y": 0},
{"matrix": [0, 2], "x": 4, "y": 0},
{"matrix": [1, 2], "x": 5, "y": 0},
{"matrix": [0, 3], "x": 6, "y": 0},
{"matrix": [1, 3], "x": 7, "y": 0},
{"matrix": [0, 4], "x": 8, "y": 0},
{"matrix": [1, 4], "x": 9, "y": 0},
{"matrix": [0, 5], "x": 10, "y": 0},
{"matrix": [1, 5], "x": 11, "y": 0},
{"matrix": [0, 6], "x": 12, "y": 0},
{"matrix": [1, 6], "x": 13, "y": 0},
{"matrix": [0, 7], "x": 14, "y": 0},
{"matrix": [2, 0], "x": 0, "y": 1, "w": 1.5},
{"matrix": [3, 0], "x": 1.5, "y": 1},
{"matrix": [2, 1], "x": 2.5, "y": 1},
{"matrix": [3, 1], "x": 3.5, "y": 1},
{"matrix": [2, 2], "x": 4.5, "y": 1},
{"matrix": [3, 2], "x": 5.5, "y": 1},
{"matrix": [2, 3], "x": 6.5, "y": 1},
{"matrix": [3, 3], "x": 7.5, "y": 1},
{"matrix": [2, 4], "x": 8.5, "y": 1},
{"matrix": [3, 4], "x": 9.5, "y": 1},
{"matrix": [2, 5], "x": 10.5, "y": 1},
{"matrix": [3, 5], "x": 11.5, "y": 1},
{"matrix": [2, 6], "x": 12.5, "y": 1},
{"matrix": [3, 7], "x": 15, "y": 1},
{"matrix": [4, 0], "x": 0, "y": 2, "w": 1.75},
{"matrix": [5, 0], "x": 1.75, "y": 2},
{"matrix": [4, 1], "x": 2.75, "y": 2},
{"matrix": [5, 1], "x": 3.75, "y": 2},
{"matrix": [4, 2], "x": 4.75, "y": 2},
{"matrix": [5, 2], "x": 5.75, "y": 2},
{"matrix": [4, 3], "x": 6.75, "y": 2},
{"matrix": [5, 3], "x": 7.75, "y": 2},
{"matrix": [4, 4], "x": 8.75, "y": 2},
{"matrix": [5, 4], "x": 9.75, "y": 2},
{"matrix": [4, 5], "x": 10.75, "y": 2},
{"matrix": [5, 5], "x": 11.75, "y": 2},
{"matrix": [4, 6], "x": 12.75, "y": 2},
{"matrix": [5, 6], "x": 13.75, "y": 1, "w": 1.25, "h": 2},
{"matrix": [5, 7], "x": 15, "y": 2},
{"matrix": [6, 0], "x": 0, "y": 3, "w": 1.25},
{"matrix": [7, 0], "x": 1.25, "y": 3},
{"matrix": [6, 1], "x": 2.25, "y": 3},
{"matrix": [7, 1], "x": 3.25, "y": 3},
{"matrix": [6, 2], "x": 4.25, "y": 3},
{"matrix": [7, 2], "x": 5.25, "y": 3},
{"matrix": [6, 3], "x": 6.25, "y": 3},
{"matrix": [7, 3], "x": 7.25, "y": 3},
{"matrix": [6, 4], "x": 8.25, "y": 3},
{"matrix": [7, 4], "x": 9.25, "y": 3},
{"matrix": [6, 5], "x": 10.25, "y": 3},
{"matrix": [7, 5], "x": 11.25, "y": 3},
{"matrix": [6, 6], "x": 12.25, "y": 3, "w": 1.75},
{"matrix": [7, 6], "x": 14, "y": 3},
{"matrix": [7, 7], "x": 15, "y": 3},
{"matrix": [8, 0], "x": 0, "y": 4, "w": 1.25},
{"matrix": [9, 0], "x": 1.25, "y": 4, "w": 1.25},
{"matrix": [8, 1], "x": 2.5, "y": 4, "w": 1.25},
{"matrix": [8, 3], "x": 3.75, "y": 4, "w": 6.25},
{"matrix": [8, 5], "x": 10, "y": 4, "w": 1.25},
{"matrix": [9, 5], "x": 11.25, "y": 4, "w": 1.25},
{"matrix": [8, 6], "x": 13, "y": 4},
{"matrix": [9, 6], "x": 14, "y": 4},
{"matrix": [9, 7], "x": 15, "y": 4}
]
},
"LAYOUT_iso_tsangan": {
"layout": [
{"matrix": [0, 0], "x": 0, "y": 0},
{"matrix": [1, 0], "x": 1, "y": 0},
{"matrix": [0, 1], "x": 2, "y": 0},
{"matrix": [1, 1], "x": 3, "y": 0},
{"matrix": [0, 2], "x": 4, "y": 0},
{"matrix": [1, 2], "x": 5, "y": 0},
{"matrix": [0, 3], "x": 6, "y": 0},
{"matrix": [1, 3], "x": 7, "y": 0},
{"matrix": [0, 4], "x": 8, "y": 0},
{"matrix": [1, 4], "x": 9, "y": 0},
{"matrix": [0, 5], "x": 10, "y": 0},
{"matrix": [1, 5], "x": 11, "y": 0},
{"matrix": [0, 6], "x": 12, "y": 0},
{"matrix": [0, 7], "x": 13, "y": 0, "w": 2},
{"matrix": [2, 0], "x": 0, "y": 1, "w": 1.5},
{"matrix": [3, 0], "x": 1.5, "y": 1},
{"matrix": [2, 1], "x": 2.5, "y": 1},
{"matrix": [3, 1], "x": 3.5, "y": 1},
{"matrix": [2, 2], "x": 4.5, "y": 1},
{"matrix": [3, 2], "x": 5.5, "y": 1},
{"matrix": [2, 3], "x": 6.5, "y": 1},
{"matrix": [3, 3], "x": 7.5, "y": 1},
{"matrix": [2, 4], "x": 8.5, "y": 1},
{"matrix": [3, 4], "x": 9.5, "y": 1},
{"matrix": [2, 5], "x": 10.5, "y": 1},
{"matrix": [3, 5], "x": 11.5, "y": 1},
{"matrix": [2, 6], "x": 12.5, "y": 1},
{"matrix": [3, 7], "x": 15, "y": 1},
{"matrix": [4, 0], "x": 0, "y": 2, "w": 1.75},
{"matrix": [5, 0], "x": 1.75, "y": 2},
{"matrix": [4, 1], "x": 2.75, "y": 2},
{"matrix": [5, 1], "x": 3.75, "y": 2},
{"matrix": [4, 2], "x": 4.75, "y": 2},
{"matrix": [5, 2], "x": 5.75, "y": 2},
{"matrix": [4, 3], "x": 6.75, "y": 2},
{"matrix": [5, 3], "x": 7.75, "y": 2},
{"matrix": [4, 4], "x": 8.75, "y": 2},
{"matrix": [5, 4], "x": 9.75, "y": 2},
{"matrix": [4, 5], "x": 10.75, "y": 2},
{"matrix": [5, 5], "x": 11.75, "y": 2},
{"matrix": [4, 6], "x": 12.75, "y": 2},
{"matrix": [5, 6], "x": 13.75, "y": 1, "w": 1.25, "h": 2},
{"matrix": [5, 7], "x": 15, "y": 2},
{"matrix": [6, 0], "x": 0, "y": 3, "w": 1.25},
{"matrix": [7, 0], "x": 1.25, "y": 3},
{"matrix": [6, 1], "x": 2.25, "y": 3},
{"matrix": [7, 1], "x": 3.25, "y": 3},
{"matrix": [6, 2], "x": 4.25, "y": 3},
{"matrix": [7, 2], "x": 5.25, "y": 3},
{"matrix": [6, 3], "x": 6.25, "y": 3},
{"matrix": [7, 3], "x": 7.25, "y": 3},
{"matrix": [6, 4], "x": 8.25, "y": 3},
{"matrix": [7, 4], "x": 9.25, "y": 3},
{"matrix": [6, 5], "x": 10.25, "y": 3},
{"matrix": [7, 5], "x": 11.25, "y": 3},
{"matrix": [6, 6], "x": 12.25, "y": 3, "w": 1.75},
{"matrix": [7, 6], "x": 14, "y": 3},
{"matrix": [7, 7], "x": 15, "y": 3},
{"matrix": [8, 0], "x": 0, "y": 4, "w": 1.5},
{"matrix": [9, 0], "x": 1.5, "y": 4},
{"matrix": [8, 1], "x": 2.5, "y": 4, "w": 1.5},
{"matrix": [8, 3], "x": 4, "y": 4, "w": 7},
{"matrix": [8, 5], "x": 11, "y": 4, "w": 1.5},
{"matrix": [8, 6], "x": 13, "y": 4},
{"matrix": [9, 6], "x": 14, "y": 4},
{"matrix": [9, 7], "x": 15, "y": 4}
]
},
"LAYOUT_iso_tsangan_split_bs": {
"layout": [
{"matrix": [0, 0], "x": 0, "y": 0},
{"matrix": [1, 0], "x": 1, "y": 0},
{"matrix": [0, 1], "x": 2, "y": 0},
{"matrix": [1, 1], "x": 3, "y": 0},
{"matrix": [0, 2], "x": 4, "y": 0},
{"matrix": [1, 2], "x": 5, "y": 0},
{"matrix": [0, 3], "x": 6, "y": 0},
{"matrix": [1, 3], "x": 7, "y": 0},
{"matrix": [0, 4], "x": 8, "y": 0},
{"matrix": [1, 4], "x": 9, "y": 0},
{"matrix": [0, 5], "x": 10, "y": 0},
{"matrix": [1, 5], "x": 11, "y": 0},
{"matrix": [0, 6], "x": 12, "y": 0},
{"matrix": [1, 6], "x": 13, "y": 0},
{"matrix": [0, 7], "x": 14, "y": 0},
{"matrix": [2, 0], "x": 0, "y": 1, "w": 1.5},
{"matrix": [3, 0], "x": 1.5, "y": 1},
{"matrix": [2, 1], "x": 2.5, "y": 1},
{"matrix": [3, 1], "x": 3.5, "y": 1},
{"matrix": [2, 2], "x": 4.5, "y": 1},
{"matrix": [3, 2], "x": 5.5, "y": 1},
{"matrix": [2, 3], "x": 6.5, "y": 1},
{"matrix": [3, 3], "x": 7.5, "y": 1},
{"matrix": [2, 4], "x": 8.5, "y": 1},
{"matrix": [3, 4], "x": 9.5, "y": 1},
{"matrix": [2, 5], "x": 10.5, "y": 1},
{"matrix": [3, 5], "x": 11.5, "y": 1},
{"matrix": [2, 6], "x": 12.5, "y": 1},
{"matrix": [3, 7], "x": 15, "y": 1},
{"matrix": [4, 0], "x": 0, "y": 2, "w": 1.75},
{"matrix": [5, 0], "x": 1.75, "y": 2},
{"matrix": [4, 1], "x": 2.75, "y": 2},
{"matrix": [5, 1], "x": 3.75, "y": 2},
{"matrix": [4, 2], "x": 4.75, "y": 2},
{"matrix": [5, 2], "x": 5.75, "y": 2},
{"matrix": [4, 3], "x": 6.75, "y": 2},
{"matrix": [5, 3], "x": 7.75, "y": 2},
{"matrix": [4, 4], "x": 8.75, "y": 2},
{"matrix": [5, 4], "x": 9.75, "y": 2},
{"matrix": [4, 5], "x": 10.75, "y": 2},
{"matrix": [5, 5], "x": 11.75, "y": 2},
{"matrix": [4, 6], "x": 12.75, "y": 2},
{"matrix": [5, 6], "x": 13.75, "y": 1, "w": 1.25, "h": 2},
{"matrix": [5, 7], "x": 15, "y": 2},
{"matrix": [6, 0], "x": 0, "y": 3, "w": 1.25},
{"matrix": [7, 0], "x": 1.25, "y": 3},
{"matrix": [6, 1], "x": 2.25, "y": 3},
{"matrix": [7, 1], "x": 3.25, "y": 3},
{"matrix": [6, 2], "x": 4.25, "y": 3},
{"matrix": [7, 2], "x": 5.25, "y": 3},
{"matrix": [6, 3], "x": 6.25, "y": 3},
{"matrix": [7, 3], "x": 7.25, "y": 3},
{"matrix": [6, 4], "x": 8.25, "y": 3},
{"matrix": [7, 4], "x": 9.25, "y": 3},
{"matrix": [6, 5], "x": 10.25, "y": 3},
{"matrix": [7, 5], "x": 11.25, "y": 3},
{"matrix": [6, 6], "x": 12.25, "y": 3, "w": 1.75},
{"matrix": [7, 6], "x": 14, "y": 3},
{"matrix": [7, 7], "x": 15, "y": 3},
{"matrix": [8, 0], "x": 0, "y": 4, "w": 1.5},
{"matrix": [9, 0], "x": 1.5, "y": 4},
{"matrix": [8, 1], "x": 2.5, "y": 4, "w": 1.5},
{"matrix": [8, 3], "x": 4, "y": 4, "w": 7},
{"matrix": [8, 5], "x": 11, "y": 4, "w": 1.5},
{"matrix": [8, 6], "x": 13, "y": 4},
{"matrix": [9, 6], "x": 14, "y": 4},
{"matrix": [9, 7], "x": 15, "y": 4}
]
}
}
}

View File

@@ -0,0 +1,35 @@
/*
Copyright 2024 zeix (@itsme-zeix)
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include QMK_KEYBOARD_H
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[0] = LAYOUT_all(
KC_ESC, 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_BSLS, KC_BSPC,
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_PGUP,
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_PGDN,
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_RSFT, KC_UP, MO(1),
KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_SPC, KC_SPC, KC_RALT, KC_RCTL, KC_LEFT, KC_DOWN, KC_RIGHT
),
[1] = LAYOUT_all(
KC_TRNS, 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_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_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_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
),
};

View File

@@ -0,0 +1,30 @@
# Matrix Diagram for Rubrehaku
```
┌───┬───┐
Split Backspace │16 │07 │
└───┴───┘
┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐
│00 │10 │01 │11 │02 │12 │03 │13 │04 │14 │05 │15 │06 │07 │
├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┼───┐ ┌─────┐
│20 │30 │21 │31 │22 │32 │23 │33 │24 │34 │25 │35 │26 │36 │37 │ │ │
├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┼───┤ ┌──┴┐56 │ ISO Enter
│40 │50 │41 │51 │42 │52 │43 │53 │44 │54 │45 │55 │56 │57 │ │46 │ │
├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────┬───┼───┤ └───┴────┘
│60 │61 │71 │62 │72 │63 │73 │64 │74 │65 │75 │66 │76 │77 │
├─────┬──┴┬──┴──┬┴───┴───┴───┴───┴───┴───┴──┬┴───┴┬─┬───┼───┼───┤
│80 │90 │81 │83 │95 │ │86 │96 │97 │
└─────┴───┴─────┴───────────────────────────┴─────┘ └───┴───┴───┘
┌────┬───┐
│60 │70 │ Split Left Shift
└────┴───┘
┌────┬────┬────┬────────────────────────┬────┬────┐
│80 │90 │81 │83 │85 │95 │ 6.25u
└────┴────┴────┴────────────────────────┴────┴────┘
┌────┬────┬────┬───────────┬────┬───────┬────┬────┐
│80 │90 │81 │92 │83 │94 │85 │95 │ Split Space (Left 2.75u)
└────┴────┴────┴───────────┴────┴───────┴────┴────┘
┌────┬────┬────┬───────┬────┬───────────┬────┬────┐
│80 │90 │81 │92 │83 │94 │85 │95 │ Split Space (Left 2.25u)
└────┴────┴────┴───────┴────┴───────────┴────┴────┘
```

View File

@@ -0,0 +1,27 @@
# SINGA Rubrehaku (PCB designed by Zeix)
![Layout Compatibility](https://i.imgur.com/jTkWkJd.png)
65% PCB designed to support Rubrehaku
* Keyboard Maintainer: [Zeix](https://github.com/itsme-zeix)
* Hardware Supported: KLC x SINGA x Rubrehose Rubrehaku
* Hardware Availability: https://klc-playground.com/
Make example for this keyboard (after setting up your build environment):
make zeix/singa/rubrehaku:default
Flashing example for this keyboard:
make zeix/singa/rubrehaku: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**: Briefly press the `RESET` button twice or short the 'USB_BOOT' and `GND` pads and plug in the keyboard.
* **Keycode in layout**: Press the key mapped to `QK_BOOT`.

View File

@@ -47,6 +47,7 @@ def userspace_add(cli):
from qmk.cli.new.keymap import new_keymap
cli.config.new_keymap.keyboard = cli.args.keyboard
cli.config.new_keymap.keymap = cli.args.keymap
cli.args.skip_converter = True
if new_keymap(cli) is not False:
userspace.add_target(keyboard=cli.args.keyboard, keymap=cli.args.keymap, build_env=build_env)
else:

View File

@@ -153,6 +153,7 @@ def _flash_atmel_dfu(mcu, file):
def _flash_hid_bootloader(mcu, details, file):
cmd = None
if details == 'halfkay':
if shutil.which('teensy-loader-cli'):
cmd = 'teensy-loader-cli'

View File

@@ -49,15 +49,15 @@ uint32_t qp_comms_send(painter_device_t device, const void *data, uint32_t byte_
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Comms APIs that use a D/C pin
void qp_comms_command(painter_device_t device, uint8_t cmd) {
bool qp_comms_command(painter_device_t device, uint8_t cmd) {
painter_driver_t * driver = (painter_driver_t *)device;
painter_comms_with_command_vtable_t *comms_vtable = (painter_comms_with_command_vtable_t *)driver->comms_vtable;
comms_vtable->send_command(device, cmd);
return comms_vtable->send_command(device, cmd);
}
void qp_comms_command_databyte(painter_device_t device, uint8_t cmd, uint8_t data) {
bool qp_comms_command_databyte(painter_device_t device, uint8_t cmd, uint8_t data) {
qp_comms_command(device, cmd);
qp_comms_send(device, &data, sizeof(data));
return qp_comms_send(device, &data, sizeof(data));
}
uint32_t qp_comms_command_databuf(painter_device_t device, uint8_t cmd, const void *data, uint32_t byte_count) {
@@ -65,8 +65,8 @@ uint32_t qp_comms_command_databuf(painter_device_t device, uint8_t cmd, const vo
return qp_comms_send(device, data, byte_count);
}
void qp_comms_bulk_command_sequence(painter_device_t device, const uint8_t *sequence, size_t sequence_len) {
bool qp_comms_bulk_command_sequence(painter_device_t device, const uint8_t *sequence, size_t sequence_len) {
painter_driver_t * driver = (painter_driver_t *)device;
painter_comms_with_command_vtable_t *comms_vtable = (painter_comms_with_command_vtable_t *)driver->comms_vtable;
comms_vtable->bulk_command_sequence(device, sequence, sequence_len);
return comms_vtable->bulk_command_sequence(device, sequence, sequence_len);
}

View File

@@ -19,7 +19,7 @@ uint32_t qp_comms_send(painter_device_t device, const void* data, uint32_t byte_
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Comms APIs that use a D/C pin
void qp_comms_command(painter_device_t device, uint8_t cmd);
void qp_comms_command_databyte(painter_device_t device, uint8_t cmd, uint8_t data);
bool qp_comms_command(painter_device_t device, uint8_t cmd);
bool qp_comms_command_databyte(painter_device_t device, uint8_t cmd, uint8_t data);
uint32_t qp_comms_command_databuf(painter_device_t device, uint8_t cmd, const void* data, uint32_t byte_count);
void qp_comms_bulk_command_sequence(painter_device_t device, const uint8_t* sequence, size_t sequence_len);
bool qp_comms_bulk_command_sequence(painter_device_t device, const uint8_t* sequence, size_t sequence_len);

View File

@@ -36,7 +36,7 @@ typedef struct painter_driver_vtable_t {
typedef bool (*painter_driver_comms_init_func)(painter_device_t device);
typedef bool (*painter_driver_comms_start_func)(painter_device_t device);
typedef void (*painter_driver_comms_stop_func)(painter_device_t device);
typedef bool (*painter_driver_comms_stop_func)(painter_device_t device);
typedef uint32_t (*painter_driver_comms_send_func)(painter_device_t device, const void *data, uint32_t byte_count);
typedef struct painter_comms_vtable_t {
@@ -46,8 +46,8 @@ typedef struct painter_comms_vtable_t {
painter_driver_comms_send_func comms_send;
} painter_comms_vtable_t;
typedef void (*painter_driver_comms_send_command_func)(painter_device_t device, uint8_t cmd);
typedef void (*painter_driver_comms_bulk_command_sequence)(painter_device_t device, const uint8_t *sequence, size_t sequence_len);
typedef bool (*painter_driver_comms_send_command_func)(painter_device_t device, uint8_t cmd);
typedef bool (*painter_driver_comms_bulk_command_sequence)(painter_device_t device, const uint8_t *sequence, size_t sequence_len);
typedef struct painter_comms_with_command_vtable_t {
painter_comms_vtable_t base; // must be first, so this object can be cast from the painter_comms_vtable_t* type

View File

@@ -37,6 +37,10 @@
#include "version.h" // for QMK_BUILDDATE used in EEPROM magic
#include "nvm_via.h"
#if defined(SECURE_ENABLE)
# include "secure.h"
#endif
#if defined(AUDIO_ENABLE)
# include "audio.h"
#endif
@@ -322,8 +326,13 @@ void raw_hid_receive(uint8_t *data, uint8_t length) {
uint8_t rows = 28 / ((MATRIX_COLS + 7) / 8);
uint8_t i = 2;
for (uint8_t row = 0; row < rows && row + offset < MATRIX_ROWS; row++) {
#ifdef VIA_INSECURE
#if defined(VIA_INSECURE)
matrix_row_t value = matrix_get_row(row + offset);
#elif defined(SECURE_ENABLE)
matrix_row_t value = 0;
if (secure_is_unlocked()) {
value = matrix_get_row(row + offset);
}
#else
matrix_row_t value = 0;
#endif