From d19f5ce8b56e1199eb9e20ba83b38f8e3e915437 Mon Sep 17 00:00:00 2001 From: Louis Burda Date: Sun, 5 Feb 2023 17:10:07 +0100 Subject: Make led blip asynchronous and add sync mechanism to split comms --- src/led.c | 61 +++++++++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 49 insertions(+), 12 deletions(-) (limited to 'src/led.c') diff --git a/src/led.c b/src/led.c index c8dbc4b..0216640 100644 --- a/src/led.c +++ b/src/led.c @@ -4,7 +4,6 @@ #include "bsp/board.h" -#define BLINK_DELAY 500 #define ONBOARD_LED_PIN 25 static struct ws2812 onboard_led; @@ -14,12 +13,19 @@ bool led_reset; uint32_t led_blink_ms; uint32_t led_rgb; +bool led_blip_reset; +bool led_blip; +uint32_t led_blip_ms; +uint32_t led_blip_rgb; + void led_init(void) { led_reset = true; led_mode = LED_ON; led_rgb = SOFT_WHITE; + led_blip = false; + led_blip_rgb = HARD_WHITE; ws2812_init(&onboard_led, pio0, ONBOARD_LED_PIN); } @@ -29,18 +35,44 @@ led_task(void) static uint32_t start_ms = 0; static bool state = false; + if (led_blip_reset) { + start_ms = board_millis(); + led_blip = true; + ws2812_put(&onboard_led, led_blip_rgb); + state = true; + led_blip_reset = false; + } + + if (led_blip) { + if (state && board_millis() - start_ms > led_blip_ms) { + ws2812_put(&onboard_led, led_rgb); + state = false; + } else if (board_millis() - start_ms > 2 * led_blip_ms) { + led_blip = false; + led_reset = true; + } + } + + if (led_blip) return; + switch (led_mode) { case LED_OFF: - if (led_reset) - ws2812_put(&onboard_led, 0); + if (led_reset) { + led_rgb = 0; + ws2812_put(&onboard_led, led_rgb); + } break; case LED_ON: - if (led_reset) + if (led_reset) { ws2812_put(&onboard_led, led_rgb); + } break; case LED_BLINK: - if (led_reset) + if (led_reset) { start_ms = board_millis(); + state = true; + ws2812_put(&onboard_led, led_rgb); + } if (board_millis() - start_ms < led_blink_ms) return; @@ -55,13 +87,18 @@ led_task(void) } void -led_blip(uint32_t rgb) +led_set_mode(int mode, uint32_t rgb, uint32_t ms) { - uint32_t start; + led_mode = mode; + led_rgb = rgb; + led_blink_ms = ms; +} - ws2812_put(&onboard_led, rgb); - start = board_millis(); - while (board_millis() < start + BLINK_DELAY) - tud_task(); - led_task(); +void +led_start_blip(uint32_t rgb, uint32_t ms) +{ + if (led_blip) return; + led_blip_rgb = rgb; + led_blip_ms = ms; + led_blip_reset = true; } -- cgit v1.2.3-71-gd317