rgb_matrix.h (10851B)
1 /* Copyright 2017 Jason Williams 2 * Copyright 2017 Jack Humbert 3 * Copyright 2018 Yiancar 4 * 5 * This program is free software: you can redistribute it and/or modify 6 * it under the terms of the GNU General Public License as published by 7 * the Free Software Foundation, either version 2 of the License, or 8 * (at your option) any later version. 9 * 10 * This program is distributed in the hope that it will be useful, 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 * GNU General Public License for more details. 14 * 15 * You should have received a copy of the GNU General Public License 16 * along with this program. If not, see <http://www.gnu.org/licenses/>. 17 */ 18 19 #pragma once 20 21 #include <stdint.h> 22 #include <stdbool.h> 23 #include "rgb_matrix_types.h" 24 #include "rgb_matrix_drivers.h" 25 #include "color.h" 26 #include "keyboard.h" 27 28 #ifndef RGB_MATRIX_TIMEOUT 29 # define RGB_MATRIX_TIMEOUT 0 30 #endif 31 32 #ifndef RGB_MATRIX_MAXIMUM_BRIGHTNESS 33 # define RGB_MATRIX_MAXIMUM_BRIGHTNESS UINT8_MAX 34 #endif 35 36 #ifndef RGB_MATRIX_HUE_STEP 37 # define RGB_MATRIX_HUE_STEP 8 38 #endif 39 40 #ifndef RGB_MATRIX_SAT_STEP 41 # define RGB_MATRIX_SAT_STEP 16 42 #endif 43 44 #ifndef RGB_MATRIX_VAL_STEP 45 # define RGB_MATRIX_VAL_STEP 16 46 #endif 47 48 #ifndef RGB_MATRIX_SPD_STEP 49 # define RGB_MATRIX_SPD_STEP 16 50 #endif 51 52 #ifndef RGB_MATRIX_DEFAULT_ON 53 # define RGB_MATRIX_DEFAULT_ON true 54 #endif 55 56 #ifndef RGB_MATRIX_DEFAULT_MODE 57 # ifdef ENABLE_RGB_MATRIX_CYCLE_LEFT_RIGHT 58 # define RGB_MATRIX_DEFAULT_MODE RGB_MATRIX_CYCLE_LEFT_RIGHT 59 # else 60 // fallback to solid colors if RGB_MATRIX_CYCLE_LEFT_RIGHT is disabled in userspace 61 # define RGB_MATRIX_DEFAULT_MODE RGB_MATRIX_SOLID_COLOR 62 # endif 63 #endif 64 65 #ifndef RGB_MATRIX_DEFAULT_HUE 66 # define RGB_MATRIX_DEFAULT_HUE 0 67 #endif 68 69 #ifndef RGB_MATRIX_DEFAULT_SAT 70 # define RGB_MATRIX_DEFAULT_SAT UINT8_MAX 71 #endif 72 73 #ifndef RGB_MATRIX_DEFAULT_VAL 74 # define RGB_MATRIX_DEFAULT_VAL RGB_MATRIX_MAXIMUM_BRIGHTNESS 75 #endif 76 77 #ifndef RGB_MATRIX_DEFAULT_SPD 78 # define RGB_MATRIX_DEFAULT_SPD UINT8_MAX / 2 79 #endif 80 81 #ifndef RGB_MATRIX_DEFAULT_FLAGS 82 # define RGB_MATRIX_DEFAULT_FLAGS LED_FLAG_ALL 83 #endif 84 85 #ifndef RGB_MATRIX_LED_FLUSH_LIMIT 86 # define RGB_MATRIX_LED_FLUSH_LIMIT 16 87 #endif 88 89 #ifndef RGB_MATRIX_LED_PROCESS_LIMIT 90 # define RGB_MATRIX_LED_PROCESS_LIMIT ((RGB_MATRIX_LED_COUNT + 4) / 5) 91 #endif 92 93 struct rgb_matrix_limits_t { 94 uint8_t led_min_index; 95 uint8_t led_max_index; 96 }; 97 98 struct rgb_matrix_limits_t rgb_matrix_get_limits(uint8_t iter); 99 100 #define RGB_MATRIX_USE_LIMITS_ITER(min, max, iter) \ 101 struct rgb_matrix_limits_t limits = rgb_matrix_get_limits(iter); \ 102 uint8_t min = limits.led_min_index; \ 103 uint8_t max = limits.led_max_index; \ 104 (void)min; \ 105 (void)max; 106 107 #define RGB_MATRIX_USE_LIMITS(min, max) RGB_MATRIX_USE_LIMITS_ITER(min, max, params->iter) 108 109 #define RGB_MATRIX_INDICATOR_SET_COLOR(i, r, g, b) \ 110 if (i >= led_min && i < led_max) { \ 111 rgb_matrix_set_color(i, r, g, b); \ 112 } 113 114 #define RGB_MATRIX_TEST_LED_FLAGS() \ 115 if (!HAS_ANY_FLAGS(g_led_config.flags[i], params->flags)) continue 116 117 enum rgb_matrix_effects { 118 RGB_MATRIX_NONE = 0, 119 120 // -------------------------------------- 121 // -----Begin rgb effect enum macros----- 122 #define RGB_MATRIX_EFFECT(name, ...) RGB_MATRIX_##name, 123 #include "rgb_matrix_effects.inc" 124 #undef RGB_MATRIX_EFFECT 125 126 #ifdef COMMUNITY_MODULES_ENABLE 127 # define RGB_MATRIX_EFFECT(name, ...) RGB_MATRIX_COMMUNITY_MODULE_##name, 128 # include "rgb_matrix_community_modules.inc" 129 # undef RGB_MATRIX_EFFECT 130 #endif 131 132 #if defined(RGB_MATRIX_CUSTOM_KB) || defined(RGB_MATRIX_CUSTOM_USER) 133 # define RGB_MATRIX_EFFECT(name, ...) RGB_MATRIX_CUSTOM_##name, 134 # ifdef RGB_MATRIX_CUSTOM_KB 135 # include "rgb_matrix_kb.inc" 136 # endif 137 # ifdef RGB_MATRIX_CUSTOM_USER 138 # include "rgb_matrix_user.inc" 139 # endif 140 # undef RGB_MATRIX_EFFECT 141 #endif 142 // -------------------------------------- 143 // -----End rgb effect enum macros------- 144 145 RGB_MATRIX_EFFECT_MAX 146 }; 147 148 void eeconfig_update_rgb_matrix_default(void); 149 void eeconfig_force_flush_rgb_matrix(void); 150 151 uint8_t rgb_matrix_map_row_column_to_led_kb(uint8_t row, uint8_t column, uint8_t *led_i); 152 uint8_t rgb_matrix_map_row_column_to_led(uint8_t row, uint8_t column, uint8_t *led_i); 153 154 int rgb_matrix_led_index(int index); 155 156 void rgb_matrix_set_color(int index, uint8_t red, uint8_t green, uint8_t blue); 157 void rgb_matrix_set_color_all(uint8_t red, uint8_t green, uint8_t blue); 158 159 void rgb_matrix_handle_key_event(uint8_t row, uint8_t col, bool pressed); 160 161 void rgb_matrix_task(void); 162 163 // This runs after another backlight effect and replaces 164 // colors already set 165 void rgb_matrix_indicators(void); 166 bool rgb_matrix_indicators_kb(void); 167 bool rgb_matrix_indicators_user(void); 168 169 void rgb_matrix_indicators_advanced(effect_params_t *params); 170 bool rgb_matrix_indicators_advanced_kb(uint8_t led_min, uint8_t led_max); 171 bool rgb_matrix_indicators_advanced_user(uint8_t led_min, uint8_t led_max); 172 173 void rgb_matrix_init(void); 174 175 void rgb_matrix_reload_from_eeprom(void); 176 177 void rgb_matrix_set_suspend_state(bool state); 178 bool rgb_matrix_get_suspend_state(void); 179 void rgb_matrix_toggle(void); 180 void rgb_matrix_toggle_noeeprom(void); 181 void rgb_matrix_enable(void); 182 void rgb_matrix_enable_noeeprom(void); 183 void rgb_matrix_disable(void); 184 void rgb_matrix_disable_noeeprom(void); 185 uint8_t rgb_matrix_is_enabled(void); 186 void rgb_matrix_mode(uint8_t mode); 187 void rgb_matrix_mode_noeeprom(uint8_t mode); 188 uint8_t rgb_matrix_get_mode(void); 189 void rgb_matrix_step(void); 190 void rgb_matrix_step_noeeprom(void); 191 void rgb_matrix_step_reverse(void); 192 void rgb_matrix_step_reverse_noeeprom(void); 193 void rgb_matrix_sethsv(uint16_t hue, uint8_t sat, uint8_t val); 194 void rgb_matrix_sethsv_noeeprom(uint16_t hue, uint8_t sat, uint8_t val); 195 hsv_t rgb_matrix_get_hsv(void); 196 uint8_t rgb_matrix_get_hue(void); 197 uint8_t rgb_matrix_get_sat(void); 198 uint8_t rgb_matrix_get_val(void); 199 void rgb_matrix_increase_hue(void); 200 void rgb_matrix_increase_hue_noeeprom(void); 201 void rgb_matrix_decrease_hue(void); 202 void rgb_matrix_decrease_hue_noeeprom(void); 203 void rgb_matrix_increase_sat(void); 204 void rgb_matrix_increase_sat_noeeprom(void); 205 void rgb_matrix_decrease_sat(void); 206 void rgb_matrix_decrease_sat_noeeprom(void); 207 void rgb_matrix_increase_val(void); 208 void rgb_matrix_increase_val_noeeprom(void); 209 void rgb_matrix_decrease_val(void); 210 void rgb_matrix_decrease_val_noeeprom(void); 211 void rgb_matrix_set_speed(uint8_t speed); 212 void rgb_matrix_set_speed_noeeprom(uint8_t speed); 213 uint8_t rgb_matrix_get_speed(void); 214 void rgb_matrix_increase_speed(void); 215 void rgb_matrix_increase_speed_noeeprom(void); 216 void rgb_matrix_decrease_speed(void); 217 void rgb_matrix_decrease_speed_noeeprom(void); 218 led_flags_t rgb_matrix_get_flags(void); 219 void rgb_matrix_set_flags(led_flags_t flags); 220 void rgb_matrix_set_flags_noeeprom(led_flags_t flags); 221 void rgb_matrix_flags_step_noeeprom(void); 222 void rgb_matrix_flags_step(void); 223 void rgb_matrix_flags_step_reverse_noeeprom(void); 224 void rgb_matrix_flags_step_reverse(void); 225 void rgb_matrix_update_pwm_buffers(void); 226 227 #ifdef RGB_MATRIX_MODE_NAME_ENABLE 228 const char *rgb_matrix_get_mode_name(uint8_t mode); 229 #endif // RGB_MATRIX_MODE_NAME_ENABLE 230 231 #ifndef RGBLIGHT_ENABLE 232 # define eeconfig_update_rgblight_current eeconfig_force_flush_rgb_matrix 233 # define rgblight_reload_from_eeprom rgb_matrix_reload_from_eeprom 234 # define rgblight_toggle rgb_matrix_toggle 235 # define rgblight_toggle_noeeprom rgb_matrix_toggle_noeeprom 236 # define rgblight_enable rgb_matrix_enable 237 # define rgblight_enable_noeeprom rgb_matrix_enable_noeeprom 238 # define rgblight_disable rgb_matrix_disable 239 # define rgblight_disable_noeeprom rgb_matrix_disable_noeeprom 240 # define rgblight_is_enabled rgb_matrix_is_enabled 241 # define rgblight_mode rgb_matrix_mode 242 # define rgblight_mode_noeeprom rgb_matrix_mode_noeeprom 243 # define rgblight_get_mode rgb_matrix_get_mode 244 # define rgblight_get_hue rgb_matrix_get_hue 245 # define rgblight_get_sat rgb_matrix_get_sat 246 # define rgblight_get_val rgb_matrix_get_val 247 # define rgblight_get_hsv rgb_matrix_get_hsv 248 # define rgblight_step rgb_matrix_step 249 # define rgblight_step_noeeprom rgb_matrix_step_noeeprom 250 # define rgblight_step_reverse rgb_matrix_step_reverse 251 # define rgblight_step_reverse_noeeprom rgb_matrix_step_reverse_noeeprom 252 # define rgblight_sethsv rgb_matrix_sethsv 253 # define rgblight_sethsv_noeeprom rgb_matrix_sethsv_noeeprom 254 # define rgblight_increase_hue rgb_matrix_increase_hue 255 # define rgblight_increase_hue_noeeprom rgb_matrix_increase_hue_noeeprom 256 # define rgblight_decrease_hue rgb_matrix_decrease_hue 257 # define rgblight_decrease_hue_noeeprom rgb_matrix_decrease_hue_noeeprom 258 # define rgblight_increase_sat rgb_matrix_increase_sat 259 # define rgblight_increase_sat_noeeprom rgb_matrix_increase_sat_noeeprom 260 # define rgblight_decrease_sat rgb_matrix_decrease_sat 261 # define rgblight_decrease_sat_noeeprom rgb_matrix_decrease_sat_noeeprom 262 # define rgblight_increase_val rgb_matrix_increase_val 263 # define rgblight_increase_val_noeeprom rgb_matrix_increase_val_noeeprom 264 # define rgblight_decrease_val rgb_matrix_decrease_val 265 # define rgblight_decrease_val_noeeprom rgb_matrix_decrease_val_noeeprom 266 # define rgblight_set_speed rgb_matrix_set_speed 267 # define rgblight_set_speed_noeeprom rgb_matrix_set_speed_noeeprom 268 # define rgblight_get_speed rgb_matrix_get_speed 269 # define rgblight_increase_speed rgb_matrix_increase_speed 270 # define rgblight_increase_speed_noeeprom rgb_matrix_increase_speed_noeeprom 271 # define rgblight_decrease_speed rgb_matrix_decrease_speed 272 # define rgblight_decrease_speed_noeeprom rgb_matrix_decrease_speed_noeeprom 273 #endif 274 275 static inline bool rgb_matrix_check_finished_leds(uint8_t led_idx) { 276 #if defined(RGB_MATRIX_SPLIT) 277 if (is_keyboard_left()) { 278 uint8_t k_rgb_matrix_split[2] = RGB_MATRIX_SPLIT; 279 return led_idx < k_rgb_matrix_split[0]; 280 } else 281 return led_idx < RGB_MATRIX_LED_COUNT; 282 #else 283 return led_idx < RGB_MATRIX_LED_COUNT; 284 #endif 285 } 286 287 extern rgb_config_t rgb_matrix_config; 288 289 extern uint32_t g_rgb_timer; 290 extern led_config_t g_led_config; 291 #ifdef RGB_MATRIX_KEYREACTIVE_ENABLED 292 extern last_hit_t g_last_hit_tracker; 293 #endif 294 #ifdef RGB_MATRIX_FRAMEBUFFER_EFFECTS 295 extern uint8_t g_rgb_frame_buffer[MATRIX_ROWS][MATRIX_COLS]; 296 #endif