diff --git a/crossConnIntegrationTests/src/main/native/cpp/RelayDigitalTests.cpp b/crossConnIntegrationTests/src/main/native/cpp/RelayDigitalTests.cpp new file mode 100644 index 0000000000..5586d24a23 --- /dev/null +++ b/crossConnIntegrationTests/src/main/native/cpp/RelayDigitalTests.cpp @@ -0,0 +1,104 @@ +// Copyright (c) FIRST and other WPILib contributors. +// Open Source Software; you can modify and/or share it under the terms of +// the WPILib BSD license file in the root directory of this project. + +#include +#include + +#include "CrossConnects.h" +#include "LifetimeWrappers.h" +#include "gtest/gtest.h" + +using namespace hlt; + +class RelayDigitalTest : public ::testing::TestWithParam {}; + +TEST_P(RelayDigitalTest, TestRelayCross) { + auto param = GetParam(); + int32_t status = 0; + RelayHandle fwd{param.Relay, true, &status}; + ASSERT_EQ(0, status); + RelayHandle rev{param.Relay, false, &status}; + ASSERT_EQ(0, status); + DIOHandle fwdInput{param.FwdDio, true, &status}; + ASSERT_EQ(0, status); + DIOHandle revInput{param.RevDio, true, &status}; + ASSERT_EQ(0, status); + + HAL_SetRelay(fwd, false, &status); + ASSERT_EQ(0, status); + HAL_SetRelay(rev, false, &status); + ASSERT_EQ(0, status); + usleep(1000); + ASSERT_FALSE(HAL_GetDIO(fwdInput, &status)); + ASSERT_EQ(0, status); + ASSERT_FALSE(HAL_GetDIO(revInput, &status)); + ASSERT_EQ(0, status); + + HAL_SetRelay(fwd, false, &status); + ASSERT_EQ(0, status); + HAL_SetRelay(rev, true, &status); + ASSERT_EQ(0, status); + usleep(1000); + ASSERT_FALSE(HAL_GetDIO(fwdInput, &status)); + ASSERT_EQ(0, status); + ASSERT_TRUE(HAL_GetDIO(revInput, &status)); + ASSERT_EQ(0, status); + + HAL_SetRelay(fwd, true, &status); + ASSERT_EQ(0, status); + HAL_SetRelay(rev, false, &status); + ASSERT_EQ(0, status); + usleep(1000); + ASSERT_TRUE(HAL_GetDIO(fwdInput, &status)); + ASSERT_EQ(0, status); + ASSERT_FALSE(HAL_GetDIO(revInput, &status)); + ASSERT_EQ(0, status); + + HAL_SetRelay(fwd, true, &status); + ASSERT_EQ(0, status); + HAL_SetRelay(rev, true, &status); + ASSERT_EQ(0, status); + usleep(1000); + ASSERT_TRUE(HAL_GetDIO(fwdInput, &status)); + ASSERT_EQ(0, status); + ASSERT_TRUE(HAL_GetDIO(revInput, &status)); + ASSERT_EQ(0, status); +} + +TEST(RelayDigitalTest, TestAllocateAll) { + wpi::SmallVector relayHandles; + for (int i = 0; i < HAL_GetNumRelayChannels(); i++) { + int32_t status = 0; + relayHandles.emplace_back(i / 2, i % 2, &status); + ASSERT_EQ(status, 0); + } +} + +TEST(RelayDigitalTest, TestMultipleAllocateFails) { + int32_t status = 0; + RelayHandle handle(0, true, &status); + ASSERT_NE(handle, HAL_kInvalidHandle); + ASSERT_EQ(status, 0); + + RelayHandle handle2(0, true, &status); + ASSERT_EQ(handle2, HAL_kInvalidHandle); + ASSERT_LAST_ERROR_STATUS(status, RESOURCE_IS_ALLOCATED); +} + +TEST(RelayDigitalTest, TestOverAllocateFails) { + int32_t status = 0; + RelayHandle handle(HAL_GetNumRelayChannels(), true, &status); + ASSERT_EQ(handle, HAL_kInvalidHandle); + ASSERT_LAST_ERROR_STATUS(status, RESOURCE_OUT_OF_RANGE); +} + +TEST(RelayDigitalTest, TestUnderAllocateFails) { + int32_t status = 0; + RelayHandle handle(-1, true, &status); + ASSERT_EQ(handle, HAL_kInvalidHandle); + ASSERT_LAST_ERROR_STATUS(status, RESOURCE_OUT_OF_RANGE); +} + +INSTANTIATE_TEST_SUITE_P(RelayDigitalCrossConnectsTest, RelayDigitalTest, + ::testing::ValuesIn(RelayCrossConnects)); diff --git a/crossConnIntegrationTests/src/main/native/include/CrossConnects.h b/crossConnIntegrationTests/src/main/native/include/CrossConnects.h index 3cb5f3a531..957b4b6ee5 100644 --- a/crossConnIntegrationTests/src/main/native/include/CrossConnects.h +++ b/crossConnIntegrationTests/src/main/native/include/CrossConnects.h @@ -42,4 +42,17 @@ constexpr static std::array, 2> PWMCrossConnects{ std::pair{16, 25}, }; +// FWD only, relay on left +constexpr static std::array, 2> RelayAnalogCrossConnects{ + std::pair{2, 0}, std::pair{3, 1}}; + +struct RelayCross { + int Relay; + int FwdDio; + int RevDio; +}; + +constexpr static std::array RelayCrossConnects{ + RelayCross{0, 23, 22}}; + } // namespace hlt diff --git a/crossConnIntegrationTests/src/main/native/include/LifetimeWrappers.h b/crossConnIntegrationTests/src/main/native/include/LifetimeWrappers.h index 22dc5bce07..5f0954d10a 100644 --- a/crossConnIntegrationTests/src/main/native/include/LifetimeWrappers.h +++ b/crossConnIntegrationTests/src/main/native/include/LifetimeWrappers.h @@ -90,6 +90,25 @@ struct PWMHandle { HAL_DigitalHandle handle = 0; }; +struct RelayHandle { + public: + RelayHandle(int32_t port, HAL_Bool fwd, int32_t* status) { + handle = HAL_InitializeRelayPort(HAL_GetPort(port), fwd, nullptr, status); + } + RelayHandle(const RelayHandle&) = delete; + RelayHandle operator=(const RelayHandle&) = delete; + + RelayHandle(RelayHandle&&) = default; + RelayHandle& operator=(RelayHandle&&) = default; + + ~RelayHandle() { HAL_FreeRelayPort(handle); } + + operator HAL_RelayHandle() const { return handle; } + + private: + HAL_RelayHandle handle = 0; +}; + #define ASSERT_LAST_ERROR_STATUS(status, x) \ do { \ ASSERT_EQ(status, HAL_USE_LAST_ERROR); \