Add a sent too fast check for simulation and shm

Returns an error if more than queue_size (frequency *
channel_storage_duration) messages were sent in one
channel_storage_duration.

Signed-off-by: Eric Schmiedeberg <eric.schmiedeberg@bluerivertech.com>
Change-Id: Ie41205ba37b66930d8a9082f2d85d7dc3388e3bf
diff --git a/y2020/control_loops/drivetrain/localizer_test.cc b/y2020/control_loops/drivetrain/localizer_test.cc
index cc04428..f0bcd88 100644
--- a/y2020/control_loops/drivetrain/localizer_test.cc
+++ b/y2020/control_loops/drivetrain/localizer_test.cc
@@ -603,7 +603,7 @@
 // Tests that we don't blow up if we stop getting updates for an extended period
 // of time and fall behind on fetching fron the cameras.
 TEST_F(LocalizedDrivetrainTest, FetchersHandleTimeGap) {
-  set_enable_cameras(true);
+  set_enable_cameras(false);
   set_send_delay(std::chrono::seconds(0));
   event_loop_factory()->set_network_delay(std::chrono::nanoseconds(1));
   test_event_loop_
diff --git a/y2020/control_loops/superstructure/superstructure_lib_test.cc b/y2020/control_loops/superstructure/superstructure_lib_test.cc
index 1bbf42b..b13263a 100644
--- a/y2020/control_loops/superstructure/superstructure_lib_test.cc
+++ b/y2020/control_loops/superstructure/superstructure_lib_test.cc
@@ -686,8 +686,7 @@
     goal_builder.add_turret(turret_offset);
     goal_builder.add_shooter(shooter_offset);
 
-    ASSERT_EQ(builder.Send(goal_builder.Finish()),
-              aos::RawSender::Error::kOk);
+    ASSERT_EQ(builder.Send(goal_builder.Finish()), aos::RawSender::Error::kOk);
   }
   RunFor(chrono::seconds(10));
   VerifyNearGoal();
@@ -733,8 +732,7 @@
     goal_builder.add_turret(turret_offset);
     goal_builder.add_shooter(shooter_offset);
 
-    ASSERT_EQ(builder.Send(goal_builder.Finish()),
-              aos::RawSender::Error::kOk);
+    ASSERT_EQ(builder.Send(goal_builder.Finish()), aos::RawSender::Error::kOk);
   }
 
   // Give it a lot of time to get there.
@@ -775,8 +773,7 @@
     goal_builder.add_turret(turret_offset);
     goal_builder.add_shooter(shooter_offset);
 
-    ASSERT_EQ(builder.Send(goal_builder.Finish()),
-              aos::RawSender::Error::kOk);
+    ASSERT_EQ(builder.Send(goal_builder.Finish()), aos::RawSender::Error::kOk);
   }
   RunFor(chrono::seconds(8));
   VerifyNearGoal();
@@ -810,8 +807,7 @@
     goal_builder.add_turret(turret_offset);
     goal_builder.add_shooter(shooter_offset);
 
-    ASSERT_EQ(builder.Send(goal_builder.Finish()),
-              aos::RawSender::Error::kOk);
+    ASSERT_EQ(builder.Send(goal_builder.Finish()), aos::RawSender::Error::kOk);
   }
   superstructure_plant_.set_peak_hood_velocity(23.0);
   // 30 hz sin wave on the hood causes acceleration to be ignored.
@@ -865,8 +861,7 @@
     goal_builder.add_shooter(shooter_offset);
     goal_builder.add_shooting(true);
 
-    ASSERT_EQ(builder.Send(goal_builder.Finish()),
-              aos::RawSender::Error::kOk);
+    ASSERT_EQ(builder.Send(goal_builder.Finish()), aos::RawSender::Error::kOk);
   }
 
   // In the beginning, the finisher and accelerator should not be ready
@@ -911,8 +906,7 @@
     goal_builder.add_intake(intake_offset);
     goal_builder.add_shooter(shooter_offset);
 
-    ASSERT_EQ(builder.Send(goal_builder.Finish()),
-              aos::RawSender::Error::kOk);
+    ASSERT_EQ(builder.Send(goal_builder.Finish()), aos::RawSender::Error::kOk);
   }
 
   // Give it a lot of time to get there.
@@ -961,8 +955,7 @@
     goal_builder.add_climber_voltage(-10.0);
     goal_builder.add_turret(turret_offset);
 
-    ASSERT_EQ(builder.Send(goal_builder.Finish()),
-              aos::RawSender::Error::kOk);
+    ASSERT_EQ(builder.Send(goal_builder.Finish()), aos::RawSender::Error::kOk);
   }
 
   // The turret needs to move out of the way first.  This takes some time.
@@ -986,8 +979,7 @@
     goal_builder.add_climber_voltage(10.0);
     goal_builder.add_turret(turret_offset);
 
-    ASSERT_EQ(builder.Send(goal_builder.Finish()),
-              aos::RawSender::Error::kOk);
+    ASSERT_EQ(builder.Send(goal_builder.Finish()), aos::RawSender::Error::kOk);
   }
   RunFor(chrono::seconds(1));
 
@@ -1175,6 +1167,8 @@
                                "y2020.control_loops.superstructure.Status");
     reader_.RemapLoggedChannel("/superstructure",
                                "y2020.control_loops.superstructure.Output");
+    reader_.RemapLoggedChannel("/drivetrain",
+                               "frc971.control_loops.drivetrain.Status");
     reader_.Register();
 
     roborio_ = aos::configuration::GetNode(reader_.configuration(), "roborio");
@@ -1221,32 +1215,27 @@
   constexpr double kShotDistance = 2.5;
   const auto target = turret::OuterPortPose(aos::Alliance::kRed);
 
-  // There was no target when this log was taken so send a position within range
-  // of the interpolation table.
-  test_event_loop_->AddPhasedLoop(
-      [&](int) {
-        auto builder = drivetrain_status_sender_.MakeBuilder();
+  // There was no target when this log was taken, so send a position within
+  // range of the interpolation table.
+  {
+    auto builder = drivetrain_status_sender_.MakeBuilder();
 
-        const auto localizer_offset =
-            builder
-                .MakeBuilder<
-                    frc971::control_loops::drivetrain::LocalizerState>()
-                .Finish();
+    const auto localizer_offset =
+        builder.MakeBuilder<frc971::control_loops::drivetrain::LocalizerState>()
+            .Finish();
 
-        auto drivetrain_status_builder =
-            builder.MakeBuilder<DrivetrainStatus>();
+    auto drivetrain_status_builder = builder.MakeBuilder<DrivetrainStatus>();
 
-        // Set the robot up at kShotAngle off from the target, kShotDistance
-        // away.
-        drivetrain_status_builder.add_x(target.abs_pos().x() +
-                                        std::cos(kShotAngle) * kShotDistance);
-        drivetrain_status_builder.add_y(target.abs_pos().y() +
-                                        std::sin(kShotAngle) * kShotDistance);
-        drivetrain_status_builder.add_localizer(localizer_offset);
+    // Set the robot up at kShotAngle off from the target, kShotDistance
+    // away.
+    drivetrain_status_builder.add_x(target.abs_pos().x() +
+                                    std::cos(kShotAngle) * kShotDistance);
+    drivetrain_status_builder.add_y(target.abs_pos().y() +
+                                    std::sin(kShotAngle) * kShotDistance);
+    drivetrain_status_builder.add_localizer(localizer_offset);
 
-        builder.CheckOk(builder.Send(drivetrain_status_builder.Finish()));
-      },
-      frc971::controls::kLoopFrequency);
+    builder.CheckOk(builder.Send(drivetrain_status_builder.Finish()));
+  }
 
   reader_.event_loop_factory()->Run();
 
@@ -1289,8 +1278,7 @@
 
     goal_builder.add_turret_tracking(true);
 
-    ASSERT_EQ(builder.Send(goal_builder.Finish()),
-              aos::RawSender::Error::kOk);
+    ASSERT_EQ(builder.Send(goal_builder.Finish()), aos::RawSender::Error::kOk);
   }
 
   {
@@ -1347,8 +1335,7 @@
     goal_builder.add_shooter(shooter_goal);
     goal_builder.add_hood(hood_offset);
 
-    CHECK_EQ(builder.Send(goal_builder.Finish()),
-             aos::RawSender::Error::kOk);
+    CHECK_EQ(builder.Send(goal_builder.Finish()), aos::RawSender::Error::kOk);
   }
 
   RunFor(chrono::seconds(10));
@@ -1415,8 +1402,7 @@
     goal_builder.add_shooter_tracking(true);
     goal_builder.add_hood_tracking(true);
 
-    CHECK_EQ(builder.Send(goal_builder.Finish()),
-             aos::RawSender::Error::kOk);
+    CHECK_EQ(builder.Send(goal_builder.Finish()), aos::RawSender::Error::kOk);
   }
   RunFor(chrono::seconds(10));
 
@@ -1486,8 +1472,7 @@
     goal_builder.add_shooter_tracking(true);
     goal_builder.add_hood_tracking(true);
 
-    CHECK_EQ(builder.Send(goal_builder.Finish()),
-             aos::RawSender::Error::kOk);
+    CHECK_EQ(builder.Send(goal_builder.Finish()), aos::RawSender::Error::kOk);
   }
   RunFor(chrono::seconds(10));