USB HID Device that emulates a Gamecontroller

Dependencies:   mbed USBDevice

Committer:
rengro01
Date:
Thu Aug 25 07:22:28 2022 +0000
Revision:
1:018979eb4641
Parent:
0:5037d4be5b6d
Final Arcade Gamepad

Who changed what in which revision?

UserRevisionLine numberNew contents of line
wim 0:5037d4be5b6d 1 #include "stdint.h"
wim 0:5037d4be5b6d 2 #include "USBJoystick.h"
wim 0:5037d4be5b6d 3
rengro01 1:018979eb4641 4 bool USBJoystick::update(int16_t x_l, int16_t y_l, uint8_t buttons_l, int16_t x_r, int16_t y_r, uint8_t buttons_r, uint8_t hat)
rengro01 1:018979eb4641 5 {
rengro01 1:018979eb4641 6 HID_REPORT report;
wim 0:5037d4be5b6d 7 // Fill the report according to the Joystick Descriptor
rengro01 1:018979eb4641 8 report.data[0] = x_l & 0xff;
rengro01 1:018979eb4641 9 report.data[1] = y_l & 0xff;
rengro01 1:018979eb4641 10 report.data[2] = x_r & 0xff;
rengro01 1:018979eb4641 11 report.data[3] = y_r & 0xff;
rengro01 1:018979eb4641 12 report.data[4] = hat & 0xff;
rengro01 1:018979eb4641 13 report.data[5] = buttons_l;
rengro01 1:018979eb4641 14 report.data[6] = buttons_r;
rengro01 1:018979eb4641 15 report.length = 7;
wim 0:5037d4be5b6d 16
wim 0:5037d4be5b6d 17 return send(&report);
wim 0:5037d4be5b6d 18 }
wim 0:5037d4be5b6d 19
rengro01 1:018979eb4641 20 uint8_t * USBJoystick::reportDesc()
rengro01 1:018979eb4641 21 {
rengro01 1:018979eb4641 22 static uint8_t reportDescriptor[] =
rengro01 1:018979eb4641 23 {
rengro01 1:018979eb4641 24 USAGE_PAGE(1), 0x01, // Generic Desktop
rengro01 1:018979eb4641 25 LOGICAL_MINIMUM(1), 0x00, // Logical_Minimum (0)
rengro01 1:018979eb4641 26 USAGE(1), 0x04, // Usage (Joystick)
wim 0:5037d4be5b6d 27
rengro01 1:018979eb4641 28 COLLECTION(1), 0x01, // Application
rengro01 1:018979eb4641 29 USAGE_PAGE(1), 0x01, // Generic Desktop
rengro01 1:018979eb4641 30 USAGE(1), 0x01, // Usage (Pointer)
rengro01 1:018979eb4641 31 COLLECTION(1), 0x00, // Physical
rengro01 1:018979eb4641 32 USAGE(1), 0x30, // X
rengro01 1:018979eb4641 33 USAGE(1), 0x31, // Y
rengro01 1:018979eb4641 34 USAGE(1), 0x32, // Z
rengro01 1:018979eb4641 35 USAGE(1), 0x35, // Rz
rengro01 1:018979eb4641 36 LOGICAL_MINIMUM(1), 0x81, // -127
rengro01 1:018979eb4641 37 LOGICAL_MAXIMUM(1), 0x7f, // 127
rengro01 1:018979eb4641 38 REPORT_SIZE(1), 0x08,
rengro01 1:018979eb4641 39 REPORT_COUNT(1), 0x04,
rengro01 1:018979eb4641 40 INPUT(1), 0x02, // Data, Variable, Absolute
rengro01 1:018979eb4641 41 END_COLLECTION(0),
wim 0:5037d4be5b6d 42
rengro01 1:018979eb4641 43 USAGE(1), 0x39, // Hat
rengro01 1:018979eb4641 44 LOGICAL_MINIMUM(1), 0x00, // 0
rengro01 1:018979eb4641 45 LOGICAL_MAXIMUM(1), 0x07, // 7
rengro01 1:018979eb4641 46 REPORT_SIZE(1), 0x04, // The hat has only 4 bits, which cause an unalignment
rengro01 1:018979eb4641 47 REPORT_COUNT(1), 0x01,
rengro01 1:018979eb4641 48 PHYSICAL_MINIMUM(1), 0x00,
rengro01 1:018979eb4641 49 PHYSICAL_MAXIMUM(1), 0x7f,
rengro01 1:018979eb4641 50 UNIT(1), 0x14,
rengro01 1:018979eb4641 51 INPUT(1), 0x02, // Data, Variable, Absolute
wim 0:5037d4be5b6d 52
rengro01 1:018979eb4641 53 USAGE(1), 0x40, // Fake HAT
rengro01 1:018979eb4641 54 LOGICAL_MINIMUM(1), 0x00, // 0
rengro01 1:018979eb4641 55 LOGICAL_MAXIMUM(1), 0x07, // 7
rengro01 1:018979eb4641 56 REPORT_SIZE(1), 0x04, // Just have an unused fake hat to realign the buttons below
rengro01 1:018979eb4641 57 REPORT_COUNT(1), 0x01,
rengro01 1:018979eb4641 58 PHYSICAL_MINIMUM(1), 0x00,
rengro01 1:018979eb4641 59 PHYSICAL_MAXIMUM(1), 0x7f,
rengro01 1:018979eb4641 60 UNIT(1), 0x14,
rengro01 1:018979eb4641 61 INPUT(1), 0x02, // Data, Variable, Absolute
wim 0:5037d4be5b6d 62
wim 0:5037d4be5b6d 63
rengro01 1:018979eb4641 64 USAGE_PAGE(1), 0x09, // Buttons
rengro01 1:018979eb4641 65 USAGE_MINIMUM(1), 0x01, // 1
rengro01 1:018979eb4641 66 USAGE_MAXIMUM(1), 0x10, // 16 buttons
rengro01 1:018979eb4641 67 LOGICAL_MINIMUM(1), 0x00, // 0
rengro01 1:018979eb4641 68 LOGICAL_MAXIMUM(1), 0x01, // 1
rengro01 1:018979eb4641 69 REPORT_SIZE(1), 0x01,
rengro01 1:018979eb4641 70 REPORT_COUNT(1), 0x10, // 16 buttons
rengro01 1:018979eb4641 71 UNIT_EXPONENT(1), 0x00, // Unit_Exponent (0)
rengro01 1:018979eb4641 72 UNIT(1), 0x00, // Unit (None)
rengro01 1:018979eb4641 73 INPUT(1), 0x02, // Data, Variable, Absolute
rengro01 1:018979eb4641 74 END_COLLECTION(0)
rengro01 1:018979eb4641 75 };
wim 0:5037d4be5b6d 76
rengro01 1:018979eb4641 77 reportLength = sizeof(reportDescriptor);
rengro01 1:018979eb4641 78 return reportDescriptor;
wim 0:5037d4be5b6d 79 }