Renato Grottesi
/
MaliUSBJoystick
USB HID Device that emulates a Gamecontroller
USBJoystick.cpp@1:018979eb4641, 2022-08-25 (annotated)
- 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?
User | Revision | Line number | New 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 | } |