qmk_firmware

QMK firmware for my keyboards (Corne, Sweep Ferris) and trackball (Ploopy Adept)
Log | Files | Refs | Submodules | LICENSE

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