Create an enum for sender errors

Will replace usages of bools, and will now currently only be used
for indicating that messages were sent too fast

After we merge this commit we will replace this enum with a general
Status class for all of aos, similar to absl::Status.

Change-Id: I4b5b2e7685744b3c6826a241cd3c84190eaa96ee
Signed-off-by: milind-u <milind.upadhyay@gmail.com>
diff --git a/y2020/actors/autonomous_actor.cc b/y2020/actors/autonomous_actor.cc
index c8f1ebe..eb8ea42 100644
--- a/y2020/actors/autonomous_actor.cc
+++ b/y2020/actors/autonomous_actor.cc
@@ -189,7 +189,8 @@
   localizer_control_builder.add_theta_uncertainty(0.00001);
   LOG(INFO) << "User button pressed, x: " << start(0) << " y: " << start(1)
             << " theta: " << start(2);
-  if (!builder.Send(localizer_control_builder.Finish())) {
+  if (builder.Send(localizer_control_builder.Finish()) !=
+      aos::RawSender::Error::kOk) {
     AOS_LOG(ERROR, "Failed to reset localizer.\n");
   }
 }
@@ -368,7 +369,8 @@
   superstructure_builder.add_shooter_tracking(shooter_tracking_);
   superstructure_builder.add_shooting(shooting_);
 
-  if (!builder.Send(superstructure_builder.Finish())) {
+  if (builder.Send(superstructure_builder.Finish()) !=
+      aos::RawSender::Error::kOk) {
     AOS_LOG(ERROR, "Sending superstructure goal failed.\n");
   }
 }
diff --git a/y2020/actors/shooter_tuning_actor.cc b/y2020/actors/shooter_tuning_actor.cc
index fac55c6..a6c8d88 100644
--- a/y2020/actors/shooter_tuning_actor.cc
+++ b/y2020/actors/shooter_tuning_actor.cc
@@ -163,7 +163,8 @@
   superstructure_builder.add_shooter(shooter_offset);
   superstructure_builder.add_shooting(shooting_);
 
-  if (!builder.Send(superstructure_builder.Finish())) {
+  if (builder.Send(superstructure_builder.Finish()) !=
+      aos::RawSender::Error::kOk) {
     AOS_LOG(ERROR, "Sending superstructure goal failed.\n");
   }
 }
diff --git a/y2020/control_loops/drivetrain/localizer.cc b/y2020/control_loops/drivetrain/localizer.cc
index d4d5f72..505a598 100644
--- a/y2020/control_loops/drivetrain/localizer.cc
+++ b/y2020/control_loops/drivetrain/localizer.cc
@@ -199,7 +199,7 @@
         builder.MakeBuilder<LocalizerDebug>();
     debug_builder.add_matches(vector_offset);
     debug_builder.add_statistics(stats_offset);
-    CHECK(builder.Send(debug_builder.Finish()));
+    builder.CheckOk(builder.Send(debug_builder.Finish()));
   }
 }
 
@@ -303,7 +303,8 @@
     ImageMatchDebug::Builder builder(*fbb);
     builder.add_camera(camera_index);
     builder.add_pose_index(index);
-    builder.add_local_image_capture_time_ns(result.image_monotonic_timestamp_ns());
+    builder.add_local_image_capture_time_ns(
+        result.image_monotonic_timestamp_ns());
     builder.add_roborio_image_capture_time_ns(
         capture_time.time_since_epoch().count());
     builder.add_image_age_sec(aos::time::DurationInSeconds(now - capture_time));
@@ -390,8 +391,8 @@
                                  (2.0 * dt_config_.robot_radius) +
                              (is_turret ? turret_data.velocity : 0.0));
 
-    // Pay less attention to cameras that aren't actually on the turret, since they
-    // are less useful when it comes to actually making shots.
+    // Pay less attention to cameras that aren't actually on the turret, since
+    // they are less useful when it comes to actually making shots.
     if (!is_turret) {
       noises *= 3.0;
     } else {
diff --git a/y2020/control_loops/drivetrain/localizer_test.cc b/y2020/control_loops/drivetrain/localizer_test.cc
index 8ccb55c..18df813 100644
--- a/y2020/control_loops/drivetrain/localizer_test.cc
+++ b/y2020/control_loops/drivetrain/localizer_test.cc
@@ -192,7 +192,8 @@
           auto statistics_builder =
               builder.MakeBuilder<aos::message_bridge::ServerStatistics>();
           statistics_builder.add_connections(connections_offset);
-          builder.Send(statistics_builder.Finish());
+          CHECK_EQ(builder.Send(statistics_builder.Finish()),
+                   aos::RawSender::Error::kOk);
         },
         chrono::milliseconds(500));
 
@@ -210,7 +211,8 @@
           auto turret_offset = turret_builder.Finish();
           auto status_builder = builder.MakeBuilder<superstructure::Status>();
           status_builder.add_turret(turret_offset);
-          builder.Send(status_builder.Finish());
+          CHECK_EQ(builder.Send(status_builder.Finish()),
+                   aos::RawSender::Error::kOk);
         },
         chrono::milliseconds(5));
 
@@ -341,8 +343,10 @@
            std::get<0>(camera_delay_queue_.front()) <
                monotonic_now() - camera_latency) {
       auto builder = camera_sender_.MakeBuilder();
-      ASSERT_TRUE(builder.Send(ImageMatchResult::Pack(
-          *builder.fbb(), std::get<1>(camera_delay_queue_.front()).get())));
+      ASSERT_EQ(
+          builder.Send(ImageMatchResult::Pack(
+              *builder.fbb(), std::get<1>(camera_delay_queue_.front()).get())),
+          aos::RawSender::Error::kOk);
       camera_delay_queue_.pop();
     }
   }
@@ -402,7 +406,8 @@
     drivetrain_builder.add_left_goal(left);
     drivetrain_builder.add_right_goal(right);
 
-    EXPECT_TRUE(builder.Send(drivetrain_builder.Finish()));
+    EXPECT_EQ(builder.Send(drivetrain_builder.Finish()),
+              aos::RawSender::Error::kOk);
   }
 
  private:
@@ -608,8 +613,8 @@
       [this](int) {
         auto builder = camera_sender_.MakeBuilder();
         ImageMatchResultT image;
-        ASSERT_TRUE(
-            builder.Send(ImageMatchResult::Pack(*builder.fbb(), &image)));
+        ASSERT_EQ(builder.Send(ImageMatchResult::Pack(*builder.fbb(), &image)),
+                  aos::RawSender::Error::kOk);
       },
       std::chrono::milliseconds(40));
   test_event_loop_
diff --git a/y2020/control_loops/superstructure/shooter/shooter_tuning_params_setter.cc b/y2020/control_loops/superstructure/shooter/shooter_tuning_params_setter.cc
index 3c6158e..68bb243 100644
--- a/y2020/control_loops/superstructure/shooter/shooter_tuning_params_setter.cc
+++ b/y2020/control_loops/superstructure/shooter/shooter_tuning_params_setter.cc
@@ -52,7 +52,7 @@
   tuning_params_builder.add_finisher(finisher_params);
   tuning_params_builder.add_accelerator(accelerator_params);
   tuning_params_builder.add_balls_per_iteration(FLAGS_balls_per_iteration);
-  CHECK(builder.Send(tuning_params_builder.Finish()));
+  builder.CheckOk(builder.Send(tuning_params_builder.Finish()));
 
   return 0;
 }
diff --git a/y2020/control_loops/superstructure/superstructure.cc b/y2020/control_loops/superstructure/superstructure.cc
index 2f07dc5..bd1e74c 100644
--- a/y2020/control_loops/superstructure/superstructure.cc
+++ b/y2020/control_loops/superstructure/superstructure.cc
@@ -81,9 +81,9 @@
                          CreateStaticZeroingSingleDOFProfiledSubsystemGoal(
                              *hood_goal.fbb(), shot_params.hood_angle));
 
-    shooter_goal.Finish(CreateShooterGoal(
-        *shooter_goal.fbb(), shot_params.velocity_accelerator,
-        shot_params.velocity_finisher));
+    shooter_goal.Finish(CreateShooterGoal(*shooter_goal.fbb(),
+                                          shot_params.velocity_accelerator,
+                                          shot_params.velocity_finisher));
   } else {
     hood_goal.Finish(
         frc971::control_loops::
@@ -242,7 +242,9 @@
   status_builder.add_aimer(aimer_status_offset);
   status_builder.add_subsystems_not_ready(subsystems_not_ready_offset);
 
-  status->Send(status_builder.Finish());
+  status_builder.add_send_failures(status_failure_counter_.failures());
+
+  status_failure_counter_.Count(status->Send(status_builder.Finish()));
 
   if (output != nullptr) {
     output_struct.washing_machine_spinner_voltage = 0.0;
@@ -302,7 +304,7 @@
       }
     }
 
-    output->Send(Output::Pack(*output->fbb(), &output_struct));
+    output->CheckOk(output->Send(Output::Pack(*output->fbb(), &output_struct)));
   }
 }
 
diff --git a/y2020/control_loops/superstructure/superstructure.h b/y2020/control_loops/superstructure/superstructure.h
index 7f565cf..5d371fc 100644
--- a/y2020/control_loops/superstructure/superstructure.h
+++ b/y2020/control_loops/superstructure/superstructure.h
@@ -80,6 +80,8 @@
 
   bool has_turret_ = true;
 
+  aos::SendFailureCounter status_failure_counter_;
+
   DISALLOW_COPY_AND_ASSIGN(Superstructure);
 };
 
diff --git a/y2020/control_loops/superstructure/superstructure_lib_test.cc b/y2020/control_loops/superstructure/superstructure_lib_test.cc
index 0e51b7b..e41c421 100644
--- a/y2020/control_loops/superstructure/superstructure_lib_test.cc
+++ b/y2020/control_loops/superstructure/superstructure_lib_test.cc
@@ -10,6 +10,7 @@
 #include "frc971/control_loops/control_loop_test.h"
 #include "frc971/control_loops/position_sensor_sim.h"
 #include "frc971/control_loops/team_number_test_environment.h"
+#include "glog/logging.h"
 #include "gtest/gtest.h"
 #include "y2020/constants.h"
 #include "y2020/control_loops/superstructure/accelerator/accelerator_plant.h"
@@ -207,7 +208,8 @@
     position_builder.add_intake_beambreak_triggered(
         intake_beambreak_triggered_);
 
-    builder.Send(position_builder.Finish());
+    CHECK_EQ(builder.Send(position_builder.Finish()),
+             aos::RawSender::Error::kOk);
   }
 
   double hood_position() const { return hood_plant_->X(0, 0); }
@@ -571,7 +573,8 @@
       goal_builder.add_roller_voltage(roller_voltage);
       goal_builder.add_roller_speed_compensation(roller_speed_compensation);
       goal_builder.add_shooting(shooting);
-      ASSERT_TRUE(builder.Send(goal_builder.Finish()));
+      ASSERT_EQ(builder.Send(goal_builder.Finish()),
+                aos::RawSender::Error::kOk);
     }
     RunFor(chrono::seconds(1));
     superstructure_output_fetcher_.Fetch();
@@ -590,7 +593,7 @@
 
           Goal::Builder goal_builder = builder.MakeBuilder<Goal>();
           goal_builder.add_shooter(shooter_goal_offset);
-          ASSERT_TRUE(builder.Send(goal_builder.Finish()));
+          builder.CheckOk(builder.Send(goal_builder.Finish()));
         },
         dt());
   }
@@ -683,7 +686,8 @@
     goal_builder.add_turret(turret_offset);
     goal_builder.add_shooter(shooter_offset);
 
-    ASSERT_TRUE(builder.Send(goal_builder.Finish()));
+    ASSERT_EQ(builder.Send(goal_builder.Finish()),
+              aos::RawSender::Error::kOk);
   }
   RunFor(chrono::seconds(10));
   VerifyNearGoal();
@@ -729,7 +733,8 @@
     goal_builder.add_turret(turret_offset);
     goal_builder.add_shooter(shooter_offset);
 
-    ASSERT_TRUE(builder.Send(goal_builder.Finish()));
+    ASSERT_EQ(builder.Send(goal_builder.Finish()),
+              aos::RawSender::Error::kOk);
   }
 
   // Give it a lot of time to get there.
@@ -770,7 +775,8 @@
     goal_builder.add_turret(turret_offset);
     goal_builder.add_shooter(shooter_offset);
 
-    ASSERT_TRUE(builder.Send(goal_builder.Finish()));
+    ASSERT_EQ(builder.Send(goal_builder.Finish()),
+              aos::RawSender::Error::kOk);
   }
   RunFor(chrono::seconds(8));
   VerifyNearGoal();
@@ -804,7 +810,8 @@
     goal_builder.add_turret(turret_offset);
     goal_builder.add_shooter(shooter_offset);
 
-    ASSERT_TRUE(builder.Send(goal_builder.Finish()));
+    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.
@@ -858,7 +865,8 @@
     goal_builder.add_shooter(shooter_offset);
     goal_builder.add_shooting(true);
 
-    ASSERT_TRUE(builder.Send(goal_builder.Finish()));
+    ASSERT_EQ(builder.Send(goal_builder.Finish()),
+              aos::RawSender::Error::kOk);
   }
 
   // In the beginning, the finisher and accelerator should not be ready
@@ -903,7 +911,8 @@
     goal_builder.add_intake(intake_offset);
     goal_builder.add_shooter(shooter_offset);
 
-    ASSERT_TRUE(builder.Send(goal_builder.Finish()));
+    ASSERT_EQ(builder.Send(goal_builder.Finish()),
+              aos::RawSender::Error::kOk);
   }
 
   // Give it a lot of time to get there.
@@ -952,7 +961,8 @@
     goal_builder.add_climber_voltage(-10.0);
     goal_builder.add_turret(turret_offset);
 
-    ASSERT_TRUE(builder.Send(goal_builder.Finish()));
+    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.
@@ -976,7 +986,8 @@
     goal_builder.add_climber_voltage(10.0);
     goal_builder.add_turret(turret_offset);
 
-    ASSERT_TRUE(builder.Send(goal_builder.Finish()));
+    ASSERT_EQ(builder.Send(goal_builder.Finish()),
+              aos::RawSender::Error::kOk);
   }
   RunFor(chrono::seconds(1));
 
@@ -999,7 +1010,7 @@
 
     goal_builder.add_intake_preloading(true);
 
-    ASSERT_TRUE(builder.Send(goal_builder.Finish()));
+    builder.CheckOk(builder.Send(goal_builder.Finish()));
   }
 
   superstructure_plant_.set_intake_beambreak_triggered(false);
@@ -1233,7 +1244,7 @@
                                         std::sin(kShotAngle) * kShotDistance);
         drivetrain_status_builder.add_localizer(localizer_offset);
 
-        ASSERT_TRUE(builder.Send(drivetrain_status_builder.Finish()));
+        builder.CheckOk(builder.Send(drivetrain_status_builder.Finish()));
       },
       frc971::controls::kLoopFrequency);
 
@@ -1255,7 +1266,8 @@
 
     joystick_builder.add_alliance(GetParam());
 
-    ASSERT_TRUE(builder.Send(joystick_builder.Finish()));
+    ASSERT_EQ(builder.Send(joystick_builder.Finish()),
+              aos::RawSender::Error::kOk);
   }
 };
 
@@ -1277,7 +1289,8 @@
 
     goal_builder.add_turret_tracking(true);
 
-    ASSERT_TRUE(builder.Send(goal_builder.Finish()));
+    ASSERT_EQ(builder.Send(goal_builder.Finish()),
+              aos::RawSender::Error::kOk);
   }
 
   {
@@ -1299,7 +1312,8 @@
     status_builder.add_theta(0.0);
     status_builder.add_localizer(localizer_offset);
 
-    ASSERT_TRUE(builder.Send(status_builder.Finish()));
+    ASSERT_EQ(builder.Send(status_builder.Finish()),
+              aos::RawSender::Error::kOk);
   }
 
   // Give it time to stabilize.
@@ -1333,7 +1347,8 @@
     goal_builder.add_shooter(shooter_goal);
     goal_builder.add_hood(hood_offset);
 
-    builder.Send(goal_builder.Finish());
+    CHECK_EQ(builder.Send(goal_builder.Finish()),
+             aos::RawSender::Error::kOk);
   }
 
   RunFor(chrono::seconds(10));
@@ -1381,7 +1396,8 @@
     status_builder.add_theta(0.0);
     status_builder.add_localizer(localizer_offset);
 
-    ASSERT_TRUE(builder.Send(status_builder.Finish()));
+    ASSERT_EQ(builder.Send(status_builder.Finish()),
+              aos::RawSender::Error::kOk);
   }
   {
     auto builder = superstructure_goal_sender_.MakeBuilder();
@@ -1399,7 +1415,8 @@
     goal_builder.add_shooter_tracking(true);
     goal_builder.add_hood_tracking(true);
 
-    builder.Send(goal_builder.Finish());
+    CHECK_EQ(builder.Send(goal_builder.Finish()),
+             aos::RawSender::Error::kOk);
   }
   RunFor(chrono::seconds(10));
 
@@ -1450,7 +1467,8 @@
     status_builder.add_theta(0.0);
     status_builder.add_localizer(localizer_offset);
 
-    ASSERT_TRUE(builder.Send(status_builder.Finish()));
+    ASSERT_EQ(builder.Send(status_builder.Finish()),
+              aos::RawSender::Error::kOk);
   }
   {
     auto builder = superstructure_goal_sender_.MakeBuilder();
@@ -1468,7 +1486,8 @@
     goal_builder.add_shooter_tracking(true);
     goal_builder.add_hood_tracking(true);
 
-    builder.Send(goal_builder.Finish());
+    CHECK_EQ(builder.Send(goal_builder.Finish()),
+             aos::RawSender::Error::kOk);
   }
   RunFor(chrono::seconds(10));
 
diff --git a/y2020/control_loops/superstructure/superstructure_status.fbs b/y2020/control_loops/superstructure/superstructure_status.fbs
index 4a977b8..611661c 100644
--- a/y2020/control_loops/superstructure/superstructure_status.fbs
+++ b/y2020/control_loops/superstructure/superstructure_status.fbs
@@ -87,6 +87,9 @@
 
   // Vector of the subsystems that are not at goal and are preventing shooting.
   subsystems_not_ready:[Subsystem] (id: 8);
+
+  // Total number of status send failures.
+  send_failures:uint64 (id: 9);
 }
 
 root_type Status;
diff --git a/y2020/joystick_reader.cc b/y2020/joystick_reader.cc
index dd98e63..f1237e1 100644
--- a/y2020/joystick_reader.cc
+++ b/y2020/joystick_reader.cc
@@ -87,7 +87,8 @@
     localizer_control_builder.add_theta_uncertainty(10.0);
     localizer_control_builder.add_theta(0.0);
     localizer_control_builder.add_keep_current_theta(false);
-    if (!builder.Send(localizer_control_builder.Finish())) {
+    if (builder.Send(localizer_control_builder.Finish()) !=
+        aos::RawSender::Error::kOk) {
       AOS_LOG(ERROR, "Failed to reset blue localizer.\n");
     }
   }
@@ -103,7 +104,8 @@
     localizer_control_builder.add_theta_uncertainty(10.0);
     localizer_control_builder.add_theta(M_PI);
     localizer_control_builder.add_keep_current_theta(false);
-    if (!builder.Send(localizer_control_builder.Finish())) {
+    if (builder.Send(localizer_control_builder.Finish()) !=
+        aos::RawSender::Error::kOk) {
       AOS_LOG(ERROR, "Failed to reset red localizer.\n");
     }
   }
@@ -129,7 +131,8 @@
         frc971::zeroing::Wrap(drivetrain_status->theta(), 0, M_PI);
     localizer_control_builder.add_theta(new_theta);
     localizer_control_builder.add_theta_uncertainty(10.0);
-    if (!builder.Send(localizer_control_builder.Finish())) {
+    if (builder.Send(localizer_control_builder.Finish()) !=
+        aos::RawSender::Error::kOk) {
       AOS_LOG(ERROR, "Failed to reset localizer.\n");
     }
   }
@@ -303,7 +306,8 @@
            data.IsPressed(kFeedDriver)));
       superstructure_goal_builder.add_intake_preloading(preload_intake);
 
-      if (!builder.Send(superstructure_goal_builder.Finish())) {
+      if (builder.Send(superstructure_goal_builder.Finish()) !=
+          aos::RawSender::Error::kOk) {
         AOS_LOG(ERROR, "Sending superstructure goal failed.\n");
       }
     }
diff --git a/y2020/setpoint_setter.cc b/y2020/setpoint_setter.cc
index 1e1a7b8..e04fe41 100644
--- a/y2020/setpoint_setter.cc
+++ b/y2020/setpoint_setter.cc
@@ -1,6 +1,7 @@
 #include "aos/events/shm_event_loop.h"
 #include "aos/init.h"
 #include "gflags/gflags.h"
+#include "glog/logging.h"
 #include "y2020/setpoint_generated.h"
 
 DEFINE_double(accelerator, 250.0, "Accelerator speed");
@@ -29,7 +30,7 @@
   setpoint_builder.add_finisher(FLAGS_finisher);
   setpoint_builder.add_hood(FLAGS_hood);
   setpoint_builder.add_turret(FLAGS_turret);
-  builder.Send(setpoint_builder.Finish());
+  builder.CheckOk(builder.Send(setpoint_builder.Finish()));
 
   return 0;
 }
diff --git a/y2020/vision/camera_reader.cc b/y2020/vision/camera_reader.cc
index e908a47..b13c19c 100644
--- a/y2020/vision/camera_reader.cc
+++ b/y2020/vision/camera_reader.cc
@@ -165,6 +165,7 @@
   std::vector<cv::FlannBasedMatcher> matchers_;
   aos::Sender<CameraImage> image_sender_;
   aos::Sender<sift::ImageMatchResult> result_sender_;
+  aos::SendFailureCounter result_failure_counter_;
   aos::Sender<sift::ImageMatchResult> detailed_result_sender_;
   // We schedule this immediately to read an image. Having it on a timer means
   // other things can run on the event loop in between.
@@ -289,10 +290,11 @@
   result_builder.add_image_monotonic_timestamp_ns(
       image.monotonic_timestamp_ns());
   result_builder.add_camera_calibration(camera_calibration_offset);
+  result_builder.add_send_failures(result_failure_counter_.failures());
 
   // TODO<Jim>: Need to add target point computed from matches and
   // mapped by homography
-  builder.Send(result_builder.Finish());
+  result_failure_counter_.Count(builder.Send(result_builder.Finish()));
 }
 
 void CameraReader::ProcessImage(const CameraImage &image) {
@@ -713,7 +715,8 @@
   {
     aos::Sender<sift::TrainingData> training_data_sender =
         event_loop.MakeSender<sift::TrainingData>("/camera");
-    training_data_sender.Send(training_data);
+    CHECK_EQ(training_data_sender.Send(training_data),
+             aos::RawSender::Error::kOk);
   }
 
   V4L2Reader v4l2_reader(&event_loop, "/dev/video0");
diff --git a/y2020/vision/sift/sift.fbs b/y2020/vision/sift/sift.fbs
index 427b91c..3336d0c 100644
--- a/y2020/vision/sift/sift.fbs
+++ b/y2020/vision/sift/sift.fbs
@@ -167,6 +167,9 @@
 
   // Information about the camera which took this image.
   camera_calibration:CameraCalibration (id: 4);
+
+  // Total number of match result send failures.
+  send_failures:uint64 (id: 5);
 }
 
 root_type ImageMatchResult;
diff --git a/y2020/vision/v4l2_reader.h b/y2020/vision/v4l2_reader.h
index 3c9d795..04548d6 100644
--- a/y2020/vision/v4l2_reader.h
+++ b/y2020/vision/v4l2_reader.h
@@ -53,7 +53,7 @@
                         aos::monotonic_clock::time_point monotonic_eof);
 
     void Send() {
-      builder.Send(message_offset);
+      (void)builder.Send(message_offset);
       message_offset = flatbuffers::Offset<CameraImage>();
     }
 
diff --git a/y2020/wpilib_interface.cc b/y2020/wpilib_interface.cc
index 1b732bc..f746970 100644
--- a/y2020/wpilib_interface.cc
+++ b/y2020/wpilib_interface.cc
@@ -243,7 +243,7 @@
       drivetrain_builder.add_right_speed(-drivetrain_velocity_translate(
           drivetrain_right_encoder_->GetPeriod()));
 
-      builder.Send(drivetrain_builder.Finish());
+      builder.CheckOk(builder.Send(drivetrain_builder.Finish()));
     }
     const constants::Values &values = constants::GetValues();
 
@@ -306,7 +306,7 @@
       position_builder.add_intake_beambreak_triggered(
           ball_intake_beambreak_->Get());
 
-      builder.Send(position_builder.Finish());
+      builder.CheckOk(builder.Send(position_builder.Finish()));
     }
 
     {
@@ -324,7 +324,7 @@
 
       auto_mode_builder.add_mode(mode);
 
-      builder.Send(auto_mode_builder.Finish());
+      builder.CheckOk(builder.Send(auto_mode_builder.Finish()));
     }
 
     if (FLAGS_shooter_tuning) {
@@ -339,7 +339,7 @@
             builder.MakeBuilder<superstructure::shooter::TuningReadings>();
         shooter_tuning_readings_builder.add_velocity_ball(
             kDistanceBetweenBeambreaks / ball_beambreak_reader_.last_width());
-        builder.Send(shooter_tuning_readings_builder.Finish());
+        builder.CheckOk(builder.Send(shooter_tuning_readings_builder.Finish()));
       }
     }
   }
@@ -625,7 +625,8 @@
     std::unique_ptr<frc971::wpilib::ADIS16448> old_imu;
     std::unique_ptr<frc971::wpilib::ADIS16470> new_imu;
     std::unique_ptr<frc::SPI> imu_spi;
-    if (::aos::network::GetTeamNumber() != constants::Values::kCodingRobotTeamNumber) {
+    if (::aos::network::GetTeamNumber() !=
+        constants::Values::kCodingRobotTeamNumber) {
       old_imu = make_unique<frc971::wpilib::ADIS16448>(
           &imu_event_loop, spi_port, imu_trigger.get());
       old_imu->SetDummySPI(frc::SPI::Port::kOnboardCS2);