Hi,
I have a problem about CAF leds modules. I submit a led event to turn on led for 3600ms and turn off led for 500ms, but it work inversely in fact.
I find that leds.c will delay 3600ms firstly withoud turn on led, it will turn on led for 500ms after 3600ms.
static void led_update(struct led *led)
{
k_work_cancel_delayable(&led->work);
led->effect_step = 0;
led->effect_substep = 0;
if (!led->effect) {
LOG_DBG("No effect set");
return;
}
__ASSERT_NO_MSG(led->effect->steps);
if (led->effect->step_count > 0) {
int32_t next_delay =
led->effect->steps[led->effect_step].substep_time;
k_work_reschedule(&led->work, K_MSEC(next_delay));
} else {
LOG_WRN("LED effect with no effect");
}
}
static void work_handler(struct k_work *work)
{
struct led *led = CONTAINER_OF(work, struct led, work);
const struct led_effect_step *effect_step =
&led->effect->steps[led->effect_step];
__ASSERT_NO_MSG(effect_step->substep_count > 0);
int substeps_left = effect_step->substep_count - led->effect_substep;
for (size_t i = 0; i < ARRAY_SIZE(led->color.c); i++) {
int diff = (effect_step->color.c[i] - led->color.c[i]) /
substeps_left;
led->color.c[i] += diff;
}
set_color(led, &led->color);
led->effect_substep++;
if (led->effect_substep == effect_step->substep_count) {
led->effect_substep = 0;
led->effect_step++;
if (led->effect_step == led->effect->step_count) {
if (led->effect->loop_forever) {
led->effect_step = 0;
} else {
struct led_ready_event *ready_event = new_led_ready_event();
ready_event->led_id = LED_ID(led);
ready_event->led_effect = led->effect;
EVENT_SUBMIT(ready_event);
}
}
}
if (led->effect_step < led->effect->step_count) {
int32_t next_delay =
led->effect->steps[led->effect_step].substep_time;
k_work_reschedule(&led->work, K_MSEC(next_delay));
}
}