made it actually work on real hardware
diff --git a/aos/linux_code/starter/starter.sh b/aos/linux_code/starter/starter.sh
index 33906c3..62338af 100755
--- a/aos/linux_code/starter/starter.sh
+++ b/aos/linux_code/starter/starter.sh
@@ -17,4 +17,4 @@
 #DUMPCAP_STDOUT_FILE=$(date "/home/driver/tmp/robot_logs/stdout_dumpcap.%F_%H-%M-%S")
 #chrt -o 0 bash -c "dumpcap -i eth0 -w ${DUMPCAP_LOG_FILE} -f 'not port 8080 and not net 10.9.71.13' > ${DUMPCAP_STDOUT_FILE}" &
 
-chrt -o 0 bash -c 'while true; /home/driver/robot_code/bin/netconsole /home/driver/tmp/robot_logs/netconsole-`date +%s`; done' &
+chrt -o 0 bash -c 'while true; do /home/driver/robot_code/bin/netconsole /home/driver/tmp/robot_logs/netconsole-`date +%s`; done' &
diff --git a/bbb_cape/src/bbb/cape_manager.cc b/bbb_cape/src/bbb/cape_manager.cc
index d9b1e28..923021b 100644
--- a/bbb_cape/src/bbb/cape_manager.cc
+++ b/bbb_cape/src/bbb/cape_manager.cc
@@ -22,14 +22,14 @@
 }
 
 void CapeManager::DoReset(bool bootloader) {
-  static constexpr ::aos::time::Time kTimeout =
+  static constexpr ::aos::time::Time kWaitTime =
       ::aos::time::Time::InSeconds(0.1);
   reset_.Set(false);
-  ::aos::time::SleepFor(kTimeout);
-  custom_bootloader_.Set(bootloader);
-  ::aos::time::SleepFor(kTimeout);
+  ::aos::time::SleepFor(kWaitTime);
+  custom_bootloader_.Set(!bootloader);
+  ::aos::time::SleepFor(kWaitTime);
   reset_.Set(true);
-  ::aos::time::SleepFor(kTimeout);
+  ::aos::time::SleepFor(kWaitTime);
 }
 
 }  // namespace bbb
diff --git a/bbb_cape/src/bbb/gpios.cc b/bbb_cape/src/bbb/gpios.cc
index 0aca731..3584d06 100644
--- a/bbb_cape/src/bbb/gpios.cc
+++ b/bbb_cape/src/bbb/gpios.cc
@@ -48,6 +48,15 @@
     LOG(WARNING, "fclose(%p) failed with %d: %s\n", direction_handle, errno,
         strerror(errno));
   }
+
+  char value_path[64];
+  snprintf(value_path, sizeof(value_path),
+           "/sys/class/gpio/gpio%d/value", kernel_pin_);
+  value_handle_ = fopen(value_path, "w+");
+  if (value_handle_ == NULL) {
+    LOG(FATAL, "fopen(%s, \"rw\") failed with %d: %s\n",
+        value_path, errno, strerror(errno));
+  }
 }
 
 GpioPin::~GpioPin() {
diff --git a/bbb_cape/src/bbb/gpo.cc b/bbb_cape/src/bbb/gpo.cc
index f02ded3..d17abe7 100644
--- a/bbb_cape/src/bbb/gpo.cc
+++ b/bbb_cape/src/bbb/gpo.cc
@@ -3,6 +3,7 @@
 #include <stdio.h>
 #include <errno.h>
 #include <string.h>
+#include <unistd.h>
 
 #include "aos/common/logging/logging.h"
 
@@ -12,11 +13,13 @@
     : GpioPin(bank, pin, false, initial_value) {}
 
 void Gpo::Set(bool high) {
-  rewind(value_handle_);
-  if (fputc(high ? '1' : '0', value_handle_) < 0) {
+  // TODO(brians): Figure out why this breaks it.
+  //rewind(value_handle_);
+  if (fputc(high ? '1' : '0', value_handle_) == EOF) {
     LOG(FATAL, "fputc(%c, %p) for pin (%d,%d) failed with %d: %s\n",
         high ? '1': '0', value_handle_, bank_, pin_, errno, strerror(errno));
   }
+  sync();
 }
 
 }  // namespace bbb
diff --git a/bbb_cape/src/bbb/hex_byte_reader.cc b/bbb_cape/src/bbb/hex_byte_reader.cc
index 968e771..7c6a28f 100644
--- a/bbb_cape/src/bbb/hex_byte_reader.cc
+++ b/bbb_cape/src/bbb/hex_byte_reader.cc
@@ -24,6 +24,7 @@
 
 HexByteReader::HexByteReader(const ::std::string &filename)
     : parser_status_(kParser.init()) {
+  LOG(DEBUG, "reading hex file %s\n", filename.c_str());
   if (parser_status_ == NULL) {
     LOG(FATAL, "%s parser failed to initialize.\n", kParser.name);
   }
diff --git a/bbb_cape/src/bbb/sensor_reader.cc b/bbb_cape/src/bbb/sensor_reader.cc
index 13d6add..2e40903 100644
--- a/bbb_cape/src/bbb/sensor_reader.cc
+++ b/bbb_cape/src/bbb/sensor_reader.cc
@@ -33,13 +33,13 @@
 }
 
 const DataStruct *SensorReader::ReadPacket() {
-  static constexpr ::aos::time::Time kTimeout =
-      ::aos::time::Time::InSeconds(0.5);
+  static constexpr ::aos::time::Time kResetTimeout =
+      ::aos::time::Time::InSeconds(2.5);
 
   while (true) {
-    ::aos::time::Time next_timeout = last_received_time_ + kTimeout;
+    ::aos::time::Time next_timeout = last_received_time_ + kResetTimeout;
     if (next_timeout <= ::aos::time::Time::Now()) {
-      LOG(WARNING, "too long since good packet received\n");
+      LOG(WARNING, "Too long since good packet received. Resetting.\n");
       manager_.Reset();
       ResetHappened();
     }
diff --git a/bbb_cape/src/flasher/flasher.gyp b/bbb_cape/src/flasher/flasher.gyp
index dea4e5c..2d506b8 100644
--- a/bbb_cape/src/flasher/flasher.gyp
+++ b/bbb_cape/src/flasher/flasher.gyp
@@ -16,6 +16,8 @@
       'dependencies': [
         '<(EXTERNALS):stm32flash',
         '<(AOS)/build/aos.gyp:logging',
+        '<(DEPTH)/bbb_cape/src/bbb/bbb.gyp:gpios',
+        '<(AOS)/common/common.gyp:time',
       ],
     },
   ],
diff --git a/bbb_cape/src/flasher/stm32_flasher.cc b/bbb_cape/src/flasher/stm32_flasher.cc
index ddddb1b..0f081f5 100644
--- a/bbb_cape/src/flasher/stm32_flasher.cc
+++ b/bbb_cape/src/flasher/stm32_flasher.cc
@@ -8,6 +8,7 @@
 
 #include "aos/common/logging/logging.h"
 #include "aos/common/logging/logging_impl.h"
+#include "aos/common/time.h"
 
 extern "C" {
 #include "stm32flash/parsers/parser.h"
@@ -17,11 +18,26 @@
 #include "stm32flash/init.h"
 }
 
+#include "bbb/gpo.h"
+
 int main(int argc, char **argv) {
   ::aos::logging::Init();
   ::aos::logging::AddImplementation(
       new ::aos::logging::StreamLogImplementation(stdout));
 
+  {
+    ::bbb::Gpo reset(2, 5, true);
+    ::bbb::Gpo bootloader(2, 2, false);
+    static constexpr ::aos::time::Time kWaitTime =
+        ::aos::time::Time::InSeconds(0.1);
+    reset.Set(false);
+    ::aos::time::SleepFor(kWaitTime);
+    bootloader.Set(false);
+    ::aos::time::SleepFor(kWaitTime);
+    reset.Set(true);
+    ::aos::time::SleepFor(kWaitTime);
+  }
+
   if (argc < 2) {
     fputs("Need an argument saying which target to download.\n", stderr);
     return 1;
diff --git a/frc971/input/sensor_receiver.cc b/frc971/input/sensor_receiver.cc
index eb2bb9a..80c1c9f 100644
--- a/frc971/input/sensor_receiver.cc
+++ b/frc971/input/sensor_receiver.cc
@@ -97,7 +97,7 @@
 
 int main() {
   ::aos::Init(::bbb::SensorReader::kRelativePriority);
-  ::bbb::SensorReader reader("main");
+  ::bbb::SensorReader reader("comp");
   while (true) {
     ::frc971::PacketReceived(reader.ReadPacket(), reader.GetCapeTimestamp());
   }