mirror of
https://github.com/raphnet/gc_n64_usb-v3
synced 2024-12-21 06:48:52 -05:00
Use a timer for controller polling interval
This commit is contained in:
parent
5502bfd418
commit
6fafb86d46
@ -1 +1 @@
|
||||
OBJS=main.o usb.o usbpad.o mappings.o gcn64_protocol.o n64.o gamecube.o usart1.o bootloader.o eeprom.o config.o hiddata.o usbstrings.o
|
||||
OBJS=main.o usb.o usbpad.o mappings.o gcn64_protocol.o n64.o gamecube.o usart1.o bootloader.o eeprom.o config.o hiddata.o usbstrings.o intervaltimer.o
|
||||
|
39
intervaltimer.c
Normal file
39
intervaltimer.c
Normal file
@ -0,0 +1,39 @@
|
||||
#include <avr/io.h>
|
||||
#include "intervaltimer.h"
|
||||
|
||||
|
||||
void intervaltimer_init(void)
|
||||
{
|
||||
TCCR1A = 0;
|
||||
TCCR1B = (1<<WGM12) | (1<<CS12) | (1<<CS00); // CTC, /1024 prescaler
|
||||
}
|
||||
|
||||
void intervaltimer_set(int interval_ms)
|
||||
{
|
||||
static int cur_interval = 0;
|
||||
|
||||
// We are setting TCNT back to zero, and updating
|
||||
// the compare match register.
|
||||
//
|
||||
// To allows for simple repeated calling of this
|
||||
// function from the main loop, only touch
|
||||
// the counter when the interval changes.
|
||||
if (cur_interval != interval_ms) {
|
||||
cur_interval = interval_ms;
|
||||
|
||||
TCNT1 = 0;
|
||||
OCR1A = interval_ms * (F_CPU/1024) / 1000;
|
||||
}
|
||||
}
|
||||
|
||||
char intervaltimer_get(void)
|
||||
{
|
||||
char a;
|
||||
|
||||
if (TIFR1 & (1<<OCF1A)) {
|
||||
TIFR1 = 1<<OCF1A;
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
9
intervaltimer.h
Normal file
9
intervaltimer.h
Normal file
@ -0,0 +1,9 @@
|
||||
#ifndef _interval_timer_h__
|
||||
#define _interval_timer_h__
|
||||
|
||||
void intervaltimer_init(void);
|
||||
void intervaltimer_set(int interval_ms);
|
||||
char intervaltimer_get(void);
|
||||
|
||||
#endif // _interval_timer_h__
|
||||
|
8
main.c
8
main.c
@ -18,6 +18,7 @@
|
||||
#include "eeprom.h"
|
||||
#include "hiddata.h"
|
||||
#include "usbstrings.h"
|
||||
#include "intervaltimer.h"
|
||||
|
||||
/* Those .c files are included rather than linked for we
|
||||
* want the sizeof() operator to work on the arrays */
|
||||
@ -269,6 +270,7 @@ int main(void)
|
||||
hwinit();
|
||||
usart1_init();
|
||||
eeprom_init();
|
||||
intervaltimer_init();
|
||||
|
||||
/* Init the buffer with idle data */
|
||||
usbpad_update(NULL);
|
||||
@ -287,8 +289,10 @@ int main(void)
|
||||
{
|
||||
case STATE_WAIT_POLLTIME:
|
||||
if (!g_polling_suspended) {
|
||||
pollDelay();
|
||||
state = STATE_POLL_PAD;
|
||||
intervaltimer_set(g_eeprom_data.cfg.poll_interval[0]);
|
||||
if (intervaltimer_get()) {
|
||||
state = STATE_POLL_PAD;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user