aboutsummaryrefslogtreecommitdiffstats
path: root/users/kuchosauronad0/rgblight_user.c
blob: 63e412c557acc2ce3c89c5adea929970353ac336 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
#include "rgblight_user.h"
extern rgblight_config_t rgblight_config;
bool                     has_initialized;
uint8_t                  base_hue;  // Hue value of base state
uint8_t                  base_sat;  // Saturation value of base state
uint8_t                  base_val;  // Brightness value of base state
uint8_t                  base_mod;  // Animation mode of the base state

void rgblight_savebase(void) {  // Save the current settings to ram
  base_hue = rgblight_config.hue;
  base_sat = rgblight_config.sat;
  base_val = rgblight_config.val;
  base_mod = rgblight_config.mode;
}
void rgblight_loadbase(void) {  // Load settings from ram to eeprom
  rgblight_mode( base_mod );
  rgblight_sethsv_eeprom_helper(base_hue, base_sat, base_val, true);
}



bool process_record_user_rgb(uint16_t keycode, keyrecord_t *record) {
  if ((keycode >= QK_MOD_TAP && keycode <= QK_MOD_TAP_MAX) || (keycode >= QK_LAYER_TAP && keycode <= QK_LAYER_TAP_MAX)) {
    keycode = keycode & 0xFF;
  }
  switch (keycode) {
    case KC_RGB_T:  // Switch between underglow layer indication and normal qmk behaviour
#if defined(RGBLIGHT_ENABLE) || defined(RGB_MATRIX_ENABLE)
      if (record->event.pressed) {
        userspace_config.rgb_layer_change ^= 1;
        xprintf("rgblight layer change [EEPROM]: %u\n", userspace_config.rgb_layer_change);
        eeconfig_update_user(userspace_config.raw);
        if (userspace_config.rgb_layer_change) {
          layer_state_set(layer_state);  // Immediately set the layer color (looks better)
        }
      }
#endif  // RGBLIGHT_ENABLE
      return false;
      break;
#ifdef RGBLIGHT_ENABLE
    case RGB_MODE_FORWARD ... RGB_MODE_GRADIENT:  // quantum_keycodes.h L400 for definitions
      if (record->event.pressed) {  // This disables layer indication, as it's assumed that if you're changing this ... you want that disabled
        if (userspace_config.rgb_layer_change) {
          userspace_config.rgb_layer_change = false;
          xprintf("rgblight layer change [EEPROM]: %u\n", userspace_config.rgb_layer_change);
          eeconfig_update_user(userspace_config.raw);
        }
      }
      return true;
      break;
#endif  // RGBLIGHT_ENABLE
  }
  return true;
}

void keyboard_post_init_rgb(void) {
# if defined(RGBLIGHT_ENABLE) || defined(RGBLIGHT_STARTUP_ANIMATION)
  bool is_enabled = rgblight_config.enable;
  if (userspace_config.rgb_layer_change) {
    rgblight_enable_noeeprom();
  }
  if (rgblight_config.enable) {
    layer_state_set_user(layer_state);
    uint16_t old_hue = rgblight_config.hue;
    rgblight_mode_noeeprom(RGBLIGHT_MODE_STATIC_LIGHT);
    for (uint16_t i = 255; i > 0; i--) {
      rgblight_sethsv_noeeprom((i + old_hue) % 255, 255, 255);
      wait_ms(5);
    }
  }
  if (!is_enabled) {
    rgblight_disable_noeeprom();
  }
# endif // !RGBLIGHT_ENABLE || RGBLIGHT_STARTUP_ANIMATION
  layer_state_set_user(layer_state);
}

void matrix_scan_rgb(void) {
# ifdef INDICATOR_LIGHTS
  matrix_scan_indicator();
# endif
}

layer_state_t layer_state_set_rgb(layer_state_t state) {
# ifdef RGBLIGHT_ENABLE
  if (userspace_config.rgb_layer_change) {
    switch (biton32(state)) {  // _RAISE, _LOWER and _ADJUST use a custom color and the breathing effect
      case _RAISE:
        rgblight_sethsv_noeeprom_green();
        rgblight_mode_noeeprom(RGBLIGHT_MODE_BREATHING + 3);
        break;
      case _LOWER:
        rgblight_sethsv_noeeprom_red();
        rgblight_mode_noeeprom(RGBLIGHT_MODE_BREATHING + 3);
        break;
      case _ADJUST:
        rgblight_sethsv_noeeprom_white();
        rgblight_mode_noeeprom(RGBLIGHT_MODE_BREATHING + 2);
        break;
      default:  // Use a solid color for normal layers
        switch (biton32(default_layer_state)) {
          case _QWERTY:
            rgblight_sethsv_noeeprom_magenta();
            break;
          case _COLEMAK:
            rgblight_sethsv_noeeprom_green();
            break;
          case _DVORAK:
            rgblight_sethsv_noeeprom_blue();
            break;
          case _WORKMAN:
            rgblight_sethsv_noeeprom_goldenrod();
            break;
          case _PLOVER:
            rgblight_sethsv_noeeprom_pink();
            break;
          default:
            rgblight_sethsv_noeeprom_white();
            break;
        }
        biton32(state) == _MODS ? rgblight_mode_noeeprom(RGBLIGHT_MODE_BREATHING) : rgblight_mode_noeeprom(RGBLIGHT_MODE_STATIC_LIGHT);  // if _MODS layer is on, then breath to denote it
        break;
    }
  }
# endif  // !RGBLIGHT_ENABLE
  return state;
}

#ifdef INDICATOR_LIGHTS
void matrix_scan_indicator(void) {
  if (has_initialized) {
    set_rgb_indicators(get_mods(), host_keyboard_leds(), get_oneshot_mods());
  }
}
#endif // !INDICATOR_LIGHTS

void rgblight_fade_helper(bool direction){
  // true: increase val = fade in 
  // false: decrease val = fade out
  for (uint8_t index = 0; index <  RGBLIGHT_VAL_STEP ; index++) {
    direction ? rgblight_increase_val()  : rgblight_decrease_val();
    wait_ms(5);
  }
}
void fadeflash_leds(uint8_t hue, uint8_t sat, uint8_t val){
  // indicate success / fail of a leader sequence
  // fade out, set new hue and saturation, fade in, fade out, set old color, fade in
  // this is used in leader.c
  // TODO: come up with a better name maybe
  rgblight_fade_helper(false); 
  rgblight_sethsv_noeeprom(hue, sat, 0); 
  rgblight_fade_helper(true); 
  rgblight_fade_helper(false); 
  rgblight_sethsv_noeeprom(base_hue, base_sat, 0); 
  rgblight_fade_helper(true); 
}