Commit 8b54d4bd authored by Jan Kasprzak's avatar Jan Kasprzak
Browse files

Buttons, status LED, control implemented.

parent 655d773a
Loading
Loading
Loading
Loading
+1 −1
Original line number Original line Diff line number Diff line


PROGRAM=lights
PROGRAM=lights
SRC=main.c logging.c pwm.c adc.c pwmled.c pattern.c
SRC=main.c logging.c pwm.c adc.c pwmled.c pattern.c buttons.c control.c
OBJ=$(SRC:.c=.o)
OBJ=$(SRC:.c=.o)




+1 −0
Original line number Original line Diff line number Diff line
@@ -158,6 +158,7 @@ static void inline adc_based_timer()
	if ((jiffies & 0x0007) == 0) {
	if ((jiffies & 0x0007) == 0) {
		patterns_next_tick();
		patterns_next_tick();
	}
	}
	timer_check_buttons();
}
}


ISR(ADC_vect) { // IRQ handler
ISR(ADC_vect) { // IRQ handler
+44 −200
Original line number Original line Diff line number Diff line
@@ -3,252 +3,96 @@


#include "lights.h"
#include "lights.h"


static pattern_t panic_pattern[] = {
static pattern_t on_pattern [] = {
	{ 3, 1 }, // FIXME: will be 4, but let's be safe while testing
	{ 0, 1 },
	{ 3, 1 },
	{ 0, 1 },
	{ 3, 1 },
	{ 0, 1 },
	{ 3, 1 },
	{ 0, 1 },
	{ 3, 1 },
	{ 0, 1 },
	{ 3, 1 },
	{ 0, 1 },
	{ 3, 1 },
	{ 0, 1 },
	{ 3, 1 },
	{ 0, 1 },
	{ 3, 1 },
	{ 0, 1 },
	{ 3, 1 },
	{ 0, 1 },
	{ 3, 1 },
	{ 0, 1 },
	PATTERN_END
};

pattern_t on1_pattern [] = {
	{ 1, 0x10 },
	{ 1, 0x10 },
	PATTERN_END
	PATTERN_END
};
};


static pattern_t on2_pattern [] = {
static pattern_t blink_pattern[] = {
	{ 2, 0x10 },
	PATTERN_END
};

static pattern_t on3_pattern [] = {
	{ 3, 0x10 },
	PATTERN_END
};

static pattern_t brake_pattern [] = {
	{ 4, 0x2 },
	{ 3, 0x8 },
	PATTERN_END
};

static pattern_t normal2_pattern[] = {
	{ 2, 0x1 },
	{ 0, 0x1 },
	{ 2, 0x1 },
	{ 0, 0x8 },
	{ 1, 0x1 },
	{ 1, 0x1 },
	{ 0, 0x1 },
	{ 0, 0x2 },
	{ 1, 0x1 },
	{ 1, 0x1 },
	{ 0, 0x8 },
	{ 0, 0x8 },
	PATTERN_END
};

static pattern_t normal3_pattern[] = {
	{ 3, 0x1 },
	{ 0, 0x1 },
	{ 3, 0x1 },
	{ 0, 0x8 },
	{ 1, 0x1 },
	{ 0, 0x1 },
	{ 1, 0x1 },
	{ 1, 0x1 },
	{ 0, 0x8 },
	{ 0, 0x8 },
	PATTERN_END
	PATTERN_END
};
};


static pattern_t normal4_pattern[] = {
static pattern_t slow_pattern[] = {
	{ 4, 0x1 },
	{ 0, 0x1 },
	{ 4, 0x1 },
	{ 0, 0x8 },
	{ 1, 0x1 },
	{ 0, 0x1 },
	{ 1, 0x1 },
	{ 1, 0x1 },
	{ 0, 0x8 },
	{ 0, 0x1F },
	PATTERN_END
};

static pattern_t slow1_pattern[] = {
	{ 1, 0x01 },
	{ 0, 0x10 },
	PATTERN_END
};

static pattern_t slow2_pattern[] = {
	{ 2, 0x01 },
	{ 0, 0x10 },
	PATTERN_END
};

static pattern_t slow3_pattern[] = {
	{ 3, 0x01 },
	{ 0, 0x10 },
	PATTERN_END
	PATTERN_END
};
};


static unsigned char dim_mode, towbar_mode, braking;
static unsigned char light_mode, shutdown_in_progress;


void init_control()
void init_control()
{
{
	dim_mode = 0;
	light_mode = 1;
	towbar_mode = 0;
	shutdown_in_progress = 0;
	braking = 0;
	short_press();
}

void brake_on()
{
	braking = 1;
	gpio_set(0, 1);
	led_set_pattern(N_PWMLEDS, status_led_pattern_select());
	led_set_pattern(0, pwmled0_pattern_select());
}

void brake_off()
{
	braking = 0;
	gpio_set(0, 0);
	led_set_pattern(N_PWMLEDS, status_led_pattern_select());
	led_set_pattern(0, pwmled0_pattern_select());
}
}


void toggle_dim_mode()
void long_press_start()
{
{
	dim_mode = !dim_mode;
	shutdown_in_progress = 1;
	pattern_reload();
	pattern_reload();
}
}


void set_panic_mode()
void short_press()
{
{
	if (!dim_mode)
	if (++light_mode >= 2*N_PWMLED_MODES)
		led_set_pattern(0, panic_pattern);
		light_mode = 0;


	led_set_pattern(1, panic_pattern);
	pwmled_set_target(light_mode < N_PWMLED_MODES
	led_set_pattern(2, panic_pattern);
		? light_mode
	led_set_pattern(4, panic_pattern);
		: light_mode - N_PWMLED_MODES);
	pattern_reload();
}
}


pattern_t *pwmled0_pattern_select()
void long_press()
{
{
	if (battery_critical)
	shutdown_in_progress = 0;
		return on1_pattern;
	pattern_reload();

	if (towbar_mode)
		return NULL;

	if (braking)
		return brake_pattern;

	switch (ambient_zone) {
	case 0: return dim_mode ? NULL : number_pattern(2, 1);
	case 1: return dim_mode ? slow1_pattern : normal2_pattern;
	case 2: return dim_mode ? slow2_pattern : normal3_pattern;
	case 3:
	default: return dim_mode ? slow3_pattern : normal4_pattern;
	}
}
}


pattern_t *pwmled1_pattern_select()
pattern_t *pwmled_pattern_select()
{
{
#ifndef TESTING_FW
	if (shutdown_in_progress)
		return NULL;
		return NULL;
#else
	if (battery_critical)
		return on1_pattern;
#endif


	if (towbar_mode) {
	if (light_mode == 0) {
		switch (ambient_zone) {
		return slow_pattern;
		case 0:
	} else if (light_mode < N_PWMLED_MODES) {
		case 1:
		return blink_pattern;
			return dim_mode ? on2_pattern : on1_pattern;
		case 2: return dim_mode ? NULL : on2_pattern;
		case 3:
		default: return dim_mode ? NULL : on3_pattern;
		}
	} else {
	} else {
		switch (ambient_zone) {
		return on_pattern;
		case 0: return dim_mode ? slow1_pattern : normal2_pattern;
		case 1: return dim_mode ? slow2_pattern : normal3_pattern;
		case 2: return dim_mode ? NULL : normal4_pattern;
		case 3:
		default: return NULL;
		}
	}
}

pattern_t *pwmled2_pattern_select()
{
#ifndef TESTING_FW
	if (battery_critical)
		return on1_pattern;
#endif

	switch (ambient_zone) {
	case 0: return dim_mode ? on2_pattern : on3_pattern;
	case 1: return dim_mode ? slow1_pattern : normal2_pattern;
	case 2:
	case 3:
	default:
		return dim_mode ? slow2_pattern : normal3_pattern;
	}
	}
}
}


pattern_t *status_led_pattern_select()
pattern_t *status_led_pattern_select()
{
{
	if (braking)
	if (shutdown_in_progress)
		return on1_pattern;
		return on_pattern;


	if (buttons_setup_in_progress())
	return number_pattern(light_mode+1, 0);
		return buttons_setup_status0_pattern_select();

	// FIXME: do something sane
	return number_pattern(battery_gauge(), 0);
}
}


pattern_t *illumination_led_pattern_select()
#if 0
void brake_on()
{
{
	if (battery_critical)
	braking = 1;
		return NULL;
	gpio_set(0, 1);

	led_set_pattern(N_PWMLEDS, status_led_pattern_select());
	switch (ambient_zone) {
	led_set_pattern(0, pwmled0_pattern_select());
	case 0: return dim_mode
		? number_pattern(1, 1)
		: on1_pattern;
	case 1: return dim_mode
		? number_pattern(2, 1)
		: number_pattern(3, 1);
	case 2: return dim_mode
		? number_pattern(1, 0)
		: number_pattern(2, 0);
	case 3:
	default: return dim_mode
		? number_pattern(3, 0)
		: number_pattern(4, 0);
	}
}
}


pattern_t *laser_pattern_select()
void brake_off()
{
{
	if (!dim_mode && ambient_zone <= 1)
	braking = 0;
		return number_pattern(2, 1);
	gpio_set(0, 0);
	else
	led_set_pattern(N_PWMLEDS, status_led_pattern_select());
		return NULL;
	led_set_pattern(0, pwmled0_pattern_select());
}
}

#endif
+5 −26
Original line number Original line Diff line number Diff line
@@ -42,17 +42,6 @@ void pwmled_adc(uint16_t adcval);
void pwmled_set_target(unsigned char mode);
void pwmled_set_target(unsigned char mode);
void pwmled_on_off(unsigned char on);
void pwmled_on_off(unsigned char on);


/* gpio.c */
void init_gpio();
void susp_gpio();
void gpio_set(unsigned char n, unsigned char on);

/* ambient.c */
#define AMBIENT_ADC_SHIFT 0	/* 1 measurement per callback */
void init_ambient();
extern volatile unsigned char ambient_zone;
void ambient_adc(uint16_t adc_val);

/* pattern.c */
/* pattern.c */
typedef struct {
typedef struct {
	unsigned char mode: 3;
	unsigned char mode: 3;
@@ -67,16 +56,11 @@ pattern_t *number_pattern(unsigned char num, unsigned char inv);
void pattern_reload();
void pattern_reload();


/* buttons.c */
/* buttons.c */
#define MAX_USER_PARAMS 3
void init_buttons();
void init_buttons();
void susp_buttons();
void susp_buttons();
void timer_check_buttons();
void timer_check_buttons();
void button_adc(uint16_t adcval);
unsigned char get_user_param(unsigned char param);
unsigned char buttons_wait_for_release();
unsigned char buttons_wait_for_release();
unsigned char buttons_setup_in_progress();
void status_led_on_off(unsigned char on);
pattern_t *buttons_setup_status0_pattern_select();
pattern_t *buttons_setup_status1_pattern_select();


/* battery.c */
/* battery.c */
extern volatile unsigned char battery_critical;
extern volatile unsigned char battery_critical;
@@ -85,19 +69,14 @@ void init_battery();
unsigned char battery_gauge();
unsigned char battery_gauge();


/* control.c */
/* control.c */
extern pattern_t on1_pattern[];

void init_control();
void init_control();
void long_press_start();
void long_press();
void short_press();
void brake_on();
void brake_on();
void brake_off();
void brake_off();
void toggle_dim_mode();
pattern_t *pwmled_pattern_select();
void set_panic_mode();
pattern_t *pwmled0_pattern_select();
pattern_t *pwmled1_pattern_select();
pattern_t *pwmled2_pattern_select();
pattern_t *status_led_pattern_select();
pattern_t *status_led_pattern_select();
pattern_t *illumination_led_pattern_select();
pattern_t *laser_pattern_select();


/* main.c */
/* main.c */
void power_down();
void power_down();
+3 −6
Original line number Original line Diff line number Diff line
@@ -17,14 +17,11 @@ static void hw_setup()
	init_pwm();
	init_pwm();
	init_adc();
	init_adc();


	//init_tmr();
	init_buttons();
	//init_buttons();


	init_pwmled();
	init_pwmled();
	//init_gpio();
	init_pattern();
	//init_ambient();
	init_control();
	//init_pattern();
	//init_control();


	set_sleep_mode(SLEEP_MODE_IDLE);
	set_sleep_mode(SLEEP_MODE_IDLE);
}
}
Loading