From e73d46e3fd3f72255a3c062945ef937242d5892e Mon Sep 17 00:00:00 2001 From: ducoterra Date: Thu, 14 Sep 2023 09:33:35 -0400 Subject: [PATCH] Add back custom keychron keyboard layouts These were customized a long time ago and no longer conform to the keychron naming standards. --- keyboards/keychron/q1/rev_0100/config.h | 31 +++ keyboards/keychron/q1/rev_0100/info.json | 91 +++++++++ .../q1/rev_0100/keymaps/default/keymap.c | 89 +++++++++ .../q1/rev_0100/keymaps/ducoterra/keymap.c | 89 +++++++++ .../q1/rev_0100/keymaps/gtg465x/README.md | 21 ++ .../q1/rev_0100/keymaps/gtg465x/config.h | 25 +++ .../q1/rev_0100/keymaps/gtg465x/keymap.c | 102 ++++++++++ .../q1/rev_0100/keymaps/gtg465x/keymap_user.h | 28 +++ .../keymaps/gtg465x/rgb_matrix_user.c | 71 +++++++ .../keymaps/gtg465x/rgb_matrix_user.h | 24 +++ .../q1/rev_0100/keymaps/gtg465x/rules.mk | 6 + .../q1/rev_0100/keymaps/mkillewald/config.h | 23 +++ .../q1/rev_0100/keymaps/mkillewald/keymap.c | 175 ++++++++++++++++ .../rev_0100/keymaps/mkillewald/keymap_user.h | 33 ++++ .../q1/rev_0100/keymaps/mkillewald/readme.md | 54 +++++ .../keymaps/mkillewald/rgb_matrix_user.c | 83 ++++++++ .../keymaps/mkillewald/rgb_matrix_user.h | 26 +++ .../q1/rev_0100/keymaps/mkillewald/rules.mk | 6 + .../q1/rev_0100/keymaps/teimor/config.h | 32 +++ .../q1/rev_0100/keymaps/teimor/keymap.c | 95 +++++++++ .../q1/rev_0100/keymaps/teimor/keymap_user.h | 48 +++++ .../q1/rev_0100/keymaps/teimor/readme.md | 13 ++ .../rev_0100/keymaps/teimor/rgb_matrix_user.c | 91 +++++++++ .../rev_0100/keymaps/teimor/rgb_matrix_user.h | 25 +++ .../q1/rev_0100/keymaps/teimor/rules.mk | 14 ++ .../keymaps/teimor/tap_dance_mac_caps.c | 50 +++++ .../keymaps/teimor/tap_dance_mac_caps.h | 23 +++ .../rev_0100/keymaps/teimor/tap_dance_setup.c | 49 +++++ .../rev_0100/keymaps/teimor/tap_dance_setup.h | 38 ++++ .../rev_0100/keymaps/teimor/tap_dance_user.c | 28 +++ .../keymaps/teimor/tap_dance_win_caps.c | 50 +++++ .../keymaps/teimor/tap_dance_win_caps.h | 23 +++ .../keychron/q1/rev_0100/keymaps/via/keymap.c | 107 ++++++++++ .../keychron/q1/rev_0100/keymaps/via/rules.mk | 2 + keyboards/keychron/q1/rev_0100/readme.md | 1 + keyboards/keychron/q1/rev_0100/rev_0100.c | 143 ++++++++++++++ keyboards/keychron/q1/rev_0100/rev_0100.h | 37 ++++ keyboards/keychron/q1/rev_0100/rules.mk | 21 ++ .../q10/q10_ansi_stm32l432_ec11/config.h | 31 +++ .../q10/q10_ansi_stm32l432_ec11/info.json | 111 +++++++++++ .../keymaps/default/keymap.c | 129 ++++++++++++ .../keymaps/default/rules.mk | 1 + .../keymaps/ducoterra/keymap.c | 138 +++++++++++++ .../keymaps/ducoterra/rules.mk | 1 + .../keymaps/via/keymap.c | 187 ++++++++++++++++++ .../keymaps/via/rules.mk | 2 + .../q10_ansi_stm32l432_ec11.c | 183 +++++++++++++++++ .../q10_ansi_stm32l432_ec11.h | 47 +++++ .../q10/q10_ansi_stm32l432_ec11/readme.md | 5 + .../q10/q10_ansi_stm32l432_ec11/rules.mk | 35 ++++ .../keychron/q4/q4_ansi_stm32l432/config.h | 36 ++++ .../keychron/q4/q4_ansi_stm32l432/info.json | 76 +++++++ .../keymaps/default/keymap.c | 143 ++++++++++++++ .../keymaps/ducoterra/keymap.c | 143 ++++++++++++++ .../q4/q4_ansi_stm32l432/keymaps/via/config.h | 20 ++ .../q4/q4_ansi_stm32l432/keymaps/via/keymap.c | 143 ++++++++++++++ .../q4/q4_ansi_stm32l432/keymaps/via/rules.mk | 1 + .../q4/q4_ansi_stm32l432/q4_ansi_stm32l432.c | 124 ++++++++++++ .../q4/q4_ansi_stm32l432/q4_ansi_stm32l432.h | 35 ++++ .../keychron/q4/q4_ansi_stm32l432/readme.md | 1 + .../keychron/q4/q4_ansi_stm32l432/rules.mk | 28 +++ 61 files changed, 3487 insertions(+) create mode 100644 keyboards/keychron/q1/rev_0100/config.h create mode 100644 keyboards/keychron/q1/rev_0100/info.json create mode 100644 keyboards/keychron/q1/rev_0100/keymaps/default/keymap.c create mode 100644 keyboards/keychron/q1/rev_0100/keymaps/ducoterra/keymap.c create mode 100644 keyboards/keychron/q1/rev_0100/keymaps/gtg465x/README.md create mode 100644 keyboards/keychron/q1/rev_0100/keymaps/gtg465x/config.h create mode 100644 keyboards/keychron/q1/rev_0100/keymaps/gtg465x/keymap.c create mode 100644 keyboards/keychron/q1/rev_0100/keymaps/gtg465x/keymap_user.h create mode 100644 keyboards/keychron/q1/rev_0100/keymaps/gtg465x/rgb_matrix_user.c create mode 100644 keyboards/keychron/q1/rev_0100/keymaps/gtg465x/rgb_matrix_user.h create mode 100644 keyboards/keychron/q1/rev_0100/keymaps/gtg465x/rules.mk create mode 100644 keyboards/keychron/q1/rev_0100/keymaps/mkillewald/config.h create mode 100644 keyboards/keychron/q1/rev_0100/keymaps/mkillewald/keymap.c create mode 100644 keyboards/keychron/q1/rev_0100/keymaps/mkillewald/keymap_user.h create mode 100644 keyboards/keychron/q1/rev_0100/keymaps/mkillewald/readme.md create mode 100644 keyboards/keychron/q1/rev_0100/keymaps/mkillewald/rgb_matrix_user.c create mode 100644 keyboards/keychron/q1/rev_0100/keymaps/mkillewald/rgb_matrix_user.h create mode 100644 keyboards/keychron/q1/rev_0100/keymaps/mkillewald/rules.mk create mode 100644 keyboards/keychron/q1/rev_0100/keymaps/teimor/config.h create mode 100644 keyboards/keychron/q1/rev_0100/keymaps/teimor/keymap.c create mode 100644 keyboards/keychron/q1/rev_0100/keymaps/teimor/keymap_user.h create mode 100644 keyboards/keychron/q1/rev_0100/keymaps/teimor/readme.md create mode 100644 keyboards/keychron/q1/rev_0100/keymaps/teimor/rgb_matrix_user.c create mode 100644 keyboards/keychron/q1/rev_0100/keymaps/teimor/rgb_matrix_user.h create mode 100644 keyboards/keychron/q1/rev_0100/keymaps/teimor/rules.mk create mode 100644 keyboards/keychron/q1/rev_0100/keymaps/teimor/tap_dance_mac_caps.c create mode 100644 keyboards/keychron/q1/rev_0100/keymaps/teimor/tap_dance_mac_caps.h create mode 100644 keyboards/keychron/q1/rev_0100/keymaps/teimor/tap_dance_setup.c create mode 100644 keyboards/keychron/q1/rev_0100/keymaps/teimor/tap_dance_setup.h create mode 100644 keyboards/keychron/q1/rev_0100/keymaps/teimor/tap_dance_user.c create mode 100644 keyboards/keychron/q1/rev_0100/keymaps/teimor/tap_dance_win_caps.c create mode 100644 keyboards/keychron/q1/rev_0100/keymaps/teimor/tap_dance_win_caps.h create mode 100644 keyboards/keychron/q1/rev_0100/keymaps/via/keymap.c create mode 100644 keyboards/keychron/q1/rev_0100/keymaps/via/rules.mk create mode 100644 keyboards/keychron/q1/rev_0100/readme.md create mode 100644 keyboards/keychron/q1/rev_0100/rev_0100.c create mode 100644 keyboards/keychron/q1/rev_0100/rev_0100.h create mode 100644 keyboards/keychron/q1/rev_0100/rules.mk create mode 100644 keyboards/keychron/q10/q10_ansi_stm32l432_ec11/config.h create mode 100644 keyboards/keychron/q10/q10_ansi_stm32l432_ec11/info.json create mode 100644 keyboards/keychron/q10/q10_ansi_stm32l432_ec11/keymaps/default/keymap.c create mode 100644 keyboards/keychron/q10/q10_ansi_stm32l432_ec11/keymaps/default/rules.mk create mode 100644 keyboards/keychron/q10/q10_ansi_stm32l432_ec11/keymaps/ducoterra/keymap.c create mode 100644 keyboards/keychron/q10/q10_ansi_stm32l432_ec11/keymaps/ducoterra/rules.mk create mode 100644 keyboards/keychron/q10/q10_ansi_stm32l432_ec11/keymaps/via/keymap.c create mode 100644 keyboards/keychron/q10/q10_ansi_stm32l432_ec11/keymaps/via/rules.mk create mode 100644 keyboards/keychron/q10/q10_ansi_stm32l432_ec11/q10_ansi_stm32l432_ec11.c create mode 100644 keyboards/keychron/q10/q10_ansi_stm32l432_ec11/q10_ansi_stm32l432_ec11.h create mode 100644 keyboards/keychron/q10/q10_ansi_stm32l432_ec11/readme.md create mode 100644 keyboards/keychron/q10/q10_ansi_stm32l432_ec11/rules.mk create mode 100644 keyboards/keychron/q4/q4_ansi_stm32l432/config.h create mode 100644 keyboards/keychron/q4/q4_ansi_stm32l432/info.json create mode 100644 keyboards/keychron/q4/q4_ansi_stm32l432/keymaps/default/keymap.c create mode 100644 keyboards/keychron/q4/q4_ansi_stm32l432/keymaps/ducoterra/keymap.c create mode 100644 keyboards/keychron/q4/q4_ansi_stm32l432/keymaps/via/config.h create mode 100644 keyboards/keychron/q4/q4_ansi_stm32l432/keymaps/via/keymap.c create mode 100644 keyboards/keychron/q4/q4_ansi_stm32l432/keymaps/via/rules.mk create mode 100644 keyboards/keychron/q4/q4_ansi_stm32l432/q4_ansi_stm32l432.c create mode 100644 keyboards/keychron/q4/q4_ansi_stm32l432/q4_ansi_stm32l432.h create mode 100644 keyboards/keychron/q4/q4_ansi_stm32l432/readme.md create mode 100644 keyboards/keychron/q4/q4_ansi_stm32l432/rules.mk diff --git a/keyboards/keychron/q1/rev_0100/config.h b/keyboards/keychron/q1/rev_0100/config.h new file mode 100644 index 0000000000..435f386a59 --- /dev/null +++ b/keyboards/keychron/q1/rev_0100/config.h @@ -0,0 +1,31 @@ +/* Copyright 2021 @ Keychron (https://www.keychron.com) + * + * 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 . + */ + +#pragma once + + +/* USB Device descriptor parameter */ +#define PRODUCT_ID 0x0100 +#define DEVICE_VER 0x0100 + +/* key matrix pins */ +#define MATRIX_ROW_PINS { D3, D2, B3, B2, B1, B0 } +#define MATRIX_COL_PINS { D5, D4, D6, D7, B4, B5, B6, C6, C7, F7, F6, F5, F4, F1, F0 } + +/* RGB Matrix Configuration */ +#define DRIVER_1_LED_TOTAL 59 +#define DRIVER_2_LED_TOTAL 23 +#define DRIVER_LED_TOTAL (DRIVER_1_LED_TOTAL + DRIVER_2_LED_TOTAL) \ No newline at end of file diff --git a/keyboards/keychron/q1/rev_0100/info.json b/keyboards/keychron/q1/rev_0100/info.json new file mode 100644 index 0000000000..dba3320ba7 --- /dev/null +++ b/keyboards/keychron/q1/rev_0100/info.json @@ -0,0 +1,91 @@ +{ + "keyboard_name": "Keychron Q1", + "url": "https://github.com/Keychron", + "maintainer": "lalalademaxiya1", + "layouts": { + "LAYOUT_ansi_82": { + "layout": [{"label":"Esc", "x":0, "y":0}, + {"label":"F1", "x":1.25, "y":0}, + {"label":"F2", "x":2.25, "y":0}, + {"label":"F3", "x":3.25, "y":0}, + {"label":"F4", "x":4.25, "y":0}, + {"label":"F5", "x":5.5, "y":0}, + {"label":"F6", "x":6.5, "y":0}, + {"label":"F7", "x":7.5, "y":0}, + {"label":"F8", "x":8.5, "y":0}, + {"label":"F9", "x":9.75, "y":0}, + {"label":"F10", "x":10.75, "y":0}, + {"label":"F11", "x":11.75, "y":0}, + {"label":"F12", "x":12.75, "y":0}, + {"label":"Delete", "x":14, "y":0}, + {"label":"Insert", "x":15.25, "y":0}, + {"label":"~", "x":0, "y":1}, + {"label":"!", "x":1, "y":1}, + {"label":"@", "x":2, "y":1}, + {"label":"#", "x":3, "y":1}, + {"label":"$", "x":4, "y":1}, + {"label":"%", "x":5, "y":1}, + {"label":"^", "x":6, "y":1}, + {"label":"&", "x":7, "y":1}, + {"label":"*", "x":8, "y":1}, + {"label":"(", "x":9, "y":1}, + {"label":")", "x":10, "y":1}, + {"label":"_", "x":11, "y":1}, + {"label":"+", "x":12, "y":1}, + {"label":"Backspace", "x":13, "y":1, "w":2}, + {"label":"Page Up", "x":15.25, "y":1}, + {"label":"Tab", "x":0, "y":2, "w":1.5}, + {"label":"Q", "x":1.5, "y":2}, + {"label":"W", "x":2.5, "y":2}, + {"label":"E", "x":3.5, "y":2}, + {"label":"R", "x":4.5, "y":2}, + {"label":"T", "x":5.5, "y":2}, + {"label":"Y", "x":6.5, "y":2}, + {"label":"U", "x":7.5, "y":2}, + {"label":"I", "x":8.5, "y":2}, + {"label":"O", "x":9.5, "y":2}, + {"label":"P", "x":10.5, "y":2}, + {"label":"{", "x":11.5, "y":2}, + {"label":"}", "x":12.5, "y":2}, + {"label":"|", "x":13.5, "y":2, "w":1.5}, + {"label":"Page Down", "x":15.25, "y":2}, + {"label":"Caps Lock", "x":0, "y":3, "w":1.75}, + {"label":"A", "x":1.75, "y":3}, + {"label":"S", "x":2.75, "y":3}, + {"label":"D", "x":3.75, "y":3}, + {"label":"F", "x":4.75, "y":3}, + {"label":"G", "x":5.75, "y":3}, + {"label":"H", "x":6.75, "y":3}, + {"label":"J", "x":7.75, "y":3}, + {"label":"K", "x":8.75, "y":3}, + {"label":"L", "x":9.75, "y":3}, + {"label":":", "x":10.75, "y":3}, + {"label":"\"", "x":11.75, "y":3}, + {"label":"Enter", "x":12.75, "y":3, "w":2.25}, + {"label":"Home", "x":15.25, "y":3}, + {"label":"Shift", "x":0, "y":4, "w":2.25}, + {"label":"Z", "x":2.25, "y":4}, + {"label":"X", "x":3.25, "y":4}, + {"label":"C", "x":4.25, "y":4}, + {"label":"V", "x":5.25, "y":4}, + {"label":"B", "x":6.25, "y":4}, + {"label":"N", "x":7.25, "y":4}, + {"label":"M", "x":8.25, "y":4}, + {"label":"<", "x":9.25, "y":4}, + {"label":">", "x":10.25, "y":4}, + {"label":"?", "x":11.25, "y":4}, + {"label":"Shift", "x":12.25, "y":4, "w":1.75}, + {"label":"\u2191", "x":14.25, "y":4.25}, + {"label":"Ctrl", "x":0, "y":5, "w":1.25}, + {"label":"Win", "x":1.25, "y":5, "w":1.25}, + {"label":"Alt", "x":2.5, "y":5, "w":1.25}, + {"x":3.75, "y":5, "w":6.25}, + {"label":"Alt", "x":10, "y":5}, + {"label":"Fn", "x":11, "y":5}, + {"label":"Ctrl", "x":12, "y":5}, + {"label":"\u2190", "x":13.25, "y":5.25}, + {"label":"\u2193", "x":14.25, "y":5.25}, + {"label":"\u2192", "x":15.25, "y":5.25}] + } + } +} diff --git a/keyboards/keychron/q1/rev_0100/keymaps/default/keymap.c b/keyboards/keychron/q1/rev_0100/keymaps/default/keymap.c new file mode 100644 index 0000000000..d1f71e9da6 --- /dev/null +++ b/keyboards/keychron/q1/rev_0100/keymaps/default/keymap.c @@ -0,0 +1,89 @@ +/* Copyright 2021 @ Keychron (https://www.keychron.com) + * + * 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 . + */ + +#include QMK_KEYBOARD_H + +enum layers{ + MAC_BASE, + MAC_FN, + WIN_BASE, + WIN_FN +}; + +enum custom_keycodes { + KC_MISSION_CONTROL = SAFE_RANGE, + KC_LAUNCHPAD +}; + +#define KC_TASK LGUI(KC_TAB) +#define KC_FLXP LGUI(KC_E) +#define KC_MCTL KC_MISSION_CONTROL +#define KC_LPAD KC_LAUNCHPAD + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [MAC_BASE] = LAYOUT_ansi_82( + KC_ESC, KC_BRID, KC_BRIU, KC_MCTL, KC_LPAD, RGB_VAD, RGB_VAI, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, KC_DEL, KC_INS, + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_PGUP, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_PGDN, + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_HOME, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, + KC_LCTL, KC_LALT, KC_LGUI, KC_SPC, KC_RGUI, MO(MAC_FN),KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT), + + [MAC_FN] = LAYOUT_ansi_82( + KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + RGB_TOG, RGB_MOD, RGB_VAI, RGB_HUI, RGB_SAI, RGB_SPI, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, RGB_RMOD, RGB_VAD, RGB_HUD, RGB_SAD, RGB_SPD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), + + [WIN_BASE] = LAYOUT_ansi_82( + KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, KC_INS, + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_PGUP, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_PGDN, + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_HOME, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(WIN_FN),KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT), + + [WIN_FN] = LAYOUT_ansi_82( + KC_TRNS, KC_BRID, KC_BRIU, KC_TASK, KC_FLXP, RGB_VAD, RGB_VAI, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + RGB_TOG, RGB_MOD, RGB_VAI, RGB_HUI, RGB_SAI, RGB_SPI, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, RGB_RMOD, RGB_VAD, RGB_HUD, RGB_SAD, RGB_SPD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS) +}; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case KC_MISSION_CONTROL: + if (record->event.pressed) { + host_consumer_send(0x29F); + } else { + host_consumer_send(0); + } + return false; // Skip all further processing of this key + case KC_LAUNCHPAD: + if (record->event.pressed) { + host_consumer_send(0x2A0); + } else { + host_consumer_send(0); + } + return false; // Skip all further processing of this key + default: + return true; // Process all other keycodes normally + } +} diff --git a/keyboards/keychron/q1/rev_0100/keymaps/ducoterra/keymap.c b/keyboards/keychron/q1/rev_0100/keymaps/ducoterra/keymap.c new file mode 100644 index 0000000000..7f28ea05c9 --- /dev/null +++ b/keyboards/keychron/q1/rev_0100/keymaps/ducoterra/keymap.c @@ -0,0 +1,89 @@ +/* Copyright 2021 @ Keychron (https://www.keychron.com) + * + * 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 . + */ + +#include QMK_KEYBOARD_H + +enum layers{ + MAC_BASE, + MAC_FN, + WIN_BASE, + WIN_FN +}; + +enum custom_keycodes { + KC_MISSION_CONTROL = SAFE_RANGE, + KC_LAUNCHPAD +}; + +#define KC_TASK LGUI(KC_TAB) +#define KC_FLXP LGUI(KC_E) +#define KC_MCTL KC_MISSION_CONTROL +#define KC_LPAD KC_LAUNCHPAD + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [MAC_BASE] = LAYOUT_ansi_82( + KC_ESC, KC_BRID, KC_BRIU, KC_MCTL, KC_LPAD, RGB_VAD, RGB_VAI, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, KC_DEL, KC_INS, + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_PGUP, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_PGDN, + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_HOME, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, + KC_LCTL, KC_LALT, KC_LGUI, KC_SPC, KC_RGUI, MO(MAC_FN),KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT), + + [MAC_FN] = LAYOUT_ansi_82( + KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + RGB_TOG, RGB_MOD, RGB_VAI, RGB_HUI, RGB_SAI, RGB_SPI, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, QK_BOOT, KC_TRNS, + KC_TRNS, RGB_RMOD, RGB_VAD, RGB_HUD, RGB_SAD, RGB_SPD, KC_TRNS, KC_TRNS, KC_UP, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_LEFT, KC_DOWN, KC_RIGHT, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), + + [WIN_BASE] = LAYOUT_ansi_82( + KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, KC_INS, + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_PGUP, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_PGDN, + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_HOME, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(WIN_FN),KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT), + + [WIN_FN] = LAYOUT_ansi_82( + KC_TRNS, KC_BRID, KC_BRIU, KC_TASK, KC_FLXP, RGB_VAD, RGB_VAI, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + RGB_TOG, RGB_MOD, RGB_VAI, RGB_HUI, RGB_SAI, RGB_SPI, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, QK_BOOT, KC_TRNS, + KC_TRNS, RGB_RMOD, RGB_VAD, RGB_HUD, RGB_SAD, RGB_SPD, KC_TRNS, KC_TRNS, KC_UP, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_LEFT, KC_DOWN, KC_RIGHT, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS) +}; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case KC_MISSION_CONTROL: + if (record->event.pressed) { + host_consumer_send(0x29F); + } else { + host_consumer_send(0); + } + return false; // Skip all further processing of this key + case KC_LAUNCHPAD: + if (record->event.pressed) { + host_consumer_send(0x2A0); + } else { + host_consumer_send(0); + } + return false; // Skip all further processing of this key + default: + return true; // Process all other keycodes normally + } +} diff --git a/keyboards/keychron/q1/rev_0100/keymaps/gtg465x/README.md b/keyboards/keychron/q1/rev_0100/keymaps/gtg465x/README.md new file mode 100644 index 0000000000..c2d5799bb8 --- /dev/null +++ b/keyboards/keychron/q1/rev_0100/keymaps/gtg465x/README.md @@ -0,0 +1,21 @@ +# gtg465x's Keychron Q1 keymap + +- On macOS, F3 opens Mission Control and F4 opens Launchpad without needing to configure shortcuts in System Preferences +- RGB lighting turns off when the computer sleeps +- Caps Lock and alpha keys turn red to indicate when Caps Lock is on +- When the Fn layer is active, RGB lighting turns off for keys that are not assigned + +## Changelog + +### 10/3/2021 - 1.0.3 + +- Feature: When the Fn layer is active, RGB lighting turns off for keys that are not assigned + +### 10/1/2021 - 1.0.2 + +- Added Caps Lock indicator (my implementation is different, but this was inspired by mkillewald) +- Mission Control and Launchpad custom keycodes are now defined using the VIA user keycodes range so they can be labeled properly in VIA + +### 9/28/2021 - 1.0.1 + +- Initial release diff --git a/keyboards/keychron/q1/rev_0100/keymaps/gtg465x/config.h b/keyboards/keychron/q1/rev_0100/keymaps/gtg465x/config.h new file mode 100644 index 0000000000..5ac05d04c1 --- /dev/null +++ b/keyboards/keychron/q1/rev_0100/keymaps/gtg465x/config.h @@ -0,0 +1,25 @@ +/* Copyright 2021 @ Grayson Carr + * + * 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 . + */ + +#pragma once + +/* RGB Matrix Configuration */ +#ifdef RGB_MATRIX_ENABLE +# define RGB_DISABLE_WHEN_USB_SUSPENDED +# define CAPS_LOCK_INDICATOR_COLOR RGB_RED +# define CAPS_LOCK_INDICATOR_LIGHT_ALPHAS +# define FN_LAYER_TRANSPARENT_KEYS_OFF +#endif diff --git a/keyboards/keychron/q1/rev_0100/keymaps/gtg465x/keymap.c b/keyboards/keychron/q1/rev_0100/keymaps/gtg465x/keymap.c new file mode 100644 index 0000000000..7f806f6b45 --- /dev/null +++ b/keyboards/keychron/q1/rev_0100/keymaps/gtg465x/keymap.c @@ -0,0 +1,102 @@ +/* Copyright 2021 @ Grayson Carr + * + * 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 . + */ + +#include QMK_KEYBOARD_H +#include "keymap_user.h" +#ifdef RGB_MATRIX_ENABLE +# include "rgb_matrix_user.h" +#endif + +// clang-format off + +enum custom_keycodes { +#ifdef VIA_ENABLE + KC_MISSION_CONTROL = USER00, +#else + KC_MISSION_CONTROL = SAFE_RANGE, +#endif + KC_LAUNCHPAD +}; + +#define KC_MCTL KC_MISSION_CONTROL +#define KC_LPAD KC_LAUNCHPAD +#define KC_TASK LGUI(KC_TAB) +#define KC_FLXP LGUI(KC_E) + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +[MAC_BASE] = LAYOUT_ansi_82( + KC_ESC, KC_BRID, KC_BRIU, KC_MCTL, KC_LPAD, RGB_VAD, RGB_VAI, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, KC_DEL, KC_INS, + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_PGUP, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_PGDN, + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_HOME, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, + KC_LCTL, KC_LALT, KC_LGUI, KC_SPC, KC_RGUI, MO(MAC_FN),KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT), + +[MAC_FN] = LAYOUT_ansi_82( + KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + RGB_TOG, RGB_MOD, RGB_VAI, RGB_HUI, RGB_SAI, RGB_SPI, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, RGB_RMOD, RGB_VAD, RGB_HUD, RGB_SAD, RGB_SPD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), + +[WIN_BASE] = LAYOUT_ansi_82( + KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, KC_INS, + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_PGUP, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_PGDN, + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_HOME, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(WIN_FN),KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT), + +[WIN_FN] = LAYOUT_ansi_82( + KC_TRNS, KC_BRID, KC_BRIU, KC_TASK, KC_FLXP, RGB_VAD, RGB_VAI, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + RGB_TOG, RGB_MOD, RGB_VAI, RGB_HUI, RGB_SAI, RGB_SPI, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, RGB_RMOD, RGB_VAD, RGB_HUD, RGB_SAD, RGB_SPD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS) + +}; + +// clang-format on + +void matrix_init_user(void) { +#ifdef RGB_MATRIX_ENABLE + rgb_matrix_init_user(); +#endif +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case KC_MISSION_CONTROL: + if (record->event.pressed) { + host_consumer_send(0x29F); + } else { + host_consumer_send(0); + } + return false; // Skip all further processing of this key + case KC_LAUNCHPAD: + if (record->event.pressed) { + host_consumer_send(0x2A0); + } else { + host_consumer_send(0); + } + return false; // Skip all further processing of this key + default: + return true; // Process all other keycodes normally + } +} diff --git a/keyboards/keychron/q1/rev_0100/keymaps/gtg465x/keymap_user.h b/keyboards/keychron/q1/rev_0100/keymaps/gtg465x/keymap_user.h new file mode 100644 index 0000000000..728114d556 --- /dev/null +++ b/keyboards/keychron/q1/rev_0100/keymaps/gtg465x/keymap_user.h @@ -0,0 +1,28 @@ +/* Copyright 2021 @ Grayson Carr + * + * 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 . + */ + +#pragma once + +// clang-format off + +enum layers { + MAC_BASE, + MAC_FN, + WIN_BASE, + WIN_FN +}; + +// clang-format on diff --git a/keyboards/keychron/q1/rev_0100/keymaps/gtg465x/rgb_matrix_user.c b/keyboards/keychron/q1/rev_0100/keymaps/gtg465x/rgb_matrix_user.c new file mode 100644 index 0000000000..9bc7231ece --- /dev/null +++ b/keyboards/keychron/q1/rev_0100/keymaps/gtg465x/rgb_matrix_user.c @@ -0,0 +1,71 @@ +/* Copyright 2021 @ Grayson Carr + * + * 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 . + */ + +#include QMK_KEYBOARD_H +#include "rgb_matrix_user.h" +#include "keymap_user.h" + +keypos_t led_index_key_position[DRIVER_LED_TOTAL]; + +void rgb_matrix_init_user(void) { + for (uint8_t row = 0; row < MATRIX_ROWS; row++) { + for (uint8_t col = 0; col < MATRIX_COLS; col++) { + uint8_t led_index = g_led_config.matrix_co[row][col]; + if (led_index != NO_LED) { + led_index_key_position[led_index] = (keypos_t){.row = row, .col = col}; + } + } + } +} + +void rgb_matrix_indicators_advanced_user(uint8_t led_min, uint8_t led_max) { + uint8_t current_layer = get_highest_layer(layer_state); + switch (current_layer) { + case MAC_BASE: + case WIN_BASE: +#ifdef CAPS_LOCK_INDICATOR_COLOR + if (host_keyboard_led_state().caps_lock) { + rgb_matrix_set_color_by_keycode(led_min, led_max, current_layer, is_caps_lock_indicator, CAPS_LOCK_INDICATOR_COLOR); + } +#endif + break; + case MAC_FN: + case WIN_FN: +#ifdef FN_LAYER_TRANSPARENT_KEYS_OFF + rgb_matrix_set_color_by_keycode(led_min, led_max, current_layer, is_transparent, RGB_OFF); +#endif + break; + } +} + +void rgb_matrix_set_color_by_keycode(uint8_t led_min, uint8_t led_max, uint8_t layer, bool (*is_keycode)(uint16_t), uint8_t red, uint8_t green, uint8_t blue) { + for (uint8_t i = led_min; i < led_max; i++) { + uint16_t keycode = keymap_key_to_keycode(layer, led_index_key_position[i]); + if ((*is_keycode)(keycode)) { + rgb_matrix_set_color(i, red, green, blue); + } + } +} + +bool is_caps_lock_indicator(uint16_t keycode) { +#ifdef CAPS_LOCK_INDICATOR_LIGHT_ALPHAS + return (KC_A <= keycode && keycode <= KC_Z) || keycode == KC_CAPS; +#else + return keycode == KC_CAPS; +#endif +} + +bool is_transparent(uint16_t keycode) { return keycode == KC_TRNS; } diff --git a/keyboards/keychron/q1/rev_0100/keymaps/gtg465x/rgb_matrix_user.h b/keyboards/keychron/q1/rev_0100/keymaps/gtg465x/rgb_matrix_user.h new file mode 100644 index 0000000000..dead454167 --- /dev/null +++ b/keyboards/keychron/q1/rev_0100/keymaps/gtg465x/rgb_matrix_user.h @@ -0,0 +1,24 @@ +/* Copyright 2021 @ Grayson Carr + * + * 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 . + */ + +#pragma once + +void rgb_matrix_init_user(void); + +void rgb_matrix_set_color_by_keycode(uint8_t led_min, uint8_t led_max, uint8_t layer, bool (*is_keycode)(uint16_t), uint8_t red, uint8_t green, uint8_t blue); + +bool is_caps_lock_indicator(uint16_t keycode); +bool is_transparent(uint16_t keycode); diff --git a/keyboards/keychron/q1/rev_0100/keymaps/gtg465x/rules.mk b/keyboards/keychron/q1/rev_0100/keymaps/gtg465x/rules.mk new file mode 100644 index 0000000000..42ba38028d --- /dev/null +++ b/keyboards/keychron/q1/rev_0100/keymaps/gtg465x/rules.mk @@ -0,0 +1,6 @@ +VIA_ENABLE = yes +MOUSEKEY_ENABLE = no + +ifeq ($(strip $(RGB_MATRIX_ENABLE)), yes) + SRC += rgb_matrix_user.c +endif diff --git a/keyboards/keychron/q1/rev_0100/keymaps/mkillewald/config.h b/keyboards/keychron/q1/rev_0100/keymaps/mkillewald/config.h new file mode 100644 index 0000000000..bc9fe405c3 --- /dev/null +++ b/keyboards/keychron/q1/rev_0100/keymaps/mkillewald/config.h @@ -0,0 +1,23 @@ +/* Copyright 2021 @ Mike Killewald + * + * 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 . + */ + +#pragma once + +#ifdef RGB_MATRIX_ENABLE +# define RGB_DISABLE_WHEN_USB_SUSPENDED +# define CAPS_LOCK_INDICATOR_COLOR RGB_RED +# define FN_LAYER_COLOR RGB_ORANGE +#endif \ No newline at end of file diff --git a/keyboards/keychron/q1/rev_0100/keymaps/mkillewald/keymap.c b/keyboards/keychron/q1/rev_0100/keymaps/mkillewald/keymap.c new file mode 100644 index 0000000000..937b20ee10 --- /dev/null +++ b/keyboards/keychron/q1/rev_0100/keymaps/mkillewald/keymap.c @@ -0,0 +1,175 @@ +/* Copyright 2021 @ Mike Killewald + * + * 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 . + */ + +#include QMK_KEYBOARD_H +#include "keymap_user.h" +#ifdef RGB_MATRIX_ENABLE +# include "rgb_matrix_user.h" +#endif + +// clang-format off + +typedef union { + uint32_t raw; + struct { + bool caps_lock_light_tab :1; + bool caps_lock_light_alphas :1; + bool fn_layer_transparent_keys_off :1; + bool fn_layer_color_enable :1; + }; +} user_config_t; + +user_config_t user_config; + +enum custom_keycodes { +#ifdef VIA_ENABLE + KC_MISSION_CONTROL = USER00, +#else + KC_MISSION_CONTROL = SAFE_RANGE, +#endif + KC_LAUNCHPAD, + KC_LIGHT_TAB_TOGGLE, + KC_LIGHT_ALPHAS_TOGGLE, + KC_FN_LAYER_TRANSPARENT_KEYS_TOGGLE, + KC_FN_LAYER_COLOR_TOGGLE +}; + +#define KC_MCTL KC_MISSION_CONTROL +#define KC_LPAD KC_LAUNCHPAD +#define KC_LTTOG KC_LIGHT_TAB_TOGGLE +#define KC_LATOG KC_LIGHT_ALPHAS_TOGGLE +#define KC_TKTOG KC_FN_LAYER_TRANSPARENT_KEYS_TOGGLE +#define KC_FCTOG KC_FN_LAYER_COLOR_TOGGLE +#define KC_TASK LGUI(KC_TAB) +#define KC_FLXP LGUI(KC_E) + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + +[MAC_BASE] = LAYOUT_ansi_82( + KC_ESC, KC_BRID, KC_BRIU, KC_MCTL, KC_LPAD, RGB_VAD, RGB_VAI, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, KC_DEL, KC_INS, + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_PGUP, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_PGDN, + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_HOME, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, + KC_LCTL, KC_LALT, KC_LGUI, KC_SPC, KC_RGUI, MO(MAC_FN),KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT), + +[MAC_FN] = LAYOUT_ansi_82( + KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + RGB_TOG, RGB_MOD, RGB_VAI, RGB_HUI, RGB_SAI, RGB_SPI, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, RGB_RMOD, RGB_VAD, RGB_HUD, RGB_SAD, RGB_SPD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_LTTOG, KC_LATOG, KC_TKTOG, KC_FCTOG, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), + +[WIN_BASE] = LAYOUT_ansi_82( + KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, KC_INS, + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_PGUP, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_PGDN, + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_HOME, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(WIN_FN),KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT), + +[WIN_FN] = LAYOUT_ansi_82( + KC_TRNS, KC_BRID, KC_BRIU, KC_TASK, KC_FLXP, RGB_VAD, RGB_VAI, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + RGB_TOG, RGB_MOD, RGB_VAI, RGB_HUI, RGB_SAI, RGB_SPI, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, RGB_RMOD, RGB_VAD, RGB_HUD, RGB_SAD, RGB_SPD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_LTTOG, KC_LATOG, KC_TKTOG, KC_FCTOG, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS) + +}; + +// clang-format on + +void matrix_init_user(void) { +#ifdef RGB_MATRIX_ENABLE + rgb_matrix_init_user(); +#endif +} + +void keyboard_post_init_user(void) { + user_config.raw = eeconfig_read_user(); +} + +void eeconfig_init_user(void) { + user_config.raw = 0; + user_config.caps_lock_light_tab = false; + user_config.caps_lock_light_alphas = false; + user_config.fn_layer_transparent_keys_off = true; + user_config.fn_layer_color_enable = false; + eeconfig_update_user(user_config.raw); +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case KC_MISSION_CONTROL: + if (record->event.pressed) { + host_consumer_send(0x29F); + } else { + host_consumer_send(0); + } + return false; // Skip all further processing of this key + case KC_LAUNCHPAD: + if (record->event.pressed) { + host_consumer_send(0x2A0); + } else { + host_consumer_send(0); + } + return false; // Skip all further processing of this key + case KC_LIGHT_TAB_TOGGLE: + if (record->event.pressed) { + user_config.caps_lock_light_tab ^= 1; // bitwise xor to toggle status bit + eeconfig_update_user(user_config.raw); + } + return false; // Skip all further processing of this key + case KC_LIGHT_ALPHAS_TOGGLE: + if (record->event.pressed) { + user_config.caps_lock_light_alphas ^= 1; + eeconfig_update_user(user_config.raw); + } + return false; // Skip all further processing of this key + case KC_FN_LAYER_TRANSPARENT_KEYS_TOGGLE: + if (record->event.pressed) { + user_config.fn_layer_transparent_keys_off ^= 1; + eeconfig_update_user(user_config.raw); + } + return false; // Skip all further processing of this key + case KC_FN_LAYER_COLOR_TOGGLE: + if (record->event.pressed) { + user_config.fn_layer_color_enable ^= 1; + eeconfig_update_user(user_config.raw); + } + return false; // Skip all further processing of this key + default: + return true; // Process all other keycodes normally + } +} + +bool get_caps_lock_light_tab(void) { + return user_config.caps_lock_light_tab; +} + +bool get_caps_lock_light_alphas(void) { + return user_config.caps_lock_light_alphas; +} + +bool get_fn_layer_transparent_keys_off(void) { + return user_config.fn_layer_transparent_keys_off; +} + +bool get_fn_layer_color_enable(void) { + return user_config.fn_layer_color_enable; +} \ No newline at end of file diff --git a/keyboards/keychron/q1/rev_0100/keymaps/mkillewald/keymap_user.h b/keyboards/keychron/q1/rev_0100/keymaps/mkillewald/keymap_user.h new file mode 100644 index 0000000000..87b1baf47f --- /dev/null +++ b/keyboards/keychron/q1/rev_0100/keymaps/mkillewald/keymap_user.h @@ -0,0 +1,33 @@ +/* Copyright 2021 @ Mike Killewald + * + * 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 . + */ + +#pragma once + +// clang-format off + +enum layers { + MAC_BASE, + MAC_FN, + WIN_BASE, + WIN_FN +}; + +// clang-format on + +bool get_caps_lock_light_tab(void); +bool get_caps_lock_light_alphas(void); +bool get_fn_layer_transparent_keys_off(void); +bool get_fn_layer_color_enable(void); \ No newline at end of file diff --git a/keyboards/keychron/q1/rev_0100/keymaps/mkillewald/readme.md b/keyboards/keychron/q1/rev_0100/keymaps/mkillewald/readme.md new file mode 100644 index 0000000000..f8d5de012f --- /dev/null +++ b/keyboards/keychron/q1/rev_0100/keymaps/mkillewald/readme.md @@ -0,0 +1,54 @@ +## mkillewald's Keychron Q1 keymap (ANSI rev_0100) v1.0.4 + +This keymap builds on the keymap by Grayson Carr (gtg465x) but adds a couple options. + +## Features: +- On macOS, F3 opens Mission Control and F4 opens Launchpad without needing to configure shortcuts in System Preferences +- RGB lighting turns off when the computer sleeps +- Caps Lock RGB indicator + - the Caps Lock key will light when Caps Lock is enabled with the following options: + - #define CAPS_LOCK_INDICATOR_COLOR [color] in config.h to set the backlight color used for the indicator when Caps Lock is enabled (default: red) + - Fn+Z will toggle lighting the TAB key when Caps Lock is enabled. This is useful with non backlit keycaps/legends. (default: off) + - Fn+X will toggle lighting all the alpha keys when Caps Lock is enabled. (default: off) + +- Dynamic Fn layer RGB indicator + - When the Fn key is held down, any keys defined on the Fn layer in this firmware or in VIA will be highlighted with the following options: + - #define FN_LAYER_COLOR [color] in config.h to set a static color for defined keys (default: orange) + - Fn+C will toggle turning off RGB for keys with no definition (default: RGB off) + - Fn+V will toggle lighting the defined Fn layer keys with the static color set with FN_LAYER_COLOR (default: static color off) + +- All custom keycodes can be moved to different keys in VIA by using the ANY key with the following keycodes: + - USER00 (default: F3) macOS Mission Control + - USER01 (default: F4) macOS Launchpad + - USER02 (default: Fn+Z) Caps Lock light Tab toggle + - USER03 (default: Fn+X) Caps Lock light alphas toggle + - USER04 (default: Fn+C) Fn layer non-defined keys RGB toggle + - USER05 (default: Fn+V) Fn layer defined keys static color toggle + +RGB must be toggled on for all indicators to function. If you do not want an RGB mode active but still want the indicators, toggle RGB on and turn the brightness all the way off. The indicators will remain at full brightness. + +Please make sure to save any customizations you have made in VIA to a .json file before flashing the firmware. Sometimes it has been necessary to re-apply those changes in VIA after flashing the firmware. If that is the case, you will most likely need to manually add the USER00 through USER05 custom keycodes after loading your customizations from the saved .json file. Then re-save a new .json file which will have your previous customizations and the custom keycodes for future use as needed. + +#### USE AT YOUR OWN RISK + +## Changelog: + +v1.0.4 October 9, 2021 +- Caps Lock and Fn layer toggles are now stored in eeprom so settings will remain when Q1 is unplugged + +v1.0.3 October 8, 2021 +- now using keycode toggles instead of preprocessor directive to set the various Caps Lock and Fn Layer RGB lighting options. This allows for setting the options from user space without having to recompile. + +v1.0.2 October 7, 2021 +- adapted Grayson Carr's (gtg465x) Caps Lock alphas and dynamic Fn layer RGB routines +- added CAPS_LOCK_INDICATOR_LIGHT_TAB config option to enable/disable lighting Tab with Caps Lock indicator +- added FN_LAYER_COLOR config option to set FN layer static color + +v1.0.1 October 7, 2021 +- Mission Control and Launchpad custom keycodes are now defined using the VIA user keycodes range so thay can be labeled properly in VIA (adopted change from gtg465x) + +v1.0.0 September 30, 2021 +- Initial release built upon keymap by Grayson Carr (gtg465x) +- defined Mission Control (F3) and Launchpad (F4) keycodes for macOs +- RGB backlight turns off when computer sleeps +- added Caps Lock indicator lighting both the Caps Lock and Tab LEDs for better effect on non-backlit keycaps diff --git a/keyboards/keychron/q1/rev_0100/keymaps/mkillewald/rgb_matrix_user.c b/keyboards/keychron/q1/rev_0100/keymaps/mkillewald/rgb_matrix_user.c new file mode 100644 index 0000000000..f06039af06 --- /dev/null +++ b/keyboards/keychron/q1/rev_0100/keymaps/mkillewald/rgb_matrix_user.c @@ -0,0 +1,83 @@ +/* Copyright 2021 @ Mike Killewald + * + * 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 . + */ + +#include QMK_KEYBOARD_H +#include "rgb_matrix_user.h" +#include "keymap_user.h" + +keypos_t led_index_key_position[DRIVER_LED_TOTAL]; + +void rgb_matrix_init_user(void) { + for (uint8_t row = 0; row < MATRIX_ROWS; row++) { + for (uint8_t col = 0; col < MATRIX_COLS; col++) { + uint8_t led_index = g_led_config.matrix_co[row][col]; + if (led_index != NO_LED) { + led_index_key_position[led_index] = (keypos_t){.row = row, .col = col}; + } + } + } +} + +void rgb_matrix_indicators_advanced_user(uint8_t led_min, uint8_t led_max) { + uint8_t current_layer = get_highest_layer(layer_state); + switch (current_layer) { + case MAC_BASE: + case WIN_BASE: +#ifdef CAPS_LOCK_INDICATOR_COLOR + if (host_keyboard_led_state().caps_lock) { + rgb_matrix_set_color_by_keycode(led_min, led_max, current_layer, is_caps_lock_indicator, CAPS_LOCK_INDICATOR_COLOR); + } +#endif + break; + case MAC_FN: + case WIN_FN: +#ifdef FN_LAYER_COLOR + if (get_fn_layer_color_enable()) { + rgb_matrix_set_color_by_keycode(led_min, led_max, current_layer, is_not_transparent, FN_LAYER_COLOR); + } +#endif + if (get_fn_layer_transparent_keys_off()) { + rgb_matrix_set_color_by_keycode(led_min, led_max, current_layer, is_transparent, RGB_OFF); + } + break; + } +} + +void rgb_matrix_set_color_by_keycode(uint8_t led_min, uint8_t led_max, uint8_t layer, bool (*is_keycode)(uint16_t), uint8_t red, uint8_t green, uint8_t blue) { + for (uint8_t i = led_min; i < led_max; i++) { + uint16_t keycode = keymap_key_to_keycode(layer, led_index_key_position[i]); + if ((*is_keycode)(keycode)) { + rgb_matrix_set_color(i, red, green, blue); + } + } +} + +bool is_caps_lock_indicator(uint16_t keycode) { + bool indicator = keycode == KC_CAPS; + + if (get_caps_lock_light_tab()) { + indicator = keycode == KC_TAB || keycode == KC_CAPS; + } + + if (get_caps_lock_light_alphas()) { + return (KC_A <= keycode && keycode <= KC_Z) || indicator; + } else { + return indicator; + } +} + +bool is_transparent(uint16_t keycode) { return keycode == KC_TRNS; } +bool is_not_transparent(uint16_t keycode) { return keycode != KC_TRNS; } \ No newline at end of file diff --git a/keyboards/keychron/q1/rev_0100/keymaps/mkillewald/rgb_matrix_user.h b/keyboards/keychron/q1/rev_0100/keymaps/mkillewald/rgb_matrix_user.h new file mode 100644 index 0000000000..1fb79c0b2a --- /dev/null +++ b/keyboards/keychron/q1/rev_0100/keymaps/mkillewald/rgb_matrix_user.h @@ -0,0 +1,26 @@ +/* Copyright 2021 @ Mike Killewald + * + * 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 . + */ + +#pragma once + +void rgb_matrix_init_user(void); + +void rgb_matrix_set_color_by_keycode(uint8_t led_min, uint8_t led_max, uint8_t layer, bool (*is_keycode)(uint16_t), uint8_t red, uint8_t green, uint8_t blue); + +bool is_caps_lock_indicator(uint16_t keycode); +bool is_transparent(uint16_t keycode); +bool is_not_transparent(uint16_t keycode); + diff --git a/keyboards/keychron/q1/rev_0100/keymaps/mkillewald/rules.mk b/keyboards/keychron/q1/rev_0100/keymaps/mkillewald/rules.mk new file mode 100644 index 0000000000..af720e37ee --- /dev/null +++ b/keyboards/keychron/q1/rev_0100/keymaps/mkillewald/rules.mk @@ -0,0 +1,6 @@ +VIA_ENABLE = yes +MOUSEKEY_ENABLE = no + +ifeq ($(strip $(RGB_MATRIX_ENABLE)), yes) + SRC += rgb_matrix_user.c +endif \ No newline at end of file diff --git a/keyboards/keychron/q1/rev_0100/keymaps/teimor/config.h b/keyboards/keychron/q1/rev_0100/keymaps/teimor/config.h new file mode 100644 index 0000000000..c3c10a1c2b --- /dev/null +++ b/keyboards/keychron/q1/rev_0100/keymaps/teimor/config.h @@ -0,0 +1,32 @@ +/* Copyright 2022 @ Teimor Epstein + * + * 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 . + */ + +#pragma once + +#undef TAPPING_TERM +#define TAPPING_TERM 200 + +/* RGB Matrix Configuration */ +#ifdef RGB_MATRIX_ENABLE +# define RGB_DISABLE_WHEN_USB_SUSPENDED +# define MAC_LAYER_DEFAULT_COLOR RGB_CYAN +# define WIN_LAYER_DEFAULT_COLOR RGB_GREEN +# define CAPS_LOCK_INDICATOR_COLOR RGB_RED +# define CAPS_LOCK_INDICATOR_LIGHT_60 +# define FN_LAYER_TRANSPARENT_KEYS_OFF +# define RGB_MATRIX_STARTUP_MODE RGB_MATRIX_SOLID_COLOR // Sets the default mode, if none has been set +# define RGB_MATRIX_STARTUP_VAL RGB_MATRIX_MAXIMUM_BRIGHTNESS // Sets the default brightness value, if none has been set +#endif diff --git a/keyboards/keychron/q1/rev_0100/keymaps/teimor/keymap.c b/keyboards/keychron/q1/rev_0100/keymaps/teimor/keymap.c new file mode 100644 index 0000000000..366bf02eba --- /dev/null +++ b/keyboards/keychron/q1/rev_0100/keymaps/teimor/keymap.c @@ -0,0 +1,95 @@ +/* Copyright 2022 @ Teimor Epstein + * + * 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 . + */ + +#include QMK_KEYBOARD_H +#include "keymap_user.h" +#ifdef RGB_MATRIX_ENABLE +# include "rgb_matrix_user.h" +#endif + +// clang-format off + +enum custom_keycodes { + KC_MISSION_CONTROL = USER00, + KC_LAUNCHPAD, +}; + +#define KC_MCTL KC_MISSION_CONTROL +#define KC_LPAD KC_LAUNCHPAD +#define TG_NKRO MAGIC_TOGGLE_NKRO + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [MAC_BASE] = LAYOUT_ansi_82( + KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, KC_HOME, + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_END, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_PGUP, + KC_LGMAC, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_PGDN, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, + KC_LCTL, KC_LALT, KC_LGUI, KC_SPC, KC_RGUI, KC_MACFN, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT), + + [MAC_FN] = LAYOUT_ansi_82( + _______, KC_BRID, KC_BRIU, KC_MCTL, KC_LPAD, RGB_VAD, RGB_VAI, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, KC_MACPS, KC_INS, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + RGB_TOG, RGB_MOD, RGB_VAI, RGB_HUI, RGB_SAI, RGB_SPI, _______, _______, _______, _______, _______, _______, _______, RESET, _______, + KC_CAPS, RGB_RMOD, RGB_VAD, RGB_HUD, RGB_SAD, RGB_SPD, _______, _______, _______, KC_LMAC, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, TG_NKRO, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______), + + [WIN_BASE] = LAYOUT_ansi_82( + KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, KC_HOME, + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_END, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_PGUP, + KC_LGWIN, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_PGDN, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_WINFN, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT), + + [WIN_FN] = LAYOUT_ansi_82( + _______, KC_BRID, KC_BRIU, KC_TASK, KC_FLXP, RGB_VAD, RGB_VAI, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, KC_PSCR, KC_INS, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + RGB_TOG, RGB_MOD, RGB_VAI, RGB_HUI, RGB_SAI, RGB_SPI, _______, _______, _______, _______, _______, _______, _______, RESET, _______, + KC_CAPS, RGB_RMOD, RGB_VAD, RGB_HUD, RGB_SAD, RGB_SPD, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, TG_NKRO, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______) +}; + +// clang-format on + +void matrix_init_user(void) { +#ifdef RGB_MATRIX_ENABLE + rgb_matrix_init_user(); +#endif +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case KC_MISSION_CONTROL: + if (record->event.pressed) { + host_consumer_send(0x29F); + } else { + host_consumer_send(0); + } + return false; // Skip all further processing of this key + case KC_LAUNCHPAD: + if (record->event.pressed) { + host_consumer_send(0x2A0); + } else { + host_consumer_send(0); + } + return false; // Skip all further processing of this key + default: + return true; // Process all other keycodes normally + } +} diff --git a/keyboards/keychron/q1/rev_0100/keymaps/teimor/keymap_user.h b/keyboards/keychron/q1/rev_0100/keymaps/teimor/keymap_user.h new file mode 100644 index 0000000000..57ac5258c2 --- /dev/null +++ b/keyboards/keychron/q1/rev_0100/keymaps/teimor/keymap_user.h @@ -0,0 +1,48 @@ +/* Copyright 2022 @ Teimor Epstein + * + * 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 . + */ + +#pragma once + +// clang-format off + +enum layers { + MAC_BASE, + MAC_FN, + WIN_BASE, + WIN_FN +}; + +// clang-format on + +// Tap dance enums +enum { + MAC_CAPS_LANGUAGE_CHANGE, + WIN_CAPS_LANGUAGE_CHANGE, +}; + +#ifdef TAP_DANCE_ENABLE +# define KC_LGMAC TD(MAC_CAPS_LANGUAGE_CHANGE) +# define KC_LGWIN TD(WIN_CAPS_LANGUAGE_CHANGE) +#else +# define KC_LGMAC KC_CAPS +# define KC_LGWIN KC_CAPS +#endif +#define KC_MACFN MO(MAC_FN) +#define KC_WINFN MO(WIN_FN) +#define KC_LMAC C(G(KC_Q)) +#define KC_MACPS G(S(KC_5)) +#define KC_TASK G(KC_TAB) +#define KC_FLXP G(KC_E) diff --git a/keyboards/keychron/q1/rev_0100/keymaps/teimor/readme.md b/keyboards/keychron/q1/rev_0100/keymaps/teimor/readme.md new file mode 100644 index 0000000000..9aa16f9a89 --- /dev/null +++ b/keyboards/keychron/q1/rev_0100/keymaps/teimor/readme.md @@ -0,0 +1,13 @@ +# teimor's Keychron Q1 keymap + +- Via Enabled. +- Tap dance enabled. +- On macOS, F3 opens Mission Control and F4 opens Launchpad without needing to configure shortcuts in System Preferences. +- RGB lighting turns off when the computer sleeps. +- The RGB lighting for keys that are not assigned turns off when the Fn layer is active +- 60% layout turns red to indicate when Caps Lock is on. +- Windows and macOS: A single tap will quickly change the language, and holding will trigger Caps Lock. (Using Tap Dance) +- RGB Matrix based on layout - macOS base layout will turn on cyan color, Windows base layout will turn on green color. +- `fn + N` will toggle NKRO, useful when using the keyboard on freebsd. +- `fn + L` on macOS will lock the system. +- `fn + del` will trigger screenshot on macOS and Windows. diff --git a/keyboards/keychron/q1/rev_0100/keymaps/teimor/rgb_matrix_user.c b/keyboards/keychron/q1/rev_0100/keymaps/teimor/rgb_matrix_user.c new file mode 100644 index 0000000000..77f1c1011b --- /dev/null +++ b/keyboards/keychron/q1/rev_0100/keymaps/teimor/rgb_matrix_user.c @@ -0,0 +1,91 @@ +/* Copyright 2022 @ Teimor Epstein + * + * 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 . + */ + +#include QMK_KEYBOARD_H +#include "rgb_matrix_user.h" +#include "keymap_user.h" + +keypos_t led_index_key_position[DRIVER_LED_TOTAL]; + +void rgb_matrix_init_user(void) { + for (uint8_t row = 0; row < MATRIX_ROWS; row++) { + for (uint8_t col = 0; col < MATRIX_COLS; col++) { + uint8_t led_index = g_led_config.matrix_co[row][col]; + if (led_index != NO_LED) { + led_index_key_position[led_index] = (keypos_t){.row = row, .col = col}; + } + } + } +} + +void rgb_matrix_indicators_advanced_user(uint8_t led_min, uint8_t led_max) { + uint8_t current_layer = get_highest_layer(layer_state | default_layer_state); + switch (current_layer) { + case MAC_BASE: + case WIN_BASE: +#if defined CAPS_LOCK_INDICATOR_COLOR && defined MAC_LAYER_DEFAULT_COLOR && defined WIN_LAYER_DEFAULT_COLOR + if (host_keyboard_led_state().caps_lock) { + rgb_matrix_set_color_by_keycode(led_min, led_max, current_layer, is_caps_lock_indicator, CAPS_LOCK_INDICATOR_COLOR); + } else if (current_layer == MAC_BASE) + rgb_matrix_set_color_all(MAC_LAYER_DEFAULT_COLOR); + else if (current_layer == WIN_BASE) + rgb_matrix_set_color_all(WIN_LAYER_DEFAULT_COLOR); +#endif + break; + case MAC_FN: + case WIN_FN: +#if defined MAC_LAYER_DEFAULT_COLOR && defined WIN_LAYER_DEFAULT_COLOR + if (current_layer == MAC_FN) { + rgb_matrix_set_color_by_keycode(led_min, led_max, current_layer, is_not_transparent, MAC_LAYER_DEFAULT_COLOR); + } else if (current_layer == WIN_FN) { + rgb_matrix_set_color_by_keycode(led_min, led_max, current_layer, is_not_transparent, WIN_LAYER_DEFAULT_COLOR); + } +#endif +#ifdef FN_LAYER_TRANSPARENT_KEYS_OFF + rgb_matrix_set_color_by_keycode(led_min, led_max, current_layer, is_transparent, RGB_OFF); +#endif + break; + } +} + +void rgb_matrix_set_color_by_keycode(uint8_t led_min, uint8_t led_max, uint8_t layer, bool (*is_keycode)(uint16_t), uint8_t red, uint8_t green, uint8_t blue) { + for (uint8_t i = led_min; i < led_max; i++) { + uint16_t keycode = keymap_key_to_keycode(layer, led_index_key_position[i]); + if ((*is_keycode)(keycode)) { + rgb_matrix_set_color(i, red, green, blue); + } +#if defined MAC_LAYER_DEFAULT_COLOR && defined WIN_LAYER_DEFAULT_COLOR + else { + if (layer == MAC_BASE) + rgb_matrix_set_color(i, MAC_LAYER_DEFAULT_COLOR); + else if (layer == WIN_BASE) + rgb_matrix_set_color(i, WIN_LAYER_DEFAULT_COLOR); + } +#endif + } +} + +bool is_caps_lock_indicator(uint16_t keycode) { + bool indicator = keycode == KC_CAPS || keycode == KC_LGMAC || keycode == KC_LGWIN; +#ifdef CAPS_LOCK_INDICATOR_LIGHT_60 + return (KC_A <= keycode && keycode <= KC_CAPS) || (KC_LEFT_CTRL <= keycode && keycode <= KC_RIGHT_GUI) || keycode == KC_MACFN || keycode == KC_WINFN || indicator; +#else + return indicator; +#endif +} + +bool is_transparent(uint16_t keycode) { return keycode == KC_TRNS; } +bool is_not_transparent(uint16_t keycode) { return keycode != KC_TRNS; } diff --git a/keyboards/keychron/q1/rev_0100/keymaps/teimor/rgb_matrix_user.h b/keyboards/keychron/q1/rev_0100/keymaps/teimor/rgb_matrix_user.h new file mode 100644 index 0000000000..5b53b5b8ec --- /dev/null +++ b/keyboards/keychron/q1/rev_0100/keymaps/teimor/rgb_matrix_user.h @@ -0,0 +1,25 @@ +/* Copyright 2022 @ Teimor Epstein + * + * 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 . + */ + +#pragma once + +void rgb_matrix_init_user(void); + +void rgb_matrix_set_color_by_keycode(uint8_t led_min, uint8_t led_max, uint8_t layer, bool (*is_keycode)(uint16_t), uint8_t red, uint8_t green, uint8_t blue); + +bool is_caps_lock_indicator(uint16_t keycode); +bool is_transparent(uint16_t keycode); +bool is_not_transparent(uint16_t keycode); diff --git a/keyboards/keychron/q1/rev_0100/keymaps/teimor/rules.mk b/keyboards/keychron/q1/rev_0100/keymaps/teimor/rules.mk new file mode 100644 index 0000000000..bafb40484b --- /dev/null +++ b/keyboards/keychron/q1/rev_0100/keymaps/teimor/rules.mk @@ -0,0 +1,14 @@ +VIA_ENABLE = yes +MOUSEKEY_ENABLE = no +TAP_DANCE_ENABLE = yes + +ifeq ($(strip $(RGB_MATRIX_ENABLE)), yes) + SRC += rgb_matrix_user.c +endif + +ifeq ($(strip $(TAP_DANCE_ENABLE)), yes) + SRC += tap_dance_user.c + SRC += tap_dance_setup.c + SRC += tap_dance_mac_caps.c + SRC += tap_dance_win_caps.c +endif diff --git a/keyboards/keychron/q1/rev_0100/keymaps/teimor/tap_dance_mac_caps.c b/keyboards/keychron/q1/rev_0100/keymaps/teimor/tap_dance_mac_caps.c new file mode 100644 index 0000000000..d979820923 --- /dev/null +++ b/keyboards/keychron/q1/rev_0100/keymaps/teimor/tap_dance_mac_caps.c @@ -0,0 +1,50 @@ +/* Copyright 2021 @ Teimor Epstein + * + * 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 . + */ + +/* macOS CapsLock language change */ +#include "tap_dance_mac_caps.h" + +static td_tap_t mac_caps_language_tap_state = {.is_press_action = true, .state = TD_NONE}; + +void mac_caps_language_finished(qk_tap_dance_state_t *state, void *user_data) { + mac_caps_language_tap_state.state = current_dance(state); + switch (mac_caps_language_tap_state.state) { + case TD_SINGLE_TAP: + register_code(KC_LCTL); + register_code(KC_SPACE); + break; + case TD_SINGLE_HOLD: + register_code(KC_CAPS_LOCK); + break; + default: + break; + } +} + +void mac_caps_language_reset(qk_tap_dance_state_t *state, void *user_data) { + switch (mac_caps_language_tap_state.state) { + case TD_SINGLE_TAP: + unregister_code(KC_SPACE); + unregister_code(KC_LCTL); + break; + case TD_SINGLE_HOLD: + unregister_code(KC_CAPS_LOCK); + break; + default: + break; + } + mac_caps_language_tap_state.state = TD_NONE; +} diff --git a/keyboards/keychron/q1/rev_0100/keymaps/teimor/tap_dance_mac_caps.h b/keyboards/keychron/q1/rev_0100/keymaps/teimor/tap_dance_mac_caps.h new file mode 100644 index 0000000000..a5f07a58a1 --- /dev/null +++ b/keyboards/keychron/q1/rev_0100/keymaps/teimor/tap_dance_mac_caps.h @@ -0,0 +1,23 @@ +/* Copyright 2021 @ Teimor Epstein + * + * 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 . + */ + +/* macOS CapsLock language change */ +#pragma once + +#include "tap_dance_setup.h" + +void mac_caps_language_finished(qk_tap_dance_state_t *state, void *user_data); +void mac_caps_language_reset(qk_tap_dance_state_t *state, void *user_data); diff --git a/keyboards/keychron/q1/rev_0100/keymaps/teimor/tap_dance_setup.c b/keyboards/keychron/q1/rev_0100/keymaps/teimor/tap_dance_setup.c new file mode 100644 index 0000000000..6d879419bc --- /dev/null +++ b/keyboards/keychron/q1/rev_0100/keymaps/teimor/tap_dance_setup.c @@ -0,0 +1,49 @@ +/* Copyright 2022 @ Teimor Epstein + * + * 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 . + */ +#include "tap_dance_setup.h" + +td_state_t current_dance(qk_tap_dance_state_t *state) { + if (state->count == 1) { + if (state->interrupted || !state->pressed) return TD_SINGLE_TAP; + /* Key has not been interrupted, but the key is still held. Means you w ant to send a 'HOLD'. */ + else + return TD_SINGLE_HOLD; + } else if (state->count == 2) { + /* TD_DOUBLE_SINGLE_TAP is to distinguish between typing "pepper", and actually wanting a double tap + action when hitting 'pp'. Suggested use case for this return value is when you want to send two + keystrokes of the key, and not the 'double tap' action/macro. */ + if (state->interrupted) + return TD_DOUBLE_SINGLE_TAP; + else if (state->pressed) + return TD_DOUBLE_HOLD; + else + return TD_DOUBLE_TAP; + } + + /* Assumes no one is trying to type the same letter three times (at least not quickly). + If your tap dance key is 'KC_W', and you want to type "www." quickly - then you will need to add + an exception here to return a 'TD_TRIPLE_SINGLE_TAP', and define that enum just like 'TD_DOUBLE_SINGLE_TAP' */ + if (state->count == 3) { + if (state->interrupted) + return TD_TRIPLE_SINGLE_TAP; + else if (state->pressed) + return TD_TRIPLE_HOLD; + else + return TD_TRIPLE_TAP; + + } else + return TD_UNKNOWN; +} diff --git a/keyboards/keychron/q1/rev_0100/keymaps/teimor/tap_dance_setup.h b/keyboards/keychron/q1/rev_0100/keymaps/teimor/tap_dance_setup.h new file mode 100644 index 0000000000..05160c77f5 --- /dev/null +++ b/keyboards/keychron/q1/rev_0100/keymaps/teimor/tap_dance_setup.h @@ -0,0 +1,38 @@ +/* Copyright 2022 @ Teimor Epstein + * + * 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 . + */ +#pragma once + +#include QMK_KEYBOARD_H + +typedef enum { + TD_NONE, + TD_UNKNOWN, + TD_SINGLE_TAP, + TD_SINGLE_HOLD, + TD_DOUBLE_TAP, + TD_DOUBLE_HOLD, + TD_DOUBLE_SINGLE_TAP, // Send two single taps + TD_TRIPLE_TAP, + TD_TRIPLE_HOLD, + TD_TRIPLE_SINGLE_TAP // Send three single tap +} td_state_t; + +typedef struct { + bool is_press_action; + td_state_t state; +} td_tap_t; + +td_state_t current_dance(qk_tap_dance_state_t *state); diff --git a/keyboards/keychron/q1/rev_0100/keymaps/teimor/tap_dance_user.c b/keyboards/keychron/q1/rev_0100/keymaps/teimor/tap_dance_user.c new file mode 100644 index 0000000000..1e9542d5ee --- /dev/null +++ b/keyboards/keychron/q1/rev_0100/keymaps/teimor/tap_dance_user.c @@ -0,0 +1,28 @@ +/* Copyright 2022 @ Teimor Epstein + * + * 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 . + */ + +#include "keymap_user.h" +#include "tap_dance_mac_caps.h" +#include "tap_dance_win_caps.h" + +// clang-format off + +qk_tap_dance_action_t tap_dance_actions[] = { + [MAC_CAPS_LANGUAGE_CHANGE] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, mac_caps_language_finished, mac_caps_language_reset), + [WIN_CAPS_LANGUAGE_CHANGE] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, win_caps_language_finished, win_caps_language_reset) +}; + +// clang-format on diff --git a/keyboards/keychron/q1/rev_0100/keymaps/teimor/tap_dance_win_caps.c b/keyboards/keychron/q1/rev_0100/keymaps/teimor/tap_dance_win_caps.c new file mode 100644 index 0000000000..fea72c5663 --- /dev/null +++ b/keyboards/keychron/q1/rev_0100/keymaps/teimor/tap_dance_win_caps.c @@ -0,0 +1,50 @@ +/* Copyright 2022 @ Teimor Epstein + * + * 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 . + */ + +/* Windows CapsLock language change */ +#include "tap_dance_win_caps.h" + +static td_tap_t win_caps_language_tap_state = {.is_press_action = true, .state = TD_NONE}; + +void win_caps_language_finished(qk_tap_dance_state_t *state, void *user_data) { + win_caps_language_tap_state.state = current_dance(state); + switch (win_caps_language_tap_state.state) { + case TD_SINGLE_TAP: + register_code(KC_LGUI); + register_code(KC_SPACE); + break; + case TD_SINGLE_HOLD: + register_code(KC_CAPS_LOCK); + break; + default: + break; + } +} + +void win_caps_language_reset(qk_tap_dance_state_t *state, void *user_data) { + switch (win_caps_language_tap_state.state) { + case TD_SINGLE_TAP: + unregister_code(KC_SPACE); + unregister_code(KC_LGUI); + break; + case TD_SINGLE_HOLD: + unregister_code(KC_CAPS_LOCK); + break; + default: + break; + } + win_caps_language_tap_state.state = TD_NONE; +} diff --git a/keyboards/keychron/q1/rev_0100/keymaps/teimor/tap_dance_win_caps.h b/keyboards/keychron/q1/rev_0100/keymaps/teimor/tap_dance_win_caps.h new file mode 100644 index 0000000000..34b734ec89 --- /dev/null +++ b/keyboards/keychron/q1/rev_0100/keymaps/teimor/tap_dance_win_caps.h @@ -0,0 +1,23 @@ +/* Copyright 2022 @ Teimor Epstein + * + * 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 . + */ + +/* Windows CapsLock language change */ +#pragma once + +#include "tap_dance_setup.h" + +void win_caps_language_finished(qk_tap_dance_state_t *state, void *user_data); +void win_caps_language_reset(qk_tap_dance_state_t *state, void *user_data); diff --git a/keyboards/keychron/q1/rev_0100/keymaps/via/keymap.c b/keyboards/keychron/q1/rev_0100/keymaps/via/keymap.c new file mode 100644 index 0000000000..1e6316782d --- /dev/null +++ b/keyboards/keychron/q1/rev_0100/keymaps/via/keymap.c @@ -0,0 +1,107 @@ +/* Copyright 2021 @ Keychron (https://www.keychron.com) + * + * 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 . + */ + +#include QMK_KEYBOARD_H + +enum layers{ + MAC_BASE, + MAC_FN, + WIN_BASE, + WIN_FN +}; + +enum custom_keycodes { + KC_MISSION_CONTROL = USER00, + KC_LAUNCHPAD, + KC_TASK, + KC_FLXP +}; + +#define KC_MCTL KC_MISSION_CONTROL +#define KC_LPAD KC_LAUNCHPAD + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [MAC_BASE] = LAYOUT_ansi_82( + KC_ESC, KC_BRID, KC_BRIU, KC_MCTL, KC_LPAD, RGB_VAD, RGB_VAI, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, KC_DEL, KC_INS, + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_PGUP, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_PGDN, + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_HOME, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, + KC_LCTL, KC_LALT, KC_LGUI, KC_SPC, KC_RGUI, MO(MAC_FN),KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT), + + [MAC_FN] = LAYOUT_ansi_82( + KC_TRNS, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + RGB_TOG, RGB_MOD, RGB_VAI, RGB_HUI, RGB_SAI, RGB_SPI, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, RGB_RMOD, RGB_VAD, RGB_HUD, RGB_SAD, RGB_SPD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), + + [WIN_BASE] = LAYOUT_ansi_82( + KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL, KC_INS, + KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_PGUP, + KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_PGDN, + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_HOME, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(WIN_FN),KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT), + + [WIN_FN] = LAYOUT_ansi_82( + KC_TRNS, KC_BRID, KC_BRIU, KC_TASK, KC_FLXP, RGB_VAD, RGB_VAI, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + RGB_TOG, RGB_MOD, RGB_VAI, RGB_HUI, RGB_SAI, RGB_SPI, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, RGB_RMOD, RGB_VAD, RGB_HUD, RGB_SAD, RGB_SPD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS) +}; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case KC_MISSION_CONTROL: + if (record->event.pressed) { + host_consumer_send(0x29F); + } else { + host_consumer_send(0); + } + return false; // Skip all further processing of this key + case KC_LAUNCHPAD: + if (record->event.pressed) { + host_consumer_send(0x2A0); + } else { + host_consumer_send(0); + } + return false; // Skip all further processing of this key + case KC_TASK: + if (record->event.pressed) { + register_code(KC_LWIN); + register_code(KC_TAB); + } else { + unregister_code(KC_LWIN); + unregister_code(KC_TAB); + } + return false; // Skip all further processing of this key + case KC_FLXP: + if (record->event.pressed) { + register_code(KC_LWIN); + register_code(KC_E); + } else { + unregister_code(KC_LWIN); + unregister_code(KC_E); + } + return false; // Skip all further processing of this key + default: + return true; // Process all other keycodes normally + } +} diff --git a/keyboards/keychron/q1/rev_0100/keymaps/via/rules.mk b/keyboards/keychron/q1/rev_0100/keymaps/via/rules.mk new file mode 100644 index 0000000000..bee21da528 --- /dev/null +++ b/keyboards/keychron/q1/rev_0100/keymaps/via/rules.mk @@ -0,0 +1,2 @@ +VIA_ENABLE = yes +MOUSEKEY_ENABLE = no \ No newline at end of file diff --git a/keyboards/keychron/q1/rev_0100/readme.md b/keyboards/keychron/q1/rev_0100/readme.md new file mode 100644 index 0000000000..5cf488f048 --- /dev/null +++ b/keyboards/keychron/q1/rev_0100/readme.md @@ -0,0 +1 @@ +# The ANSI variant of the Keychron Q1 \ No newline at end of file diff --git a/keyboards/keychron/q1/rev_0100/rev_0100.c b/keyboards/keychron/q1/rev_0100/rev_0100.c new file mode 100644 index 0000000000..f424669527 --- /dev/null +++ b/keyboards/keychron/q1/rev_0100/rev_0100.c @@ -0,0 +1,143 @@ +/* Copyright 2021 @ Keychron (https://www.keychron.com) + * + * 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 . + */ + +#include "quantum.h" + + +const is31_led PROGMEM g_is31_leds[DRIVER_LED_TOTAL] = { +/* Refer to IS31 manual for these locations + * driver + * | R location + * | | G location + * | | | B location + * | | | | */ + {0, C_1, A_1, B_1}, + {0, C_3, A_3, B_3}, + {0, C_4, A_4, B_4}, + {0, C_5, A_5, B_5}, + {0, C_6, A_6, B_6}, + {0, C_7, A_7, B_7}, + {0, C_8, A_8, B_8}, + {0, C_9, A_9, B_9}, + {0, C_10, A_10, B_10}, + {0, C_11, A_11, B_11}, + {0, C_12, A_12, B_12}, + {0, C_13, A_13, B_13}, + {0, C_14, A_14, B_14}, + {0, C_15, A_15, B_15}, + {0, C_16, A_16, B_16}, + + {0, F_1, D_1, E_1}, + {0, F_2, D_2, E_2}, + {0, F_3, D_3, E_3}, + {0, F_4, D_4, E_4}, + {0, F_5, D_5, E_5}, + {0, F_6, D_6, E_6}, + {0, F_7, D_7, E_7}, + {0, F_8, D_8, E_8}, + {0, F_9, D_9, E_9}, + {0, F_10, D_10, E_10}, + {0, F_11, D_11, E_11}, + {0, F_12, D_12, E_12}, + {0, F_13, D_13, E_13}, + {0, F_14, D_14, E_14}, + {0, F_16, D_16, E_16}, + + {0, I_1, G_1, H_1}, + {0, I_2, G_2, H_2}, + {0, I_3, G_3, H_3}, + {0, I_4, G_4, H_4}, + {0, I_5, G_5, H_5}, + {0, I_6, G_6, H_6}, + {0, I_7, G_7, H_7}, + {0, I_8, G_8, H_8}, + {0, I_9, G_9, H_9}, + {0, I_10, G_10, H_10}, + {0, I_11, G_11, H_11}, + {0, I_12, G_12, H_12}, + {0, I_13, G_13, H_13}, + {0, I_14, G_14, H_14}, + {0, I_16, G_16, H_16}, + + {0, L_1, J_1, K_1}, + {0, L_2, J_2, K_2}, + {0, L_3, J_3, K_3}, + {0, L_4, J_4, K_4}, + {0, L_5, J_5, K_5}, + {0, L_6, J_6, K_6}, + {0, L_7, J_7, K_7}, + {0, L_8, J_8, K_8}, + {0, L_9, J_9, K_9}, + {0, L_10, J_10, K_10}, + {0, L_11, J_11, K_11}, + {0, L_12, J_12, K_12}, + {0, L_14, J_14, K_14}, + {0, L_16, J_16, K_16}, + + {1, C_1, A_1, B_1}, + {1, C_3, A_3, B_3}, + {1, C_4, A_4, B_4}, + {1, C_5, A_5, B_5}, + {1, C_6, A_6, B_6}, + {1, C_7, A_7, B_7}, + {1, C_8, A_8, B_8}, + {1, C_9, A_9, B_9}, + {1, C_10, A_10, B_10}, + {1, C_11, A_11, B_11}, + {1, C_12, A_12, B_12}, + {1, C_14, A_14, B_14}, + {1, C_15, A_15, B_15}, + + {1, F_1, D_1, E_1}, + {1, F_2, D_2, E_2}, + {1, F_3, D_3, E_3}, + {1, F_7, D_7, E_7}, + {1, F_11, D_11, E_11}, + {1, F_12, D_12, E_12}, + {1, F_13, D_13, E_13}, + {1, F_14, D_14, E_14}, + {1, F_15, D_15, E_15}, + {1, F_16, D_16, E_16} + +}; + +led_config_t g_led_config = { + { + { 0, NO_LED, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14 }, + { 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29 }, + { 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44 }, + { 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 71, 57, 58 }, + { 59, NO_LED, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 80, 70, 13 }, + { 72, 73, 74, NO_LED, NO_LED, NO_LED, 75, NO_LED, NO_LED, NO_LED, 76, 77, 78, 79, 81 } + }, + { + {0,0}, {30, 0}, {45, 0}, {60, 0}, {75, 0}, {90, 0}, {105, 0}, {120, 0}, {135, 0}, {150, 0}, {165, 0}, {180, 0}, {195, 0}, {210, 0}, {224, 0}, + {0,13}, {15,13}, {30,13}, {45,13}, {60,13}, {75,13}, {90,13}, {105,13}, {120,13}, {135,13}, {150,13}, {165,13}, {180,13}, {195,13}, {224,13}, + {0,26}, {15,26}, {30,26}, {45,26}, {60,26}, {75,26}, {90,26}, {105,26}, {120,26}, {135,26}, {150,26}, {165,26}, {180,26}, {195,26}, {224,26}, + {0,39}, {15,39}, {30,39}, {45,39}, {60,39}, {75,39}, {90,39}, {105,39}, {120,39}, {135,39}, {150,39}, {165,39}, {195,39}, {224,39}, + {0,52}, {30,52}, {45,52}, {60,52}, {75,52}, {90,52}, {105,52}, {120,52}, {135,52}, {150,52}, {165,52}, {195,52}, {210,52}, + {0,64}, {15,64}, {30,64}, {90,64}, {150,64}, {165,64}, {180,64}, {195,64}, {210,64}, {224,64}, + }, + { + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 + + } +}; diff --git a/keyboards/keychron/q1/rev_0100/rev_0100.h b/keyboards/keychron/q1/rev_0100/rev_0100.h new file mode 100644 index 0000000000..2a1edac646 --- /dev/null +++ b/keyboards/keychron/q1/rev_0100/rev_0100.h @@ -0,0 +1,37 @@ +/* Copyright 2021 @ Keychron (https://www.keychron.com) + * + * 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 . + */ + +#pragma once + +#include "quantum.h" + +#define xxx KC_NO + +#define LAYOUT_ansi_82( \ + K00, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K4E, K0E, \ + K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, K1E, \ + K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D, K2E, \ + K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3D, K3E, \ + K40, K42, K43, K44, K45, K46, K47, K48, K49, K4A, K4B, K4D, K3C, \ + K50, K51, K52, K56, K5A, K5B, K5C, K5D, K4C, K5E \ +) { \ + { K00, xxx, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E }, \ + { K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, K1E }, \ + { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D, K2E }, \ + { K30, K31, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3C, K3D, K3E }, \ + { K40, xxx, K42, K43, K44, K45, K46, K47, K48, K49, K4A, K4B, K4C, K4D, K4E }, \ + { K50, K51, K52, xxx, xxx, xxx, K56, xxx, xxx, xxx, K5A, K5B, K5C, K5D, K5E } \ +} diff --git a/keyboards/keychron/q1/rev_0100/rules.mk b/keyboards/keychron/q1/rev_0100/rules.mk new file mode 100644 index 0000000000..6a512a8faa --- /dev/null +++ b/keyboards/keychron/q1/rev_0100/rules.mk @@ -0,0 +1,21 @@ +# MCU name +MCU = atmega32u4 + +# Bootloader selection +BOOTLOADER = atmel-dfu + +# Build Options +# change yes to no to disable +# +BOOTMAGIC_ENABLE = yes # Enable Bootmagic Lite +MOUSEKEY_ENABLE = no # Mouse keys +EXTRAKEY_ENABLE = yes # Audio control and System control +CONSOLE_ENABLE = no # Console for debug +COMMAND_ENABLE = no # Commands for debug and configuration +NKRO_ENABLE = yes # Enable N-Key Rollover +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality +RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow +AUDIO_ENABLE = no # Audio output +DIP_SWITCH_ENABLE = yes +RGB_MATRIX_ENABLE = yes +RGB_MATRIX_DRIVER = IS31FL3733 diff --git a/keyboards/keychron/q10/q10_ansi_stm32l432_ec11/config.h b/keyboards/keychron/q10/q10_ansi_stm32l432_ec11/config.h new file mode 100644 index 0000000000..5b1ffca3dc --- /dev/null +++ b/keyboards/keychron/q10/q10_ansi_stm32l432_ec11/config.h @@ -0,0 +1,31 @@ +/* Copyright 2022 @ Keychron (https://www.keychron.com) + * + * 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 . + */ + +#pragma once + +/* RGB Matrix Configuration */ +#define DRIVER_1_LED_TOTAL 47 +#define DRIVER_2_LED_TOTAL 41 +#define DRIVER_LED_TOTAL (DRIVER_1_LED_TOTAL + DRIVER_2_LED_TOTAL) + +/* Encoder Configuration */ +#define ENCODERS_PAD_A { A10 } +#define ENCODERS_PAD_B { A8 } +#define ENCODER_RESOLUTION 4 +#define ENCODER_DEFAULT_POS 0x3 + +/* Enable caps-lock LED */ +#define CAPS_LOCK_LED_INDEX 48 diff --git a/keyboards/keychron/q10/q10_ansi_stm32l432_ec11/info.json b/keyboards/keychron/q10/q10_ansi_stm32l432_ec11/info.json new file mode 100644 index 0000000000..6b28d4b646 --- /dev/null +++ b/keyboards/keychron/q10/q10_ansi_stm32l432_ec11/info.json @@ -0,0 +1,111 @@ +{ + "keyboard_name": "Keychron Q10", + "manufacturer": "Keychron", + "url": "https://github.com/Keychron", + "maintainer": "lalalademaxiya1", + "usb": { + "vid": "0x3434", + "pid": "0x01A1", + "device_version": "1.0.1" + }, + "layouts": { + "LAYOUT_ansi_89": { + "layout": [ + {"label":"Mute", "x":0.25, "y":0}, + {"label":"Esc", "x":1.75, "y":0}, + {"label":"F1", "x":3, "y":0}, + {"label":"F2", "x":4, "y":0}, + {"label":"F3", "x":5, "y":0}, + {"label":"F4", "x":6, "y":0}, + {"label":"F5", "x":7.25, "y":0}, + {"label":"F6", "x":8.25, "y":0}, + {"label":"F7", "x":11, "y":0}, + {"label":"F8", "x":12, "y":0}, + {"label":"F9", "x":13.25, "y":0}, + {"label":"F10", "x":14.25, "y":0}, + {"label":"F11", "x":15.25, "y":0}, + {"label":"F12", "x":16.25, "y":0}, + {"label":"Print", "x":17.5, "y":0}, + {"label":"Delete", "x":18.75, "y":0}, + + {"label":"Light", "x":0.75, "y":1.25}, + {"label":"`~", "x":2.25, "y":1.25}, + {"label":"1!", "x":3.25, "y":1.25}, + {"label":"2@", "x":4.25, "y":1.25}, + {"label":"3#", "x":5.25, "y":1.25}, + {"label":"4$", "x":6.25, "y":1.25}, + {"label":"5%", "x":7.25, "y":1.25}, + {"label":"6^", "x":8.25, "y":1.25}, + {"label":"7&", "x":10.5, "y":1.25}, + {"label":"8*", "x":11.5, "y":1.25}, + {"label":"9(", "x":12.5, "y":1.25}, + {"label":"0)", "x":13.5, "y":1.25}, + {"label":"-_", "x":14.5, "y":1.25}, + {"label":"=+", "x":15.5, "y":1.25}, + {"label":"Backspace", "x":16.5, "y":1.25, "w":2}, + {"label":"PgDn", "x":18.75, "y":1.25}, + + {"label":"1!", "x":0.5, "y":2.25}, + {"label":"Tab", "x":1.75, "y":2.25, "w":1.5}, + {"label":"Q", "x":3.25, "y":2.25}, + {"label":"W", "x":4.5, "y":2.25}, + {"label":"E", "x":5.5, "y":2.25}, + {"label":"R", "x":6.5, "y":2.25}, + {"label":"T", "x":7.5, "y":2.25}, + {"label":"Y", "x":10, "y":2.25}, + {"label":"U", "x":11, "y":2.25}, + {"label":"I", "x":12, "y":2.25}, + {"label":"O", "x":13, "y":2.25}, + {"label":"P", "x":14, "y":2.25}, + {"label":"[{", "x":15.25, "y":2.25}, + {"label":"]}", "x":16.25, "y":2.25}, + {"label":"\\|", "x":17.25, "y":2.25, "w":1.5}, + {"label":"PgUp", "x":19, "y":2.25}, + + {"label":"2@", "x":0.25, "y":3.25}, + {"label":"Caps Lock", "x":1.5, "y":3.25, "w":1.75}, + {"label":"A", "x":3.25, "y":3.25}, + {"label":"S", "x":4.5, "y":3.25}, + {"label":"D", "x":5.5, "y":3.25}, + {"label":"F", "x":6.5, "y":3.25}, + {"label":"G", "x":7.5, "y":3.25}, + {"label":"H", "x":10.25, "y":3.25}, + {"label":"J", "x":11.25, "y":3.25}, + {"label":"K", "x":12.25, "y":3.25}, + {"label":"L", "x":13.25, "y":3.25}, + {"label":";:", "x":14.75, "y":3.25}, + {"label":"'\"", "x":15.75, "y":3.25}, + {"label":"Enter", "x":16.75, "y":3.25, "w":2.25}, + {"label":"Home", "x":19.25, "y":3.25}, + + {"label":"3#", "x":0, "y":4.25}, + {"label":"Shift", "x":1.5, "y":4.25, "w":2.25}, + {"label":"Z", "x":3.5, "y":4.25}, + {"label":"X", "x":4.75, "y":4.25}, + {"label":"C", "x":5.75, "y":4.25}, + {"label":"V", "x":6.75, "y":4.25}, + {"label":"B", "x":7.75, "y":4.25}, + {"label":"B", "x":9.5, "y":4.25}, + {"label":"N", "x":10.5, "y":4.25}, + {"label":"M", "x":11.5, "y":4.25}, + {"label":",<", "x":12.5, "y":4.25}, + {"label":".>", "x":13.5, "y":4.25}, + {"label":"/?", "x":15.25, "y":4.25}, + {"label":"Shift", "x":16.25, "y":4.25, "w":1.75}, + {"label":"Up", "x":18.25, "y":4.5}, + + {"label":"4$", "x":0, "y":5.25}, + {"label":"Ctrl", "x":1.25, "y":5.25, "w":1.25}, + {"label":"Win", "x":2.5, "y":5.25, "w":1.25}, + {"label":"Alt", "x":4.75, "y":5.25, "w":1.25}, + {"label":"Space", "x":6, "y":5.25, "w":2.25}, + {"label":"Fn1", "x":8.25, "y":5.25}, + {"label":"Space", "x":9.5, "y":5.25, "w":2.75}, + {"label":"Alt", "x":12.25, "y":5.25}, + {"label":"Left", "x":17.25, "y":5.5}, + {"label":"Down", "x":18.25, "y":5.5}, + {"label":"Right", "x":19.25, "y":5.5} + ] + } + } +} diff --git a/keyboards/keychron/q10/q10_ansi_stm32l432_ec11/keymaps/default/keymap.c b/keyboards/keychron/q10/q10_ansi_stm32l432_ec11/keymaps/default/keymap.c new file mode 100644 index 0000000000..46bfe5d4bf --- /dev/null +++ b/keyboards/keychron/q10/q10_ansi_stm32l432_ec11/keymaps/default/keymap.c @@ -0,0 +1,129 @@ +/* Copyright 2022 @ Keychron (https://www.keychron.com) + * + * 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 . + */ + +#include QMK_KEYBOARD_H + +// clang-format off + +enum layers{ + MAC_BASE, + MAC_FN, + WIN_BASE, + WIN_FN +}; + +enum custom_keycodes { + KC_MISSION_CONTROL = SAFE_RANGE, + KC_LAUNCHPAD, + KC_TASK_VIEW, + KC_FILE_EXPLORER +}; + +typedef struct PACKED { + uint8_t len; + uint8_t keycode[3]; +} key_combination_t; + +key_combination_t key_comb_list[3] = { + {2, {KC_LWIN, KC_TAB}}, + {2, {KC_LWIN, KC_E}}, + {3, {KC_LSFT, KC_LCMD, KC_4}} +}; + +#define KC_MCTL KC_MISSION_CONTROL +#define KC_LPAD KC_LAUNCHPAD +#define KC_TASK KC_TASK_VIEW +#define KC_FLXP KC_FILE_EXPLORER + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [MAC_BASE] = LAYOUT_ansi_89( + KC_MUTE, KC_ESC, KC_BRID, KC_BRIU, KC_MCTL, KC_LPAD, RGB_VAD, RGB_VAI, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, KC_INS, KC_DEL, + _______, KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_PGUP, + _______, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_PGDN, + _______, KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_HOME, + _______, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, + _______, KC_LCTL, KC_LOPT, KC_LCMD, KC_SPC, MO(MAC_FN), KC_SPC, KC_RCMD, KC_LEFT, KC_DOWN, KC_RGHT), + + [MAC_FN] = LAYOUT_ansi_89( + _______, _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, RGB_TOG, RGB_MOD, RGB_VAI, RGB_HUI, RGB_SAI, RGB_SPI, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, RGB_RMOD, RGB_VAD, RGB_HUD, RGB_SAD, RGB_SPD, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, NK_TOGG, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______), + + [WIN_BASE] = LAYOUT_ansi_89( + KC_MUTE, KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_INS, KC_DEL, + _______, KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_PGUP, + _______, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_PGDN, + _______, KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_HOME, + _______, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, + _______, KC_LCTL, KC_LCMD, KC_LALT, KC_SPC, MO(WIN_FN), KC_SPC, KC_RALT, KC_LEFT, KC_DOWN, KC_RGHT), + + [WIN_FN] = LAYOUT_ansi_89( + _______, _______, KC_BRID, KC_BRIU, KC_TASK, KC_FLXP, RGB_VAD, RGB_VAI, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, RGB_TOG, RGB_MOD, RGB_VAI, RGB_HUI, RGB_SAI, RGB_SPI, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, RGB_RMOD, RGB_VAD, RGB_HUD, RGB_SAD, RGB_SPD, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, NK_TOGG, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______), +}; + +#if defined(ENCODER_ENABLE) && defined(ENCODER_MAP_ENABLE) + +const uint16_t PROGMEM encoder_map[][1][2] = { + [MAC_BASE] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU) }, + [MAC_FN] = { ENCODER_CCW_CW(RGB_VAD, RGB_VAI) }, + [WIN_BASE] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU) }, + [WIN_FN] = { ENCODER_CCW_CW(RGB_VAD, RGB_VAI) } +}; + +#endif + +// clang-format on + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case KC_MISSION_CONTROL: + if (record->event.pressed) { + host_consumer_send(0x29F); + } else { + host_consumer_send(0); + } + return false; // Skip all further processing of this key + case KC_LAUNCHPAD: + if (record->event.pressed) { + host_consumer_send(0x2A0); + } else { + host_consumer_send(0); + } + return false; // Skip all further processing of this key + case KC_TASK: + case KC_FLXP: + if (record->event.pressed) { + for (uint8_t i = 0; i < key_comb_list[keycode - KC_TASK].len; i++) { + register_code(key_comb_list[keycode - KC_TASK].keycode[i]); + } + } else { + for (uint8_t i = 0; i < key_comb_list[keycode - KC_TASK].len; i++) { + unregister_code(key_comb_list[keycode - KC_TASK].keycode[i]); + } + } + return false; // Skip all further processing of this key + default: + return true; // Process all other keycodes normally + } +} diff --git a/keyboards/keychron/q10/q10_ansi_stm32l432_ec11/keymaps/default/rules.mk b/keyboards/keychron/q10/q10_ansi_stm32l432_ec11/keymaps/default/rules.mk new file mode 100644 index 0000000000..1e2c95faad --- /dev/null +++ b/keyboards/keychron/q10/q10_ansi_stm32l432_ec11/keymaps/default/rules.mk @@ -0,0 +1 @@ +SRC += factory/major/test.c diff --git a/keyboards/keychron/q10/q10_ansi_stm32l432_ec11/keymaps/ducoterra/keymap.c b/keyboards/keychron/q10/q10_ansi_stm32l432_ec11/keymaps/ducoterra/keymap.c new file mode 100644 index 0000000000..6ee6d12caa --- /dev/null +++ b/keyboards/keychron/q10/q10_ansi_stm32l432_ec11/keymaps/ducoterra/keymap.c @@ -0,0 +1,138 @@ +/* Copyright 2022 @ Keychron (https://www.keychron.com) + * + * 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 . + */ + +#include QMK_KEYBOARD_H + +// clang-format off + +enum layers{ + MAC_BASE, + MAC_FN, + WIN_BASE, + WIN_FN, + NAV_BASE +}; + +enum custom_keycodes { + KC_MISSION_CONTROL = SAFE_RANGE, + KC_LAUNCHPAD, + KC_TASK_VIEW, + KC_FILE_EXPLORER +}; + +typedef struct PACKED { + uint8_t len; + uint8_t keycode[3]; +} key_combination_t; + +key_combination_t key_comb_list[3] = { + {2, {KC_LWIN, KC_TAB}}, + {2, {KC_LWIN, KC_E}}, + {3, {KC_LSFT, KC_LCMD, KC_4}} +}; + +#define KC_MCTL KC_MISSION_CONTROL +#define KC_LPAD KC_LAUNCHPAD +#define KC_TASK KC_TASK_VIEW +#define KC_FLXP KC_FILE_EXPLORER + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [MAC_BASE] = LAYOUT_ansi_89( + KC_MUTE, KC_ESC, KC_BRID, KC_BRIU, KC_MCTL, KC_LPAD, RGB_VAD, RGB_VAI, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, KC_INS, KC_DEL, + _______, KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_PGUP, + _______, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_PGDN, + _______, KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_HOME, + _______, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, + _______, KC_LCTL, KC_LOPT, KC_LCMD, KC_SPC, MO(MAC_FN), KC_SPC, KC_RCMD, KC_LEFT, KC_DOWN, KC_RGHT), + + [MAC_FN] = LAYOUT_ansi_89( + _______, _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, RGB_TOG, RGB_MOD, RGB_VAI, RGB_HUI, RGB_SAI, RGB_SPI, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, RGB_RMOD, RGB_VAD, RGB_HUD, RGB_SAD, RGB_SPD, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, NK_TOGG, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______), + + [WIN_BASE] = LAYOUT_ansi_89( + KC_MUTE, KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_INS, KC_DEL, + _______, KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_PGUP, + _______, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_PGDN, + _______, KC_LCTL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_HOME, + _______, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, + _______, KC_LCTL, KC_LCMD, KC_LALT, KC_SPC, MO(WIN_FN), KC_SPC, KC_RALT, KC_LEFT, KC_DOWN, KC_RGHT), + + [WIN_FN] = LAYOUT_ansi_89( + _______, _______, KC_BRID, KC_BRIU, KC_TASK, KC_FLXP, RGB_VAD, RGB_VAI, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, RGB_TOG, RGB_MOD, RGB_VAI, RGB_HUI, RGB_SAI, RGB_SPI, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, RGB_RMOD, RGB_VAD, RGB_HUD, RGB_SAD, RGB_SPD, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, NK_TOGG, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______), + + [NAV_BASE] = LAYOUT_ansi_89( + _______, _______, KC_BRID, KC_BRIU, KC_TASK, KC_FLXP, RGB_VAD, RGB_VAI, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, RGB_TOG, RGB_MOD, RGB_VAI, RGB_HUI, RGB_SAI, RGB_SPI, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, RGB_RMOD, RGB_VAD, RGB_HUD, RGB_SAD, RGB_SPD, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, NK_TOGG, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______), +}; + +#if defined(ENCODER_ENABLE) && defined(ENCODER_MAP_ENABLE) + +const uint16_t PROGMEM encoder_map[][1][2] = { + [MAC_BASE] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU) }, + [MAC_FN] = { ENCODER_CCW_CW(RGB_VAD, RGB_VAI) }, + [WIN_BASE] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU) }, + [WIN_FN] = { ENCODER_CCW_CW(RGB_VAD, RGB_VAI) } +}; + +#endif + +// clang-format on + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case KC_MISSION_CONTROL: + if (record->event.pressed) { + host_consumer_send(0x29F); + } else { + host_consumer_send(0); + } + return false; // Skip all further processing of this key + case KC_LAUNCHPAD: + if (record->event.pressed) { + host_consumer_send(0x2A0); + } else { + host_consumer_send(0); + } + return false; // Skip all further processing of this key + case KC_TASK: + case KC_FLXP: + if (record->event.pressed) { + for (uint8_t i = 0; i < key_comb_list[keycode - KC_TASK].len; i++) { + register_code(key_comb_list[keycode - KC_TASK].keycode[i]); + } + } else { + for (uint8_t i = 0; i < key_comb_list[keycode - KC_TASK].len; i++) { + unregister_code(key_comb_list[keycode - KC_TASK].keycode[i]); + } + } + return false; // Skip all further processing of this key + default: + return true; // Process all other keycodes normally + } +} diff --git a/keyboards/keychron/q10/q10_ansi_stm32l432_ec11/keymaps/ducoterra/rules.mk b/keyboards/keychron/q10/q10_ansi_stm32l432_ec11/keymaps/ducoterra/rules.mk new file mode 100644 index 0000000000..1e2c95faad --- /dev/null +++ b/keyboards/keychron/q10/q10_ansi_stm32l432_ec11/keymaps/ducoterra/rules.mk @@ -0,0 +1 @@ +SRC += factory/major/test.c diff --git a/keyboards/keychron/q10/q10_ansi_stm32l432_ec11/keymaps/via/keymap.c b/keyboards/keychron/q10/q10_ansi_stm32l432_ec11/keymaps/via/keymap.c new file mode 100644 index 0000000000..ed5c4a1d89 --- /dev/null +++ b/keyboards/keychron/q10/q10_ansi_stm32l432_ec11/keymaps/via/keymap.c @@ -0,0 +1,187 @@ +/* Copyright 2022 @ Keychron (https://www.keychron.com) + * + * 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 . + */ + +#include QMK_KEYBOARD_H + +// clang-format off + +enum layers{ + MAC_BASE, + MAC_FN, + WIN_BASE, + WIN_FN +}; + +enum custom_keycodes { + KC_MISSION_CONTROL = USER00, + KC_LAUNCHPAD, + KC_LOPTN, + KC_ROPTN, + KC_LCMMD, + KC_RCMMD, + KC_TASK_VIEW, + KC_FILE_EXPLORER +}; + +#define KC_MCTL KC_MISSION_CONTROL +#define KC_LPAD KC_LAUNCHPAD +#define KC_TASK KC_TASK_VIEW +#define KC_FLXP KC_FILE_EXPLORER + +typedef struct PACKED { + uint8_t len; + uint8_t keycode[3]; +} key_combination_t; + +key_combination_t key_comb_list[3] = { + {2, {KC_LWIN, KC_TAB}}, + {2, {KC_LWIN, KC_E}}, + {3, {KC_LSFT, KC_LCMD, KC_4}} +}; + +static uint8_t mac_keycode[4] = { KC_LOPT, KC_ROPT, KC_LCMD, KC_RCMD }; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [MAC_BASE] = LAYOUT_ansi_89( + KC_MUTE, KC_ESC, KC_BRID, KC_BRIU, KC_MCTL, KC_LPAD, RGB_VAD, RGB_VAI, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, KC_INS, KC_DEL, + MACRO01, KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_PGUP, + MACRO02, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_PGDN, + MACRO03, KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_HOME, + MACRO04, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, + MACRO05, KC_LCTL, KC_LOPTN, KC_LCMMD, KC_SPC, MO(MAC_FN), KC_SPC, KC_RCMMD, KC_LEFT, KC_DOWN, KC_RGHT), + + [MAC_FN] = LAYOUT_ansi_89( + RGB_TOG, _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, RGB_TOG, RGB_MOD, RGB_VAI, RGB_HUI, RGB_SAI, RGB_SPI, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, RGB_RMOD, RGB_VAD, RGB_HUD, RGB_SAD, RGB_SPD, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, NK_TOGG, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______), + + [WIN_BASE] = LAYOUT_ansi_89( + KC_MUTE, KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_INS, KC_DEL, + MACRO01, KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_PGUP, + MACRO02, KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_PGDN, + MACRO03, KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_HOME, + MACRO04, KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, + MACRO05, KC_LCTL, KC_LCMD, KC_LALT, KC_SPC, MO(WIN_FN), KC_SPC, KC_RALT, KC_LEFT, KC_DOWN, KC_RGHT), + + [WIN_FN] = LAYOUT_ansi_89( + RGB_TOG, _______, KC_BRID, KC_BRIU, KC_TASK, KC_FLXP, RGB_VAD, RGB_VAI, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, RGB_TOG, RGB_MOD, RGB_VAI, RGB_HUI, RGB_SAI, RGB_SPI, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, RGB_RMOD, RGB_VAD, RGB_HUD, RGB_SAD, RGB_SPD, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, NK_TOGG, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______), +}; + +#if defined(ENCODER_ENABLE) && defined(ENCODER_MAP_ENABLE) + +const uint16_t PROGMEM encoder_map[][1][2] = { + [MAC_BASE] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU) }, + [MAC_FN] = { ENCODER_CCW_CW(RGB_VAD, RGB_VAI) }, + [WIN_BASE] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU) }, + [WIN_FN] = { ENCODER_CCW_CW(RGB_VAD, RGB_VAI) } +}; + +#endif + +// clang-format on + +#if defined(VIA_ENABLE) && defined(ENCODER_ENABLE) + +#define ENCODERS 1 +static uint8_t encoder_state[ENCODERS] = {0}; +static keypos_t encoder_cw[ENCODERS] = {{ 11, 5 }}; +static keypos_t encoder_ccw[ENCODERS] = {{ 10, 5 }}; + +void encoder_action_unregister(void) { + for (int index = 0; index < ENCODERS; ++index) { + if (encoder_state[index]) { + keyevent_t encoder_event = (keyevent_t) { + .key = encoder_state[index] >> 1 ? encoder_cw[index] : encoder_ccw[index], + .pressed = false, + .time = (timer_read() | 1) + }; + encoder_state[index] = 0; + action_exec(encoder_event); + } + } +} + +void encoder_action_register(uint8_t index, bool clockwise) { + keyevent_t encoder_event = (keyevent_t) { + .key = clockwise ? encoder_cw[index] : encoder_ccw[index], + .pressed = true, + .time = (timer_read() | 1) + }; + encoder_state[index] = (clockwise ^ 1) | (clockwise << 1); + action_exec(encoder_event); +} + +void matrix_scan_user(void) { + encoder_action_unregister(); +} + +bool encoder_update_user(uint8_t index, bool clockwise) { + encoder_action_register(index, clockwise); + return false; +}; + +#endif + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case KC_MISSION_CONTROL: + if (record->event.pressed) { + host_consumer_send(0x29F); + } else { + host_consumer_send(0); + } + return false; // Skip all further processing of this key + case KC_LAUNCHPAD: + if (record->event.pressed) { + host_consumer_send(0x2A0); + } else { + host_consumer_send(0); + } + return false; // Skip all further processing of this key + case KC_LOPTN: + case KC_ROPTN: + case KC_LCMMD: + case KC_RCMMD: + if (record->event.pressed) { + register_code(mac_keycode[keycode - KC_LOPTN]); + } else { + unregister_code(mac_keycode[keycode - KC_LOPTN]); + } + return false; // Skip all further processing of this key + case KC_TASK: + case KC_FLXP: + if (record->event.pressed) { + for (uint8_t i = 0; i < key_comb_list[keycode - KC_TASK].len; i++) { + register_code(key_comb_list[keycode - KC_TASK].keycode[i]); + } + } else { + for (uint8_t i = 0; i < key_comb_list[keycode - KC_TASK].len; i++) { + unregister_code(key_comb_list[keycode - KC_TASK].keycode[i]); + } + } + return false; // Skip all further processing of this key + default: + return true; // Process all other keycodes normally + } +} diff --git a/keyboards/keychron/q10/q10_ansi_stm32l432_ec11/keymaps/via/rules.mk b/keyboards/keychron/q10/q10_ansi_stm32l432_ec11/keymaps/via/rules.mk new file mode 100644 index 0000000000..ea6dd733e4 --- /dev/null +++ b/keyboards/keychron/q10/q10_ansi_stm32l432_ec11/keymaps/via/rules.mk @@ -0,0 +1,2 @@ +VIA_ENABLE = yes +SRC += factory/major/test.c diff --git a/keyboards/keychron/q10/q10_ansi_stm32l432_ec11/q10_ansi_stm32l432_ec11.c b/keyboards/keychron/q10/q10_ansi_stm32l432_ec11/q10_ansi_stm32l432_ec11.c new file mode 100644 index 0000000000..d0c1c8e514 --- /dev/null +++ b/keyboards/keychron/q10/q10_ansi_stm32l432_ec11/q10_ansi_stm32l432_ec11.c @@ -0,0 +1,183 @@ +/* Copyright 2022 @ Keychron (https://www.keychron.com) + * + * 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 . + */ + +#include "quantum.h" + +#ifdef RGB_MATRIX_ENABLE + +// clang-format off + +const ckled2001_led PROGMEM g_ckled2001_leds[DRIVER_LED_TOTAL] = { +/* Refer to IS31 manual for these locations + * driver + * | R location + * | | G location + * | | | B location + * | | | | */ + {0, C_2, A_2, B_2}, // ESC + {0, C_3, A_3, B_3}, // F1 + {0, C_4, A_4, B_4}, // F2 + {0, C_5, A_5, B_5}, // F3 + {0, C_6, A_6, B_6}, // F4 + {0, C_7, A_7, B_7}, // F5 + {0, C_8, A_8, B_8}, // F6 + {0, C_9, A_9, B_9}, // F7 + {0, C_10, A_10, B_10}, // F8 + {0, C_11, A_11, B_11}, // F9 + {0, C_12, A_12, B_12}, // F10 + {0, C_13, A_13, B_13}, // F11 + {0, C_14, A_14, B_14}, // F12 + {0, C_15, A_15, B_15}, // INS + {0, C_16, A_16, B_16}, // DEL + + {0, I_1, G_1, H_1}, // M1 + {0, I_2, G_2, H_2}, // `~ + {0, I_3, G_3, H_3}, // 1! + {0, I_4, G_4, H_4}, // 2@ + {0, I_5, G_5, H_5}, // 3# + {0, I_6, G_6, H_6}, // 4$ + {0, I_7, G_7, H_7}, // 5% + {0, I_8, G_8, H_8}, // 6^ + {0, I_9, G_9, H_9}, // 7& + {0, I_10, G_10, H_10}, // 8* + {0, I_11, G_11, H_11}, // 9( + {0, I_12, G_12, H_12}, // 0) + {0, I_13, G_13, H_13}, // -_ + {0, I_14, G_14, H_14}, // =+ + {0, I_15, G_15, H_15}, // BackSpace + {0, I_16, G_16, H_16}, // PgUp + + {0, F_1, D_1, E_1}, // M2 + {0, F_2, D_2, E_2}, // TAB + {0, F_3, D_3, E_3}, // Q + {0, F_4, D_4, E_4}, // W + {0, F_5, D_5, E_5}, // E + {0, F_6, D_6, E_6}, // R + {0, F_7, D_7, E_7}, // T + {0, F_8, D_8, E_8}, // Y + {0, F_9, D_9, E_9}, // U + {0, F_10, D_10, E_10}, // I + {0, F_11, D_11, E_11}, // O + {0, F_12, D_12, E_12}, // P + {0, F_13, D_13, E_13}, // [ + {0, F_14, D_14, E_14}, // ] + {0, F_15, D_15, E_15}, // | + {0, F_16, D_16, E_16}, // PgDn + + {1, C_16, A_16, B_16}, // M3 + {1, C_15, A_15, B_15}, // CapsLock + {1, C_14, A_14, B_14}, // A + {1, C_13, A_13, B_13}, // S + {1, C_12, A_12, B_12}, // D + {1, C_11, A_11, B_11}, // F + {1, C_10, A_10, B_10}, // G + {1, C_8, A_8, B_8}, // H + {1, C_7, A_7, B_7}, // J + {1, C_6, A_6, B_6}, // K + {1, C_5, A_5, B_5}, // L + {1, C_4, A_4, B_4}, // ; + {1, C_3, A_3, B_3}, // ' + {1, C_2, A_2, B_2}, // Enter + {1, C_1, A_1, B_1}, // Home + + {1, I_16, G_16, H_16}, // M4 + {1, I_15, G_15, H_15}, // Shift_L + {1, I_13, G_13, H_13}, // Z + {1, I_12, G_12, H_12}, // X + {1, I_11, G_11, H_11}, // C + {1, I_10, G_10, H_10}, // V + {1, I_9, G_9, H_9}, // B + {1, I_8, G_8, H_8}, // B + {1, I_7, G_7, H_7}, // N + {1, I_6, G_6, H_6}, // M + {1, I_5, G_5, H_5}, // , + {1, I_4, G_4, H_4}, // . + {1, I_3, G_3, H_3}, // ? + {1, I_2, G_2, H_2}, // Shift_R + {1, I_1, G_1, H_1}, // Up + + {1, F_16, D_16, E_16}, // M5 + {1, F_15, D_15, E_15}, // Ctrl_L + {1, F_14, D_14, E_14}, // Win_L + {1, F_13, D_13, E_13}, // Alt_L + {1, F_12, D_12, E_12}, // Space + {1, F_9, D_9, E_9}, // Fn + {1, F_8, D_8, E_8}, // Space + {1, F_7, D_7, E_7}, // Alt_R + {1, F_3, D_3, E_3}, // Left + {1, F_2, D_2, E_2}, // Down + {1, F_1, D_1, E_1}, // Right +}; + +#define __ NO_LED + +led_config_t g_led_config = { + { + // Key Matrix to LED Index + { __, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14 }, + { 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30 }, + { 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46 }, + { 47, 48, 49, 50, 51, 52, 53, __, 54, 55, 56, 57, 58, 59, 60, 61 }, + { 62, 63, __, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76 }, + { 77, 78, 79, 80, 81, __, __, 82, 83, 84, __, __, __, 85, 86, 87 }, + }, + { + // LED Index to Physical Position + {19,0}, {34,0}, {46,0}, {60,1}, {72,3}, {87,6}, {99,8}, {120,8}, {132,6}, {147,3}, {159,1}, {173,0}, {185,0}, {201,1}, {219,1}, + {5,14}, {24,14}, {36,14}, {48,13}, {62,15}, {74,17}, {86,20}, {98,22}, {115,22}, {127,20}, {139,17}, {151,15}, {165,13}, {177,14}, {195,14}, {220,13}, + {4,24}, {24,24}, {40,24}, {53,24}, {65,27}, {77,29}, {89,31}, {112,33}, {124,31}, {136,29}, {148,27}, {160,24}, {174,24}, {186,24}, {201,24}, {222,25}, + {2,34}, {23,34}, {40,34}, {54,35}, {66,37}, {78,39}, {90,42}, {118,43}, {130,40}, {142,38}, {154,36}, {167,35}, {179,35}, {199,35}, {224,36}, + {0,45}, {24,45}, {44,45}, {57,46}, {69,48}, {81,51}, {93,53}, {111,54}, {123,52}, {135,50}, {147,48}, {159,46}, {173,45}, {190,45}, {210,47}, + {0,55}, {18,55}, {33,55}, {56,57}, {77,61}, {97,64}, {124,63}, {147,59}, {198,58}, {210,58}, {222,58}, + }, + { + // RGB LED Index to Flag + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1, 1, + 1, 1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1, + 1, 9, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1, 1, + 1, 1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1, 1, + 1, 1, 1, 1, 4, 1, 4, 1, 1, 1, 1, + } +}; + +// clang-format on + +#endif + +#ifdef ENCODER_ENABLE +# if defined(PAL_USE_CALLBACKS) + +void encoder0_pad_cb(void *param) { + (void)param; + + encoder_insert_state(0); +} + +void keyboard_post_init_kb(void) { + pin_t encoders_pad_a[] = ENCODERS_PAD_A; + pin_t encoders_pad_b[] = ENCODERS_PAD_B; + palEnableLineEvent(encoders_pad_a[0], PAL_EVENT_MODE_BOTH_EDGES); + palEnableLineEvent(encoders_pad_b[0], PAL_EVENT_MODE_BOTH_EDGES); + palSetLineCallback(encoders_pad_a[0], encoder0_pad_cb, NULL); + palSetLineCallback(encoders_pad_b[0], encoder0_pad_cb, NULL); + + // allow user keymaps to do custom post_init + keyboard_post_init_user(); +} + +# endif // ENCODER_ENABLE +#endif // PAL_USE_CALLBACKS diff --git a/keyboards/keychron/q10/q10_ansi_stm32l432_ec11/q10_ansi_stm32l432_ec11.h b/keyboards/keychron/q10/q10_ansi_stm32l432_ec11/q10_ansi_stm32l432_ec11.h new file mode 100644 index 0000000000..9e43a1a424 --- /dev/null +++ b/keyboards/keychron/q10/q10_ansi_stm32l432_ec11/q10_ansi_stm32l432_ec11.h @@ -0,0 +1,47 @@ +/* + * @Author: lalalademaxiya1 2831039915@qq.com + * @Date: 2022-08-23 23:29:21 + * @LastEditors: lalalademaxiya1 2831039915@qq.com + * @LastEditTime: 2022-08-27 11:00:26 + * @FilePath: /qmk_firmware/keyboards/keychron/q10/q10_ansi_stm32l432_ec11/q10_ansi_stm32l432_ec11.h + * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE + */ +/* Copyright 2021 @ Keychron (https://www.keychron.com) + * + * 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 . + */ + +#pragma once + +#include "quantum.h" + +#define XXX KC_NO + +// clang-format off + +#define LAYOUT_ansi_89( \ + K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E, K0F, \ + K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, K1E, K1F, \ + K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D, K2E, K2F, \ + K30, K31, K32, K33, K34, K35, K36, K38, K39, K3A, K3B, K3C, K3D, K3E, K3F, \ + K40, K41, K43, K44, K45, K46, K47, K48, K49, K4A, K4B, K4C, K4D, K4E, K4F, \ + K50, K51, K52, K53, K54, K57, K58, K59, K5D, K5E, K5F \ +) { \ + { K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, K0E, K0F }, \ + { K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, K1E, K1F }, \ + { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2C, K2D, K2E, K2F }, \ + { K30, K31, K32, K33, K34, K35, K36, XXX, K38, K39, K3A, K3B, K3C, K3D, K3E, K3F }, \ + { K40, K41, XXX, K43, K44, K45, K46, K47, K48, K49, K4A, K4B, K4C, K4D, K4E, K4F }, \ + { K50, K51, K52, K53, K54, XXX, XXX, K57, K58, K59, XXX, XXX, XXX, K5D, K5E, K5F } \ +} diff --git a/keyboards/keychron/q10/q10_ansi_stm32l432_ec11/readme.md b/keyboards/keychron/q10/q10_ansi_stm32l432_ec11/readme.md new file mode 100644 index 0000000000..d0ca742701 --- /dev/null +++ b/keyboards/keychron/q10/q10_ansi_stm32l432_ec11/readme.md @@ -0,0 +1,5 @@ +# The ANSI variant of the Keychron Q10 + +- Enable EC11 rotary encoder. +- Turn colckwise to increase volume and turn anti-colckwise to decrease volume. +- Press top left key pushbutton to mute. diff --git a/keyboards/keychron/q10/q10_ansi_stm32l432_ec11/rules.mk b/keyboards/keychron/q10/q10_ansi_stm32l432_ec11/rules.mk new file mode 100644 index 0000000000..729875a714 --- /dev/null +++ b/keyboards/keychron/q10/q10_ansi_stm32l432_ec11/rules.mk @@ -0,0 +1,35 @@ +# MCU name +MCU = STM32L432 + +# Bootloader selection +BOOTLOADER = stm32-dfu + +# Build Options +# change yes to no to disable +# +BOOTMAGIC_ENABLE = yes # Enable Bootmagic Lite +MOUSEKEY_ENABLE = yes # Mouse keys +EXTRAKEY_ENABLE = yes # Audio control and System control +CONSOLE_ENABLE = no # Console for debug +COMMAND_ENABLE = no # Commands for debug and configuration +NKRO_ENABLE = yes # Enable USB N-key Rollover +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality +RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow +AUDIO_ENABLE = no # Audio output +ENCODER_ENABLE = yes # Enable Encoder +ENCODER_MAP_ENABLE = yes +DIP_SWITCH_ENABLE = yes +RGB_MATRIX_ENABLE = yes +RGB_MATRIX_DRIVER = CKLED2001 +RAW_ENABLE = yes +LTO_ENABLE = yes +EEPROM_DRIVER = wear_leveling +WEAR_LEVELING_DRIVER = embedded_flash + +# Enter lower-power sleep mode when on the ChibiOS idle thread +OPT_DEFS += -DCORTEX_ENABLE_WFI_IDLE=TRUE + +# custom matrix setup +CUSTOM_MATRIX = lite + +SRC += matrix.c diff --git a/keyboards/keychron/q4/q4_ansi_stm32l432/config.h b/keyboards/keychron/q4/q4_ansi_stm32l432/config.h new file mode 100644 index 0000000000..5322f0d643 --- /dev/null +++ b/keyboards/keychron/q4/q4_ansi_stm32l432/config.h @@ -0,0 +1,36 @@ +/* Copyright 2021 @ Keychron (https://www.keychron.com) + * + * 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 . + */ + +#pragma once + +/* USB Device descriptor parameter */ +#define PRODUCT_ID 0x0140 +#define DEVICE_VER 0x0104 + +/* RGB Matrix Driver Configuration */ +#define DRIVER_COUNT 1 +#define DRIVER_ADDR_1 0b1110100 + +/* RGB Matrix Configuration */ +#define DRIVER_1_LED_TOTAL 61 +#define DRIVER_LED_TOTAL DRIVER_1_LED_TOTAL + +/* Enable CapsLcok LED*/ +#define CAPS_LOCK_LED_INDEX 28 + +/* Q4 uses single led controller chip, so define the LOW_CURRENT_MODE + * (effective in ckled2001.c) to set the current page individually. */ +#define LOW_CURRENT_MODE diff --git a/keyboards/keychron/q4/q4_ansi_stm32l432/info.json b/keyboards/keychron/q4/q4_ansi_stm32l432/info.json new file mode 100644 index 0000000000..ca12c178d0 --- /dev/null +++ b/keyboards/keychron/q4/q4_ansi_stm32l432/info.json @@ -0,0 +1,76 @@ +{ + "keyboard_name": "Keychron Q4", + "url": "https://github.com/Keychron", + "maintainer": "lalalademaxiya1", + "layouts": { + "LAYOUT_ansi_61": { + "layout": [ + {"label":"Esc", "x":0, "y":0}, + {"label":"1!", "x":1, "y":0}, + {"label":"2@", "x":2, "y":0}, + {"label":"3#", "x":3, "y":0}, + {"label":"4$", "x":4, "y":0}, + {"label":"5%", "x":5, "y":0}, + {"label":"6^", "x":6, "y":0}, + {"label":"7&", "x":7, "y":0}, + {"label":"8*", "x":8, "y":0}, + {"label":"9(", "x":9, "y":0}, + {"label":"0)", "x":10, "y":0}, + {"label":"-_", "x":11, "y":0}, + {"label":"=+", "x":12, "y":0}, + {"label":"Backspace", "x":13, "y":0, "w":2}, + + {"label":"Tab", "x":0, "y":1, "w":1.5}, + {"label":"Q", "x":1.5, "y":1}, + {"label":"W", "x":2.5, "y":1}, + {"label":"E", "x":3.5, "y":1}, + {"label":"R", "x":4.5, "y":1}, + {"label":"T", "x":5.5, "y":1}, + {"label":"Y", "x":6.5, "y":1}, + {"label":"U", "x":7.5, "y":1}, + {"label":"I", "x":8.5, "y":1}, + {"label":"O", "x":9.5, "y":1}, + {"label":"P", "x":10.5, "y":1}, + {"label":"[{", "x":11.5, "y":1}, + {"label":"]}", "x":12.5, "y":1}, + {"label":"\\|", "x":13.5, "y":1, "w":1.5}, + + {"label":"Caps Lock", "x":0, "y":2, "w":1.75}, + {"label":"A", "x":1.75, "y":2}, + {"label":"S", "x":2.75, "y":2}, + {"label":"D", "x":3.75, "y":2}, + {"label":"F", "x":4.75, "y":2}, + {"label":"G", "x":5.75, "y":2}, + {"label":"H", "x":6.75, "y":2}, + {"label":"J", "x":7.75, "y":2}, + {"label":"K", "x":8.75, "y":2}, + {"label":"L", "x":9.75, "y":2}, + {"label":":", "x":10.75, "y":2}, + {"label":"'\"", "x":11.75, "y":2}, + {"label":"Enter", "x":12.75, "y":2, "w":2.25}, + + {"label":"Shift", "x":0, "y":3, "w":2.25}, + {"label":"Z", "x":2.25, "y":3}, + {"label":"X", "x":3.25, "y":3}, + {"label":"C", "x":4.25, "y":3}, + {"label":"V", "x":5.25, "y":3}, + {"label":"B", "x":6.25, "y":3}, + {"label":"N", "x":7.25, "y":3}, + {"label":"M", "x":8.25, "y":3}, + {"label":",<", "x":9.25, "y":3}, + {"label":".>", "x":10.25, "y":3}, + {"label":"/?", "x":11.25, "y":3}, + {"label":"Shift", "x":12.25, "y":3, "w":2.75}, + + {"label":"Ctrl", "x":0, "y":4, "w":1.25}, + {"label":"Win", "x":1.25, "y":4, "w":1.25}, + {"label":"Alt", "x":2.5, "y":4, "w":1.25}, + {"label":"Space", "x":3.75, "y":4, "w":6.25}, + {"label":"Alt", "x":10, "y":4, "w":1.25}, + {"label":"Fn1", "x":11.25, "y":4, "w":1.25}, + {"label":"Fn2", "x":12.5, "y":4, "w":1.25}, + {"label":"Ctrl", "x":13.75, "y":4, "w":1.25} + ] + } + } +} diff --git a/keyboards/keychron/q4/q4_ansi_stm32l432/keymaps/default/keymap.c b/keyboards/keychron/q4/q4_ansi_stm32l432/keymaps/default/keymap.c new file mode 100644 index 0000000000..b0d6013761 --- /dev/null +++ b/keyboards/keychron/q4/q4_ansi_stm32l432/keymaps/default/keymap.c @@ -0,0 +1,143 @@ +/* Copyright 2021 @ Keychron (https://www.keychron.com) + * + * 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 . + */ + +#include QMK_KEYBOARD_H +#include "test.h" + +enum layers { + MAC_BASE, + WIN_BASE, + _FN1, + _FN2, + _FN3 +}; + +enum custom_keycodes { + KC_MISSION_CONTROL = SAFE_RANGE, + KC_LAUNCHPAD, + KC_LOPTN, + KC_ROPTN, + KC_LCMMD, + KC_RCMMD, + KC_TASK_VIEW, + KC_FILE_EXPLORER, + KC_SCREEN_SHOT +}; + +#define KC_MCTL KC_MISSION_CONTROL +#define KC_LPAD KC_LAUNCHPAD +#define KC_TASK KC_TASK_VIEW +#define KC_FLXP KC_FILE_EXPLORER +#define KC_SNAP KC_SCREEN_SHOT + +typedef struct PACKED { + uint8_t len; + uint8_t keycode[3]; +} key_combination_t; + +key_combination_t key_comb_list[3] = { + {2, {KC_LWIN, KC_TAB}}, + {2, {KC_LWIN, KC_E}}, + {3, {KC_LSFT, KC_LCMD, KC_4}} +}; + +static uint8_t mac_keycode[4] = { KC_LOPT, KC_ROPT, KC_LCMD, KC_RCMD }; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [MAC_BASE] = LAYOUT_ansi_61( + 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_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, + KC_LCTL, KC_LOPTN,KC_LCMMD, KC_SPC, KC_RCMMD, MO(_FN1), MO(_FN3), KC_RCTL), + + [WIN_BASE] = LAYOUT_ansi_61( + 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_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(_FN2), MO(_FN3), KC_RCTL), + + [_FN1] = LAYOUT_ansi_61( + KC_GRV, KC_BRID, KC_BRIU, KC_MCTL, KC_LPAD, RGB_VAD, RGB_VAI, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, RGB_MOD, + RGB_TOG, RGB_MOD, RGB_VAI, RGB_HUI, RGB_SAI, RGB_SPI, NK_TOGG, KC_TRNS, KC_TRNS, KC_TRNS, KC_INS, KC_PGUP, KC_HOME, KC_TRNS, + KC_TRNS, RGB_RMOD,RGB_VAD, RGB_HUD, RGB_SAD, RGB_SPD, KC_TRNS, KC_TRNS, KC_UP, KC_SNAP, KC_PGDN, KC_END, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_LEFT, KC_DOWN, KC_RIGHT, KC_DEL, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), + + [_FN2] = LAYOUT_ansi_61( + KC_GRV, KC_BRID, KC_BRIU, KC_TASK, KC_FLXP, RGB_VAD, RGB_VAI, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, RGB_MOD, + RGB_TOG, RGB_MOD, RGB_VAI, RGB_HUI, RGB_SAI, RGB_SPI, NK_TOGG, KC_TRNS, KC_APP, KC_SLCK, KC_INS, KC_PGUP, KC_HOME, KC_TRNS, + KC_TRNS, RGB_RMOD,RGB_VAD, RGB_HUD, RGB_SAD, RGB_SPD, KC_TRNS, KC_TRNS, KC_UP, KC_PSCR, KC_PGDN, KC_END, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_LEFT, KC_DOWN, KC_RIGHT, KC_DEL, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), + + [_FN3] = LAYOUT_ansi_61( + KC_TILD, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_TRNS, + RGB_TOG, RGB_MOD, RGB_VAI, RGB_HUI, RGB_SAI, RGB_SPI, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, RGB_RMOD,RGB_VAD, RGB_HUD, RGB_SAD, RGB_SPD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS) +}; + +bool dip_switch_update_user(uint8_t index, bool active) { + system_switch_state_report(index, active); + return true; +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case KC_MISSION_CONTROL: + if (record->event.pressed) { + host_consumer_send(0x29F); + } else { + host_consumer_send(0); + } + return false; // Skip all further processing of this key + case KC_LAUNCHPAD: + if (record->event.pressed) { + host_consumer_send(0x2A0); + } else { + host_consumer_send(0); + } + return false; // Skip all further processing of this key + case KC_LOPTN: + case KC_ROPTN: + case KC_LCMMD: + case KC_RCMMD: + if (record->event.pressed) { + register_code(mac_keycode[keycode - KC_LOPTN]); + } else { + unregister_code(mac_keycode[keycode - KC_LOPTN]); + } + return false; // Skip all further processing of this key + case KC_TASK: + case KC_FLXP: + case KC_SNAP: + if (record->event.pressed) { + for (uint8_t i = 0; i < key_comb_list[keycode - KC_TASK].len; i++) { + register_code(key_comb_list[keycode - KC_TASK].keycode[i]); + } + } else { + for (uint8_t i = 0; i < key_comb_list[keycode - KC_TASK].len; i++) { + unregister_code(key_comb_list[keycode - KC_TASK].keycode[i]); + } + } + return false; // Skip all further processing of this key + default: + return true; // Process all other keycodes normally + } +} diff --git a/keyboards/keychron/q4/q4_ansi_stm32l432/keymaps/ducoterra/keymap.c b/keyboards/keychron/q4/q4_ansi_stm32l432/keymaps/ducoterra/keymap.c new file mode 100644 index 0000000000..eb3129d267 --- /dev/null +++ b/keyboards/keychron/q4/q4_ansi_stm32l432/keymaps/ducoterra/keymap.c @@ -0,0 +1,143 @@ +/* Copyright 2021 @ Keychron (https://www.keychron.com) + * + * 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 . + */ + +#include QMK_KEYBOARD_H +#include "test.h" + +enum layers { + MAC_BASE, + WIN_BASE, + _FN1, + _FN2, + _FN3 +}; + +enum custom_keycodes { + KC_MISSION_CONTROL = SAFE_RANGE, + KC_LAUNCHPAD, + KC_LOPTN, + KC_ROPTN, + KC_LCMMD, + KC_RCMMD, + KC_TASK_VIEW, + KC_FILE_EXPLORER, + KC_SCREEN_SHOT +}; + +#define KC_MCTL KC_MISSION_CONTROL +#define KC_LPAD KC_LAUNCHPAD +#define KC_TASK KC_TASK_VIEW +#define KC_FLXP KC_FILE_EXPLORER +#define KC_SNAP KC_SCREEN_SHOT + +typedef struct PACKED { + uint8_t len; + uint8_t keycode[3]; +} key_combination_t; + +key_combination_t key_comb_list[3] = { + {2, {KC_LWIN, KC_TAB}}, + {2, {KC_LWIN, KC_E}}, + {3, {KC_LSFT, KC_LCMD, KC_4}} +}; + +static uint8_t mac_keycode[4] = { KC_LOPT, KC_ROPT, KC_LCMD, KC_RCMD }; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [MAC_BASE] = LAYOUT_ansi_61( + 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_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, + KC_LCTL, KC_LOPTN,KC_LCMMD, KC_SPC, KC_RCMMD, MO(_FN1), MO(_FN3), KC_RCTL), + + [WIN_BASE] = LAYOUT_ansi_61( + 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_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(_FN2), MO(_FN3), KC_RCTL), + + [_FN1] = LAYOUT_ansi_61( + KC_GRV, KC_BRID, KC_BRIU, KC_MCTL, KC_LPAD, RGB_VAD, RGB_VAI, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_INS, KC_PGUP, KC_HOME, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_UP, KC_SNAP, KC_PGDN, KC_END, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_LEFT, KC_DOWN, KC_RIGHT, KC_DEL, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), + + [_FN2] = LAYOUT_ansi_61( + KC_GRV, KC_BRID, KC_BRIU, KC_TASK, KC_FLXP, RGB_VAD, RGB_VAI, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_APP, KC_SLCK, KC_INS, KC_PGUP, KC_HOME, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_UP, KC_PSCR, KC_PGDN, KC_END, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_LEFT, KC_DOWN, KC_RIGHT, KC_DEL, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), + + [_FN3] = LAYOUT_ansi_61( + KC_TILD, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_TRNS, + RGB_TOG, RGB_MOD, RGB_VAI, RGB_HUI, RGB_SAI, RGB_SPI, NK_TOGG, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, QK_BOOT, + KC_TRNS, RGB_RMOD,RGB_VAD, RGB_HUD, RGB_SAD, RGB_SPD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS) +}; + +bool dip_switch_update_user(uint8_t index, bool active) { + system_switch_state_report(index, active); + return true; +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case KC_MISSION_CONTROL: + if (record->event.pressed) { + host_consumer_send(0x29F); + } else { + host_consumer_send(0); + } + return false; // Skip all further processing of this key + case KC_LAUNCHPAD: + if (record->event.pressed) { + host_consumer_send(0x2A0); + } else { + host_consumer_send(0); + } + return false; // Skip all further processing of this key + case KC_LOPTN: + case KC_ROPTN: + case KC_LCMMD: + case KC_RCMMD: + if (record->event.pressed) { + register_code(mac_keycode[keycode - KC_LOPTN]); + } else { + unregister_code(mac_keycode[keycode - KC_LOPTN]); + } + return false; // Skip all further processing of this key + case KC_TASK: + case KC_FLXP: + case KC_SNAP: + if (record->event.pressed) { + for (uint8_t i = 0; i < key_comb_list[keycode - KC_TASK].len; i++) { + register_code(key_comb_list[keycode - KC_TASK].keycode[i]); + } + } else { + for (uint8_t i = 0; i < key_comb_list[keycode - KC_TASK].len; i++) { + unregister_code(key_comb_list[keycode - KC_TASK].keycode[i]); + } + } + return false; // Skip all further processing of this key + default: + return true; // Process all other keycodes normally + } +} diff --git a/keyboards/keychron/q4/q4_ansi_stm32l432/keymaps/via/config.h b/keyboards/keychron/q4/q4_ansi_stm32l432/keymaps/via/config.h new file mode 100644 index 0000000000..84d17b3721 --- /dev/null +++ b/keyboards/keychron/q4/q4_ansi_stm32l432/keymaps/via/config.h @@ -0,0 +1,20 @@ +/* Copyright 2022 @ Keychron (https://www.keychron.com) + * + * 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 . + */ + +#pragma once + +/* Set dynamic keymap layer counts to 5 */ +#define DYNAMIC_KEYMAP_LAYER_COUNT 5 diff --git a/keyboards/keychron/q4/q4_ansi_stm32l432/keymaps/via/keymap.c b/keyboards/keychron/q4/q4_ansi_stm32l432/keymaps/via/keymap.c new file mode 100644 index 0000000000..2984bab06d --- /dev/null +++ b/keyboards/keychron/q4/q4_ansi_stm32l432/keymaps/via/keymap.c @@ -0,0 +1,143 @@ +/* Copyright 2021 @ Keychron (https://www.keychron.com) + * + * 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 . + */ + +#include QMK_KEYBOARD_H +#include "test.h" + +enum layers { + MAC_BASE, + WIN_BASE, + _FN1, + _FN2, + _FN3 +}; + +enum custom_keycodes { + KC_MISSION_CONTROL = USER00, + KC_LAUNCHPAD, + KC_LOPTN, + KC_ROPTN, + KC_LCMMD, + KC_RCMMD, + KC_TASK_VIEW, + KC_FILE_EXPLORER, + KC_SCREEN_SHOT +}; + +#define KC_MCTL KC_MISSION_CONTROL +#define KC_LPAD KC_LAUNCHPAD +#define KC_TASK KC_TASK_VIEW +#define KC_FLXP KC_FILE_EXPLORER +#define KC_SNAP KC_SCREEN_SHOT + +typedef struct PACKED { + uint8_t len; + uint8_t keycode[3]; +} key_combination_t; + +key_combination_t key_comb_list[3] = { + {2, {KC_LWIN, KC_TAB}}, + {2, {KC_LWIN, KC_E}}, + {3, {KC_LSFT, KC_LCMD, KC_4}} +}; + +static uint8_t mac_keycode[4] = { KC_LOPT, KC_ROPT, KC_LCMD, KC_RCMD }; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [MAC_BASE] = LAYOUT_ansi_61( + 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_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, + KC_LCTL, KC_LOPTN,KC_LCMMD, KC_SPC, KC_RCMMD, MO(_FN1), MO(_FN3), KC_RCTL), + + [WIN_BASE] = LAYOUT_ansi_61( + 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_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, + KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, + KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(_FN2), MO(_FN3), KC_RCTL), + + [_FN1] = LAYOUT_ansi_61( + KC_GRV, KC_BRID, KC_BRIU, KC_MCTL, KC_LPAD, RGB_VAD, RGB_VAI, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, RGB_MOD, + RGB_TOG, RGB_MOD, RGB_VAI, RGB_HUI, RGB_SAI, RGB_SPI, NK_TOGG, KC_TRNS, KC_TRNS, KC_TRNS, KC_INS, KC_PGUP, KC_HOME, KC_TRNS, + KC_TRNS, RGB_RMOD,RGB_VAD, RGB_HUD, RGB_SAD, RGB_SPD, KC_TRNS, KC_TRNS, KC_UP, KC_SNAP, KC_PGDN, KC_END, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_LEFT, KC_DOWN, KC_RIGHT, KC_DEL, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), + + [_FN2] = LAYOUT_ansi_61( + KC_GRV, KC_BRID, KC_BRIU, KC_TASK, KC_FLXP, RGB_VAD, RGB_VAI, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, RGB_MOD, + RGB_TOG, RGB_MOD, RGB_VAI, RGB_HUI, RGB_SAI, RGB_SPI, NK_TOGG, KC_TRNS, KC_APP, KC_SLCK, KC_INS, KC_PGUP, KC_HOME, KC_TRNS, + KC_TRNS, RGB_RMOD,RGB_VAD, RGB_HUD, RGB_SAD, RGB_SPD, KC_TRNS, KC_TRNS, KC_UP, KC_PSCR, KC_PGDN, KC_END, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_LEFT, KC_DOWN, KC_RIGHT, KC_DEL, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS), + + [_FN3] = LAYOUT_ansi_61( + KC_TILD, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_TRNS, + RGB_TOG, RGB_MOD, RGB_VAI, RGB_HUI, RGB_SAI, RGB_SPI, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, RGB_RMOD,RGB_VAD, RGB_HUD, RGB_SAD, RGB_SPD, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS) +}; + +bool dip_switch_update_user(uint8_t index, bool active) { + system_switch_state_report(index, active); + return true; +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case KC_MISSION_CONTROL: + if (record->event.pressed) { + host_consumer_send(0x29F); + } else { + host_consumer_send(0); + } + return false; // Skip all further processing of this key + case KC_LAUNCHPAD: + if (record->event.pressed) { + host_consumer_send(0x2A0); + } else { + host_consumer_send(0); + } + return false; // Skip all further processing of this key + case KC_LOPTN: + case KC_ROPTN: + case KC_LCMMD: + case KC_RCMMD: + if (record->event.pressed) { + register_code(mac_keycode[keycode - KC_LOPTN]); + } else { + unregister_code(mac_keycode[keycode - KC_LOPTN]); + } + return false; // Skip all further processing of this key + case KC_TASK: + case KC_FLXP: + case KC_SNAP: + if (record->event.pressed) { + for (uint8_t i = 0; i < key_comb_list[keycode - KC_TASK].len; i++) { + register_code(key_comb_list[keycode - KC_TASK].keycode[i]); + } + } else { + for (uint8_t i = 0; i < key_comb_list[keycode - KC_TASK].len; i++) { + unregister_code(key_comb_list[keycode - KC_TASK].keycode[i]); + } + } + return false; // Skip all further processing of this key + default: + return true; // Process all other keycodes normally + } +} diff --git a/keyboards/keychron/q4/q4_ansi_stm32l432/keymaps/via/rules.mk b/keyboards/keychron/q4/q4_ansi_stm32l432/keymaps/via/rules.mk new file mode 100644 index 0000000000..1e5b99807c --- /dev/null +++ b/keyboards/keychron/q4/q4_ansi_stm32l432/keymaps/via/rules.mk @@ -0,0 +1 @@ +VIA_ENABLE = yes diff --git a/keyboards/keychron/q4/q4_ansi_stm32l432/q4_ansi_stm32l432.c b/keyboards/keychron/q4/q4_ansi_stm32l432/q4_ansi_stm32l432.c new file mode 100644 index 0000000000..4df7fa8f5e --- /dev/null +++ b/keyboards/keychron/q4/q4_ansi_stm32l432/q4_ansi_stm32l432.c @@ -0,0 +1,124 @@ +/* Copyright 2021 @ Keychron (https://www.keychron.com) + * + * 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 . + */ + +#include "quantum.h" + +#ifdef RGB_MATRIX_ENABLE + +const ckled2001_led PROGMEM g_ckled2001_leds[DRIVER_LED_TOTAL] = { +/* Refer to CKLED manual for these locations + * driver + * | R location + * | | G location + * | | | B location + * | | | | */ + {0, F_1, D_1, E_1}, + {0, F_2, D_2, E_2}, + {0, F_3, D_3, E_3}, + {0, F_4, D_4, E_4}, + {0, F_5, D_5, E_5}, + {0, F_6, D_6, E_6}, + {0, F_7, D_7, E_7}, + {0, F_8, D_8, E_8}, + {0, F_9, D_9, E_9}, + {0, F_10, D_10, E_10}, + {0, F_11, D_11, E_11}, + {0, F_12, D_12, E_12}, + {0, F_13, D_13, E_13}, + {0, F_14, D_14, E_14}, + + {0, I_1, G_1, H_1}, + {0, I_2, G_2, H_2}, + {0, I_3, G_3, H_3}, + {0, I_4, G_4, H_4}, + {0, I_5, G_5, H_5}, + {0, I_6, G_6, H_6}, + {0, I_7, G_7, H_7}, + {0, I_8, G_8, H_8}, + {0, I_9, G_9, H_9}, + {0, I_10, G_10, H_10}, + {0, I_11, G_11, H_11}, + {0, I_12, G_12, H_12}, + {0, I_13, G_13, H_13}, + {0, I_14, G_14, H_14}, + + {0, L_1, J_1, K_1}, + {0, L_2, J_2, K_2}, + {0, L_3, J_3, K_3}, + {0, L_4, J_4, K_4}, + {0, L_5, J_5, K_5}, + {0, L_6, J_6, K_6}, + {0, L_7, J_7, K_7}, + {0, L_8, J_8, K_8}, + {0, L_9, J_9, K_9}, + {0, L_10, J_10, K_10}, + {0, L_11, J_11, K_11}, + {0, L_12, J_12, K_12}, + {0, L_14, J_14, K_14}, + + {0, C_1, A_1, B_1}, + {0, C_3, A_3, B_3}, + {0, C_4, A_4, B_4}, + {0, C_5, A_5, B_5}, + {0, C_6, A_6, B_6}, + {0, C_7, A_7, B_7}, + {0, C_8, A_8, B_8}, + {0, C_9, A_9, B_9}, + {0, C_10, A_10, B_10}, + {0, C_11, A_11, B_11}, + {0, C_12, A_12, B_12}, + {0, C_14, A_14, B_14}, + + {0, C_15, A_15, B_15}, + {0, C_16, A_16, B_16}, + {0, L_15, J_15, K_15}, + {0, L_16, J_16, K_16}, + {0, I_15, G_15, H_15}, + {0, I_16, G_16, H_16}, + {0, F_15, D_15, E_15}, + {0, F_16, D_16, E_16}, +}; + +#define __ NO_LED + +led_config_t g_led_config = { + { + // Key Matrix to LED Index + { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13 }, + { 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27 }, + { 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, __, 40 }, + { 41, __, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, __, 52 }, + { 53, 54, 55, __, __, __, 56, __, __, __, 57, 58, 59, 60 }, + }, + { + // LED Index to Physical Position + {0,0}, {16,0}, {32,0}, {48,0}, {64,0}, {81,0}, {97,0}, {113,0}, {129,0}, {145,0}, {161,0}, {177,0}, {193,0}, {218,0}, + {4,16}, {24,16}, {40,16}, {56,16}, {73,16}, {89,16}, {105,16}, {121,16}, {137,16}, {153,16}, {169,16}, {185,16}, {202,16}, {222,16}, + {6,32}, {28,32}, {44,32}, {60,32}, {77,32}, {93,32}, {109,32}, {125,32}, {141,32}, {157,32}, {173,32}, {189,32}, {216,32}, + {10,48}, {36,48}, {52,48}, {69,48}, {85,48}, {101,48}, {117,48}, {133,48}, {149,48}, {165,48}, {181,48}, {212,48}, + {2,64}, {22,64}, {42,64}, {103,64}, {164,64}, {184,64}, {204,64}, {224,64}, + }, + { + // RGB LED Index to Flag + 1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1, + 1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 8, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1, + 1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1, + 1, 1, 1, 4, 1, 1, 1, 1, + } +}; + +#endif diff --git a/keyboards/keychron/q4/q4_ansi_stm32l432/q4_ansi_stm32l432.h b/keyboards/keychron/q4/q4_ansi_stm32l432/q4_ansi_stm32l432.h new file mode 100644 index 0000000000..79dde5c83c --- /dev/null +++ b/keyboards/keychron/q4/q4_ansi_stm32l432/q4_ansi_stm32l432.h @@ -0,0 +1,35 @@ +/* Copyright 2021 @ Keychron (https://www.keychron.com) + * + * 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 . + */ + +#pragma once + +#include "quantum.h" + +#define XXX KC_NO + +#define LAYOUT_ansi_61( \ + K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D, \ + K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D, \ + K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, K2D, \ + K30, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, K3D, \ + K40, K41, K42, K46, K4A, K4B, K4C, K4D \ +) { \ + { K00, K01, K02, K03, K04, K05, K06, K07, K08, K09, K0A, K0B, K0C, K0D }, \ + { K10, K11, K12, K13, K14, K15, K16, K17, K18, K19, K1A, K1B, K1C, K1D }, \ + { K20, K21, K22, K23, K24, K25, K26, K27, K28, K29, K2A, K2B, XXX, K2D }, \ + { K30, XXX, K32, K33, K34, K35, K36, K37, K38, K39, K3A, K3B, XXX, K3D }, \ + { K40, K41, K42, XXX, XXX, XXX, K46, XXX, XXX, XXX, K4A, K4B, K4C, K4D } \ +} diff --git a/keyboards/keychron/q4/q4_ansi_stm32l432/readme.md b/keyboards/keychron/q4/q4_ansi_stm32l432/readme.md new file mode 100644 index 0000000000..bd2f3fd8a8 --- /dev/null +++ b/keyboards/keychron/q4/q4_ansi_stm32l432/readme.md @@ -0,0 +1 @@ +# The ANSI variant of the Keychron Q4 diff --git a/keyboards/keychron/q4/q4_ansi_stm32l432/rules.mk b/keyboards/keychron/q4/q4_ansi_stm32l432/rules.mk new file mode 100644 index 0000000000..7d07610291 --- /dev/null +++ b/keyboards/keychron/q4/q4_ansi_stm32l432/rules.mk @@ -0,0 +1,28 @@ +# MCU name +MCU = STM32L432 + +# Bootloader selection +BOOTLOADER = stm32-dfu + +# Build Options +# change yes to no to disable. +# +BOOTMAGIC_ENABLE = yes # Enable Bootmagic Lite +MOUSEKEY_ENABLE = yes # Mouse keys +EXTRAKEY_ENABLE = yes # Audio control and System control +CONSOLE_ENABLE = no # Console for debug +COMMAND_ENABLE = no # Commands for debug and configuration +NKRO_ENABLE = yes # Enable USB N-key Rollover +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality +RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow +AUDIO_ENABLE = no # Audio output +ENCODER_ENABLE = no # Enable Encoder +DIP_SWITCH_ENABLE = yes +RGB_MATRIX_ENABLE = yes +RGB_MATRIX_DRIVER = CKLED2001 +RAW_ENABLE = yes + +# Enter lower-power sleep mode when on the ChibiOS idle thread +OPT_DEFS += -DCORTEX_ENABLE_WFI_IDLE=TRUE + +SRC += test.c