From 19dffff16d731e156cb427b3ce55144f6dd3b231 Mon Sep 17 00:00:00 2001 From: kemonine Date: Tue, 20 Oct 2020 22:42:09 -0400 Subject: [PATCH] Add underglow LEDs for Massdrop alt for layer indications --- keyboards/massdrop/alt/keymap.c | 564 +++++++++--------- .../massdrop/alt/massdrop_alt_kemonine.bin | Bin 48388 -> 48296 bytes .../massdrop/alt/keymaps/kemonine/keymap.c | 14 +- 3 files changed, 299 insertions(+), 279 deletions(-) diff --git a/keyboards/massdrop/alt/keymap.c b/keyboards/massdrop/alt/keymap.c index 8fb48f13..17227dcc 100644 --- a/keyboards/massdrop/alt/keymap.c +++ b/keyboards/massdrop/alt/keymap.c @@ -1,277 +1,287 @@ -#include "debug.h" -#include "action_layer.h" -#include "version.h" - -#include QMK_KEYBOARD_H - -#define TAPPING_TERM 200 - -#define CAPS_LED 30 -#define LALT_LED 60 - -#define RGB_KMN_NO_COLOR 0, 0, 0 -#define RGB_KMN_CYAN 128, 255, 255 -#define RGB_KMN_PRPL 215, 195, 42 -#define RGB_KMN_CYAN_HILIGHT 0, 191, 255 - -#define HS_KMN_ORANGE 10,255 -#define HS_KMN_CYAN 128, 255 - -keymap_config_t keymap_config; -rgb_config_t rgb_matrix_config; - -uint8_t cur_dance(qk_tap_dance_state_t *state); -void al_finished(qk_tap_dance_state_t *state, void *user_data); -void al_reset(qk_tap_dance_state_t *state, void *user_data); - -enum alt_keycodes { - U_T_AUTO = SAFE_RANGE, //USB Extra Port Toggle Auto Detect / Always Active - U_T_AGCR, //USB Toggle Automatic GCR control - DBG_TOG, //DEBUG Toggle On / Off - DBG_MTRX, //DEBUG Toggle Matrix Prints - DBG_KBD, //DEBUG Toggle Keyboard Prints - DBG_MOU, //DEBUG Toggle Mouse Prints - MD_BOOT, //Restart into bootloader after hold timeout -}; - -typedef struct { - bool is_press_action; - uint8_t state; -} tap; - -enum { - SINGLE_TAP = 1, - SINGLE_HOLD, - DOUBLE_TAP -}; - -enum td_keycodes { - LAYERS // Our example key: `MOD(1)` when held, `TG(2)` when tapped. Add additional keycodes for each tapdance. -}; - -qk_tap_dance_action_t tap_dance_actions[] = { - [LAYERS] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, al_finished, al_reset) -}; - -const uint8_t PROGMEM layercolors[][2] = { - [0] = {HS_KMN_ORANGE}, - [1] = {HS_KMN_CYAN}, - [2] = {HS_KMN_CYAN} -}; - -const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - [0] = LAYOUT_65_ansi_blocker(KC_GESC, 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_HOME, - 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, - LM(1, MOD_LALT), 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_END, - KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, TD(LAYERS), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT), - [1] = LAYOUT_65_ansi_blocker(KC_GRV, 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_DEL, - KC_CAPS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_UP, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RESET, KC_INS, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PSCR, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MEDIA_PLAY_PAUSE, KC_RSFT, KC_VOLU, KC_MUTE, - KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_RALT, RGB_VAD, KC_VOLD, RGB_VAI), - [2] = LAYOUT_65_ansi_blocker(KC_ESC, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, - KC_NO, KC_NO, KC_NO, KC_MS_UP, KC_NO, KC_NO, KC_NO, KC_MS_WH_UP, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, - KC_NO, KC_NO, KC_MS_LEFT, KC_MS_DOWN, KC_MS_RIGHT, KC_NO, KC_NO, KC_MS_BTN1, KC_MS_BTN2, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, - KC_LSFT, KC_NO, KC_X, KC_C, KC_V, KC_NO, KC_NO, KC_MS_WH_DOWN, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, - KC_LCTL, KC_NO, TG(2), KC_NO, TG(2), KC_NO, KC_NO, KC_NO, KC_NO), -}; - -const uint8_t PROGMEM ledcolors[][DRIVER_LED_TOTAL][3] = { - [1] = { - {RGB_KMN_CYAN}, {RGB_KMN_CYAN}, {RGB_KMN_CYAN}, {RGB_KMN_CYAN}, {RGB_KMN_CYAN}, {RGB_KMN_CYAN}, {RGB_KMN_CYAN}, {RGB_KMN_CYAN}, {RGB_KMN_CYAN}, {RGB_KMN_CYAN}, {RGB_KMN_CYAN}, {RGB_KMN_CYAN}, {RGB_KMN_CYAN}, {RGB_KMN_CYAN}, {RGB_KMN_CYAN}, - {RGB_KMN_CYAN}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_CYAN}, {RGB_KMN_CYAN}, - {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_CYAN}, - {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_CYAN}, {RGB_KMN_NO_COLOR}, {RGB_KMN_CYAN}, {RGB_KMN_CYAN}, - {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_CYAN}, {RGB_KMN_CYAN}, {RGB_KMN_CYAN}, {RGB_KMN_CYAN} - }, - [2] = { - {RGB_KMN_PRPL}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, - {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_PRPL}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_PRPL}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, - {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_PRPL}, {RGB_KMN_PRPL}, {RGB_KMN_PRPL}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_PRPL}, {RGB_KMN_PRPL}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, - {RGB_KMN_PRPL}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_PRPL}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, - {RGB_KMN_PRPL}, {RGB_KMN_NO_COLOR}, {RGB_KMN_PRPL}, {RGB_KMN_NO_COLOR}, {RGB_KMN_PRPL}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR} - }, -}; - -// Runs just one time when the keyboard initializes. -void matrix_init_user(void) { - rgb_matrix_config.raw = pgm_read_dword(EECONFIG_RGB_MATRIX); - - rgb_matrix_enable(); - rgb_matrix_sethsv(10, 255, 95); - rgb_matrix_mode(RGB_MATRIX_SOLID_COLOR); -}; - -// Runs constantly in the background, in a loop. -void matrix_scan_user(void) { -}; - -uint8_t cur_dance(qk_tap_dance_state_t *state) { - if (state->count == 1) { - if (!state->pressed) return SINGLE_TAP; - else return SINGLE_HOLD; - } else if (state->count == 2) return DOUBLE_TAP; - else return 8; -} - -// Initialize tap structure associated with example tap dance key -static tap al_tap_state = { - .is_press_action = true, - .state = 0 -}; - -// Functions that control what our tap dance key does -void al_finished(qk_tap_dance_state_t *state, void *user_data) { - al_tap_state.state = cur_dance(state); - switch (al_tap_state.state) { - case SINGLE_TAP: - layer_on(1); // Activate layer 1 immediately since we probably are holding this down ; if released it'll go away fast and shouldn't be an issue - break; - case SINGLE_HOLD: - layer_on(1); // Activate layer 1 since that's what the intent is - break; - case DOUBLE_TAP: - // Check to see if the layer is already set - if (layer_state_is(2)) { - // If already set, then switch it off - layer_off(2); - } else { - // If not already set, then switch the layer on - layer_on(2); - } - break; - } -} - -void al_reset(qk_tap_dance_state_t *state, void *user_data) { - // If the key was held down and now is released then switch off the layer - if (al_tap_state.state == SINGLE_HOLD) { - layer_off(1); // Reset state appropriately - } - al_tap_state.state = 0; -} - -// Set the colors for individual LEDs for a given layer -void set_leds_color( int layer) { - for (int i = 0; i < DRIVER_LED_TOTAL; i++) { - uint8_t val = pgm_read_byte(&ledcolors[layer][i][2]); - // if the brightness of the led is set to 0 in the map, - // the value is not overriden with global controls, allowing the led - // to appear turned off - HSV hsv = { .h = pgm_read_byte(&ledcolors[layer][i][0]), .s = pgm_read_byte(&ledcolors[layer][i][1]), .v = val == 0 ? 0 : rgb_matrix_config.hsv.v}; - RGB rgb = hsv_to_rgb( hsv ); - rgb_matrix_set_color( i, rgb.r, rgb.g, rgb.b ); - } -} - -// Set the colors for ALL LEDs for a given layer -void set_layer_color( uint8_t layer ) { - HSV hsv = { .h = pgm_read_byte(&layercolors[layer][0]), .s = pgm_read_byte(&layercolors[layer][1]), .v = rgb_matrix_config.hsv.v}; - RGB rgb = hsv_to_rgb( hsv ); - for (int i = 0; i < DRIVER_LED_TOTAL; i++) { - rgb_matrix_set_color( i, rgb.r, rgb.g, rgb.b ); - } -} - -// Override standard rgb colorization stuff -void rgb_matrix_indicators_user(void) { - uint32_t mode = rgblight_get_mode(); - // assign colors if the matrix is on and the current mode - // is SOLID COLORS => No animations running - if(rgb_matrix_config.enable == 1 && mode == RGB_MATRIX_SOLID_COLOR) { - uint8_t layer = biton32(layer_state); - switch (layer) { - case 0: - set_layer_color(0); - break; - case 1: - set_leds_color(1); - break; - case 2: - set_leds_color(2); - break; - } - } - if (host_keyboard_leds() & (1<event.pressed && MODS_SHIFT && MODS_CTRL) { - TOGGLE_FLAG_AND_PRINT(usb_extra_manual, "USB extra port manual mode"); - } - return false; - case U_T_AGCR: - if (record->event.pressed && MODS_SHIFT && MODS_CTRL) { - TOGGLE_FLAG_AND_PRINT(usb_gcr_auto, "USB GCR auto mode"); - } - return false; - case DBG_TOG: - if (record->event.pressed) { - TOGGLE_FLAG_AND_PRINT(debug_enable, "Debug mode"); - } - return false; - case DBG_MTRX: - if (record->event.pressed) { - TOGGLE_FLAG_AND_PRINT(debug_matrix, "Debug matrix"); - } - return false; - case DBG_KBD: - if (record->event.pressed) { - TOGGLE_FLAG_AND_PRINT(debug_keyboard, "Debug keyboard"); - } - return false; - case DBG_MOU: - if (record->event.pressed) { - TOGGLE_FLAG_AND_PRINT(debug_mouse, "Debug mouse"); - } - return false; - case MD_BOOT: - if (record->event.pressed) { - key_timer = timer_read32(); - } else { - if (timer_elapsed32(key_timer) >= 500) { - reset_keyboard(); - } - } - return false; - case RGB_TOG: - if (record->event.pressed) { - switch (rgb_matrix_get_flags()) { - case LED_FLAG_ALL: { - rgb_matrix_set_flags(LED_FLAG_KEYLIGHT); - rgb_matrix_set_color_all(0, 0, 0); - } - break; - case LED_FLAG_KEYLIGHT: { - rgb_matrix_set_flags(LED_FLAG_UNDERGLOW); - rgb_matrix_set_color_all(0, 0, 0); - } - break; - case LED_FLAG_UNDERGLOW: { - rgb_matrix_set_flags(LED_FLAG_NONE); - rgb_matrix_disable_noeeprom(); - } - break; - default: { - rgb_matrix_set_flags(LED_FLAG_ALL); - rgb_matrix_enable_noeeprom(); - } - break; - } - } - return false; - default: - return true; //Process all other keycodes normally - } -} +#include "debug.h" +#include "action_layer.h" +#include "version.h" + +#include QMK_KEYBOARD_H + +#define TAPPING_TERM 200 + +#define CAPS_LED 30 +#define LALT_LED 60 + +#define RGB_KMN_NO_COLOR 0, 0, 0 +#define RGB_KMN_CYAN 128, 255, 255 +#define RGB_KMN_PRPL 215, 195, 42 +#define RGB_KMN_CYAN_HILIGHT 0, 191, 255 + +#define HS_KMN_ORANGE 10,255 +#define HS_KMN_CYAN 128, 255 + +keymap_config_t keymap_config; +rgb_config_t rgb_matrix_config; + +uint8_t cur_dance(qk_tap_dance_state_t *state); +void al_finished(qk_tap_dance_state_t *state, void *user_data); +void al_reset(qk_tap_dance_state_t *state, void *user_data); + +enum alt_keycodes { + U_T_AUTO = SAFE_RANGE, //USB Extra Port Toggle Auto Detect / Always Active + U_T_AGCR, //USB Toggle Automatic GCR control + DBG_TOG, //DEBUG Toggle On / Off + DBG_MTRX, //DEBUG Toggle Matrix Prints + DBG_KBD, //DEBUG Toggle Keyboard Prints + DBG_MOU, //DEBUG Toggle Mouse Prints + MD_BOOT, //Restart into bootloader after hold timeout +}; + +typedef struct { + bool is_press_action; + uint8_t state; +} tap; + +enum { + SINGLE_TAP = 1, + SINGLE_HOLD, + DOUBLE_TAP +}; + +enum td_keycodes { + LAYERS // Our example key: `MOD(1)` when held, `TG(2)` when tapped. Add additional keycodes for each tapdance. +}; + +qk_tap_dance_action_t tap_dance_actions[] = { + [LAYERS] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, al_finished, al_reset) +}; + +const uint8_t PROGMEM layercolors[][2] = { + [0] = {HS_KMN_ORANGE}, + [1] = {HS_KMN_CYAN}, + [2] = {HS_KMN_CYAN} +}; + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + [0] = LAYOUT_65_ansi_blocker(KC_GESC, 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_HOME, + 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, + LM(1, MOD_LALT), 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_END, + KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, TD(LAYERS), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT), + [1] = LAYOUT_65_ansi_blocker(KC_GRV, 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_DEL, + KC_CAPS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_UP, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, RESET, KC_INS, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_PSCR, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_MEDIA_PLAY_PAUSE, KC_RSFT, KC_VOLU, KC_MUTE, + KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_RALT, RGB_VAD, KC_VOLD, RGB_VAI), + [2] = LAYOUT_65_ansi_blocker(KC_ESC, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, + KC_NO, KC_NO, KC_NO, KC_MS_UP, KC_NO, KC_NO, KC_NO, KC_MS_WH_UP, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, + KC_NO, KC_NO, KC_MS_LEFT, KC_MS_DOWN, KC_MS_RIGHT, KC_NO, KC_NO, KC_MS_BTN1, KC_MS_BTN2, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, + KC_LSFT, KC_NO, KC_X, KC_C, KC_V, KC_NO, KC_NO, KC_MS_WH_DOWN, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, KC_NO, + KC_LCTL, KC_NO, TG(2), KC_NO, TG(2), KC_NO, KC_NO, KC_NO, KC_NO), +}; + +const uint8_t PROGMEM ledcolors[][DRIVER_LED_TOTAL][3] = { + [1] = { + {RGB_KMN_CYAN}, {RGB_KMN_CYAN}, {RGB_KMN_CYAN}, {RGB_KMN_CYAN}, {RGB_KMN_CYAN}, {RGB_KMN_CYAN}, {RGB_KMN_CYAN}, {RGB_KMN_CYAN}, {RGB_KMN_CYAN}, {RGB_KMN_CYAN}, {RGB_KMN_CYAN}, {RGB_KMN_CYAN}, {RGB_KMN_CYAN}, {RGB_KMN_CYAN}, {RGB_KMN_CYAN}, + {RGB_KMN_CYAN}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_CYAN}, {RGB_KMN_CYAN}, + {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_CYAN}, + {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_CYAN}, {RGB_KMN_NO_COLOR}, {RGB_KMN_CYAN}, {RGB_KMN_CYAN}, + {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_CYAN}, {RGB_KMN_CYAN}, {RGB_KMN_CYAN}, {RGB_KMN_CYAN}, + // Underglow == 38 LEDS + {RGB_KMN_CYAN}, {RGB_KMN_CYAN}, {RGB_KMN_CYAN}, {RGB_KMN_CYAN}, {RGB_KMN_CYAN}, {RGB_KMN_CYAN}, {RGB_KMN_CYAN}, {RGB_KMN_CYAN}, {RGB_KMN_CYAN}, {RGB_KMN_CYAN}, + {RGB_KMN_CYAN}, {RGB_KMN_CYAN}, {RGB_KMN_CYAN}, {RGB_KMN_CYAN}, {RGB_KMN_CYAN}, {RGB_KMN_CYAN}, {RGB_KMN_CYAN}, {RGB_KMN_CYAN}, {RGB_KMN_CYAN}, {RGB_KMN_CYAN}, + {RGB_KMN_CYAN}, {RGB_KMN_CYAN}, {RGB_KMN_CYAN}, {RGB_KMN_CYAN}, {RGB_KMN_CYAN}, {RGB_KMN_CYAN}, {RGB_KMN_CYAN}, {RGB_KMN_CYAN}, {RGB_KMN_CYAN}, {RGB_KMN_CYAN}, + {RGB_KMN_CYAN}, {RGB_KMN_CYAN}, {RGB_KMN_CYAN}, {RGB_KMN_CYAN}, {RGB_KMN_CYAN}, {RGB_KMN_CYAN}, {RGB_KMN_CYAN}, {RGB_KMN_CYAN} + }, + [2] = { + {RGB_KMN_PRPL}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, + {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_PRPL}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_PRPL}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, + {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_PRPL}, {RGB_KMN_PRPL}, {RGB_KMN_PRPL}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_PRPL}, {RGB_KMN_PRPL}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, + {RGB_KMN_PRPL}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_PRPL}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, + {RGB_KMN_PRPL}, {RGB_KMN_NO_COLOR}, {RGB_KMN_PRPL}, {RGB_KMN_NO_COLOR}, {RGB_KMN_PRPL}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, {RGB_KMN_NO_COLOR}, + // Underglow == 38 LEDS + {RGB_KMN_PRPL}, {RGB_KMN_PRPL}, {RGB_KMN_PRPL}, {RGB_KMN_PRPL}, {RGB_KMN_PRPL}, {RGB_KMN_PRPL}, {RGB_KMN_PRPL}, {RGB_KMN_PRPL}, {RGB_KMN_PRPL}, {RGB_KMN_PRPL}, + {RGB_KMN_PRPL}, {RGB_KMN_PRPL}, {RGB_KMN_PRPL}, {RGB_KMN_PRPL}, {RGB_KMN_PRPL}, {RGB_KMN_PRPL}, {RGB_KMN_PRPL}, {RGB_KMN_PRPL}, {RGB_KMN_PRPL}, {RGB_KMN_PRPL}, + {RGB_KMN_PRPL}, {RGB_KMN_PRPL}, {RGB_KMN_PRPL}, {RGB_KMN_PRPL}, {RGB_KMN_PRPL}, {RGB_KMN_PRPL}, {RGB_KMN_PRPL}, {RGB_KMN_PRPL}, {RGB_KMN_PRPL}, {RGB_KMN_PRPL}, + {RGB_KMN_PRPL}, {RGB_KMN_PRPL}, {RGB_KMN_PRPL}, {RGB_KMN_PRPL}, {RGB_KMN_PRPL}, {RGB_KMN_PRPL}, {RGB_KMN_PRPL}, {RGB_KMN_PRPL} + }, +}; + +// Runs just one time when the keyboard initializes. +void matrix_init_user(void) { + rgb_matrix_config.raw = pgm_read_dword(EECONFIG_RGB_MATRIX); + + rgb_matrix_enable(); + rgb_matrix_sethsv(10, 255, 95); + rgb_matrix_mode(RGB_MATRIX_SOLID_COLOR); +}; + +// Runs constantly in the background, in a loop. +void matrix_scan_user(void) { +}; + +uint8_t cur_dance(qk_tap_dance_state_t *state) { + if (state->count == 1) { + if (!state->pressed) return SINGLE_TAP; + else return SINGLE_HOLD; + } else if (state->count == 2) return DOUBLE_TAP; + else return 8; +} + +// Initialize tap structure associated with example tap dance key +static tap al_tap_state = { + .is_press_action = true, + .state = 0 +}; + +// Functions that control what our tap dance key does +void al_finished(qk_tap_dance_state_t *state, void *user_data) { + al_tap_state.state = cur_dance(state); + switch (al_tap_state.state) { + case SINGLE_TAP: + layer_on(1); // Activate layer 1 immediately since we probably are holding this down ; if released it'll go away fast and shouldn't be an issue + break; + case SINGLE_HOLD: + layer_on(1); // Activate layer 1 since that's what the intent is + break; + case DOUBLE_TAP: + // Check to see if the layer is already set + if (layer_state_is(2)) { + // If already set, then switch it off + layer_off(2); + } else { + // If not already set, then switch the layer on + layer_on(2); + } + break; + } +} + +void al_reset(qk_tap_dance_state_t *state, void *user_data) { + // If the key was held down and now is released then switch off the layer + if (al_tap_state.state == SINGLE_HOLD) { + layer_off(1); // Reset state appropriately + } + al_tap_state.state = 0; +} + +// Set the colors for individual LEDs for a given layer +void set_leds_color( int layer) { + for (int i = 0; i < DRIVER_LED_TOTAL; i++) { + uint8_t val = pgm_read_byte(&ledcolors[layer][i][2]); + // if the brightness of the led is set to 0 in the map, + // the value is not overriden with global controls, allowing the led + // to appear turned off + HSV hsv = { .h = pgm_read_byte(&ledcolors[layer][i][0]), .s = pgm_read_byte(&ledcolors[layer][i][1]), .v = val == 0 ? 0 : rgb_matrix_config.hsv.v}; + RGB rgb = hsv_to_rgb( hsv ); + rgb_matrix_set_color( i, rgb.r, rgb.g, rgb.b ); + } +} + +// Set the colors for ALL LEDs for a given layer +void set_layer_color( uint8_t layer ) { + HSV hsv = { .h = pgm_read_byte(&layercolors[layer][0]), .s = pgm_read_byte(&layercolors[layer][1]), .v = rgb_matrix_config.hsv.v}; + RGB rgb = hsv_to_rgb( hsv ); + for (int i = 0; i < DRIVER_LED_TOTAL; i++) { + rgb_matrix_set_color( i, rgb.r, rgb.g, rgb.b ); + } +} + +// Override standard rgb colorization stuff +void rgb_matrix_indicators_user(void) { + uint32_t mode = rgblight_get_mode(); + // assign colors if the matrix is on and the current mode + // is SOLID COLORS => No animations running + if(rgb_matrix_config.enable == 1 && mode == RGB_MATRIX_SOLID_COLOR) { + uint8_t layer = biton32(layer_state); + switch (layer) { + case 0: + set_layer_color(0); + break; + case 1: + set_leds_color(1); + break; + case 2: + set_leds_color(2); + break; + } + } + if (host_keyboard_leds() & (1<event.pressed && MODS_SHIFT && MODS_CTRL) { + TOGGLE_FLAG_AND_PRINT(usb_extra_manual, "USB extra port manual mode"); + } + return false; + case U_T_AGCR: + if (record->event.pressed && MODS_SHIFT && MODS_CTRL) { + TOGGLE_FLAG_AND_PRINT(usb_gcr_auto, "USB GCR auto mode"); + } + return false; + case DBG_TOG: + if (record->event.pressed) { + TOGGLE_FLAG_AND_PRINT(debug_enable, "Debug mode"); + } + return false; + case DBG_MTRX: + if (record->event.pressed) { + TOGGLE_FLAG_AND_PRINT(debug_matrix, "Debug matrix"); + } + return false; + case DBG_KBD: + if (record->event.pressed) { + TOGGLE_FLAG_AND_PRINT(debug_keyboard, "Debug keyboard"); + } + return false; + case DBG_MOU: + if (record->event.pressed) { + TOGGLE_FLAG_AND_PRINT(debug_mouse, "Debug mouse"); + } + return false; + case MD_BOOT: + if (record->event.pressed) { + key_timer = timer_read32(); + } else { + if (timer_elapsed32(key_timer) >= 500) { + reset_keyboard(); + } + } + return false; + case RGB_TOG: + if (record->event.pressed) { + switch (rgb_matrix_get_flags()) { + case LED_FLAG_ALL: { + rgb_matrix_set_flags(LED_FLAG_KEYLIGHT); + rgb_matrix_set_color_all(0, 0, 0); + } + break; + case LED_FLAG_KEYLIGHT: { + rgb_matrix_set_flags(LED_FLAG_UNDERGLOW); + rgb_matrix_set_color_all(0, 0, 0); + } + break; + case LED_FLAG_UNDERGLOW: { + rgb_matrix_set_flags(LED_FLAG_NONE); + rgb_matrix_disable_noeeprom(); + } + break; + default: { + rgb_matrix_set_flags(LED_FLAG_ALL); + rgb_matrix_enable_noeeprom(); + } + break; + } + } + return false; + default: + return true; //Process all other keycodes normally + } +} diff --git a/keyboards/massdrop/alt/massdrop_alt_kemonine.bin b/keyboards/massdrop/alt/massdrop_alt_kemonine.bin index 02b2e40b4f82f83a27538be71dd05c1da6fc88b0..3ebedd9b958ea33793583317f341e81ebd4fd822 100644 GIT binary patch delta 23820 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 delta 24032 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