347 lines
16 KiB
C++
347 lines
16 KiB
C++
/******************************************************************************
|
|
Joy.c : Definition of structures and Macros
|
|
PC Version
|
|
Author : M. TRABUCATO
|
|
Last update : 28.04.98
|
|
******************************************************************************/
|
|
|
|
/**************************************************************
|
|
Initialization of the Game port.
|
|
**************************************************************/
|
|
short INO_fn_wInitGamePort(short wHistorySize)
|
|
{
|
|
short wNbJoystick;
|
|
|
|
if ( JoyLib_tdstGp.m_wGameportOk == 1 )
|
|
return (0);
|
|
|
|
wNbJoystick = fn_wJoyGetMaxJoystickCount();
|
|
if ( wNbJoystick == 0 )
|
|
{
|
|
/* There is no gameport */
|
|
ulJoystickErrorCode = C_ErrNoJoystickDriver;
|
|
return (C_wJoyError);
|
|
}
|
|
|
|
memset(&JoyLib_tdstGp,0,sizeof(tdstGamePort));
|
|
memset(JoyLib_tdstJC,0,sizeof(tdstJoystickCaps*)*16);
|
|
memset(JoyLib_tdstJS,0,sizeof(tdstJoystickStatus*)*16);
|
|
|
|
JoyLib_tdstGp.m_wHistorySize = wHistorySize;
|
|
JoyLib_tdstGp.m_wNbMaxiJoystick = wNbJoystick;
|
|
|
|
JoyLib_tdstGp.m_wNbJoystick = 0;
|
|
JoyLib_tdstGp.m_wGameportOk = 1;
|
|
JoyLib_tdstGp.m_uwActiveFlag = 0;
|
|
|
|
/* Demo mode initialization: mode normal and 0 record frame */
|
|
JoyLib_pstDemoRecordBuffer = NULL;
|
|
JoyLib_wMode = C_wJoyNormalMode;
|
|
DemoRecordJoystick = C_wJoystick1;
|
|
|
|
return(0);
|
|
}
|
|
|
|
/*****************************************************************
|
|
Joystick query function
|
|
*****************************************************************/
|
|
|
|
/******************************************************************
|
|
short fn_wJoyReadJoystick(): read all connected joystick.
|
|
******************************************************************/
|
|
short INO_fn_wReadJoystick(short wReadMode)
|
|
{
|
|
u_short i,j;
|
|
short wResult;
|
|
|
|
JoyLib_tdstGp.m_ulTimeCount++;
|
|
|
|
/* Check if the gameport is Ok */
|
|
INO_fn_wUpdateGamePort();
|
|
|
|
if ( JoyLib_tdstGp.m_wGameportOk == 0 )
|
|
{
|
|
ulJoystickErrorCode = C_ErrDriverNotInitialized;
|
|
return (C_wJoyError);
|
|
}
|
|
|
|
for ( i = 0 ; i < JoyLib_tdstGp.m_wNbMaxiJoystick ; i++)
|
|
{
|
|
if ( (JoyLib_tdstGp.m_uwActiveFlag & (1 << i)) != 0 )
|
|
{
|
|
/* If the joystick isn't connected and the function mode is C_wJoyReadConnected */
|
|
/* skip this joystick */
|
|
if ( (wReadMode == C_wJoyReadConnected) && (JoyLib_tdstJC[i]->m_uwType == C_wJoyNone) )
|
|
break;
|
|
|
|
wResult = fn_wJoyGetJoystickState(i, JoyLib_tdstJS[i], JoyLib_tdstJC[i] );
|
|
if ( wResult == C_wJoyError )
|
|
JoyLib_tdstJC[i]->m_uwType = C_wJoyNone;
|
|
|
|
/* If we are currently in play demo mode */
|
|
/* Any button press stop the demo playing mode */
|
|
if ( JoyLib_wMode == C_wJoyDemoPlayingMode )
|
|
{
|
|
if ( (JoyLib_tdstJS[i]->m_ulButton != 0) || (JoyLib_ulDemoRecordCurrent >= JoyLib_ulDemoRecordCount) )
|
|
INO_fn_wStopJoystickDemo();
|
|
else
|
|
{
|
|
if ( i == DemoRecordJoystick )
|
|
{
|
|
tdstJoystickAxisValues* p_stTmp ,* p_stTmp2;
|
|
JoyLib_tdstJS[i]->m_ulButton = JoyLib_pstDemoRecordBuffer[JoyLib_ulDemoRecordCurrent].m_ulButton;
|
|
JoyLib_tdstJS[i]->m_ulDirection = JoyLib_pstDemoRecordBuffer[JoyLib_ulDemoRecordCurrent].m_ulDirection;
|
|
p_stTmp = &(JoyLib_tdstJS[i]->m_stAxisValues);
|
|
p_stTmp2 = &(JoyLib_pstDemoRecordBuffer[JoyLib_ulDemoRecordCurrent].m_stAxisValues);
|
|
M_JoyCopyAxisValues(p_stTmp, p_stTmp2);
|
|
/*
|
|
JoyLib_tdstJS[i]->m_stAxisValues.m_uwXValue = JoyLib_pstDemoRecordBuffer[JoyLib_ulDemoRecordCurrent].m_ulXValue;
|
|
JoyLib_tdstJS[i]->m_stAxisValues.m_uwYValue = JoyLib_pstDemoRecordBuffer[JoyLib_ulDemoRecordCurrent].m_ulYValue;
|
|
JoyLib_tdstJS[i]->m_stAxisValues.m_uwZValue = JoyLib_pstDemoRecordBuffer[JoyLib_ulDemoRecordCurrent].m_ulZValue;
|
|
JoyLib_tdstJS[i]->m_stAxisValues.m_uwRValue = JoyLib_pstDemoRecordBuffer[JoyLib_ulDemoRecordCurrent].m_ulRValue;
|
|
JoyLib_tdstJS[i]->m_stAxisValues.m_uwUValue = JoyLib_pstDemoRecordBuffer[JoyLib_ulDemoRecordCurrent].m_ulUValue;
|
|
JoyLib_tdstJS[i]->m_stAxisValues.m_uwVValue = JoyLib_pstDemoRecordBuffer[JoyLib_ulDemoRecordCurrent].m_ulVValue;
|
|
*/
|
|
JoyLib_ulDemoRecordCurrent++;
|
|
}
|
|
}
|
|
}
|
|
|
|
/* In normal mode or record mode, analyse joystick*/
|
|
/* Check the activate directions */
|
|
else if ( wResult != C_wJoyError )
|
|
fn_vJoyUpdateDirection(i, JoyLib_tdstJS[i], JoyLib_tdstJC[i] );
|
|
|
|
/* If we are currently in Record demo mode */
|
|
if ( JoyLib_wMode == C_wJoyDemoRecordingMode )
|
|
{
|
|
if ( ((JoyLib_tdstJS[i]->m_ulExitRecordingModeButton & JoyLib_tdstJS[i]->m_ulButton) != 0)
|
|
|| (JoyLib_ulDemoRecordCount >= JoyLib_ulDemoMaxStep) )
|
|
INO_fn_wStopRecordingJoystick();
|
|
else
|
|
{
|
|
if ( i == DemoRecordJoystick )
|
|
{
|
|
JoyLib_pstDemoRecordBuffer[JoyLib_ulDemoRecordCount].m_ulButton = JoyLib_tdstJS[i]->m_ulButton;
|
|
JoyLib_pstDemoRecordBuffer[JoyLib_ulDemoRecordCount].m_ulDirection = JoyLib_tdstJS[i]->m_ulDirection;
|
|
M_JoyCopyAxisValues(
|
|
&(JoyLib_pstDemoRecordBuffer[JoyLib_ulDemoRecordCount].m_stAxisValues),
|
|
&(JoyLib_tdstJS[i]->m_stAxisValues)
|
|
);
|
|
/*
|
|
JoyLib_pstDemoRecordBuffer[JoyLib_ulDemoRecordCount].m_ulXValue = JoyLib_tdstJS[i]->m_stAxisValues.m_uwXValue;
|
|
JoyLib_pstDemoRecordBuffer[JoyLib_ulDemoRecordCount].m_ulYValue = JoyLib_tdstJS[i]->m_stAxisValues.m_uwYValue;
|
|
JoyLib_pstDemoRecordBuffer[JoyLib_ulDemoRecordCount].m_ulZValue = JoyLib_tdstJS[i]->m_stAxisValues.m_uwZValue;
|
|
JoyLib_pstDemoRecordBuffer[JoyLib_ulDemoRecordCount].m_ulRValue = JoyLib_tdstJS[i]->m_stAxisValues.m_uwRValue;
|
|
JoyLib_pstDemoRecordBuffer[JoyLib_ulDemoRecordCount].m_ulUValue = JoyLib_tdstJS[i]->m_stAxisValues.m_uwUValue;
|
|
JoyLib_pstDemoRecordBuffer[JoyLib_ulDemoRecordCount].m_ulVValue = JoyLib_tdstJS[i]->m_stAxisValues.m_uwVValue;
|
|
*/
|
|
JoyLib_ulDemoRecordCount++;
|
|
}
|
|
}
|
|
}
|
|
|
|
/* Update the historic */
|
|
if ( wResult != C_wJoyError )
|
|
{
|
|
if ( JoyLib_tdstJS[i]->m_uwValidRecordNumber == 0 )
|
|
{
|
|
JoyLib_tdstH[i][0].m_ulDirection = JoyLib_tdstJS[i]->m_ulDirection;
|
|
JoyLib_tdstH[i][0].m_ulButton = JoyLib_tdstJS[i]->m_ulButton;
|
|
M_JoyCopyAxisValues(
|
|
&(JoyLib_tdstH[i][0].m_stAxisValues),
|
|
&(JoyLib_tdstJS[i]->m_stAxisValues)
|
|
);
|
|
/*
|
|
JoyLib_tdstH[i][0].m_ulXValue = JoyLib_tdstJS[i]->m_stAxisValues.m_uwXValue;
|
|
JoyLib_tdstH[i][0].m_ulYValue = JoyLib_tdstJS[i]->m_stAxisValues.m_uwYValue;
|
|
JoyLib_tdstH[i][0].m_ulZValue = JoyLib_tdstJS[i]->m_stAxisValues.m_uwZValue;
|
|
JoyLib_tdstH[i][0].m_ulRValue = JoyLib_tdstJS[i]->m_stAxisValues.m_uwRValue;
|
|
JoyLib_tdstH[i][0].m_ulUValue = JoyLib_tdstJS[i]->m_stAxisValues.m_uwUValue;
|
|
JoyLib_tdstH[i][0].m_ulVValue = JoyLib_tdstJS[i]->m_stAxisValues.m_uwVValue;
|
|
*/
|
|
/*JoyLib_tdstH[i][0].m_ulTimeCount = JoyLib_tdstGp.m_ulTimeCount;*/
|
|
JoyLib_tdstJS[i]->m_ulLastTimeCount = JoyLib_tdstGp.m_ulTimeCount;
|
|
JoyLib_tdstJS[i]->m_uwValidRecordNumber = 1;
|
|
}
|
|
else
|
|
{
|
|
j = JoyLib_tdstJS[i]->m_uwHistoryHead;
|
|
/* if ( (JoyLib_tdstH[i][j].m_ulDirection != JoyLib_tdstJS[i]->m_ulDirection) ||
|
|
(JoyLib_tdstH[i][j].m_ulButton != JoyLib_tdstJS[i]->m_ulButton) )
|
|
{
|
|
*/
|
|
j++;
|
|
if ( j > JoyLib_tdstGp.m_wHistorySize-1 ) j = 0;
|
|
JoyLib_tdstH[i][j].m_ulDirection = JoyLib_tdstJS[i]->m_ulDirection;
|
|
JoyLib_tdstH[i][j].m_ulButton = JoyLib_tdstJS[i]->m_ulButton;
|
|
M_JoyCopyAxisValues(
|
|
&(JoyLib_tdstH[i][j].m_stAxisValues),
|
|
&(JoyLib_tdstJS[i]->m_stAxisValues)
|
|
);
|
|
/*
|
|
JoyLib_tdstH[i][j].m_ulXValue = JoyLib_tdstJS[i]->m_stAxisValues.m_uwXValue;
|
|
JoyLib_tdstH[i][j].m_ulYValue = JoyLib_tdstJS[i]->m_stAxisValues.m_uwYValue;
|
|
JoyLib_tdstH[i][j].m_ulZValue = JoyLib_tdstJS[i]->m_stAxisValues.m_uwZValue;
|
|
JoyLib_tdstH[i][j].m_ulRValue = JoyLib_tdstJS[i]->m_stAxisValues.m_uwRValue;
|
|
JoyLib_tdstH[i][j].m_ulUValue = JoyLib_tdstJS[i]->m_stAxisValues.m_uwUValue;
|
|
JoyLib_tdstH[i][j].m_ulVValue = JoyLib_tdstJS[i]->m_stAxisValues.m_uwVValue;
|
|
*/
|
|
/*JoyLib_tdstH[i][j].m_ulTimeCount = JoyLib_tdstGp.m_ulTimeCount;*/
|
|
JoyLib_tdstJS[i]->m_ulLastTimeCount = JoyLib_tdstGp.m_ulTimeCount;
|
|
JoyLib_tdstJS[i]->m_uwHistoryHead = j;
|
|
if ( JoyLib_tdstJS[i]->m_uwValidRecordNumber != JoyLib_tdstGp.m_wHistorySize )
|
|
JoyLib_tdstJS[i]->m_uwValidRecordNumber++;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return (0);
|
|
}
|
|
|
|
|
|
/**************************************************************
|
|
**************************************************************/
|
|
|
|
/**************************************************************
|
|
Return the current position of the joystick along the specified axis
|
|
The return value is a double contained between -1.0 to 1.0.
|
|
**************************************************************/
|
|
short INO_fn_wGetJoystickCurrentPosition(short wJoystickNum, short wAxis, double *pdfPosition)
|
|
{
|
|
double dfPosition, dfMiddle, dfRange;
|
|
|
|
if ( JoyLib_tdstGp.m_wGameportOk == 0 )
|
|
{
|
|
ulJoystickErrorCode = C_ErrDriverNotInitialized;
|
|
return (C_wJoyError);
|
|
}
|
|
if ( (wJoystickNum < C_wJoystick1) || (wJoystickNum > C_wJoystick16) )
|
|
{
|
|
ulJoystickErrorCode = C_ErrBadJoystick;
|
|
return (C_wJoyError);
|
|
}
|
|
if ( (JoyLib_tdstGp.m_uwActiveFlag & (1 << wJoystickNum)) == 0 )
|
|
{
|
|
ulJoystickErrorCode = C_ErrJoystickNotActive;
|
|
return (C_wJoyError);
|
|
}
|
|
|
|
switch (wAxis)
|
|
{
|
|
case C_ulJoyX:
|
|
dfPosition = (double)M_JoyX(JoyLib_tdstJS[wJoystickNum]);
|
|
dfRange = (double)(M_JoyXMax(JoyLib_tdstJC[wJoystickNum]) - M_JoyXMin(JoyLib_tdstJC[wJoystickNum])) / 2.0;
|
|
dfMiddle = (double)(M_JoyXMax(JoyLib_tdstJC[wJoystickNum]) + M_JoyXMin(JoyLib_tdstJC[wJoystickNum])) / 2.0;
|
|
break;
|
|
case C_ulJoyY:
|
|
dfPosition = (double)M_JoyY(JoyLib_tdstJS[wJoystickNum]);
|
|
dfRange = (double)(M_JoyYMax(JoyLib_tdstJC[wJoystickNum]) - M_JoyYMin(JoyLib_tdstJC[wJoystickNum])) / 2.0;
|
|
dfMiddle = (double)(M_JoyYMax(JoyLib_tdstJC[wJoystickNum]) + M_JoyYMin(JoyLib_tdstJC[wJoystickNum])) / 2.0;
|
|
break;
|
|
case C_ulJoyZ:
|
|
dfPosition = (double)M_JoyZ(JoyLib_tdstJS[wJoystickNum]);
|
|
dfRange = (double)(M_JoyZMax(JoyLib_tdstJC[wJoystickNum]) - M_JoyZMin(JoyLib_tdstJC[wJoystickNum])) / 2.0;
|
|
dfMiddle = (double)(M_JoyZMax(JoyLib_tdstJC[wJoystickNum]) + M_JoyZMin(JoyLib_tdstJC[wJoystickNum])) / 2.0;
|
|
break;
|
|
case C_ulJoyR:
|
|
dfPosition = (double)M_JoyR(JoyLib_tdstJS[wJoystickNum]);
|
|
dfRange = (double)(M_JoyRMax(JoyLib_tdstJC[wJoystickNum]) - M_JoyRMin(JoyLib_tdstJC[wJoystickNum])) / 2.0;
|
|
dfMiddle = (double)(M_JoyRMax(JoyLib_tdstJC[wJoystickNum]) + M_JoyRMin(JoyLib_tdstJC[wJoystickNum])) / 2.0;
|
|
break;
|
|
case C_ulJoyU:
|
|
dfPosition = (double)M_JoyU(JoyLib_tdstJS[wJoystickNum]);
|
|
dfRange = (double)(M_JoyUMax(JoyLib_tdstJC[wJoystickNum]) - M_JoyUMin(JoyLib_tdstJC[wJoystickNum])) / 2.0;
|
|
dfMiddle = (double)(M_JoyUMax(JoyLib_tdstJC[wJoystickNum]) + M_JoyUMin(JoyLib_tdstJC[wJoystickNum])) / 2.0;
|
|
break;
|
|
case C_ulJoyV:
|
|
dfPosition = (double)M_JoyV(JoyLib_tdstJS[wJoystickNum]);
|
|
dfRange = (double)(M_JoyVMax(JoyLib_tdstJC[wJoystickNum]) - M_JoyVMin(JoyLib_tdstJC[wJoystickNum])) / 2.0;
|
|
dfMiddle = (double)(M_JoyVMax(JoyLib_tdstJC[wJoystickNum]) + M_JoyVMin(JoyLib_tdstJC[wJoystickNum])) / 2.0;
|
|
break;
|
|
default:
|
|
return (C_wJoyError);
|
|
}
|
|
|
|
dfPosition -= dfMiddle;
|
|
*pdfPosition = dfPosition / dfRange;
|
|
|
|
return (0);
|
|
}
|
|
|
|
/**************************************************************
|
|
Return the current position of the joystick along the specified axis
|
|
The return value is a double contained between -1.0 to 1.0.
|
|
**************************************************************/
|
|
#ifndef _FIRE_DEADCODE_U64_
|
|
short INO_fn_wGetJoystickPreviousPosition(short wJoystickNum, short wAxis, short wHistoryNum, double *pdfPosition)
|
|
{
|
|
long iIndex;
|
|
double dfPosition,dfRange,dfMiddle;
|
|
|
|
if ( JoyLib_tdstGp.m_wGameportOk == 0 )
|
|
{
|
|
ulJoystickErrorCode = C_ErrDriverNotInitialized;
|
|
return (C_wJoyError);
|
|
}
|
|
if ( (wJoystickNum < C_wJoystick1) || (wJoystickNum > C_wJoystick16) )
|
|
{
|
|
ulJoystickErrorCode = C_ErrBadJoystick;
|
|
return (C_wJoyError);
|
|
}
|
|
if ( (JoyLib_tdstGp.m_uwActiveFlag & (1 << wJoystickNum)) == 0 )
|
|
{
|
|
ulJoystickErrorCode = C_ErrJoystickNotActive;
|
|
return (C_wJoyError);
|
|
}
|
|
if ( wHistoryNum > JoyLib_tdstJS[wJoystickNum]->m_uwValidRecordNumber )
|
|
{
|
|
ulJoystickErrorCode = C_ErrJoyHistoricOverflow;
|
|
return (C_wJoyError);
|
|
}
|
|
|
|
iIndex = JoyLib_tdstJS[wJoystickNum]->m_uwHistoryHead - wHistoryNum;
|
|
switch (wAxis)
|
|
{
|
|
case C_ulJoyX:
|
|
dfPosition = (double)M_JoyX(&(JoyLib_tdstH[wJoystickNum][iIndex]));
|
|
dfRange = (double)(M_JoyXMax(JoyLib_tdstJC[wJoystickNum]) - M_JoyXMin(JoyLib_tdstJC[wJoystickNum])) / 2.0;
|
|
dfMiddle = (double)(M_JoyXMax(JoyLib_tdstJC[wJoystickNum]) + M_JoyXMin(JoyLib_tdstJC[wJoystickNum])) / 2.0;
|
|
break;
|
|
case C_ulJoyY:
|
|
dfPosition = (double)M_JoyY(&(JoyLib_tdstH[wJoystickNum][iIndex]));
|
|
dfRange = (double)(M_JoyYMax(JoyLib_tdstJC[wJoystickNum]) - M_JoyYMin(JoyLib_tdstJC[wJoystickNum])) / 2.0;
|
|
dfMiddle = (double)(M_JoyYMax(JoyLib_tdstJC[wJoystickNum]) + M_JoyYMin(JoyLib_tdstJC[wJoystickNum])) / 2.0;
|
|
break;
|
|
case C_ulJoyZ:
|
|
dfPosition = (long)M_JoyZ(&(JoyLib_tdstH[wJoystickNum][iIndex]));
|
|
dfRange = (double)(M_JoyZMax(JoyLib_tdstJC[wJoystickNum]) - M_JoyZMin(JoyLib_tdstJC[wJoystickNum])) / 2.0;
|
|
dfMiddle = (double)(M_JoyZMax(JoyLib_tdstJC[wJoystickNum]) + M_JoyZMin(JoyLib_tdstJC[wJoystickNum])) / 2.0;
|
|
break;
|
|
case C_ulJoyR:
|
|
dfPosition = (double)M_JoyR(&(JoyLib_tdstH[wJoystickNum][iIndex]));
|
|
dfRange = (double)(M_JoyRMax(JoyLib_tdstJC[wJoystickNum]) - M_JoyRMin(JoyLib_tdstJC[wJoystickNum])) / 2.0;
|
|
dfMiddle = (double)(M_JoyRMax(JoyLib_tdstJC[wJoystickNum]) + M_JoyRMin(JoyLib_tdstJC[wJoystickNum])) / 2.0;
|
|
break;
|
|
case C_ulJoyU:
|
|
dfPosition = (double)M_JoyU(&(JoyLib_tdstH[wJoystickNum][iIndex]));
|
|
dfRange = (double)(M_JoyUMax(JoyLib_tdstJC[wJoystickNum]) - M_JoyUMin(JoyLib_tdstJC[wJoystickNum])) / 2.0;
|
|
dfMiddle = (double)(M_JoyUMax(JoyLib_tdstJC[wJoystickNum]) + M_JoyUMin(JoyLib_tdstJC[wJoystickNum])) / 2.0;
|
|
break;
|
|
case C_ulJoyV:
|
|
dfPosition = (double)M_JoyV(&(JoyLib_tdstH[wJoystickNum][iIndex]));
|
|
dfRange = (double)(M_JoyVMax(JoyLib_tdstJC[wJoystickNum]) - M_JoyVMin(JoyLib_tdstJC[wJoystickNum])) / 2.0;
|
|
dfMiddle = (double)(M_JoyVMax(JoyLib_tdstJC[wJoystickNum]) + M_JoyVMin(JoyLib_tdstJC[wJoystickNum])) / 2.0;
|
|
break;
|
|
default:
|
|
return (C_wJoyError);
|
|
}
|
|
|
|
dfPosition -= dfMiddle;
|
|
*pdfPosition = dfPosition / dfRange;
|
|
|
|
return (0);
|
|
}
|
|
#endif /* _FIRE_DEADCODE_U64_ */
|
|
|