Modify joystick angle mapper to actual angle

Change-Id: I1587ec41c72038eeab61589a4b1fa68a3286b823
diff --git a/y2019/BUILD b/y2019/BUILD
index 14d0d6f..a4f498b 100644
--- a/y2019/BUILD
+++ b/y2019/BUILD
@@ -86,6 +86,7 @@
     ],
     deps = [
         "//aos/input:drivetrain_input",
+        "//frc971/zeroing:wrap",
     ],
 )
 
diff --git a/y2019/joystick_angle.cc b/y2019/joystick_angle.cc
index 1923c53..90baf32 100644
--- a/y2019/joystick_angle.cc
+++ b/y2019/joystick_angle.cc
@@ -1,9 +1,20 @@
+#include <cmath>
+
+#include "frc971/zeroing/wrap.h"
 #include "y2019/joystick_angle.h"
 
 namespace y2019 {
 namespace input {
 namespace joysticks {
 
+using ::frc971::zeroing::Wrap;
+
+bool AngleCloseTo(double angle, double near, double range) {
+  double wrapped_angle = Wrap(near, angle, 2 * M_PI);
+
+  return ::std::abs(wrapped_angle - near) < range;
+}
+
 JoystickAngle GetJoystickPosition(const JoystickAxis &x_axis,
                                   const JoystickAxis &y_axis,
                                   const Data &data) {
@@ -11,26 +22,30 @@
 }
 
 JoystickAngle GetJoystickPosition(float x_axis, float y_axis) {
-  if (x_axis > kJoystickRight) {
-    if (y_axis < kJoystickDown) {
-      return JoystickAngle::kUpperRight;
-    } else if (y_axis > kJoystickUp) {
-      return JoystickAngle::kLowerRight;
-    } else {
-      return JoystickAngle::kMiddleRight;
-    }
-  } else if (x_axis < kJoystickLeft) {
-    if (y_axis < kJoystickDown) {
-      return JoystickAngle::kUpperLeft;
-    } else if (y_axis > kJoystickUp) {
-      return JoystickAngle::kLowerLeft;
-    } else {
-      return JoystickAngle::kMiddleLeft;
-    }
+  const float magnitude = hypot(x_axis, y_axis);
+
+  if (magnitude < 0.5) {
+    return JoystickAngle::kDefault;
   }
+
+  double angle = atan2(y_axis, x_axis);
+
+  if (AngleCloseTo(angle, M_PI / 3, M_PI / 6)) {
+    return JoystickAngle::kUpperRight;
+  } else if (AngleCloseTo(angle, 2 * M_PI / 3, M_PI / 6)) {
+    return JoystickAngle::kUpperLeft;
+  } else if (AngleCloseTo(angle, M_PI, M_PI / 6)) {
+    return JoystickAngle::kMiddleLeft;
+  } else if (AngleCloseTo(angle, 0, M_PI / 6)) {
+    return JoystickAngle::kMiddleRight;
+  } else if (AngleCloseTo(angle, -M_PI / 3, M_PI / 6)) {
+    return JoystickAngle::kLowerRight;
+  } else if (AngleCloseTo(angle, -2 * M_PI / 3, M_PI / 6)) {
+    return JoystickAngle::kLowerLeft;
+  }
+
   return JoystickAngle::kDefault;
 }
-
 }  // namespace joysticks
 }  // namespace input
 }  // namespace y2019
diff --git a/y2019/joystick_angle.h b/y2019/joystick_angle.h
index a2c7e36..09ab8af 100644
--- a/y2019/joystick_angle.h
+++ b/y2019/joystick_angle.h
@@ -9,12 +9,7 @@
 namespace y2019 {
 namespace input {
 namespace joysticks {
-namespace {
-constexpr double kJoystickLeft = -0.5;
-constexpr double kJoystickRight = 0.5;
-constexpr double kJoystickUp = 0.5;
-constexpr double kJoystickDown = -0.5;
-}
+bool AngleCloseTo(double angle, double near, double range);
 
 enum class JoystickAngle {
   kDefault,
diff --git a/y2019/joystick_angle_test.cc b/y2019/joystick_angle_test.cc
index c352359..dc29004 100644
--- a/y2019/joystick_angle_test.cc
+++ b/y2019/joystick_angle_test.cc
@@ -7,12 +7,12 @@
 using y2019::input::joysticks::GetJoystickPosition;
 
 TEST(JoystickAngleTest, JoystickAngleTest) {
-  EXPECT_EQ(JoystickAngle::kUpperRight, GetJoystickPosition(0.75, -0.75));
+  EXPECT_EQ(JoystickAngle::kUpperRight, GetJoystickPosition(0.75, 0.75));
   EXPECT_EQ(JoystickAngle::kMiddleRight, GetJoystickPosition(0.75, 0));
-  EXPECT_EQ(JoystickAngle::kLowerRight, GetJoystickPosition(0.75, 0.75));
-  EXPECT_EQ(JoystickAngle::kUpperLeft, GetJoystickPosition(-0.75, -0.75));
+  EXPECT_EQ(JoystickAngle::kLowerRight, GetJoystickPosition(0.75, -0.75));
+  EXPECT_EQ(JoystickAngle::kUpperLeft, GetJoystickPosition(-0.75, 0.75));
   EXPECT_EQ(JoystickAngle::kMiddleLeft, GetJoystickPosition(-0.75, 0));
-  EXPECT_EQ(JoystickAngle::kLowerLeft, GetJoystickPosition(-0.75, 0.75));
+  EXPECT_EQ(JoystickAngle::kLowerLeft, GetJoystickPosition(-0.75, -0.75));
 
   EXPECT_EQ(JoystickAngle::kDefault, GetJoystickPosition(0, 0));
 }