Philipp Schrader | 790cb54 | 2023-07-05 21:06:52 -0700 | [diff] [blame] | 1 | #include "y2019/joystick_angle.h" |
| 2 | |
Tyler Chatow | c8012ca | 2019-02-18 22:33:01 -0800 | [diff] [blame] | 3 | #include <cmath> |
| 4 | |
| 5 | #include "frc971/zeroing/wrap.h" |
Tyler Chatow | d28951f | 2019-02-16 20:12:28 -0800 | [diff] [blame] | 6 | |
Stephan Pleines | f63bde8 | 2024-01-13 15:59:33 -0800 | [diff] [blame] | 7 | namespace y2019::input::joysticks { |
Tyler Chatow | d28951f | 2019-02-16 20:12:28 -0800 | [diff] [blame] | 8 | |
Tyler Chatow | c8012ca | 2019-02-18 22:33:01 -0800 | [diff] [blame] | 9 | using ::frc971::zeroing::Wrap; |
| 10 | |
| 11 | bool AngleCloseTo(double angle, double near, double range) { |
| 12 | double wrapped_angle = Wrap(near, angle, 2 * M_PI); |
| 13 | |
| 14 | return ::std::abs(wrapped_angle - near) < range; |
| 15 | } |
| 16 | |
Tyler Chatow | d28951f | 2019-02-16 20:12:28 -0800 | [diff] [blame] | 17 | JoystickAngle GetJoystickPosition(const JoystickAxis &x_axis, |
| 18 | const JoystickAxis &y_axis, |
| 19 | const Data &data) { |
| 20 | return GetJoystickPosition(data.GetAxis(x_axis), data.GetAxis(y_axis)); |
| 21 | } |
| 22 | |
| 23 | JoystickAngle GetJoystickPosition(float x_axis, float y_axis) { |
Tyler Chatow | c8012ca | 2019-02-18 22:33:01 -0800 | [diff] [blame] | 24 | const float magnitude = hypot(x_axis, y_axis); |
| 25 | |
| 26 | if (magnitude < 0.5) { |
| 27 | return JoystickAngle::kDefault; |
Tyler Chatow | d28951f | 2019-02-16 20:12:28 -0800 | [diff] [blame] | 28 | } |
Tyler Chatow | c8012ca | 2019-02-18 22:33:01 -0800 | [diff] [blame] | 29 | |
| 30 | double angle = atan2(y_axis, x_axis); |
| 31 | |
| 32 | if (AngleCloseTo(angle, M_PI / 3, M_PI / 6)) { |
| 33 | return JoystickAngle::kUpperRight; |
| 34 | } else if (AngleCloseTo(angle, 2 * M_PI / 3, M_PI / 6)) { |
| 35 | return JoystickAngle::kUpperLeft; |
| 36 | } else if (AngleCloseTo(angle, M_PI, M_PI / 6)) { |
| 37 | return JoystickAngle::kMiddleLeft; |
| 38 | } else if (AngleCloseTo(angle, 0, M_PI / 6)) { |
| 39 | return JoystickAngle::kMiddleRight; |
| 40 | } else if (AngleCloseTo(angle, -M_PI / 3, M_PI / 6)) { |
| 41 | return JoystickAngle::kLowerRight; |
| 42 | } else if (AngleCloseTo(angle, -2 * M_PI / 3, M_PI / 6)) { |
| 43 | return JoystickAngle::kLowerLeft; |
| 44 | } |
| 45 | |
Tyler Chatow | d28951f | 2019-02-16 20:12:28 -0800 | [diff] [blame] | 46 | return JoystickAngle::kDefault; |
| 47 | } |
Stephan Pleines | f63bde8 | 2024-01-13 15:59:33 -0800 | [diff] [blame] | 48 | } // namespace y2019::input::joysticks |