Browse Source

Joystick feature updates (#16732)

* Joystick feature updates

* Move new functions to joystick.h

* Docs
pull/16738/head
Ryan 2 years ago
committed by GitHub
parent
commit
c05e8afe45
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 52 additions and 45 deletions
  1. +2
    -0
      docs/feature_joystick.md
  2. +0
    -2
      keyboards/handwired/battleship_gamepad/battleship_gamepad.c
  3. +0
    -2
      keyboards/handwired/misterdeck/keymaps/default/keymap.c
  4. +0
    -2
      keyboards/handwired/misterdeck/keymaps/nobuttons/keymap.c
  5. +0
    -2
      keyboards/handwired/onekey/keymaps/joystick/keymap.c
  6. +0
    -1
      keyboards/lime/keymaps/default/keymap.c
  7. +31
    -6
      quantum/joystick.c
  8. +5
    -4
      quantum/joystick.h
  9. +10
    -26
      quantum/process_keycode/process_joystick.c
  10. +4
    -0
      quantum/quantum.h

+ 2
- 0
docs/feature_joystick.md View File

@ -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 View File

@ -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 View File

@ -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 View File

@ -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 View File

@ -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 View File

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


+ 31
- 6
quantum/joystick.c View File

@ -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 View File

@ -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 View File

@ -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 View File

@ -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


Loading…
Cancel
Save