|
@@ -0,0 +1,165 @@
|
|
|
+// Copyright 2022 Fae Fankhauser (@CoffeeIsLife87)
|
|
|
+// SPDX-License-Identifier: GPL-2.0-or-later
|
|
|
+
|
|
|
+#include QMK_KEYBOARD_H
|
|
|
+
|
|
|
+enum custom_keycodes {
|
|
|
+ NULLKEY = SAFE_RANGE, // An empty key to start (and maybe end) the enum
|
|
|
+ #ifdef DYNAMIC_MACRO_ENABLE
|
|
|
+ MCR_PLY, // Macro play
|
|
|
+ MCR_REC, // Macro record
|
|
|
+ MCR_SWT, // Swap active macro
|
|
|
+ #endif
|
|
|
+};
|
|
|
+
|
|
|
+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
|
|
|
+ _END,
|
|
|
+};
|
|
|
+
|
|
|
+#ifdef DYNAMIC_MACRO_ENABLE
|
|
|
+ // Macro 1 is = 1, Macro 2 = -1, No macro = 0
|
|
|
+ static bool MACRO1 = true;
|
|
|
+ static bool RECORDING = false;
|
|
|
+
|
|
|
+ static uint16_t REC = DM_REC1;
|
|
|
+ static uint16_t PLY = DM_PLY1;
|
|
|
+
|
|
|
+ void dynamic_macro_record_start_user(void) {
|
|
|
+ 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
|
|
|
+
|
|
|
+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, XXXXXXX, XXXXXXX, 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, XXXXXXX, XXXXXXX, XXXXXXX, _______, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX
|
|
|
+ )
|
|
|
+};
|
|
|
+
|
|
|
+#define LAYER (get_highest_layer(layer_state))
|
|
|
+#define LAYER_SIZE (MATRIX_ROWS * MATRIX_COLS)
|
|
|
+#define CHECK_LED() \
|
|
|
+ if ((i >= DRIVER_LED_TOTAL) \
|
|
|
+ || ((g_led_config.flags[pos] == LED_FLAG_NONE) || (g_led_config.flags[pos] == LED_FLAG_UNDERGLOW))) \
|
|
|
+ continue
|
|
|
+
|
|
|
+#ifdef RGB_MATRIX_ENABLE
|
|
|
+
|
|
|
+ #ifdef UNDERGLOW_DISABLE
|
|
|
+ void keyboard_pre_init_user(void) {
|
|
|
+
|
|
|
+ for (int key_id = 0; key_id < DRIVER_LED_TOTAL; key_id++ ) {
|
|
|
+ if (g_led_config.flags[key_id] == LED_FLAG_UNDERGLOW) {
|
|
|
+ g_led_config.flags[key_id] = LED_FLAG_NONE;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ #endif
|
|
|
+
|
|
|
+ void rgb_matrix_indicators_advanced_user(uint8_t led_min, uint8_t led_max) {
|
|
|
+ if (LAYER != _MAIN) {
|
|
|
+
|
|
|
+ int DimmedMax = UINT8_MAX - (UINT8_MAX - rgb_matrix_config.hsv.v);
|
|
|
+
|
|
|
+ for (uint8_t i = led_min; i <= led_max; i++) {
|
|
|
+
|
|
|
+ uint8_t pos = ((uint8_t*)g_led_config.matrix_co)[i];
|
|
|
+
|
|
|
+ CHECK_LED(); // Check LED before moving on
|
|
|
+ uint16_t KC = pgm_read_word(&((uint16_t*)keymaps)[(LAYER_SIZE * LAYER) + i]);
|
|
|
+
|
|
|
+ if (KC == KC_NO) {
|
|
|
+ RGB_MATRIX_INDICATOR_SET_COLOR(pos, 0, 0, 0 );
|
|
|
+ }
|
|
|
+
|
|
|
+ #ifdef DYNAMIC_MACRO_ENABLE
|
|
|
+ else if (KC == MCR_SWT) {
|
|
|
+ if (!MACRO1) {
|
|
|
+ RGB_MATRIX_INDICATOR_SET_COLOR(pos, 0, DimmedMax, DimmedMax);
|
|
|
+ }
|
|
|
+ } else if (KC == MCR_REC) {
|
|
|
+ if (RECORDING) {
|
|
|
+ RGB_MATRIX_INDICATOR_SET_COLOR(pos, DimmedMax, 0, 0);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ #endif
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+#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
|
|
|
+
|
|
|
+ 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
|
|
|
+
|
|
|
+ #if defined(RGB_MATRIX_ENABLE) && defined(RGBLIGHT_ENABLE) // this only needs to be defined if both are enabled
|
|
|
+ case RGB_TOG: // We can intercept this keycode ig? Cool :)
|
|
|
+ if (record->event.pressed) {
|
|
|
+ if (rgb_matrix_is_enabled()) {
|
|
|
+ rgb_matrix_disable/*_noeeprom*/();
|
|
|
+ rgblight_enable/*_noeeprom*/();
|
|
|
+ } else if (rgblight_is_enabled()) {
|
|
|
+ rgb_matrix_disable/*_noeeprom*/();
|
|
|
+ rgblight_disable/*_noeeprom*/();
|
|
|
+ } else {
|
|
|
+ rgb_matrix_enable/*_noeeprom*/();
|
|
|
+ rgblight_disable/*_noeeprom*/();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+ #endif
|
|
|
+
|
|
|
+ default:
|
|
|
+ return true; //Process all other keycodes normally
|
|
|
+ }
|
|
|
+}
|