mirror of
https://github.com/wpilibsuite/allwpilib
synced 2026-07-04 03:11:43 +00:00
Switches Solenoids to Handles (#126)
This commit is contained in:
committed by
Peter Johnson
parent
62c217cd01
commit
8c4ad62422
@@ -52,28 +52,30 @@ DoubleSolenoid::DoubleSolenoid(uint8_t moduleNumber, uint32_t forwardChannel,
|
||||
wpi_setWPIErrorWithContext(ChannelIndexOutOfRange, buf.str());
|
||||
return;
|
||||
}
|
||||
Resource::CreateResourceObject(m_allocated, m_maxModules * m_maxPorts);
|
||||
|
||||
buf << "Solenoid " << m_forwardChannel << " (Module: " << m_moduleNumber
|
||||
<< ")";
|
||||
if (m_allocated->Allocate(
|
||||
m_moduleNumber * kSolenoidChannels + m_forwardChannel, buf.str()) ==
|
||||
std::numeric_limits<uint32_t>::max()) {
|
||||
CloneError(*m_allocated);
|
||||
int32_t status = 0;
|
||||
m_forwardHandle = initializeSolenoidPort(
|
||||
getPortWithModule(moduleNumber, m_forwardChannel), &status);
|
||||
if (status != 0) {
|
||||
wpi_setErrorWithContext(status, getHALErrorMessage(status));
|
||||
m_forwardHandle = HAL_INVALID_HANDLE;
|
||||
m_reverseHandle = HAL_INVALID_HANDLE;
|
||||
return;
|
||||
}
|
||||
|
||||
buf << "Solenoid " << m_reverseChannel << " (Module: " << m_moduleNumber
|
||||
<< ")";
|
||||
if (m_allocated->Allocate(
|
||||
m_moduleNumber * kSolenoidChannels + m_reverseChannel, buf.str()) ==
|
||||
std::numeric_limits<uint32_t>::max()) {
|
||||
CloneError(*m_allocated);
|
||||
m_reverseHandle = initializeSolenoidPort(
|
||||
getPortWithModule(moduleNumber, m_reverseChannel), &status);
|
||||
if (status != 0) {
|
||||
wpi_setErrorWithContext(status, getHALErrorMessage(status));
|
||||
// free forward solenoid
|
||||
freeSolenoidPort(m_forwardHandle);
|
||||
m_forwardHandle = HAL_INVALID_HANDLE;
|
||||
m_reverseHandle = HAL_INVALID_HANDLE;
|
||||
return;
|
||||
}
|
||||
|
||||
m_forwardMask = 1 << m_forwardChannel;
|
||||
m_reverseMask = 1 << m_reverseChannel;
|
||||
|
||||
HALReport(HALUsageReporting::kResourceType_Solenoid, m_forwardChannel,
|
||||
m_moduleNumber);
|
||||
HALReport(HALUsageReporting::kResourceType_Solenoid, m_reverseChannel,
|
||||
@@ -86,10 +88,8 @@ DoubleSolenoid::DoubleSolenoid(uint8_t moduleNumber, uint32_t forwardChannel,
|
||||
* Destructor.
|
||||
*/
|
||||
DoubleSolenoid::~DoubleSolenoid() {
|
||||
if (CheckSolenoidModule(m_moduleNumber)) {
|
||||
m_allocated->Free(m_moduleNumber * kSolenoidChannels + m_forwardChannel);
|
||||
m_allocated->Free(m_moduleNumber * kSolenoidChannels + m_reverseChannel);
|
||||
}
|
||||
freeSolenoidPort(m_forwardHandle);
|
||||
freeSolenoidPort(m_reverseHandle);
|
||||
if (m_table != nullptr) m_table->RemoveTableListener(this);
|
||||
}
|
||||
|
||||
@@ -100,21 +100,30 @@ DoubleSolenoid::~DoubleSolenoid() {
|
||||
*/
|
||||
void DoubleSolenoid::Set(Value value) {
|
||||
if (StatusIsFatal()) return;
|
||||
uint8_t rawValue = 0x00;
|
||||
|
||||
bool forward = false;
|
||||
bool reverse = false;
|
||||
switch (value) {
|
||||
case kOff:
|
||||
rawValue = 0x00;
|
||||
forward = false;
|
||||
reverse = false;
|
||||
break;
|
||||
case kForward:
|
||||
rawValue = m_forwardMask;
|
||||
forward = true;
|
||||
reverse = false;
|
||||
break;
|
||||
case kReverse:
|
||||
rawValue = m_reverseMask;
|
||||
forward = false;
|
||||
reverse = true;
|
||||
break;
|
||||
}
|
||||
int32_t fstatus = 0;
|
||||
setSolenoid(m_forwardHandle, forward, &fstatus);
|
||||
int32_t rstatus = 0;
|
||||
setSolenoid(m_reverseHandle, reverse, &rstatus);
|
||||
|
||||
SolenoidBase::Set(rawValue, m_forwardMask | m_reverseMask, m_moduleNumber);
|
||||
wpi_setErrorWithContext(fstatus, getHALErrorMessage(fstatus));
|
||||
wpi_setErrorWithContext(rstatus, getHALErrorMessage(rstatus));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -124,10 +133,16 @@ void DoubleSolenoid::Set(Value value) {
|
||||
*/
|
||||
DoubleSolenoid::Value DoubleSolenoid::Get() const {
|
||||
if (StatusIsFatal()) return kOff;
|
||||
uint8_t value = GetAll(m_moduleNumber);
|
||||
int32_t fstatus = 0;
|
||||
int32_t rstatus = 0;
|
||||
bool valueForward = getSolenoid(m_forwardHandle, &fstatus);
|
||||
bool valueReverse = getSolenoid(m_reverseHandle, &rstatus);
|
||||
|
||||
if (value & m_forwardMask) return kForward;
|
||||
if (value & m_reverseMask) return kReverse;
|
||||
wpi_setErrorWithContext(fstatus, getHALErrorMessage(fstatus));
|
||||
wpi_setErrorWithContext(rstatus, getHALErrorMessage(rstatus));
|
||||
|
||||
if (valueForward) return kForward;
|
||||
if (valueReverse) return kReverse;
|
||||
return kOff;
|
||||
}
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user