forked from mirrors/qmk_userspace
		
	Joystick feature updates (#16732)
* Joystick feature updates * Move new functions to joystick.h * Docs
This commit is contained in:
		
					parent
					
						
							
								71ffb41c9b
							
						
					
				
			
			
				commit
				
					
						c05e8afe45
					
				
			
		
					 10 changed files with 52 additions and 45 deletions
				
			
		| 
						 | 
					@ -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.
 | 
					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.
 | 
					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).
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -15,8 +15,6 @@
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "battleship_gamepad.h"
 | 
					#include "battleship_gamepad.h"
 | 
				
			||||||
#include "joystick.h"
 | 
					 | 
				
			||||||
#include "analog.h"
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* joystick config */
 | 
					/* joystick config */
 | 
				
			||||||
joystick_config_t joystick_axes[JOYSTICK_AXES_COUNT] = {
 | 
					joystick_config_t joystick_axes[JOYSTICK_AXES_COUNT] = {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -16,8 +16,6 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include QMK_KEYBOARD_H
 | 
					#include QMK_KEYBOARD_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "joystick.h"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
enum layer_names {
 | 
					enum layer_names {
 | 
				
			||||||
  NORMAL_LAYER = 0
 | 
					  NORMAL_LAYER = 0
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -16,8 +16,6 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include QMK_KEYBOARD_H
 | 
					#include QMK_KEYBOARD_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "joystick.h"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
enum layer_names {
 | 
					enum layer_names {
 | 
				
			||||||
  NORMAL_LAYER = 0
 | 
					  NORMAL_LAYER = 0
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,7 +1,5 @@
 | 
				
			||||||
#include QMK_KEYBOARD_H
 | 
					#include QMK_KEYBOARD_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "joystick.h"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifndef ADC_PIN
 | 
					#ifndef ADC_PIN
 | 
				
			||||||
#    define ADC_PIN F6
 | 
					#    define ADC_PIN F6
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -17,7 +17,6 @@
 | 
				
			||||||
#include QMK_KEYBOARD_H
 | 
					#include QMK_KEYBOARD_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef JOYSTICK_ENABLE
 | 
					#ifdef JOYSTICK_ENABLE
 | 
				
			||||||
#   include "joystick.h"
 | 
					 | 
				
			||||||
#   include "analog.h"
 | 
					#   include "analog.h"
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,13 +1,38 @@
 | 
				
			||||||
#include "joystick.h"
 | 
					#include "joystick.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
joystick_t joystick_status = {.buttons = {0},
 | 
					// clang-format off
 | 
				
			||||||
                              .axes =
 | 
					joystick_t joystick_status = {
 | 
				
			||||||
                                  {
 | 
					    .buttons = {0},
 | 
				
			||||||
 | 
					    .axes = {
 | 
				
			||||||
#if JOYSTICK_AXES_COUNT > 0
 | 
					#if JOYSTICK_AXES_COUNT > 0
 | 
				
			||||||
        0
 | 
					        0
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
                              .status = 0};
 | 
					    .status = 0
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					// clang-format on
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// array defining the reading of analog values for each axis
 | 
					// array defining the reading of analog values for each axis
 | 
				
			||||||
__attribute__((weak)) joystick_config_t joystick_axes[JOYSTICK_AXES_COUNT] = {};
 | 
					__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();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,8 +1,7 @@
 | 
				
			||||||
#pragma once
 | 
					#pragma once
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "quantum.h"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include <stdint.h>
 | 
					#include <stdint.h>
 | 
				
			||||||
 | 
					#include "gpio.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifndef JOYSTICK_BUTTON_COUNT
 | 
					#ifndef JOYSTICK_BUTTON_COUNT
 | 
				
			||||||
#    define JOYSTICK_BUTTON_COUNT 8
 | 
					#    define JOYSTICK_BUTTON_COUNT 8
 | 
				
			||||||
| 
						 | 
					@ -58,5 +57,7 @@ typedef struct {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern joystick_t joystick_status;
 | 
					extern joystick_t joystick_status;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// to be implemented in the hid protocol library
 | 
					void joystick_flush(void);
 | 
				
			||||||
void send_joystick_packet(joystick_t *joystick);
 | 
					
 | 
				
			||||||
 | 
					void register_joystick_button(uint8_t button);
 | 
				
			||||||
 | 
					void unregister_joystick_button(uint8_t button);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -6,41 +6,25 @@
 | 
				
			||||||
#include <string.h>
 | 
					#include <string.h>
 | 
				
			||||||
#include <math.h>
 | 
					#include <math.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
bool process_joystick_buttons(uint16_t keycode, keyrecord_t *record);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
bool process_joystick(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) {
 | 
					    switch (keycode) {
 | 
				
			||||||
        send_joystick_packet(&joystick_status);
 | 
					        case JS_BUTTON0 ... JS_BUTTON_MAX:
 | 
				
			||||||
        joystick_status.status &= ~JS_UPDATED;
 | 
					            if (record->event.pressed) {
 | 
				
			||||||
 | 
					                register_joystick_button(keycode - JS_BUTTON0);
 | 
				
			||||||
 | 
					            } else {
 | 
				
			||||||
 | 
					                unregister_joystick_button(keycode - JS_BUTTON0);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            return false;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					 | 
				
			||||||
    return true;
 | 
					    return true;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
__attribute__((weak)) void joystick_task(void) {
 | 
					__attribute__((weak)) void joystick_task(void) {
 | 
				
			||||||
    if (process_joystick_analogread() && (joystick_status.status & JS_UPDATED)) {
 | 
					    if (process_joystick_analogread()) {
 | 
				
			||||||
        send_joystick_packet(&joystick_status);
 | 
					        joystick_flush();
 | 
				
			||||||
        joystick_status.status &= ~JS_UPDATED;
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
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) {
 | 
					uint16_t savePinState(pin_t pin) {
 | 
				
			||||||
#ifdef __AVR__
 | 
					#ifdef __AVR__
 | 
				
			||||||
    uint8_t pinNumber = pin & 0xF;
 | 
					    uint8_t pinNumber = pin & 0xF;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -200,6 +200,10 @@ extern layer_state_t layer_state;
 | 
				
			||||||
#    include "dynamic_keymap.h"
 | 
					#    include "dynamic_keymap.h"
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef JOYSTICK_ENABLE
 | 
				
			||||||
 | 
					#    include "joystick.h"
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef VIA_ENABLE
 | 
					#ifdef VIA_ENABLE
 | 
				
			||||||
#    include "via.h"
 | 
					#    include "via.h"
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue