Merge "Revert "Make the detection pixel border 10 pixels""
diff --git a/y2024/constants/7971.json b/y2024/constants/7971.json
index 2fe58cf..6e72615 100644
--- a/y2024/constants/7971.json
+++ b/y2024/constants/7971.json
@@ -11,13 +11,13 @@
       "calibration": {% include 'y2024/constants/calib_files/calibration_imu-7971-0_cam-24-01_2024-03-02_19-44-12.098903651.json' %}
     },
     {
-      "calibration": {% include 'y2024/constants/calib_files/calibration_orin-7971-1-0_cam-24-04_2024-03-03_00-43-52.104451759.json' %}
+      "calibration": {% include 'y2024/constants/calib_files/calibration_orin1-7971-0_cam-24-04_2024-03-23_13-05-40.json' %}
     },
     {
-      "calibration": {% include 'y2024/constants/calib_files/calibration_orin-7971-1-1_cam-24-02_2024-03-03_00-43-52.104348086.json' %}
+      "calibration": {% include 'y2024/constants/calib_files/calibration_orin1-7971-1_cam-24-02_2024-03-23_13-05-40.json' %}
     },
     {
-      "calibration": {% include 'y2024/constants/calib_files/calibration_orin-7971-c-1_cam-24-03_2024-03-03_00-43-52.104098137.json' %}
+      "calibration": {% include 'y2024/constants/calib_files/calibration_imu-7971-1_cam-24-03_2024-03-23_13-05-40.json' %}
     }
   ],
   "robot": {
diff --git a/y2024/constants/9971.json b/y2024/constants/9971.json
index 23cad58..da8ed92 100644
--- a/y2024/constants/9971.json
+++ b/y2024/constants/9971.json
@@ -8,8 +8,17 @@
 {
   "cameras": [
     {
-      "calibration": {% include 'y2024/constants/calib_files/calibration_orin-971-1_cam-24-00.json' %}
-    }
+      "calibration": {% include 'y2024/constants/calib_files/calibration_imu-9971-1-0_cam-24-10_2024-02-24_16-44-05.975708672.json' %}
+    },
+    {
+      "calibration": {% include 'y2024/constants/calib_files/calibration_imu-9971-1-1_cam-24-12_2024-02-24_19-52-39.488095264.json' %}
+    },
+    {
+      "calibration": {% include 'y2024/constants/calib_files/calibration_orin-9971-1-0_cam-24-09_2024-02-24_16-10-16.872521280.json' %}
+    },
+    {
+      "calibration": {% include 'y2024/constants/calib_files/calibration_orin-9971-1-1_cam-24-11_2024-02-24_16-44-06.986729504.json' %}
+    },
   ],
   "robot": {
     {% set _ = intake_pivot_zero.update(
diff --git a/y2024/constants/calib_files/calibration_orin-7971-c-1_cam-24-03_2024-03-03_00-43-52.104098137.json b/y2024/constants/calib_files/calibration_imu-7971-1_cam-24-03_2024-03-23_13-05-40.json
similarity index 62%
rename from y2024/constants/calib_files/calibration_orin-7971-c-1_cam-24-03_2024-03-03_00-43-52.104098137.json
rename to y2024/constants/calib_files/calibration_imu-7971-1_cam-24-03_2024-03-23_13-05-40.json
index 874d282..a25927b 100755
--- a/y2024/constants/calib_files/calibration_orin-7971-c-1_cam-24-03_2024-03-03_00-43-52.104098137.json
+++ b/y2024/constants/calib_files/calibration_imu-7971-1_cam-24-03_2024-03-23_13-05-40.json
@@ -14,18 +14,18 @@
  ],
  "fixed_extrinsics": {
   "data": [
-   0.530963,
-   -0.006085,
-   0.847373,
-   -0.047041,
-   -0.847373,
-   -0.011096,
-   0.530883,
-   -0.127507,
-   0.006172,
-   -0.99992,
-   -0.011048,
-   -0.04483,
+   0.542349,
+   -0.013533,
+   0.840044,
+   -0.020897,
+   -0.840117,
+   0.000599,
+   0.542405,
+   -0.115704,
+   -0.007843,
+   -0.999908,
+   -0.011044,
+   -0.052145,
    0.0,
    0.0,
    0.0,
@@ -39,7 +39,7 @@
   -0.000061,
   -0.00879
  ],
- "calibration_timestamp": 1709455432104098137,
+ "calibration_timestamp": 1711224340728285298,
  "camera_id": "24-03",
  "camera_number": 1
 }
\ No newline at end of file
diff --git a/y2024/constants/calib_files/calibration_orin-971-1-0_cam-24-10_2024-02-24_16-44-05.975708672.json b/y2024/constants/calib_files/calibration_imu-9971-1-0_cam-24-10_2024-02-24_16-44-05.975708672.json
similarity index 87%
rename from y2024/constants/calib_files/calibration_orin-971-1-0_cam-24-10_2024-02-24_16-44-05.975708672.json
rename to y2024/constants/calib_files/calibration_imu-9971-1-0_cam-24-10_2024-02-24_16-44-05.975708672.json
index 0912038..66ea94a 100755
--- a/y2024/constants/calib_files/calibration_orin-971-1-0_cam-24-10_2024-02-24_16-44-05.975708672.json
+++ b/y2024/constants/calib_files/calibration_imu-9971-1-0_cam-24-10_2024-02-24_16-44-05.975708672.json
@@ -1,6 +1,6 @@
 {
- "node_name": "orin1",
- "team_number": 971,
+ "node_name": "imu",
+ "team_number": 9971,
  "intrinsics": [
   646.04834,
   0.0,
diff --git a/y2024/constants/calib_files/calibration_orin-971-1-1_cam-24-12_2024-02-24_19-52-39.488095264.json b/y2024/constants/calib_files/calibration_imu-9971-1-1_cam-24-12_2024-02-24_19-52-39.488095264.json
similarity index 87%
rename from y2024/constants/calib_files/calibration_orin-971-1-1_cam-24-12_2024-02-24_19-52-39.488095264.json
rename to y2024/constants/calib_files/calibration_imu-9971-1-1_cam-24-12_2024-02-24_19-52-39.488095264.json
index 0fda16d..7f8b6ad 100755
--- a/y2024/constants/calib_files/calibration_orin-971-1-1_cam-24-12_2024-02-24_19-52-39.488095264.json
+++ b/y2024/constants/calib_files/calibration_imu-9971-1-1_cam-24-12_2024-02-24_19-52-39.488095264.json
@@ -1,6 +1,6 @@
 {
- "node_name": "orin1",
- "team_number": 971,
+ "node_name": "imu",
+ "team_number": 9971,
  "intrinsics": [
   647.19928,
   0.0,
@@ -23,4 +23,4 @@
  "camera_id": "24-12",
  "camera_number": 1,
  "reprojection_error": 1.23409
-}
\ No newline at end of file
+}
diff --git a/y2024/constants/calib_files/calibration_orin-971-1-1_cam-24-09_2024-02-24_16-10-16.872521280.json b/y2024/constants/calib_files/calibration_orin-9971-1-0_cam-24-09_2024-02-24_16-10-16.872521280.json
similarity index 87%
rename from y2024/constants/calib_files/calibration_orin-971-1-1_cam-24-09_2024-02-24_16-10-16.872521280.json
rename to y2024/constants/calib_files/calibration_orin-9971-1-0_cam-24-09_2024-02-24_16-10-16.872521280.json
index 9eed9bf..068e3d2 100755
--- a/y2024/constants/calib_files/calibration_orin-971-1-1_cam-24-09_2024-02-24_16-10-16.872521280.json
+++ b/y2024/constants/calib_files/calibration_orin-9971-1-0_cam-24-09_2024-02-24_16-10-16.872521280.json
@@ -1,6 +1,6 @@
 {
  "node_name": "orin1",
- "team_number": 971,
+ "team_number": 9971,
  "intrinsics": [
   648.187805,
   0.0,
@@ -21,6 +21,6 @@
  ],
  "calibration_timestamp": 1708819816872521280,
  "camera_id": "24-09",
- "camera_number": 1,
+ "camera_number": 0,
  "reprojection_error": 1.881098
-}
\ No newline at end of file
+}
diff --git a/y2024/constants/calib_files/calibration_orin-971-1-1_cam-24-11_2024-02-24_16-44-06.986729504.json b/y2024/constants/calib_files/calibration_orin-9971-1-1_cam-24-11_2024-02-24_16-44-06.986729504.json
similarity index 93%
rename from y2024/constants/calib_files/calibration_orin-971-1-1_cam-24-11_2024-02-24_16-44-06.986729504.json
rename to y2024/constants/calib_files/calibration_orin-9971-1-1_cam-24-11_2024-02-24_16-44-06.986729504.json
index 4957b75..c94dcaa 100755
--- a/y2024/constants/calib_files/calibration_orin-971-1-1_cam-24-11_2024-02-24_16-44-06.986729504.json
+++ b/y2024/constants/calib_files/calibration_orin-9971-1-1_cam-24-11_2024-02-24_16-44-06.986729504.json
@@ -1,6 +1,6 @@
 {
  "node_name": "orin1",
- "team_number": 971,
+ "team_number": 9971,
  "intrinsics": [
   649.866699,
   0.0,
@@ -23,4 +23,4 @@
  "camera_id": "24-11",
  "camera_number": 1,
  "reprojection_error": 1.450069
-}
\ No newline at end of file
+}
diff --git a/y2024/constants/calib_files/calibration_orin-7971-1-0_cam-24-04_2024-03-03_00-43-52.104451759.json b/y2024/constants/calib_files/calibration_orin1-7971-0_cam-24-04_2024-03-23_13-05-40.json
similarity index 62%
rename from y2024/constants/calib_files/calibration_orin-7971-1-0_cam-24-04_2024-03-03_00-43-52.104451759.json
rename to y2024/constants/calib_files/calibration_orin1-7971-0_cam-24-04_2024-03-23_13-05-40.json
index 804e854..bb51d07 100755
--- a/y2024/constants/calib_files/calibration_orin-7971-1-0_cam-24-04_2024-03-03_00-43-52.104451759.json
+++ b/y2024/constants/calib_files/calibration_orin1-7971-0_cam-24-04_2024-03-23_13-05-40.json
@@ -14,18 +14,18 @@
  ],
  "fixed_extrinsics": {
   "data": [
-   -0.999409,
-   -0.033871,
-   -0.005938,
-   -0.054149,
-   0.00624,
-   -0.008812,
-   -0.999942,
-   -0.455382,
-   0.033816,
-   -0.999387,
-   0.009018,
-   -0.038435,
+   -0.97224,
+   0.059899,
+   0.226187,
+   -0.070284,
+   -0.224333,
+   0.036144,
+   -0.973842,
+   -0.550947,
+   -0.066508,
+   -0.99755,
+   -0.021703,
+   -0.121436,
    0.0,
    0.0,
    0.0,
@@ -39,7 +39,7 @@
   0.000099,
   -0.005468
  ],
- "calibration_timestamp": 1709455432104451759,
+ "calibration_timestamp": 1711224340729171983,
  "camera_id": "24-04",
  "camera_number": 0
 }
\ No newline at end of file
diff --git a/y2024/constants/calib_files/calibration_orin-7971-1-1_cam-24-02_2024-03-03_00-43-52.104348086.json b/y2024/constants/calib_files/calibration_orin1-7971-1_cam-24-02_2024-03-23_13-05-40.json
similarity index 62%
rename from y2024/constants/calib_files/calibration_orin-7971-1-1_cam-24-02_2024-03-03_00-43-52.104348086.json
rename to y2024/constants/calib_files/calibration_orin1-7971-1_cam-24-02_2024-03-23_13-05-40.json
index 5e9095f..566b868 100755
--- a/y2024/constants/calib_files/calibration_orin-7971-1-1_cam-24-02_2024-03-03_00-43-52.104348086.json
+++ b/y2024/constants/calib_files/calibration_orin1-7971-1_cam-24-02_2024-03-23_13-05-40.json
@@ -14,18 +14,18 @@
  ],
  "fixed_extrinsics": {
   "data": [
-   -0.465205,
-   -0.009078,
-   0.885157,
-   -0.040515,
-   -0.885133,
-   -0.007831,
-   -0.465273,
-   -0.328485,
-   0.011156,
-   -0.999928,
-   -0.004392,
-   -0.036284,
+   -0.405648,
+   0.026857,
+   0.913635,
+   -0.007853,
+   -0.913349,
+   0.026638,
+   -0.406305,
+   -0.344469,
+   -0.03525,
+   -0.999284,
+   0.013724,
+   -0.076866,
    0.0,
    0.0,
    0.0,
@@ -39,7 +39,7 @@
   0.000015,
   -0.005636
  ],
- "calibration_timestamp": 1709455432104348086,
+ "calibration_timestamp": 1711224340728794682,
  "camera_id": "24-02",
  "camera_number": 1
 }
\ No newline at end of file
diff --git a/y2024/control_loops/superstructure/superstructure.cc b/y2024/control_loops/superstructure/superstructure.cc
index 9edc626..daede87 100644
--- a/y2024/control_loops/superstructure/superstructure.cc
+++ b/y2024/control_loops/superstructure/superstructure.cc
@@ -50,7 +50,7 @@
       extend_(
           robot_constants_->common()->extend(),
           robot_constants_->robot()->extend_constants()->zeroing_constants()),
-      extend_debouncer_(std::chrono::milliseconds(30),
+      extend_debouncer_(std::chrono::milliseconds(12),
                         std::chrono::milliseconds(8)),
       transfer_debouncer_(std::chrono::milliseconds(30),
                           std::chrono::milliseconds(8)) {
@@ -701,6 +701,7 @@
       extend_ready_for_catapult_transfer);
   status_builder.add_extend_beambreak(extend_beambreak);
   status_builder.add_catapult_beambreak(position->catapult_beambreak());
+  status_builder.add_transfer_beambreak(transfer_beambreak);
 
   (void)status->Send(status_builder.Finish());
 }
diff --git a/y2024/control_loops/superstructure/superstructure_status.fbs b/y2024/control_loops/superstructure/superstructure_status.fbs
index fd19e8d..0b30edd 100644
--- a/y2024/control_loops/superstructure/superstructure_status.fbs
+++ b/y2024/control_loops/superstructure/superstructure_status.fbs
@@ -181,6 +181,7 @@
 
   extend_beambreak:bool (id: 19);
   catapult_beambreak:bool (id: 20);
+  transfer_beambreak:bool (id: 22);
 
   // Number of shots we have taken.
   shot_count:uint32 (id:21);
diff --git a/y2024/wpilib_interface.cc b/y2024/wpilib_interface.cc
index 301ab79..eb419e6 100644
--- a/y2024/wpilib_interface.cc
+++ b/y2024/wpilib_interface.cc
@@ -142,8 +142,10 @@
   };
   void Start() override {
     AddToDMA(&imu_yaw_rate_reader_);
-    AddToDMA(&turret_encoder_.reader());
-    AddToDMA(&altitude_encoder_.reader());
+    if (aos::network::GetTeamNumber() != 9971) {
+      AddToDMA(&turret_encoder_.reader());
+      AddToDMA(&altitude_encoder_.reader());
+    }
   }
 
   // Auto mode switches.
@@ -157,7 +159,7 @@
   }
 
   void RunIteration() override {
-    {
+    if (aos::network::GetTeamNumber() != 9971) {
       aos::Sender<superstructure::PositionStatic>::StaticBuilder builder =
           superstructure_position_sender_.MakeStaticBuilder();
 
@@ -399,6 +401,8 @@
 
     frc971::constants::WaitForConstants<y2024::Constants>(&config.message());
 
+    const int team_number = aos::network::GetTeamNumber();
+
     ::aos::ShmEventLoop constant_fetcher_event_loop(&config.message());
     frc971::constants::ConstantsFetcher<Constants> constants_fetcher(
         &constant_fetcher_event_loop);
@@ -426,28 +430,125 @@
     sensor_reader.set_drivetrain_right_encoder(
         std::make_unique<frc::Encoder>(6, 7));
     sensor_reader.set_yaw_rate_input(make_unique<frc::DigitalInput>(25));
-    sensor_reader.set_intake_pivot(make_encoder(3),
-                                   make_unique<frc::DigitalInput>(3));
-    sensor_reader.set_transfer_beambreak(make_unique<frc::DigitalInput>(23));
-    sensor_reader.set_extend_beambreak(make_unique<frc::DigitalInput>(24));
-    sensor_reader.set_catapult_beambreak(make_unique<frc::DigitalInput>(22));
 
-    sensor_reader.set_climber(make_encoder(4),
-                              make_unique<frc::DigitalInput>(4),
-                              make_unique<frc::AnalogInput>(4));
-    sensor_reader.set_extend(make_encoder(5), make_unique<frc::DigitalInput>(5),
-                             make_unique<frc::AnalogInput>(5));
-    sensor_reader.set_catapult(make_encoder(0),
-                               make_unique<frc::DigitalInput>(0),
-                               make_unique<frc::AnalogInput>(0));
-    sensor_reader.set_turret(make_encoder(2), make_unique<frc::DigitalInput>(2),
-                             make_unique<frc::AnalogInput>(2));
-    sensor_reader.set_altitude(make_encoder(1),
-                               make_unique<frc::DigitalInput>(1),
-                               make_unique<frc::AnalogInput>(1));
+    if (team_number != 9971) {
+      sensor_reader.set_intake_pivot(make_encoder(3),
+                                     make_unique<frc::DigitalInput>(3));
+      sensor_reader.set_transfer_beambreak(make_unique<frc::DigitalInput>(23));
+      sensor_reader.set_extend_beambreak(make_unique<frc::DigitalInput>(24));
+      sensor_reader.set_catapult_beambreak(make_unique<frc::DigitalInput>(22));
+
+      sensor_reader.set_climber(make_encoder(4),
+                                make_unique<frc::DigitalInput>(4),
+                                make_unique<frc::AnalogInput>(4));
+      sensor_reader.set_extend(make_encoder(5),
+                               make_unique<frc::DigitalInput>(5),
+                               make_unique<frc::AnalogInput>(5));
+      sensor_reader.set_catapult(make_encoder(0),
+                                 make_unique<frc::DigitalInput>(0),
+                                 make_unique<frc::AnalogInput>(0));
+      sensor_reader.set_turret(make_encoder(2),
+                               make_unique<frc::DigitalInput>(2),
+                               make_unique<frc::AnalogInput>(2));
+      sensor_reader.set_altitude(make_encoder(1),
+                                 make_unique<frc::DigitalInput>(1),
+                                 make_unique<frc::AnalogInput>(1));
+    }
 
     AddLoop(&sensor_reader_event_loop);
 
+    if (team_number == 9971) {
+      std::vector<ctre::phoenix6::BaseStatusSignal *> signal_registry;
+
+      if (!FLAGS_ctre_diag_server) {
+        c_Phoenix_Diagnostics_SetSecondsToStart(-1);
+        c_Phoenix_Diagnostics_Dispose();
+      }
+
+      const CurrentLimits *current_limits =
+          robot_constants->common()->current_limits();
+
+      std::shared_ptr<TalonFX> right_front = std::make_shared<TalonFX>(
+          2, true, "Drivetrain Bus", &signal_registry,
+          current_limits->drivetrain_supply_current_limit(),
+          current_limits->drivetrain_stator_current_limit());
+      std::shared_ptr<TalonFX> right_back = std::make_shared<TalonFX>(
+          1, true, "Drivetrain Bus", &signal_registry,
+          current_limits->drivetrain_supply_current_limit(),
+          current_limits->drivetrain_stator_current_limit());
+      std::shared_ptr<TalonFX> left_front = std::make_shared<TalonFX>(
+          4, false, "Drivetrain Bus", &signal_registry,
+          current_limits->drivetrain_supply_current_limit(),
+          current_limits->drivetrain_stator_current_limit());
+      std::shared_ptr<TalonFX> left_back = std::make_shared<TalonFX>(
+          5, false, "Drivetrain Bus", &signal_registry,
+          current_limits->drivetrain_supply_current_limit(),
+          current_limits->drivetrain_stator_current_limit());
+
+      ctre::phoenix::platform::can::CANComm_SetRxSchedPriority(
+          constants::Values::kDrivetrainRxPriority, true, "Drivetrain Bus");
+      ctre::phoenix::platform::can::CANComm_SetTxSchedPriority(
+          constants::Values::kDrivetrainWriterPriority, true, "Drivetrain Bus");
+
+      ::aos::ShmEventLoop can_sensor_reader_event_loop(&config.message());
+      can_sensor_reader_event_loop.set_name("CANSensorReader");
+
+      std::vector<std::shared_ptr<TalonFX>> drivetrain_krakens;
+
+      for (auto talonfx : {right_front, right_back, left_front, left_back}) {
+        drivetrain_krakens.push_back(talonfx);
+      }
+
+      aos::Sender<frc971::control_loops::drivetrain::CANPositionStatic>
+          drivetrain_can_position_sender =
+              can_sensor_reader_event_loop.MakeSender<
+                  frc971::control_loops::drivetrain::CANPositionStatic>(
+                  "/drivetrain");
+
+      frc971::wpilib::CANSensorReader can_sensor_reader(
+          &can_sensor_reader_event_loop, std::move(signal_registry),
+          drivetrain_krakens,
+          [drivetrain_krakens,
+           &drivetrain_can_position_sender](ctre::phoenix::StatusCode status) {
+            aos::Sender<frc971::control_loops::drivetrain::CANPositionStatic>::
+                StaticBuilder drivetrain_can_builder =
+                    drivetrain_can_position_sender.MakeStaticBuilder();
+
+            auto drivetrain_falcon_vector =
+                CHECK_NOTNULL(drivetrain_can_builder->add_talonfxs());
+
+            for (auto talonfx : drivetrain_krakens) {
+              talonfx->SerializePosition(
+                  drivetrain_falcon_vector->emplace_back(),
+                  control_loops::drivetrain::kHighOutputRatio);
+            }
+
+            drivetrain_can_builder->set_status(static_cast<int>(status));
+
+            drivetrain_can_builder.CheckOk(drivetrain_can_builder.Send());
+          });
+
+      AddLoop(&can_sensor_reader_event_loop);
+
+      ::aos::ShmEventLoop can_output_event_loop(&config.message());
+      can_output_event_loop.set_name("CANOutputWriter");
+
+      frc971::wpilib::CANDrivetrainWriter can_drivetrain_writer(
+          &can_output_event_loop);
+
+      can_drivetrain_writer.set_talonfxs({right_front, right_back},
+                                         {left_front, left_back});
+      can_output_event_loop.MakeWatcher(
+          "/roborio", [&can_drivetrain_writer](
+                          const frc971::CANConfiguration &configuration) {
+            can_drivetrain_writer.HandleCANConfiguration(configuration);
+          });
+
+      AddLoop(&can_output_event_loop);
+
+      RunLoops();
+      return;
+    }
     // Thread 4.
     // Set up CAN.
     if (!FLAGS_ctre_diag_server) {
diff --git a/y2024/www/field.html b/y2024/www/field.html
index 8fd4ebb..a8f28b1 100644
--- a/y2024/www/field.html
+++ b/y2024/www/field.html
@@ -77,6 +77,10 @@
           <th colspan="2">Beambreaks</th>
         </tr>
         <tr>
+          <td>Transfer Beambreak</td>
+          <td id="transfer_beambreak">FALSE</td>
+        </tr>
+        <tr>
           <td>Extend Beambreak</td>
           <td id="extend_beambreak">FALSE</td>
         </tr>
diff --git a/y2024/www/field_handler.ts b/y2024/www/field_handler.ts
index 1b4ad1e..6573e8d 100644
--- a/y2024/www/field_handler.ts
+++ b/y2024/www/field_handler.ts
@@ -78,6 +78,8 @@
   (document.getElementById('extend_beambreak') as HTMLElement);
   private catapult_beambreak: HTMLElement =
   (document.getElementById('catapult_beambreak') as HTMLElement);
+  private transfer_beambreak: HTMLElement =
+  (document.getElementById('transfer_beambreak') as HTMLElement);
 
   private extend_at_retracted: HTMLElement =
   (document.getElementById('extend_at_retracted') as HTMLElement);
@@ -514,6 +516,8 @@
 
       this.setBoolean(this.catapult_beambreak, this.superstructureStatus.catapultBeambreak());
 
+      this.setBoolean(this.transfer_beambreak, this.superstructureStatus.transferBeambreak());
+
       this.setBoolean(this.extend_ready_for_transfer, this.superstructureStatus.extendReadyForTransfer());
 
       this.setBoolean(this.extend_at_retracted, this.superstructureStatus.extendAtRetracted());