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/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;