Use timer for continuous scrolling

This commit is contained in:
d0k3 2016-05-30 01:54:09 +02:00
parent 0aae5408b8
commit c010efb236
4 changed files with 63 additions and 1 deletions

View File

@ -1,14 +1,16 @@
#include "hid.h" #include "hid.h"
#include "timer.h"
u32 InputWait() { u32 InputWait() {
u32 pad_state_old = HID_STATE; u32 pad_state_old = HID_STATE;
timer_start();
while (true) { while (true) {
u32 pad_state = HID_STATE; u32 pad_state = HID_STATE;
if (!(~pad_state & BUTTON_ANY)) { // no buttons pressed if (!(~pad_state & BUTTON_ANY)) { // no buttons pressed
pad_state_old = pad_state; pad_state_old = pad_state;
continue; continue;
} }
if (pad_state == pad_state_old) if ((pad_state == pad_state_old) && (!(pad_state & BUTTON_ARROW) || timer_msec() < 120))
continue; continue;
//Make sure the key is pressed //Make sure the key is pressed
u32 t_pressed = 0; u32 t_pressed = 0;

View File

@ -17,5 +17,6 @@
#define BUTTON_X (1 << 10) #define BUTTON_X (1 << 10)
#define BUTTON_Y (1 << 11) #define BUTTON_Y (1 << 11)
#define BUTTON_ANY 0x00000FFF #define BUTTON_ANY 0x00000FFF
#define BUTTON_ARROW (BUTTON_RIGHT|BUTTON_LEFT|BUTTON_UP|BUTTON_DOWN)
u32 InputWait(); u32 InputWait();

36
source/timer.c Normal file
View File

@ -0,0 +1,36 @@
#include "timer.h"
void timer_start( void ) {
// reset / deactivate timers
*TIMER_CNT0 = 0;
*TIMER_CNT1 = *TIMER_CNT2 = *TIMER_CNT3 = TIMER_COUNT_UP;
*TIMER_VAL0 = *TIMER_VAL1 = *TIMER_VAL2 = *TIMER_VAL3 = 0;
// start timers
*TIMER_CNT0 = TIMER_ACTIVE;
*TIMER_CNT1 = *TIMER_CNT2 = *TIMER_CNT3 = TIMER_ACTIVE | TIMER_COUNT_UP;
}
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 ticks = 0;
ticks |= (u64) *TIMER_VAL0 << 0;
ticks |= (u64) *TIMER_VAL1 << 16;
ticks |= (u64) *TIMER_VAL2 << 32;
ticks |= (u64) *TIMER_VAL3 << 48;
return ticks;
}
u64 timer_msec( void ) {
return (timer_ticks() * 1000) / TICKS_PER_SEC;
}
u64 timer_sec( void ) {
return timer_ticks() / TICKS_PER_SEC;
}

23
source/timer.h Normal file
View File

@ -0,0 +1,23 @@
#pragma once
#include "common.h"
// see: https://www.3dbrew.org/wiki/TIMER_Registers
#define TIMER_VAL0 ((vu16*)0x10003000)
#define TIMER_VAL1 ((vu16*)0x10003004)
#define TIMER_VAL2 ((vu16*)0x10003008)
#define TIMER_VAL3 ((vu16*)0x1000300C)
#define TIMER_CNT0 ((vu16*)0x10003002)
#define TIMER_CNT1 ((vu16*)0x10003006)
#define TIMER_CNT2 ((vu16*)0x1000300A)
#define TIMER_CNT3 ((vu16*)0x1000300E)
#define TIMER_COUNT_UP 0x0004
#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 );