2021-06-14 20:08:11 -07:00
|
|
|
// 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.
|
|
|
|
|
|
2023-08-28 15:13:34 -07:00
|
|
|
#include <gtest/gtest.h>
|
2021-06-14 20:08:11 -07:00
|
|
|
#include <hal/DIO.h>
|
|
|
|
|
#include <wpi/SmallVector.h>
|
|
|
|
|
|
|
|
|
|
#include "CrossConnects.h"
|
|
|
|
|
#include "LifetimeWrappers.h"
|
|
|
|
|
|
|
|
|
|
using namespace hlt;
|
|
|
|
|
|
|
|
|
|
class DIOTest : public ::testing::TestWithParam<std::pair<int, int>> {};
|
|
|
|
|
|
2021-09-17 22:51:51 -07:00
|
|
|
TEST_P(DIOTest, DIOCross) {
|
2021-06-14 20:08:11 -07:00
|
|
|
auto param = GetParam();
|
|
|
|
|
int32_t status = 0;
|
|
|
|
|
DIOHandle first{param.first, false, &status};
|
|
|
|
|
ASSERT_EQ(0, status);
|
|
|
|
|
DIOHandle second{param.second, true, &status};
|
|
|
|
|
ASSERT_EQ(0, status);
|
|
|
|
|
|
|
|
|
|
HAL_SetDIO(first, false, &status);
|
|
|
|
|
ASSERT_EQ(0, status);
|
|
|
|
|
usleep(1000);
|
|
|
|
|
ASSERT_FALSE(HAL_GetDIO(first, &status));
|
|
|
|
|
ASSERT_EQ(0, status);
|
|
|
|
|
ASSERT_FALSE(HAL_GetDIO(second, &status));
|
|
|
|
|
ASSERT_EQ(0, status);
|
|
|
|
|
|
|
|
|
|
HAL_SetDIO(first, true, &status);
|
|
|
|
|
ASSERT_EQ(0, status);
|
|
|
|
|
usleep(1000);
|
|
|
|
|
ASSERT_TRUE(HAL_GetDIO(second, &status));
|
|
|
|
|
ASSERT_EQ(0, status);
|
|
|
|
|
|
|
|
|
|
HAL_SetDIODirection(first, true, &status);
|
|
|
|
|
ASSERT_EQ(0, status);
|
|
|
|
|
HAL_SetDIODirection(second, false, &status);
|
|
|
|
|
ASSERT_EQ(0, status);
|
|
|
|
|
|
|
|
|
|
HAL_SetDIO(second, false, &status);
|
|
|
|
|
ASSERT_EQ(0, status);
|
|
|
|
|
usleep(1000);
|
|
|
|
|
ASSERT_FALSE(HAL_GetDIO(first, &status));
|
|
|
|
|
ASSERT_EQ(0, status);
|
|
|
|
|
|
|
|
|
|
HAL_SetDIO(second, true, &status);
|
|
|
|
|
ASSERT_EQ(0, status);
|
|
|
|
|
usleep(1000);
|
|
|
|
|
ASSERT_TRUE(HAL_GetDIO(first, &status));
|
|
|
|
|
ASSERT_EQ(0, status);
|
|
|
|
|
}
|
|
|
|
|
|
2021-09-17 22:51:51 -07:00
|
|
|
TEST(DIOTest, AllocateAll) {
|
2021-06-14 20:08:11 -07:00
|
|
|
wpi::SmallVector<DIOHandle, 32> dioHandles;
|
|
|
|
|
for (int i = 0; i < HAL_GetNumDigitalChannels(); i++) {
|
|
|
|
|
int32_t status = 0;
|
|
|
|
|
dioHandles.emplace_back(i, true, &status);
|
|
|
|
|
ASSERT_EQ(status, 0);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2021-09-17 22:51:51 -07:00
|
|
|
TEST(DIOTest, MultipleAllocateFails) {
|
2021-06-14 20:08:11 -07:00
|
|
|
int32_t status = 0;
|
|
|
|
|
DIOHandle handle(0, true, &status);
|
|
|
|
|
ASSERT_NE(handle, HAL_kInvalidHandle);
|
|
|
|
|
ASSERT_EQ(status, 0);
|
|
|
|
|
|
|
|
|
|
DIOHandle handle2(0, true, &status);
|
|
|
|
|
ASSERT_EQ(handle2, HAL_kInvalidHandle);
|
|
|
|
|
ASSERT_LAST_ERROR_STATUS(status, RESOURCE_IS_ALLOCATED);
|
|
|
|
|
}
|
|
|
|
|
|
2021-09-17 22:51:51 -07:00
|
|
|
TEST(DIOTest, OverAllocateFails) {
|
2021-06-14 20:08:11 -07:00
|
|
|
int32_t status = 0;
|
|
|
|
|
DIOHandle handle(HAL_GetNumDigitalChannels(), true, &status);
|
|
|
|
|
ASSERT_EQ(handle, HAL_kInvalidHandle);
|
|
|
|
|
ASSERT_LAST_ERROR_STATUS(status, RESOURCE_OUT_OF_RANGE);
|
|
|
|
|
}
|
|
|
|
|
|
2021-09-17 22:51:51 -07:00
|
|
|
TEST(DIOTest, UnderAllocateFails) {
|
2021-06-14 20:08:11 -07:00
|
|
|
int32_t status = 0;
|
|
|
|
|
DIOHandle handle(-1, true, &status);
|
|
|
|
|
ASSERT_EQ(handle, HAL_kInvalidHandle);
|
|
|
|
|
ASSERT_LAST_ERROR_STATUS(status, RESOURCE_OUT_OF_RANGE);
|
|
|
|
|
}
|
|
|
|
|
|
2021-09-17 22:51:51 -07:00
|
|
|
TEST(DIOTest, CrossAllocationFails) {
|
2021-06-14 20:08:11 -07:00
|
|
|
int32_t status = 0;
|
|
|
|
|
PWMHandle pwmHandle(10, &status);
|
|
|
|
|
ASSERT_NE(pwmHandle, HAL_kInvalidHandle);
|
|
|
|
|
ASSERT_EQ(status, 0);
|
|
|
|
|
DIOHandle handle(10, true, &status);
|
|
|
|
|
ASSERT_EQ(handle, HAL_kInvalidHandle);
|
|
|
|
|
ASSERT_LAST_ERROR_STATUS(status, RESOURCE_IS_ALLOCATED);
|
|
|
|
|
}
|
|
|
|
|
|
2021-09-21 06:12:50 -07:00
|
|
|
INSTANTIATE_TEST_SUITE_P(DIOCrossConnectsTests, DIOTest,
|
2021-06-14 20:08:11 -07:00
|
|
|
::testing::ValuesIn(DIOCrossConnects));
|