Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Added more LED state logic and improve code. #98

Merged
merged 1 commit into from
Dec 8, 2012
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 20 additions & 22 deletions apps/px4io/safety.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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)
Expand Down