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 * Sticky faults for a PowerDistribution device. These faults will remain active until they are
009 * reset by the user.
010 */
011public class PowerDistributionStickyFaults {
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 was 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 device's CAN controller experienced a "Bus Off" event. */
091  public final boolean canBusOff;
092
093  /** The hardware on the device has malfunctioned. */
094  public final boolean hardwareFault;
095
096  /** The firmware on the device has malfunctioned. */
097  public final boolean firmwareFault;
098
099  /** The device has rebooted. */
100  public final boolean hasReset;
101
102  /**
103   * Gets whether there is a sticky breaker fault at the specified channel.
104   *
105   * @param channel Channel to check for sticky faults.
106   * @return True if there is a sticky breaker fault at the channel, otherwise false.
107   * @throws IndexOutOfBoundsException if the provided channel is outside of the range supported by
108   *     the hardware.
109   */
110  public final boolean getBreakerFault(int channel) {
111    return switch (channel) {
112      case 0 -> channel0BreakerFault;
113      case 1 -> channel1BreakerFault;
114      case 2 -> channel2BreakerFault;
115      case 3 -> channel3BreakerFault;
116      case 4 -> channel4BreakerFault;
117      case 5 -> channel5BreakerFault;
118      case 6 -> channel6BreakerFault;
119      case 7 -> channel7BreakerFault;
120      case 8 -> channel8BreakerFault;
121      case 9 -> channel9BreakerFault;
122      case 10 -> channel10BreakerFault;
123      case 11 -> channel11BreakerFault;
124      case 12 -> channel12BreakerFault;
125      case 13 -> channel13BreakerFault;
126      case 14 -> channel14BreakerFault;
127      case 15 -> channel15BreakerFault;
128      case 16 -> channel16BreakerFault;
129      case 17 -> channel17BreakerFault;
130      case 18 -> channel18BreakerFault;
131      case 19 -> channel19BreakerFault;
132      case 20 -> channel20BreakerFault;
133      case 21 -> channel21BreakerFault;
134      case 22 -> channel22BreakerFault;
135      case 23 -> channel23BreakerFault;
136      default ->
137          throw new IndexOutOfBoundsException("Power distribution fault channel out of bounds!");
138    };
139  }
140
141  /**
142   * Constructs from a bitfield.
143   *
144   * @param faults faults
145   */
146  public PowerDistributionStickyFaults(int faults) {
147    channel0BreakerFault = (faults & 0x1) != 0;
148    channel1BreakerFault = (faults & 0x2) != 0;
149    channel2BreakerFault = (faults & 0x4) != 0;
150    channel3BreakerFault = (faults & 0x8) != 0;
151    channel4BreakerFault = (faults & 0x10) != 0;
152    channel5BreakerFault = (faults & 0x20) != 0;
153    channel6BreakerFault = (faults & 0x40) != 0;
154    channel7BreakerFault = (faults & 0x80) != 0;
155    channel8BreakerFault = (faults & 0x100) != 0;
156    channel9BreakerFault = (faults & 0x200) != 0;
157    channel10BreakerFault = (faults & 0x400) != 0;
158    channel11BreakerFault = (faults & 0x800) != 0;
159    channel12BreakerFault = (faults & 0x1000) != 0;
160    channel13BreakerFault = (faults & 0x2000) != 0;
161    channel14BreakerFault = (faults & 0x4000) != 0;
162    channel15BreakerFault = (faults & 0x8000) != 0;
163    channel16BreakerFault = (faults & 0x10000) != 0;
164    channel17BreakerFault = (faults & 0x20000) != 0;
165    channel18BreakerFault = (faults & 0x40000) != 0;
166    channel19BreakerFault = (faults & 0x80000) != 0;
167    channel20BreakerFault = (faults & 0x100000) != 0;
168    channel21BreakerFault = (faults & 0x200000) != 0;
169    channel22BreakerFault = (faults & 0x400000) != 0;
170    channel23BreakerFault = (faults & 0x800000) != 0;
171    brownout = (faults & 0x1000000) != 0;
172    canWarning = (faults & 0x2000000) != 0;
173    canBusOff = (faults & 0x4000000) != 0;
174    hardwareFault = (faults & 0x8000000) != 0;
175    firmwareFault = (faults & 0x10000000) != 0;
176    hasReset = (faults & 0x20000000) != 0;
177  }
178}