Changeset 245 for trunk/src/winmm/joy.cpp
- Timestamp:
- Jun 29, 1999, 5:55:17 PM (26 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/winmm/joy.cpp
r95 r245 1 /* $Id: joy.cpp,v 1.3 1999-06-10 16:24:33 phaller Exp $ */ 2 1 /* $Id: joy.cpp,v 1.4 1999-06-29 15:54:58 sandervl Exp $ */ 3 2 /* 4 * joystick stubs5 * 6 * Copyright 199 8 Joel Troster3 * Odin Joystick apis 4 * 5 * Copyright 1999 Przemyslaw Dobrowolski <dobrawka@asua.org.pl> 7 6 * 8 7 * … … 13 12 #include <mmsystem.h> 14 13 #include <misc.h> 14 #include <string.h> 15 #include <stdlib.h> 16 #include <process.h> 15 17 16 18 #include "winmm.h" 17 19 #include "os2timer.h" 18 20 #include "joyos2.h" 21 22 #define MAXJOYDRIVERS 2 23 24 static INT aJoyThreshold[MAXJOYDRIVERS] = {0,0}; 25 static BOOL aJoyCaptured[MAXJOYDRIVERS] = {FALSE,FALSE}; 26 27 void _Optlink joySendMessages(void *pData); 28 29 LONG 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 *****************************************************************************/ 91 UINT 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 *****************************************************************************/ 128 MMRESULT 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 *****************************************************************************/ 173 MMRESULT 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 *****************************************************************************/ 216 MMRESULT 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 *****************************************************************************/ 230 MMRESULT 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 *****************************************************************************/ 254 MMRESULT 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 *****************************************************************************/ 271 MMRESULT 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 282 typedef struct _JOYTHREADOPT 283 { 284 HWND hWnd; 285 UINT wID; 286 UINT wPeriod; 287 BOOL bChanged; 288 } JOYTHREADOPT; 289 typedef 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 *****************************************************************************/ 298 MMRESULT 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 *****************************************************************************/ 334 MMRESULT 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 *****************************************************************************/ 19 354 MMRESULT WIN32API joyConfigChanged( DWORD dwFlags ) 20 355 { 21 356 dprintf(("WINMM:joyConfigChanged - stub\n")); 22 return(MMSYSERR_NODRIVER); 23 } 24 25 MMRESULT WIN32API joyGetDevCapsA(UINT IDDevice, LPJOYCAPSA lpjc, UINT cbjc) 26 { 27 dprintf(("WINMM:joyGetDevCapsA - stub\n")); 28 return(MMSYSERR_NODRIVER); 29 } 30 31 MMRESULT WIN32API joyGetDevCapsW(UINT IDDevice, LPJOYCAPSW lpjc, UINT cbjc) 32 { 33 dprintf(("WINMM:joyGetDevCapsW - stub\n")); 34 return(MMSYSERR_NODRIVER); 35 } 36 37 UINT WIN32API joyGetNumDevs() 38 { 39 dprintf(("WINMM:joyGetNumDevs - stub\n")); 40 return(0); 41 } 42 43 MMRESULT WIN32API joyGetPos(UINT uJoyID, LPJOYINFO pji) 44 { 45 dprintf(("WINMM:joyGetPos - stub\n")); 46 return(MMSYSERR_NODRIVER); 47 } 48 49 MMRESULT WIN32API joyGetPosEx(UINT uJoyID, LPJOYINFOEX pji) 50 { 51 dprintf(("WINMM:joyGetPosEx - stub\n")); 52 return(MMSYSERR_NODRIVER); 53 } 54 55 MMRESULT WIN32API joyGetThreshold(UINT uJoyID, LPUINT puThreshold) 56 { 57 dprintf(("WINMM:joyGetThreshold - stub\n")); 58 return(MMSYSERR_NODRIVER); 59 } 60 61 MMRESULT WIN32API joyReleaseCapture(UINT uJoyID) 62 { 63 dprintf(("WINMM:joyReleaseCapture - stub\n")); 64 return(MMSYSERR_NODRIVER); 65 } 66 67 MMRESULT WIN32API joySetCapture(HWND hwnd, UINT uJoyID, UINT uPeriod, BOOL fChanged) 68 { 69 dprintf(("WINMM:joySetCapture - stub\n")); 70 return(MMSYSERR_NODRIVER); 71 } 72 73 MMRESULT WIN32API joySetThreshold(UINT uJoyID, UINT uThreshold) 74 { 75 dprintf(("WINMM:joySetThreshold - stub\n")); 76 return(MMSYSERR_NODRIVER); 77 } 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 // *************************************************************************** 370 void _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 TracChangeset
for help on using the changeset viewer.