From 197e573885ddc7c33e2b9b534a256b29fa7e3e1c Mon Sep 17 00:00:00 2001 From: Simon Wilks Date: Fri, 7 Dec 2012 21:34:41 +0100 Subject: Add an additional safety switch LED blink sequence when FMU and IO are armed If both the FMU and the IO board are armed then the secure switch will blink two times quickly then a pause followed by two quick blinks and so on. --- apps/px4io/safety.c | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) (limited to 'apps/px4io/safety.c') diff --git a/apps/px4io/safety.c b/apps/px4io/safety.c index d5bd103c1..761a1e1e7 100644 --- a/apps/px4io/safety.c +++ b/apps/px4io/safety.c @@ -60,6 +60,11 @@ static struct hrt_call failsafe_call; */ static unsigned counter; +/* + * Used to coordinate a special blink pattern wheb both the FMU and IO are armed. + */ +static unsigned blink_count = 0; + #define ARM_COUNTER_THRESHOLD 10 #define DISARM_COUNTER_THRESHOLD 2 @@ -120,9 +125,25 @@ safety_check_button(void *arg) counter = 0; } - /* when armed, toggle the LED; when safe, leave it on */ + /* + * When the IO is armed, toggle the LED; when IO and FMU armed use aircraft like + * pattern (long pause then 2 fast blinks); when safe, leave it on. + */ if (system_state.armed) { - safety_led_state = !safety_led_state; + if (system_state.arm_ok) { + /* FMU and IO are armed */ + if (blink_count > 9) { + safety_led_state = !safety_led_state; + } else { + safety_led_state = false; + } + if (blink_count++ == 12) { + blink_count = 0; + } + } else { + /* Only the IO is armed so use a constant blink rate */ + safety_led_state = !safety_led_state; + } } else { safety_led_state = true; } -- cgit v1.2.3 From 03b51c69e0b01e451c24e7c1158eca254ec69765 Mon Sep 17 00:00:00 2001 From: Simon Wilks Date: Sat, 8 Dec 2012 13:39:28 +0100 Subject: Added more LED state logic and improve code. The LED will now also indicate when the FMU is ARMED. Switched to using a 16-bit value where each bit indicates what state the LED should be in. --- apps/px4io/safety.c | 42 ++++++++++++++++++++---------------------- 1 file changed, 20 insertions(+), 22 deletions(-) (limited to 'apps/px4io/safety.c') diff --git a/apps/px4io/safety.c b/apps/px4io/safety.c index 761a1e1e7..60d20905a 100644 --- a/apps/px4io/safety.c +++ b/apps/px4io/safety.c @@ -61,14 +61,18 @@ static struct hrt_call failsafe_call; static unsigned counter; /* - * Used to coordinate a special blink pattern wheb both the FMU and IO are armed. + * Define the various LED flash sequences for each system state. */ -static unsigned blink_count = 0; +#define LED_PATTERN_SAFE 0xffff // always on +#define LED_PATTERN_FMU_ARMED 0x4444 // slow blinking +#define LED_PATTERN_IO_ARMED 0x5555 // fast blinking +#define LED_PATTERN_IO_FMU_ARMED 0x5050 // long off then double blink + +static unsigned blink_counter = 0; #define ARM_COUNTER_THRESHOLD 10 #define DISARM_COUNTER_THRESHOLD 2 -static bool safety_led_state; static bool safety_button_pressed; static void safety_check_button(void *arg); @@ -125,31 +129,25 @@ safety_check_button(void *arg) counter = 0; } - /* - * When the IO is armed, toggle the LED; when IO and FMU armed use aircraft like - * pattern (long pause then 2 fast blinks); when safe, leave it on. - */ + /* Select the appropriate LED flash pattern depending on the current IO/FMU arm state */ + uint16_t pattern = LED_PATTERN_SAFE; if (system_state.armed) { if (system_state.arm_ok) { - /* FMU and IO are armed */ - if (blink_count > 9) { - safety_led_state = !safety_led_state; - } else { - safety_led_state = false; - } - if (blink_count++ == 12) { - blink_count = 0; - } + pattern = LED_PATTERN_IO_FMU_ARMED; } else { - /* Only the IO is armed so use a constant blink rate */ - safety_led_state = !safety_led_state; + pattern = LED_PATTERN_IO_ARMED; } - } else { - safety_led_state = true; + } else if (system_state.arm_ok) { + pattern = LED_PATTERN_FMU_ARMED; } - LED_SAFETY(safety_led_state); -} + /* Turn the LED on if we have a 1 at the current bit position */ + LED_SAFETY(pattern & (1 << blink_counter++)); + + if (blink_counter > 15) { + blink_counter = 0; + } +} static void heartbeat_blink(void *arg) -- cgit v1.2.3