diff --git a/crossConnIntegrationTests/src/main/native/cpp/DutyCycleTests.cpp b/crossConnIntegrationTests/src/main/native/cpp/DutyCycleTests.cpp new file mode 100644 index 0000000000..9b036c778f --- /dev/null +++ b/crossConnIntegrationTests/src/main/native/cpp/DutyCycleTests.cpp @@ -0,0 +1,51 @@ +// 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 "CrossConnects.h" +#include "LifetimeWrappers.h" +#include "gtest/gtest.h" + +using namespace hlt; + +class DutyCycleTest : public ::testing::TestWithParam> {}; + +TEST_P(DutyCycleTest, TestDutyCycle) { + auto param = GetParam(); + + int32_t status = 0; + PWMHandle pwmHandle(param.first, &status); + ASSERT_NE(pwmHandle, HAL_kInvalidHandle); + ASSERT_EQ(0, status); + + // Ensure our PWM is disabled, and set up properly + HAL_SetPWMRaw(pwmHandle, 0, &status); + ASSERT_EQ(0, status); + HAL_SetPWMConfig(pwmHandle, 2.0, 1.0, 1.0, 0, 0, &status); + HAL_SetPWMConfig(pwmHandle, 5.05, 2.525, 2.525, 2.525, 0, &status); + ASSERT_EQ(0, status); + HAL_SetPWMPeriodScale(pwmHandle, 0, &status); + ASSERT_EQ(0, status); + + DIOHandle dioHandle{param.second, true, &status}; + ASSERT_EQ(0, status); + + DutyCycleHandle dutyCycle{dioHandle, &status}; + ASSERT_EQ(0, status); + + HAL_SetPWMSpeed(pwmHandle, 0.5, &status); + ASSERT_EQ(0, status); + + // Sleep enough time for the frequency to converge + usleep(3500000); + + ASSERT_NEAR(1000 / 5.05, + (double)HAL_GetDutyCycleFrequency(dutyCycle, &status), 1); + + // TODO measure output +} + +INSTANTIATE_TEST_SUITE_P(DutyCycleCrossConnTest, DutyCycleTest, + ::testing::ValuesIn(PWMCrossConnects)); diff --git a/crossConnIntegrationTests/src/main/native/include/LifetimeWrappers.h b/crossConnIntegrationTests/src/main/native/include/LifetimeWrappers.h index 199d8614b0..9f0eb15967 100644 --- a/crossConnIntegrationTests/src/main/native/include/LifetimeWrappers.h +++ b/crossConnIntegrationTests/src/main/native/include/LifetimeWrappers.h @@ -5,6 +5,7 @@ #pragma once #include +#include #include namespace hlt { @@ -105,6 +106,26 @@ struct AnalogTriggerHandle { HAL_AnalogTriggerHandle handle = 0; }; +struct DutyCycleHandle { + public: + DutyCycleHandle(HAL_DigitalHandle port, int32_t* status) { + handle = HAL_InitializeDutyCycle( + port, HAL_AnalogTriggerType::HAL_Trigger_kInWindow, status); + } + DutyCycleHandle(const DutyCycleHandle&) = delete; + DutyCycleHandle operator=(const DutyCycleHandle&) = delete; + + DutyCycleHandle(DutyCycleHandle&&) = default; + DutyCycleHandle& operator=(DutyCycleHandle&&) = default; + + ~DutyCycleHandle() { HAL_FreeDutyCycle(handle); } + + operator HAL_DutyCycleHandle() const { return handle; } + + private: + HAL_DutyCycleHandle handle = 0; +}; + struct DIOHandle { public: DIOHandle() {}