|
|
- /* 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 <http://www.gnu.org/licenses/>.
- **/
-
- #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
|