Switch top and bottom buttons on the pistol grip

Signed-off-by: Maxwell Henderson <mxwhenderson@gmail.com>
Change-Id: Ie1ac2b96c01217c2f09284b5c32ac880221369f6
diff --git a/frc971/input/drivetrain_input.cc b/frc971/input/drivetrain_input.cc
index 69795dd..239eddf 100644
--- a/frc971/input/drivetrain_input.cc
+++ b/frc971/input/drivetrain_input.cc
@@ -262,7 +262,8 @@
 
 std::unique_ptr<PistolDrivetrainInputReader> PistolDrivetrainInputReader::Make(
     ::aos::EventLoop *event_loop, bool default_high_gear,
-    TopButtonUse top_button_use) {
+    PistolTopButtonUse top_button_use, PistolSecondButtonUse second_button_use,
+    PistolBottomButtonUse bottom_button_use) {
   // Pistol Grip controller
   const JoystickAxis kTriggerHigh(1, 1), kTriggerLow(1, 4),
       kTriggerVelocityHigh(1, 2), kTriggerVelocityLow(1, 5),
@@ -275,6 +276,7 @@
   const ButtonLocation kQuickTurn(1, 3);
 
   const ButtonLocation kTopButton(1, 1);
+
   const ButtonLocation kSecondButton(1, 2);
   const ButtonLocation kBottomButton(1, 4);
   // Non-existant button for nops.
@@ -282,17 +284,20 @@
 
   // TODO(james): Make a copy assignment operator for ButtonLocation so we don't
   // have to shoehorn in these ternary operators.
-  const ButtonLocation kTurn1 = (top_button_use == TopButtonUse::kLineFollow)
-                                    ? kSecondButton
-                                    : kDummyButton;
+  const ButtonLocation kTurn1 =
+      (second_button_use == PistolSecondButtonUse::kTurn1) ? kSecondButton
+                                                           : kDummyButton;
   // Turn2 does closed loop driving.
   const ButtonLocation kTurn2 =
-      (top_button_use == TopButtonUse::kLineFollow) ? kTopButton : kDummyButton;
+      (top_button_use == PistolTopButtonUse::kLineFollow) ? kTopButton
+                                                          : kDummyButton;
 
   const ButtonLocation kShiftHigh =
-      (top_button_use == TopButtonUse::kShift) ? kTopButton : kDummyButton;
+      (top_button_use == PistolTopButtonUse::kShift) ? kTopButton
+                                                     : kDummyButton;
   const ButtonLocation kShiftLow =
-      (top_button_use == TopButtonUse::kShift) ? kSecondButton : kDummyButton;
+      (second_button_use == PistolSecondButtonUse::kShiftLow) ? kSecondButton
+                                                              : kDummyButton;
 
   std::unique_ptr<PistolDrivetrainInputReader> result(
       new PistolDrivetrainInputReader(
@@ -300,7 +305,12 @@
           kTriggerVelocityLow, kTriggerTorqueHigh, kTriggerTorqueLow,
           kTriggerHigh, kTriggerLow, kWheelVelocityHigh, kWheelVelocityLow,
           kWheelTorqueHigh, kWheelTorqueLow, kQuickTurn, kShiftHigh, kShiftLow,
-          kTurn1, kTurn2, kBottomButton));
+          kTurn1,
+          (bottom_button_use == PistolBottomButtonUse::kControlLoopDriving)
+              ? kBottomButton
+              : kTurn2,
+          (top_button_use == PistolTopButtonUse::kNone) ? kTopButton
+                                                        : kBottomButton));
 
   result->set_default_high_gear(default_high_gear);
   return result;
@@ -335,13 +345,25 @@
       drivetrain_input_reader = SteeringWheelDrivetrainInputReader::Make(
           event_loop, dt_config.default_high_gear);
       break;
-    case InputType::kPistol:
-      drivetrain_input_reader = PistolDrivetrainInputReader::Make(
-          event_loop, dt_config.default_high_gear,
+    case InputType::kPistol: {
+      // For backwards compatibility
+      PistolTopButtonUse top_button_use =
           dt_config.pistol_grip_shift_enables_line_follow
-              ? PistolDrivetrainInputReader::TopButtonUse::kLineFollow
-              : PistolDrivetrainInputReader::TopButtonUse::kShift);
+              ? PistolTopButtonUse::kLineFollow
+              : dt_config.top_button_use;
+
+      PistolSecondButtonUse second_button_use = dt_config.second_button_use;
+      PistolBottomButtonUse bottom_button_use = dt_config.bottom_button_use;
+
+      if (top_button_use == PistolTopButtonUse::kLineFollow) {
+        second_button_use = PistolSecondButtonUse::kTurn1;
+      }
+
+      drivetrain_input_reader = PistolDrivetrainInputReader::Make(
+          event_loop, dt_config.default_high_gear, top_button_use,
+          second_button_use, bottom_button_use);
       break;
+    }
     case InputType::kXbox:
       drivetrain_input_reader = XboxDrivetrainInputReader::Make(event_loop);
       break;