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/y2019/joystick_reader.cc b/y2019/joystick_reader.cc
index 9450b13..da43495 100644
--- a/y2019/joystick_reader.cc
+++ b/y2019/joystick_reader.cc
@@ -11,27 +11,30 @@
 #include "aos/input/drivetrain_input.h"
 #include "aos/input/joystick_input.h"
 #include "aos/logging/logging.h"
-#include "aos/logging/logging.h"
 #include "aos/network/team_number.h"
 #include "aos/util/log_interval.h"
 #include "aos/vision/events/udp.h"
 #include "external/com_google_protobuf/src/google/protobuf/stubs/stringprintf.h"
-#include "frc971/autonomous/auto.q.h"
 #include "frc971/autonomous/base_autonomous_actor.h"
-#include "frc971/control_loops/drivetrain/drivetrain.q.h"
-#include "frc971/control_loops/drivetrain/localizer.q.h"
+#include "frc971/control_loops/drivetrain/localizer_generated.h"
 
 #include "y2019/control_loops/drivetrain/drivetrain_base.h"
-#include "y2019/control_loops/drivetrain/target_selector.q.h"
-#include "y2019/control_loops/superstructure/superstructure.q.h"
-#include "y2019/status_light.q.h"
+#include "y2019/control_loops/drivetrain/target_selector_generated.h"
+#include "y2019/control_loops/superstructure/superstructure_goal_generated.h"
+#include "y2019/control_loops/superstructure/superstructure_position_generated.h"
+#include "y2019/control_loops/superstructure/superstructure_status_generated.h"
+#include "y2019/status_light_generated.h"
 #include "y2019/vision.pb.h"
 
-using ::aos::input::driver_station::ButtonLocation;
-using ::aos::input::driver_station::ControlBit;
-using ::aos::input::driver_station::JoystickAxis;
-using ::aos::input::driver_station::POVLocation;
-using ::aos::events::ProtoTXUdpSocket;
+using aos::events::ProtoTXUdpSocket;
+using aos::input::driver_station::ButtonLocation;
+using aos::input::driver_station::ControlBit;
+using aos::input::driver_station::JoystickAxis;
+using aos::input::driver_station::POVLocation;
+using frc971::CreateProfileParameters;
+using frc971::control_loops::CreateStaticZeroingSingleDOFProfiledSubsystemGoal;
+using frc971::control_loops::StaticZeroingSingleDOFProfiledSubsystemGoal;
+using frc971::control_loops::drivetrain::LocalizerControl;
 
 namespace chrono = ::std::chrono;
 
@@ -39,6 +42,8 @@
 namespace input {
 namespace joysticks {
 
+namespace superstructure = y2019::control_loops::superstructure;
+
 using google::protobuf::StringPrintf;
 
 struct ElevatorWristPosition {
@@ -143,36 +148,31 @@
         target_selector_hint_sender_(
             event_loop->MakeSender<
                 ::y2019::control_loops::drivetrain::TargetSelectorHint>(
-                ".y2019.control_loops.drivetrain.target_selector_hint")),
+                "/drivetrain")),
         localizer_control_sender_(
-            event_loop->MakeSender<
-                ::frc971::control_loops::drivetrain::LocalizerControl>(
-                ".frc971.control_loops.drivetrain.localizer_control")),
+            event_loop->MakeSender<LocalizerControl>("/drivetrain")),
         camera_log_sender_(
-            event_loop->MakeSender<::y2019::CameraLog>(".y2019.camera_log")),
-        superstructure_goal_fetcher_(event_loop->MakeFetcher<
-                                     ::y2019::control_loops::superstructure::
-                                         SuperstructureQueue::Goal>(
-            ".y2019.control_loops.superstructure.superstructure_queue.goal")),
-        superstructure_goal_sender_(event_loop->MakeSender<
-                                    ::y2019::control_loops::superstructure::
-                                        SuperstructureQueue::Goal>(
-            ".y2019.control_loops.superstructure.superstructure_queue.goal")),
+            event_loop->MakeSender<::y2019::CameraLog>("/camera")),
+        superstructure_goal_fetcher_(
+            event_loop->MakeFetcher<superstructure::Goal>("/superstructure")),
+        superstructure_goal_sender_(
+            event_loop->MakeSender<superstructure::Goal>("/superstructure")),
         superstructure_position_fetcher_(
-            event_loop->MakeFetcher<::y2019::control_loops::superstructure::
-                                        SuperstructureQueue::Position>(
-                ".y2019.control_loops.superstructure.superstructure_queue."
-                "position")),
+            event_loop->MakeFetcher<superstructure::Position>(
+                "/superstructure")),
         superstructure_status_fetcher_(
-            event_loop->MakeFetcher<::y2019::control_loops::superstructure::
-                                        SuperstructureQueue::Status>(
-                ".y2019.control_loops.superstructure.superstructure_queue."
-                "status")) {
+            event_loop->MakeFetcher<superstructure::Status>(
+                "/superstructure")) {
     const uint16_t team = ::aos::network::GetTeamNumber();
     superstructure_goal_fetcher_.Fetch();
     if (superstructure_goal_fetcher_.get()) {
-      grab_piece_ = superstructure_goal_fetcher_->suction.grab_piece;
-      switch_ball_ = superstructure_goal_fetcher_->suction.gamepiece_mode == 0;
+      grab_piece_ = superstructure_goal_fetcher_->has_suction()
+                        ? superstructure_goal_fetcher_->suction()->grab_piece()
+                        : false;
+      switch_ball_ =
+          superstructure_goal_fetcher_->has_suction()
+              ? (superstructure_goal_fetcher_->suction()->gamepiece_mode() == 0)
+              : true;
     }
     video_tx_.reset(new ProtoTXUdpSocket<VisionControl>(
         StringPrintf("10.%d.%d.179", team / 100, team % 100), 5000));
@@ -195,106 +195,172 @@
       return;
     }
 
-    if (!superstructure_status_fetcher_->has_piece) {
+    CHECK(superstructure_status_fetcher_->has_stilts());
+
+    if (!superstructure_status_fetcher_->has_piece()) {
       last_not_has_piece_ = monotonic_now;
     }
 
-    auto new_superstructure_goal = superstructure_goal_sender_.MakeMessage();
+    auto main_superstructure_goal_builder =
+        superstructure_goal_sender_.MakeBuilder();
+
+    flatbuffers::Offset<superstructure::Goal> superstructure_goal_offset;
 
     {
-      auto target_hint = target_selector_hint_sender_.MakeMessage();
+      flatbuffers::Offset<StaticZeroingSingleDOFProfiledSubsystemGoal>
+          elevator_offset = CreateStaticZeroingSingleDOFProfiledSubsystemGoal(
+              *main_superstructure_goal_builder.fbb(), 0.0,
+              CreateProfileParameters(*main_superstructure_goal_builder.fbb(),
+                                      0.0, 0.0));
+
+      flatbuffers::Offset<StaticZeroingSingleDOFProfiledSubsystemGoal>
+          intake_offset = CreateStaticZeroingSingleDOFProfiledSubsystemGoal(
+              *main_superstructure_goal_builder.fbb(), -1.2);
+
+      flatbuffers::Offset<StaticZeroingSingleDOFProfiledSubsystemGoal>
+          wrist_offset = CreateStaticZeroingSingleDOFProfiledSubsystemGoal(
+              *main_superstructure_goal_builder.fbb(), 0.0,
+              CreateProfileParameters(*main_superstructure_goal_builder.fbb(),
+                                      0.0, 0.0));
+
+      flatbuffers::Offset<StaticZeroingSingleDOFProfiledSubsystemGoal>
+          stilts_offset = CreateStaticZeroingSingleDOFProfiledSubsystemGoal(
+              *main_superstructure_goal_builder.fbb(), 0.0,
+              CreateProfileParameters(*main_superstructure_goal_builder.fbb(),
+                                      0.0, 0.0));
+
+      superstructure::Goal::Builder superstructure_goal_builder =
+          main_superstructure_goal_builder.MakeBuilder<superstructure::Goal>();
+
+      superstructure_goal_builder.add_elevator(elevator_offset);
+      superstructure_goal_builder.add_intake(intake_offset);
+      superstructure_goal_builder.add_wrist(wrist_offset);
+      superstructure_goal_builder.add_stilts(stilts_offset);
+      superstructure_goal_builder.add_roller_voltage(0.0);
+
+      superstructure_goal_offset = superstructure_goal_builder.Finish();
+    }
+    superstructure::Goal *mutable_superstructure_goal =
+        GetMutableTemporaryPointer(*main_superstructure_goal_builder.fbb(),
+                                   superstructure_goal_offset);
+
+    {
+      auto builder = target_selector_hint_sender_.MakeBuilder();
+      control_loops::drivetrain::TargetSelectorHint::Builder
+          target_selector_hint_builder =
+              builder
+                  .MakeBuilder<control_loops::drivetrain::TargetSelectorHint>();
       if (data.IsPressed(kNearCargoHint)) {
-        target_hint->suggested_target = 1;
+        target_selector_hint_builder.add_suggested_target(
+            control_loops::drivetrain::SelectionHint_NEAR_SHIP);
       } else if (data.IsPressed(kMidCargoHint)) {
-        target_hint->suggested_target = 2;
+        target_selector_hint_builder.add_suggested_target(
+            control_loops::drivetrain::SelectionHint_MID_SHIP);
       } else if (data.IsPressed(kFarCargoHint)) {
-        target_hint->suggested_target = 3;
+        target_selector_hint_builder.add_suggested_target(
+            control_loops::drivetrain::SelectionHint_FAR_SHIP);
       } else {
         const double cargo_joy_y = data.GetAxis(kCargoSelectorY);
         const double cargo_joy_x = data.GetAxis(kCargoSelectorX);
         if (cargo_joy_y > 0.5) {
-          target_hint->suggested_target = 1;
+          target_selector_hint_builder.add_suggested_target(
+            control_loops::drivetrain::SelectionHint_NEAR_SHIP);
         } else if (cargo_joy_y < -0.5) {
-          target_hint->suggested_target = 3;
+          target_selector_hint_builder.add_suggested_target(
+              control_loops::drivetrain::SelectionHint_FAR_SHIP);
         } else if (::std::abs(cargo_joy_x) > 0.5) {
-          target_hint->suggested_target = 2;
+          target_selector_hint_builder.add_suggested_target(
+            control_loops::drivetrain::SelectionHint_MID_SHIP);
         } else {
-          target_hint->suggested_target = 0;
+          target_selector_hint_builder.add_suggested_target(
+            control_loops::drivetrain::SelectionHint_NONE);
         }
       }
-      if (!target_hint.Send()) {
+      if (!builder.Send(target_selector_hint_builder.Finish())) {
         AOS_LOG(ERROR, "Failed to send target selector hint.\n");
       }
     }
 
     if (data.PosEdge(kResetLocalizerLeft)) {
-      auto localizer_resetter = localizer_control_sender_.MakeMessage();
+      auto builder = localizer_control_sender_.MakeBuilder();
       // Start at the left feeder station.
-      localizer_resetter->x = 0.6;
-      localizer_resetter->y = 3.4;
-      localizer_resetter->keep_current_theta = true;
+      LocalizerControl::Builder localizer_control_builder =
+          builder.MakeBuilder<LocalizerControl>();
+      localizer_control_builder.add_x(0.6);
+      localizer_control_builder.add_y(3.4);
+      localizer_control_builder.add_keep_current_theta(true);
 
-      if (!localizer_resetter.Send()) {
+      if (!builder.Send(localizer_control_builder.Finish())) {
         AOS_LOG(ERROR, "Failed to reset localizer.\n");
       }
     }
 
     if (data.PosEdge(kResetLocalizerRight)) {
-      auto localizer_resetter = localizer_control_sender_.MakeMessage();
-      // Start at the left feeder station.
-      localizer_resetter->x = 0.6;
-      localizer_resetter->y = -3.4;
-      localizer_resetter->keep_current_theta = true;
+      auto builder = localizer_control_sender_.MakeBuilder();
+      // Start at the right feeder station.
+      LocalizerControl::Builder localizer_control_builder =
+          builder.MakeBuilder<LocalizerControl>();
+      localizer_control_builder.add_x(0.6);
+      localizer_control_builder.add_y(-3.4);
+      localizer_control_builder.add_keep_current_theta(true);
 
-      if (!localizer_resetter.Send()) {
+      if (!builder.Send(localizer_control_builder.Finish())) {
         AOS_LOG(ERROR, "Failed to reset localizer.\n");
       }
     }
 
     if (data.PosEdge(kResetLocalizerLeftForwards)) {
-      auto localizer_resetter = localizer_control_sender_.MakeMessage();
+      auto builder = localizer_control_sender_.MakeBuilder();
       // Start at the left feeder station.
-      localizer_resetter->x = 0.4;
-      localizer_resetter->y = 3.4;
-      localizer_resetter->theta = 0.0;
+      LocalizerControl::Builder localizer_control_builder =
+          builder.MakeBuilder<LocalizerControl>();
+      localizer_control_builder.add_x(0.4);
+      localizer_control_builder.add_y(3.4);
+      localizer_control_builder.add_theta(0.0);
 
-      if (!localizer_resetter.Send()) {
+      if (!builder.Send(localizer_control_builder.Finish())) {
         AOS_LOG(ERROR, "Failed to reset localizer.\n");
       }
     }
 
     if (data.PosEdge(kResetLocalizerLeftBackwards)) {
-      auto localizer_resetter = localizer_control_sender_.MakeMessage();
+      auto builder = localizer_control_sender_.MakeBuilder();
       // Start at the left feeder station.
-      localizer_resetter->x = 0.4;
-      localizer_resetter->y = 3.4;
-      localizer_resetter->theta = M_PI;
+      LocalizerControl::Builder localizer_control_builder =
+          builder.MakeBuilder<LocalizerControl>();
+      localizer_control_builder.add_x(0.4);
+      localizer_control_builder.add_y(3.4);
+      localizer_control_builder.add_theta(M_PI);
 
-      if (!localizer_resetter.Send()) {
+      if (!builder.Send(localizer_control_builder.Finish())) {
         AOS_LOG(ERROR, "Failed to reset localizer.\n");
       }
     }
 
     if (data.PosEdge(kResetLocalizerRightForwards)) {
-      auto localizer_resetter = localizer_control_sender_.MakeMessage();
+      auto builder = localizer_control_sender_.MakeBuilder();
       // Start at the right feeder station.
-      localizer_resetter->x = 0.4;
-      localizer_resetter->y = -3.4;
-      localizer_resetter->theta = 0.0;
+      LocalizerControl::Builder localizer_control_builder =
+          builder.MakeBuilder<LocalizerControl>();
+      localizer_control_builder.add_x(0.4);
+      localizer_control_builder.add_y(-3.4);
+      localizer_control_builder.add_theta(0.0);
 
-      if (!localizer_resetter.Send()) {
+      if (!builder.Send(localizer_control_builder.Finish())) {
         AOS_LOG(ERROR, "Failed to reset localizer.\n");
       }
     }
 
     if (data.PosEdge(kResetLocalizerRightBackwards)) {
-      auto localizer_resetter = localizer_control_sender_.MakeMessage();
+      auto builder = localizer_control_sender_.MakeBuilder();
       // Start at the right feeder station.
-      localizer_resetter->x = 0.4;
-      localizer_resetter->y = -3.4;
-      localizer_resetter->theta = M_PI;
+      LocalizerControl::Builder localizer_control_builder =
+          builder.MakeBuilder<LocalizerControl>();
+      localizer_control_builder.add_x(0.4);
+      localizer_control_builder.add_y(-3.4);
+      localizer_control_builder.add_theta(M_PI);
 
-      if (!localizer_resetter.Send()) {
+      if (!builder.Send(localizer_control_builder.Finish())) {
         AOS_LOG(ERROR, "Failed to reset localizer.\n");
       }
     }
@@ -302,7 +368,7 @@
     if (data.PosEdge(kRelease) &&
         monotonic_now >
             last_release_button_press_ + ::std::chrono::milliseconds(500)) {
-      if (superstructure_status_fetcher_->has_piece) {
+      if (superstructure_status_fetcher_->has_piece()) {
         release_mode_ = ReleaseButtonMode::kRelease;
       } else {
         release_mode_ = ReleaseButtonMode::kBallIntake;
@@ -313,7 +379,8 @@
       last_release_button_press_ = monotonic_now;
     }
 
-    AOS_LOG(INFO, "has_piece: %d\n", superstructure_status_fetcher_->has_piece);
+    AOS_LOG(INFO, "has_piece: %d\n",
+            superstructure_status_fetcher_->has_piece());
     if (data.IsPressed(kSuctionBall)) {
       grab_piece_ = true;
     } else if (data.IsPressed(kSuctionHatch)) {
@@ -321,7 +388,7 @@
     } else if ((release_mode_ == ReleaseButtonMode::kRelease &&
                 data.IsPressed(kRelease)) ||
                data.IsPressed(kReleaseButtonBoard) ||
-               !superstructure_status_fetcher_->has_piece) {
+               !superstructure_status_fetcher_->has_piece()) {
       grab_piece_ = false;
       AOS_LOG(INFO, "releasing due to other thing\n");
     }
@@ -329,8 +396,8 @@
     if (data.IsPressed(kRocketBackwardUnpressed)) {
       elevator_wrist_pos_ = kStowPos;
     }
-    new_superstructure_goal->intake.unsafe_goal = -1.2;
-    new_superstructure_goal->roller_voltage = 0.0;
+    mutable_superstructure_goal->mutable_intake()->mutate_unsafe_goal(-1.2);
+    mutable_superstructure_goal->mutate_roller_voltage(0.0);
 
     const bool kDoBallIntake =
         (!climbed_ && release_mode_ == ReleaseButtonMode::kBallIntake &&
@@ -345,8 +412,10 @@
     }
 
     if (switch_ball_) {
-      if (superstructure_status_fetcher_->has_piece) {
-        new_superstructure_goal->wrist.profile_params.max_acceleration = 20;
+      if (superstructure_status_fetcher_->has_piece()) {
+        mutable_superstructure_goal->mutable_wrist()
+            ->mutable_profile_params()
+            ->mutate_max_acceleration(20);
       }
 
       // Go to intake position and apply vacuum
@@ -411,18 +480,18 @@
       if (kDoBallOutake ||
           (kDoBallIntake &&
            monotonic_now < last_not_has_piece_ + chrono::milliseconds(200))) {
-        new_superstructure_goal->intake.unsafe_goal = 0.83;
+        mutable_superstructure_goal->mutable_intake()->mutate_unsafe_goal(0.83);
       }
 
-      if (kDoBallIntake && !superstructure_status_fetcher_->has_piece) {
+      if (kDoBallIntake && !superstructure_status_fetcher_->has_piece()) {
         elevator_wrist_pos_ = kBallIntakePos;
-        new_superstructure_goal->roller_voltage = 9.0;
+        mutable_superstructure_goal->mutate_roller_voltage(9.0);
         grab_piece_ = true;
       } else {
         if (kDoBallOutake) {
-          new_superstructure_goal->roller_voltage = -6.0;
+          mutable_superstructure_goal->mutate_roller_voltage(-6.0);
         } else {
-          new_superstructure_goal->roller_voltage = 0.0;
+          mutable_superstructure_goal->mutate_roller_voltage(0.0);
         }
       }
     }
@@ -430,47 +499,70 @@
     constexpr double kDeployStiltPosition = 0.5;
 
     if (data.IsPressed(kFallOver)) {
-      new_superstructure_goal->stilts.unsafe_goal = 0.71;
-      new_superstructure_goal->stilts.profile_params.max_velocity = 0.65;
-      new_superstructure_goal->stilts.profile_params.max_acceleration = 1.25;
+      mutable_superstructure_goal->mutable_stilts()->mutate_unsafe_goal(0.71);
+      mutable_superstructure_goal->mutable_stilts()
+          ->mutable_profile_params()
+          ->mutate_max_velocity(0.65);
+      mutable_superstructure_goal->mutable_stilts()
+          ->mutable_profile_params()
+          ->mutate_max_acceleration(1.25);
     } else if (data.IsPressed(kHalfStilt)) {
       was_above_ = false;
-      new_superstructure_goal->stilts.unsafe_goal = 0.345;
-      new_superstructure_goal->stilts.profile_params.max_velocity = 0.65;
+      mutable_superstructure_goal->mutable_stilts()->mutate_unsafe_goal ( 0.345);
+      mutable_superstructure_goal->mutable_stilts()->mutable_profile_params()->mutate_max_velocity ( 0.65);
     } else if (data.IsPressed(kDeployStilt) || was_above_) {
-      new_superstructure_goal->stilts.unsafe_goal = kDeployStiltPosition;
-      new_superstructure_goal->stilts.profile_params.max_velocity = 0.65;
-      new_superstructure_goal->stilts.profile_params.max_acceleration = 2.0;
+      mutable_superstructure_goal->mutable_stilts()->mutate_unsafe_goal(
+          kDeployStiltPosition);
+      mutable_superstructure_goal->mutable_stilts()
+          ->mutable_profile_params()
+          ->mutate_max_velocity(0.65);
+      mutable_superstructure_goal->mutable_stilts()
+          ->mutable_profile_params()
+          ->mutate_max_acceleration(2.0);
     } else {
-      new_superstructure_goal->stilts.unsafe_goal = 0.005;
-      new_superstructure_goal->stilts.profile_params.max_velocity = 0.65;
-      new_superstructure_goal->stilts.profile_params.max_acceleration = 2.0;
+      mutable_superstructure_goal->mutable_stilts()->mutate_unsafe_goal(0.005);
+      mutable_superstructure_goal->mutable_stilts()
+          ->mutable_profile_params()
+          ->mutate_max_velocity(0.65);
+      mutable_superstructure_goal->mutable_stilts()
+          ->mutable_profile_params()
+          ->mutate_max_acceleration(2.0);
     }
 
-    if (superstructure_status_fetcher_->stilts.position > 0.1) {
+    if (superstructure_status_fetcher_->stilts()->position() > 0.1) {
       elevator_wrist_pos_ = kClimbPos;
       climbed_ = true;
-      new_superstructure_goal->wrist.profile_params.max_acceleration = 10;
-      new_superstructure_goal->elevator.profile_params.max_acceleration = 6;
+      mutable_superstructure_goal->mutable_wrist()
+          ->mutable_profile_params()
+          ->mutate_max_acceleration(10);
+      mutable_superstructure_goal->mutable_elevator()
+          ->mutable_profile_params()
+          ->mutate_max_acceleration(6);
     }
 
     // If we've been asked to go above deploy and made it up that high, latch
     // was_above.
-    if (new_superstructure_goal->stilts.unsafe_goal > kDeployStiltPosition &&
-        superstructure_status_fetcher_->stilts.position >=
+    if (mutable_superstructure_goal->stilts()->unsafe_goal() >
+            kDeployStiltPosition &&
+        superstructure_status_fetcher_->stilts()->position() >=
             kDeployStiltPosition) {
       was_above_ = true;
-    } else if ((superstructure_position_fetcher_->platform_left_detect &&
-                superstructure_position_fetcher_->platform_right_detect) &&
+    } else if ((superstructure_position_fetcher_->platform_left_detect() &&
+                superstructure_position_fetcher_->platform_right_detect()) &&
                !data.IsPressed(kDeployStilt) && !data.IsPressed(kFallOver)) {
       was_above_ = false;
     }
 
-    if (superstructure_status_fetcher_->stilts.position >
+    if (superstructure_status_fetcher_->stilts()->position() >
             kDeployStiltPosition &&
-        new_superstructure_goal->stilts.unsafe_goal == kDeployStiltPosition) {
-      new_superstructure_goal->stilts.profile_params.max_velocity = 0.30;
-      new_superstructure_goal->stilts.profile_params.max_acceleration = 0.75;
+        mutable_superstructure_goal->stilts()->unsafe_goal() ==
+            kDeployStiltPosition) {
+      mutable_superstructure_goal->mutable_stilts()
+          ->mutable_profile_params()
+          ->mutate_max_velocity(0.30);
+      mutable_superstructure_goal->mutable_stilts()
+          ->mutable_profile_params()
+          ->mutate_max_acceleration(0.75);
     }
 
     if ((release_mode_ == ReleaseButtonMode::kRelease &&
@@ -481,21 +573,22 @@
     }
 
     if (switch_ball_) {
-      new_superstructure_goal->suction.gamepiece_mode = 0;
+      mutable_superstructure_goal->mutable_suction()->mutate_gamepiece_mode(0);
     } else {
-      new_superstructure_goal->suction.gamepiece_mode = 1;
+      mutable_superstructure_goal->mutable_suction()->mutate_gamepiece_mode(1);
     }
 
     vision_control_.set_flip_image(elevator_wrist_pos_.wrist < 0);
 
-    new_superstructure_goal->suction.grab_piece = grab_piece_;
+    mutable_superstructure_goal->mutable_suction()->mutate_grab_piece(
+        grab_piece_);
 
-    new_superstructure_goal->elevator.unsafe_goal =
-        elevator_wrist_pos_.elevator;
-    new_superstructure_goal->wrist.unsafe_goal = elevator_wrist_pos_.wrist;
+    mutable_superstructure_goal->mutable_elevator()->mutate_unsafe_goal(
+        elevator_wrist_pos_.elevator);
+    mutable_superstructure_goal->mutable_wrist()->mutate_unsafe_goal(
+        elevator_wrist_pos_.wrist);
 
-    AOS_LOG_STRUCT(DEBUG, "sending goal", *new_superstructure_goal);
-    if (!new_superstructure_goal.Send()) {
+    if (!main_superstructure_goal_builder.Send(superstructure_goal_offset)) {
       AOS_LOG(ERROR, "Sending superstructure goal failed.\n");
     }
 
@@ -506,10 +599,8 @@
     }
 
     {
-      auto camera_log_message = camera_log_sender_.MakeMessage();
-      camera_log_message->log = data.IsPressed(kCameraLog);
-      AOS_LOG_STRUCT(DEBUG, "camera_log", *camera_log_message);
-      camera_log_message.Send();
+      auto builder = camera_log_sender_.MakeBuilder();
+      builder.Send(CreateCameraLog(*builder.fbb(), data.IsPressed(kCameraLog)));
     }
   }
 
@@ -517,26 +608,16 @@
   ::aos::Sender<::y2019::control_loops::drivetrain::TargetSelectorHint>
       target_selector_hint_sender_;
 
-  ::aos::Sender<::frc971::control_loops::drivetrain::LocalizerControl>
-      localizer_control_sender_;
+  ::aos::Sender<LocalizerControl> localizer_control_sender_;
 
   ::aos::Sender<::y2019::CameraLog> camera_log_sender_;
 
-  ::aos::Fetcher<
-      ::y2019::control_loops::superstructure::SuperstructureQueue::Goal>
-      superstructure_goal_fetcher_;
+  ::aos::Fetcher<superstructure::Goal> superstructure_goal_fetcher_;
 
-  ::aos::Sender<
-      ::y2019::control_loops::superstructure::SuperstructureQueue::Goal>
-      superstructure_goal_sender_;
+  ::aos::Sender<superstructure::Goal> superstructure_goal_sender_;
 
-  ::aos::Fetcher<
-      ::y2019::control_loops::superstructure::SuperstructureQueue::Position>
-      superstructure_position_fetcher_;
-  ::aos::Fetcher<
-      ::y2019::control_loops::superstructure::SuperstructureQueue::Status>
-      superstructure_status_fetcher_;
-
+  ::aos::Fetcher<superstructure::Position> superstructure_position_fetcher_;
+  ::aos::Fetcher<superstructure::Status> superstructure_status_fetcher_;
 
   // Bool to track if we've been above the deploy position.  Once this bool is
   // set, don't let the stilts retract until we see the platform.
@@ -576,7 +657,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());
   ::y2019::input::joysticks::Reader reader(&event_loop);
 
   event_loop.Run();