diff --git a/sw/controller/src/led.c b/sw/controller/src/led.c index 7da761e..a93b3f9 100644 --- a/sw/controller/src/led.c +++ b/sw/controller/src/led.c @@ -9,11 +9,27 @@ #define LED_CYCLE_TICKS_ON (3) +typedef enum { + ON, + OFF +} led_state_e; + +typedef struct { + uint32_t timer; + led_state_e state; +} error_cycle_t; + + static uint32_t timer = 0; +static uint8_t error_cycle = 0; static uint32_t current_act_counter = 0; static volatile uint32_t next_act_counter = 0; static volatile bool cic_error = false; static volatile bool rtc_error = false; +static const error_cycle_t error_codes[2][8] = { + { { 50, ON }, { 50, OFF }, { 5, ON }, { 0, OFF }, { 0, OFF }, { 0, OFF }, { 0, OFF }, { 100, OFF } }, + { { 50, ON }, { 50, OFF }, { 5, ON }, { 20, OFF }, { 5, ON }, { 0, OFF }, { 0, OFF }, { 100, OFF } }, +}; static void led_task_resume (void) { @@ -44,7 +60,27 @@ static void led_process_act (void) { } static void led_process_errors (void) { - // TODO: implement error blink codes + if (timer > 0) { + timer -= 1; + } else { + uint8_t error_code = 0; + if (cic_error) { + error_code = 0; + } else if (rtc_error) { + error_code = 1; + } + error_cycle_t error = error_codes[error_code][error_cycle]; + timer = error.timer; + if (error.state == ON) { + hw_gpio_set(GPIO_ID_LED); + } else { + hw_gpio_reset(GPIO_ID_LED); + } + error_cycle += 1; + if (error_cycle >= 8) { + error_cycle = 0; + } + } } @@ -81,6 +117,7 @@ void led_task (void) { if (led_has_errors()) { led_process_errors(); } else { + error_cycle = 0; led_process_act(); }