Revised timer functions

This commit is contained in:
d0k3 2017-06-20 00:07:32 +02:00
parent 093438413b
commit 17502ff5a1
5 changed files with 40 additions and 27 deletions

View File

@ -7,8 +7,8 @@ u32 InputWait() {
u32 pad_state_old = HID_STATE;
u32 cart_state_old = CART_STATE;
u32 sd_state_old = SD_STATE;
u64 timer = timer_start();
delay = (delay) ? 72 : 128;
timer_start();
while (true) {
u32 pad_state = HID_STATE;
if (!(pad_state & BUTTON_ANY)) { // no buttons pressed
@ -29,7 +29,7 @@ u32 InputWait() {
}
if ((pad_state == pad_state_old) &&
(!(pad_state & BUTTON_ARROW) ||
(delay && (timer_msec() < delay))))
(delay && (timer_msec(timer) < delay))))
continue;
// make sure the key is pressed
u32 t_pressed = 0;

View File

@ -1,6 +1,8 @@
#include "timer.h"
void timer_start( void ) {
u64 timer_start( void ) {
static bool timer_init = true;
if (timer_init) {
// reset / deactivate timers
*TIMER_CNT0 = 0;
*TIMER_CNT1 = *TIMER_CNT2 = *TIMER_CNT3 = TIMER_COUNT_UP;
@ -9,28 +11,38 @@ void timer_start( void ) {
// start timers
*TIMER_CNT0 = TIMER_ACTIVE;
*TIMER_CNT1 = *TIMER_CNT2 = *TIMER_CNT3 = TIMER_ACTIVE | TIMER_COUNT_UP;
// timer initialized (no need to do this more than once)
timer_init = false;
}
return timer_ticks( 0 );
}
void timer_stop( void ) {
/*void timer_stop( void ) {
*TIMER_CNT0 &= ~TIMER_ACTIVE;
*TIMER_CNT1 &= ~TIMER_ACTIVE;
*TIMER_CNT2 &= ~TIMER_ACTIVE;
*TIMER_CNT3 &= ~TIMER_ACTIVE;
}
}*/
u64 timer_ticks( void ) {
u64 timer_ticks( u64 start_time ) {
u64 ticks = 0;
ticks |= (u64) *TIMER_VAL0 << 0;
ticks |= (u64) *TIMER_VAL1 << 16;
ticks |= (u64) *TIMER_VAL2 << 32;
ticks |= (u64) *TIMER_VAL3 << 48;
return ticks;
return ticks - start_time;
}
u64 timer_msec( void ) {
return (timer_ticks() * 1000) / TICKS_PER_SEC;
u64 timer_msec( u64 start_time ) {
return timer_ticks( start_time ) / (TICKS_PER_SEC/1000);
}
u64 timer_sec( void ) {
return timer_ticks() / TICKS_PER_SEC;
u64 timer_sec( u64 start_time ) {
return timer_ticks( start_time ) / TICKS_PER_SEC;
}
void wait_msec( u64 msec ) {
u64 timer = timer_start();
while (timer_msec( timer ) < msec );
}

View File

@ -16,8 +16,8 @@
#define TIMER_ACTIVE 0x0080
#define TICKS_PER_SEC 67027964ULL
void timer_start( void );
void timer_stop( void );
u64 timer_ticks( void );
u64 timer_msec( void );
u64 timer_sec( void );
u64 timer_start( void );
u64 timer_ticks( u64 start_time );
u64 timer_msec( u64 start_time );
u64 timer_sec( u64 start_time );
void wait_msec( u64 msec );

View File

@ -608,13 +608,14 @@ bool ShowProgress(u64 current, u64 total, const char* opstr)
u32 prog_percent = ((total > 0) && (current <= total)) ? (current * 100) / total : 0;
char tempstr[64];
char progstr[64];
u64 timer = 0;
static u64 last_sec_remain = 0;
if (!current) {
timer_start();
timer = timer_start();
last_sec_remain = 0;
}
u64 sec_elapsed = (total > 0) ? timer_sec() : 0;
u64 sec_elapsed = (total > 0) ? timer_sec( timer ) : 0;
u64 sec_total = (current > 0) ? (sec_elapsed * total) / current : 0;
u64 sec_remain = (!last_sec_remain) ? (sec_total - sec_elapsed) : ((last_sec_remain + (sec_total - sec_elapsed) + 1) / 2);
if (sec_remain >= 60 * 60) sec_remain = 60 * 60 - 1;

View File

@ -1373,7 +1373,7 @@ u32 GodMode() {
}
SplashInit();
timer_start(); // show splash for at least 1 sec
u64 timer = timer_start(); // show splash for at least 1 sec
InitSDCardFS();
AutoEmuNandBase(true);
@ -1396,7 +1396,7 @@ u32 GodMode() {
clipboard->n_entries = 0;
memset(panedata, 0x00, 0x10000);
while(timer_sec() < 1); // show splash for at least 1 sec
while(timer_sec( timer ) < 1); // show splash for at least 1 sec
ClearScreenF(true, true, COLOR_STD_BG); // clear splash
while (true) { // this is the main loop