📄 xbcd_control.c
字号:
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 + -