Taguchi Yuuki / IRremote

Dependents:   Lilnija_29012017 NucleoF042K6_IRReceiver

Files at this revision

API Documentation at this revision

Comitter:
yuhki50
Date:
Sat Jan 23 15:09:34 2016 +0000
Parent:
2:6bbd1e911324
Child:
4:5e46ae042bc7
Commit message:
porting

Changed in this revision

IRremote.cpp Show annotated file Show diff for this revision Revisions of this file
IRremote.h Show annotated file Show diff for this revision Revisions of this file
IRremoteInt.h Show annotated file Show diff for this revision Revisions of this file
irRecv.cpp Show annotated file Show diff for this revision Revisions of this file
irSend.cpp Show annotated file Show diff for this revision Revisions of this file
ir_Sharp.cpp Show annotated file Show diff for this revision Revisions of this file
--- a/IRremote.cpp	Sat Jan 23 15:36:14 2016 +0900
+++ b/IRremote.cpp	Sat Jan 23 15:09:34 2016 +0000
@@ -18,8 +18,6 @@
 // Whynter A/C ARC-110WD added by Francesco Meschia
 //******************************************************************************
 
-#include <avr/interrupt.h>
-
 // Defining IR_GLOBAL here allows us to declare the instantiation of global variables
 #define IR_GLOBAL
 #	include "IRremote.h"
@@ -103,13 +101,11 @@
 // As soon as first MARK arrives:
 //   Gap width is recorded; Ready is cleared; New logging starts
 //
-ISR (TIMER_INTR_NAME)
+void IRrecv::timer_isr ()
 {
-	TIMER_RESET;
-
 	// 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);
+	uint8_t  irdata = _recvpin.read();
 
 	irparams.timer++;  // One more 50uS tick
 	if (irparams.rawlen >= RAWBUF)  irparams.rcvstate = STATE_OVERFLOW ;  // Buffer overflow
@@ -164,13 +160,4 @@
 			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
-	}
 }
--- a/IRremote.h	Sat Jan 23 15:36:14 2016 +0900
+++ b/IRremote.h	Sat Jan 23 15:09:34 2016 +0000
@@ -151,7 +151,7 @@
 		unsigned int           address;      // Used by Panasonic & Sharp [16-bits]
 		unsigned long          value;        // Decoded value [max 32-bits]
 		int                    bits;         // Number of bits in decoded value
-		volatile unsigned int  *rawbuf;      // Raw intervals in 50uS ticks
+		unsigned int  *rawbuf;      // Raw intervals in 50uS ticks
 		int                    rawlen;       // Number of records in rawbuf
 		int                    overflow;     // true iff IR raw code too long
 };
@@ -167,16 +167,15 @@
 class IRrecv
 {
 	public:
-		IRrecv (int recvpin) ;
-		IRrecv (int recvpin, int blinkpin);
-
-		void  blink13    (int blinkflag) ;
+		IRrecv (PinName recvpin) ;
 		int   decode     (decode_results *results) ;
 		void  enableIRIn ( ) ;
+		void  disableIRIn ( ) ;
 		bool  isIdle     ( ) ;
 		void  resume     ( ) ;
 
 	private:
+		void timer_isr ();
 		long  decodeHash (decode_results *results) ;
 		int   compare    (unsigned int oldval, unsigned int newval) ;
 
@@ -243,6 +242,10 @@
 #		if DECODE_DENON
 			bool  decodeDenon (decode_results *results) ;
 #		endif
+		
+		DigitalIn _recvpin;
+		Ticker _ticker;
+		irparams_t  irparams;
 } ;
 
 //------------------------------------------------------------------------------
@@ -251,7 +254,7 @@
 class IRsend
 {
 	public:
-		IRsend () { }
+		IRsend (PinName sendpin) : _pwm(sendpin) { }
 
 		void  custom_delay_usec (unsigned long uSecs);
 		void  enableIROut 		(int khz) ;
@@ -327,6 +330,8 @@
 #		if SEND_PRONTO
 			void  sendPronto     (char* code,  bool repeat,  bool fallback) ;
 #		endif
+
+		PwmOut _pwm;
 } ;
 
 #endif
--- a/IRremoteInt.h	Sat Jan 23 15:36:14 2016 +0900
+++ b/IRremoteInt.h	Sat Jan 23 15:09:34 2016 +0000
@@ -18,24 +18,9 @@
 #define IRremoteint_h
 
 //------------------------------------------------------------------------------
-// Include the right Arduino header
+// Include the right mbed header
 //
-#if defined(ARDUINO) && (ARDUINO >= 100)
-#	include <Arduino.h>
-#else
-#	if !defined(IRPRONTO)
-#		include <WProgram.h>
-#	endif
-#endif
-
-//------------------------------------------------------------------------------
-// This handles definition and access to global variables
-//
-#ifdef IR_GLOBAL
-#	define EXTERN
-#else
-#	define EXTERN extern
-#endif
+#include "mbed.h"
 
 //------------------------------------------------------------------------------
 // Information for the Interrupt Service Routine
@@ -46,9 +31,6 @@
 	struct {
 		// The fields are ordered to reduce memory over caused by struct-padding
 		uint8_t       rcvstate;        // State Machine state
-		uint8_t       recvpin;         // Pin connected to IR data from detector
-		uint8_t       blinkpin;
-		uint8_t       blinkflag;       // true -> enable blinking of pin on IR processing
 		uint8_t       rawlen;          // counter of entries in rawbuf
 		unsigned int  timer;           // State timer, counts 50uS ticks.
 		unsigned int  rawbuf[RAWBUF];  // raw data
@@ -63,56 +45,6 @@
 #define STATE_STOP      5
 #define STATE_OVERFLOW  6
 
-// Allow all parts of the code access to the ISR data
-// NB. The data can be changed by the ISR at any time, even mid-function
-// Therefore we declare it as "volatile" to stop the compiler/CPU caching it
-EXTERN  volatile irparams_t  irparams;
-
-//------------------------------------------------------------------------------
-// Defines for blinking the LED
-//
-
-#if defined(CORE_LED0_PIN)
-#	define BLINKLED        CORE_LED0_PIN
-#	define BLINKLED_ON()   (digitalWrite(CORE_LED0_PIN, HIGH))
-#	define BLINKLED_OFF()  (digitalWrite(CORE_LED0_PIN, LOW))
-
-#elif defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
-#	define BLINKLED        13
-#	define BLINKLED_ON()   (PORTB |= B10000000)
-#	define BLINKLED_OFF()  (PORTB &= B01111111)
-
-#elif defined(__AVR_ATmega644P__) || defined(__AVR_ATmega644__)
-#	define BLINKLED        0
-#	define BLINKLED_ON()   (PORTD |= B00000001)
-#	define BLINKLED_OFF()  (PORTD &= B11111110)
-
-#else
-#	define BLINKLED        13
-	#define BLINKLED_ON()  (PORTB |= B00100000)
-#	define BLINKLED_OFF()  (PORTB &= B11011111)
-#endif
-
-//------------------------------------------------------------------------------
-// CPU Frequency
-//
-#ifdef F_CPU
-#	define SYSCLOCK  F_CPU     // main Arduino clock
-#else
-#	define SYSCLOCK  16000000  // main Arduino clock
-#endif
-
-//------------------------------------------------------------------------------
-// Defines for setting and clearing register bits
-//
-#ifndef cbi
-#	define cbi(sfr, bit)  (_SFR_BYTE(sfr) &= ~_BV(bit))
-#endif
-
-#ifndef sbi
-#	define sbi(sfr, bit)  (_SFR_BYTE(sfr) |= _BV(bit))
-#endif
-
 //------------------------------------------------------------------------------
 // Pulse parms are ((X*50)-100) for the Mark and ((X*50)+100) for the Space.
 // First MARK is the one after the long gap
@@ -144,459 +76,4 @@
 #define MARK   0
 #define SPACE  1
 
-//------------------------------------------------------------------------------
-// Define which timer to use
-//
-// Uncomment the timer you wish to use on your board.
-// If you are using another library which uses timer2, you have options to
-//   switch IRremote to use a different timer.
-//
-
-// Arduino Mega
-#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
-	//#define IR_USE_TIMER1   // tx = pin 11
-	#define IR_USE_TIMER2     // tx = pin 9
-	//#define IR_USE_TIMER3   // tx = pin 5
-	//#define IR_USE_TIMER4   // tx = pin 6
-	//#define IR_USE_TIMER5   // tx = pin 46
-
-// Teensy 1.0
-#elif defined(__AVR_AT90USB162__)
-	#define IR_USE_TIMER1     // tx = pin 17
-
-// Teensy 2.0
-#elif defined(__AVR_ATmega32U4__)
-	//#define IR_USE_TIMER1   // tx = pin 14
-	//#define IR_USE_TIMER3   // tx = pin 9
-	#define IR_USE_TIMER4_HS  // tx = pin 10
-
-// Teensy 3.0 / Teensy 3.1
-#elif defined(__MK20DX128__) || defined(__MK20DX256__)
-	#define IR_USE_TIMER_CMT  // tx = pin 5
-
-// Teensy-LC
-#elif defined(__MKL26Z64__)
-  #define IR_USE_TIMER_TPM1 // tx = pin 16
-
-// Teensy++ 1.0 & 2.0
-#elif defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB1286__)
-	//#define IR_USE_TIMER1   // tx = pin 25
-	#define IR_USE_TIMER2     // tx = pin 1
-	//#define IR_USE_TIMER3   // tx = pin 16
-
-// Sanguino
-#elif defined(__AVR_ATmega644P__) || defined(__AVR_ATmega644__)
-	//#define IR_USE_TIMER1   // tx = pin 13
-	#define IR_USE_TIMER2     // tx = pin 14
-
-// Atmega8
-#elif defined(__AVR_ATmega8P__) || defined(__AVR_ATmega8__)
-	#define IR_USE_TIMER1     // tx = pin 9
-
-// ATtiny84
-#elif defined(__AVR_ATtiny84__)
-  #define IR_USE_TIMER1     // tx = pin 6
-
-//ATtiny85
-#elif defined(__AVR_ATtiny85__)
-  #define IR_USE_TIMER_TINY0   // tx = pin 1
-
-// Arduino Duemilanove, Diecimila, LilyPad, Mini, Fio, Nano, etc
-#else
-	//#define IR_USE_TIMER1   // tx = pin 9
-	#define IR_USE_TIMER2     // tx = pin 3
-
 #endif
-
-//------------------------------------------------------------------------------
-// Defines for Timer
-
-//---------------------------------------------------------
-// Timer2 (8 bits)
-//
-#if defined(IR_USE_TIMER2)
-
-#define TIMER_RESET
-#define TIMER_ENABLE_PWM    (TCCR2A |= _BV(COM2B1))
-#define TIMER_DISABLE_PWM   (TCCR2A &= ~(_BV(COM2B1)))
-#define TIMER_ENABLE_INTR   (TIMSK2 = _BV(OCIE2A))
-#define TIMER_DISABLE_INTR  (TIMSK2 = 0)
-#define TIMER_INTR_NAME     TIMER2_COMPA_vect
-
-#define TIMER_CONFIG_KHZ(val) ({ \
-	const uint8_t pwmval = SYSCLOCK / 2000 / (val); \
-	TCCR2A               = _BV(WGM20); \
-	TCCR2B               = _BV(WGM22) | _BV(CS20); \
-	OCR2A                = pwmval; \
-	OCR2B                = pwmval / 3; \
-})
-
-#define TIMER_COUNT_TOP  (SYSCLOCK * USECPERTICK / 1000000)
-
-//-----------------
-#if (TIMER_COUNT_TOP < 256)
-#	define TIMER_CONFIG_NORMAL() ({ \
-		TCCR2A = _BV(WGM21); \
-		TCCR2B = _BV(CS20); \
-		OCR2A  = TIMER_COUNT_TOP; \
-		TCNT2  = 0; \
-	})
-#else
-#	define TIMER_CONFIG_NORMAL() ({ \
-		TCCR2A = _BV(WGM21); \
-		TCCR2B = _BV(CS21); \
-		OCR2A  = TIMER_COUNT_TOP / 8; \
-		TCNT2  = 0; \
-	})
-#endif
-
-//-----------------
-#if defined(CORE_OC2B_PIN)
-#	define TIMER_PWM_PIN  CORE_OC2B_PIN  // Teensy
-#elif defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
-#	define TIMER_PWM_PIN  9              // Arduino Mega
-#elif defined(__AVR_ATmega644P__) || defined(__AVR_ATmega644__)
-#	define TIMER_PWM_PIN  14             // Sanguino
-#else
-#	define TIMER_PWM_PIN  3              // Arduino Duemilanove, Diecimila, LilyPad, etc
-#endif
-
-//---------------------------------------------------------
-// Timer1 (16 bits)
-//
-#elif defined(IR_USE_TIMER1)
-
-#define TIMER_RESET
-#define TIMER_ENABLE_PWM   (TCCR1A |= _BV(COM1A1))
-#define TIMER_DISABLE_PWM  (TCCR1A &= ~(_BV(COM1A1)))
-
-//-----------------
-#if defined(__AVR_ATmega8P__) || defined(__AVR_ATmega8__)
-#	define TIMER_ENABLE_INTR   (TIMSK |= _BV(OCIE1A))
-#	define TIMER_DISABLE_INTR  (TIMSK &= ~_BV(OCIE1A))
-#else
-#	define TIMER_ENABLE_INTR   (TIMSK1 = _BV(OCIE1A))
-#	define TIMER_DISABLE_INTR  (TIMSK1 = 0)
-#endif
-
-//-----------------
-#define TIMER_INTR_NAME       TIMER1_COMPA_vect
-
-#define TIMER_CONFIG_KHZ(val) ({ \
-	const uint16_t pwmval = SYSCLOCK / 2000 / (val); \
-	TCCR1A                = _BV(WGM11); \
-	TCCR1B                = _BV(WGM13) | _BV(CS10); \
-	ICR1                  = pwmval; \
-	OCR1A                 = pwmval / 3; \
-})
-
-#define TIMER_CONFIG_NORMAL() ({ \
-	TCCR1A = 0; \
-	TCCR1B = _BV(WGM12) | _BV(CS10); \
-	OCR1A  = SYSCLOCK * USECPERTICK / 1000000; \
-	TCNT1  = 0; \
-})
-
-//-----------------
-#if defined(CORE_OC1A_PIN)
-#	define TIMER_PWM_PIN  CORE_OC1A_PIN  // Teensy
-#elif defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
-#	define TIMER_PWM_PIN  11             // Arduino Mega
-#elif defined(__AVR_ATmega644P__) || defined(__AVR_ATmega644__)
-#	define TIMER_PWM_PIN  13             // Sanguino
-#elif defined(__AVR_ATtiny84__)
-# define TIMER_PWM_PIN  6
-#else
-#	define TIMER_PWM_PIN  9              // Arduino Duemilanove, Diecimila, LilyPad, etc
-#endif
-
-//---------------------------------------------------------
-// Timer3 (16 bits)
-//
-#elif defined(IR_USE_TIMER3)
-
-#define TIMER_RESET
-#define TIMER_ENABLE_PWM     (TCCR3A |= _BV(COM3A1))
-#define TIMER_DISABLE_PWM    (TCCR3A &= ~(_BV(COM3A1)))
-#define TIMER_ENABLE_INTR    (TIMSK3 = _BV(OCIE3A))
-#define TIMER_DISABLE_INTR   (TIMSK3 = 0)
-#define TIMER_INTR_NAME      TIMER3_COMPA_vect
-
-#define TIMER_CONFIG_KHZ(val) ({ \
-  const uint16_t pwmval = SYSCLOCK / 2000 / (val); \
-  TCCR3A = _BV(WGM31); \
-  TCCR3B = _BV(WGM33) | _BV(CS30); \
-  ICR3 = pwmval; \
-  OCR3A = pwmval / 3; \
-})
-
-#define TIMER_CONFIG_NORMAL() ({ \
-  TCCR3A = 0; \
-  TCCR3B = _BV(WGM32) | _BV(CS30); \
-  OCR3A = SYSCLOCK * USECPERTICK / 1000000; \
-  TCNT3 = 0; \
-})
-
-//-----------------
-#if defined(CORE_OC3A_PIN)
-#	define TIMER_PWM_PIN  CORE_OC3A_PIN  // Teensy
-#elif defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
-#	define TIMER_PWM_PIN  5              // Arduino Mega
-#else
-#	error "Please add OC3A pin number here\n"
-#endif
-
-//---------------------------------------------------------
-// Timer4 (10 bits, high speed option)
-//
-#elif defined(IR_USE_TIMER4_HS)
-
-#define TIMER_RESET
-#define TIMER_ENABLE_PWM    (TCCR4A |= _BV(COM4A1))
-#define TIMER_DISABLE_PWM   (TCCR4A &= ~(_BV(COM4A1)))
-#define TIMER_ENABLE_INTR   (TIMSK4 = _BV(TOIE4))
-#define TIMER_DISABLE_INTR  (TIMSK4 = 0)
-#define TIMER_INTR_NAME     TIMER4_OVF_vect
-
-#define TIMER_CONFIG_KHZ(val) ({ \
-	const uint16_t pwmval = SYSCLOCK / 2000 / (val); \
-	TCCR4A                = (1<<PWM4A); \
-	TCCR4B                = _BV(CS40); \
-	TCCR4C                = 0; \
-	TCCR4D                = (1<<WGM40); \
-	TCCR4E                = 0; \
-	TC4H                  = pwmval >> 8; \
-	OCR4C                 = pwmval; \
-	TC4H                  = (pwmval / 3) >> 8; \
-	OCR4A                 = (pwmval / 3) & 255; \
-})
-
-#define TIMER_CONFIG_NORMAL() ({ \
-	TCCR4A = 0; \
-	TCCR4B = _BV(CS40); \
-	TCCR4C = 0; \
-	TCCR4D = 0; \
-	TCCR4E = 0; \
-	TC4H   = (SYSCLOCK * USECPERTICK / 1000000) >> 8; \
-	OCR4C  = (SYSCLOCK * USECPERTICK / 1000000) & 255; \
-	TC4H   = 0; \
-	TCNT4  = 0; \
-})
-
-//-----------------
-#if defined(CORE_OC4A_PIN)
-#	define TIMER_PWM_PIN  CORE_OC4A_PIN  // Teensy
-#elif defined(__AVR_ATmega32U4__)
-#	define TIMER_PWM_PIN  13             // Leonardo
-#else
-#	error "Please add OC4A pin number here\n"
-#endif
-
-//---------------------------------------------------------
-// Timer4 (16 bits)
-//
-#elif defined(IR_USE_TIMER4)
-
-#define TIMER_RESET
-#define TIMER_ENABLE_PWM    (TCCR4A |= _BV(COM4A1))
-#define TIMER_DISABLE_PWM   (TCCR4A &= ~(_BV(COM4A1)))
-#define TIMER_ENABLE_INTR   (TIMSK4 = _BV(OCIE4A))
-#define TIMER_DISABLE_INTR  (TIMSK4 = 0)
-#define TIMER_INTR_NAME     TIMER4_COMPA_vect
-
-#define TIMER_CONFIG_KHZ(val) ({ \
-  const uint16_t pwmval = SYSCLOCK / 2000 / (val); \
-  TCCR4A = _BV(WGM41); \
-  TCCR4B = _BV(WGM43) | _BV(CS40); \
-  ICR4 = pwmval; \
-  OCR4A = pwmval / 3; \
-})
-
-#define TIMER_CONFIG_NORMAL() ({ \
-  TCCR4A = 0; \
-  TCCR4B = _BV(WGM42) | _BV(CS40); \
-  OCR4A = SYSCLOCK * USECPERTICK / 1000000; \
-  TCNT4 = 0; \
-})
-
-//-----------------
-#if defined(CORE_OC4A_PIN)
-#	define TIMER_PWM_PIN  CORE_OC4A_PIN
-#elif defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
-#	define TIMER_PWM_PIN  6  // Arduino Mega
-#else
-#	error "Please add OC4A pin number here\n"
-#endif
-
-//---------------------------------------------------------
-// Timer5 (16 bits)
-//
-#elif defined(IR_USE_TIMER5)
-
-#define TIMER_RESET
-#define TIMER_ENABLE_PWM    (TCCR5A |= _BV(COM5A1))
-#define TIMER_DISABLE_PWM   (TCCR5A &= ~(_BV(COM5A1)))
-#define TIMER_ENABLE_INTR   (TIMSK5 = _BV(OCIE5A))
-#define TIMER_DISABLE_INTR  (TIMSK5 = 0)
-#define TIMER_INTR_NAME     TIMER5_COMPA_vect
-
-#define TIMER_CONFIG_KHZ(val) ({ \
-  const uint16_t pwmval = SYSCLOCK / 2000 / (val); \
-  TCCR5A = _BV(WGM51); \
-  TCCR5B = _BV(WGM53) | _BV(CS50); \
-  ICR5 = pwmval; \
-  OCR5A = pwmval / 3; \
-})
-
-#define TIMER_CONFIG_NORMAL() ({ \
-  TCCR5A = 0; \
-  TCCR5B = _BV(WGM52) | _BV(CS50); \
-  OCR5A = SYSCLOCK * USECPERTICK / 1000000; \
-  TCNT5 = 0; \
-})
-
-//-----------------
-#if defined(CORE_OC5A_PIN)
-#	define TIMER_PWM_PIN  CORE_OC5A_PIN
-#elif defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
-#	define TIMER_PWM_PIN  46  // Arduino Mega
-#else
-#	error "Please add OC5A pin number here\n"
-#endif
-
-//---------------------------------------------------------
-// Special carrier modulator timer
-//
-#elif defined(IR_USE_TIMER_CMT)
-
-#define TIMER_RESET ({     \
-	uint8_t tmp = CMT_MSC; \
-	CMT_CMD2 = 30;         \
-})
-
-#define TIMER_ENABLE_PWM  do {                                         \
-	CORE_PIN5_CONFIG = PORT_PCR_MUX(2) | PORT_PCR_DSE | PORT_PCR_SRE;  \
-} while(0)
-
-#define TIMER_DISABLE_PWM  do {                                        \
-	CORE_PIN5_CONFIG = PORT_PCR_MUX(1) | PORT_PCR_DSE | PORT_PCR_SRE;  \
-} while(0)
-
-#define TIMER_ENABLE_INTR   NVIC_ENABLE_IRQ(IRQ_CMT)
-#define TIMER_DISABLE_INTR  NVIC_DISABLE_IRQ(IRQ_CMT)
-#define TIMER_INTR_NAME     cmt_isr
-
-//-----------------
-#ifdef ISR
-#	undef ISR
-#endif
-#define  ISR(f)  void f(void)
-
-//-----------------
-#if (F_BUS == 48000000)
-#	define CMT_PPS_VAL  5
-#else
-#	define CMT_PPS_VAL  2
-#endif
-
-//-----------------
-#define TIMER_CONFIG_KHZ(val) ({ 	 \
-	SIM_SCGC4 |= SIM_SCGC4_CMT;      \
-	SIM_SOPT2 |= SIM_SOPT2_PTD7PAD;  \
-	CMT_PPS    = CMT_PPS_VAL;        \
-	CMT_CGH1   = 2667 / val;         \
-	CMT_CGL1   = 5333 / val;         \
-	CMT_CMD1   = 0;                  \
-	CMT_CMD2   = 30;                 \
-	CMT_CMD3   = 0;                  \
-	CMT_CMD4   = 0;                  \
-	CMT_OC     = 0x60;               \
-	CMT_MSC    = 0x01;               \
-})
-
-#define TIMER_CONFIG_NORMAL() ({  \
-	SIM_SCGC4 |= SIM_SCGC4_CMT;   \
-	CMT_PPS    = CMT_PPS_VAL;     \
-	CMT_CGH1   = 1;               \
-	CMT_CGL1   = 1;               \
-	CMT_CMD1   = 0;               \
-	CMT_CMD2   = 30               \
-	CMT_CMD3   = 0;               \
-	CMT_CMD4   = 19;              \
-	CMT_OC     = 0;               \
-	CMT_MSC    = 0x03;            \
-})
-
-#define TIMER_PWM_PIN  5
-
-// defines for TPM1 timer on Teensy-LC
-#elif defined(IR_USE_TIMER_TPM1)
-#define TIMER_RESET          FTM1_SC |= FTM_SC_TOF;
-#define TIMER_ENABLE_PWM     CORE_PIN16_CONFIG = PORT_PCR_MUX(3)|PORT_PCR_DSE|PORT_PCR_SRE
-#define TIMER_DISABLE_PWM    CORE_PIN16_CONFIG = PORT_PCR_MUX(1)|PORT_PCR_SRE
-#define TIMER_ENABLE_INTR    NVIC_ENABLE_IRQ(IRQ_FTM1)
-#define TIMER_DISABLE_INTR   NVIC_DISABLE_IRQ(IRQ_FTM1)
-#define TIMER_INTR_NAME      ftm1_isr
-#ifdef ISR
-#undef ISR
-#endif
-#define ISR(f) void f(void)
-#define TIMER_CONFIG_KHZ(val) ({                     \
-	SIM_SCGC6 |= SIM_SCGC6_TPM1;                 \
-	FTM1_SC = 0;                                 \
-	FTM1_CNT = 0;                                \
-	FTM1_MOD = (F_PLL/2000) / val - 1;           \
-	FTM1_C0V = (F_PLL/6000) / val - 1;           \
-	FTM1_SC = FTM_SC_CLKS(1) | FTM_SC_PS(0);     \
-})
-#define TIMER_CONFIG_NORMAL() ({                     \
-	SIM_SCGC6 |= SIM_SCGC6_TPM1;                 \
-	FTM1_SC = 0;                                 \
-	FTM1_CNT = 0;                                \
-	FTM1_MOD = (F_PLL/40000) - 1;                \
-	FTM1_C0V = 0;                                \
-	FTM1_SC = FTM_SC_CLKS(1) | FTM_SC_PS(0) | FTM_SC_TOF | FTM_SC_TOIE; \
-})
-#define TIMER_PWM_PIN        16
-
-// defines for timer_tiny0 (8 bits)
-#elif defined(IR_USE_TIMER_TINY0)
-#define TIMER_RESET
-#define TIMER_ENABLE_PWM     (TCCR0A |= _BV(COM0B1))
-#define TIMER_DISABLE_PWM    (TCCR0A &= ~(_BV(COM0B1)))
-#define TIMER_ENABLE_INTR    (TIMSK |= _BV(OCIE0A))
-#define TIMER_DISABLE_INTR   (TIMSK &= ~(_BV(OCIE0A)))
-#define TIMER_INTR_NAME      TIMER0_COMPA_vect
-#define TIMER_CONFIG_KHZ(val) ({ \
-  const uint8_t pwmval = SYSCLOCK / 2000 / (val); \
-  TCCR0A = _BV(WGM00); \
-  TCCR0B = _BV(WGM02) | _BV(CS00); \
-  OCR0A = pwmval; \
-  OCR0B = pwmval / 3; \
-})
-#define TIMER_COUNT_TOP      (SYSCLOCK * USECPERTICK / 1000000)
-#if (TIMER_COUNT_TOP < 256)
-#define TIMER_CONFIG_NORMAL() ({ \
-  TCCR0A = _BV(WGM01); \
-  TCCR0B = _BV(CS00); \
-  OCR0A = TIMER_COUNT_TOP; \
-  TCNT0 = 0; \
-})
-#else
-#define TIMER_CONFIG_NORMAL() ({ \
-  TCCR0A = _BV(WGM01); \
-  TCCR0B = _BV(CS01); \
-  OCR0A = TIMER_COUNT_TOP / 8; \
-  TCNT0 = 0; \
-})
-#endif
-
-#define TIMER_PWM_PIN        1  /* ATtiny85 */
-
-//---------------------------------------------------------
-// Unknown Timer
-//
-#else
-#	error "Internal code configuration error, no known IR_USE_TIMER# defined\n"
-#endif
-#endif
--- a/irRecv.cpp	Sat Jan 23 15:36:14 2016 +0900
+++ b/irRecv.cpp	Sat Jan 23 15:09:34 2016 +0000
@@ -91,56 +91,30 @@
 }
 
 //+=============================================================================
-IRrecv::IRrecv (int recvpin)
+IRrecv::IRrecv (PinName recvpin) : _recvpin(recvpin)
 {
-	irparams.recvpin = recvpin;
-	irparams.blinkflag = 0;
+	_recvpin.mode(PullNone);
 }
 
-IRrecv::IRrecv (int recvpin, int blinkpin)
-{
-	irparams.recvpin = recvpin;
-	irparams.blinkpin = blinkpin;
-	pinMode(blinkpin, OUTPUT);
-	irparams.blinkflag = 0;
-}
-
-
-
 //+=============================================================================
-// initialization
+// enable IR receive
 //
 void  IRrecv::enableIRIn ( )
 {
-	cli();
-	// Setup pulse clock timer interrupt
-	// Prescale /8 (16M/8 = 0.5 microseconds per tick)
-	// Therefore, the timer interval can range from 0.5 to 128 microseconds
-	// Depending on the reset value (255 to 0)
-	TIMER_CONFIG_NORMAL();
-
-	// Timer2 Overflow Interrupt Enable
-	TIMER_ENABLE_INTR;
-
-	TIMER_RESET;
-
-	sei();  // enable interrupts
+	_ticker.detach();
+	_ticker.attach_us(this, &IRrecv::timer_isr, USECPERTICK);
 
 	// Initialize state machine variables
 	irparams.rcvstate = STATE_IDLE;
 	irparams.rawlen = 0;
-
-	// Set pin modes
-	pinMode(irparams.recvpin, INPUT);
 }
 
 //+=============================================================================
-// Enable/disable blinking of pin 13 on IR processing
+// disable IR receive
 //
-void  IRrecv::blink13 (int blinkflag)
+void  IRrecv::disableIRIn ( )
 {
-	irparams.blinkflag = blinkflag;
-	if (blinkflag)  pinMode(BLINKLED, OUTPUT) ;
+	_ticker.detach();
 }
 
 //+=============================================================================
@@ -150,6 +124,7 @@
 {
  return (irparams.rcvstate == STATE_IDLE || irparams.rcvstate == STATE_STOP) ? true : false;
 }
+
 //+=============================================================================
 // Restart the ISR state machine
 //
--- a/irSend.cpp	Sat Jan 23 15:36:14 2016 +0900
+++ b/irSend.cpp	Sat Jan 23 15:09:34 2016 +0000
@@ -21,7 +21,7 @@
 //
 void  IRsend::mark (unsigned int time)
 {
-	TIMER_ENABLE_PWM; // Enable pin 3 PWM output
+	_pwm.write(0.5); // Enable PWM output
 	if (time > 0) custom_delay_usec(time);
 }
 
@@ -32,14 +32,10 @@
 //
 void  IRsend::space (unsigned int time)
 {
-	TIMER_DISABLE_PWM; // Disable pin 3 PWM output
+	_pwm.write(0.0); // Disable PWM output
 	if (time > 0) IRsend::custom_delay_usec(time);
 }
 
-
-
-
-
 //+=============================================================================
 // Enables IR output.  The khz value controls the modulation frequency in kilohertz.
 // The IR output will be on pin 3 (OC2B).
@@ -54,18 +50,8 @@
 //
 void  IRsend::enableIROut (int khz)
 {
-	// Disable the Timer2 Interrupt (which is used for receiving IR)
-	TIMER_DISABLE_INTR; //Timer2 Overflow Interrupt
-
-	pinMode(TIMER_PWM_PIN, OUTPUT);
-	digitalWrite(TIMER_PWM_PIN, LOW); // When not sending PWM, we want it low
-
-	// COM2A = 00: disconnect OC2A
-	// COM2B = 00: disconnect OC2B; to send signal set to 10: OC2B non-inverted
-	// WGM2 = 101: phase-correct PWM with OCRA as top
-	// CS2  = 000: no prescaling
-	// The top value for the timer.  The modulation frequency will be SYSCLOCK / 2 / OCR2A.
-	TIMER_CONFIG_KHZ(khz);
+	_pwm.write(0.0);
+	_pwm.period_us(1 / khz * 1000);
 }
 
 //+=============================================================================
@@ -73,15 +59,14 @@
 
 void IRsend::custom_delay_usec(unsigned long uSecs) {
   if (uSecs > 4) {
-    unsigned long start = micros();
+    unsigned long start = us_ticker_read();
     unsigned long endMicros = start + uSecs - 4;
     if (endMicros < start) { // Check if overflow
-      while ( micros() > start ) {} // wait until overflow
+      while ( us_ticker_read() > start ) {} // wait until overflow
     }
-    while ( micros() < endMicros ) {} // normal wait
+    while ( us_ticker_read() < endMicros ) {} // normal wait
   } 
   //else {
   //  __asm__("nop\n\t"); // must have or compiler optimizes out
   //}
 }
-
--- a/ir_Sharp.cpp	Sat Jan 23 15:36:14 2016 +0900
+++ b/ir_Sharp.cpp	Sat Jan 23 15:09:34 2016 +0000
@@ -52,7 +52,7 @@
 
 		mark(SHARP_BIT_MARK);
 		space(SHARP_ZERO_SPACE);
-		delay(40);
+		wait_ms(40);
 
 		data = data ^ SHARP_TOGGLE_MASK;
 	}