Advertisement
YWLAElektraBots

DoubleSolenoid.class

Jan 26th, 2018
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 5.96 KB | None | 0 0
  1. /*----------------------------------------------------------------------------*/
  2. /* Copyright (c) 2008-2018 FIRST. All Rights Reserved.                        */
  3. /* Open Source Software - may be modified and shared by FRC teams. The code   */
  4. /* must be accompanied by the FIRST BSD license file in the root directory of */
  5. /* the project.                                                               */
  6. /*----------------------------------------------------------------------------*/
  7.  
  8. package edu.wpi.first.wpilibj;
  9.  
  10. import edu.wpi.first.wpilibj.hal.FRCNetComm.tResourceType;
  11. import edu.wpi.first.wpilibj.hal.HAL;
  12. import edu.wpi.first.wpilibj.hal.SolenoidJNI;
  13. import edu.wpi.first.wpilibj.smartdashboard.SendableBuilder;
  14.  
  15. /**
  16.  * DoubleSolenoid class for running 2 channels of high voltage Digital Output on the PCM.
  17.  *
  18.  * <p>The DoubleSolenoid class is typically used for pneumatics solenoids that have two positions
  19.  * controlled by two separate channels.
  20.  */
  21. public class DoubleSolenoid extends SolenoidBase implements Sendable {
  22.   /**
  23.    * Possible values for a DoubleSolenoid.
  24.    */
  25.   public enum Value {
  26.     kOff,
  27.     kForward,
  28.     kReverse
  29.   }
  30.  
  31.   private byte m_forwardMask; // The mask for the forward channel.
  32.   private byte m_reverseMask; // The mask for the reverse channel.
  33.   private int m_forwardHandle = 0;
  34.   private int m_reverseHandle = 0;
  35.  
  36.   /**
  37.    * Constructor. Uses the default PCM ID (defaults to 0).
  38.    *
  39.    * @param forwardChannel The forward channel number on the PCM (0..7).
  40.    * @param reverseChannel The reverse channel number on the PCM (0..7).
  41.    */
  42.   public DoubleSolenoid(final int forwardChannel, final int reverseChannel) {
  43.     this(SensorBase.getDefaultSolenoidModule(), forwardChannel, reverseChannel);
  44.   }
  45.  
  46.   /**
  47.    * Constructor.
  48.    *
  49.    * @param moduleNumber   The module number of the solenoid module to use.
  50.    * @param forwardChannel The forward channel on the module to control (0..7).
  51.    * @param reverseChannel The reverse channel on the module to control (0..7).
  52.    */
  53.   public DoubleSolenoid(final int moduleNumber, final int forwardChannel,
  54.                         final int reverseChannel) {
  55.     super(moduleNumber);
  56.  
  57.     SensorBase.checkSolenoidModule(m_moduleNumber);
  58.     SensorBase.checkSolenoidChannel(forwardChannel);
  59.     SensorBase.checkSolenoidChannel(reverseChannel);
  60.  
  61.     int portHandle = SolenoidJNI.getPortWithModule((byte) m_moduleNumber, (byte) forwardChannel);
  62.     m_forwardHandle = SolenoidJNI.initializeSolenoidPort(portHandle);
  63.  
  64.     try {
  65.       portHandle = SolenoidJNI.getPortWithModule((byte) m_moduleNumber, (byte) reverseChannel);
  66.       m_reverseHandle = SolenoidJNI.initializeSolenoidPort(portHandle);
  67.     } catch (RuntimeException ex) {
  68.       // free the forward handle on exception, then rethrow
  69.       SolenoidJNI.freeSolenoidPort(m_forwardHandle);
  70.       m_forwardHandle = 0;
  71.       m_reverseHandle = 0;
  72.       throw ex;
  73.     }
  74.  
  75.     m_forwardMask = (byte) (1 << forwardChannel);
  76.     m_reverseMask = (byte) (1 << reverseChannel);
  77.  
  78.     HAL.report(tResourceType.kResourceType_Solenoid, forwardChannel,
  79.                                    m_moduleNumber);
  80.     HAL.report(tResourceType.kResourceType_Solenoid, reverseChannel,
  81.                                    m_moduleNumber);
  82.     setName("DoubleSolenoid", m_moduleNumber, forwardChannel);
  83.   }
  84.  
  85.   /**
  86.    * Destructor.
  87.    */
  88.   @Override
  89.   public synchronized void free() {
  90.     super.free();
  91.     SolenoidJNI.freeSolenoidPort(m_forwardHandle);
  92.     SolenoidJNI.freeSolenoidPort(m_reverseHandle);
  93.     super.free();
  94.   }
  95.  
  96.   /**
  97.    * Set the value of a solenoid.
  98.    *
  99.    * @param value The value to set (Off, Forward, Reverse)
  100.    */
  101.   public void set(final Value value) {
  102.     boolean forward = false;
  103.     boolean reverse = false;
  104.  
  105.     switch (value) {
  106.       case kOff:
  107.         forward = false;
  108.         reverse = false;
  109.         break;
  110.       case kForward:
  111.         forward = true;
  112.         reverse = false;
  113.         break;
  114.       case kReverse:
  115.         forward = false;
  116.         reverse = true;
  117.         break;
  118.       default:
  119.         throw new AssertionError("Illegal value: " + value);
  120.  
  121.     }
  122.  
  123.     SolenoidJNI.setSolenoid(m_forwardHandle, forward);
  124.     SolenoidJNI.setSolenoid(m_reverseHandle, reverse);
  125.   }
  126.  
  127.   /**
  128.    * Read the current value of the solenoid.
  129.    *
  130.    * @return The current value of the solenoid.
  131.    */
  132.   public Value get() {
  133.     boolean valueForward = SolenoidJNI.getSolenoid(m_forwardHandle);
  134.     boolean valueReverse = SolenoidJNI.getSolenoid(m_reverseHandle);
  135.  
  136.     if (valueForward) {
  137.       return Value.kForward;
  138.     }
  139.     if (valueReverse) {
  140.       return Value.kReverse;
  141.     }
  142.     return Value.kOff;
  143.   }
  144.  
  145.   /**
  146.    * Check if the forward solenoid is blacklisted. If a solenoid is shorted, it is added to the
  147.    * blacklist and disabled until power cycle, or until faults are cleared.
  148.    *
  149.    * @return If solenoid is disabled due to short.
  150.    * @see #clearAllPCMStickyFaults()
  151.    */
  152.   public boolean isFwdSolenoidBlackListed() {
  153.     int blackList = getPCMSolenoidBlackList();
  154.     return (blackList & m_forwardMask) != 0;
  155.   }
  156.  
  157.   /**
  158.    * Check if the reverse solenoid is blacklisted. If a solenoid is shorted, it is added to the
  159.    * blacklist and disabled until power cycle, or until faults are cleared.
  160.    *
  161.    * @return If solenoid is disabled due to short.
  162.    * @see #clearAllPCMStickyFaults()
  163.    */
  164.   public boolean isRevSolenoidBlackListed() {
  165.     int blackList = getPCMSolenoidBlackList();
  166.     return (blackList & m_reverseMask) != 0;
  167.   }
  168.  
  169.   @Override
  170.   public void initSendable(SendableBuilder builder) {
  171.     builder.setSmartDashboardType("Double Solenoid");
  172.     builder.setSafeState(() -> set(Value.kOff));
  173.     builder.addStringProperty("Value", () -> get().name().substring(1), (value) -> {
  174.       if ("Forward".equals(value)) {
  175.         set(Value.kForward);
  176.       } else if ("Reverse".equals(value)) {
  177.         set(Value.kReverse);
  178.       } else {
  179.         set(Value.kOff);
  180.       }
  181.     });
  182.   }
  183. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement