sinowealth: implement brightness and speed controls

This commit is contained in:
Marian Beermann
2020-06-26 23:27:31 +02:00
committed by Filipe Laíns
parent 9cfc1e98e3
commit d2d5471836

View File

@@ -40,6 +40,9 @@
/* other models might have up to eight */
#define SINOWEALTH_NUM_DPIS 6
#define SINOWEALTH_RGB_BRIGHTNESS_BITS 0xF0
#define SINOWEALTH_RGB_SPEED_BITS 0x0F
typedef struct __attribute__((packed)) {
uint8_t r, g, b;
} RGB8;
@@ -173,6 +176,38 @@ sinowealth_color_to_rbg(struct ratbag_color color)
return (RBG8) {.r = color.red, .g = color.green, .b = color.blue};
}
static int
sinowealth_rgb_mode_to_brightness(uint8_t mode)
{
return max(mode >> 4 << 6, 255);
}
static int
sinowealth_rgb_mode_to_speed(uint8_t mode)
{
switch (mode & SINOWEALTH_RGB_SPEED_BITS) {
case 0: return 10000; /* static: does not translate to duration */
case 1: return 1500;
case 2: return 1000;
case 3: return 500;
default: return 0;
}
}
static uint8_t
sinowealth_to_rgb_mode(int brightness, int speed_ms)
{
uint8_t mode = (brightness + 1) >> 6 << 4;
if (speed_ms <= 500) {
mode |= 3;
} else if (speed_ms <= 1000) {
mode |= 2;
} else {
mode |= 1;
}
return mode;
}
static int
sinowealth_read_profile(struct ratbag_profile *profile)
{
@@ -246,6 +281,7 @@ sinowealth_read_profile(struct ratbag_profile *profile)
case RGB_SINGLE:
led->mode = RATBAG_LED_ON;
led->color = sinowealth_rbg_to_color(config->single_color);
led->brightness = sinowealth_rgb_mode_to_brightness(config->single_mode);
break;
case RGB_GLORIOUS:
case RGB_BREATHING:
@@ -254,10 +290,14 @@ sinowealth_read_profile(struct ratbag_profile *profile)
case RGB_RAVE:
case RGB_WAVE:
led->mode = RATBAG_LED_CYCLE;
led->brightness = sinowealth_rgb_mode_to_brightness(config->glorious_mode);
led->ms = sinowealth_rgb_mode_to_speed(config->glorious_mode);
break;
case RGB_BREATHING1:
led->mode = RATBAG_LED_BREATHING;
led->color = sinowealth_rbg_to_color(config->breathing1_color);
led->brightness = sinowealth_rgb_mode_to_brightness(config->breathing1_mode);
led->ms = sinowealth_rgb_mode_to_speed(config->breathing1_mode);
break;
}
ratbag_led_unref(led);
@@ -361,11 +401,12 @@ sinowealth_commit(struct ratbag_device *device)
break;
case RATBAG_LED_CYCLE:
config->rgb_effect = RGB_GLORIOUS;
config->glorious_mode = sinowealth_to_rgb_mode(led->brightness, led->ms);
break;
case RATBAG_LED_BREATHING:
config->rgb_effect = RGB_BREATHING1;
config->breathing1_color = sinowealth_color_to_rbg(led->color);
config->breathing1_mode = 0x43;
config->breathing1_mode = sinowealth_to_rgb_mode(led->brightness, led->ms);
break;
}
ratbag_led_unref(led);