void Wireless360Controller::receivedHIDupdate(unsigned char *data, int length)
{
    fiddleReport(data, length);
//    remapButtons(data);
    if (swapSticks)
        remapAxes(data);
    super::receivedHIDupdate(data, length);
}
// This handles a completed asynchronous read
void Xbox360Peripheral::ReadComplete(void *parameter,IOReturn status,UInt32 bufferSizeRemaining)
{
	if (padHandler != NULL) // avoid deadlock with release
	{
		LockRequired locker(mainLock);
		IOReturn err;
		bool reread=!isInactive();
		
		switch(status) {
			case kIOReturnOverrun:
				IOLog("read - kIOReturnOverrun, clearing stall\n");
				if (inPipe != NULL)
					inPipe->ClearStall();
				// Fall through
			case kIOReturnSuccess:
				if (inBuffer != NULL)
				{
					const XBOX360_IN_REPORT *report=(const XBOX360_IN_REPORT*)inBuffer->getBytesNoCopy();
					if((report->header.command==inReport)&&(report->header.size==sizeof(XBOX360_IN_REPORT))) {
						fiddleReport(inBuffer);
						err = padHandler->handleReport(inBuffer, kIOHIDReportTypeInput);
						if(err!=kIOReturnSuccess) {
							IOLog("read - failed to handle report: 0x%.8x\n",err);
						}
					}
				}
				break;
			case kIOReturnNotResponding:
				IOLog("read - kIOReturnNotResponding\n");
				reread=false;
				break;
			default:
				reread=false;
				break;
		}
		if(reread) QueueRead();
    }
}