001// Copyright (c) FIRST and other WPILib contributors.
002// Open Source Software; you can modify and/or share it under the terms of
003// the WPILib BSD license file in the root directory of this project.
004
005package edu.wpi.first.wpilibj.simulation;
006
007import edu.wpi.first.wpilibj.GenericHID;
008
009/** Class to control a simulated generic joystick. */
010public class GenericHIDSim {
011  protected final int m_port;
012
013  /**
014   * Constructs from a GenericHID object.
015   *
016   * @param joystick joystick to simulate
017   */
018  public GenericHIDSim(GenericHID joystick) {
019    m_port = joystick.getPort();
020  }
021
022  /**
023   * Constructs from a joystick port number.
024   *
025   * @param port port number
026   */
027  public GenericHIDSim(int port) {
028    m_port = port;
029  }
030
031  /** Updates joystick data so that new values are visible to the user program. */
032  public void notifyNewData() {
033    DriverStationSim.notifyNewData();
034  }
035
036  /**
037   * Set the value of a given button.
038   *
039   * @param button the button to set
040   * @param value the new value
041   */
042  public void setRawButton(int button, boolean value) {
043    DriverStationSim.setJoystickButton(m_port, button, value);
044  }
045
046  /**
047   * Set the value of a given axis.
048   *
049   * @param axis the axis to set
050   * @param value the new value
051   */
052  public void setRawAxis(int axis, double value) {
053    DriverStationSim.setJoystickAxis(m_port, axis, value);
054  }
055
056  /**
057   * Set the value of a given POV.
058   *
059   * @param pov the POV to set
060   * @param value the new value
061   */
062  public void setPOV(int pov, int value) {
063    DriverStationSim.setJoystickPOV(m_port, pov, value);
064  }
065
066  /**
067   * Set the value of the default POV (port 0).
068   *
069   * @param value the new value
070   */
071  public void setPOV(int value) {
072    setPOV(0, value);
073  }
074
075  /**
076   * Set the axis count of this device.
077   *
078   * @param count the new axis count
079   */
080  public void setAxisCount(int count) {
081    DriverStationSim.setJoystickAxisCount(m_port, count);
082  }
083
084  /**
085   * Set the POV count of this device.
086   *
087   * @param count the new POV count
088   */
089  public void setPOVCount(int count) {
090    DriverStationSim.setJoystickPOVCount(m_port, count);
091  }
092
093  /**
094   * Set the button count of this device.
095   *
096   * @param count the new button count
097   */
098  public void setButtonCount(int count) {
099    DriverStationSim.setJoystickButtonCount(m_port, count);
100  }
101
102  /**
103   * Set the type of this device.
104   *
105   * @param type the new device type
106   */
107  public void setType(GenericHID.HIDType type) {
108    DriverStationSim.setJoystickType(m_port, type.value);
109  }
110
111  /**
112   * Set the name of this device.
113   *
114   * @param name the new device name
115   */
116  public void setName(String name) {
117    DriverStationSim.setJoystickName(m_port, name);
118  }
119
120  /**
121   * Set the type of the provided axis channel.
122   *
123   * @param axis the axis
124   * @param type the type
125   */
126  public void setAxisType(int axis, int type) {
127    DriverStationSim.setJoystickAxisType(m_port, axis, type);
128  }
129
130  /**
131   * Read the output of a button.
132   *
133   * @param outputNumber the button number
134   * @return the value of the button (true = pressed)
135   */
136  public boolean getOutput(int outputNumber) {
137    long outputs = getOutputs();
138    return (outputs & (1 << (outputNumber - 1))) != 0;
139  }
140
141  /**
142   * Get the encoded 16-bit integer that passes button values.
143   *
144   * @return the button values
145   */
146  public long getOutputs() {
147    return DriverStationSim.getJoystickOutputs(m_port);
148  }
149
150  /**
151   * Get the joystick rumble.
152   *
153   * @param type the rumble to read
154   * @return the rumble value
155   */
156  public double getRumble(GenericHID.RumbleType type) {
157    int value =
158        DriverStationSim.getJoystickRumble(
159            m_port, type == GenericHID.RumbleType.kLeftRumble ? 0 : 1);
160    return value / 65535.0;
161  }
162}