From 32eb657a83c04b4a7499c590936da752e5b8c15e Mon Sep 17 00:00:00 2001 From: simimeie Date: Wed, 30 Jun 2010 19:38:28 +0000 Subject: [PATCH] now also supporting "repeat" codes for selected keys. --- ircontrol.c | 33 +++++++++++++++++++++++++++++---- ircontrol.h | 5 ++++- 2 files changed, 33 insertions(+), 5 deletions(-) diff --git a/ircontrol.c b/ircontrol.c index e0e5317..4a8e46f 100644 --- a/ircontrol.c +++ b/ircontrol.c @@ -1,4 +1,4 @@ -/* $Id: ircontrol.c,v 1.4 2010/06/27 23:05:55 simimeie Exp $ +/* $Id: ircontrol.c,v 1.5 2010/06/30 19:38:28 simimeie Exp $ * Functions for the infrared receiver * * The infrared receiver is connected to PB0 / PCINT0. @@ -24,10 +24,13 @@ /* For NEC, we start with a 9000 us pulse, then 4500 us silence. * Then the bits follow: - * a 1 is a 560 us pulse followed by 1690 us of silence. - * a 0 is a 560 us pulse followed by 560 us of silence. + * a 1 is a 560 us pulse followed by 1690 us of silence (=2250 us total). + * a 0 is a 560 us pulse followed by 560 us of silence (=1120 us total). * These values equal the following cpu cycle counts: * 9000 us = 72000 cc, 4500 us = 36000 cc, 560 us = 4480, 1690 us = 13520 cc + * When the key stays pressed, it is not resubmitted, but instead a special + * "repeat" code is sent. That is: 9000 us pulse, 2250 us silence, 560 us + * pulse. */ #define NECSTARTLEN1 ((CPUFREQ * 9UL) / 1000UL) #define NECSTARTLEN2 ((CPUFREQ * 45UL) / 10000UL) @@ -44,9 +47,14 @@ static struct timestamp last0irqts; static struct timestamp last1irqts; -static uint8_t lastpin = 0; +static uint8_t lastpin = 0xff; static uint8_t codebytes[4]; static uint8_t curcodebit = 0xff; +static uint8_t lastcommand = 0xff; +static uint8_t repeatcommand = 0xff; +static uint16_t repeatticks = 0; +/* Repeat after this many ticks (70 = 0.5s) */ +#define REPEATAFTERTICKS 100 /* some example codes root@moodlight# !NSB! 11111111 00001000 11011111 00100000 (r) @@ -90,6 +98,9 @@ ISR(PCINT0_vect) { console_printpgm_P(PSTR("!CRC!")); } else { /* Successful decode! */ + lastcommand = codebytes[2]; + repeatcommand = codebytes[2]; + repeatticks = curirqts.ticks; console_printpgm_P(PSTR(" DEC>")); console_printhex8(codebytes[0]); console_printhex8(codebytes[1]); @@ -125,6 +136,12 @@ ISR(PCINT0_vect) { && (ts0diff <= ((12 * NECREPEATLEN) / 10))) { if (curcodebit == 0xfe) { console_printpgm_P(PSTR(".REP.")); + if ((curirqts.ticks - repeatticks) > REPEATAFTERTICKS) { + if ((repeatcommand == 0x00) || (repeatcommand == 0x01)) { + /* Only the up/down arrows are allowed to be repeated */ + lastcommand = repeatcommand; + } + } } } last1irqts = curirqts; @@ -173,3 +190,11 @@ void ircontrol_init(void) /* Enable pin change interrupt 0 (=PB0) in pcint0 */ PCMSK0 |= _BV(PCINT0); } + +uint8_t ircontrol_getlastcommand(void) +{ + uint8_t res; + res = lastcommand; + lastcommand = 0xff; + return res; +} diff --git a/ircontrol.h b/ircontrol.h index b1a42ef..f12a9e5 100644 --- a/ircontrol.h +++ b/ircontrol.h @@ -1,4 +1,4 @@ -/* $Id: ircontrol.h,v 1.1 2010/06/26 19:08:18 simimeie Exp $ +/* $Id: ircontrol.h,v 1.2 2010/06/30 19:38:28 simimeie Exp $ * Functions for the infrared receiver */ @@ -8,4 +8,7 @@ /* Init infrared receiver (pins) */ void ircontrol_init(void); +/* Get received code */ +uint8_t ircontrol_getlastcommand(void); + #endif /* _IRCONTROL_H_ */ -- 2.25.1