365 lines
10 KiB
C
365 lines
10 KiB
C
/*++
|
|
|
|
Copyright (c) 1999 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
analog.h
|
|
|
|
Abstract: Contains definitions specific to analog joysticks.
|
|
|
|
|
|
Environment:
|
|
|
|
Kernel mode
|
|
|
|
@@BEGIN_DDKSPLIT
|
|
Author:
|
|
|
|
MarcAnd 03-Jan-99 Split from hidgame.h and hidjoy.c
|
|
|
|
Revision History:
|
|
|
|
|
|
@@END_DDKSPLIT
|
|
|
|
--*/
|
|
#ifndef __ANALOG_H__
|
|
#define __ANALOG_H__
|
|
|
|
/*
|
|
* If you change any of the scaling or timeout values you have to check
|
|
* that overflows are still avoided under reasonable circumstances.
|
|
*/
|
|
|
|
/*
|
|
* The timeout value should be passed in DEVICE_EXTENSION.oemData.Timeout
|
|
* so these limits are a sanity check and default value
|
|
* The largest expected value is 8mS, use 10 for safety
|
|
*/
|
|
#define ANALOG_POLL_TIMEOUT_MIN ( 100L )
|
|
#define ANALOG_POLL_TIMEOUT_DFT ( 10000L )
|
|
#define ANALOG_POLL_TIMEOUT_MAX ( 20000L )
|
|
|
|
|
|
/*
|
|
* Slowest CPU frequency considered when calibrating the CPU timer
|
|
* against the performance counter.
|
|
*/
|
|
|
|
#define HIDGAME_SLOWEST_X86_HZ ( 45000000 )
|
|
|
|
/*
|
|
* Valid axis values are scaled such that a poll of exactly
|
|
* ANALOG_POLL_TIMEOUT_MAX mS should return this value
|
|
* Any analog value greater than this is a timeout
|
|
*/
|
|
#define AXIS_FULL_SCALE ( ANALOG_POLL_TIMEOUT_MAX )
|
|
|
|
/*
|
|
* Number of bits to shift left to get a scaled value
|
|
* This is used so that we can always use an integer multiply of the
|
|
* number of counter ticks the poll took to scale the value.
|
|
*/
|
|
#define SCALE_SHIFT 16
|
|
|
|
/*
|
|
* Macro to calculate a scaling factor from a (ULONGLONG)frequency
|
|
*/
|
|
#if AXIS_FULL_SCALE == ANALOG_POLL_TIMEOUT_MAX
|
|
#define CALCULATE_SCALE( _Freq_ ) \
|
|
(ULONG)( ( (ULONGLONG)( 1000000 ) << SCALE_SHIFT ) \
|
|
/ _Freq_ )
|
|
#else
|
|
#define CALCULATE_SCALE( _Freq_ ) \
|
|
(ULONG)( ( (ULONGLONG)AXIS_FULL_SCALE \
|
|
* ( (ULONGLONG)( 1000000 ) << SCALE_SHIFT ) ) \
|
|
/ ANALOG_POLL_TIMEOUT_MAX ) \
|
|
/ _Freq_ )
|
|
#endif
|
|
|
|
|
|
|
|
#define HGM_NUMBER_DESCRIPTORS ( 1 )
|
|
|
|
|
|
#define MAX_AXES ( 4 )
|
|
#define PORT_BUTTONS ( 4 )
|
|
#define MAX_BUTTONS ( 10 )
|
|
|
|
#define INVALID_INDEX ( 0x80 )
|
|
|
|
|
|
/* Specific settings for joystick hardware */
|
|
#define JOY_HWS_HASZ ( 0x00000001l ) /* has Z info? */
|
|
#define JOY_HWS_HASPOV ( 0x00000002l ) /* point of view hat present */
|
|
#define JOY_HWS_POVISBUTTONCOMBOS ( 0x00000004l ) /* pov done through combo of buttons */
|
|
#define JOY_HWS_POVISPOLL ( 0x00000008l ) /* pov done through polling */
|
|
|
|
#define JOY_HWS_ISYOKE ( 0x00000010l ) /* joystick is a flight yoke */
|
|
#define JOY_HWS_ISGAMEPAD ( 0x00000020l ) /* joystick is a game pad */
|
|
#define JOY_HWS_ISCARCTRL ( 0x00000040l ) /* joystick is a car controller */
|
|
|
|
#define JOY_HWS_HASR ( 0x00080000l ) /* has R (4th axis) info */
|
|
#define JOY_HWS_HASU ( 0x00800000l ) /* has U (5th axis) info */
|
|
#define JOY_HWS_HASV ( 0x01000000l ) /* has V (6th axis) info */
|
|
|
|
/*
|
|
* The following flags are for changing which gameport bit should be polled
|
|
* for an axis. These are only interpreted by the analog driver and could
|
|
* therefore be safely reinterpreted in other ways by other drivers.
|
|
*/
|
|
|
|
/* X defaults to J1 X axis */
|
|
#define JOY_HWS_XISJ1Y ( 0x00000080l ) /* X is on J1 Y axis */
|
|
#define JOY_HWS_XISJ2X ( 0x00000100l ) /* X is on J2 X axis */
|
|
#define JOY_HWS_XISJ2Y ( 0x00000200l ) /* X is on J2 Y axis */
|
|
/* Y defaults to J1 Y axis */
|
|
#define JOY_HWS_YISJ1X ( 0x00000400l ) /* Y is on J1 X axis */
|
|
#define JOY_HWS_YISJ2X ( 0x00000800l ) /* Y is on J2 X axis */
|
|
#define JOY_HWS_YISJ2Y ( 0x00001000l ) /* Y is on J2 Y axis */
|
|
/* Z defaults to J2 Y axis */
|
|
#define JOY_HWS_ZISJ1X ( 0x00002000l ) /* Z is on J1 X axis */
|
|
#define JOY_HWS_ZISJ1Y ( 0x00004000l ) /* Z is on J1 Y axis */
|
|
#define JOY_HWS_ZISJ2X ( 0x00008000l ) /* Z is on J2 X axis */
|
|
/* POV defaults to J2 Y axis, if it is not button based */
|
|
#define JOY_HWS_POVISJ1X ( 0x00010000l ) /* pov done through J1 X axis */
|
|
#define JOY_HWS_POVISJ1Y ( 0x00020000l ) /* pov done through J1 Y axis */
|
|
#define JOY_HWS_POVISJ2X ( 0x00040000l ) /* pov done through J2 X axis */
|
|
/* R defaults to J2 X axis */
|
|
#define JOY_HWS_RISJ1X ( 0x00100000l ) /* R done through J1 X axis */
|
|
#define JOY_HWS_RISJ1Y ( 0x00200000l ) /* R done through J1 Y axis */
|
|
#define JOY_HWS_RISJ2Y ( 0x00400000l ) /* R done through J2 X axis */
|
|
|
|
|
|
/*
|
|
* If POV is button-combo we overload this meaningless axis selection bit
|
|
* to indicate a second POV.
|
|
*/
|
|
#define JOY_HWS_HASPOV2 JOY_HWS_POVISJ2X
|
|
|
|
|
|
/*****************************************************************************
|
|
*
|
|
* @doc EXTERNAL
|
|
*
|
|
* @struct HIDGAME_INPUT_DATA |
|
|
*
|
|
* Our HID reports always have 4 axis values (one of which may be a
|
|
* polled POV), 2 digital POVs and 10 buttons.
|
|
* Depending on the HWS flags and number of buttons some of the
|
|
* fields will report constant data.
|
|
*
|
|
* Note, this structure should be byte aligned so that the
|
|
* sizeof(it) is the same as HID will calculate given the report
|
|
* descriptor. (In this case it happens to be aligned anyway.)
|
|
*
|
|
* @field ULONG | Axis[MAX_AXES] |
|
|
*
|
|
* Axes data values.
|
|
*
|
|
* @field UCHAR | hatswitch[2] |
|
|
*
|
|
* digital POVs (derived from button combos)
|
|
*
|
|
* @field UCHAR | Button[MAX_BUTTONS] |
|
|
*
|
|
* Button data values.
|
|
*
|
|
*****************************************************************************/
|
|
#include <pshpack1.h>
|
|
|
|
typedef struct _HIDGAME_INPUT_DATA
|
|
{
|
|
ULONG Axis[MAX_AXES];
|
|
UCHAR hatswitch[2];
|
|
UCHAR Button[MAX_BUTTONS];
|
|
} HIDGAME_INPUT_DATA, *PHIDGAME_INPUT_DATA;
|
|
typedef struct _HIDGAME_INPUT_DATA UNALIGNED *PUHIDGAME_INPUT_DATA;
|
|
|
|
#include <poppack.h>
|
|
|
|
|
|
|
|
|
|
/*****************************************************************************
|
|
*
|
|
* @doc EXTERNAL
|
|
*
|
|
* @struct OEMDATA |
|
|
*
|
|
* OEMData is send to gameEnum as a parameter to IOCTL_EXPOSE_HARDWARE.
|
|
* Defined as 8 DWORDS. We interpert them here
|
|
*
|
|
* @field USHORT | VID |
|
|
*
|
|
* Vendor ID
|
|
*
|
|
* @field USHORT | PID |
|
|
*
|
|
* Product ID
|
|
*
|
|
* @field ULONG | joy_hws_dwFlags |
|
|
*
|
|
* The dwFlags fields for the device ( Usually read from the registry )
|
|
*
|
|
* @field ULONG | Timeout |
|
|
*
|
|
* Global timeout for device polling in micro seconds
|
|
*
|
|
* @field ULONG | Reserved |
|
|
*
|
|
* Reserved for future use.
|
|
*
|
|
*
|
|
*****************************************************************************/
|
|
typedef struct _OEMDATA
|
|
{
|
|
USHORT VID;
|
|
USHORT PID;
|
|
ULONG joy_hws_dwFlags;
|
|
ULONG Timeout;
|
|
ULONG Reserved;
|
|
|
|
} OEMDATA, *POEMDATA;
|
|
|
|
|
|
typedef struct _HIDGAME_OEM_DATA
|
|
{
|
|
union
|
|
{
|
|
OEMDATA OemData[2];
|
|
GAMEENUM_OEM_DATA Game_Oem_Data;
|
|
};
|
|
} HIDGAME_OEM_DATA, *PHIDGAME_OEM_DATA;
|
|
|
|
|
|
|
|
|
|
/*****************************************************************************
|
|
*
|
|
* @doc EXTERNAL
|
|
*
|
|
* @struct ANALOG_DEVICE |
|
|
*
|
|
* Analog Device specific data.
|
|
*
|
|
* @field USHORT | nAxes |
|
|
*
|
|
* Number of axis this device has.
|
|
*
|
|
* @field USHORT | nButtons|
|
|
*
|
|
* Number of buttons this device has.
|
|
*
|
|
* @field HIDGAME_OEM_DATA | HidGameOemData |
|
|
*
|
|
* The OEM Data field ( Contains joy_hws_dwFlags, vid & pid )
|
|
*
|
|
* @field ULONG | ScaledTimeout |
|
|
* The number value at which an axis is considered to be not present.
|
|
*
|
|
* @field ULONG | ScaledThreshold |
|
|
*
|
|
* The minimum resolution of a polling cycle.
|
|
* This is used to detect if we've been
|
|
* pre-empted or interrupted during a polling loop.
|
|
*
|
|
* @field ULONG | LastGoodAxis[MAX_AXES] |
|
|
*
|
|
* Value of the axes on last good poll.
|
|
*
|
|
* @field UCHAR | LastGoodButton[PORT_BUTTONS] |
|
|
*
|
|
* Value of the buttons on last good poll.
|
|
*
|
|
* @field int | AxisMap[MAX_AXES] |
|
|
*
|
|
* Index of axes remapping.
|
|
*
|
|
* @field int | povMap |
|
|
*
|
|
* Index of axis where POV is mapped.
|
|
*
|
|
* @field UCHAR | resistiveInputMask |
|
|
*
|
|
* Resisitive Input mask.
|
|
*
|
|
* @field UCHAR | bSiblingState |
|
|
*
|
|
* Indicates the state of an expose sibling\remove self transition
|
|
*
|
|
* @field BOOLEAN | fSiblingFound |
|
|
*
|
|
* Set to true if this device has a sibling.
|
|
*
|
|
*****************************************************************************/
|
|
|
|
typedef struct _ANALOG_DEVICE
|
|
{
|
|
/*
|
|
* Number of axis
|
|
*/
|
|
USHORT nAxes;
|
|
|
|
/*
|
|
* Number of buttons
|
|
*/
|
|
USHORT nButtons;
|
|
|
|
/*
|
|
* Oem Data Field
|
|
*/
|
|
HIDGAME_OEM_DATA HidGameOemData;
|
|
|
|
/*
|
|
* The value at which an axis in considered not present.
|
|
*/
|
|
ULONG ScaledTimeout;
|
|
|
|
/*
|
|
* The minimum resolution of a polling cycle.
|
|
* This is used to detect if we've been pre-empted or interrupted
|
|
* during a polling loop.
|
|
*/
|
|
ULONG ScaledThreshold;
|
|
|
|
/*
|
|
* Last known good values. Returned if an axis result is corrupted
|
|
*/
|
|
ULONG LastGoodAxis[4];
|
|
UCHAR LastGoodButton[4];
|
|
|
|
/*
|
|
* Indexes used to map the data returned from a poll to the axes values
|
|
* declared by the device.
|
|
*/
|
|
int AxisMap[MAX_AXES];
|
|
|
|
/*
|
|
* Index of polled POV axis in the poll results
|
|
*/
|
|
int povMap;
|
|
|
|
/*
|
|
* Cutoff poll value between on and off for axes treated as buttons
|
|
*/
|
|
ULONG button5limit;
|
|
ULONG button6limit;
|
|
|
|
/*
|
|
* Resisitive Input mask
|
|
*/
|
|
UCHAR resistiveInputMask;
|
|
|
|
/*
|
|
* Set to true if the device has siblings
|
|
*/
|
|
BOOLEAN fSiblingFound;
|
|
|
|
} ANALOG_DEVICE, *PANALOG_DEVICE;
|
|
|
|
|
|
#endif /* __ANALOG_H__ */
|
|
|