summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/binwatch/binwatch.c76
1 files 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 ();
+ }
}
}
}