mirror of
https://github.com/raphnet/gc_n64_usb-v3
synced 2024-12-21 23:08:53 -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__
|
||||||
|
|
6
main.c
6
main.c
@ -18,6 +18,7 @@
|
|||||||
#include "eeprom.h"
|
#include "eeprom.h"
|
||||||
#include "hiddata.h"
|
#include "hiddata.h"
|
||||||
#include "usbstrings.h"
|
#include "usbstrings.h"
|
||||||
|
#include "intervaltimer.h"
|
||||||
|
|
||||||
/* Those .c files are included rather than linked for we
|
/* Those .c files are included rather than linked for we
|
||||||
* want the sizeof() operator to work on the arrays */
|
* want the sizeof() operator to work on the arrays */
|
||||||
@ -269,6 +270,7 @@ int main(void)
|
|||||||
hwinit();
|
hwinit();
|
||||||
usart1_init();
|
usart1_init();
|
||||||
eeprom_init();
|
eeprom_init();
|
||||||
|
intervaltimer_init();
|
||||||
|
|
||||||
/* Init the buffer with idle data */
|
/* Init the buffer with idle data */
|
||||||
usbpad_update(NULL);
|
usbpad_update(NULL);
|
||||||
@ -287,9 +289,11 @@ int main(void)
|
|||||||
{
|
{
|
||||||
case STATE_WAIT_POLLTIME:
|
case STATE_WAIT_POLLTIME:
|
||||||
if (!g_polling_suspended) {
|
if (!g_polling_suspended) {
|
||||||
pollDelay();
|
intervaltimer_set(g_eeprom_data.cfg.poll_interval[0]);
|
||||||
|
if (intervaltimer_get()) {
|
||||||
state = STATE_POLL_PAD;
|
state = STATE_POLL_PAD;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case STATE_POLL_PAD:
|
case STATE_POLL_PAD:
|
||||||
|
Loading…
Reference in New Issue
Block a user