USB Host Shield 2.0
XBOXRECV.h
Go to the documentation of this file.
1 /* Copyright (C) 2012 Kristian Lauszus, TKJ Electronics. All rights reserved.
2 
3  This software may be distributed and modified under the terms of the GNU
4  General Public License version 2 (GPL2) as published by the Free Software
5  Foundation and appearing in the file GPL2.TXT included in the packaging of
6  this file. Please note that GPL2 Section 2[b] requires that all works based
7  on this software must also be made publicly available under the terms of
8  the GPL2 ("Copyleft").
9 
10  Contact information
11  -------------------
12 
13  Kristian Lauszus, TKJ Electronics
14  Web : http://www.tkjelectronics.com
15  e-mail : kristianl@tkjelectronics.com
16 
17  getBatteryLevel and checkStatus functions made by timstamp.co.uk found using BusHound from Perisoft.net
18  */
19 
20 #ifndef _xboxrecv_h_
21 #define _xboxrecv_h_
22 
23 #include "Usb.h"
24 #include "xboxEnums.h"
25 
26 /* Data Xbox 360 taken from descriptors */
27 #define EP_MAXPKTSIZE 32 // max size for data via USB
28 
29 /* Names we give to the 9 Xbox360 pipes */
30 #define XBOX_CONTROL_PIPE 0
31 #define XBOX_INPUT_PIPE_1 1
32 #define XBOX_OUTPUT_PIPE_1 2
33 #define XBOX_INPUT_PIPE_2 3
34 #define XBOX_OUTPUT_PIPE_2 4
35 #define XBOX_INPUT_PIPE_3 5
36 #define XBOX_OUTPUT_PIPE_3 6
37 #define XBOX_INPUT_PIPE_4 7
38 #define XBOX_OUTPUT_PIPE_4 8
39 
40 // PID and VID of the different devices
41 #define XBOX_VID 0x045E // Microsoft Corporation
42 #define MADCATZ_VID 0x1BAD // For unofficial Mad Catz receivers
43 #define JOYTECH_VID 0x162E // For unofficial Joytech controllers
44 
45 #define XBOX_WIRELESS_RECEIVER_PID_1 0x0719 // Microsoft Wireless Gaming Receiver
46 #define XBOX_WIRELESS_RECEIVER_PID_2 0x02A9 // Microsoft Wireless Gaming Receiver
47 #define XBOX_WIRELESS_RECEIVER_THIRD_PARTY_PID 0x0291 // Third party Wireless Gaming Receiver
48 
49 #define XBOX_MAX_ENDPOINTS 9
50 
56 class XBOXRECV : public USBDeviceConfig {
57 public:
62  XBOXRECV(USB *pUsb);
63 
72  uint8_t ConfigureDevice(uint8_t parent, uint8_t port, bool lowspeed);
80  uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed);
85  uint8_t Release();
90  uint8_t Poll();
91 
96  virtual uint8_t GetAddress() {
97  return bAddress;
98  };
99 
104  virtual bool isReady() {
105  return bPollEnable;
106  };
107 
114  virtual bool VIDPIDOK(uint16_t vid, uint16_t pid) {
115  return ((vid == XBOX_VID || vid == MADCATZ_VID || vid == JOYTECH_VID) && (pid == XBOX_WIRELESS_RECEIVER_PID_1 || pid == XBOX_WIRELESS_RECEIVER_PID_2 || pid == XBOX_WIRELESS_RECEIVER_THIRD_PARTY_PID));
116  };
131  uint8_t getButtonPress(ButtonEnum b, uint8_t controller = 0);
132  bool getButtonClick(ButtonEnum b, uint8_t controller = 0);
142  int16_t getAnalogHat(AnalogHatEnum a, uint8_t controller = 0);
143 
148  void disconnect(uint8_t controller = 0);
149 
154  void setAllOff(uint8_t controller = 0) {
155  setRumbleOn(0, 0, controller);
156  setLedOff(controller);
157  };
158 
163  void setRumbleOff(uint8_t controller = 0) {
164  setRumbleOn(0, 0, controller);
165  };
172  void setRumbleOn(uint8_t lValue, uint8_t rValue, uint8_t controller = 0);
180  void setLedRaw(uint8_t value, uint8_t controller = 0);
181 
186  void setLedOff(uint8_t controller = 0) {
187  setLedRaw(0, controller);
188  };
194  void setLedOn(LEDEnum l, uint8_t controller = 0);
200  void setLedBlink(LEDEnum l, uint8_t controller = 0);
206  void setLedMode(LEDModeEnum lm, uint8_t controller = 0);
212  uint8_t getBatteryLevel(uint8_t controller = 0);
218  bool buttonChanged(uint8_t controller = 0);
219 
224  void attachOnInit(void (*funcOnInit)(void)) {
225  pFuncOnInit = funcOnInit;
226  };
232  uint8_t Xbox360Connected[4];
233 
234 protected:
238  uint8_t bAddress;
241 
242 private:
249  void onInit(uint8_t controller);
250  void (*pFuncOnInit)(void); // Pointer to function called in onInit()
251 
252  bool bPollEnable;
253 
254  /* Variables to store the buttons */
255  uint32_t ButtonState[4];
256  uint32_t OldButtonState[4];
257  uint16_t ButtonClickState[4];
258  int16_t hatValue[4][4];
259  uint16_t controllerStatus[4];
260  bool buttonStateChanged[4]; // True if a button has changed
261 
262  bool L2Clicked[4]; // These buttons are analog, so we use we use these bools to check if they where clicked or not
263  bool R2Clicked[4];
264 
265  uint32_t checkStatusTimer; // Timing for checkStatus() signals
266 
267  uint8_t readBuf[EP_MAXPKTSIZE]; // General purpose buffer for input data
268  uint8_t writeBuf[7]; // General purpose buffer for output data
269 
270  void readReport(uint8_t controller); // read incoming data
271  void printReport(uint8_t controller, uint8_t nBytes); // print incoming date - Uncomment for debugging
272 
273  /* Private commands */
274  void XboxCommand(uint8_t controller, uint8_t* data, uint16_t nbytes);
275  void checkStatus();
276 };
277 #endif
XBOXRECV::getButtonClick
bool getButtonClick(ButtonEnum b, uint8_t controller=0)
Definition: XBOXRECV.cpp:419
USBDeviceConfig
Definition: UsbCore.h:136
XBOXRECV
Definition: XBOXRECV.h:56
XBOX_WIRELESS_RECEIVER_PID_2
#define XBOX_WIRELESS_RECEIVER_PID_2
Definition: XBOXRECV.h:46
XBOXRECV::setLedOn
void setLedOn(LEDEnum l, uint8_t controller=0)
Definition: XBOXRECV.cpp:518
XBOXRECV::getButtonPress
uint8_t getButtonPress(ButtonEnum b, uint8_t controller=0)
Definition: XBOXRECV.cpp:410
XBOX_VID
#define XBOX_VID
Definition: XBOXRECV.h:41
XBOXRECV::setLedBlink
void setLedBlink(LEDEnum l, uint8_t controller=0)
Definition: XBOXRECV.cpp:525
XBOXRECV::getBatteryLevel
uint8_t getBatteryLevel(uint8_t controller=0)
Definition: XBOXRECV.cpp:469
XBOXRECV::setLedRaw
void setLedRaw(uint8_t value, uint8_t controller=0)
Definition: XBOXRECV.cpp:509
XBOXRECV::XBOXRECV
XBOXRECV(USB *pUsb)
Definition: XBOXRECV.cpp:25
XBOXRECV::Init
uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed)
Definition: XBOXRECV.cpp:138
LEDEnum
LEDEnum
Definition: controllerEnums.h:31
XBOXRECV::epInfo
EpInfo epInfo[XBOX_MAX_ENDPOINTS]
Definition: XBOXRECV.h:240
XBOXRECV::Poll
uint8_t Poll()
Definition: XBOXRECV.cpp:293
XBOXRECV::attachOnInit
void attachOnInit(void(*funcOnInit)(void))
Definition: XBOXRECV.h:224
XBOXRECV::setRumbleOn
void setRumbleOn(uint8_t lValue, uint8_t rValue, uint8_t controller=0)
Definition: XBOXRECV.cpp:559
XBOXRECV::setLedOff
void setLedOff(uint8_t controller=0)
Definition: XBOXRECV.h:186
XBOXRECV::GetAddress
virtual uint8_t GetAddress()
Definition: XBOXRECV.h:96
EpInfo
Definition: address.h:39
XBOXRECV::setLedMode
void setLedMode(LEDModeEnum lm, uint8_t controller=0)
Definition: XBOXRECV.cpp:529
XBOX_WIRELESS_RECEIVER_PID_1
#define XBOX_WIRELESS_RECEIVER_PID_1
Definition: XBOXRECV.h:45
XBOXRECV::disconnect
void disconnect(uint8_t controller=0)
Definition: XBOXRECV.cpp:500
USB
Definition: UsbCore.h:212
XBOXRECV::pUsb
USB * pUsb
Definition: XBOXRECV.h:236
XBOXRECV::setRumbleOff
void setRumbleOff(uint8_t controller=0)
Definition: XBOXRECV.h:163
XBOXRECV::VIDPIDOK
virtual bool VIDPIDOK(uint16_t vid, uint16_t pid)
Definition: XBOXRECV.h:114
XBOX_MAX_ENDPOINTS
#define XBOX_MAX_ENDPOINTS
Definition: XBOXRECV.h:49
XBOXRECV::buttonChanged
bool buttonChanged(uint8_t controller=0)
Definition: XBOXRECV.cpp:444
XBOXRECV::isReady
virtual bool isReady()
Definition: XBOXRECV.h:104
EP_MAXPKTSIZE
#define EP_MAXPKTSIZE
Definition: XBOXRECV.h:27
XBOXRECV::bAddress
uint8_t bAddress
Definition: XBOXRECV.h:238
XBOXRECV::Xbox360Connected
uint8_t Xbox360Connected[4]
Definition: XBOXRECV.h:232
XBOX_WIRELESS_RECEIVER_THIRD_PARTY_PID
#define XBOX_WIRELESS_RECEIVER_THIRD_PARTY_PID
Definition: XBOXRECV.h:47
JOYTECH_VID
#define JOYTECH_VID
Definition: XBOXRECV.h:43
XBOXRECV::Release
uint8_t Release()
Definition: XBOXRECV.cpp:283
Usb.h
LEDModeEnum
LEDModeEnum
Definition: xboxEnums.h:24
XBOXRECV::XboxReceiverConnected
bool XboxReceiverConnected
Definition: XBOXRECV.h:226
XBOXRECV::ConfigureDevice
uint8_t ConfigureDevice(uint8_t parent, uint8_t port, bool lowspeed)
Definition: XBOXRECV.cpp:41
ButtonEnum
ButtonEnum
Definition: controllerEnums.h:78
MADCATZ_VID
#define MADCATZ_VID
Definition: XBOXRECV.h:42
AnalogHatEnum
AnalogHatEnum
Definition: controllerEnums.h:218
xboxEnums.h
XBOXRECV::setAllOff
void setAllOff(uint8_t controller=0)
Definition: XBOXRECV.h:154
XBOXRECV::getAnalogHat
int16_t getAnalogHat(AnalogHatEnum a, uint8_t controller=0)
Definition: XBOXRECV.cpp:440