summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--docs/feature_joystick.md2
-rw-r--r--keyboards/handwired/battleship_gamepad/battleship_gamepad.c2
-rw-r--r--keyboards/handwired/misterdeck/keymaps/default/keymap.c2
-rw-r--r--keyboards/handwired/misterdeck/keymaps/nobuttons/keymap.c2
-rw-r--r--keyboards/handwired/onekey/keymaps/joystick/keymap.c2
-rw-r--r--keyboards/lime/keymaps/default/keymap.c1
-rw-r--r--quantum/joystick.c37
-rw-r--r--quantum/joystick.h9
-rw-r--r--quantum/process_keycode/process_joystick.c36
-rw-r--r--quantum/quantum.h4
10 files changed, 52 insertions, 45 deletions
diff --git a/docs/feature_joystick.md b/docs/feature_joystick.md
index fe33517a16..2635298587 100644
--- a/docs/feature_joystick.md
+++ b/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).
diff --git a/keyboards/handwired/battleship_gamepad/battleship_gamepad.c b/keyboards/handwired/battleship_gamepad/battleship_gamepad.c
index 918a3852d0..2c9de15a9f 100644
--- a/keyboards/handwired/battleship_gamepad/battleship_gamepad.c
+++ b/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] = {
diff --git a/keyboards/handwired/misterdeck/keymaps/default/keymap.c b/keyboards/handwired/misterdeck/keymaps/default/keymap.c
index 217d25551c..b8ed3cb9d9 100644
--- a/keyboards/handwired/misterdeck/keymaps/default/keymap.c
+++ b/keyboards/handwired/misterdeck/keymaps/default/keymap.c
@@ -16,8 +16,6 @@
#include QMK_KEYBOARD_H
-#include "joystick.h"
-
enum layer_names {
NORMAL_LAYER = 0
};
diff --git a/keyboards/handwired/misterdeck/keymaps/nobuttons/keymap.c b/keyboards/handwired/misterdeck/keymaps/nobuttons/keymap.c
index d4c52be35d..5c69d2bc21 100644
--- a/keyboards/handwired/misterdeck/keymaps/nobuttons/keymap.c
+++ b/keyboards/handwired/misterdeck/keymaps/nobuttons/keymap.c
@@ -16,8 +16,6 @@
#include QMK_KEYBOARD_H
-#include "joystick.h"
-
enum layer_names {
NORMAL_LAYER = 0
};
diff --git a/keyboards/handwired/onekey/keymaps/joystick/keymap.c b/keyboards/handwired/onekey/keymaps/joystick/keymap.c
index f427b9d77d..7a2f138b28 100644
--- a/keyboards/handwired/onekey/keymaps/joystick/keymap.c
+++ b/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
diff --git a/keyboards/lime/keymaps/default/keymap.c b/keyboards/lime/keymaps/default/keymap.c
index 2d904d36db..eade4d4183 100644
--- a/keyboards/lime/keymaps/default/keymap.c
+++ b/keyboards/lime/keymaps/default/keymap.c
@@ -17,7 +17,6 @@
#include QMK_KEYBOARD_H
#ifdef JOYSTICK_ENABLE
-# include "joystick.h"
# include "analog.h"
#endif
diff --git a/quantum/joystick.c b/quantum/joystick.c
index 7b87201aef..86b2c64036 100644
--- a/quantum/joystick.c
+++ b/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();
+}
diff --git a/quantum/joystick.h b/quantum/joystick.h
index 9156491aca..002df3a6d9 100644
--- a/quantum/joystick.h
+++ b/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);
diff --git a/quantum/process_keycode/process_joystick.c b/quantum/process_keycode/process_joystick.c
index 2fb092c573..8c3e71616f 100644
--- a/quantum/process_keycode/process_joystick.c
+++ b/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;
diff --git a/quantum/quantum.h b/quantum/quantum.h
index 020e455941..f87e5f1916 100644
--- a/quantum/quantum.h
+++ b/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