mirror of
https://github.com/Theaninova/Arduino-IRremote.git
synced 2025-12-27 00:36:15 +00:00
Utterly failed to reduce the MARK_?? functions back down to MACROs - every time I try, the decoders start failing ...However, I have found a considerable number of bugs in the toolchain, so I'm starting to wonder if the fault is not mine.
77 lines
2.5 KiB
C++
77 lines
2.5 KiB
C++
#include <avr/interrupt.h>
|
|
|
|
#include "IRremote.h"
|
|
#include "IRremoteInt.h"
|
|
|
|
//+=============================================================================
|
|
// TIMER2 interrupt code to collect raw data.
|
|
// Widths of alternating SPACE, MARK are recorded in rawbuf.
|
|
// Recorded in ticks of 50 microseconds.
|
|
// rawlen counts the number of entries recorded so far.
|
|
// First entry is the SPACE between transmissions.
|
|
// As soon as a SPACE gets long, ready is set, state switches to IDLE, timing of SPACE continues.
|
|
// As soon as first MARK arrives, gap width is recorded, ready is cleared, and new logging starts
|
|
//
|
|
ISR (TIMER_INTR_NAME)
|
|
{
|
|
TIMER_RESET;
|
|
|
|
uint8_t irdata = (uint8_t)digitalRead(irparams.recvpin);
|
|
|
|
irparams.timer++; // One more 50us tick
|
|
if (irparams.rawlen >= RAWBUF) irparams.rcvstate = STATE_STOP ; // Buffer overflow
|
|
|
|
switch(irparams.rcvstate) {
|
|
case STATE_IDLE: // In the middle of a gap
|
|
if (irdata == MARK) {
|
|
if (irparams.timer < GAP_TICKS) {
|
|
// Not big enough to be a gap.
|
|
irparams.timer = 0;
|
|
}
|
|
else {
|
|
// gap just ended, record duration and start recording transmission
|
|
irparams.rawlen = 0;
|
|
irparams.rawbuf[irparams.rawlen++] = irparams.timer;
|
|
irparams.timer = 0;
|
|
irparams.rcvstate = STATE_MARK;
|
|
}
|
|
}
|
|
break;
|
|
|
|
case STATE_MARK: // timing MARK
|
|
if (irdata == SPACE) { // MARK ended, record time
|
|
irparams.rawbuf[irparams.rawlen++] = irparams.timer;
|
|
irparams.timer = 0;
|
|
irparams.rcvstate = STATE_SPACE;
|
|
}
|
|
break;
|
|
|
|
case STATE_SPACE: // timing SPACE
|
|
if (irdata == MARK) { // SPACE just ended, record it
|
|
irparams.rawbuf[irparams.rawlen++] = irparams.timer;
|
|
irparams.timer = 0;
|
|
irparams.rcvstate = STATE_MARK;
|
|
}
|
|
else { // SPACE
|
|
if (irparams.timer > GAP_TICKS) {
|
|
// big SPACE, indicates gap between codes
|
|
// Mark current code as ready for processing
|
|
// Switch to STOP
|
|
// Don't reset timer; keep counting space width
|
|
irparams.rcvstate = STATE_STOP;
|
|
}
|
|
}
|
|
break;
|
|
|
|
case STATE_STOP: // waiting, measuring gap
|
|
if (irdata == MARK) irparams.timer = 0 ; // reset gap timer
|
|
break;
|
|
}
|
|
|
|
if (irparams.blinkflag) {
|
|
if (irdata == MARK) BLINKLED_ON() ; // turn pin 13 LED on
|
|
else BLINKLED_OFF() ; // turn pin 13 LED off
|
|
}
|
|
}
|
|
|