Convert aos over to flatbuffers

Everything builds, and all the tests pass.  I suspect that some entries
are missing from the config files, but those will be found pretty
quickly on startup.

There is no logging or live introspection of queue messages.

Change-Id: I496ee01ed68f202c7851bed7e8786cee30df29f5
diff --git a/frc971/wpilib/ADIS16448.cc b/frc971/wpilib/ADIS16448.cc
index 4fc2c7b..f364d56 100644
--- a/frc971/wpilib/ADIS16448.cc
+++ b/frc971/wpilib/ADIS16448.cc
@@ -8,10 +8,9 @@
 #include <chrono>
 
 #include "aos/init.h"
-#include "aos/logging/queue_logging.h"
-#include "aos/robot_state/robot_state.q.h"
+#include "aos/robot_state/robot_state_generated.h"
 #include "aos/time/time.h"
-#include "frc971/wpilib/imu.q.h"
+#include "frc971/wpilib/imu_generated.h"
 #include "frc971/zeroing/averager.h"
 
 namespace frc971 {
@@ -121,10 +120,9 @@
 ADIS16448::ADIS16448(::aos::EventLoop *event_loop, frc::SPI::Port port,
                      frc::DigitalInput *dio1)
     : event_loop_(event_loop),
-      joystick_state_fetcher_(event_loop_->MakeFetcher<::aos::JoystickState>(
-          ".aos.joystick_state")),
+      robot_state_fetcher_(event_loop_->MakeFetcher<::aos::RobotState>("/aos")),
       imu_values_sender_(
-          event_loop_->MakeSender<::frc971::IMUValues>(".frc971.imu_values")),
+          event_loop_->MakeSender<::frc971::IMUValues>("/drivetrain")),
       spi_(new frc::SPI(port)),
       dio1_(dio1) {
   // 1MHz is the maximum supported for burst reads, but we
@@ -247,31 +245,35 @@
       }
     }
 
-    auto message = imu_values_sender_.MakeMessage();
-    message->fpga_timestamp = ::aos::time::DurationInSeconds(
-        dio1_->ReadRisingTimestamp().time_since_epoch());
-    message->monotonic_timestamp_ns =
-        chrono::duration_cast<chrono::nanoseconds>(read_time.time_since_epoch())
-            .count();
+    auto builder = imu_values_sender_.MakeBuilder();
 
-    message->gyro_x =
+    IMUValues::Builder imu_builder = builder.MakeBuilder<IMUValues>();
+
+    imu_builder.add_fpga_timestamp(::aos::time::DurationInSeconds(
+        dio1_->ReadRisingTimestamp().time_since_epoch()));
+    imu_builder.add_monotonic_timestamp_ns(
+        chrono::duration_cast<chrono::nanoseconds>(read_time.time_since_epoch())
+            .count());
+
+    float gyro_x =
         ConvertValue(&to_receive[4], kGyroLsbDegreeSecond * M_PI / 180.0);
-    message->gyro_y =
+    float gyro_y =
         ConvertValue(&to_receive[6], kGyroLsbDegreeSecond * M_PI / 180.0);
-    message->gyro_z =
+    float gyro_z =
         ConvertValue(&to_receive[8], kGyroLsbDegreeSecond * M_PI / 180.0);
 
     // The first few seconds of samples are averaged and subtracted from
     // subsequent samples for zeroing purposes.
     if (!gyros_are_zeroed_) {
-      average_gyro_x.AddData(message->gyro_x);
-      average_gyro_y.AddData(message->gyro_y);
-      average_gyro_z.AddData(message->gyro_z);
+      average_gyro_x.AddData(gyro_x);
+      average_gyro_y.AddData(gyro_y);
+      average_gyro_z.AddData(gyro_z);
 
       if (average_gyro_x.full() && average_gyro_y.full() &&
           average_gyro_z.full()) {
-        joystick_state_fetcher_.Fetch();
-        if (joystick_state_fetcher_.get() && joystick_state_fetcher_->enabled) {
+        robot_state_fetcher_.Fetch();
+        if (robot_state_fetcher_.get() &&
+            robot_state_fetcher_->outputs_enabled()) {
           gyro_x_zeroed_offset_ = -average_gyro_x.GetAverage();
           gyro_y_zeroed_offset_ = -average_gyro_y.GetAverage();
           gyro_z_zeroed_offset_ = -average_gyro_z.GetAverage();
@@ -282,33 +284,36 @@
         }
       }
     }
+    gyro_x += gyro_x_zeroed_offset_;
+    gyro_y += gyro_y_zeroed_offset_;
+    gyro_z += gyro_z_zeroed_offset_;
 
-    message->gyro_x += gyro_x_zeroed_offset_;
-    message->gyro_y += gyro_y_zeroed_offset_;
-    message->gyro_z += gyro_z_zeroed_offset_;
+    imu_builder.add_gyro_x(gyro_x);
+    imu_builder.add_gyro_y(gyro_y);
+    imu_builder.add_gyro_z(gyro_z);
 
-    message->accelerometer_x =
-        ConvertValue(&to_receive[10], kAccelerometerLsbG);
-    message->accelerometer_y =
-        ConvertValue(&to_receive[12], kAccelerometerLsbG);
-    message->accelerometer_z =
-        ConvertValue(&to_receive[14], kAccelerometerLsbG);
+    imu_builder.add_accelerometer_x(
+        ConvertValue(&to_receive[10], kAccelerometerLsbG));
+    imu_builder.add_accelerometer_y(
+        ConvertValue(&to_receive[12], kAccelerometerLsbG));
+    imu_builder.add_accelerometer_z(
+        ConvertValue(&to_receive[14], kAccelerometerLsbG));
 
-    message->magnetometer_x =
-        ConvertValue(&to_receive[16], kMagnetometerLsbGauss);
-    message->magnetometer_y =
-        ConvertValue(&to_receive[18], kMagnetometerLsbGauss);
-    message->magnetometer_z =
-        ConvertValue(&to_receive[20], kMagnetometerLsbGauss);
+    imu_builder.add_magnetometer_x(
+        ConvertValue(&to_receive[16], kMagnetometerLsbGauss));
+    imu_builder.add_magnetometer_y(
+        ConvertValue(&to_receive[18], kMagnetometerLsbGauss));
+    imu_builder.add_magnetometer_z(
+        ConvertValue(&to_receive[20], kMagnetometerLsbGauss));
 
-    message->barometer =
-        ConvertValue(&to_receive[22], kBarometerLsbPascal, false);
+    imu_builder.add_barometer(
+        ConvertValue(&to_receive[22], kBarometerLsbPascal, false));
 
-    message->temperature =
-        ConvertValue(&to_receive[24], kTemperatureLsbDegree) + kTemperatureZero;
+    imu_builder.add_temperature(
+        ConvertValue(&to_receive[24], kTemperatureLsbDegree) +
+        kTemperatureZero);
 
-    AOS_LOG_STRUCT(DEBUG, "sending", *message);
-    if (!message.Send()) {
+    if (!builder.Send(imu_builder.Finish())) {
       AOS_LOG(WARNING, "sending queue message failed\n");
     }
 
diff --git a/frc971/wpilib/ADIS16448.h b/frc971/wpilib/ADIS16448.h
index 6aeac9d..ce950df 100644
--- a/frc971/wpilib/ADIS16448.h
+++ b/frc971/wpilib/ADIS16448.h
@@ -11,10 +11,10 @@
 #include "frc971/wpilib/ahal/SPI.h"
 #undef ERROR
 
-#include "aos/events/event-loop.h"
+#include "aos/events/event_loop.h"
 #include "aos/logging/logging.h"
-#include "aos/robot_state/robot_state.q.h"
-#include "frc971/wpilib/imu.q.h"
+#include "aos/robot_state/robot_state_generated.h"
+#include "frc971/wpilib/imu_generated.h"
 #include "frc971/wpilib/spi_rx_clearer.h"
 
 namespace frc971 {
@@ -90,7 +90,7 @@
   bool Initialize();
 
   ::aos::EventLoop *event_loop_;
-  ::aos::Fetcher<::aos::JoystickState> joystick_state_fetcher_;
+  ::aos::Fetcher<::aos::RobotState> robot_state_fetcher_;
   ::aos::Sender<::frc971::IMUValues> imu_values_sender_;
 
   // TODO(Brian): This object has no business owning these ones.
diff --git a/frc971/wpilib/BUILD b/frc971/wpilib/BUILD
index 870e655..b7fe837 100644
--- a/frc971/wpilib/BUILD
+++ b/frc971/wpilib/BUILD
@@ -1,11 +1,11 @@
 package(default_visibility = ["//visibility:public"])
 
-load("//aos/build:queues.bzl", "queue_library")
+load("@com_github_google_flatbuffers//:build_defs.bzl", "flatbuffer_cc_library")
 
-queue_library(
-    name = "logging_queue",
+flatbuffer_cc_library(
+    name = "logging_fbs",
     srcs = [
-        "logging.q",
+        "logging.fbs",
     ],
 )
 
@@ -107,10 +107,9 @@
     deps = [
         ":gyro_interface",
         "//aos:init",
-        "//aos/events:event-loop",
+        "//aos/events:event_loop",
         "//aos/logging",
-        "//aos/logging:queue_logging",
-        "//aos/robot_state",
+        "//aos/robot_state:robot_state_fbs",
         "//aos/time",
         "//aos/util:phased_loop",
         "//frc971/queues:gyro",
@@ -118,10 +117,10 @@
     ],
 )
 
-queue_library(
-    name = "loop_output_handler_test_queue",
+flatbuffer_cc_library(
+    name = "loop_output_handler_test_fbs",
     srcs = [
-        "loop_output_handler_test.q",
+        "loop_output_handler_test.fbs",
     ],
 )
 
@@ -135,8 +134,8 @@
     ],
     deps = [
         "//aos:init",
-        "//aos/events:event-loop",
-        "//aos/robot_state",
+        "//aos/events:event_loop",
+        "//aos/robot_state:robot_state_fbs",
         "//aos/scoped:scoped_fd",
         "//aos/time",
         "//aos/util:log_interval",
@@ -150,9 +149,8 @@
     ],
     deps = [
         ":loop_output_handler",
-        ":loop_output_handler_test_queue",
+        ":loop_output_handler_test_fbs",
         "//aos/events:simulated_event_loop",
-        "//aos/logging:queue_logging",
         "//aos/testing:googletest",
         "//aos/testing:test_logging",
     ],
@@ -169,10 +167,10 @@
     restricted_to = ["//tools:roborio"],
     deps = [
         "//aos:init",
-        "//aos/events:shm-event-loop",
-        "//aos/logging:queue_logging",
+        "//aos/events:shm_event_loop",
+        "//aos/input:driver_station_data",
         "//aos/network:team_number",
-        "//aos/robot_state",
+        "//aos/robot_state:joystick_state_fbs",
         "//third_party:wpilib",
     ],
 )
@@ -187,16 +185,16 @@
     ],
     restricted_to = ["//tools:roborio"],
     deps = [
-        "//aos/logging:queue_logging",
-        "//aos/robot_state",
+        "//aos/events:event_loop",
+        "//aos/robot_state:robot_state_fbs",
         "//third_party:wpilib",
     ],
 )
 
-queue_library(
+flatbuffer_cc_library(
     name = "pdp_values",
     srcs = [
-        "pdp_values.q",
+        "pdp_values.fbs",
     ],
 )
 
@@ -212,8 +210,7 @@
     deps = [
         ":pdp_values",
         "//aos:init",
-        "//aos/events:event-loop",
-        "//aos/logging:queue_logging",
+        "//aos/events:event_loop",
         "//aos/util:phased_loop",
         "//third_party:wpilib",
     ],
@@ -230,11 +227,12 @@
     ],
 )
 
-queue_library(
-    name = "imu_queue",
+flatbuffer_cc_library(
+    name = "imu_fbs",
     srcs = [
-        "imu.q",
+        "imu.fbs",
     ],
+    gen_reflections = 1,
 )
 
 cc_library(
@@ -247,13 +245,12 @@
     ],
     restricted_to = ["//tools:roborio"],
     deps = [
-        ":imu_queue",
+        ":imu_fbs",
         ":spi_rx_clearer",
         "//aos:init",
-        "//aos/events:event-loop",
+        "//aos/events:event_loop",
         "//aos/logging",
-        "//aos/logging:queue_logging",
-        "//aos/robot_state",
+        "//aos/robot_state:robot_state_fbs",
         "//aos/time",
         "//frc971/zeroing:averager",
         "//third_party:wpilib",
@@ -302,11 +299,11 @@
         ":encoder_and_potentiometer",
         ":wpilib_interface",
         "//aos:init",
-        "//aos/events:event-loop",
+        "//aos/events:event_loop",
         "//aos/stl_mutex",
         "//aos/time",
         "//aos/util:phased_loop",
-        "//frc971/control_loops:queues",
+        "//frc971/control_loops:control_loops_fbs",
         "//third_party:wpilib",
     ],
 )
@@ -324,8 +321,7 @@
         ":loop_output_handler",
         "//aos:math",
         "//aos/logging",
-        "//aos/logging:queue_logging",
-        "//frc971/control_loops/drivetrain:drivetrain_queue",
+        "//frc971/control_loops/drivetrain:drivetrain_output_fbs",
         "//third_party:wpilib",
     ],
 )
diff --git a/frc971/wpilib/drivetrain_writer.cc b/frc971/wpilib/drivetrain_writer.cc
index 5c6feb8..0afbe20 100644
--- a/frc971/wpilib/drivetrain_writer.cc
+++ b/frc971/wpilib/drivetrain_writer.cc
@@ -2,8 +2,7 @@
 
 #include "aos/commonmath.h"
 #include "aos/logging/logging.h"
-#include "aos/logging/queue_logging.h"
-#include "frc971/control_loops/drivetrain/drivetrain.q.h"
+#include "frc971/control_loops/drivetrain/drivetrain_output_generated.h"
 #include "frc971/wpilib/ahal/PWM.h"
 #include "frc971/wpilib/loop_output_handler.h"
 
@@ -11,19 +10,19 @@
 namespace wpilib {
 
 void DrivetrainWriter::Write(
-    const ::frc971::control_loops::DrivetrainQueue::Output &output) {
-  AOS_LOG_STRUCT(DEBUG, "will output", output);
-  left_controller0_->SetSpeed(SafeSpeed(reversed_left0_, output.left_voltage));
+    const ::frc971::control_loops::drivetrain::Output &output) {
+  left_controller0_->SetSpeed(
+      SafeSpeed(reversed_left0_, output.left_voltage()));
   right_controller0_->SetSpeed(
-      SafeSpeed(reversed_right0_, output.right_voltage));
+      SafeSpeed(reversed_right0_, output.right_voltage()));
 
   if (left_controller1_) {
     left_controller1_->SetSpeed(
-        SafeSpeed(reversed_left1_, output.left_voltage));
+        SafeSpeed(reversed_left1_, output.left_voltage()));
   }
   if (right_controller1_) {
     right_controller1_->SetSpeed(
-        SafeSpeed(reversed_right1_, output.right_voltage));
+        SafeSpeed(reversed_right1_, output.right_voltage()));
   }
 }
 
diff --git a/frc971/wpilib/drivetrain_writer.h b/frc971/wpilib/drivetrain_writer.h
index 9397230..9cf9a67 100644
--- a/frc971/wpilib/drivetrain_writer.h
+++ b/frc971/wpilib/drivetrain_writer.h
@@ -3,7 +3,7 @@
 
 #include "aos/commonmath.h"
 
-#include "frc971/control_loops/drivetrain/drivetrain.q.h"
+#include "frc971/control_loops/drivetrain/drivetrain_output_generated.h"
 #include "frc971/wpilib/ahal/PWM.h"
 #include "frc971/wpilib/loop_output_handler.h"
 
@@ -11,12 +11,12 @@
 namespace wpilib {
 
 class DrivetrainWriter : public ::frc971::wpilib::LoopOutputHandler<
-                             ::frc971::control_loops::DrivetrainQueue::Output> {
+                             ::frc971::control_loops::drivetrain::Output> {
  public:
   DrivetrainWriter(::aos::EventLoop *event_loop)
       : ::frc971::wpilib::LoopOutputHandler<
-            ::frc971::control_loops::DrivetrainQueue::Output>(
-            event_loop, ".frc971.control_loops.drivetrain_queue.output") {}
+            ::frc971::control_loops::drivetrain::Output>(event_loop,
+                                                         "/drivetrain") {}
 
   void set_left_controller0(::std::unique_ptr<::frc::PWM> t, bool reversed) {
     left_controller0_ = ::std::move(t);
@@ -40,12 +40,11 @@
 
  private:
   void Write(
-      const ::frc971::control_loops::DrivetrainQueue::Output &output) override;
+      const ::frc971::control_loops::drivetrain::Output &output) override;
   void Stop() override;
 
   double SafeSpeed(bool reversed, double voltage) {
-    return (::aos::Clip((reversed ? -1.0 : 1.0) * voltage, -12.0, 12.0) /
-            12.0);
+    return (::aos::Clip((reversed ? -1.0 : 1.0) * voltage, -12.0, 12.0) / 12.0);
   }
 
   ::std::unique_ptr<::frc::PWM> left_controller0_, right_controller0_,
diff --git a/frc971/wpilib/encoder_and_potentiometer.cc b/frc971/wpilib/encoder_and_potentiometer.cc
index ac1a4a0..8173d20 100644
--- a/frc971/wpilib/encoder_and_potentiometer.cc
+++ b/frc971/wpilib/encoder_and_potentiometer.cc
@@ -1,7 +1,7 @@
 #include "frc971/wpilib/encoder_and_potentiometer.h"
 
-#include "aos/init.h"
 #include "aos/logging/logging.h"
+#include "aos/realtime.h"
 
 namespace frc971 {
 namespace wpilib {
diff --git a/frc971/wpilib/gyro_sender.cc b/frc971/wpilib/gyro_sender.cc
index 3a9f220..f5297c0 100644
--- a/frc971/wpilib/gyro_sender.cc
+++ b/frc971/wpilib/gyro_sender.cc
@@ -7,14 +7,13 @@
 
 #include <chrono>
 
-#include "aos/events/event-loop.h"
+#include "aos/events/event_loop.h"
 #include "aos/init.h"
 #include "aos/logging/logging.h"
-#include "aos/logging/queue_logging.h"
-#include "aos/robot_state/robot_state.q.h"
+#include "aos/robot_state/robot_state_generated.h"
 #include "aos/time/time.h"
 
-#include "frc971/queues/gyro.q.h"
+#include "frc971/queues/gyro_generated.h"
 #include "frc971/zeroing/averager.h"
 
 namespace frc971 {
@@ -25,13 +24,12 @@
 
 GyroSender::GyroSender(::aos::EventLoop *event_loop)
     : event_loop_(event_loop),
-      joystick_state_fetcher_(event_loop_->MakeFetcher<::aos::JoystickState>(
-          ".aos.joystick_state")),
-      uid_sender_(event_loop_->MakeSender<::frc971::sensors::Uid>(
-          ".frc971.sensors.gyro_part_id")),
+      joystick_state_fetcher_(
+          event_loop_->MakeFetcher<aos::RobotState>("/aos")),
+      uid_sender_(event_loop_->MakeSender<frc971::sensors::Uid>("/drivetrain")),
       gyro_reading_sender_(
-          event_loop_->MakeSender<::frc971::sensors::GyroReading>(
-              ".frc971.sensors.gyro_reading")) {
+          event_loop_->MakeSender<frc971::sensors::GyroReading>(
+              "/drivetrain")) {
   AOS_PCHECK(
       system("ps -ef | grep '\\[spi0\\]' | awk '{print $1}' | xargs chrt -f -p "
              "33") == 0);
@@ -55,12 +53,9 @@
           state_ = State::RUNNING;
           AOS_LOG(INFO, "gyro initialized successfully\n");
 
-          {
-            auto message = uid_sender_.MakeMessage();
-            message->uid = gyro_.ReadPartID();
-            AOS_LOG_STRUCT(INFO, "gyro ID", *message);
-            message.Send();
-          }
+          auto builder = uid_sender_.MakeBuilder();
+          builder.Send(
+              frc971::sensors::CreateUid(*builder.fbb(), gyro_.ReadPartID()));
         }
         last_initialize_time_ = monotonic_now;
       }
@@ -115,30 +110,31 @@
 
       const double angle_rate = gyro_.ExtractAngle(result);
       const double new_angle = angle_rate / static_cast<double>(kReadingRate);
-      auto message = gyro_reading_sender_.MakeMessage();
+      auto builder = gyro_reading_sender_.MakeBuilder();
       if (zeroed_) {
         angle_ += (new_angle + zero_offset_) * iterations;
-        message->angle = angle_;
-        message->velocity = angle_rate + zero_offset_ * kReadingRate;
-        AOS_LOG_STRUCT(DEBUG, "sending", *message);
-        message.Send();
+        sensors::GyroReading::Builder gyro_builder =
+            builder.MakeBuilder<sensors::GyroReading>();
+        gyro_builder.add_angle(angle_);
+        gyro_builder.add_velocity(angle_rate + zero_offset_ * kReadingRate);
+        builder.Send(gyro_builder.Finish());
       } else {
         // TODO(brian): Don't break without 6 seconds of standing still before
         // enabling. Ideas:
         //   Don't allow driving until we have at least some data?
         //   Some kind of indicator light?
         {
-          message->angle = new_angle;
-          message->velocity = angle_rate;
-          AOS_LOG_STRUCT(DEBUG, "collected while zeroing", *message);
-          message->angle = 0.0;
-          message->velocity = 0.0;
-          message.Send();
+          sensors::GyroReading::Builder gyro_builder =
+              builder.MakeBuilder<sensors::GyroReading>();
+          gyro_builder.add_angle(0.0);
+          gyro_builder.add_velocity(0.0);
+          builder.Send(gyro_builder.Finish());
         }
         zeroing_data_.AddData(new_angle);
 
         joystick_state_fetcher_.Fetch();
-        if (joystick_state_fetcher_.get() && joystick_state_fetcher_->enabled &&
+        if (joystick_state_fetcher_.get() &&
+            joystick_state_fetcher_->outputs_enabled() &&
             zeroing_data_.full()) {
           zero_offset_ = -zeroing_data_.GetAverage();
           AOS_LOG(INFO, "total zero offset %f\n", zero_offset_);
diff --git a/frc971/wpilib/gyro_sender.h b/frc971/wpilib/gyro_sender.h
index 3a43391..ec39264 100644
--- a/frc971/wpilib/gyro_sender.h
+++ b/frc971/wpilib/gyro_sender.h
@@ -5,9 +5,9 @@
 
 #include <atomic>
 
-#include "aos/events/event-loop.h"
-#include "aos/robot_state/robot_state.q.h"
-#include "frc971/queues/gyro.q.h"
+#include "aos/events/event_loop.h"
+#include "aos/robot_state/robot_state_generated.h"
+#include "frc971/queues/gyro_generated.h"
 #include "frc971/wpilib/gyro_interface.h"
 #include "frc971/zeroing/averager.h"
 
@@ -30,7 +30,7 @@
   void Loop(const int iterations);
 
   ::aos::EventLoop *event_loop_;
-  ::aos::Fetcher<::aos::JoystickState> joystick_state_fetcher_;
+  ::aos::Fetcher<::aos::RobotState> joystick_state_fetcher_;
   ::aos::Sender<::frc971::sensors::Uid> uid_sender_;
   ::aos::Sender<::frc971::sensors::GyroReading> gyro_reading_sender_;
 
diff --git a/frc971/wpilib/imu.q b/frc971/wpilib/imu.fbs
similarity index 69%
rename from frc971/wpilib/imu.q
rename to frc971/wpilib/imu.fbs
index 4d9dec7..f48f31f 100644
--- a/frc971/wpilib/imu.q
+++ b/frc971/wpilib/imu.fbs
@@ -1,40 +1,42 @@
-package frc971;
+namespace frc971;
 
 // Values returned from an IMU.
 // Published on ".frc971.imu_values"
-message IMUValues {
+table IMUValues {
   // Gyro readings in radians/second.
   // Positive is clockwise looking at the connector.
-  float gyro_x;
+  gyro_x:float;
   // Positive is clockwise looking at the right side (from the connector).
-  float gyro_y;
+  gyro_y:float;
   // Positive is counterclockwise looking at the top.
-  float gyro_z;
+  gyro_z:float;
 
   // Accelerometer readings in Gs.
   // Positive is up.
-  float accelerometer_x;
+  accelerometer_x:float;
   // Positive is away from the right side (from the connector).
-  float accelerometer_y;
+  accelerometer_y:float;
   // Positive is away from the connector.
-  float accelerometer_z;
+  accelerometer_z:float;
 
   // Magnetometer readings in gauss.
   // Positive is up.
-  float magnetometer_x;
+  magnetometer_x:float;
   // Positive is away from the right side (from the connector).
-  float magnetometer_y;
+  magnetometer_y:float;
   // Positive is away from the connector.
-  float magnetometer_z;
+  magnetometer_z:float;
 
   // Barometer readings in pascals.
-  float barometer;
+  barometer:float;
 
   // Temperature readings in degrees Celsius.
-  float temperature;
+  temperature:float;
 
   // FPGA timestamp when the values were captured.
-  double fpga_timestamp;
+  fpga_timestamp:double;
   // CLOCK_MONOTONIC time in nanoseconds when the values were captured.
-  int64_t monotonic_timestamp_ns;
-};
+  monotonic_timestamp_ns:long;
+}
+
+root_type IMUValues;
diff --git a/frc971/wpilib/interrupt_edge_counting.cc b/frc971/wpilib/interrupt_edge_counting.cc
index 546e64b..9b63b84 100644
--- a/frc971/wpilib/interrupt_edge_counting.cc
+++ b/frc971/wpilib/interrupt_edge_counting.cc
@@ -2,8 +2,8 @@
 
 #include <chrono>
 
+#include "aos/realtime.h"
 #include "aos/time/time.h"
-#include "aos/init.h"
 
 namespace frc971 {
 namespace wpilib {
diff --git a/frc971/wpilib/joystick_sender.cc b/frc971/wpilib/joystick_sender.cc
index 31ecc6c..2fec111 100644
--- a/frc971/wpilib/joystick_sender.cc
+++ b/frc971/wpilib/joystick_sender.cc
@@ -1,9 +1,10 @@
 #include "frc971/wpilib/joystick_sender.h"
 
-#include "aos/init.h"
-#include "aos/logging/queue_logging.h"
+#include "aos/input/driver_station_data.h"
+#include "aos/logging/logging.h"
 #include "aos/network/team_number.h"
-#include "aos/robot_state/robot_state.q.h"
+#include "aos/realtime.h"
+#include "aos/robot_state/joystick_state_generated.h"
 
 #include "frc971/wpilib/ahal/DriverStation.h"
 #include "hal/HAL.h"
@@ -11,12 +12,13 @@
 namespace frc971 {
 namespace wpilib {
 
+using aos::Joystick;
+
 JoystickSender::JoystickSender(::aos::EventLoop *event_loop)
     : event_loop_(event_loop),
       joystick_state_sender_(
-          event_loop_->MakeSender<::aos::JoystickState>(".aos.joystick_state")),
+          event_loop_->MakeSender<::aos::JoystickState>("/aos")),
       team_id_(::aos::network::GetTeamNumber()) {
-
   event_loop_->SetRuntimeRealtimePriority(29);
 
   event_loop_->OnRun([this]() {
@@ -27,36 +29,65 @@
     // variable / mutex needs to get exposed all the way out or something).
     while (event_loop_->is_running()) {
       ds->RunIteration([&]() {
-        auto new_state = joystick_state_sender_.MakeMessage();
+        auto builder = joystick_state_sender_.MakeBuilder();
 
         HAL_MatchInfo match_info;
         auto status = HAL_GetMatchInfo(&match_info);
-        if (status == 0) {
-          new_state->switch_left = match_info.gameSpecificMessage[0] == 'L' ||
-                                   match_info.gameSpecificMessage[0] == 'l';
-          new_state->scale_left = match_info.gameSpecificMessage[1] == 'L' ||
-                                  match_info.gameSpecificMessage[1] == 'l';
-        }
 
-        new_state->test_mode = ds->IsTestMode();
-        new_state->fms_attached = ds->IsFmsAttached();
-        new_state->enabled = ds->IsEnabled();
-        new_state->autonomous = ds->IsAutonomous();
-        new_state->team_id = team_id_;
-        new_state->fake = false;
+        std::array<flatbuffers::Offset<Joystick>,
+                   aos::input::driver_station::JoystickFeature::kJoysticks>
+            joysticks;
 
-        for (uint8_t i = 0;
-             i < sizeof(new_state->joysticks) / sizeof(::aos::Joystick); ++i) {
-          new_state->joysticks[i].buttons = ds->GetStickButtons(i);
-          for (int j = 0; j < 6; ++j) {
-            new_state->joysticks[i].axis[j] = ds->GetStickAxis(i, j);
+        for (size_t i = 0;
+             i < aos::input::driver_station::JoystickFeature::kJoysticks; ++i) {
+          std::array<double, aos::input::driver_station::JoystickAxis::kAxes>
+              axis;
+          for (int j = 0; j < aos::input::driver_station::JoystickAxis::kAxes;
+               ++j) {
+            axis[j] = ds->GetStickAxis(i, j);
           }
+
+          flatbuffers::Offset<flatbuffers::Vector<double>> axis_offset =
+              builder.fbb()->CreateVector(axis.begin(), axis.size());
+
+          Joystick::Builder joystick_builder = builder.MakeBuilder<Joystick>();
+
+          joystick_builder.add_buttons(ds->GetStickButtons(i));
+
           if (ds->GetStickPOVCount(i) > 0) {
-            new_state->joysticks[i].pov = ds->GetStickPOV(i, 0);
+            joystick_builder.add_pov(ds->GetStickPOV(i, 0));
           }
-          AOS_LOG_STRUCT(DEBUG, "joystick_state", *new_state);
+
+          joystick_builder.add_axis(axis_offset);
+
+          joysticks[i] = joystick_builder.Finish();
         }
-        if (!new_state.Send()) {
+
+        flatbuffers::Offset<flatbuffers::Vector<flatbuffers::Offset<Joystick>>>
+            joysticks_offset = builder.fbb()->CreateVector(joysticks.begin(),
+                                                           joysticks.size());
+
+        aos::JoystickState::Builder joystick_state_builder =
+            builder.MakeBuilder<aos::JoystickState>();
+
+        joystick_state_builder.add_joysticks(joysticks_offset);
+
+        if (status == 0) {
+          joystick_state_builder.add_switch_left(
+              match_info.gameSpecificMessage[0] == 'L' ||
+              match_info.gameSpecificMessage[0] == 'l');
+          joystick_state_builder.add_scale_left(
+              match_info.gameSpecificMessage[1] == 'L' ||
+              match_info.gameSpecificMessage[1] == 'l');
+        }
+
+        joystick_state_builder.add_test_mode(ds->IsTestMode());
+        joystick_state_builder.add_fms_attached(ds->IsFmsAttached());
+        joystick_state_builder.add_enabled(ds->IsEnabled());
+        joystick_state_builder.add_autonomous(ds->IsAutonomous());
+        joystick_state_builder.add_team_id(team_id_);
+
+        if (!builder.Send(joystick_state_builder.Finish())) {
           AOS_LOG(WARNING, "sending joystick_state failed\n");
         }
       });
diff --git a/frc971/wpilib/joystick_sender.h b/frc971/wpilib/joystick_sender.h
index 34c6bf4..e2609e8 100644
--- a/frc971/wpilib/joystick_sender.h
+++ b/frc971/wpilib/joystick_sender.h
@@ -3,8 +3,8 @@
 
 #include <atomic>
 
-#include "aos/events/event-loop.h"
-#include "aos/robot_state/robot_state.q.h"
+#include "aos/events/event_loop.h"
+#include "aos/robot_state/joystick_state_generated.h"
 
 namespace frc971 {
 namespace wpilib {
diff --git a/frc971/wpilib/logging.fbs b/frc971/wpilib/logging.fbs
new file mode 100644
index 0000000..473526f
--- /dev/null
+++ b/frc971/wpilib/logging.fbs
@@ -0,0 +1,7 @@
+namespace frc971.wpilib;
+
+// Information about the current state of the pneumatics system to log.
+table PneumaticsToLog {
+  compressor_on:bool;
+  read_solenoids:ubyte;
+}
diff --git a/frc971/wpilib/logging.q b/frc971/wpilib/logging.q
deleted file mode 100644
index a2b3799..0000000
--- a/frc971/wpilib/logging.q
+++ /dev/null
@@ -1,7 +0,0 @@
-package frc971.wpilib;
-
-// Information about the current state of the pneumatics system to log.
-struct PneumaticsToLog {
-  bool compressor_on;
-  uint8_t read_solenoids;
-};
diff --git a/frc971/wpilib/loop_output_handler.h b/frc971/wpilib/loop_output_handler.h
index 81baa68..a697339 100644
--- a/frc971/wpilib/loop_output_handler.h
+++ b/frc971/wpilib/loop_output_handler.h
@@ -4,8 +4,7 @@
 #include <atomic>
 #include <chrono>
 
-#include "aos/events/event-loop.h"
-#include "aos/robot_state/robot_state.q.h"
+#include "aos/events/event_loop.h"
 #include "aos/scoped/scoped_fd.h"
 #include "aos/time/time.h"
 #include "aos/util/log_interval.h"
diff --git a/frc971/wpilib/loop_output_handler_test.cc b/frc971/wpilib/loop_output_handler_test.cc
index 12c3f96..d7ef8cd 100644
--- a/frc971/wpilib/loop_output_handler_test.cc
+++ b/frc971/wpilib/loop_output_handler_test.cc
@@ -4,12 +4,11 @@
 
 #include "gtest/gtest.h"
 
-#include "aos/events/simulated-event-loop.h"
+#include "aos/events/simulated_event_loop.h"
 #include "aos/logging/logging.h"
-#include "aos/logging/queue_logging.h"
 #include "aos/testing/test_logging.h"
 #include "aos/time/time.h"
-#include "frc971/wpilib/loop_output_handler_test.q.h"
+#include "frc971/wpilib/loop_output_handler_test_generated.h"
 
 namespace frc971 {
 namespace wpilib {
@@ -23,11 +22,26 @@
  public:
   LoopOutputHandlerTest()
       : ::testing::Test(),
+        configuration_(aos::configuration::MergeConfiguration(
+            aos::FlatbufferDetachedBuffer<aos::Configuration>(
+                aos::JsonToFlatbuffer(
+                    "{\n"
+                    "  \"channels\": [ \n"
+                    "    {\n"
+                    "      \"name\": \"/test\",\n"
+                    "      \"type\": "
+                    "\"frc971.wpilib.LoopOutputHandlerTestOutput\"\n"
+                    "    }\n"
+                    "  ]\n"
+                    "}\n",
+                    aos::Configuration::MiniReflectTypeTable())))),
+        event_loop_factory_(&configuration_.message()),
         loop_output_hander_event_loop_(event_loop_factory_.MakeEventLoop()),
         test_event_loop_(event_loop_factory_.MakeEventLoop()) {
     ::aos::testing::EnableTestLogging();
   }
 
+  aos::FlatbufferDetachedBuffer<aos::Configuration> configuration_;
   ::aos::SimulatedEventLoopFactory event_loop_factory_;
   ::std::unique_ptr<::aos::EventLoop> loop_output_hander_event_loop_;
   ::std::unique_ptr<::aos::EventLoop> test_event_loop_;
@@ -49,14 +63,14 @@
 
  protected:
   void Write(const LoopOutputHandlerTestOutput &output) override {
-    AOS_LOG_STRUCT(DEBUG, "output", output);
+    LOG(INFO) << "output " << aos::FlatbufferToJson(&output);
     ++count_;
     last_time_ = event_loop()->monotonic_now();
   }
 
   void Stop() override {
     stop_time_ = event_loop()->monotonic_now();
-    AOS_LOG(DEBUG, "Stopping\n");
+    LOG(INFO) << "Stopping";
   }
 
  private:
@@ -71,10 +85,10 @@
 // Test that the watchdog calls Stop at the right time.
 TEST_F(LoopOutputHandlerTest, WatchdogTest) {
   TestLoopOutputHandler loop_output(loop_output_hander_event_loop_.get(),
-                                    ".test");
+                                    "/test");
 
   ::aos::Sender<LoopOutputHandlerTestOutput> output_sender =
-      test_event_loop_->MakeSender<LoopOutputHandlerTestOutput>(".test");
+      test_event_loop_->MakeSender<LoopOutputHandlerTestOutput>("/test");
 
   const monotonic_clock::time_point start_time =
       test_event_loop_->monotonic_now();
@@ -86,13 +100,15 @@
         EXPECT_EQ(count, loop_output.count());
         if (test_event_loop_->monotonic_now() <
             start_time + chrono::seconds(1)) {
-          auto output = output_sender.MakeMessage();
-          output->voltage = 5.0;
-          EXPECT_TRUE(output.Send());
+          auto builder = output_sender.MakeBuilder();
+          LoopOutputHandlerTestOutput::Builder output_builder =
+              builder.MakeBuilder<LoopOutputHandlerTestOutput>();
+          output_builder.add_voltage(5.0);
+          EXPECT_TRUE(builder.Send(output_builder.Finish()));
 
           ++count;
         }
-        AOS_LOG(INFO, "Ping\n");
+        LOG(INFO) << "Ping";
       });
 
   // Kick off the ping timer handler.
diff --git a/frc971/wpilib/loop_output_handler_test.fbs b/frc971/wpilib/loop_output_handler_test.fbs
new file mode 100644
index 0000000..6cb2cf1
--- /dev/null
+++ b/frc971/wpilib/loop_output_handler_test.fbs
@@ -0,0 +1,6 @@
+namespace frc971.wpilib;
+
+// Test output message.
+table LoopOutputHandlerTestOutput {
+  voltage:double;
+}
diff --git a/frc971/wpilib/loop_output_handler_test.q b/frc971/wpilib/loop_output_handler_test.q
deleted file mode 100644
index 81336ef..0000000
--- a/frc971/wpilib/loop_output_handler_test.q
+++ /dev/null
@@ -1,6 +0,0 @@
-package frc971.wpilib;
-
-// Test output message.
-message LoopOutputHandlerTestOutput {
-  double voltage;
-};
diff --git a/frc971/wpilib/pdp_fetcher.cc b/frc971/wpilib/pdp_fetcher.cc
index aa85184..cd17d89 100644
--- a/frc971/wpilib/pdp_fetcher.cc
+++ b/frc971/wpilib/pdp_fetcher.cc
@@ -2,11 +2,10 @@
 
 #include <chrono>
 
-#include "aos/events/event-loop.h"
-#include "aos/init.h"
-#include "aos/logging/queue_logging.h"
+#include "aos/events/event_loop.h"
+#include "aos/logging/logging.h"
 #include "frc971/wpilib/ahal/PowerDistributionPanel.h"
-#include "frc971/wpilib/pdp_values.q.h"
+#include "frc971/wpilib/pdp_values_generated.h"
 
 namespace frc971 {
 namespace wpilib {
@@ -15,8 +14,7 @@
 
 PDPFetcher::PDPFetcher(::aos::EventLoop *event_loop)
     : event_loop_(event_loop),
-      pdp_values_sender_(
-          event_loop_->MakeSender<::frc971::PDPValues>(".frc971.pdp_values")),
+      pdp_values_sender_(event_loop_->MakeSender<::frc971::PDPValues>("/aos")),
       pdp_(new frc::PowerDistributionPanel()) {
   event_loop_->set_name("PDPFetcher");
 
@@ -31,15 +29,22 @@
   if (iterations != 1) {
     AOS_LOG(DEBUG, "PDPFetcher skipped %d iterations\n", iterations - 1);
   }
-  auto message = pdp_values_sender_.MakeMessage();
-  message->voltage = pdp_->GetVoltage();
-  message->temperature = pdp_->GetTemperature();
-  message->power = pdp_->GetTotalPower();
-  for (int i = 0; i < 16; ++i) {
-    message->currents[i] = pdp_->GetCurrent(i);
+  std::array<double, 16> currents;
+  for (size_t i = 0; i < currents.size(); ++i) {
+    currents[i] = pdp_->GetCurrent(i);
   }
-  AOS_LOG_STRUCT(DEBUG, "got", *message);
-  if (!message.Send()) {
+
+  auto builder = pdp_values_sender_.MakeBuilder();
+  flatbuffers::Offset<flatbuffers::Vector<double>> currents_offset =
+      builder.fbb()->CreateVector(currents.begin(), currents.size());
+
+  PDPValues::Builder pdp_builder = builder.MakeBuilder<PDPValues>();
+  pdp_builder.add_voltage(pdp_->GetVoltage());
+  pdp_builder.add_temperature(pdp_->GetTemperature());
+  pdp_builder.add_power(pdp_->GetTotalPower());
+  pdp_builder.add_currents(currents_offset);
+
+  if (!builder.Send(pdp_builder.Finish())) {
     AOS_LOG(WARNING, "sending pdp values failed\n");
   }
 }
diff --git a/frc971/wpilib/pdp_fetcher.h b/frc971/wpilib/pdp_fetcher.h
index fd05d67..d034473 100644
--- a/frc971/wpilib/pdp_fetcher.h
+++ b/frc971/wpilib/pdp_fetcher.h
@@ -4,8 +4,8 @@
 #include <atomic>
 #include <memory>
 
-#include "aos/events/event-loop.h"
-#include "frc971/wpilib/pdp_values.q.h"
+#include "aos/events/event_loop.h"
+#include "frc971/wpilib/pdp_values_generated.h"
 
 namespace frc {
 class PowerDistributionPanel;
diff --git a/frc971/wpilib/pdp_values.fbs b/frc971/wpilib/pdp_values.fbs
new file mode 100644
index 0000000..4db2ade
--- /dev/null
+++ b/frc971/wpilib/pdp_values.fbs
@@ -0,0 +1,13 @@
+namespace frc971;
+
+// Values retrieved from the PDP.
+// Published on ".frc971.pdp_values"
+table PDPValues {
+  voltage:double;
+  temperature:double;
+  power:double;
+  // Array of 16 currents.
+  currents:[double];
+}
+
+root_type PDPValues;
diff --git a/frc971/wpilib/pdp_values.q b/frc971/wpilib/pdp_values.q
deleted file mode 100644
index 4c326ab..0000000
--- a/frc971/wpilib/pdp_values.q
+++ /dev/null
@@ -1,10 +0,0 @@
-package frc971;
-
-// Values retrieved from the PDP.
-// Published on ".frc971.pdp_values"
-message PDPValues {
-  double voltage;
-  double temperature;
-  double power;
-  double[16] currents;
-};
diff --git a/frc971/wpilib/sensor_reader.cc b/frc971/wpilib/sensor_reader.cc
index 63d3992..8610105 100644
--- a/frc971/wpilib/sensor_reader.cc
+++ b/frc971/wpilib/sensor_reader.cc
@@ -4,7 +4,6 @@
 #include <unistd.h>
 
 #include "aos/init.h"
-#include "aos/logging/queue_logging.h"
 #include "aos/util/compiler_memory_barrier.h"
 #include "aos/util/phased_loop.h"
 #include "frc971/wpilib/ahal/DigitalInput.h"
@@ -124,10 +123,8 @@
       event_loop_->monotonic_now();
 
   {
-    auto new_state = robot_state_sender_.MakeMessage();
-    ::frc971::wpilib::PopulateRobotState(new_state.get(), my_pid_);
-    AOS_LOG_STRUCT(DEBUG, "robot_state", *new_state);
-    new_state.Send();
+    auto builder = robot_state_sender_.MakeBuilder();
+    builder.Send(::frc971::wpilib::PopulateRobotState(&builder, my_pid_));
   }
   RunIteration();
   if (dma_synchronizer_) {
diff --git a/frc971/wpilib/sensor_reader.h b/frc971/wpilib/sensor_reader.h
index 7a63444..ae1d580 100644
--- a/frc971/wpilib/sensor_reader.h
+++ b/frc971/wpilib/sensor_reader.h
@@ -4,11 +4,11 @@
 #include <atomic>
 #include <chrono>
 
-#include "aos/events/event-loop.h"
-#include "aos/robot_state/robot_state.q.h"
+#include "aos/events/event_loop.h"
+#include "aos/robot_state/robot_state_generated.h"
 #include "aos/stl_mutex/stl_mutex.h"
 #include "aos/time/time.h"
-#include "frc971/control_loops/control_loops.q.h"
+#include "frc971/control_loops/control_loops_generated.h"
 #include "frc971/wpilib/ahal/DigitalGlitchFilter.h"
 #include "frc971/wpilib/ahal/DigitalInput.h"
 #include "frc971/wpilib/ahal/DriverStation.h"
@@ -63,7 +63,7 @@
   // Copies a DMAEncoder to a IndexPosition with the correct unit and direction
   // changes.
   void CopyPosition(const ::frc971::wpilib::DMAEncoder &encoder,
-                    ::frc971::IndexPosition *position,
+                    ::frc971::IndexPositionT *position,
                     double encoder_counts_per_revolution, double encoder_ratio,
                     bool reverse) {
     const double multiplier = reverse ? -1.0 : 1.0;
@@ -82,7 +82,7 @@
   // the correct unit and direction changes.
   void CopyPosition(
       const ::frc971::wpilib::AbsoluteEncoderAndPotentiometer &encoder,
-      ::frc971::PotAndAbsolutePosition *position,
+      ::frc971::PotAndAbsolutePositionT *position,
       double encoder_counts_per_revolution, double encoder_ratio,
       ::std::function<double(double)> potentiometer_translate, bool reverse,
       double pot_offset) {
@@ -104,7 +104,7 @@
   // Copies a DMAEdgeCounter to a HallEffectAndPosition with the correct unit
   // and direction changes.
   void CopyPosition(const ::frc971::wpilib::DMAEdgeCounter &counter,
-                    ::frc971::HallEffectAndPosition *position,
+                    ::frc971::HallEffectAndPositionT *position,
                     double encoder_counts_per_revolution, double encoder_ratio,
                     bool reverse) {
     const double multiplier = reverse ? -1.0 : 1.0;
@@ -129,7 +129,7 @@
   // and direction changes.
   void CopyPosition(
       const ::frc971::wpilib::AbsoluteEncoder &encoder,
-      ::frc971::AbsolutePosition *position,
+      ::frc971::AbsolutePositionT *position,
       double encoder_counts_per_revolution, double encoder_ratio,
       bool reverse) {
     const double multiplier = reverse ? -1.0 : 1.0;
@@ -146,7 +146,7 @@
 
   void CopyPosition(
       const ::frc971::wpilib::DMAEncoderAndPotentiometer &encoder,
-      ::frc971::PotAndIndexPosition *position,
+      ::frc971::PotAndIndexPositionT *position,
       ::std::function<double(int32_t)> encoder_translate,
       ::std::function<double(double)> potentiometer_translate, bool reverse,
       double pot_offset) {
diff --git a/frc971/wpilib/wpilib_interface.cc b/frc971/wpilib/wpilib_interface.cc
index 4216e3b..8772af1 100644
--- a/frc971/wpilib/wpilib_interface.cc
+++ b/frc971/wpilib/wpilib_interface.cc
@@ -1,30 +1,38 @@
 #include "frc971/wpilib/wpilib_interface.h"
 
-#include "aos/robot_state/robot_state.q.h"
+#include "aos/events/event_loop.h"
+#include "aos/logging/logging.h"
+#include "aos/robot_state/robot_state_generated.h"
 
 #include "hal/HAL.h"
 
 namespace frc971 {
 namespace wpilib {
 
-void PopulateRobotState(::aos::RobotState *robot_state, int32_t my_pid) {
+flatbuffers::Offset<aos::RobotState> PopulateRobotState(
+    aos::Sender<::aos::RobotState>::Builder *builder, int32_t my_pid) {
   int32_t status = 0;
 
-  robot_state->reader_pid = my_pid;
-  robot_state->outputs_enabled = HAL_GetSystemActive(&status);
-  robot_state->browned_out = HAL_GetBrownedOut(&status);
+  aos::RobotState::Builder robot_state_builder =
+      builder->MakeBuilder<aos::RobotState>();
 
-  robot_state->is_3v3_active = HAL_GetUserActive3V3(&status);
-  robot_state->is_5v_active = HAL_GetUserActive5V(&status);
-  robot_state->voltage_3v3 = HAL_GetUserVoltage3V3(&status);
-  robot_state->voltage_5v = HAL_GetUserVoltage5V(&status);
+  robot_state_builder.add_reader_pid(my_pid);
+  robot_state_builder.add_outputs_enabled(HAL_GetSystemActive(&status));
+  robot_state_builder.add_browned_out(HAL_GetBrownedOut(&status));
 
-  robot_state->voltage_roborio_in = HAL_GetVinVoltage(&status);
-  robot_state->voltage_battery = HAL_GetVinVoltage(&status);
+  robot_state_builder.add_is_3v3_active(HAL_GetUserActive3V3(&status));
+  robot_state_builder.add_is_5v_active(HAL_GetUserActive5V(&status));
+  robot_state_builder.add_voltage_3v3(HAL_GetUserVoltage3V3(&status));
+  robot_state_builder.add_voltage_5v(HAL_GetUserVoltage5V(&status));
+
+  robot_state_builder.add_voltage_roborio_in(HAL_GetVinVoltage(&status));
+  robot_state_builder.add_voltage_battery(HAL_GetVinVoltage(&status));
 
   if (status != 0) {
     AOS_LOG(FATAL, "Failed to get robot state: %d\n", status);
   }
+
+  return robot_state_builder.Finish();
 }
 
 }  // namespace wpilib
diff --git a/frc971/wpilib/wpilib_interface.h b/frc971/wpilib/wpilib_interface.h
index 5db852a..104ab84 100644
--- a/frc971/wpilib/wpilib_interface.h
+++ b/frc971/wpilib/wpilib_interface.h
@@ -3,13 +3,15 @@
 
 #include <stdint.h>
 
-#include "aos/robot_state/robot_state.q.h"
+#include "aos/events/event_loop.h"
+#include "aos/robot_state/robot_state_generated.h"
 
 namespace frc971 {
 namespace wpilib {
 
 // Sends out a message on ::aos::robot_state.
-void PopulateRobotState(::aos::RobotState *robot_state, int32_t my_pid);
+flatbuffers::Offset<aos::RobotState> PopulateRobotState(
+    aos::Sender<::aos::RobotState>::Builder *builder, int32_t my_pid);
 
 }  // namespace wpilib
 }  // namespace frc971
diff --git a/frc971/wpilib/wpilib_robot_base.h b/frc971/wpilib/wpilib_robot_base.h
index 86672c4..978c48e 100644
--- a/frc971/wpilib/wpilib_robot_base.h
+++ b/frc971/wpilib/wpilib_robot_base.h
@@ -1,8 +1,9 @@
 #ifndef FRC971_WPILIB_NEWROBOTBASE_H_
 #define FRC971_WPILIB_NEWROBOTBASE_H_
 
-#include "aos/events/shm-event-loop.h"
+#include "aos/events/shm_event_loop.h"
 #include "aos/init.h"
+#include "aos/logging/logging.h"
 #include "frc971/wpilib/ahal/RobotBase.h"
 
 namespace frc971 {