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/**
008 * Faults for a PowerDistribution device. These faults are only active while the condition is
009 * active.
010 */
011public class PowerDistributionFaults {
012  /** Breaker fault on channel 0. */
013  public final boolean channel0BreakerFault;
014
015  /** Breaker fault on channel 1. */
016  public final boolean channel1BreakerFault;
017
018  /** Breaker fault on channel 2. */
019  public final boolean channel2BreakerFault;
020
021  /** Breaker fault on channel 3. */
022  public final boolean channel3BreakerFault;
023
024  /** Breaker fault on channel 4. */
025  public final boolean channel4BreakerFault;
026
027  /** Breaker fault on channel 5. */
028  public final boolean channel5BreakerFault;
029
030  /** Breaker fault on channel 6. */
031  public final boolean channel6BreakerFault;
032
033  /** Breaker fault on channel 7. */
034  public final boolean channel7BreakerFault;
035
036  /** Breaker fault on channel 8. */
037  public final boolean channel8BreakerFault;
038
039  /** Breaker fault on channel 9. */
040  public final boolean channel9BreakerFault;
041
042  /** Breaker fault on channel 10. */
043  public final boolean channel10BreakerFault;
044
045  /** Breaker fault on channel 11. */
046  public final boolean channel11BreakerFault;
047
048  /** Breaker fault on channel 12. */
049  public final boolean channel12BreakerFault;
050
051  /** Breaker fault on channel 13. */
052  public final boolean channel13BreakerFault;
053
054  /** Breaker fault on channel 14. */
055  public final boolean channel14BreakerFault;
056
057  /** Breaker fault on channel 15. */
058  public final boolean channel15BreakerFault;
059
060  /** Breaker fault on channel 16. */
061  public final boolean channel16BreakerFault;
062
063  /** Breaker fault on channel 17. */
064  public final boolean channel17BreakerFault;
065
066  /** Breaker fault on channel 18. */
067  public final boolean channel18BreakerFault;
068
069  /** Breaker fault on channel 19. */
070  public final boolean channel19BreakerFault;
071
072  /** Breaker fault on channel 20. */
073  public final boolean channel20BreakerFault;
074
075  /** Breaker fault on channel 21. */
076  public final boolean channel21BreakerFault;
077
078  /** Breaker fault on channel 22. */
079  public final boolean channel22BreakerFault;
080
081  /** Breaker fault on channel 23. */
082  public final boolean channel23BreakerFault;
083
084  /** The input voltage is below the minimum voltage. */
085  public final boolean brownout;
086
087  /** A warning was raised by the device's CAN controller. */
088  public final boolean canWarning;
089
090  /** The hardware on the device has malfunctioned. */
091  public final boolean hardwareFault;
092
093  /**
094   * Gets whether there is a breaker fault at the specified channel.
095   *
096   * @param channel Channel to check for faults.
097   * @return True if there is a breaker fault at the channel, otherwise false.
098   * @throws IndexOutOfBoundsException if the provided channel is outside of the range supported by
099   *     the hardware.
100   */
101  public final boolean getBreakerFault(int channel) {
102    return switch (channel) {
103      case 0 -> channel0BreakerFault;
104      case 1 -> channel1BreakerFault;
105      case 2 -> channel2BreakerFault;
106      case 3 -> channel3BreakerFault;
107      case 4 -> channel4BreakerFault;
108      case 5 -> channel5BreakerFault;
109      case 6 -> channel6BreakerFault;
110      case 7 -> channel7BreakerFault;
111      case 8 -> channel8BreakerFault;
112      case 9 -> channel9BreakerFault;
113      case 10 -> channel10BreakerFault;
114      case 11 -> channel11BreakerFault;
115      case 12 -> channel12BreakerFault;
116      case 13 -> channel13BreakerFault;
117      case 14 -> channel14BreakerFault;
118      case 15 -> channel15BreakerFault;
119      case 16 -> channel16BreakerFault;
120      case 17 -> channel17BreakerFault;
121      case 18 -> channel18BreakerFault;
122      case 19 -> channel19BreakerFault;
123      case 20 -> channel20BreakerFault;
124      case 21 -> channel21BreakerFault;
125      case 22 -> channel22BreakerFault;
126      case 23 -> channel23BreakerFault;
127      default ->
128          throw new IndexOutOfBoundsException("Power distribution fault channel out of bounds!");
129    };
130  }
131
132  /**
133   * Constructs from a bitfield.
134   *
135   * @param faults faults
136   */
137  public PowerDistributionFaults(int faults) {
138    channel0BreakerFault = (faults & 0x1) != 0;
139    channel1BreakerFault = (faults & 0x2) != 0;
140    channel2BreakerFault = (faults & 0x4) != 0;
141    channel3BreakerFault = (faults & 0x8) != 0;
142    channel4BreakerFault = (faults & 0x10) != 0;
143    channel5BreakerFault = (faults & 0x20) != 0;
144    channel6BreakerFault = (faults & 0x40) != 0;
145    channel7BreakerFault = (faults & 0x80) != 0;
146    channel8BreakerFault = (faults & 0x100) != 0;
147    channel9BreakerFault = (faults & 0x200) != 0;
148    channel10BreakerFault = (faults & 0x400) != 0;
149    channel11BreakerFault = (faults & 0x800) != 0;
150    channel12BreakerFault = (faults & 0x1000) != 0;
151    channel13BreakerFault = (faults & 0x2000) != 0;
152    channel14BreakerFault = (faults & 0x4000) != 0;
153    channel15BreakerFault = (faults & 0x8000) != 0;
154    channel16BreakerFault = (faults & 0x10000) != 0;
155    channel17BreakerFault = (faults & 0x20000) != 0;
156    channel18BreakerFault = (faults & 0x40000) != 0;
157    channel19BreakerFault = (faults & 0x80000) != 0;
158    channel20BreakerFault = (faults & 0x100000) != 0;
159    channel21BreakerFault = (faults & 0x200000) != 0;
160    channel22BreakerFault = (faults & 0x400000) != 0;
161    channel23BreakerFault = (faults & 0x800000) != 0;
162    brownout = (faults & 0x1000000) != 0;
163    canWarning = (faults & 0x2000000) != 0;
164    hardwareFault = (faults & 0x4000000) != 0;
165  }
166}