From bcdd45f8aafebb82aced4821aa942ca9590dc033 Mon Sep 17 00:00:00 2001 From: Nicolas Schodet Date: Thu, 29 Sep 2011 00:39:22 +0200 Subject: src/binwatch: add ui to set time --- src/binwatch/binwatch.c | 76 +++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 67 insertions(+), 9 deletions(-) diff --git a/src/binwatch/binwatch.c b/src/binwatch/binwatch.c index d3e9bfb..049c8b3 100644 --- a/src/binwatch/binwatch.c +++ b/src/binwatch/binwatch.c @@ -29,19 +29,70 @@ #define BINWATCH_TIME_DISPLAY_DUR (3 * LED_1S) #define BINWATCH_ANIM_SPEED (LED_100MS / 2) +#define BINWATCH_UI_SPEED (LED_1S / 2) -/** Get time in leds format. */ +/** Format time in leds format. */ static uint16_t -binwatch_get_time (void) +binwatch_format_time (uint8_t hour, uint8_t minute) { - uint8_t hour, minute, second; - rtc_get_time (&hour, &minute, &second); hour = hour % 12; if (hour == 0) hour = 12; return hour << 6 | minute; } +/** Get time in leds format. */ +static uint16_t +binwatch_get_time (void) +{ + uint8_t hour, minute, second; + rtc_get_time (&hour, &minute, &second); + return binwatch_format_time (hour, minute); +} + +/** User interface to get an integer between a and b (included). */ +static uint16_t +binwatch_get_int_ui (uint16_t a, uint16_t b, uint16_t step, uint16_t always_on) +{ + uint16_t input = a; + while (1) + { + led_display (input | always_on, BINWATCH_UI_SPEED); + if (button_pressed ()) + { + /* If button is pressed, user selected this integer. */ + button_wait (); + return input; + } + else + { + /* Else, propose the next integer. */ + input += step; + if (input > b) + input = a; + } + } +} + +/** User interface to set current time. */ +static void +binwatch_set_time_ui (void) +{ + /* Input hour and minutes. */ + uint8_t hour = binwatch_get_int_ui (0, 23, 1, 0x200); + uint8_t minute = binwatch_get_int_ui (0, 59, 1, 0x100); + /* Display entered time and wait button press. */ + uint16_t time = binwatch_format_time (hour, minute); + led_display (time, BINWATCH_TIME_DISPLAY_DUR); + button_wait (); + /* Now change time in RTC. */ + rtc_stop (); + rtc_set_time (hour, minute, 0); + rtc_go (); + /* Display time to acknowledge. */ + led_display (time, BINWATCH_TIME_DISPLAY_DUR); +} + int main (void) { @@ -79,11 +130,18 @@ main (void) /* Wait user press to display time. */ while (1) { - button_wait (); - time = binwatch_get_time (); - led_animate (time, LED_ANIMATION_TRACE_CCW, - BINWATCH_ANIM_SPEED); - led_display (time, BINWATCH_TIME_DISPLAY_DUR); + uint16_t press_ms = button_wait (); + if (press_ms < 5000) + { + time = binwatch_get_time (); + led_animate (time, LED_ANIMATION_TRACE_CCW, + BINWATCH_ANIM_SPEED); + led_display (time, BINWATCH_TIME_DISPLAY_DUR); + } + else + { + binwatch_set_time_ui (); + } } } } -- cgit v1.2.3