/*----------------------------------------------------------------------------*/ | |
/* Copyright (c) FIRST 2008. All Rights Reserved. */ | |
/* Open Source Software - may be modified and shared by FRC teams. The code */ | |
/* must be accompanied by the FIRST BSD license file in $(WIND_BASE)/WPILib. */ | |
/*----------------------------------------------------------------------------*/ | |
#include "SolenoidBase.h" | |
// Needs to be global since the protected resource spans all Solenoid objects. | |
ReentrantSemaphore SolenoidBase::m_semaphore; | |
Resource *SolenoidBase::m_allocated = NULL; | |
tSolenoid *SolenoidBase::m_fpgaSolenoidModule = NULL; | |
UINT32 SolenoidBase::m_refCount = 0; | |
/** | |
* Constructor | |
* | |
* @param moduleNumber The solenoid module (1 or 2). | |
*/ | |
SolenoidBase::SolenoidBase(UINT8 moduleNumber) | |
: m_moduleNumber (moduleNumber) | |
{ | |
Synchronized sync(m_semaphore); | |
m_refCount++; | |
if (m_refCount == 1) | |
{ | |
tRioStatusCode localStatus = NiFpga_Status_Success; | |
m_fpgaSolenoidModule = tSolenoid::create(&localStatus); | |
wpi_setError(localStatus); | |
} | |
} | |
/** | |
* Destructor. | |
*/ | |
SolenoidBase::~SolenoidBase() | |
{ | |
Synchronized sync(m_semaphore); | |
if (CheckSolenoidModule(m_moduleNumber)) | |
{ | |
if (m_refCount == 1) | |
{ | |
delete m_fpgaSolenoidModule; | |
m_fpgaSolenoidModule = NULL; | |
} | |
m_refCount--; | |
} | |
} | |
/** | |
* Set the value of a solenoid. | |
* | |
* @param value The value you want to set on the module. | |
* @param mask The channels you want to be affected. | |
*/ | |
void SolenoidBase::Set(UINT8 value, UINT8 mask) | |
{ | |
tRioStatusCode localStatus = NiFpga_Status_Success; | |
if (CheckSolenoidModule(m_moduleNumber)) | |
{ | |
Synchronized sync(m_semaphore); | |
UINT8 currentValue = m_fpgaSolenoidModule->readDO7_0(m_moduleNumber - 1, &localStatus); | |
// Zero out the values to change | |
currentValue = currentValue & ~mask; | |
currentValue = currentValue | (value & mask); | |
m_fpgaSolenoidModule->writeDO7_0(m_moduleNumber - 1, currentValue, &localStatus); | |
} | |
wpi_setError(localStatus); | |
} | |
/** | |
* Read all 8 solenoids as a single byte | |
* | |
* @return The current value of all 8 solenoids on the module. | |
*/ | |
UINT8 SolenoidBase::GetAll() | |
{ | |
if (CheckSolenoidModule(m_moduleNumber)) | |
{ | |
tRioStatusCode localStatus = NiFpga_Status_Success; | |
UINT8 solenoids = m_fpgaSolenoidModule->readDO7_0(m_moduleNumber - 1, &localStatus); | |
wpi_setError(localStatus); | |
return solenoids; | |
} | |
return 0; | |
} |