mirror of
https://github.com/qmk/qmk_firmware.git
synced 2024-11-30 15:05:50 +00:00
d4610906bf
Co-authored-by: Fae <faenkhauser@gmail.com>
302 lines
11 KiB
C
302 lines
11 KiB
C
// Copyright 2022 Fae Fankhauser (@CoffeeIsLife87)
|
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
|
|
#include QMK_KEYBOARD_H
|
|
|
|
enum custom_keycodes {
|
|
MCR_PLY = QK_USER, // Macro play
|
|
MCR_REC, // Macro record
|
|
MCR_SWT, // Swap active macro
|
|
MS_ACL_U, // Mouse speed up
|
|
MS_ACL_D, // Mouse speed down
|
|
};
|
|
|
|
enum layout_names {
|
|
_MAIN = 0, // Keys Layout: The main keyboard layout that has all the characters
|
|
_SUB, // Extension to Main
|
|
_CTR, // Macros, RGB, Audio controls, layer access. More or less the control center of my keyboard
|
|
#ifdef MOUSEKEY_ENABLE
|
|
_MSE,
|
|
#endif // MOUSEKEY_ENABLE
|
|
_END,
|
|
};
|
|
|
|
#ifdef MOUSEKEY_ENABLE
|
|
#include "action.h"
|
|
#define TOG_MSE TG(_MSE)
|
|
static int current_accel = 0;
|
|
#else
|
|
#define TOG_MSE XXXXXXX
|
|
#endif // MOUSEKEY_ENABLE
|
|
|
|
#ifdef DYNAMIC_MACRO_ENABLE
|
|
// Macro 1 is = 1, Macro 2 = -1, No macro = 0
|
|
static bool MACRO1 = true; // Determines whether or not we're using 1 or 2
|
|
static bool RECORDING = false;
|
|
static uint16_t REC = DM_REC1; // Record either macro 1 or 2. Or stop recording
|
|
static uint16_t PLY = DM_PLY1; // Play either macro 1 or macro 2
|
|
|
|
void dynamic_macro_record_start_user(int8_t direction) {
|
|
REC = DM_RSTP;
|
|
RECORDING = true;
|
|
}
|
|
|
|
void dynamic_macro_record_end_user(int8_t direction) {
|
|
RECORDING = false;
|
|
}
|
|
#else
|
|
#define MCR_PLY KC_NO
|
|
#define MCR_REC KC_NO
|
|
#define MCR_SWT KC_NO
|
|
#endif // DYNAMIC_MACRO_ENABLE
|
|
|
|
#ifdef TURBO_ENABLE
|
|
static bool turbo_active = false; // Only changed by TRBO_ST
|
|
static uint16_t turbo_keycode = KC_NO; // turbo_active can't be true if this is KC_NO
|
|
static bool turbo_key_pressed = false;
|
|
static bool turbo_keycode_selecting = false; // Determine new keycode or delay mode switch
|
|
static bool turbo_ms_delay_direction = true; // True is raise the delay, false is lower it
|
|
static uint16_t turbo_ms_delay_direction_indicator = 0;
|
|
static uint16_t turbo_ms_delay = 100; // Start at sending keycodes 10 times a second
|
|
static uint16_t turbo_timer; // Changed semi automatically
|
|
/*
|
|
* Because the KC's are wrapped in `LT()` they won't be interpreted as KC_NO or KC_TRNS
|
|
* Instead they'll just be like any other custom KC which will let me use them how I want
|
|
*/
|
|
#define TRBO_ST LT(_CTR, KC_NO )
|
|
#define TRBO_TI LT(_CTR, KC_TRNS)
|
|
#else
|
|
#define TRBO_ST KC_NO
|
|
#define TRBO_TI KC_NO
|
|
#endif
|
|
|
|
const uint16_t PROGMEM keymaps[_END][MATRIX_ROWS][MATRIX_COLS] = {
|
|
[_MAIN] = LAYOUT_planck_mit(
|
|
KC_ESC , KC_Q , KC_W , KC_E , KC_R , KC_T , KC_Y , KC_U , KC_I , KC_O , KC_P , KC_BSPC,
|
|
KC_TAB , KC_A , KC_S , KC_D , KC_F , KC_G , KC_H , KC_J , KC_K , KC_L , KC_SCLN, KC_QUOT,
|
|
KC_LSFT, KC_Z , KC_X , KC_C , KC_V , KC_B , KC_N , KC_M , KC_COMM, KC_DOT , KC_SLSH, KC_ENT ,
|
|
KC_LCTL, KC_LGUI, XXXXXXX,KC_LALT ,MO(_SUB), KC_SPC ,MO(_CTR), KC_LEFT, KC_DOWN, KC_UP , KC_RGHT
|
|
),
|
|
[_SUB] = LAYOUT_planck_mit(
|
|
KC_GRV , KC_1 , KC_2 , KC_3 , KC_4 , KC_5 , KC_6 , KC_7 , KC_8 , KC_9 , KC_0 , KC_DEL,
|
|
XXXXXXX, KC_F1 , KC_F2 , KC_F3 , KC_F4 , KC_F5 , KC_F6 , KC_MINS, KC_EQL , KC_LBRC, KC_RBRC, KC_PGUP,
|
|
_______, KC_F7 , KC_F8 , KC_F9 , KC_F10 , KC_F11 , KC_F12 , XXXXXXX, KC_HOME, KC_END , KC_BSLS, KC_PGDN,
|
|
_______, _______, XXXXXXX, _______, _______, _______ , _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX
|
|
),
|
|
[_CTR] = LAYOUT_planck_mit(
|
|
XXXXXXX, RGB_SPD, RGB_VAI, RGB_SPI, RGB_HUI, RGB_SAI, XXXXXXX, XXXXXXX, KC_VOLU, XXXXXXX, XXXXXXX, MCR_REC,
|
|
XXXXXXX, RGB_RMOD,RGB_VAD, RGB_MOD, RGB_HUD, RGB_SAD, XXXXXXX, KC_MPRV, KC_MPLY, KC_MNXT, XXXXXXX, MCR_PLY,
|
|
XXXXXXX, XXXXXXX, RGB_TOG, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, KC_VOLD, XXXXXXX, XXXXXXX, MCR_SWT,
|
|
XXXXXXX, XXXXXXX, XXXXXXX, TRBO_TI, TRBO_ST, TOG_MSE, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX
|
|
)
|
|
#ifdef MOUSEKEY_ENABLE
|
|
,[_MSE] = LAYOUT_planck_mit(
|
|
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
|
|
XXXXXXX, KC_MS_L, KC_MS_D, KC_MS_U, KC_MS_R, XXXXXXX, XXXXXXX, KC_BTN1, KC_WH_D, KC_WH_U, KC_BTN2, XXXXXXX,
|
|
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX,
|
|
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, MS_ACL_D, TOG_MSE, MS_ACL_U,XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX
|
|
)
|
|
#endif // MOUSEKEY_ENABLE
|
|
};
|
|
|
|
#ifdef RGB_MATRIX_ENABLE
|
|
|
|
#define LAYER (get_highest_layer(layer_state))
|
|
#define LAYER_SIZE (MATRIX_ROWS * MATRIX_COLS)
|
|
#define BRIGHTNESS rgb_matrix_get_val()
|
|
|
|
#ifdef UNDERGLOW_DISABLE
|
|
void keyboard_pre_init_user(void) {
|
|
for (int key_id = 0; key_id < RGB_MATRIX_LED_COUNT; key_id++ ) {
|
|
if (g_led_config.flags[key_id] == LED_FLAG_UNDERGLOW) {
|
|
g_led_config.flags[key_id] = LED_FLAG_NONE;
|
|
}
|
|
}
|
|
}
|
|
#endif // UNDERGLOW_DISABLE
|
|
|
|
bool rgb_matrix_indicators_advanced_user(uint8_t led_min, uint8_t led_max) {
|
|
if (LAYER == _MAIN) {return false;}
|
|
|
|
for (uint8_t i = led_min; i <= led_max; i++) {
|
|
uint8_t pos = ((uint8_t*)g_led_config.matrix_co)[i];
|
|
if (!HAS_ANY_FLAGS(g_led_config.flags[pos], (LED_FLAG_MODIFIER | LED_FLAG_KEYLIGHT))) {continue;}
|
|
uint16_t KC = pgm_read_word(&((uint16_t*)keymaps)[(LAYER_SIZE * LAYER) + i]);
|
|
|
|
switch (KC) {
|
|
case KC_NO:
|
|
RGB_MATRIX_INDICATOR_SET_COLOR(pos, 0, 0, 0 );
|
|
break;
|
|
|
|
#ifdef DYNAMIC_MACRO_ENABLE
|
|
case MCR_SWT:
|
|
if (!MACRO1) { RGB_MATRIX_INDICATOR_SET_COLOR(pos, 0, BRIGHTNESS, BRIGHTNESS); }
|
|
break;
|
|
|
|
case MCR_REC:
|
|
if (RECORDING) { RGB_MATRIX_INDICATOR_SET_COLOR(pos, BRIGHTNESS, 0, 0); }
|
|
break;
|
|
#endif // DYNAMIC_MACRO_ENABLE
|
|
|
|
#ifdef TURBO_ENABLE
|
|
case TRBO_ST:
|
|
if (turbo_keycode_selecting) {
|
|
RGB_MATRIX_INDICATOR_SET_COLOR(pos, BRIGHTNESS, BRIGHTNESS, BRIGHTNESS);
|
|
} else {
|
|
if (turbo_active) {
|
|
if (turbo_key_pressed) {
|
|
RGB_MATRIX_INDICATOR_SET_COLOR(pos, BRIGHTNESS, BRIGHTNESS, BRIGHTNESS);
|
|
} else {
|
|
RGB_MATRIX_INDICATOR_SET_COLOR(pos, 0, 0, 0);
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
|
|
case TRBO_TI:
|
|
if (turbo_ms_delay_direction_indicator != 0) {
|
|
uint8_t time = timer_elapsed(turbo_ms_delay_direction_indicator) / 200;
|
|
if (time > 0) {
|
|
if ((time % 2) == 1) {
|
|
if (turbo_ms_delay_direction) {
|
|
RGB_MATRIX_INDICATOR_SET_COLOR(pos, 0, BRIGHTNESS, 0);
|
|
} else {
|
|
RGB_MATRIX_INDICATOR_SET_COLOR(pos, BRIGHTNESS, 0, 0);
|
|
}
|
|
} else {
|
|
RGB_MATRIX_INDICATOR_SET_COLOR(pos, 0, 0, 0);
|
|
}
|
|
if (time >= 6) {
|
|
turbo_ms_delay_direction_indicator = 0;
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
#endif
|
|
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
#endif
|
|
|
|
#ifdef TURBO_ENABLE
|
|
void housekeeping_task_user(void) {
|
|
if (turbo_active) {
|
|
if (turbo_key_pressed) {
|
|
if (timer_elapsed(turbo_timer) > turbo_ms_delay) {
|
|
unregister_code(turbo_keycode);
|
|
turbo_key_pressed = false;
|
|
turbo_timer = timer_read();
|
|
}
|
|
} else {
|
|
if (timer_elapsed(turbo_timer) > (turbo_ms_delay / 2)) {
|
|
register_code(turbo_keycode);
|
|
turbo_key_pressed = true;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
#endif
|
|
|
|
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
|
|
#ifdef DYNAMIC_MACRO_ENABLE
|
|
if (keycode == MCR_REC) {keycode = REC;}
|
|
if (keycode == MCR_PLY) {keycode = PLY;}
|
|
if (!process_dynamic_macro(keycode, record)) {
|
|
REC = (MACRO1 ? DM_REC1 : DM_REC2);
|
|
return false;
|
|
}
|
|
#endif // DYNAMIC_MACRO_ENABLE
|
|
|
|
#ifdef MOUSEKEY_ENABLE
|
|
if ((keycode == MS_ACL_U) || (keycode == MS_ACL_D)) {
|
|
if (record->event.pressed) {
|
|
if ( (keycode == MS_ACL_U) && (current_accel < 2) ) { current_accel += 1; }
|
|
if ( (keycode == MS_ACL_D) && (current_accel > 0) ) { current_accel -= 1; }
|
|
}
|
|
keycode = KC_ACL0 + current_accel;
|
|
action_t mousekey_action = action_for_keycode(keycode);
|
|
process_action(record, mousekey_action);
|
|
}
|
|
#endif // MOUSEKEY_ENABLE
|
|
|
|
#ifdef TURBO_ENABLE
|
|
if (record->event.pressed) {
|
|
if (turbo_keycode_selecting) {
|
|
if (IS_BASIC_KEYCODE(keycode) ||
|
|
IS_MODIFIER_KEYCODE(keycode) ||
|
|
IS_JOYSTICK_KEYCODE(keycode) ||
|
|
IS_MOUSE_KEYCODE(keycode))
|
|
{
|
|
unregister_code(turbo_keycode);
|
|
turbo_key_pressed = false;
|
|
turbo_keycode = keycode;
|
|
turbo_keycode_selecting = false;
|
|
}
|
|
}
|
|
}
|
|
#endif
|
|
|
|
switch (keycode) {
|
|
#ifdef DYNAMIC_MACRO_ENABLE
|
|
case MCR_SWT:
|
|
if (!RECORDING && record->event.pressed) {
|
|
// if the button is pressed and we're not recording
|
|
MACRO1 = !MACRO1;
|
|
if (MACRO1) {
|
|
REC = DM_REC1;
|
|
PLY = DM_PLY1;
|
|
} else {
|
|
REC = DM_REC2;
|
|
PLY = DM_PLY2;
|
|
}
|
|
}
|
|
return false;
|
|
#endif // DYNAMIC_MACRO_ENABLE
|
|
|
|
#ifdef TURBO_ENABLE
|
|
case TRBO_ST:
|
|
if (record->event.pressed) {
|
|
if (!record->tap.count) {
|
|
turbo_keycode_selecting = !turbo_keycode_selecting;
|
|
} else {
|
|
if (turbo_keycode != KC_NO) {
|
|
if (!turbo_active) {
|
|
turbo_keycode_selecting = false;
|
|
turbo_active = true;
|
|
} else {
|
|
unregister_code(turbo_keycode);
|
|
turbo_key_pressed = false;
|
|
turbo_active = false;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return false;
|
|
|
|
case TRBO_TI:
|
|
if (record->event.pressed) {
|
|
if (!record->tap.count) {
|
|
turbo_ms_delay_direction = !turbo_ms_delay_direction;
|
|
turbo_ms_delay_direction_indicator = timer_read();
|
|
} else {
|
|
if (turbo_ms_delay_direction)
|
|
turbo_ms_delay += 20;
|
|
else
|
|
turbo_ms_delay -= 20;
|
|
|
|
if (turbo_ms_delay > 500) // half a second
|
|
turbo_ms_delay = 500;
|
|
if (turbo_ms_delay < 60) // Around 16 times a second
|
|
turbo_ms_delay = 60;
|
|
}
|
|
}
|
|
return false;
|
|
#endif
|
|
|
|
default:
|
|
return true; //Process all other keycodes normally
|
|
}
|
|
}
|