4 * Copyright 1997 Andreas Mohr
12 #include <sys/ioctl.h>
21 static int count_use
[4] = {0, 0, 0, 0};
23 static int joy_nr_open
= 0;
24 static BOOL16 JoyCaptured
= FALSE
;
25 static HWND16 CaptureWnd
[2] = {0, 0};
26 static int joy_dev
[2] = {-1, -1};
27 static JOYINFO JoyCapData
[2];
28 static unsigned int joy_threshold
[2] = {0, 0};
38 /**************************************************************************
39 * JoyOpenDriver [internal]
41 BOOL16
JoyOpenDriver(WORD wID
)
43 char dev_name
[] = "/dev/jsx";
45 if (joy_dev
[wID
] >= 0) return TRUE
;
46 dev_name
[strlen(dev_name
)-1]=(char) wID
+0x30;
47 if ((joy_dev
[wID
] = open(dev_name
, O_RDONLY
)) >= 0) {
54 /**************************************************************************
55 * JoyCloseDriver [internal]
57 void JoyCloseDriver(WORD wID
)
59 if (joy_dev
[wID
] >= 0) {
66 /**************************************************************************
67 * JoySendMessages [internal]
69 void JoySendMessages(void)
75 for (joy
=0; joy
< 4; joy
++)
76 if (joy_dev
[joy
] >= 0) {
77 if (count_use
[joy
] > 250) {
84 if (JoyCaptured
== FALSE
) return;
85 dprintf_mmsys(stddeb
, "JoySendMessages()\n");
86 for (joy
=0; joy
< 4; joy
++) {
87 if (JoyOpenDriver(joy
) == FALSE
) continue;
88 dev_stat
= read(joy_dev
[joy
], &js
, sizeof(js
));
89 if (dev_stat
== sizeof(js
)) {
92 if ((JoyCapData
[joy
].wXpos
!= js
.x
) || (JoyCapData
[joy
].wYpos
!= js
.y
)) {
93 SendMessage32A(CaptureWnd
[joy
], MM_JOY1MOVE
+ joy
, js
.buttons
, MAKELONG(js
.x
, js
.y
));
94 JoyCapData
[joy
].wXpos
= js
.x
;
95 JoyCapData
[joy
].wYpos
= js
.y
;
97 if (JoyCapData
[joy
].wButtons
!= js
.buttons
) {
98 unsigned int ButtonChanged
= (WORD
)(JoyCapData
[joy
].wButtons
^ js
.buttons
)<<8;
99 if (JoyCapData
[joy
].wButtons
< js
.buttons
)
100 SendMessage32A(CaptureWnd
[joy
], MM_JOY1BUTTONDOWN
+ joy
, ButtonChanged
, MAKELONG(js
.x
, js
.y
));
102 if (JoyCapData
[joy
].wButtons
> js
.buttons
)
103 SendMessage32A(CaptureWnd
[joy
], MM_JOY1BUTTONUP
104 + joy
, ButtonChanged
, MAKELONG(js
.x
, js
.y
));
105 JoyCapData
[joy
].wButtons
= js
.buttons
;
111 /**************************************************************************
112 * JoyGetNumDevs [MMSYSTEM.101]
114 WORD
JoyGetNumDevs(void)
119 dprintf_mmsys(stddeb
, "JoyGetNumDevs: ");
120 for (joy
=0; joy
<4; joy
++)
121 if (JoyOpenDriver(joy
) == TRUE
) {
125 dprintf_mmsys(stddeb
, "returning %d\n", joy_cnt
);
126 if (!joy_cnt
) fprintf(stderr
, "No joystick found - perhaps get joystick-0.8.0.tar.gz and load it as module or use Linux >= 2.1.45 to be able to use joysticks.\n");
130 /**************************************************************************
131 * JoyGetDevCaps [MMSYSTEM.102]
133 WORD
JoyGetDevCaps(WORD wID
, LPJOYCAPS lpCaps
, WORD wSize
)
135 dprintf_mmsys(stderr
, "JoyGetDevCaps(%04X, %p, %d);\n",
137 if (wSize
!= sizeof(*lpCaps
)) return JOYERR_PARMS
; /* FIXME: should we really return this error value ? */
138 if (JoyOpenDriver(wID
) == TRUE
) {
139 lpCaps
->wMid
= MM_MICROSOFT
;
140 lpCaps
->wPid
= MM_PC_JOYSTICK
;
141 strcpy(lpCaps
->szPname
, "WineJoy\0"); /* joystick product name */
142 lpCaps
->wXmin
= 0; /* FIXME */
143 lpCaps
->wXmax
= 0xffff;
145 lpCaps
->wYmax
= 0xffff;
147 lpCaps
->wZmax
= 0xffff;
148 lpCaps
->wNumButtons
= 2;
149 lpCaps
->wPeriodMin
= 0;
150 lpCaps
->wPeriodMax
= 50; /* FIXME end */
153 return JOYERR_NOERROR
;
156 return MMSYSERR_NODRIVER
;
159 /**************************************************************************
160 * JoyGetPos [MMSYSTEM.103]
162 WORD
JoyGetPos(WORD wID
, LPJOYINFO lpInfo
)
166 dprintf_mmsys(stderr
, "JoyGetPos(%04X, %p):", wID
, lpInfo
);
167 if (JoyOpenDriver(wID
) == FALSE
) return MMSYSERR_NODRIVER
;
168 dev_stat
= read(joy_dev
[wID
], &js
, sizeof(js
));
169 if (dev_stat
!= sizeof(js
)) {
171 return JOYERR_UNPLUGGED
; /* FIXME: perhaps wrong, but what should I return else ? */
176 lpInfo
->wXpos
= js
.x
; /* FIXME: perhaps multiply it somehow ? */
177 lpInfo
->wYpos
= js
.y
;
178 lpInfo
->wZpos
= 0; /* FIXME: Don't know what to do with this value as joystick driver doesn't provide a Z value */
179 lpInfo
->wButtons
= js
.buttons
;
180 dprintf_mmsys(stderr
, "x: %d, y: %d, buttons: %d\n", js
.x
, js
.y
, js
.buttons
);
181 return JOYERR_NOERROR
;
184 /**************************************************************************
185 * JoyGetThreshold [MMSYSTEM.104]
187 WORD
JoyGetThreshold(WORD wID
, LPWORD lpThreshold
)
189 dprintf_mmsys(stderr
, "JoyGetThreshold(%04X, %p);\n", wID
, lpThreshold
);
190 if (wID
> 3) return JOYERR_PARMS
;
191 *lpThreshold
= joy_threshold
[wID
];
192 return JOYERR_NOERROR
;
195 /**************************************************************************
196 * JoyReleaseCapture [MMSYSTEM.105]
198 WORD
JoyReleaseCapture(WORD wID
)
200 dprintf_mmsys(stderr
, "JoyReleaseCapture(%04X);\n", wID
);
205 return JOYERR_NOERROR
;
208 /**************************************************************************
209 * JoySetCapture [MMSYSTEM.106]
211 WORD
JoySetCapture(HWND16 hWnd
, WORD wID
, WORD wPeriod
, BOOL16 bChanged
)
214 dprintf_mmsys(stderr
, "JoySetCapture(%04X, %04X, %d, %d);\n",
215 hWnd
, wID
, wPeriod
, bChanged
);
217 if (!CaptureWnd
[wID
]) {
218 if (JoyOpenDriver(wID
) == FALSE
) return MMSYSERR_NODRIVER
;
220 CaptureWnd
[wID
] = hWnd
;
221 return JOYERR_NOERROR
;
224 return JOYERR_NOCANDO
; /* FIXME: what should be returned ? */
227 /**************************************************************************
228 * JoySetThreshold [MMSYSTEM.107]
230 WORD
JoySetThreshold(WORD wID
, WORD wThreshold
)
232 dprintf_mmsys(stderr
, "JoySetThreshold(%04X, %d);\n", wID
, wThreshold
);
234 if (wID
> 3) return JOYERR_PARMS
;
235 joy_threshold
[wID
] = wThreshold
;
236 return JOYERR_NOERROR
;
239 /**************************************************************************
240 * JoySetCalibration [MMSYSTEM.109]
242 WORD
JoySetCalibration(WORD wID
)
244 fprintf(stderr
, "EMPTY STUB !!! JoySetCalibration(%04X);\n", wID
);
245 return JOYERR_NOCANDO
;