Relocate grave keycode processing (#8082)
[jackhill/qmk/firmware.git] / quantum / rgblight.h
CommitLineData
23839b8c 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 */
0a40654b
YL
16#ifndef RGBLIGHT_H
17#define RGBLIGHT_H
18
6d6d91c8
TI
19#include "rgblight_reconfig.h"
20
661e3040 21/***** rgblight_mode(mode)/rgblight_mode_noeeprom(mode) ****
22
23 old mode number (before 0.6.117) to new mode name table
24
25|-----------------|-----------------------------------|
26| old mode number | new mode name |
27|-----------------|-----------------------------------|
28| 1 | RGBLIGHT_MODE_STATIC_LIGHT |
29| 2 | RGBLIGHT_MODE_BREATHING |
30| 3 | RGBLIGHT_MODE_BREATHING + 1 |
31| 4 | RGBLIGHT_MODE_BREATHING + 2 |
32| 5 | RGBLIGHT_MODE_BREATHING + 3 |
33| 6 | RGBLIGHT_MODE_RAINBOW_MOOD |
34| 7 | RGBLIGHT_MODE_RAINBOW_MOOD + 1 |
35| 8 | RGBLIGHT_MODE_RAINBOW_MOOD + 2 |
36| 9 | RGBLIGHT_MODE_RAINBOW_SWIRL |
37| 10 | RGBLIGHT_MODE_RAINBOW_SWIRL + 1 |
38| 11 | RGBLIGHT_MODE_RAINBOW_SWIRL + 2 |
39| 12 | RGBLIGHT_MODE_RAINBOW_SWIRL + 3 |
40| 13 | RGBLIGHT_MODE_RAINBOW_SWIRL + 4 |
41| 14 | RGBLIGHT_MODE_RAINBOW_SWIRL + 5 |
42| 15 | RGBLIGHT_MODE_SNAKE |
43| 16 | RGBLIGHT_MODE_SNAKE + 1 |
44| 17 | RGBLIGHT_MODE_SNAKE + 2 |
45| 18 | RGBLIGHT_MODE_SNAKE + 3 |
46| 19 | RGBLIGHT_MODE_SNAKE + 4 |
47| 20 | RGBLIGHT_MODE_SNAKE + 5 |
48| 21 | RGBLIGHT_MODE_KNIGHT |
49| 22 | RGBLIGHT_MODE_KNIGHT + 1 |
50| 23 | RGBLIGHT_MODE_KNIGHT + 2 |
51| 24 | RGBLIGHT_MODE_CHRISTMAS |
52| 25 | RGBLIGHT_MODE_STATIC_GRADIENT |
53| 26 | RGBLIGHT_MODE_STATIC_GRADIENT + 1 |
54| 27 | RGBLIGHT_MODE_STATIC_GRADIENT + 2 |
55| 28 | RGBLIGHT_MODE_STATIC_GRADIENT + 3 |
56| 29 | RGBLIGHT_MODE_STATIC_GRADIENT + 4 |
57| 30 | RGBLIGHT_MODE_STATIC_GRADIENT + 5 |
58| 31 | RGBLIGHT_MODE_STATIC_GRADIENT + 6 |
59| 32 | RGBLIGHT_MODE_STATIC_GRADIENT + 7 |
60| 33 | RGBLIGHT_MODE_STATIC_GRADIENT + 8 |
61| 34 | RGBLIGHT_MODE_STATIC_GRADIENT + 9 |
62| 35 | RGBLIGHT_MODE_RGB_TEST |
63| 36 | RGBLIGHT_MODE_ALTERNATING |
64|-----------------|-----------------------------------|
65 *****/
66
b624f32f 67#define _RGBM_SINGLE_STATIC(sym) RGBLIGHT_MODE_##sym,
68#define _RGBM_SINGLE_DYNAMIC(sym) RGBLIGHT_MODE_##sym,
69#define _RGBM_MULTI_STATIC(sym) RGBLIGHT_MODE_##sym,
70#define _RGBM_MULTI_DYNAMIC(sym) RGBLIGHT_MODE_##sym,
71#define _RGBM_TMP_STATIC(sym, msym) RGBLIGHT_MODE_##sym,
72#define _RGBM_TMP_DYNAMIC(sym, msym) RGBLIGHT_MODE_##sym,
6d6d91c8
TI
73enum RGBLIGHT_EFFECT_MODE {
74 RGBLIGHT_MODE_zero = 0,
dfab177f 75#include "rgblight_modes.h"
6d6d91c8
TI
76 RGBLIGHT_MODE_last
77};
78
79#ifndef RGBLIGHT_H_DUMMY_DEFINE
80
b624f32f 81# define RGBLIGHT_MODES (RGBLIGHT_MODE_last - 1)
0a40654b 82
3da8d46a 83// sample: #define RGBLIGHT_EFFECT_BREATHE_CENTER 1.85
ad49db8c 84
b624f32f 85# ifndef RGBLIGHT_EFFECT_BREATHE_MAX
86# define RGBLIGHT_EFFECT_BREATHE_MAX 255 // 0-255
87# endif
88
89# ifndef RGBLIGHT_EFFECT_SNAKE_LENGTH
90# define RGBLIGHT_EFFECT_SNAKE_LENGTH 4
91# endif
92
93# ifndef RGBLIGHT_EFFECT_KNIGHT_LENGTH
94# define RGBLIGHT_EFFECT_KNIGHT_LENGTH 3
95# endif
96
97# ifndef RGBLIGHT_EFFECT_KNIGHT_OFFSET
98# define RGBLIGHT_EFFECT_KNIGHT_OFFSET 0
99# endif
100
101# ifndef RGBLIGHT_EFFECT_KNIGHT_LED_NUM
102# define RGBLIGHT_EFFECT_KNIGHT_LED_NUM (effect_num_leds)
103# endif
104
105# ifndef RGBLIGHT_EFFECT_CHRISTMAS_INTERVAL
106# define RGBLIGHT_EFFECT_CHRISTMAS_INTERVAL 1000
107# endif
108
109# ifndef RGBLIGHT_EFFECT_CHRISTMAS_STEP
110# define RGBLIGHT_EFFECT_CHRISTMAS_STEP 2
111# endif
112
113# ifndef RGBLIGHT_HUE_STEP
114# define RGBLIGHT_HUE_STEP 8
115# endif
116# ifndef RGBLIGHT_SAT_STEP
117# define RGBLIGHT_SAT_STEP 17
118# endif
119# ifndef RGBLIGHT_VAL_STEP
120# define RGBLIGHT_VAL_STEP 17
121# endif
122# ifndef RGBLIGHT_LIMIT_VAL
123# define RGBLIGHT_LIMIT_VAL 255
124# endif
125
126# define RGBLED_TIMER_TOP F_CPU / (256 * 64)
e9f74875 127// #define RGBLED_TIMER_TOP 0xFF10
0a40654b 128
b624f32f 129# include <stdint.h>
130# include <stdbool.h>
131# include "eeconfig.h"
132# ifndef RGBLIGHT_CUSTOM_DRIVER
133# include "ws2812.h"
134# endif
135# include "color.h"
136# include "rgblight_list.h"
0a40654b 137
b624f32f 138# if defined(__AVR__)
139# include <avr/pgmspace.h>
140# endif
0fab3bbd 141
748181dc
SW
142extern LED_TYPE led[RGBLED_NUM];
143
b624f32f 144extern const uint8_t RGBLED_BREATHING_INTERVALS[4] PROGMEM;
145extern const uint8_t RGBLED_RAINBOW_MOOD_INTERVALS[3] PROGMEM;
146extern const uint8_t RGBLED_RAINBOW_SWIRL_INTERVALS[3] PROGMEM;
147extern const uint8_t RGBLED_SNAKE_INTERVALS[3] PROGMEM;
148extern const uint8_t RGBLED_KNIGHT_INTERVALS[3] PROGMEM;
52297346 149extern const uint16_t RGBLED_RGBTEST_INTERVALS[1] PROGMEM;
b624f32f 150extern bool is_rgblight_initialized;
9b0e21f8 151
22ba36a4 152// Should stay in sycn with rgb matrix config as we reuse eeprom storage for both (for now)
0a40654b 153typedef union {
b624f32f 154 uint32_t raw;
155 struct {
156 bool enable : 1;
157 uint8_t mode : 7;
158 uint8_t hue : 8;
159 uint8_t sat : 8;
160 uint8_t val : 8;
161 uint8_t speed : 8; // EECONFIG needs to be increased to support this
162 };
0a40654b
YL
163} rgblight_config_t;
164
dfab177f 165typedef struct _rgblight_status_t {
b624f32f 166 uint8_t base_mode;
167 bool timer_enabled;
168# ifdef RGBLIGHT_SPLIT
dfab177f 169 uint8_t change_flags;
b624f32f 170# endif
dfab177f
TI
171} rgblight_status_t;
172
670a9b7f
TI
173/* === Utility Functions ===*/
174void sethsv(uint8_t hue, uint8_t sat, uint8_t val, LED_TYPE *led1);
b624f32f 175void sethsv_raw(uint8_t hue, uint8_t sat, uint8_t val, LED_TYPE *led1); // without RGBLIGHT_LIMIT_VAL check
670a9b7f 176void setrgb(uint8_t r, uint8_t g, uint8_t b, LED_TYPE *led1);
dfab177f 177
670a9b7f
TI
178/* === Low level Functions === */
179void rgblight_set(void);
180void rgblight_set_clipping_range(uint8_t start_pos, uint8_t num_leds);
dfab177f 181
670a9b7f
TI
182/* === Effects and Animations Functions === */
183/* effect range setting */
184void rgblight_set_effect_range(uint8_t start_pos, uint8_t num_leds);
185
186/* direct operation */
187void rgblight_setrgb_at(uint8_t r, uint8_t g, uint8_t b, uint8_t index);
188void rgblight_sethsv_at(uint8_t hue, uint8_t sat, uint8_t val, uint8_t index);
189void rgblight_setrgb_range(uint8_t r, uint8_t g, uint8_t b, uint8_t start, uint8_t end);
190void rgblight_sethsv_range(uint8_t hue, uint8_t sat, uint8_t val, uint8_t start, uint8_t end);
191void rgblight_setrgb(uint8_t r, uint8_t g, uint8_t b);
192
b624f32f 193# ifndef RGBLIGHT_SPLIT
670a9b7f
TI
194void rgblight_setrgb_master(uint8_t r, uint8_t g, uint8_t b);
195void rgblight_setrgb_slave(uint8_t r, uint8_t g, uint8_t b);
196void rgblight_sethsv_master(uint8_t hue, uint8_t sat, uint8_t val);
197void rgblight_sethsv_slave(uint8_t hue, uint8_t sat, uint8_t val);
b624f32f 198# endif
dfab177f 199
670a9b7f
TI
200/* effect mode change */
201void rgblight_mode(uint8_t mode);
202void rgblight_mode_noeeprom(uint8_t mode);
0a40654b
YL
203void rgblight_increase(void);
204void rgblight_decrease(void);
670a9b7f
TI
205void rgblight_step(void);
206void rgblight_step_noeeprom(void);
207void rgblight_step_reverse(void);
208void rgblight_step_reverse_noeeprom(void);
209
210/* effects mode disable/enable */
0a40654b 211void rgblight_toggle(void);
670a9b7f 212void rgblight_toggle_noeeprom(void);
285c5a91 213void rgblight_enable(void);
670a9b7f 214void rgblight_enable_noeeprom(void);
16546ee0 215void rgblight_disable(void);
670a9b7f
TI
216void rgblight_disable_noeeprom(void);
217
218/* hue, sat, val change */
0a40654b 219void rgblight_increase_hue(void);
670a9b7f 220void rgblight_increase_hue_noeeprom(void);
0a40654b 221void rgblight_decrease_hue(void);
670a9b7f 222void rgblight_decrease_hue_noeeprom(void);
0a40654b 223void rgblight_increase_sat(void);
670a9b7f 224void rgblight_increase_sat_noeeprom(void);
0a40654b 225void rgblight_decrease_sat(void);
670a9b7f 226void rgblight_decrease_sat_noeeprom(void);
0a40654b 227void rgblight_increase_val(void);
670a9b7f 228void rgblight_increase_val_noeeprom(void);
0a40654b 229void rgblight_decrease_val(void);
670a9b7f 230void rgblight_decrease_val_noeeprom(void);
afacd423 231void rgblight_increase_speed(void);
232void rgblight_decrease_speed(void);
22ba36a4 233void rgblight_sethsv(uint8_t hue, uint8_t sat, uint8_t val);
670a9b7f
TI
234void rgblight_sethsv_noeeprom(uint8_t hue, uint8_t sat, uint8_t val);
235
484a9b12
W
236/* effect speed */
237uint8_t rgblight_get_speed(void);
e3d59a72
QB
238void rgblight_set_speed(uint8_t speed);
239void rgblight_set_speed_noeeprom(uint8_t speed);
484a9b12 240
670a9b7f
TI
241/* query */
242uint8_t rgblight_get_mode(void);
22ba36a4 243uint8_t rgblight_get_hue(void);
12e66330 244uint8_t rgblight_get_sat(void);
245uint8_t rgblight_get_val(void);
0a40654b 246
670a9b7f 247/* === qmk_firmware (core)internal Functions === */
b624f32f 248void rgblight_init(void);
670a9b7f 249uint32_t rgblight_read_dword(void);
b624f32f 250void rgblight_update_dword(uint32_t dword);
0a40654b 251uint32_t eeconfig_read_rgblight(void);
b624f32f 252void eeconfig_update_rgblight(uint32_t val);
484a9b12 253void eeconfig_update_rgblight_current(void);
b624f32f 254void eeconfig_update_rgblight_default(void);
255void eeconfig_debug_rgblight(void);
0a40654b 256
afacd423 257void rgb_matrix_increase(void);
258void rgb_matrix_decrease(void);
259
22ba36a4 260void rgblight_sethsv_eeprom_helper(uint8_t hue, uint8_t sat, uint8_t val, bool write_to_eeprom);
751719e6
DJ
261void rgblight_mode_eeprom_helper(uint8_t mode, bool write_to_eeprom);
262
b624f32f 263# define EZ_RGB(val) rgblight_show_solid_color((val >> 16) & 0xFF, (val >> 8) & 0xFF, val & 0xFF)
4094544d 264void rgblight_show_solid_color(uint8_t r, uint8_t g, uint8_t b);
e9f74875
JH
265
266void rgblight_task(void);
267
0a40654b
YL
268void rgblight_timer_init(void);
269void rgblight_timer_enable(void);
270void rgblight_timer_disable(void);
271void rgblight_timer_toggle(void);
0a40654b 272
b624f32f 273# ifdef RGBLIGHT_SPLIT
274# define RGBLIGHT_STATUS_CHANGE_MODE (1 << 0)
275# define RGBLIGHT_STATUS_CHANGE_HSVS (1 << 1)
276# define RGBLIGHT_STATUS_CHANGE_TIMER (1 << 2)
277# define RGBLIGHT_STATUS_ANIMATION_TICK (1 << 3)
670a9b7f 278
b624f32f 279typedef struct _rgblight_syncinfo_t {
670a9b7f
TI
280 rgblight_config_t config;
281 rgblight_status_t status;
b624f32f 282} rgblight_syncinfo_t;
670a9b7f 283
b624f32f 284/* for split keyboard master side */
285uint8_t rgblight_get_change_flags(void);
286void rgblight_clear_change_flags(void);
287void rgblight_get_syncinfo(rgblight_syncinfo_t *syncinfo);
288/* for split keyboard slave side */
289void rgblight_update_sync(rgblight_syncinfo_t *syncinfo, bool write_to_eeprom);
290# endif
670a9b7f 291
b624f32f 292# ifdef RGBLIGHT_USE_TIMER
dfab177f
TI
293
294typedef struct _animation_status_t {
295 uint16_t last_timer;
296 uint8_t delta; /* mode - base_mode */
297 bool restart;
298 union {
299 uint16_t pos16;
300 uint8_t pos;
22ba36a4 301 int8_t current_hue;
dfab177f
TI
302 uint16_t current_offset;
303 };
304} animation_status_t;
305
306extern animation_status_t animation_status;
307
308void rgblight_effect_breathing(animation_status_t *anim);
309void rgblight_effect_rainbow_mood(animation_status_t *anim);
310void rgblight_effect_rainbow_swirl(animation_status_t *anim);
311void rgblight_effect_snake(animation_status_t *anim);
312void rgblight_effect_knight(animation_status_t *anim);
313void rgblight_effect_christmas(animation_status_t *anim);
314void rgblight_effect_rgbtest(animation_status_t *anim);
315void rgblight_effect_alternating(animation_status_t *anim);
6d6d91c8 316
b624f32f 317# endif
6d6d91c8 318
b624f32f 319#endif // #ifndef RGBLIGHT_H_DUMMY_DEFINE
320#endif // RGBLIGHT_H