USB Joystick library, modified to work as a 6 DOF joystick.
Fork of USBJoystick by
Diff: USBJoystick.cpp
- Revision:
- 2:1549541d3b4b
- Parent:
- 1:8b5f213b169f
- Child:
- 4:0ffbedd2cb73
--- a/USBJoystick.cpp Fri Jan 13 05:37:07 2017 +0000 +++ b/USBJoystick.cpp Fri Jan 13 07:09:28 2017 +0000 @@ -27,12 +27,14 @@ #include "stdint.h" #include "USBJoystick.h" -bool USBJoystick::update(int16_t t, int16_t r, int16_t x, int16_t y, uint32_t buttons, uint8_t hat) { +bool USBJoystick::update(int16_t x, int16_t y, int16_t z, int16_t rx, int16_t ry, int16_t rz, uint32_t buttons, uint8_t hat) { - _t = t; - _r = r; _x = x; - _y = y; + _y = y; + _z = z; + _rx = rx; + _ry = ry; + _rz = rz; _buttons = buttons; _hat = hat; @@ -43,11 +45,12 @@ HID_REPORT report; // Fill the report according to the Joystick Descriptor - report.data[0] = _t & 0xffff; - report.data[1] = _r & 0xffff; - report.data[2] = _x & 0xffff; - report.data[3] = _y & 0xffff; - + report.data[0] = _x & 0xffff; + report.data[1] = _y & 0xffff; + report.data[2] = _z & 0xffff; + report.data[3] = _rx & 0xffff; + report.data[4] = _ry & 0xffff; + report.data[5] = _rz & 0xffff; #if (BUTTONS4 == 1) //Hat and 4 Buttons @@ -56,11 +59,11 @@ //Use 4 bit padding for hat4 or hat8 - report.data[4] = (_hat & 0x0f) ; + report.data[6] = (_hat & 0x0f) ; //Use 4 bit padding for buttons - report.data[5] = (_buttons & 0x0f) ; - report.length = 6; + report.data[7] = (_buttons & 0x0f) ; + report.length = 8; #endif #if (BUTTONS8 == 1) @@ -72,41 +75,35 @@ // report.length = 6; //Use 4 bit padding for hat4 or hat8 - report.data[4] = (_hat & 0x0f) ; + report.data[6] = (_hat & 0x0f) ; //Use 8 bits for buttons - report.data[5] = (_buttons & 0xff) ; - report.length = 6; + report.data[7] = (_buttons & 0xff) ; + report.length = 8; #endif #if (BUTTONS32 == 1) //Use 4 bit padding for hat4 or hat8 - report.data[4] = (_hat & 0x0f) ; + report.data[6] = (_hat & 0x0f) ; //No bit padding for 32 buttons - report.data[5] = (_buttons >> 0) & 0xff; - report.data[6] = (_buttons >> 8) & 0xff; - report.data[7] = (_buttons >> 16) & 0xff; - report.data[8] = (_buttons >> 24) & 0xff; - report.length = 9; + report.data[7] = (_buttons >> 0) & 0xff; + report.data[8] = (_buttons >> 8) & 0xff; + report.data[9] = (_buttons >> 16) & 0xff; + report.data[10] = (_buttons >> 24) & 0xff; + report.length = 11; #endif return send(&report); } -bool USBJoystick::throttle(int16_t t) { - _t = t; - return update(); -} - -bool USBJoystick::rudder(int16_t r) { - _r = r; - return update(); -} - -bool USBJoystick::move(int16_t x, int16_t y) { +bool USBJoystick::move(int16_t x, int16_t y, int16_t z, int16_t rx, int16_t ry, int16_t rz) { _x = x; _y = y; + _z = z; + _rx = rx; + _ry = ry; + _rz = rz; return update(); } @@ -120,12 +117,13 @@ return update(); } - void USBJoystick::_init() { - _t = -32768; - _r = -32768; - _x = 0; - _y = 0; + _x = 0x0000; + _y = 0x0000; + _z = 0x0000; + _rx = 0x0000; + _ry = 0x0000; + _rz = 0x0000; _buttons = 0x00000000; _hat = 0x00; } @@ -133,38 +131,28 @@ uint8_t * USBJoystick::reportDesc() { static uint8_t reportDescriptor[] = { - + // value in () is the number of bytes. These bytes follow the comma, least significant byte first + // see USBHID_Types.h for more info USAGE_PAGE(1), 0x01, // Generic Desktop LOGICAL_MINIMUM(1), 0x00, // Logical_Minimum (0) USAGE(1), 0x04, // Usage (Joystick) COLLECTION(1), 0x01, // Application - USAGE_PAGE(1), 0x02, // Simulation Controls - USAGE(1), 0xBB, // Throttle - USAGE(1), 0xBA, // Rudder - LOGICAL_MINIMUM(1), 0x81, // -127 - LOGICAL_MAXIMUM(1), 0x7f, // 127 - REPORT_SIZE(1), 0x08, - REPORT_COUNT(1), 0x02, - INPUT(1), 0x02, // Data, Variable, Absolute + +// 6 Axes of Joystick USAGE_PAGE(1), 0x01, // Generic Desktop USAGE(1), 0x01, // Usage (Pointer) COLLECTION(1), 0x00, // Physical USAGE(1), 0x30, // X USAGE(1), 0x31, // Y -//// 8 bit values -// LOGICAL_MINIMUM(1), 0x81, // -127 -// LOGICAL_MAXIMUM(1), 0x7f, // 127 -// REPORT_SIZE(1), 0x08, -// REPORT_COUNT(1), 0x02, -// INPUT(1), 0x02, // Data, Variable, Absolute - -// 16 bit values - LOGICAL_MINIMUM(1), 0x00, // 0 - LOGICAL_MAXIMUM(2), 0xff, 0x7f, // 32767 - REPORT_SIZE(1), 0x10, - REPORT_COUNT(1), 0x02, + USAGE(1), 0x32, // Z + USAGE(1), 0x33, // RX + USAGE(1), 0x34, // RY + USAGE(1), 0x35, // RZ + LOGICAL_MINIMUM(2), 0xff, 0xff, // -32768 (using 2's complement) + LOGICAL_MAXIMUM(2), 0xff, 0x7f, // 32767 (0x7fff, least significant byte first) + REPORT_SIZE(1), 0x10, // REPORT_SIZE describes the number of bits in this element (16, in this case) + REPORT_COUNT(1), 0x06, INPUT(1), 0x02, // Data, Variable, Absolute - END_COLLECTION(0), #if (HAT4 == 1)