/* Copyright 2022 mly32 * * 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 "binds.c" /* Index values of keys 0 |6 |12 |18 |23 |28 |34 |39 |44 |50 |56 |61 |66 |69 |----|----| 1 |7 |13 |19 |24 |29 |35 |40 |45 |51 |57 |62 |78 |85 |----|72 | 2 |8 |14 |20 |25 |30 |36 |41 |46 |52 |58 |63 |89 |93 |----|75 | 3 |9 |15 |21 |26 |31 |37 |42 |47 |53 |59 |64 |----|96 |----|86 | 4 |----|10 |16 |22 |27 |32 |38 |43 |48 |54 |60 |----|90 |94 |82 | 5 |11 |17 |--------------|33 |--------------|49 |55 |65 |95 |97 |79 | Index values of underglow keys 67,Side 01 | 68,Side 12 70,Side 02 | 71,Side 13 73,Side 03 | 74,Side 14 76,Side 04 | 77,Side 15 80,Side 05 | 81,Side 16 83,Side 06 | 84,Side 17 87,Side 07 | 88,Side 18 91,Side 08 | 92,Side 19 */ #ifdef ENCODER_ENABLE bool encoder_update_user(uint8_t index, bool clockwise) { if (get_mods() & MOD_MASK_CA && !(get_mods() & ~MOD_MASK_CA)) { /* only active mods are LCTRL, RCTRL, LALT, or RALT */ tap_code16(clockwise ? KC_TAB : LSFT(KC_TAB)); } else { tap_code16(clockwise ? KC_VOLU : KC_VOLD); } return false; } #endif /* expects [0..255], [0..255], [0..255] */ RGB relative_hsv(uint8_t h, uint8_t s, uint8_t v) { uint8_t scaled_v = (uint16_t)v * rgb_matrix_get_val() / 255; return hsv_to_rgb((HSV){.h = h, .s = s, .v = scaled_v}); } #ifdef RGB_MATRIX_ENABLE /* rgb data tied to rgb_matrix_indicators_advanced_user evaluation */ typedef struct rgb_data { /* maps a key to is row and column position * [0, 98) -> {0..255, 0..255} * non 255-valued keys: 82 (88 - 6; 5 keys with no led and 1 rotary knob) **/ led_point_t led_to_pos[DRIVER_LED_TOTAL]; /* keys that will always have no rgb */ uint8_t dark_keys_sz; uint8_t* dark_keys; /* momentary layer keys */ uint8_t mo_keys_sz; uint8_t* mo_keys; /* color values */ uint8_t dark_v; uint8_t white_v; uint8_t white_s; uint8_t nkro_h; uint8_t caps_h; } rgb_data_t; void init_rgb_data(rgb_data_t* t) { for (uint8_t i = 0; i < DRIVER_LED_TOTAL; i++) { t->led_to_pos[i] = (led_point_t){.x = 255, .y = 255}; } for (uint8_t i = 0; i < MATRIX_ROWS; i++) { for (uint8_t j = 0; j < MATRIX_COLS; j++) { uint8_t idx = g_led_config.matrix_co[i][j]; if (idx != NO_LED) { t->led_to_pos[idx] = (led_point_t){.x = i, .y = j}; } } } uint8_t dark_keys[] = {33}; t->dark_keys_sz = sizeof(dark_keys) / sizeof(dark_keys[0]); t->dark_keys = (uint8_t*)malloc(sizeof(dark_keys)); for (uint8_t i = 0; i < t->dark_keys_sz; ++i) { t->dark_keys[i] = dark_keys[i]; } uint8_t mo_keys[] = {49, 55}; t->mo_keys_sz = sizeof(mo_keys) / sizeof(mo_keys[0]); t->mo_keys = (uint8_t*)malloc(sizeof(mo_keys)); for (uint8_t i = 0; i < t->mo_keys_sz; ++i) { t->mo_keys[i] = mo_keys[i]; t->led_to_pos[mo_keys[i]] = (led_point_t){.x = 255, .y = 255}; } t->dark_v = 0x30; t->white_v = 0xFF; t->white_s = 0xFF; t->nkro_h = 0x55; t->caps_h = 0xAA; } rgb_data_t rgb; void keyboard_post_init_user(void) { init_rgb_data(&rgb); } void rgb_matrix_indicators_advanced_user(uint8_t led_min, uint8_t led_max) { uint8_t l = get_highest_layer(layer_state); /* darken all dark keys (regardless of layer) */ RGB dark = relative_hsv(0, 0, rgb.dark_v); for (uint8_t i = 0; i < rgb.dark_keys_sz; i++) { rgb_matrix_set_color(rgb.dark_keys[i], dark.r, dark.g, dark.b); } /* color non-default keys in non-default layers */ RGB gray = relative_hsv(0, 0, rgb.white_v); bool nkro_off = !keymap_config.nkro; bool caps_on = host_keyboard_led_state().caps_lock; if (nkro_off && caps_on) { gray = relative_hsv((rgb.nkro_h + rgb.caps_h) / 2, /* average hue */ rgb.white_s, rgb.white_v); } else if (nkro_off) { gray = relative_hsv(rgb.nkro_h, rgb.white_s, rgb.white_v); } else if (caps_on) { gray = relative_hsv(rgb.caps_h, rgb.white_s, rgb.white_v); } if (l != get_highest_layer(default_layer_state)) { for (uint8_t i = led_min; i <= led_max; i++) { led_point_t p = rgb.led_to_pos[i]; if (p.x != 255 && keymaps[l][p.x][p.y] != KC_TRNS) { rgb_matrix_set_color(i, gray.r, gray.g, gray.b); } } for (uint8_t i = 0; i < rgb.mo_keys_sz; i++) { if (l == i + 1) { rgb_matrix_set_color(rgb.mo_keys[i], gray.r, gray.g, gray.b); } } } } #endif