|
|
|
/* panic.c */
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Something has gone horribly, horribly wrong.
|
|
|
|
*
|
|
|
|
* If we are in the air, we are going to crash. This could be nasty.
|
|
|
|
* Try to limit the damage by turning off all of the motors.
|
|
|
|
* There's not much else we can do at this point.
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include "panic.h"
|
|
|
|
#include "motor.h"
|
|
|
|
#include "led.h"
|
|
|
|
|
|
|
|
#ifdef PANIC_CHECKPOINT
|
|
|
|
unsigned int checkpoint;
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifdef PANIC_32BIT
|
|
|
|
#define PANIC_BITS 32
|
|
|
|
#else
|
|
|
|
#define PANIC_BITS 16
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifdef PANIC_32BIT
|
|
|
|
led_pattern led_pattern_panic[] = {100, 100, 100, 100, 100, 100, 100, 100,
|
|
|
|
100, 100, 100, 100, 100, 100, 100, 100,
|
|
|
|
100, 100, 100, 100, 100, 100, 100, 100,
|
|
|
|
100, 100, 100, 100, 100, 100, 100, 100,
|
|
|
|
100, 100, 100, 100, 100, 100, 100, 100,
|
|
|
|
100, 100, 100, 100, 100, 100, 100, 100,
|
|
|
|
100, 100, 100, 100, 100, 100, 100, 100,
|
|
|
|
100, 100, 100, 100, 100, 100, 100, 3000, 0};
|
|
|
|
#else
|
|
|
|
led_pattern led_pattern_panic[] = {100, 100, 100, 100, 100, 100, 100, 100,
|
|
|
|
100, 100, 100, 100, 100, 100, 100, 100,
|
|
|
|
100, 100, 100, 100, 100, 100, 100, 100,
|
|
|
|
100, 100, 100, 100, 100, 100, 100, 3000, 0};
|
|
|
|
#endif
|
|
|
|
|
|
|
|
/* Take the lower 16 bits and make a pattern of them, MSB first */
|
|
|
|
static void panic_create_pattern(led_pattern *pattern, unsigned int reason)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
for (i = 0; i < PANIC_BITS; i++) {
|
|
|
|
if (reason & (1<<((PANIC_BITS-1)-i))) {
|
|
|
|
pattern[2*i] = 400;
|
|
|
|
pattern[2*i+1] = 100;
|
|
|
|
} else {
|
|
|
|
pattern[2*i] = 100;
|
|
|
|
pattern[2*i+1] = 400;
|
|
|
|
}
|
|
|
|
if ((i % 4) == 3)
|
|
|
|
pattern[2*i+1] += 500;
|
|
|
|
if (i == (PANIC_BITS-1))
|
|
|
|
pattern[2*i+1] += 2500;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void panic(unsigned int reason)
|
|
|
|
{
|
|
|
|
#if PANIC_CHECKPOINT
|
|
|
|
reason = checkpoint;
|
|
|
|
#endif
|
|
|
|
|
|
|
|
motor_kill();
|
|
|
|
|
|
|
|
panic_create_pattern(led_pattern_panic, reason);
|
|
|
|
|
|
|
|
led_set_pattern(led_pattern_panic);
|
|
|
|
|
|
|
|
/* Wait for the inevitable plunge to the death */
|
|
|
|
for (;;)
|
|
|
|
led_update();
|
|
|
|
}
|