Ignore:
Timestamp:
Jun 29, 1999, 5:55:17 PM (26 years ago)
Author:
sandervl
Message:

Joystick changes by Przemysˆaw Dobrowolski

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 $ */
    32/*
    4  * joystick stubs
    5  *
    6  * Copyright 1998 Joel Troster
     3 * Odin Joystick apis
     4 *
     5 * Copyright 1999 Przemyslaw Dobrowolski <dobrawka@asua.org.pl>
    76 *
    87 *
     
    1312#include <mmsystem.h>
    1413#include <misc.h>
     14#include <string.h>
     15#include <stdlib.h>
     16#include <process.h>
    1517
    1618#include "winmm.h"
    1719#include "os2timer.h"
    18 
     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 *****************************************************************************/
    19354MMRESULT WIN32API joyConfigChanged( DWORD dwFlags )
    20355{
    21356  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// ***************************************************************************
     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 TracChangeset for help on using the changeset viewer.