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 org.wpilib.hardware.hal;
006
007/** Faults for a REV PH. These faults are only active while the condition is active. */
008public class REVPHFaults {
009  /** Fault on channel 0. */
010  public final boolean channel0Fault;
011
012  /** Fault on channel 1. */
013  public final boolean channel1Fault;
014
015  /** Fault on channel 2. */
016  public final boolean channel2Fault;
017
018  /** Fault on channel 3. */
019  public final boolean channel3Fault;
020
021  /** Fault on channel 4. */
022  public final boolean channel4Fault;
023
024  /** Fault on channel 5. */
025  public final boolean channel5Fault;
026
027  /** Fault on channel 6. */
028  public final boolean channel6Fault;
029
030  /** Fault on channel 7. */
031  public final boolean channel7Fault;
032
033  /** Fault on channel 8. */
034  public final boolean channel8Fault;
035
036  /** Fault on channel 9. */
037  public final boolean channel9Fault;
038
039  /** Fault on channel 10. */
040  public final boolean channel10Fault;
041
042  /** Fault on channel 11. */
043  public final boolean channel11Fault;
044
045  /** Fault on channel 12. */
046  public final boolean channel12Fault;
047
048  /** Fault on channel 13. */
049  public final boolean channel13Fault;
050
051  /** Fault on channel 14. */
052  public final boolean channel14Fault;
053
054  /** Fault on channel 15. */
055  public final boolean channel15Fault;
056
057  /** An overcurrent event occurred on the compressor output. */
058  public final boolean compressorOverCurrent;
059
060  /** The compressor output has an open circuit. */
061  public final boolean compressorOpen;
062
063  /** An overcurrent event occurred on a solenoid output. */
064  public final boolean solenoidOverCurrent;
065
066  /** The input voltage is below the minimum voltage. */
067  public final boolean brownout;
068
069  /** A warning was raised by the device's CAN controller. */
070  public final boolean canWarning;
071
072  /** The hardware on the device has malfunctioned. */
073  public final boolean hardwareFault;
074
075  /**
076   * Gets whether there is a fault at the specified channel.
077   *
078   * @param channel Channel to check for faults.
079   * @return True if a a fault exists at the channel, otherwise false.
080   * @throws IndexOutOfBoundsException if the provided channel is outside of the range supported by
081   *     the hardware.
082   */
083  public final boolean getchannelFault(int channel) {
084    return switch (channel) {
085      case 0 -> channel0Fault;
086      case 1 -> channel1Fault;
087      case 2 -> channel2Fault;
088      case 3 -> channel3Fault;
089      case 4 -> channel4Fault;
090      case 5 -> channel5Fault;
091      case 6 -> channel6Fault;
092      case 7 -> channel7Fault;
093      case 8 -> channel8Fault;
094      case 9 -> channel9Fault;
095      case 10 -> channel10Fault;
096      case 11 -> channel11Fault;
097      case 12 -> channel12Fault;
098      case 13 -> channel13Fault;
099      case 14 -> channel14Fault;
100      case 15 -> channel15Fault;
101      default -> throw new IndexOutOfBoundsException("Pneumatics fault channel out of bounds!");
102    };
103  }
104
105  /**
106   * Called from HAL to construct.
107   *
108   * @param faults the fault bitfields
109   */
110  public REVPHFaults(int faults) {
111    channel0Fault = (faults & (1 << 0)) != 0;
112    channel1Fault = (faults & (1 << 1)) != 0;
113    channel2Fault = (faults & (1 << 2)) != 0;
114    channel3Fault = (faults & (1 << 3)) != 0;
115    channel4Fault = (faults & (1 << 4)) != 0;
116    channel5Fault = (faults & (1 << 5)) != 0;
117    channel6Fault = (faults & (1 << 6)) != 0;
118    channel7Fault = (faults & (1 << 7)) != 0;
119    channel8Fault = (faults & (1 << 8)) != 0;
120    channel9Fault = (faults & (1 << 9)) != 0;
121    channel10Fault = (faults & (1 << 10)) != 0;
122    channel11Fault = (faults & (1 << 11)) != 0;
123    channel12Fault = (faults & (1 << 12)) != 0;
124    channel13Fault = (faults & (1 << 13)) != 0;
125    channel14Fault = (faults & (1 << 14)) != 0;
126    channel15Fault = (faults & (1 << 15)) != 0;
127    compressorOverCurrent = (faults & (1 << 16)) != 0;
128    compressorOpen = (faults & (1 << 17)) != 0;
129    solenoidOverCurrent = (faults & (1 << 18)) != 0;
130    brownout = (faults & (1 << 19)) != 0;
131    canWarning = (faults & (1 << 20)) != 0;
132    hardwareFault = (faults & (1 << 21)) != 0;
133  }
134}