55 #include <sys/types.h> 58 #include <sys/ioctl.h> 73 #include <libusb-1.0/libusb.h> 75 #include "rnr/rnrconfig.h" 216 #define MICROSOFT_VENDOR_ID 0x045e 219 #define XBOX360_WIRED_PROD_ID 0x028e 222 #define XBOX360_TETHERED_PROD_ID 0x028f 225 #define XBOX360_WIRELESS_PROD_ID 0x0719 226 #define XBOX360_WIRELESS_WIN_PROD_ID 0x0291 229 #define XBOX360_NO_PROD_ID 0x0000 232 #define XBOX360_READ_ENDPOINT 0x81 235 #define XBOX360_WRITE_ENDPOINT 0x01 238 #define XBOX360_NUM_OF_INTERFACES 4 241 #define XBOX_LIBUSB_DEBUG_OFF 0 242 #define XBOX_LIBUSB_DEBUG_ERROR 1
243 #define XBOX_LIBUSB_DEBUG_WARN 2
244 #define XBOX_LIBUSB_DEBUG_INFO 3
245 #define XBOX_LIBUSB_DEBUG_DFT XBOX_LIBUSB_DEBUG_OFF
263 #define XBOX360_MSG_OFFSET_DFT 0 264 #define XBOX360_MSG_OFFSET_W 0
265 #define XBOX360_MSG_OFFSET_WL 4
266 #define XBOX360_WL_PKT_HDR_LEN XBOX360_MSG_OFFSET_WL
277 #define XBOX360_WL_LINK_PKT_LEN 2 278 #define XBOX360_WL_NORM_PKT_LEN 29
283 #define XBOX360_WL_PKT_TYPE_POS 0 284 #define XBOX360_WL_PKT_TYPE_NORM 0x00
285 #define XBOX360_WL_PKT_TYPE_CHG 0x08
286 #define XBOX360_WL_PKT_TYPE_20 0x20
287 #define XBOX360_WL_PKT_TYPE_40 0x40
288 #define XBOX360_WL_PKT_TYPE_60 0x40
289 #define XBOX360_WL_PKT_TYPE_80 0x80
292 #define XBOX360_WL_PKT_TYPE_C0 0xc0
302 #define XBOX360_WL_LINK_STATUS_POS 1 303 #define XBOX360_WL_LINK_STATUS_NO_LINK 0x00
304 #define XBOX360_WL_LINK_STATUS_HEADSET 0x40
305 #define XBOX360_WL_LINK_STATUS_CTLR 0x80
306 #define XBOX360_WL_LINK_STATUS_CTLR_HEADSET 0xc0
314 #define XBOX360_WL_ANN_PAT_1 0x0f 315 #define XBOX360_WL_ANN_PAT_2 0x00
316 #define XBOX360_WL_ANN_PAT_3 0xf0
317 #define XBOX360_WL_ANN_SN_POS 7
318 #define XBOX360_WL_ANN_SN_LEN 7
319 #define XBOX360_WL_ANN_BATT_POS 17
320 #define XBOX360_WL_ANN_BATT_LEN 1
328 #define XBOX360_WL_BATT_PAT_1 0x00 329 #define XBOX360_WL_BATT_PAT_2 0x00
330 #define XBOX360_WL_BATT_PAT_3 0x13
331 #define XBOX360_WL_BATT_BATT_POS 4
332 #define XBOX360_WL_BATT_BATT_LEN 1
345 #define XBOX360_WL_NULL_PAT_1 0x00 346 #define XBOX360_WL_NULL_PAT_2 0x00
347 #define XBOX360_WL_NULL_PAT_3_00 0x00
348 #define XBOX360_WL_NULL_PAT_3_10 0x10
349 #define XBOX360_WL_NULL_PAT_3_20 0x20
350 #define XBOX360_WL_NULL_PAT_3_40 0x40
351 #define XBOX360_WL_NULL_PAT_3_ACK 0xf0
359 #define XBOX360_WL_BTTN_PAT_1 0x01 360 #define XBOX360_WL_BTTN_PAT_2 0x00
361 #define XBOX360_WL_BTTN_PAT_3 0xf0
369 #define XBOX360_WL_RUMBLE_PAT_1 0x01 370 #define XBOX360_WL_RUMBLE_PAT_2 0x0f
371 #define XBOX360_WL_RUMBLE_PAT_3 0xc0
379 #define XBOX360_WL_LED_PAT_1 0x00 380 #define XBOX360_WL_LED_PAT_2 0x08
381 #define XBOX360_WL_LED_PAT_3 0x40
390 #define XBOX360_WL_F8_PAT_1 0xf8 391 #define XBOX360_WL_F8_PAT_2_1 0x01
392 #define XBOX360_WL_F8_PAT_2_2 0x02
393 #define XBOX360_WL_F8_PAT_2_3 0x03
394 #define XBOX360_WL_F8_PAT_3 0x00
403 #define XBOX360_WL_32_PAT_1 0x32 404 #define XBOX360_WL_32_PAT_2 0x00
405 #define XBOX360_WL_32_PAT_3 0x00
422 #define XBOX360_MSG_TYPE_POS 0 423 #define XBOX360_MSG_LEN_POS 1
436 #define XBOX360_BTTN_MSG_TYPE 0x00 437 #define XBOX360_BTTN_MSG_LEN 20
438 #define XBOX360_WL_BTTN_MSG_LEN 19
439 #define XBOX360_BTTN_MSG_MIN_LEN XBOX360_WL_BTTN_MSG_LEN // length
442 #define XBOX360_BTTN_PAD_UP_POS 2 443 #define XBOX360_BTTN_PAD_UP_MASK 0x01
445 #define XBOX360_BTTN_PAD_DOWN_POS 2 446 #define XBOX360_BTTN_PAD_DOWN_MASK 0x02
448 #define XBOX360_BTTN_PAD_LEFT_POS 2 449 #define XBOX360_BTTN_PAD_LEFT_MASK 0x04
451 #define XBOX360_BTTN_PAD_RIGHT_POS 2 452 #define XBOX360_BTTN_PAD_RIGHT_MASK 0x08
455 #define XBOX360_BTTN_START_POS 2 456 #define XBOX360_BTTN_START_MASK 0x10
459 #define XBOX360_BTTN_BACK_POS 2 460 #define XBOX360_BTTN_BACK_MASK 0x20
463 #define XBOX360_BTTN_LEFT_STICK_CLICK_POS 2 464 #define XBOX360_BTTN_LEFT_STICK_CLICK_MASK 0x40
467 #define XBOX360_BTTN_RIGHT_STICK_CLICK_POS 2 468 #define XBOX360_BTTN_RIGHT_STICK_CLICK_MASK 0x80
471 #define XBOX360_BTTN_LEFT_BUMP_POS 3 472 #define XBOX360_BTTN_LEFT_BUMP_MASK 0x01
475 #define XBOX360_BTTN_RIGHT_BUMP_POS 3 476 #define XBOX360_BTTN_RIGHT_BUMP_MASK 0x02
479 #define XBOX360_BTTN_CENTER_X_POS 3 480 #define XBOX360_BTTN_CENTER_X_MASK 0x04
483 #define XBOX360_BTTN_A_BUTTON_POS 3 484 #define XBOX360_BTTN_A_BUTTON_MASK 0x10
487 #define XBOX360_BTTN_B_BUTTON_POS 3 488 #define XBOX360_BTTN_B_BUTTON_MASK 0x20
491 #define XBOX360_BTTN_X_BUTTON_POS 3 492 #define XBOX360_BTTN_X_BUTTON_MASK 0x40
495 #define XBOX360_BTTN_Y_BUTTON_POS 3 496 #define XBOX360_BTTN_Y_BUTTON_MASK 0x80
499 #define XBOX360_BTTN_LEFT_TRIGGER_POS 4 500 #define XBOX360_BTTN_LEFT_TRIGGER_MASK 0xff
503 #define XBOX360_BTTN_RIGHT_TRIGGER_POS 5 504 #define XBOX360_BTTN_RIGHT_TRIGGER_MASK 0xff
506 #define XBOX360_TRIGGER_MIN 0 507 #define XBOX360_TRIGGER_MAX 255
510 #define XBOX360_BTTN_LEFT_X_POS_L 6 511 #define XBOX360_BTTN_LEFT_X_POS_H 7
512 #define XBOX360_BTTN_LEFT_X_MASK 0xffff
514 #define XBOX360_BTTN_LEFT_Y_POS_L 8 515 #define XBOX360_BTTN_LEFT_Y_POS_H 9
516 #define XBOX360_BTTN_LEFT_Y_MASK 0xffff
519 #define XBOX360_BTTN_RIGHT_X_POS_L 10 520 #define XBOX360_BTTN_RIGHT_X_POS_H 11
521 #define XBOX360_BTTN_RIGHT_X_MASK 0xffff
523 #define XBOX360_BTTN_RIGHT_Y_POS_L 12 524 #define XBOX360_BTTN_RIGHT_Y_POS_H 13
525 #define XBOX360_BTTN_RIGHT_Y_MASK 0xffff
527 #define XBOX360_JOY_MIN -32767 528 #define XBOX360_JOY_MAX 32767
533 #define XBOX360_RUMBLE_MSG_TYPE 0x00 534 #define XBOX360_RUMBLE_MSG_LEN 8
536 #define XBOX360_RUMBLE_ZERO_2 2 539 #define XBOX360_RUMBLE_LEFT_POS 3 540 #define XBOX360_RUMBLE_LEFT_MASK 0xff
541 #define XBOX360_RUMBLE_LEFT_MAX 255
544 #define XBOX360_RUMBLE_RIGHT_POS 4 545 #define XBOX360_RUMBLE_RIGHT_MASK 0xff
546 #define XBOX360_RUMBLE_RIGHT_MAX 255
549 #define XBOX360_RUMBLE_ZERO_5 5 550 #define XBOX360_RUMBLE_ZERO_6 6
551 #define XBOX360_RUMBLE_ZERO_7 7
559 #define XBOX360_LED_MSG_TYPE 0x01 560 #define XBOX360_LED_MSG_LEN 3
561 #define XBOX360_LED_PAT_POS 2
564 #define XBOX360_WL_LED_MSG_TYPE 0x00 565 #define XBOX360_WL_LED_MSG_LEN 8
566 #define XBOX360_WL_LED_PAT_POS 3
569 #define XBOX360_LED_PAT_MASK 0x0f 570 #define XBOX360_LED_PAT_ALL_OFF 0
571 #define XBOX360_LED_PAT_ALL_BLINK_ON_1 1
572 #define XBOX360_LED_PAT_1_BLINK_ON 2
573 #define XBOX360_LED_PAT_2_BLINK_ON 3
574 #define XBOX360_LED_PAT_3_BLINK_ON 4
575 #define XBOX360_LED_PAT_4_BLINK_ON 5
576 #define XBOX360_LED_PAT_1_ON 6
577 #define XBOX360_LED_PAT_2_ON 7
578 #define XBOX360_LED_PAT_3_ON 8
579 #define XBOX360_LED_PAT_4_ON 9
580 #define XBOX360_LED_PAT_ALL_SPIN 10
581 #define XBOX360_LED_PAT_4_BLINK_ON_L 11
582 #define XBOX360_LED_PAT_4_BLINK 12
583 #define XBOX360_LED_PAT_ALL_SPIN_2 13
585 #define XBOX360_LED_PAT_ALL_BLINK 14
586 #define XBOX360_LED_PAT_NUMOF 15
601 #define XBOX360_LEFT_DEAD_ZONE ((int)(0.25 * XBOX360_JOY_MAX)) 604 #define XBOX360_RIGHT_DEAD_ZONE ((int)(0.25 * XBOX360_JOY_MAX)) 722 FeatMap_T::iterator pos;
793 return nError < 0? libusb_error_name(nError):
"Ok";
822 virtual int run(
float hz=30.0);
865 int setRumble(
int nLeftMot,
int nRightMot);
913 int nErrorRcvTh = NErrorRcvThDft,
914 int nErrorTotalTh = NErrorTotalThDft)
929 m_nProdId == XBOX360_WIRELESS_WIN_PROD_ID;
1135 m_nErrorRcvTimeout = 0;
1157 memset(m_state, 0,
sizeof(m_state));
1209 pthread_mutex_lock(&m_mutexUpdate);
1222 pthread_mutex_unlock(&m_mutexUpdate);
1257 struct libusb_transfer *transfer)
1260 transfer->actual_length);
1273 const std::string &strEoR=
"\n");
1279 #endif // _HIDXBOX360_H static void transferCallbackGoad(struct libusb_transfer *transfer)
Write packet to force a response packet from the Xbox360.
virtual int close()
Close connection to an opened USB Xbox360 controller.
struct libusb_transfer * m_usbTransfer
allocated transfer packet
int createUpdateThread()
Create USB update thread.
void flushInput()
Flush any pending input transfer buffers.
UsbPkt_T m_usbPkt[UsbPktIdNumOf]
USB transfer packets.
virtual int open()
Open connection to an USB Xbox360 controller.
void freeTransferPkts()
Free all USB transfer packets.
rumble (write) transfer packet
void debugPrintState()
Simple debug print state.
void clearErrorCnts()
Clear error counts.
void unlock()
Unlock the update thread.
static const int UsbTransferBufSize
Transfer buffer maximum byte size.
void signalUpdateThread()
Signal update thread of change of state.
void debugPrintTransferBuf(const std::string &strPreface, struct libusb_transfer *transfer)
Debug print USB transfer buffer contents.
std::string m_strProdName
product name
void zeroState()
Zero controller shadowed state.
float m_fRightJoyB
right joystick y intercept
#define HID_BTTN_UP
button/key state is up or unpressed
virtual void * getCurrentState()
Get the current full state of the device.
bool m_bCancel
do [not] cancel submissions
int initTransferPkts()
Allocate and initialize all USB transfer packets.
int m_nProdId
Xbox USB product id.
void lock()
Lock update thread.
int m_nErrorSend
consec send error count
int m_nRightRumble
target right rumble intensity
virtual bool ping()
Ping device if it is connected and is responding.
pthread_mutex_t m_mutexUpdate
mutex
static void transferCallbackRumble(struct libusb_transfer *transfer)
Write rumble motor values transfer function callback.
float m_fLeftJoyB
left joystick y intercept
float m_fRightJoyM
right joystick slope
Common Human Interface Device Interface.
float m_fLeftJoyM
left joystick slope
normal input (read) transfer packet
center x (big button) [0,1]
static const int NErrorTotalThDft
Total receive errors threshold default.
int openXbox()
Open Xbox360 connection.
int convertToInt(byte_t lsb, byte_t msb)
Convert two bytes to signed integer.
void setErrorThresholds(int nErrorRcvTimeoutTh=NErrorRcvTimeoutThDft, int nErrorRcvTh=NErrorRcvThDft, int nErrorTotalTh=NErrorTotalThDft)
Set error count thresholds.
void goad()
Goad the Xbox360 to send a message.
USB application packet transfer structure.
void debugPrintHdr()
Simple debug print header.
virtual const char * getStrError(int nError) const
Get the string associated with the error number.
LED (write) transfer packet.
bool checkErrorThresholds()
Check errors against thresholds.
int m_nRightJoyDeadZone
right joystick deadzone
int m_nOffset
start offset in message
virtual int stop()
Stop and destroy USB update thread.
int setRumble(int nLeftMot, int nRightMot)
Set the rumble instensity.
#define HID_BTTN_DOWN
button/key state is down or pressed
bool m_bHasSubmitted
has [not] been submitted
bool isWireless()
Check if Xbox360 hardware is wireless.
void updateLEDState(byte_t buf[], ssize_t n)
Update the LED pattern state.
right joystick click(right thumb) [0,1]
left joystick click(left thumb) [0,1]
static const int NErrorRcvTimeoutThDft
Consecutive receive timeouts threshold default.
virtual int getFeatureProp(int iMnem, HIDFeatType &eFeatType, int &nDir, int &nMin, int &nMax, int &nStep)
Get the feature properties.
right hi-freq rumble motor [0-255]
int m_state[Xbox360FeatIdNumOf]
current state
int cancelUpdateThread()
Cancel (destroy) USB update thread.
right joystick x value [-32768-32767]
HIDXbox360(int usbDebugLevel=0)
Default initialization constructor.
std::string m_strSerialNum
serial number
int m_nErrorRcv
consecutive rcv error count
right joystick x value [-32768-32767]
void updateButtonState(byte_t msg[], ssize_t n)
Update the controller input button state.
static void transferCallbackInput(struct libusb_transfer *transfer)
Input transfer function callback.
void blockWait()
Blocked timed wait.
virtual int getFeatureVal(int iMnem)
Get the value associated with the mapped user mnemonic.
left joystick x value [-32768-32767]
Xbox360 controller HID input class.
int submitReadTransfer()
Submit read Xbox input asynchronous transfer.
int m_nStatus
raw status byte
static void * updateThread(void *pArg)
The update thread.
virtual int update(uint_t uMSec=T_UPDATE_DFT)
Read device and update HID state.
ThreadState m_eThreadState
update thread state
int m_nBatteryStatus
batter status
static void transferCallbackLED(struct libusb_transfer *transfer)
Write LED pattern transfer function callback.
left joystick y value [-32768-32767]
int setLED(int nPattern)
Set the LED pattern.
ThreadState
Update thread states.
Xbox360FeatId
Xbox360 Feature IDs.
void cancelTransfers()
Cancel all pending USB transfers.
virtual int setFeatureVal(int iMnem, int nVal)
Set the value associated with the mapped user mnemonic.
left bump (left shoulder) [0,1]
bool parseWired(byte_t buf[], ssize_t n)
Parse wired Xbox360 input events.
void calibrateJoySticks(int nLeftDeadZone, int nRightDeadZone)
Set joysticks calibration.
USB extensions and capatabilities.
int updown(int nBit)
Convert bit value to button up/down state.
int m_nErrorRcvTimeoutTh
consec rcv timeout error th
#define XBOX_LIBUSB_DEBUG_DFT
default libusb logging
int m_nErrorRcvTh
consec rcv error threshold
UsbPktId
USB transfer packet purpose.
#define XBOX360_WIRELESS_PROD_ID
void updateRumbleState(byte_t msg[], ssize_t n)
Update the rumble motors state.
struct timespec m_tsThread
update thread period
static const int NErrorRcvThDft
Consecutive receive errors threshold default.
number of transfer packet ids
virtual int run(float hz=30.0)
Create and run USB update in thread.
bool parseWireless(byte_t buf[], ssize_t n)
Parse wireless Xbox360 input events.
left low-freq rumble motor [0-255]
pthread_t m_threadId
update pthread identifier
HIDFeatType
Feature property types.
right bump (right shoulder) [0,1]
int m_nErrorTotalTh
total error threshold
int m_nLEDPattern
target LED pattern
pthread_cond_t m_condUpdate
condition
int m_nLeftRumble
target left rumble intensity
number of features (keep last)
struct libusb_device_handle * m_usbHandle
USB open handle.
int m_nLeftJoyDeadZone
left joystick deadzone
RoadNarrows Robotics standard namespace.
struct libusb_context * m_usbContext
libusb session context
Goad (write) transfer packet.
int claimXboxInterfaces()
Claim all Xbox USB interfaces.
virtual void setLinkState(bool bNewState)
Set new link state.
int m_nErrorTotal
total error count
int m_nErrorRcvTimeout
consec rcv timeout error cnt