The unified diff between revisions [d0420ebd..] and [5a7404c7..] is displayed below. It can also be downloaded as a raw diff.
This diff has been restricted to the following files: 'panic.c'
# # old_revision [d0420ebd87c820e33a32b29727989516e15980a8] # new_revision [5a7404c7ee458d3eab4b0548e4bc6b6a8b26135f] # # add_file "panic.c" # content [d33cc5af7411880a40d87b7d56a9086705b49112] # ============================================================ --- /dev/null +++ panic.c d33cc5af7411880a40d87b7d56a9086705b49112 @@ -0,0 +1,58 @@ +/* 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" + +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}; + +/* 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 < 16; i++) { + if (reason & (1<<(15-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 == 15) + pattern[2*i+1] += 2500; + } +} + +void panic(unsigned int reason) +{ + /* + * We may one day be able to do something with the reason, like emit + * a final deathbed confession. So we'll provide the reasons in the + * caller and just ignore them for now. + */ + (void)reason; + + 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(); +}