make stacking faster

Change-Id: I78e5159cbf014551c6e561c702070478a01c4dc8
diff --git a/frc971/actors/lift_action_params.q b/frc971/actors/lift_action_params.q
index a5a1403..7aa29b8 100644
--- a/frc971/actors/lift_action_params.q
+++ b/frc971/actors/lift_action_params.q
@@ -6,4 +6,9 @@
   double lift_height;
   // Arm goal.
   double lift_arm;
+
+  // True to move the claw in the middle of the lift.
+  bool pack_claw;
+  // Iff pack_claw is true, the angle to move the claw to.
+  double pack_claw_angle;
 };
diff --git a/frc971/actors/lift_actor.cc b/frc971/actors/lift_actor.cc
index 60ef631..44222fd 100644
--- a/frc971/actors/lift_actor.cc
+++ b/frc971/actors/lift_actor.cc
@@ -4,6 +4,7 @@
 #include "frc971/actors/lift_actor.h"
 #include "frc971/constants.h"
 #include "frc971/actors/fridge_profile_lib.h"
+#include "frc971/control_loops/claw/claw.q.h"
 
 namespace frc971 {
 namespace actors {
@@ -45,6 +46,18 @@
         }
         goal_angle = params.lift_arm;
         has_started_back = true;
+        if (params.pack_claw) {
+          auto message = control_loops::claw_queue.goal.MakeMessage();
+          message->angle = params.pack_claw_angle;
+          message->angular_velocity = 0.0;
+          message->intake = 0.0;
+          message->rollers_closed = true;
+          message->max_velocity = 6.0;
+          message->max_acceleration = 10.0;
+
+          LOG_STRUCT(DEBUG, "Sending claw goal", *message);
+          message.Send();
+        }
       }
     }
 
diff --git a/frc971/actors/stack_and_lift_actor.cc b/frc971/actors/stack_and_lift_actor.cc
index ad2263f..273f352 100644
--- a/frc971/actors/stack_and_lift_actor.cc
+++ b/frc971/actors/stack_and_lift_actor.cc
@@ -18,6 +18,17 @@
     : FridgeActorBase<StackAndLiftActionQueueGroup>(queues) {}
 
 bool StackAndLiftActor::RunAction(const StackAndLiftParams &params) {
+  control_loops::claw_queue.goal.FetchLatest();
+  double claw_goal_start;
+  bool have_claw_goal_start;
+  if (control_loops::claw_queue.goal.get()) {
+    claw_goal_start = control_loops::claw_queue.goal->angle;
+    have_claw_goal_start = true;
+  } else {
+    claw_goal_start = 0;
+    have_claw_goal_start = false;
+  }
+
   {
     StackParams stack_params = params.stack_params;
     stack_params.only_place = false;
@@ -58,8 +69,10 @@
   }
 
   {
-    ::std::unique_ptr<LiftAction> lift_action =
-        MakeLiftAction(params.lift_params);
+    auto lift_params = params.lift_params;
+    lift_params.pack_claw = have_claw_goal_start;
+    lift_params.pack_claw_angle = claw_goal_start;
+    ::std::unique_ptr<LiftAction> lift_action = MakeLiftAction(lift_params);
     lift_action->Start();
     while (lift_action->Running()) {
       ::aos::time::PhasedLoopXMS(::aos::controls::kLoopFrequency.ToMSec(),
diff --git a/frc971/joystick_reader.cc b/frc971/joystick_reader.cc
index 4ff9684..0d47606 100644
--- a/frc971/joystick_reader.cc
+++ b/frc971/joystick_reader.cc
@@ -109,6 +109,9 @@
 const double kClawTotePackAngle = 0.95;
 const double kArmRaiseLowerClearance = -0.08;
 
+const double kStackUpHeight = 0.55;
+const double kStackUpArm = 0.1;
+
 class Reader : public ::aos::input::JoystickInput {
  public:
   Reader() : was_running_(false) {}
@@ -265,8 +268,8 @@
 
       params.grab_after_stack = true;
       params.clamp_pause_time = 0.1;
-      params.lift_params.lift_height = 0.45;
-      params.lift_params.lift_arm = 0.3;
+      params.lift_params.lift_height = kStackUpHeight;
+      params.lift_params.lift_arm = kStackUpArm;
       params.grab_after_lift = true;
       fridge_closed_ = true;
 
@@ -308,8 +311,8 @@
       params.before_lift_settle_time = 0.1;
       params.bottom_height = 0.020;
       params.claw_out_angle = 0.6;
-      params.lift_params.lift_height = 0.45;
-      params.lift_params.lift_arm = 0.3;
+      params.lift_params.lift_height = kStackUpHeight;
+      params.lift_params.lift_arm = kStackUpArm;
       fridge_closed_ = true;
 
       action_queue_.EnqueueAction(actors::MakeHeldToLiftAction(params));
@@ -320,6 +323,8 @@
       actors::LiftParams params;
       params.lift_height = 0.68;
       params.lift_arm = 0.3;
+      params.pack_claw = false;
+      params.pack_claw_angle = 0;
       fridge_closed_ = true;
 
       action_queue_.EnqueueAction(actors::MakeLiftAction(params));