summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicolas Schodet2011-09-26 20:26:43 +0200
committerNicolas Schodet2011-09-26 20:26:43 +0200
commit062258441f674e3c77605a479e35d38646076788 (patch)
treea4ba0f8410beedb1a080b9af26b77b9ee2917d1a
parent83f4265644321022cce13d0e4f5a5f5335a4d7a9 (diff)
src/common: add first animation
-rw-r--r--src/binwatch/binwatch.c1
-rw-r--r--src/common/led.c37
-rw-r--r--src/common/led.h10
3 files changed, 48 insertions, 0 deletions
diff --git a/src/binwatch/binwatch.c b/src/binwatch/binwatch.c
index 99283f3..268a9ee 100644
--- a/src/binwatch/binwatch.c
+++ b/src/binwatch/binwatch.c
@@ -76,6 +76,7 @@ main (void)
{
button_wait ();
time = binwatch_get_time ();
+ led_animate (time, LED_ANIMATION_TRACE_CCW, LED_100MS / 2);
led_display (time, 3 * LED_1S);
}
}
diff --git a/src/common/led.c b/src/common/led.c
index 19ba5a9..bb8acd8 100644
--- a/src/common/led.c
+++ b/src/common/led.c
@@ -56,6 +56,20 @@ struct led_t led_tab[] =
{ 0b101000, 0b100000 }, /* H3 */
};
+uint16_t led_circle[] =
+{
+ 0b0001000000,
+ 0b0010000000,
+ 0b0100000000,
+ 0b1000000000,
+ 0b0000100000,
+ 0b0000010000,
+ 0b0000001000,
+ 0b0000000100,
+ 0b0000000010,
+ 0b0000000001,
+};
+
void
led_init (void)
{
@@ -99,3 +113,26 @@ led_no_pull_up (void)
PORTB = (PORTB & ~LED_MASK) | IO_BV (BUTTON_IO);
}
+static void
+led_animate_trace_ccw (uint16_t leds, uint16_t speed)
+{
+ uint8_t l;
+ uint16_t trace = 0;
+ for (l = 0; l < UTILS_COUNT (led_tab); l++)
+ {
+ led_display (trace | led_circle[l], speed);
+ trace = trace | (leds & led_circle[l]);
+ }
+}
+
+void
+led_animate (uint16_t leds, uint8_t animation, uint16_t speed)
+{
+ switch (animation)
+ {
+ case LED_ANIMATION_TRACE_CCW:
+ led_animate_trace_ccw (leds, speed);
+ break;
+ }
+}
+
diff --git a/src/common/led.h b/src/common/led.h
index 848a53a..5ce0dbf 100644
--- a/src/common/led.h
+++ b/src/common/led.h
@@ -32,6 +32,12 @@ enum
LED_5MS = 1,
};
+enum
+{
+ /* Trace a circle and keep selected led lit. */
+ LED_ANIMATION_TRACE_CCW,
+};
+
/** Initialise leds. */
void
led_init (void);
@@ -44,4 +50,8 @@ led_display (uint16_t leds, uint16_t duration);
void
led_no_pull_up (void);
+/** Make an animation at given speed (duration between updates). */
+void
+led_animate (uint16_t leds, uint8_t animation, uint16_t speed);
+
#endif /* led_h */