The unified diff between revisions [d0420ebd..] and [24d5b9f4..] 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 [24d5b9f4dff9135787b198fe1127d9c1e3326b9c]
#
# 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();
+}