windows-nt/Source/XPSP1/NT/drivers/input/joystick/joyread/joyread.c

221 lines
6.7 KiB
C
Raw Normal View History

2020-09-26 03:20:57 -05:00
#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;
}