Commit 51ec86a4 authored by Jan Kasprzak's avatar Jan Kasprzak
Browse files

Error reporting via status LED

parent 8b54d4bd
Loading
Loading
Loading
Loading
+40 −6
Original line number Original line Diff line number Diff line
@@ -24,23 +24,48 @@ static pattern_t slow_pattern[] = {
	PATTERN_END
	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()
void init_control()
{
{
	light_mode = 1;
	light_mode = 1;
	shutdown_in_progress = 0;
	e.errors = 0;
	short_press();
	short_press();
}
}


void long_press_start()
void long_press_start()
{
{
	shutdown_in_progress = 1;
	e.shutdown_in_progress = 1;
	pattern_reload();
	pattern_reload();
}
}


void short_press()
void short_press()
{
{
	if (e.battery_low)
		return;

	if (++light_mode >= 2*N_PWMLED_MODES)
	if (++light_mode >= 2*N_PWMLED_MODES)
		light_mode = 0;
		light_mode = 0;


@@ -52,15 +77,18 @@ void short_press()


void long_press()
void long_press()
{
{
	shutdown_in_progress = 0;
	e.shutdown_in_progress = 0;
	pattern_reload();
	pattern_reload();
}
}


pattern_t *pwmled_pattern_select()
pattern_t *pwmled_pattern_select()
{
{
	if (shutdown_in_progress)
	if (e.shutdown_in_progress)
		return NULL;
		return NULL;


	if (e.battery_low)
		return slow_pattern;

	if (light_mode == 0) {
	if (light_mode == 0) {
		return slow_pattern;
		return slow_pattern;
	} else if (light_mode < N_PWMLED_MODES) {
	} else if (light_mode < N_PWMLED_MODES) {
@@ -72,9 +100,15 @@ pattern_t *pwmled_pattern_select()


pattern_t *status_led_pattern_select()
pattern_t *status_led_pattern_select()
{
{
	if (shutdown_in_progress)
	if (e.shutdown_in_progress)
		return on_pattern;
		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);
	return number_pattern(light_mode+1, 0);
}
}


+3 −0
Original line number Original line Diff line number Diff line
@@ -77,6 +77,9 @@ void brake_on();
void brake_off();
void brake_off();
pattern_t *pwmled_pattern_select();
pattern_t *pwmled_pattern_select();
pattern_t *status_led_pattern_select();
pattern_t *status_led_pattern_select();
#define ERR_BATTERY 1
#define ERR_PWMLED  2
void set_error(unsigned char err);


/* main.c */
/* main.c */
void power_down();
void power_down();
+2 −0
Original line number Original line Diff line number Diff line
@@ -74,6 +74,8 @@ static inline void pwmled_err()


	log_byte(0xF1);
	log_byte(0xF1);
	log_flush();
	log_flush();

	set_error(ERR_PWMLED);
}
}