From 51ec86a430465eb671c7ae94e83557d89ddebb32 Mon Sep 17 00:00:00 2001 From: "Jan \"Yenya\" Kasprzak" Date: Wed, 1 May 2013 22:48:32 +0200 Subject: [PATCH] Error reporting via status LED --- projects/step-up/control.c | 46 +++++++++++++++++++++++++++++++++----- projects/step-up/lights.h | 3 +++ projects/step-up/pwmled.c | 2 ++ 3 files changed, 45 insertions(+), 6 deletions(-) diff --git a/projects/step-up/control.c b/projects/step-up/control.c index c877c87..99190cc 100644 --- a/projects/step-up/control.c +++ b/projects/step-up/control.c @@ -24,23 +24,48 @@ static pattern_t slow_pattern[] = { PATTERN_END }; -static unsigned char light_mode, shutdown_in_progress; +static unsigned char light_mode; +static union { + unsigned char errors; + struct { + unsigned char shutdown_in_progress : 1; + unsigned char pwmled_error : 1; + unsigned char battery_low : 1; + }; +} e; + +void set_error(unsigned char err) +{ + switch(err) { + case ERR_BATTERY: + e.battery_low = 1; + pwmled_set_target(0); + pattern_reload(); + break; + case ERR_PWMLED: + e.pwmled_error = 1; + break; + } +} void init_control() { light_mode = 1; - shutdown_in_progress = 0; + e.errors = 0; short_press(); } void long_press_start() { - shutdown_in_progress = 1; + e.shutdown_in_progress = 1; pattern_reload(); } void short_press() { + if (e.battery_low) + return; + if (++light_mode >= 2*N_PWMLED_MODES) light_mode = 0; @@ -52,15 +77,18 @@ void short_press() void long_press() { - shutdown_in_progress = 0; + e.shutdown_in_progress = 0; pattern_reload(); } pattern_t *pwmled_pattern_select() { - if (shutdown_in_progress) + if (e.shutdown_in_progress) return NULL; + if (e.battery_low) + return slow_pattern; + if (light_mode == 0) { return slow_pattern; } else if (light_mode < N_PWMLED_MODES) { @@ -72,9 +100,15 @@ pattern_t *pwmled_pattern_select() pattern_t *status_led_pattern_select() { - if (shutdown_in_progress) + if (e.shutdown_in_progress) return on_pattern; + if (e.pwmled_error) + return number_pattern(3, 1); + + if (e.battery_low) + return number_pattern(1, 1); + return number_pattern(light_mode+1, 0); } diff --git a/projects/step-up/lights.h b/projects/step-up/lights.h index 9cbc0c9..0437378 100644 --- a/projects/step-up/lights.h +++ b/projects/step-up/lights.h @@ -77,6 +77,9 @@ void brake_on(); void brake_off(); pattern_t *pwmled_pattern_select(); pattern_t *status_led_pattern_select(); +#define ERR_BATTERY 1 +#define ERR_PWMLED 2 +void set_error(unsigned char err); /* main.c */ void power_down(); diff --git a/projects/step-up/pwmled.c b/projects/step-up/pwmled.c index 24fbe87..e7b7027 100644 --- a/projects/step-up/pwmled.c +++ b/projects/step-up/pwmled.c @@ -74,6 +74,8 @@ static inline void pwmled_err() log_byte(0xF1); log_flush(); + + set_error(ERR_PWMLED); } -- 2.39.3