diff options
Diffstat (limited to 'src/led.c')
| -rw-r--r-- | src/led.c | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/src/led.c b/src/led.c new file mode 100644 index 0000000..4826088 --- /dev/null +++ b/src/led.c @@ -0,0 +1,55 @@ +#include "led.h" +#include "ws2812.h" +#include "util.h" + +#include "bsp/board.h" + +#define ONBOARD_LED_PIN 25 + +static struct ws2812 onboard_led; + +int led_mode; +bool led_reset; +uint32_t led_blink_ms; +uint32_t led_rgb; + +void +led_init(void) +{ + led_reset = true; + led_mode = LED_ON; + led_rgb = WS2812_U32RGB(100, 100, 100); + ws2812_init(&onboard_led, pio0, ONBOARD_LED_PIN); +} + +void +led_task(void) +{ + static uint32_t start_ms = 0; + static bool state = false; + + switch (led_mode) { + case LED_OFF: + if (led_reset) + ws2812_put(&onboard_led, 0); + break; + case LED_ON: + if (led_reset) + ws2812_put(&onboard_led, led_rgb); + break; + case LED_BLINK: + if (led_reset) + start_ms = board_millis(); + + if (board_millis() - start_ms < led_blink_ms) + return; + start_ms += led_blink_ms; + + state = !state; + ws2812_put(&onboard_led, state ? led_rgb : 0); + break; + } + + led_reset = false; +} + |
