Move LocalizerControl queue to event loops

Change-Id: Ic29f2daaf1cba7c7054f1e689c5051f23424fe07
diff --git a/frc971/autonomous/base_autonomous_actor.cc b/frc971/autonomous/base_autonomous_actor.cc
index f551898..7d7e12e 100644
--- a/frc971/autonomous/base_autonomous_actor.cc
+++ b/frc971/autonomous/base_autonomous_actor.cc
@@ -21,13 +21,13 @@
 namespace autonomous {
 
 BaseAutonomousActor::BaseAutonomousActor(
-    AutonomousActionQueueGroup *s,
+    ::aos::EventLoop *event_loop, AutonomousActionQueueGroup *s,
     const control_loops::drivetrain::DrivetrainConfig<double> &dt_config)
     : aos::common::actions::ActorBase<AutonomousActionQueueGroup>(s),
       dt_config_(dt_config),
       initial_drivetrain_({0.0, 0.0}),
       target_selector_hint_sender_(
-          event_loop_.MakeSender<
+          event_loop->MakeSender<
               ::y2019::control_loops::drivetrain::TargetSelectorHint>(
               ".y2019.control_loops.drivetrain.target_selector_hint")) {}
 
diff --git a/frc971/autonomous/base_autonomous_actor.h b/frc971/autonomous/base_autonomous_actor.h
index a6a57cd..7636486 100644
--- a/frc971/autonomous/base_autonomous_actor.h
+++ b/frc971/autonomous/base_autonomous_actor.h
@@ -18,7 +18,7 @@
     : public ::aos::common::actions::ActorBase<AutonomousActionQueueGroup> {
  public:
   explicit BaseAutonomousActor(
-      AutonomousActionQueueGroup *s,
+      ::aos::EventLoop *event_loop, AutonomousActionQueueGroup *s,
       const control_loops::drivetrain::DrivetrainConfig<double> &dt_config);
 
  protected:
@@ -108,8 +108,6 @@
 
  private:
   friend class SplineHandle;
-  ::aos::ShmEventLoop event_loop_;
-
   ::aos::Sender<::y2019::control_loops::drivetrain::TargetSelectorHint>
       target_selector_hint_sender_;
 
diff --git a/frc971/control_loops/drivetrain/localizer.q b/frc971/control_loops/drivetrain/localizer.q
index b1169a9..323f895 100644
--- a/frc971/control_loops/drivetrain/localizer.q
+++ b/frc971/control_loops/drivetrain/localizer.q
@@ -2,6 +2,7 @@
 
 // Allows you to reset the state of the localizer to a specific position on the
 // field.
+// Published on ".frc971.control_loops.drivetrain.localizer_control"
 message LocalizerControl {
   float x;      // X position, meters
   float y;      // Y position, meters
@@ -9,5 +10,3 @@
   double theta_uncertainty; // Uncertainty in theta.
   bool keep_current_theta; // Whether to keep the current theta value.
 };
-
-queue LocalizerControl localizer_control;
diff --git a/y2014_bot3/actors/BUILD b/y2014_bot3/actors/BUILD
index 57f6d08..ed6dfa1 100644
--- a/y2014_bot3/actors/BUILD
+++ b/y2014_bot3/actors/BUILD
@@ -8,6 +8,7 @@
     ],
     deps = [
         "//aos/actions:action_lib",
+        "//aos/events:event-loop",
         "//aos/logging",
         "//aos/util:phased_loop",
         "//frc971/autonomous:base_autonomous_actor",
@@ -26,6 +27,7 @@
     deps = [
         ":autonomous_action_lib",
         "//aos:init",
+        "//aos/events:shm-event-loop",
         "//frc971/autonomous:auto_queue",
     ],
 )
diff --git a/y2014_bot3/actors/autonomous_actor.cc b/y2014_bot3/actors/autonomous_actor.cc
index 681b7a0..31f0175 100644
--- a/y2014_bot3/actors/autonomous_actor.cc
+++ b/y2014_bot3/actors/autonomous_actor.cc
@@ -4,6 +4,7 @@
 #include <chrono>
 #include <cmath>
 
+#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"
@@ -29,9 +30,10 @@
 }  // namespace
 
 AutonomousActor::AutonomousActor(
+    ::aos::EventLoop *event_loop,
     ::frc971::autonomous::AutonomousActionQueueGroup *s)
     : frc971::autonomous::BaseAutonomousActor(
-          s, control_loops::drivetrain::GetDrivetrainConfig()) {}
+          event_loop, s, control_loops::drivetrain::GetDrivetrainConfig()) {}
 
 bool AutonomousActor::RunAction(
     const ::frc971::autonomous::AutonomousActionParams &params) {
diff --git a/y2014_bot3/actors/autonomous_actor.h b/y2014_bot3/actors/autonomous_actor.h
index 94bbbd7..a338d40 100644
--- a/y2014_bot3/actors/autonomous_actor.h
+++ b/y2014_bot3/actors/autonomous_actor.h
@@ -6,6 +6,7 @@
 
 #include "aos/actions/actions.h"
 #include "aos/actions/actor.h"
+#include "aos/events/event-loop.h"
 #include "frc971/autonomous/base_autonomous_actor.h"
 
 namespace y2014_bot3 {
@@ -13,7 +14,8 @@
 
 class AutonomousActor : public ::frc971::autonomous::BaseAutonomousActor {
  public:
-  explicit AutonomousActor(::frc971::autonomous::AutonomousActionQueueGroup *s);
+  explicit AutonomousActor(::aos::EventLoop *event_loop,
+                           ::frc971::autonomous::AutonomousActionQueueGroup *s);
 
   bool RunAction(
       const ::frc971::autonomous::AutonomousActionParams &params) override;
diff --git a/y2014_bot3/actors/autonomous_actor_main.cc b/y2014_bot3/actors/autonomous_actor_main.cc
index 157d9ed..2304b78 100644
--- a/y2014_bot3/actors/autonomous_actor_main.cc
+++ b/y2014_bot3/actors/autonomous_actor_main.cc
@@ -1,5 +1,6 @@
 #include <stdio.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"
@@ -7,8 +8,9 @@
 int main(int /*argc*/, char * /*argv*/ []) {
   ::aos::Init(-1);
 
+  ::aos::ShmEventLoop event_loop;
   ::y2014_bot3::actors::AutonomousActor autonomous(
-      &::frc971::autonomous::autonomous_action);
+      &event_loop, &::frc971::autonomous::autonomous_action);
   autonomous.Run();
 
   ::aos::Cleanup();
diff --git a/y2016/actors/BUILD b/y2016/actors/BUILD
index 19b5c63..f5b2566 100644
--- a/y2016/actors/BUILD
+++ b/y2016/actors/BUILD
@@ -1,132 +1,134 @@
-package(default_visibility = ['//visibility:public'])
+package(default_visibility = ["//visibility:public"])
 
-load('//aos/build:queues.bzl', 'queue_library')
+load("//aos/build:queues.bzl", "queue_library")
 
 filegroup(
-  name = 'binaries',
-  srcs = [
-    ':superstructure_action',
-    ':autonomous_action',
-  ],
+    name = "binaries",
+    srcs = [
+        ":autonomous_action",
+        ":superstructure_action",
+    ],
 )
 
 queue_library(
-  name = 'superstructure_action_queue',
-  srcs = [
-    'superstructure_action.q',
-  ],
-  deps = [
-    '//aos/actions:action_queue',
-  ],
+    name = "superstructure_action_queue",
+    srcs = [
+        "superstructure_action.q",
+    ],
+    deps = [
+        "//aos/actions:action_queue",
+    ],
 )
 
 cc_library(
-  name = 'superstructure_action_lib',
-  srcs = [
-    'superstructure_actor.cc',
-  ],
-  hdrs = [
-    'superstructure_actor.h',
-  ],
-  deps = [
-    ':superstructure_action_queue',
-    '//aos/util:phased_loop',
-    '//aos/logging',
-    '//aos/actions:action_lib',
-    '//y2016/control_loops/superstructure:superstructure_queue',
-  ],
+    name = "superstructure_action_lib",
+    srcs = [
+        "superstructure_actor.cc",
+    ],
+    hdrs = [
+        "superstructure_actor.h",
+    ],
+    deps = [
+        ":superstructure_action_queue",
+        "//aos/actions:action_lib",
+        "//aos/events:event-loop",
+        "//aos/logging",
+        "//aos/util:phased_loop",
+        "//y2016/control_loops/superstructure:superstructure_queue",
+    ],
 )
 
 cc_binary(
-  name = 'superstructure_action',
-  srcs = [
-    'superstructure_actor_main.cc',
-  ],
-  deps = [
-    ':superstructure_action_lib',
-    ':superstructure_action_queue',
-    '//aos:init',
-  ],
+    name = "superstructure_action",
+    srcs = [
+        "superstructure_actor_main.cc",
+    ],
+    deps = [
+        ":superstructure_action_lib",
+        ":superstructure_action_queue",
+        "//aos:init",
+        "//aos/events:shm-event-loop",
+    ],
 )
 
 cc_library(
-  name = 'autonomous_action_lib',
-  srcs = [
-    'autonomous_actor.cc',
-  ],
-  hdrs = [
-    'autonomous_actor.h',
-  ],
-  deps = [
-    ':vision_align_action_lib',
-    '//aos/util:phased_loop',
-    '//aos/logging',
-    '//aos/actions:action_lib',
-    '//frc971/autonomous:base_autonomous_actor',
-    '//frc971/control_loops/drivetrain:drivetrain_queue',
-    '//y2016/queues:ball_detector',
-    '//y2016/control_loops/superstructure:superstructure_queue',
-    '//y2016/control_loops/shooter:shooter_queue',
-    '//y2016/control_loops/drivetrain:drivetrain_base',
-    '//y2016/queues:profile_params',
-    '//y2016/vision:vision_queue',
-  ],
+    name = "autonomous_action_lib",
+    srcs = [
+        "autonomous_actor.cc",
+    ],
+    hdrs = [
+        "autonomous_actor.h",
+    ],
+    deps = [
+        ":vision_align_action_lib",
+        "//aos/actions:action_lib",
+        "//aos/logging",
+        "//aos/util:phased_loop",
+        "//frc971/autonomous:base_autonomous_actor",
+        "//frc971/control_loops/drivetrain:drivetrain_queue",
+        "//y2016/control_loops/drivetrain:drivetrain_base",
+        "//y2016/control_loops/shooter:shooter_queue",
+        "//y2016/control_loops/superstructure:superstructure_queue",
+        "//y2016/queues:ball_detector",
+        "//y2016/queues:profile_params",
+        "//y2016/vision:vision_queue",
+    ],
 )
 
 cc_binary(
-  name = 'autonomous_action',
-  srcs = [
-    'autonomous_actor_main.cc',
-  ],
-  deps = [
-    ':autonomous_action_lib',
-    '//aos:init',
-  ],
+    name = "autonomous_action",
+    srcs = [
+        "autonomous_actor_main.cc",
+    ],
+    deps = [
+        ":autonomous_action_lib",
+        "//aos:init",
+    ],
 )
 
 queue_library(
-  name = 'vision_align_action_queue',
-  srcs = [
-    'vision_align_action.q',
-  ],
-  deps = [
-    '//aos/actions:action_queue',
-  ],
+    name = "vision_align_action_queue",
+    srcs = [
+        "vision_align_action.q",
+    ],
+    deps = [
+        "//aos/actions:action_queue",
+    ],
 )
 
 cc_library(
-  name = 'vision_align_action_lib',
-  srcs = [
-    'vision_align_actor.cc',
-  ],
-  hdrs = [
-    'vision_align_actor.h',
-  ],
-  deps = [
-    ':vision_align_action_queue',
-    '//aos/time:time',
-    '//aos:math',
-    '//aos/util:phased_loop',
-    '//aos/logging',
-    '//aos/actions:action_lib',
-    '//aos/logging:queue_logging',
-    '//aos/util:trapezoid_profile',
-    '//frc971/control_loops/drivetrain:drivetrain_queue',
-    '//third_party/eigen',
-    '//y2016:constants',
-    '//y2016/control_loops/drivetrain:drivetrain_base',
-    '//y2016/vision:vision_queue',
-  ],
+    name = "vision_align_action_lib",
+    srcs = [
+        "vision_align_actor.cc",
+    ],
+    hdrs = [
+        "vision_align_actor.h",
+    ],
+    deps = [
+        ":vision_align_action_queue",
+        "//aos:math",
+        "//aos/actions:action_lib",
+        "//aos/logging",
+        "//aos/logging:queue_logging",
+        "//aos/time",
+        "//aos/util:phased_loop",
+        "//aos/util:trapezoid_profile",
+        "//frc971/control_loops/drivetrain:drivetrain_queue",
+        "//third_party/eigen",
+        "//y2016:constants",
+        "//y2016/control_loops/drivetrain:drivetrain_base",
+        "//y2016/vision:vision_queue",
+    ],
 )
 
 cc_binary(
-  name = 'vision_align_action',
-  srcs = [
-    'vision_align_actor_main.cc',
-  ],
-  deps = [
-    ':vision_align_action_lib',
-    ':vision_align_action_queue',
-    '//aos:init',
-  ],
+    name = "vision_align_action",
+    srcs = [
+        "vision_align_actor_main.cc",
+    ],
+    deps = [
+        ":vision_align_action_lib",
+        ":vision_align_action_queue",
+        "//aos:init",
+    ],
 )
diff --git a/y2016/actors/autonomous_actor.cc b/y2016/actors/autonomous_actor.cc
index ea90944..5f95072 100644
--- a/y2016/actors/autonomous_actor.cc
+++ b/y2016/actors/autonomous_actor.cc
@@ -50,9 +50,10 @@
 }  // namespace
 
 AutonomousActor::AutonomousActor(
+    ::aos::EventLoop *event_loop,
     ::frc971::autonomous::AutonomousActionQueueGroup *s)
     : frc971::autonomous::BaseAutonomousActor(
-          s, control_loops::drivetrain::GetDrivetrainConfig()) {}
+          event_loop, s, control_loops::drivetrain::GetDrivetrainConfig()) {}
 
 constexpr double kDoNotTurnCare = 2.0;
 
diff --git a/y2016/actors/autonomous_actor.h b/y2016/actors/autonomous_actor.h
index 0a8eae2..4a220ed 100644
--- a/y2016/actors/autonomous_actor.h
+++ b/y2016/actors/autonomous_actor.h
@@ -6,6 +6,7 @@
 
 #include "aos/actions/actions.h"
 #include "aos/actions/actor.h"
+#include "aos/events/event-loop.h"
 #include "frc971/autonomous/base_autonomous_actor.h"
 #include "frc971/control_loops/drivetrain/drivetrain.q.h"
 #include "frc971/control_loops/drivetrain/drivetrain_config.h"
@@ -17,7 +18,8 @@
 
 class AutonomousActor : public ::frc971::autonomous::BaseAutonomousActor {
  public:
-  explicit AutonomousActor(::frc971::autonomous::AutonomousActionQueueGroup *s);
+  explicit AutonomousActor(::aos::EventLoop *event_loop,
+                           ::frc971::autonomous::AutonomousActionQueueGroup *s);
 
   bool RunAction(
       const ::frc971::autonomous::AutonomousActionParams &params) override;
diff --git a/y2016/actors/autonomous_actor_main.cc b/y2016/actors/autonomous_actor_main.cc
index bc64366..16fc5c4 100644
--- a/y2016/actors/autonomous_actor_main.cc
+++ b/y2016/actors/autonomous_actor_main.cc
@@ -1,13 +1,15 @@
 #include <stdio.h>
 
+#include "aos/events/shm-event-loop.h"
 #include "aos/init.h"
 #include "y2016/actors/autonomous_actor.h"
 
 int main(int /*argc*/, char * /*argv*/ []) {
   ::aos::Init(-1);
 
+  ::aos::ShmEventLoop event_loop;
   ::y2016::actors::AutonomousActor autonomous(
-      &::frc971::autonomous::autonomous_action);
+      &event_loop, &::frc971::autonomous::autonomous_action);
   autonomous.Run();
 
   ::aos::Cleanup();
diff --git a/y2017/actors/BUILD b/y2017/actors/BUILD
index 9e2f7d3..8c1b1cd 100644
--- a/y2017/actors/BUILD
+++ b/y2017/actors/BUILD
@@ -1,42 +1,44 @@
-package(default_visibility = ['//visibility:public'])
+package(default_visibility = ["//visibility:public"])
 
-load('//aos/build:queues.bzl', 'queue_library')
+load("//aos/build:queues.bzl", "queue_library")
 
 filegroup(
-  name = 'binaries',
-  srcs = [
-    ':autonomous_action',
-  ],
+    name = "binaries",
+    srcs = [
+        ":autonomous_action",
+    ],
 )
 
 cc_library(
-  name = 'autonomous_action_lib',
-  srcs = [
-    'autonomous_actor.cc',
-  ],
-  hdrs = [
-    'autonomous_actor.h',
-  ],
-  deps = [
-    '//aos/util:phased_loop',
-    '//aos/logging',
-    '//aos/actions:action_lib',
-    '//frc971/autonomous:base_autonomous_actor',
-    '//frc971/control_loops/drivetrain:drivetrain_queue',
-    '//frc971/control_loops/drivetrain:drivetrain_config',
-    '//y2017/control_loops/drivetrain:drivetrain_base',
-    '//y2017/control_loops/superstructure:superstructure_queue',
-  ],
+    name = "autonomous_action_lib",
+    srcs = [
+        "autonomous_actor.cc",
+    ],
+    hdrs = [
+        "autonomous_actor.h",
+    ],
+    deps = [
+        "//aos/actions:action_lib",
+        "//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",
+        "//y2017/control_loops/drivetrain:drivetrain_base",
+        "//y2017/control_loops/superstructure:superstructure_queue",
+    ],
 )
 
 cc_binary(
-  name = 'autonomous_action',
-  srcs = [
-    'autonomous_actor_main.cc',
-  ],
-  deps = [
-    ':autonomous_action_lib',
-    '//aos:init',
-    '//frc971/autonomous:auto_queue',
-  ],
+    name = "autonomous_action",
+    srcs = [
+        "autonomous_actor_main.cc",
+    ],
+    deps = [
+        ":autonomous_action_lib",
+        "//aos:init",
+        "//aos/events:shm-event-loop",
+        "//frc971/autonomous:auto_queue",
+    ],
 )
diff --git a/y2017/actors/autonomous_actor.cc b/y2017/actors/autonomous_actor.cc
index c123612..6070a71 100644
--- a/y2017/actors/autonomous_actor.cc
+++ b/y2017/actors/autonomous_actor.cc
@@ -41,9 +41,10 @@
 }  // namespace
 
 AutonomousActor::AutonomousActor(
+    ::aos::EventLoop *event_loop,
     ::frc971::autonomous::AutonomousActionQueueGroup *s)
     : frc971::autonomous::BaseAutonomousActor(
-          s, control_loops::drivetrain::GetDrivetrainConfig()) {}
+          event_loop, s, control_loops::drivetrain::GetDrivetrainConfig()) {}
 
 bool AutonomousActor::RunAction(
     const ::frc971::autonomous::AutonomousActionParams &params) {
diff --git a/y2017/actors/autonomous_actor.h b/y2017/actors/autonomous_actor.h
index a27c27e..2ab9fca 100644
--- a/y2017/actors/autonomous_actor.h
+++ b/y2017/actors/autonomous_actor.h
@@ -19,7 +19,8 @@
 
 class AutonomousActor : public ::frc971::autonomous::BaseAutonomousActor {
  public:
-  explicit AutonomousActor(::frc971::autonomous::AutonomousActionQueueGroup *s);
+  explicit AutonomousActor(::aos::EventLoop *event_loop,
+                           ::frc971::autonomous::AutonomousActionQueueGroup *s);
 
   bool RunAction(
       const ::frc971::autonomous::AutonomousActionParams &params) override;
diff --git a/y2017/actors/autonomous_actor_main.cc b/y2017/actors/autonomous_actor_main.cc
index 9a58d56..f9dfbbb 100644
--- a/y2017/actors/autonomous_actor_main.cc
+++ b/y2017/actors/autonomous_actor_main.cc
@@ -1,5 +1,6 @@
 #include <stdio.h>
 
+#include "aos/events/shm-event-loop.h"
 #include "aos/init.h"
 #include "frc971/autonomous/auto.q.h"
 #include "y2017/actors/autonomous_actor.h"
@@ -7,8 +8,9 @@
 int main(int /*argc*/, char * /*argv*/ []) {
   ::aos::Init(-1);
 
+  ::aos::ShmEventLoop event_loop;
   ::y2017::actors::AutonomousActor autonomous(
-      &::frc971::autonomous::autonomous_action);
+      &event_loop, &::frc971::autonomous::autonomous_action);
   autonomous.Run();
 
   ::aos::Cleanup();
diff --git a/y2018/actors/BUILD b/y2018/actors/BUILD
index 712b94a..7d97f66 100644
--- a/y2018/actors/BUILD
+++ b/y2018/actors/BUILD
@@ -8,6 +8,7 @@
     ],
     deps = [
         "//aos/actions:action_lib",
+        "//aos/events:event-loop",
         "//aos/logging",
         "//aos/util:phased_loop",
         "//frc971/autonomous:base_autonomous_actor",
@@ -28,6 +29,7 @@
     deps = [
         ":autonomous_action_lib",
         "//aos:init",
+        "//aos/events:shm-event-loop",
         "//frc971/autonomous:auto_queue",
     ],
 )
diff --git a/y2018/actors/autonomous_actor.cc b/y2018/actors/autonomous_actor.cc
index 783a166..ed91158 100644
--- a/y2018/actors/autonomous_actor.cc
+++ b/y2018/actors/autonomous_actor.cc
@@ -50,9 +50,10 @@
 }  // namespace
 
 AutonomousActor::AutonomousActor(
+    ::aos::EventLoop *event_loop,
     ::frc971::autonomous::AutonomousActionQueueGroup *s)
     : frc971::autonomous::BaseAutonomousActor(
-          s, control_loops::drivetrain::GetDrivetrainConfig()) {}
+          event_loop, s, control_loops::drivetrain::GetDrivetrainConfig()) {}
 
 bool AutonomousActor::RunAction(
     const ::frc971::autonomous::AutonomousActionParams &params) {
diff --git a/y2018/actors/autonomous_actor.h b/y2018/actors/autonomous_actor.h
index 0cff3f3..207ff42 100644
--- a/y2018/actors/autonomous_actor.h
+++ b/y2018/actors/autonomous_actor.h
@@ -6,6 +6,7 @@
 
 #include "aos/actions/actions.h"
 #include "aos/actions/actor.h"
+#include "aos/events/event-loop.h"
 #include "frc971/autonomous/base_autonomous_actor.h"
 #include "frc971/control_loops/drivetrain/drivetrain.q.h"
 #include "frc971/control_loops/drivetrain/drivetrain_config.h"
@@ -21,7 +22,8 @@
 
 class AutonomousActor : public ::frc971::autonomous::BaseAutonomousActor {
  public:
-  explicit AutonomousActor(::frc971::autonomous::AutonomousActionQueueGroup *s);
+  explicit AutonomousActor(::aos::EventLoop *event_loop,
+                           ::frc971::autonomous::AutonomousActionQueueGroup *s);
 
   bool RunAction(
       const ::frc971::autonomous::AutonomousActionParams &params) override;
diff --git a/y2018/actors/autonomous_actor_main.cc b/y2018/actors/autonomous_actor_main.cc
index a345fe6..fa9ba10 100644
--- a/y2018/actors/autonomous_actor_main.cc
+++ b/y2018/actors/autonomous_actor_main.cc
@@ -1,5 +1,6 @@
 #include <stdio.h>
 
+#include "aos/events/shm-event-loop.h"
 #include "aos/init.h"
 #include "frc971/autonomous/auto.q.h"
 #include "y2018/actors/autonomous_actor.h"
@@ -7,8 +8,9 @@
 int main(int /*argc*/, char * /*argv*/ []) {
   ::aos::Init(-1);
 
+  ::aos::ShmEventLoop event_loop;
   ::y2018::actors::AutonomousActor autonomous(
-      &::frc971::autonomous::autonomous_action);
+      &event_loop, &::frc971::autonomous::autonomous_action);
   autonomous.Run();
 
   ::aos::Cleanup();
diff --git a/y2019/actors/BUILD b/y2019/actors/BUILD
index ee70772..a622dbf 100644
--- a/y2019/actors/BUILD
+++ b/y2019/actors/BUILD
@@ -25,6 +25,7 @@
         "autonomous_actor.h",
     ],
     deps = [
+        "//aos/events:event-loop",
         "//aos/logging",
         "//aos/util:phased_loop",
         "//frc971/autonomous:base_autonomous_actor",
@@ -45,6 +46,7 @@
     deps = [
         ":autonomous_action_lib",
         "//aos:init",
+        "//aos/events:shm-event-loop",
         "//frc971/autonomous:auto_queue",
     ],
 )
diff --git a/y2019/actors/autonomous_actor.cc b/y2019/actors/autonomous_actor.cc
index a565764..6ad8bff 100644
--- a/y2019/actors/autonomous_actor.cc
+++ b/y2019/actors/autonomous_actor.cc
@@ -16,7 +16,6 @@
 namespace y2019 {
 namespace actors {
 using ::frc971::control_loops::drivetrain_queue;
-using ::frc971::control_loops::drivetrain::localizer_control;
 using ::aos::monotonic_clock;
 namespace chrono = ::std::chrono;
 
@@ -30,9 +29,14 @@
 }  // namespace
 
 AutonomousActor::AutonomousActor(
+    ::aos::EventLoop *event_loop,
     ::frc971::autonomous::AutonomousActionQueueGroup *s)
     : frc971::autonomous::BaseAutonomousActor(
-          s, control_loops::drivetrain::GetDrivetrainConfig()) {}
+          event_loop, s, control_loops::drivetrain::GetDrivetrainConfig()),
+      localizer_control_sender_(
+          event_loop->MakeSender<
+              ::frc971::control_loops::drivetrain::LocalizerControl>(
+              ".frc971.control_loops.drivetrain.localizer_control")) {}
 
 bool AutonomousActor::WaitForDriveXGreater(double x) {
   LOG(INFO, "Waiting until x > %f\n", x);
@@ -88,7 +92,7 @@
   SendSuperstructureGoal();
 
   {
-    auto localizer_resetter = localizer_control.MakeMessage();
+    auto localizer_resetter = localizer_control_sender_.MakeMessage();
     // Start on the left l2.
     localizer_resetter->x = 1.0;
     localizer_resetter->y = 1.35 * turn_scalar;
diff --git a/y2019/actors/autonomous_actor.h b/y2019/actors/autonomous_actor.h
index e25085a..941129f 100644
--- a/y2019/actors/autonomous_actor.h
+++ b/y2019/actors/autonomous_actor.h
@@ -10,6 +10,7 @@
 #include "frc971/control_loops/control_loops.q.h"
 #include "frc971/control_loops/drivetrain/drivetrain.q.h"
 #include "frc971/control_loops/drivetrain/drivetrain_config.h"
+#include "frc971/control_loops/drivetrain/localizer.q.h"
 #include "y2019/control_loops/superstructure/superstructure.q.h"
 
 namespace y2019 {
@@ -25,7 +26,8 @@
 
 class AutonomousActor : public ::frc971::autonomous::BaseAutonomousActor {
  public:
-  explicit AutonomousActor(::frc971::autonomous::AutonomousActionQueueGroup *s);
+  explicit AutonomousActor(::aos::EventLoop *event_loop,
+                           ::frc971::autonomous::AutonomousActionQueueGroup *s);
 
   bool RunAction(
       const ::frc971::autonomous::AutonomousActionParams &params) override;
@@ -180,6 +182,9 @@
 
   // Waits until y is within y of zero.
   bool WaitForDriveYCloseToZero(double y);
+
+  ::aos::Sender<::frc971::control_loops::drivetrain::LocalizerControl>
+      localizer_control_sender_;
 };
 
 }  // namespace actors
diff --git a/y2019/actors/autonomous_actor_main.cc b/y2019/actors/autonomous_actor_main.cc
index 0a77eb9..6fa55f7 100644
--- a/y2019/actors/autonomous_actor_main.cc
+++ b/y2019/actors/autonomous_actor_main.cc
@@ -1,5 +1,6 @@
 #include <stdio.h>
 
+#include "aos/events/shm-event-loop.h"
 #include "aos/init.h"
 #include "frc971/autonomous/auto.q.h"
 #include "y2019/actors/autonomous_actor.h"
@@ -7,8 +8,9 @@
 int main(int /*argc*/, char * /*argv*/ []) {
   ::aos::Init(-1);
 
+  ::aos::ShmEventLoop event_loop;
   ::y2019::actors::AutonomousActor autonomous(
-      &::frc971::autonomous::autonomous_action);
+      &event_loop, &::frc971::autonomous::autonomous_action);
   autonomous.Run();
 
   ::aos::Cleanup();
diff --git a/y2019/joystick_reader.cc b/y2019/joystick_reader.cc
index 58d1c36..2ae46f9 100644
--- a/y2019/joystick_reader.cc
+++ b/y2019/joystick_reader.cc
@@ -28,7 +28,6 @@
 #include "y2019/vision.pb.h"
 
 using ::y2019::control_loops::superstructure::superstructure_queue;
-using ::frc971::control_loops::drivetrain::localizer_control;
 using ::aos::input::driver_station::ButtonLocation;
 using ::aos::input::driver_station::ControlBit;
 using ::aos::input::driver_station::JoystickAxis;
@@ -144,7 +143,11 @@
         target_selector_hint_sender_(
             event_loop->MakeSender<
                 ::y2019::control_loops::drivetrain::TargetSelectorHint>(
-                ".y2019.control_loops.drivetrain.target_selector_hint")) {
+                ".y2019.control_loops.drivetrain.target_selector_hint")),
+        localizer_control_sender_(
+            event_loop->MakeSender<
+                ::frc971::control_loops::drivetrain::LocalizerControl>(
+                ".frc971.control_loops.drivetrain.localizer_control")) {
     const uint16_t team = ::aos::network::GetTeamNumber();
     superstructure_queue.goal.FetchLatest();
     if (superstructure_queue.goal.get()) {
@@ -205,7 +208,7 @@
     }
 
     if (data.PosEdge(kResetLocalizerLeft)) {
-      auto localizer_resetter = localizer_control.MakeMessage();
+      auto localizer_resetter = localizer_control_sender_.MakeMessage();
       // Start at the left feeder station.
       localizer_resetter->x = 0.6;
       localizer_resetter->y = 3.4;
@@ -217,7 +220,7 @@
     }
 
     if (data.PosEdge(kResetLocalizerRight)) {
-      auto localizer_resetter = localizer_control.MakeMessage();
+      auto localizer_resetter = localizer_control_sender_.MakeMessage();
       // Start at the left feeder station.
       localizer_resetter->x = 0.6;
       localizer_resetter->y = -3.4;
@@ -229,7 +232,7 @@
     }
 
     if (data.PosEdge(kResetLocalizerLeftForwards)) {
-      auto localizer_resetter = localizer_control.MakeMessage();
+      auto localizer_resetter = localizer_control_sender_.MakeMessage();
       // Start at the left feeder station.
       localizer_resetter->x = 0.4;
       localizer_resetter->y = 3.4;
@@ -241,7 +244,7 @@
     }
 
     if (data.PosEdge(kResetLocalizerLeftBackwards)) {
-      auto localizer_resetter = localizer_control.MakeMessage();
+      auto localizer_resetter = localizer_control_sender_.MakeMessage();
       // Start at the left feeder station.
       localizer_resetter->x = 0.4;
       localizer_resetter->y = 3.4;
@@ -253,7 +256,7 @@
     }
 
     if (data.PosEdge(kResetLocalizerRightForwards)) {
-      auto localizer_resetter = localizer_control.MakeMessage();
+      auto localizer_resetter = localizer_control_sender_.MakeMessage();
       // Start at the right feeder station.
       localizer_resetter->x = 0.4;
       localizer_resetter->y = -3.4;
@@ -265,7 +268,7 @@
     }
 
     if (data.PosEdge(kResetLocalizerRightBackwards)) {
-      auto localizer_resetter = localizer_control.MakeMessage();
+      auto localizer_resetter = localizer_control_sender_.MakeMessage();
       // Start at the right feeder station.
       localizer_resetter->x = 0.4;
       localizer_resetter->y = -3.4;
@@ -501,6 +504,9 @@
   ::aos::Sender<::y2019::control_loops::drivetrain::TargetSelectorHint>
       target_selector_hint_sender_;
 
+  ::aos::Sender<::frc971::control_loops::drivetrain::LocalizerControl>
+      localizer_control_sender_;
+
   // 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.
   bool was_above_ = false;