TEST(RelaySimTests, TestRelayInitialization) { const int INDEX_TO_TEST = 3; int callbackParam = 0; int callbackId = HALSIM_RegisterRelayInitializedForwardCallback( INDEX_TO_TEST, &TestRelayInitializationCallback, &callbackParam, false); ASSERT_TRUE(0 != callbackId); int32_t status; HAL_PortHandle portHandle; HAL_DigitalHandle pdpHandle; // Use out of range index status = 0; portHandle = 8000; gTestRelayCallbackName = "Unset"; pdpHandle = HAL_InitializeRelayPort(portHandle, true, &status); EXPECT_EQ(HAL_kInvalidHandle, pdpHandle); EXPECT_EQ(PARAMETER_OUT_OF_RANGE, status); EXPECT_STREQ("Unset", gTestRelayCallbackName.c_str()); // Successful setup status = 0; portHandle = HAL_GetPort(INDEX_TO_TEST); gTestRelayCallbackName = "Unset"; pdpHandle = HAL_InitializeRelayPort(portHandle, true, &status); EXPECT_TRUE(HAL_kInvalidHandle != pdpHandle); EXPECT_EQ(0, status); EXPECT_STREQ("InitializedForward", gTestRelayCallbackName.c_str()); // Double initialize... should fail status = 0; portHandle = HAL_GetPort(INDEX_TO_TEST); gTestRelayCallbackName = "Unset"; pdpHandle = HAL_InitializeRelayPort(portHandle, true, &status); EXPECT_EQ(HAL_kInvalidHandle, pdpHandle); EXPECT_EQ(RESOURCE_IS_ALLOCATED, status); EXPECT_STREQ("Unset", gTestRelayCallbackName.c_str()); // Reset, should allow you to re-register hal::HandleBase::ResetGlobalHandles(); HALSIM_ResetRelayData(INDEX_TO_TEST); callbackId = HALSIM_RegisterRelayInitializedForwardCallback( INDEX_TO_TEST, &TestRelayInitializationCallback, &callbackParam, false); status = 0; portHandle = HAL_GetPort(INDEX_TO_TEST); gTestRelayCallbackName = "Unset"; pdpHandle = HAL_InitializeRelayPort(portHandle, true, &status); EXPECT_TRUE(HAL_kInvalidHandle != pdpHandle); EXPECT_EQ(0, status); EXPECT_STREQ("InitializedForward", gTestRelayCallbackName.c_str()); }
/** * Relay constructor given a channel. * * This code initializes the relay and reserves all resources that need to be * locked. Initially the relay is set to both lines at 0v. * * @param channel The channel number (0-3). * @param direction The direction that the Relay object will control. */ Relay::Relay(uint32_t channel, Relay::Direction direction) : m_channel(channel), m_direction(direction) { std::stringstream buf; if (!SensorBase::CheckRelayChannel(m_channel)) { buf << "Relay Channel " << m_channel; wpi_setWPIErrorWithContext(ChannelIndexOutOfRange, buf.str()); return; } HAL_PortHandle portHandle = HAL_GetPort(channel); if (m_direction == kBothDirections || m_direction == kForwardOnly) { int32_t status = 0; m_forwardHandle = HAL_InitializeRelayPort(portHandle, true, &status); if (status != 0) { wpi_setErrorWithContextRange(status, 0, HAL_GetNumRelayChannels(), channel, HAL_GetErrorMessage(status)); m_forwardHandle = HAL_kInvalidHandle; m_reverseHandle = HAL_kInvalidHandle; return; } HAL_Report(HALUsageReporting::kResourceType_Relay, m_channel); } if (m_direction == kBothDirections || m_direction == kReverseOnly) { int32_t status = 0; m_reverseHandle = HAL_InitializeRelayPort(portHandle, false, &status); if (status != 0) { wpi_setErrorWithContextRange(status, 0, HAL_GetNumRelayChannels(), channel, HAL_GetErrorMessage(status)); m_forwardHandle = HAL_kInvalidHandle; m_reverseHandle = HAL_kInvalidHandle; return; } HAL_Report(HALUsageReporting::kResourceType_Relay, m_channel + 128); } int32_t status = 0; if (m_forwardHandle != HAL_kInvalidHandle) { HAL_SetRelay(m_forwardHandle, false, &status); if (status != 0) { wpi_setErrorWithContext(status, HAL_GetErrorMessage(status)); m_forwardHandle = HAL_kInvalidHandle; m_reverseHandle = HAL_kInvalidHandle; return; } } if (m_reverseHandle != HAL_kInvalidHandle) { HAL_SetRelay(m_reverseHandle, false, &status); if (status != 0) { wpi_setErrorWithContext(status, HAL_GetErrorMessage(status)); m_forwardHandle = HAL_kInvalidHandle; m_reverseHandle = HAL_kInvalidHandle; return; } } m_safetyHelper = std::make_unique<MotorSafetyHelper>(this); m_safetyHelper->SetSafetyEnabled(false); LiveWindow::GetInstance()->AddActuator("Relay", 1, m_channel, this); }