You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

248 lines
10 KiB

/* Copyright 2017 F_YUUCHI
* Copyright 2020 Drashna Jaelre <@drashna>
* Copyright 2020 Ben Roesner (keycapsss.com)
* Copyright 2022 Vii33 (https://github.com/vii33/mecha-keyboard-lily58l)
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include QMK_KEYBOARD_H
#include "enums.h"
#include "oled.h"
#include "process_record_user.h"
/* Layer quick names */
#define LOWER MO(_LOWER)
#define UPPER MO(_UPPER)
#define MOD TT(_MOD)
#define GAME TG(_GAME)
/* Key quick names */
#define QC_AT S(KC_2) // @
#define QC_EUR ALGR(KC_5) // €
#define QC_SS ALGR(KC_S) // ß
#define QC_SECT S(ALGR(KC_S)) // §
#define QC_DEG S(ALGR(KC_SCLN)) // °
#define QC_HAT S(KC_6) // ^
#define QC_AND S(KC_7) // &
#define QC_DQUT S(KC_QUOT) // "
#define QC_UNDO LCTL(KC_Z)
#define QC_REDO LCTL(KC_Y)
#define QC_CTLX LCTL(KC_X)
#define QC_CTLC LCTL(KC_C)
#define QC_CTLV LCTL(KC_V)
#define GMESCN LSFT(KC_F11)
#define CTALDEL LCTL(LALT(KC_DEL)) // CTRL+ALT+DEL
#define WINSCNS SGUI(KC_S) // WIN+SHIFT+S >> Screenshot
#define MUTE_MI RCS(KC_M) // CTRL+SHIFT+M or Windows 11: WIN + Alt + K
#define SHWI_T SGUI(KC_T) // WIN+SHIFT+T >> OCR
#define WRDLFT C(KC_LEFT) // CTRL+LEFT (Word left)
#define WRDRGT C(KC_RIGHT) // CTRL+RIGHT (Word right)
/* Animation Speeds */
//const uint8_t RGBLED_BREATHING_INTERVALS[] PROGMEM = {30, 20, 10, 5};
const uint8_t RGBLED_SNAKE_INTERVALS[] PROGMEM = {200, 150, 100};
#ifdef RGBLIGHT_LAYERS
/* Lightning Layers as status indicators. -> Array of segments */
const rgblight_segment_t PROGMEM mod_indicator[] = RGBLIGHT_LAYER_SEGMENTS(
{6, 4, HSV_GREEN} // First segment: Turn on 5 LEDs starting with #4
);
const rgblight_segment_t* const PROGMEM my_rgb_layers[] = RGBLIGHT_LAYERS_LIST(
mod_indicator // 0
);
void keyboard_post_init_user(void) {
rgblight_layers = my_rgb_layers; // Enable the LED layers
}
/* Callback when layer changes */
layer_state_t layer_state_set_user(layer_state_t state) {
/* Set my_rgb_layer 0 when comparison is true (here: _MOD Layer active) */
rgblight_set_layer_state(0, layer_state_cmp(state, _MOD));
return state;
}
#endif
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* QWERTY Example
* ,-----------------------------------------. ,-----------------------------------------.
* | ESC | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | - |
* |------+------+------+------+------+------| |------+------+------+------+------+------|
* | Tab | Q | W | E | R | T | | Y | U | I | O | P | Ü |
* |------+------+------+------+------+------| |------+------+------+------+------+------|
* | ' | A | S | D | F | G |-------. .-------| H | J | K | L | Ö | Ä |
* |------+------+------+------+------+------| Volume| | Scroll|------+------+------+------+------+------|
* | ` | Z | X | C | V | B |-------| |-------| N | M | , | . | ? |Enter |
* `-----------------------------------------/ / \ \-----------------------------------------'
* | / | MOD |LOWER | /Space / \Space \ |BackSP|UPPER |Delete|
* | | | |/ / \ \ | | | |
* `----------------------------' '------''--------------------'
*/
[_QWERTY] = LAYOUT(
KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS,
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, CC_UE,
SHFT_QT, KC_A, GUI_S, ALT_D, CTL_F, KC_G, KC_H, CTL_J, ALT_K, GUI_L, CC_OE, SHFT_AE,
CC_APHO, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_MUTE, MUTE_MI, KC_N, KC_M, CC_SCOLN, CC_COLN, CC_EXLM, KC_ENTER,
CC_SLH, MOD, LOWER, KC_SPC, KC_SPC, KC_BSPC, UPPER, KC_DEL
),
[_LOWER] = LAYOUT(
_______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11,
_______, SHWI_T, WINSCNS, QC_UNDO, QC_REDO, KC_ENTER, XXXXXXX, WRDLFT, KC_UP, WRDRGT, KC_PGUP, KC_F12,
_______, KC_BSPC, KC_LGUI, KC_LALT, KC_LCTL, KC_LSFT, XXXXXXX, KC_LEFT, KC_DOWN, KC_RGHT, KC_PGDN, _______,
XXXXXXX, KC_DEL, QC_CTLX, QC_CTLC, QC_CTLV, XXXXXXX, _______, _______, XXXXXXX, KC_HOME, KC_BSPC, KC_END, XXXXXXX, KC_ENT,
_______, _______, _______, _______, _______, _______, _______, _______
),
[_UPPER] = LAYOUT(
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, QC_AT, KC_TILD, QC_EUR, KC_PSCR, _______, KC_PAST, KC_LT, KC_LCBR, KC_RCBR, KC_PMNS, _______,
KC_PIPE, XXXXXXX, QC_SS, XXXXXXX, XXXXXXX, CTALDEL, KC_PSLS, KC_EQL, KC_LPRN, KC_RPRN, KC_PPLS, QC_DQUT,
QC_DEG, XXXXXXX, QC_CTLX, QC_CTLC, QC_CTLV, XXXXXXX, _______, _______, QC_HAT, KC_GT, KC_LBRC, KC_RBRC, QC_AND, KC_PENT,
_______, _______, _______, KC_LSFT, _______, _______, _______, _______
),
[_MOD] = LAYOUT(
RGB_TOG, KC_1, KC_2, KC_3, KC_4, KC_5, RGB_M_P, RGB_M_B, RGB_M_SW, RGB_M_G, KC_COMMA, GAME,
RGB_MOD, XXXXXXX, KC_BSPC, KC_UP, KC_DEL, XXXXXXX, KC_PAST, KC_P7, KC_P8, KC_P9, KC_PPLS, KC_PERC,
RGB_M_SN, XXXXXXX, KC_LEFT, KC_DOWN, KC_RIGHT, XXXXXXX, KC_PSLS, KC_P4, KC_P5, KC_P6, KC_PMNS, KC_EQL,
CC_ALRM, XXXXXXX, KC_HOME, XXXXXXX, KC_END, KC_NUM, CC_SAVRGB, _______, KC_P0, KC_P1, KC_P2, KC_P3, KC_DOT, KC_PENT,
XXXXXXX, _______, _______, KC_SPC, _______, _______, _______, _______
),
[_GAME] = LAYOUT(
KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, GAME,
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_PGUP,
KC_LSFT, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_F6, KC_PGDN,
KC_LCTL, KC_Z, KC_X, KC_C, KC_V, KC_B, GMESCN, KC_F12, KC_N, KC_M, KC_LEFT, KC_UP, KC_RIGHT, KC_DOWN,
KC_CAPS, KC_LALT, KC_SPC, KC_SPC, KC_ENT, KC_BSPC, KC_F7, KC_DEL
)
};
/* -------------------------------------------------------------------------------- */
/* Different tapping timings */
uint16_t get_tapping_term(uint16_t keycode, keyrecord_t *record) {
switch (keycode) {
case CTL_F:
case CTL_J:
return TAPPING_TERM - 20;
case GUI_S:
case GUI_L:
return TAPPING_TERM + 150;
case SHFT_QT:
case SHFT_AE:
return TAPPING_TERM - 80;
case MOD:
return TAPPING_TERM - 70;
default:
return TAPPING_TERM;
}
}
/* Tapping Force Hold done per key. Better than general setting. See also https://github.com/qmk/qmk_firmware/blob/master/docs/tap_hold.md */
bool get_tapping_force_hold(uint16_t keycode, keyrecord_t *record) {
switch (keycode) {
case GUI_S:
case ALT_D:
case CTL_F:
case CTL_J:
case ALT_K:
case GUI_L:
case SHFT_QT:
case SHFT_AE:
return true;
default:
return false;
}
}
/* Rotary encoder */
#ifdef ENCODER_ENABLE
bool encoder_update_user(uint8_t index, bool clockwise) {
if (index == 0) { // Encoder on master side
if (IS_LAYER_ON(_MOD)) // _MOD LAYER
{
if ( get_mods() & MOD_MASK_SHIFT ) {
if (clockwise) {
rgblight_increase_sat_noeeprom();
} else {
rgblight_decrease_sat_noeeprom();
}
} else {
if (clockwise) {
rgblight_increase_hue_noeeprom();
} else {
rgblight_decrease_hue_noeeprom();
}
}
} else { // _QWERTY LAYER and others
if (clockwise) {
tap_code(KC_VOLU);
} else {
tap_code(KC_VOLD);
}
}
} else if (index == 1) { // Encoder on slave side
if(IS_LAYER_ON(_LOWER)) { // _LOWER LAYER
if (clockwise) {
tap_code(KC_PGDN);
} else {
tap_code(KC_PGUP);
}
} else if (IS_LAYER_ON(_MOD)) // _MOD LAYER
{
if ( get_mods() & MOD_MASK_SHIFT ) {
if (clockwise) {
rgblight_increase_speed_noeeprom();
} else {
rgblight_decrease_speed_noeeprom();
}
} else {
if (clockwise) {
rgblight_increase_val_noeeprom();
} else {
rgblight_decrease_val_noeeprom();
}
}
} else { // _QWERTY LAYER and others
if (clockwise) {
tap_code(KC_DOWN);
} else {
tap_code(KC_UP);
}
}
}
return true;
}
#endif // ENCODER_ENABLE