projects
/
moodlight.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
completely redid PWM: Now calculate 'microprograms', i.e. pairs of
[moodlight.git]
/
ircontrol.c
diff --git
a/ircontrol.c
b/ircontrol.c
index e0e5317927a36c722d96a00738e68feab63242dc..16ff7b0a13d4c8f9215c667eee177e9d2164b411 100644
(file)
--- 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.
* 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)
* 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:
* 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
* 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)
*/
#define NECSTARTLEN1 ((CPUFREQ * 9UL) / 1000UL)
#define NECSTARTLEN2 ((CPUFREQ * 45UL) / 10000UL)
@@
-44,9
+49,14
@@
static struct timestamp last0irqts;
static struct timestamp last1irqts;
static struct timestamp last0irqts;
static struct timestamp last1irqts;
-static uint8_t lastpin = 0;
+static uint8_t lastpin = 0
xff
;
static uint8_t codebytes[4];
static uint8_t curcodebit = 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)
/* 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 */
uint32_t ts1diff; /* distance from last 1 */
uint32_t ts0diff; /* distance from last 0 */
- v = PINB & _BV(
PB
0);
+ v = PINB & _BV(0);
if (v == lastpin) { /* No change visible - spurious interrupt */
return;
}
if (v == lastpin) { /* No change visible - spurious interrupt */
return;
}
@@
-90,6
+100,9
@@
ISR(PCINT0_vect) {
console_printpgm_P(PSTR("!CRC!"));
} else {
/* Successful decode! */
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]);
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."));
&& (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;
}
}
last1irqts = curirqts;
@@
-167,9
+186,17
@@
ISR(PCINT0_vect) {
void ircontrol_init(void)
{
/* Activate pullup */
void ircontrol_init(void)
{
/* Activate pullup */
- PORTB |= _BV(
PB
0);
+ PORTB |= _BV(0);
/* enable PCINT0 */
PCICR |= _BV(PCIE0);
/* Enable pin change interrupt 0 (=PB0) in pcint0 */
PCMSK0 |= _BV(PCINT0);
}
/* 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;
+}
This page took
0.045294 seconds
and
4
git commands to generate.