content: /* Copyright (c) 2017 FIRST. All rights reserved.
   *
   * Redistribution and use in source and binary forms, with or without modification,
   * are permitted (subject to the limitations in the disclaimer below) provided that
   * the following conditions are met:
   *
   * Redistributions of source code must retain the above copyright notice, this list
   * of conditions and the following disclaimer.
   *
   * Redistributions in binary form must reproduce the above copyright notice, this
   * list of conditions and the following disclaimer in the documentation and/or
   * other materials provided with the distribution.
   *
   * Neither the name of FIRST nor the names of its contributors may be used to endorse or
   * promote products derived from this software without specific prior written permission.
   *
   * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY THIS
   * LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
   * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
   * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
   * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
   * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
   * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
   * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
   * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
   */
  
  package org.firstinspires.ftc.robotcontroller.external.samples;
  
  import com.qualcomm.robotcore.eventloop.opmode.Autonomous;
  import com.qualcomm.robotcore.eventloop.opmode.Disabled;
  import com.qualcomm.robotcore.eventloop.opmode.LinearOpMode;
  import com.qualcomm.robotcore.hardware.DcMotor;
  import com.qualcomm.robotcore.hardware.NormalizedColorSensor;
  import com.qualcomm.robotcore.hardware.NormalizedRGBA;
  import com.qualcomm.robotcore.hardware.SwitchableLight;
  
  /*
   * This OpMode illustrates the concept of driving up to a line and then stopping.
   * The code is structured as a LinearOpMode
   *
   * The Sensor used here can be a REV Color Sensor V2 or V3.  Make sure the white LED is turned on.
   * The sensor can be plugged into any I2C port, and must be named "sensor_color" in the active configuration.
   *
   *   Depending on the height of your color sensor, you may want to set the sensor "gain".
   *   The higher the gain, the greater the reflected light reading will be.
   *   Use the SensorColor sample in this folder to determine the minimum gain value that provides an
   *   "Alpha" reading of 1.0 when you are on top of the white line.  In this sample, we use a gain of 15
   *   which works well with a Rev V2 color sensor
   *
   *   Setting the correct WHITE_THRESHOLD value is key to stopping correctly.
   *   This should be set halfway between the bare-tile, and white-line "Alpha" values.
   *   The reflected light value can be read on the screen once the OpMode has been INIT, but before it is STARTED.
   *   Move the sensor on and off the white line and note the min and max readings.
   *   Edit this code to make WHITE_THRESHOLD halfway between the min and max.
   *
   *   Use Android Studio to Copy this Class, and Paste it into your team's code folder with a new name.
   *   Remove or comment out the @Disabled line to add this OpMode to the Driver Station OpMode list
   */
  
  @Autonomous(name="Robot: Auto Drive To Line", group="Robot")
  @Disabled
  public class RobotAutoDriveToLine_Linear extends LinearOpMode {
  
      /* Declare OpMode members. */
      private DcMotor         leftDrive   = null;
      private DcMotor         rightDrive  = null;
  
      /** The variable to store a reference to our color sensor hardware object */
      NormalizedColorSensor colorSensor;
  
      static final double     WHITE_THRESHOLD = 0.5;  // spans between 0.0 - 1.0 from dark to light
      static final double     APPROACH_SPEED  = 0.25;
  
      @Override
      public void runOpMode() {
  
          // Initialize the drive system variables.
          leftDrive  = hardwareMap.get(DcMotor.class, "left_drive");
          rightDrive = hardwareMap.get(DcMotor.class, "right_drive");
  
          // To drive forward, most robots need the motor on one side to be reversed, because the axles point in opposite directions.
          // When run, this OpMode should start both motors driving forward. So adjust these two lines based on your first test drive.
          // Note: The settings here assume direct drive on left and right wheels.  Gear Reduction or 90 Deg drives may require direction flips
          leftDrive.setDirection(DcMotor.Direction.REVERSE);
          rightDrive.setDirection(DcMotor.Direction.FORWARD);
  
          // If there are encoders connected, switch to RUN_USING_ENCODER mode for greater accuracy
          // leftDrive.setMode(DcMotor.RunMode.RUN_USING_ENCODER);
          // rightDrive.setMode(DcMotor.RunMode.RUN_USING_ENCODER);
  
          // Get a reference to our sensor object. It's recommended to use NormalizedColorSensor over
          // ColorSensor, because NormalizedColorSensor consistently gives values between 0 and 1, while
          // the values you get from ColorSensor are dependent on the specific sensor you're using.
          colorSensor = hardwareMap.get(NormalizedColorSensor.class, "sensor_color");
  
          // If necessary, turn ON the white LED (if there is no LED switch on the sensor)
          if (colorSensor instanceof SwitchableLight) {
              ((SwitchableLight)colorSensor).enableLight(true);
          }
  
          // Some sensors allow you to set your light sensor gain for optimal sensitivity...
          // See the SensorColor sample in this folder for how to determine the optimal gain.
          // A gain of 15 causes a Rev Color Sensor V2 to produce an Alpha value of 1.0 at about 1.5" above the floor.
          colorSensor.setGain(15);
  
          // Wait for driver to press START)
          // Abort this loop is started or stopped.
          while (opModeInInit()) {
  
              // Send telemetry message to signify robot waiting;
              telemetry.addData("Status", "Ready to drive to white line.");    //
  
              // Display the light level while we are waiting to start
              getBrightness();
          }
  
          // Start the robot moving forward, and then begin looking for a white line.
          leftDrive.setPower(APPROACH_SPEED);
          rightDrive.setPower(APPROACH_SPEED);
  
          // run until the white line is seen OR the driver presses STOP;
          while (opModeIsActive() && (getBrightness() < WHITE_THRESHOLD)) {
              sleep(5);
          }
  
          // Stop all motors
          leftDrive.setPower(0);
          rightDrive.setPower(0);
      }
  
      // to obtain reflected light, read the normalized values from the color sensor.  Return the Alpha channel.
      double getBrightness() {
          NormalizedRGBA colors = colorSensor.getNormalizedColors();
          telemetry.addData("Light Level (0 to 1)",  "%4.2f", colors.alpha);
          telemetry.update();
  
          return colors.alpha;
      }
  }
  