Moved hardware related handling to dlls/winmm/joystick driver.
Got rid of joySendMessages() hack (now implementation with a timer).
diff --git a/include/mmddk.h b/include/mmddk.h
index 6af547a..a1de5d4 100644
--- a/include/mmddk.h
+++ b/include/mmddk.h
@@ -132,12 +132,16 @@
#define MIDM_RESET 62
-#define AUXM_INIT DRVM_INIT
+#define AUXM_INIT DRVM_INIT
#define AUXDM_GETNUMDEVS 3
#define AUXDM_GETDEVCAPS 4
#define AUXDM_GETVOLUME 5
#define AUXDM_SETVOLUME 6
+#define MXDM_INIT DRVM_INIT
+#define MXDM_USER DRVM_USER
+#define MXDM_MAPPER DRVM_MAPPER
+
#define MXDM_GETNUMDEVS 1
#define MXDM_GETDEVCAPS 2
#define MXDM_OPEN 3
@@ -147,6 +151,144 @@
#define MXDM_GETCONTROLDETAILS 7
#define MXDM_SETCONTROLDETAILS 8
+/* pre-defined joystick types */
+#define JOY_HW_NONE 0
+#define JOY_HW_CUSTOM 1
+#define JOY_HW_2A_2B_GENERIC 2
+#define JOY_HW_2A_4B_GENERIC 3
+#define JOY_HW_2B_GAMEPAD 4
+#define JOY_HW_2B_FLIGHTYOKE 5
+#define JOY_HW_2B_FLIGHTYOKETHROTTLE 6
+#define JOY_HW_3A_2B_GENERIC 7
+#define JOY_HW_3A_4B_GENERIC 8
+#define JOY_HW_4B_GAMEPAD 9
+#define JOY_HW_4B_FLIGHTYOKE 10
+#define JOY_HW_4B_FLIGHTYOKETHROTTLE 11
+#define JOY_HW_LASTENTRY 12
+
+/* calibration flags */
+#define JOY_ISCAL_XY 0x00000001l /* XY are calibrated */
+#define JOY_ISCAL_Z 0x00000002l /* Z is calibrated */
+#define JOY_ISCAL_R 0x00000004l /* R is calibrated */
+#define JOY_ISCAL_U 0x00000008l /* U is calibrated */
+#define JOY_ISCAL_V 0x00000010l /* V is calibrated */
+#define JOY_ISCAL_POV 0x00000020l /* POV is calibrated */
+
+/* point of view constants */
+#define JOY_POV_NUMDIRS 4
+#define JOY_POVVAL_FORWARD 0
+#define JOY_POVVAL_BACKWARD 1
+#define JOY_POVVAL_LEFT 2
+#define JOY_POVVAL_RIGHT 3
+
+/* 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 */
+/* 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_HASR 0x00080000l /* has R (4th axis) info */
+#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 */
+/* U & V for future hardware */
+#define JOY_HWS_HASU 0x00800000l /* has U (5th axis) info */
+#define JOY_HWS_HASV 0x01000000l /* has V (6th axis) info */
+
+/* Usage settings */
+#define JOY_US_HASRUDDER 0x00000001l /* joystick configured with rudder */
+#define JOY_US_PRESENT 0x00000002l /* is joystick actually present? */
+#define JOY_US_ISOEM 0x00000004l /* joystick is an OEM defined type */
+
+
+/* struct for storing x,y, z, and rudder values */
+typedef struct joypos_tag {
+ DWORD dwX;
+ DWORD dwY;
+ DWORD dwZ;
+ DWORD dwR;
+ DWORD dwU;
+ DWORD dwV;
+} JOYPOS, *LPJOYPOS;
+
+/* struct for storing ranges */
+typedef struct joyrange_tag {
+ JOYPOS jpMin;
+ JOYPOS jpMax;
+ JOYPOS jpCenter;
+} JOYRANGE,*LPJOYRANGE;
+
+typedef struct joyreguservalues_tag {
+ DWORD dwTimeOut; /* value at which to timeout joystick polling */
+ JOYRANGE jrvRanges; /* range of values app wants returned for axes */
+ JOYPOS jpDeadZone; /* area around center to be considered
+ as "dead". specified as a percentage
+ (0-100). Only X & Y handled by system driver */
+} JOYREGUSERVALUES, *LPJOYREGUSERVALUES;
+
+typedef struct joyreghwsettings_tag {
+ DWORD dwFlags;
+ DWORD dwNumButtons; /* number of buttons */
+} JOYREGHWSETTINGS, *LPJOYHWSETTINGS;
+
+/* range of values returned by the hardware (filled in by calibration) */
+typedef struct joyreghwvalues_tag {
+ JOYRANGE jrvHardware; /* values returned by hardware */
+ DWORD dwPOVValues[JOY_POV_NUMDIRS];/* POV values returned by hardware */
+ DWORD dwCalFlags; /* what has been calibrated */
+} JOYREGHWVALUES, *LPJOYREGHWVALUES;
+
+/* hardware configuration */
+typedef struct joyreghwconfig_tag {
+ JOYREGHWSETTINGS hws; /* hardware settings */
+ DWORD dwUsageSettings;/* usage settings */
+ JOYREGHWVALUES hwv; /* values returned by hardware */
+ DWORD dwType; /* type of joystick */
+ DWORD dwReserved; /* reserved for OEM drivers */
+} JOYREGHWCONFIG, *LPJOYREGHWCONFIG;
+
+/* joystick calibration info structure */
+typedef struct joycalibrate_tag {
+ UINT wXbase;
+ UINT wXdelta;
+ UINT wYbase;
+ UINT wYdelta;
+ UINT wZbase;
+ UINT wZdelta;
+} JOYCALIBRATE;
+typedef JOYCALIBRATE *LPJOYCALIBRATE;
+
+/* prototype for joystick message function */
+typedef UINT (CALLBACK JOYDEVMSGPROC)(DWORD dwID, UINT uMessage, LPARAM lParam1, LPARAM lParam2);
+typedef JOYDEVMSGPROC *LPJOYDEVMSGPROC;
+
+/* messages sent to joystick driver's DriverProc() function */
+#define JDD_GETNUMDEVS (DRV_RESERVED + 0x0001)
+#define JDD_GETDEVCAPS (DRV_RESERVED + 0x0002)
+#define JDD_GETPOS (DRV_RESERVED + 0x0101)
+#define JDD_SETCALIBRATION (DRV_RESERVED + 0x0102)
+#define JDD_CONFIGCHANGED (DRV_RESERVED + 0x0103)
+#define JDD_GETPOSEX (DRV_RESERVED + 0x0104)
+
#define MCI_MAX_DEVICE_TYPE_LENGTH 80
#define MCI_FALSE (MCI_STRING_OFFSET + 19)