⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xbcd_control.c

📁 xbox game joystick driver.
💻 C
📖 第 1 页 / 共 2 页
字号:
		if (iTBuffer >= pDevExt->BThreshold)
		{
			xbdata[0] |= 2;
		}

		//Button X
		iTBuffer = pDevExt->intdata[6] & 255;
		if (iTBuffer >= pDevExt->BThreshold)
		{
			xbdata[0] |= 4;
		}

		//Button Y
		iTBuffer = pDevExt->intdata[7] & 255;
		if (iTBuffer >= pDevExt->BThreshold)
		{
			xbdata[0] |= 8;
		}

		//Black Button
		iTBuffer = pDevExt->intdata[8] & 255;
		if (iTBuffer >= pDevExt->BThreshold)
		{
			xbdata[0] |= 16;
		}

		//White Button
		iTBuffer = pDevExt->intdata[9] & 255;
		if (iTBuffer >= pDevExt->BThreshold)
		{
			xbdata[0] |= 32;
		}
		
		//Start Button
		if (pDevExt->intdata[2] & 16)
		{
			xbdata[0] |= 64;
		}

		//Back Button
		if (pDevExt->intdata[2] & 32)
		{
			xbdata[0] |= 128;
		}
		
		//L-Stick Press
		if (pDevExt->intdata[2] & 64)
		{
			xbdata[1] |= 1;
		}

		//R-Stick Press
		if (pDevExt->intdata[2] & 128)
		{
			xbdata[1] |= 2;
		}

		if(!pDevExt->bTThrottle)
		{
			//L-Trigger Button
			iTBuffer = pDevExt->intdata[10] & 255;
			if (iTBuffer >= pDevExt->TThreshold)
			{
				xbdata[1] |= 4;
			}

			//R-Trigger Button
			iTBuffer = pDevExt->intdata[11] & 255;
			if (iTBuffer >= pDevExt->TThreshold)
			{
				xbdata[1] |= 8;
			}
		}

	}

	// If both analog sticks are pressed then switch control between D-pad, L-stick, and R-stick
	if ((pDevExt->intdata[2] & 64) && (pDevExt->intdata[2] & 128))
	{
		if (!pDevExt->StickSwitch)
		{
			pDevExt->StickSwitch = TRUE;

			pDevExt->iCurrentConf += 1;

			if(pDevExt->iCurrentConf > (pDevExt->iNumConf - 1))
			{
				pDevExt->iCurrentConf = 0;
			}

			switch(pDevExt->iConf[pDevExt->iCurrentConf])
			{
			case 1:
				{
					pDevExt->iXYMov = 12;
					pDevExt->iPOV = 2;
					pDevExt->iSlider = 16;
					break;
				}
			case 2:
				{
					pDevExt->iXYMov = 2;
					pDevExt->iPOV = 16;
					pDevExt->iSlider = 12;
					break;
				}
			case 3:
				{
					pDevExt->iXYMov = 16;
					pDevExt->iPOV = 12;
					pDevExt->iSlider = 2;
					break;
				}
			case 4:
				{
					pDevExt->iXYMov = 12;
					pDevExt->iPOV = 16;
					pDevExt->iSlider = 2;
					break;
				}
			case 5:
				{
					pDevExt->iXYMov = 16;
					pDevExt->iPOV = 2;
					pDevExt->iSlider = 12;
					break;
				}
			case 6:
				{
					pDevExt->iXYMov = 2;
					pDevExt->iPOV = 12;
					pDevExt->iSlider = 16;
					break;
				}
			}
		}
	}
	else
	{
		pDevExt->StickSwitch = FALSE;
	}

	// X/Y Movement
	if (pDevExt->iXYMov == 2)
	{
		if(pDevExt->intdata[2] & 8)
		{
			KdPrint(("Right"));
			xdata = 32767;
		}
		else
		{
			if(pDevExt->intdata[2] & 4)
			{
				KdPrint(("Left"));
				xdata = -32767;
			}
		}
		
		if(pDevExt->intdata[2] & 2)
		{
			KdPrint(("Down"));
			ydata = 32767;
		}
		else
		{
			if(pDevExt->intdata[2] & 1)
			{
				KdPrint(("Up"));
				ydata = -32767;
			}
		}
	}
	else
	{
		int iDeadZone;
		if(pDevExt->iXYMov == 12)
		{
			iDeadZone = pDevExt->LStickDZ;
		}
		else
		{
			iDeadZone = pDevExt->RStickDZ;
		}

		xbdata[2] = pDevExt->intdata[pDevExt->iXYMov] & 255;
		xbdata[3] = pDevExt->intdata[pDevExt->iXYMov + 1] & 255;

		xdata = xbdata[3] << 8;
		xdata |= xbdata[2];

		xbdata[4] = (pDevExt->intdata[pDevExt->iXYMov + 2] & 255) ^ 255;
		xbdata[5] = (pDevExt->intdata[pDevExt->iXYMov + 3] & 255) ^ 255;

		ydata = xbdata[5] << 8;
		ydata |= xbdata[4];

		CalcAxes(&xdata, &ydata, iDeadZone, pDevExt);
	}

	RtlCopyMemory(&xbdata[2], &xdata, sizeof(xdata));
	RtlCopyMemory(&xbdata[4], &ydata, sizeof(ydata));

	// POV Hat Switch
	if (pDevExt->iPOV == 2)
	{
		xbdata[10] = -1;

		if(pDevExt->intdata[2] & 8)
		{
			KdPrint(("Right"));
			xbdata[10] = 2;
		}

		if(pDevExt->intdata[2] & 4)
		{
			KdPrint(("Left"));
			xbdata[10] = 6;
		}
		
		if(pDevExt->intdata[2] & 2)
		{
			KdPrint(("Down"));
			xbdata[10] = 4;
		}
		
		if(pDevExt->intdata[2] & 1)
		{
			KdPrint(("Up"));
			xbdata[10] = 0;
		}

		if((pDevExt->intdata[2] & 1) && (pDevExt->intdata[2] & 8))
		{
			xbdata[10] = 1;
		}

		if((pDevExt->intdata[2] & 8) && (pDevExt->intdata[2] & 2))
		{
			xbdata[10] = 3;
		}

		if((pDevExt->intdata[2] & 2) && (pDevExt->intdata[2] & 4))
		{
			xbdata[10] = 5;
		}

		if((pDevExt->intdata[2] & 4) && (pDevExt->intdata[2] & 1))
		{
			xbdata[10] = 7;
		}
	}
	else
	{
		xbdata[10] = -1;

		if((pDevExt->intdata[pDevExt->iPOV + 1] & 255) == 127)
		{
			KdPrint(("Right"));
			xbdata[10] = 2;
		}
		
		if((pDevExt->intdata[pDevExt->iPOV + 1] & 255) == 128)
		{
			KdPrint(("Left"));
			xbdata[10] = 6;
		}
		
		if((pDevExt->intdata[pDevExt->iPOV + 3] & 255) == 128)
		{
			KdPrint(("Down"));
			xbdata[10] = 4;
		}
		
		if((pDevExt->intdata[pDevExt->iPOV + 3] & 255) == 127)
		{
			KdPrint(("Up"));
			xbdata[10] = 0;
		}

		
		if((((pDevExt->intdata[pDevExt->iPOV + 3] & 255) < 127) && ((pDevExt->intdata[pDevExt->iPOV + 3] & 255) > 50)) && (((pDevExt->intdata[pDevExt->iPOV + 1] & 255) < 127) && (pDevExt->intdata[pDevExt->iPOV + 1] & 255) > 50))
		{
			xbdata[10] = 1;
		}
		
		if((((pDevExt->intdata[pDevExt->iPOV + 1] & 255) < 127) && ((pDevExt->intdata[pDevExt->iPOV + 1] & 255) > 50)) && (((pDevExt->intdata[pDevExt->iPOV + 3] & 255) > 128) && (pDevExt->intdata[pDevExt->iPOV + 3] & 255) < 205))
		{
			xbdata[10] = 3;
		}

		if((((pDevExt->intdata[pDevExt->iPOV + 3] & 255) > 128) && ((pDevExt->intdata[pDevExt->iPOV + 3] & 255) < 205)) && (((pDevExt->intdata[pDevExt->iPOV + 1] & 255) > 128) && (pDevExt->intdata[pDevExt->iPOV + 1] & 255) < 205))
		{
			xbdata[10] = 5;
		}
		
		if((((pDevExt->intdata[pDevExt->iPOV + 1] & 255) > 128) && ((pDevExt->intdata[pDevExt->iPOV + 1] & 255) < 205)) && (((pDevExt->intdata[pDevExt->iPOV + 3] & 255) < 127) && (pDevExt->intdata[pDevExt->iPOV + 1] & 255) > 50))
		{
			xbdata[10] = 7;
		}
	}

	// Throttle and Rudder
	if (pDevExt->iSlider == 2)
	{
		xdata = 0;
		ydata = 0;
		if(pDevExt->intdata[2] & 8)
		{
			KdPrint(("Right"));
			xdata = 32767;
		}
		else
		{
			if(pDevExt->intdata[2] & 4)
			{
				KdPrint(("Left"));
				xdata = -32767;
			}
		}

		if(!pDevExt->bTThrottle)
		{
			if(pDevExt->intdata[2] & 2)
			{
				KdPrint(("Down"));
				ydata = 32767;
			}
			else
			{
				if(pDevExt->intdata[2] & 1)
				{
					KdPrint(("Up"));
					ydata = -32767;
				}
			}
		}
		else
		{
			short tempThrottle;

			RtlZeroMemory(&tempThrottle, sizeof(tempThrottle));

			//L-Trigger Button - R-Trigger Button
			iTBuffer = (pDevExt->intdata[10] & 255) - (pDevExt->intdata[11] & 255);

			tempThrottle = 32767 * iTBuffer/255;

			ydata = tempThrottle;

			if(pDevExt->btnset)
			{
				if (pDevExt->intdata[2] & 1)
				{
					btndata |= pDevExt->buttons[10];
				}

				if (pDevExt->intdata[2] & 2)
				{
					btndata |= pDevExt->buttons[11];
				}
			}
			else
			{
				if (pDevExt->intdata[2] & 1)
				{
					xbdata[1] |= 4;
				}

				if (pDevExt->intdata[2] & 2)
				{
					xbdata[1] |= 8;
				}
			}
		}
	}
	else
	{
		int iDeadZone;
		if(pDevExt->iSlider == 12)
		{
			iDeadZone = pDevExt->LStickDZ;
		}
		else
		{
			iDeadZone = pDevExt->RStickDZ;
		}

		xbdata[6] = pDevExt->intdata[pDevExt->iSlider] & 255;
		xbdata[7] = pDevExt->intdata[pDevExt->iSlider + 1] & 255;

		xdata = xbdata[7] << 8;
		xdata |= xbdata[6];

		xbdata[8] = (pDevExt->intdata[pDevExt->iSlider + 2] & 255) ^ 255;
		xbdata[9] = (pDevExt->intdata[pDevExt->iSlider + 3] & 255) ^ 255;

		ydata = xbdata[9] << 8;
		ydata |= xbdata[8];

		if(!pDevExt->bTThrottle)
		{
			CalcAxes(&xdata, &ydata, iDeadZone, pDevExt);
		}
		else
		{
			/*if(pDevExt->btnset)
			{
				if (ydata < -32500)
				{
					btndata |= pDevExt->buttons[10];
				}

				if (ydata > 32500)
				{
					btndata |= pDevExt->buttons[11];
				}
			}
			else
			{
				if (ydata < -32500)
				{
					xbdata[1] |= 4;
				}

				if (ydata > 32500)
				{
					xbdata[1] |= 8;
				}
			}*/

			ydata = 0;
			CalcAxes(&xdata, &ydata, iDeadZone, pDevExt);

			//L-Trigger Button - R-Trigger Button
			iTBuffer = (pDevExt->intdata[10] & 255) - (pDevExt->intdata[11] & 255);

			ydata = 32767 * iTBuffer/255;
		}
	}

	if(pDevExt->btnset)
		RtlCopyMemory(&xbdata, &btndata, sizeof(btndata));

	RtlCopyMemory(&xbdata[6], &xdata, sizeof(xdata));
	RtlCopyMemory(&xbdata[8], &ydata, sizeof(ydata));
	
	KdPrint(("XBCDReadData - IOCTL_HID_READ_REPORT, report obtained - %xh %xh %xh %xh", pDevExt->intdata[12], pDevExt->intdata[13], pDevExt->intdata[14], pDevExt->intdata[15]));
	RtlCopyMemory(pIrp->UserBuffer, xbdata, sizeof(xbdata));
	pIrp->IoStatus.Information = sizeof(xbdata);
	pIrp->IoStatus.Status = STATUS_SUCCESS;
	IoCompleteRequest(pIrp, IO_NO_INCREMENT);
	
	return STATUS_SUCCESS;
}

VOID timerDPCProc(IN PKDPC Dpc, IN PDEVICE_EXTENSION pDevExt, IN PVOID SystemArgument1, IN PVOID SystemArgument2)
{
	pDevExt->timerEnabled = FALSE;
}

#pragma LOCKEDCODE

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -