Use a timer for controller polling interval

This commit is contained in:
Raphael Assenat 2015-10-17 18:34:11 -04:00
parent 5502bfd418
commit 6fafb86d46
4 changed files with 55 additions and 3 deletions

View File

@ -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
View 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
View 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
View File

@ -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;