mbed USBHost Gamepad driver sample

Committer:
YuuichiAkagawa
Date:
Wed Jan 14 13:27:08 2015 +0000
Revision:
2:7345e2afa41e
Parent:
0:00fe0ab09333
recommit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
YuuichiAkagawa 0:00fe0ab09333 1 /* mbed USBHost Gamepad driver sample
YuuichiAkagawa 0:00fe0ab09333 2 * Copyright (c) 2014 Yuuichi Akagawa
YuuichiAkagawa 0:00fe0ab09333 3 *
YuuichiAkagawa 0:00fe0ab09333 4 * modified from mbed USBHostMouse
YuuichiAkagawa 0:00fe0ab09333 5 *
YuuichiAkagawa 0:00fe0ab09333 6 * Copyright (c) 2014 mbed.org, MIT License
YuuichiAkagawa 0:00fe0ab09333 7 *
YuuichiAkagawa 0:00fe0ab09333 8 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software
YuuichiAkagawa 0:00fe0ab09333 9 * and associated documentation files (the "Software"), to deal in the Software without
YuuichiAkagawa 0:00fe0ab09333 10 * restriction, including without limitation the rights to use, copy, modify, merge, publish,
YuuichiAkagawa 0:00fe0ab09333 11 * distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
YuuichiAkagawa 0:00fe0ab09333 12 * Software is furnished to do so, subject to the following conditions:
YuuichiAkagawa 0:00fe0ab09333 13 *
YuuichiAkagawa 0:00fe0ab09333 14 * The above copyright notice and this permission notice shall be included in all copies or
YuuichiAkagawa 0:00fe0ab09333 15 * substantial portions of the Software.
YuuichiAkagawa 0:00fe0ab09333 16 *
YuuichiAkagawa 0:00fe0ab09333 17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
YuuichiAkagawa 0:00fe0ab09333 18 * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
YuuichiAkagawa 0:00fe0ab09333 19 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
YuuichiAkagawa 0:00fe0ab09333 20 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
YuuichiAkagawa 0:00fe0ab09333 21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
YuuichiAkagawa 0:00fe0ab09333 22 */
YuuichiAkagawa 0:00fe0ab09333 23
YuuichiAkagawa 0:00fe0ab09333 24 #ifndef USBHOSTGAMEPAD_H
YuuichiAkagawa 0:00fe0ab09333 25 #define USBHOSTGAMEPAD_H
YuuichiAkagawa 0:00fe0ab09333 26
YuuichiAkagawa 0:00fe0ab09333 27 #include "USBHostConf.h"
YuuichiAkagawa 0:00fe0ab09333 28
YuuichiAkagawa 0:00fe0ab09333 29 //#if USBHOST_GAMEPAD
YuuichiAkagawa 0:00fe0ab09333 30
YuuichiAkagawa 0:00fe0ab09333 31 #include "USBHost.h"
YuuichiAkagawa 0:00fe0ab09333 32 //HID Class Request
YuuichiAkagawa 0:00fe0ab09333 33 #define HID_GET_REPORT 0x01
YuuichiAkagawa 0:00fe0ab09333 34 #define HID_GET_IDLE 0x02
YuuichiAkagawa 0:00fe0ab09333 35 #define HID_GET_PROTOCOL 0x03
YuuichiAkagawa 0:00fe0ab09333 36 #define HID_GET_DESCRIPTOR 0x06
YuuichiAkagawa 0:00fe0ab09333 37 #define HID_SET_REPORT 0x09
YuuichiAkagawa 0:00fe0ab09333 38 #define HID_SET_IDLE 0x0a
YuuichiAkagawa 0:00fe0ab09333 39 #define HID_SET_PROTOCOL 0x0b
YuuichiAkagawa 0:00fe0ab09333 40
YuuichiAkagawa 0:00fe0ab09333 41 /**
YuuichiAkagawa 0:00fe0ab09333 42 * A class to communicate a USB MIDI device
YuuichiAkagawa 0:00fe0ab09333 43 */
YuuichiAkagawa 0:00fe0ab09333 44 class USBHostGamepad : public IUSBEnumerator {
YuuichiAkagawa 0:00fe0ab09333 45 public:
YuuichiAkagawa 0:00fe0ab09333 46 /**
YuuichiAkagawa 0:00fe0ab09333 47 * Constructor
YuuichiAkagawa 0:00fe0ab09333 48 */
YuuichiAkagawa 0:00fe0ab09333 49 USBHostGamepad();
YuuichiAkagawa 0:00fe0ab09333 50
YuuichiAkagawa 0:00fe0ab09333 51 /**
YuuichiAkagawa 0:00fe0ab09333 52 * Try to connect a gamepad device
YuuichiAkagawa 0:00fe0ab09333 53 *
YuuichiAkagawa 0:00fe0ab09333 54 * @return true if connection was successful
YuuichiAkagawa 0:00fe0ab09333 55 */
YuuichiAkagawa 0:00fe0ab09333 56 bool connect();
YuuichiAkagawa 0:00fe0ab09333 57
YuuichiAkagawa 0:00fe0ab09333 58 /**
YuuichiAkagawa 0:00fe0ab09333 59 * Check if a gamepad is connected
YuuichiAkagawa 0:00fe0ab09333 60 *
YuuichiAkagawa 0:00fe0ab09333 61 * @returns true if a gamepad is connected
YuuichiAkagawa 0:00fe0ab09333 62 */
YuuichiAkagawa 0:00fe0ab09333 63 bool connected();
YuuichiAkagawa 0:00fe0ab09333 64
YuuichiAkagawa 0:00fe0ab09333 65 /**
YuuichiAkagawa 0:00fe0ab09333 66 * Attach a callback called when a gamepad event is received
YuuichiAkagawa 0:00fe0ab09333 67 *
YuuichiAkagawa 0:00fe0ab09333 68 * @param ptr function pointer
YuuichiAkagawa 0:00fe0ab09333 69 */
YuuichiAkagawa 0:00fe0ab09333 70 inline void attachEvent(void (*ptr)(uint8_t btnX, uint8_t btnY, uint8_t btnABCD, uint8_t btnSpecial)) {
YuuichiAkagawa 0:00fe0ab09333 71 if (ptr != NULL) {
YuuichiAkagawa 0:00fe0ab09333 72 onUpdate = ptr;
YuuichiAkagawa 0:00fe0ab09333 73 }
YuuichiAkagawa 0:00fe0ab09333 74 }
YuuichiAkagawa 0:00fe0ab09333 75
YuuichiAkagawa 0:00fe0ab09333 76 /**
YuuichiAkagawa 0:00fe0ab09333 77 * Request the HID report descriptor
YuuichiAkagawa 0:00fe0ab09333 78 *
YuuichiAkagawa 0:00fe0ab09333 79 * @param dev request the device descriptor on this device
YuuichiAkagawa 0:00fe0ab09333 80 * @param buf buffer to store the device descriptor
YuuichiAkagawa 0:00fe0ab09333 81 * @param max_len_buf maximum size of buf
YuuichiAkagawa 0:00fe0ab09333 82 * @param len_dev_descr pointer to store the length of the packet transferred
YuuichiAkagawa 0:00fe0ab09333 83 */
YuuichiAkagawa 0:00fe0ab09333 84 USB_TYPE getReportDescriptor(USBDeviceConnected * dev, uint8_t * buf, uint16_t max_len_buf, uint16_t * len_rep_descr = NULL);
YuuichiAkagawa 0:00fe0ab09333 85
YuuichiAkagawa 0:00fe0ab09333 86 protected:
YuuichiAkagawa 0:00fe0ab09333 87 //From IUSBEnumerator
YuuichiAkagawa 0:00fe0ab09333 88 virtual void setVidPid(uint16_t vid, uint16_t pid);
YuuichiAkagawa 0:00fe0ab09333 89 virtual bool parseInterface(uint8_t intf_nb, uint8_t intf_class, uint8_t intf_subclass, uint8_t intf_protocol); //Must return true if the interface should be parsed
YuuichiAkagawa 0:00fe0ab09333 90 virtual bool useEndpoint(uint8_t intf_nb, ENDPOINT_TYPE type, ENDPOINT_DIRECTION dir); //Must return true if the endpoint will be used
YuuichiAkagawa 0:00fe0ab09333 91
YuuichiAkagawa 0:00fe0ab09333 92 private:
YuuichiAkagawa 0:00fe0ab09333 93 USBHost * host;
YuuichiAkagawa 0:00fe0ab09333 94 USBDeviceConnected * dev;
YuuichiAkagawa 0:00fe0ab09333 95 USBEndpoint * int_in;
YuuichiAkagawa 0:00fe0ab09333 96 uint8_t report[8];
YuuichiAkagawa 0:00fe0ab09333 97
YuuichiAkagawa 0:00fe0ab09333 98 bool dev_connected;
YuuichiAkagawa 0:00fe0ab09333 99 bool gamepad_device_found;
YuuichiAkagawa 0:00fe0ab09333 100 int gamepad_intf;
YuuichiAkagawa 0:00fe0ab09333 101
YuuichiAkagawa 0:00fe0ab09333 102 uint8_t btnX;
YuuichiAkagawa 0:00fe0ab09333 103 uint8_t btnY;
YuuichiAkagawa 0:00fe0ab09333 104 uint8_t btnABCD;
YuuichiAkagawa 0:00fe0ab09333 105 uint8_t btnSpecial;
YuuichiAkagawa 0:00fe0ab09333 106
YuuichiAkagawa 0:00fe0ab09333 107 void rxHandler();
YuuichiAkagawa 0:00fe0ab09333 108 void (*onUpdate)(uint8_t btnX, uint8_t btnY, uint8_t btnABCD, uint8_t btnSpecial);
YuuichiAkagawa 0:00fe0ab09333 109 int report_id;
YuuichiAkagawa 0:00fe0ab09333 110 void init();
YuuichiAkagawa 0:00fe0ab09333 111 bool parseHidDescr();
YuuichiAkagawa 0:00fe0ab09333 112 };
YuuichiAkagawa 0:00fe0ab09333 113
YuuichiAkagawa 0:00fe0ab09333 114 //#endif
YuuichiAkagawa 0:00fe0ab09333 115
YuuichiAkagawa 0:00fe0ab09333 116 #endif