diff options
| author | davidevinavil <davidevinavil@gmail.com> | 2018-01-23 19:08:10 +0100 |
|---|---|---|
| committer | Davide Garberi <dade.garberi@gmail.com> | 2018-01-23 20:29:33 +0100 |
| commit | c217e748f1bb0c4f0672c7ee9203cfaa23dfdcfb (patch) | |
| tree | ca678e7dece184f563d1b4c1d45b5e086afb401d | |
| parent | 506fd1c6daac235e07829453f28b313ea82092be (diff) | |
liblight: Handle RGB colors
Signed-off-by: Davide Garberi <dade.garberi@gmail.com>
| -rw-r--r-- | liblight/lights.c | 82 |
1 files changed, 78 insertions, 4 deletions
diff --git a/liblight/lights.c b/liblight/lights.c index 14777a5..59ae0bf 100644 --- a/liblight/lights.c +++ b/liblight/lights.c @@ -44,27 +44,69 @@ static struct light_state_t g_battery; char const*const RED_LED_FILE = "/sys/class/leds/led:rgb_red/brightness"; +char const*const GREEN_LED_FILE + = "/sys/class/leds/led:rgb_green/brightness"; + +char const*const BLUE_LED_FILE + = "/sys/class/leds/led:rgb_blue/brightness"; + char const*const LCD_FILE = "/sys/class/leds/lcd-backlight/brightness"; char const*const RED_DUTY_PCTS_FILE = "/sys/class/leds/led:rgb_red/duty_pcts"; +char const*const GREEN_DUTY_PCTS_FILE + = "/sys/class/leds/led:rgb_green/duty_pcts"; + +char const*const BLUE_DUTY_PCTS_FILE + = "/sys/class/leds/led:rgb_blue/duty_pcts"; + char const*const RED_START_IDX_FILE = "/sys/class/leds/led:rgb_red/start_idx"; +char const*const GREEN_START_IDX_FILE + = "/sys/class/leds/led:rgb_green/start_idx"; + +char const*const BLUE_START_IDX_FILE + = "/sys/class/leds/led:rgb_blue/start_idx"; + char const*const RED_PAUSE_LO_FILE = "/sys/class/leds/led:rgb_red/pause_lo"; +char const*const GREEN_PAUSE_LO_FILE + = "/sys/class/leds/led:rgb_green/pause_lo"; + +char const*const BLUE_PAUSE_LO_FILE + = "/sys/class/leds/led:rgb_blue/pause_lo"; + char const*const RED_PAUSE_HI_FILE = "/sys/class/leds/led:rgb_red/pause_hi"; +char const*const GREEN_PAUSE_HI_FILE + = "/sys/class/leds/led:rgb_green/pause_hi"; + +char const*const BLUE_PAUSE_HI_FILE + = "/sys/class/leds/led:rgb_blue/pause_hi"; + char const*const RED_RAMP_STEP_MS_FILE = "/sys/class/leds/led:rgb_red/ramp_step_ms"; +char const*const GREEN_RAMP_STEP_MS_FILE + = "/sys/class/leds/led:rgb_green/ramp_step_ms"; + +char const*const BLUE_RAMP_STEP_MS_FILE + = "/sys/class/leds/led:rgb_blue/ramp_step_ms"; + char const*const RED_BLINK_FILE = "/sys/class/leds/led:rgb_red/blink"; +char const*const GREEN_BLINK_FILE + = "/sys/class/leds/led:rgb_green/blink"; + +char const*const BLUE_BLINK_FILE + = "/sys/class/leds/led:rgb_blue/blink"; + #define RAMP_SIZE 8 static int BRIGHTNESS_RAMP[RAMP_SIZE] = { 0, 12, 25, 37, 50, 72, 85, 100 }; @@ -177,8 +219,7 @@ static int set_speaker_light_locked(struct light_device_t* dev, struct light_state_t const* state) { - int red; - int blink; + int red, green, blue, blink; int onMS, offMS, stepDuration, pauseHi; unsigned int colorRGB; char *duty; @@ -205,11 +246,18 @@ set_speaker_light_locked(struct light_device_t* dev, state->flashMode, colorRGB, onMS, offMS); red = (colorRGB >> 16) & 0xFF; - + green = (colorRGB >> 8) & 0xFF; + blue = colorRGB & 0xFF; + // bias for true white + if (colorRGB != 0 && red == green && green == blue) { + blue = (blue * 171) / 256; + } blink = onMS > 0 && offMS > 0; // disable all blinking to start write_int(RED_BLINK_FILE, 0); + write_int(GREEN_BLINK_FILE, 0); + write_int(BLUE_BLINK_FILE, 0); if (blink) { stepDuration = RAMP_STEP_DURATION; @@ -230,11 +278,37 @@ set_speaker_light_locked(struct light_device_t* dev, write_int(RED_RAMP_STEP_MS_FILE, stepDuration); free(duty); + // green + write_int(GREEN_START_IDX_FILE, RAMP_SIZE); + duty = get_scaled_duty_pcts(green); + write_str(GREEN_DUTY_PCTS_FILE, duty); + write_int(GREEN_PAUSE_LO_FILE, offMS); + // The led driver is configured to ramp up then ramp + // down the lut. This effectively doubles the ramp duration. + write_int(GREEN_PAUSE_HI_FILE, pauseHi); + write_int(GREEN_RAMP_STEP_MS_FILE, stepDuration); + free(duty); + + // blue + write_int(BLUE_START_IDX_FILE, RAMP_SIZE * 2); + duty = get_scaled_duty_pcts(blue); + write_str(BLUE_DUTY_PCTS_FILE, duty); + write_int(BLUE_PAUSE_LO_FILE, offMS); + // The led driver is configured to ramp up then ramp + // down the lut. This effectively doubles the ramp duration. + write_int(BLUE_PAUSE_HI_FILE, pauseHi); + write_int(BLUE_RAMP_STEP_MS_FILE, stepDuration); + free(duty); + // start the party write_int(RED_BLINK_FILE, red); + write_int(GREEN_BLINK_FILE, green); + write_int(BLUE_BLINK_FILE, blue); } else { write_int(RED_LED_FILE, red); + write_int(GREEN_LED_FILE, green); + write_int(BLUE_LED_FILE, blue); } @@ -380,7 +454,7 @@ struct hw_module_t HAL_MODULE_INFO_SYM = { .version_major = 1, .version_minor = 0, .id = LIGHTS_HARDWARE_MODULE_ID, - .name = "ZUK Z2 Lights Module", + .name = "Lights Module", .author = "The CyanogenMod Project", .methods = &lights_module_methods, }; |
