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.hal;
006
007/**
008 * Sticky faults for a PowerDistribution device. These faults will remain active until they are
009 * reset by the user.
010 */
011@SuppressWarnings("MemberName")
012public class PowerDistributionStickyFaults {
013  /** Breaker fault on channel 0. */
014  public final boolean Channel0BreakerFault;
015
016  /** Breaker fault on channel 1. */
017  public final boolean Channel1BreakerFault;
018
019  /** Breaker fault on channel 2. */
020  public final boolean Channel2BreakerFault;
021
022  /** Breaker fault on channel 3. */
023  public final boolean Channel3BreakerFault;
024
025  /** Breaker fault on channel 4. */
026  public final boolean Channel4BreakerFault;
027
028  /** Breaker fault on channel 5. */
029  public final boolean Channel5BreakerFault;
030
031  /** Breaker fault on channel 6. */
032  public final boolean Channel6BreakerFault;
033
034  /** Breaker fault on channel 7. */
035  public final boolean Channel7BreakerFault;
036
037  /** Breaker fault on channel 8. */
038  public final boolean Channel8BreakerFault;
039
040  /** Breaker fault on channel 9. */
041  public final boolean Channel9BreakerFault;
042
043  /** Breaker fault on channel 10. */
044  public final boolean Channel10BreakerFault;
045
046  /** Breaker fault on channel 11. */
047  public final boolean Channel11BreakerFault;
048
049  /** Breaker fault on channel 12. */
050  public final boolean Channel12BreakerFault;
051
052  /** Breaker fault on channel 13. */
053  public final boolean Channel13BreakerFault;
054
055  /** Breaker fault on channel 14. */
056  public final boolean Channel14BreakerFault;
057
058  /** Breaker fault on channel 15. */
059  public final boolean Channel15BreakerFault;
060
061  /** Breaker fault on channel 16. */
062  public final boolean Channel16BreakerFault;
063
064  /** Breaker fault on channel 17. */
065  public final boolean Channel17BreakerFault;
066
067  /** Breaker fault on channel 18. */
068  public final boolean Channel18BreakerFault;
069
070  /** Breaker fault on channel 19. */
071  public final boolean Channel19BreakerFault;
072
073  /** Breaker fault on channel 20. */
074  public final boolean Channel20BreakerFault;
075
076  /** Breaker fault on channel 21. */
077  public final boolean Channel21BreakerFault;
078
079  /** Breaker fault on channel 22. */
080  public final boolean Channel22BreakerFault;
081
082  /** Breaker fault on channel 23. */
083  public final boolean Channel23BreakerFault;
084
085  /** The input voltage was below the minimum voltage. */
086  public final boolean Brownout;
087
088  /** A warning was raised by the device's CAN controller. */
089  public final boolean CanWarning;
090
091  /** The device's CAN controller experienced a "Bus Off" event. */
092  public final boolean CanBusOff;
093
094  /** The hardware on the device has malfunctioned. */
095  public final boolean HardwareFault;
096
097  /** The firmware on the device has malfunctioned. */
098  public final boolean FirmwareFault;
099
100  /** The device has rebooted. */
101  public final boolean HasReset;
102
103  /**
104   * Gets whether there is a sticky breaker fault at the specified channel.
105   *
106   * @param channel Channel to check for sticky faults.
107   * @return True if there is a sticky breaker fault at the channel, otherwise false.
108   * @throws IndexOutOfBoundsException if the provided channel is outside of the range supported by
109   *     the hardware.
110   */
111  public final boolean getBreakerFault(int channel) {
112    return switch (channel) {
113      case 0 -> Channel0BreakerFault;
114      case 1 -> Channel1BreakerFault;
115      case 2 -> Channel2BreakerFault;
116      case 3 -> Channel3BreakerFault;
117      case 4 -> Channel4BreakerFault;
118      case 5 -> Channel5BreakerFault;
119      case 6 -> Channel6BreakerFault;
120      case 7 -> Channel7BreakerFault;
121      case 8 -> Channel8BreakerFault;
122      case 9 -> Channel9BreakerFault;
123      case 10 -> Channel10BreakerFault;
124      case 11 -> Channel11BreakerFault;
125      case 12 -> Channel12BreakerFault;
126      case 13 -> Channel13BreakerFault;
127      case 14 -> Channel14BreakerFault;
128      case 15 -> Channel15BreakerFault;
129      case 16 -> Channel16BreakerFault;
130      case 17 -> Channel17BreakerFault;
131      case 18 -> Channel18BreakerFault;
132      case 19 -> Channel19BreakerFault;
133      case 20 -> Channel20BreakerFault;
134      case 21 -> Channel21BreakerFault;
135      case 22 -> Channel22BreakerFault;
136      case 23 -> Channel23BreakerFault;
137      default -> throw new IndexOutOfBoundsException(
138          "Power distribution fault channel out of bounds!");
139    };
140  }
141
142  /**
143   * Constructs from a bitfield.
144   *
145   * @param faults faults
146   */
147  public PowerDistributionStickyFaults(int faults) {
148    Channel0BreakerFault = (faults & 0x1) != 0;
149    Channel1BreakerFault = (faults & 0x2) != 0;
150    Channel2BreakerFault = (faults & 0x4) != 0;
151    Channel3BreakerFault = (faults & 0x8) != 0;
152    Channel4BreakerFault = (faults & 0x10) != 0;
153    Channel5BreakerFault = (faults & 0x20) != 0;
154    Channel6BreakerFault = (faults & 0x40) != 0;
155    Channel7BreakerFault = (faults & 0x80) != 0;
156    Channel8BreakerFault = (faults & 0x100) != 0;
157    Channel9BreakerFault = (faults & 0x200) != 0;
158    Channel10BreakerFault = (faults & 0x400) != 0;
159    Channel11BreakerFault = (faults & 0x800) != 0;
160    Channel12BreakerFault = (faults & 0x1000) != 0;
161    Channel13BreakerFault = (faults & 0x2000) != 0;
162    Channel14BreakerFault = (faults & 0x4000) != 0;
163    Channel15BreakerFault = (faults & 0x8000) != 0;
164    Channel16BreakerFault = (faults & 0x10000) != 0;
165    Channel17BreakerFault = (faults & 0x20000) != 0;
166    Channel18BreakerFault = (faults & 0x40000) != 0;
167    Channel19BreakerFault = (faults & 0x80000) != 0;
168    Channel20BreakerFault = (faults & 0x100000) != 0;
169    Channel21BreakerFault = (faults & 0x200000) != 0;
170    Channel22BreakerFault = (faults & 0x400000) != 0;
171    Channel23BreakerFault = (faults & 0x800000) != 0;
172    Brownout = (faults & 0x1000000) != 0;
173    CanWarning = (faults & 0x2000000) != 0;
174    CanBusOff = (faults & 0x4000000) != 0;
175    HardwareFault = (faults & 0x8000000) != 0;
176    FirmwareFault = (faults & 0x10000000) != 0;
177    HasReset = (faults & 0x20000000) != 0;
178  }
179}