aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordavidevinavil <davidevinavil@gmail.com>2018-01-23 19:08:10 +0100
committerDavide Garberi <dade.garberi@gmail.com>2018-01-23 20:29:33 +0100
commitc217e748f1bb0c4f0672c7ee9203cfaa23dfdcfb (patch)
treeca678e7dece184f563d1b4c1d45b5e086afb401d
parent506fd1c6daac235e07829453f28b313ea82092be (diff)
liblight: Handle RGB colors
Signed-off-by: Davide Garberi <dade.garberi@gmail.com>
-rw-r--r--liblight/lights.c82
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,
};