mirror of https://github.com/tongzx/nt5src
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
220 lines
6.7 KiB
220 lines
6.7 KiB
#include "windows.h"
|
|
#include "stdio.h"
|
|
#include <winioctl.h>
|
|
#include <ntddjoy.h>
|
|
|
|
|
|
#define JOYREADVERSION "Analog JoyRead 7/596\n"
|
|
#define INSTRUCTIONS "\nCommands:\n" \
|
|
"\t?,h Display this message\n" \
|
|
"\t1 Read joy1\n" \
|
|
"\t2 Read joy2\n" \
|
|
"\tA Open joy1\n" \
|
|
"\ta close joy1\n" \
|
|
"\tB Open joy2\n" \
|
|
"\tb close joy2\n" \
|
|
"\tF fast read joy1\n" \
|
|
"\tS stats\n" \
|
|
"\tx exit\n"
|
|
#define PROMPT "Joy!>"
|
|
|
|
|
|
int __cdecl main(int argc, char **argv) {
|
|
|
|
|
|
HANDLE hJoy1 = NULL;
|
|
HANDLE hJoy2 = NULL;
|
|
BOOL bDone = FALSE;
|
|
BOOL bOK;
|
|
DWORD dwBytesRead;
|
|
JOY_DD_INPUT_DATA JoyData;
|
|
JOY_STATISTICS jStats, *pjStats;
|
|
|
|
char sz[256], cCode;
|
|
int i;
|
|
|
|
printf (JOYREADVERSION);
|
|
printf (INSTRUCTIONS);
|
|
|
|
while (!bDone) {
|
|
printf (PROMPT);
|
|
if (gets (sz) == NULL) {
|
|
sz[0] = 'x';
|
|
sz[1] = '\0';
|
|
}
|
|
cCode = sz[0]; // if user types a blank before the command, too bad
|
|
|
|
switch (cCode) {
|
|
case 'h':
|
|
case '?':
|
|
printf (INSTRUCTIONS);
|
|
break;
|
|
case 'A': // open joystick 1
|
|
printf ("Open joy1\n");
|
|
if (hJoy1 != NULL) {
|
|
printf ("joy1 already open\n");
|
|
break;
|
|
}
|
|
hJoy1 = CreateFile(
|
|
"\\\\.\\Joy1",
|
|
GENERIC_READ | GENERIC_WRITE,
|
|
0,
|
|
NULL,
|
|
OPEN_EXISTING,
|
|
FILE_ATTRIBUTE_NORMAL,
|
|
NULL);
|
|
printf ("after CreateFile Joy1 0x%08x\n", hJoy1);
|
|
if (hJoy1 == INVALID_HANDLE_VALUE) {
|
|
printf ("couldn't open joy1\n");
|
|
hJoy1 = NULL;
|
|
break;
|
|
}
|
|
printf ("Got handle to Joy1\n");
|
|
break;
|
|
case 'B': // open joystick 2
|
|
printf ("Open joy2\n");
|
|
if (hJoy2 != NULL) {
|
|
printf ("joy2 already open\n");
|
|
break;
|
|
}
|
|
hJoy2 = CreateFile(
|
|
"\\\\.\\Joy2",
|
|
GENERIC_READ | GENERIC_WRITE,
|
|
0,
|
|
NULL,
|
|
OPEN_EXISTING,
|
|
FILE_ATTRIBUTE_NORMAL,
|
|
NULL);
|
|
printf ("after CreateFile Joy2 0x%08x\n", hJoy1);
|
|
if (hJoy2 == INVALID_HANDLE_VALUE) {
|
|
printf ("couldn't open joy2\n");
|
|
hJoy1 = NULL;
|
|
break;
|
|
}
|
|
printf ("Got handle to Joy2\n");
|
|
break;
|
|
case 'a': // close joy1
|
|
printf ("Close joy1\n");
|
|
CloseHandle(hJoy1);
|
|
printf ("closed joy1 0x%08x\n", hJoy1);
|
|
hJoy1 = NULL;
|
|
break;
|
|
case 'b': // close joy2
|
|
printf ("Close joy2\n");
|
|
CloseHandle(hJoy2);
|
|
printf ("closed joy2 0x%08x\n", hJoy2);
|
|
hJoy2 = NULL;
|
|
break;
|
|
case '1': // read joy1
|
|
printf ("Read joy1\n");
|
|
if (hJoy1 == NULL) {
|
|
printf ("Joy1 not open\n");
|
|
break;
|
|
}
|
|
bOK = ReadFile (hJoy1, &JoyData, sizeof(JoyData), &dwBytesRead, NULL);
|
|
if (!bOK) {
|
|
printf ("Read failed\n");
|
|
break;
|
|
}
|
|
printf ("%d bytes read\n", dwBytesRead);
|
|
printf ("Unplugged %u\n", JoyData.Unplugged);
|
|
|
|
printf ("Number of Axes %u\n", JoyData.Axi);
|
|
printf ("Buttons 0x%04x\n", JoyData.Buttons);
|
|
printf ("x, y, z, t axis times in us, %u %u %u %u\n",
|
|
JoyData.XTime,
|
|
JoyData.YTime,
|
|
JoyData.ZTime,
|
|
JoyData.TTime);
|
|
break;
|
|
|
|
case '2': // read joy2
|
|
printf ("Read joy2\n");
|
|
if (hJoy2 == NULL) {
|
|
printf ("Joy2 not open\n");
|
|
break;
|
|
}
|
|
bOK = ReadFile (hJoy2, &JoyData, sizeof(JoyData), &dwBytesRead, NULL);
|
|
if (!bOK) {
|
|
printf ("Read failed\n");
|
|
break;
|
|
}
|
|
printf ("%d bytes read\n", dwBytesRead);
|
|
printf ("Unplugged %u\n", JoyData.Unplugged);
|
|
printf ("Number of Axes %u\n", JoyData.Axi);
|
|
printf ("Buttons 0x%04x\n", JoyData.Buttons);
|
|
printf ("x, y, z, t axis times in us, %u %u %u %u\n",
|
|
JoyData.XTime,
|
|
JoyData.YTime,
|
|
JoyData.ZTime,
|
|
JoyData.TTime);
|
|
break;
|
|
|
|
case 'F': // fast read joy1
|
|
printf ("Fast read joy1\n");
|
|
if (hJoy1 == NULL) {
|
|
printf ("Joy1 not open\n");
|
|
break;
|
|
}
|
|
for (i = 0; i < 15; i++) {
|
|
bOK = ReadFile (hJoy1, &JoyData, sizeof(JoyData), &dwBytesRead, NULL);
|
|
}
|
|
printf ("Did 15 reads\n");
|
|
if (!bOK) {
|
|
printf ("Read failed\n");
|
|
break;
|
|
}
|
|
printf ("%d bytes read\n", dwBytesRead);
|
|
printf ("Unplugged %u\n", JoyData.Unplugged);
|
|
|
|
printf ("Number of Axes %u\n", JoyData.Axi);
|
|
printf ("Buttons 0x%04x\n", JoyData.Buttons);
|
|
printf ("x, y, z, t axis times in us, %u %u %u %u\n",
|
|
JoyData.XTime,
|
|
JoyData.YTime,
|
|
JoyData.ZTime,
|
|
JoyData.TTime);
|
|
break;
|
|
|
|
case 'S': // stats
|
|
printf ("Stats joy1\n");
|
|
if (hJoy1 == NULL) {
|
|
printf ("Joy1 not open\n");
|
|
break;
|
|
}
|
|
pjStats = &jStats;
|
|
|
|
DeviceIoControl (
|
|
hJoy1,
|
|
(DWORD) IOCTL_JOY_GET_STATISTICS, // instruction to execute
|
|
pjStats, sizeof(JOY_STATISTICS), // buffer and size of buffer
|
|
pjStats, sizeof(JOY_STATISTICS), // buffer and size of buffer
|
|
&dwBytesRead, 0);
|
|
printf ("Version %d\n", pjStats->Version);
|
|
printf ("NumberOfAxes %d\n", pjStats->NumberOfAxes);
|
|
printf ("Frequency %d\n", pjStats->Frequency);
|
|
printf ("dwQPCLatency %d\n", pjStats->dwQPCLatency);
|
|
printf ("nQuiesceLoop %d\n", pjStats->nQuiesceLoop);
|
|
printf ("PolledTooSoon %d\n", pjStats->PolledTooSoon);
|
|
printf ("Polls %d\n", pjStats->Polls);
|
|
printf ("Timeouts %d\n", pjStats->Timeouts);
|
|
break;
|
|
|
|
|
|
case 'x': // done
|
|
bDone = TRUE;
|
|
break;
|
|
|
|
default:
|
|
printf ("Huh? >%s<\n", sz);
|
|
printf (INSTRUCTIONS);
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
// Point proven. Be a nice program and close up shop.
|
|
if (hJoy1 != NULL) CloseHandle(hJoy1);
|
|
if (hJoy2 != NULL) CloseHandle(hJoy2);
|
|
return 1;
|
|
}
|