split the code out to make multiple robots easier
diff --git a/bbb_cape/src/cape/Makefile b/bbb_cape/src/cape/Makefile
index 35aeb0a..710cfcf 100644
--- a/bbb_cape/src/cape/Makefile
+++ b/bbb_cape/src/cape/Makefile
@@ -29,7 +29,7 @@
 	-nostartfiles -nostdlib \
 	-mthumb \
 
-OBJECTS_main := main \
+OBJECTS_main_common := main \
 	uart_common \
 	uart_dma \
 	uart \
@@ -45,7 +45,10 @@
 	uart_common \
 	uart_byte \
 
-OUTPUTS := main bootloader
+OBJECTS_main_test := $(OBJECTS_main_common) \
+	robot_test \
+
+OUTPUTS := main_test bootloader
 
 # The sort is to remove duplicates because Make warns about those.
 OBJECTS := $(sort $(foreach output,$(OUTPUTS),$(OBJECTS_$(output))))
diff --git a/bbb_cape/src/cape/analog.c b/bbb_cape/src/cape/analog.c
index 2f2602b..0ccd2f0 100644
--- a/bbb_cape/src/cape/analog.c
+++ b/bbb_cape/src/cape/analog.c
@@ -48,6 +48,7 @@
     TIM->CR1 = TIM_CR1_UDIS;
     TIM->CCR1 = 1;
     TIM->EGR = TIM_EGR_UG;
+    TIM->CR1 |= TIM_CR1_CEN;
   }
 }
 
diff --git a/bbb_cape/src/cape/fill_packet.c b/bbb_cape/src/cape/fill_packet.c
index 0f49bd4..b525c2f 100644
--- a/bbb_cape/src/cape/fill_packet.c
+++ b/bbb_cape/src/cape/fill_packet.c
@@ -13,6 +13,7 @@
 #include "cape/gyro.h"
 #include "cape/led.h"
 #include "cape/analog.h"
+#include "cape/robot.h"
 
 #define TIMESTAMP_TIM TIM6
 #define RCC_APB1ENR_TIMESTAMP_TIMEN RCC_APB1ENR_TIM6EN
@@ -40,18 +41,7 @@
   packet->zeroing_gyro = !gyro_output.zeroed;
   packet->bad_gyro = gyro_output.gyro_bad;
 
-  packet->main.encoders[0] = encoder_read(0);
-  packet->main.encoders[1] = encoder_read(1);
-  packet->main.encoders[2] = encoder_read(2);
-  packet->main.encoders[3] = encoder_read(3);
-  packet->main.encoders[4] = encoder_read(4);
-  packet->main.encoders[5] = encoder_read(5);
-  packet->main.encoders[6] = encoder_read(6);
-  packet->main.encoders[7] = encoder_read(7);
-
-  for (int i = 0; i < 8; ++i) {
-    packet->main.analogs[i] = analog_get(i);
-  }
+  robot_fill_packet(packet);
 }
 
 // Fills the new packet with data.
@@ -71,7 +61,7 @@
   memcpy(&p, &packet, sizeof(void *));
   data.checksum = crc_calculate(p, sizeof(*packet) / 4);
 
-  memset(buffer, 0, 4);
+  ((uint32_t *)buffer)[0] = 0;
   cows_stuff(&data, sizeof(data), buffer + 4);
 }
 
diff --git a/bbb_cape/src/cape/gyro.c b/bbb_cape/src/cape/gyro.c
index 55c3e5f..80accb9 100644
--- a/bbb_cape/src/cape/gyro.c
+++ b/bbb_cape/src/cape/gyro.c
@@ -81,6 +81,7 @@
   state = new_state;
   TIM->CCR1 = time;
   TIM->EGR = TIM_EGR_UG;
+  TIM->CR1 |= TIM_CR1_CEN;
 }
 
 static void gyro_setup_failed(void) {
diff --git a/bbb_cape/src/cape/main_test.ld b/bbb_cape/src/cape/main_test.ld
new file mode 120000
index 0000000..af355cc
--- /dev/null
+++ b/bbb_cape/src/cape/main_test.ld
@@ -0,0 +1 @@
+main.ld
\ No newline at end of file
diff --git a/bbb_cape/src/cape/robot.h b/bbb_cape/src/cape/robot.h
new file mode 100644
index 0000000..02da3e2
--- /dev/null
+++ b/bbb_cape/src/cape/robot.h
@@ -0,0 +1,11 @@
+#ifndef CAPE_ROBOT_H_
+#define CAPE_ROBOT_H_
+
+// This header file is for the robot-specific files which should be named
+// robot_name.c. It documents what functions each robot should implement.
+
+#include "cape/fill_packet.h"
+
+void robot_fill_packet(struct DataStruct *packet);
+
+#endif  // CAPE_ROBOT_H_
diff --git a/bbb_cape/src/cape/robot_test.c b/bbb_cape/src/cape/robot_test.c
new file mode 100644
index 0000000..02c1580
--- /dev/null
+++ b/bbb_cape/src/cape/robot_test.c
@@ -0,0 +1,22 @@
+#include "cape/robot.h"
+
+#include "cape/encoder.h"
+#include "cape/analog.h"
+#include "cape/digital.h"
+
+void robot_fill_packet(struct DataStruct *packet) {
+  packet->main.encoders[0] = encoder_read(0);
+  packet->main.encoders[1] = encoder_read(1);
+  packet->main.encoders[2] = encoder_read(2);
+  packet->main.encoders[3] = encoder_read(3);
+  packet->main.encoders[4] = encoder_read(4);
+  packet->main.encoders[5] = encoder_read(5);
+  packet->main.encoders[6] = encoder_read(6);
+  packet->main.encoders[7] = encoder_read(7);
+
+  for (int i = 0; i < 8; ++i) {
+    packet->main.analogs[i] = analog_get(i);
+  }
+
+  // TODO(brians): digitals
+}