From: Jan "Yenya" Kasprzak Date: Wed, 21 Nov 2012 14:32:21 +0000 (+0100) Subject: firmware/buttons.c: preliminary user params setup X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=commitdiff_plain;h=ed608010c0a708b9be0d3577d7f4d3313eb2e851;p=bike-lights.git firmware/buttons.c: preliminary user params setup --- diff --git a/firmware/buttons.c b/firmware/buttons.c index d0cbd51..17f4bff 100644 --- a/firmware/buttons.c +++ b/firmware/buttons.c @@ -9,6 +9,86 @@ static uint16_t button_start[N_BUTTONS]; static unsigned char button_pressed[N_BUTTONS]; static unsigned char just_waked_up; +static unsigned char user_params[MAX_USER_PARAMS] = { 0, 0, 0 }; +static unsigned char user_params_max[MAX_USER_PARAMS] = { 3, 2, 2 }; + +static unsigned char user_params_state = 0; + /* + * Here 0 means "no setup currently in progress", + * 1 .. MAX_USER_PARAMS means "now short presses increase or decrease + * the value of user_params[user_params_state-1]" + */ + +static uint16_t user_params_starttime; + +static void do_sleep(); + +static void toggle_bright_mode() +{ + // TODO +} + +static void set_panic_mode() +{ + // TODO +} + +unsigned char get_user_param(unsigned char param) +{ + if (param < MAX_USER_PARAMS) + return user_params[param]; + return 0; // FIXME: internal error? +} + +static inline void short_press(unsigned char button) +{ + unsigned char param; + + if (user_params_state == 0) { + if (button == 0) + toggle_bright_mode(); + else + set_panic_mode(); + return; + } + + param = user_params_state-1; + + if (button == 0) { + if (user_params[param]) + user_params[param]--; + else + user_params[param] = user_params_max[param]; + } else { + user_params[param]++; + + if (user_params[param] >= user_params_max[param]) + user_params[param] = 0; + } + // FIXME: notify somebody about user_params change? + + // set_status_led(2, user_params[param]); + + user_params_starttime = jiffies; +} + +static inline void long_press(unsigned char button) +{ + if (button == 0) { + do_sleep(); + return; + } + + // button 1 - cycle through states + user_params_state++; + + if (user_params_state >= MAX_USER_PARAMS) + user_params_state = 1; + + // set_status_led(1, state); + user_params_starttime = jiffies; +} + void init_buttons() { unsigned char i; @@ -22,8 +102,6 @@ void init_buttons() } just_waked_up = 1; - - // log_byte(PORTA); } static void do_sleep() @@ -44,18 +122,6 @@ static void do_sleep() power_down(); } -static void inline long_press(unsigned char n) -{ - if (n == 0) - do_sleep(); -} - -static void inline short_press(unsigned char n) -{ - if (n == 0) - gpio_set(2,1); -} - void timer_check_buttons() { unsigned char pin = PINA; diff --git a/firmware/lights.h b/firmware/lights.h index 43915bd..bb4bca7 100644 --- a/firmware/lights.h +++ b/firmware/lights.h @@ -74,8 +74,10 @@ void led_set_status(unsigned char status); void led_set_pattern(unsigned char led, pattern_t *pattern); /* buttons.c */ +#define MAX_USER_PARAMS 3 void init_buttons(); void timer_check_buttons(); +unsigned char get_user_param(unsigned char param); /* battery.c */ extern volatile unsigned char battery_100mv;