675 lines
24 KiB
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 */
|
|
|