reman3/Rayman_X/cpa/tempgrp/Tmr/Timer.c

675 lines
24 KiB
C

/***************************************************************************/
/* Description: CPA Timer.lib. */
/* */
/* Author: F. Jentey. */
/* Last Update : 04/03/97 */
/* 14/04/97 Change prototype using TMR_fn_xxxx */
/* 16/04/97 Include CPA_std.h */
/* MT 30/04/98 Take PSX account */
/* Translate functions into Timer.cxx specific file*/
/***************************************************************************/
#include "CPA_std.h"
#ifdef PSX
#include "PSX.h"
#endif /* PSX */
/* CPA errors */
#include "ERM.h"
#define __DeclareGlobalVariableErrTmr_h__
#include "TMR/errTmr.h"
#undef __DeclareGlobalVariableErrTmr_h__
#include "TMR/Timer.h"
#include "Specif/TimerPrv.h"
/*
To store the frequency of each timer type. If a type of timer isn't
available, the corresponding entry is null. It's the case for event timer
fro the medium and high frequency.
*/
u_long a3_ulTimerFrequency[3];
u_long a3_ulEventFrequency[3];
/* Info variables */
tdstTimer a_stTimerTab[C_uwTimerMaxCount];
short wTimerCount = 0;
short TimerLibOk = 0; /* Equals to the actual number of user */
short TMR_g_wErmOK = 0;
/************************************************/
/* Private functions */
/************************************************/
/*
Add, Sub stTimerCount value
stOp1 is always greater than stOp2
*/
void fn_vAddTimerValues(stTimerCount* stOp1, stTimerCount* stOp2)
{
u_long ulTmpValue;
ulTmpValue = stOp1->m_ulLowPart + stOp2->m_ulLowPart;
if ( ulTmpValue < stOp1->m_ulLowPart )
stOp1->m_ulHighPart++;
stOp1->m_ulLowPart = ulTmpValue;
stOp1->m_ulHighPart += stOp2->m_ulHighPart;
}
void fn_vSubTimerValues(stTimerCount* stOp1, stTimerCount* stOp2)
{
if ( stOp1->m_ulHighPart == stOp2->m_ulHighPart )
{
stOp1->m_ulLowPart -= stOp2->m_ulLowPart;
stOp1->m_ulHighPart = 0;
}
else
{
if ( stOp1->m_ulLowPart >= stOp2->m_ulLowPart )
stOp1->m_ulLowPart -= stOp2->m_ulLowPart;
else
{
stOp1->m_ulLowPart += 0xffffffff - stOp2->m_ulLowPart + 1;
stOp1->m_ulHighPart--;
}
stOp1->m_ulHighPart -= stOp2->m_ulHighPart;
}
}
/************************************************/
/* Public functions */
/************************************************/
/*
short __stdcall TMR_fn_wInitLibrary( void )
and
short __stdcall TMR_fn_wExitLibrary( void )
translated into the Timer.cxx specific file
*/
#include "Specif\Timer.cxx"
/*
This fonction create a timer and return an handle to this timer.
The parameter wTimerType define the resolution of the timer and must
set to one of the C_wTimerType Flag.
*/
short __stdcall TMR_fn_wCreateTimer( short wTimerType )
{
short i;
if ( TimerLibOk == 0 )
{
Erm_M_UpdateLastError(Tmr, C_ucErmDefaultChannel, E_uwTmrLibraryNotInitialized, C_lErmNoDebugData, C_ucErmOpenInfoWindow, C_ucAllowStopForDebug, NULL);
return (C_wTimerError);
}
if ( wTimerCount == C_uwTimerMaxCount )
{
Erm_M_UpdateLastError(Tmr, C_ucErmDefaultChannel, E_uwTmrMaxTimerCountReached, C_lErmNoDebugData, C_ucErmOpenInfoWindow, C_ucAllowStopForDebug, NULL);
return (C_wTimerError);
}
if ( wTimerType > C_wTimerFrequencyHigh )
{
Erm_M_UpdateLastError(Tmr, C_ucErmDefaultChannel, E_uwTmrInvalidType, C_lErmNoDebugData, C_ucErmOpenInfoWindow, C_ucAllowStopForDebug, NULL);
return (C_wTimerError);
}
if ( a3_ulTimerFrequency[wTimerType] == 0 )
{
Erm_M_UpdateLastError(Tmr, C_ucErmDefaultChannel, E_uwTmrTypeNotAvailable, C_lErmNoDebugData, C_ucErmOpenInfoWindow, C_ucAllowStopForDebug, NULL);
return (C_wTimerError);
}
for ( i = 0 ; i < C_uwTimerMaxCount ; i++ )
if ( a_stTimerTab[i].m_wTimerState == C_wTimerUnused ) break;
if ( i == C_uwTimerMaxCount )
{
Erm_M_UpdateLastError(Tmr, C_ucErmDefaultChannel, E_uwTmrMaxTimerCountReached, C_lErmNoDebugData, C_ucErmOpenInfoWindow, C_ucAllowStopForDebug, NULL);
return (C_wTimerError);
}
a_stTimerTab[i].m_wTimerType = wTimerType;
a_stTimerTab[i].m_wTimerState = C_wTimerReady;
wTimerCount++;
return (i);
}
/*
Start a timer.
*/
short __stdcall TMR_fn_wStartTimer( short wTimerHandle )
{
short wTimerType;
stTimerCount stValue;
if ( TimerLibOk == 0 )
{
Erm_M_UpdateLastError (Tmr, C_ucErmDefaultChannel, E_uwTmrLibraryNotInitialized, C_lErmNoDebugData, C_ucErmOpenInfoWindow, C_ucAllowStopForDebug, NULL);
return (C_wTimerError);
}
if ( wTimerHandle >= C_uwTimerMaxCount )
{
Erm_M_UpdateLastError (Tmr, C_ucErmDefaultChannel, E_uwTmrInvalidHandle, C_lErmNoDebugData, C_ucErmOpenInfoWindow, C_ucAllowStopForDebug, NULL);
return (C_wTimerError);
}
if ( a_stTimerTab[wTimerHandle].m_wTimerState == C_wTimerUnused )
{
Erm_M_UpdateLastError (Tmr, C_ucErmDefaultChannel, E_uwTmrInvalidHandle, C_lErmNoDebugData, C_ucErmOpenInfoWindow, C_ucAllowStopForDebug, NULL);
return (C_wTimerError);
}
if ( a_stTimerTab[wTimerHandle].m_wTimerType > C_wTimerFrequencyHigh )
{
Erm_M_UpdateLastError (Tmr, C_ucErmDefaultChannel, E_uwTmrInvalidForEventTimer, C_lErmNoDebugData, C_ucErmOpenInfoWindow, C_ucAllowStopForDebug, NULL);
return (C_wTimerError);
}
/*if ( (a_stTimerTab[wTimerHandle].m_wTimerState != C_wTimerReady) &&
(a_stTimerTab[wTimerHandle].m_wTimerState != C_wTimerPaused) )
{
ulTimerErrorCode = C_ErrTimerNotReady;
return (C_wTimerError);
}*/
wTimerType = a_stTimerTab[wTimerHandle].m_wTimerType;
fn_vTimerGetCounter(wTimerType,&stValue);
a_stTimerTab[wTimerHandle].m_stTimerCount_InitValue.m_ulLowPart = stValue.m_ulLowPart;
a_stTimerTab[wTimerHandle].m_stTimerCount_InitValue.m_ulHighPart = stValue.m_ulHighPart;
if ( a_stTimerTab[wTimerHandle].m_wTimerState != C_wTimerPaused )
{
a_stTimerTab[wTimerHandle].m_stTimerCount_TotalValue.m_ulLowPart = 0;
a_stTimerTab[wTimerHandle].m_stTimerCount_TotalValue.m_ulHighPart = 0;
}
a_stTimerTab[wTimerHandle].m_wTimerState = C_wTimerRunning;
return (0);
}
/*
Stop a Timer.
*/
short __stdcall TMR_fn_wStopTimer( short wTimerHandle )
{
short wTimerType;
stTimerCount stValue;
if ( TimerLibOk == 0 )
{
Erm_M_UpdateLastError (Tmr, C_ucErmDefaultChannel, E_uwTmrLibraryNotInitialized, C_lErmNoDebugData, C_ucErmOpenInfoWindow, C_ucAllowStopForDebug, NULL);
return (C_wTimerError);
}
if ( wTimerHandle >= C_uwTimerMaxCount )
{
Erm_M_UpdateLastError (Tmr, C_ucErmDefaultChannel, E_uwTmrInvalidHandle, C_lErmNoDebugData, C_ucErmOpenInfoWindow, C_ucAllowStopForDebug, NULL);
return (C_wTimerError);
}
if ( a_stTimerTab[wTimerHandle].m_wTimerState == C_wTimerUnused )
{
Erm_M_UpdateLastError (Tmr, C_ucErmDefaultChannel, E_uwTmrInvalidHandle, C_lErmNoDebugData, C_ucErmOpenInfoWindow, C_ucAllowStopForDebug, NULL);
return (C_wTimerError);
}
if ( a_stTimerTab[wTimerHandle].m_wTimerType > C_wTimerFrequencyHigh )
{
Erm_M_UpdateLastError (Tmr, C_ucErmDefaultChannel, E_uwTmrInvalidForEventTimer, C_lErmNoDebugData, C_ucErmOpenInfoWindow, C_ucAllowStopForDebug, NULL);
return (C_wTimerError);
}
/*if (a_stTimerTab[wTimerHandle].m_wTimerState < C_wTimerRunning )
{
Erm_M_UpdateLastError (Tmr, C_ucErmDefaultChannel, E_uwTmrStartTimerFirst, C_lErmNoDebugData, C_ucErmOpenInfoWindow, C_ucAllowStopForDebug, NULL);
return (C_wTimerError);
}*/
wTimerType = a_stTimerTab[wTimerHandle].m_wTimerType;
if ( a_stTimerTab[wTimerHandle].m_wTimerState == C_wTimerRunning )
{
fn_vTimerGetCounter(wTimerType,&stValue);
a_stTimerTab[wTimerHandle].m_stTimerCount_LastValue.m_ulLowPart = stValue.m_ulLowPart;
a_stTimerTab[wTimerHandle].m_stTimerCount_LastValue.m_ulHighPart = stValue.m_ulHighPart;
}
if ( a_stTimerTab[wTimerHandle].m_wTimerState == C_wTimerPaused )
{
a_stTimerTab[wTimerHandle].m_stTimerCount_LastValue.m_ulLowPart =
a_stTimerTab[wTimerHandle].m_stTimerCount_TotalValue.m_ulLowPart;
a_stTimerTab[wTimerHandle].m_stTimerCount_LastValue.m_ulHighPart =
a_stTimerTab[wTimerHandle].m_stTimerCount_TotalValue.m_ulHighPart;
a_stTimerTab[wTimerHandle].m_stTimerCount_TotalValue.m_ulLowPart = 0;
a_stTimerTab[wTimerHandle].m_stTimerCount_TotalValue.m_ulHighPart = 0;
a_stTimerTab[wTimerHandle].m_stTimerCount_InitValue.m_ulLowPart = 0;
a_stTimerTab[wTimerHandle].m_stTimerCount_InitValue.m_ulHighPart = 0;
}
a_stTimerTab[wTimerHandle].m_wTimerState = C_wTimerStop;
return (0);
}
/*
Pause a Timer.
*/
#ifndef _FIRE_DEADCODE_U64_ /* Added by RUC */
short __stdcall TMR_fn_wPauseTimer( short wTimerHandle )
{
short wTimerType;
stTimerCount stValue, stTempCount;
if ( TimerLibOk == 0 )
{
Erm_M_UpdateLastError (Tmr, C_ucErmDefaultChannel, E_uwTmrLibraryNotInitialized, C_lErmNoDebugData, C_ucErmOpenInfoWindow, C_ucAllowStopForDebug, NULL);
return (C_wTimerError);
}
if ( wTimerHandle >= C_uwTimerMaxCount )
{
Erm_M_UpdateLastError (Tmr, C_ucErmDefaultChannel, E_uwTmrInvalidHandle, C_lErmNoDebugData, C_ucErmOpenInfoWindow, C_ucAllowStopForDebug, NULL);
return (C_wTimerError);
}
if ( a_stTimerTab[wTimerHandle].m_wTimerState == C_wTimerUnused )
{
Erm_M_UpdateLastError (Tmr, C_ucErmDefaultChannel, E_uwTmrInvalidHandle, C_lErmNoDebugData, C_ucErmOpenInfoWindow, C_ucAllowStopForDebug, NULL);
return (C_wTimerError);
}
if ( a_stTimerTab[wTimerHandle].m_wTimerType > C_wTimerFrequencyHigh )
{
Erm_M_UpdateLastError (Tmr, C_ucErmDefaultChannel, E_uwTmrInvalidForEventTimer, C_lErmNoDebugData, C_ucErmOpenInfoWindow, C_ucAllowStopForDebug, NULL);
return (C_wTimerError);
}
/*
if (a_stTimerTab[wTimerHandle].m_wTimerState < C_wTimerRunning )
{
Erm_M_UpdateLastError (Tmr, C_ucErmDefaultChannel, E_uwTmrStartTimerFirst, C_lErmNoDebugData, C_ucErmOpenInfoWindow, C_ucAllowStopForDebug, NULL);
return (C_wTimerError);
}*/
wTimerType = a_stTimerTab[wTimerHandle].m_wTimerType;
/* If the timer is running, Add the elapsed time to the total count */
if ( a_stTimerTab[wTimerHandle].m_wTimerState == C_wTimerRunning )
{
fn_vTimerGetCounter(wTimerType,&stTempCount);
stValue.m_ulLowPart = a_stTimerTab[wTimerHandle].m_stTimerCount_InitValue.m_ulLowPart;
stValue.m_ulHighPart = a_stTimerTab[wTimerHandle].m_stTimerCount_InitValue.m_ulHighPart;
fn_vSubTimerValues(&stTempCount,&stValue);
stValue.m_ulLowPart = a_stTimerTab[wTimerHandle].m_stTimerCount_TotalValue.m_ulLowPart;
stValue.m_ulHighPart = a_stTimerTab[wTimerHandle].m_stTimerCount_TotalValue.m_ulHighPart;
fn_vAddTimerValues(&stTempCount,&stValue);
a_stTimerTab[wTimerHandle].m_stTimerCount_TotalValue.m_ulLowPart = stTempCount.m_ulLowPart;
a_stTimerTab[wTimerHandle].m_stTimerCount_TotalValue.m_ulHighPart = stTempCount.m_ulHighPart;
}
a_stTimerTab[wTimerHandle].m_wTimerState = C_wTimerPaused;
return (0);
}
#endif /* _FIRE_DEADCODE_U64_ */ /* Added by RUC */
/*
Set timer current value. The timer is paused
*/
short __stdcall TMR_fn_wSetTimerValue( short wTimerHandle, stTimerCount *p_stValue )
{
short wTimerType;
if ( TimerLibOk == 0 )
{
Erm_M_UpdateLastError (Tmr, C_ucErmDefaultChannel, E_uwTmrLibraryNotInitialized, C_lErmNoDebugData, C_ucErmOpenInfoWindow, C_ucAllowStopForDebug, NULL);
return (C_wTimerError);
}
if ( wTimerHandle >= C_uwTimerMaxCount )
{
Erm_M_UpdateLastError (Tmr, C_ucErmDefaultChannel, E_uwTmrInvalidHandle, C_lErmNoDebugData, C_ucErmOpenInfoWindow, C_ucAllowStopForDebug, NULL);
return (C_wTimerError);
}
if ( a_stTimerTab[wTimerHandle].m_wTimerType > C_wTimerFrequencyHigh )
{
Erm_M_UpdateLastError (Tmr, C_ucErmDefaultChannel, E_uwTmrInvalidForEventTimer, C_lErmNoDebugData, C_ucErmOpenInfoWindow, C_ucAllowStopForDebug, NULL);
return (C_wTimerError);
}
wTimerType = a_stTimerTab[wTimerHandle].m_wTimerType;
a_stTimerTab[wTimerHandle].m_stTimerCount_TotalValue.m_ulLowPart = p_stValue->m_ulLowPart;
a_stTimerTab[wTimerHandle].m_stTimerCount_TotalValue.m_ulHighPart = p_stValue->m_ulHighPart;
a_stTimerTab[wTimerHandle].m_wTimerState = C_wTimerPaused;
return (0);
}
/*
Return the timer count tdsTimerCount structure pointed by p_tdsTimerCount.
*/
short __stdcall TMR_fn_wReadTimer( short wTimerHandle, stTimerCount *p_stTimerCount)
{
short wTimerState;
stTimerCount stValue;
/* p_stTimerCount->m_ulLowPart = 0;
p_stTimerCount->m_ulHighPart = 0;
*/
if ( TimerLibOk == 0 )
{
Erm_M_UpdateLastError (Tmr, C_ucErmDefaultChannel, E_uwTmrLibraryNotInitialized, C_lErmNoDebugData, C_ucErmOpenInfoWindow, C_ucAllowStopForDebug, NULL);
return (C_wTimerError);
}
if ( wTimerHandle >= C_uwTimerMaxCount )
{
Erm_M_UpdateLastError (Tmr, C_ucErmDefaultChannel, E_uwTmrInvalidHandle, C_lErmNoDebugData, C_ucErmOpenInfoWindow, C_ucAllowStopForDebug, NULL);
return (C_wTimerError);
}
if ( a_stTimerTab[wTimerHandle].m_wTimerState == C_wTimerUnused )
{
Erm_M_UpdateLastError (Tmr, C_ucErmDefaultChannel, E_uwTmrInvalidHandle, C_lErmNoDebugData, C_ucErmOpenInfoWindow, C_ucAllowStopForDebug, NULL);
return (C_wTimerError);
}
if ( a_stTimerTab[wTimerHandle].m_wTimerType > C_wTimerFrequencyHigh )
{
Erm_M_UpdateLastError (Tmr, C_ucErmDefaultChannel, E_uwTmrInvalidForEventTimer, C_lErmNoDebugData, C_ucErmOpenInfoWindow, C_ucAllowStopForDebug, NULL);
return (C_wTimerError);
}
/*
if ( a_stTimerTab[wTimerHandle].m_wTimerState < C_wTimerRunning )
{
Erm_M_UpdateLastError (Tmr, C_ucErmDefaultChannel, E_uwTmrStartTimerFirst, C_lErmNoDebugData, C_ucErmOpenInfoWindow, C_ucAllowStopForDebug, NULL);
return (C_wTimerError);
}*/
wTimerState = a_stTimerTab[wTimerHandle].m_wTimerState;
switch ( wTimerState )
{
/* If the timer is running */
case C_wTimerRunning:
fn_vTimerGetCounter(a_stTimerTab[wTimerHandle].m_wTimerType,p_stTimerCount);
stValue.m_ulLowPart = a_stTimerTab[wTimerHandle].m_stTimerCount_InitValue.m_ulLowPart;
stValue.m_ulHighPart = a_stTimerTab[wTimerHandle].m_stTimerCount_InitValue.m_ulHighPart;
fn_vSubTimerValues(p_stTimerCount,&stValue);
break;
/* If the timer is stoped */
case C_wTimerStop:
p_stTimerCount->m_ulLowPart = a_stTimerTab[wTimerHandle].m_stTimerCount_LastValue.m_ulLowPart;
p_stTimerCount->m_ulHighPart = a_stTimerTab[wTimerHandle].m_stTimerCount_LastValue.m_ulHighPart;
stValue.m_ulLowPart = a_stTimerTab[wTimerHandle].m_stTimerCount_InitValue.m_ulLowPart;
stValue.m_ulHighPart = a_stTimerTab[wTimerHandle].m_stTimerCount_InitValue.m_ulHighPart;
fn_vSubTimerValues(p_stTimerCount,&stValue);
break;
/* If the timer is paused or ready */
case C_wTimerReady:
case C_wTimerPaused:
p_stTimerCount->m_ulHighPart = 0;
p_stTimerCount->m_ulLowPart = 0;
break;
}
/* Add the total count */
stValue.m_ulLowPart = a_stTimerTab[wTimerHandle].m_stTimerCount_TotalValue.m_ulLowPart;
stValue.m_ulHighPart = a_stTimerTab[wTimerHandle].m_stTimerCount_TotalValue.m_ulHighPart;
fn_vAddTimerValues(p_stTimerCount,&stValue);
return (0);
}
/*
Reset a timer.
*/
short __stdcall TMR_fn_wResetTimer( short wTimerHandle )
{
if ( TimerLibOk == 0 )
{
Erm_M_UpdateLastError (Tmr, C_ucErmDefaultChannel, E_uwTmrLibraryNotInitialized, C_lErmNoDebugData, C_ucErmOpenInfoWindow, C_ucAllowStopForDebug, NULL);
return (C_wTimerError);
}
if ( wTimerHandle >= C_uwTimerMaxCount )
{
Erm_M_UpdateLastError (Tmr, C_ucErmDefaultChannel, E_uwTmrInvalidHandle, C_lErmNoDebugData, C_ucErmOpenInfoWindow, C_ucAllowStopForDebug, NULL);
return (C_wTimerError);
}
if ( a_stTimerTab[wTimerHandle].m_wTimerState == C_wTimerUnused )
{
Erm_M_UpdateLastError (Tmr, C_ucErmDefaultChannel, E_uwTmrInvalidHandle, C_lErmNoDebugData, C_ucErmOpenInfoWindow, C_ucAllowStopForDebug, NULL);
return (C_wTimerError);
}
if ( a_stTimerTab[wTimerHandle].m_wTimerType > C_wTimerFrequencyHigh )
{
Erm_M_UpdateLastError (Tmr, C_ucErmDefaultChannel, E_uwTmrInvalidForEventTimer, C_lErmNoDebugData, C_ucErmOpenInfoWindow, C_ucAllowStopForDebug, NULL);
return (C_wTimerError);
}
a_stTimerTab[wTimerHandle].m_wTimerState = C_wTimerReady;
a_stTimerTab[wTimerHandle].m_stTimerCount_InitValue.m_ulLowPart = 0;
a_stTimerTab[wTimerHandle].m_stTimerCount_InitValue.m_ulHighPart = 0;
a_stTimerTab[wTimerHandle].m_stTimerCount_LastValue.m_ulLowPart = 0;
a_stTimerTab[wTimerHandle].m_stTimerCount_LastValue.m_ulHighPart = 0;
a_stTimerTab[wTimerHandle].m_stTimerCount_TotalValue.m_ulLowPart = 0;
a_stTimerTab[wTimerHandle].m_stTimerCount_TotalValue.m_ulHighPart = 0;
return (0);
}
/*
Destroy a timer.
*/
#ifndef _FIRE_DEADCODE_U64_ /* Added by RUC */
short __stdcall TMR_fn_wDestroyTimer( short wTimerHandle )
{
if ( TimerLibOk == 0 )
{
Erm_M_UpdateLastError (Tmr, C_ucErmDefaultChannel, E_uwTmrLibraryNotInitialized, C_lErmNoDebugData, C_ucErmOpenInfoWindow, C_ucAllowStopForDebug, NULL);
return (C_wTimerError);
}
if ( (wTimerHandle >= C_uwTimerMaxCount) ||
(a_stTimerTab[wTimerHandle].m_wTimerState == C_wTimerUnused) )
{
Erm_M_UpdateLastError (Tmr, C_ucErmDefaultChannel, E_uwTmrInvalidHandle, C_lErmNoDebugData, C_ucErmOpenInfoWindow, C_ucAllowStopForDebug, NULL);
return (C_wTimerError);
}
a_stTimerTab[wTimerHandle].m_wTimerState = C_wTimerUnused;
/* If the timer is an event timer, destroy the event*/
if ( a_stTimerTab[wTimerHandle].m_wTimerType > C_wTimerFrequencyHigh )
{
fn_wTimerDestroyEvent( a_stTimerTab[wTimerHandle].m_ulEventId );
a_stTimerTab[wTimerHandle].m_ulEventId = 0;
a_stTimerTab[wTimerHandle].m_p_fn_vEventCallback = NULL;
}
wTimerCount--;
return (0);
}
/*
This function fills the p_ulFrequency with the frequency of the
specified timer type.
*/
short __stdcall TMR_fn_wGetTimerFrequency( short wTimerHandle , u_long *p_ulFrequency )
{
short wTimerType;
if ( TimerLibOk == 0 )
{
Erm_M_UpdateLastError (Tmr, C_ucErmDefaultChannel, E_uwTmrLibraryNotInitialized, C_lErmNoDebugData, C_ucErmOpenInfoWindow, C_ucAllowStopForDebug, NULL);
return (C_wTimerError);
}
if ( a_stTimerTab[wTimerHandle].m_wTimerState == C_wTimerUnused )
{
Erm_M_UpdateLastError (Tmr, C_ucErmDefaultChannel, E_uwTmrInvalidHandle, C_lErmNoDebugData, C_ucErmOpenInfoWindow, C_ucAllowStopForDebug, NULL);
return (C_wTimerError);
}
if ( a_stTimerTab[wTimerHandle].m_wTimerState == C_wTimerUnused )
{
Erm_M_UpdateLastError (Tmr, C_ucErmDefaultChannel, E_uwTmrInvalidHandle, C_lErmNoDebugData, C_ucErmOpenInfoWindow, C_ucAllowStopForDebug, NULL);
return (C_wTimerError);
}
wTimerType = a_stTimerTab[wTimerHandle].m_wTimerType;
if ( wTimerType <= C_wTimerFrequencyHigh )
*p_ulFrequency = a3_ulTimerFrequency[wTimerType];
else
*p_ulFrequency = a3_ulEventFrequency[wTimerType - C_wTimerEvent];
return (0);
}
/*
This function wait The time unit is system dependant but should be
1000 ticks per second.
*/
short __stdcall TMR_fn_wWait( u_long ulTimeToWait )
{
if ( TimerLibOk == 0 )
{
Erm_M_UpdateLastError (Tmr, C_ucErmDefaultChannel, E_uwTmrLibraryNotInitialized, C_lErmNoDebugData, C_ucErmOpenInfoWindow, C_ucAllowStopForDebug, NULL);
return (C_wTimerError);
}
fn_vTimerWait(ulTimeToWait);
return (0);
}
/*
Return the number of ticks pre second for the fn_wTimerDelay function
*/
short __stdcall TMR_fn_wGetWaitTickPerSecond(u_long *p_ulDelayFrequency)
{
if ( TimerLibOk == 0 )
{
Erm_M_UpdateLastError (Tmr, C_ucErmDefaultChannel, E_uwTmrLibraryNotInitialized, C_lErmNoDebugData, C_ucErmOpenInfoWindow, C_ucAllowStopForDebug, NULL);
return (C_wTimerError);
}
*p_ulDelayFrequency = fn_ulTimerWaitTicksPerSecond();
return (0);
}
/*
This function create a callback timer. Parameters are the timer ncy,
a pointer to the callback function (returning void) and the timer type.
ulPeriod defines the interval between two call of the callback function.
The C_wTimerFrequencyLow is the only timer type available for event timer.
*/
short __stdcall TMR_fn_wCreateEvent(
u_long ulPeriod ,
td_p_fn_vTimerEventCallback p_fn_vEventCallback ,
short wTimerType ,
u_long ulTimerEventType
)
{
short wCreateEventResult;
u_long ulEventId;
int i;
if ( TimerLibOk == 0 )
{
Erm_M_UpdateLastError (Tmr, C_ucErmDefaultChannel, E_uwTmrLibraryNotInitialized, C_lErmNoDebugData, C_ucErmOpenInfoWindow, C_ucAllowStopForDebug, NULL);
return (C_wTimerError);
}
if ( wTimerType > C_wTimerFrequencyLow )
{
Erm_M_UpdateLastError(Tmr, C_ucErmDefaultChannel, E_uwTmrTypeNotAvailable, C_lErmNoDebugData, C_ucErmOpenInfoWindow, C_ucAllowStopForDebug, NULL);
return (C_wTimerError);
}
for ( i = 0 ; i < C_uwTimerMaxCount ; i++ )
if ( (a_stTimerTab[i].m_wTimerState == C_wTimerUnused) || (i>=C_uwTimerMaxCount) ) break;
if ( i == C_uwTimerMaxCount )
{
Erm_M_UpdateLastError(Tmr, C_ucErmDefaultChannel, E_uwTmrMaxTimerCountReached, C_lErmNoDebugData, C_ucErmOpenInfoWindow, C_ucAllowStopForDebug, NULL);
return (C_wTimerError);
}
a_stTimerTab[i].m_wTimerType = wTimerType + C_wTimerEvent;
a_stTimerTab[i].m_wTimerState = C_wTimerReady;
wCreateEventResult = fn_wTimerNewEvent(
ulPeriod,
a3_ulEventFrequency[wTimerType],
p_fn_vEventCallback,
ulTimerEventType,
&ulEventId
);
if ( wCreateEventResult == C_wTimerError )
{
a_stTimerTab[i].m_wTimerState = C_wTimerUnused;
Erm_M_UpdateLastError(Tmr, C_ucErmDefaultChannel, E_uwTmrCreateEventFailed, C_lErmNoDebugData, C_ucErmOpenInfoWindow, C_ucAllowStopForDebug, NULL);
return (C_wTimerError);
}
a_stTimerTab[i].m_ulEventId = ulEventId;
a_stTimerTab[i].m_p_fn_vEventCallback = p_fn_vEventCallback;
wTimerCount++;
return (i);
}
/*
This function return vertical refresh rate in Hz * 100.
*/
u_long __stdcall TMR_fn_ulMonitorFrequency( void )
{
u_long ulFrequency;
if ( TimerLibOk == 0 )
{
Erm_M_UpdateLastError (Tmr, C_ucErmDefaultChannel, E_uwTmrLibraryNotInitialized, C_lErmNoDebugData, C_ucErmOpenInfoWindow, C_ucAllowStopForDebug, NULL);
return (C_wTimerError);
}
ulFrequency = fn_ulTimerVerticalRefreshRate(a3_ulTimerFrequency[C_wTimerFrequencyHigh]);
return (ulFrequency);
}
/*
This function return the length of a frame. The units length is the tick
of a C_wTimerFrequencyHigh timer type (so the return value is the number CPU cycle)
*/
u_long __stdcall TMR_fn_ulFrameCycleNumber( void )
{
u_long ulFrequency;
if ( TimerLibOk == 0 )
{
Erm_M_UpdateLastError (Tmr, C_ucErmDefaultChannel, E_uwTmrLibraryNotInitialized, C_lErmNoDebugData, C_ucErmOpenInfoWindow, C_ucAllowStopForDebug, NULL);
return (C_wTimerError);
}
ulFrequency = fn_ulTimerFrameLength();
return (ulFrequency);
}
#endif /* _FIRE_DEADCODE_U64_ */ /* Added by RUC */