Merge changes Idc531ca1,I17fc4c57

* changes:
  Switch Logger over to using the new context UUID
  Add remote_boot_uuid to Context
diff --git a/frc971/control_loops/python/constants.py b/frc971/control_loops/python/constants.py
index af5d3ff..cb0de5b 100644
--- a/frc971/control_loops/python/constants.py
+++ b/frc971/control_loops/python/constants.py
@@ -109,6 +109,13 @@
 FIELD = FIELDS["2021 Galactic Search BRed"]
 
 
+def get_json_folder(field):
+    if field.year == 2020 or field.year == 2021:
+        return "y2020/actors/splines"
+    else:
+        return "frc971/control_loops/python/spline_jsons"
+
+
 def pxToM(p):
     return p * FIELD.width / SCREEN_SIZE
 
diff --git a/frc971/control_loops/python/drawing_constants.py b/frc971/control_loops/python/drawing_constants.py
index 8548b54..becc7f6 100644
--- a/frc971/control_loops/python/drawing_constants.py
+++ b/frc971/control_loops/python/drawing_constants.py
@@ -96,12 +96,12 @@
         field[3][0] = True
         field[3][1] = True
 
-        if BAREL in FIELD.tags:
+        if BARREL in FIELD.tags:
             # barrels
             field[1][4] = True
             field[3][8] = True
             field[1][10] = True
-        if BARREL in FIELD.tags:
+        if SLALOM in FIELD.tags:
             field[1][3:8] = True  # 3 to 7 inclusive
             field[1][9] = True
         if BOUNCE in FIELD.tags:
diff --git a/frc971/control_loops/python/path_edit.py b/frc971/control_loops/python/path_edit.py
index 7620ff5..2031416 100755
--- a/frc971/control_loops/python/path_edit.py
+++ b/frc971/control_loops/python/path_edit.py
@@ -332,8 +332,12 @@
                 self.index_of_edit, self.spline_edit, self.x, self.y, difs)
 
     def export_json(self, file_name):
-        self.path_to_export = os.path.join(self.module_path,
-                                           "spline_jsons/" + file_name)
+        self.path_to_export = os.path.join(
+            self.module_path,  # position of the python
+            "../../..",  # root of the repository
+            get_json_folder(FIELD),  # path from the root
+            file_name  # selected file
+        )
         if file_name[-5:] != ".json":
             print("Error: Filename doesn't end in .json")
         else:
@@ -346,8 +350,13 @@
                 json.dump(multi_spline, points_file)
 
     def import_json(self, file_name):
-        self.path_to_export = os.path.join(self.module_path,
-                                           "spline_jsons/" + file_name)
+        self.path_to_export = os.path.join(
+            self.module_path,  # position of the python
+            "../../..",  # root of the repository
+            get_json_folder(FIELD),  # path from the root
+            file_name  # selected file
+        )
+
         if file_name[-5:] != ".json":
             print("Error: Filename doesn't end in .json")
         else:
@@ -360,7 +369,7 @@
             # if people messed with the spline json,
             # it might not be the right length
             # so give them a nice error message
-            try: # try to salvage as many segments of the spline as possible
+            try:  # try to salvage as many segments of the spline as possible
                 self.points.fromMultiSpline(multi_spline)
             except IndexError:
                 # check if they're both 6+5*(k-1) long
@@ -368,9 +377,13 @@
                 x_len = len(multi_spline["spline_x"])
                 y_len = len(multi_spline["spline_x"])
                 if x_len is not expected_length:
-                    print("Error: spline x values were not the expected length; expected {} got {}".format(expected_length, x_len))
+                    print(
+                        "Error: spline x values were not the expected length; expected {} got {}"
+                        .format(expected_length, x_len))
                 elif y_len is not expected_length:
-                    print("Error: spline y values were not the expected length; expected {} got {}".format(expected_length, y_len))
+                    print(
+                        "Error: spline y values were not the expected length; expected {} got {}"
+                        .format(expected_length, y_len))
 
             print("SPLINES LOADED")
 
diff --git a/tools/ci/buildkite.yaml b/tools/ci/buildkite.yaml
index d223d89..036d757 100644
--- a/tools/ci/buildkite.yaml
+++ b/tools/ci/buildkite.yaml
@@ -1,6 +1,6 @@
 env:
   STARTUP: --max_idle_secs=0 --watchfs
-  COMMON: -c opt --stamp=no --curses=no --color=no --symlink_prefix=/ --disk_cache=~/.cache/bazel/disk_cache/
+  COMMON: -c opt --stamp=no --curses=yes --symlink_prefix=/ --disk_cache=~/.cache/bazel/disk_cache/
   TARGETS: //... @com_github_google_glog//... @com_google_ceres_solver//... @com_github_rawrtc_rawrtc//...
   M4F_TARGETS: //...
   # Sanity check that we are able to build the y2020 roborio code, which confirms
diff --git a/y2020/actors/splines/autonav_bounce_1.json b/y2020/actors/splines/autonav_bounce_1.json
new file mode 100644
index 0000000..37190d3
--- /dev/null
+++ b/y2020/actors/splines/autonav_bounce_1.json
@@ -0,0 +1 @@
+{"spline_count": 1, "spline_x": [-3.841487603305785, -3.186545454545455, -2.7835041322314047, -2.58198347107438, -2.405652892561984, -2.304892561983471], "spline_y": [0.0503801652892562, 0.1007603305785124, 0.22671074380165293, 0.4786115702479339, 0.8564628099173552, 1.5617851239669422], "constraints": [{"constraint_type": "LONGITUDINAL_ACCELERATION", "value": 3.0}, {"constraint_type": "LATERAL_ACCELERATION", "value": 2.0}, {"constraint_type": "VOLTAGE", "value": 10.0}]}
\ No newline at end of file
diff --git a/y2020/actors/splines/autonav_bounce_2.json b/y2020/actors/splines/autonav_bounce_2.json
new file mode 100644
index 0000000..d20748b
--- /dev/null
+++ b/y2020/actors/splines/autonav_bounce_2.json
@@ -0,0 +1 @@
+{"spline_count": 1, "spline_x": [-2.304892561983471, -2.1789421487603304, -1.6751404958677685, -0.3904462809917355, 0.08816528925619875, -0.012595041322314211], "spline_y": [1.5617851239669422, 0.251900826446281, -1.2846942148760332, -2.6701487603305787, -1.4106446280991736, 1.5114049586776859], "constraints": [{"constraint_type": "LONGITUDINAL_ACCELERATION", "value": 3.0}, {"constraint_type": "LATERAL_ACCELERATION", "value": 2.0}, {"constraint_type": "VOLTAGE", "value": 10.0}]}
\ No newline at end of file
diff --git a/y2020/actors/splines/autonav_bounce_3.json b/y2020/actors/splines/autonav_bounce_3.json
new file mode 100644
index 0000000..50bf312
--- /dev/null
+++ b/y2020/actors/splines/autonav_bounce_3.json
@@ -0,0 +1 @@
+{"spline_count": 1, "spline_x": [0.012595041322314211, -0.11335537190082647, -0.18892561983471026, 2.3804628099173564, 2.3804628099173564, 2.304892561983471], "spline_y": [1.5869752066115703, -1.234314049586777, -2.241917355371901, -2.4182479338842975, -1.209123966942149, 1.536595041322314], "constraints": [{"constraint_type": "LONGITUDINAL_ACCELERATION", "value": 3.0}, {"constraint_type": "LATERAL_ACCELERATION", "value": 2.0}, {"constraint_type": "VOLTAGE", "value": 10.0}]}
\ No newline at end of file
diff --git a/y2020/actors/splines/autonav_bounce_4.json b/y2020/actors/splines/autonav_bounce_4.json
new file mode 100644
index 0000000..448abde
--- /dev/null
+++ b/y2020/actors/splines/autonav_bounce_4.json
@@ -0,0 +1 @@
+{"spline_count": 1, "spline_x": [2.2545123966942158, 2.2545123966942158, 2.4056528925619842, 2.5567933884297522, 3.010214876033058, 3.765917355371901], "spline_y": [1.536595041322314, 0.9572231404958678, 0.6297520661157024, 0.2015206611570248, 0.0251900826446281, 0.0503801652892562], "constraints": [{"constraint_type": "LONGITUDINAL_ACCELERATION", "value": 3.0}, {"constraint_type": "LATERAL_ACCELERATION", "value": 2.0}, {"constraint_type": "VOLTAGE", "value": 10.0}]}
\ No newline at end of file
diff --git a/y2020/actors/splines/spline_blue_a.json b/y2020/actors/splines/spline_blue_a.json
index 733d516..28c90f4 100644
--- a/y2020/actors/splines/spline_blue_a.json
+++ b/y2020/actors/splines/spline_blue_a.json
@@ -1 +1 @@
-{"spline_count": 1, "spline_x": [0, 0.4, 0.4, 0.6, 0.6, 1.0], "spline_y": [0, 0, 0.05, 0.1, 0.15, 0.15], "constraints": [{"constraint_type": "LONGITUDINAL_ACCELERATION", "value": 1}, {"constraint_type": "LATERAL_ACCELERATION", "value": 1}, {"constraint_type": "VOLTAGE", "value": 2}]}
+{"spline_count": 3, "spline_x": [-3.8589564582257236, -2.706301079868285, -1.8662093637009298, -1.3063849916064052, -0.4873721348786154, -0.00625139624225228, 0.4748693423941108, 0.6180979629390473, -0.009563129519629676, 0.15372038836518587, 0.6260651875645665, 1.0984099867639472, 1.879816067277893, 2.9980503292871896, 3.5245728709323347, 4.3991472026730385], "spline_y": [-1.6780186596074382, -1.8082232817342458, -1.892411108600207, -1.749871279377583, -1.9347886872094529, -1.488971578802944, -1.0431544703964353, 0.03339715424845213, -0.09653840876807873, 0.6210084137719525, 0.8305055244382749, 1.0400026351045972, 0.7414500338972108, -0.9412994536092459, -1.2421690381262913, -1.7536811563791324], "constraints": [{"constraint_type": "LONGITUDINAL_ACCELERATION", "value": 3.0}, {"constraint_type": "LATERAL_ACCELERATION", "value": 2.0}, {"constraint_type": "VOLTAGE", "value": 4.0}]}
diff --git a/y2020/actors/splines/spline_blue_b.json b/y2020/actors/splines/spline_blue_b.json
index 733d516..7ef0494 100644
--- a/y2020/actors/splines/spline_blue_b.json
+++ b/y2020/actors/splines/spline_blue_b.json
@@ -1 +1 @@
-{"spline_count": 1, "spline_x": [0, 0.4, 0.4, 0.6, 0.6, 1.0], "spline_y": [0, 0, 0.05, 0.1, 0.15, 0.15], "constraints": [{"constraint_type": "LONGITUDINAL_ACCELERATION", "value": 1}, {"constraint_type": "LATERAL_ACCELERATION", "value": 1}, {"constraint_type": "VOLTAGE", "value": 2}]}
+{"spline_count": 3, "spline_x": [-4.150494304057981, -3.3986216889688787, -2.2755236069860536, -0.7710065615315085, -0.3059309707515497, 0.07081943278667355, 0.4475698363248968, 0.7359950526213844, 0.6477528893336757, 0.9985598447184914, 1.5433015318310954, 2.0880432189436995, 2.826719637784092, 2.54224882166839, 3.098134168388431, 4.279168364217459], "spline_y": [-1.8370325937822833, -1.7225587047230115, -1.4951960691341684, -1.2591343681398501, -1.052224068633781, -0.746549088407154, -0.44087410818052697, -0.03643444723334266, 0.4353676213035902, 0.7416545188210228, 0.7718694725351886, 0.8020844262493543, 0.5562274361602532, -0.9685113232825411, -0.8008121610278923, -1.6595312237700157], "constraints": [{"constraint_type": "LONGITUDINAL_ACCELERATION", "value": 3.0}, {"constraint_type": "LATERAL_ACCELERATION", "value": 2.0}, {"constraint_type": "VOLTAGE", "value": 4.0}]}
diff --git a/y2020/actors/splines/spline_red_a.json b/y2020/actors/splines/spline_red_a.json
index 733d516..5de7e30 100644
--- a/y2020/actors/splines/spline_red_a.json
+++ b/y2020/actors/splines/spline_red_a.json
@@ -1 +1 @@
-{"spline_count": 1, "spline_x": [0, 0.4, 0.4, 0.6, 0.6, 1.0], "spline_y": [0, 0, 0.05, 0.1, 0.15, 0.15], "constraints": [{"constraint_type": "LONGITUDINAL_ACCELERATION", "value": 1}, {"constraint_type": "LATERAL_ACCELERATION", "value": 1}, {"constraint_type": "VOLTAGE", "value": 2}]}
+{"spline_count": 3, "spline_x": [-3.5430995125258264, -2.833856622869318, -2.2671351126678716, -1.5517361505681804, -1.0942218895273754, -0.7058266076962806, -0.3174313258651858, 0.0018449767561987526, -0.7213536245803214, -0.46077833241864685, 0.08654170971074387, 0.6338617518401346, 1.4679265439372415, 1.8681219896048553, 2.4377923876549588, 4.128750484245868], "spline_y": [1.345144878292872, 0.563397477079029, -0.10274521807205578, -0.6578218499806299, -0.8755060450025827, -0.6711287448347107, -0.4667514446668389, 0.15968735069085743, 0.5673580271823342, 1.1876484375, 1.4852908501743287, 1.7829332628486574, 1.7579276778796489, 1.8390174812758264, 1.9139266125387395, 1.8437913586324897], "constraints": [{"constraint_type": "LONGITUDINAL_ACCELERATION", "value": 3.0}, {"constraint_type": "LATERAL_ACCELERATION", "value": 2.0}, {"constraint_type": "VOLTAGE", "value": 4.0}]}
diff --git a/y2020/actors/splines/spline_red_b.json b/y2020/actors/splines/spline_red_b.json
index 733d516..ab5ec8f 100644
--- a/y2020/actors/splines/spline_red_b.json
+++ b/y2020/actors/splines/spline_red_b.json
@@ -1 +1 @@
-{"spline_count": 1, "spline_x": [0, 0.4, 0.4, 0.6, 0.6, 1.0], "spline_y": [0, 0, 0.05, 0.1, 0.15, 0.15], "constraints": [{"constraint_type": "LONGITUDINAL_ACCELERATION", "value": 1}, {"constraint_type": "LATERAL_ACCELERATION", "value": 1}, {"constraint_type": "VOLTAGE", "value": 2}]}
+{"spline_count": 2, "spline_x": [-3.392645926339286, -2.154575892857143, -1.9643174545865811, -1.8674530715821605, -1.4586490399672885, -0.7749665868973982, -0.09128413382750789, 0.8672767406974007, 0.3081139946408683, 0.39452214556653653, 4.533722882231405], "spline_y": [1.5839347098214285, 0.8960059988839286, 0.540389038357809, -0.3293477472090389, -0.755995497807628, -0.7561097332951151, -0.7562239687826022, -0.3298046891589874, 1.1545971581813754, 1.2564632146958519, 1.674700392037384], "constraints": [{"constraint_type": "LONGITUDINAL_ACCELERATION", "value": 3}, {"constraint_type": "LATERAL_ACCELERATION", "value": 2}, {"constraint_type": "VOLTAGE", "value": 4.0}]}
diff --git a/y2020/constants.h b/y2020/constants.h
index de3303b..ee42245 100644
--- a/y2020/constants.h
+++ b/y2020/constants.h
@@ -101,6 +101,9 @@
   static constexpr double kIntakeRollerSupplyCurrentLimit() { return 30.0; }
   static constexpr double kIntakeRollerStatorCurrentLimit() { return 40.0; }
 
+  static constexpr double kFeederSupplyCurrentLimit() { return 30.0; }
+  static constexpr double kFeederStatorCurrentLimit() { return 40.0; }
+
   // Turret
   static constexpr double kTurretEncoderCountsPerRevolution() { return 4096.0; }
 
diff --git a/y2020/wpilib_interface.cc b/y2020/wpilib_interface.cc
index 555d16b..1cf54a2 100644
--- a/y2020/wpilib_interface.cc
+++ b/y2020/wpilib_interface.cc
@@ -33,6 +33,7 @@
 #include "aos/util/phased_loop.h"
 #include "aos/util/wrapping_counter.h"
 #include "ctre/phoenix/motorcontrol/can/TalonFX.h"
+#include "ctre/phoenix/motorcontrol/can/VictorSPX.h"
 #include "frc971/autonomous/auto_mode_generated.h"
 #include "frc971/control_loops/drivetrain/drivetrain_position_generated.h"
 #include "frc971/wpilib/ADIS16470.h"
@@ -360,8 +361,17 @@
     turret_victor_ = ::std::move(t);
   }
 
-  void set_feeder_falcon(::std::unique_ptr<::frc::TalonFX> t) {
+  void set_feeder_falcon(
+      ::std::unique_ptr<::ctre::phoenix::motorcontrol::can::TalonFX> t) {
     feeder_falcon_ = ::std::move(t);
+    CHECK_EQ(ctre::phoenix::OKAY,
+             feeder_falcon_->ConfigSupplyCurrentLimit(
+                 {true, Values::kFeederSupplyCurrentLimit(),
+                  Values::kFeederSupplyCurrentLimit(), 0}));
+    CHECK_EQ(ctre::phoenix::OKAY,
+             feeder_falcon_->ConfigStatorCurrentLimit(
+                 {true, Values::kFeederStatorCurrentLimit(),
+                  Values::kFeederStatorCurrentLimit(), 0}));
   }
 
   void set_washing_machine_control_panel_victor(
@@ -414,10 +424,10 @@
                                         -kMaxBringupPower, kMaxBringupPower) /
                              12.0);
 
-    feeder_falcon_->SetSpeed(std::clamp(output.feeder_voltage(),
-                                        -kMaxBringupPower, kMaxBringupPower) /
-                             12.0);
-
+    feeder_falcon_->Set(ctre::phoenix::motorcontrol::ControlMode::PercentOutput,
+                        std::clamp(output.feeder_voltage(), -kMaxBringupPower,
+                                   kMaxBringupPower) /
+                            12.0);
     if (washing_machine_control_panel_victor_) {
       washing_machine_control_panel_victor_->SetSpeed(
           std::clamp(-output.washing_machine_spinner_voltage(),
@@ -458,7 +468,6 @@
     hood_victor_->SetDisabled();
     intake_joint_victor_->SetDisabled();
     turret_victor_->SetDisabled();
-    feeder_falcon_->SetDisabled();
     if (washing_machine_control_panel_victor_) {
       washing_machine_control_panel_victor_->SetDisabled();
     }
@@ -466,16 +475,20 @@
     accelerator_right_falcon_->SetDisabled();
     finisher_falcon0_->SetDisabled();
     finisher_falcon1_->SetDisabled();
+    feeder_falcon_->Set(ctre::phoenix::motorcontrol::ControlMode::Disabled, 0);
+    intake_roller_falcon_->Set(
+        ctre::phoenix::motorcontrol::ControlMode::Disabled, 0);
+    climber_falcon_->Set(ctre::phoenix::motorcontrol::ControlMode::Disabled, 0);
   }
 
   ::std::unique_ptr<::frc::VictorSP> hood_victor_, intake_joint_victor_,
       turret_victor_, washing_machine_control_panel_victor_;
 
-  ::std::unique_ptr<::frc::TalonFX> feeder_falcon_, accelerator_left_falcon_,
+  ::std::unique_ptr<::frc::TalonFX> accelerator_left_falcon_,
       accelerator_right_falcon_, finisher_falcon0_, finisher_falcon1_;
 
   ::std::unique_ptr<::ctre::phoenix::motorcontrol::can::TalonFX>
-      intake_roller_falcon_, climber_falcon_;
+      intake_roller_falcon_, climber_falcon_, feeder_falcon_;
 };
 
 class WPILibRobot : public ::frc971::wpilib::WPILibRobotBase {
@@ -508,7 +521,6 @@
     sensor_reader.set_drivetrain_left_encoder(make_encoder(0));
     sensor_reader.set_drivetrain_right_encoder(make_encoder(1));
     // TODO: pin numbers
-    // TODO(Ravago): Hood pin numbers
     sensor_reader.set_hood_encoder(
         make_unique<frc::Encoder>(22, 23, false, frc::Encoder::k4X));
 
@@ -568,10 +580,10 @@
     superstructure_writer.set_intake_roller_falcon(
         make_unique<::ctre::phoenix::motorcontrol::can::TalonFX>(0));
     superstructure_writer.set_turret_victor(make_unique<frc::VictorSP>(7));
-    superstructure_writer.set_feeder_falcon(make_unique<frc::TalonFX>(6));
-    // TODO(austin): When this goes over to CAN, update it and make it work.
-    //superstructure_writer.set_washing_machine_control_panel_victor(
-        //make_unique<frc::VictorSP>(3));
+    superstructure_writer.set_feeder_falcon(
+        make_unique<ctre::phoenix::motorcontrol::can::TalonFX>(1));
+    superstructure_writer.set_washing_machine_control_panel_victor(
+        make_unique<frc::VictorSP>(6));
     superstructure_writer.set_accelerator_left_falcon(
         make_unique<::frc::TalonFX>(5));
     superstructure_writer.set_accelerator_right_falcon(
@@ -580,7 +592,7 @@
     superstructure_writer.set_finisher_falcon1(make_unique<::frc::TalonFX>(3));
     // TODO: check port
     superstructure_writer.set_climber_falcon(
-        make_unique<::ctre::phoenix::motorcontrol::can::TalonFX>(1));
+        make_unique<::ctre::phoenix::motorcontrol::can::TalonFX>(2));
 
     AddLoop(&output_event_loop);