fixes to make the new sensor stuff work
diff --git a/aos/common/sensors/sensor_receiver-tmpl.h b/aos/common/sensors/sensor_receiver-tmpl.h
index 9d37b8c..9cd0b3b 100644
--- a/aos/common/sensors/sensor_receiver-tmpl.h
+++ b/aos/common/sensors/sensor_receiver-tmpl.h
@@ -108,6 +108,7 @@
 bool SensorReceiver<Values>::ReceiveData() {
   int old_count = data_.count;
   DoReceiveData();
+  data_.NetworkToHost();
   if (data_.count < 0) {
     LOG(FATAL, "data count overflowed. currently %"PRId32"\n", data_.count);
   }
diff --git a/aos/common/sensors/sensor_sink.h b/aos/common/sensors/sensor_sink.h
index 81bc491..760f90e 100644
--- a/aos/common/sensors/sensor_sink.h
+++ b/aos/common/sensors/sensor_sink.h
@@ -12,7 +12,7 @@
  public:
   virtual ~SensorSinkInterface() {}
 
-  void Process(SensorData<Values> *data);
+  virtual void Process(SensorData<Values> *data) = 0;
 };
 
 }  // namespace sensors
diff --git a/aos/common/sensors/sensors.h b/aos/common/sensors/sensors.h
index 06f5253..6d533b4 100644
--- a/aos/common/sensors/sensors.h
+++ b/aos/common/sensors/sensors.h
@@ -2,6 +2,7 @@
 #define AOS_COMMON_SENSORS_SENSORS_H_
 
 #include "aos/common/time.h"
+#include "aos/common/byteorder.h"
 
 #include "aos/common/control_loop/ControlLoop.h"
 
@@ -40,6 +41,10 @@
   Values values;
   // Starts at 0 and goes up.
   int32_t count;
+
+  void NetworkToHost() {
+    count = ntoh(count);
+  }
 } __attribute__((packed));
 
 }  // namespace sensors
diff --git a/aos/common/time.h b/aos/common/time.h
index c081e09..418d087 100644
--- a/aos/common/time.h
+++ b/aos/common/time.h
@@ -115,8 +115,9 @@
     return ToNSec() / static_cast<int64_t>(kNSecInSec / sysClkRateGet());
   }
   // Constructs a Time representing ticks.
+  // TODO(brians): test this one too
   static Time InTicks(int ticks) {
-    return Time::InSeconds(ticks * sysClkRateGet());
+    return Time::InSeconds(static_cast<double>(ticks) / sysClkRateGet());
   }
 #endif
 
diff --git a/aos/crio/controls/ControlsManager.cpp b/aos/crio/controls/ControlsManager.cpp
index 906394f..762e8b6 100644
--- a/aos/crio/controls/ControlsManager.cpp
+++ b/aos/crio/controls/ControlsManager.cpp
@@ -13,6 +13,10 @@
 namespace aos {
 namespace crio {
 
+ControlsManager::ControlsManager() {
+  printf("aos::ControlsManager constructor done\n");
+}
+
 // Everything gets an explicit Start call here before calling all of the init
 // functions because it means that all static variables will be initialized
 // before anything actually starts running. It also means that everything will
@@ -35,6 +39,9 @@
   aos_call_init_functions();
   LOG(INFO, "initialized\n");
 
+  CreateObjects();
+  LOG(INFO, "created objects\n");
+
   RegisterControlLoops();
   LOG(INFO, "registered control loops\n");
 
diff --git a/aos/crio/controls/ControlsManager.h b/aos/crio/controls/ControlsManager.h
index aa78587..5971f46 100644
--- a/aos/crio/controls/ControlsManager.h
+++ b/aos/crio/controls/ControlsManager.h
@@ -8,6 +8,8 @@
 // to be passed to START_ROBOT_CLASS (a WPILib macro) to start all of the code.
 class ControlsManager : public RobotBase {
  public:
+  ControlsManager();
+
   virtual void StartCompetition();
 
   static ControlsManager &GetInstance() {
@@ -20,6 +22,7 @@
  private:
   // Hooks that subclasses have to implement to do the correct things at the
   // correct times.
+  virtual void CreateObjects() = 0;
   virtual void RegisterControlLoops() = 0;
   virtual void StartSensorBroadcasters() = 0;
 };
diff --git a/aos/crio/motor_server/crio_control_loop_runner-tmpl.h b/aos/crio/motor_server/crio_control_loop_runner-tmpl.h
index 4bb448f..b4b1c40 100644
--- a/aos/crio/motor_server/crio_control_loop_runner-tmpl.h
+++ b/aos/crio/motor_server/crio_control_loop_runner-tmpl.h
@@ -11,7 +11,9 @@
     sensors::SensorBroadcaster<Values> *broadcaster,
     sensors::SensorUnpackerInterface<Values> *unpacker)
     : broadcaster_(broadcaster),
-      unpacker_(unpacker) {}
+      unpacker_(unpacker) {
+  broadcaster_->RegisterControlLoopRunner(this);
+}
 
 template<class Values>
 void CRIOControlLoopRunner<Values>::AddControlLoop(
@@ -22,7 +24,7 @@
 
 template<class Values>
 void CRIOControlLoopRunner<Values>::Process(sensors::SensorData<Values> *data) {
-  unpacker_->UnpackFrom(&data.values);
+  unpacker_->UnpackFrom(&data->values);
   for (auto it = loops_.begin(); it != loops_.end(); ++it) {
     (*it)->Iterate();
   }
diff --git a/aos/crio/shared_libs/interrupt_bridge-tmpl.h b/aos/crio/shared_libs/interrupt_bridge-tmpl.h
index ef53dce..4550e7f 100644
--- a/aos/crio/shared_libs/interrupt_bridge-tmpl.h
+++ b/aos/crio/shared_libs/interrupt_bridge-tmpl.h
@@ -80,7 +80,7 @@
     typename InterruptBridge<T>::Handler handler,
     T *param, int priority)
     : InterruptBridge<T>(handler, param, priority),
-      period_(-1, -1) {}
+      period_(0, 0) {}
 
 template<typename T>
 void PeriodicNotifier<T>::StartPeriodic(time::Time period) {
diff --git a/frc971/crio/main.cc b/frc971/crio/main.cc
index 649946b..85e2d45 100644
--- a/frc971/crio/main.cc
+++ b/frc971/crio/main.cc
@@ -1,3 +1,5 @@
+#include "aos/common/libstdc++/memory"
+
 #include "aos/crio/controls/ControlsManager.h"
 #include "aos/crio/motor_server/crio_control_loop_runner.h"
 #include "aos/common/sensors/sensor_broadcaster.h"
@@ -6,26 +8,34 @@
 #include "frc971/input/sensor_packer.h"
 #include "frc971/input/sensor_unpacker.h"
 
+using ::std::unique_ptr;
+
 namespace frc971 {
 
 class MyRobot : public ::aos::crio::ControlsManager {
  public:
-  MyRobot()
-      : broadcaster_(&packer_),
-        control_loop_runner_(&broadcaster_, &unpacker_) {}
+  MyRobot() {}
+
+  virtual void CreateObjects() {
+    packer_ = unique_ptr< ::frc971::SensorPacker>( new ::frc971::SensorPacker());
+    unpacker_ = unique_ptr< ::frc971::SensorUnpacker>( new ::frc971::SensorUnpacker());
+    broadcaster_ = unique_ptr< ::aos::sensors::SensorBroadcaster< ::frc971::sensor_values>>(
+        new ::aos::sensors::SensorBroadcaster< ::frc971::sensor_values>(packer_.get()));
+    control_loop_runner_ = unique_ptr< ::aos::crio::CRIOControlLoopRunner< ::frc971::sensor_values>>(new ::aos::crio::CRIOControlLoopRunner< ::frc971::sensor_values>(broadcaster_.get(), unpacker_.get()));
+  }
 
   virtual void RegisterControlLoops() {
-    //control_loop_runner_.AddControlLoop(&shooter_);
+    //control_loop_runner_->AddControlLoop(&shooter_);
   }
 
   virtual void StartSensorBroadcasters() {
-    broadcaster_.Start();
+    broadcaster_->Start();
   }
 
-  ::frc971::SensorPacker packer_;
-  ::frc971::SensorUnpacker unpacker_;
-  ::aos::sensors::SensorBroadcaster< ::frc971::sensor_values> broadcaster_;
-  ::aos::crio::CRIOControlLoopRunner< ::frc971::sensor_values>
+  unique_ptr< ::frc971::SensorPacker> packer_;
+  unique_ptr< ::frc971::SensorUnpacker> unpacker_;
+  unique_ptr< ::aos::sensors::SensorBroadcaster< ::frc971::sensor_values>> broadcaster_;
+  unique_ptr< ::aos::crio::CRIOControlLoopRunner< ::frc971::sensor_values>>
       control_loop_runner_;
 };