led.c (1763B)
1 #include "led.h" 2 #include "ws2812.h" 3 #include "util.h" 4 5 #include "bsp/board.h" 6 7 #define ONBOARD_LED_PIN 25 8 9 static struct ws2812 onboard_led; 10 11 int led_mode; 12 bool led_reset; 13 uint32_t led_blink_ms; 14 uint32_t led_rgb; 15 16 bool led_blip_reset; 17 bool led_blip; 18 uint32_t led_blip_ms; 19 uint32_t led_blip_rgb; 20 21 void 22 led_init(void) 23 { 24 led_reset = true; 25 led_mode = LED_ON; 26 led_rgb = SOFT_WHITE; 27 led_blip = false; 28 led_blip_rgb = HARD_WHITE; 29 ws2812_init(&onboard_led, pio0, ONBOARD_LED_PIN); 30 } 31 32 void 33 led_task(void) 34 { 35 static uint32_t start_ms = 0; 36 static bool state = false; 37 38 if (led_blip_reset) { 39 start_ms = board_millis(); 40 led_blip = true; 41 ws2812_put(&onboard_led, led_blip_rgb); 42 state = true; 43 led_blip_reset = false; 44 } 45 46 if (led_blip) { 47 if (state && board_millis() - start_ms > led_blip_ms) { 48 ws2812_put(&onboard_led, led_rgb); 49 state = false; 50 } else if (board_millis() - start_ms > 2 * led_blip_ms) { 51 led_blip = false; 52 led_reset = true; 53 } 54 } 55 56 if (led_blip) return; 57 58 switch (led_mode) { 59 case LED_OFF: 60 if (led_reset) { 61 led_rgb = 0; 62 ws2812_put(&onboard_led, led_rgb); 63 } 64 break; 65 case LED_ON: 66 if (led_reset) { 67 ws2812_put(&onboard_led, led_rgb); 68 } 69 break; 70 case LED_BLINK: 71 if (led_reset) { 72 start_ms = board_millis(); 73 state = true; 74 ws2812_put(&onboard_led, led_rgb); 75 } 76 77 if (board_millis() - start_ms < led_blink_ms) 78 return; 79 start_ms += led_blink_ms; 80 81 state = !state; 82 ws2812_put(&onboard_led, state ? led_rgb : 0); 83 break; 84 } 85 86 led_reset = false; 87 } 88 89 void 90 led_set_mode(int mode, uint32_t rgb, uint32_t ms) 91 { 92 led_mode = mode; 93 led_rgb = rgb; 94 led_blink_ms = ms; 95 } 96 97 void 98 led_start_blip(uint32_t rgb, uint32_t ms) 99 { 100 if (led_blip) return; 101 led_blip_rgb = rgb; 102 led_blip_ms = ms; 103 led_blip_reset = true; 104 }