add methods that return how far arm is sticking out and how high arm is at, and const...
[3501/stronghold-2016] / src / org / usfirst / frc / team3501 / robot / subsystems / DefenseArm.java
index 81365c88a1f4bd85b8b75e64106f199373b5ca85..24037413086b1219d188142190fe01dddd182094 100755 (executable)
@@ -13,22 +13,25 @@ public class DefenseArm extends Subsystem {
   private CANTalon defenseHand;
   private double hookHeight;
   private double footHeight;
+
+  private double[] potHandAngles;
+  private double[] potArmAngles;
   private double[] potAngles;
+
   // angles corresponding to pre-determined heights we will need
 
   public DefenseArm() {
     defenseArmPotentiometer = new AnalogPotentiometer(
-        Constants.DefenseArm.ARM_CHANNEL,
-        Constants.DefenseArm.FULL_RANGE,
+        Constants.DefenseArm.ARM_CHANNEL, Constants.DefenseArm.FULL_RANGE,
         Constants.DefenseArm.OFFSET);
     defenseHandPotentiometer = new AnalogPotentiometer(
-        Constants.DefenseArm.HAND_CHANNEL,
-        Constants.DefenseArm.FULL_RANGE,
+        Constants.DefenseArm.HAND_CHANNEL, Constants.DefenseArm.FULL_RANGE,
         Constants.DefenseArm.OFFSET);
 
     defenseArm = new CANTalon(Constants.DefenseArm.ARM_PORT);
     defenseHand = new CANTalon(Constants.DefenseArm.HAND_PORT);
-    potAngles = createPotArray();
+    potHandAngles = createHandPotArray();
+    potArmAngles = createArmPotArray();
   }
 
   public double getArmPotAngle() {
@@ -40,21 +43,32 @@ public class DefenseArm extends Subsystem {
   }
 
   /***
-   * This method takes an arm location as input (range of [0,2])
-   * Returns the angle of the arm corresponding to that arm location
+   * This method takes an arm location as input (range of [0,2]) Returns the
+   * angle of the arm corresponding to that arm location
    *
    * @param desiredArmLocation
-   *          takes an arm location ranging from [0,2]
-   *          0 is the lowest position of arm
-   *          2 is the highest position of arm
-   * @return
-   *         the angle of the arm corresponding to that arm location
+   *          takes an arm location ranging from [0,2] 0 is the lowest position
+   *          of arm 2 is the highest position of arm
+   * @return the angle of the arm corresponding to that arm location
    */
-  public double getAngleForLocation(int desiredArmLocation) {
-    return potAngles[desiredArmLocation];
+  public double getAngleForHandLocation(int desiredArmLocation) {
+    return potHandAngles[desiredArmLocation];
+  }
+
+  public double getAngleForArmLocation(int desiredArmLocation) {
+    return potArmAngles[desiredArmLocation];
+  }
+
+  public double[] createHandPotArray() {
+    double[] arr = new double[3];
+
+    for (int i = 0; i < 3; i++) {
+      arr[i] = 45 * i;
+    }
+    return arr;
   }
 
-  public double[] createPotArray() {
+  public double[] createArmPotArray() {
     double[] arr = new double[3];
 
     for (int i = 0; i < 3; i++) {
@@ -69,8 +83,8 @@ public class DefenseArm extends Subsystem {
    *
    * @param speed
    *          The voltage that you set the motor at. The range of the voltage of
-   *          the arm motor is from [-1,1]. A
-   *          negative voltage makes the direction of the motor go backwards.
+   *          the arm motor is from [-1,1]. A negative voltage makes the
+   *          direction of the motor go backwards.
    */
 
   public void setArmSpeed(double speed) {
@@ -88,8 +102,8 @@ public class DefenseArm extends Subsystem {
    *
    * @param speed
    *          The voltage that you set the motor at. The range of the voltage of
-   *          the hand motor is from [-1,1]. A
-   *          negative voltage makes the direction of the motor go backwards.
+   *          the hand motor is from [-1,1]. A negative voltage makes the
+   *          direction of the motor go backwards.
    */
 
   public void setHandSpeed(double speed) {
@@ -101,6 +115,45 @@ public class DefenseArm extends Subsystem {
     defenseHand.set(speed);
   }
 
+  // TODO: figure out if measurements are all in inches
+  public double getArmHorizontalDisplacement() {
+    double armHorizontalDisplacement = Constants.DefenseArm.ARM_LENGTH
+        * Math.cos(getArmPotAngle());
+    double handHorizontalDisplacement = Constants.DefenseArm.HAND_LENGTH
+        * Math.cos(getHandPotAngle());
+    return (armHorizontalDisplacement + handHorizontalDisplacement);
+  }
+
+  public double getArmVerticalDisplacement() {
+    double armMounted = Constants.DefenseArm.ARM_MOUNTED_HEIGHT;
+    double armVerticalDisplacement = Constants.DefenseArm.ARM_LENGTH
+        * Math.sin(getArmPotAngle());
+    double handVerticalDisplacement = Constants.DefenseArm.HAND_LENGTH
+        * Math.sin(getHandPotAngle());
+    return (armMounted + armVerticalDisplacement + handVerticalDisplacement);
+  }
+
+  public double getArmHorizontalDist() {
+    double arm = Constants.DefenseArm.ARM_LENGTH * Math.cos(getArmPotAngle());
+    double hand = Constants.DefenseArm.HAND_LENGTH
+        * Math.cos(getHandPotAngle());
+    return (arm + hand);
+  }
+
+  public double getArmHeight() {
+    double armMounted = Constants.DefenseArm.ARM_MOUNTED_HEIGHT;
+    double arm = Constants.DefenseArm.ARM_LENGTH * Math.sin(getArmPotAngle());
+    double hand = Constants.DefenseArm.HAND_LENGTH
+        * Math.sin(getHandPotAngle());
+    return (armMounted + arm + hand);
+  }
+
+  public boolean isOutsideRange() {
+    if (getArmHorizontalDist() < 15)
+      return false;
+    return true;
+  }
+
   @Override
   protected void initDefaultCommand() {
   }