X-Git-Url: http://git.rrze.uni-erlangen.de/gitweb/?p=moodlight.git;a=blobdiff_plain;f=ircontrol.c;h=16ff7b0a13d4c8f9215c667eee177e9d2164b411;hp=e0e5317927a36c722d96a00738e68feab63242dc;hb=ff29bc2b3dbad7885497cfd9aa2b3aa98cc4ebb0;hpb=6dc7afb26d8ca6419bb2d1d0016e62f79a430772 diff --git a/ircontrol.c b/ircontrol.c index e0e5317..16ff7b0 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.6 2010/07/10 07:36:28 simimeie Exp $ * Functions for the infrared receiver * * The infrared receiver is connected to PB0 / PCINT0. @@ -22,12 +22,17 @@ * that equals around 7100 cpu cycles at 8 MHz. */ #define RC5HALFLENINCYCLES ((CPUFREQ * 889UL) / 1000000UL) -/* For NEC, we start with a 9000 us pulse, then 4500 us silence. +/* Source for most of this was the following nice page with illustrations + * and all that: http://www.sbprojects.com/knowledge/ir/nec.htm + * 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 +49,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) @@ -61,7 +71,7 @@ ISR(PCINT0_vect) { uint32_t ts1diff; /* distance from last 1 */ uint32_t ts0diff; /* distance from last 0 */ - v = PINB & _BV(PB0); + v = PINB & _BV(0); if (v == lastpin) { /* No change visible - spurious interrupt */ return; } @@ -90,6 +100,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 +138,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; @@ -167,9 +186,17 @@ ISR(PCINT0_vect) { void ircontrol_init(void) { /* Activate pullup */ - PORTB |= _BV(PB0); + PORTB |= _BV(0); /* enable PCINT0 */ PCICR |= _BV(PCIE0); /* 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; +}