From 9fc40fd8000fa48977d7b01d538d94456d6939e5 Mon Sep 17 00:00:00 2001 From: Pim van Pelt Date: Tue, 28 Nov 2017 15:32:27 +0100 Subject: [PATCH] New implementation of backlight based on persistent keepalive timer, rather than oneshot timer --- include/backlight.h | 3 +-- src/backlight.c | 27 ++++++++++++++++++--------- 2 files changed, 19 insertions(+), 11 deletions(-) diff --git a/include/backlight.h b/include/backlight.h index a3d616d..8a7ceb8 100644 --- a/include/backlight.h +++ b/include/backlight.h @@ -7,10 +7,9 @@ #include "mgos_timers.h" #define BACKLIGHT_PWM_HZ 10000 -#define BACKLIGHT_STEP_USEC 10000 // 10ms per step. +#define BACKLIGHT_STEP_USEC 20000 // 20ms per step. void backlight_init(void); -void backlight_set(float new_duty, int fader_msec); void backlight_keepalive(); bool backlight_active(); diff --git a/src/backlight.c b/src/backlight.c index 1604929..0707558 100644 --- a/src/backlight.c +++ b/src/backlight.c @@ -4,8 +4,10 @@ static float backlight_duty; static float backlight_target_duty; static float backlight_step; + static mgos_timer_id backlight_fader_timer_id = 0; static mgos_timer_id backlight_keepalive_timer_id = 0; +static double backlight_last_keepalive; static void backlight_fader_cb(void *arg) { float new_duty = backlight_duty+backlight_step; @@ -29,7 +31,7 @@ static void backlight_fader_cb(void *arg) { } -void backlight_set(float new_duty, int fader_msec) { +static void backlight_set(float new_duty, int fader_msec) { if (new_duty<0.0) backlight_target_duty=0.0; else if (new_duty>1.0) backlight_target_duty=1.0; else backlight_target_duty=new_duty; @@ -37,6 +39,11 @@ void backlight_set(float new_duty, int fader_msec) { if (backlight_target_duty == backlight_duty) return; + if (backlight_fader_timer_id) { + LOG(LL_INFO, ("Cancelling current backlight_fader_timer due to new settings")); + mgos_clear_timer(backlight_fader_timer_id); + backlight_fader_timer_id=0; + } if (fader_msec == 0) { backlight_duty=backlight_target_duty; backlight_step=0.0; @@ -44,24 +51,25 @@ void backlight_set(float new_duty, int fader_msec) { mgos_pwm_set(mgos_sys_config_get_app_backlight_pin(), BACKLIGHT_PWM_HZ, backlight_duty); return; } - backlight_step = (backlight_target_duty - backlight_duty) / ((1000.0*fader_msec)/BACKLIGHT_STEP_USEC); LOG(LL_INFO, ("Changing backlight from %.2f to %.2f in %d msecs, steps of %.4f", backlight_duty, backlight_target_duty, fader_msec, backlight_step)); - if (backlight_fader_timer_id) - mgos_clear_timer(backlight_fader_timer_id); backlight_fader_timer_id = mgos_set_timer(BACKLIGHT_STEP_USEC/1000, true, backlight_fader_cb, NULL); } static void backlight_keepalive_cb(void *arg) { - LOG(LL_INFO, ("Inactivity timeout of %d seconds reached, setting backlight off", mgos_sys_config_get_app_inactivity_timeout())); - backlight_set(0.0, 1000); + // We trigger a fade if: + // - current time is more than 3sec since our last keepalive + // - backlight_duty>0: the screen is on + // - backlight_fader_timer_id==0: we are not currenty fading + if ((mg_time() > backlight_last_keepalive + mgos_sys_config_get_app_inactivity_timeout()) && backlight_duty>0 && backlight_fader_timer_id==0) { + LOG(LL_INFO, ("Inactivity timeout of %d seconds reached, setting backlight off", mgos_sys_config_get_app_inactivity_timeout())); + backlight_set(0.0, 1500); + } (void) arg; } void backlight_keepalive() { - if (backlight_keepalive_timer_id) - mgos_clear_timer(backlight_keepalive_timer_id); - backlight_keepalive_timer_id = mgos_set_timer(mgos_sys_config_get_app_inactivity_timeout()*1000, false, backlight_keepalive_cb, NULL); + backlight_last_keepalive=mg_time(); backlight_set(1.0, 0); } @@ -72,5 +80,6 @@ bool backlight_active() { void backlight_init(void) { backlight_keepalive(); + backlight_keepalive_timer_id = mgos_set_timer(1000, true, backlight_keepalive_cb, NULL); return; }