Add support for boards and pcbs from nachie (#764)

Syndrome
Syndrome Ortho
Little Writter
Evelyn
Subtext

Also includes changes from Matt Piasecki <matthewpiasecki@icloud.com>
for OLED support for syndrome

Co-authored-by: Nachiket Kulkarni <nachiket_kulkarni@apple.com>
This commit is contained in:
nachie 2024-08-18 19:30:10 -07:00 committed by GitHub
parent a23664c742
commit 1df15a95b8
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
85 changed files with 6772 additions and 0 deletions

View File

@ -0,0 +1,29 @@
/*
Copyright 2024 nachie
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
//#include "config_common.h"
#define RP2040_FLASH_GENERIC_03H
/* key matrix size */
#define MATRIX_ROWS 7
#define MATRIX_COLS 6
#define DEBUG_MATRIX_SCAN_RATE
#define DEBUG_ACTION
#define VIA_CUSTOM_LIGHTING_ENABLE

View File

@ -0,0 +1,87 @@
{
"manufacturer": "nachie",
"keyboard_name": "Syndrome",
"maintainer": "nachie",
"board": "GENERIC_RP_RP2040",
"bootloader": "rp2040",
"processor": "RP2040",
"url": "https://littlecraftery.com/products/evelyn",
"features": {
"bootmagic": true,
"command": false,
"console": false,
"extrakey": true,
"mousekey": true,
"nkro": false,
"audio": false,
"backlight": false,
"rgb_matrix": false,
"rgblight": false,
"encoder": true
},
"dynamic_keymap": {
"layer_count": 4
},
"usb": {
"device_version": "1.0.0",
"pid": "0x4B43",
"vid": "0x6F75"
},
"diode_direction": "COL2ROW",
"matrix_pins": {
"cols": ["GP19", "GP18", "GP16", "GP7", "GP22", "GP2"],
"rows": ["GP24", "GP23", "GP25", "GP26", "GP20", "GP21", "GP17"]
},
"encoder": {
"enabled": true,
"rotary": [
{ "pin_a": "GP12", "pin_b": "GP13", "resolution": 2 },
{ "pin_a": "GP0", "pin_b": "GP1", "resolution": 2 },
{ "pin_a": "GP27", "pin_b": "GP28", "resolution": 2 }
]
},
"layouts": {
"LAYOUT": {
"layout": [
{"y": 0.0, "x": 0.29, "matrix": [0, 0], "label": "0,0"},
{"y": 0.0, "x": 10.190000000000001, "matrix": [1, 4], "label": "1,4"},
{"y": 0.0, "x": 11.190000000000001, "matrix": [0, 5], "label": "0,5"},
{"y": 0.99, "x": 0.15, "matrix": [2, 0], "w": 1.25, "label": "2,0"},
{"y": 0.99, "x": 10.58, "matrix": [2, 5], "w": 1.75, "label": "2,5"},
{"y": 1.99, "x": 0.0, "matrix": [4, 0], "w": 1.75, "label": "4,0"},
{"y": 2.99, "x": 0.09000000000000001, "matrix": [6, 0], "w": 1.25, "label": "6,0"},
{"y": 6.23, "x": 3.97, "matrix": [5, 4], "w": 1.25, "label": "5,4"},
{"y": 6.23, "x": 5.220000000000001, "matrix": [4, 5], "label": "4,5"},
{"y": 7.23, "x": 4.87, "matrix": [6, 5], "w": 1.25, "label": "6,5"},
{"y": 8.23, "x": 1.43, "matrix": [1, 0], "label": "1,0"},
{"y": 8.23, "x": 2.43, "matrix": [0, 1], "label": "0,1"},
{"y": 8.23, "x": 3.43, "matrix": [1, 1], "label": "1,1"},
{"y": 8.23, "x": 4.430000000000001, "matrix": [0, 2], "label": "0,2"},
{"y": 9.23, "x": 1.68, "matrix": [3, 0], "label": "3,0"},
{"y": 9.23, "x": 2.68, "matrix": [2, 1], "label": "2,1"},
{"y": 9.23, "x": 3.68, "matrix": [3, 1], "label": "3,1"},
{"y": 9.23, "x": 4.680000000000001, "matrix": [2, 2], "label": "2,2"},
{"y": 10.23, "x": 2.18, "matrix": [5, 0], "label": "5,0"},
{"y": 10.23, "x": 3.18, "matrix": [4, 1], "label": "4,1"},
{"y": 10.23, "x": 4.180000000000001, "matrix": [5, 1], "label": "5,1"},
{"y": 10.23, "x": 5.180000000000001, "matrix": [4, 2], "label": "4,2"},
{"y": 11.23, "x": 2.93, "matrix": [6, 1], "label": "6,1"},
{"y": 11.23, "x": 3.93, "matrix": [6, 2], "w": 2.25, "label": "6,2"},
{"y": 9.89, "x": 5.930000000000001, "matrix": [1, 2], "label": "1,2"},
{"y": 9.89, "x": 6.930000000000001, "matrix": [0, 3], "label": "0,3"},
{"y": 9.89, "x": 7.930000000000001, "matrix": [1, 3], "label": "1,3"},
{"y": 9.89, "x": 8.93, "matrix": [0, 4], "label": "0,4"},
{"y": 10.89, "x": 6.180000000000001, "matrix": [3, 2], "label": "3,2"},
{"y": 10.89, "x": 7.180000000000001, "matrix": [2, 3], "label": "2,3"},
{"y": 10.89, "x": 8.18, "matrix": [3, 3], "label": "3,3"},
{"y": 10.89, "x": 9.18, "matrix": [2, 4], "label": "2,4"},
{"y": 11.89, "x": 5.680000000000001, "matrix": [5, 2], "label": "5,2"},
{"y": 11.89, "x": 6.680000000000001, "matrix": [4, 3], "label": "4,3"},
{"y": 11.89, "x": 7.680000000000001, "matrix": [5, 3], "label": "5,3"},
{"y": 11.89, "x": 8.68, "matrix": [4, 4], "label": "4,4"},
{"y": 12.89, "x": 5.680000000000001, "matrix": [6, 3], "w": 2, "label": "6,3"},
{"y": 12.89, "x": 7.680000000000001, "matrix": [6, 4], "label": "6,4"}
]
}
}
}

View File

@ -0,0 +1,87 @@
{
"manufacturer": "nachie",
"keyboard_name": "Syndrome",
"maintainer": "nachie",
"board": "GENERIC_RP_RP2040",
"bootloader": "rp2040",
"processor": "RP2040",
"features": {
"bootmagic": true,
"command": false,
"console": false,
"extrakey": true,
"mousekey": true,
"rgb_matrix": false
},
"dynamic_keymap": {
"layer_count": 4
},
"usb": {
"device_version": "1.0.0",
"pid": "0x4B43",
"vid": "0x6F75"
},
"diode_direction": "COL2ROW",
"matrix_pins": {
"cols": ["GP19", "GP18", "GP16", "GP7", "GP22", "GP2"],
"rows": ["GP24", "GP23", "GP25", "GP26", "GP20", "GP21", "GP17"]
},
"encoder": {
"enabled": true,
"rotary": [
{ "pin_a": "GP12", "pin_b": "GP13", "resolution": 2 },
{ "pin_a": "GP0", "pin_b": "GP1", "resolution": 2 },
{ "pin_a": "GP27", "pin_b": "GP28", "resolution": 2 }
]
},
"qmk": {
"locking": {
"enabled": true,
"resync": true
}
},
"layouts": {
"LAYOUT": {
"layout": [
{"y": 0.0, "x": 0.29, "matrix": [0, 0], "label": "0,0"},
{"y": 0.0, "x": 10.190000000000001, "matrix": [1, 4], "label": "1,4"},
{"y": 0.0, "x": 11.190000000000001, "matrix": [0, 5], "label": "0,5"},
{"y": 0.99, "x": 0.15, "matrix": [2, 0], "w": 1.25, "label": "2,0"},
{"y": 0.99, "x": 10.58, "matrix": [2, 5], "w": 1.75, "label": "2,5"},
{"y": 1.99, "x": 0.0, "matrix": [4, 0], "w": 1.75, "label": "4,0"},
{"y": 2.99, "x": 0.09000000000000001, "matrix": [6, 0], "w": 1.25, "label": "6,0"},
{"y": 6.23, "x": 3.97, "matrix": [5, 4], "w": 1.25, "label": "5,4"},
{"y": 6.23, "x": 5.220000000000001, "matrix": [4, 5], "label": "4,5"},
{"y": 7.23, "x": 4.87, "matrix": [6, 5], "w": 1.25, "label": "6,5"},
{"y": 8.23, "x": 1.43, "matrix": [1, 0], "label": "1,0"},
{"y": 8.23, "x": 2.43, "matrix": [0, 1], "label": "0,1"},
{"y": 8.23, "x": 3.43, "matrix": [1, 1], "label": "1,1"},
{"y": 8.23, "x": 4.430000000000001, "matrix": [0, 2], "label": "0,2"},
{"y": 9.23, "x": 1.68, "matrix": [3, 0], "label": "3,0"},
{"y": 9.23, "x": 2.68, "matrix": [2, 1], "label": "2,1"},
{"y": 9.23, "x": 3.68, "matrix": [3, 1], "label": "3,1"},
{"y": 9.23, "x": 4.680000000000001, "matrix": [2, 2], "label": "2,2"},
{"y": 10.23, "x": 2.18, "matrix": [5, 0], "label": "5,0"},
{"y": 10.23, "x": 3.18, "matrix": [4, 1], "label": "4,1"},
{"y": 10.23, "x": 4.180000000000001, "matrix": [5, 1], "label": "5,1"},
{"y": 10.23, "x": 5.180000000000001, "matrix": [4, 2], "label": "4,2"},
{"y": 11.23, "x": 2.93, "matrix": [6, 1], "label": "6,1"},
{"y": 11.23, "x": 3.93, "matrix": [6, 2], "w": 2.25, "label": "6,2"},
{"y": 9.89, "x": 5.930000000000001, "matrix": [1, 2], "label": "1,2"},
{"y": 9.89, "x": 6.930000000000001, "matrix": [0, 3], "label": "0,3"},
{"y": 9.89, "x": 7.930000000000001, "matrix": [1, 3], "label": "1,3"},
{"y": 9.89, "x": 8.93, "matrix": [0, 4], "label": "0,4"},
{"y": 10.89, "x": 6.180000000000001, "matrix": [3, 2], "label": "3,2"},
{"y": 10.89, "x": 7.180000000000001, "matrix": [2, 3], "label": "2,3"},
{"y": 10.89, "x": 8.18, "matrix": [3, 3], "label": "3,3"},
{"y": 10.89, "x": 9.18, "matrix": [2, 4], "label": "2,4"},
{"y": 11.89, "x": 5.680000000000001, "matrix": [5, 2], "label": "5,2"},
{"y": 11.89, "x": 6.680000000000001, "matrix": [4, 3], "label": "4,3"},
{"y": 11.89, "x": 7.680000000000001, "matrix": [5, 3], "label": "5,3"},
{"y": 11.89, "x": 8.68, "matrix": [4, 4], "label": "4,4"},
{"y": 12.89, "x": 5.680000000000001, "matrix": [6, 3], "w": 2, "label": "6,3"},
{"y": 12.89, "x": 7.680000000000001, "matrix": [6, 4], "label": "6,4"}
]
}
}
}

View File

@ -0,0 +1,27 @@
/*
Copyright 2024 nachie
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] = {
/* QWERTY */
LAYOUT(
KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC,
KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_ENT,
KC_Z, KC_X, KC_C, KC_V, KC_B, KC_B, KC_N, KC_M, KC_DOT, KC_LSFT, MO(1),
KC_LCTL, KC_LGUI, KC_SPC, KC_SPC, KC_RGUI, MO(1))
};

View File

@ -0,0 +1 @@
The default keymap for the Evelyn.

View File

@ -0,0 +1,11 @@
/* SPDX-License-Identifier: GPL-2.0-or-later */
#pragma once
#define VIAL_KEYBOARD_UID {0x53, 0x01, 0x24, 0xD6, 0x96, 0x84, 0xF2, 0x0F}
#define VIAL_UNLOCK_COMBO_ROWS { 0, 2 }
#define VIAL_UNLOCK_COMBO_COLS { 0, 5 }
#define RGB_MATRIX_FRAMEBUFFER_EFFECTS
#define RGB_MATRIX_KEYPRESSES

View File

@ -0,0 +1,65 @@
/*
Copyright 2024 nachie
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
#include <stdio.h>
char wpm_str[10];
enum layer_names {
_BASE, // Default Layer
_FN, // Fn Layer 1
_FN2, // Fn Layer 2
_FN3 // Fn Layer 3
};
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* QWERTY */
[_BASE] = LAYOUT(
KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC,
KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_ENT,
KC_Z, KC_X, KC_C, KC_V, KC_B, KC_B, KC_N, KC_M, KC_DOT, KC_LSFT, MO(1),
KC_LCTL, KC_LGUI, KC_SPC, KC_SPC, KC_RGUI, MO(1)),
/* FUNCTION */
[_FN] = LAYOUT(
KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC,
KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_ENT,
KC_Z, KC_X, KC_C, KC_V, KC_B, KC_B, KC_N, KC_M, KC_DOT, KC_LSFT, MO(1),
KC_LGUI, KC_LGUI, KC_LALT, KC_BSPC, KC_RGUI, MO(1)),
[_FN2] = LAYOUT(
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______),
[_FN3] = LAYOUT(
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______)
};
#if defined(ENCODER_MAP_ENABLE)
const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][2] = {
[_BASE] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU), ENCODER_CCW_CW(RGB_RMOD, RGB_MOD), ENCODER_CCW_CW(KC_VOLD, KC_VOLU) },
[_FN] = { ENCODER_CCW_CW(RGB_RMOD, RGB_MOD), ENCODER_CCW_CW(RGB_RMOD, RGB_MOD), ENCODER_CCW_CW(RGB_RMOD, RGB_MOD) },
[_FN2] = { ENCODER_CCW_CW(RGB_RMOD, RGB_MOD), ENCODER_CCW_CW(RGB_RMOD, RGB_MOD), ENCODER_CCW_CW(RGB_RMOD, RGB_MOD) },
[_FN3] = { ENCODER_CCW_CW(RGB_RMOD, RGB_MOD), ENCODER_CCW_CW(RGB_RMOD, RGB_MOD), ENCODER_CCW_CW(RGB_RMOD, RGB_MOD) },
};
#endif

View File

@ -0,0 +1 @@
The vial keymap for the Evelyn PCB.

View File

@ -0,0 +1,6 @@
VIA_ENABLE = yes
VIAL_ENABLE = yes
#VIALRGB_ENABLE = yes
ENCODER_MAP_ENABLE = yes

View File

@ -0,0 +1,213 @@
{
"name": "Syndrome",
"vendorId": "0x4B43",
"productId": "0x6F75",
"matrix": { "rows": 7, "cols": 6 },
"layouts": {
"labels":[
[
"Right Shift",
"Split Shift",
"Full Shift"
],
"1.75 Left Space",
"1.75 Right Space"
],
"keymap": [
[
{
"y": 0.16,
"x": 12.25
},
"1,0\n\n\n\n\n\n\n\n\ne",
"1,1\n\n\n\n\n\n\n\n\ne"
],
[
{
"y": -0.9199999999999999,
"x": 0.3,
"c": "#ffffff",
"t": "#2e2525"
},
"0,0",
{
"x": 8.9
},
"1,4",
"0,5"
],
[
{
"y": -0.010000000000000009,
"x": 0.16,
"w": 1.25
},
"2,0",
{
"x": 9.18,
"w": 1.75
},
"2,5"
],
[
{
"x": 0.01,
"w": 1.75
},
"4,0"
],
[
{
"y": -0.9899999999999998,
"x": 12.73,
"w": 2.25
},
"5,4\n\n\n0,1"
],
[
{
"y": -0.010000000000000231,
"x": 0.1,
"w": 1.25
},
"6,0"
],
[
{
"y": 0.6799999999999997,
"x": 3.5,
"c": "#cccccc",
"t": "#000000"
},
"2,0\n\n\n\n\n\n\n\n\ne",
"2,1\n\n\n\n\n\n\n\n\ne",
{
"x": 0.75
},
"3,0\n\n\n\n\n\n\n\n\ne",
"3,1\n\n\n\n\n\n\n\n\ne"
],
[
{
"rx": 6.25,
"y": 2.24,
"x": 3.9800000000000004,
"c": "#ffffff",
"t": "#2e2525",
"w": 1.25
},
"5,4\n\n\n0,0",
"4,5\n\n\n0,0"
],
[
{
"x": 4.879999999999999,
"w": 1.25
},
"6,5"
],
[
{
"r": 8,
"rx": 0,
"x": 1.44
},
"1,0",
"0,1",
"1,1",
"0,2"
],
[
{
"x": 1.69
},
"3,0",
"2,1",
"3,1",
"2,2"
],
[
{
"x": 2.19
},
"5,0",
"4,1",
"5,1",
"4,2"
],
[
{
"x": 2.94
},
"6,1\n\n\n1,0",
{
"w": 2.25
},
"6,2\n\n\n1,0"
],
[
{
"x": 2.94,
"t": "#000000",
"w": 1.5
},
"6,1\n\n\n1,1",
{
"x": 8.881784197001252e-16,
"w": 1.75
},
"6,2\n\n\n1,1"
],
[
{
"r": -8,
"y": -3.34,
"x": 5.9399999999999995,
"t": "#2e2525"
},
"1,2",
"0,3",
"1,3",
"0,4"
],
[
{
"x": 6.19
},
"3,2",
"2,3",
"3,3",
"2,4"
],
[
{
"x": 5.69
},
"5,2",
"4,3",
"5,3",
"4,4"
],
[
{
"x": 5.69,
"w": 2
},
"6,3\n\n\n2,0",
"6,4\n\n\n2,0"
],
[
{
"x": 5.69,
"t": "#000000",
"w": 1.75
},
"6,3\n\n\n2,1",
{
"w": 1.25
},
"6,4\n\n\n2,1"
]
]
}
}

View File

@ -0,0 +1,23 @@
# Båge
Firmware for the Båge
* Keyboard Maintainer: [nachie](https://github.com/nachie)
* Hardware Supported: Båge
* Hardware Availability: [nachie](https://littlecraftery.com/products/Båge)
Make example for this keyboard (after setting up your build environment):
make nachie/syndrome:default
Or to make and flash:
make nachie/syndrome: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
* **Bootmagic reset**: Hold down ESC key (top left) and plug in the keyboard
* **Physical reset button**: Briefly press the button labeled "SW_RST1" on the back of the PCB

View File

@ -0,0 +1 @@
# This file intentionally left blank

View File

@ -0,0 +1,25 @@
/*
Copyright 2024 Nachie
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_FLASH_GENERIC_03H
#ifdef HAPTIC_ENABLE
#define SOLENOID_PIN GP15
#endif
#define VIA_CUSTOM_LIGHTING_ENABLE

View File

@ -0,0 +1,3 @@
#pragma once
#include_next <halconf.h>

View File

@ -0,0 +1,148 @@
{
"keyboard_name": "LittleWritter",
"manufacturer": "Nachie",
"usb": {
"vid": "0x4B43",
"pid": "0x5358",
"device_version": "1.0.0"
},
"board": "GENERIC_RP_RP2040",
"bootloader": "rp2040",
"processor": "RP2040",
"url": "https://littlecraftery.com/products/little-writter",
"maintainer": "nachie",
"ws2812": {
"pin": "GP29",
"driver": "vendor"
},
"rgb_matrix": {
"driver": "ws2812",
"led_count": 16,
"animations": {
"alphas_mods": true,
"gradient_up_down": true,
"gradient_left_right": true,
"breathing": true,
"band_sat": true,
"band_val": true,
"band_pinwheel_sat": true,
"band_pinwheel_val": true,
"band_spiral_sat": true,
"band_spiral_val": true,
"cycle_all": true,
"cycle_left_right": true,
"cycle_up_down": true,
"rainbow_moving_chevron":true,
"cycle_out_in": true,
"cycle_out_in_dual": true,
"cycle_pinwheel": true,
"cycle_spiral": true,
"rainbow_pinwheels": true,
"raindrops": true,
"jellybean_raindrops": true,
"hue_breathing": true,
"hue_pendulum": true,
"hue_wave": true,
"typing_heatmap": true,
"digital_rain": true,
"solid_reactive_simple": true,
"solid_reactive": true,
"solid_reactive_wide": true,
"solid_reactive_multiwide": true,
"solid_reactive_cross": true,
"solid_reactive_multicross": true,
"solid_reactive_nexus": true,
"solid_reactive_multinexus": true,
"splash": true,
"solid_splash": true,
"solid_multisplash": true,
"pixel_rain": true,
"pixel_fractal": true
}
},
"layouts": {
"LAYOUT": {
"layout": [
{"y": 0, "x": 11.5, "matrix": [10, 5], "label": "10,5"},
{"y": 1, "x": 10.5, "matrix": [10, 6], "label": "10,6"},
{"y": 1, "x": 12.5, "matrix": [10, 7], "label": "10,7"},
{"y": 1.75, "x": 0, "matrix": [8, 5], "label": "8,5"},
{"y": 1.75, "x": 1, "matrix": [9, 5], "label": "9,5"},
{"y": 1.75, "x": 3.25, "matrix": [8, 6], "label": "8,6"},
{"y": 1.75, "x": 4.25, "matrix": [9, 6], "label": "9,6"},
{"y": 1.75, "x": 5.25, "matrix": [8, 7], "label": "8,7"},
{"y": 1.75, "x": 7.25, "matrix": [9, 7], "label": "9,7"},
{"y": 1.75, "x": 8.25, "matrix": [8, 8], "label": "8,8"},
{"y": 2, "x": 11.5, "matrix": [10, 8], "label": "10,8"},
{"y": 3.5, "x": 0, "matrix": [0, 0], "label": "0,0"},
{"y": 3.5, "x": 1, "matrix": [1, 0], "label": "1,0"},
{"y": 3.5, "x": 2, "matrix": [0, 1], "label": "0,1"},
{"y": 3.5, "x": 3, "matrix": [1, 1], "label": "1,1"},
{"y": 3.5, "x": 4, "matrix": [0, 2], "label": "0,2"},
{"y": 3.5, "x": 5, "matrix": [1, 2], "label": "1,2"},
{"y": 3.5, "x": 6, "matrix": [0, 3], "label": "0,3"},
{"y": 3.5, "x": 7, "matrix": [1, 3], "label": "1,3"},
{"y": 3.5, "x": 8, "matrix": [0, 4], "label": "0,4"},
{"y": 3.5, "x": 9, "matrix": [1, 4], "label": "1,4"},
{"y": 3.5, "x": 10, "matrix": [7, 4], "label": "7,4"},
{"y": 3.5, "x": 12.5, "matrix": [9, 8], "label": "9,8"},
{"y": 4.5, "x": 0, "matrix": [2, 0], "w": 1.25, "label": "2,0"},
{"y": 4.5, "x": 1.25, "matrix": [3, 0], "label": "3,0"},
{"y": 4.5, "x": 2.25, "matrix": [2, 1], "label": "2,1"},
{"y": 4.5, "x": 3.25, "matrix": [3, 1], "label": "3,1"},
{"y": 4.5, "x": 4.25, "matrix": [2, 2], "label": "2,2"},
{"y": 4.5, "x": 5.25, "matrix": [3, 2], "label": "3,2"},
{"y": 4.5, "x": 6.25, "matrix": [2, 3], "label": "2,3"},
{"y": 4.5, "x": 7.25, "matrix": [3, 3], "label": "3,3"},
{"y": 4.5, "x": 8.25, "matrix": [2, 4], "label": "2,4"},
{"y": 4.5, "x": 9.25, "matrix": [3, 4], "w": 1.75, "label": "3,4"},
{"y": 4.5, "x": 12.5, "matrix": [8, 9], "label": "8,9"},
{"y": 5.5, "x": 0, "matrix": [4, 0], "w": 1.75, "label": "4,0"},
{"y": 5.5, "x": 1.75, "matrix": [5, 0], "label": "5,0"},
{"y": 5.5, "x": 2.75, "matrix": [4, 1], "label": "4,1"},
{"y": 5.5, "x": 3.75, "matrix": [5, 1], "label": "5,1"},
{"y": 5.5, "x": 4.75, "matrix": [4, 2], "label": "4,2"},
{"y": 5.5, "x": 5.75, "matrix": [5, 2], "label": "5,2"},
{"y": 5.5, "x": 6.75, "matrix": [4, 3], "label": "4,3"},
{"y": 5.5, "x": 7.75, "matrix": [5, 3], "label": "5,3"},
{"y": 5.5, "x": 8.75, "matrix": [4, 4], "w": 1.25, "label": "4,4"},
{"y": 5.5, "x": 10, "matrix": [5, 4], "label": "5,4"},
{"y": 5.5, "x": 12.5, "matrix": [9, 9], "label": "9,9"},
{"y": 6.5, "x": 0, "matrix": [6, 0], "w": 1.5, "label": "6,0"},
{"y": 6.5, "x": 1.5, "matrix": [7, 0], "label": "7,0"},
{"y": 6.5, "x": 2.5, "matrix": [6, 1], "w": 1.25, "label": "6,1"},
{"y": 6.5, "x": 3.75, "matrix": [7, 1], "w": 1.75, "label": "7,1"},
{"y": 6.5, "x": 5.5, "matrix": [7, 2], "w": 1.75, "label": "7,2"},
{"y": 6.5, "x": 7.25, "matrix": [6, 3], "w": 1.25, "label": "6,3"},
{"y": 6.5, "x": 8.5, "matrix": [7, 3], "label": "7,3"},
{"y": 6.5, "x": 9.5, "matrix": [6, 4], "w": 1.5, "label": "6,4"}
]
}
},
"features": {
"bootmagic": true,
"command": false,
"console": false,
"extrakey": true,
"mousekey": true,
"nkro": false,
"audio": false,
"backlight": false,
"rgblight": false,
"encoder": true,
"rgb_matrix": true
},
"encoder": {
"enabled": true,
"rotary": [
{ "pin_a": "GP22", "pin_b": "GP23", "resolution": 2 },
{ "pin_a": "GP26", "pin_b": "GP27", "resolution": 2 },
{ "pin_a": "GP0", "pin_b": "GP1", "resolution": 2 }
]
},
"diode_direction": "COL2ROW",
"matrix_pins": {
"cols": ["GP28", "GP21", "GP20", "GP3", "GP2", "GP12", "GP13", "GP14", "GP10", "GP11"],
"rows": ["GP25", "GP24", "GP16", "GP7", "GP17", "GP18", "GP19", "GP4", "GP8", "GP9", "GP15"]
}
}

View File

@ -0,0 +1,148 @@
{
"keyboard_name": "LittleWritter",
"manufacturer": "Nachie",
"usb": {
"vid": "0x4B43",
"pid": "0x5358",
"device_version": "1.0.0"
},
"board": "GENERIC_RP_RP2040",
"bootloader": "rp2040",
"processor": "RP2040",
"url": "https://littlecraftery.com/products/little-writter",
"maintainer": "nachie",
"ws2812": {
"pin": "GP29",
"driver": "vendor"
},
"rgb_matrix": {
"driver": "ws2812",
"led_count": 16,
"animations": {
"alphas_mods": true,
"gradient_up_down": true,
"gradient_left_right": true,
"breathing": true,
"band_sat": true,
"band_val": true,
"band_pinwheel_sat": true,
"band_pinwheel_val": true,
"band_spiral_sat": true,
"band_spiral_val": true,
"cycle_all": true,
"cycle_left_right": true,
"cycle_up_down": true,
"rainbow_moving_chevron":true,
"cycle_out_in": true,
"cycle_out_in_dual": true,
"cycle_pinwheel": true,
"cycle_spiral": true,
"rainbow_pinwheels": true,
"raindrops": true,
"jellybean_raindrops": true,
"hue_breathing": true,
"hue_pendulum": true,
"hue_wave": true,
"typing_heatmap": true,
"digital_rain": true,
"solid_reactive_simple": true,
"solid_reactive": true,
"solid_reactive_wide": true,
"solid_reactive_multiwide": true,
"solid_reactive_cross": true,
"solid_reactive_multicross": true,
"solid_reactive_nexus": true,
"solid_reactive_multinexus": true,
"splash": true,
"solid_splash": true,
"solid_multisplash": true,
"pixel_rain": true,
"pixel_fractal": true
}
},
"layouts": {
"LAYOUT": {
"layout": [
{"y": 0, "x": 11.5, "matrix": [10, 5], "label": "10,5"},
{"y": 1, "x": 10.5, "matrix": [10, 6], "label": "10,6"},
{"y": 1, "x": 12.5, "matrix": [10, 7], "label": "10,7"},
{"y": 1.75, "x": 0, "matrix": [8, 5], "label": "8,5"},
{"y": 1.75, "x": 1, "matrix": [9, 5], "label": "9,5"},
{"y": 1.75, "x": 3.25, "matrix": [8, 6], "label": "8,6"},
{"y": 1.75, "x": 4.25, "matrix": [9, 6], "label": "9,6"},
{"y": 1.75, "x": 5.25, "matrix": [8, 7], "label": "8,7"},
{"y": 1.75, "x": 7.25, "matrix": [9, 7], "label": "9,7"},
{"y": 1.75, "x": 8.25, "matrix": [8, 8], "label": "8,8"},
{"y": 2, "x": 11.5, "matrix": [10, 8], "label": "10,8"},
{"y": 3.5, "x": 0, "matrix": [0, 0], "label": "0,0"},
{"y": 3.5, "x": 1, "matrix": [1, 0], "label": "1,0"},
{"y": 3.5, "x": 2, "matrix": [0, 1], "label": "0,1"},
{"y": 3.5, "x": 3, "matrix": [1, 1], "label": "1,1"},
{"y": 3.5, "x": 4, "matrix": [0, 2], "label": "0,2"},
{"y": 3.5, "x": 5, "matrix": [1, 2], "label": "1,2"},
{"y": 3.5, "x": 6, "matrix": [0, 3], "label": "0,3"},
{"y": 3.5, "x": 7, "matrix": [1, 3], "label": "1,3"},
{"y": 3.5, "x": 8, "matrix": [0, 4], "label": "0,4"},
{"y": 3.5, "x": 9, "matrix": [1, 4], "label": "1,4"},
{"y": 3.5, "x": 10, "matrix": [7, 4], "label": "7,4"},
{"y": 3.5, "x": 12.5, "matrix": [9, 8], "label": "9,8"},
{"y": 4.5, "x": 0, "matrix": [2, 0], "w": 1.25, "label": "2,0"},
{"y": 4.5, "x": 1.25, "matrix": [3, 0], "label": "3,0"},
{"y": 4.5, "x": 2.25, "matrix": [2, 1], "label": "2,1"},
{"y": 4.5, "x": 3.25, "matrix": [3, 1], "label": "3,1"},
{"y": 4.5, "x": 4.25, "matrix": [2, 2], "label": "2,2"},
{"y": 4.5, "x": 5.25, "matrix": [3, 2], "label": "3,2"},
{"y": 4.5, "x": 6.25, "matrix": [2, 3], "label": "2,3"},
{"y": 4.5, "x": 7.25, "matrix": [3, 3], "label": "3,3"},
{"y": 4.5, "x": 8.25, "matrix": [2, 4], "label": "2,4"},
{"y": 4.5, "x": 9.25, "matrix": [3, 4], "w": 1.75, "label": "3,4"},
{"y": 4.5, "x": 12.5, "matrix": [8, 9], "label": "8,9"},
{"y": 5.5, "x": 0, "matrix": [4, 0], "w": 1.75, "label": "4,0"},
{"y": 5.5, "x": 1.75, "matrix": [5, 0], "label": "5,0"},
{"y": 5.5, "x": 2.75, "matrix": [4, 1], "label": "4,1"},
{"y": 5.5, "x": 3.75, "matrix": [5, 1], "label": "5,1"},
{"y": 5.5, "x": 4.75, "matrix": [4, 2], "label": "4,2"},
{"y": 5.5, "x": 5.75, "matrix": [5, 2], "label": "5,2"},
{"y": 5.5, "x": 6.75, "matrix": [4, 3], "label": "4,3"},
{"y": 5.5, "x": 7.75, "matrix": [5, 3], "label": "5,3"},
{"y": 5.5, "x": 8.75, "matrix": [4, 4], "w": 1.25, "label": "4,4"},
{"y": 5.5, "x": 10, "matrix": [5, 4], "label": "5,4"},
{"y": 5.5, "x": 12.5, "matrix": [9, 9], "label": "9,9"},
{"y": 6.5, "x": 0, "matrix": [6, 0], "w": 1.5, "label": "6,0"},
{"y": 6.5, "x": 1.5, "matrix": [7, 0], "label": "7,0"},
{"y": 6.5, "x": 2.5, "matrix": [6, 1], "w": 1.25, "label": "6,1"},
{"y": 6.5, "x": 3.75, "matrix": [7, 1], "w": 1.75, "label": "7,1"},
{"y": 6.5, "x": 5.5, "matrix": [7, 2], "w": 1.75, "label": "7,2"},
{"y": 6.5, "x": 7.25, "matrix": [6, 3], "w": 1.25, "label": "6,3"},
{"y": 6.5, "x": 8.5, "matrix": [7, 3], "label": "7,3"},
{"y": 6.5, "x": 9.5, "matrix": [6, 4], "w": 1.5, "label": "6,4"}
]
}
},
"features": {
"bootmagic": true,
"command": false,
"console": false,
"extrakey": true,
"mousekey": true,
"nkro": false,
"audio": false,
"backlight": false,
"rgblight": false,
"encoder": true,
"rgb_matrix": true
},
"encoder": {
"enabled": true,
"rotary": [
{ "pin_a": "GP22", "pin_b": "GP23", "resolution": 2 },
{ "pin_a": "GP26", "pin_b": "GP27", "resolution": 2 },
{ "pin_a": "GP0", "pin_b": "GP1", "resolution": 2 }
]
},
"diode_direction": "COL2ROW",
"matrix_pins": {
"cols": ["GP28", "GP21", "GP20", "GP3", "GP2", "GP12", "GP13", "GP14", "GP10", "GP11"],
"rows": ["GP25", "GP24", "GP16", "GP7", "GP17", "GP18", "GP19", "GP4", "GP8", "GP9", "GP15"]
}
}

View File

@ -0,0 +1,28 @@
/*
Copyright 2024 Nachie
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] = {
/* QWERTY */
LAYOUT(
KC_ESC, KC_1, KC_2, KC_3, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_W,
KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, KC_Q,
KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_ENT, KC_A,
KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_DOT, KC_LSFT, MO(1), KC_Z,
KC_LGUI, KC_LGUI, KC_LALT, KC_SPC, KC_BSPC, KC_RGUI, KC_RALT, MO(1))
};

View File

@ -0,0 +1 @@
The default keymap for the Little Writter.

View File

@ -0,0 +1,11 @@
/* SPDX-License-Identifier: GPL-2.0-or-later */
#pragma once
#define VIAL_KEYBOARD_UID {0x81, 0x8E, 0x3C, 0xC9, 0xA3, 0x67, 0xDE, 0xA5}
#define VIAL_UNLOCK_COMBO_ROWS { 0, 3 }
#define VIAL_UNLOCK_COMBO_COLS { 0, 4 }
#define RGB_MATRIX_FRAMEBUFFER_EFFECTS
#define RGB_MATRIX_KEYPRESSES

View File

@ -0,0 +1,486 @@
/*
Copyright 2024 Nachie
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
#include <stdio.h>
#include "os_detection.h"
os_variant_t current_platform;
bool is_alt_tab_active = false;
uint16_t alt_tab_timer = 0;
enum layer_names {
_BASE, // Default Layer
_FN, // Fn Layer 1
_FN2, // Fn Layer 2
_FN3 // Fn Layer 3
};
enum custom_keycode {
JWRDL = QK_KB_0,
JWRDR,
SWRDL,
SWRDR,
TABL,
TABR,
DSKTPL,
DSKTPR,
PRVAPP,
NXTAPP
};
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
switch (keycode) {
case KC_HOME:
if (record->event.pressed && current_platform == OS_MACOS) {
register_mods(MOD_LGUI);
tap_code(KC_LEFT);
unregister_mods(MOD_LGUI);
} else {
tap_code(KC_HOME);
}
break;
case KC_END:
if (record->event.pressed && current_platform == OS_MACOS) {
register_mods(MOD_LGUI);
tap_code(KC_RIGHT);
unregister_mods(MOD_LGUI);
} else {
tap_code(KC_END);
}
break;
case KC_PGUP:
if (record->event.pressed && current_platform == OS_MACOS) {
register_mods(MOD_LGUI);
tap_code(KC_UP);
unregister_mods(MOD_LGUI);
} else {
tap_code(KC_PGUP);
}
break;
case KC_PGDN:
if (record->event.pressed && current_platform == OS_MACOS) {
register_mods(MOD_LGUI);
tap_code(KC_DOWN);
unregister_mods(MOD_LGUI);
} else {
tap_code(KC_PGDN);
}
break;
case KC_NUM_LOCK:
if (record->event.pressed && current_platform == OS_MACOS) {
register_mods(MOD_LSFT);
tap_code(KC_CLEAR);
unregister_mods(MOD_LSFT);
} else {
tap_code(KC_NUM_LOCK);
}
break;
case KC_SCROLL_LOCK:
if (record->event.pressed && current_platform == OS_MACOS) {
register_mods(MOD_LCTL);
tap_code(KC_F14);
unregister_mods(MOD_LCTL);
} else {
tap_code(KC_SCROLL_LOCK);
}
break;
case KC_PRINT_SCREEN:
if (record->event.pressed && current_platform == OS_MACOS) {
register_mods(MOD_LSFT);
register_mods(MOD_LGUI);
tap_code(KC_5);
unregister_mods(MOD_LGUI);
unregister_mods(MOD_LSFT);
} else {
tap_code(KC_PRINT_SCREEN);
}
break;
case JWRDL:
if (record->event.pressed) {
(current_platform == OS_MACOS) ? register_mods(MOD_LALT) : register_mods(MOD_LCTL);
tap_code(KC_LEFT);
(current_platform == OS_MACOS) ? unregister_mods(MOD_LALT) : unregister_mods(MOD_LCTL);
} else {
}
break;
case JWRDR:
if (record->event.pressed) {
(current_platform == OS_MACOS) ? register_mods(MOD_LALT) : register_mods(MOD_LCTL);
tap_code(KC_RIGHT);
(current_platform == OS_MACOS) ? unregister_mods(MOD_LALT) : unregister_mods(MOD_LCTL);
} else {
}
break;
case SWRDL:
if (record->event.pressed) {
register_mods(MOD_LSFT);
(current_platform == OS_MACOS) ? register_mods(MOD_LALT) : register_mods(MOD_LCTL);
tap_code(KC_LEFT);
(current_platform == OS_MACOS) ? unregister_mods(MOD_LALT) : unregister_mods(MOD_LCTL);
unregister_mods(MOD_LSFT);
} else {
}
break;
case SWRDR:
if (record->event.pressed) {
register_mods(MOD_LSFT);
(current_platform == OS_MACOS) ? register_mods(MOD_LALT) : register_mods(MOD_LCTL);
tap_code(KC_RIGHT);
(current_platform == OS_MACOS) ? unregister_mods(MOD_LALT) : unregister_mods(MOD_LCTL);
unregister_mods(MOD_LSFT);
} else {
}
break;
case TABL:
if (record->event.pressed) {
register_mods(MOD_LCTL);
register_mods(MOD_LSFT);
tap_code(KC_TAB);
unregister_mods(MOD_LSFT);
unregister_mods(MOD_LCTL);
} else {
}
break;
case TABR:
if (record->event.pressed) {
register_mods(MOD_LCTL);
tap_code(KC_TAB);
unregister_mods(MOD_LCTL);
} else {
}
break;
case DSKTPL:
if (record->event.pressed) {
register_mods(MOD_LCTL);
register_mods(MOD_LGUI);
(current_platform == OS_LINUX) ? tap_code(KC_UP) : tap_code(KC_LEFT);
unregister_mods(MOD_LGUI);
unregister_mods(MOD_LCTL);
} else {
}
break;
case DSKTPR:
if (record->event.pressed) {
register_mods(MOD_LCTL);
register_mods(MOD_LGUI);
(current_platform == OS_LINUX) ? tap_code(KC_DOWN) : tap_code(KC_RGHT);
unregister_mods(MOD_LGUI);
unregister_mods(MOD_LCTL);
} else {
}
break;
case PRVAPP:
if (record->event.pressed) {
register_code(KC_LSFT);
if (!is_alt_tab_active) {
is_alt_tab_active = true;
(current_platform == OS_MACOS) ? register_code(KC_LGUI) : register_code(KC_LALT);
}
alt_tab_timer = timer_read();
register_code(KC_TAB);
} else {
unregister_code(KC_TAB);
unregister_code(KC_LSFT);
}
break;
case NXTAPP:
if (record->event.pressed) {
if (!is_alt_tab_active) {
is_alt_tab_active = true;
(current_platform == OS_MACOS) ? register_code(KC_LGUI) : register_code(KC_LALT);
}
alt_tab_timer = timer_read();
register_code(KC_TAB);
} else {
unregister_code(KC_TAB);
}
break;
}
return true;
};
#ifndef HAPTIC_ENABLE
#define HF_TOGG _______
#endif
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* QWERTY */
[_BASE] = LAYOUT(
KC_ESC, KC_1, KC_2, KC_3, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_W,
KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, KC_Q,
KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_ENT, KC_A,
KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_DOT, KC_LSFT, MO(1), KC_Z,
KC_LGUI, KC_LGUI, KC_LALT, KC_SPC, KC_SPC, KC_BSPC, KC_RGUI, MO(2)),
/* FUNCTION */
[_FN] = LAYOUT(
KC_ESC, KC_1, KC_2, KC_3, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_W,
KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC, _______,
KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_ENT, _______,
KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_DOT, KC_LSFT, MO(1), _______,
KC_LGUI, KC_LGUI, KC_LALT, KC_SPC, KC_SPC, KC_BSPC, KC_RGUI, MO(1)),
[_FN2] = LAYOUT(
KC_ESC, QK_BOOTLOADER, QK_REBOOT, QK_DEBUG_TOGGLE, QK_CLEAR_EEPROM, _______, _______, _______, _______, _______, _______,
HF_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______),
[_FN3] = LAYOUT(
KC_ESC, KC_1, KC_2, KC_3, KC_4, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______)
};
void matrix_scan_user(void) { // The very important timer.
if (is_alt_tab_active) {
if (timer_elapsed(alt_tab_timer) > 1000) {
(current_platform == OS_MACOS) ? unregister_code(KC_LGUI) : unregister_code(KC_LALT);
is_alt_tab_active = false;
}
}
}
#if defined(ENCODER_MAP_ENABLE)
const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][2] = {
[_BASE] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU), ENCODER_CCW_CW(RGB_RMOD, RGB_MOD), ENCODER_CCW_CW(KC_VOLD, KC_VOLU) },
[_FN] = { ENCODER_CCW_CW(RGB_RMOD, RGB_MOD), ENCODER_CCW_CW(RGB_RMOD, RGB_MOD), ENCODER_CCW_CW(RGB_RMOD, RGB_MOD) },
[_FN2] = { ENCODER_CCW_CW(RGB_RMOD, RGB_MOD), ENCODER_CCW_CW(RGB_RMOD, RGB_MOD), ENCODER_CCW_CW(RGB_RMOD, RGB_MOD) },
[_FN3] = { ENCODER_CCW_CW(RGB_RMOD, RGB_MOD), ENCODER_CCW_CW(RGB_RMOD, RGB_MOD), ENCODER_CCW_CW(RGB_RMOD, RGB_MOD) },
};
#endif
#ifdef OLED_ENABLE
#ifdef DYNAMIC_MACRO_ENABLE
bool macro1;
bool macro1rec;
bool macro2;
bool macro2rec;
bool prevEnabled;
uint8_t prevRGBmode;
void render_dynamic_macro_status(int col, int line){
oled_set_cursor(col,line);
macro1rec ? oled_write(PSTR("DM1"), macro1) : oled_write(PSTR(" "),false);
oled_set_cursor(col,line+1);
macro2rec ? oled_write(PSTR("DM2"), macro2) : oled_write(PSTR(" "),false);
}
//direction indicates which macro it is, with 1 being Macro 1, -1 being Macro 2, and 0 being no macro.
void dynamic_macro_record_start_user(int8_t direction){
prevEnabled = rgb_matrix_is_enabled();
if (!prevEnabled) { rgb_matrix_enable(); }
prevRGBmode = rgb_matrix_get_mode();
rgb_matrix_mode(RGB_MATRIX_BREATHING);
switch(direction){
case 1:
macro1 = false;
macro1rec = true;
break;
case -1:
macro2 = false;
macro2rec = true;
break;
default:
macro1 = false;
macro2 = false;
macro1rec = false;
macro2rec = false;
break;
}
}
void dynamic_macro_record_end_user(int8_t direction){
prevEnabled ? rgb_matrix_mode(prevRGBmode) : rgb_matrix_disable();
switch(direction){
case 1:
macro1 = true;
break;
case -1:
macro2 = true;
break;
default:
macro1 = false;
macro2 = false;
break;
}
}
#endif
bool clear_screen = false;
bool rerender_platform = false;
static void render_logo(void) {
static const char PROGMEM logo[] = {
0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, 0x90, 0x91, 0x92, 0x93, 0x94,
0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, 0xB0, 0xB1, 0xB2, 0xB3, 0xB4,
0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0x00
};
oled_write(logo, false);
}
void render_keylock_status(led_t led_state) {
bool caps_state = (led_state.caps_lock || is_caps_word_on());
oled_write(PSTR("CAPS"), caps_state);
oled_write(PSTR(" "), false);
oled_write(PSTR("NUM"), led_state.num_lock);
oled_write(PSTR(" "), false);
oled_write(PSTR("SCRL"), led_state.scroll_lock);
//oled_write_ln_P(PSTR(" "), false);
}
void render_mod_status(uint8_t modifiers) {
oled_write(PSTR("SH"), (modifiers & MOD_MASK_SHIFT));
oled_write(PSTR(" "), false);
(current_platform == OS_MACOS || current_platform == OS_IOS) ? oled_write(PSTR("CMD"), (modifiers & MOD_MASK_GUI)) : oled_write(PSTR("CT"), (modifiers & MOD_MASK_CTRL));
oled_write(PSTR(" "), false);
(current_platform == OS_MACOS || current_platform == OS_IOS) ? oled_write(PSTR("OPT"), (modifiers & MOD_MASK_ALT)) : oled_write(PSTR("ALT"), (modifiers & MOD_MASK_ALT));
oled_write(PSTR(" "), false);
(current_platform == OS_MACOS || current_platform == OS_IOS) ? oled_write(PSTR("CT"), (modifiers & MOD_MASK_CTRL)) : oled_write(PSTR("GUI"), (modifiers & MOD_MASK_GUI));
}
void render_key_status_or_logo(){
led_t led_state = host_keyboard_led_state();
uint8_t mod_state = (get_mods()|get_oneshot_mods());
if ( !led_state.num_lock && !led_state.caps_lock && !led_state.scroll_lock
&& !(mod_state & MOD_MASK_SHIFT) && !(mod_state & MOD_MASK_ALT) && !(mod_state & MOD_MASK_CTRL) && !(mod_state & MOD_MASK_GUI)) {
if(!clear_screen) {
render_logo();
rerender_platform = true;
}
clear_screen = true;
} else {
if (clear_screen == true) {
oled_clear();
oled_render();
clear_screen = false;
}
oled_set_cursor(8,0);
render_keylock_status(led_state);
oled_set_cursor(8,1);
render_mod_status(mod_state);
rerender_platform = true;
}
}
void render_current_layer(){
switch (get_highest_layer(layer_state)) {
case 0:
oled_write(PSTR("Layer 0"), false);
break;
case 1:
oled_write(PSTR("Layer 1"), false);
break;
case 2:
oled_write(PSTR("Layer 2"), false);
break;
case 3:
oled_write(PSTR("Layer 3"), false);
break;
default:
oled_write(PSTR("Layer ?"), false); // Should never display, here as a catchall
}
}
void render_current_wpm(){
oled_write_P(PSTR("WPM: "), false);
oled_write(get_u8_str(get_current_wpm(), '0'), false);
}
void render_platform_status(int col, int line) {
/* Show Ctrl-Gui Swap options */
static const char PROGMEM logo[][5][3] = {
{{0x9B, 0x9C, 0}, {0xbb, 0xbc, 0}}, //Android
{{0x99, 0x9A, 0}, {0xb9, 0xba, 0}}, //Linux
{{0x97, 0x98, 0}, {0xb7, 0xb8, 0}}, //Windows
{{0x95, 0x96, 0}, {0xb5, 0xb6, 0}}, //Mac/iOS
{{0x9D, 0x9E, 0}, {0xbd, 0xbe, 0}}, //Empty Placeholder
};
current_platform = detected_host_os();
switch (current_platform) {
/*case OS_ANDROID: //Android
oled_set_cursor(col,line);
oled_write(logo[0][0], false);
oled_set_cursor(col,line+1);
oled_write(logo[0][1], false);
break;*/
case OS_LINUX: //Linux
oled_set_cursor(col,line);
oled_write(logo[1][0], false);
oled_set_cursor(col,line+1);
oled_write(logo[1][1], false);
keymap_config.swap_lctl_lgui = false;
keymap_config.swap_rctl_rgui = false;
break;
case OS_WINDOWS: //Windows
oled_set_cursor(col,line);
oled_write(logo[2][0], false);
oled_set_cursor(col,line+1);
oled_write(logo[2][1], false);
keymap_config.swap_lctl_lgui = false;
keymap_config.swap_rctl_rgui = false;
break;
case OS_MACOS: //Mac
oled_set_cursor(col,line);
oled_write(logo[3][0], false);
oled_set_cursor(col,line+1);
oled_write(logo[3][1], false);
keymap_config.swap_lctl_lgui = true;
keymap_config.swap_rctl_rgui = true;
break;
case OS_IOS: //iOS
oled_set_cursor(col,line);
oled_write(logo[3][0], false);
oled_set_cursor(col,line+1);
oled_write(logo[3][1], false);
keymap_config.swap_lctl_lgui = true;
keymap_config.swap_rctl_rgui = true;
break;
default: //OS_UNSURE or not configured
oled_set_cursor(col,line);
oled_write(logo[4][0], false);
oled_set_cursor(col,line+1);
oled_write(logo[4][1], false);
break;
}
rerender_platform = false;
}
bool oled_task_user(void) {
render_key_status_or_logo();
oled_set_cursor(8,2);
render_current_layer();
#ifdef DYNAMIC_MACRO_ENABLE
render_dynamic_macro_status(18,2);
#endif
oled_set_cursor(8,3);
render_current_wpm();
#ifdef OS_DETECTION_ENABLE
if(current_platform != detected_host_os() || rerender_platform) { render_platform_status(3,0); }
#endif
return false;
}
#endif

View File

@ -0,0 +1 @@
The vial keymap for the Little Writter PCB.

View File

@ -0,0 +1,10 @@
VIA_ENABLE = yes
VIAL_ENABLE = yes
VIALRGB_ENABLE = yes
ENCODER_MAP_ENABLE = yes
BOOTMAGIC_ENABLE = yes
MAGIC_ENABLE = yes
OS_DETECTION_ENABLE = yes
DYNAMIC_MACRO_ENABLE = yes
CAPS_WORD_ENABLE = yes

View File

@ -0,0 +1,433 @@
{
"name": "LittleWritter",
"vendorId": "0x4B43",
"productId": "0x5358",
"customKeycodes": [
{
"name": "JmpWordL",
"title": "Jump Word Left",
"shortName": "JWRDL"
},
{
"name": "JmpWordR",
"title": "Jump Word Right",
"shortName": "JWRDR"
},
{
"name": "SlcWordL",
"title": "Select Word Left",
"shortName": "SWRDL"
},
{
"name": "SlcWordR",
"title": "Select Word Right",
"shortName": "SWRDR"
},
{
"name": "TabLft",
"title": "Tab Left",
"shortName": "TABL"
},
{
"name": "TabRght",
"title": "Tab Right",
"shortName": "TABR"
},
{
"name": "DsktpLft",
"title": "Desktop Left",
"shortName": "DSKTPL"
},
{
"name": "DsktpRght",
"title": "Desktop Right",
"shortName": "DSKTPR"
},
{
"name": "PrevApp",
"title": "Previous App",
"shortName": "PRVAPP"
},
{
"name": "NextApp",
"title": "Next App",
"shortName": "NXTAPP"
}
],
"matrix": { "rows": 11, "cols": 10 },
"lighting": "vialrgb",
"layouts": {
"labels":[
[
"Right Shift",
"Split Shift Fn",
"Split Fn Shift",
"No Split"
],
[
"Bottom Row",
"3U Centered",
"6U Big Bar",
"3U/3U",
"2U/2U",
"1.75U/1.75U",
"7U Big Bar",
"3U/1U/3U",
"2.75U ALPS",
"3U/ENC/3U"
],
"Macro Row"
],
"keymap": [
[
{
"y": 2.5,
"x": 13.5
},
"10,5"
],
[
{
"x": 12.5
},
"10,6",
{
"x": 1
},
"10,7\nBreak"
],
[
{
"y": -0.25,
"x": 2
},
"8,5",
"9,5",
{
"x": 1.25
},
"8,6",
"9,6",
"8,7",
{
"x": 1
},
"9,7",
"8,8"
],
[
{
"y": -0.75,
"x": 13.5
},
"10,8"
],
[
{
"x": 1
},
"0,0\n\n\n\n\n\n\n\n\ne",
{
"x": 11
},
"1,0\n\n\n\n\n\n\n\n\ne"
],
[
{
"y": -0.5,
"x": 2
},
"0,0",
"1,0",
"0,1",
"1,1",
"0,2",
"1,2",
"0,3",
"1,3",
"0,4",
"1,4",
"7,4",
{
"x": 1.5
},
"9,8"
],
[
{
"y": -0.5,
"x": 1
},
"0,1\n\n\n\n\n\n\n\n\ne",
{
"x": 11
},
"1,1\n\n\n\n\n\n\n\n\ne"
],
[
{
"y": -0.5,
"x": 2,
"c": "#aaaaaa",
"w": 1.25
},
"2,0",
{
"c": "#cccccc"
},
"3,0",
"2,1",
"3,1",
"2,2",
"3,2",
"2,3",
"3,3",
"2,4",
{
"c": "#777777",
"w": 1.75
},
"3,4",
{
"x": 1.5,
"c": "#cccccc"
},
"8,9"
],
[
{
"x": 2,
"c": "#aaaaaa",
"w": 1.75
},
"4,0",
{
"c": "#cccccc"
},
"5,0",
"4,1",
"5,1",
"4,2",
"5,2",
"4,3",
"5,3",
{
"c": "#aaaaaa",
"w": 1.25
},
"4,4\n\n\n0,0",
{
"c": "#cccccc"
},
"5,4\n\n\n0,0",
{
"x": 1.5
},
"9,9"
],
[
{
"x": 2,
"c": "#aaaaaa",
"w": 1.5
},
"6,0\n\n\n1,0",
"7,0\n\n\n1,0",
{
"w": 1.5
},
"6,1\n\n\n1,0",
{
"w": 3
},
"7,2\n\n\n1,0",
{
"w": 1.5
},
"6,3\n\n\n1,0",
"7,3\n\n\n1,0",
{
"w": 1.5
},
"6,4\n\n\n1,0"
],
[
{
"x": 6.5,
"c": "#cccccc"
},
"2,0\n\n\n\n\n\n\n\n\ne",
"2,1\n\n\n\n\n\n\n\n\ne",
{
"x": 2.25
},
"4,4\n\n\n0,1",
{
"c": "#aaaaaa",
"w": 1.25
},
"5,4\n\n\n0,1"
],
[
{
"x": 10.75,
"w": 2.25
},
"4,4\n\n\n0,2"
],
[
{
"y": 0.25,
"x": 2,
"w": 1.5
},
"6,0\n\n\n1,1",
"7,0\n\n\n1,1",
{
"w": 6
},
"7,2\n\n\n1,1",
"7,3\n\n\n1,1",
{
"w": 1.5
},
"6,4\n\n\n1,1"
],
[
{
"x": 2,
"w": 1.5
},
"6,0\n\n\n1,2",
"7,0\n\n\n1,2",
{
"w": 3
},
"7,1\n\n\n1,2",
{
"w": 3
},
"7,2\n\n\n1,2",
"7,3\n\n\n1,2",
{
"w": 1.5
},
"6,4\n\n\n1,2"
],
[
{
"x": 2,
"w": 1.5
},
"6,0\n\n\n1,3",
"7,0\n\n\n1,3",
"6,1\n\n\n1,3",
{
"w": 2
},
"7,1\n\n\n1,3",
{
"w": 2
},
"7,2\n\n\n1,3",
"6,3\n\n\n1,3",
"7,3\n\n\n1,3",
{
"w": 1.5
},
"6,4\n\n\n1,3"
],
[
{
"x": 2,
"w": 1.5
},
"6,0\n\n\n1,4",
"7,0\n\n\n1,4",
{
"w": 1.25
},
"6,1\n\n\n1,4",
{
"w": 1.75
},
"7,1\n\n\n1,4",
{
"w": 1.75
},
"7,2\n\n\n1,4",
{
"w": 1.25
},
"6,3\n\n\n1,4",
"7,3\n\n\n1,4",
{
"w": 1.5
},
"6,4\n\n\n1,4"
],
[
{
"x": 2
},
"6,0\n\n\n1,5",
"7,0\n\n\n1,5",
{
"w": 7
},
"7,2\n\n\n1,5",
"7,3\n\n\n1,5",
"6,4\n\n\n1,5"
],
[
{
"x": 2
},
"6,0\n\n\n1,6",
"7,0\n\n\n1,6",
{
"w": 3
},
"6,1\n\n\n1,6",
"7,2\n\n\n1,6",
{
"w": 3
},
"6,3\n\n\n1,6",
"7,3\n\n\n1,6",
"6,4\n\n\n1,6"
],
[
{
"x": 2,
"w": 1.25
},
"6,0\n\n\n1,7",
{
"w": 1.5
},
"7,0\n\n\n1,7",
{
"w": 1.25
},
"6,1\n\n\n1,7",
{
"w": 2.75
},
"7,2\n\n\n1,7",
{
"w": 1.25
},
"6,3\n\n\n1,7",
{
"w": 1.5
},
"7,3\n\n\n1,7",
{
"w": 1.5
},
"6,4\n\n\n1,7"
]
]
}
}

View File

@ -0,0 +1,89 @@
/*
Copyright 2024 Nachie
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 "quantum.h"
led_config_t g_led_config = { {
{ NO_LED, 6, 5, 4, NO_LED, 3, 2, 1, 0, NO_LED },
{ NO_LED, 6, 5, 4, NO_LED, 3, 2, 1, 0, NO_LED },
{ 7, NO_LED, NO_LED, NO_LED, NO_LED, NO_LED, NO_LED, NO_LED, NO_LED, 15 },
{ 8, 9, 10, 11, 12, NO_LED, 13, 14, NO_LED, NO_LED},
{ NO_LED, NO_LED, NO_LED, NO_LED, NO_LED, NO_LED, NO_LED, NO_LED, NO_LED, NO_LED }
}, {
{ 183,0 }, { 162,0 }, { 142,0 }, { 122,0 }, { 81,0 }, { 61,0 }, { 40,0 },
{ 20,16 }, { 40,48 },
{ 61,48 }, { 81,48 }, { 101,48 }, { 122,48 }, { 162,48 }, { 203,48 }, { 244,16 }
}, {
1, 1, 1, 1, 1, 1, 1,
1, 1,
1, 1, 1, 1, 1, 1, 1
} };
#ifdef OLED_ENABLE
static void render_logo(void) {
static const char PROGMEM my_logo[] = {
// 'Screenshot 2023-07-21 at 1', 128x32px
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xfe, 0x00, 0x03, 0xc0, 0x00, 0xc0, 0x00, 0x3c, 0x00, 0x0f, 0x1f, 0xf8, 0xe0, 0x00, 0x1f, 0xff,
0xff, 0x80, 0x01, 0xc0, 0x00, 0x40, 0x00, 0x38, 0x00, 0x07, 0x1f, 0xf8, 0xe0, 0x00, 0x1f, 0xff,
0xff, 0xff, 0xf1, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0x1f, 0xf8, 0xff, 0xff, 0x0f, 0xff,
0xff, 0xff, 0xf1, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0x1f, 0xf8, 0xff, 0xff, 0x8f, 0xff,
0xff, 0xff, 0xf1, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0x1f, 0xf8, 0xff, 0xff, 0x0f, 0xff,
0xfe, 0x1f, 0xf1, 0xc0, 0x03, 0xff, 0x8f, 0xf8, 0xff, 0xc7, 0x1f, 0xf8, 0xe1, 0xc0, 0x1f, 0xff,
0xfe, 0x1f, 0xf1, 0xc0, 0x03, 0xff, 0x8f, 0xf8, 0xff, 0xc7, 0x1f, 0xf8, 0xe1, 0xe0, 0x3f, 0xff,
0xfe, 0x1f, 0xf1, 0xc3, 0xff, 0xff, 0x8f, 0xf8, 0xff, 0xc7, 0x1f, 0xf8, 0xe1, 0xf0, 0xff, 0xff,
0xfe, 0x1f, 0xf1, 0xc3, 0xff, 0xff, 0x8f, 0xf8, 0xff, 0xc7, 0x1f, 0xf8, 0xe1, 0xf8, 0x7f, 0xff,
0xfe, 0x1f, 0xf1, 0xc3, 0xff, 0xff, 0x8f, 0xf8, 0xff, 0xc7, 0x1f, 0xf8, 0xe1, 0xf8, 0x7f, 0xff,
0xfe, 0x00, 0x01, 0xc0, 0x00, 0x7f, 0x8f, 0xf8, 0x00, 0x07, 0x00, 0x00, 0xe1, 0xfc, 0x3f, 0xff,
0xfe, 0x00, 0x03, 0xc0, 0x00, 0xff, 0x8f, 0xfc, 0x00, 0x0f, 0x80, 0x01, 0xe1, 0xfe, 0x1f, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
};
oled_write_raw_P(my_logo, sizeof(my_logo));
}
bool oled_task_kb(void) {
// Defer to the keymap if they want to override
if(!oled_task_user()) {
return false;
}
// default keyboard drawing code
render_logo();
return false;
}
#endif

View File

@ -0,0 +1,3 @@
#pragma once
#include_next <mcuconf.h>

View File

@ -0,0 +1,23 @@
# LittleWritter
Firmware for the LittleWritter
* Keyboard Maintainer: [Nachie](https://github.com/nachie)
* Hardware Supported: LittleWritter
* Hardware Availability: [Little Craftery](https://littlecraftery.com/products/littlewritter)
Make example for this keyboard (after setting up your build environment):
make nachie/littlewritter:default
Or to make and flash:
make nachie/littlewritter: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
* **Bootmagic reset**: Hold down ESC key (top left) and plug in the keyboard
* **Physical reset button**: Briefly press the button labeled "SW_RST1" on the back of the PCB

View File

@ -0,0 +1 @@
# This file is intentionally left blank

View File

@ -0,0 +1,29 @@
/*
Copyright 2024 nachie
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
/* Set 0 if debouncing isn't needed */
#define DEBOUNCE 5
/* number of backlight levels */
#define VIA_CUSTOM_LIGHTING_ENABLE
#define LED_CAPS_LOCK_PIN GP17
#define LED_KANA_PIN GP26
#define LED_PIN_ON_STATE 1

View File

@ -0,0 +1,155 @@
{
"keyboard_name": "RND60",
"manufacturer": "Nachie",
"board": "GENERIC_RP_RP2040",
"bootloader": "rp2040",
"processor": "RP2040",
"usb": {
"vid": "0x4B43",
"pid": "0x5336",
"device_version": "1.0.0"
},
"url": "https://rndkbd.com",
"maintainer": "nachie",
"features": {
"bootmagic": true,
"command": false,
"console": false,
"extrakey": true,
"mousekey": true,
"nkro": true,
"audio": false,
"backlight": false,
"rgblight": false,
"encoder": false,
"rgb_matrix": true
},
"diode_direction": "COL2ROW",
"matrix_pins": {
"cols": ["GP21", "GP5", "GP4", "GP3", "GP2", "GP1", "GP0", "GP15", "GP14", "GP13", "GP12", "GP11", "GP10", "GP8", "GP9"],
"rows": ["GP28", "GP27", "GP20", "GP6", "GP7"]
},
"ws2812": {
"pin": "GP29",
"driver": "vendor"
},
"rgb_matrix": {
"driver": "ws2812",
"led_count": 16,
"animations": {
"alphas_mods": true,
"gradient_up_down": true,
"gradient_left_right": true,
"breathing": true,
"band_sat": true,
"band_val": true,
"band_pinwheel_sat": true,
"band_pinwheel_val": true,
"band_spiral_sat": true,
"band_spiral_val": true,
"cycle_all": true,
"cycle_left_right": true,
"cycle_up_down": true,
"rainbow_moving_chevron":true,
"cycle_out_in": true,
"cycle_out_in_dual": true,
"cycle_pinwheel": true,
"cycle_spiral": true,
"rainbow_pinwheels": true,
"raindrops": true,
"jellybean_raindrops": true,
"hue_breathing": true,
"hue_pendulum": true,
"hue_wave": true,
"typing_heatmap": true,
"digital_rain": true,
"solid_reactive_simple": true,
"solid_reactive": true,
"solid_reactive_wide": true,
"solid_reactive_multiwide": true,
"solid_reactive_cross": true,
"solid_reactive_multicross": true,
"solid_reactive_nexus": true,
"solid_reactive_multinexus": true,
"splash": true,
"solid_splash": true,
"solid_multisplash": true,
"pixel_rain": true,
"pixel_fractal": true
}
},
"layouts": {
"LAYOUT": {
"layout": [
{"y": 0, "x": 0, "matrix": [0, 0], "label": "0,0"},
{"y": 0, "x": 1, "matrix": [0, 1], "label": "0,1"},
{"y": 0, "x": 2, "matrix": [0, 2], "label": "0,2"},
{"y": 0, "x": 3, "matrix": [0, 3], "label": "0,3"},
{"y": 0, "x": 4, "matrix": [0, 4], "label": "0,4"},
{"y": 0, "x": 5, "matrix": [0, 5], "label": "0,5"},
{"y": 0, "x": 6, "matrix": [0, 6], "label": "0,6"},
{"y": 0, "x": 7, "matrix": [0, 7], "label": "0,7"},
{"y": 0, "x": 8, "matrix": [0, 8], "label": "0,8"},
{"y": 0, "x": 9, "matrix": [0, 9], "label": "0,9"},
{"y": 0, "x": 10, "matrix": [0, 10], "label": "0,10"},
{"y": 0, "x": 11, "matrix": [0, 11], "label": "0,11"},
{"y": 0, "x": 12, "matrix": [0, 12], "label": "0,12"},
{"y": 0, "x": 13, "matrix": [0, 13], "label": "0,13"},
{"y": 0, "x": 14, "matrix": [0, 14], "label": "0,14"},
{"y": 1, "x": 0, "matrix": [1, 0], "w": 1.5, "label": "1,0"},
{"y": 1, "x": 1.5, "matrix": [1, 1], "label": "1,1"},
{"y": 1, "x": 2.5, "matrix": [1, 2], "label": "1,2"},
{"y": 1, "x": 3.5, "matrix": [1, 3], "label": "1,3"},
{"y": 1, "x": 4.5, "matrix": [1, 4], "label": "1,4"},
{"y": 1, "x": 5.5, "matrix": [1, 5], "label": "1,5"},
{"y": 1, "x": 6.5, "matrix": [1, 6], "label": "1,6"},
{"y": 1, "x": 7.5, "matrix": [1, 7], "label": "1,7"},
{"y": 1, "x": 8.5, "matrix": [1, 8], "label": "1,8"},
{"y": 1, "x": 9.5, "matrix": [1, 9], "label": "1,9"},
{"y": 1, "x": 10.5, "matrix": [1, 10], "label": "1,10"},
{"y": 1, "x": 11.5, "matrix": [1, 11], "label": "1,11"},
{"y": 1, "x": 12.5, "matrix": [1, 12], "label": "1,12"},
{"y": 1, "x": 13.5, "matrix": [1, 14], "w": 1.5, "label": "1,14"},
{"y": 2, "x": 0, "matrix": [2, 0], "w": 1.75, "label": "2,0"},
{"y": 2, "x": 1.75, "matrix": [2, 1], "label": "2,1"},
{"y": 2, "x": 2.75, "matrix": [2, 2], "label": "2,2"},
{"y": 2, "x": 3.75, "matrix": [2, 3], "label": "2,3"},
{"y": 2, "x": 4.75, "matrix": [2, 4], "label": "2,4"},
{"y": 2, "x": 5.75, "matrix": [2, 5], "label": "2,5"},
{"y": 2, "x": 6.75, "matrix": [2, 6], "label": "2,6"},
{"y": 2, "x": 7.75, "matrix": [2, 7], "label": "2,7"},
{"y": 2, "x": 8.75, "matrix": [2, 8], "label": "2,8"},
{"y": 2, "x": 9.75, "matrix": [2, 9], "label": "2,9"},
{"y": 2, "x": 10.75, "matrix": [2, 10], "label": "2,10"},
{"y": 2, "x": 11.75, "matrix": [2, 11], "label": "2,11"},
{"y": 2, "x": 12.75, "matrix": [2, 12], "label": "2,12"},
{"y": 2, "x": 12.75, "matrix": [2, 13], "w": 2.25, "label": "2,13"},
{"y": 3, "x": 0, "matrix": [3, 0], "w": 1.25, "label": "3,0"},
{"y": 3, "x": 1.25, "matrix": [3, 1], "label": "3,1"},
{"y": 3, "x": 2.25, "matrix": [3, 2], "label": "3,2"},
{"y": 3, "x": 3.25, "matrix": [3, 3], "label": "3,3"},
{"y": 3, "x": 4.25, "matrix": [3, 4], "label": "3,4"},
{"y": 3, "x": 5.25, "matrix": [3, 5], "label": "3,5"},
{"y": 3, "x": 6.25, "matrix": [3, 6], "label": "3,6"},
{"y": 3, "x": 7.25, "matrix": [3, 7], "label": "3,7"},
{"y": 3, "x": 8.25, "matrix": [3, 8], "label": "3,8"},
{"y": 3, "x": 9.25, "matrix": [3, 9], "label": "3,9"},
{"y": 3, "x": 10.25, "matrix": [3, 10], "label": "3,10"},
{"y": 3, "x": 11.25, "matrix": [3, 11], "label": "3,11"},
{"y": 3, "x": 12.25, "matrix": [3, 12], "w": 1.75, "label": "3,12"},
{"y": 3, "x": 14, "matrix": [3, 14], "label": "3,14"},
{"y": 4, "x": 0, "matrix": [4, 0], "w": 1.25, "label": "4,0"},
{"y": 4, "x": 1.25, "matrix": [4, 1], "w": 1.25, "label": "4,1"},
{"y": 4, "x": 2.5, "matrix": [4, 2], "w": 1.25, "label": "4,2"},
{"y": 4, "x": 4, "matrix": [4, 4], "label": "4,4"},
{"y": 4, "x": 5, "matrix": [4, 5], "w": 2.25, "label": "4,5"},
{"y": 4, "x": 7, "matrix": [4, 7], "label": "4,7"},
{"y": 4, "x": 8, "matrix": [4, 9], "w": 3, "label": "4,9"},
{"y": 4, "x": 10, "matrix": [4, 10], "w": 1.25, "label": "4,10"},
{"y": 4, "x": 11.25, "matrix": [4, 11], "w": 1.25, "label": "4,11"},
{"y": 4, "x": 12.5, "matrix": [4, 12], "w": 1.25, "label": "4,12"},
{"y": 4, "x": 13.75, "matrix": [4, 14], "w": 1.25, "label": "4,14"}
]
}
}
}

View File

@ -0,0 +1,155 @@
{
"keyboard_name": "RND60",
"manufacturer": "Nachie",
"board": "GENERIC_RP_RP2040",
"bootloader": "rp2040",
"processor": "RP2040",
"usb": {
"vid": "0x4B43",
"pid": "0x5336",
"device_version": "1.0.0"
},
"url": "https://rndkbd.com",
"maintainer": "nachie",
"features": {
"bootmagic": true,
"command": false,
"console": false,
"extrakey": true,
"mousekey": true,
"nkro": true,
"audio": false,
"backlight": false,
"rgblight": false,
"encoder": false,
"rgb_matrix": true
},
"diode_direction": "COL2ROW",
"matrix_pins": {
"cols": ["GP21", "GP5", "GP4", "GP3", "GP2", "GP1", "GP0", "GP15", "GP14", "GP13", "GP12", "GP11", "GP10", "GP8", "GP9"],
"rows": ["GP28", "GP27", "GP20", "GP6", "GP7"]
},
"ws2812": {
"pin": "GP29",
"driver": "vendor"
},
"rgb_matrix": {
"driver": "ws2812",
"led_count": 16,
"animations": {
"alphas_mods": true,
"gradient_up_down": true,
"gradient_left_right": true,
"breathing": true,
"band_sat": true,
"band_val": true,
"band_pinwheel_sat": true,
"band_pinwheel_val": true,
"band_spiral_sat": true,
"band_spiral_val": true,
"cycle_all": true,
"cycle_left_right": true,
"cycle_up_down": true,
"rainbow_moving_chevron":true,
"cycle_out_in": true,
"cycle_out_in_dual": true,
"cycle_pinwheel": true,
"cycle_spiral": true,
"rainbow_pinwheels": true,
"raindrops": true,
"jellybean_raindrops": true,
"hue_breathing": true,
"hue_pendulum": true,
"hue_wave": true,
"typing_heatmap": true,
"digital_rain": true,
"solid_reactive_simple": true,
"solid_reactive": true,
"solid_reactive_wide": true,
"solid_reactive_multiwide": true,
"solid_reactive_cross": true,
"solid_reactive_multicross": true,
"solid_reactive_nexus": true,
"solid_reactive_multinexus": true,
"splash": true,
"solid_splash": true,
"solid_multisplash": true,
"pixel_rain": true,
"pixel_fractal": true
}
},
"layouts": {
"LAYOUT": {
"layout": [
{"y": 0, "x": 0, "matrix": [0, 0], "label": "0,0"},
{"y": 0, "x": 1, "matrix": [0, 1], "label": "0,1"},
{"y": 0, "x": 2, "matrix": [0, 2], "label": "0,2"},
{"y": 0, "x": 3, "matrix": [0, 3], "label": "0,3"},
{"y": 0, "x": 4, "matrix": [0, 4], "label": "0,4"},
{"y": 0, "x": 5, "matrix": [0, 5], "label": "0,5"},
{"y": 0, "x": 6, "matrix": [0, 6], "label": "0,6"},
{"y": 0, "x": 7, "matrix": [0, 7], "label": "0,7"},
{"y": 0, "x": 8, "matrix": [0, 8], "label": "0,8"},
{"y": 0, "x": 9, "matrix": [0, 9], "label": "0,9"},
{"y": 0, "x": 10, "matrix": [0, 10], "label": "0,10"},
{"y": 0, "x": 11, "matrix": [0, 11], "label": "0,11"},
{"y": 0, "x": 12, "matrix": [0, 12], "label": "0,12"},
{"y": 0, "x": 13, "matrix": [0, 13], "label": "0,13"},
{"y": 0, "x": 14, "matrix": [0, 14], "label": "0,14"},
{"y": 1, "x": 0, "matrix": [1, 0], "w": 1.5, "label": "1,0"},
{"y": 1, "x": 1.5, "matrix": [1, 1], "label": "1,1"},
{"y": 1, "x": 2.5, "matrix": [1, 2], "label": "1,2"},
{"y": 1, "x": 3.5, "matrix": [1, 3], "label": "1,3"},
{"y": 1, "x": 4.5, "matrix": [1, 4], "label": "1,4"},
{"y": 1, "x": 5.5, "matrix": [1, 5], "label": "1,5"},
{"y": 1, "x": 6.5, "matrix": [1, 6], "label": "1,6"},
{"y": 1, "x": 7.5, "matrix": [1, 7], "label": "1,7"},
{"y": 1, "x": 8.5, "matrix": [1, 8], "label": "1,8"},
{"y": 1, "x": 9.5, "matrix": [1, 9], "label": "1,9"},
{"y": 1, "x": 10.5, "matrix": [1, 10], "label": "1,10"},
{"y": 1, "x": 11.5, "matrix": [1, 11], "label": "1,11"},
{"y": 1, "x": 12.5, "matrix": [1, 12], "label": "1,12"},
{"y": 1, "x": 13.5, "matrix": [1, 14], "w": 1.5, "label": "1,14"},
{"y": 2, "x": 0, "matrix": [2, 0], "w": 1.75, "label": "2,0"},
{"y": 2, "x": 1.75, "matrix": [2, 1], "label": "2,1"},
{"y": 2, "x": 2.75, "matrix": [2, 2], "label": "2,2"},
{"y": 2, "x": 3.75, "matrix": [2, 3], "label": "2,3"},
{"y": 2, "x": 4.75, "matrix": [2, 4], "label": "2,4"},
{"y": 2, "x": 5.75, "matrix": [2, 5], "label": "2,5"},
{"y": 2, "x": 6.75, "matrix": [2, 6], "label": "2,6"},
{"y": 2, "x": 7.75, "matrix": [2, 7], "label": "2,7"},
{"y": 2, "x": 8.75, "matrix": [2, 8], "label": "2,8"},
{"y": 2, "x": 9.75, "matrix": [2, 9], "label": "2,9"},
{"y": 2, "x": 10.75, "matrix": [2, 10], "label": "2,10"},
{"y": 2, "x": 11.75, "matrix": [2, 11], "label": "2,11"},
{"y": 2, "x": 12.75, "matrix": [2, 12], "label": "2,12"},
{"y": 2, "x": 12.75, "matrix": [2, 13], "w": 2.25, "label": "2,13"},
{"y": 3, "x": 0, "matrix": [3, 0], "w": 1.25, "label": "3,0"},
{"y": 3, "x": 1.25, "matrix": [3, 1], "label": "3,1"},
{"y": 3, "x": 2.25, "matrix": [3, 2], "label": "3,2"},
{"y": 3, "x": 3.25, "matrix": [3, 3], "label": "3,3"},
{"y": 3, "x": 4.25, "matrix": [3, 4], "label": "3,4"},
{"y": 3, "x": 5.25, "matrix": [3, 5], "label": "3,5"},
{"y": 3, "x": 6.25, "matrix": [3, 6], "label": "3,6"},
{"y": 3, "x": 7.25, "matrix": [3, 7], "label": "3,7"},
{"y": 3, "x": 8.25, "matrix": [3, 8], "label": "3,8"},
{"y": 3, "x": 9.25, "matrix": [3, 9], "label": "3,9"},
{"y": 3, "x": 10.25, "matrix": [3, 10], "label": "3,10"},
{"y": 3, "x": 11.25, "matrix": [3, 11], "label": "3,11"},
{"y": 3, "x": 12.25, "matrix": [3, 12], "w": 1.75, "label": "3,12"},
{"y": 3, "x": 14, "matrix": [3, 14], "label": "3,14"},
{"y": 4, "x": 0, "matrix": [4, 0], "w": 1.25, "label": "4,0"},
{"y": 4, "x": 1.25, "matrix": [4, 1], "w": 1.25, "label": "4,1"},
{"y": 4, "x": 2.5, "matrix": [4, 2], "w": 1.25, "label": "4,2"},
{"y": 4, "x": 4, "matrix": [4, 4], "label": "4,4"},
{"y": 4, "x": 5, "matrix": [4, 5], "w": 2.25, "label": "4,5"},
{"y": 4, "x": 7, "matrix": [4, 7], "label": "4,7"},
{"y": 4, "x": 8, "matrix": [4, 9], "w": 3, "label": "4,9"},
{"y": 4, "x": 10, "matrix": [4, 10], "w": 1.25, "label": "4,10"},
{"y": 4, "x": 11.25, "matrix": [4, 11], "w": 1.25, "label": "4,11"},
{"y": 4, "x": 12.5, "matrix": [4, 12], "w": 1.25, "label": "4,12"},
{"y": 4, "x": 13.75, "matrix": [4, 14], "w": 1.25, "label": "4,14"}
]
}
}
}

View File

@ -0,0 +1,54 @@
/*
Copyright 2024 nachie
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(
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_BSPC, 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_NUBS, KC_ENT,
KC_LSFT, KC_NUHS, 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_VOLD, KC_SPC, KC_MPLY, KC_SPC, KC_VOLU, KC_RALT, KC_LGUI, KC_LCTL
),
[1] = LAYOUT(
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, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
),
[2] = LAYOUT(
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, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
),
[3] = LAYOUT(
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, 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,9 @@
#pragma once
#define VIAL_KEYBOARD_UID {0xEB, 0x02, 0x48, 0xB5, 0x37, 0x0B, 0x55, 0x7B}
#define VIAL_UNLOCK_COMBO_ROWS { 0, 2 }
#define VIAL_UNLOCK_COMBO_COLS { 0, 13 }
#define RGB_MATRIX_FRAMEBUFFER_EFFECTS
#define RGB_MATRIX_KEYPRESSES

View File

@ -0,0 +1,54 @@
/*
Copyright 2024 nachie
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(
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_BSPC, 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_NUBS, KC_ENT,
KC_LSFT, KC_NUHS, 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_SPC, KC_SPC, KC_SPC, KC_RALT, KC_LGUI, KC_APP, KC_LCTL
),
[1] = LAYOUT(
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, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
),
[2] = LAYOUT(
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, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
),
[3] = LAYOUT(
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, 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,3 @@
VIA_ENABLE = yes
VIAL_ENABLE = yes
VIALRGB_ENABLE = yes

View File

@ -0,0 +1,346 @@
{
"name": "RND60",
"vendorId": "0x4B43",
"productId": "0x5345",
"lighting": "vialrgb",
"matrix": {
"rows": 5,
"cols": 15
},
"layouts": {
"labels": [
"Split Backspace",
["Enter", "ANSI", "ISO"],
"Split Left Shift",
"Split Right Shift",
["Space", "6.25u", "3-1-3 Split", "Small Split", "10u", "7u"]
],
"keymap": [
[
{
"x": 2.5,
"c": "#777777"
},
"0,0",
{
"c": "#cccccc"
},
"0,1",
"0,2",
"0,3",
"0,4",
"0,5",
"0,6",
"0,7",
"0,8",
"0,9",
"0,10",
"0,11",
"0,12",
{
"c": "#aaaaaa",
"w": 2
},
"0,14\n\n\n0,0",
{
"x": 1
},
"0,13\n\n\n0,1",
"0,14\n\n\n0,1"
],
[
{
"x": 2.5,
"w": 1.5
},
"1,0",
{
"c": "#cccccc"
},
"1,1",
"1,2",
"1,3",
"1,4",
"1,5",
"1,6",
"1,7",
"1,8",
"1,9",
"1,10",
"1,11",
"1,12",
{
"c": "#aaaaaa",
"w": 1.5
},
"1,14\n\n\n1,0",
{
"x": 1.75,
"c": "#777777",
"w": 1.25,
"h": 2,
"w2": 1.5,
"h2": 1,
"x2": -0.25
},
"2,13\n\n\n1,1"
],
[
{
"x": 2.5,
"c": "#aaaaaa",
"w": 1.75
},
"2,0",
{
"c": "#cccccc"
},
"2,1",
"2,2",
"2,3",
"2,4",
"2,5",
"2,6",
"2,7",
"2,8",
"2,9",
"2,10",
"2,11",
{
"c": "#777777",
"w": 2.25
},
"2,13\n\n\n1,0",
{
"x": 0.75,
"c": "#cccccc"
},
"2,12\n\n\n1,1"
],
[
{
"c": "#aaaaaa",
"w": 1.25
},
"3,0\n\n\n2,1",
"3,1\n\n\n2,1",
{
"x": 0.25,
"w": 2.25
},
"3,0\n\n\n2,0",
{
"c": "#cccccc"
},
"3,2",
"3,3",
"3,4",
"3,5",
"3,6",
"3,7",
"3,8",
"3,9",
"3,10",
"3,11",
{
"c": "#aaaaaa",
"w": 2.75
},
"3,12\n\n\n3,0",
{
"x": 0.25,
"w": 1.75
},
"3,12\n\n\n3,1",
"3,14\n\n\n3,1"
],
[
{
"x": 2.5,
"w": 1.25
},
"4,0\n\n\n4,0",
{
"x": -1.25,
"w": 1.5
},
"4,0\n\n\n4,4",
{
"x": -1.5,
"w": 1.5
},
"4,0\n\n\n4,1",
{
"x": -1.5,
"w": 1.5
},
"4,0\n\n\n4,2",
{
"x": -1.5,
"w": 1.5
},
"4,0\n\n\n4,3",
{
"x": -0.25,
"w": 1.25
},
"4,1\n\n\n4,0",
{
"x": -1
},
"4,1\n\n\n4,4",
{
"x": -1
},
"4,1\n\n\n4,1",
{
"x": -1
},
"4,1\n\n\n4,2",
{
"x": -1
},
"4,1\n\n\n4,3",
{
"w": 1.25
},
"4,2\n\n\n4,0",
{
"x": -1.25,
"w": 1.5
},
"4,2\n\n\n4,4",
{
"x": -1.5,
"w": 1.5
},
"4,2\n\n\n4,1",
{
"x": -1.5,
"w": 1.5
},
"4,2\n\n\n4,2",
{
"x": -1.5,
"c": "#cccccc",
"w": 10
},
"4,7\n\n\n4,3",
{
"x": -8.75,
"w": 6.25
},
"4,7\n\n\n4,0",
{
"x": -6,
"w": 7
},
"4,7\n\n\n4,4",
{
"x": -7,
"w": 3
},
"4,5\n\n\n4,1",
{
"x": -3,
"c": "#aaaaaa"
},
"4,4\n\n\n4,2",
{
"c": "#cccccc",
"w": 2.25
},
"4,5\n\n\n4,2",
{
"x": -0.25,
"c": "#aaaaaa"
},
"4,7\n\n\n4,1",
{
"x": -0.75,
"c": "#cccccc",
"w": 2.75
},
"4,9\n\n\n4,2",
{
"x": -2,
"w": 3
},
"4,9\n\n\n4,1",
{
"x": -1,
"c": "#aaaaaa",
"w": 1.25
},
"4,10\n\n\n4,0",
{
"x": -1.25
},
"4,10\n\n\n4,2",
{
"w": 1.5
},
"4,11\n\n\n4,4",
{
"x": -1.5,
"w": 1.5
},
"4,11\n\n\n4,1",
{
"x": -1.5,
"w": 1.5
},
"4,11\n\n\n4,2",
{
"x": -1.25,
"w": 1.25
},
"4,11\n\n\n4,0",
{
"w": 1.25
},
"4,12\n\n\n4,0",
{
"x": -1.25
},
"4,12\n\n\n4,4",
{
"x": -1
},
"4,12\n\n\n4,1",
{
"x": -1
},
"4,12\n\n\n4,2",
{
"x": -1
},
"4,12\n\n\n4,3",
{
"w": 1.5
},
"4,14\n\n\n4,4",
{
"x": -1.5,
"w": 1.5
},
"4,14\n\n\n4,1",
{
"x": -1.5,
"w": 1.5
},
"4,14\n\n\n4,2",
{
"x": -1.5,
"w": 1.5
},
"4,14\n\n\n4,3",
{
"x": -1.25,
"w": 1.25
},
"4,14\n\n\n4,0"
]
]
}
}

View File

@ -0,0 +1,38 @@
/*
Copyright 2024 nachie
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 "quantum.h"
led_config_t g_led_config = { {
{ NO_LED, 0, NO_LED, 1, NO_LED, 2, NO_LED, NO_LED, 3, NO_LED, 4, NO_LED, 5, NO_LED, NO_LED },
{ 6, NO_LED, NO_LED, NO_LED, NO_LED, NO_LED, NO_LED, NO_LED, NO_LED, NO_LED, NO_LED, NO_LED, NO_LED, NO_LED, 7 },
{ 8, NO_LED, NO_LED, NO_LED, NO_LED, NO_LED, NO_LED, NO_LED, NO_LED, NO_LED, NO_LED, NO_LED, NO_LED, NO_LED, NO_LED },
{ NO_LED, NO_LED, NO_LED, NO_LED, NO_LED, NO_LED, NO_LED, NO_LED, NO_LED, NO_LED, NO_LED, NO_LED, NO_LED, NO_LED, 9 },
{ NO_LED, NO_LED, 10, NO_LED, 11, 12, NO_LED, NO_LED, 13, 14, NO_LED, 15, NO_LED, NO_LED, NO_LED }
}, {
{ 16,0 }, { 49,0 }, { 81,0 }, { 130,0 }, { 163,0 }, { 195,0 },
{ 4,16 }, { 224,16 },
{ 6,32 },
{ 224,48 },
{ 16,64 }, { 51,64 }, { 79,64 }, { 120,64 }, { 153,64 }, { 204,64 }
}, {
1, 1, 1, 1, 1, 1,
1, 1,
1,
1,
1, 1, 1, 1, 1, 1
} };

View File

@ -0,0 +1 @@
# This file is intentionally left blank

View File

@ -0,0 +1,26 @@
/*
Copyright 2024 Nachie
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 CH_CFG_ST_FREQUENCY 10000
#define CH_CFG_OPTIMIZE_SPEED FALSE
#define CH_CFG_USE_CONDVARS_TIMEOUT FALSE
#include_next <chconf.h>

View File

@ -0,0 +1,46 @@
/*
Copyright 2024 nachie
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
#ifdef OLED_ENABLE
/* Oled config */
#define OLED_DISPLAY_ADDRESS 0x3C
#define I2C1_SCL_PIN B6
#define I2C1_SDA_PIN B7
#define I2C1_SCL_PAL_MODE 1
#define I2C1_SDA_PAL_MODE 1
#define OLED_TIMEOUT 60000 // Turns off the OLED screen after x ms of keyboard inactivity. Helps reduce OLED Burn-in. Set to 0 to disable.
#define OLED_BRIGHTNESS 50 // The default brightness level of the OLED, from 0 to 255.
#define OLED_UPDATE_INTERVAL 16 // limits in milliseconds how frequently the OLED updates. Calculation 1000/fps (increases keyboard responsiveness)
#endif
/* I2c Timings at 48mhz - Fast mode 400KHz */
// #define I2C1_TIMINGR_PRESC 2U
// #define I2C1_TIMINGR_SCLDEL 1U
// #define I2C1_TIMINGR_SDADEL 0U
// #define I2C1_TIMINGR_SCLH 9U
// #define I2C1_TIMINGR_SCLL 26U
/* I2c Timings at 48mhz - Fast mode plus 1MHz */
#define I2C1_TIMINGR_PRESC 0x00U
#define I2C1_TIMINGR_SCLDEL 0x03U
#define I2C1_TIMINGR_SDADEL 0x01U
#define I2C1_TIMINGR_SCLH 0x03U
#define I2C1_TIMINGR_SCLL 0x09U

View File

@ -0,0 +1,22 @@
/*
Copyright 2024 nachie
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 HAL_USE_I2C TRUE
#include_next <halconf.h>

View File

@ -0,0 +1,83 @@
{
"keyboard_name": "Subtext",
"manufacturer": "Nachie",
"usb": {
"vid": "0x4B43",
"pid": "0x5354",
"device_version": "1.0.0"
},
"url": "https://littlecraftery.com/products/subtext",
"maintainer": "nachie",
"bootloader": "stm32-dfu",
"processor": "STM32F072",
"layouts": {
"LAYOUT": {
"layout": [
{"matrix": [0, 0], "h": 0.75, "label": "0,0", "w": 1.0357, "y": 0.0, "x": 0},
{"matrix": [1, 0], "h": 0.75, "label": "1,0", "w": 1.0357, "y": 0.0, "x": 1.03},
{"matrix": [0, 1], "h": 0.75, "label": "0,1", "w": 1.0357, "y": 0.0, "x": 2.0700000000000003},
{"matrix": [1, 1], "h": 0.75, "label": "1,1", "w": 1.0357, "y": 0.0, "x": 3.1},
{"matrix": [0, 3], "h": 0.75, "label": "0,3", "w": 1.0357, "y": 0.0, "x": 6.46},
{"matrix": [1, 3], "h": 0.75, "label": "1,3", "w": 1.0357, "y": 0.0, "x": 7.5},
{"matrix": [0, 4], "h": 0.75, "label": "0,4", "w": 1.0357, "y": 0.0, "x": 8.530000000000001},
{"matrix": [1, 4], "h": 0.75, "label": "1,4", "w": 1.0357, "y": 0.0, "x": 9.57},
{"matrix": [2, 0], "h": 0.75, "label": "2,0", "w": 1.0357, "y": 1.0, "x": 0},
{"matrix": [3, 0], "h": 0.75, "label": "3,0", "w": 1.0357, "y": 1.0, "x": 1.03},
{"matrix": [2, 1], "h": 0.75, "label": "2,1", "w": 1.0357, "y": 1.0, "x": 2.0700000000000003},
{"matrix": [3, 1], "h": 0.75, "label": "3,1", "w": 1.0357, "y": 1.0, "x": 3.1},
{"matrix": [2, 2], "h": 0.75, "label": "2,2", "w": 1.0357, "y": 1.0, "x": 4.140000000000001},
{"matrix": [3, 2], "h": 0.75, "label": "3,2", "w": 1.0357, "y": 1.0, "x": 5.180000000000001},
{"matrix": [2, 3], "h": 0.75, "label": "2,3", "w": 1.0357, "y": 1.0, "x": 6.21},
{"matrix": [3, 3], "h": 0.75, "label": "3,3", "w": 1.0357, "y": 1.0, "x": 7.250000000000001},
{"matrix": [2, 4], "h": 0.75, "label": "2,4", "w": 1.0357, "y": 1.0, "x": 8.280000000000001},
{"matrix": [3, 4], "h": 0.75, "label": "3,4", "w": 1.0357, "y": 1.0, "x": 9.32},
{"matrix": [4, 0], "h": 0.75, "label": "4,0", "w": 1.0357, "y": 1.75, "x": 0.25},
{"matrix": [5, 0], "h": 0.75, "label": "5,0", "w": 1.0357, "y": 1.75, "x": 1.28},
{"matrix": [4, 1], "h": 0.75, "label": "4,1", "w": 1.0357, "y": 1.75, "x": 2.3200000000000003},
{"matrix": [5, 1], "h": 0.75, "label": "5,1", "w": 1.0357, "y": 1.75, "x": 3.35},
{"matrix": [4, 2], "h": 0.75, "label": "4,2", "w": 1.0357, "y": 1.75, "x": 4.390000000000001},
{"matrix": [5, 2], "h": 0.75, "label": "5,2", "w": 1.0357, "y": 1.75, "x": 5.430000000000001},
{"matrix": [4, 3], "h": 0.75, "label": "4,3", "w": 1.0357, "y": 1.75, "x": 6.46},
{"matrix": [5, 3], "h": 0.75, "label": "5,3", "w": 1.0357, "y": 1.75, "x": 7.500000000000001},
{"matrix": [4, 4], "h": 0.75, "label": "4,4", "w": 1.0357, "y": 1.75, "x": 8.530000000000001},
{"matrix": [5, 4], "h": 0.75, "label": "5,4", "w": 1.0357, "y": 1.75, "x": 9.57},
{"matrix": [7, 0], "h": 0.75, "label": "7,0", "w": 1.0357, "y": 2.5, "x": 0.5},
{"matrix": [6, 1], "h": 0.75, "label": "6,1", "w": 1.0357, "y": 2.5, "x": 1.53},
{"matrix": [7, 1], "h": 0.75, "label": "7,1", "w": 1.0357, "y": 2.5, "x": 2.5700000000000003},
{"matrix": [6, 2], "h": 0.75, "label": "6,2", "w": 1.0357, "y": 2.5, "x": 3.6},
{"matrix": [7, 2], "h": 0.75, "label": "7,2", "w": 1.0357, "y": 2.5, "x": 4.640000000000001},
{"matrix": [6, 3], "h": 0.75, "label": "6,3", "w": 1.0357, "y": 2.5, "x": 5.680000000000001},
{"matrix": [7, 3], "h": 0.75, "label": "7,3", "w": 1.0357, "y": 2.5, "x": 6.71},
{"matrix": [6, 4], "h": 0.75, "label": "6,4", "w": 1.0357, "y": 2.5, "x": 7.750000000000001},
{"matrix": [7, 4], "h": 0.75, "label": "7,4", "w": 1.0357, "y": 2.5, "x": 8.780000000000001},
{"matrix": [8, 0], "h": 0.75, "label": "8,0", "w": 1.0357, "y": 3.25, "x": 1.25},
{"matrix": [9, 0], "h": 0.75, "label": "9,0", "w": 1.0357, "y": 3.25, "x": 2.2800000000000002},
{"matrix": [8, 1], "h": 0.75, "label": "8,1", "w": 1.0357, "y": 3.25, "x": 3.3200000000000003},
{"matrix": [9, 1], "h": 0.75, "label": "9,1", "w": 1.0357, "y": 3.25, "x": 4.3500000000000005},
{"matrix": [8, 2], "h": 0.75, "label": "8,2", "w": 1.0357, "y": 3.25, "x": 5.390000000000001},
{"matrix": [9, 2], "h": 0.75, "label": "9,2", "w": 1.0357, "y": 3.25, "x": 6.430000000000001},
{"matrix": [8, 3], "h": 0.75, "label": "8,3", "w": 1.0357, "y": 3.25, "x": 7.46},
{"matrix": [9, 3], "h": 0.75, "label": "9,3", "w": 1.0357, "y": 3.25, "x": 8.5}
]
}
},
"features": {
"bootmagic": true,
"command": false,
"console": false,
"extrakey": true,
"mousekey": true,
"nkro": false,
"audio": false,
"backlight": false,
"rgblight": false,
"encoder": false,
"oled": true,
"wpm": true
},
"diode_direction": "COL2ROW",
"matrix_pins": {
"cols": ["A3", "A9", "A8", "B12", "B14"],
"rows": ["A2", "A4", "C13", "B5", "B9", "B3", "B4", "B8", "A15", "A10"]
}
}

View File

@ -0,0 +1,83 @@
{
"keyboard_name": "Subtext",
"manufacturer": "Nachie",
"usb": {
"vid": "0x4B43",
"pid": "0x5354",
"device_version": "1.0.0"
},
"url": "https://littlecraftery.com/products/subtext",
"maintainer": "nachie",
"bootloader": "stm32-dfu",
"processor": "STM32F072",
"layouts": {
"LAYOUT": {
"layout": [
{"matrix": [0, 0], "h": 0.75, "label": "0,0", "w": 1.0357, "y": 0.0, "x": 0},
{"matrix": [1, 0], "h": 0.75, "label": "1,0", "w": 1.0357, "y": 0.0, "x": 1.03},
{"matrix": [0, 1], "h": 0.75, "label": "0,1", "w": 1.0357, "y": 0.0, "x": 2.0700000000000003},
{"matrix": [1, 1], "h": 0.75, "label": "1,1", "w": 1.0357, "y": 0.0, "x": 3.1},
{"matrix": [0, 3], "h": 0.75, "label": "0,3", "w": 1.0357, "y": 0.0, "x": 6.46},
{"matrix": [1, 3], "h": 0.75, "label": "1,3", "w": 1.0357, "y": 0.0, "x": 7.5},
{"matrix": [0, 4], "h": 0.75, "label": "0,4", "w": 1.0357, "y": 0.0, "x": 8.530000000000001},
{"matrix": [1, 4], "h": 0.75, "label": "1,4", "w": 1.0357, "y": 0.0, "x": 9.57},
{"matrix": [2, 0], "h": 0.75, "label": "2,0", "w": 1.0357, "y": 1.0, "x": 0},
{"matrix": [3, 0], "h": 0.75, "label": "3,0", "w": 1.0357, "y": 1.0, "x": 1.03},
{"matrix": [2, 1], "h": 0.75, "label": "2,1", "w": 1.0357, "y": 1.0, "x": 2.0700000000000003},
{"matrix": [3, 1], "h": 0.75, "label": "3,1", "w": 1.0357, "y": 1.0, "x": 3.1},
{"matrix": [2, 2], "h": 0.75, "label": "2,2", "w": 1.0357, "y": 1.0, "x": 4.140000000000001},
{"matrix": [3, 2], "h": 0.75, "label": "3,2", "w": 1.0357, "y": 1.0, "x": 5.180000000000001},
{"matrix": [2, 3], "h": 0.75, "label": "2,3", "w": 1.0357, "y": 1.0, "x": 6.21},
{"matrix": [3, 3], "h": 0.75, "label": "3,3", "w": 1.0357, "y": 1.0, "x": 7.250000000000001},
{"matrix": [2, 4], "h": 0.75, "label": "2,4", "w": 1.0357, "y": 1.0, "x": 8.280000000000001},
{"matrix": [3, 4], "h": 0.75, "label": "3,4", "w": 1.0357, "y": 1.0, "x": 9.32},
{"matrix": [4, 0], "h": 0.75, "label": "4,0", "w": 1.0357, "y": 1.75, "x": 0.25},
{"matrix": [5, 0], "h": 0.75, "label": "5,0", "w": 1.0357, "y": 1.75, "x": 1.28},
{"matrix": [4, 1], "h": 0.75, "label": "4,1", "w": 1.0357, "y": 1.75, "x": 2.3200000000000003},
{"matrix": [5, 1], "h": 0.75, "label": "5,1", "w": 1.0357, "y": 1.75, "x": 3.35},
{"matrix": [4, 2], "h": 0.75, "label": "4,2", "w": 1.0357, "y": 1.75, "x": 4.390000000000001},
{"matrix": [5, 2], "h": 0.75, "label": "5,2", "w": 1.0357, "y": 1.75, "x": 5.430000000000001},
{"matrix": [4, 3], "h": 0.75, "label": "4,3", "w": 1.0357, "y": 1.75, "x": 6.46},
{"matrix": [5, 3], "h": 0.75, "label": "5,3", "w": 1.0357, "y": 1.75, "x": 7.500000000000001},
{"matrix": [4, 4], "h": 0.75, "label": "4,4", "w": 1.0357, "y": 1.75, "x": 8.530000000000001},
{"matrix": [5, 4], "h": 0.75, "label": "5,4", "w": 1.0357, "y": 1.75, "x": 9.57},
{"matrix": [7, 0], "h": 0.75, "label": "7,0", "w": 1.0357, "y": 2.5, "x": 0.5},
{"matrix": [6, 1], "h": 0.75, "label": "6,1", "w": 1.0357, "y": 2.5, "x": 1.53},
{"matrix": [7, 1], "h": 0.75, "label": "7,1", "w": 1.0357, "y": 2.5, "x": 2.5700000000000003},
{"matrix": [6, 2], "h": 0.75, "label": "6,2", "w": 1.0357, "y": 2.5, "x": 3.6},
{"matrix": [7, 2], "h": 0.75, "label": "7,2", "w": 1.0357, "y": 2.5, "x": 4.640000000000001},
{"matrix": [6, 3], "h": 0.75, "label": "6,3", "w": 1.0357, "y": 2.5, "x": 5.680000000000001},
{"matrix": [7, 3], "h": 0.75, "label": "7,3", "w": 1.0357, "y": 2.5, "x": 6.71},
{"matrix": [6, 4], "h": 0.75, "label": "6,4", "w": 1.0357, "y": 2.5, "x": 7.750000000000001},
{"matrix": [7, 4], "h": 0.75, "label": "7,4", "w": 1.0357, "y": 2.5, "x": 8.780000000000001},
{"matrix": [8, 0], "h": 0.75, "label": "8,0", "w": 1.0357, "y": 3.25, "x": 1.25},
{"matrix": [9, 0], "h": 0.75, "label": "9,0", "w": 1.0357, "y": 3.25, "x": 2.2800000000000002},
{"matrix": [8, 1], "h": 0.75, "label": "8,1", "w": 1.0357, "y": 3.25, "x": 3.3200000000000003},
{"matrix": [9, 1], "h": 0.75, "label": "9,1", "w": 1.0357, "y": 3.25, "x": 4.3500000000000005},
{"matrix": [8, 2], "h": 0.75, "label": "8,2", "w": 1.0357, "y": 3.25, "x": 5.390000000000001},
{"matrix": [9, 2], "h": 0.75, "label": "9,2", "w": 1.0357, "y": 3.25, "x": 6.430000000000001},
{"matrix": [8, 3], "h": 0.75, "label": "8,3", "w": 1.0357, "y": 3.25, "x": 7.46},
{"matrix": [9, 3], "h": 0.75, "label": "9,3", "w": 1.0357, "y": 3.25, "x": 8.5}
]
}
},
"features": {
"bootmagic": true,
"command": false,
"console": false,
"extrakey": true,
"mousekey": true,
"nkro": false,
"audio": false,
"backlight": false,
"rgblight": false,
"encoder": false,
"oled": true,
"wpm": true
},
"diode_direction": "COL2ROW",
"matrix_pins": {
"cols": ["A3", "A9", "A8", "B12", "B14"],
"rows": ["A2", "A4", "C13", "B5", "B9", "B3", "B4", "B8", "A15", "A10"]
}
}

View File

@ -0,0 +1,27 @@
/*
Copyright 2024 nachie
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] = {
LAYOUT(
KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7,
KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P,
KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_ENT,
KC_Z, KC_X, KC_C, KC_V, KC_B, KC_B, KC_N, KC_M, KC_DOT,
KC_LGUI, KC_LALT, KC_SPC, KC_LGUI, KC_SPC, KC_BSPC, KC_RALT, KC_RCTL
)
};

View File

@ -0,0 +1 @@
The default layout for the nachie SubText

View File

@ -0,0 +1,8 @@
/* SPDX-License-Identifier: GPL-2.0-or-later */
#pragma once
#define VIAL_KEYBOARD_UID {0x7B, 0x8D, 0x18, 0xFF, 0xE1, 0x74, 0x36, 0xB2}
#define VIAL_UNLOCK_COMBO_ROWS { 0, 5 }
#define VIAL_UNLOCK_COMBO_COLS { 0, 4 }

View File

@ -0,0 +1,487 @@
/*
Copyright 2024 nachie
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
#include <stdio.h>
#include "os_detection.h"
#ifdef OLED_ENABLE
void render_key_status_or_logo(void);
void render_current_layer(void);
void render_current_wpm(void);
#endif
os_variant_t current_platform;
bool is_alt_tab_active = false;
uint16_t alt_tab_timer = 0;
enum layer_names {
_BASE, // Default Layer
_FN, // Fn Layer 1
_FN2, // Fn Layer 2
_FN3 // Fn Layer 3
};
enum custom_keycode {
JWRDL = QK_KB_0,
JWRDR,
SWRDL,
SWRDR,
TABL,
TABR,
DSKTPL,
DSKTPR,
PRVAPP,
NXTAPP
};
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
switch (keycode) {
case KC_HOME:
if (record->event.pressed && current_platform == OS_MACOS) {
register_mods(MOD_LGUI);
tap_code(KC_LEFT);
unregister_mods(MOD_LGUI);
} else {
tap_code(KC_HOME);
}
break;
case KC_END:
if (record->event.pressed && current_platform == OS_MACOS) {
register_mods(MOD_LGUI);
tap_code(KC_RIGHT);
unregister_mods(MOD_LGUI);
} else {
tap_code(KC_END);
}
break;
case KC_PGUP:
if (record->event.pressed && current_platform == OS_MACOS) {
register_mods(MOD_LGUI);
tap_code(KC_UP);
unregister_mods(MOD_LGUI);
} else {
tap_code(KC_PGUP);
}
break;
case KC_PGDN:
if (record->event.pressed && current_platform == OS_MACOS) {
register_mods(MOD_LGUI);
tap_code(KC_DOWN);
unregister_mods(MOD_LGUI);
} else {
tap_code(KC_PGDN);
}
break;
case KC_NUM_LOCK:
if (record->event.pressed && current_platform == OS_MACOS) {
register_mods(MOD_LSFT);
tap_code(KC_CLEAR);
unregister_mods(MOD_LSFT);
} else {
tap_code(KC_NUM_LOCK);
}
break;
case KC_SCROLL_LOCK:
if (record->event.pressed && current_platform == OS_MACOS) {
register_mods(MOD_LCTL);
tap_code(KC_F14);
unregister_mods(MOD_LCTL);
} else {
tap_code(KC_SCROLL_LOCK);
}
break;
case KC_PRINT_SCREEN:
if (record->event.pressed && current_platform == OS_MACOS) {
register_mods(MOD_LSFT);
register_mods(MOD_LGUI);
tap_code(KC_5);
unregister_mods(MOD_LGUI);
unregister_mods(MOD_LSFT);
} else {
tap_code(KC_PRINT_SCREEN);
}
break;
case JWRDL:
if (record->event.pressed) {
(current_platform == OS_MACOS) ? register_mods(MOD_LALT) : register_mods(MOD_LCTL);
tap_code(KC_LEFT);
(current_platform == OS_MACOS) ? unregister_mods(MOD_LALT) : unregister_mods(MOD_LCTL);
} else {
}
break;
case JWRDR:
if (record->event.pressed) {
(current_platform == OS_MACOS) ? register_mods(MOD_LALT) : register_mods(MOD_LCTL);
tap_code(KC_RIGHT);
(current_platform == OS_MACOS) ? unregister_mods(MOD_LALT) : unregister_mods(MOD_LCTL);
} else {
}
break;
case SWRDL:
if (record->event.pressed) {
register_mods(MOD_LSFT);
(current_platform == OS_MACOS) ? register_mods(MOD_LALT) : register_mods(MOD_LCTL);
tap_code(KC_LEFT);
(current_platform == OS_MACOS) ? unregister_mods(MOD_LALT) : unregister_mods(MOD_LCTL);
unregister_mods(MOD_LSFT);
} else {
}
break;
case SWRDR:
if (record->event.pressed) {
register_mods(MOD_LSFT);
(current_platform == OS_MACOS) ? register_mods(MOD_LALT) : register_mods(MOD_LCTL);
tap_code(KC_RIGHT);
(current_platform == OS_MACOS) ? unregister_mods(MOD_LALT) : unregister_mods(MOD_LCTL);
unregister_mods(MOD_LSFT);
} else {
}
break;
case TABL:
if (record->event.pressed) {
register_mods(MOD_LCTL);
register_mods(MOD_LSFT);
tap_code(KC_TAB);
unregister_mods(MOD_LSFT);
unregister_mods(MOD_LCTL);
} else {
}
break;
case TABR:
if (record->event.pressed) {
register_mods(MOD_LCTL);
tap_code(KC_TAB);
unregister_mods(MOD_LCTL);
} else {
}
break;
case DSKTPL:
if (record->event.pressed) {
register_mods(MOD_LCTL);
register_mods(MOD_LGUI);
(current_platform == OS_LINUX) ? tap_code(KC_UP) : tap_code(KC_LEFT);
unregister_mods(MOD_LGUI);
unregister_mods(MOD_LCTL);
} else {
}
break;
case DSKTPR:
if (record->event.pressed) {
register_mods(MOD_LCTL);
register_mods(MOD_LGUI);
(current_platform == OS_LINUX) ? tap_code(KC_DOWN) : tap_code(KC_RGHT);
unregister_mods(MOD_LGUI);
unregister_mods(MOD_LCTL);
} else {
}
break;
case PRVAPP:
if (record->event.pressed) {
register_code(KC_LSFT);
if (!is_alt_tab_active) {
is_alt_tab_active = true;
(current_platform == OS_MACOS) ? register_code(KC_LGUI) : register_code(KC_LALT);
}
alt_tab_timer = timer_read();
register_code(KC_TAB);
} else {
unregister_code(KC_TAB);
unregister_code(KC_LSFT);
}
break;
case NXTAPP:
if (record->event.pressed) {
if (!is_alt_tab_active) {
is_alt_tab_active = true;
(current_platform == OS_MACOS) ? register_code(KC_LGUI) : register_code(KC_LALT);
}
alt_tab_timer = timer_read();
register_code(KC_TAB);
} else {
unregister_code(KC_TAB);
}
break;
}
return true;
};
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* QWERTY */
[_BASE] = LAYOUT(
KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7,
KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P,
KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_ENT,
KC_Z, KC_X, KC_C, KC_V, KC_B, KC_B, KC_N, KC_M, KC_DOT,
KC_LGUI, KC_LALT, KC_SPC, KC_LGUI, KC_SPC, KC_BSPC, KC_RALT, KC_RCTL
),
/* FUNCTION */
[_FN] = LAYOUT(
_______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______
),
[_FN2] = LAYOUT(
_______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______
),
[_FN3] = LAYOUT(
_______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______
)
};
void matrix_scan_user(void) { // The very important timer.
if (is_alt_tab_active) {
if (timer_elapsed(alt_tab_timer) > 1000) {
(current_platform == OS_MACOS) ? unregister_code(KC_LGUI) : unregister_code(KC_LALT);
is_alt_tab_active = false;
}
}
}
#ifdef OLED_ENABLE
#ifdef DYNAMIC_MACRO_ENABLE
bool macro1;
bool macro1rec;
bool macro2;
bool macro2rec;
bool prevEnabled;
uint8_t prevRGBmode;
void render_dynamic_macro_status(int col, int line){
oled_set_cursor(col,line);
macro1rec ? oled_write(PSTR("DM1"), macro1) : oled_write(PSTR(" "),false);
oled_set_cursor(col,line+1);
macro2rec ? oled_write(PSTR("DM2"), macro2) : oled_write(PSTR(" "),false);
}
//direction indicates which macro it is, with 1 being Macro 1, -1 being Macro 2, and 0 being no macro.
void dynamic_macro_record_start_user(int8_t direction){
//prevEnabled = rgb_matrix_is_enabled();
//if (!prevEnabled) { rgb_matrix_enable(); }
//prevRGBmode = rgb_matrix_get_mode();
//rgb_matrix_mode(RGB_MATRIX_BREATHING);
switch(direction){
case 1:
macro1 = false;
macro1rec = true;
break;
case -1:
macro2 = false;
macro2rec = true;
break;
default:
macro1 = false;
macro2 = false;
macro1rec = false;
macro2rec = false;
break;
}
}
void dynamic_macro_record_end_user(int8_t direction){
//prevEnabled ? rgb_matrix_mode(prevRGBmode) : rgb_matrix_disable();
switch(direction){
case 1:
macro1 = true;
break;
case -1:
macro2 = true;
break;
default:
macro1 = false;
macro2 = false;
break;
}
}
#endif
bool clear_screen = false;
bool rerender_platform = false;
static void render_logo(void) {
static const char PROGMEM logo[] = {
0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, 0x90, 0x91, 0x92, 0x93, 0x94,
0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, 0xB0, 0xB1, 0xB2, 0xB3, 0xB4,
0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0x00
};
oled_write(logo, false);
}
void render_keylock_status(led_t led_state) {
bool caps_state = (led_state.caps_lock || is_caps_word_on());
oled_write(PSTR("CAPS"), caps_state);
oled_write(PSTR(" "), false);
oled_write(PSTR("NUM"), led_state.num_lock);
oled_write(PSTR(" "), false);
oled_write(PSTR("SCRL"), led_state.scroll_lock);
//oled_write_ln_P(PSTR(" "), false);
}
void render_mod_status(uint8_t modifiers) {
oled_write(PSTR("SH"), (modifiers & MOD_MASK_SHIFT));
oled_write(PSTR(" "), false);
(current_platform == OS_MACOS || current_platform == OS_IOS) ? oled_write(PSTR("CMD"), (modifiers & MOD_MASK_GUI)) : oled_write(PSTR("CT"), (modifiers & MOD_MASK_CTRL));
oled_write(PSTR(" "), false);
(current_platform == OS_MACOS || current_platform == OS_IOS) ? oled_write(PSTR("OPT"), (modifiers & MOD_MASK_ALT)) : oled_write(PSTR("ALT"), (modifiers & MOD_MASK_ALT));
oled_write(PSTR(" "), false);
(current_platform == OS_MACOS || current_platform == OS_IOS) ? oled_write(PSTR("CT"), (modifiers & MOD_MASK_CTRL)) : oled_write(PSTR("GUI"), (modifiers & MOD_MASK_GUI));
}
void render_key_status_or_logo(){
led_t led_state = host_keyboard_led_state();
uint8_t mod_state = (get_mods()|get_oneshot_mods());
if ( !led_state.num_lock && !led_state.caps_lock && !led_state.scroll_lock
&& !(mod_state & MOD_MASK_SHIFT) && !(mod_state & MOD_MASK_ALT) && !(mod_state & MOD_MASK_CTRL) && !(mod_state & MOD_MASK_GUI)) {
if(!clear_screen) {
render_logo();
rerender_platform = true;
}
clear_screen = true;
} else {
if (clear_screen == true) {
oled_clear();
oled_render();
clear_screen = false;
}
oled_set_cursor(8,0);
render_keylock_status(led_state);
oled_set_cursor(8,1);
render_mod_status(mod_state);
rerender_platform = true;
}
}
void render_current_layer(){
switch (get_highest_layer(layer_state)) {
case 0:
oled_write(PSTR("Layer 0"), false);
break;
case 1:
oled_write(PSTR("Layer 1"), false);
break;
case 2:
oled_write(PSTR("Layer 2"), false);
break;
case 3:
oled_write(PSTR("Layer 3"), false);
break;
default:
oled_write(PSTR("Layer ?"), false); // Should never display, here as a catchall
}
}
void render_current_wpm(){
oled_write_P(PSTR("WPM: "), false);
oled_write(get_u8_str(get_current_wpm(), '0'), false);
}
void render_platform_status(int col, int line) {
/* Show Ctrl-Gui Swap options */
static const char PROGMEM logo[][5][3] = {
{{0x9B, 0x9C, 0}, {0xbb, 0xbc, 0}}, //Android
{{0x99, 0x9A, 0}, {0xb9, 0xba, 0}}, //Linux
{{0x97, 0x98, 0}, {0xb7, 0xb8, 0}}, //Windows
{{0x95, 0x96, 0}, {0xb5, 0xb6, 0}}, //Mac/iOS
{{0x9D, 0x9E, 0}, {0xbd, 0xbe, 0}}, //Empty Placeholder
};
current_platform = detected_host_os();
switch (current_platform) {
/*case OS_ANDROID: //Android
oled_set_cursor(col,line);
oled_write(logo[0][0], false);
oled_set_cursor(col,line+1);
oled_write(logo[0][1], false);
break;*/
case OS_LINUX: //Linux
oled_set_cursor(col,line);
oled_write(logo[1][0], false);
oled_set_cursor(col,line+1);
oled_write(logo[1][1], false);
keymap_config.swap_lctl_lgui = false;
keymap_config.swap_rctl_rgui = false;
break;
case OS_WINDOWS: //Windows
oled_set_cursor(col,line);
oled_write(logo[2][0], false);
oled_set_cursor(col,line+1);
oled_write(logo[2][1], false);
keymap_config.swap_lctl_lgui = false;
keymap_config.swap_rctl_rgui = false;
break;
case OS_MACOS: //Mac
oled_set_cursor(col,line);
oled_write(logo[3][0], false);
oled_set_cursor(col,line+1);
oled_write(logo[3][1], false);
keymap_config.swap_lctl_lgui = true;
keymap_config.swap_rctl_rgui = true;
break;
case OS_IOS: //iOS
oled_set_cursor(col,line);
oled_write(logo[3][0], false);
oled_set_cursor(col,line+1);
oled_write(logo[3][1], false);
keymap_config.swap_lctl_lgui = true;
keymap_config.swap_rctl_rgui = true;
break;
default: //OS_UNSURE or not configured
oled_set_cursor(col,line);
oled_write(logo[4][0], false);
oled_set_cursor(col,line+1);
oled_write(logo[4][1], false);
break;
}
rerender_platform = false;
}
bool oled_task_user(void) {
render_key_status_or_logo();
oled_set_cursor(8,2);
render_current_layer();
#ifdef DYNAMIC_MACRO_ENABLE
render_dynamic_macro_status(18,2);
#endif
oled_set_cursor(8,3);
render_current_wpm();
#ifdef OS_DETECTION_ENABLE
if(current_platform != detected_host_os() || rerender_platform) { render_platform_status(3,0); }
#endif
return false;
}
#endif

View File

@ -0,0 +1 @@
The VIAL Keymap for the nachie subtext

View File

@ -0,0 +1,9 @@
VIA_ENABLE = yes
VIAL_ENABLE = yes
ENCODER_MAP_ENABLE = no
BOOTMAGIC_ENABLE = yes
MAGIC_ENABLE = yes
OS_DETECTION_ENABLE = yes
DYNAMIC_MACRO_ENABLE = yes
CAPS_WORD_ENABLE = yes

View File

@ -0,0 +1,298 @@
{
"name": "Subtext",
"vendorId": "0x4B43",
"productId": "0x5354",
"customKeycodes": [
{
"name": "JmpWordL",
"title": "Jump Word Left",
"shortName": "JWRDL"
},
{
"name": "JmpWordR",
"title": "Jump Word Right",
"shortName": "JWRDR"
},
{
"name": "SlcWordL",
"title": "Select Word Left",
"shortName": "SWRDL"
},
{
"name": "SlcWordR",
"title": "Select Word Right",
"shortName": "SWRDR"
},
{
"name": "TabLft",
"title": "Tab Left",
"shortName": "TABL"
},
{
"name": "TabRght",
"title": "Tab Right",
"shortName": "TABR"
},
{
"name": "DsktpLft",
"title": "Desktop Left",
"shortName": "DSKTPL"
},
{
"name": "DsktpRght",
"title": "Desktop Right",
"shortName": "DSKTPR"
},
{
"name": "PrevApp",
"title": "Previous App",
"shortName": "PRVAPP"
},
{
"name": "NextApp",
"title": "Next App",
"shortName": "NXTAPP"
}
],
"matrix": { "rows": 10, "cols": 5 },
"layouts": {
"keymap": [
[
{
"t": "#666666",
"f": 2,
"w": 1.0357
},
"0,0",
{
"x": -0.005700000000000038,
"w": 1.0357
},
"1,0",
{
"x": 0.0042999999999997485,
"w": 1.0357
},
"0,1",
{
"x": -0.005699999999999594,
"w": 1.0357
},
"1,1",
{
"x": 2.3243,
"w": 1.0357
},
"0,3",
{
"x": 0.0042999999999997485,
"w": 1.0357
},
"1,3",
{
"x": -0.0057000000000009265,
"w": 1.0357
},
"0,4",
{
"x": 0.004300000000000637,
"w": 1.0357
},
"1,4"
],
[
{
"y": 0.5,
"w": 1.0357
},
"2,0",
{
"x": -0.005700000000000038,
"w": 1.0357
},
"3,0",
{
"x": 0.0042999999999997485,
"w": 1.0357
},
"2,1",
{
"x": -0.005699999999999594,
"w": 1.0357
},
"3,1",
{
"x": 0.0042999999999997485,
"w": 1.0357
},
"2,2",
{
"x": 0.0042999999999997485,
"w": 1.0357
},
"3,2",
{
"x": -0.005700000000000038,
"w": 1.0357
},
"2,3",
{
"x": 0.0042999999999997485,
"w": 1.0357
},
"3,3",
{
"x": -0.0057000000000009265,
"w": 1.0357
},
"2,4",
{
"x": 0.004300000000000637,
"w": 1.0357
},
"3,4"
],
[
{
"x": 0.25,
"w": 1.0357
},
"4,0",
{
"x": -0.005700000000000038,
"w": 1.0357
},
"5,0",
{
"x": 0.0042999999999997485,
"w": 1.0357
},
"4,1",
{
"x": -0.005699999999999594,
"w": 1.0357
},
"5,1",
{
"x": 0.0042999999999997485,
"w": 1.0357
},
"4,2",
{
"x": 0.0042999999999997485,
"w": 1.0357
},
"5,2",
{
"x": -0.005700000000000038,
"w": 1.0357
},
"4,3",
{
"x": 0.0042999999999997485,
"w": 1.0357
},
"5,3",
{
"x": -0.0057000000000009265,
"w": 1.0357
},
"4,4",
{
"x": 0.004300000000000637,
"w": 1.0357
},
"5,4"
],
[
{
"x": 0.5,
"w": 1.0357
},
"7,0",
{
"x": -0.005700000000000038,
"w": 1.0357
},
"6,1",
{
"x": 0.0042999999999997485,
"w": 1.0357
},
"7,1",
{
"x": -0.005699999999999594,
"w": 1.0357
},
"6,2",
{
"x": 0.0042999999999997485,
"w": 1.0357
},
"7,2",
{
"x": 0.0042999999999997485,
"w": 1.0357
},
"6,3",
{
"x": -0.005700000000000038,
"w": 1.0357
},
"7,3",
{
"x": 0.0042999999999997485,
"w": 1.0357
},
"6,4",
{
"x": -0.0057000000000009265,
"w": 1.0357
},
"7,4"
],
[
{
"x": 1.25,
"w": 1.0357
},
"8,0",
{
"x": -0.0057000000000004825,
"w": 1.0357
},
"9,0",
{
"x": 0.0043000000000001926,
"w": 1.0357
},
"8,1",
{
"x": -0.005700000000000038,
"w": 1.0357
},
"9,1",
{
"x": 0.0042999999999997485,
"w": 1.0357
},
"8,2",
{
"x": 0.0042999999999997485,
"w": 1.0357
},
"9,2",
{
"x": -0.005700000000000038,
"w": 1.0357
},
"8,3",
{
"x": 0.004300000000000637,
"w": 1.0357
},
"9,3"
]
]
}
}

View File

@ -0,0 +1,22 @@
/*
Copyright 2024 nachie
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
#include_next <mcuconf.h>
#undef STM32_I2C_USE_I2C1
#define STM32_I2C_USE_I2C1 TRUE

View File

@ -0,0 +1,23 @@
# Subtext
Firmware for the nachie Subtext keyboard
* Keyboard Maintainer: [nachie](https://github.com/nachie)
* Hardware Supported: Subtext
* Hardware Availability: [nachie](https://littlecraftery.com/products/subtext)
Make example for this keyboard (after setting up your build environment):
make nachie/subtext:default
Or to make and flash:
make nachie/subtext: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
* **Bootmagic reset**: Hold down ESC (top left) and plug in the keyboard
* **Physical reset button**: Briefly press the button labeled "SW_RST1" on the back of the PCB

View File

@ -0,0 +1,5 @@
OLED_DRIVER = ssd1306 # Set Driver to SSD1306
# Enter lower-power sleep mode when on the ChibiOS idle thread
OPT_DEFS += -DCORTEX_ENABLE_WFI_IDLE=TRUE

View File

@ -0,0 +1,79 @@
/*
Copyright 2024 nachie
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 "quantum.h"
void board_init(void) {
SYSCFG->CFGR1 |= SYSCFG_CFGR1_I2C1_DMA_RMP; // DMA re-map, you may not need this depending on your
}
#ifdef OLED_ENABLE
oled_rotation_t oled_init_kb(oled_rotation_t rotation) {
return OLED_ROTATION_0;
}
static void render_logo(void) {
static const char PROGMEM my_logo[] = {
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0x0f, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0x3f, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x7f, 0x7f, 0x7f,
0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x7f, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0x00, 0x00, 0x1f, 0x8f, 0x07, 0x03, 0x71, 0xf8, 0xfc, 0xfe, 0xff, 0xff, 0x03, 0x01,
0x38, 0x1c, 0x06, 0xa6, 0xb6, 0x86, 0xfc, 0xf8, 0x00, 0x03, 0xff, 0xff, 0xff, 0x00, 0x00, 0xf1,
0xf9, 0xfc, 0xfc, 0xfc, 0xf8, 0xe1, 0x03, 0x0f, 0xff, 0xff, 0x1f, 0x03, 0x01, 0xf9, 0xfc, 0x1c,
0x80, 0xf8, 0xf0, 0xf1, 0xf7, 0xff, 0xff, 0xff, 0x03, 0x01, 0x38, 0x1c, 0x06, 0xa6, 0xb6, 0x86,
0xfc, 0xf8, 0x00, 0x03, 0xff, 0xff, 0xdf, 0x9f, 0x3f, 0x7f, 0xf8, 0xf2, 0xf2, 0x00, 0x01, 0xff,
0xff, 0xff, 0x07, 0x03, 0x91, 0x99, 0x9c, 0x9c, 0x9c, 0x98, 0x91, 0x83, 0x87, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xe0, 0xe0, 0xff, 0xff, 0xff, 0xfe, 0xf8, 0xe0, 0xe3, 0xe7, 0xff, 0xff, 0xff, 0xe0,
0xe0, 0xe0, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0xe0, 0xff, 0xff, 0xff, 0x00, 0x00, 0xf1,
0xe7, 0xe7, 0xe7, 0xe7, 0xe3, 0xf0, 0xf8, 0xfe, 0xff, 0xff, 0xfe, 0xf8, 0x70, 0x03, 0xc0, 0xe4,
0xe7, 0xe7, 0xe1, 0xf0, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xe0, 0xe0, 0xe0, 0xfe, 0xff, 0xff, 0xff,
0xff, 0xff, 0xe0, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xf8, 0xf1, 0xe1, 0xe0, 0xe0, 0xff,
0xff, 0xff, 0xfc, 0xf0, 0xf1, 0xe3, 0xe7, 0xe7, 0xe7, 0xe7, 0xe3, 0xf1, 0xf9, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
};
oled_write_raw_P(my_logo, sizeof(my_logo));
}
bool oled_task_kb(void) {
// Defer to the keymap if they want to override
if(!oled_task_user()) {
return false;
}
// default keyboard drawing code
render_logo();
return false;
}
#endif

View File

@ -0,0 +1,11 @@
/*
* `qmk chibios-confmigrate -i firmware/nachie/syndrome/chconf.h -r ../keymaps_qmk/platforms/chibios/boards/GENERIC_PROMICRO_RP2040/configs/chconf.h`
*/
#pragma once
#include_next <chconf.h>
#undef CH_CFG_ST_TIMEDELTA
#define CH_CFG_ST_TIMEDELTA 100

View File

@ -0,0 +1,38 @@
/*
Copyright 2024 Nachie
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_FLASH_GENERIC_03H
#ifdef HAPTIC_ENABLE
#define SOLENOID_PIN GP15
#endif
/* Oled config */
#ifdef OLED_ENABLE
#define I2C_DRIVER I2CD1
#define I2C1_SDA_PIN GP10
#define I2C1_SCL_PIN GP11
#define OLED_TIMEOUT 60000 // Turns off the OLED screen after x ms of screen update inactivity. Helps reduce OLED Burn-in. Set to 0 to disable.
#define OLED_FADE_OUT
#define OLED_FADE_OUT_INTERVAL 13
#define OLED_BRIGHTNESS 50 // The default brightness level of the OLED, from 0 to 255.
#define OLED_UPDATE_INTERVAL 16 // limits in milliseconds how frequently the OLED updates. Calculation 1000/fps (increases keyboard responsiveness)
#endif
#define VIA_CUSTOM_LIGHTING_ENABLE

View File

@ -0,0 +1,4 @@
#pragma once
#include_next <halconf.h>
#define HAL_USE_I2C TRUE

View File

@ -0,0 +1,149 @@
{
"keyboard_name": "Syndrome",
"manufacturer": "Nachie",
"usb": {
"vid": "0x4B43",
"pid": "0x5359",
"device_version": "1.0.0"
},
"board": "GENERIC_RP_RP2040",
"bootloader": "rp2040",
"processor": "RP2040",
"url": "https://littlecraftery.com/products/syndrome",
"maintainer": "nachie",
"ws2812": {
"pin": "GP29",
"driver": "vendor"
},
"rgb_matrix": {
"driver": "ws2812",
"led_count": 16,
"animations": {
"alphas_mods": true,
"gradient_up_down": true,
"gradient_left_right": true,
"breathing": true,
"band_sat": true,
"band_val": true,
"band_pinwheel_sat": true,
"band_pinwheel_val": true,
"band_spiral_sat": true,
"band_spiral_val": true,
"cycle_all": true,
"cycle_left_right": true,
"cycle_up_down": true,
"rainbow_moving_chevron":true,
"cycle_out_in": true,
"cycle_out_in_dual": true,
"cycle_pinwheel": true,
"cycle_spiral": true,
"rainbow_pinwheels": true,
"raindrops": true,
"jellybean_raindrops": true,
"hue_breathing": true,
"hue_pendulum": true,
"hue_wave": true,
"typing_heatmap": true,
"digital_rain": true,
"solid_reactive_simple": true,
"solid_reactive": true,
"solid_reactive_wide": true,
"solid_reactive_multiwide": true,
"solid_reactive_cross": true,
"solid_reactive_multicross": true,
"solid_reactive_nexus": true,
"solid_reactive_multinexus": true,
"splash": true,
"solid_splash": true,
"solid_multisplash": true,
"pixel_rain": true,
"pixel_fractal": true
}
},
"layouts": {
"LAYOUT": {
"layout": [
{"y": 0, "x": 0, "matrix": [8, 5], "label": "8,5"},
{"y": 0, "x": 7, "matrix": [9, 5], "label": "9,5"},
{"y": 0, "x": 8, "matrix": [8, 6], "label": "8,6"},
{"y": 0, "x": 9, "matrix": [9, 6], "label": "9,6"},
{"y": 0, "x": 10, "matrix": [8, 7], "label": "8,7"},
{"y": 2, "x": 0, "matrix": [0, 0], "label": "0,0"},
{"y": 2, "x": 1, "matrix": [1, 0], "label": "1,0"},
{"y": 2, "x": 2, "matrix": [0, 1], "label": "0,1"},
{"y": 2, "x": 3, "matrix": [1, 1], "label": "1,1"},
{"y": 2, "x": 4, "matrix": [0, 2], "label": "0,2"},
{"y": 2, "x": 5, "matrix": [1, 2], "label": "1,2"},
{"y": 2, "x": 6, "matrix": [0, 3], "label": "0,3"},
{"y": 2, "x": 7, "matrix": [1, 3], "label": "1,3"},
{"y": 2, "x": 8, "matrix": [0, 4], "label": "0,4"},
{"y": 2, "x": 9, "matrix": [1, 4], "label": "1,4"},
{"y": 2, "x": 10, "matrix": [7, 4], "label": "7,4"},
{"y": 3, "x": 0, "matrix": [2, 0], "w": 1.25, "label": "2,0"},
{"y": 3, "x": 1.25, "matrix": [3, 0], "label": "3,0"},
{"y": 3, "x": 2.25, "matrix": [2, 1], "label": "2,1"},
{"y": 3, "x": 3.25, "matrix": [3, 1], "label": "3,1"},
{"y": 3, "x": 4.25, "matrix": [2, 2], "label": "2,2"},
{"y": 3, "x": 5.25, "matrix": [3, 2], "label": "3,2"},
{"y": 3, "x": 6.25, "matrix": [2, 3], "label": "2,3"},
{"y": 3, "x": 7.25, "matrix": [3, 3], "label": "3,3"},
{"y": 3, "x": 8.25, "matrix": [2, 4], "label": "2,4"},
{"y": 3, "x": 9.25, "matrix": [3, 4], "w": 1.75, "label": "3,4"},
{"y": 4, "x": 0, "matrix": [4, 0], "w": 1.75, "label": "4,0"},
{"y": 4, "x": 1.75, "matrix": [5, 0], "label": "5,0"},
{"y": 4, "x": 2.75, "matrix": [4, 1], "label": "4,1"},
{"y": 4, "x": 3.75, "matrix": [5, 1], "label": "5,1"},
{"y": 4, "x": 4.75, "matrix": [4, 2], "label": "4,2"},
{"y": 4, "x": 5.75, "matrix": [5, 2], "label": "5,2"},
{"y": 4, "x": 6.75, "matrix": [4, 3], "label": "4,3"},
{"y": 4, "x": 7.75, "matrix": [5, 3], "label": "5,3"},
{"y": 4, "x": 8.75, "matrix": [4, 4], "w": 1.25, "label": "4,4"},
{"y": 4, "x": 10, "matrix": [5, 4], "label": "5,4"},
{"y": 5, "x": 0, "matrix": [6, 0], "w": 1.5, "label": "6,0"},
{"y": 5, "x": 1.5, "matrix": [7, 0], "label": "7,0"},
{"y": 5, "x": 2.5, "matrix": [6, 1], "w": 1.25, "label": "6,1"},
{"y": 5, "x": 3.75, "matrix": [7, 1], "w": 1.75, "label": "7,1"},
{"y": 5, "x": 5.5, "matrix": [7, 2], "w": 1.75, "label": "7,2"},
{"y": 5, "x": 7.25, "matrix": [6, 3], "w": 1.25, "label": "6,3"},
{"y": 5, "x": 8.5, "matrix": [7, 3], "label": "7,3"},
{"y": 5, "x": 9.5, "matrix": [6, 4], "w": 1.5, "label": "6,4"}
]
}
},
"features": {
"bootmagic": true,
"command": false,
"console": false,
"extrakey": true,
"mousekey": true,
"nkro": false,
"audio": false,
"backlight": false,
"rgblight": false,
"encoder": true,
"rgb_matrix": true,
"haptic": true,
"oled": true,
"wpm": true
},
"build": {
"lto": true
},
"haptic": {
"driver": "solenoid"
},
"encoder": {
"enabled": true,
"rotary": [
{ "pin_a": "GP22", "pin_b": "GP23", "resolution": 2 },
{ "pin_a": "GP26", "pin_b": "GP27", "resolution": 2 },
{ "pin_a": "GP0", "pin_b": "GP1", "resolution": 2 },
{ "pin_a": "GP5", "pin_b": "GP6", "resolution": 2 }
]
},
"diode_direction": "COL2ROW",
"matrix_pins": {
"cols": ["GP28", "GP21", "GP20", "GP3", "GP2", "GP12", "GP13", "GP14"],
"rows": ["GP25", "GP24", "GP16", "GP7", "GP17", "GP18", "GP19", "GP4", "GP8", "GP9"]
}
}

View File

@ -0,0 +1,149 @@
{
"keyboard_name": "Syndrome",
"manufacturer": "Nachie",
"usb": {
"vid": "0x4B43",
"pid": "0x5359",
"device_version": "1.0.0"
},
"board": "GENERIC_RP_RP2040",
"bootloader": "rp2040",
"processor": "RP2040",
"url": "https://littlecraftery.com/products/syndrome",
"maintainer": "nachie",
"ws2812": {
"pin": "GP29",
"driver": "vendor"
},
"rgb_matrix": {
"driver": "ws2812",
"led_count": 16,
"animations": {
"alphas_mods": true,
"gradient_up_down": true,
"gradient_left_right": true,
"breathing": true,
"band_sat": true,
"band_val": true,
"band_pinwheel_sat": true,
"band_pinwheel_val": true,
"band_spiral_sat": true,
"band_spiral_val": true,
"cycle_all": true,
"cycle_left_right": true,
"cycle_up_down": true,
"rainbow_moving_chevron":true,
"cycle_out_in": true,
"cycle_out_in_dual": true,
"cycle_pinwheel": true,
"cycle_spiral": true,
"rainbow_pinwheels": true,
"raindrops": true,
"jellybean_raindrops": true,
"hue_breathing": true,
"hue_pendulum": true,
"hue_wave": true,
"typing_heatmap": true,
"digital_rain": true,
"solid_reactive_simple": true,
"solid_reactive": true,
"solid_reactive_wide": true,
"solid_reactive_multiwide": true,
"solid_reactive_cross": true,
"solid_reactive_multicross": true,
"solid_reactive_nexus": true,
"solid_reactive_multinexus": true,
"splash": true,
"solid_splash": true,
"solid_multisplash": true,
"pixel_rain": true,
"pixel_fractal": true
}
},
"layouts": {
"LAYOUT": {
"layout": [
{"y": 0, "x": 0, "matrix": [8, 5], "label": "8,5"},
{"y": 0, "x": 7, "matrix": [9, 5], "label": "9,5"},
{"y": 0, "x": 8, "matrix": [8, 6], "label": "8,6"},
{"y": 0, "x": 9, "matrix": [9, 6], "label": "9,6"},
{"y": 0, "x": 10, "matrix": [8, 7], "label": "8,7"},
{"y": 2, "x": 0, "matrix": [0, 0], "label": "0,0"},
{"y": 2, "x": 1, "matrix": [1, 0], "label": "1,0"},
{"y": 2, "x": 2, "matrix": [0, 1], "label": "0,1"},
{"y": 2, "x": 3, "matrix": [1, 1], "label": "1,1"},
{"y": 2, "x": 4, "matrix": [0, 2], "label": "0,2"},
{"y": 2, "x": 5, "matrix": [1, 2], "label": "1,2"},
{"y": 2, "x": 6, "matrix": [0, 3], "label": "0,3"},
{"y": 2, "x": 7, "matrix": [1, 3], "label": "1,3"},
{"y": 2, "x": 8, "matrix": [0, 4], "label": "0,4"},
{"y": 2, "x": 9, "matrix": [1, 4], "label": "1,4"},
{"y": 2, "x": 10, "matrix": [7, 4], "label": "7,4"},
{"y": 3, "x": 0, "matrix": [2, 0], "w": 1.25, "label": "2,0"},
{"y": 3, "x": 1.25, "matrix": [3, 0], "label": "3,0"},
{"y": 3, "x": 2.25, "matrix": [2, 1], "label": "2,1"},
{"y": 3, "x": 3.25, "matrix": [3, 1], "label": "3,1"},
{"y": 3, "x": 4.25, "matrix": [2, 2], "label": "2,2"},
{"y": 3, "x": 5.25, "matrix": [3, 2], "label": "3,2"},
{"y": 3, "x": 6.25, "matrix": [2, 3], "label": "2,3"},
{"y": 3, "x": 7.25, "matrix": [3, 3], "label": "3,3"},
{"y": 3, "x": 8.25, "matrix": [2, 4], "label": "2,4"},
{"y": 3, "x": 9.25, "matrix": [3, 4], "w": 1.75, "label": "3,4"},
{"y": 4, "x": 0, "matrix": [4, 0], "w": 1.75, "label": "4,0"},
{"y": 4, "x": 1.75, "matrix": [5, 0], "label": "5,0"},
{"y": 4, "x": 2.75, "matrix": [4, 1], "label": "4,1"},
{"y": 4, "x": 3.75, "matrix": [5, 1], "label": "5,1"},
{"y": 4, "x": 4.75, "matrix": [4, 2], "label": "4,2"},
{"y": 4, "x": 5.75, "matrix": [5, 2], "label": "5,2"},
{"y": 4, "x": 6.75, "matrix": [4, 3], "label": "4,3"},
{"y": 4, "x": 7.75, "matrix": [5, 3], "label": "5,3"},
{"y": 4, "x": 8.75, "matrix": [4, 4], "w": 1.25, "label": "4,4"},
{"y": 4, "x": 10, "matrix": [5, 4], "label": "5,4"},
{"y": 5, "x": 0, "matrix": [6, 0], "w": 1.5, "label": "6,0"},
{"y": 5, "x": 1.5, "matrix": [7, 0], "label": "7,0"},
{"y": 5, "x": 2.5, "matrix": [6, 1], "w": 1.25, "label": "6,1"},
{"y": 5, "x": 3.75, "matrix": [7, 1], "w": 1.75, "label": "7,1"},
{"y": 5, "x": 5.5, "matrix": [7, 2], "w": 1.75, "label": "7,2"},
{"y": 5, "x": 7.25, "matrix": [6, 3], "w": 1.25, "label": "6,3"},
{"y": 5, "x": 8.5, "matrix": [7, 3], "label": "7,3"},
{"y": 5, "x": 9.5, "matrix": [6, 4], "w": 1.5, "label": "6,4"}
]
}
},
"features": {
"bootmagic": true,
"command": false,
"console": false,
"extrakey": true,
"mousekey": true,
"nkro": false,
"audio": false,
"backlight": false,
"rgblight": false,
"encoder": true,
"rgb_matrix": true,
"haptic": true,
"oled": true,
"wpm": true
},
"build": {
"lto": true
},
"haptic": {
"driver": "solenoid"
},
"encoder": {
"enabled": true,
"rotary": [
{ "pin_a": "GP22", "pin_b": "GP23", "resolution": 2 },
{ "pin_a": "GP26", "pin_b": "GP27", "resolution": 2 },
{ "pin_a": "GP0", "pin_b": "GP1", "resolution": 2 },
{ "pin_a": "GP5", "pin_b": "GP6", "resolution": 2 }
]
},
"diode_direction": "COL2ROW",
"matrix_pins": {
"cols": ["GP28", "GP21", "GP20", "GP3", "GP2", "GP12", "GP13", "GP14"],
"rows": ["GP25", "GP24", "GP16", "GP7", "GP17", "GP18", "GP19", "GP4", "GP8", "GP9"]
}
}

View File

@ -0,0 +1,28 @@
/*
Copyright 2024 Nachie
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] = {
/* QWERTY */
LAYOUT(
KC_ESC, KC_1, KC_2, KC_3, KC_4,
KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC,
KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_ENT,
KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_DOT, KC_LSFT, MO(1),
KC_LGUI, KC_LGUI, KC_LALT, KC_SPC, KC_BSPC, KC_RGUI, KC_RALT, MO(1))
};

View File

@ -0,0 +1 @@
The default keymap for the Syndrome.

View File

@ -0,0 +1,11 @@
/* SPDX-License-Identifier: GPL-2.0-or-later */
#pragma once
#define VIAL_KEYBOARD_UID {0xBE, 0x9A, 0x53, 0x6B, 0x85, 0xE5, 0xE2, 0xFE}
#define VIAL_UNLOCK_COMBO_ROWS { 0, 3 }
#define VIAL_UNLOCK_COMBO_COLS { 0, 4 }
#define RGB_MATRIX_FRAMEBUFFER_EFFECTS
#define RGB_MATRIX_KEYPRESSES

View File

@ -0,0 +1,492 @@
/*
Copyright 2024 Nachie
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
#include <stdio.h>
#include "os_detection.h"
#ifdef OLED_ENABLE
void render_key_status_or_logo(void);
void render_current_layer(void);
void render_current_wpm(void);
#endif
os_variant_t current_platform;
bool is_alt_tab_active = false;
uint16_t alt_tab_timer = 0;
enum layer_names {
_BASE, // Default Layer
_FN, // Fn Layer 1
_FN2, // Fn Layer 2
_FN3 // Fn Layer 3
};
enum custom_keycode {
JWRDL = QK_KB_0,
JWRDR,
SWRDL,
SWRDR,
TABL,
TABR,
DSKTPL,
DSKTPR,
PRVAPP,
NXTAPP
};
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
switch (keycode) {
case KC_HOME:
if (record->event.pressed && current_platform == OS_MACOS) {
register_mods(MOD_LGUI);
tap_code(KC_LEFT);
unregister_mods(MOD_LGUI);
} else {
tap_code(KC_HOME);
}
break;
case KC_END:
if (record->event.pressed && current_platform == OS_MACOS) {
register_mods(MOD_LGUI);
tap_code(KC_RIGHT);
unregister_mods(MOD_LGUI);
} else {
tap_code(KC_END);
}
break;
case KC_PGUP:
if (record->event.pressed && current_platform == OS_MACOS) {
register_mods(MOD_LGUI);
tap_code(KC_UP);
unregister_mods(MOD_LGUI);
} else {
tap_code(KC_PGUP);
}
break;
case KC_PGDN:
if (record->event.pressed && current_platform == OS_MACOS) {
register_mods(MOD_LGUI);
tap_code(KC_DOWN);
unregister_mods(MOD_LGUI);
} else {
tap_code(KC_PGDN);
}
break;
case KC_NUM_LOCK:
if (record->event.pressed && current_platform == OS_MACOS) {
register_mods(MOD_LSFT);
tap_code(KC_CLEAR);
unregister_mods(MOD_LSFT);
} else {
tap_code(KC_NUM_LOCK);
}
break;
case KC_SCROLL_LOCK:
if (record->event.pressed && current_platform == OS_MACOS) {
register_mods(MOD_LCTL);
tap_code(KC_F14);
unregister_mods(MOD_LCTL);
} else {
tap_code(KC_SCROLL_LOCK);
}
break;
case KC_PRINT_SCREEN:
if (record->event.pressed && current_platform == OS_MACOS) {
register_mods(MOD_LSFT);
register_mods(MOD_LGUI);
tap_code(KC_5);
unregister_mods(MOD_LGUI);
unregister_mods(MOD_LSFT);
} else {
tap_code(KC_PRINT_SCREEN);
}
break;
case JWRDL:
if (record->event.pressed) {
(current_platform == OS_MACOS) ? register_mods(MOD_LALT) : register_mods(MOD_LCTL);
tap_code(KC_LEFT);
(current_platform == OS_MACOS) ? unregister_mods(MOD_LALT) : unregister_mods(MOD_LCTL);
} else {
}
break;
case JWRDR:
if (record->event.pressed) {
(current_platform == OS_MACOS) ? register_mods(MOD_LALT) : register_mods(MOD_LCTL);
tap_code(KC_RIGHT);
(current_platform == OS_MACOS) ? unregister_mods(MOD_LALT) : unregister_mods(MOD_LCTL);
} else {
}
break;
case SWRDL:
if (record->event.pressed) {
register_mods(MOD_LSFT);
(current_platform == OS_MACOS) ? register_mods(MOD_LALT) : register_mods(MOD_LCTL);
tap_code(KC_LEFT);
(current_platform == OS_MACOS) ? unregister_mods(MOD_LALT) : unregister_mods(MOD_LCTL);
unregister_mods(MOD_LSFT);
} else {
}
break;
case SWRDR:
if (record->event.pressed) {
register_mods(MOD_LSFT);
(current_platform == OS_MACOS) ? register_mods(MOD_LALT) : register_mods(MOD_LCTL);
tap_code(KC_RIGHT);
(current_platform == OS_MACOS) ? unregister_mods(MOD_LALT) : unregister_mods(MOD_LCTL);
unregister_mods(MOD_LSFT);
} else {
}
break;
case TABL:
if (record->event.pressed) {
register_mods(MOD_LCTL);
register_mods(MOD_LSFT);
tap_code(KC_TAB);
unregister_mods(MOD_LSFT);
unregister_mods(MOD_LCTL);
} else {
}
break;
case TABR:
if (record->event.pressed) {
register_mods(MOD_LCTL);
tap_code(KC_TAB);
unregister_mods(MOD_LCTL);
} else {
}
break;
case DSKTPL:
if (record->event.pressed) {
register_mods(MOD_LCTL);
register_mods(MOD_LGUI);
(current_platform == OS_LINUX) ? tap_code(KC_UP) : tap_code(KC_LEFT);
unregister_mods(MOD_LGUI);
unregister_mods(MOD_LCTL);
} else {
}
break;
case DSKTPR:
if (record->event.pressed) {
register_mods(MOD_LCTL);
register_mods(MOD_LGUI);
(current_platform == OS_LINUX) ? tap_code(KC_DOWN) : tap_code(KC_RGHT);
unregister_mods(MOD_LGUI);
unregister_mods(MOD_LCTL);
} else {
}
break;
case PRVAPP:
if (record->event.pressed) {
register_code(KC_LSFT);
if (!is_alt_tab_active) {
is_alt_tab_active = true;
(current_platform == OS_MACOS) ? register_code(KC_LGUI) : register_code(KC_LALT);
}
alt_tab_timer = timer_read();
register_code(KC_TAB);
} else {
unregister_code(KC_TAB);
unregister_code(KC_LSFT);
}
break;
case NXTAPP:
if (record->event.pressed) {
if (!is_alt_tab_active) {
is_alt_tab_active = true;
(current_platform == OS_MACOS) ? register_code(KC_LGUI) : register_code(KC_LALT);
}
alt_tab_timer = timer_read();
register_code(KC_TAB);
} else {
unregister_code(KC_TAB);
}
break;
}
return true;
};
#ifndef HAPTIC_ENABLE
#define HF_TOGG _______
#endif
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* QWERTY */
[_BASE] = LAYOUT(
KC_ESC, KC_1, KC_2, KC_3, KC_4,
KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC,
KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_ENT,
KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_DOT, KC_LSFT, MO(1),
KC_LGUI, KC_LGUI, KC_LALT, KC_SPC, KC_SPC, KC_BSPC, KC_RGUI, MO(2)),
/* FUNCTION */
[_FN] = LAYOUT(
KC_ESC, KC_1, KC_2, KC_3, KC_4,
KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC,
KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_ENT,
KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_DOT, KC_LSFT, MO(1),
KC_LGUI, KC_LGUI, KC_LALT, KC_SPC, KC_SPC, KC_BSPC, KC_RGUI, MO(1)),
[_FN2] = LAYOUT(
KC_ESC, QK_BOOTLOADER, QK_REBOOT, QK_DEBUG_TOGGLE, QK_CLEAR_EEPROM,
HF_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______),
[_FN3] = LAYOUT(
KC_ESC, KC_1, KC_2, KC_3, KC_4,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______)
};
void matrix_scan_user(void) { // The very important timer.
if (is_alt_tab_active) {
if (timer_elapsed(alt_tab_timer) > 1000) {
(current_platform == OS_MACOS) ? unregister_code(KC_LGUI) : unregister_code(KC_LALT);
is_alt_tab_active = false;
}
}
}
#if defined(ENCODER_MAP_ENABLE)
const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][2] = {
[_BASE] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU), ENCODER_CCW_CW(RGB_RMOD, RGB_MOD), ENCODER_CCW_CW(KC_VOLD, KC_VOLU) },
[_FN] = { ENCODER_CCW_CW(RGB_RMOD, RGB_MOD), ENCODER_CCW_CW(RGB_RMOD, RGB_MOD), ENCODER_CCW_CW(RGB_RMOD, RGB_MOD) },
[_FN2] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU), ENCODER_CCW_CW(RGB_RMOD, RGB_MOD), ENCODER_CCW_CW(KC_VOLD, KC_VOLU) },
[_FN3] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU), ENCODER_CCW_CW(RGB_RMOD, RGB_MOD), ENCODER_CCW_CW(KC_VOLD, KC_VOLU) },
};
#endif
#ifdef OLED_ENABLE
#ifdef DYNAMIC_MACRO_ENABLE
bool macro1;
bool macro1rec;
bool macro2;
bool macro2rec;
bool prevEnabled;
uint8_t prevRGBmode;
void render_dynamic_macro_status(int col, int line){
oled_set_cursor(col,line);
macro1rec ? oled_write(PSTR("DM1"), macro1) : oled_write(PSTR(" "),false);
oled_set_cursor(col,line+1);
macro2rec ? oled_write(PSTR("DM2"), macro2) : oled_write(PSTR(" "),false);
}
//direction indicates which macro it is, with 1 being Macro 1, -1 being Macro 2, and 0 being no macro.
void dynamic_macro_record_start_user(int8_t direction){
prevEnabled = rgb_matrix_is_enabled();
if (!prevEnabled) { rgb_matrix_enable(); }
prevRGBmode = rgb_matrix_get_mode();
rgb_matrix_mode(RGB_MATRIX_BREATHING);
switch(direction){
case 1:
macro1 = false;
macro1rec = true;
break;
case -1:
macro2 = false;
macro2rec = true;
break;
default:
macro1 = false;
macro2 = false;
macro1rec = false;
macro2rec = false;
break;
}
}
void dynamic_macro_record_end_user(int8_t direction){
prevEnabled ? rgb_matrix_mode(prevRGBmode) : rgb_matrix_disable();
switch(direction){
case 1:
macro1 = true;
break;
case -1:
macro2 = true;
break;
default:
macro1 = false;
macro2 = false;
break;
}
}
#endif
bool clear_screen = false;
bool rerender_platform = false;
static void render_logo(void) {
static const char PROGMEM logo[] = {
0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, 0x90, 0x91, 0x92, 0x93, 0x94,
0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, 0xB0, 0xB1, 0xB2, 0xB3, 0xB4,
0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0x00
};
oled_write(logo, false);
}
void render_keylock_status(led_t led_state) {
bool caps_state = (led_state.caps_lock || is_caps_word_on());
oled_write(PSTR("CAPS"), caps_state);
oled_write(PSTR(" "), false);
oled_write(PSTR("NUM"), led_state.num_lock);
oled_write(PSTR(" "), false);
oled_write(PSTR("SCRL"), led_state.scroll_lock);
//oled_write_ln_P(PSTR(" "), false);
}
void render_mod_status(uint8_t modifiers) {
oled_write(PSTR("SH"), (modifiers & MOD_MASK_SHIFT));
oled_write(PSTR(" "), false);
(current_platform == OS_MACOS || current_platform == OS_IOS) ? oled_write(PSTR("CMD"), (modifiers & MOD_MASK_GUI)) : oled_write(PSTR("CT"), (modifiers & MOD_MASK_CTRL));
oled_write(PSTR(" "), false);
(current_platform == OS_MACOS || current_platform == OS_IOS) ? oled_write(PSTR("OPT"), (modifiers & MOD_MASK_ALT)) : oled_write(PSTR("ALT"), (modifiers & MOD_MASK_ALT));
oled_write(PSTR(" "), false);
(current_platform == OS_MACOS || current_platform == OS_IOS) ? oled_write(PSTR("CT"), (modifiers & MOD_MASK_CTRL)) : oled_write(PSTR("GUI"), (modifiers & MOD_MASK_GUI));
}
void render_key_status_or_logo(){
led_t led_state = host_keyboard_led_state();
uint8_t mod_state = (get_mods()|get_oneshot_mods());
if ( !led_state.num_lock && !led_state.caps_lock && !led_state.scroll_lock
&& !(mod_state & MOD_MASK_SHIFT) && !(mod_state & MOD_MASK_ALT) && !(mod_state & MOD_MASK_CTRL) && !(mod_state & MOD_MASK_GUI)) {
if(!clear_screen) {
render_logo();
rerender_platform = true;
}
clear_screen = true;
} else {
if (clear_screen == true) {
oled_clear();
oled_render();
clear_screen = false;
}
oled_set_cursor(8,0);
render_keylock_status(led_state);
oled_set_cursor(8,1);
render_mod_status(mod_state);
rerender_platform = true;
}
}
void render_current_layer(){
switch (get_highest_layer(layer_state)) {
case 0:
oled_write(PSTR("Layer 0"), false);
break;
case 1:
oled_write(PSTR("Layer 1"), false);
break;
case 2:
oled_write(PSTR("Layer 2"), false);
break;
case 3:
oled_write(PSTR("Layer 3"), false);
break;
default:
oled_write(PSTR("Layer ?"), false); // Should never display, here as a catchall
}
}
void render_current_wpm(){
oled_write_P(PSTR("WPM: "), false);
oled_write(get_u8_str(get_current_wpm(), '0'), false);
}
void render_platform_status(int col, int line) {
/* Show Ctrl-Gui Swap options */
static const char PROGMEM logo[][5][3] = {
{{0x9B, 0x9C, 0}, {0xbb, 0xbc, 0}}, //Android
{{0x99, 0x9A, 0}, {0xb9, 0xba, 0}}, //Linux
{{0x97, 0x98, 0}, {0xb7, 0xb8, 0}}, //Windows
{{0x95, 0x96, 0}, {0xb5, 0xb6, 0}}, //Mac/iOS
{{0x9D, 0x9E, 0}, {0xbd, 0xbe, 0}}, //Empty Placeholder
};
current_platform = detected_host_os();
switch (current_platform) {
/*case OS_ANDROID: //Android
oled_set_cursor(col,line);
oled_write(logo[0][0], false);
oled_set_cursor(col,line+1);
oled_write(logo[0][1], false);
break;*/
case OS_LINUX: //Linux
oled_set_cursor(col,line);
oled_write(logo[1][0], false);
oled_set_cursor(col,line+1);
oled_write(logo[1][1], false);
keymap_config.swap_lctl_lgui = false;
keymap_config.swap_rctl_rgui = false;
break;
case OS_WINDOWS: //Windows
oled_set_cursor(col,line);
oled_write(logo[2][0], false);
oled_set_cursor(col,line+1);
oled_write(logo[2][1], false);
keymap_config.swap_lctl_lgui = false;
keymap_config.swap_rctl_rgui = false;
break;
case OS_MACOS: //Mac
oled_set_cursor(col,line);
oled_write(logo[3][0], false);
oled_set_cursor(col,line+1);
oled_write(logo[3][1], false);
keymap_config.swap_lctl_lgui = true;
keymap_config.swap_rctl_rgui = true;
break;
case OS_IOS: //iOS
oled_set_cursor(col,line);
oled_write(logo[3][0], false);
oled_set_cursor(col,line+1);
oled_write(logo[3][1], false);
keymap_config.swap_lctl_lgui = true;
keymap_config.swap_rctl_rgui = true;
break;
default: //OS_UNSURE or not configured
oled_set_cursor(col,line);
oled_write(logo[4][0], false);
oled_set_cursor(col,line+1);
oled_write(logo[4][1], false);
break;
}
rerender_platform = false;
}
bool oled_task_user(void) {
render_key_status_or_logo();
oled_set_cursor(8,2);
render_current_layer();
#ifdef DYNAMIC_MACRO_ENABLE
render_dynamic_macro_status(18,2);
#endif
oled_set_cursor(8,3);
render_current_wpm();
#ifdef OS_DETECTION_ENABLE
if(current_platform != detected_host_os() || rerender_platform) { render_platform_status(3,0); }
#endif
return false;
}
#endif

View File

@ -0,0 +1 @@
The vial keymap for the Syndrome PCB.

View File

@ -0,0 +1,10 @@
VIA_ENABLE = yes
VIAL_ENABLE = yes
VIALRGB_ENABLE = yes
ENCODER_MAP_ENABLE = yes
BOOTMAGIC_ENABLE = yes
MAGIC_ENABLE = yes
OS_DETECTION_ENABLE = yes
DYNAMIC_MACRO_ENABLE = yes
CAPS_WORD_ENABLE = yes

View File

@ -0,0 +1,397 @@
{
"name": "Syndrome",
"vendorId": "0x4B43",
"productId": "0x5359",
"customKeycodes": [
{
"name": "JmpWordL",
"title": "Jump Word Left",
"shortName": "JWRDL"
},
{
"name": "JmpWordR",
"title": "Jump Word Right",
"shortName": "JWRDR"
},
{
"name": "SlcWordL",
"title": "Select Word Left",
"shortName": "SWRDL"
},
{
"name": "SlcWordR",
"title": "Select Word Right",
"shortName": "SWRDR"
},
{
"name": "TabLft",
"title": "Tab Left",
"shortName": "TABL"
},
{
"name": "TabRght",
"title": "Tab Right",
"shortName": "TABR"
},
{
"name": "DsktpLft",
"title": "Desktop Left",
"shortName": "DSKTPL"
},
{
"name": "DsktpRght",
"title": "Desktop Right",
"shortName": "DSKTPR"
},
{
"name": "PrevApp",
"title": "Previous App",
"shortName": "PRVAPP"
},
{
"name": "NextApp",
"title": "Next App",
"shortName": "NXTAPP"
}
],
"matrix": { "rows": 10, "cols": 8 },
"lighting": "vialrgb",
"layouts": {
"labels":[
[
"Right Shift",
"Split Shift Fn",
"Split Fn Shift",
"No Split"
],
[
"Bottom Row",
"3U Centered",
"6U Big Bar",
"3U/3U",
"2U/2U",
"1.75U/1.75U",
"7U Big Bar",
"3U/1U/3U",
"2.75U ALPS",
"3U/ENC/3U"
],
"Macro Row"
],
"keymap": [
[
{
"y": 2.5,
"x": 1.5
},
"3,0\n\n\n\n\n\n\n\n\ne",
"3,1\n\n\n\n\n\n\n\n\ne"
],
[
{
"x": 2
},
"8,5\n\n\n2,0",
{
"x": 6
},
"9,5\n\n\n2,0",
"8,6\n\n\n2,0",
"9,6\n\n\n2,0",
"8,7\n\n\n2,0"
],
[
{
"y": 0.5,
"x": 1
},
"0,0\n\n\n\n\n\n\n\n\ne",
{
"x": 11
},
"1,0\n\n\n\n\n\n\n\n\ne"
],
[
{
"y": -0.5,
"x": 2
},
"0,0",
"1,0",
"0,1",
"1,1",
"0,2",
"1,2",
"0,3",
"1,3",
"0,4",
"1,4",
"7,4"
],
[
{
"y": -0.5,
"x": 1
},
"0,1\n\n\n\n\n\n\n\n\ne",
{
"x": 11
},
"1,1\n\n\n\n\n\n\n\n\ne"
],
[
{
"y": -0.5,
"x": 2,
"c": "#aaaaaa",
"w": 1.25
},
"2,0",
{
"c": "#cccccc"
},
"3,0",
"2,1",
"3,1",
"2,2",
"3,2",
"2,3",
"3,3",
"2,4",
{
"c": "#777777",
"w": 1.75
},
"3,4"
],
[
{
"x": 2,
"c": "#aaaaaa",
"w": 1.75
},
"4,0",
{
"c": "#cccccc"
},
"5,0",
"4,1",
"5,1",
"4,2",
"5,2",
"4,3",
"5,3",
{
"c": "#aaaaaa",
"w": 1.25
},
"4,4\n\n\n0,0",
{
"c": "#cccccc"
},
"5,4\n\n\n0,0",
{
"x": 0.25
},
"4,4\n\n\n0,1",
{
"c": "#aaaaaa",
"w": 1.25
},
"5,4\n\n\n0,1",
{
"x": 0.25,
"w": 2.25
},
"4,4\n\n\n0,2"
],
[
{
"x": 2,
"w": 1.5
},
"6,0\n\n\n1,0",
"7,0\n\n\n1,0",
{
"w": 1.5
},
"6,1\n\n\n1,0",
{
"w": 3
},
"7,2\n\n\n1,0",
{
"w": 1.5
},
"6,3\n\n\n1,0",
"7,3\n\n\n1,0",
{
"w": 1.5
},
"6,4\n\n\n1,0"
],
[
{
"x": 6.5,
"c": "#cccccc"
},
"2,0\n\n\n\n\n\n\n\n\ne",
"2,1\n\n\n\n\n\n\n\n\ne"
],
[
{
"y": 0.25,
"x": 2,
"c": "#aaaaaa",
"w": 1.5
},
"6,0\n\n\n1,1",
"7,0\n\n\n1,1",
{
"w": 6
},
"7,2\n\n\n1,1",
"7,3\n\n\n1,1",
{
"w": 1.5
},
"6,4\n\n\n1,1"
],
[
{
"x": 2,
"w": 1.5
},
"6,0\n\n\n1,2",
"7,0\n\n\n1,2",
{
"w": 3
},
"7,1\n\n\n1,2",
{
"w": 3
},
"7,2\n\n\n1,2",
"7,3\n\n\n1,2",
{
"w": 1.5
},
"6,4\n\n\n1,2"
],
[
{
"x": 2,
"w": 1.5
},
"6,0\n\n\n1,3",
"7,0\n\n\n1,3",
"6,1\n\n\n1,3",
{
"w": 2
},
"7,1\n\n\n1,3",
{
"w": 2
},
"7,2\n\n\n1,3",
"6,3\n\n\n1,3",
"7,3\n\n\n1,3",
{
"w": 1.5
},
"6,4\n\n\n1,3"
],
[
{
"x": 2,
"w": 1.5
},
"6,0\n\n\n1,4",
"7,0\n\n\n1,4",
{
"w": 1.25
},
"6,1\n\n\n1,4",
{
"w": 1.75
},
"7,1\n\n\n1,4",
{
"w": 1.75
},
"7,2\n\n\n1,4",
{
"w": 1.25
},
"6,3\n\n\n1,4",
"7,3\n\n\n1,4",
{
"w": 1.5
},
"6,4\n\n\n1,4"
],
[
{
"x": 2
},
"6,0\n\n\n1,5",
"7,0\n\n\n1,5",
{
"w": 7
},
"7,2\n\n\n1,5",
"7,3\n\n\n1,5",
"6,4\n\n\n1,5"
],
[
{
"x": 2
},
"6,0\n\n\n1,6",
"7,0\n\n\n1,6",
{
"w": 3
},
"6,1\n\n\n1,6",
"7,2\n\n\n1,6",
{
"w": 3
},
"6,3\n\n\n1,6",
"7,3\n\n\n1,6",
"6,4\n\n\n1,6"
],
[
{
"x": 2,
"w": 1.25
},
"6,0\n\n\n1,7",
{
"w": 1.5
},
"7,0\n\n\n1,7",
{
"w": 1.25
},
"6,1\n\n\n1,7",
{
"w": 2.75
},
"7,2\n\n\n1,7",
{
"w": 1.25
},
"6,3\n\n\n1,7",
{
"w": 1.5
},
"7,3\n\n\n1,7",
{
"w": 1.5
},
"6,4\n\n\n1,7"
]
]
}
}

View File

@ -0,0 +1,9 @@
#pragma once
#include_next <mcuconf.h>
#undef RP_I2C_USE_I2C0
#define RP_I2C_USE_I2C0 FALSE
#undef RP_I2C_USE_I2C1
#define RP_I2C_USE_I2C1 TRUE

View File

@ -0,0 +1,23 @@
# Syndrome
Firmware for the Syndrome (and Detour)
* Keyboard Maintainer: [Nachie](https://github.com/nachie)
* Hardware Supported: Syndrome
* Hardware Availability: [Little Craftery](https://littlecraftery.com/products/syndrome)
Make example for this keyboard (after setting up your build environment):
make nachie/syndrome:default
Or to make and flash:
make nachie/syndrome: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
* **Bootmagic reset**: Hold down ESC key (top left) and plug in the keyboard
* **Physical reset button**: Briefly press the button labeled "SW_RST1" on the back of the PCB

View File

@ -0,0 +1,4 @@
OLED_DRIVER = ssd1306
OPT_DEFS += -DHAL_USE_I2C=TRUE

View File

@ -0,0 +1,89 @@
/*
Copyright 2024 Nachie
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 "quantum.h"
led_config_t g_led_config = { {
{NO_LED, NO_LED, NO_LED, NO_LED, NO_LED, NO_LED, NO_LED, NO_LED},
{ 6, 5, 4, 3, 2, 1, 0, NO_LED },
{ 7, NO_LED, NO_LED, NO_LED, NO_LED, NO_LED, NO_LED, 15 },
{ 8 , 9, NO_LED, 10, 11, 12, 13, 14 },
{ NO_LED, NO_LED, NO_LED,NO_LED, NO_LED, NO_LED, NO_LED, NO_LED }
}, {
{ 183,0 }, { 162,0 }, { 142,0 }, { 122,0 }, { 81,0 }, { 61,0 }, { 40,0 },
{ 20,16 }, { 40,48 },
{ 61,48 }, { 81,48 }, { 101,48 }, { 122,48 }, { 162,48 }, { 203,48 }, { 244,16 }
}, {
1, 1, 1, 1, 1, 1, 1,
1, 1,
1, 1, 1, 1, 1, 1, 1
} };
#ifdef OLED_ENABLE
static void render_logo(void) {
static const char PROGMEM my_logo[] = {
// 'Screenshot 2023-07-21 at 1', 128x32px
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xfe, 0x00, 0x03, 0xc0, 0x00, 0xc0, 0x00, 0x3c, 0x00, 0x0f, 0x1f, 0xf8, 0xe0, 0x00, 0x1f, 0xff,
0xff, 0x80, 0x01, 0xc0, 0x00, 0x40, 0x00, 0x38, 0x00, 0x07, 0x1f, 0xf8, 0xe0, 0x00, 0x1f, 0xff,
0xff, 0xff, 0xf1, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0x1f, 0xf8, 0xff, 0xff, 0x0f, 0xff,
0xff, 0xff, 0xf1, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0x1f, 0xf8, 0xff, 0xff, 0x8f, 0xff,
0xff, 0xff, 0xf1, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0x1f, 0xf8, 0xff, 0xff, 0x0f, 0xff,
0xfe, 0x1f, 0xf1, 0xc0, 0x03, 0xff, 0x8f, 0xf8, 0xff, 0xc7, 0x1f, 0xf8, 0xe1, 0xc0, 0x1f, 0xff,
0xfe, 0x1f, 0xf1, 0xc0, 0x03, 0xff, 0x8f, 0xf8, 0xff, 0xc7, 0x1f, 0xf8, 0xe1, 0xe0, 0x3f, 0xff,
0xfe, 0x1f, 0xf1, 0xc3, 0xff, 0xff, 0x8f, 0xf8, 0xff, 0xc7, 0x1f, 0xf8, 0xe1, 0xf0, 0xff, 0xff,
0xfe, 0x1f, 0xf1, 0xc3, 0xff, 0xff, 0x8f, 0xf8, 0xff, 0xc7, 0x1f, 0xf8, 0xe1, 0xf8, 0x7f, 0xff,
0xfe, 0x1f, 0xf1, 0xc3, 0xff, 0xff, 0x8f, 0xf8, 0xff, 0xc7, 0x1f, 0xf8, 0xe1, 0xf8, 0x7f, 0xff,
0xfe, 0x00, 0x01, 0xc0, 0x00, 0x7f, 0x8f, 0xf8, 0x00, 0x07, 0x00, 0x00, 0xe1, 0xfc, 0x3f, 0xff,
0xfe, 0x00, 0x03, 0xc0, 0x00, 0xff, 0x8f, 0xfc, 0x00, 0x0f, 0x80, 0x01, 0xe1, 0xfe, 0x1f, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
};
oled_write_raw_P(my_logo, sizeof(my_logo));
}
bool oled_task_kb(void) {
// Defer to the keymap if they want to override
if(!oled_task_user()) {
return false;
}
// default keyboard drawing code
render_logo();
return false;
}
#endif

View File

@ -0,0 +1,11 @@
/*
* `qmk chibios-confmigrate -i firmware/nachie/syndrome/chconf.h -r ../keymaps_qmk/platforms/chibios/boards/GENERIC_PROMICRO_RP2040/configs/chconf.h`
*/
#pragma once
#include_next <chconf.h>
#undef CH_CFG_ST_TIMEDELTA
#define CH_CFG_ST_TIMEDELTA 100

View File

@ -0,0 +1,37 @@
/*
Copyright 2024 Nachie
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_FLASH_GENERIC_03H
#ifdef HAPTIC_ENABLE
#define SOLENOID_PIN GP15
#endif
/* Oled config */
#ifdef OLED_ENABLE
#define I2C_DRIVER I2CD1
#define I2C1_SDA_PIN GP10
#define I2C1_SCL_PIN GP11
#define OLED_TIMEOUT 60000 // Turns off the OLED screen after x ms of screen update inactivity. Helps reduce OLED Burn-in. Set to 0 to disable.
#define OLED_FADE_OUT
#define OLED_FADE_OUT_INTERVAL 13
#define OLED_BRIGHTNESS 50 // The default brightness level of the OLED, from 0 to 255.
#define OLED_UPDATE_INTERVAL 16 // limits in milliseconds how frequently the OLED updates. Calculation 1000/fps (increases keyboard responsiveness)
#endif
#define VIA_CUSTOM_LIGHTING_ENABLE

View File

@ -0,0 +1,4 @@
#pragma once
#include_next <halconf.h>
#define HAL_USE_I2C TRUE

View File

@ -0,0 +1,154 @@
{
"keyboard_name": "Syndrome Ortho",
"manufacturer": "Nachie",
"usb": {
"vid": "0x4B43",
"pid": "0x5360",
"device_version": "1.0.0"
},
"board": "GENERIC_RP_RP2040",
"bootloader": "rp2040",
"processor": "RP2040",
"url": "https://littlecraftery.com/products/syndrome-ortho",
"maintainer": "nachie",
"ws2812": {
"pin": "GP29",
"driver": "vendor"
},
"rgb_matrix": {
"driver": "ws2812",
"led_count": 16,
"animations": {
"alphas_mods": true,
"gradient_up_down": true,
"gradient_left_right": true,
"breathing": true,
"band_sat": true,
"band_val": true,
"band_pinwheel_sat": true,
"band_pinwheel_val": true,
"band_spiral_sat": true,
"band_spiral_val": true,
"cycle_all": true,
"cycle_left_right": true,
"cycle_up_down": true,
"rainbow_moving_chevron":true,
"cycle_out_in": true,
"cycle_out_in_dual": true,
"cycle_pinwheel": true,
"cycle_spiral": true,
"rainbow_pinwheels": true,
"raindrops": true,
"jellybean_raindrops": true,
"hue_breathing": true,
"hue_pendulum": true,
"hue_wave": true,
"typing_heatmap": true,
"digital_rain": true,
"solid_reactive_simple": true,
"solid_reactive": true,
"solid_reactive_wide": true,
"solid_reactive_multiwide": true,
"solid_reactive_cross": true,
"solid_reactive_multicross": true,
"solid_reactive_nexus": true,
"solid_reactive_multinexus": true,
"splash": true,
"solid_splash": true,
"solid_multisplash": true,
"pixel_rain": true,
"pixel_fractal": true
}
},
"layouts": {
"LAYOUT": {
"layout": [
{"y": 0, "x": 0, "matrix": [8, 5], "label": "8,5"},
{"y": 0, "x": 7, "matrix": [9, 5], "label": "9,5"},
{"y": 0, "x": 8, "matrix": [8, 6], "label": "8,6"},
{"y": 0, "x": 9, "matrix": [9, 6], "label": "9,6"},
{"y": 0, "x": 10, "matrix": [8, 7], "label": "8,7"},
{"y": 1.5, "x": 0, "matrix": [0, 0], "label": "0,0"},
{"y": 1.5, "x": 1, "matrix": [1, 0], "label": "1,0"},
{"y": 1.5, "x": 2, "matrix": [0, 1], "label": "0,1"},
{"y": 1.5, "x": 3, "matrix": [1, 1], "label": "1,1"},
{"y": 1.5, "x": 4, "matrix": [0, 2], "label": "0,2"},
{"y": 1.5, "x": 5, "matrix": [1, 2], "label": "1,2"},
{"y": 1.5, "x": 6, "matrix": [0, 3], "label": "0,3"},
{"y": 1.5, "x": 7, "matrix": [1, 3], "label": "1,3"},
{"y": 1.5, "x": 8, "matrix": [0, 4], "label": "0,4"},
{"y": 1.5, "x": 9, "matrix": [1, 4], "label": "1,4"},
{"y": 1.5, "x": 10, "matrix": [0, 5], "label": "0,5"},
{"y": 2.5, "x": 0, "matrix": [2, 0], "label": "2,0"},
{"y": 2.5, "x": 1, "matrix": [3, 0], "label": "3,0"},
{"y": 2.5, "x": 2, "matrix": [2, 1], "label": "2,1"},
{"y": 2.5, "x": 3, "matrix": [3, 1], "label": "3,1"},
{"y": 2.5, "x": 4, "matrix": [2, 2], "label": "2,2"},
{"y": 2.5, "x": 5, "matrix": [3, 2], "label": "3,2"},
{"y": 2.5, "x": 6, "matrix": [2, 3], "label": "2,3"},
{"y": 2.5, "x": 7, "matrix": [3, 3], "label": "3,3"},
{"y": 2.5, "x": 8, "matrix": [2, 4], "label": "2,4"},
{"y": 2.5, "x": 9, "matrix": [3, 4], "label": "3,4"},
{"y": 2.5, "x": 10, "matrix": [2, 5], "label": "2,5"},
{"y": 3.5, "x": 0, "matrix": [4, 0], "label": "4,0"},
{"y": 3.5, "x": 1, "matrix": [5, 0], "label": "5,0"},
{"y": 3.5, "x": 2, "matrix": [4, 1], "label": "4,1"},
{"y": 3.5, "x": 3, "matrix": [5, 1], "label": "5,1"},
{"y": 3.5, "x": 4, "matrix": [4, 2], "label": "4,2"},
{"y": 3.5, "x": 5, "matrix": [5, 2], "label": "5,2"},
{"y": 3.5, "x": 6, "matrix": [4, 3], "label": "4,3"},
{"y": 3.5, "x": 7, "matrix": [5, 3], "label": "5,3"},
{"y": 3.5, "x": 8, "matrix": [4, 4], "label": "4,4"},
{"y": 3.5, "x": 9, "matrix": [5, 4], "label": "5,4"},
{"y": 3.5, "x": 10, "matrix": [4, 5], "label": "4,5"},
{"y": 4.5, "x": 0, "matrix": [6, 0], "w": 1.5, "label": "6,0"},
{"y": 4.5, "x": 1.5, "matrix": [7, 0], "label": "7,0"},
{"y": 4.5, "x": 2.5, "matrix": [6, 1], "label": "6,1"},
{"y": 4.5, "x": 3.5, "matrix": [7, 1], "label": "7,1"},
{"y": 4.5, "x": 4.5, "matrix": [6, 2], "label": "6,2"},
{"y": 4.5, "x": 4.5, "matrix": [6, 3], "w": 2, "label": "6,3"},
{"y": 4.5, "x": 5.5, "matrix": [7, 2], "label": "7,2"},
{"y": 4.5, "x": 6.5, "matrix": [7, 3], "label": "7,3"},
{"y": 4.5, "x": 7.5, "matrix": [6, 4], "label": "6,4"},
{"y": 4.5, "x": 8.5, "matrix": [7, 4], "label": "7,4"},
{"y": 4.5, "x": 9.5, "matrix": [6, 5], "w": 1.5, "label": "6,5"}
]
}
},
"features": {
"bootmagic": true,
"command": false,
"console": false,
"extrakey": true,
"mousekey": true,
"nkro": false,
"audio": false,
"backlight": false,
"rgblight": false,
"encoder": true,
"rgb_matrix": true,
"haptic": true,
"oled": true,
"wpm": true
},
"build": {
"lto": true
},
"haptic": {
"driver": "solenoid"
},
"encoder": {
"enabled": true,
"rotary": [
{ "pin_a": "GP22", "pin_b": "GP23", "resolution": 2 },
{ "pin_a": "GP26", "pin_b": "GP24", "resolution": 2 },
{ "pin_a": "GP0", "pin_b": "GP1", "resolution": 2 },
{ "pin_a": "GP5", "pin_b": "GP3", "resolution": 2 }
]
},
"diode_direction": "COL2ROW",
"matrix_pins": {
"cols": ["GP28", "GP21", "GP20", "GP6", "GP2", "GP12", "GP13", "GP14"],
"rows": ["GP25", "GP27", "GP16", "GP7", "GP17", "GP18", "GP19", "GP4", "GP8", "GP9"]
}
}

View File

@ -0,0 +1,154 @@
{
"keyboard_name": "Syndrome Ortho",
"manufacturer": "Nachie",
"usb": {
"vid": "0x4B43",
"pid": "0x5360",
"device_version": "1.0.0"
},
"board": "GENERIC_RP_RP2040",
"bootloader": "rp2040",
"processor": "RP2040",
"url": "https://littlecraftery.com/products/syndrome-ortho",
"maintainer": "nachie",
"ws2812": {
"pin": "GP29",
"driver": "vendor"
},
"rgb_matrix": {
"driver": "ws2812",
"led_count": 16,
"animations": {
"alphas_mods": true,
"gradient_up_down": true,
"gradient_left_right": true,
"breathing": true,
"band_sat": true,
"band_val": true,
"band_pinwheel_sat": true,
"band_pinwheel_val": true,
"band_spiral_sat": true,
"band_spiral_val": true,
"cycle_all": true,
"cycle_left_right": true,
"cycle_up_down": true,
"rainbow_moving_chevron":true,
"cycle_out_in": true,
"cycle_out_in_dual": true,
"cycle_pinwheel": true,
"cycle_spiral": true,
"rainbow_pinwheels": true,
"raindrops": true,
"jellybean_raindrops": true,
"hue_breathing": true,
"hue_pendulum": true,
"hue_wave": true,
"typing_heatmap": true,
"digital_rain": true,
"solid_reactive_simple": true,
"solid_reactive": true,
"solid_reactive_wide": true,
"solid_reactive_multiwide": true,
"solid_reactive_cross": true,
"solid_reactive_multicross": true,
"solid_reactive_nexus": true,
"solid_reactive_multinexus": true,
"splash": true,
"solid_splash": true,
"solid_multisplash": true,
"pixel_rain": true,
"pixel_fractal": true
}
},
"layouts": {
"LAYOUT": {
"layout": [
{"y": 0, "x": 0, "matrix": [8, 5], "label": "8,5"},
{"y": 0, "x": 7, "matrix": [9, 5], "label": "9,5"},
{"y": 0, "x": 8, "matrix": [8, 6], "label": "8,6"},
{"y": 0, "x": 9, "matrix": [9, 6], "label": "9,6"},
{"y": 0, "x": 10, "matrix": [8, 7], "label": "8,7"},
{"y": 1.5, "x": 0, "matrix": [0, 0], "label": "0,0"},
{"y": 1.5, "x": 1, "matrix": [1, 0], "label": "1,0"},
{"y": 1.5, "x": 2, "matrix": [0, 1], "label": "0,1"},
{"y": 1.5, "x": 3, "matrix": [1, 1], "label": "1,1"},
{"y": 1.5, "x": 4, "matrix": [0, 2], "label": "0,2"},
{"y": 1.5, "x": 5, "matrix": [1, 2], "label": "1,2"},
{"y": 1.5, "x": 6, "matrix": [0, 3], "label": "0,3"},
{"y": 1.5, "x": 7, "matrix": [1, 3], "label": "1,3"},
{"y": 1.5, "x": 8, "matrix": [0, 4], "label": "0,4"},
{"y": 1.5, "x": 9, "matrix": [1, 4], "label": "1,4"},
{"y": 1.5, "x": 10, "matrix": [0, 5], "label": "0,5"},
{"y": 2.5, "x": 0, "matrix": [2, 0], "label": "2,0"},
{"y": 2.5, "x": 1, "matrix": [3, 0], "label": "3,0"},
{"y": 2.5, "x": 2, "matrix": [2, 1], "label": "2,1"},
{"y": 2.5, "x": 3, "matrix": [3, 1], "label": "3,1"},
{"y": 2.5, "x": 4, "matrix": [2, 2], "label": "2,2"},
{"y": 2.5, "x": 5, "matrix": [3, 2], "label": "3,2"},
{"y": 2.5, "x": 6, "matrix": [2, 3], "label": "2,3"},
{"y": 2.5, "x": 7, "matrix": [3, 3], "label": "3,3"},
{"y": 2.5, "x": 8, "matrix": [2, 4], "label": "2,4"},
{"y": 2.5, "x": 9, "matrix": [3, 4], "label": "3,4"},
{"y": 2.5, "x": 10, "matrix": [2, 5], "label": "2,5"},
{"y": 3.5, "x": 0, "matrix": [4, 0], "label": "4,0"},
{"y": 3.5, "x": 1, "matrix": [5, 0], "label": "5,0"},
{"y": 3.5, "x": 2, "matrix": [4, 1], "label": "4,1"},
{"y": 3.5, "x": 3, "matrix": [5, 1], "label": "5,1"},
{"y": 3.5, "x": 4, "matrix": [4, 2], "label": "4,2"},
{"y": 3.5, "x": 5, "matrix": [5, 2], "label": "5,2"},
{"y": 3.5, "x": 6, "matrix": [4, 3], "label": "4,3"},
{"y": 3.5, "x": 7, "matrix": [5, 3], "label": "5,3"},
{"y": 3.5, "x": 8, "matrix": [4, 4], "label": "4,4"},
{"y": 3.5, "x": 9, "matrix": [5, 4], "label": "5,4"},
{"y": 3.5, "x": 10, "matrix": [4, 5], "label": "4,5"},
{"y": 4.5, "x": 0, "matrix": [6, 0], "w": 1.5, "label": "6,0"},
{"y": 4.5, "x": 1.5, "matrix": [7, 0], "label": "7,0"},
{"y": 4.5, "x": 2.5, "matrix": [6, 1], "label": "6,1"},
{"y": 4.5, "x": 3.5, "matrix": [7, 1], "label": "7,1"},
{"y": 4.5, "x": 4.5, "matrix": [6, 2], "label": "6,2"},
{"y": 4.5, "x": 4.5, "matrix": [6, 3], "w": 2, "label": "6,3"},
{"y": 4.5, "x": 5.5, "matrix": [7, 2], "label": "7,2"},
{"y": 4.5, "x": 6.5, "matrix": [7, 3], "label": "7,3"},
{"y": 4.5, "x": 7.5, "matrix": [6, 4], "label": "6,4"},
{"y": 4.5, "x": 8.5, "matrix": [7, 4], "label": "7,4"},
{"y": 4.5, "x": 9.5, "matrix": [6, 5], "w": 1.5, "label": "6,5"}
]
}
},
"features": {
"bootmagic": true,
"command": false,
"console": false,
"extrakey": true,
"mousekey": true,
"nkro": false,
"audio": false,
"backlight": false,
"rgblight": false,
"encoder": true,
"rgb_matrix": true,
"haptic": true,
"oled": true,
"wpm": true
},
"build": {
"lto": true
},
"haptic": {
"driver": "solenoid"
},
"encoder": {
"enabled": true,
"rotary": [
{ "pin_a": "GP22", "pin_b": "GP23", "resolution": 2 },
{ "pin_a": "GP26", "pin_b": "GP24", "resolution": 2 },
{ "pin_a": "GP0", "pin_b": "GP1", "resolution": 2 },
{ "pin_a": "GP5", "pin_b": "GP3", "resolution": 2 }
]
},
"diode_direction": "COL2ROW",
"matrix_pins": {
"cols": ["GP28", "GP21", "GP20", "GP6", "GP2", "GP12", "GP13", "GP14"],
"rows": ["GP25", "GP27", "GP16", "GP7", "GP17", "GP18", "GP19", "GP4", "GP8", "GP9"]
}
}

View File

@ -0,0 +1,28 @@
/*
Copyright 2024 Nachie
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] = {
/* QWERTY */
LAYOUT(
KC_ESC, KC_1, KC_2, KC_3, KC_4,
KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC,
KC_A, KC_S, KC_D, KC_F, KC_G, KC_SPC, KC_H, KC_J, KC_K, KC_L, KC_ENT,
KC_Z, KC_X, KC_C, KC_V, KC_B, KC_SPC, KC_N, KC_M, KC_DOT, KC_LSFT, MO(1),
KC_LGUI, KC_LGUI, KC_LALT, KC_SPC, KC_SPC, KC_BSPC, KC_SPC, KC_SPC, KC_BSPC, KC_RGUI, MO(1))
};

View File

@ -0,0 +1 @@
The default keymap for the Syndrome Ortho.

View File

@ -0,0 +1,13 @@
/* SPDX-License-Identifier: GPL-2.0-or-later */
#pragma once
#define VIA_EEPROM_LAYOUT_OPTIONS_SIZE 2
#define VIAL_KEYBOARD_UID {0xC9, 0x3D, 0x14, 0x32, 0x17, 0xA3, 0xD1, 0x9D}
#define VIAL_UNLOCK_COMBO_ROWS { 0, 3 }
#define VIAL_UNLOCK_COMBO_COLS { 0, 4 }
#define RGB_MATRIX_FRAMEBUFFER_EFFECTS
#define RGB_MATRIX_KEYPRESSES

View File

@ -0,0 +1,492 @@
/*
Copyright 2024 Nachie
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
#include <stdio.h>
#include "os_detection.h"
#ifdef OLED_ENABLE
void render_key_status_or_logo(void);
void render_current_layer(void);
void render_current_wpm(void);
#endif
os_variant_t current_platform;
bool is_alt_tab_active = false;
uint16_t alt_tab_timer = 0;
enum layer_names {
_BASE, // Default Layer
_FN, // Fn Layer 1
_FN2, // Fn Layer 2
_FN3 // Fn Layer 3
};
enum custom_keycode {
JWRDL = QK_KB_0,
JWRDR,
SWRDL,
SWRDR,
TABL,
TABR,
DSKTPL,
DSKTPR,
PRVAPP,
NXTAPP
};
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
switch (keycode) {
case KC_HOME:
if (record->event.pressed && current_platform == OS_MACOS) {
register_mods(MOD_LGUI);
tap_code(KC_LEFT);
unregister_mods(MOD_LGUI);
} else {
tap_code(KC_HOME);
}
break;
case KC_END:
if (record->event.pressed && current_platform == OS_MACOS) {
register_mods(MOD_LGUI);
tap_code(KC_RIGHT);
unregister_mods(MOD_LGUI);
} else {
tap_code(KC_END);
}
break;
case KC_PGUP:
if (record->event.pressed && current_platform == OS_MACOS) {
register_mods(MOD_LGUI);
tap_code(KC_UP);
unregister_mods(MOD_LGUI);
} else {
tap_code(KC_PGUP);
}
break;
case KC_PGDN:
if (record->event.pressed && current_platform == OS_MACOS) {
register_mods(MOD_LGUI);
tap_code(KC_DOWN);
unregister_mods(MOD_LGUI);
} else {
tap_code(KC_PGDN);
}
break;
case KC_NUM_LOCK:
if (record->event.pressed && current_platform == OS_MACOS) {
register_mods(MOD_LSFT);
tap_code(KC_CLEAR);
unregister_mods(MOD_LSFT);
} else {
tap_code(KC_NUM_LOCK);
}
break;
case KC_SCROLL_LOCK:
if (record->event.pressed && current_platform == OS_MACOS) {
register_mods(MOD_LCTL);
tap_code(KC_F14);
unregister_mods(MOD_LCTL);
} else {
tap_code(KC_SCROLL_LOCK);
}
break;
case KC_PRINT_SCREEN:
if (record->event.pressed && current_platform == OS_MACOS) {
register_mods(MOD_LSFT);
register_mods(MOD_LGUI);
tap_code(KC_5);
unregister_mods(MOD_LGUI);
unregister_mods(MOD_LSFT);
} else {
tap_code(KC_PRINT_SCREEN);
}
break;
case JWRDL:
if (record->event.pressed) {
(current_platform == OS_MACOS) ? register_mods(MOD_LALT) : register_mods(MOD_LCTL);
tap_code(KC_LEFT);
(current_platform == OS_MACOS) ? unregister_mods(MOD_LALT) : unregister_mods(MOD_LCTL);
} else {
}
break;
case JWRDR:
if (record->event.pressed) {
(current_platform == OS_MACOS) ? register_mods(MOD_LALT) : register_mods(MOD_LCTL);
tap_code(KC_RIGHT);
(current_platform == OS_MACOS) ? unregister_mods(MOD_LALT) : unregister_mods(MOD_LCTL);
} else {
}
break;
case SWRDL:
if (record->event.pressed) {
register_mods(MOD_LSFT);
(current_platform == OS_MACOS) ? register_mods(MOD_LALT) : register_mods(MOD_LCTL);
tap_code(KC_LEFT);
(current_platform == OS_MACOS) ? unregister_mods(MOD_LALT) : unregister_mods(MOD_LCTL);
unregister_mods(MOD_LSFT);
} else {
}
break;
case SWRDR:
if (record->event.pressed) {
register_mods(MOD_LSFT);
(current_platform == OS_MACOS) ? register_mods(MOD_LALT) : register_mods(MOD_LCTL);
tap_code(KC_RIGHT);
(current_platform == OS_MACOS) ? unregister_mods(MOD_LALT) : unregister_mods(MOD_LCTL);
unregister_mods(MOD_LSFT);
} else {
}
break;
case TABL:
if (record->event.pressed) {
register_mods(MOD_LCTL);
register_mods(MOD_LSFT);
tap_code(KC_TAB);
unregister_mods(MOD_LSFT);
unregister_mods(MOD_LCTL);
} else {
}
break;
case TABR:
if (record->event.pressed) {
register_mods(MOD_LCTL);
tap_code(KC_TAB);
unregister_mods(MOD_LCTL);
} else {
}
break;
case DSKTPL:
if (record->event.pressed) {
register_mods(MOD_LCTL);
register_mods(MOD_LGUI);
(current_platform == OS_LINUX) ? tap_code(KC_UP) : tap_code(KC_LEFT);
unregister_mods(MOD_LGUI);
unregister_mods(MOD_LCTL);
} else {
}
break;
case DSKTPR:
if (record->event.pressed) {
register_mods(MOD_LCTL);
register_mods(MOD_LGUI);
(current_platform == OS_LINUX) ? tap_code(KC_DOWN) : tap_code(KC_RGHT);
unregister_mods(MOD_LGUI);
unregister_mods(MOD_LCTL);
} else {
}
break;
case PRVAPP:
if (record->event.pressed) {
register_code(KC_LSFT);
if (!is_alt_tab_active) {
is_alt_tab_active = true;
(current_platform == OS_MACOS) ? register_code(KC_LGUI) : register_code(KC_LALT);
}
alt_tab_timer = timer_read();
register_code(KC_TAB);
} else {
unregister_code(KC_TAB);
unregister_code(KC_LSFT);
}
break;
case NXTAPP:
if (record->event.pressed) {
if (!is_alt_tab_active) {
is_alt_tab_active = true;
(current_platform == OS_MACOS) ? register_code(KC_LGUI) : register_code(KC_LALT);
}
alt_tab_timer = timer_read();
register_code(KC_TAB);
} else {
unregister_code(KC_TAB);
}
break;
}
return true;
};
#ifndef HAPTIC_ENABLE
#define HF_TOGG _______
#endif
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* QWERTY */
[_BASE] = LAYOUT(
KC_ESC, KC_1, KC_2, KC_3, KC_4,
KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC,
KC_A, KC_S, KC_D, KC_F, KC_G, KC_SPC, KC_H, KC_J, KC_K, KC_L, KC_ENT,
KC_Z, KC_X, KC_C, KC_V, KC_B, KC_SPC, KC_N, KC_M, KC_DOT, KC_LSFT, MO(1),
KC_LGUI, KC_LGUI, KC_LALT, KC_SPC, KC_SPC, KC_BSPC, KC_SPC, KC_SPC, KC_BSPC, KC_RGUI, MO(2)),
/* FUNCTION */
[_FN] = LAYOUT(
KC_ESC, KC_1, KC_2, KC_3, KC_4,
KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_BSPC,
KC_A, KC_S, KC_D, KC_F, KC_G, KC_SPC, KC_H, KC_J, KC_K, KC_L, KC_ENT,
KC_Z, KC_X, KC_C, KC_V, KC_B, KC_SPC, KC_N, KC_M, KC_DOT, KC_LSFT, MO(1),
KC_LGUI, KC_LGUI, KC_LALT, KC_SPC, KC_SPC, KC_BSPC, KC_SPC, KC_SPC, KC_BSPC, KC_RGUI, MO(1)),
[_FN2] = LAYOUT(
KC_ESC, QK_BOOTLOADER, QK_REBOOT, QK_DEBUG_TOGGLE, QK_CLEAR_EEPROM,
HF_TOGG, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______),
[_FN3] = LAYOUT(
KC_ESC, KC_1, KC_2, KC_3, KC_4,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______)
};
void matrix_scan_user(void) { // The very important timer.
if (is_alt_tab_active) {
if (timer_elapsed(alt_tab_timer) > 1000) {
(current_platform == OS_MACOS) ? unregister_code(KC_LGUI) : unregister_code(KC_LALT);
is_alt_tab_active = false;
}
}
}
#if defined(ENCODER_MAP_ENABLE)
const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][2] = {
[_BASE] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU), ENCODER_CCW_CW(RGB_RMOD, RGB_MOD), ENCODER_CCW_CW(KC_VOLD, KC_VOLU) },
[_FN] = { ENCODER_CCW_CW(RGB_RMOD, RGB_MOD), ENCODER_CCW_CW(RGB_RMOD, RGB_MOD), ENCODER_CCW_CW(RGB_RMOD, RGB_MOD) },
[_FN2] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU), ENCODER_CCW_CW(RGB_RMOD, RGB_MOD), ENCODER_CCW_CW(KC_VOLD, KC_VOLU) },
[_FN3] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU), ENCODER_CCW_CW(RGB_RMOD, RGB_MOD), ENCODER_CCW_CW(KC_VOLD, KC_VOLU) },
};
#endif
#ifdef OLED_ENABLE
#ifdef DYNAMIC_MACRO_ENABLE
bool macro1;
bool macro1rec;
bool macro2;
bool macro2rec;
bool prevEnabled;
uint8_t prevRGBmode;
void render_dynamic_macro_status(int col, int line){
oled_set_cursor(col,line);
macro1rec ? oled_write(PSTR("DM1"), macro1) : oled_write(PSTR(" "),false);
oled_set_cursor(col,line+1);
macro2rec ? oled_write(PSTR("DM2"), macro2) : oled_write(PSTR(" "),false);
}
//direction indicates which macro it is, with 1 being Macro 1, -1 being Macro 2, and 0 being no macro.
void dynamic_macro_record_start_user(int8_t direction){
prevEnabled = rgb_matrix_is_enabled();
if (!prevEnabled) { rgb_matrix_enable(); }
prevRGBmode = rgb_matrix_get_mode();
rgb_matrix_mode(RGB_MATRIX_BREATHING);
switch(direction){
case 1:
macro1 = false;
macro1rec = true;
break;
case -1:
macro2 = false;
macro2rec = true;
break;
default:
macro1 = false;
macro2 = false;
macro1rec = false;
macro2rec = false;
break;
}
}
void dynamic_macro_record_end_user(int8_t direction){
prevEnabled ? rgb_matrix_mode(prevRGBmode) : rgb_matrix_disable();
switch(direction){
case 1:
macro1 = true;
break;
case -1:
macro2 = true;
break;
default:
macro1 = false;
macro2 = false;
break;
}
}
#endif
bool clear_screen = false;
bool rerender_platform = false;
static void render_logo(void) {
static const char PROGMEM logo[] = {
0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, 0x90, 0x91, 0x92, 0x93, 0x94,
0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, 0xB0, 0xB1, 0xB2, 0xB3, 0xB4,
0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0x00
};
oled_write(logo, false);
}
void render_keylock_status(led_t led_state) {
bool caps_state = (led_state.caps_lock || is_caps_word_on());
oled_write(PSTR("CAPS"), caps_state);
oled_write(PSTR(" "), false);
oled_write(PSTR("NUM"), led_state.num_lock);
oled_write(PSTR(" "), false);
oled_write(PSTR("SCRL"), led_state.scroll_lock);
//oled_write_ln_P(PSTR(" "), false);
}
void render_mod_status(uint8_t modifiers) {
oled_write(PSTR("SH"), (modifiers & MOD_MASK_SHIFT));
oled_write(PSTR(" "), false);
(current_platform == OS_MACOS || current_platform == OS_IOS) ? oled_write(PSTR("CMD"), (modifiers & MOD_MASK_GUI)) : oled_write(PSTR("CT"), (modifiers & MOD_MASK_CTRL));
oled_write(PSTR(" "), false);
(current_platform == OS_MACOS || current_platform == OS_IOS) ? oled_write(PSTR("OPT"), (modifiers & MOD_MASK_ALT)) : oled_write(PSTR("ALT"), (modifiers & MOD_MASK_ALT));
oled_write(PSTR(" "), false);
(current_platform == OS_MACOS || current_platform == OS_IOS) ? oled_write(PSTR("CT"), (modifiers & MOD_MASK_CTRL)) : oled_write(PSTR("GUI"), (modifiers & MOD_MASK_GUI));
}
void render_key_status_or_logo(){
led_t led_state = host_keyboard_led_state();
uint8_t mod_state = (get_mods()|get_oneshot_mods());
if ( !led_state.num_lock && !led_state.caps_lock && !led_state.scroll_lock
&& !(mod_state & MOD_MASK_SHIFT) && !(mod_state & MOD_MASK_ALT) && !(mod_state & MOD_MASK_CTRL) && !(mod_state & MOD_MASK_GUI)) {
if(!clear_screen) {
render_logo();
rerender_platform = true;
}
clear_screen = true;
} else {
if (clear_screen == true) {
oled_clear();
oled_render();
clear_screen = false;
}
oled_set_cursor(8,0);
render_keylock_status(led_state);
oled_set_cursor(8,1);
render_mod_status(mod_state);
rerender_platform = true;
}
}
void render_current_layer(){
switch (get_highest_layer(layer_state)) {
case 0:
oled_write(PSTR("Layer 0"), false);
break;
case 1:
oled_write(PSTR("Layer 1"), false);
break;
case 2:
oled_write(PSTR("Layer 2"), false);
break;
case 3:
oled_write(PSTR("Layer 3"), false);
break;
default:
oled_write(PSTR("Layer ?"), false); // Should never display, here as a catchall
}
}
void render_current_wpm(){
oled_write_P(PSTR("WPM: "), false);
oled_write(get_u8_str(get_current_wpm(), '0'), false);
}
void render_platform_status(int col, int line) {
/* Show Ctrl-Gui Swap options */
static const char PROGMEM logo[][5][3] = {
{{0x9B, 0x9C, 0}, {0xbb, 0xbc, 0}}, //Android
{{0x99, 0x9A, 0}, {0xb9, 0xba, 0}}, //Linux
{{0x97, 0x98, 0}, {0xb7, 0xb8, 0}}, //Windows
{{0x95, 0x96, 0}, {0xb5, 0xb6, 0}}, //Mac/iOS
{{0x9D, 0x9E, 0}, {0xbd, 0xbe, 0}}, //Empty Placeholder
};
current_platform = detected_host_os();
switch (current_platform) {
/*case OS_ANDROID: //Android
oled_set_cursor(col,line);
oled_write(logo[0][0], false);
oled_set_cursor(col,line+1);
oled_write(logo[0][1], false);
break;*/
case OS_LINUX: //Linux
oled_set_cursor(col,line);
oled_write(logo[1][0], false);
oled_set_cursor(col,line+1);
oled_write(logo[1][1], false);
keymap_config.swap_lctl_lgui = false;
keymap_config.swap_rctl_rgui = false;
break;
case OS_WINDOWS: //Windows
oled_set_cursor(col,line);
oled_write(logo[2][0], false);
oled_set_cursor(col,line+1);
oled_write(logo[2][1], false);
keymap_config.swap_lctl_lgui = false;
keymap_config.swap_rctl_rgui = false;
break;
case OS_MACOS: //Mac
oled_set_cursor(col,line);
oled_write(logo[3][0], false);
oled_set_cursor(col,line+1);
oled_write(logo[3][1], false);
keymap_config.swap_lctl_lgui = true;
keymap_config.swap_rctl_rgui = true;
break;
case OS_IOS: //iOS
oled_set_cursor(col,line);
oled_write(logo[3][0], false);
oled_set_cursor(col,line+1);
oled_write(logo[3][1], false);
keymap_config.swap_lctl_lgui = true;
keymap_config.swap_rctl_rgui = true;
break;
default: //OS_UNSURE or not configured
oled_set_cursor(col,line);
oled_write(logo[4][0], false);
oled_set_cursor(col,line+1);
oled_write(logo[4][1], false);
break;
}
rerender_platform = false;
}
bool oled_task_user(void) {
render_key_status_or_logo();
oled_set_cursor(8,2);
render_current_layer();
#ifdef DYNAMIC_MACRO_ENABLE
render_dynamic_macro_status(18,2);
#endif
oled_set_cursor(8,3);
render_current_wpm();
#ifdef OS_DETECTION_ENABLE
if(current_platform != detected_host_os() || rerender_platform) { render_platform_status(3,0); }
#endif
return false;
}
#endif

View File

@ -0,0 +1 @@
The via keymap for the Syndrome Ortho PCB.

View File

@ -0,0 +1,10 @@
VIA_ENABLE = yes
VIAL_ENABLE = yes
VIALRGB_ENABLE = yes
ENCODER_MAP_ENABLE = yes
BOOTMAGIC_ENABLE = yes
MAGIC_ENABLE = yes
OS_DETECTION_ENABLE = yes
DYNAMIC_MACRO_ENABLE = yes
CAPS_WORD_ENABLE = yes

View File

@ -0,0 +1,302 @@
{
"name": "Syndrome",
"vendorId": "0x4B43",
"productId": "0x5360",
"customKeycodes": [
{
"name": "JmpWordL",
"title": "Jump Word Left",
"shortName": "JWRDL"
},
{
"name": "JmpWordR",
"title": "Jump Word Right",
"shortName": "JWRDR"
},
{
"name": "SlcWordL",
"title": "Select Word Left",
"shortName": "SWRDL"
},
{
"name": "SlcWordR",
"title": "Select Word Right",
"shortName": "SWRDR"
},
{
"name": "TabLft",
"title": "Tab Left",
"shortName": "TABL"
},
{
"name": "TabRght",
"title": "Tab Right",
"shortName": "TABR"
},
{
"name": "DsktpLft",
"title": "Desktop Left",
"shortName": "DSKTPL"
},
{
"name": "DsktpRght",
"title": "Desktop Right",
"shortName": "DSKTPR"
},
{
"name": "PrevApp",
"title": "Previous App",
"shortName": "PRVAPP"
},
{
"name": "NextApp",
"title": "Next App",
"shortName": "NXTAPP"
}
],
"matrix": { "rows": 10, "cols": 8 },
"lighting": "vialrgb",
"layouts": {
"labels":[
[
"Bottom Row",
"All 1U",
"2U Centered Space",
"6U Big Bar",
"3U/3U",
"2U/2U",
"1.75U/1.75U"
],
"Alpha Stagger",
"R1 Encoder",
"R2 Encoder",
"R3 Encoder",
"Macro Row"
],
"keymap": [
[
{
"y": 2.5,
"x": 2
},
"3,0\n\n\n\n\n\n\n\n\ne",
"3,1\n\n\n\n\n\n\n\n\ne"
],
[
{
"x": 2.5
},
"8,5\n\n\n5,0",
{
"x": 6
},
"9,5\n\n\n5,0",
"8,6\n\n\n5,0",
"9,6\n\n\n5,0",
"8,7\n\n\n5,0"
],
[
{
"y": 0.5,
"x": 2.5
},
"0,0",
"1,0",
"0,1",
"1,1",
"0,2",
"1,2",
"0,3",
"1,3",
"0,4",
"1,4",
"0,5",
{
"x": 0.75,
"d": true
},
"0,0\n\n\n2,0\n\n\n\n\n\ne",
{
"d": true
},
"0,1\n\n\n2,0\n\n\n\n\n\ne",
"0,0\n\n\n2,1\n\n\n\n\n\ne",
"0,1\n\n\n2,1\n\n\n\n\n\ne"
],
[
{
"x": 2.5,
"c": "#aaaaaa"
},
"2,0",
{
"c": "#cccccc"
},
"3,0",
"2,1",
"3,1",
"2,2",
"3,2",
"2,3",
"3,3",
"2,4",
{
"c": "#777777"
},
"3,4",
"2,5",
{
"x": 0.75,
"c": "#cccccc",
"d": true
},
"1,0\n\n\n3,0\n\n\n\n\n\ne",
{
"d": true
},
"1,1\n\n\n3,0\n\n\n\n\n\ne",
"1,0\n\n\n3,1\n\n\n\n\n\ne",
"1,1\n\n\n3,1\n\n\n\n\n\ne"
],
[
{
"x": 2.5,
"c": "#aaaaaa"
},
"4,0\n\n\n1,0",
{
"c": "#cccccc"
},
"5,0\n\n\n1,0",
"4,1\n\n\n1,0",
"5,1\n\n\n1,0",
"4,2\n\n\n1,0",
"5,2",
"4,3\n\n\n1,0",
"5,3\n\n\n1,0",
"4,4\n\n\n1,0",
{
"c": "#aaaaaa"
},
"5,4\n\n\n1,0",
"4,5\n\n\n1,0",
{
"x": 0.75,
"c": "#cccccc",
"d": true
},
"2,0\n\n\n4,0\n\n\n\n\n\ne",
{
"d": true
},
"2,1\n\n\n4,0\n\n\n\n\n\ne",
"2,0\n\n\n4,1\n\n\n\n\n\ne",
"2,1\n\n\n4,1\n\n\n\n\n\ne"
],
[
{
"x": 2.5,
"w": 1.5
},
"6,0",
"7,0",
"6,1\n\n\n0,0",
"7,1\n\n\n0,0",
"6,2\n\n\n0,0",
"7,2\n\n\n0,0",
"7,3\n\n\n0,0",
"6,4\n\n\n0,0",
"7,4",
{
"w": 1.5
},
"6,5"
],
[
{
"x": 5
},
"6,1\n\n\n0,1",
"7,1\n\n\n0,1",
{
"w": 2
},
"6,3\n\n\n0,1",
"7,3\n\n\n0,1",
"6,4\n\n\n0,1"
],
[
{
"x": 5,
"w": 6
},
"6,3\n\n\n0,2"
],
[
{
"x": 5,
"w": 3
},
"7,1\n\n\n0,3",
{
"w": 3
},
"7,3\n\n\n0,3"
],
[
{
"x": 5
},
"6,1\n\n\n0,4",
{
"w": 2
},
"6,2\n\n\n0,4",
{
"w": 2
},
"7,3\n\n\n0,4",
"6,4\n\n\n0,4"
],
[
{
"x": 5,
"w": 1.25
},
"6,1\n\n\n0,5",
{
"w": 1.75
},
"6,2\n\n\n0,5",
{
"w": 1.75
},
"7,3\n\n\n0,5",
{
"w": 1.25
},
"6,4\n\n\n0,5"
],
[
{
"y": 1.25,
"x": 2.5,
"w": 1.5
},
"4,0\n\n\n1,1",
"5,0\n\n\n1,1",
"4,1\n\n\n1,1",
"5,1\n\n\n1,1",
"4,2\n\n\n1,1",
"4,3\n\n\n1,1",
"5,3\n\n\n1,1",
"4,4\n\n\n1,1",
"5,4\n\n\n1,1",
{
"w": 1.5
},
"4,5\n\n\n1,1"
]
]
}
}

View File

@ -0,0 +1,9 @@
#pragma once
#include_next <mcuconf.h>
#undef RP_I2C_USE_I2C0
#define RP_I2C_USE_I2C0 FALSE
#undef RP_I2C_USE_I2C1
#define RP_I2C_USE_I2C1 TRUE

View File

@ -0,0 +1,23 @@
# Syndrome Ortho
Firmware for the Syndrome Ortho (and Detour)
* Keyboard Maintainer: [Nachie](https://github.com/nachie)
* Hardware Supported: Syndrome Ortho
* Hardware Availability: [Little Craftery](https://littlecraftery.com/products/syndrome-ortho)
Make example for this keyboard (after setting up your build environment):
make nachie/syndrome_ortho:default
Or to make and flash:
make nachie/syndrome_ortho: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
* **Bootmagic reset**: Hold down ESC key (top left) and plug in the keyboard
* **Physical reset button**: Briefly press the button labeled "SW_RST1" on the back of the PCB

View File

@ -0,0 +1,3 @@
OLED_DRIVER = ssd1306
OPT_DEFS += -DHAL_USE_I2C=TRUE

View File

@ -0,0 +1,89 @@
/*
Copyright 2024 Nachie
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 "quantum.h"
led_config_t g_led_config = { {
{NO_LED, NO_LED, NO_LED, NO_LED, NO_LED, NO_LED, NO_LED, NO_LED},
{ 6, 5, 4, 3, 2, 1, 0, NO_LED },
{ 7, NO_LED, NO_LED, NO_LED, NO_LED, NO_LED, NO_LED, 15 },
{ 8 , 9, NO_LED, 10, 11, 12, 13, 14 },
{ NO_LED, NO_LED, NO_LED,NO_LED, NO_LED, NO_LED, NO_LED, NO_LED }
}, {
{ 183,0 }, { 162,0 }, { 142,0 }, { 122,0 }, { 81,0 }, { 61,0 }, { 40,0 },
{ 20,16 }, { 40,48 },
{ 61,48 }, { 81,48 }, { 101,48 }, { 122,48 }, { 162,48 }, { 203,48 }, { 244,16 }
}, {
1, 1, 1, 1, 1, 1, 1,
1, 1,
1, 1, 1, 1, 1, 1, 1
} };
#ifdef OLED_ENABLE
static void render_logo(void) {
static const char PROGMEM my_logo[] = {
// 'Screenshot 2023-07-21 at 1', 128x32px
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xfe, 0x00, 0x03, 0xc0, 0x00, 0xc0, 0x00, 0x3c, 0x00, 0x0f, 0x1f, 0xf8, 0xe0, 0x00, 0x1f, 0xff,
0xff, 0x80, 0x01, 0xc0, 0x00, 0x40, 0x00, 0x38, 0x00, 0x07, 0x1f, 0xf8, 0xe0, 0x00, 0x1f, 0xff,
0xff, 0xff, 0xf1, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0x1f, 0xf8, 0xff, 0xff, 0x0f, 0xff,
0xff, 0xff, 0xf1, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0x1f, 0xf8, 0xff, 0xff, 0x8f, 0xff,
0xff, 0xff, 0xf1, 0xff, 0xff, 0xff, 0x8f, 0xff, 0xff, 0xff, 0x1f, 0xf8, 0xff, 0xff, 0x0f, 0xff,
0xfe, 0x1f, 0xf1, 0xc0, 0x03, 0xff, 0x8f, 0xf8, 0xff, 0xc7, 0x1f, 0xf8, 0xe1, 0xc0, 0x1f, 0xff,
0xfe, 0x1f, 0xf1, 0xc0, 0x03, 0xff, 0x8f, 0xf8, 0xff, 0xc7, 0x1f, 0xf8, 0xe1, 0xe0, 0x3f, 0xff,
0xfe, 0x1f, 0xf1, 0xc3, 0xff, 0xff, 0x8f, 0xf8, 0xff, 0xc7, 0x1f, 0xf8, 0xe1, 0xf0, 0xff, 0xff,
0xfe, 0x1f, 0xf1, 0xc3, 0xff, 0xff, 0x8f, 0xf8, 0xff, 0xc7, 0x1f, 0xf8, 0xe1, 0xf8, 0x7f, 0xff,
0xfe, 0x1f, 0xf1, 0xc3, 0xff, 0xff, 0x8f, 0xf8, 0xff, 0xc7, 0x1f, 0xf8, 0xe1, 0xf8, 0x7f, 0xff,
0xfe, 0x00, 0x01, 0xc0, 0x00, 0x7f, 0x8f, 0xf8, 0x00, 0x07, 0x00, 0x00, 0xe1, 0xfc, 0x3f, 0xff,
0xfe, 0x00, 0x03, 0xc0, 0x00, 0xff, 0x8f, 0xfc, 0x00, 0x0f, 0x80, 0x01, 0xe1, 0xfe, 0x1f, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
};
oled_write_raw_P(my_logo, sizeof(my_logo));
}
bool oled_task_kb(void) {
// Defer to the keymap if they want to override
if(!oled_task_user()) {
return false;
}
// default keyboard drawing code
render_logo();
return false;
}
#endif