mirror of
https://github.com/coderkei/akmenu-next.git
synced 2025-06-19 01:15:32 -04:00
71 lines
1.5 KiB
C++
71 lines
1.5 KiB
C++
/*
|
||
timer.cpp
|
||
Copyright (C) 2007 Acekard, www.acekard.com
|
||
Copyright (C) 2007-2009 somebody
|
||
Copyright (C) 2009 yellow wood goblin
|
||
|
||
SPDX-License-Identifier: GPL-3.0-or-later
|
||
*/
|
||
|
||
#include "timer.h"
|
||
|
||
vu64 cTimer::_overFlow = 0;
|
||
cTimer::cTimer() {
|
||
// initTimer();
|
||
}
|
||
|
||
void cTimer::timerInterruptHandler() {
|
||
_overFlow += 65536;
|
||
}
|
||
|
||
void cTimer::initTimer() {
|
||
_lastTime = 0;
|
||
_currentTime = 0;
|
||
_overFlow = 0;
|
||
_fps = 0.f;
|
||
_fpsCounter = 0;
|
||
irqEnable(IRQ_TIMER0);
|
||
irqSet(IRQ_TIMER0, cTimer::timerInterruptHandler);
|
||
TIMER0_DATA = 0; // set reload value
|
||
TIMER0_CR = TIMER_ENABLE | TIMER_DIV_1 | TIMER_IRQ_REQ;
|
||
}
|
||
|
||
double cTimer::updateTimer() {
|
||
_currentTime = (_overFlow + TIMER0_DATA) * _factor;
|
||
return _currentTime;
|
||
}
|
||
|
||
double cTimer::updateFps() {
|
||
if (_fpsCounter++ > 60) {
|
||
double elapsedTime = _currentTime - _lastTime;
|
||
_fps = _fpsCounter / elapsedTime;
|
||
_fpsCounter = 0;
|
||
_lastTime = _currentTime;
|
||
}
|
||
return _fps;
|
||
}
|
||
|
||
double cTimer::getTime() {
|
||
return _currentTime;
|
||
}
|
||
|
||
vu64 cTimer::getTick() {
|
||
irqDisable(IRQ_TIMER0);
|
||
DC_FlushAll();
|
||
static vu64 lastTick = 0;
|
||
vu64 tick = _overFlow + TIMER0_DATA;
|
||
if (tick < lastTick)
|
||
tick += 65536; // 有时候 TIMER0_DATA 已经归0,但overflow 还没有加上,这个时候需要加上65536
|
||
lastTick = tick;
|
||
irqEnable(IRQ_TIMER0);
|
||
return tick;
|
||
}
|
||
|
||
double cTimer::tickToUs(u64 tick) {
|
||
return tick * 1.f / (33.514 * 1000000.f) * 1000 * 1000;
|
||
}
|
||
|
||
double cTimer::getFps() {
|
||
return _fps;
|
||
}
|