1 /* Copyright 2017 REPLACE_WITH_YOUR_NAME
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.
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.
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/>.
16 #include "v60_type_r.h"
20 // if we've got an RGB underglow!
25 #include <avr/pgmspace.h>
27 #include "action_layer.h"
29 #define SOFTPWM_LED_TIMER_TOP F_CPU/(256*64)
31 extern rgblight_config_t rgblight_config;
32 static uint8_t softpwm_buff[3] = {0};
34 void matrix_init_kb(void) {
39 bool process_record_kb(uint16_t keycode, keyrecord_t *record) {
40 uint8_t r = led[0].r, g = led[0].g, b = led[0].b;
43 if (record->event.pressed) {
48 rgblight_setrgb(r, g, b);
53 if (record->event.pressed) {
58 rgblight_setrgb(r, g, b);
63 if (record->event.pressed) {
68 rgblight_setrgb(r, g, b);
73 if (record->event.pressed) {
78 rgblight_setrgb(r, g, b);
83 if (record->event.pressed) {
88 rgblight_setrgb(r, g, b);
93 if (record->event.pressed) {
98 rgblight_setrgb(r, g, b);
104 return process_record_user(keycode, record);
108 void rgb_timer_init(void) {
111 TCCR1B |= (1<<WGM12);
112 /* Clock selelct: clk/8 */
117 OCR1AH = (SOFTPWM_LED_TIMER_TOP >> 8) & 0xff;
118 OCR1AL = SOFTPWM_LED_TIMER_TOP & 0xff;
121 // Enable the compare match interrupt on timer 1
122 TIMSK1 |= (1<<OCIE1A);
125 void rgb_init(void) {
126 DDRF |= (1<<PF6 | 1<<PF5 | 1<<PF4);
127 PORTF |= (1<<PF6 | 1<<PF5 | 1<<PF4);
132 void set_rgb_pin_on(uint8_t pin) {
136 void set_rgb_pin_off(uint8_t pin) {
140 void rgblight_set(void) {
141 // xprintf("Setting RGB underglow\n");
142 if (!rgblight_config.enable) {
146 set_rgb_pin_off(RGB_RED_PIN);
147 set_rgb_pin_off(RGB_GREEN_PIN);
148 set_rgb_pin_off(RGB_BLUE_PIN);
151 // //xprintf("Red: %u, Green: %u, Blue: %u\n", led[0].r, led[0].g, led[0].b);
154 ISR(TIMER1_COMPA_vect)
156 static uint8_t pwm = 0;
161 if (softpwm_buff[0]) {
162 set_rgb_pin_on(RGB_RED_PIN);
163 softpwm_buff[0] = led[0].r;
166 if (softpwm_buff[1]) {
167 set_rgb_pin_on(RGB_GREEN_PIN);
168 softpwm_buff[1] = led[0].g;
171 if (softpwm_buff[2]) {
172 set_rgb_pin_on(RGB_BLUE_PIN);
173 softpwm_buff[2] = led[0].b;
178 if (pwm == softpwm_buff[0]) {
179 set_rgb_pin_off(RGB_RED_PIN);
180 softpwm_buff[0] = led[0].r;
184 if (pwm == softpwm_buff[1]) {
185 set_rgb_pin_off(RGB_GREEN_PIN);
186 softpwm_buff[1] = led[0].g;
189 if (pwm == softpwm_buff[2]) {
190 set_rgb_pin_off(RGB_BLUE_PIN);
191 softpwm_buff[2] = led[0].b;
194 #endif // V60_POLESTAR