Rework RGBLight driver system (#22529)
This commit is contained in:
		
							parent
							
								
									2acb426b8e
								
							
						
					
					
						commit
						17f36a21bf
					
				
					 35 changed files with 125 additions and 87 deletions
				
			
		| 
						 | 
				
			
			@ -57,6 +57,7 @@ void housekeeping_task_kb(void) {
 | 
			
		|||
 | 
			
		||||
#ifdef RGBLIGHT_ENABLE
 | 
			
		||||
#include "rgblight.h"
 | 
			
		||||
#include "ws2812.h"
 | 
			
		||||
#include "i2c_master.h"
 | 
			
		||||
 | 
			
		||||
const aw9523b_led g_aw9523b_leds[AW9523B_RGB_NUM] = {
 | 
			
		||||
| 
						 | 
				
			
			@ -66,7 +67,7 @@ const aw9523b_led g_aw9523b_leds[AW9523B_RGB_NUM] = {
 | 
			
		|||
    {AW9523B_P07_PWM, AW9523B_P06_PWM, AW9523B_P05_PWM},
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
void rgblight_call_driver(rgb_led_t *start_led, uint8_t num_leds)
 | 
			
		||||
void setleds_custom(rgb_led_t *start_led, uint16_t num_leds)
 | 
			
		||||
{
 | 
			
		||||
    uint8_t num = num_leds < AW9523B_RGB_NUM ? num_leds : AW9523B_RGB_NUM;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -77,6 +78,10 @@ void rgblight_call_driver(rgb_led_t *start_led, uint8_t num_leds)
 | 
			
		|||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const rgblight_driver_t rgblight_driver = {
 | 
			
		||||
    .setleds = setleds_custom,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
static uint16_t caps_lock_pin = DEF_PIN(TCA6424_PORT2, 3);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -10,6 +10,7 @@
 | 
			
		|||
  },
 | 
			
		||||
  "rgblight": {
 | 
			
		||||
    "led_count": 9,
 | 
			
		||||
    "driver": "custom",
 | 
			
		||||
    "animations": {
 | 
			
		||||
      "breathing": true,
 | 
			
		||||
      "rainbow_mood": true,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -46,3 +46,4 @@ CUSTOM_MATRIX = lite
 | 
			
		|||
# project specific files
 | 
			
		||||
SRC += matrix.c tca6424.c aw9523b.c
 | 
			
		||||
I2C_DRIVER_REQUIRED = yes
 | 
			
		||||
WS2812_DRIVER_REQUIRED = yes
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -10,6 +10,7 @@
 | 
			
		|||
  },
 | 
			
		||||
  "rgblight": {
 | 
			
		||||
    "led_count": 20,
 | 
			
		||||
    "driver": "custom",
 | 
			
		||||
    "animations": {
 | 
			
		||||
      "breathing": true,
 | 
			
		||||
      "rainbow_mood": true,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -357,7 +357,7 @@ static void custom_effects(void)
 | 
			
		|||
    effect_funcs[rgb_ring.effect]();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void rgblight_call_driver(rgb_led_t *start_led, uint8_t num_leds)
 | 
			
		||||
void setleds_custom(rgb_led_t *start_led, uint16_t num_leds)
 | 
			
		||||
{
 | 
			
		||||
    if (rgb_ring.state != RING_STATE_QMK) {
 | 
			
		||||
        return;
 | 
			
		||||
| 
						 | 
				
			
			@ -368,6 +368,10 @@ void rgblight_call_driver(rgb_led_t *start_led, uint8_t num_leds)
 | 
			
		|||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const rgblight_driver_t rgblight_driver = {
 | 
			
		||||
    .setleds = setleds_custom,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void rgb_ring_init(void)
 | 
			
		||||
{
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -22,45 +22,42 @@ extern rgblight_config_t rgblight_config;
 | 
			
		|||
#endif
 | 
			
		||||
rgb_led_t noah_leds[RGBLED_NUM];
 | 
			
		||||
static bool noah_led_mode = false;
 | 
			
		||||
void rgblight_set(void) {
 | 
			
		||||
void setleds_custom(rgb_led_t *ledarray, uint16_t num_leds) {
 | 
			
		||||
    memset(&noah_leds[0], 0, sizeof(noah_leds));
 | 
			
		||||
    if (!rgblight_config.enable) {
 | 
			
		||||
        for (uint8_t i = 0; i < RGBLED_NUM; i++) {
 | 
			
		||||
            led[i].r = 0;
 | 
			
		||||
            led[i].g = 0;
 | 
			
		||||
            led[i].b = 0;
 | 
			
		||||
            ledarray[i].r = 0;
 | 
			
		||||
            ledarray[i].g = 0;
 | 
			
		||||
            ledarray[i].b = 0;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    if (noah_led_mode) {
 | 
			
		||||
      led_t led_state = host_keyboard_led_state();
 | 
			
		||||
      if (led_state.caps_lock) {
 | 
			
		||||
        noah_leds[0] = led[0];
 | 
			
		||||
        noah_leds[0] = ledarray[0];
 | 
			
		||||
      }
 | 
			
		||||
      if (led_state.scroll_lock) {
 | 
			
		||||
        noah_leds[1] = led[1];
 | 
			
		||||
        noah_leds[1] = ledarray[1];
 | 
			
		||||
      }
 | 
			
		||||
      if (led_state.num_lock) {
 | 
			
		||||
        noah_leds[2] = led[2];
 | 
			
		||||
        noah_leds[2] = ledarray[2];
 | 
			
		||||
      }
 | 
			
		||||
      for (int32_t i = 0; i < 4; i++) {
 | 
			
		||||
        if(layer_state_is(i+1)) {
 | 
			
		||||
          noah_leds[i + 3] = led[i + 3];
 | 
			
		||||
          noah_leds[i + 3] = ledarray[i + 3];
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    } else {
 | 
			
		||||
      memcpy(&noah_leds[0], &led[0], sizeof(noah_leds));
 | 
			
		||||
      memcpy(&noah_leds[0], &ledarray[0], sizeof(noah_leds));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  ws2812_setleds(noah_leds, RGBLED_NUM);
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
void matrix_scan_kb(void) {
 | 
			
		||||
#ifdef RGBLIGHT_ENABLE
 | 
			
		||||
    rgblight_task();
 | 
			
		||||
const rgblight_driver_t rgblight_driver = {
 | 
			
		||||
    .setleds = setleds_custom,
 | 
			
		||||
};
 | 
			
		||||
#endif
 | 
			
		||||
    matrix_scan_user();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#ifdef RGB_MATRIX_ENABLE
 | 
			
		||||
const is31fl3731_led_t PROGMEM g_is31fl3731_leds[RGB_MATRIX_LED_COUNT] = {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue