qmk_firmware

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

rgb_matrix_kb.inc (3710B)


      1 RGB_MATRIX_EFFECT(SINGLE_COLOR_RAINDROPS)
      2 RGB_MATRIX_EFFECT(STATIC_GAME_MODE)
      3 #ifdef RGB_MATRIX_CUSTOM_EFFECT_IMPLS
      4 
      5 /* This effect has been partially derived from quantum/rgb_matrix/animations/pixel_rain_anim.h and raindrops_anim.h 
      6 It sets random LEDs to matrix color (with very slight hue variation) but random intensity */
      7 static bool SINGLE_COLOR_RAINDROPS(effect_params_t* params) {
      8     static uint32_t wait_timer = 0;
      9 
     10     // interval function and timing in general taken from pixel rain animation
     11     inline uint32_t interval(void) {
     12         return 500 / scale16by8(qadd8(rgb_matrix_config.speed, 16), 16);
     13     }
     14 
     15     void single_color_raindrops_set_color(uint8_t i, effect_params_t * params) {
     16         if (!HAS_ANY_FLAGS(g_led_config.flags[i], params->flags)) {
     17             return;
     18         }
     19         
     20         // Take matrix color, add between -5 and +5 to hue, random brightness between 0 and val, set to 0 if val between 0 and 5, then write to LED
     21         hsv_t hsv = rgb_matrix_get_hsv();
     22         hsv.h = rgb_matrix_get_hue() - 2 + random8() % 5;
     23         hsv.v = random8() % rgb_matrix_get_val();
     24         if (hsv.v < 5) { 
     25             hsv.v = 0;
     26         }
     27         rgb_t rgb = rgb_matrix_hsv_to_rgb(hsv);
     28         rgb_matrix_set_color(i, rgb.r, rgb.g, rgb.b);
     29         wait_timer = g_rgb_timer + interval();
     30     }
     31 
     32     RGB_MATRIX_USE_LIMITS(led_min, led_max);
     33     if (!params->init) {
     34         if (g_rgb_timer > wait_timer) {
     35             single_color_raindrops_set_color(mod8(random8(), RGB_MATRIX_LED_COUNT), params);
     36         }
     37     } else {
     38         for (int i = led_min; i < led_max; i++) {
     39             single_color_raindrops_set_color(i, params);
     40         }
     41     }
     42     return rgb_matrix_check_finished_leds(led_max);
     43 }
     44 
     45 /* This "effect" is a workaround to fix long matrix scan pauses caused by i2c communication.
     46 When enabled, it writes all relevant LEDs once to static colors, then halts LED refreshes until a different animation is selcted. */
     47 bool STATIC_GAME_MODE(effect_params_t* params) {
     48 
     49     void game_mode_set_color(int i, effect_params_t* params) {
     50         if (!HAS_ANY_FLAGS(g_led_config.flags[i], params->flags)) {
     51             return;
     52         }
     53 
     54         hsv_t hsv = rgb_matrix_get_hsv();
     55 
     56         switch (i) {
     57             case W_LED_INDEX:
     58             case A_LED_INDEX:
     59             case S_LED_INDEX:
     60             case D_LED_INDEX:
     61 
     62             case M_LED_INDEX:
     63             case K_LED_INDEX:
     64             case O_LED_INDEX:
     65             case P_LED_INDEX:
     66             case NUM_0_LED_INDEX:
     67             case SLSH_LED_INDEX:
     68                 break;
     69 
     70             case SCLN_LED_INDEX:
     71             case ANV_A_LED_INDEX:
     72             case ANV_N_LED_INDEX:
     73             case ANV_V_LED_INDEX:
     74             case ANV_I_LED_INDEX:
     75             case ANV_L_LED_INDEX:
     76                 hsv.s = 255;
     77                 hsv.h = rgb_matrix_get_hue()+30;
     78                 break;
     79 
     80             case NUM_1_LED_INDEX:
     81             case NUM_2_LED_INDEX:
     82             case NUM_3_LED_INDEX:
     83             case NUM_4_LED_INDEX:
     84             case NUM_5_LED_INDEX:
     85                 hsv.s = 255;
     86                 hsv.h = rgb_matrix_get_hue()+30;
     87                 hsv.v = rgb_matrix_get_val()*2/3;
     88                 break;
     89 
     90             default:
     91                 hsv.v = 0;
     92                 break;
     93         }
     94 
     95         rgb_t rgb = hsv_to_rgb(hsv);
     96         rgb_matrix_set_color(i, rgb.r, rgb.g, rgb.b);
     97     }
     98 
     99     RGB_MATRIX_USE_LIMITS(led_min, led_max);
    100     if (!params->init) {
    101         // Do not update LEDs after initial blanking
    102     } else {
    103         for (int i = led_min; i < led_max; i++) {
    104             game_mode_set_color(i, params);
    105         }
    106     }
    107     return rgb_matrix_check_finished_leds(led_max);
    108 }
    109 
    110 #endif // RGB_MATRIX_CUSTOM_EFFECT_IMPLS