You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

165 lines
3.5 KiB

////////////////////////////////////////////////////////////////////
// Timer.cpp
//
// Copyright 2007 cDc@seacave
// Distributed under the Boost Software License, Version 1.0
// (See http://www.boost.org/LICENSE_1_0.txt)
#include "Common.h"
#include "Timer.h"
using namespace SEACAVE;
// D E F I N E S ///////////////////////////////////////////////////
// S T R U C T S ///////////////////////////////////////////////////
/**
* Constructor
*/
Timer::Timer(uint8_t nHH, uint8_t nMM)
{
m_fElapsedTime = 1.f;
m_fTimeScale = 1.f;
#ifdef FIX_FPS
m_fCurrentFramesTime = 0.f;
m_nCurrentFrames = 0;
m_nLastSecFrames = 0;
#endif // FIX_FPS
// set clock
m_fClock = 0.f;
if (nHH > 23)
nHH = 0;
if (nMM > 59)
nMM = 0;
m_nHH = nHH;
m_nMM = nMM;
m_nSS = 0;
m_nCrntTime = GetSysTime();
} // constructor
/*----------------------------------------------------------------*/
Timer::~Timer()
{
}
/*----------------------------------------------------------------*/
/**
* Counts the actual time and adjusts clock.
*/
void Timer::Update()
{
const SysType timeNow = GetSysTime();
m_fElapsedTime = SysTime2Time(timeNow - m_nCrntTime);
m_nCrntTime = timeNow;
#ifdef FIX_FPS
// compute FPS
++m_nCurrentFrames;
if ((m_fCurrentFramesTime += m_fElapsedTime) >= 1.f) {
m_nLastSecFrames = (uint32_t)((Type)m_nCurrentFrames/m_fCurrentFramesTime);
m_fCurrentFramesTime = 0.f;
m_nCurrentFrames = 0;
}
#endif // FIX_FPS
// adjust clock by seconds passed
m_fClock += (m_fElapsedTime * m_fTimeScale);
if (m_fClock >= 1.f) {
m_nSS++;
m_fClock = 0.f;
}
if (m_nSS >= 60) {
m_nMM++;
m_nSS = 0;
}
if (m_nMM >= 60) {
m_nHH++;
m_nMM = 0;
}
if (m_nHH >= 24)
m_nHH = 0;
} // Update
/*----------------------------------------------------------------*/
/**
* Sets the clock to any given starting time.
*/
void Timer::SetClock(uint8_t nHH, uint8_t nMM)
{
// set clock
if (nHH > 23)
nHH = 0;
if (nMM > 59)
nMM = 0;
m_nHH = nHH;
m_nMM = nMM;
} // SetClock
/*----------------------------------------------------------------*/
/**
* Gives you a time string with hours, minutes and seconds as return
* and hours and/or minutes as reference parameters.
*/
LPTSTR Timer::GetClock(uint8_t* nHH, uint8_t* nMM, LPTSTR szChar) const
{
if (nHH != NULL)
*nHH = m_nHH;
if (nMM != NULL)
*nMM = m_nMM;
if (szChar == NULL)
return NULL;
_sntprintf(szChar, 32, "%.2d:%.2d:%.2d", m_nHH, m_nMM, m_nSS);
return szChar;
} // GetClock
/*----------------------------------------------------------------*/
#ifdef TIMER_OLDSUPPORT
// Check performance counter
bool HasPerfCounter()
{
SysType nPerfCnt;
return QueryPerformanceFrequency((LARGE_INTEGER*)&nPerfCnt) == TRUE;
}
const bool Timer::ms_bPerfFlag = HasPerfCounter();
/*----------------------------------------------------------------*/
#endif
// Get system time factor used to convert to milliseconds
Timer::Type GetSysTimeFactor()
{
#ifdef _MSC_VER
Timer::SysType nPerfCnt;
const BOOL bPerfFlag = QueryPerformanceFrequency((LARGE_INTEGER*)&nPerfCnt);
#ifdef TIMER_OLDSUPPORT
// either QueryPerformanceCounter or GetTickCount
return (bPerfFlag ? 1000.f / nPerfCnt : 1.f);
#else
ASSERT(bPerfFlag);
return 1000.f / nPerfCnt;
#endif
#else // _MSC_VER
return 0.001f;
#endif // _MSC_VER
}
const Timer::Type Timer::ms_fTimeFactor = GetSysTimeFactor();
/*----------------------------------------------------------------*/
Timer::Type Timer::GetTimeFactor()
{
return ms_fTimeFactor;
}
/*----------------------------------------------------------------*/