Added cangrabber auto.

Change-Id: I67c2b363df5fc3e431acf0cfd56c9537bb89804b
diff --git a/y2015/autonomous/auto.cc b/y2015/autonomous/auto.cc
index 9ade207..4e8aa59 100644
--- a/y2015/autonomous/auto.cc
+++ b/y2015/autonomous/auto.cc
@@ -9,6 +9,7 @@
 #include "aos/common/logging/queue_logging.h"
 
 #include "frc971/autonomous/auto.q.h"
+#include "y2015/autonomous/auto.q.h"
 #include "y2015/constants.h"
 #include "y2015/control_loops/drivetrain/drivetrain.q.h"
 #include "y2015/actors/drivetrain_actor.h"
@@ -306,9 +307,7 @@
   }
 }
 
-void HandleAuto() {
-  ::aos::time::Time start_time = ::aos::time::Time::Now();
-  LOG(INFO, "Starting auto mode at %f\n", start_time.ToSeconds());
+void TripleCanAuto() {
   ::std::unique_ptr<::frc971::actors::DrivetrainAction> drive;
   ::std::unique_ptr<::frc971::actors::PickupAction> pickup;
   ::std::unique_ptr<::frc971::actors::StackAction> stack;
@@ -554,5 +553,56 @@
   if (ShouldExitAuto()) return;
 }
 
+void GrabberForTime(double voltage, double wait_time) {
+  ::aos::time::Time now = ::aos::time::Time::Now();
+  ::aos::time::Time end_time = now + time::Time::InSeconds(wait_time);
+  LOG(INFO, "Starting to grab at %f for %f seconds\n", voltage, wait_time);
+  while (true) {
+    autonomous::can_control.MakeWithBuilder().can_voltage(voltage).Send();
+    // Poll the running bit and auto done bits.
+    if (ShouldExitAuto()) {
+      return;
+    }
+    if (::aos::time::Time::Now() > end_time) {
+      LOG(INFO, "Done grabbing\n");
+      return;
+    }
+    ::aos::time::PhasedLoopXMS(5, 2500);
+  }
+}
+
+void CanGrabberAuto() {
+  ResetDrivetrain();
+  GrabberForTime(12.0, 0.18);
+  if (ShouldExitAuto()) return;
+
+  //GrabberForTime(4.0, 0.10);
+  if (ShouldExitAuto()) return;
+  InitializeEncoders();
+  ResetDrivetrain();
+  if (ShouldExitAuto()) return;
+  control_loops::drivetrain_queue.goal.MakeWithBuilder()
+      .control_loop_driving(true)
+      //.highgear(false)
+      .steering(0.0)
+      .throttle(0.0)
+      .left_goal(left_initial_position + 1.5)
+      .left_velocity_goal(0)
+      .right_goal(right_initial_position + 1.5)
+      .right_velocity_goal(0)
+      .Send();
+  GrabberForTime(12.0, 0.02);
+
+  GrabberForTime(4.0, 14.0);
+  if (ShouldExitAuto()) return;
+}
+
+void HandleAuto() {
+  ::aos::time::Time start_time = ::aos::time::Time::Now();
+  LOG(INFO, "Starting auto mode at %f\n", start_time.ToSeconds());
+  //TripleCanAuto();
+  CanGrabberAuto();
+}
+
 }  // namespace autonomous
 }  // namespace frc971