mirror of
https://github.com/wpilibsuite/allwpilib
synced 2026-06-21 01:01:43 +00:00
Switches relays to handles (#119)
This commit is contained in:
committed by
Peter Johnson
parent
e8e052712e
commit
9b2af0d090
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user