Browse Source

Joystick feature updates (#16732)

* Joystick feature updates

* Move new functions to joystick.h

* Docs
Ryan 3 years ago
parent
commit
c05e8afe45

+ 2 - 0
docs/feature_joystick.md

@@ -150,3 +150,5 @@ Note that the supported AVR MCUs have a 10-bit ADC, and 12-bit for most STM32 MC
 
 Joystick buttons are normal Quantum keycodes, defined as `JS_BUTTON0` to `JS_BUTTON31`, depending on the number of buttons you have configured.
 To trigger a joystick button, just add the corresponding keycode to your keymap.
+
+You can also trigger joystick buttons in code with `register_joystick_button(button)` and `unregister_joystick_button(button)`, where `button` is the 0-based button index (0 = button 1).

+ 0 - 2
keyboards/handwired/battleship_gamepad/battleship_gamepad.c

@@ -15,8 +15,6 @@
  */
 
 #include "battleship_gamepad.h"
-#include "joystick.h"
-#include "analog.h"
 
 /* joystick config */
 joystick_config_t joystick_axes[JOYSTICK_AXES_COUNT] = {

+ 0 - 2
keyboards/handwired/misterdeck/keymaps/default/keymap.c

@@ -16,8 +16,6 @@
 
 #include QMK_KEYBOARD_H
 
-#include "joystick.h"
-
 enum layer_names {
   NORMAL_LAYER = 0
 };

+ 0 - 2
keyboards/handwired/misterdeck/keymaps/nobuttons/keymap.c

@@ -16,8 +16,6 @@
 
 #include QMK_KEYBOARD_H
 
-#include "joystick.h"
-
 enum layer_names {
   NORMAL_LAYER = 0
 };

+ 0 - 2
keyboards/handwired/onekey/keymaps/joystick/keymap.c

@@ -1,7 +1,5 @@
 #include QMK_KEYBOARD_H
 
-#include "joystick.h"
-
 #ifndef ADC_PIN
 #    define ADC_PIN F6
 #endif

+ 0 - 1
keyboards/lime/keymaps/default/keymap.c

@@ -17,7 +17,6 @@
 #include QMK_KEYBOARD_H
 
 #ifdef JOYSTICK_ENABLE
-#   include "joystick.h"
 #   include "analog.h"
 #endif
 

+ 31 - 6
quantum/joystick.c

@@ -1,13 +1,38 @@
 #include "joystick.h"
 
-joystick_t joystick_status = {.buttons = {0},
-                              .axes =
-                                  {
+// clang-format off
+joystick_t joystick_status = {
+    .buttons = {0},
+    .axes = {
 #if JOYSTICK_AXES_COUNT > 0
-                                      0
+        0
 #endif
-                                  },
-                              .status = 0};
+    },
+    .status = 0
+};
+// clang-format on
 
 // array defining the reading of analog values for each axis
 __attribute__((weak)) joystick_config_t joystick_axes[JOYSTICK_AXES_COUNT] = {};
+
+// to be implemented in the hid protocol library
+void send_joystick_packet(joystick_t *joystick);
+
+void joystick_flush(void) {
+    if ((joystick_status.status & JS_UPDATED) > 0) {
+        send_joystick_packet(&joystick_status);
+        joystick_status.status &= ~JS_UPDATED;
+    }
+}
+
+void register_joystick_button(uint8_t button) {
+    joystick_status.buttons[button / 8] |= 1 << (button % 8);
+    joystick_status.status |= JS_UPDATED;
+    joystick_flush();
+}
+
+void unregister_joystick_button(uint8_t button) {
+    joystick_status.buttons[button / 8] &= ~(1 << (button % 8));
+    joystick_status.status |= JS_UPDATED;
+    joystick_flush();
+}

+ 5 - 4
quantum/joystick.h

@@ -1,8 +1,7 @@
 #pragma once
 
-#include "quantum.h"
-
 #include <stdint.h>
+#include "gpio.h"
 
 #ifndef JOYSTICK_BUTTON_COUNT
 #    define JOYSTICK_BUTTON_COUNT 8
@@ -58,5 +57,7 @@ typedef struct {
 
 extern joystick_t joystick_status;
 
-// to be implemented in the hid protocol library
-void send_joystick_packet(joystick_t *joystick);
+void joystick_flush(void);
+
+void register_joystick_button(uint8_t button);
+void unregister_joystick_button(uint8_t button);

+ 10 - 26
quantum/process_keycode/process_joystick.c

@@ -6,41 +6,25 @@
 #include <string.h>
 #include <math.h>
 
-bool process_joystick_buttons(uint16_t keycode, keyrecord_t *record);
-
 bool process_joystick(uint16_t keycode, keyrecord_t *record) {
-    if (process_joystick_buttons(keycode, record) && (joystick_status.status & JS_UPDATED) > 0) {
-        send_joystick_packet(&joystick_status);
-        joystick_status.status &= ~JS_UPDATED;
+    switch (keycode) {
+        case JS_BUTTON0 ... JS_BUTTON_MAX:
+            if (record->event.pressed) {
+                register_joystick_button(keycode - JS_BUTTON0);
+            } else {
+                unregister_joystick_button(keycode - JS_BUTTON0);
+            }
+            return false;
     }
-
     return true;
 }
 
 __attribute__((weak)) void joystick_task(void) {
-    if (process_joystick_analogread() && (joystick_status.status & JS_UPDATED)) {
-        send_joystick_packet(&joystick_status);
-        joystick_status.status &= ~JS_UPDATED;
+    if (process_joystick_analogread()) {
+        joystick_flush();
     }
 }
 
-bool process_joystick_buttons(uint16_t keycode, keyrecord_t *record) {
-    if (keycode < JS_BUTTON0 || keycode > JS_BUTTON_MAX) {
-        return true;
-    } else {
-        uint8_t button_idx = (keycode - JS_BUTTON0);
-        if (record->event.pressed) {
-            joystick_status.buttons[button_idx / 8] |= 1 << (button_idx % 8);
-        } else {
-            joystick_status.buttons[button_idx / 8] &= ~(1 << (button_idx % 8));
-        }
-
-        joystick_status.status |= JS_UPDATED;
-    }
-
-    return true;
-}
-
 uint16_t savePinState(pin_t pin) {
 #ifdef __AVR__
     uint8_t pinNumber = pin & 0xF;

+ 4 - 0
quantum/quantum.h

@@ -200,6 +200,10 @@ extern layer_state_t layer_state;
 #    include "dynamic_keymap.h"
 #endif
 
+#ifdef JOYSTICK_ENABLE
+#    include "joystick.h"
+#endif
+
 #ifdef VIA_ENABLE
 #    include "via.h"
 #endif