|
板凳
楼主 |
发表于 2015-1-2 17:36:13
|
只看该作者
- // 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) {
- // Buffer overflow
- irparams.rcvstate = STATE_STOP;
- }
- 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) { // reset gap timer
- irparams.timer = 0;
- }
- break;
- }
- if (irparams.blinkflag) {
- if (irdata == MARK) {
- BLINKLED_ON(); // turn pin 13 LED on
- }
- else {
- BLINKLED_OFF(); // turn pin 13 LED off
- }
- }
- }
- void IRrecv::resume() {
- irparams.rcvstate = STATE_IDLE;
- irparams.rawlen = 0;
- }
复制代码 |
|