Make swerve_control_loops use continuous controller & zeroing

This updates the per-module control code to make use of the continuous
control loops and to actually zero the modules so that we can do simple
data collection.

Future TODOs:
* Update the control loop to use the static flatbuffers API.

Change-Id: I40c41fb207cbee9ddc3c31d4b5b023da468964d8
Signed-off-by: James Kuszmaul <jabukuszmaul+collab@gmail.com>
diff --git a/y2024_swerve/BUILD b/y2024_swerve/BUILD
index e432358..2357c6e 100644
--- a/y2024_swerve/BUILD
+++ b/y2024_swerve/BUILD
@@ -32,6 +32,7 @@
         "//aos/starter:irq_affinity",
         ":wpilib_interface",
         ":swerve_publisher",
+        "//y2024_swerve/control_loops:swerve_control_loops",
         "//frc971/can_logger",
         "//aos/network:message_bridge_client",
         "//aos/network:message_bridge_server",
diff --git a/y2024_swerve/control_loops/BUILD b/y2024_swerve/control_loops/BUILD
index 67fa349..0417af9 100644
--- a/y2024_swerve/control_loops/BUILD
+++ b/y2024_swerve/control_loops/BUILD
@@ -1,5 +1,21 @@
 load("//tools/build_rules:js.bzl", "ts_project")
 
+cc_binary(
+    name = "swerve_control_loops",
+    srcs = [
+        "swerve_control_loops_main.cc",
+    ],
+    visibility = ["//visibility:public"],
+    deps = [
+        "//aos:init",
+        "//aos/events:shm_event_loop",
+        "//aos/time",
+        "//frc971/constants:constants_sender_lib",
+        "//frc971/control_loops/swerve:swerve_control_loops",
+        "//y2024_swerve/constants:constants_fbs",
+    ],
+)
+
 ts_project(
     name = "swerve_plotter",
     srcs = ["swerve_plotter.ts"],
diff --git a/y2024_swerve/control_loops/swerve_control_loops_main.cc b/y2024_swerve/control_loops/swerve_control_loops_main.cc
new file mode 100644
index 0000000..813744a
--- /dev/null
+++ b/y2024_swerve/control_loops/swerve_control_loops_main.cc
@@ -0,0 +1,30 @@
+#include "aos/events/shm_event_loop.h"
+#include "aos/init.h"
+#include "frc971/constants/constants_sender_lib.h"
+#include "frc971/control_loops/swerve/swerve_control_loops.h"
+#include "y2024_swerve/constants/constants_generated.h"
+
+using frc971::control_loops::swerve::SwerveControlLoops;
+
+int main(int argc, char **argv) {
+  ::aos::InitGoogle(&argc, &argv);
+
+  aos::FlatbufferDetachedBuffer<aos::Configuration> config =
+      aos::configuration::ReadConfig("aos_config.json");
+
+  frc971::constants::WaitForConstants<y2024_swerve::Constants>(
+      &config.message());
+
+  ::aos::ShmEventLoop event_loop(&config.message());
+
+  frc971::constants::ConstantsFetcher<y2024_swerve::Constants> constants(
+      &event_loop);
+
+  SwerveControlLoops swerve_control_loops(
+      &event_loop, constants.constants().common()->rotation(),
+      constants.constants().robot()->swerve_zeroing(), "/drivetrain");
+
+  event_loop.Run();
+
+  return 0;
+}