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/y2014_bot3/BUILD b/y2014_bot3/BUILD
index 25a6445..6d1f3fd 100644
--- a/y2014_bot3/BUILD
+++ b/y2014_bot3/BUILD
@@ -13,12 +13,9 @@
         "//aos/logging",
         "//aos/time",
         "//aos/util:log_interval",
-        "//frc971/autonomous:auto_queue",
         "//frc971/autonomous:base_autonomous_actor",
-        "//frc971/control_loops/drivetrain:drivetrain_queue",
-        "//frc971/queues:gyro",
         "//y2014_bot3/control_loops/drivetrain:drivetrain_base",
-        "//y2014_bot3/control_loops/rollers:rollers_queue",
+        "//y2014_bot3/control_loops/rollers:rollers_goal_fbs",
     ],
 )
 
@@ -43,21 +40,21 @@
         "//aos:make_unique",
         "//aos/controls:control_loop",
         "//aos/logging",
-        "//aos/logging:queue_logging",
-        "//aos/robot_state",
+        "//aos/robot_state:robot_state_fbs",
         "//aos/stl_mutex",
         "//aos/time",
         "//aos/util:log_interval",
         "//aos/util:phased_loop",
         "//aos/util:wrapping_counter",
-        "//frc971/control_loops:queues",
-        "//frc971/control_loops/drivetrain:drivetrain_queue",
+        "//frc971/control_loops:control_loops_fbs",
+        "//frc971/control_loops/drivetrain:drivetrain_output_fbs",
+        "//frc971/control_loops/drivetrain:drivetrain_position_fbs",
         "//frc971/wpilib:buffered_pcm",
         "//frc971/wpilib:dma",
         "//frc971/wpilib:drivetrain_writer",
         "//frc971/wpilib:gyro_sender",
         "//frc971/wpilib:joystick_sender",
-        "//frc971/wpilib:logging_queue",
+        "//frc971/wpilib:logging_fbs",
         "//frc971/wpilib:loop_output_handler",
         "//frc971/wpilib:pdp_fetcher",
         "//frc971/wpilib:sensor_reader",
diff --git a/y2014_bot3/actors/BUILD b/y2014_bot3/actors/BUILD
index ed6dfa1..ad60458 100644
--- a/y2014_bot3/actors/BUILD
+++ b/y2014_bot3/actors/BUILD
@@ -8,12 +8,11 @@
     ],
     deps = [
         "//aos/actions:action_lib",
-        "//aos/events:event-loop",
+        "//aos/events:event_loop",
         "//aos/logging",
         "//aos/util:phased_loop",
         "//frc971/autonomous:base_autonomous_actor",
         "//frc971/control_loops/drivetrain:drivetrain_config",
-        "//frc971/control_loops/drivetrain:drivetrain_queue",
         "//y2014_bot3/control_loops/drivetrain:drivetrain_base",
     ],
 )
@@ -27,7 +26,6 @@
     deps = [
         ":autonomous_action_lib",
         "//aos:init",
-        "//aos/events:shm-event-loop",
-        "//frc971/autonomous:auto_queue",
+        "//aos/events:shm_event_loop",
     ],
 )
diff --git a/y2014_bot3/actors/autonomous_actor.cc b/y2014_bot3/actors/autonomous_actor.cc
index ee67813..68064a5 100644
--- a/y2014_bot3/actors/autonomous_actor.cc
+++ b/y2014_bot3/actors/autonomous_actor.cc
@@ -4,23 +4,30 @@
 #include <chrono>
 #include <cmath>
 
-#include "aos/events/event-loop.h"
+#include "aos/events/event_loop.h"
 #include "aos/logging/logging.h"
 #include "aos/util/phased_loop.h"
-#include "frc971/control_loops/drivetrain/drivetrain.q.h"
 #include "y2014_bot3/control_loops/drivetrain/drivetrain_base.h"
 
 namespace y2014_bot3 {
 namespace actors {
-using ::frc971::ProfileParameters;
+using ::frc971::ProfileParametersT;
 
 using ::aos::monotonic_clock;
 namespace chrono = ::std::chrono;
 
 namespace {
 
-const ProfileParameters kDrive = {5.0, 2.5};
-const ProfileParameters kTurn = {8.0, 3.0};
+ProfileParametersT MakeProfileParameters(float max_velocity,
+                                         float max_acceleration) {
+  ProfileParametersT result;
+  result.max_velocity = max_velocity;
+  result.max_acceleration = max_acceleration;
+  return result;
+}
+
+const ProfileParametersT kDrive = MakeProfileParameters(5.0, 2.5);
+const ProfileParametersT kTurn = MakeProfileParameters(8.0, 3.0);
 
 }  // namespace
 
@@ -29,10 +36,10 @@
           event_loop, control_loops::drivetrain::GetDrivetrainConfig()) {}
 
 bool AutonomousActor::RunAction(
-    const ::frc971::autonomous::AutonomousActionParams &params) {
+    const ::frc971::autonomous::AutonomousActionParams *params) {
   const monotonic_clock::time_point start_time = monotonic_now();
   AOS_LOG(INFO, "Starting autonomous action with mode %" PRId32 "\n",
-          params.mode);
+          params->mode());
   Reset();
 
   StartDrive(1.0, 0.0, kDrive, kTurn);
diff --git a/y2014_bot3/actors/autonomous_actor.h b/y2014_bot3/actors/autonomous_actor.h
index d0e71da..e4dfe53 100644
--- a/y2014_bot3/actors/autonomous_actor.h
+++ b/y2014_bot3/actors/autonomous_actor.h
@@ -6,7 +6,7 @@
 
 #include "aos/actions/actions.h"
 #include "aos/actions/actor.h"
-#include "aos/events/event-loop.h"
+#include "aos/events/event_loop.h"
 #include "frc971/autonomous/base_autonomous_actor.h"
 
 namespace y2014_bot3 {
@@ -17,7 +17,7 @@
   explicit AutonomousActor(::aos::EventLoop *event_loop);
 
   bool RunAction(
-      const ::frc971::autonomous::AutonomousActionParams &params) override;
+      const ::frc971::autonomous::AutonomousActionParams *params) override;
 
  private:
   void Reset() {
diff --git a/y2014_bot3/actors/autonomous_actor_main.cc b/y2014_bot3/actors/autonomous_actor_main.cc
index 235b84a..9dfc422 100644
--- a/y2014_bot3/actors/autonomous_actor_main.cc
+++ b/y2014_bot3/actors/autonomous_actor_main.cc
@@ -1,14 +1,16 @@
 #include <stdio.h>
 
-#include "aos/events/shm-event-loop.h"
+#include "aos/events/shm_event_loop.h"
 #include "aos/init.h"
-#include "frc971/autonomous/auto.q.h"
 #include "y2014_bot3/actors/autonomous_actor.h"
 
 int main(int /*argc*/, char * /*argv*/ []) {
   ::aos::Init(-1);
 
-  ::aos::ShmEventLoop event_loop;
+  aos::FlatbufferDetachedBuffer<aos::Configuration> config =
+      aos::configuration::ReadConfig("config.json");
+
+  ::aos::ShmEventLoop event_loop(&config.message());
   ::y2014_bot3::actors::AutonomousActor autonomous(&event_loop);
 
   event_loop.Run();
diff --git a/y2014_bot3/control_loops/drivetrain/BUILD b/y2014_bot3/control_loops/drivetrain/BUILD
index 18e0e90..7060ac1 100644
--- a/y2014_bot3/control_loops/drivetrain/BUILD
+++ b/y2014_bot3/control_loops/drivetrain/BUILD
@@ -1,7 +1,5 @@
 package(default_visibility = ["//visibility:public"])
 
-load("//aos/build:queues.bzl", "queue_library")
-
 genrule(
     name = "genrule_drivetrain",
     outs = [
@@ -77,7 +75,7 @@
     deps = [
         ":drivetrain_base",
         "//aos:init",
-        "//aos/events:shm-event-loop",
+        "//aos/events:shm_event_loop",
         "//frc971/control_loops/drivetrain:drivetrain_lib",
     ],
 )
diff --git a/y2014_bot3/control_loops/drivetrain/drivetrain_main.cc b/y2014_bot3/control_loops/drivetrain/drivetrain_main.cc
index 48f09c5..05d09b3 100644
--- a/y2014_bot3/control_loops/drivetrain/drivetrain_main.cc
+++ b/y2014_bot3/control_loops/drivetrain/drivetrain_main.cc
@@ -1,6 +1,6 @@
 #include "aos/init.h"
 
-#include "aos/events/shm-event-loop.h"
+#include "aos/events/shm_event_loop.h"
 #include "frc971/control_loops/drivetrain/drivetrain.h"
 #include "y2014_bot3/control_loops/drivetrain/drivetrain_base.h"
 
@@ -9,7 +9,10 @@
 int main() {
   ::aos::InitNRT(true);
 
-  ::aos::ShmEventLoop event_loop;
+  aos::FlatbufferDetachedBuffer<aos::Configuration> config =
+      aos::configuration::ReadConfig("config.json");
+
+  ::aos::ShmEventLoop event_loop(&config.message());
   ::frc971::control_loops::drivetrain::DeadReckonEkf localizer(
       &event_loop,
       ::y2014_bot3::control_loops::drivetrain::GetDrivetrainConfig());
diff --git a/y2014_bot3/control_loops/rollers/BUILD b/y2014_bot3/control_loops/rollers/BUILD
index 9535489..e0d7dc6 100644
--- a/y2014_bot3/control_loops/rollers/BUILD
+++ b/y2014_bot3/control_loops/rollers/BUILD
@@ -1,16 +1,37 @@
 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 = "rollers_queue",
+flatbuffer_cc_library(
+    name = "rollers_goal_fbs",
     srcs = [
-        "rollers.q",
+        "rollers_goal.fbs",
     ],
-    deps = [
-        "//aos/controls:control_loop_queues",
-        "//frc971/control_loops:queues",
+    gen_reflections = 1,
+)
+
+flatbuffer_cc_library(
+    name = "rollers_position_fbs",
+    srcs = [
+        "rollers_position.fbs",
     ],
+    gen_reflections = 1,
+)
+
+flatbuffer_cc_library(
+    name = "rollers_output_fbs",
+    srcs = [
+        "rollers_output.fbs",
+    ],
+    gen_reflections = 1,
+)
+
+flatbuffer_cc_library(
+    name = "rollers_status_fbs",
+    srcs = [
+        "rollers_status.fbs",
+    ],
+    gen_reflections = 1,
 )
 
 cc_library(
@@ -22,7 +43,10 @@
         "rollers.h",
     ],
     deps = [
-        ":rollers_queue",
+        ":rollers_goal_fbs",
+        ":rollers_output_fbs",
+        ":rollers_position_fbs",
+        ":rollers_status_fbs",
         "//aos/controls:control_loop",
         "//aos/logging",
     ],
@@ -36,6 +60,6 @@
     deps = [
         ":rollers_lib",
         "//aos:init",
-        "//aos/events:shm-event-loop",
+        "//aos/events:shm_event_loop",
     ],
 )
diff --git a/y2014_bot3/control_loops/rollers/rollers.cc b/y2014_bot3/control_loops/rollers/rollers.cc
index d2b4da9..d62831a 100644
--- a/y2014_bot3/control_loops/rollers/rollers.cc
+++ b/y2014_bot3/control_loops/rollers/rollers.cc
@@ -1,46 +1,51 @@
 #include "y2014_bot3/control_loops/rollers/rollers.h"
 
 #include "aos/logging/logging.h"
+#include "y2014_bot3/control_loops/rollers/rollers_goal_generated.h"
+#include "y2014_bot3/control_loops/rollers/rollers_output_generated.h"
+#include "y2014_bot3/control_loops/rollers/rollers_position_generated.h"
+#include "y2014_bot3/control_loops/rollers/rollers_status_generated.h"
 
 namespace y2014_bot3 {
 namespace control_loops {
+namespace rollers {
 
 Rollers::Rollers(::aos::EventLoop *event_loop, const ::std::string &name)
-    : aos::controls::ControlLoop<control_loops::RollersQueue>(event_loop,
-                                                              name) {}
+    : aos::controls::ControlLoop<Goal, Position, Status, Output>(event_loop,
+                                                                 name) {}
 
-void Rollers::RunIteration(
-    const control_loops::RollersQueue::Goal *goal,
-    const control_loops::RollersQueue::Position * /*position*/,
-    control_loops::RollersQueue::Output *output,
-    control_loops::RollersQueue::Status * /*status*/) {
+void Rollers::RunIteration(const Goal *goal, const Position * /*position*/,
+                           aos::Sender<Output>::Builder *output,
+                           aos::Sender<Status>::Builder *status) {
   constexpr double k2014Bot3IntakeForwardVoltage = 12.0;
   constexpr double k2014Bot3IntakeBackwardVoltage = -12.0;
   constexpr double k2014Bot3LowGoalForwardVoltage = 6.0;
   constexpr double k2014Bot3LowGoalBackwardVoltage = -6.0;
 
+  status->Send(status->MakeBuilder<Status>().Finish());
+
   if (!output || !goal) {
     return;
   }
 
-  const int intake = goal->intake;
-  const int low_spit = goal->low_spit;
-  const bool human_player = goal->human_player;
+  const int intake = goal->intake();
+  const int low_spit = goal->low_spit();
+  const bool human_player = goal->human_player();
 
-  output->Zero();
+  OutputT output_struct;
 
   switch (low_spit) {
     case 1:
       // Spit towards front
-      output->low_goal_voltage = k2014Bot3LowGoalBackwardVoltage;
-      output->front_intake_voltage = k2014Bot3IntakeBackwardVoltage;
-      output->back_intake_voltage = -k2014Bot3IntakeForwardVoltage;
+      output_struct.low_goal_voltage = k2014Bot3LowGoalBackwardVoltage;
+      output_struct.front_intake_voltage = k2014Bot3IntakeBackwardVoltage;
+      output_struct.back_intake_voltage = -k2014Bot3IntakeForwardVoltage;
       break;
     case -1:
       // Spit towards back
-      output->low_goal_voltage = k2014Bot3LowGoalForwardVoltage;
-      output->back_intake_voltage = -k2014Bot3IntakeBackwardVoltage;
-      output->front_intake_voltage = k2014Bot3IntakeForwardVoltage;
+      output_struct.low_goal_voltage = k2014Bot3LowGoalForwardVoltage;
+      output_struct.back_intake_voltage = -k2014Bot3IntakeBackwardVoltage;
+      output_struct.front_intake_voltage = k2014Bot3IntakeForwardVoltage;
       break;
     default:
       // Stationary
@@ -50,17 +55,17 @@
   switch (intake) {
     case 1:
       // Front intake.
-      output->front_extended = true;
-      output->back_extended = false;
-      output->front_intake_voltage = k2014Bot3IntakeForwardVoltage;
-      output->back_intake_voltage = 0.0;
+      output_struct.front_extended = true;
+      output_struct.back_extended = false;
+      output_struct.front_intake_voltage = k2014Bot3IntakeForwardVoltage;
+      output_struct.back_intake_voltage = 0.0;
       break;
     case -1:
       // Back intake.
-      output->back_extended = true;
-      output->front_extended = false;
-      output->back_intake_voltage = -k2014Bot3IntakeForwardVoltage;
-      output->front_intake_voltage = 0.0;
+      output_struct.back_extended = true;
+      output_struct.front_extended = false;
+      output_struct.back_intake_voltage = -k2014Bot3IntakeForwardVoltage;
+      output_struct.front_intake_voltage = 0.0;
       break;
     default:
       // Stationary
@@ -69,12 +74,15 @@
 
   if (human_player) {
     // Intake for human player.
-    output->front_extended = false;
-    output->back_extended = false;
-    output->front_intake_voltage = k2014Bot3IntakeForwardVoltage;
-    output->back_intake_voltage = -k2014Bot3IntakeForwardVoltage;
+    output_struct.front_extended = false;
+    output_struct.back_extended = false;
+    output_struct.front_intake_voltage = k2014Bot3IntakeForwardVoltage;
+    output_struct.back_intake_voltage = -k2014Bot3IntakeForwardVoltage;
   }
+
+  output->Send(Output::Pack(*output->fbb(), &output_struct));
 }
 
+}  //  namespace rollers
 }  //  namespace control_loops
 }  //  namespace y2014_bot3
diff --git a/y2014_bot3/control_loops/rollers/rollers.h b/y2014_bot3/control_loops/rollers/rollers.h
index 9890871..8903cd2 100644
--- a/y2014_bot3/control_loops/rollers/rollers.h
+++ b/y2014_bot3/control_loops/rollers/rollers.h
@@ -3,27 +3,31 @@
 
 #include "aos/controls/control_loop.h"
 
-#include "y2014_bot3/control_loops/rollers/rollers.q.h"
+#include "y2014_bot3/control_loops/rollers/rollers_goal_generated.h"
+#include "y2014_bot3/control_loops/rollers/rollers_output_generated.h"
+#include "y2014_bot3/control_loops/rollers/rollers_position_generated.h"
+#include "y2014_bot3/control_loops/rollers/rollers_status_generated.h"
 
 namespace y2014_bot3 {
 namespace control_loops {
+namespace rollers {
 
-class Rollers : public aos::controls::ControlLoop<control_loops::RollersQueue> {
+class Rollers
+    : public aos::controls::ControlLoop<Goal, Position, Status, Output> {
  public:
   // Constructs a control loops which can take a rollers or defaults to the
   // rollers at ::2014_bot3::control_loops::rollers.
-  explicit Rollers(
-      ::aos::EventLoop *event_loop,
-      const ::std::string &name = ".y2014_bot3.control_loops.rollers_queue");
+  explicit Rollers(::aos::EventLoop *event_loop,
+                   const ::std::string &name = "/rollers");
 
  protected:
   // Executes one cycle of the control loop.
-  void RunIteration(const control_loops::RollersQueue::Goal *goal,
-                    const control_loops::RollersQueue::Position *position,
-                    control_loops::RollersQueue::Output *output,
-                    control_loops::RollersQueue::Status *status) override;
+  void RunIteration(const Goal *goal, const Position *position,
+                    aos::Sender<Output>::Builder *output,
+                    aos::Sender<Status>::Builder *status) override;
 };
 
+}  // namespace rollers
 }  // namespace control_loops
 }  // namespace y2014_bot3
 
diff --git a/y2014_bot3/control_loops/rollers/rollers.q b/y2014_bot3/control_loops/rollers/rollers.q
deleted file mode 100644
index 1e40369..0000000
--- a/y2014_bot3/control_loops/rollers/rollers.q
+++ /dev/null
@@ -1,40 +0,0 @@
-package y2014_bot3.control_loops;
-
-import "aos/controls/control_loops.q";
-import "frc971/control_loops/control_loops.q";
-
-// on ".y2014_bot3.control_loops.rollers_queue"
-queue_group RollersQueue {
-  implements aos.control_loops.ControlLoop;
-
-  message Goal {
-    // -1 = back intake, 1 = front intake, all else = stationary.
-    int16_t intake;
-    // -1 = backwards, 1 = forwards, all else = stationary.
-    int16_t low_spit;
-    // Whether we want the human player load function.
-    bool human_player;
-  };
-
-  message Position {};
-
-  message Output {
-    // Positive voltage = intaking, Negative = spitting.
-    double front_intake_voltage;
-    double back_intake_voltage;
-    // Voltage for the low goal rollers.
-    // Positive voltage = ball towards back, Negative = ball towards front.
-    double low_goal_voltage;
-
-    // Whether the front and back intake pistons are extended.
-    bool front_extended;
-    bool back_extended;
-  };
-
-  message Status {};
-
-  queue Goal goal;
-  queue Position position;
-  queue Output output;
-  queue Status status;
-};
diff --git a/y2014_bot3/control_loops/rollers/rollers_goal.fbs b/y2014_bot3/control_loops/rollers/rollers_goal.fbs
new file mode 100644
index 0000000..92ee589
--- /dev/null
+++ b/y2014_bot3/control_loops/rollers/rollers_goal.fbs
@@ -0,0 +1,12 @@
+namespace y2014_bot3.control_loops.rollers;
+
+table Goal {
+  // -1 = back intake, 1 = front intake, all else = stationary.
+  intake:int;
+  // -1 = backwards, 1 = forwards, all else = stationary.
+  low_spit:int;
+  // Whether we want the human player load function.
+  human_player:bool;
+}
+
+root_type Goal;
diff --git a/y2014_bot3/control_loops/rollers/rollers_main.cc b/y2014_bot3/control_loops/rollers/rollers_main.cc
index 1a0d82b..906c067 100644
--- a/y2014_bot3/control_loops/rollers/rollers_main.cc
+++ b/y2014_bot3/control_loops/rollers/rollers_main.cc
@@ -1,13 +1,16 @@
 #include "y2014_bot3/control_loops/rollers/rollers.h"
 
-#include "aos/events/shm-event-loop.h"
+#include "aos/events/shm_event_loop.h"
 #include "aos/init.h"
 
 int main() {
   ::aos::InitNRT(true);
 
-  ::aos::ShmEventLoop event_loop;
-  ::y2014_bot3::control_loops::Rollers rollers(&event_loop);
+  aos::FlatbufferDetachedBuffer<aos::Configuration> config =
+      aos::configuration::ReadConfig("config.json");
+
+  ::aos::ShmEventLoop event_loop(&config.message());
+  ::y2014_bot3::control_loops::rollers::Rollers rollers(&event_loop);
 
   event_loop.Run();
 
diff --git a/y2014_bot3/control_loops/rollers/rollers_output.fbs b/y2014_bot3/control_loops/rollers/rollers_output.fbs
new file mode 100644
index 0000000..daae09b
--- /dev/null
+++ b/y2014_bot3/control_loops/rollers/rollers_output.fbs
@@ -0,0 +1,16 @@
+namespace y2014_bot3.control_loops.rollers;
+
+table Output {
+  // Positive voltage = intaking, Negative = spitting.
+  front_intake_voltage:double;
+  back_intake_voltage:double;
+  // Voltage for the low goal rollers.
+  // Positive voltage = ball towards back, Negative = ball towards front.
+  low_goal_voltage:double;
+
+  // Whether the front and back intake pistons are extended.
+  front_extended:bool;
+  back_extended:bool;
+}
+
+root_type Output;
diff --git a/y2014_bot3/control_loops/rollers/rollers_position.fbs b/y2014_bot3/control_loops/rollers/rollers_position.fbs
new file mode 100644
index 0000000..040502c
--- /dev/null
+++ b/y2014_bot3/control_loops/rollers/rollers_position.fbs
@@ -0,0 +1,6 @@
+namespace y2014_bot3.control_loops.rollers;
+
+table Position {
+}
+
+root_type Position;
diff --git a/y2014_bot3/control_loops/rollers/rollers_status.fbs b/y2014_bot3/control_loops/rollers/rollers_status.fbs
new file mode 100644
index 0000000..2486bb7
--- /dev/null
+++ b/y2014_bot3/control_loops/rollers/rollers_status.fbs
@@ -0,0 +1,6 @@
+namespace y2014_bot3.control_loops.rollers;
+
+table Status {
+}
+
+root_type Status;
diff --git a/y2014_bot3/joystick_reader.cc b/y2014_bot3/joystick_reader.cc
index dc43f30..47546a7 100644
--- a/y2014_bot3/joystick_reader.cc
+++ b/y2014_bot3/joystick_reader.cc
@@ -11,12 +11,10 @@
 #include "aos/time/time.h"
 
 #include "aos/input/drivetrain_input.h"
-#include "frc971/autonomous/auto.q.h"
 #include "frc971/autonomous/base_autonomous_actor.h"
-#include "frc971/control_loops/drivetrain/drivetrain.q.h"
-#include "frc971/queues/gyro.q.h"
+#include "frc971/control_loops/drivetrain/drivetrain_goal_generated.h"
 #include "y2014_bot3/control_loops/drivetrain/drivetrain_base.h"
-#include "y2014_bot3/control_loops/rollers/rollers.q.h"
+#include "y2014_bot3/control_loops/rollers/rollers_goal_generated.h"
 
 using ::aos::input::driver_station::ButtonLocation;
 using ::aos::input::driver_station::POVLocation;
@@ -47,9 +45,8 @@
   Reader(::aos::EventLoop *event_loop)
       : ::aos::input::JoystickInput(event_loop),
         rollers_goal_sender_(
-            event_loop
-                ->MakeSender<::y2014_bot3::control_loops::RollersQueue::Goal>(
-                    ".y2014_bot3.control_loops.rollers_queue.goal")),
+            event_loop->MakeSender<::y2014_bot3::control_loops::rollers::Goal>(
+                "/rollers")),
         autonomous_action_factory_(
             ::frc971::autonomous::BaseAutonomousActor::MakeFactory(
                 event_loop)) {
@@ -89,20 +86,21 @@
     }
 
     // Rollers.
-    auto rollers_goal = rollers_goal_sender_.MakeMessage();
-    rollers_goal->Zero();
+    auto builder = rollers_goal_sender_.MakeBuilder();
+    control_loops::rollers::GoalT rollers_goal;
     if (data.IsPressed(kFrontRollersIn)) {
-      rollers_goal->intake = 1;
+      rollers_goal.intake = 1;
     } else if (data.IsPressed(kFrontRollersOut)) {
-      rollers_goal->low_spit = 1;
+      rollers_goal.low_spit = 1;
     } else if (data.IsPressed(kBackRollersIn)) {
-      rollers_goal->intake = -1;
+      rollers_goal.intake = -1;
     } else if (data.IsPressed(kBackRollersOut)) {
-      rollers_goal->low_spit = -1;
+      rollers_goal.low_spit = -1;
     } else if (data.IsPressed(kHumanPlayer)) {
-      rollers_goal->human_player = true;
+      rollers_goal.human_player = true;
     }
-    if (!rollers_goal.Send()) {
+    if (!builder.Send(control_loops::rollers::Goal::Pack(*builder.fbb(),
+                                                         &rollers_goal))) {
       AOS_LOG(WARNING, "Sending rollers values failed.\n");
     }
   }
@@ -110,7 +108,7 @@
  private:
   void StartAuto() {
     AOS_LOG(INFO, "Starting auto mode.\n");
-    ::frc971::autonomous::AutonomousActionParams params;
+    ::frc971::autonomous::AutonomousActionParamsT params;
     params.mode = 0;
     action_queue_.EnqueueAction(autonomous_action_factory_.Make(params));
   }
@@ -129,7 +127,7 @@
   ::aos::common::actions::ActionQueue action_queue_;
 
   ::std::unique_ptr<DrivetrainInputReader> drivetrain_input_reader_;
-  ::aos::Sender<::y2014_bot3::control_loops::RollersQueue::Goal>
+  ::aos::Sender<::y2014_bot3::control_loops::rollers::Goal>
       rollers_goal_sender_;
 
   ::frc971::autonomous::BaseAutonomousActor::Factory autonomous_action_factory_;
@@ -142,7 +140,10 @@
 int main() {
   ::aos::InitNRT(true);
 
-  ::aos::ShmEventLoop event_loop;
+  aos::FlatbufferDetachedBuffer<aos::Configuration> config =
+      aos::configuration::ReadConfig("config.json");
+
+  ::aos::ShmEventLoop event_loop(&config.message());
   ::y2014_bot3::input::joysticks::Reader reader(&event_loop);
 
   event_loop.Run();
diff --git a/y2014_bot3/wpilib_interface.cc b/y2014_bot3/wpilib_interface.cc
index 9b1d4e8..89b3ad1 100644
--- a/y2014_bot3/wpilib_interface.cc
+++ b/y2014_bot3/wpilib_interface.cc
@@ -18,31 +18,32 @@
 #include "frc971/wpilib/wpilib_robot_base.h"
 #undef ERROR
 
-#include "aos/events/shm-event-loop.h"
+#include "aos/events/shm_event_loop.h"
 #include "aos/init.h"
 #include "aos/logging/logging.h"
-#include "aos/logging/queue_logging.h"
 #include "aos/make_unique.h"
-#include "aos/robot_state/robot_state.q.h"
+#include "aos/robot_state/robot_state_generated.h"
 #include "aos/stl_mutex/stl_mutex.h"
 #include "aos/time/time.h"
 #include "aos/util/log_interval.h"
 #include "aos/util/phased_loop.h"
 #include "aos/util/wrapping_counter.h"
-#include "frc971/control_loops/drivetrain/drivetrain.q.h"
+#include "frc971/control_loops/drivetrain/drivetrain_output_generated.h"
+#include "frc971/control_loops/drivetrain/drivetrain_position_generated.h"
 #include "frc971/wpilib/buffered_pcm.h"
 #include "frc971/wpilib/buffered_solenoid.h"
 #include "frc971/wpilib/dma.h"
 #include "frc971/wpilib/drivetrain_writer.h"
 #include "frc971/wpilib/gyro_sender.h"
 #include "frc971/wpilib/joystick_sender.h"
-#include "frc971/wpilib/logging.q.h"
+#include "frc971/wpilib/logging_generated.h"
 #include "frc971/wpilib/loop_output_handler.h"
 #include "frc971/wpilib/pdp_fetcher.h"
 #include "frc971/wpilib/sensor_reader.h"
 #include "y2014_bot3/control_loops/drivetrain/drivetrain_base.h"
 #include "y2014_bot3/control_loops/rollers/rollers.h"
-#include "y2014_bot3/control_loops/rollers/rollers.q.h"
+#include "y2014_bot3/control_loops/rollers/rollers_output_generated.h"
+#include "y2014_bot3/control_loops/rollers/rollers_position_generated.h"
 
 #ifndef M_PI
 #define M_PI 3.14159265358979323846
@@ -77,41 +78,45 @@
   SensorReader(::aos::EventLoop *event_loop)
       : ::frc971::wpilib::SensorReader(event_loop),
         rollers_position_sender_(
-            event_loop->MakeSender<
-                ::y2014_bot3::control_loops::RollersQueue::Position>(
-                ".y2014_bot3.control_loops.rollers_queue.position")),
+            event_loop
+                ->MakeSender<::y2014_bot3::control_loops::rollers::Position>(
+                    "/rollers")),
         drivetrain_position_sender_(
-            event_loop->MakeSender<
-                ::frc971::control_loops::DrivetrainQueue::Position>(
-                ".frc971.control_loops.drivetrain_queue.position")) {}
+            event_loop
+                ->MakeSender<::frc971::control_loops::drivetrain::Position>(
+                    "/drivetrain")) {}
 
   void RunIteration() {
     // Drivetrain
     {
-      auto drivetrain_message = drivetrain_position_sender_.MakeMessage();
-      drivetrain_message->right_encoder =
-          -drivetrain_translate(drivetrain_right_encoder_->GetRaw());
-      drivetrain_message->left_encoder =
-          drivetrain_translate(drivetrain_left_encoder_->GetRaw());
-      drivetrain_message->left_speed =
-          drivetrain_velocity_translate(drivetrain_left_encoder_->GetPeriod());
-      drivetrain_message->right_speed =
-          drivetrain_velocity_translate(drivetrain_right_encoder_->GetPeriod());
+      auto builder = drivetrain_position_sender_.MakeBuilder();
 
-      drivetrain_message.Send();
+      frc971::control_loops::drivetrain::Position::Builder position_builder =
+          builder.MakeBuilder<frc971::control_loops::drivetrain::Position>();
+      position_builder.add_right_encoder(
+          -drivetrain_translate(drivetrain_right_encoder_->GetRaw()));
+      position_builder.add_left_encoder(
+          drivetrain_translate(drivetrain_left_encoder_->GetRaw()));
+      position_builder.add_left_speed(
+          drivetrain_velocity_translate(drivetrain_left_encoder_->GetPeriod()));
+      position_builder.add_right_speed(drivetrain_velocity_translate(
+          drivetrain_right_encoder_->GetPeriod()));
+
+      builder.Send(position_builder.Finish());
     }
 
     // Rollers
     {
-      auto rollers_message = rollers_position_sender_.MakeMessage();
-      rollers_message.Send();
+      auto builder = rollers_position_sender_.MakeBuilder();
+      builder.Send(
+          builder.MakeBuilder<control_loops::rollers::Position>().Finish());
     }
   }
 
  private:
-  ::aos::Sender<::y2014_bot3::control_loops::RollersQueue::Position>
+  ::aos::Sender<::y2014_bot3::control_loops::rollers::Position>
       rollers_position_sender_;
-  ::aos::Sender<::frc971::control_loops::DrivetrainQueue::Position>
+  ::aos::Sender<::frc971::control_loops::drivetrain::Position>
       drivetrain_position_sender_;
 };
 
@@ -123,11 +128,14 @@
       : pcm_(pcm),
         drivetrain_(
             event_loop
-                ->MakeFetcher<::frc971::control_loops::DrivetrainQueue::Output>(
-                    ".frc971.control_loops.drivetrain_queue.output")),
-        rollers_(event_loop->MakeFetcher<
-                 ::y2014_bot3::control_loops::RollersQueue::Output>(
-            ".y2014_bot3.control_loops.rollers_queue.output")) {
+                ->MakeFetcher<::frc971::control_loops::drivetrain::Output>(
+                    "/drivetrain")),
+        rollers_(
+            event_loop
+                ->MakeFetcher<::y2014_bot3::control_loops::rollers::Output>(
+                    "/rollers")),
+        pneumatics_to_log_sender_(
+            event_loop->MakeSender<::frc971::wpilib::PneumaticsToLog>("/aos")) {
     event_loop->set_name("Solenoids");
     event_loop->SetRuntimeRealtimePriority(27);
 
@@ -170,9 +178,8 @@
     {
       drivetrain_.Fetch();
       if (drivetrain_.get()) {
-        AOS_LOG_STRUCT(DEBUG, "solenoids", *drivetrain_);
-        drivetrain_left_->Set(drivetrain_->left_high);
-        drivetrain_right_->Set(drivetrain_->right_high);
+        drivetrain_left_->Set(drivetrain_->left_high());
+        drivetrain_right_->Set(drivetrain_->right_high());
       }
     }
 
@@ -180,19 +187,22 @@
     {
       rollers_.Fetch();
       if (rollers_.get()) {
-        AOS_LOG_STRUCT(DEBUG, "solenoids", *rollers_);
-        rollers_front_->Set(rollers_->front_extended);
-        rollers_back_->Set(rollers_->back_extended);
+        rollers_front_->Set(rollers_->front_extended());
+        rollers_back_->Set(rollers_->back_extended());
       }
     }
 
     // Compressor
     {
-      ::frc971::wpilib::PneumaticsToLog to_log;
+      auto builder = pneumatics_to_log_sender_.MakeBuilder();
+
+      ::frc971::wpilib::PneumaticsToLog::Builder to_log_builder =
+          builder.MakeBuilder<frc971::wpilib::PneumaticsToLog>();
+
       {
         // Refill if pneumatic pressure goes too low.
         const bool compressor_on = !pressure_switch_->Get();
-        to_log.compressor_on = compressor_on;
+        to_log_builder.add_compressor_on(compressor_on);
         if (compressor_on) {
           compressor_relay_->Set(::frc::Relay::kForward);
         } else {
@@ -201,8 +211,8 @@
       }
 
       pcm_->Flush();
-      to_log.read_solenoids = pcm_->GetAll();
-      AOS_LOG_STRUCT(DEBUG, "pneumatics info", to_log);
+      to_log_builder.add_read_solenoids(pcm_->GetAll());
+      builder.Send(to_log_builder.Finish());
     }
   }
 
@@ -215,18 +225,19 @@
   ::std::unique_ptr<::frc::DigitalInput> pressure_switch_;
   ::std::unique_ptr<::frc::Relay> compressor_relay_;
 
-  ::aos::Fetcher<::frc971::control_loops::DrivetrainQueue::Output> drivetrain_;
-  ::aos::Fetcher<::y2014_bot3::control_loops::RollersQueue::Output> rollers_;
+  ::aos::Fetcher<::frc971::control_loops::drivetrain::Output> drivetrain_;
+  ::aos::Fetcher<::y2014_bot3::control_loops::rollers::Output> rollers_;
+  aos::Sender<::frc971::wpilib::PneumaticsToLog> pneumatics_to_log_sender_;
 };
 
 // Writes out rollers voltages.
 class RollersWriter : public LoopOutputHandler<
-                          ::y2014_bot3::control_loops::RollersQueue::Output> {
+                          ::y2014_bot3::control_loops::rollers::Output> {
  public:
   RollersWriter(::aos::EventLoop *event_loop)
       : ::frc971::wpilib::LoopOutputHandler<
-            ::y2014_bot3::control_loops::RollersQueue::Output>(
-            event_loop, ".y2014_bot3.control_loops.rollers_queue.output") {}
+            ::y2014_bot3::control_loops::rollers::Output>(event_loop,
+                                                          "/rollers") {}
 
   void set_rollers_front_intake_talon(::std::unique_ptr<::frc::Talon> t_left,
                                       ::std::unique_ptr<::frc::Talon> t_right) {
@@ -245,18 +256,17 @@
   }
 
  private:
-  virtual void Write(const ::y2014_bot3::control_loops::RollersQueue::Output
+  virtual void Write(const ::y2014_bot3::control_loops::rollers::Output
                          &output) override {
-    AOS_LOG_STRUCT(DEBUG, "will output", output);
-    rollers_front_left_intake_talon_->SetSpeed(output.front_intake_voltage /
+    rollers_front_left_intake_talon_->SetSpeed(output.front_intake_voltage() /
                                                12.0);
     rollers_front_right_intake_talon_->SetSpeed(
-        -(output.front_intake_voltage / 12.0));
-    rollers_back_left_intake_talon_->SetSpeed(output.back_intake_voltage /
+        -(output.front_intake_voltage() / 12.0));
+    rollers_back_left_intake_talon_->SetSpeed(output.back_intake_voltage() /
                                               12.0);
     rollers_back_right_intake_talon_->SetSpeed(
-        -(output.back_intake_voltage / 12.0));
-    rollers_low_goal_talon_->SetSpeed(output.low_goal_voltage / 12.0);
+        -(output.back_intake_voltage() / 12.0));
+    rollers_low_goal_talon_->SetSpeed(output.low_goal_voltage() / 12.0);
   }
 
   virtual void Stop() override {
@@ -280,33 +290,36 @@
                                        ::frc::Encoder::k4X);
   }
   void Run() override {
+    aos::FlatbufferDetachedBuffer<aos::Configuration> config =
+        aos::configuration::ReadConfig("config.json");
+
     // Thread 1.
-    ::aos::ShmEventLoop joystick_sender_event_loop;
+    ::aos::ShmEventLoop joystick_sender_event_loop(&config.message());
     ::frc971::wpilib::JoystickSender joystick_sender(
         &joystick_sender_event_loop);
     AddLoop(&joystick_sender_event_loop);
 
     // Thread 2.
-    ::aos::ShmEventLoop pdp_fetcher_event_loop;
+    ::aos::ShmEventLoop pdp_fetcher_event_loop(&config.message());
     ::frc971::wpilib::PDPFetcher pdp_fetcher(&pdp_fetcher_event_loop);
     AddLoop(&pdp_fetcher_event_loop);
 
     // Thread 3.
     // Sensors
-    ::aos::ShmEventLoop sensor_reader_event_loop;
+    ::aos::ShmEventLoop sensor_reader_event_loop(&config.message());
     SensorReader sensor_reader(&sensor_reader_event_loop);
     sensor_reader.set_drivetrain_left_encoder(make_encoder(4));
     sensor_reader.set_drivetrain_right_encoder(make_encoder(5));
     AddLoop(&sensor_reader_event_loop);
 
     // Thread 4.
-    ::aos::ShmEventLoop gyro_event_loop;
+    ::aos::ShmEventLoop gyro_event_loop(&config.message());
     GyroSender gyro_sender(&gyro_event_loop);
     AddLoop(&gyro_event_loop);
 
     // Thread 5.
     // Outputs
-    ::aos::ShmEventLoop output_event_loop;
+    ::aos::ShmEventLoop output_event_loop(&config.message());
     ::frc971::wpilib::DrivetrainWriter drivetrain_writer(&output_event_loop);
     drivetrain_writer.set_left_controller0(
         ::std::unique_ptr<::frc::Talon>(new ::frc::Talon(5)), true);
@@ -326,7 +339,7 @@
     AddLoop(&output_event_loop);
 
     // Thread 6.
-    ::aos::ShmEventLoop solenoid_writer_event_loop;
+    ::aos::ShmEventLoop solenoid_writer_event_loop(&config.message());
     ::std::unique_ptr<::frc971::wpilib::BufferedPcm> pcm(
         new ::frc971::wpilib::BufferedPcm());
     SolenoidWriter solenoid_writer(&solenoid_writer_event_loop, pcm);