Пример #1
0
//Do the actual blinking off and on
//This is not part of IRrecvBase because it may need to be inside an ISR
//and we cannot pass parameters to them.
void do_Blink(void) {
  if (irparams.blinkflag) {
    if(irparams.rawlen % 2) {
      BLINKLED_ON();  // turn pin 13 LED on
    } 
    else {
      BLINKLED_OFF();  // turn pin 13 LED off
    }
  }
}
int DCF77Transmitter::sendone() {
  digitalWrite(DCFOutputPin, Signal_data);
  if (flag)
  	BLINKLED_ON();  // turn pin 13 LED on
  delay(OneTime);
  digitalWrite(DCFOutputPin, Signal_normal);
  if (flag)
  	BLINKLED_OFF();  // turn pin 13 LED off
  delay(BitTime - OneTime);
}
Пример #3
0
extern "C" void __ISR(_TIMER_2_VECTOR, ipl7) handlesTimer2Ints(void)
#endif
{
  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
    }
  }
  CLEAR_INTERRUPT();
} // end ISR
Пример #4
0
void ProcessOne(irparams_t *irparams)
{
	// Read if IR Receiver -> SPACE [xmt LED off] or a MARK [xmt LED on]
	// digitalRead() is very slow. Optimisation is possible, but makes the code unportable
	uint8_t  irdata = (uint8_t)digitalRead(irparams->recvpin);

	irparams->timer++;  // One more 50uS tick
	if (irparams->rawlen >= RAWBUF)  irparams->rcvstate = STATE_OVERFLOW ;  // 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; Start recording transmission
					irparams->overflow                  = false;
					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 time
				irparams->rawbuf[irparams->rawlen++] = irparams->timer;
				irparams->timer                     = 0;
				irparams->rcvstate                  = STATE_MARK;

			} else if (irparams->timer > GAP_TICKS) {  // Space
					// A long Space, indicates gap between codes
					// Flag the 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;
		//......................................................................
		case STATE_OVERFLOW:  // Flag up a read overflow; Stop the State Machine
			irparams->overflow = true;
			irparams->rcvstate = STATE_STOP;
		 	break;
	}

	// If requested, flash LED while receiving IR data
	if (irparams->blinkflag) {
		if (irdata == MARK)
			if (irparams->blinkpin) digitalWrite(irparams->blinkpin, HIGH); // Turn user defined pin LED on
				else BLINKLED_ON() ;   // if no user defined LED pin, turn default LED pin for the hardware on
		else if (irparams->blinkpin) digitalWrite(irparams->blinkpin, LOW); // Turn user defined pin LED on
				else BLINKLED_OFF() ;   // if no user defined LED pin, turn default LED pin for the hardware on
	}
}
Пример #5
0
void IRrecv::RecvIsr(void)
{
  TIMER_RESET;
  //P2DIR |= BIT0 | BIT1 | BIT2;
  // P2OUT ^= BIT2;

  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
    //P2OUT |= BIT0;
    //P2OUT &= ~BIT1;
    //P2OUT &= ~BIT2;

      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
    }
  }
}
Пример #6
0
void ProcessOneIRParam(recvparams_t &recvparams){
  uint8_t irdata = (uint8_t)digitalRead(recvparams.recvpin);

  recvparams.timer++; // One more 50us tick
  if (recvparams.rawlen >= RAWBUF) {
    // Buffer overflow
    recvparams.rcvstate = STATE_STOP;
  }
  switch(recvparams.rcvstate) {
  case STATE_IDLE: // In the middle of a gap
    if (irdata == MARK) {
      if (recvparams.timer < GAP_TICKS) {
        // Not big enough to be a gap.
        recvparams.timer = 0;
      } 
      else {
        // gap just ended, record duration and start recording transmission
        recvparams.rawlen = 0;
        recvparams.rawbuf[recvparams.rawlen++] = recvparams.timer;
        recvparams.timer = 0;
        recvparams.rcvstate = STATE_MARK;
      }
    }
    break;
  case STATE_MARK: // timing MARK
    if (irdata == SPACE) {   // MARK ended, record time
      recvparams.rawbuf[recvparams.rawlen++] = recvparams.timer;
      recvparams.timer = 0;
      recvparams.rcvstate = STATE_SPACE;
    }
    break;
  case STATE_SPACE: // timing SPACE
    if (irdata == MARK) { // SPACE just ended, record it
      recvparams.rawbuf[recvparams.rawlen++] = recvparams.timer;
      recvparams.timer = 0;
      recvparams.rcvstate = STATE_MARK;
    } 
    else { // SPACE
      if (recvparams.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
        recvparams.rcvstate = STATE_STOP;
      } 
    }
    break;
  case STATE_STOP: // waiting, measuring gap
    if (irdata == MARK) { // reset gap timer
      recvparams.timer = 0;
    }
    break;
  }

  if (recvparams.blinkflag) {
    if (irdata == MARK) {
      BLINKLED_ON();  // turn pin 13 LED on
    } 
    else {
      BLINKLED_OFF();  // turn pin 13 LED off
    }
  }
  }
Пример #7
0
// 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
void handle_interrupt()
{
  uint8_t 	irdata = (uint8_t)digitalRead(irparams.recvpin);
  uint32_t	now    = micros();
  uint32_t	elapsed;
  if (now < irparams.startTime)
	  elapsed = now+1+(0xFFFFFFFF-irparams.startTime);
  else
	  elapsed = now-irparams.startTime;
  elapsed /= USECPERTICK;
  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 (elapsed < GAP_TICKS) {
		// Not big enough to be a gap.
		irparams.startTime = now;
	  } else {
        // gap just ended, record duration and start recording transmission
        irparams.rawlen = 0;
        irparams.rawbuf[irparams.rawlen++] = MIN(elapsed, UINT16_MAX);
        irparams.startTime = now;
        irparams.rcvstate = STATE_MARK;
      }
    }
    break;
  case STATE_MARK: // timing MARK
    if (irdata == SPACE) {   // MARK ended, record time
      irparams.rawbuf[irparams.rawlen++] = MIN(elapsed, UINT16_MAX);
      irparams.startTime = now;
      irparams.rcvstate = STATE_SPACE;
    }
    break;
  case STATE_SPACE: // timing SPACE
    if (irdata == MARK) { // SPACE just ended, record it
      irparams.rawbuf[irparams.rawlen++] = MIN(elapsed, UINT16_MAX);
      irparams.startTime = now;
      irparams.rcvstate = STATE_MARK;
    } 
    else { // SPACE
      if (elapsed > 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.startTime = now;
    }
    break;
  }

  if (irparams.blinkflag) {
    if (irdata == MARK) {
      BLINKLED_ON();  // turn pin 13 LED on
    } 
    else {
      BLINKLED_OFF();  // turn pin 13 LED off
    }
  }
}