001 /*----------------------------------------------------------------------------*/ 002 /* Copyright (c) FIRST 2008-2012. All Rights Reserved. */ 003 /* Open Source Software - may be modified and shared by FRC teams. The code */ 004 /* must be accompanied by the FIRST BSD license file in the root directory of */ 005 /* the project. */ 006 /*----------------------------------------------------------------------------*/ 007 008 package edu.wpi.first.wpilibj; 009 010 import edu.wpi.first.wpilibj.fpga.tSolenoid; 011 import edu.wpi.first.wpilibj.parsing.IDeviceController; 012 013 /** 014 * SolenoidBase class is the common base class for the Solenoid and 015 * DoubleSolenoid classes. 016 */ 017 public abstract class SolenoidBase extends SensorBase implements IDeviceController { 018 019 protected int m_moduleNumber; ///< The number of the solenoid module being used. 020 protected static Resource m_allocated = new Resource(tSolenoid.kDO7_0_NumElements * kSolenoidChannels); 021 022 private static tSolenoid m_fpgaSolenoidModule; ///< FPGA Solenoid Module object. 023 private static int m_refCount; ///< Reference count for the chip object. 024 025 /** 026 * Constructor. 027 * 028 * @param moduleNumber The number of the solenoid module to use. 029 */ 030 public SolenoidBase(final int moduleNumber) { 031 m_moduleNumber = moduleNumber; 032 checkSolenoidModule(m_moduleNumber); 033 034 m_refCount++; 035 if (m_refCount == 1) { 036 m_fpgaSolenoidModule = new tSolenoid(); 037 } 038 } 039 040 /** 041 * Destructor. 042 */ 043 public synchronized void free() { 044 if (m_refCount == 1) { 045 m_fpgaSolenoidModule.Release(); 046 m_fpgaSolenoidModule = null; 047 } 048 m_refCount--; 049 } 050 051 /** 052 * Set the value of a solenoid. 053 * 054 * @param value The value you want to set on the module. 055 * @param mask The channels you want to be affected. 056 */ 057 protected synchronized void set(int value, int mask) { 058 byte currentValue = (byte)tSolenoid.readDO7_0(m_moduleNumber - 1); 059 // Zero out the values to change 060 currentValue = (byte)(currentValue & ~mask); 061 currentValue = (byte)(currentValue | (value & mask)); 062 tSolenoid.writeDO7_0(m_moduleNumber - 1, currentValue); 063 } 064 065 /** 066 * Read all 8 solenoids from the module used by this solenoid as a single byte 067 * 068 * @return The current value of all 8 solenoids on this module. 069 */ 070 public byte getAll() { 071 return (byte)tSolenoid.readDO7_0(m_moduleNumber - 1); 072 } 073 074 /** 075 * Read all 8 solenoids in the default solenoid module as a single byte 076 * 077 * @return The current value of all 8 solenoids on the default module. 078 */ 079 public static byte getAllFromDefaultModule() { 080 return getAllFromModule(getDefaultSolenoidModule()); 081 } 082 083 /** 084 * Read all 8 solenoids in the specified solenoid module as a single byte 085 * 086 * @return The current value of all 8 solenoids on the specified module. 087 */ 088 public static byte getAllFromModule(int moduleNumber) { 089 checkSolenoidModule(moduleNumber); 090 return (byte)tSolenoid.readDO7_0(moduleNumber - 1); 091 } 092 }