Support for Z, RX, RY and RX joystick axes

This commit is contained in:
Alexey 'Cluster' Avdyukhin 2021-06-08 02:43:23 +03:00 committed by zeromus
parent ad1b126539
commit 86cde43be2
2 changed files with 98 additions and 51 deletions

View File

@ -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;
} }

View File

@ -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;