52 #include <sys/types.h> 65 #include <libusb-1.0/libusb.h> 67 #include "rnr/rnrconfig.h" 129 LOGERROR(
"libusb_init() failed: %s.", libusb_error_name(
m_nError));
164 LOGERROR(
"libusb not initialized.");
170 LOGERROR(
"Xbox360 controller 0x%04x already open.",
m_nProdId);
177 LOGERROR(
"open() failed: %s.", libusb_error_name(
m_nError));
183 LOGERROR(
"initTransferPkts() failed: %s.", libusb_error_name(
m_nError));
190 LOGERROR(
"submitReadTransfer() failed: %s.", libusb_error_name(
m_nError));
215 case XBOX360_WIRELESS_WIN_PROD_ID:
223 LOGDIAG3(
"Opened %s (product id=0x%04x).",
235 LOGERROR(
"libusb not initialized.");
268 LOGWARN(
"libusb_release_interface() failed: %s.",
276 LOGDIAG3(
"Closed Xbox360 controller (product id=0x%04x).",
m_nProdId);
289 return LIBUSB_SUCCESS;
306 LOGERROR(
"Update thread already running.");
312 LOGERROR(
"Failed to create update thread.");
333 FeatMap_T::iterator pos;
337 return LIBUSB_ERROR_INVALID_PARAM;
340 switch( pos->second )
344 case Xbox360FeatIdRightRumble:
349 return LIBUSB_ERROR_INVALID_PARAM;
360 FeatMap_T::iterator pos;
364 return LIBUSB_ERROR_INVALID_PARAM;
367 switch( pos->second )
375 nMin = numeric_limits<int16_t>::min();
376 nMax = numeric_limits<int16_t>::max();
384 nMax = numeric_limits<int8_t>::max();
392 nMax = numeric_limits<int8_t>::max();
411 return LIBUSB_SUCCESS;
450 case XBOX360_WIRELESS_WIN_PROD_ID:
486 LOGERROR(
"Goad libusb_submit_transfer() failed: %s.",
487 libusb_error_name(rc));
509 return LIBUSB_SUCCESS;
517 return LIBUSB_SUCCESS;
525 for(nTries=0, rc=LIBUSB_ERROR_BUSY;
526 (nTries<nMaxTries) && (rc==LIBUSB_ERROR_BUSY);
543 if( rc != LIBUSB_SUCCESS )
545 LOGERROR(
"Rumble libusb_submit_transfer() failed in %d tries: %s.",
546 nTries, libusb_error_name(rc));
566 case XBOX360_WIRELESS_WIN_PROD_ID:
611 LOGERROR(
"Rumble libusb_submit_transfer() failed: %s.",
612 libusb_error_name(rc));
639 return LIBUSB_SUCCESS;
647 return LIBUSB_SUCCESS;
655 for(nTries=0, rc=LIBUSB_ERROR_BUSY;
656 (nTries<nMaxTries) && (rc==LIBUSB_ERROR_BUSY);
674 if( rc != LIBUSB_SUCCESS )
676 LOGERROR(
"LED libusb_submit_transfer() failed in %d tries: %s.",
677 nTries, libusb_error_name(rc));
694 case XBOX360_WIRELESS_WIN_PROD_ID:
729 LOGERROR(
"LED libusb_submit_transfer() failed: %s.",
730 libusb_error_name(rc));
743 float fMax = (float)numeric_limits<int16_t>::max();
768 if( !bOldState && bNewState )
777 else if( bOldState && !bNewState )
786 static ushort_t xbox_prod_id[] =
791 XBOX360_WIRELESS_WIN_PROD_ID
800 for(i=0; i<arraysize(xbox_prod_id); ++i)
831 case XBOX360_WIRELESS_WIN_PROD_ID:
846 return LIBUSB_SUCCESS;
876 for(i=0; i<interfaces; ++i)
878 status = libusb_kernel_driver_active(
m_usbHandle, i);
886 LOGERROR(
"libusb_detach_kernel_driver() failed: %s.",
891 else if( status < 0 )
894 LOGERROR(
"libusb_kernel_driver_active() failed: %s.",
910 LOGERROR(
"libusb_set_configuration() failed: %s.",
919 for(i=0; i<interfaces; ++i)
924 LOGERROR(
"libusb_claim_interface() failed: %s.",
930 return LIBUSB_SUCCESS;
940 if(
m_usbPkt[i].m_usbTransfer == NULL )
942 LOGERROR(
"libusb_alloc_transfer() failed.");
953 libusb_fill_interrupt_transfer(
m_usbPkt[i].m_usbTransfer,
963 libusb_fill_interrupt_transfer(
m_usbPkt[i].m_usbTransfer,
973 libusb_fill_interrupt_transfer(
m_usbPkt[i].m_usbTransfer,
983 libusb_fill_interrupt_transfer(
m_usbPkt[i].m_usbTransfer,
1003 if(
m_usbPkt[i].m_usbTransfer == NULL )
1007 else if(
m_usbPkt[i].m_bHasSubmitted )
1009 LOGWARN(
"USB transfer packet %d has been submitted - cannot free.", i);
1013 libusb_free_transfer(
m_usbPkt[i].m_usbTransfer);
1027 return LIBUSB_SUCCESS;
1033 if( rc == LIBUSB_SUCCESS )
1039 LOGERROR(
"Input libusb_submit_transfer() failed: %s.",
1040 libusb_error_name(rc));
1050 bool bResubmit =
true;
1051 bool bReceived =
false;
1056 switch( transfer->status )
1062 case LIBUSB_TRANSFER_COMPLETED:
1066 case XBOX360_WIRELESS_WIN_PROD_ID:
1068 transfer->actual_length);
1072 bReceived = pThis->
parseWired(transfer->buffer,
1073 transfer->actual_length);
1081 case LIBUSB_TRANSFER_ERROR:
1082 LOGERROR(
"Transfer error.");
1090 case LIBUSB_TRANSFER_NO_DEVICE:
1091 LOGERROR(
"Disconnected!");
1104 case LIBUSB_TRANSFER_TIMED_OUT:
1120 case LIBUSB_TRANSFER_CANCELLED:
1121 LOGDIAG3(
"Tranfer cancelled.");
1128 case LIBUSB_TRANSFER_STALL:
1129 LOGERROR(
"Transfer stalled.");
1138 case LIBUSB_TRANSFER_OVERFLOW:
1139 LOGERROR(
"Overflow: Amount transferred: %d", transfer->actual_length);
1148 LOGERROR(
"HIDXbox360 Controller: Unknown error, USB status: %d",
1199 switch( transfer->status )
1205 case LIBUSB_TRANSFER_COMPLETED:
1215 case LIBUSB_TRANSFER_NO_DEVICE:
1216 LOGERROR(
"Disconnected!");
1226 case LIBUSB_TRANSFER_CANCELLED:
1227 LOGDIAG3(
"Tranfer cancelled.");
1233 case LIBUSB_TRANSFER_TIMED_OUT:
1234 LOGERROR(
"USB write rumble motors timed out.");
1241 case LIBUSB_TRANSFER_ERROR:
1242 case LIBUSB_TRANSFER_STALL:
1243 case LIBUSB_TRANSFER_OVERFLOW:
1245 LOGERROR(
"USB write rumble motors failed (length=%d): USB status=%d",
1246 transfer->length, transfer->status);
1262 switch( transfer->status )
1268 case LIBUSB_TRANSFER_COMPLETED:
1277 case LIBUSB_TRANSFER_NO_DEVICE:
1278 LOGERROR(
"Disconnected!");
1288 case LIBUSB_TRANSFER_CANCELLED:
1289 LOGDIAG3(
"Tranfer cancelled.");
1295 case LIBUSB_TRANSFER_TIMED_OUT:
1296 LOGERROR(
"USB write LED pattern timed out.");
1303 case LIBUSB_TRANSFER_ERROR:
1304 case LIBUSB_TRANSFER_STALL:
1305 case LIBUSB_TRANSFER_OVERFLOW:
1307 LOGERROR(
"USB write LED pattern (length=%d): USB status=%d.",
1308 transfer->length, transfer->status);
1324 switch( transfer->status )
1326 case LIBUSB_TRANSFER_COMPLETED:
1329 case LIBUSB_TRANSFER_NO_DEVICE:
1330 case LIBUSB_TRANSFER_TIMED_OUT:
1331 case LIBUSB_TRANSFER_CANCELLED:
1332 case LIBUSB_TRANSFER_ERROR:
1333 case LIBUSB_TRANSFER_STALL:
1334 case LIBUSB_TRANSFER_OVERFLOW:
1352 for(nTries=0; nTries<nMaxTries; ++nTries)
1364 if( nTrans == UsbPktIdNumOf )
1373 static int nMaxTries = 5;
1375 for(
int i=0; i<nMaxTries; ++i)
1383 bool bGoodPkt =
true;
1384 bool bNewState =
true;
1396 LOGDIAG3(
"Wireless status: Contoller linked.");
1399 LOGDIAG3(
"Wireless status: Headset linked.");
1402 LOGDIAG3(
"Wireless status: Contoller and headset linked.");
1405 LOGERROR(
"Wireless link: No link.");
1418 LOGERROR(
"Short packet.");
1445 LOGDIAG4(
"Button state update packet.");
1460 const char *sep =
"";
1473 LOGDIAG3(
"Announcement packet: S/N %s, battery status: %d",
1494 LOGDIAG4(
"00 messsage: val=0x%02x.", buf[3]);
1508 LOGDIAG4(
"F8 messsage: val=0x%02x.", buf[2]);
1518 LOGDIAG4(
"%02x messsage: val=0x%02x.", buf[1]);
1731 case XBOX360_WIRELESS_WIN_PROD_ID:
1754 case XBOX360_WIRELESS_WIN_PROD_ID:
1777 output = (int)( (((uint_t)msb) << 8) | (uint_t)lsb);
1779 if( output & 0x8000 )
1799 LOGERROR(
"Consecutive received timeout error count %d " 1811 LOGERROR(
"Consecutive received error count %d exceeds threshold %d.",
1821 LOGERROR(
"Total received error count %d exceeds threshold %d.",
1839 LOGSYSERROR(
"pthread_create()");
1869 struct timeval tvWait;
1879 tvWait.tv_usec = uMSec * 1000;
1901 pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, &oldstate);
1902 pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, &oldstate);
1904 LOGDIAG3(
"Update thread created.");
1923 LOGDIAG3(
"Update thread exited.");
1931 " %s (Product Id 0x%04x)" 1933 " DPad Bump Bk Cx St A B X Y Trigger LeftJoyStick RightJoytStick" 1934 " LED Rumble Link Status Batt ERTO ER ES ETOT" 1943 "%1d %1d %1d %1d %1d %1d %1d %1d %1d %1d %1d %1d %1d %3d %3d " 1944 "%1d %6d %6d %1d %6d %6d %2d %3d %3d %5s 0x%02x %4d %5d %3d %3d %5d\r",
1990 const std::string &strEoR)
1992 struct timeval tvNow;
1995 gettimeofday(&tvNow, NULL);
1997 t = (double)tvNow.tv_sec + (
double)tvNow.tv_usec / 1000000.0;
1999 fprintf(stderr,
"%.3lf ", t);
2001 if( !strPreface.empty() )
2003 fprintf(stderr,
"%s: ", strPreface.c_str());
2006 fprintf(stderr,
"buf_len=%zd: ", n);
2008 for(
int i=0; i<n; ++i)
2010 fprintf(stderr,
"%02x ", buf[i]);
2013 fprintf(stderr,
"%s", strEoR.c_str());
static void transferCallbackGoad(struct libusb_transfer *transfer)
Write packet to force a response packet from the Xbox360.
#define XBOX360_WL_BTTN_PAT_3
header pattern at byte 3
virtual int close()
Close connection to an opened USB Xbox360 controller.
#define HID_FEAT_INPUT
input to host feature
#define XBOX360_BTTN_A_BUTTON_POS
byte position
struct libusb_transfer * m_usbTransfer
allocated transfer packet
int createUpdateThread()
Create USB update thread.
void flushInput()
Flush any pending input transfer buffers.
#define XBOX360_WL_PKT_TYPE_NORM
normal link message
#define XBOX360_BTTN_PAD_RIGHT_POS
byte position
#define XBOX360_LEFT_DEAD_ZONE
UsbPkt_T m_usbPkt[UsbPktIdNumOf]
USB transfer packets.
#define MICROSOFT_VENDOR_ID
#define XBOX360_BTTN_CENTER_X_POS
byte position
virtual int open()
Open connection to an USB Xbox360 controller.
#define XBOX360_WL_NULL_PAT_2
header pattern at byte 2
#define XBOX360_WL_BATT_PAT_2
header pattern at byte 2
#define XBOX360_BTTN_RIGHT_X_POS_H
byte position
#define XBOX360_MSG_TYPE_POS
message type byte position
#define XBOX360_WL_LED_PAT_POS
LED position is in PACKET header.
#define XBOX360_BTTN_PAD_LEFT_POS
byte position
void freeTransferPkts()
Free all USB transfer packets.
rumble (write) transfer packet
void debugPrintState()
Simple debug print state.
#define XBOX360_WL_ANN_BATT_POS
battery status field position
void clearErrorCnts()
Clear error counts.
#define XBOX360_BTTN_MSG_LEN
wired button msg length
void unlock()
Unlock the update thread.
#define XBOX360_WL_LINK_STATUS_CTLR_HEADSET
linked w/ ctlr & headset
#define XBOX360_WL_ANN_SN_POS
serial number field position
#define XBOX360_BTTN_MSG_TYPE
button update msg type
#define XBOX360_WL_RUMBLE_PAT_3
header pattern at byte 3
#define XBOX360_WL_BTTN_PAT_2
header pattern at byte 2
#define XBOX360_BTTN_B_BUTTON_MASK
bit mask
void signalUpdateThread()
Signal update thread of change of state.
#define XBOX360_BTTN_RIGHT_X_POS_L
byte position
void debugPrintTransferBuf(const std::string &strPreface, struct libusb_transfer *transfer)
Debug print USB transfer buffer contents.
#define XBOX360_BTTN_CENTER_X_MASK
bit mask
#define XBOX360_TETHERED_PROD_ID
std::string m_strProdName
product name
#define XBOX360_WL_RUMBLE_PAT_2
header pattern at byte 2
#define XBOX360_LED_MSG_TYPE
LED message type.
#define XBOX360_RUMBLE_LEFT_POS
byte position
void zeroState()
Zero controller shadowed state.
#define XBOX360_MSG_OFFSET_WL
wireless message start byte offset
#define XBOX360_BTTN_LEFT_STICK_CLICK_POS
byte position
float m_fRightJoyB
right joystick y intercept
byte_t m_bufData[UsbTransferBufSize]
transfer data buffer
#define HID_BTTN_UP
button/key state is up or unpressed
#define XBOX360_WL_NULL_PAT_1
header pattern at byte 1
Xbox360 Controller C interface.
#define XBOX360_LED_PAT_MASK
bit mask
bool m_bCancel
do [not] cancel submissions
#define XBOX360_BTTN_LEFT_X_POS_L
byte position
#define XBOX360_BTTN_A_BUTTON_MASK
bit mask
int initTransferPkts()
Allocate and initialize all USB transfer packets.
#define XBOX360_BTTN_LEFT_Y_POS_H
byte position
int m_nProdId
Xbox USB product id.
void lock()
Lock update thread.
#define XBOX360_RUMBLE_RIGHT_MASK
bit mask
int m_nErrorSend
consec send error count
int m_nRightRumble
target right rumble intensity
#define XBOX360_BTTN_LEFT_TRIGGER_POS
byte position
virtual bool ping()
Ping device if it is connected and is responding.
#define XBOX360_BTTN_LEFT_Y_POS_L
byte position
#define XBOX360_LED_PAT_POS
LED messge byte position.
pthread_mutex_t m_mutexUpdate
mutex
#define XBOX360_WL_PKT_TYPE_CHG
link status changed message
static void transferCallbackRumble(struct libusb_transfer *transfer)
Write rumble motor values transfer function callback.
#define XBOX360_RUMBLE_MSG_LEN
rumble read/write message length
float m_fLeftJoyB
left joystick y intercept
float m_fRightJoyM
right joystick slope
#define XBOX360_NO_PROD_ID
#define XBOX360_RUMBLE_LEFT_MASK
bit mask
#define XBOX360_WL_LED_PAT_2
header pattern at byte 2
float m_fLeftJoyM
left joystick slope
normal input (read) transfer packet
#define XBOX360_BTTN_Y_BUTTON_POS
byte position
center x (big button) [0,1]
#define XBOX360_BTTN_Y_BUTTON_MASK
bit mask
#define XBOX360_WL_NORM_PKT_LEN
normal packet length
#define XBOX360_BTTN_RIGHT_TRIGGER_POS
byte position
#define XBOX360_NUM_OF_INTERFACES
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.
void debugPrintHdr()
Simple debug print header.
#define XBOX360_WL_ANN_PAT_2
header pattern at byte 2
#define XBOX360_WL_LINK_PKT_LEN
link status change packet length
#define XBOX360_BTTN_B_BUTTON_POS
byte position
LED (write) transfer packet.
bool checkErrorThresholds()
Check errors against thresholds.
int m_nRightJoyDeadZone
right joystick deadzone
#define XBOX360_WL_LINK_STATUS_NO_LINK
no link
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 XBOX360_BTTN_PAD_DOWN_MASK
bit mask
#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.
#define XBOX360_WL_LED_PAT_1
header pattern at byte 1
#define XBOX360_BTTN_PAD_UP_MASK
bit mask
right joystick click(right thumb) [0,1]
left joystick click(left thumb) [0,1]
#define XBOX360_WL_LINK_STATUS_HEADSET
linked w/ headset
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]
#define XBOX360_BTTN_START_MASK
bit mask
int m_state[Xbox360FeatIdNumOf]
current state
int cancelUpdateThread()
Cancel (destroy) USB update thread.
right joystick x value [-32768-32767]
#define XBOX360_BTTN_X_BUTTON_MASK
bit mask
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.
left joystick x value [-32768-32767]
#define XBOX360_WL_LED_PAT_3
header pattern at byte 3
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.
#define XBOX360_WL_RUMBLE_PAT_1
header pattern at byte 1
#define XBOX360_WL_ANN_PAT_3
header pattern at byte 3
range between [min,max] property type
ThreadState m_eThreadState
update thread state
#define XBOX360_RIGHT_DEAD_ZONE
#define XBOX360_WRITE_ENDPOINT
#define XBOX360_BTTN_RIGHT_Y_POS_H
byte position
int m_nBatteryStatus
batter status
static void transferCallbackLED(struct libusb_transfer *transfer)
Write LED pattern transfer function callback.
left joystick y value [-32768-32767]
#define XBOX360_BTTN_LEFT_X_POS_H
byte position
int setLED(int nPattern)
Set the LED pattern.
#define XBOX360_WL_PKT_TYPE_POS
byte position
void cancelTransfers()
Cancel all pending USB transfers.
#define XBOX360_BTTN_X_BUTTON_POS
byte position
virtual int setFeatureVal(int iMnem, int nVal)
Set the value associated with the mapped user mnemonic.
#define XBOX360_BTTN_LEFT_STICK_CLICK_MASK
bit mask
left bump (left shoulder) [0,1]
bool parseWired(byte_t buf[], ssize_t n)
Parse wired Xbox360 input events.
#define XBOX360_MSG_OFFSET_W
wired message start byte offset
#define XBOX360_BTTN_PAD_LEFT_MASK
bit mask
#define XBOX360_MSG_OFFSET_DFT
default message start byte offset
#define XBOX360_WL_F8_PAT_3
header pattern at byte 3
#define XBOX360_BTTN_RIGHT_BUMP_MASK
bit mask
binary state property type
#define XBOX360_WL_PKT_HDR_LEN
wireless packet header length
#define XBOX360_BTTN_BACK_POS
byte position
#define XBOX360_BTTN_LEFT_BUMP_MASK
bit mask
#define HID_FEAT_OUTPUT
output to device feature
void calibrateJoySticks(int nLeftDeadZone, int nRightDeadZone)
Set joysticks calibration.
#define XBOX360_RUMBLE_RIGHT_POS
byte position
USB extensions and capatabilities.
#define XBOX360_BTTN_BACK_MASK
bit mask
int updown(int nBit)
Convert bit value to button up/down state.
#define XBOX360_BTTN_RIGHT_BUMP_POS
byte position
int m_nErrorRcvTimeoutTh
consec rcv timeout error th
int m_nErrorRcvTh
consec rcv error threshold
#define XBOX360_MSG_LEN_POS
message length byte position
#define XBOX360_RUMBLE_MSG_TYPE
rumble message type
#define XBOX360_WIRELESS_PROD_ID
#define XBOX360_WL_BATT_PAT_1
header pattern at byte 1
void updateRumbleState(byte_t msg[], ssize_t n)
Update the rumble motors state.
#define XBOX360_WL_BATT_BATT_POS
battery status field position
#define XBOX360_WL_NULL_PAT_3_ACK
header pattern at byte 3
struct timespec m_tsThread
update thread period
number of transfer packet ids
#define XBOX360_LED_PAT_ALL_BLINK
all 4 LEDs blink continuously
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]
#define XBOX360_BTTN_PAD_RIGHT_MASK
bit mask
#define XBOX360_WL_LED_MSG_LEN
LED message length.
#define XBOX360_WL_BTTN_PAT_1
header pattern at byte 1
int m_nErrorTotalTh
total error threshold
#define XBOX360_BTTN_RIGHT_Y_POS_L
byte position
#define XBOX360_LED_PAT_ALL_OFF
all 4 LEDs off
#define XBOX360_BTTN_LEFT_BUMP_POS
byte position
#define XBOX360_BTTN_PAD_DOWN_POS
byte position
#define XBOX360_WL_ANN_PAT_1
header pattern at byte 1
#define XBOX360_BTTN_RIGHT_STICK_CLICK_POS
byte position
discrete enumeration feature property type
#define XBOX360_READ_ENDPOINT
#define XBOX360_WL_F8_PAT_1
header pattern at byte 1
#define XBOX360_LED_MSG_LEN
LED message length.
int m_nLEDPattern
target LED pattern
#define XBOX360_WL_ANN_SN_LEN
serial number field length
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
#define XBOX360_WIRED_PROD_ID
Goad (write) transfer packet.
#define XBOX360_BTTN_RIGHT_STICK_CLICK_MASK
bit mask
int claimXboxInterfaces()
Claim all Xbox USB interfaces.
#define XBOX360_WL_BATT_PAT_3
header pattern at byte 3
virtual void setLinkState(bool bNewState)
Set new link state.
#define XBOX360_WL_LINK_STATUS_POS
byte position
Microsoft Xbox360 game console family.
#define XBOX360_BTTN_START_POS
byte position
int m_nErrorTotal
total error count
#define XBOX360_WL_LINK_STATUS_CTLR
linked w/ controller
#define XBOX360_BTTN_PAD_UP_POS
byte position
int m_nErrorRcvTimeout
consec rcv timeout error cnt