Switches relays to handles (#119)

This commit is contained in:
Thad House
2016-06-29 18:58:14 -07:00
committed by Peter Johnson
parent e8e052712e
commit 9b2af0d090
10 changed files with 275 additions and 235 deletions

View File

@@ -30,29 +30,32 @@ static std::unique_ptr<Resource> relayChannels;
Relay::Relay(uint32_t channel, Relay::Direction direction)
: m_channel(channel), m_direction(direction) {
std::stringstream buf;
Resource::CreateResourceObject(relayChannels,
dio_kNumSystems * kRelayChannels * 2);
if (!SensorBase::CheckRelayChannel(m_channel)) {
buf << "Relay Channel " << m_channel;
wpi_setWPIErrorWithContext(ChannelIndexOutOfRange, buf.str());
return;
}
HalPortHandle portHandle = getPort(channel);
if (m_direction == kBothDirections || m_direction == kForwardOnly) {
buf << "Forward Relay " << m_channel;
if (relayChannels->Allocate(m_channel * 2, buf.str()) ==
std::numeric_limits<uint32_t>::max()) {
CloneError(*relayChannels);
int32_t status = 0;
m_forwardHandle = initializeRelayPort(portHandle, true, &status);
if (status != 0) {
wpi_setErrorWithContext(status, getHALErrorMessage(status));
m_forwardHandle = HAL_INVALID_HANDLE;
m_reverseHandle = HAL_INVALID_HANDLE;
return;
}
HALReport(HALUsageReporting::kResourceType_Relay, m_channel);
}
if (m_direction == kBothDirections || m_direction == kReverseOnly) {
buf << "Reverse Relay " << m_channel;
if (relayChannels->Allocate(m_channel * 2 + 1, buf.str()) ==
std::numeric_limits<uint32_t>::max()) {
CloneError(*relayChannels);
int32_t status = 0;
m_reverseHandle = initializeRelayPort(portHandle, false, &status);
if (status != 0) {
wpi_setErrorWithContext(status, getHALErrorMessage(status));
m_forwardHandle = HAL_INVALID_HANDLE;
m_reverseHandle = HAL_INVALID_HANDLE;
return;
}
@@ -60,9 +63,24 @@ Relay::Relay(uint32_t channel, Relay::Direction direction)
}
int32_t status = 0;
setRelayForward(m_relay_ports[m_channel], false, &status);
setRelayReverse(m_relay_ports[m_channel], false, &status);
wpi_setErrorWithContext(status, getHALErrorMessage(status));
if (m_forwardHandle != HAL_INVALID_HANDLE) {
setRelay(m_forwardHandle, false, &status);
if (status != 0) {
wpi_setErrorWithContext(status, getHALErrorMessage(status));
m_forwardHandle = HAL_INVALID_HANDLE;
m_reverseHandle = HAL_INVALID_HANDLE;
return;
}
}
if (m_reverseHandle != HAL_INVALID_HANDLE) {
setRelay(m_reverseHandle, false, &status);
if (status != 0) {
wpi_setErrorWithContext(status, getHALErrorMessage(status));
m_forwardHandle = HAL_INVALID_HANDLE;
m_reverseHandle = HAL_INVALID_HANDLE;
return;
}
}
m_safetyHelper = std::make_unique<MotorSafetyHelper>(this);
m_safetyHelper->SetSafetyEnabled(false);
@@ -77,16 +95,12 @@ Relay::Relay(uint32_t channel, Relay::Direction direction)
*/
Relay::~Relay() {
int32_t status = 0;
setRelayForward(m_relay_ports[m_channel], false, &status);
setRelayReverse(m_relay_ports[m_channel], false, &status);
wpi_setErrorWithContext(status, getHALErrorMessage(status));
setRelay(m_forwardHandle, false, &status);
setRelay(m_reverseHandle, false, &status);
// ignore errors, as we want to make sure a free happens.
if (m_forwardHandle != HAL_INVALID_HANDLE) freeRelayPort(m_forwardHandle);
if (m_reverseHandle != HAL_INVALID_HANDLE) freeRelayPort(m_reverseHandle);
if (m_direction == kBothDirections || m_direction == kForwardOnly) {
relayChannels->Free(m_channel * 2);
}
if (m_direction == kBothDirections || m_direction == kReverseOnly) {
relayChannels->Free(m_channel * 2 + 1);
}
if (m_table != nullptr) m_table->RemoveTableListener(this);
}
@@ -113,18 +127,18 @@ void Relay::Set(Relay::Value value) {
switch (value) {
case kOff:
if (m_direction == kBothDirections || m_direction == kForwardOnly) {
setRelayForward(m_relay_ports[m_channel], false, &status);
setRelay(m_forwardHandle, false, &status);
}
if (m_direction == kBothDirections || m_direction == kReverseOnly) {
setRelayReverse(m_relay_ports[m_channel], false, &status);
setRelay(m_reverseHandle, false, &status);
}
break;
case kOn:
if (m_direction == kBothDirections || m_direction == kForwardOnly) {
setRelayForward(m_relay_ports[m_channel], true, &status);
setRelay(m_forwardHandle, true, &status);
}
if (m_direction == kBothDirections || m_direction == kReverseOnly) {
setRelayReverse(m_relay_ports[m_channel], true, &status);
setRelay(m_reverseHandle, true, &status);
}
break;
case kForward:
@@ -133,10 +147,10 @@ void Relay::Set(Relay::Value value) {
break;
}
if (m_direction == kBothDirections || m_direction == kForwardOnly) {
setRelayForward(m_relay_ports[m_channel], true, &status);
setRelay(m_forwardHandle, true, &status);
}
if (m_direction == kBothDirections) {
setRelayReverse(m_relay_ports[m_channel], false, &status);
setRelay(m_reverseHandle, false, &status);
}
break;
case kReverse:
@@ -145,10 +159,10 @@ void Relay::Set(Relay::Value value) {
break;
}
if (m_direction == kBothDirections) {
setRelayForward(m_relay_ports[m_channel], false, &status);
setRelay(m_forwardHandle, false, &status);
}
if (m_direction == kBothDirections || m_direction == kReverseOnly) {
setRelayReverse(m_relay_ports[m_channel], true, &status);
setRelay(m_reverseHandle, true, &status);
}
break;
}
@@ -169,8 +183,8 @@ void Relay::Set(Relay::Value value) {
Relay::Value Relay::Get() const {
int32_t status;
if (getRelayForward(m_relay_ports[m_channel], &status)) {
if (getRelayReverse(m_relay_ports[m_channel], &status)) {
if (getRelay(m_forwardHandle, &status)) {
if (getRelay(m_reverseHandle, &status)) {
return kOn;
} else {
if (m_direction == kForwardOnly) {
@@ -180,7 +194,7 @@ Relay::Value Relay::Get() const {
}
}
} else {
if (getRelayReverse(m_relay_ports[m_channel], &status)) {
if (getRelay(m_reverseHandle, &status)) {
if (m_direction == kReverseOnly) {
return kOn;
} else {