jetfire.c (3647B)
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 "quantum.h" 17 #include "indicator_leds.h" 18 19 enum BACKLIGHT_AREAS { 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 uint8_t rgb[RGBLIGHT_LED_COUNT][3] = { 0 }; 48 49 if(enabled) { 50 for(uint8_t i = 0; i < RGBLIGHT_LED_COUNT; ++i) { 51 rgb[i][0] = backlight_rgb_r; 52 rgb[i][1] = backlight_rgb_g; 53 rgb[i][2] = backlight_rgb_b; 54 } 55 } 56 backlight_set_rgb(rgb); 57 } 58 59 void backlight_set_rgb(uint8_t cfg[RGBLIGHT_LED_COUNT][3]) 60 { 61 cli(); 62 for(uint8_t i = 0; i < RGBLIGHT_LED_COUNT; ++i) { 63 send_color(cfg[i][0], cfg[i][1], cfg[i][2], Device_PCBRGB); 64 } 65 sei(); 66 show(); 67 } 68 69 70 void backlight_set(uint8_t level) 71 { 72 level & BACKLIGHT_ALPHA ? (PORTB |= 0b00000010) : (PORTB &= ~0b00000010); 73 level & BACKLIGHT_MOD ? (PORTB |= 0b00000100) : (PORTB &= ~0b00000100); 74 level & BACKLIGHT_FROW ? (PORTB |= 0b00001000) : (PORTB &= ~0b00001000); 75 level & BACKLIGHT_NUMBLOCK ? (PORTE |= 0b01000000) : (PORTE &= ~0b01000000); 76 backlight_toggle_rgb(level & BACKLIGHT_RGB); 77 } 78 79 void backlight_update_state(void) 80 { 81 cli(); 82 send_color(backlight_state_led & (1<<STATE_LED_SCROLL_LOCK) ? 255 : 0, 83 backlight_state_led & (1<<STATE_LED_CAPS_LOCK) ? 255 : 0, 84 backlight_state_led & (1<<STATE_LED_NUM_LOCK) ? 255 : 0, 85 Device_STATUSLED); 86 send_color(backlight_state_led & (1<<STATE_LED_LAYER_1) ? 255 : 0, 87 backlight_state_led & (1<<STATE_LED_LAYER_2) ? 255 : 0, 88 backlight_state_led & (1<<STATE_LED_LAYER_0) ? 255 : 0, 89 Device_STATUSLED); 90 send_color(backlight_state_led & (1<<STATE_LED_LAYER_4) ? 255 : 0, 91 backlight_state_led & (1<<STATE_LED_LAYER_3) ? 255 : 0, 92 0, 93 Device_STATUSLED); 94 sei(); 95 show(); 96 } 97 98 bool led_update_kb(led_t led_state) { 99 bool res = led_update_user(led_state); 100 if(res) { 101 if(led_state.caps_lock) { 102 backlight_state_led |= 1<<STATE_LED_CAPS_LOCK; 103 } else { 104 backlight_state_led &= ~(1<<STATE_LED_CAPS_LOCK); 105 } 106 if(led_state.scroll_lock) { 107 backlight_state_led |= 1<<STATE_LED_SCROLL_LOCK; 108 } else { 109 backlight_state_led &= ~(1<<STATE_LED_SCROLL_LOCK); 110 } 111 if(led_state.num_lock) { 112 backlight_state_led |= 1<<STATE_LED_NUM_LOCK; 113 } else { 114 backlight_state_led &= ~(1<<STATE_LED_NUM_LOCK); 115 } 116 backlight_update_state(); 117 } 118 return res; 119 }