May not work well
Dependencies: USBDevice_edit mbed
USBJoystick.cpp
- Committer:
- Ugly_Kid
- Date:
- 2017-05-04
- Revision:
- 0:7e061992d951
File content as of revision 0:7e061992d951:
/* Copyright (c) 2010-2011 mbed.org, MIT License * Modified Mouse code for Joystick - WH 2012 * * Permission is hereby granted, free of charge, to any person obtaining a copy of this software * and associated documentation files (the "Software"), to deal in the Software without * restriction, including without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or * substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #include "stdint.h" #include "USBJoystick.h" bool USBJoystick::update(int16_t t, int16_t r, int16_t x, int16_t y, uint8_t button, uint8_t hat) { HID_REPORT report; _t = t; _r = r; _x = x; _y = y; _button = button; _hat = hat; // Fill the report according to the Joystick Descriptor /* report.data[0] = _t & 0xff; report.data[1] = _r & 0xff; report.data[2] = _x & 0xff; report.data[3] = __x & 0xff; report.data[4] = ((_button & 0x0f) << 4) | (_hat & 0x0f) ; report.length = 5; */ // Fill the report according to the Joystick Descriptor report.data[0] = 0x01; // report_id report.data[1] = 0x00; //reserved report.data[2] = (_button & 0x0f) << 4 | (_button & 0x0f) ; // buttons 1 - 8 ab //report.data[3] = ((_button & 0x0f) << 4) | (_hat & 0x0f) ;; // buttons 17 - 19 / filling bits 1 -5 ef report.data[3] = (_button & 0x0f) << 4 | (_button & 0x0f) ; //buttons 9 - 16 cd sq x 0 tr report.data[4] = (_button & 0x0f); // buttons 17 - 19 / filling bits 1 -5 ef report.data[5] = 0x00; // filling bits 6 - 13 / 32 bits total report.data[6] = _t & 0xff; // X report.data[7] = _r & 0xff; // Y report.data[8] = _x & 0xff; // Z report.data[9] = _y & 0xff; // Rz report.data[10] = _y & 0xff; report.data[11] = _y & 0xff; report.data[12] = _y & 0xff;// directional analog up report.data[13] = _y & 0xff;// directional analog left report.data[14] = _y & 0xff;// directional analog down report.data[15] = _y & 0xff;// directional analog right report.data[16] = _y & 0xff;// analog left 2 report.data[17] = _y & 0xff;// analog right 2 report.data[18] = _y & 0xff;// analog left 1 report.data[19] = _y & 0xff;// analog right 1 report.data[20] = _y & 0xff;// triangle analog report.data[21] = _y & 0xff;// circle analog report.data[22] = _y & 0xff;// x analog report.data[23] = _y & 0xff;// square analog report.data[24] = _y & 0xff; report.data[25] = _y & 0xff; report.data[26] = _y & 0xff; report.data[27] = _y & 0xff; // 03 ? report.data[28] = _y & 0xff; // ef ? report.data[29] = _y & 0xff; // 16 ? report.data[30] = _y & 0xff; report.data[31] = _y & 0xff; report.data[32] = _y & 0xff; report.data[33] = _y & 0xff; report.data[34] = _y & 0xff;//Accel x 4 report.data[35] = _y & 0xff;//Accel x 3 report.data[36] = _y & 0xff;//Accel x 2 report.data[37] = _y & 0xff;//Accel x 1 report.data[38] = _y & 0xff;//Accel y 4 report.data[39] = _y & 0xff;//Accel y 3 report.data[40] = _y & 0xff;//Accel y 2 report.data[41] = _y & 0xff;//Accel y 1 report.data[42] = _y & 0xff;//Accel z 4 report.data[43] = _y & 0xff;//Accel z 3 report.data[44] = _y & 0xff;//Accel z 2 report.data[45] = _y & 0xff;//Accel z 1 report.data[46] = _y & 0xff; report.data[47] = _y & 0xff; report.data[48] = _y & 0xff; report.length = 49; return send(&report); } /* bool USBJoystick::update() { HID_REPORT report; // Fill the report according to the Joystick Descriptor report.data[0] = _t & 0xff; report.data[1] = _r & 0xff; report.data[2] = _x & 0xff; report.data[3] = _y & 0xff; report.data[4] = ((_button & 0x0f) << 4) | (_hat & 0x0f) ; report.length = 5; return send(&report); } */ bool USBJoystick::update() { HID_REPORT report; // Fill the report according to the Joystick Descriptor /* //report.data[0] = 0x01; report.data[0] = _t & 0xff; report.data[1] = _r & 0xff; report.data[2] = _x & 0xff; report.data[3] = _y & 0xff; report.data[4] = ((_button & 0x0f) << 4) | (_hat & 0x0f) ; */ // Fill the report according to the Joystick Descriptor report.data[0] = 0x01; //reserved report.data[1] = 0x00;; // buttons 1 - 8 report.data[2] = 0x00; // buttons 9 - 16 report.data[3] = 0x00; // buttons 17 - 19 / filling bits 1 -5 report.data[4] = 0x00; // filling bits 6 - 13 / 32 bits total report.data[5] = 0x7d; // X report.data[6] = 0x7d; // Y report.data[7] = 0x7d; // Z report.data[8] = 0x80; // Rz report.data[9] = 0x00; report.data[10] = 0x00; report.data[11] = 0x00; report.data[12] = 0x00;// directional analog up report.data[13] = 0x00;// directional analog left report.data[14] = 0x00;// directional analog down report.data[15] = 0x00;// directional analog right report.data[16] = 0x00;// analog left 2 report.data[17] = 0x00;// analog right 2 report.data[18] = 0x00;// analog left 1 report.data[19] = 0x00;// analog right 1 report.data[20] = 0x00;// triangle analog report.data[21] = 0x00;// circle analog report.data[22] = 0x00;// x analog report.data[23] = 0x00;// square analog report.data[24] = 0x00; report.data[25] = 0x00; report.data[26] = 0x00; report.data[27] = 0x00; // 03 ? report.data[28] = 0x00; // ef ? report.data[29] = 0x00; // 16 ? report.data[30] = 0x00; report.data[31] = 0x00; report.data[32] = 0x00; report.data[33] = 0x00; report.data[34] = 0x00;//Accel x 4 report.data[35] = 0x00;//Accel x 3 report.data[36] = 0x00;//Accel x 2 report.data[37] = 0x00;//Accel x 1 report.data[38] = 0x00;//Accel y 4 report.data[39] = 0x00;//Accel y 3 report.data[40] = 0x00;//Accel y 2 report.data[41] = 0x00;//Accel y 1 report.data[42] = 0x00;//Accel z 4 report.data[43] = 0x00;//Accel z 3 report.data[44] = 0x00;//Accel z 2 report.data[45] = 0x00;//Accel z 1 report.data[46] = 0x00; report.data[47] = 0x00; report.data[48] = 0x00; report.length = 49; 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) { _x = x; _y = y; return update(); } bool USBJoystick::button(uint8_t button) { _button = button; return update(); } bool USBJoystick::hat(uint8_t hat) { _hat = hat; return update(); } void USBJoystick::_init() { _t = -127; _r = -127; _x = 0; _y = 0; _button = 0x0f; _hat = 0x00; } uint8_t * USBJoystick::reportDesc() { static uint8_t reportDescriptor[] = { 0x05, 0x01, // Usage Page (Generic Desktop Ctrls) 0x09, 0x04, // Usage (Joystick) 0xA1, 0x01, // Collection (Physical) 0xA1, 0x02, // Collection (Application) 0x85, 0x01, // Report ID (1) 0x75, 0x08, // Report Size (8) 0x95, 0x01, // Report Count (1) //byte 00 0x15, 0x00, // Logical Minimum (0) 0x26, 0xFF, 0x00, // Logical Maximum (255) 0x81, 0x03, // Input (Const,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) // NOTE: reserved byte 0x75, 0x01, // Report Size (1) 0x95, 0x13, // Report Count (19) 0x15, 0x00, // Logical Minimum (0) 0x25, 0x01, // Logical Maximum (1) 0x35, 0x00, // Physical Minimum (0) 0x45, 0x01, // Physical Maximum (1) 0x05, 0x09, // Usage Page (Button) 0x19, 0x01, // Usage Minimum (0x01) 0x29, 0x13, // Usage Maximum (0x13) 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) 0x75, 0x01, // Report Size (1) 0x95, 0x0D, // Report Count (13) // byte 1 - 4 0x06, 0x00, 0xFF, // Usage Page (Vendor Defined 0xFF00) 0x81, 0x03, // Input (Const,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) // NOTE: 32 bit integer, where 0:18 are buttons and 19:31 are reserved 0x15, 0x00, // Logical Minimum (0) 0x26, 0xFF, 0x00, // Logical Maximum (255) 0x05, 0x01, // Usage Page (Generic Desktop Ctrls) 0x09, 0x01, // Usage (Pointer) 0xA1, 0x00, // Collection (Undefined) 0x75, 0x08, // Report Size (8) 0x95, 0x04, // Report Count (4) 0x35, 0x00, // Physical Minimum (0) 0x46, 0xFF, 0x00, // Physical Maximum (255) 0x09, 0x30, // Usage (X) 0x09, 0x31, // Usage (Y) 0x09, 0x32, // Usage (Z) 0x09, 0x35, // Usage (Rz) 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) // NOTE: four joysticks 0xC0, // End Collection 0x05, 0x01, // Usage Page (Generic Desktop Ctrls) 0x75, 0x08, // Report Size (8) 0x95, 0x27, // Report Count (39) 0x09, 0x01, // Usage (Pointer) 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) //0xC0, // End Collection //0xC0 // End Collection 0x75, 0x08, // Report Size (8) 0x95, 0x30, // Report Count (48) 0x09, 0x01, // Usage (Pointer) 0x91, 0x02, // Output (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile) 0x75, 0x08, // Report Size (8) 0x95, 0x30, // Report Count (48) 0x09, 0x01, // Usage (Pointer) 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile) 0xC0, // End Collection 0xA1, 0x02, // Collection (Application) 0x85, 0x02, // Report ID (2) 0x75, 0x08, // Report Size (8) 0x95, 0x30, // Report Count (48) 0x09, 0x01, // Usage (Pointer) 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile) 0xC0, // End Collection 0xA1, 0x02, // Collection (Application) 0x85, 0xEE, // Report ID (238) 0x75, 0x08, // Report Size (8) 0x95, 0x30, // Report Count (48) 0x09, 0x01, // Usage (Pointer) 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile) 0xC0, // End Collection 0xA1, 0x02, // Collection (Application) 0x85, 0xEF, // Report ID (239) 0x75, 0x08, // Report Size (8) 0x95, 0x30, // Report Count (48) 0x09, 0x01, // Usage (Pointer) 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile) 0xC0, // End Collection 0xC0, // End Collection // 148 bytes }; reportLength = sizeof(reportDescriptor); return reportDescriptor; }