// Copyright (c) FIRST and other WPILib contributors.
// Open Source Software; you can modify and/or share it under the terms of
// the WPILib BSD license file in the root directory of this project.

// THIS FILE WAS AUTO-GENERATED BY ./commandsv3/generate_files.py. DO NOT MODIFY

package org.wpilib.command3.button;

import org.wpilib.command3.Scheduler;
import org.wpilib.command3.Trigger;
import org.wpilib.driverstation.NiDsPS5Controller;
import org.wpilib.event.EventLoop;

/**
 * A version of {@link NiDsPS5Controller} with {@link Trigger} factories for command-based.
 *
 * @see NiDsPS5Controller
 */
@SuppressWarnings("MethodName")
public class CommandNiDsPS5Controller extends CommandGenericHID {
  private final NiDsPS5Controller m_hid;

  /**
   * Construct an instance of a controller. Commands bound to buttons on the controller will be
   * scheduled on the {@link Scheduler#getDefault() default scheduler} using its default event loop.
   *
   * @param port The port index on the Driver Station that the controller is plugged into.
   */
  public CommandNiDsPS5Controller(int port) {
    super(port);
    m_hid = new NiDsPS5Controller(port);
  }

  /**
   * Construct an instance of a controller. Commands bound to buttons on the controller will be
   * scheduled on the given scheduler using its default event loop.
   *
   * @param scheduler The scheduler that should execute the triggered commands.
   * @param port The port index on the Driver Station that the controller is plugged into.
   */
  public CommandNiDsPS5Controller(Scheduler scheduler, int port) {
    super(scheduler, port);
    m_hid = new NiDsPS5Controller(port);
  }

  /**
   * Get the underlying GenericHID object.
   *
   * @return the wrapped GenericHID object
   */
  @Override
  public NiDsPS5Controller getHID() {
    return m_hid;
  }

  /**
   * Constructs a Trigger instance around the square button's digital signal.
   *
   * @return a Trigger instance representing the square button's digital signal attached
   *     to the {@link Scheduler#getDefaultEventLoop() default scheduler event loop} on the
   *     scheduler passed to the controller's constructor, or the {@link Scheduler#getDefault
   *     default scheduler} if a scheduler was not explicitly provided.
   * @see #square(EventLoop)
   */
  public Trigger square() {
    return square(getScheduler().getDefaultEventLoop());
  }

  /**
   * Constructs a Trigger instance around the square button's digital signal.
   *
   * @param loop the event loop instance to attach the event to.
   * @return a Trigger instance representing the square button's digital signal attached
   *     to the given loop.
   */
  public Trigger square(EventLoop loop) {
    return button(NiDsPS5Controller.Button.kSquare.value, loop);
  }

  /**
   * Constructs a Trigger instance around the cross button's digital signal.
   *
   * @return a Trigger instance representing the cross button's digital signal attached
   *     to the {@link Scheduler#getDefaultEventLoop() default scheduler event loop} on the
   *     scheduler passed to the controller's constructor, or the {@link Scheduler#getDefault
   *     default scheduler} if a scheduler was not explicitly provided.
   * @see #cross(EventLoop)
   */
  public Trigger cross() {
    return cross(getScheduler().getDefaultEventLoop());
  }

  /**
   * Constructs a Trigger instance around the cross button's digital signal.
   *
   * @param loop the event loop instance to attach the event to.
   * @return a Trigger instance representing the cross button's digital signal attached
   *     to the given loop.
   */
  public Trigger cross(EventLoop loop) {
    return button(NiDsPS5Controller.Button.kCross.value, loop);
  }

  /**
   * Constructs a Trigger instance around the circle button's digital signal.
   *
   * @return a Trigger instance representing the circle button's digital signal attached
   *     to the {@link Scheduler#getDefaultEventLoop() default scheduler event loop} on the
   *     scheduler passed to the controller's constructor, or the {@link Scheduler#getDefault
   *     default scheduler} if a scheduler was not explicitly provided.
   * @see #circle(EventLoop)
   */
  public Trigger circle() {
    return circle(getScheduler().getDefaultEventLoop());
  }

  /**
   * Constructs a Trigger instance around the circle button's digital signal.
   *
   * @param loop the event loop instance to attach the event to.
   * @return a Trigger instance representing the circle button's digital signal attached
   *     to the given loop.
   */
  public Trigger circle(EventLoop loop) {
    return button(NiDsPS5Controller.Button.kCircle.value, loop);
  }

  /**
   * Constructs a Trigger instance around the triangle button's digital signal.
   *
   * @return a Trigger instance representing the triangle button's digital signal attached
   *     to the {@link Scheduler#getDefaultEventLoop() default scheduler event loop} on the
   *     scheduler passed to the controller's constructor, or the {@link Scheduler#getDefault
   *     default scheduler} if a scheduler was not explicitly provided.
   * @see #triangle(EventLoop)
   */
  public Trigger triangle() {
    return triangle(getScheduler().getDefaultEventLoop());
  }

  /**
   * Constructs a Trigger instance around the triangle button's digital signal.
   *
   * @param loop the event loop instance to attach the event to.
   * @return a Trigger instance representing the triangle button's digital signal attached
   *     to the given loop.
   */
  public Trigger triangle(EventLoop loop) {
    return button(NiDsPS5Controller.Button.kTriangle.value, loop);
  }

  /**
   * Constructs a Trigger instance around the left trigger 1 button's digital signal.
   *
   * @return a Trigger instance representing the left trigger 1 button's digital signal attached
   *     to the {@link Scheduler#getDefaultEventLoop() default scheduler event loop} on the
   *     scheduler passed to the controller's constructor, or the {@link Scheduler#getDefault
   *     default scheduler} if a scheduler was not explicitly provided.
   * @see #L1(EventLoop)
   */
  public Trigger L1() {
    return L1(getScheduler().getDefaultEventLoop());
  }

  /**
   * Constructs a Trigger instance around the left trigger 1 button's digital signal.
   *
   * @param loop the event loop instance to attach the event to.
   * @return a Trigger instance representing the left trigger 1 button's digital signal attached
   *     to the given loop.
   */
  public Trigger L1(EventLoop loop) {
    return button(NiDsPS5Controller.Button.kL1.value, loop);
  }

  /**
   * Constructs a Trigger instance around the right trigger 1 button's digital signal.
   *
   * @return a Trigger instance representing the right trigger 1 button's digital signal attached
   *     to the {@link Scheduler#getDefaultEventLoop() default scheduler event loop} on the
   *     scheduler passed to the controller's constructor, or the {@link Scheduler#getDefault
   *     default scheduler} if a scheduler was not explicitly provided.
   * @see #R1(EventLoop)
   */
  public Trigger R1() {
    return R1(getScheduler().getDefaultEventLoop());
  }

  /**
   * Constructs a Trigger instance around the right trigger 1 button's digital signal.
   *
   * @param loop the event loop instance to attach the event to.
   * @return a Trigger instance representing the right trigger 1 button's digital signal attached
   *     to the given loop.
   */
  public Trigger R1(EventLoop loop) {
    return button(NiDsPS5Controller.Button.kR1.value, loop);
  }

  /**
   * Constructs a Trigger instance around the left trigger 2 button's digital signal.
   *
   * @return a Trigger instance representing the left trigger 2 button's digital signal attached
   *     to the {@link Scheduler#getDefaultEventLoop() default scheduler event loop} on the
   *     scheduler passed to the controller's constructor, or the {@link Scheduler#getDefault
   *     default scheduler} if a scheduler was not explicitly provided.
   * @see #L2(EventLoop)
   */
  public Trigger L2() {
    return L2(getScheduler().getDefaultEventLoop());
  }

  /**
   * Constructs a Trigger instance around the left trigger 2 button's digital signal.
   *
   * @param loop the event loop instance to attach the event to.
   * @return a Trigger instance representing the left trigger 2 button's digital signal attached
   *     to the given loop.
   */
  public Trigger L2(EventLoop loop) {
    return button(NiDsPS5Controller.Button.kL2.value, loop);
  }

  /**
   * Constructs a Trigger instance around the right trigger 2 button's digital signal.
   *
   * @return a Trigger instance representing the right trigger 2 button's digital signal attached
   *     to the {@link Scheduler#getDefaultEventLoop() default scheduler event loop} on the
   *     scheduler passed to the controller's constructor, or the {@link Scheduler#getDefault
   *     default scheduler} if a scheduler was not explicitly provided.
   * @see #R2(EventLoop)
   */
  public Trigger R2() {
    return R2(getScheduler().getDefaultEventLoop());
  }

  /**
   * Constructs a Trigger instance around the right trigger 2 button's digital signal.
   *
   * @param loop the event loop instance to attach the event to.
   * @return a Trigger instance representing the right trigger 2 button's digital signal attached
   *     to the given loop.
   */
  public Trigger R2(EventLoop loop) {
    return button(NiDsPS5Controller.Button.kR2.value, loop);
  }

  /**
   * Constructs a Trigger instance around the create button's digital signal.
   *
   * @return a Trigger instance representing the create button's digital signal attached
   *     to the {@link Scheduler#getDefaultEventLoop() default scheduler event loop} on the
   *     scheduler passed to the controller's constructor, or the {@link Scheduler#getDefault
   *     default scheduler} if a scheduler was not explicitly provided.
   * @see #create(EventLoop)
   */
  public Trigger create() {
    return create(getScheduler().getDefaultEventLoop());
  }

  /**
   * Constructs a Trigger instance around the create button's digital signal.
   *
   * @param loop the event loop instance to attach the event to.
   * @return a Trigger instance representing the create button's digital signal attached
   *     to the given loop.
   */
  public Trigger create(EventLoop loop) {
    return button(NiDsPS5Controller.Button.kCreate.value, loop);
  }

  /**
   * Constructs a Trigger instance around the options button's digital signal.
   *
   * @return a Trigger instance representing the options button's digital signal attached
   *     to the {@link Scheduler#getDefaultEventLoop() default scheduler event loop} on the
   *     scheduler passed to the controller's constructor, or the {@link Scheduler#getDefault
   *     default scheduler} if a scheduler was not explicitly provided.
   * @see #options(EventLoop)
   */
  public Trigger options() {
    return options(getScheduler().getDefaultEventLoop());
  }

  /**
   * Constructs a Trigger instance around the options button's digital signal.
   *
   * @param loop the event loop instance to attach the event to.
   * @return a Trigger instance representing the options button's digital signal attached
   *     to the given loop.
   */
  public Trigger options(EventLoop loop) {
    return button(NiDsPS5Controller.Button.kOptions.value, loop);
  }

  /**
   * Constructs a Trigger instance around the L3 (left stick) button's digital signal.
   *
   * @return a Trigger instance representing the L3 (left stick) button's digital signal attached
   *     to the {@link Scheduler#getDefaultEventLoop() default scheduler event loop} on the
   *     scheduler passed to the controller's constructor, or the {@link Scheduler#getDefault
   *     default scheduler} if a scheduler was not explicitly provided.
   * @see #L3(EventLoop)
   */
  public Trigger L3() {
    return L3(getScheduler().getDefaultEventLoop());
  }

  /**
   * Constructs a Trigger instance around the L3 (left stick) button's digital signal.
   *
   * @param loop the event loop instance to attach the event to.
   * @return a Trigger instance representing the L3 (left stick) button's digital signal attached
   *     to the given loop.
   */
  public Trigger L3(EventLoop loop) {
    return button(NiDsPS5Controller.Button.kL3.value, loop);
  }

  /**
   * Constructs a Trigger instance around the R3 (right stick) button's digital signal.
   *
   * @return a Trigger instance representing the R3 (right stick) button's digital signal attached
   *     to the {@link Scheduler#getDefaultEventLoop() default scheduler event loop} on the
   *     scheduler passed to the controller's constructor, or the {@link Scheduler#getDefault
   *     default scheduler} if a scheduler was not explicitly provided.
   * @see #R3(EventLoop)
   */
  public Trigger R3() {
    return R3(getScheduler().getDefaultEventLoop());
  }

  /**
   * Constructs a Trigger instance around the R3 (right stick) button's digital signal.
   *
   * @param loop the event loop instance to attach the event to.
   * @return a Trigger instance representing the R3 (right stick) button's digital signal attached
   *     to the given loop.
   */
  public Trigger R3(EventLoop loop) {
    return button(NiDsPS5Controller.Button.kR3.value, loop);
  }

  /**
   * Constructs a Trigger instance around the PlayStation button's digital signal.
   *
   * @return a Trigger instance representing the PlayStation button's digital signal attached
   *     to the {@link Scheduler#getDefaultEventLoop() default scheduler event loop} on the
   *     scheduler passed to the controller's constructor, or the {@link Scheduler#getDefault
   *     default scheduler} if a scheduler was not explicitly provided.
   * @see #PS(EventLoop)
   */
  public Trigger PS() {
    return PS(getScheduler().getDefaultEventLoop());
  }

  /**
   * Constructs a Trigger instance around the PlayStation button's digital signal.
   *
   * @param loop the event loop instance to attach the event to.
   * @return a Trigger instance representing the PlayStation button's digital signal attached
   *     to the given loop.
   */
  public Trigger PS(EventLoop loop) {
    return button(NiDsPS5Controller.Button.kPS.value, loop);
  }

  /**
   * Constructs a Trigger instance around the touchpad button's digital signal.
   *
   * @return a Trigger instance representing the touchpad button's digital signal attached
   *     to the {@link Scheduler#getDefaultEventLoop() default scheduler event loop} on the
   *     scheduler passed to the controller's constructor, or the {@link Scheduler#getDefault
   *     default scheduler} if a scheduler was not explicitly provided.
   * @see #touchpad(EventLoop)
   */
  public Trigger touchpad() {
    return touchpad(getScheduler().getDefaultEventLoop());
  }

  /**
   * Constructs a Trigger instance around the touchpad button's digital signal.
   *
   * @param loop the event loop instance to attach the event to.
   * @return a Trigger instance representing the touchpad button's digital signal attached
   *     to the given loop.
   */
  public Trigger touchpad(EventLoop loop) {
    return button(NiDsPS5Controller.Button.kTouchpad.value, loop);
  }

  /**
   * Get the X axis value of left side of the controller. Right is positive.
   *
   * @return The axis value.
   */
  public double getLeftX() {
    return m_hid.getLeftX();
  }

  /**
   * Get the Y axis value of left side of the controller. Back is positive.
   *
   * @return The axis value.
   */
  public double getLeftY() {
    return m_hid.getLeftY();
  }

  /**
   * Get the X axis value of right side of the controller. Right is positive.
   *
   * @return The axis value.
   */
  public double getRightX() {
    return m_hid.getRightX();
  }

  /**
   * Get the Y axis value of right side of the controller. Back is positive.
   *
   * @return The axis value.
   */
  public double getRightY() {
    return m_hid.getRightY();
  }

  /**
   * Get the left trigger 2 axis value of the controller. Note that this axis is bound to the
   * range of [0, 1] as opposed to the usual [-1, 1].
   *
   * @return The axis value.
   */
  public double getL2Axis() {
    return m_hid.getL2Axis();
  }

  /**
   * Get the right trigger 2 axis value of the controller. Note that this axis is bound to the
   * range of [0, 1] as opposed to the usual [-1, 1].
   *
   * @return The axis value.
   */
  public double getR2Axis() {
    return m_hid.getR2Axis();
  }
}
