USB Host Shield 2.0
 All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
XBOXONE.h
Go to the documentation of this file.
1 /* Copyright (C) 2012 Kristian Lauszus, TKJ Electronics. All rights reserved.
2  Copyright (C) 2015 guruthree
3 
4  This software may be distributed and modified under the terms of the GNU
5  General Public License version 2 (GPL2) as published by the Free Software
6  Foundation and appearing in the file GPL2.TXT included in the packaging of
7  this file. Please note that GPL2 Section 2[b] requires that all works based
8  on this software must also be made publicly available under the terms of
9  the GPL2 ("Copyleft").
10 
11  Contact information
12  -------------------
13 
14  Kristian Lauszus, TKJ Electronics
15  Web : http://www.tkjelectronics.com
16  e-mail : kristianl@tkjelectronics.com
17 
18  guruthree
19  Web : https://github.com/guruthree/
20  */
21 
22 
23 #ifndef _xboxone_h_
24 #define _xboxone_h_
25 
26 #include "Usb.h"
27 #include "xboxEnums.h"
28 
29 /* Xbox One data taken from descriptors */
30 #define XBOX_ONE_EP_MAXPKTSIZE 64 // Max size for data via USB
31 
32 /* Names we give to the 3 XboxONE pipes */
33 #define XBOX_ONE_CONTROL_PIPE 0
34 #define XBOX_ONE_OUTPUT_PIPE 1
35 #define XBOX_ONE_INPUT_PIPE 2
36 
37 #define XBOX_ONE_MAX_ENDPOINTS 3
38 
39 // PID and VID of the different versions of the controller - see: https://github.com/torvalds/linux/blob/master/drivers/input/joystick/xpad.c
40 
41 // Official controllers
42 #define XBOX_VID1 0x045E // Microsoft Corporation
43 #define XBOX_ONE_PID1 0x02D1 // Microsoft X-Box One pad
44 #define XBOX_ONE_PID2 0x02DD // Microsoft X-Box One pad (Firmware 2015)
45 #define XBOX_ONE_PID3 0x02E3 // Microsoft X-Box One Elite pad
46 #define XBOX_ONE_PID4 0x02EA // Microsoft X-Box One S pad
47 #define XBOX_ONE_PID13 0x0B0A // Microsoft X-Box One Adaptive Controller
48 
49 // Unofficial controllers
50 #define XBOX_VID2 0x0738 // Mad Catz
51 #define XBOX_VID3 0x0E6F // Afterglow
52 #define XBOX_VID4 0x0F0D // HORIPAD ONE
53 #define XBOX_VID5 0x1532 // Razer
54 #define XBOX_VID6 0x24C6 // PowerA
55 
56 #define XBOX_ONE_PID5 0x4A01 // Mad Catz FightStick TE 2 - might have different mapping for triggers?
57 #define XBOX_ONE_PID6 0x0139 // Afterglow Prismatic Wired Controller
58 #define XBOX_ONE_PID7 0x0146 // Rock Candy Wired Controller for Xbox One
59 #define XBOX_ONE_PID8 0x0067 // HORIPAD ONE
60 #define XBOX_ONE_PID9 0x0A03 // Razer Wildcat
61 #define XBOX_ONE_PID10 0x541A // PowerA Xbox One Mini Wired Controller
62 #define XBOX_ONE_PID11 0x542A // Xbox ONE spectra
63 #define XBOX_ONE_PID12 0x543A // PowerA Xbox One wired controller
64 
66 class XBOXONE : public USBDeviceConfig, public UsbConfigXtracter {
67 public:
72  XBOXONE(USB *pUsb);
73 
82  virtual uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed);
87  virtual uint8_t Release();
92  virtual uint8_t Poll();
93 
98  virtual uint8_t GetAddress() {
99  return bAddress;
100  };
101 
106  virtual bool isReady() {
107  return bPollEnable;
108  };
109 
114  uint8_t readPollInterval() {
115  return pollInterval;
116  };
117 
124  virtual bool VIDPIDOK(uint16_t vid, uint16_t pid) {
125  return ((vid == XBOX_VID1 || vid == XBOX_VID2 || vid == XBOX_VID3 || vid == XBOX_VID4 || vid == XBOX_VID5 || vid == XBOX_VID6) &&
126  (pid == XBOX_ONE_PID1 || pid == XBOX_ONE_PID2 || pid == XBOX_ONE_PID3 || pid == XBOX_ONE_PID4 ||
127  pid == XBOX_ONE_PID5 || pid == XBOX_ONE_PID6 || pid == XBOX_ONE_PID7 || pid == XBOX_ONE_PID8 ||
128  pid == XBOX_ONE_PID9 || pid == XBOX_ONE_PID10 || pid == XBOX_ONE_PID11 || pid == XBOX_ONE_PID12 || pid == XBOX_ONE_PID13));
129  };
143  uint16_t getButtonPress(ButtonEnum b);
144  bool getButtonClick(ButtonEnum b);
145 
151  int16_t getAnalogHat(AnalogHatEnum a);
152 
157  void attachOnInit(void (*funcOnInit)(void)) {
158  pFuncOnInit = funcOnInit;
159  };
160 
162  void setRumbleOff();
163 
171  void setRumbleOn(uint8_t leftTrigger, uint8_t rightTrigger, uint8_t leftMotor, uint8_t rightMotor);
176 
177 protected:
181  uint8_t bAddress;
184 
186  uint8_t bConfNum;
188  uint8_t bNumEP;
190  uint32_t qNextPollTime;
191 
201  void EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep);
209 
210 private:
215  void onInit();
216  void (*pFuncOnInit)(void); // Pointer to function called in onInit()
217 
218  uint8_t pollInterval;
219  bool bPollEnable;
220 
221  /* Variables to store the buttons */
222  uint16_t ButtonState;
223  uint16_t OldButtonState;
224  uint16_t ButtonClickState;
225  int16_t hatValue[4];
226  uint16_t triggerValue[2];
227  uint16_t triggerValueOld[2];
228 
229  bool L2Clicked; // These buttons are analog, so we use we use these bools to check if they where clicked or not
230  bool R2Clicked;
231 
232  uint8_t readBuf[XBOX_ONE_EP_MAXPKTSIZE]; // General purpose buffer for input data
233  uint8_t cmdCounter;
234 
235  void readReport(); // Used to read the incoming data
236 
237  /* Private commands */
238  uint8_t XboxCommand(uint8_t* data, uint16_t nbytes);
239 };
240 #endif
uint8_t bConfNum
Definition: XBOXONE.h:186
#define XBOX_ONE_PID5
Definition: XBOXONE.h:56
#define XBOX_ONE_PID10
Definition: XBOXONE.h:61
#define XBOX_ONE_PID9
Definition: XBOXONE.h:60
virtual bool isReady()
Definition: XBOXONE.h:106
#define XBOX_ONE_EP_MAXPKTSIZE
Definition: XBOXONE.h:30
USB * pUsb
Definition: XBOXONE.h:179
void attachOnInit(void(*funcOnInit)(void))
Definition: XBOXONE.h:157
AnalogHatEnum
uint8_t bAddress
Definition: XBOXONE.h:181
XBOXONE(USB *pUsb)
Definition: XBOXONE.cpp:27
#define XBOX_VID3
Definition: XBOXONE.h:51
void EndpointXtract(uint8_t conf, uint8_t iface, uint8_t alt, uint8_t proto, const USB_ENDPOINT_DESCRIPTOR *ep)
Definition: XBOXONE.cpp:239
uint8_t bNumEP
Definition: XBOXONE.h:188
#define XBOX_VID6
Definition: XBOXONE.h:54
void PrintEndpointDescriptor(const USB_ENDPOINT_DESCRIPTOR *ep_ptr)
Definition: XBOXONE.cpp:265
bool XboxOneConnected
Definition: XBOXONE.h:175
#define XBOX_ONE_MAX_ENDPOINTS
Definition: XBOXONE.h:37
#define XBOX_VID2
Definition: XBOXONE.h:50
void setRumbleOff()
Definition: XBOXONE.cpp:450
#define XBOX_ONE_PID8
Definition: XBOXONE.h:59
virtual uint8_t Release()
Definition: XBOXONE.cpp:286
#define XBOX_VID4
Definition: XBOXONE.h:52
Definition: address.h:39
ButtonEnum
uint16_t getButtonPress(ButtonEnum b)
Definition: XBOXONE.cpp:380
virtual uint8_t GetAddress()
Definition: XBOXONE.h:98
uint32_t qNextPollTime
Definition: XBOXONE.h:190
#define XBOX_ONE_PID2
Definition: XBOXONE.h:44
EpInfo epInfo[XBOX_ONE_MAX_ENDPOINTS]
Definition: XBOXONE.h:183
bool getButtonClick(ButtonEnum b)
Definition: XBOXONE.cpp:388
uint8_t readPollInterval()
Definition: XBOXONE.h:114
virtual uint8_t Poll()
Definition: XBOXONE.cpp:300
#define XBOX_ONE_PID11
Definition: XBOXONE.h:62
#define XBOX_ONE_PID4
Definition: XBOXONE.h:46
virtual uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed)
Definition: XBOXONE.cpp:46
#define XBOX_ONE_PID7
Definition: XBOXONE.h:58
#define XBOX_ONE_PID13
Definition: XBOXONE.h:47
#define XBOX_ONE_PID12
Definition: XBOXONE.h:63
Definition: UsbCore.h:210
#define XBOX_VID5
Definition: XBOXONE.h:53
#define XBOX_ONE_PID6
Definition: XBOXONE.h:57
int16_t getAnalogHat(AnalogHatEnum a)
Definition: XBOXONE.cpp:408
#define XBOX_VID1
Definition: XBOXONE.h:42
#define XBOX_ONE_PID1
Definition: XBOXONE.h:43
#define XBOX_ONE_PID3
Definition: XBOXONE.h:45
virtual bool VIDPIDOK(uint16_t vid, uint16_t pid)
Definition: XBOXONE.h:124
void setRumbleOn(uint8_t leftTrigger, uint8_t rightTrigger, uint8_t leftMotor, uint8_t rightMotor)
Definition: XBOXONE.cpp:472