Browse Source

Add PS2_MOUSE_ROTATE to compensate for device orientation (#8650)

* Add PS2_MOUSE_ROTATE to compensate for device orientation

* fixup! Add PS2_MOUSE_ROTATE to compensate for device orientation

* Reformat with IndentPPDirectives: AfterHash as per #6316
Manna Harbour 5 years ago
parent
commit
07c75feba3
2 changed files with 34 additions and 0 deletions
  1. 19 0
      docs/feature_ps2_mouse.md
  2. 15 0
      tmk_core/protocol/ps2_mouse.c

+ 19 - 0
docs/feature_ps2_mouse.md

@@ -266,6 +266,25 @@ To reverse the scroll axes you can put:
 
 into config.h.
 
+### Rotate Mouse Axes :id=rotate-mouse-axes
+
+Transform the output of the device with a clockwise rotation of 90, 180, or 270
+degrees.
+
+When compensating for device orientation, rotate the output the same amount in
+the opposite direction.  E.g. if the normal device orientation is considered to
+be North-facing, compensate as follows:
+
+```c
+#define PS2_MOUSE_ROTATE 270 /* Compensate for East-facing device orientation. */
+```
+```c
+#define PS2_MOUSE_ROTATE 180 /* Compensate for South-facing device orientation. */
+```
+```c
+#define PS2_MOUSE_ROTATE 90 /* Compensate for West-facing device orientation. */
+```
+
 ### Debug Settings :id=debug-settings
 
 To debug the mouse, add `debug_mouse = true` or enable via bootmagic.

+ 15 - 0
tmk_core/protocol/ps2_mouse.c

@@ -157,6 +157,21 @@ static inline void ps2_mouse_convert_report_to_hid(report_mouse_t *mouse_report)
     // invert coordinate of y to conform to USB HID mouse
     mouse_report->y = -mouse_report->y;
 #endif
+
+#ifdef PS2_MOUSE_ROTATE
+    int8_t x = mouse_report->x;
+    int8_t y = mouse_report->y;
+#    if PS2_MOUSE_ROTATE == 90
+    mouse_report->x = y;
+    mouse_report->y = -x;
+#    elif PS2_MOUSE_ROTATE == 180
+    mouse_report->x = -x;
+    mouse_report->y = -y;
+#    elif PS2_MOUSE_ROTATE == 270
+    mouse_report->x = -y;
+    mouse_report->y = x;
+#    endif
+#endif
 }
 
 static inline void ps2_mouse_clear_report(report_mouse_t *mouse_report) {