Switches Solenoids to Handles (#126)

This commit is contained in:
Thad House
2016-07-02 09:24:54 -07:00
committed by Peter Johnson
parent 62c217cd01
commit 8c4ad62422
15 changed files with 257 additions and 255 deletions

View File

@@ -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;
}
/**