Commit | Line | Data |
---|---|---|
e16b39f0 M |
1 | /* Copyright 2018 MechMerlin |
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 | #include "jetfire.h" | |
cb2f2fd2 | 17 | #include "indicator_leds.h" |
e16b39f0 | 18 | |
cb2f2fd2 | 19 | enum BACKLIGHT_AREAS { |
e16b39f0 M |
20 | BACKLIGHT_ALPHA = 0b0000001, |
21 | BACKLIGHT_MOD = 0b0000010, | |
22 | BACKLIGHT_FROW = 0b0000100, | |
23 | BACKLIGHT_NUMBLOCK = 0b0001000, | |
24 | BACKLIGHT_RGB = 0b0010000, | |
25 | BACKLIGHT_SWITCH = 0b0001111 | |
26 | }; | |
27 | ||
28 | enum StateLed { | |
29 | STATE_LED_SCROLL_LOCK, | |
30 | STATE_LED_CAPS_LOCK, | |
31 | STATE_LED_NUM_LOCK, | |
32 | STATE_LED_LAYER_0, | |
33 | STATE_LED_LAYER_1, | |
34 | STATE_LED_LAYER_2, | |
35 | STATE_LED_LAYER_3, | |
36 | STATE_LED_LAYER_4 | |
37 | }; | |
38 | ||
39 | uint8_t backlight_rgb_r = 255; | |
40 | uint8_t backlight_rgb_g = 0; | |
41 | uint8_t backlight_rgb_b = 0; | |
42 | uint8_t backlight_state_led = 1<<STATE_LED_LAYER_0; | |
43 | ||
44 | ||
45 | void backlight_toggle_rgb(bool enabled) | |
46 | { | |
47 | if(enabled) { | |
48 | uint8_t rgb[RGBLED_NUM][3] = { | |
49 | {backlight_rgb_r, backlight_rgb_g, backlight_rgb_b}, | |
50 | {backlight_rgb_r, backlight_rgb_g, backlight_rgb_b}, | |
51 | {backlight_rgb_r, backlight_rgb_g, backlight_rgb_b}, | |
52 | {backlight_rgb_r, backlight_rgb_g, backlight_rgb_b}, | |
53 | {backlight_rgb_r, backlight_rgb_g, backlight_rgb_b}, | |
54 | {backlight_rgb_r, backlight_rgb_g, backlight_rgb_b}, | |
55 | {backlight_rgb_r, backlight_rgb_g, backlight_rgb_b}, | |
56 | {backlight_rgb_r, backlight_rgb_g, backlight_rgb_b}, | |
57 | {backlight_rgb_r, backlight_rgb_g, backlight_rgb_b}, | |
58 | {backlight_rgb_r, backlight_rgb_g, backlight_rgb_b}, | |
59 | {backlight_rgb_r, backlight_rgb_g, backlight_rgb_b}, | |
60 | {backlight_rgb_r, backlight_rgb_g, backlight_rgb_b}, | |
61 | {backlight_rgb_r, backlight_rgb_g, backlight_rgb_b}, | |
62 | {backlight_rgb_r, backlight_rgb_g, backlight_rgb_b}, | |
63 | {backlight_rgb_r, backlight_rgb_g, backlight_rgb_b}, | |
64 | {backlight_rgb_r, backlight_rgb_g, backlight_rgb_b}, | |
65 | {backlight_rgb_r, backlight_rgb_g, backlight_rgb_b}, | |
66 | {backlight_rgb_r, backlight_rgb_g, backlight_rgb_b}, | |
67 | {backlight_rgb_r, backlight_rgb_g, backlight_rgb_b}, | |
68 | {backlight_rgb_r, backlight_rgb_g, backlight_rgb_b}, | |
69 | {backlight_rgb_r, backlight_rgb_g, backlight_rgb_b}, | |
70 | {backlight_rgb_r, backlight_rgb_g, backlight_rgb_b}, | |
71 | {backlight_rgb_r, backlight_rgb_g, backlight_rgb_b} | |
72 | }; | |
73 | backlight_set_rgb(rgb); | |
74 | } else { | |
75 | uint8_t rgb[RGBLED_NUM][3] = { | |
76 | {0, 0, 0}, | |
77 | {0, 0, 0}, | |
78 | {0, 0, 0}, | |
79 | {0, 0, 0}, | |
80 | {0, 0, 0}, | |
81 | {0, 0, 0}, | |
82 | {0, 0, 0}, | |
83 | {0, 0, 0}, | |
84 | {0, 0, 0}, | |
85 | {0, 0, 0}, | |
86 | {0, 0, 0}, | |
87 | {0, 0, 0}, | |
88 | {0, 0, 0}, | |
89 | {0, 0, 0}, | |
90 | {0, 0, 0}, | |
91 | {0, 0, 0}, | |
92 | {0, 0, 0}, | |
93 | {0, 0, 0}, | |
94 | {0, 0, 0}, | |
95 | {0, 0, 0}, | |
96 | {0, 0, 0}, | |
97 | {0, 0, 0}, | |
98 | {0, 0, 0} | |
99 | }; | |
100 | backlight_set_rgb(rgb); | |
101 | } | |
102 | } | |
103 | ||
104 | void backlight_set_rgb(uint8_t cfg[RGBLED_NUM][3]) | |
105 | { | |
106 | cli(); | |
107 | for(uint8_t i = 0; i < RGBLED_NUM; ++i) { | |
108 | send_color(cfg[i][0], cfg[i][1], cfg[i][2], Device_PCBRGB); | |
109 | } | |
110 | sei(); | |
111 | show(); | |
112 | } | |
113 | ||
114 | ||
115 | void backlight_set(uint8_t level) | |
116 | { | |
117 | level & BACKLIGHT_ALPHA ? (PORTB |= 0b00000010) : (PORTB &= ~0b00000010); | |
118 | level & BACKLIGHT_MOD ? (PORTB |= 0b00000100) : (PORTB &= ~0b00000100); | |
119 | level & BACKLIGHT_FROW ? (PORTB |= 0b00001000) : (PORTB &= ~0b00001000); | |
120 | level & BACKLIGHT_NUMBLOCK ? (PORTE |= 0b01000000) : (PORTE &= ~0b01000000); | |
121 | backlight_toggle_rgb(level & BACKLIGHT_RGB); | |
122 | } | |
123 | ||
124 | ||
125 | ||
126 | bool process_record_kb(uint16_t keycode, keyrecord_t *record) { | |
127 | // put your per-action keyboard code here | |
128 | // runs for every action, just before processing by the firmware | |
129 | ||
130 | return process_record_user(keycode, record); | |
131 | } | |
132 | ||
133 | ||
134 | void backlight_update_state() | |
135 | { | |
136 | cli(); | |
137 | send_color(backlight_state_led & (1<<STATE_LED_SCROLL_LOCK) ? 255 : 0, | |
138 | backlight_state_led & (1<<STATE_LED_CAPS_LOCK) ? 255 : 0, | |
139 | backlight_state_led & (1<<STATE_LED_NUM_LOCK) ? 255 : 0, | |
cb2f2fd2 | 140 | Device_STATUSLED); |
e16b39f0 M |
141 | send_color(backlight_state_led & (1<<STATE_LED_LAYER_1) ? 255 : 0, |
142 | backlight_state_led & (1<<STATE_LED_LAYER_2) ? 255 : 0, | |
143 | backlight_state_led & (1<<STATE_LED_LAYER_0) ? 255 : 0, | |
cb2f2fd2 | 144 | Device_STATUSLED); |
e16b39f0 M |
145 | send_color(backlight_state_led & (1<<STATE_LED_LAYER_4) ? 255 : 0, |
146 | backlight_state_led & (1<<STATE_LED_LAYER_3) ? 255 : 0, | |
147 | 0, | |
cb2f2fd2 | 148 | Device_STATUSLED); |
e16b39f0 M |
149 | sei(); |
150 | show(); | |
151 | } | |
152 | ||
153 | void led_set_kb(uint8_t usb_led) | |
154 | { | |
155 | if(usb_led & (1<<USB_LED_CAPS_LOCK)) { | |
156 | backlight_state_led |= 1<<STATE_LED_CAPS_LOCK; | |
157 | } else { | |
158 | backlight_state_led &= ~(1<<STATE_LED_CAPS_LOCK); | |
159 | } | |
160 | if(usb_led & (1<<USB_LED_SCROLL_LOCK)) { | |
161 | backlight_state_led |= 1<<STATE_LED_SCROLL_LOCK; | |
162 | } else { | |
163 | backlight_state_led &= ~(1<<STATE_LED_SCROLL_LOCK); | |
164 | } | |
165 | if(usb_led & (1<<USB_LED_NUM_LOCK)) { | |
166 | backlight_state_led |= 1<<STATE_LED_NUM_LOCK; | |
167 | } else { | |
168 | backlight_state_led &= ~(1<<STATE_LED_NUM_LOCK); | |
169 | } | |
170 | backlight_update_state(); | |
171 | } |