New implementation of backlight based on persistent keepalive timer, rather than oneshot timer

This commit is contained in:
Pim van Pelt
2017-11-28 15:32:27 +01:00
parent c35d959c1a
commit 9fc40fd800
2 changed files with 19 additions and 11 deletions

View File

@ -7,10 +7,9 @@
#include "mgos_timers.h" #include "mgos_timers.h"
#define BACKLIGHT_PWM_HZ 10000 #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_init(void);
void backlight_set(float new_duty, int fader_msec);
void backlight_keepalive(); void backlight_keepalive();
bool backlight_active(); bool backlight_active();

View File

@ -4,8 +4,10 @@ static float backlight_duty;
static float backlight_target_duty; static float backlight_target_duty;
static float backlight_step; static float backlight_step;
static mgos_timer_id backlight_fader_timer_id = 0; static mgos_timer_id backlight_fader_timer_id = 0;
static mgos_timer_id backlight_keepalive_timer_id = 0; static mgos_timer_id backlight_keepalive_timer_id = 0;
static double backlight_last_keepalive;
static void backlight_fader_cb(void *arg) { static void backlight_fader_cb(void *arg) {
float new_duty = backlight_duty+backlight_step; 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; if (new_duty<0.0) backlight_target_duty=0.0;
else if (new_duty>1.0) backlight_target_duty=1.0; else if (new_duty>1.0) backlight_target_duty=1.0;
else backlight_target_duty=new_duty; 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) if (backlight_target_duty == backlight_duty)
return; 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) { if (fader_msec == 0) {
backlight_duty=backlight_target_duty; backlight_duty=backlight_target_duty;
backlight_step=0.0; 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); mgos_pwm_set(mgos_sys_config_get_app_backlight_pin(), BACKLIGHT_PWM_HZ, backlight_duty);
return; return;
} }
backlight_step = (backlight_target_duty - backlight_duty) / ((1000.0*fader_msec)/BACKLIGHT_STEP_USEC); 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)); 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); backlight_fader_timer_id = mgos_set_timer(BACKLIGHT_STEP_USEC/1000, true, backlight_fader_cb, NULL);
} }
static void backlight_keepalive_cb(void *arg) { 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())); // We trigger a fade if:
backlight_set(0.0, 1000); // - 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) arg;
} }
void backlight_keepalive() { void backlight_keepalive() {
if (backlight_keepalive_timer_id) backlight_last_keepalive=mg_time();
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_set(1.0, 0); backlight_set(1.0, 0);
} }
@ -72,5 +80,6 @@ bool backlight_active() {
void backlight_init(void) { void backlight_init(void) {
backlight_keepalive(); backlight_keepalive();
backlight_keepalive_timer_id = mgos_set_timer(1000, true, backlight_keepalive_cb, NULL);
return; return;
} }