001package com.ctre.phoenix.led;
002
003/**
004 * Sticky Faults the CANdle can have
005 */
006public class CANdleStickyFaults {
007    /**
008     * Device detects hardware failure
009     */
010    boolean HardwareFault;
011    /**
012     * API error detected.  Make sure API and firmware versions are compatible.
013     */
014    boolean APIError;
015    /**
016     * Boot while receiving an enable frame 
017     */
018    boolean BootDuringEnable;
019    /**
020     * VBat is under 5V
021     */
022    boolean VBatTooLow;
023    /**
024     * VBat is over 30V
025     */
026    boolean VBatTooHigh;
027    /**
028     * 5V Line is under 4 V
029     */
030    boolean V5TooLow;
031    /**
032     * 5V Line is over 6V
033     */
034    boolean V5TooHigh;
035    /**
036     * Exceeded output current of 6 amps
037     */
038    boolean SoftwareFuse;
039    /**
040     * Device is over temperature
041     */
042    boolean ThermalFault;
043    /**
044     * Output pin is shorted to something
045     */
046    boolean ShortCircuit;
047    /**
048     * @return true if any faults are tripped
049     */
050    boolean hasAnyFault() {
051        return  HardwareFault |
052                APIError |
053                BootDuringEnable |
054                VBatTooLow |
055                VBatTooHigh |
056                V5TooLow |
057                V5TooHigh |
058                SoftwareFuse |
059                ThermalFault |
060                ShortCircuit;
061    }
062    /**
063     * @return Current fault list as a bit field
064     */
065    long toBitfield() {
066        long commonFaults = 0;
067        commonFaults |= ShortCircuit ? 1 : 0; commonFaults <<= 1;
068        commonFaults |= ThermalFault ? 1 : 0; commonFaults <<= 1;
069        commonFaults |= SoftwareFuse ? 1 : 0; commonFaults <<= 1;
070        commonFaults |= V5TooLow ? 1 : 0; commonFaults <<= 1;
071        commonFaults |= V5TooHigh ? 1 : 0; commonFaults <<= 1;
072        commonFaults |= VBatTooLow ? 1 : 0; commonFaults <<= 1;
073        commonFaults |= VBatTooHigh ? 1 : 0; commonFaults <<= 1;
074        commonFaults |= BootDuringEnable ? 1 : 0; commonFaults <<= 1;
075        commonFaults |= APIError ? 1 : 0; commonFaults <<= 1;
076        commonFaults |= HardwareFault ? 1 : 0;
077
078        return commonFaults;
079    }
080    void update(long bits) {
081        long mask = 1;
082        HardwareFault  =    (bits & mask) != 0; mask <<= 1;
083        APIError =          (bits & mask) != 0; mask <<= 1;
084        BootDuringEnable =  (bits & mask) != 0; mask <<= 1;
085        VBatTooHigh =       (bits & mask) != 0; mask <<= 1;
086        VBatTooLow =        (bits & mask) != 0; mask <<= 1;
087        V5TooHigh =         (bits & mask) != 0; mask <<= 1;
088        V5TooLow =          (bits & mask) != 0; mask <<= 1;
089        SoftwareFuse =      (bits & mask) != 0; mask <<= 1;
090        ThermalFault =      (bits & mask) != 0; mask <<= 1;
091        ShortCircuit =      (bits & mask) != 0; mask <<= 1;
092    }
093    /**
094     * Updates current fault list with specified bit field of faults
095     * 
096     * @param bits bit field of faults to update with
097     */
098    CANdleStickyFaults(int bits) {
099        update(bits);
100    }
101    CANdleStickyFaults() {
102        update(0);
103    }
104    
105}