-/* $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.
/* 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)
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)
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]);
&& (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;
/* 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;
+}