qmk_firmware

QMK firmware for my keyboards (Corne, Sweep Ferris) and trackball (Ploopy Adept)
Log | Files | Refs | Submodules | LICENSE

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 }