Support for Z, RX, RY and RX joystick axes
This commit is contained in:
parent
ad1b126539
commit
86cde43be2
|
@ -1035,8 +1035,8 @@ static char *MakeButtString(ButtConfig *bc, int appendKB = 1)
|
||||||
sprintf(tmpstr+strlen(tmpstr), "%d ", bc->DeviceNum[x]);
|
sprintf(tmpstr+strlen(tmpstr), "%d ", bc->DeviceNum[x]);
|
||||||
if(bc->ButtonNum[x] & 0x8000)
|
if(bc->ButtonNum[x] & 0x8000)
|
||||||
{
|
{
|
||||||
char *asel[3]={"x","y","z"};
|
char *asel[6]={"x","y","z","rx","ry","rz"};
|
||||||
sprintf(tmpstr+strlen(tmpstr), "axis %s%s", asel[bc->ButtonNum[x] & 3],(bc->ButtonNum[x]&0x4000)?"-":"+");
|
sprintf(tmpstr+strlen(tmpstr), "axis %s%s", asel[bc->ButtonNum[x] & 7],(bc->ButtonNum[x]&0x4000)?"-":"+");
|
||||||
}
|
}
|
||||||
else if(bc->ButtonNum[x] & 0x2000)
|
else if(bc->ButtonNum[x] & 0x2000)
|
||||||
{
|
{
|
||||||
|
@ -1058,7 +1058,7 @@ static char *MakeButtString(ButtConfig *bc, int appendKB = 1)
|
||||||
|
|
||||||
static uint8 keyonce[MKK_COUNT];
|
static uint8 keyonce[MKK_COUNT];
|
||||||
|
|
||||||
static int newpressed(int a)
|
static int IsNewpressed(int a)
|
||||||
{
|
{
|
||||||
if (keys_nr[a])
|
if (keys_nr[a])
|
||||||
{
|
{
|
||||||
|
@ -1085,7 +1085,7 @@ static int GetKeyPressed()
|
||||||
|
|
||||||
for (i = 0; i < 256 && !key; ++i)
|
for (i = 0; i < 256 && !key; ++i)
|
||||||
{
|
{
|
||||||
if (newpressed(i))
|
if (IsNewpressed(i))
|
||||||
{
|
{
|
||||||
key = i;
|
key = i;
|
||||||
}
|
}
|
||||||
|
|
|
@ -91,6 +91,12 @@ typedef struct
|
||||||
LONG MaxY;
|
LONG MaxY;
|
||||||
LONG MinZ;
|
LONG MinZ;
|
||||||
LONG MaxZ;
|
LONG MaxZ;
|
||||||
|
LONG MinRx;
|
||||||
|
LONG MaxRx;
|
||||||
|
LONG MinRy;
|
||||||
|
LONG MaxRy;
|
||||||
|
LONG MinRz;
|
||||||
|
LONG MaxRz;
|
||||||
} POWER_RANGER;
|
} POWER_RANGER;
|
||||||
|
|
||||||
static POWER_RANGER ranges[MAX_JOYSTICKS];
|
static POWER_RANGER ranges[MAX_JOYSTICKS];
|
||||||
|
@ -150,15 +156,36 @@ int DTestButtonJoy(ButtConfig *bc)
|
||||||
|
|
||||||
if(bc->ButtonNum[x]&0x8000) /* Axis "button" */
|
if(bc->ButtonNum[x]&0x8000) /* Axis "button" */
|
||||||
{
|
{
|
||||||
int sa = bc->ButtonNum[x]&3;
|
int sa = bc->ButtonNum[x]&7;
|
||||||
long source;
|
long source;
|
||||||
|
|
||||||
if(sa == 0) source=((int64)StatusSave[n].lX - ranges[n].MinX) * 262144 /
|
switch (sa)
|
||||||
|
{
|
||||||
|
case 0:
|
||||||
|
source = ((int64)StatusSave[n].lX - ranges[n].MinX) * 262144 /
|
||||||
(ranges[n].MaxX - ranges[n].MinX) - 131072;
|
(ranges[n].MaxX - ranges[n].MinX) - 131072;
|
||||||
else if(sa == 1) source=((int64)StatusSave[n].lY - ranges[n].MinY) * 262144 /
|
break;
|
||||||
|
case 1:
|
||||||
|
source = ((int64)StatusSave[n].lY - ranges[n].MinY) * 262144 /
|
||||||
(ranges[n].MaxY - ranges[n].MinY) - 131072;
|
(ranges[n].MaxY - ranges[n].MinY) - 131072;
|
||||||
else if(sa == 2) source=((int64)StatusSave[n].lZ - ranges[n].MinZ) * 262144 /
|
break;
|
||||||
|
case 2:
|
||||||
|
source = ((int64)StatusSave[n].lZ - ranges[n].MinZ) * 262144 /
|
||||||
(ranges[n].MaxZ - ranges[n].MinZ) - 131072;
|
(ranges[n].MaxZ - ranges[n].MinZ) - 131072;
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
source = ((int64)StatusSave[n].lRx - ranges[n].MinRx) * 262144 /
|
||||||
|
(ranges[n].MaxRx - ranges[n].MinRx) - 131072;
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
source = ((int64)StatusSave[n].lRy - ranges[n].MinRy) * 262144 /
|
||||||
|
(ranges[n].MaxRy - ranges[n].MinRy) - 131072;
|
||||||
|
break;
|
||||||
|
case 5:
|
||||||
|
source = ((int64)StatusSave[n].lRz - ranges[n].MinRz) * 262144 /
|
||||||
|
(ranges[n].MaxRz - ranges[n].MinRz) - 131072;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
/* Now, source is of the range -131072 to 131071. Good enough. */
|
/* Now, source is of the range -131072 to 131071. Good enough. */
|
||||||
if(bc->ButtonNum[x] & 0x4000)
|
if(bc->ButtonNum[x] & 0x4000)
|
||||||
|
@ -191,7 +218,7 @@ int DTestButtonJoy(ButtConfig *bc)
|
||||||
return(0);
|
return(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int canax[MAX_JOYSTICKS][3];
|
static int canax[MAX_JOYSTICKS][6];
|
||||||
|
|
||||||
/* Now the fun configuration test begins. */
|
/* Now the fun configuration test begins. */
|
||||||
void BeginJoyWait(HWND hwnd)
|
void BeginJoyWait(HWND hwnd)
|
||||||
|
@ -242,50 +269,67 @@ int DoJoyWaitTest(GUID *guid, uint8 *devicenum, uint16 *buttonnum)
|
||||||
|
|
||||||
memcpy(StatusSave[n].rgbButtons, JoyStatus.rgbButtons, 128);
|
memcpy(StatusSave[n].rgbButtons, JoyStatus.rgbButtons, 128);
|
||||||
|
|
||||||
// lX, lY, lZ
|
|
||||||
long dax, day, daz;
|
|
||||||
long source,psource;
|
long source,psource;
|
||||||
|
|
||||||
dax = ranges[n].MaxX - ranges[n].MinX;
|
for (int axis = 0; axis < 6; axis++)
|
||||||
day = ranges[n].MaxY - ranges[n].MinY;
|
|
||||||
daz = ranges[n].MaxZ - ranges[n].MinZ;
|
|
||||||
|
|
||||||
if(dax)
|
|
||||||
{
|
{
|
||||||
source=((int64)JoyStatus.lX - ranges[n].MinX) * 262144 / dax - 131072;
|
long da, jsl, ssl, min;
|
||||||
psource=((int64)StatusSave[n].lX - ranges[n].MinX) * 262144 / dax - 131072;
|
switch (axis)
|
||||||
|
{
|
||||||
|
case 0:
|
||||||
|
da = ranges[n].MaxX - ranges[n].MinX;
|
||||||
|
jsl = JoyStatus.lX;
|
||||||
|
ssl = StatusSave[n].lX;
|
||||||
|
min = ranges[n].MinX;
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
da = ranges[n].MaxY - ranges[n].MinY;
|
||||||
|
jsl = JoyStatus.lY;
|
||||||
|
ssl = StatusSave[n].lY;
|
||||||
|
min = ranges[n].MinY;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
da = ranges[n].MaxZ - ranges[n].MinZ;
|
||||||
|
jsl = JoyStatus.lZ;
|
||||||
|
ssl = StatusSave[n].lZ;
|
||||||
|
min = ranges[n].MinZ;
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
da = ranges[n].MaxRx - ranges[n].MinRx;
|
||||||
|
jsl = JoyStatus.lRx;
|
||||||
|
ssl = StatusSave[n].lRx;
|
||||||
|
min = ranges[n].MinRx;
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
da = ranges[n].MaxRy - ranges[n].MinRy;
|
||||||
|
jsl = JoyStatus.lRy;
|
||||||
|
ssl = StatusSave[n].lRy;
|
||||||
|
min = ranges[n].MinRy;
|
||||||
|
break;
|
||||||
|
case 5:
|
||||||
|
da = ranges[n].MaxRz - ranges[n].MinRz;
|
||||||
|
jsl = JoyStatus.lRz;
|
||||||
|
ssl = StatusSave[n].lRz;
|
||||||
|
min = ranges[n].MinRz;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
if(abs(source) >= 65536 && canax[n][0])
|
if (da)
|
||||||
|
{
|
||||||
|
source = ((int64)jsl - min) * 262144 / da - 131072;
|
||||||
|
psource = ((int64)ssl - min) * 262144 / da - 131072;
|
||||||
|
|
||||||
|
if (abs(source) >= 65536 && canax[n][axis])
|
||||||
{
|
{
|
||||||
*guid = JoyGUID[n];
|
*guid = JoyGUID[n];
|
||||||
*devicenum = n;
|
*devicenum = n;
|
||||||
*buttonnum = 0x8000 | (0) | ((source < 0) ? 0x4000 : 0);
|
*buttonnum = 0x8000 | axis | ((source < 0) ? 0x4000 : 0);
|
||||||
memcpy(&StatusSave[n], &JoyStatus, sizeof(DIJOYSTATE2));
|
memcpy(&StatusSave[n], &JoyStatus, sizeof(DIJOYSTATE2));
|
||||||
canax[n][0] = 0;
|
canax[n][axis] = 0;
|
||||||
return(1);
|
return(1);
|
||||||
} else if(abs(source) <= 32768) canax[n][0] = 1;
|
|
||||||
}
|
}
|
||||||
|
else if (abs(source) <= 32768) canax[n][axis] = 1;
|
||||||
if(day)
|
|
||||||
{
|
|
||||||
source=((int64)JoyStatus.lY - ranges[n].MinY) * 262144 / day - 131072;
|
|
||||||
psource=((int64)StatusSave[n].lY - ranges[n].MinY) * 262144 / day - 131072;
|
|
||||||
|
|
||||||
if(abs(source) >= 65536 && canax[n][1])
|
|
||||||
{
|
|
||||||
*guid = JoyGUID[n];
|
|
||||||
*devicenum = n;
|
|
||||||
*buttonnum = 0x8000 | (1) | ((source < 0) ? 0x4000 : 0);
|
|
||||||
memcpy(&StatusSave[n], &JoyStatus, sizeof(DIJOYSTATE2));
|
|
||||||
canax[n][1] = 0;
|
|
||||||
return(1);
|
|
||||||
} else if(abs(source) <= 32768) canax[n][1] = 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if(daz)
|
|
||||||
{
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for(x=0; x<4; x++)
|
for(x=0; x<4; x++)
|
||||||
|
@ -393,6 +437,9 @@ static BOOL CALLBACK JoystickFound(LPCDIDEVICEINSTANCE lpddi, LPVOID pvRef)
|
||||||
GetARange(Joysticks[n], DIJOFS_X, &ranges[n].MinX, &ranges[n].MaxX);
|
GetARange(Joysticks[n], DIJOFS_X, &ranges[n].MinX, &ranges[n].MaxX);
|
||||||
GetARange(Joysticks[n], DIJOFS_Y, &ranges[n].MinY, &ranges[n].MaxY);
|
GetARange(Joysticks[n], DIJOFS_Y, &ranges[n].MinY, &ranges[n].MaxY);
|
||||||
GetARange(Joysticks[n], DIJOFS_Z, &ranges[n].MinZ, &ranges[n].MaxZ);
|
GetARange(Joysticks[n], DIJOFS_Z, &ranges[n].MinZ, &ranges[n].MaxZ);
|
||||||
|
GetARange(Joysticks[n], DIJOFS_RX, &ranges[n].MinRx, &ranges[n].MaxRx);
|
||||||
|
GetARange(Joysticks[n], DIJOFS_RY, &ranges[n].MinRy, &ranges[n].MaxRy);
|
||||||
|
GetARange(Joysticks[n], DIJOFS_RZ, &ranges[n].MinRz, &ranges[n].MaxRz);
|
||||||
|
|
||||||
JoyGUID[numjoysticks] = lpddi->guidInstance;
|
JoyGUID[numjoysticks] = lpddi->guidInstance;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue