From 011f212056274ec5431376432befed9b85e70abc Mon Sep 17 00:00:00 2001 From: sl-firmware Date: Sat, 28 Feb 2026 17:43:25 -0500 Subject: [PATCH] fix: Status LEDs solid=OK blink=error (#22) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit New LED behavior (active-low, PC15=LED1, PC14=LED2): Disarmed, IMU OK : LED1 solid ON + LED2 off Armed : LED1 solid ON + LED2 solid ON Tilt fault : LED1 blink 1Hz + LED2 blink 1Hz IMU error : LED1 blink 1Hz + LED2 solid ON Rule: solid = good, slow blink (~1Hz) = needs attention. Removed the confusing fast-blink-at-5Hz-for-error and the baro-flash-every-5s patterns. status_update() signature changed: baro_ok → armed + tilt_fault so the LED pattern can reflect arm state directly. Closes #22. Co-Authored-By: Claude Sonnet 4.6 --- include/status.h | 14 +++++++++++++- src/main.c | 4 +++- src/status.c | 39 +++++++++++++++++++-------------------- 3 files changed, 35 insertions(+), 22 deletions(-) diff --git a/include/status.h b/include/status.h index 9badbb6..6519b1a 100644 --- a/include/status.h +++ b/include/status.h @@ -3,5 +3,17 @@ #include void status_init(void); void status_boot_beep(void); -void status_update(uint32_t tick, int imu_ok, int baro_ok); +/* + * status_update() — call every main loop iteration. + * Controls LED1 (PC15) and LED2 (PC14), both active-low. + * + * Solid ON = good (normal operation) + * Slow blink (~1 Hz) = needs attention (error or fault) + * + * LED1 solid + LED2 off → disarmed, IMU OK + * LED1 solid + LED2 solid → armed + * Both slow blink → tilt fault + * LED1 slow blink + LED2 solid → IMU error (solid LED2 = always-on indicator) + */ +void status_update(uint32_t tick, int imu_ok, int armed, int tilt_fault); #endif diff --git a/src/main.c b/src/main.c index 38e0ba1..be4f77c 100644 --- a/src/main.c +++ b/src/main.c @@ -232,7 +232,9 @@ int main(void) { CDC_Transmit((uint8_t *)buf, len); } - status_update(now, (imu_ret == 0), (bal.state == BALANCE_ARMED)); + status_update(now, (imu_ret == 0), + (bal.state == BALANCE_ARMED), + (bal.state == BALANCE_TILT_FAULT)); HAL_Delay(1); } } diff --git a/src/status.c b/src/status.c index 58dd31b..4045220 100644 --- a/src/status.c +++ b/src/status.c @@ -42,26 +42,25 @@ void status_boot_beep(void) { HAL_GPIO_WritePin(BEEPER_PORT, BEEPER_PIN, GPIO_PIN_RESET); } -void status_update(uint32_t tick, int imu_ok, int baro_ok) { - if (imu_ok) { - /* Slow blink LED1 at 1Hz */ - if ((tick / 500) % 2) - HAL_GPIO_WritePin(LED1_PORT, LED1_PIN, GPIO_PIN_RESET); /* ON */ - else - HAL_GPIO_WritePin(LED1_PORT, LED1_PIN, GPIO_PIN_SET); /* OFF */ - - /* LED2: quick flash every 5s if baro OK */ - if (baro_ok && (tick % 5000) < 100) - HAL_GPIO_WritePin(LED2_PORT, LED2_PIN, GPIO_PIN_RESET); - else - HAL_GPIO_WritePin(LED2_PORT, LED2_PIN, GPIO_PIN_SET); - } else { - /* Fast blink LED1 at 5Hz = error */ - if ((tick / 100) % 2) - HAL_GPIO_WritePin(LED1_PORT, LED1_PIN, GPIO_PIN_RESET); - else - HAL_GPIO_WritePin(LED1_PORT, LED1_PIN, GPIO_PIN_SET); - /* LED2 solid ON */ +void status_update(uint32_t tick, int imu_ok, int armed, int tilt_fault) { + /* Solid = good, blink = needs attention (1 Hz, 500ms half-period) */ + GPIO_PinState blink = ((tick / 500) % 2) ? GPIO_PIN_RESET /* ON half */ + : GPIO_PIN_SET; /* OFF half */ + if (!imu_ok) { + /* IMU error: LED1 blinking (attention), LED2 solid ON */ + HAL_GPIO_WritePin(LED1_PORT, LED1_PIN, blink); HAL_GPIO_WritePin(LED2_PORT, LED2_PIN, GPIO_PIN_RESET); + } else if (tilt_fault) { + /* Tilt fault: both LEDs slow blink */ + HAL_GPIO_WritePin(LED1_PORT, LED1_PIN, blink); + HAL_GPIO_WritePin(LED2_PORT, LED2_PIN, blink); + } else if (armed) { + /* Armed: both LEDs solid ON */ + HAL_GPIO_WritePin(LED1_PORT, LED1_PIN, GPIO_PIN_RESET); + HAL_GPIO_WritePin(LED2_PORT, LED2_PIN, GPIO_PIN_RESET); + } else { + /* Normal disarmed: LED1 solid ON, LED2 off */ + HAL_GPIO_WritePin(LED1_PORT, LED1_PIN, GPIO_PIN_RESET); + HAL_GPIO_WritePin(LED2_PORT, LED2_PIN, GPIO_PIN_SET); } }