add support for hid gamepad interface

add documentation for HID joystick
Add joystick_task to read analog axes values even when no key is pressed or release. update doc
Update docs/feature_joystick.md
Manage pin setup and read to maintain matrix scan after analog read
This commit is contained in:
achol 2018-10-17 11:23:20 +02:00 committed by a-chol
parent d8f3c28a37
commit 3cf7611139
15 changed files with 675 additions and 2 deletions

View file

@ -85,6 +85,10 @@ extern keymap_config_t keymap_config;
# include "raw_hid.h"
#endif
#ifdef JOYSTICK_ENABLE
#include "joystick.h"
#endif
uint8_t keyboard_idle = 0;
/* 0: Boot Protocol, 1: Report Protocol(default) */
uint8_t keyboard_protocol = 1;
@ -263,6 +267,85 @@ static void Console_Task(void) {
}
#endif
/*******************************************************************************
* Joystick
******************************************************************************/
#ifdef JOYSTICK_ENABLE
typedef struct {
#if JOYSTICK_AXES_COUNT>0
int8_t axes[JOYSTICK_AXES_COUNT];
#endif
#if JOYSTICK_BUTTON_COUNT>0
uint8_t buttons[(JOYSTICK_BUTTON_COUNT-1)/8+1];
#endif
} __attribute__ ((packed)) joystick_report_t;
void send_joystick_packet(joystick_t* joystick){
uint8_t timeout = 255;
uint8_t where = where_to_send();
if (where != OUTPUT_USB && where != OUTPUT_USB_AND_BT) {
return;
}
joystick_report_t r = {
#if JOYSTICK_AXES_COUNT>0
.axes = {
joystick->axes[0]
#if JOYSTICK_AXES_COUNT >= 2
,joystick->axes[1]
#endif
#if JOYSTICK_AXES_COUNT >= 3
,joystick->axes[2]
#endif
#if JOYSTICK_AXES_COUNT >= 4
,joystick->axes[3]
#endif
#if JOYSTICK_AXES_COUNT >= 5
,joystick->axes[4]
#endif
#if JOYSTICK_AXES_COUNT >= 6
,joystick->axes[5]
#endif
},
#endif //JOYSTICK_AXES_COUNT>0
#if JOYSTICK_BUTTON_COUNT>0
.buttons = {
joystick->buttons[0]
#if JOYSTICK_BUTTON_COUNT>8
,joystick->buttons[1]
#endif
#if JOYSTICK_BUTTON_COUNT>16
,joystick->buttons[2]
#endif
#if JOYSTICK_BUTTON_COUNT>24
,joystick->buttons[3]
#endif
}
#endif //JOYSTICK_BUTTON_COUNT>0
};
/* Select the Joystick Report Endpoint */
Endpoint_SelectEndpoint(JOYSTICK_IN_EPNUM);
/* Check if write ready for a polling interval around 10ms */
while (timeout-- && !Endpoint_IsReadWriteAllowed()) _delay_us(40);
if (!Endpoint_IsReadWriteAllowed()) return;
/* Write Joystick Report Data */
Endpoint_Write_Stream_LE(&r, sizeof(joystick_report_t), NULL);
/* Finalize the stream transfer to send the last packet */
Endpoint_ClearIN();
}
#endif
/*******************************************************************************
* USB Events
******************************************************************************/