source: trunk/src/winmm/joy.cpp@ 245

Last change on this file since 245 was 245, checked in by sandervl, 26 years ago

Joystick changes by Przemysˆaw Dobrowolski

File size: 11.8 KB
Line 
1/* $Id: joy.cpp,v 1.4 1999-06-29 15:54:58 sandervl Exp $ */
2/*
3 * Odin Joystick apis
4 *
5 * Copyright 1999 Przemyslaw Dobrowolski <dobrawka@asua.org.pl>
6 *
7 *
8 * Project Odin Software License can be found in LICENSE.TXT
9 *
10 */
11#include <os2win.h>
12#include <mmsystem.h>
13#include <misc.h>
14#include <string.h>
15#include <stdlib.h>
16#include <process.h>
17
18#include "winmm.h"
19#include "os2timer.h"
20#include "joyos2.h"
21
22#define MAXJOYDRIVERS 2
23
24static INT aJoyThreshold[MAXJOYDRIVERS] = {0,0};
25static BOOL aJoyCaptured[MAXJOYDRIVERS] = {FALSE,FALSE};
26
27void _Optlink joySendMessages(void *pData);
28
29LONG JoyGetPos(HANDLE hGame, UINT wID, LPJOYINFO lpInfo)
30{
31 GAME_STATUS_STRUCT gs;
32
33 if (wID >= MAXJOYDRIVERS) return JOYERR_PARMS;
34
35 if (hGame==0) return (JOYERR_NOCANDO);
36
37 JoyGetStatus( hGame, &gs );
38
39 if (wID==JOYSTICKID1)
40 {
41 if (gs.curdata.A.x < 1024)
42 lpInfo->wXpos = gs.curdata.A.x * 64;
43 else
44 lpInfo->wXpos = 65535; // _NOT_ 65536!!!
45
46 if (gs.curdata.A.y < 1024)
47 lpInfo->wYpos = gs.curdata.A.y * 64;
48 else
49 lpInfo->wYpos = 65535; // _NOT_ 65536!!!
50
51 lpInfo->wZpos = 0;
52 lpInfo->wButtons = 0;
53 if ( (gs.curdata.butMask & JOY_BUT1_BIT) == 0 )
54 lpInfo->wButtons |= JOY_BUTTON1;
55
56 if ( (gs.curdata.butMask & JOY_BUT2_BIT) == 0 )
57 lpInfo->wButtons |= JOY_BUTTON2;
58 }
59
60 if (wID==JOYSTICKID2)
61 {
62 if (gs.curdata.B.x < 1024)
63 lpInfo->wXpos = gs.curdata.A.x * 64;
64 else
65 lpInfo->wXpos = 65535; // _NOT_ 65536!!!
66
67 if (gs.curdata.B.y < 1024)
68 lpInfo->wYpos = gs.curdata.A.x * 64;
69 else
70 lpInfo->wYpos = 65535; // _NOT_ 65536!!!
71
72 lpInfo->wZpos = 0;
73 lpInfo->wButtons = 0;
74 if ( (gs.curdata.butMask & JOY_BUT3_BIT) == 0 )
75 lpInfo->wButtons |= JOY_BUTTON1;
76
77 if ( (gs.curdata.butMask & JOY_BUT4_BIT) == 0 )
78 lpInfo->wButtons |= JOY_BUTTON2;
79 }
80
81 return (0);
82}
83
84/*****************************************************************************
85 * Name : UINT WIN32API joyGetNumDevs
86 * Purpose : Get number of installed joysticks
87 * Status : Done
88 *
89 * Author : Przemyslaw Dobrowolski [Tue, 1999/06/29 10:00]
90 *****************************************************************************/
91UINT WIN32API joyGetNumDevs()
92{
93 HANDLE hJoy;
94 GAME_PARM_STRUCT gameInfo;
95 WORD rc;
96 INT joy_count = 0;
97
98 rc=JoyOpen(&hJoy);
99 if ( rc==0 )
100 {
101 JoyGetParams(hJoy,&gameInfo);
102 JoyClose(hJoy);
103 if ((gameInfo.useA == FALSE) && (gameInfo.useB == FALSE))
104 joy_count = 0;
105 else if (gameInfo.useA == FALSE)
106 joy_count = 1;
107 else if (gameInfo.useB == FALSE)
108 joy_count = 1;
109 else
110 joy_count = 2;
111
112 dprintf(("WINMM:joyGetNumDevs = %d\n",joy_count));
113 }
114 else
115 // No GAMEDD$ driver
116 dprintf(("WINMM: joyGetNumDevs - No GAMEDD$ driver\n"));
117
118 return(joy_count);
119}
120
121/*****************************************************************************
122 * Name : UINT WIN32API joyGetDevCapsW
123 * Purpose : Get Joystick capatibities (Unicode)
124 * Status : Done
125 *
126 * Author : Przemyslaw Dobrowolski [Tue, 1999/06/29 09:40]
127 *****************************************************************************/
128MMRESULT WIN32API joyGetDevCapsW(UINT wID, LPJOYCAPSW lpCaps,UINT wSize)
129{
130 dprintf(("WINMM:joyGetDevCapsW = %d %X %d\n",wID, lpCaps, wSize));
131
132 if (JoyInstalled(wID) == TRUE)
133 {
134 lpCaps->wMid = MM_MICROSOFT;
135 lpCaps->wPid = MM_PC_JOYSTICK;
136 AsciiToUnicode("OS/2 Joystick", lpCaps->szPname);
137 lpCaps->wXmin = 0;
138 lpCaps->wXmax = 0xffff;
139 lpCaps->wYmin = 0;
140 lpCaps->wYmax = 0xffff;
141 // OS/2 Joystick unknown Z-axes
142 lpCaps->wZmin = 0;
143 lpCaps->wZmax = 0;
144 lpCaps->wNumButtons = 2; // FIXME: OS/2 can use Joysticks with 4 buttons?
145 lpCaps->wPeriodMin = 10;
146 lpCaps->wPeriodMax = 1000;
147 lpCaps->wRmin = 0;
148 lpCaps->wRmax = 0;
149 lpCaps->wUmin = 0;
150 lpCaps->wUmax = 0;
151 lpCaps->wVmin = 0;
152 lpCaps->wVmax = 0;
153 lpCaps->wCaps = 0;
154 lpCaps->wMaxAxes = 4;
155 lpCaps->wNumAxes = 2;
156 lpCaps->wMaxButtons = 2;
157 AsciiToUnicode("",lpCaps->szRegKey);
158 AsciiToUnicode("",lpCaps->szOEMVxD);
159
160 return JOYERR_NOERROR;
161 }
162 else
163 return MMSYSERR_NODRIVER;
164}
165
166/*****************************************************************************
167 * Name : UINT WIN32API joyGetDevCapsW
168 * Purpose : Get Joystick capatibities (Unicode)
169 * Status : Done
170 *
171 * Author : Przemyslaw Dobrowolski [Tue, 1999/06/29 09:00]
172 *****************************************************************************/
173MMRESULT WIN32API joyGetDevCapsA(UINT wID, LPJOYCAPSA lpCaps,UINT wSize)
174{
175 dprintf(("WINMM:joyGetDevCapsA = %d %X %d\n",wID, lpCaps, wSize));
176 if (JoyInstalled(wID) == TRUE)
177 {
178 lpCaps->wMid = MM_MICROSOFT;
179 lpCaps->wPid = MM_PC_JOYSTICK;
180 strcpy(lpCaps->szPname, "OS/2 Joystick"); /* joystick product name */
181 lpCaps->wXmin = 0;
182 lpCaps->wXmax = 0xffff;
183 lpCaps->wYmin = 0;
184 lpCaps->wYmax = 0xffff;
185 // OS/2 Joystick unknown Z-axes
186 lpCaps->wZmin = 0;
187 lpCaps->wZmax = 0;
188 lpCaps->wNumButtons = 2; // FIXME: OS/2 can use Joysticks with 4 buttons?
189 lpCaps->wPeriodMin = 10;
190 lpCaps->wPeriodMax = 1000;
191 lpCaps->wRmin = 0;
192 lpCaps->wRmax = 0;
193 lpCaps->wUmin = 0;
194 lpCaps->wUmax = 0;
195 lpCaps->wVmin = 0;
196 lpCaps->wVmax = 0;
197 lpCaps->wCaps = 0;
198 lpCaps->wMaxAxes = 4;
199 lpCaps->wNumAxes = 2;
200 lpCaps->wMaxButtons = 2;
201 strcpy(lpCaps->szRegKey,"");
202 strcpy(lpCaps->szOEMVxD,"");
203 return JOYERR_NOERROR;
204 }
205 else
206 return MMSYSERR_NODRIVER;
207}
208
209/*****************************************************************************
210 * Name : MMRESULT WIN32API joyGetPosEx
211 * Purpose : Get the extended actual joystick position
212 * Status : Not implemented yet - only stub.
213 *
214 * Author : Przemyslaw Dobrowolski [Tue, 1999/06/29 09:00]
215 *****************************************************************************/
216MMRESULT WIN32API joyGetPosEx(UINT uJoyID, LPJOYINFOEX pji)
217{
218 dprintf(("WINMM:joyGetPosEx %d %X - only stub\n",uJoyID, pji));
219
220 return JOYERR_NOCANDO;
221}
222
223/*****************************************************************************
224 * Name : MMRESULT WIN32API joyGetPos
225 * Purpose : Get the actual joystick position
226 * Status : Done
227 *
228 * Author : Przemyslaw Dobrowolski [Tue, 1999/06/29 09:00]
229 *****************************************************************************/
230MMRESULT WIN32API joyGetPos(UINT uJoyID, LPJOYINFO pji)
231{
232 HANDLE hGame;
233 MMRESULT rc;
234 dprintf(("WINMM:joyGetPos %d %X\n",uJoyID, pji));
235
236 if (uJoyID >= MAXJOYDRIVERS) return JOYERR_PARMS;
237
238 if (JoyInstalled(uJoyID) == FALSE) return (MMSYSERR_NODRIVER);
239
240 if (JoyOpen(&hGame)) return (MMSYSERR_NODRIVER);
241
242 rc=JoyGetPos(hGame,uJoyID,pji);
243
244 JoyClose(hGame);
245
246 return (rc);
247}
248/*****************************************************************************
249 * Name : MMRESULT WIN32API joyGetThreshold
250 * Status : Done
251 *
252 * Author : Przemyslaw Dobrowolski [Tue, 1999/06/29 09:00]
253 *****************************************************************************/
254MMRESULT WINAPI joyGetThreshold(UINT wID, LPUINT lpThreshold)
255{
256 dprintf(("WINMM:joyGetThreshold %d %X\n",wID, lpThreshold));
257
258 if (wID >= MAXJOYDRIVERS) return JOYERR_PARMS;
259
260 *lpThreshold = aJoyThreshold[wID];
261
262 return JOYERR_NOERROR;
263}
264
265/*****************************************************************************
266 * Name : MMRESULT WIN32API joySetThreshold
267 * Status : Done
268 *
269 * Author : Przemyslaw Dobrowolski [Tue, 1999/06/29 09:00]
270 *****************************************************************************/
271MMRESULT WINAPI joySetThreshold(UINT wID, UINT wThreshold)
272{
273 dprintf(("WINMM:joySetThreshold %d %d\n",wID, wThreshold));
274
275 if (wID >= MAXJOYDRIVERS) return JOYERR_PARMS;
276
277 aJoyThreshold[wID] = wThreshold;
278
279 return JOYERR_NOERROR;
280}
281
282typedef struct _JOYTHREADOPT
283{
284 HWND hWnd;
285 UINT wID;
286 UINT wPeriod;
287 BOOL bChanged;
288} JOYTHREADOPT;
289typedef JOYTHREADOPT *PJOYTHREADOPT;
290
291/*****************************************************************************
292 * Name : MMRESULT WIN32API joySetCapture
293 * Purpose : Start joystick moves capturing
294 * Status : Done
295 *
296 * Author : Przemyslaw Dobrowolski [Tue, 1999/06/29 09:00]
297 *****************************************************************************/
298MMRESULT WINAPI joySetCapture(HWND hWnd,UINT wID,UINT wPeriod,BOOL bChanged)
299{
300 JOYTHREADOPT *newthr;
301 INT iThreadId;
302
303 dprintf(("WINMM:joySetCapture %x %d %d %d\n", hWnd, wID, wPeriod, bChanged));
304
305 if (wID >= MAXJOYDRIVERS) return JOYERR_PARMS;
306
307 if (JoyInstalled(wID) == FALSE) return MMSYSERR_NODRIVER;
308
309 newthr=(PJOYTHREADOPT)malloc(sizeof(JOYTHREADOPT));
310 newthr->hWnd = hWnd;
311 newthr->wID = wID;
312 newthr->wPeriod = wPeriod;
313 newthr->bChanged = bChanged;
314 aJoyCaptured[wID] = TRUE;
315 iThreadId = _beginthread(joySendMessages, NULL, 0x4000, (void *)newthr);
316 if (iThreadId!=0)
317 {
318 dprintf(("WINMM:joySetCapture ThreadID = %d\n", iThreadId));
319 return JOYERR_NOERROR;
320 }
321 else
322 dprintf(("WINMM:joySetCapture Thread not created!!!!\n"));
323
324 return JOYERR_NOCANDO; /* FIXME: what should be returned ? */
325}
326
327/*****************************************************************************
328 * Name : MMRESULT WIN32API joyReleaseCapture
329 * Purpose : Stop capturing joystick moves
330 * Status : Done (but must be rewriting)
331 *
332 * Author : Przemyslaw Dobrowolski [Tue, 1999/06/29 09:00]
333 *****************************************************************************/
334MMRESULT WINAPI joyReleaseCapture(UINT wID)
335{
336 // TODO: Semaphores or waiting for thread...
337 dprintf(("WINMM:joyReleaseCapture %d\n",wID));
338
339 if (wID >= MAXJOYDRIVERS) return JOYERR_PARMS;
340
341 if (aJoyCaptured[wID] != TRUE) return JOYERR_NOCANDO;
342
343 aJoyCaptured[wID] = FALSE;
344
345 return JOYERR_NOERROR;
346}
347
348/*****************************************************************************
349 * Name : MMRESULT WIN32API joyConfigChanged
350 * Status : STUB ONLY!!!
351 *
352 * Author : Przemyslaw Dobrowolski [Tue, 1999/06/29 09:00]
353 *****************************************************************************/
354MMRESULT WIN32API joyConfigChanged( DWORD dwFlags )
355{
356 dprintf(("WINMM:joyConfigChanged - stub\n"));
357
358 return JOYERR_NOERROR;
359}
360
361
362// ***************************************************************************
363// * [Internal]
364// * Name : _Optlink joySendMessages
365// * Purpose : Capturing thread
366// * Status : Done
367// *
368// * Author : Przemyslaw Dobrowolski [Tue, 1999/06/29 09:00]
369// ***************************************************************************
370void _Optlink joySendMessages(void *pData)
371{
372 PJOYTHREADOPT opt = (PJOYTHREADOPT) pData;
373 JOYINFO ji;
374 JOYINFO jiOld;
375 HANDLE hGame;
376 DWORD wTest;
377 INT rc;
378
379 rc=JoyOpen(&hGame);
380
381 if (rc) aJoyCaptured[opt->wID]=FALSE;
382
383 rc=JoyGetPos( hGame, opt->wID, &ji );
384
385 if (rc) aJoyCaptured[opt->wID]=FALSE;
386
387 jiOld=ji;
388
389 while (aJoyCaptured[opt->wID])
390 {
391 rc=JoyGetPos( hGame, opt->wID, &ji );
392
393 if (rc) aJoyCaptured[opt->wID]=FALSE;
394
395 wTest=MAKELONG(ji.wXpos, ji.wYpos);
396 if ((ji.wXpos!=jiOld.wXpos) || (ji.wYpos!=jiOld.wXpos))
397 PostMessageA(opt->hWnd, MM_JOY1MOVE + opt->wID, ji.wButtons, wTest);
398
399 if (ji.wButtons != jiOld.wButtons)
400 { UINT ButtonChanged = (ji.wButtons ^ jiOld.wButtons)<<8;
401
402 if (jiOld.wButtons < ji.wButtons)
403 PostMessageA(opt->hWnd, MM_JOY1BUTTONDOWN + opt->wID, ButtonChanged, MAKELONG(ji.wXpos, ji.wYpos));
404 else if (jiOld.wButtons > ji.wButtons)
405 PostMessageA(opt->hWnd, MM_JOY1BUTTONUP + opt->wID, ButtonChanged, MAKELONG(ji.wXpos, ji.wYpos));
406
407 }
408 Sleep(opt->wPeriod+10); // Fixme!!!
409 jiOld=ji;
410 }
411 free(opt);
412 dprintf(("WINMM:Joystick-internal->joySendMessages ended!\n"));
413}
Note: See TracBrowser for help on using the repository browser.