The other required set of changes

As per the PR, the changes still holding it up.
Add onekey for testing.
Fix ARM builds.
Fix device descriptor when either axes or buttons is zero.
Add compile-time check for at least one axis or button.
Move definition to try to fix conflict.
PR review comments.
qmk cformat
This commit is contained in:
Nick Brassel 2020-01-10 06:29:34 +11:00 committed by a-chol
parent d88bdc6a1b
commit 801be60473
18 changed files with 455 additions and 458 deletions

View file

@ -27,7 +27,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include "host_driver.h"
#include "vusb.h"
#include "joystick.h"
#include "joystick.h"
#include <util/delay.h>
static uint8_t vusb_keyboard_leds = 0;
@ -144,64 +143,67 @@ static void send_consumer(uint16_t data) {
typedef struct {
uint8_t report_id;
#if JOYSTICK_AXES_COUNT>0
int8_t axes[JOYSTICK_AXES_COUNT];
#endif
#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)) vusb_joystick_report_t;
#if JOYSTICK_BUTTON_COUNT > 0
uint8_t buttons[(JOYSTICK_BUTTON_COUNT - 1) / 8 + 1];
#endif
} __attribute__((packed)) vusb_joystick_report_t;
void send_joystick_packet(joystick_t* status)
{
void send_joystick_packet(joystick_t *status) {
vusb_joystick_report_t r = {
.report_id = REPORT_ID_JOYSTICK,
#if JOYSTICK_AXES_COUNT>0
.axes = {
status->axes[0]
#if JOYSTICK_AXES_COUNT > 0
.axes = {status->axes[0]
#if JOYSTICK_AXES_COUNT >= 2
,status->axes[1]
#endif
#if JOYSTICK_AXES_COUNT >= 3
,status->axes[2]
#endif
#if JOYSTICK_AXES_COUNT >= 4
,status->axes[3]
#endif
#if JOYSTICK_AXES_COUNT >= 5
,status->axes[4]
#endif
#if JOYSTICK_AXES_COUNT >= 6
,status->axes[5]
#endif
# if JOYSTICK_AXES_COUNT >= 2
,
status->axes[1]
# endif
# if JOYSTICK_AXES_COUNT >= 3
,
status->axes[2]
# endif
# if JOYSTICK_AXES_COUNT >= 4
,
status->axes[3]
# endif
# if JOYSTICK_AXES_COUNT >= 5
,
status->axes[4]
# endif
# if JOYSTICK_AXES_COUNT >= 6
,
status->axes[5]
# endif
},
#endif //JOYSTICK_AXES_COUNT>0
#endif // JOYSTICK_AXES_COUNT>0
#if JOYSTICK_BUTTON_COUNT>0
.buttons = {
status->buttons[0]
#if JOYSTICK_BUTTON_COUNT > 0
.buttons = {status->buttons[0]
#if JOYSTICK_BUTTON_COUNT>8
,status->buttons[1]
#endif
#if JOYSTICK_BUTTON_COUNT>16
,status->buttons[2]
#endif
#if JOYSTICK_BUTTON_COUNT>24
,status->buttons[3]
#endif
# if JOYSTICK_BUTTON_COUNT > 8
,
status->buttons[1]
# endif
# if JOYSTICK_BUTTON_COUNT > 16
,
status->buttons[2]
# endif
# if JOYSTICK_BUTTON_COUNT > 24
,
status->buttons[3]
# endif
}
#endif //JOYSTICK_BUTTON_COUNT>0
#endif // JOYSTICK_BUTTON_COUNT>0
};
if (usbInterruptIsReady3()) {
usbSetInterrupt3((void *)&r, sizeof(vusb_joystick_report_t));
}
}
/*------------------------------------------------------------------*
* Request from host *
*------------------------------------------------------------------*/
@ -395,57 +397,58 @@ const PROGMEM uchar mouse_extra_hid_report[] = {
0x81, 0x00, // Input (Data, Array, Absolute)
0xC0 // End Collection
# endif
#if JOYSTICK_ENABLE
0x05, 0x01, // USAGE_PAGE (Generic Desktop)
0x09, 0x04, // USAGE (Joystick)
0xa1, 0x01, // COLLECTION (Application)
0x85, REPORT_ID_JOYSTICK, // REPORT_ID (6)
0x09, 0x01, // USAGE (Pointer)
0xa1, 0x00, // COLLECTION (Physical)
#if JOYSTICK_AXES_COUNT > 0
#if JOYSTICK_AXES_COUNT >= 1
0x09, 0x30, // USAGE (X)
#endif
#if JOYSTICK_AXES_COUNT >= 2
0x09, 0x31, // USAGE (Y)
#endif
#if JOYSTICK_AXES_COUNT >= 3
0x09, 0x32, // USAGE (Z)
#endif
#if JOYSTICK_AXES_COUNT >= 4
0x09, 0x33, // USAGE (RX)
#endif
#if JOYSTICK_AXES_COUNT >= 5
0x09, 0x34, // USAGE (RY)
#endif
#if JOYSTICK_AXES_COUNT >= 6
0x09, 0x35, // USAGE (RZ)
#endif
0x15, 0x81, // LOGICAL_MINIMUM (-127)
0x25, 0x7f, // LOGICAL_MAXIMUM (127)
0x75, 0x08, // REPORT_SIZE (8)
0x95, JOYSTICK_AXES_COUNT, // REPORT_COUNT (JOYSTICK_AXES_COUNT)
0x81, 0x02, // INPUT (Data,Var,Abs)
#endif
#if JOYSTICK_BUTTON_COUNT> 0
0x05, 0x09, // USAGE_PAGE (Button)
0x19, 0x01, // USAGE_MINIMUM (Button 1)
0x29, JOYSTICK_BUTTON_COUNT, // USAGE_MAXIMUM
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x25, 0x01, // LOGICAL_MAXIMUM (1)
0x75, 0x01, // REPORT_SIZE (1)
0x95, JOYSTICK_BUTTON_COUNT, // REPORT_COUNT
0x81, 0x02, // INPUT (Data,Var,Abs)
//fill up report to get it byte-aligned
#if (JOYSTICK_BUTTON_COUNT % 8) != 0
0x75, 0x01, // REPORT_SIZE (1)
0x95, 8 - (JOYSTICK_BUTTON_COUNT % 8), // REPORT_COUNT
0x81, 0x01, // INPUT (Data,Var,Abs)
#endif
#endif
0xc0, // END_COLLECTION
0xc0 // END_COLLECTION
#endif //JOYSTICK_ENABLE
# if JOYSTICK_ENABLE
0x05,
0x01, // USAGE_PAGE (Generic Desktop)
0x09, 0x04, // USAGE (Joystick)
0xa1, 0x01, // COLLECTION (Application)
0x85, REPORT_ID_JOYSTICK, // REPORT_ID (6)
0x09, 0x01, // USAGE (Pointer)
0xa1, 0x00, // COLLECTION (Physical)
# if JOYSTICK_AXES_COUNT > 0
# if JOYSTICK_AXES_COUNT >= 1
0x09, 0x30, // USAGE (X)
# endif
# if JOYSTICK_AXES_COUNT >= 2
0x09, 0x31, // USAGE (Y)
# endif
# if JOYSTICK_AXES_COUNT >= 3
0x09, 0x32, // USAGE (Z)
# endif
# if JOYSTICK_AXES_COUNT >= 4
0x09, 0x33, // USAGE (RX)
# endif
# if JOYSTICK_AXES_COUNT >= 5
0x09, 0x34, // USAGE (RY)
# endif
# if JOYSTICK_AXES_COUNT >= 6
0x09, 0x35, // USAGE (RZ)
# endif
0x15, 0x81, // LOGICAL_MINIMUM (-127)
0x25, 0x7f, // LOGICAL_MAXIMUM (127)
0x75, 0x08, // REPORT_SIZE (8)
0x95, JOYSTICK_AXES_COUNT, // REPORT_COUNT (JOYSTICK_AXES_COUNT)
0x81, 0x02, // INPUT (Data,Var,Abs)
# endif
# if JOYSTICK_BUTTON_COUNT > 0
0x05, 0x09, // USAGE_PAGE (Button)
0x19, 0x01, // USAGE_MINIMUM (Button 1)
0x29, JOYSTICK_BUTTON_COUNT, // USAGE_MAXIMUM
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x25, 0x01, // LOGICAL_MAXIMUM (1)
0x75, 0x01, // REPORT_SIZE (1)
0x95, JOYSTICK_BUTTON_COUNT, // REPORT_COUNT
0x81, 0x02, // INPUT (Data,Var,Abs)
// fill up report to get it byte-aligned
# if (JOYSTICK_BUTTON_COUNT % 8) != 0
0x75, 0x01, // REPORT_SIZE (1)
0x95, 8 - (JOYSTICK_BUTTON_COUNT % 8), // REPORT_COUNT
0x81, 0x01, // INPUT (Data,Var,Abs)
# endif
# endif
0xc0, // END_COLLECTION
0xc0 // END_COLLECTION
# endif // JOYSTICK_ENABLE
};
#endif
@ -468,19 +471,19 @@ const PROGMEM char usbDescriptorConfiguration[] = {
/* USB configuration descriptor */
9, /* sizeof(usbDescriptorConfiguration): length of descriptor in bytes */
USBDESCR_CONFIG, /* descriptor type */
# if defined (MOUSE_ENABLE) || defined(EXTRAKEY_ENABLE)
59, // 9 + (9 + 9 + 7) + (9 + 9 + 7)
#else
34, // 9 + (9 + 9 + 7)
# if defined(MOUSE_ENABLE) || defined(EXTRAKEY_ENABLE)
59, // 9 + (9 + 9 + 7) + (9 + 9 + 7)
# else
34, // 9 + (9 + 9 + 7)
# endif
0,
// 18 + 7 * USB_CFG_HAVE_INTRIN_ENDPOINT + 7 * USB_CFG_HAVE_INTRIN_ENDPOINT3 + 9, 0,
/* total length of data returned (including inlined descriptors) */
// 18 + 7 * USB_CFG_HAVE_INTRIN_ENDPOINT + 7 * USB_CFG_HAVE_INTRIN_ENDPOINT3 + 9, 0,
/* total length of data returned (including inlined descriptors) */
# if defined(MOUSE_ENABLE) || defined(EXTRAKEY_ENABLE)
2, /* number of interfaces in this configuration */
# else
1,
#endif
# endif
1, /* index of this configuration */
0, /* configuration name string index */
# if USB_CFG_IS_SELF_POWERED
@ -533,13 +536,13 @@ const PROGMEM char usbDescriptorConfiguration[] = {
0, /* PROTOCOL: none */
0, /* string index for interface */
/* HID descriptor */
9, /* sizeof(usbDescrHID): length of descriptor in bytes */
USBDESCR_HID, /* descriptor type: HID */
0x01, 0x01, /* BCD representation of HID version */
0x00, /* target country code */
0x01, /* number of HID Report (or other HID class) Descriptor infos to follow */
0x22, /* descriptor type: report */
sizeof(mouse_extra_hid_report), 0, /* total length of report descriptor */
9, /* sizeof(usbDescrHID): length of descriptor in bytes */
USBDESCR_HID, /* descriptor type: HID */
0x01, 0x01, /* BCD representation of HID version */
0x00, /* target country code */
0x01, /* number of HID Report (or other HID class) Descriptor infos to follow */
0x22, /* descriptor type: report */
sizeof(mouse_extra_hid_report), 0, /* total length of report descriptor */
# if USB_CFG_HAVE_INTRIN_ENDPOINT3 /* endpoint descriptor for endpoint 3 */
/* Endpoint descriptor */
7, /* sizeof(usbDescrEndpoint) */