reman3/Rayman_X/cpa/tempgrp/INO/Specif/JoyWin.c

365 lines
12 KiB
C

/***************************************************************************/
/* Description: CPA Joystick.lib. Implementation of the privates */
/* for the Windows version */
/* Author: F. Jentey */
/* Last Update: 05/03/97 */
/***************************************************************************/
#include <stdio.h>
#include "../Specif/JoyWin.h"
#include "INO/Joystick.h"
#define SEUIL 50
/*
fn_wJoyGetMaxJoystickCount: return the number of joystick gameport can support
return 0 if there is no gameport.
*/
short fn_wJoyGetMaxJoystickCount()
{
return (joyGetNumDevs());
}
/*
Fill the p_stJoyCaps with the capabilities of the specified joystick
Return an error if unable to get these information.
It usually happens when the joystick isn't configurated in the control panel,
but could also appear with some joystcik if the joystick isn't connected.
*/
short fn_wJoyGetJoystickCaps( short wJoystickNum, tdstJoystickCaps* p_stJoyCaps )
{
MMRESULT err;
JOYCAPS JoyCaps;
err = joyGetDevCaps(wJoystickNum, &JoyCaps, sizeof(JOYCAPS));
switch ( err )
{
case JOYERR_NOERROR:
break;
case MMSYSERR_INVALPARAM:
case MMSYSERR_NODRIVER:
default:
return (C_wJoyError);
break;
}
p_stJoyCaps->m_uwMid = JoyCaps.wMid;
p_stJoyCaps->m_uwPid = JoyCaps.wPid;
/* CHRISTOPHE PAD NT 4 RAYMAN II MODIFICATIONS {*/
#ifdef _PAD_NT
p_stJoyCaps->m_uwNbButton = 6;
#else
p_stJoyCaps->m_uwNbButton = JoyCaps.wNumButtons;
#endif _PAD_NT
/* } END CHRISTOPHE PAD NT 4 RAYMAN II MODIFICATIONS*/
p_stJoyCaps->m_stAxisCaps.m_uwXmin = JoyCaps.wXmin;
p_stJoyCaps->m_stAxisCaps.m_uwXmax = JoyCaps.wXmax;
p_stJoyCaps->m_stAxisCaps.m_uwXdown = (JoyCaps.wXmin + JoyCaps.wXmax)/2
- ((JoyCaps.wXmax - JoyCaps.wXmin)*SEUIL)/200;
p_stJoyCaps->m_stAxisCaps.m_uwXup = (JoyCaps.wXmin + JoyCaps.wXmax)/2
+ ((JoyCaps.wXmax - JoyCaps.wXmin)*SEUIL)/200;
p_stJoyCaps->m_stAxisCaps.m_uwYmin = JoyCaps.wYmin;
p_stJoyCaps->m_stAxisCaps.m_uwYmax = JoyCaps.wYmax;
p_stJoyCaps->m_stAxisCaps.m_uwYdown = (JoyCaps.wYmin + JoyCaps.wYmax)/2
+ ((JoyCaps.wYmax - JoyCaps.wYmin)*SEUIL)/200;
p_stJoyCaps->m_stAxisCaps.m_uwYup = (JoyCaps.wYmin + JoyCaps.wYmax)/2
- ((JoyCaps.wYmax - JoyCaps.wYmin)*SEUIL)/200;
p_stJoyCaps->m_uwNbAxe = JoyCaps.wNumAxes;
if ( JoyCaps.wNumAxes > 2 )
{
if ( JoyCaps.wCaps & JOYCAPS_HASZ != 0)
{
p_stJoyCaps->m_uwNbAxe++;
p_stJoyCaps->m_ulCapsFlag |= C_ulJoyZ;
p_stJoyCaps->m_stAxisCaps.m_uwZmin = JoyCaps.wZmin;
p_stJoyCaps->m_stAxisCaps.m_uwZmax = JoyCaps.wZmax;
p_stJoyCaps->m_stAxisCaps.m_uwZdown = (JoyCaps.wZmin + JoyCaps.wZmax)/2
- ((JoyCaps.wZmax - JoyCaps.wZmin)*SEUIL)/200;
p_stJoyCaps->m_stAxisCaps.m_uwZup = (JoyCaps.wZmin + JoyCaps.wZmax)/2
+ ((JoyCaps.wZmax - JoyCaps.wZmin)*SEUIL)/200;
}
/* CHRISTOPHE MODIFICATIONS 02/05/98 { */
#ifdef _PAD_NT
/* TEST THE RUDDER AXIS*/
if ( JoyCaps.wCaps & JOYCAPS_HASR != 0)
{
p_stJoyCaps->m_uwNbAxe++;
p_stJoyCaps->m_ulCapsFlag |= C_ulJoyR;
p_stJoyCaps->m_stAxisCaps.m_uwRmin = JoyCaps.wRmin;
p_stJoyCaps->m_stAxisCaps.m_uwRmax = JoyCaps.wRmax;
p_stJoyCaps->m_stAxisCaps.m_uwRdown = (JoyCaps.wRmin + JoyCaps.wRmax)/2
- ((JoyCaps.wRmax - JoyCaps.wRmin)*SEUIL)/200;
p_stJoyCaps->m_stAxisCaps.m_uwRup = (JoyCaps.wRmin + JoyCaps.wRmax)/2
+ ((JoyCaps.wRmax - JoyCaps.wRmin)*SEUIL)/200;
}
#endif _PAD_NT
/* } END CHRISTOPHE MODIFICATIONS 02/05/98 */
/* TO DO : test the other axis */
}
/* Useless
joySetThreshold(wJoystickNum, 4000);
*/
return (0);
}
/*
Fill the p_stJoyState with the state of the specified joystick
Return an error if unable to get these information.
It usually happens when the joystick isn't configurated in the control panel,
but could also appear with some joystick if the joystick isn't connected.
*/
short fn_wJoyGetJoystickState(
short wJoystickNum,
tdstJoystickStatus* p_stJoyState,
tdstJoystickCaps* p_stJoyCaps
)
{
MMRESULT err;
JOYINFOEX jie;
memset(&jie,0,sizeof(jie));
jie.dwSize = sizeof(jie);
/* CHRISTOPHE MODIFICATIONS PAD NT 4 RAYMAN II }*/
#ifdef _PAD_NT
jie.dwFlags = JOY_RETURNX | JOY_RETURNY | JOY_RETURNZ | JOY_RETURNR |JOY_RETURNBUTTONS;
#else
jie.dwFlags = JOY_RETURNX | JOY_RETURNY | JOY_RETURNBUTTONS;
#endif _PAD_NT
/* { END CHRISTOPHE MODIFICATION PAD NT 4 RAYMAN II*/
if ( (p_stJoyCaps->m_ulCapsFlag & C_ulJoyZ) != 0 )
jie.dwFlags |= JOY_RETURNZ;
if ( (p_stJoyCaps->m_ulCapsFlag & C_ulJoyR) != 0 )
jie.dwFlags |= JOY_RETURNR;
if ( (p_stJoyCaps->m_ulCapsFlag & C_ulJoyU) != 0 )
jie.dwFlags |= JOY_RETURNU;
if ( (p_stJoyCaps->m_ulCapsFlag & C_ulJoyV) != 0 )
jie.dwFlags |= JOY_RETURNV;
/* TO DO: add support of the other capabilities (pov) */
/* Read joystich state */
err = joyGetPosEx(wJoystickNum, &jie);
/* Check if plugged */
switch ( err )
{
case JOYERR_NOERROR:
break;
case JOYERR_UNPLUGGED:
/* The specified joystick is not connected to the computer. */
case MMSYSERR_BADDEVICEID:
/* The specified joystick identifier is invalid. */
case MMSYSERR_INVALPARAM:
/* An invalid parameter was passed. */
case MMSYSERR_NODRIVER:
/* The joystick driver is not present. */
default:
return (C_wJoyError);
break;
}
/* Copy button info */
p_stJoyState->m_ulButton = jie.dwButtons;
/* Read X and Y informations */
p_stJoyState->m_stAxisValues.m_uwXValue = (u_short)jie.dwXpos;
p_stJoyState->m_stAxisValues.m_uwYValue = (u_short)jie.dwYpos;
/* CHRISTOPHE PAD NT MODIFICATIONS 4 RAYMAN II {*/
/* Read Z information */
/* if ( p_stJoyCaps->m_ulCapsFlag & C_ulJoyZ != 0 )*/
/* p_stJoyState->m_stAxisValues.m_uwZValue = (u_short)jie.dwZpos;*/
#ifdef _PAD_NT
if ( (p_stJoyCaps->m_ulCapsFlag & C_ulJoyZ) != 0 )
{
p_stJoyState->m_stAxisValues.m_uwZValue = (u_short)jie.dwZpos;
if( p_stJoyState->m_stAxisValues.m_uwZValue < (0xffff/2) )
{
p_stJoyState->m_ulButton |= 16;
}
}
#endif _PAD_NT
/* Read R information */
/* if ( p_stJoyCaps->m_ulCapsFlag & C_ulJoyR != 0 )*/
/* p_stJoyState->m_stAxisValues.m_uwRValue = (u_short)jie.dwRpos;*/
#ifdef _PAD_NT
if ( (p_stJoyCaps->m_ulCapsFlag & C_ulJoyR) != 0 )
{
p_stJoyState->m_stAxisValues.m_uwRValue = (u_short)jie.dwRpos;
if( p_stJoyState->m_stAxisValues.m_uwRValue < (0xffff/2) )
{
p_stJoyState->m_ulButton |= 32;
}
}
#endif _PAD_NT
/* Read U information */
/* if ( p_stJoyCaps->m_ulCapsFlag & C_ulJoyU != 0 )*/
/* p_stJoyState->m_stAxisValues.m_uwUValue = (u_short)jie.dwUpos;*/
/* Read U information */
if ( (p_stJoyCaps->m_ulCapsFlag & C_ulJoyU) != 0 )
p_stJoyState->m_stAxisValues.m_uwUValue = (u_short)jie.dwUpos;
/* Read V information */
if ( (p_stJoyCaps->m_ulCapsFlag & C_ulJoyV) != 0 )
p_stJoyState->m_stAxisValues.m_uwVValue = (u_short)jie.dwVpos;
/* Read V information */
/* if ( p_stJoyCaps->m_ulCapsFlag & C_ulJoyV != 0 )*/
/* p_stJoyState->m_stAxisValues.m_uwVValue = (u_short)jie.dwVpos;*/
/* Copy button info */
/* p_stJoyState->m_ulButton = jie.dwButtons;*/
/* } END CHRISTOPHE MODIFICATIONS PAD NT 4 RAYMAN II*/
return (0);
}
void fn_vJoyUpdateDirection(
short wJoystickNum,
tdstJoystickStatus* p_stJoyState,
tdstJoystickCaps* p_stJoyCaps
)
{
p_stJoyState->m_ulDirection = 0;
/* Update X direction */
if ( p_stJoyState->m_stAxisValues.m_uwXValue < p_stJoyCaps->m_stAxisCaps.m_uwXdown )
p_stJoyState->m_ulDirection |= C_ulJoyLeft;
else
if ( p_stJoyState->m_stAxisValues.m_uwXValue > p_stJoyCaps->m_stAxisCaps.m_uwXup )
p_stJoyState->m_ulDirection |= C_ulJoyRight;
/* Update Y direction */
if ( p_stJoyState->m_stAxisValues.m_uwYValue > p_stJoyCaps->m_stAxisCaps.m_uwYdown )
p_stJoyState->m_ulDirection |= C_ulJoyDown;
else
if ( p_stJoyState->m_stAxisValues.m_uwYValue < p_stJoyCaps->m_stAxisCaps.m_uwYup )
p_stJoyState->m_ulDirection |= C_ulJoyUp;
#ifndef _PAD_NT
/* Update Z direction */
if ( (p_stJoyCaps->m_ulCapsFlag & C_ulJoyZ) != 0 )
{
if ( p_stJoyState->m_stAxisValues.m_uwZValue < p_stJoyCaps->m_stAxisCaps.m_uwZdown )
p_stJoyState->m_ulDirection |= C_ulJoyZDown;
else
if ( p_stJoyState->m_stAxisValues.m_uwZValue > p_stJoyCaps->m_stAxisCaps.m_uwZup )
p_stJoyState->m_ulDirection |= C_ulJoyZUp;
}
#endif _PAD_NT
/*
if ( p_stJoyCaps->m_ulCapsFlag & C_ulJoyZ != 0 )
{
if ( p_stJoyState->m_stAxisValues.m_uwZValue < p_stJoyCaps->m_stAxisCaps.m_uwZdown )
p_stJoyState->m_ulDirection |= C_ulJoyZDown;
else
if ( p_stJoyState->m_stAxisValues.m_uwZValue > p_stJoyCaps->m_stAxisCaps.m_uwZup )
p_stJoyState->m_ulDirection |= C_ulJoyZUp;
}
*/
}
/*
Return C_wJoyTrue if the specified joystick is conected else C_wJoyFalse
Return C_wJoyError if an error occured
*/
short fn_wJoyCheckConnection( short wJoystickNum )
{
MMRESULT err;
JOYINFOEX jie;
memset(&jie,0,sizeof(jie));
jie.dwSize = sizeof(jie);
err = joyGetPosEx(wJoystickNum,&jie);
if ( (err != JOYERR_NOERROR) && (err != JOYERR_UNPLUGGED) )
return (C_wJoyError);
else
{
if ( err != JOYERR_NOERROR )
return (C_wJoyFalse);
else
return (C_wJoyTrue);
}
}
/*
Return the productName in pszName
*/
short fn_wJoyGetOEMProductName( short wJoystickNum, char *pszName )
{
JOYCAPS JoyCaps;
TCHAR szKey[256];
TCHAR szValue[256];
TCHAR szOEMKey[256];
HKEY hKey;
DWORD dwcb;
LONG lr;
joyGetDevCaps(wJoystickNum,&JoyCaps,sizeof(JOYCAPS));
wJoystickNum++;
sprintf(szKey,"%s\\%s\\%s",REGSTR_PATH_JOYCONFIG,JoyCaps.szRegKey,REGSTR_KEY_JOYCURR);
lr = RegOpenKeyEx(HKEY_LOCAL_MACHINE, (LPTSTR)&szKey,0,KEY_ALL_ACCESS,&hKey);
if (lr != ERROR_SUCCESS )
return (C_wJoyError);
dwcb = sizeof(szOEMKey);
sprintf(szValue, "Joystick%d%s", wJoystickNum, REGSTR_VAL_JOYOEMNAME);
lr = RegQueryValueEx(hKey, szValue,0 ,0 ,(LPBYTE) &szOEMKey, (LPDWORD) &dwcb);
RegCloseKey(hKey);
if (lr != ERROR_SUCCESS )
{
*pszName = 0;
return (C_wJoyError);
}
sprintf(szKey,"%s\\%s",REGSTR_PATH_JOYOEM,szOEMKey);
lr = RegOpenKeyEx(HKEY_LOCAL_MACHINE, szKey,0,KEY_ALL_ACCESS,&hKey);
if (lr != ERROR_SUCCESS )
return (C_wJoyError);
dwcb = sizeof(szValue);
lr = RegQueryValueEx(hKey, REGSTR_VAL_JOYOEMNAME,0 ,0 ,(LPBYTE) pszName, (LPDWORD) &dwcb);
RegCloseKey(hKey);
if (lr != ERROR_SUCCESS )
return (C_wJoyError);
else
return (0);
}