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}