qmk_firmware

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

rgblight.h (15529B)


      1 /* Copyright 2017 Yang Liu
      2  *
      3  * This program is free software: you can redistribute it and/or modify
      4  * it under the terms of the GNU General Public License as published by
      5  * the Free Software Foundation, either version 2 of the License, or
      6  * (at your option) any later version.
      7  *
      8  * This program is distributed in the hope that it will be useful,
      9  * but WITHOUT ANY WARRANTY; without even the implied warranty of
     10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     11  * GNU General Public License for more details.
     12  *
     13  * You should have received a copy of the GNU General Public License
     14  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
     15  */
     16 
     17 #pragma once
     18 
     19 #include "compiler_support.h"
     20 
     21 // DEPRECATED DEFINES - DO NOT USE
     22 #if defined(RGBLED_NUM)
     23 #    define RGBLIGHT_LED_COUNT RGBLED_NUM
     24 #endif
     25 // ========
     26 
     27 /***** rgblight_mode(mode)/rgblight_mode_noeeprom(mode) ****
     28 
     29  old mode number (before 0.6.117) to new mode name table
     30 
     31 |-----------------|-----------------------------------|
     32 | old mode number | new mode name                     |
     33 |-----------------|-----------------------------------|
     34 |        1        | RGBLIGHT_MODE_STATIC_LIGHT        |
     35 |        2        | RGBLIGHT_MODE_BREATHING           |
     36 |        3        | RGBLIGHT_MODE_BREATHING + 1       |
     37 |        4        | RGBLIGHT_MODE_BREATHING + 2       |
     38 |        5        | RGBLIGHT_MODE_BREATHING + 3       |
     39 |        6        | RGBLIGHT_MODE_RAINBOW_MOOD        |
     40 |        7        | RGBLIGHT_MODE_RAINBOW_MOOD + 1    |
     41 |        8        | RGBLIGHT_MODE_RAINBOW_MOOD + 2    |
     42 |        9        | RGBLIGHT_MODE_RAINBOW_SWIRL       |
     43 |       10        | RGBLIGHT_MODE_RAINBOW_SWIRL + 1   |
     44 |       11        | RGBLIGHT_MODE_RAINBOW_SWIRL + 2   |
     45 |       12        | RGBLIGHT_MODE_RAINBOW_SWIRL + 3   |
     46 |       13        | RGBLIGHT_MODE_RAINBOW_SWIRL + 4   |
     47 |       14        | RGBLIGHT_MODE_RAINBOW_SWIRL + 5   |
     48 |       15        | RGBLIGHT_MODE_SNAKE               |
     49 |       16        | RGBLIGHT_MODE_SNAKE + 1           |
     50 |       17        | RGBLIGHT_MODE_SNAKE + 2           |
     51 |       18        | RGBLIGHT_MODE_SNAKE + 3           |
     52 |       19        | RGBLIGHT_MODE_SNAKE + 4           |
     53 |       20        | RGBLIGHT_MODE_SNAKE + 5           |
     54 |       21        | RGBLIGHT_MODE_KNIGHT              |
     55 |       22        | RGBLIGHT_MODE_KNIGHT + 1          |
     56 |       23        | RGBLIGHT_MODE_KNIGHT + 2          |
     57 |       24        | RGBLIGHT_MODE_CHRISTMAS           |
     58 |       25        | RGBLIGHT_MODE_STATIC_GRADIENT     |
     59 |       26        | RGBLIGHT_MODE_STATIC_GRADIENT + 1 |
     60 |       27        | RGBLIGHT_MODE_STATIC_GRADIENT + 2 |
     61 |       28        | RGBLIGHT_MODE_STATIC_GRADIENT + 3 |
     62 |       29        | RGBLIGHT_MODE_STATIC_GRADIENT + 4 |
     63 |       30        | RGBLIGHT_MODE_STATIC_GRADIENT + 5 |
     64 |       31        | RGBLIGHT_MODE_STATIC_GRADIENT + 6 |
     65 |       32        | RGBLIGHT_MODE_STATIC_GRADIENT + 7 |
     66 |       33        | RGBLIGHT_MODE_STATIC_GRADIENT + 8 |
     67 |       34        | RGBLIGHT_MODE_STATIC_GRADIENT + 9 |
     68 |       35        | RGBLIGHT_MODE_RGB_TEST            |
     69 |       36        | RGBLIGHT_MODE_ALTERNATING         |
     70 |       37        | RGBLIGHT_MODE_TWINKLE             |
     71 |       38        | RGBLIGHT_MODE_TWINKLE + 1         |
     72 |       39        | RGBLIGHT_MODE_TWINKLE + 2         |
     73 |       40        | RGBLIGHT_MODE_TWINKLE + 3         |
     74 |       41        | RGBLIGHT_MODE_TWINKLE + 4         |
     75 |       42        | RGBLIGHT_MODE_TWINKLE + 5         |
     76 |-----------------|-----------------------------------|
     77  *****/
     78 
     79 // clang-format off
     80 
     81 // check dynamic animation effects chose ?
     82 #if  defined(RGBLIGHT_EFFECT_BREATHING)     \
     83   || defined(RGBLIGHT_EFFECT_RAINBOW_MOOD)  \
     84   || defined(RGBLIGHT_EFFECT_RAINBOW_SWIRL) \
     85   || defined(RGBLIGHT_EFFECT_SNAKE)         \
     86   || defined(RGBLIGHT_EFFECT_KNIGHT)        \
     87   || defined(RGBLIGHT_EFFECT_CHRISTMAS)     \
     88   || defined(RGBLIGHT_EFFECT_RGB_TEST)      \
     89   || defined(RGBLIGHT_EFFECT_ALTERNATING)   \
     90   || defined(RGBLIGHT_EFFECT_TWINKLE)
     91 #    define RGBLIGHT_USE_TIMER
     92 #endif
     93 
     94 // clang-format on
     95 
     96 #define _RGBM_SINGLE_STATIC(sym) RGBLIGHT_MODE_##sym,
     97 #define _RGBM_SINGLE_DYNAMIC(sym) RGBLIGHT_MODE_##sym,
     98 #define _RGBM_MULTI_STATIC(sym) RGBLIGHT_MODE_##sym,
     99 #define _RGBM_MULTI_DYNAMIC(sym) RGBLIGHT_MODE_##sym,
    100 #define _RGBM_TMP_STATIC(sym, msym) RGBLIGHT_MODE_##sym,
    101 #define _RGBM_TMP_DYNAMIC(sym, msym) RGBLIGHT_MODE_##sym,
    102 enum RGBLIGHT_EFFECT_MODE {
    103     RGBLIGHT_MODE_zero = 0,
    104 #include "rgblight_modes.h"
    105     RGBLIGHT_MODE_last
    106 };
    107 
    108 #define RGBLIGHT_MODES (RGBLIGHT_MODE_last - 1)
    109 
    110 // sample: #define RGBLIGHT_EFFECT_BREATHE_CENTER   1.85
    111 
    112 #ifndef RGBLIGHT_EFFECT_BREATHE_MAX
    113 #    define RGBLIGHT_EFFECT_BREATHE_MAX 255 // 0-255
    114 #endif
    115 
    116 #ifndef RGBLIGHT_EFFECT_SNAKE_LENGTH
    117 #    define RGBLIGHT_EFFECT_SNAKE_LENGTH 4
    118 #endif
    119 
    120 #ifndef RGBLIGHT_EFFECT_SNAKE_INCREMENT
    121 #    define RGBLIGHT_EFFECT_SNAKE_INCREMENT 1
    122 #endif
    123 
    124 #ifndef RGBLIGHT_EFFECT_KNIGHT_LENGTH
    125 #    define RGBLIGHT_EFFECT_KNIGHT_LENGTH 3
    126 #endif
    127 
    128 #ifndef RGBLIGHT_EFFECT_KNIGHT_INCREMENT
    129 #    define RGBLIGHT_EFFECT_KNIGHT_INCREMENT 1
    130 #endif
    131 
    132 #ifndef RGBLIGHT_EFFECT_KNIGHT_OFFSET
    133 #    define RGBLIGHT_EFFECT_KNIGHT_OFFSET 0
    134 #endif
    135 
    136 #ifndef RGBLIGHT_EFFECT_KNIGHT_LED_NUM
    137 #    define RGBLIGHT_EFFECT_KNIGHT_LED_NUM (rgblight_ranges.effect_num_leds)
    138 #endif
    139 
    140 #ifndef RGBLIGHT_EFFECT_CHRISTMAS_INTERVAL
    141 #    define RGBLIGHT_EFFECT_CHRISTMAS_INTERVAL 40
    142 #endif
    143 
    144 #ifndef RGBLIGHT_EFFECT_CHRISTMAS_STEP
    145 #    define RGBLIGHT_EFFECT_CHRISTMAS_STEP 2
    146 #endif
    147 
    148 #ifndef RGBLIGHT_EFFECT_TWINKLE_LIFE
    149 #    define RGBLIGHT_EFFECT_TWINKLE_LIFE 200
    150 #endif
    151 
    152 #ifndef RGBLIGHT_EFFECT_TWINKLE_PROBABILITY
    153 #    define RGBLIGHT_EFFECT_TWINKLE_PROBABILITY 1 / 127
    154 #endif
    155 
    156 #ifndef RGBLIGHT_HUE_STEP
    157 #    define RGBLIGHT_HUE_STEP 8
    158 #endif
    159 #ifndef RGBLIGHT_SAT_STEP
    160 #    define RGBLIGHT_SAT_STEP 17
    161 #endif
    162 #ifndef RGBLIGHT_VAL_STEP
    163 #    define RGBLIGHT_VAL_STEP 17
    164 #endif
    165 #ifndef RGBLIGHT_LIMIT_VAL
    166 #    define RGBLIGHT_LIMIT_VAL 255
    167 #endif
    168 
    169 #include <stdint.h>
    170 #include <stdbool.h>
    171 #include "rgblight_drivers.h"
    172 #include "progmem.h"
    173 #include "color.h"
    174 
    175 #ifdef RGBLIGHT_LAYERS
    176 typedef struct {
    177     uint8_t index; // The first LED to light
    178     uint8_t count; // The number of LEDs to light
    179     uint8_t hue;
    180     uint8_t sat;
    181     uint8_t val;
    182 } rgblight_segment_t;
    183 
    184 // rgblight_set_layer_state doesn't take effect until the next time
    185 // rgblight_task runs, so timers must be enabled for layers to work.
    186 #    define RGBLIGHT_USE_TIMER
    187 
    188 #    define RGBLIGHT_END_SEGMENT_INDEX (255)
    189 #    define RGBLIGHT_END_SEGMENTS {RGBLIGHT_END_SEGMENT_INDEX, 0, 0, 0}
    190 #    ifndef RGBLIGHT_MAX_LAYERS
    191 #        define RGBLIGHT_MAX_LAYERS 8
    192 #    endif
    193 #    if RGBLIGHT_MAX_LAYERS <= 0
    194 #        error invalid RGBLIGHT_MAX_LAYERS value (must be >= 1)
    195 #    elif RGBLIGHT_MAX_LAYERS <= 8
    196 typedef uint8_t rgblight_layer_mask_t;
    197 #    elif RGBLIGHT_MAX_LAYERS <= 16
    198 typedef uint16_t rgblight_layer_mask_t;
    199 #    elif RGBLIGHT_MAX_LAYERS <= 32
    200 typedef uint32_t rgblight_layer_mask_t;
    201 #    else
    202 #        error invalid RGBLIGHT_MAX_LAYERS value (must be <= 32)
    203 #    endif
    204 #    define RGBLIGHT_LAYER_SEGMENTS(...) {__VA_ARGS__, RGBLIGHT_END_SEGMENTS}
    205 #    define RGBLIGHT_LAYERS_LIST(...) {__VA_ARGS__, NULL}
    206 
    207 // Get/set enabled rgblight layers
    208 void rgblight_set_layer_state(uint8_t layer, bool enabled);
    209 bool rgblight_get_layer_state(uint8_t layer);
    210 
    211 // Point this to an array of rgblight_segment_t arrays in keyboard_post_init_user to use rgblight layers
    212 extern const rgblight_segment_t *const *rgblight_layers;
    213 
    214 #    ifdef RGBLIGHT_LAYER_BLINK
    215 #        define RGBLIGHT_USE_TIMER
    216 void rgblight_blink_layer(uint8_t layer, uint16_t duration_ms);
    217 void rgblight_blink_layer_repeat(uint8_t layer, uint16_t duration_ms, uint8_t times);
    218 /**
    219  * \brief Stop blinking on one layer.
    220  *
    221  * Stop a layer that is blinking. If the layer is not blinking it will
    222  * be unaffected.
    223  *
    224  * \param layer Layer number to stop blinking.
    225  */
    226 void rgblight_unblink_layer(uint8_t layer);
    227 /**
    228  * \brief Stop blinking all layers except one.
    229  *
    230  * Stop all layers that are blinking except for one specific layer.
    231  * Layers that are not blinking are unaffected.
    232  *
    233  * \param layer Layer number to keep blinking.
    234  */
    235 void rgblight_unblink_all_but_layer(uint8_t layer);
    236 #    endif
    237 
    238 #endif
    239 
    240 extern const uint8_t  RGBLED_BREATHING_INTERVALS[4] PROGMEM;
    241 extern const uint8_t  RGBLED_RAINBOW_MOOD_INTERVALS[3] PROGMEM;
    242 extern const uint8_t  RGBLED_RAINBOW_SWIRL_INTERVALS[3] PROGMEM;
    243 extern const uint8_t  RGBLED_SNAKE_INTERVALS[3] PROGMEM;
    244 extern const uint8_t  RGBLED_KNIGHT_INTERVALS[3] PROGMEM;
    245 extern const uint16_t RGBLED_RGBTEST_INTERVALS[1] PROGMEM;
    246 extern const uint8_t  RGBLED_TWINKLE_INTERVALS[3] PROGMEM;
    247 extern bool           is_rgblight_initialized;
    248 
    249 typedef union rgblight_config_t {
    250     uint64_t raw;
    251     struct {
    252         bool    enable : 1;
    253         bool    velocikey : 1;
    254         uint8_t mode : 6;
    255         uint8_t hue : 8;
    256         uint8_t sat : 8;
    257         uint8_t val : 8;
    258         uint8_t speed : 8;
    259     };
    260 } rgblight_config_t;
    261 
    262 STATIC_ASSERT(sizeof(rgblight_config_t) == sizeof(uint64_t), "RGB Light EECONFIG out of spec.");
    263 
    264 typedef struct _rgblight_status_t {
    265     uint8_t base_mode;
    266     bool    timer_enabled;
    267 #ifdef RGBLIGHT_SPLIT
    268     uint8_t change_flags;
    269 #endif
    270 #ifdef RGBLIGHT_LAYERS
    271     rgblight_layer_mask_t enabled_layer_mask;
    272 #endif
    273 } rgblight_status_t;
    274 
    275 /*
    276  * Structure for RGB Light clipping ranges
    277  */
    278 typedef struct _rgblight_ranges_t {
    279     uint8_t clipping_start_pos;
    280     uint8_t clipping_num_leds;
    281     uint8_t effect_start_pos;
    282     uint8_t effect_end_pos;
    283     uint8_t effect_num_leds;
    284 } rgblight_ranges_t;
    285 
    286 extern rgblight_ranges_t rgblight_ranges;
    287 
    288 /* === Low level Functions === */
    289 void rgblight_set(void);
    290 void rgblight_set_clipping_range(uint8_t start_pos, uint8_t num_leds);
    291 
    292 /* === Effects and Animations Functions === */
    293 /*   effect range setting */
    294 void rgblight_set_effect_range(uint8_t start_pos, uint8_t num_leds);
    295 
    296 /*   direct operation */
    297 void rgblight_setrgb_at(uint8_t r, uint8_t g, uint8_t b, uint8_t index);
    298 void rgblight_sethsv_at(uint8_t hue, uint8_t sat, uint8_t val, uint8_t index);
    299 void rgblight_setrgb_range(uint8_t r, uint8_t g, uint8_t b, uint8_t start, uint8_t end);
    300 void rgblight_sethsv_range(uint8_t hue, uint8_t sat, uint8_t val, uint8_t start, uint8_t end);
    301 void rgblight_setrgb(uint8_t r, uint8_t g, uint8_t b);
    302 
    303 #ifndef RGBLIGHT_SPLIT
    304 void rgblight_setrgb_master(uint8_t r, uint8_t g, uint8_t b);
    305 void rgblight_setrgb_slave(uint8_t r, uint8_t g, uint8_t b);
    306 void rgblight_sethsv_master(uint8_t hue, uint8_t sat, uint8_t val);
    307 void rgblight_sethsv_slave(uint8_t hue, uint8_t sat, uint8_t val);
    308 #endif
    309 
    310 /*   effect mode change */
    311 void rgblight_mode(uint8_t mode);
    312 void rgblight_mode_noeeprom(uint8_t mode);
    313 void rgblight_increase(void);
    314 void rgblight_decrease(void);
    315 void rgblight_step(void);
    316 void rgblight_step_noeeprom(void);
    317 void rgblight_step_reverse(void);
    318 void rgblight_step_reverse_noeeprom(void);
    319 
    320 /*   effects mode disable/enable */
    321 void rgblight_toggle(void);
    322 void rgblight_toggle_noeeprom(void);
    323 void rgblight_enable(void);
    324 void rgblight_enable_noeeprom(void);
    325 void rgblight_disable(void);
    326 void rgblight_disable_noeeprom(void);
    327 void rgblight_enabled_noeeprom(bool state);
    328 
    329 /*   hue, sat, val change */
    330 void rgblight_increase_hue(void);
    331 void rgblight_increase_hue_noeeprom(void);
    332 void rgblight_decrease_hue(void);
    333 void rgblight_decrease_hue_noeeprom(void);
    334 void rgblight_increase_sat(void);
    335 void rgblight_increase_sat_noeeprom(void);
    336 void rgblight_decrease_sat(void);
    337 void rgblight_decrease_sat_noeeprom(void);
    338 void rgblight_increase_val(void);
    339 void rgblight_increase_val_noeeprom(void);
    340 void rgblight_decrease_val(void);
    341 void rgblight_decrease_val_noeeprom(void);
    342 void rgblight_increase_speed(void);
    343 void rgblight_increase_speed_noeeprom(void);
    344 void rgblight_decrease_speed(void);
    345 void rgblight_decrease_speed_noeeprom(void);
    346 void rgblight_sethsv(uint8_t hue, uint8_t sat, uint8_t val);
    347 void rgblight_sethsv_noeeprom(uint8_t hue, uint8_t sat, uint8_t val);
    348 
    349 /*   effect speed */
    350 uint8_t rgblight_get_speed(void);
    351 void    rgblight_set_speed(uint8_t speed);
    352 void    rgblight_set_speed_noeeprom(uint8_t speed);
    353 
    354 /*   reset */
    355 void rgblight_reload_from_eeprom(void);
    356 
    357 /*       query */
    358 uint8_t rgblight_get_mode(void);
    359 uint8_t rgblight_get_hue(void);
    360 uint8_t rgblight_get_sat(void);
    361 uint8_t rgblight_get_val(void);
    362 bool    rgblight_is_enabled(void);
    363 hsv_t   rgblight_get_hsv(void);
    364 
    365 /* === qmk_firmware (core)internal Functions === */
    366 void     rgblight_init(void);
    367 void     rgblight_suspend(void);
    368 void     rgblight_wakeup(void);
    369 uint64_t rgblight_read_qword(void);
    370 void     rgblight_update_qword(uint64_t qword);
    371 void     eeconfig_update_rgblight_current(void);
    372 void     eeconfig_update_rgblight_default(void);
    373 void     eeconfig_debug_rgblight(void);
    374 
    375 void rgb_matrix_increase(void);
    376 void rgb_matrix_decrease(void);
    377 
    378 void rgblight_sethsv_eeprom_helper(uint8_t hue, uint8_t sat, uint8_t val, bool write_to_eeprom);
    379 void rgblight_mode_eeprom_helper(uint8_t mode, bool write_to_eeprom);
    380 
    381 #define EZ_RGB(val) rgblight_show_solid_color((val >> 16) & 0xFF, (val >> 8) & 0xFF, val & 0xFF)
    382 void rgblight_show_solid_color(uint8_t r, uint8_t g, uint8_t b);
    383 
    384 void preprocess_rgblight(void);
    385 void rgblight_task(void);
    386 
    387 #ifdef RGBLIGHT_USE_TIMER
    388 void rgblight_timer_init(void);
    389 void rgblight_timer_enable(void);
    390 void rgblight_timer_disable(void);
    391 void rgblight_timer_toggle(void);
    392 #else
    393 #    define rgblight_timer_init()
    394 #    define rgblight_timer_enable()
    395 #    define rgblight_timer_disable()
    396 #    define rgblight_timer_toggle()
    397 #endif
    398 
    399 #ifdef RGBLIGHT_SPLIT
    400 #    define RGBLIGHT_STATUS_CHANGE_MODE (1 << 0)
    401 #    define RGBLIGHT_STATUS_CHANGE_HSVS (1 << 1)
    402 #    define RGBLIGHT_STATUS_CHANGE_TIMER (1 << 2)
    403 #    define RGBLIGHT_STATUS_ANIMATION_TICK (1 << 3)
    404 #    define RGBLIGHT_STATUS_CHANGE_LAYERS (1 << 4)
    405 
    406 typedef struct _rgblight_syncinfo_t {
    407     rgblight_config_t config;
    408     rgblight_status_t status;
    409 } rgblight_syncinfo_t;
    410 
    411 /* for split keyboard master side */
    412 uint8_t rgblight_get_change_flags(void);
    413 void    rgblight_clear_change_flags(void);
    414 void    rgblight_get_syncinfo(rgblight_syncinfo_t *syncinfo);
    415 /* for split keyboard slave side */
    416 void rgblight_update_sync(rgblight_syncinfo_t *syncinfo, bool write_to_eeprom);
    417 #endif
    418 
    419 #ifdef RGBLIGHT_USE_TIMER
    420 
    421 typedef struct _animation_status_t {
    422     uint16_t last_timer;
    423     uint8_t  delta; /* mode - base_mode */
    424     bool     restart;
    425     union {
    426         uint16_t pos16;
    427         uint8_t  pos;
    428         int8_t   current_hue;
    429         uint16_t current_offset;
    430     };
    431 } animation_status_t;
    432 
    433 extern animation_status_t animation_status;
    434 
    435 void rgblight_effect_breathing(animation_status_t *anim);
    436 void rgblight_effect_rainbow_mood(animation_status_t *anim);
    437 void rgblight_effect_rainbow_swirl(animation_status_t *anim);
    438 void rgblight_effect_snake(animation_status_t *anim);
    439 void rgblight_effect_knight(animation_status_t *anim);
    440 void rgblight_effect_christmas(animation_status_t *anim);
    441 void rgblight_effect_rgbtest(animation_status_t *anim);
    442 void rgblight_effect_alternating(animation_status_t *anim);
    443 void rgblight_effect_twinkle(animation_status_t *anim);
    444 
    445 #endif
    446 
    447 #ifdef VELOCIKEY_ENABLE
    448 bool    rgblight_velocikey_enabled(void);
    449 void    rgblight_velocikey_toggle(void);
    450 void    rgblight_velocikey_accelerate(void);
    451 void    rgblight_velocikey_decelerate(void);
    452 uint8_t rgblight_velocikey_match_speed(uint8_t minValue, uint8_t maxValue);
    453 
    454 #    define velocikey_enabled rgblight_velocikey_enabled
    455 #    define velocikey_toggle rgblight_velocikey_toggle
    456 #endif