USB Host Shield 2.0
 All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
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 /* Endpoint types */
30 #define EP_INTERRUPT 0x03
31 
32 /* Names we give to the 9 Xbox360 pipes */
33 #define XBOX_CONTROL_PIPE 0
34 #define XBOX_INPUT_PIPE_1 1
35 #define XBOX_OUTPUT_PIPE_1 2
36 #define XBOX_INPUT_PIPE_2 3
37 #define XBOX_OUTPUT_PIPE_2 4
38 #define XBOX_INPUT_PIPE_3 5
39 #define XBOX_OUTPUT_PIPE_3 6
40 #define XBOX_INPUT_PIPE_4 7
41 #define XBOX_OUTPUT_PIPE_4 8
42 
43 // PID and VID of the different devices
44 #define XBOX_VID 0x045E // Microsoft Corporation
45 #define MADCATZ_VID 0x1BAD // For unofficial Mad Catz receivers
46 #define JOYTECH_VID 0x162E // For unofficial Joytech controllers
47 
48 #define XBOX_WIRELESS_RECEIVER_PID 0x0719 // Microsoft Wireless Gaming Receiver
49 #define XBOX_WIRELESS_RECEIVER_THIRD_PARTY_PID 0x0291 // Third party Wireless Gaming Receiver
50 
51 #define XBOX_MAX_ENDPOINTS 9
52 
58 class XBOXRECV : public USBDeviceConfig {
59 public:
64  XBOXRECV(USB *pUsb);
65 
74  virtual uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed);
79  virtual uint8_t Release();
84  virtual uint8_t Poll();
85 
90  virtual uint8_t GetAddress() {
91  return bAddress;
92  };
93 
98  virtual bool isReady() {
99  return bPollEnable;
100  };
101 
108  virtual boolean VIDPIDOK(uint16_t vid, uint16_t pid) {
109  return ((vid == XBOX_VID || vid == MADCATZ_VID || vid == JOYTECH_VID) && (pid == XBOX_WIRELESS_RECEIVER_PID || pid == XBOX_WIRELESS_RECEIVER_THIRD_PARTY_PID));
110  };
126  uint8_t getButtonPress(Button b, uint8_t controller = 0);
127  bool getButtonClick(Button b, uint8_t controller = 0);
137  int16_t getAnalogHat(AnalogHat a, uint8_t controller = 0);
138 
143  void setAllOff(uint8_t controller = 0) {
144  setRumbleOn(0, 0, controller);
145  setLedOff(controller);
146  };
147 
152  void setRumbleOff(uint8_t controller = 0) {
153  setRumbleOn(0, 0, controller);
154  };
161  void setRumbleOn(uint8_t lValue, uint8_t rValue, uint8_t controller = 0);
169  void setLedRaw(uint8_t value, uint8_t controller = 0);
170 
175  void setLedOff(uint8_t controller = 0) {
176  setLedRaw(0, controller);
177  };
183  void setLedOn(LED l, uint8_t controller = 0);
189  void setLedBlink(LED l, uint8_t controller = 0);
195  void setLedMode(LEDMode lm, uint8_t controller = 0);
201  uint8_t getBatteryLevel(uint8_t controller = 0);
207  bool buttonChanged(uint8_t controller = 0);
208 
213  void attachOnInit(void (*funcOnInit)(void)) {
214  pFuncOnInit = funcOnInit;
215  };
221  uint8_t Xbox360Connected[4];
222 
223 protected:
227  uint8_t bAddress;
230 
231 private:
238  void onInit(uint8_t controller);
239  void (*pFuncOnInit)(void); // Pointer to function called in onInit()
240 
241  bool bPollEnable;
242 
243  /* Variables to store the buttons */
244  uint32_t ButtonState[4];
245  uint32_t OldButtonState[4];
246  uint16_t ButtonClickState[4];
247  int16_t hatValue[4][4];
248  uint16_t controllerStatus[4];
249  bool buttonStateChanged[4]; // True if a button has changed
250 
251  bool L2Clicked[4]; // These buttons are analog, so we use we use these bools to check if they where clicked or not
252  bool R2Clicked[4];
253 
254  unsigned long timer; // Timing for checkStatus() signals
255 
256  uint8_t readBuf[EP_MAXPKTSIZE]; // General purpose buffer for input data
257  uint8_t writeBuf[7]; // General purpose buffer for output data
258 
259  void readReport(uint8_t controller); // read incoming data
260  void printReport(uint8_t controller, uint8_t nBytes); // print incoming date - Uncomment for debugging
261 
262  /* Private commands */
263  void XboxCommand(uint8_t controller, uint8_t* data, uint16_t nbytes);
264  void checkStatus();
265 };
266 #endif
#define XBOX_WIRELESS_RECEIVER_THIRD_PARTY_PID
Definition: XBOXRECV.h:49
bool getButtonClick(Button b, uint8_t controller=0)
Definition: XBOXRECV.cpp:391
virtual uint8_t Poll()
Definition: XBOXRECV.cpp:266
void setRumbleOn(uint8_t lValue, uint8_t rValue, uint8_t controller=0)
Definition: XBOXRECV.cpp:512
#define XBOX_WIRELESS_RECEIVER_PID
Definition: XBOXRECV.h:48
uint8_t bAddress
Definition: XBOXRECV.h:227
void setLedOff(uint8_t controller=0)
Definition: XBOXRECV.h:175
#define EP_MAXPKTSIZE
Definition: XBOXRECV.h:27
virtual uint8_t GetAddress()
Definition: XBOXRECV.h:90
uint8_t Xbox360Connected[4]
Definition: XBOXRECV.h:221
bool buttonChanged(uint8_t controller=0)
Definition: XBOXRECV.cpp:415
void setRumbleOff(uint8_t controller=0)
Definition: XBOXRECV.h:152
virtual bool isReady()
Definition: XBOXRECV.h:98
#define XBOX_VID
Definition: XBOXRECV.h:44
void setAllOff(uint8_t controller=0)
Definition: XBOXRECV.h:143
virtual uint8_t Release()
Definition: XBOXRECV.cpp:256
Definition: address.h:32
bool XboxReceiverConnected
Definition: XBOXRECV.h:215
void setLedBlink(LED l, uint8_t controller=0)
Definition: XBOXRECV.cpp:478
void setLedOn(LED l, uint8_t controller=0)
Definition: XBOXRECV.cpp:473
uint8_t getBatteryLevel(uint8_t controller=0)
Definition: XBOXRECV.cpp:440
LEDMode
Definition: xboxEnums.h:24
XBOXRECV(USB *pUsb)
Definition: XBOXRECV.cpp:25
#define JOYTECH_VID
Definition: XBOXRECV.h:46
void setLedMode(LEDMode lm, uint8_t controller=0)
Definition: XBOXRECV.cpp:482
virtual uint8_t Init(uint8_t parent, uint8_t port, bool lowspeed)
Definition: XBOXRECV.cpp:40
#define MADCATZ_VID
Definition: XBOXRECV.h:45
void setLedRaw(uint8_t value, uint8_t controller=0)
Definition: XBOXRECV.cpp:464
virtual boolean VIDPIDOK(uint16_t vid, uint16_t pid)
Definition: XBOXRECV.h:108
int16_t getAnalogHat(AnalogHat a, uint8_t controller=0)
Definition: XBOXRECV.cpp:411
Button
Definition: UsbCore.h:152
void attachOnInit(void(*funcOnInit)(void))
Definition: XBOXRECV.h:213
uint8_t getButtonPress(Button b, uint8_t controller=0)
Definition: XBOXRECV.cpp:383
AnalogHat
USB * pUsb
Definition: XBOXRECV.h:225
EpInfo epInfo[XBOX_MAX_ENDPOINTS]
Definition: XBOXRECV.h:229
#define XBOX_MAX_ENDPOINTS
Definition: XBOXRECV.h:51