diff --git a/wpilibc/src/main/native/cpp/Joystick.cpp b/wpilibc/src/main/native/cpp/Joystick.cpp index 0eff22612f..0b5d870e61 100644 --- a/wpilibc/src/main/native/cpp/Joystick.cpp +++ b/wpilibc/src/main/native/cpp/Joystick.cpp @@ -8,6 +8,8 @@ #include #include +#include +#include #include "frc/event/BooleanEvent.h" @@ -124,5 +126,11 @@ double Joystick::GetDirectionRadians() const { } double Joystick::GetDirectionDegrees() const { + WPI_IGNORE_DEPRECATED return (180 / std::numbers::pi) * GetDirectionRadians(); } + +units::radian_t Joystick::GetDirection() const { + return units::math::atan2(units::dimensionless::scalar_t{GetX()}, + units::dimensionless::scalar_t{-GetY()}); +} diff --git a/wpilibc/src/main/native/include/frc/Joystick.h b/wpilibc/src/main/native/include/frc/Joystick.h index fc0df3551e..90f52ac996 100644 --- a/wpilibc/src/main/native/include/frc/Joystick.h +++ b/wpilibc/src/main/native/include/frc/Joystick.h @@ -6,6 +6,9 @@ #include +#include +#include + #include "frc/GenericHID.h" namespace frc { @@ -226,7 +229,9 @@ class Joystick : public GenericHID { * in radians. * * @return The direction of the vector in radians + * @deprecated Use GetDirection() instead. */ + WPI_DEPRECATED("Use GetDirection() instead.") double GetDirectionRadians() const; /** @@ -234,9 +239,18 @@ class Joystick : public GenericHID { * in degrees. * * @return The direction of the vector in degrees + * @deprecated Use GetDirection() instead. */ + WPI_DEPRECATED("Use GetDirection() instead.") double GetDirectionDegrees() const; + /** + * Get the direction of the vector formed by the joystick and its origin. + * + * @return The direction of the vector. + */ + units::radian_t GetDirection() const; + private: enum Axis { kX, kY, kZ, kTwist, kThrottle, kNumAxes }; enum Button { kTrigger = 1, kTop = 2 }; diff --git a/wpilibc/src/test/native/cpp/JoystickTest.cpp b/wpilibc/src/test/native/cpp/JoystickTest.cpp index 7423019618..144e73edc8 100644 --- a/wpilibc/src/test/native/cpp/JoystickTest.cpp +++ b/wpilibc/src/test/native/cpp/JoystickTest.cpp @@ -23,3 +23,46 @@ AXIS_TEST(Joystick, Twist) BUTTON_TEST(Joystick, Trigger) BUTTON_TEST(Joystick, Top) + +TEST(JoystickTest, GetMagnitude) { + Joystick joy{1}; + sim::JoystickSim joysim{1}; + + joysim.SetX(0.5); + joysim.SetY(0); + joysim.NotifyNewData(); + ASSERT_NEAR(0.5, joy.GetMagnitude(), 0.001); + + joysim.SetX(0); + joysim.SetY(-.5); + joysim.NotifyNewData(); + ASSERT_NEAR(0.5, joy.GetMagnitude(), 0.001); + + joysim.SetX(0.5); + joysim.SetY(-0.5); + joysim.NotifyNewData(); + ASSERT_NEAR(0.70710678118, joy.GetMagnitude(), 0.001); +} + +TEST(JoystickTest, GetDirection) { + Joystick joy{1}; + sim::JoystickSim joysim{1}; + + joysim.SetX(0.5); + joysim.SetY(0); + joysim.NotifyNewData(); + ASSERT_NEAR(units::radian_t{90_deg}.value(), joy.GetDirection().value(), + 0.001); + + joysim.SetX(0); + joysim.SetY(-.5); + joysim.NotifyNewData(); + ASSERT_NEAR(units::radian_t{0_deg}.value(), joy.GetDirection().value(), + 0.001); + + joysim.SetX(0.5); + joysim.SetY(-0.5); + joysim.NotifyNewData(); + ASSERT_NEAR(units::radian_t{45_deg}.value(), joy.GetDirection().value(), + 0.001); +}