RGB Matrix Typing Heatmap (#5786)
[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
6d6d91c8
TI
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,
dfab177f
TI
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
81#define RGBLIGHT_MODES (RGBLIGHT_MODE_last-1)
0a40654b 82
3da8d46a 83// sample: #define RGBLIGHT_EFFECT_BREATHE_CENTER 1.85
ad49db8c 84
85#ifndef RGBLIGHT_EFFECT_BREATHE_MAX
86#define RGBLIGHT_EFFECT_BREATHE_MAX 255 // 0-255
87#endif
88
0a40654b 89#ifndef RGBLIGHT_EFFECT_SNAKE_LENGTH
4580d3a7 90#define RGBLIGHT_EFFECT_SNAKE_LENGTH 4
0a40654b
YL
91#endif
92
93#ifndef RGBLIGHT_EFFECT_KNIGHT_LENGTH
4580d3a7 94#define RGBLIGHT_EFFECT_KNIGHT_LENGTH 3
0a40654b 95#endif
4580d3a7 96
0a40654b 97#ifndef RGBLIGHT_EFFECT_KNIGHT_OFFSET
94f8b758 98#define RGBLIGHT_EFFECT_KNIGHT_OFFSET 0
0a40654b
YL
99#endif
100
4580d3a7 101#ifndef RGBLIGHT_EFFECT_KNIGHT_LED_NUM
102#define RGBLIGHT_EFFECT_KNIGHT_LED_NUM RGBLED_NUM
103#endif
104
0e548f8b 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
0a40654b 113#ifndef RGBLIGHT_HUE_STEP
22ba36a4 114#define RGBLIGHT_HUE_STEP 8
0a40654b
YL
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
4e236969
122#ifndef RGBLIGHT_LIMIT_VAL
123#define RGBLIGHT_LIMIT_VAL 255
124#endif
0a40654b
YL
125
126#define RGBLED_TIMER_TOP F_CPU/(256*64)
e9f74875 127// #define RGBLED_TIMER_TOP 0xFF10
0a40654b
YL
128
129#include <stdint.h>
130#include <stdbool.h>
131#include "eeconfig.h"
d4cd5dda 132#ifndef RGBLIGHT_CUSTOM_DRIVER
42d5a324 133#include "ws2812.h"
d4cd5dda
LR
134#endif
135#include "rgblight_types.h"
c1b46206 136#include "rgblight_list.h"
0a40654b 137
0fab3bbd
TC
138#if defined(__AVR__)
139 #include <avr/pgmspace.h>
140#endif
141
748181dc
SW
142extern LED_TYPE led[RGBLED_NUM];
143
9b0e21f8
FS
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;
cc146e32 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
YL
153typedef union {
154 uint32_t raw;
155 struct {
156 bool enable :1;
22ba36a4
X
157 uint8_t mode :7;
158 uint8_t hue :8;
0a40654b
YL
159 uint8_t sat :8;
160 uint8_t val :8;
afacd423 161 uint8_t speed :8;//EECONFIG needs to be increased to support this
0a40654b
YL
162 };
163} rgblight_config_t;
164
dfab177f
TI
165typedef struct _rgblight_status_t {
166 uint8_t base_mode;
167 bool timer_enabled;
168#ifdef RGBLIGHT_SPLIT
169 uint8_t change_flags;
170#endif
171} rgblight_status_t;
172
173#ifdef RGBLIGHT_SPLIT
174 #define RGBLIGHT_STATUS_CHANGE_MODE (1<<0)
175 #define RGBLIGHT_STATUS_CHANGE_HSVS (1<<1)
176 #define RGBLIGHT_STATUS_CHANGE_TIMER (1<<2)
177 #define RGBLIGHT_STATUS_ANIMATION_TICK (1<<3)
178
179 typedef struct _rgblight_syncinfo_t {
180 rgblight_config_t config;
181 rgblight_status_t status;
182 } rgblight_syncinfo_t;
183
184 /* for split keyboard master side */
185 uint8_t rgblight_get_change_flags(void);
186 void rgblight_clear_change_flags(void);
187 void rgblight_get_syncinfo(rgblight_syncinfo_t *syncinfo);
188 /* for split keyboard slave side */
189 void rgblight_update_sync(rgblight_syncinfo_t *syncinfo, bool write_to_eeprom);
190#endif
191
0a40654b
YL
192void rgblight_init(void);
193void rgblight_increase(void);
194void rgblight_decrease(void);
195void rgblight_toggle(void);
285c5a91 196void rgblight_enable(void);
16546ee0 197void rgblight_disable(void);
0a40654b 198void rgblight_step(void);
5a1b68d5 199void rgblight_step_reverse(void);
b7688590 200uint8_t rgblight_get_mode(void);
0a40654b
YL
201void rgblight_mode(uint8_t mode);
202void rgblight_set(void);
9c4424ae 203uint32_t rgblight_read_dword(void);
2e23689b 204void rgblight_update_dword(uint32_t dword);
0a40654b
YL
205void rgblight_increase_hue(void);
206void rgblight_decrease_hue(void);
207void rgblight_increase_sat(void);
208void rgblight_decrease_sat(void);
209void rgblight_increase_val(void);
210void rgblight_decrease_val(void);
afacd423 211void rgblight_increase_speed(void);
212void rgblight_decrease_speed(void);
22ba36a4
X
213void rgblight_sethsv(uint8_t hue, uint8_t sat, uint8_t val);
214uint8_t rgblight_get_hue(void);
12e66330 215uint8_t rgblight_get_sat(void);
216uint8_t rgblight_get_val(void);
0a40654b 217void rgblight_setrgb(uint8_t r, uint8_t g, uint8_t b);
16546ee0 218void rgblight_setrgb_at(uint8_t r, uint8_t g, uint8_t b, uint8_t index);
22ba36a4 219void rgblight_sethsv_at(uint8_t hue, uint8_t sat, uint8_t val, uint8_t index);
642f6cf1 220void rgblight_setrgb_range(uint8_t r, uint8_t g, uint8_t b, uint8_t start, uint8_t end);
22ba36a4 221void rgblight_sethsv_range(uint8_t hue, uint8_t sat, uint8_t val, uint8_t start, uint8_t end);
642f6cf1
E
222void rgblight_setrgb_master(uint8_t r, uint8_t g, uint8_t b);
223void rgblight_setrgb_slave(uint8_t r, uint8_t g, uint8_t b);
22ba36a4
X
224void rgblight_sethsv_master(uint8_t hue, uint8_t sat, uint8_t val);
225void rgblight_sethsv_slave(uint8_t hue, uint8_t sat, uint8_t val);
f077204f 226void rgblight_set_clipping_range(uint8_t start_pos, uint8_t num_leds);
0a40654b 227
0a40654b 228uint32_t eeconfig_read_rgblight(void);
620ac4b2
ET
229void eeconfig_update_rgblight(uint32_t val);
230void eeconfig_update_rgblight_default(void);
0a40654b
YL
231void eeconfig_debug_rgblight(void);
232
afacd423 233void rgb_matrix_increase(void);
234void rgb_matrix_decrease(void);
235
22ba36a4 236void sethsv(uint8_t hue, uint8_t sat, uint8_t val, LED_TYPE *led1);
e9f74875 237void setrgb(uint8_t r, uint8_t g, uint8_t b, LED_TYPE *led1);
751719e6 238
22ba36a4 239void rgblight_sethsv_noeeprom(uint8_t hue, uint8_t sat, uint8_t val);
751719e6
DJ
240void rgblight_mode_noeeprom(uint8_t mode);
241void rgblight_toggle_noeeprom(void);
242void rgblight_enable_noeeprom(void);
243void rgblight_disable_noeeprom(void);
9e6ee477
FS
244void rgblight_step_noeeprom(void);
245void rgblight_step_reverse_noeeprom(void);
246void rgblight_increase_hue_noeeprom(void);
247void rgblight_decrease_hue_noeeprom(void);
248void rgblight_increase_sat_noeeprom(void);
249void rgblight_decrease_sat_noeeprom(void);
250void rgblight_increase_val_noeeprom(void);
251void rgblight_decrease_val_noeeprom(void);
751719e6 252
22ba36a4 253void rgblight_sethsv_eeprom_helper(uint8_t hue, uint8_t sat, uint8_t val, bool write_to_eeprom);
751719e6
DJ
254void rgblight_mode_eeprom_helper(uint8_t mode, bool write_to_eeprom);
255
0a40654b 256
4094544d
EZ
257#define EZ_RGB(val) rgblight_show_solid_color((val >> 16) & 0xFF, (val >> 8) & 0xFF, val & 0xFF)
258void rgblight_show_solid_color(uint8_t r, uint8_t g, uint8_t b);
e9f74875
JH
259
260void rgblight_task(void);
261
0a40654b
YL
262void rgblight_timer_init(void);
263void rgblight_timer_enable(void);
264void rgblight_timer_disable(void);
265void rgblight_timer_toggle(void);
0a40654b 266
dfab177f
TI
267#ifdef RGBLIGHT_USE_TIMER
268
269typedef struct _animation_status_t {
270 uint16_t last_timer;
271 uint8_t delta; /* mode - base_mode */
272 bool restart;
273 union {
274 uint16_t pos16;
275 uint8_t pos;
22ba36a4 276 int8_t current_hue;
dfab177f
TI
277 uint16_t current_offset;
278 };
279} animation_status_t;
280
281extern animation_status_t animation_status;
282
283void rgblight_effect_breathing(animation_status_t *anim);
284void rgblight_effect_rainbow_mood(animation_status_t *anim);
285void rgblight_effect_rainbow_swirl(animation_status_t *anim);
286void rgblight_effect_snake(animation_status_t *anim);
287void rgblight_effect_knight(animation_status_t *anim);
288void rgblight_effect_christmas(animation_status_t *anim);
289void rgblight_effect_rgbtest(animation_status_t *anim);
290void rgblight_effect_alternating(animation_status_t *anim);
6d6d91c8 291
0a40654b 292#endif
6d6d91c8 293
dfab177f
TI
294#endif // #ifndef RGBLIGHT_H_DUMMY_DEFINE
295#endif // RGBLIGHT_H