Tuned intake.

Change-Id: I028f6cbb8df55d281734ca39abb4f62b7fd27793
diff --git a/y2018/control_loops/superstructure/superstructure.cc b/y2018/control_loops/superstructure/superstructure.cc
index f53a6db..1c5a4e5 100644
--- a/y2018/control_loops/superstructure/superstructure.cc
+++ b/y2018/control_loops/superstructure/superstructure.cc
@@ -63,12 +63,66 @@
                    status->arm.zeroed;
 
   if (output && unsafe_goal) {
-    output->intake.left.voltage_rollers = ::std::max(
+    const double roller_voltage = ::std::max(
         -kMaxIntakeRollerVoltage, ::std::min(unsafe_goal->intake.roller_voltage,
                                              kMaxIntakeRollerVoltage));
-    output->intake.right.voltage_rollers = ::std::max(
-        -kMaxIntakeRollerVoltage, ::std::min(unsafe_goal->intake.roller_voltage,
-                                             kMaxIntakeRollerVoltage));
+    constexpr int kReverseTime = 15;
+    if (unsafe_goal->intake.roller_voltage < 0.0) {
+      output->intake.left.voltage_rollers = roller_voltage;
+      output->intake.right.voltage_rollers = roller_voltage;
+      rotation_state_ = RotationState::NOT_ROTATING;
+      rotation_count_ = 0;
+    } else {
+      switch (rotation_state_) {
+        case RotationState::NOT_ROTATING:
+          if (position->intake.left.beam_break) {
+            rotation_state_ = RotationState::ROTATING_RIGHT;
+            rotation_count_ = kReverseTime;
+            break;
+          } else if (position->intake.right.beam_break) {
+            rotation_state_ = RotationState::ROTATING_LEFT;
+            rotation_count_ = kReverseTime;
+            break;
+          } else {
+            break;
+          }
+        case RotationState::ROTATING_LEFT:
+          if (position->intake.right.beam_break) {
+            rotation_count_ = kReverseTime;
+          } else {
+            --rotation_count_;
+          }
+          if (rotation_count_ == 0) {
+            rotation_state_ = RotationState::NOT_ROTATING;
+          }
+          break;
+        case RotationState::ROTATING_RIGHT:
+          if (position->intake.left.beam_break) {
+            rotation_count_ = kReverseTime;
+          } else {
+            --rotation_count_;
+          }
+          if (rotation_count_ == 0) {
+            rotation_state_ = RotationState::NOT_ROTATING;
+          }
+          break;
+      }
+
+      switch (rotation_state_) {
+        case RotationState::NOT_ROTATING:
+          output->intake.left.voltage_rollers = roller_voltage;
+          output->intake.right.voltage_rollers = roller_voltage;
+          break;
+        case RotationState::ROTATING_LEFT:
+          output->intake.left.voltage_rollers = roller_voltage;
+          output->intake.right.voltage_rollers = -roller_voltage;
+          break;
+        case RotationState::ROTATING_RIGHT:
+          output->intake.left.voltage_rollers = -roller_voltage;
+          output->intake.right.voltage_rollers = roller_voltage;
+          break;
+      }
+    }
   }
 }