mirror of
https://github.com/Theaninova/Arduino-IRremote.git
synced 2026-01-19 07:42:55 +00:00
Compare commits
1 Commits
v2.4.0
...
z3t0-patch
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5a524ad0bd |
@@ -3,6 +3,7 @@ These are the active contributors of this project that you may contact if there
|
|||||||
|
|
||||||
- [z3t0](https://github.com/z3t0) : Active Contributor and currently also the main contributor.
|
- [z3t0](https://github.com/z3t0) : Active Contributor and currently also the main contributor.
|
||||||
* Email: zetoslab@gmail.com
|
* Email: zetoslab@gmail.com
|
||||||
|
* Skype: polarised16
|
||||||
- [shirriff](https://github.com/shirriff) : An amazing person who worked to create this awesome library and provide unending support
|
- [shirriff](https://github.com/shirriff) : An amazing person who worked to create this awesome library and provide unending support
|
||||||
- [AnalysIR](https:/github.com/AnalysIR): Active contributor and is amazing with providing support!
|
- [AnalysIR](https:/github.com/AnalysIR): Active contributor and is amazing with providing support!
|
||||||
- [Informatic](https://github.com/Informatic) : Active contributor
|
- [Informatic](https://github.com/Informatic) : Active contributor
|
||||||
@@ -18,7 +19,5 @@ These are the active contributors of this project that you may contact if there
|
|||||||
- [philipphenkel](https://github.com/philipphenkel): Active Contributor
|
- [philipphenkel](https://github.com/philipphenkel): Active Contributor
|
||||||
- [MCUdude](https://github.com/MCUdude): Contributor
|
- [MCUdude](https://github.com/MCUdude): Contributor
|
||||||
- [marcmerlin](https://github.com/marcmerlin): Contributor (ESP32 port)
|
- [marcmerlin](https://github.com/marcmerlin): Contributor (ESP32 port)
|
||||||
- [bengtmartensson](https://github.com/bengtmartensson): Active Contributor
|
|
||||||
- [MrBryonMiller](https://github.com/MrBryonMiller): Contributor
|
|
||||||
|
|
||||||
Note: This list is being updated constantly so please let [z3t0](https://github.com/z3t0) know if you have been missed.
|
Note: This list is being updated constantly so please let [z3t0](https://github.com/z3t0) know if you have been missed.
|
||||||
|
|||||||
@@ -24,7 +24,7 @@
|
|||||||
# include "IRremoteInt.h"
|
# include "IRremoteInt.h"
|
||||||
#undef IR_GLOBAL
|
#undef IR_GLOBAL
|
||||||
|
|
||||||
#ifdef HAS_AVR_INTERRUPT_H
|
#ifndef IR_TIMER_USE_ESP32
|
||||||
#include <avr/interrupt.h>
|
#include <avr/interrupt.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -123,7 +123,11 @@ int MATCH_SPACE (int measured_ticks, int desired_us)
|
|||||||
// As soon as first MARK arrives:
|
// As soon as first MARK arrives:
|
||||||
// Gap width is recorded; Ready is cleared; New logging starts
|
// Gap width is recorded; Ready is cleared; New logging starts
|
||||||
//
|
//
|
||||||
|
#ifdef IR_TIMER_USE_ESP32
|
||||||
|
void IRTimer()
|
||||||
|
#else
|
||||||
ISR (TIMER_INTR_NAME)
|
ISR (TIMER_INTR_NAME)
|
||||||
|
#endif
|
||||||
{
|
{
|
||||||
TIMER_RESET;
|
TIMER_RESET;
|
||||||
|
|
||||||
@@ -185,7 +189,6 @@ ISR (TIMER_INTR_NAME)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef BLINKLED
|
|
||||||
// If requested, flash LED while receiving IR data
|
// If requested, flash LED while receiving IR data
|
||||||
if (irparams.blinkflag) {
|
if (irparams.blinkflag) {
|
||||||
if (irdata == MARK)
|
if (irdata == MARK)
|
||||||
@@ -194,5 +197,4 @@ ISR (TIMER_INTR_NAME)
|
|||||||
else if (irparams.blinkpin) digitalWrite(irparams.blinkpin, LOW); // Turn user defined pin LED 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
|
else BLINKLED_OFF() ; // if no user defined LED pin, turn default LED pin for the hardware on
|
||||||
}
|
}
|
||||||
#endif // BLINKLED
|
|
||||||
}
|
}
|
||||||
|
|||||||
27
IRremote.h
27
IRremote.h
@@ -259,18 +259,7 @@ class IRrecv
|
|||||||
class IRsend
|
class IRsend
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
#ifdef USE_SOFT_CARRIER
|
IRsend () { }
|
||||||
|
|
||||||
IRsend(int pin = SEND_PIN)
|
|
||||||
{
|
|
||||||
sendPin = pin;
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
|
|
||||||
IRsend()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void custom_delay_usec (unsigned long uSecs);
|
void custom_delay_usec (unsigned long uSecs);
|
||||||
void enableIROut (int khz) ;
|
void enableIROut (int khz) ;
|
||||||
@@ -350,20 +339,6 @@ class IRsend
|
|||||||
# if SEND_LEGO_PF
|
# if SEND_LEGO_PF
|
||||||
void sendLegoPowerFunctions (uint16_t data, bool repeat = true) ;
|
void sendLegoPowerFunctions (uint16_t data, bool repeat = true) ;
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
#ifdef USE_SOFT_CARRIER
|
|
||||||
private:
|
|
||||||
int sendPin;
|
|
||||||
|
|
||||||
unsigned int periodTime;
|
|
||||||
unsigned int periodOnTime;
|
|
||||||
|
|
||||||
void sleepMicros(unsigned long us);
|
|
||||||
void sleepUntilMicros(unsigned long targetTime);
|
|
||||||
|
|
||||||
#else
|
|
||||||
const int sendPin = SEND_PIN;
|
|
||||||
#endif
|
|
||||||
} ;
|
} ;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ This library enables you to send and receive using infra-red signals on an Ardui
|
|||||||
|
|
||||||
Tutorials and more information will be made available on [the official homepage](http://z3t0.github.io/Arduino-IRremote/).
|
Tutorials and more information will be made available on [the official homepage](http://z3t0.github.io/Arduino-IRremote/).
|
||||||
|
|
||||||
## Version - 2.4.0b
|
## Version - 2.2.3
|
||||||
|
|
||||||
## Installation
|
## Installation
|
||||||
1. Navigate to the [Releases](https://github.com/z3t0/Arduino-IRremote/releases) page.
|
1. Navigate to the [Releases](https://github.com/z3t0/Arduino-IRremote/releases) page.
|
||||||
|
|||||||
138
boarddefs.h
138
boarddefs.h
@@ -20,32 +20,6 @@
|
|||||||
#ifndef boarddefs_h
|
#ifndef boarddefs_h
|
||||||
#define boarddefs_h
|
#define boarddefs_h
|
||||||
|
|
||||||
// Define some defaults, that some boards may like to override
|
|
||||||
// (This is to avoid negative logic, ! DONT_... is just awkward.)
|
|
||||||
|
|
||||||
// This board has/needs the avr/interrupt.h
|
|
||||||
#define HAS_AVR_INTERRUPT_H
|
|
||||||
|
|
||||||
// Define if sending is supported
|
|
||||||
#define SENDING_SUPPORTED
|
|
||||||
|
|
||||||
// If defined, a standard enableIRIn function will be define.
|
|
||||||
// Undefine for boards supplying their own.
|
|
||||||
#define USE_DEFAULT_ENABLE_IR_IN
|
|
||||||
|
|
||||||
// Duty cycle in percent for sent signals. Presently takes effect only with USE_SOFT_CARRIER
|
|
||||||
#define DUTY_CYCLE 50
|
|
||||||
|
|
||||||
// If USE_SOFT_CARRIER, this amount (in micro seconds) is subtracted from the
|
|
||||||
// on-time of the pulses.
|
|
||||||
#define PULSE_CORRECTION 3
|
|
||||||
|
|
||||||
// digitalWrite is supposed to be slow. If this is an issue, define faster,
|
|
||||||
// board-dependent versions of these macros SENDPIN_ON(pin) and SENDPIN_OFF(pin).
|
|
||||||
// Portable, possibly slow, default definitions are given at the end of this file.
|
|
||||||
// If defining new versions, feel free to ignore the pin argument if it
|
|
||||||
// is not configurable on the current board.
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
// Defines for blinking the LED
|
// Defines for blinking the LED
|
||||||
//
|
//
|
||||||
@@ -65,31 +39,11 @@
|
|||||||
# define BLINKLED_ON() (PORTD |= B00000001)
|
# define BLINKLED_ON() (PORTD |= B00000001)
|
||||||
# define BLINKLED_OFF() (PORTD &= B11111110)
|
# define BLINKLED_OFF() (PORTD &= B11111110)
|
||||||
|
|
||||||
#elif defined(ARDUINO_ARCH_SAM) || defined(ARDUINO_ARCH_SAMD)
|
// No system LED on ESP32, disable blinking
|
||||||
# define BLINKLED LED_BUILTIN
|
|
||||||
# define BLINKLED_ON() (digitalWrite(LED_BUILTIN, HIGH))
|
|
||||||
# define BLINKLED_OFF() (digitalWrite(LED_BUILTIN, LOW))
|
|
||||||
|
|
||||||
# define USE_SOFT_CARRIER
|
|
||||||
// Define to use spin wait instead of delayMicros()
|
|
||||||
//# define USE_SPIN_WAIT
|
|
||||||
# undef USE_DEFAULT_ENABLE_IR_IN
|
|
||||||
|
|
||||||
// The default pin used used for sending.
|
|
||||||
# define SEND_PIN 9
|
|
||||||
|
|
||||||
#elif defined(ESP32)
|
#elif defined(ESP32)
|
||||||
// No system LED on ESP32, disable blinking by NOT defining BLINKLED
|
# define BLINKLED 255
|
||||||
|
# define BLINKLED_ON() 1
|
||||||
// avr/interrupt.h is not present
|
# define BLINKLED_OFF() 1
|
||||||
# undef HAS_AVR_INTERRUPT_H
|
|
||||||
|
|
||||||
// Sending not implemented
|
|
||||||
# undef SENDING_SUPPORTED#
|
|
||||||
|
|
||||||
// Supply own enbleIRIn
|
|
||||||
# undef USE_DEFAULT_ENABLE_IR_IN
|
|
||||||
|
|
||||||
#else
|
#else
|
||||||
# define BLINKLED 13
|
# define BLINKLED 13
|
||||||
# define BLINKLED_ON() (PORTB |= B00100000)
|
# define BLINKLED_ON() (PORTB |= B00100000)
|
||||||
@@ -184,10 +138,6 @@
|
|||||||
|
|
||||||
#elif defined(ESP32)
|
#elif defined(ESP32)
|
||||||
#define IR_TIMER_USE_ESP32
|
#define IR_TIMER_USE_ESP32
|
||||||
|
|
||||||
#elif defined(ARDUINO_ARCH_SAM) || defined(ARDUINO_ARCH_SAMD)
|
|
||||||
#define TIMER_PRESCALER_DIV 64
|
|
||||||
|
|
||||||
#else
|
#else
|
||||||
// Arduino Duemilanove, Diecimila, LilyPad, Mini, Fio, Nano, etc
|
// Arduino Duemilanove, Diecimila, LilyPad, Mini, Fio, Nano, etc
|
||||||
// ATmega48, ATmega88, ATmega168, ATmega328
|
// ATmega48, ATmega88, ATmega168, ATmega328
|
||||||
@@ -240,17 +190,17 @@
|
|||||||
|
|
||||||
//-----------------
|
//-----------------
|
||||||
#if defined(CORE_OC2B_PIN)
|
#if defined(CORE_OC2B_PIN)
|
||||||
# define SEND_PIN CORE_OC2B_PIN // Teensy
|
# define TIMER_PWM_PIN CORE_OC2B_PIN // Teensy
|
||||||
#elif defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
|
#elif defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
|
||||||
# define SEND_PIN 9 // Arduino Mega
|
# define TIMER_PWM_PIN 9 // Arduino Mega
|
||||||
#elif defined(__AVR_ATmega1284__) || defined(__AVR_ATmega1284P__) \
|
#elif defined(__AVR_ATmega1284__) || defined(__AVR_ATmega1284P__) \
|
||||||
|| defined(__AVR_ATmega644__) || defined(__AVR_ATmega644P__) \
|
|| defined(__AVR_ATmega644__) || defined(__AVR_ATmega644P__) \
|
||||||
|| defined(__AVR_ATmega324P__) || defined(__AVR_ATmega324A__) \
|
|| defined(__AVR_ATmega324P__) || defined(__AVR_ATmega324A__) \
|
||||||
|| defined(__AVR_ATmega324PA__) || defined(__AVR_ATmega164A__) \
|
|| defined(__AVR_ATmega324PA__) || defined(__AVR_ATmega164A__) \
|
||||||
|| defined(__AVR_ATmega164P__)
|
|| defined(__AVR_ATmega164P__)
|
||||||
# define SEND_PIN 14 // MightyCore
|
# define TIMER_PWM_PIN 14 // MightyCore
|
||||||
#else
|
#else
|
||||||
# define SEND_PIN 3 // Arduino Duemilanove, Diecimila, LilyPad, etc
|
# define TIMER_PWM_PIN 3 // Arduino Duemilanove, Diecimila, LilyPad, etc
|
||||||
#endif // ATmega48, ATmega88, ATmega168, ATmega328
|
#endif // ATmega48, ATmega88, ATmega168, ATmega328
|
||||||
|
|
||||||
//---------------------------------------------------------
|
//---------------------------------------------------------
|
||||||
@@ -293,22 +243,22 @@
|
|||||||
|
|
||||||
//-----------------
|
//-----------------
|
||||||
#if defined(CORE_OC1A_PIN)
|
#if defined(CORE_OC1A_PIN)
|
||||||
# define SEND_PIN CORE_OC1A_PIN // Teensy
|
# define TIMER_PWM_PIN CORE_OC1A_PIN // Teensy
|
||||||
#elif defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
|
#elif defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
|
||||||
# define SEND_PIN 11 // Arduino Mega
|
# define TIMER_PWM_PIN 11 // Arduino Mega
|
||||||
#elif defined(__AVR_ATmega64__) || defined(__AVR_ATmega128__)
|
#elif defined(__AVR_ATmega64__) || defined(__AVR_ATmega128__)
|
||||||
# define SEND_PIN 13 // MegaCore
|
# define TIMER_PWM_PIN 13 // MegaCore
|
||||||
#elif defined(__AVR_ATmega1284__) || defined(__AVR_ATmega1284P__) \
|
#elif defined(__AVR_ATmega1284__) || defined(__AVR_ATmega1284P__) \
|
||||||
|| defined(__AVR_ATmega644__) || defined(__AVR_ATmega644P__) \
|
|| defined(__AVR_ATmega644__) || defined(__AVR_ATmega644P__) \
|
||||||
|| defined(__AVR_ATmega324P__) || defined(__AVR_ATmega324A__) \
|
|| defined(__AVR_ATmega324P__) || defined(__AVR_ATmega324A__) \
|
||||||
|| defined(__AVR_ATmega324PA__) || defined(__AVR_ATmega164A__) \
|
|| defined(__AVR_ATmega324PA__) || defined(__AVR_ATmega164A__) \
|
||||||
|| defined(__AVR_ATmega164P__) || defined(__AVR_ATmega32__) \
|
|| defined(__AVR_ATmega164P__) || defined(__AVR_ATmega32__) \
|
||||||
|| defined(__AVR_ATmega16__) || defined(__AVR_ATmega8535__)
|
|| defined(__AVR_ATmega16__) || defined(__AVR_ATmega8535__)
|
||||||
# define SEND_PIN 13 // MightyCore
|
# define TIMER_PWM_PIN 13 // MightyCore
|
||||||
#elif defined(__AVR_ATtiny84__)
|
#elif defined(__AVR_ATtiny84__)
|
||||||
# define SEND_PIN 6
|
# define TIMER_PWM_PIN 6
|
||||||
#else
|
#else
|
||||||
# define SEND_PIN 9 // Arduino Duemilanove, Diecimila, LilyPad, etc
|
# define TIMER_PWM_PIN 9 // Arduino Duemilanove, Diecimila, LilyPad, etc
|
||||||
#endif // ATmega48, ATmega88, ATmega168, ATmega328
|
#endif // ATmega48, ATmega88, ATmega168, ATmega328
|
||||||
|
|
||||||
//---------------------------------------------------------
|
//---------------------------------------------------------
|
||||||
@@ -340,11 +290,11 @@
|
|||||||
|
|
||||||
//-----------------
|
//-----------------
|
||||||
#if defined(CORE_OC3A_PIN)
|
#if defined(CORE_OC3A_PIN)
|
||||||
# define SEND_PIN CORE_OC3A_PIN // Teensy
|
# define TIMER_PWM_PIN CORE_OC3A_PIN // Teensy
|
||||||
#elif defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
|
#elif defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
|
||||||
# define SEND_PIN 5 // Arduino Mega
|
# define TIMER_PWM_PIN 5 // Arduino Mega
|
||||||
#elif defined(__AVR_ATmega1284__) || defined(__AVR_ATmega1284P__)
|
#elif defined(__AVR_ATmega1284__) || defined(__AVR_ATmega1284P__)
|
||||||
# define SEND_PIN 6 // MightyCore
|
# define TIMER_PWM_PIN 6 // MightyCore
|
||||||
#else
|
#else
|
||||||
# error "Please add OC3A pin number here\n"
|
# error "Please add OC3A pin number here\n"
|
||||||
#endif
|
#endif
|
||||||
@@ -388,9 +338,9 @@
|
|||||||
|
|
||||||
//-----------------
|
//-----------------
|
||||||
#if defined(CORE_OC4A_PIN)
|
#if defined(CORE_OC4A_PIN)
|
||||||
# define SEND_PIN CORE_OC4A_PIN // Teensy
|
# define TIMER_PWM_PIN CORE_OC4A_PIN // Teensy
|
||||||
#elif defined(__AVR_ATmega32U4__)
|
#elif defined(__AVR_ATmega32U4__)
|
||||||
# define SEND_PIN 13 // Leonardo
|
# define TIMER_PWM_PIN 13 // Leonardo
|
||||||
#else
|
#else
|
||||||
# error "Please add OC4A pin number here\n"
|
# error "Please add OC4A pin number here\n"
|
||||||
#endif
|
#endif
|
||||||
@@ -424,9 +374,9 @@
|
|||||||
|
|
||||||
//-----------------
|
//-----------------
|
||||||
#if defined(CORE_OC4A_PIN)
|
#if defined(CORE_OC4A_PIN)
|
||||||
# define SEND_PIN CORE_OC4A_PIN
|
# define TIMER_PWM_PIN CORE_OC4A_PIN
|
||||||
#elif defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
|
#elif defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
|
||||||
# define SEND_PIN 6 // Arduino Mega
|
# define TIMER_PWM_PIN 6 // Arduino Mega
|
||||||
#else
|
#else
|
||||||
# error "Please add OC4A pin number here\n"
|
# error "Please add OC4A pin number here\n"
|
||||||
#endif
|
#endif
|
||||||
@@ -460,9 +410,9 @@
|
|||||||
|
|
||||||
//-----------------
|
//-----------------
|
||||||
#if defined(CORE_OC5A_PIN)
|
#if defined(CORE_OC5A_PIN)
|
||||||
# define SEND_PIN CORE_OC5A_PIN
|
# define TIMER_PWM_PIN CORE_OC5A_PIN
|
||||||
#elif defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
|
#elif defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
|
||||||
# define SEND_PIN 46 // Arduino Mega
|
# define TIMER_PWM_PIN 46 // Arduino Mega
|
||||||
#else
|
#else
|
||||||
# error "Please add OC5A pin number here\n"
|
# error "Please add OC5A pin number here\n"
|
||||||
#endif
|
#endif
|
||||||
@@ -529,7 +479,7 @@
|
|||||||
CMT_MSC = 0x03; \
|
CMT_MSC = 0x03; \
|
||||||
})
|
})
|
||||||
|
|
||||||
#define SEND_PIN 5
|
#define TIMER_PWM_PIN 5
|
||||||
|
|
||||||
// defines for TPM1 timer on Teensy-LC
|
// defines for TPM1 timer on Teensy-LC
|
||||||
#elif defined(IR_USE_TIMER_TPM1)
|
#elif defined(IR_USE_TIMER_TPM1)
|
||||||
@@ -559,7 +509,7 @@
|
|||||||
FTM1_C0V = 0; \
|
FTM1_C0V = 0; \
|
||||||
FTM1_SC = FTM_SC_CLKS(1) | FTM_SC_PS(0) | FTM_SC_TOF | FTM_SC_TOIE; \
|
FTM1_SC = FTM_SC_CLKS(1) | FTM_SC_PS(0) | FTM_SC_TOF | FTM_SC_TOIE; \
|
||||||
})
|
})
|
||||||
#define SEND_PIN 16
|
#define TIMER_PWM_PIN 16
|
||||||
|
|
||||||
// defines for timer_tiny0 (8 bits)
|
// defines for timer_tiny0 (8 bits)
|
||||||
#elif defined(IR_USE_TIMER_TINY0)
|
#elif defined(IR_USE_TIMER_TINY0)
|
||||||
@@ -593,7 +543,7 @@
|
|||||||
})
|
})
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define SEND_PIN 1 /* ATtiny85 */
|
#define TIMER_PWM_PIN 1 /* ATtiny85 */
|
||||||
|
|
||||||
//---------------------------------------------------------
|
//---------------------------------------------------------
|
||||||
// ESP32 (ESP8266 should likely be added here too)
|
// ESP32 (ESP8266 should likely be added here too)
|
||||||
@@ -610,29 +560,12 @@
|
|||||||
// way to do this on ESP32 is using the RMT built in driver like in this incomplete library below
|
// way to do this on ESP32 is using the RMT built in driver like in this incomplete library below
|
||||||
// https://github.com/ExploreEmbedded/ESP32_RMT
|
// https://github.com/ExploreEmbedded/ESP32_RMT
|
||||||
#elif defined(IR_TIMER_USE_ESP32)
|
#elif defined(IR_TIMER_USE_ESP32)
|
||||||
|
|
||||||
#define TIMER_RESET
|
#define TIMER_RESET
|
||||||
|
#define TIMER_ENABLE_PWM
|
||||||
#ifdef ISR
|
#define TIMER_DISABLE_PWM Serial.println("IRsend not implemented for ESP32 yet");
|
||||||
# undef ISR
|
#define TIMER_ENABLE_INTR
|
||||||
#endif
|
#define TIMER_DISABLE_INTR
|
||||||
#define ISR(f) void IRTimer()
|
#define TIMER_INTR_NAME
|
||||||
|
|
||||||
#elif defined(ARDUINO_ARCH_SAM) || defined(ARDUINO_ARCH_SAMD)
|
|
||||||
// use timer 3 hardcoded at this time
|
|
||||||
|
|
||||||
#define TIMER_RESET
|
|
||||||
#define TIMER_ENABLE_PWM // Not presently used
|
|
||||||
#define TIMER_DISABLE_PWM
|
|
||||||
#define TIMER_ENABLE_INTR NVIC_EnableIRQ(TC3_IRQn) // Not presently used
|
|
||||||
#define TIMER_DISABLE_INTR NVIC_DisableIRQ(TC3_IRQn)
|
|
||||||
#define TIMER_INTR_NAME TC3_Handler // Not presently used
|
|
||||||
#define TIMER_CONFIG_KHZ(f)
|
|
||||||
|
|
||||||
#ifdef ISR
|
|
||||||
# undef ISR
|
|
||||||
#endif
|
|
||||||
#define ISR(f) void irs()
|
|
||||||
|
|
||||||
//---------------------------------------------------------
|
//---------------------------------------------------------
|
||||||
// Unknown Timer
|
// Unknown Timer
|
||||||
@@ -641,13 +574,4 @@
|
|||||||
# error "Internal code configuration error, no known IR_USE_TIMER# defined\n"
|
# error "Internal code configuration error, no known IR_USE_TIMER# defined\n"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Provide default definitions, portable but possibly slower than necessary.
|
|
||||||
#ifndef SENDPIN_ON
|
|
||||||
#define SENDPIN_ON(pin) digitalWrite(pin, HIGH)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef SENDPIN_OFF
|
|
||||||
#define SENDPIN_OFF(pin) digitalWrite(pin, LOW)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif // ! boarddefs_h
|
#endif // ! boarddefs_h
|
||||||
|
|||||||
@@ -1,6 +1,3 @@
|
|||||||
## 2.4.0 - 2017/08/10
|
|
||||||
- Cleanup of hardware dependencies. Merge in SAM support [PR #437](https://github.com/z3t0/Arduino-IRremote/pull/437)
|
|
||||||
|
|
||||||
## 2.3.3 - 2017/03/31
|
## 2.3.3 - 2017/03/31
|
||||||
- Added ESP32 IR receive support [PR #427](https://github.com/z3t0/Arduino-IRremote/pull/425)
|
- Added ESP32 IR receive support [PR #427](https://github.com/z3t0/Arduino-IRremote/pull/425)
|
||||||
|
|
||||||
|
|||||||
39
esp32.cpp
39
esp32.cpp
@@ -1,39 +0,0 @@
|
|||||||
#ifdef ESP32
|
|
||||||
|
|
||||||
// This file contains functions specific to the ESP32.
|
|
||||||
|
|
||||||
#include "IRremote.h"
|
|
||||||
#include "IRremoteInt.h"
|
|
||||||
|
|
||||||
// "Idiot check"
|
|
||||||
#ifdef USE_DEFAULT_ENABLE_IR_IN
|
|
||||||
#error Must undef USE_DEFAULT_ENABLE_IR_IN
|
|
||||||
#endif
|
|
||||||
|
|
||||||
hw_timer_t *timer;
|
|
||||||
void IRTimer(); // defined in IRremote.cpp, masqueraded as ISR(TIMER_INTR_NAME)
|
|
||||||
|
|
||||||
//+=============================================================================
|
|
||||||
// initialization
|
|
||||||
//
|
|
||||||
void IRrecv::enableIRIn ( )
|
|
||||||
{
|
|
||||||
// Interrupt Service Routine - Fires every 50uS
|
|
||||||
// ESP32 has a proper API to setup timers, no weird chip macros needed
|
|
||||||
// simply call the readable API versions :)
|
|
||||||
// 3 timers, choose #1, 80 divider nanosecond precision, 1 to count up
|
|
||||||
timer = timerBegin(1, 80, 1);
|
|
||||||
timerAttachInterrupt(timer, &IRTimer, 1);
|
|
||||||
// every 50ns, autoreload = true
|
|
||||||
timerAlarmWrite(timer, 50, true);
|
|
||||||
timerAlarmEnable(timer);
|
|
||||||
|
|
||||||
// Initialize state machine variables
|
|
||||||
irparams.rcvstate = STATE_IDLE;
|
|
||||||
irparams.rawlen = 0;
|
|
||||||
|
|
||||||
// Set pin modes
|
|
||||||
pinMode(irparams.recvpin, INPUT);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif // ESP32
|
|
||||||
@@ -79,7 +79,7 @@ void dumpTIMER() {
|
|||||||
|
|
||||||
void dumpTimerPin() {
|
void dumpTimerPin() {
|
||||||
Serial.print(F("IR Tx Pin: "));
|
Serial.print(F("IR Tx Pin: "));
|
||||||
Serial.println(SEND_PIN);
|
Serial.println(TIMER_PWM_PIN);
|
||||||
}
|
}
|
||||||
|
|
||||||
void dumpClock() {
|
void dumpClock() {
|
||||||
|
|||||||
20
irRecv.cpp
20
irRecv.cpp
@@ -1,6 +1,11 @@
|
|||||||
#include "IRremote.h"
|
#include "IRremote.h"
|
||||||
#include "IRremoteInt.h"
|
#include "IRremoteInt.h"
|
||||||
|
|
||||||
|
#ifdef IR_TIMER_USE_ESP32
|
||||||
|
hw_timer_t *timer;
|
||||||
|
void IRTimer(); // defined in IRremote.cpp
|
||||||
|
#endif
|
||||||
|
|
||||||
//+=============================================================================
|
//+=============================================================================
|
||||||
// Decodes the received IR message
|
// Decodes the received IR message
|
||||||
// Returns 0 if no data ready, 1 if data ready.
|
// Returns 0 if no data ready, 1 if data ready.
|
||||||
@@ -115,10 +120,19 @@ IRrecv::IRrecv (int recvpin, int blinkpin)
|
|||||||
//+=============================================================================
|
//+=============================================================================
|
||||||
// initialization
|
// initialization
|
||||||
//
|
//
|
||||||
#ifdef USE_DEFAULT_ENABLE_IR_IN
|
|
||||||
void IRrecv::enableIRIn ( )
|
void IRrecv::enableIRIn ( )
|
||||||
{
|
{
|
||||||
// Interrupt Service Routine - Fires every 50uS
|
// Interrupt Service Routine - Fires every 50uS
|
||||||
|
#ifdef ESP32
|
||||||
|
// ESP32 has a proper API to setup timers, no weird chip macros needed
|
||||||
|
// simply call the readable API versions :)
|
||||||
|
// 3 timers, choose #1, 80 divider nanosecond precision, 1 to count up
|
||||||
|
timer = timerBegin(1, 80, 1);
|
||||||
|
timerAttachInterrupt(timer, &IRTimer, 1);
|
||||||
|
// every 50ns, autoreload = true
|
||||||
|
timerAlarmWrite(timer, 50, true);
|
||||||
|
timerAlarmEnable(timer);
|
||||||
|
#else
|
||||||
cli();
|
cli();
|
||||||
// Setup pulse clock timer interrupt
|
// Setup pulse clock timer interrupt
|
||||||
// Prescale /8 (16M/8 = 0.5 microseconds per tick)
|
// Prescale /8 (16M/8 = 0.5 microseconds per tick)
|
||||||
@@ -132,6 +146,7 @@ void IRrecv::enableIRIn ( )
|
|||||||
TIMER_RESET;
|
TIMER_RESET;
|
||||||
|
|
||||||
sei(); // enable interrupts
|
sei(); // enable interrupts
|
||||||
|
#endif
|
||||||
|
|
||||||
// Initialize state machine variables
|
// Initialize state machine variables
|
||||||
irparams.rcvstate = STATE_IDLE;
|
irparams.rcvstate = STATE_IDLE;
|
||||||
@@ -140,17 +155,14 @@ void IRrecv::enableIRIn ( )
|
|||||||
// Set pin modes
|
// Set pin modes
|
||||||
pinMode(irparams.recvpin, INPUT);
|
pinMode(irparams.recvpin, INPUT);
|
||||||
}
|
}
|
||||||
#endif // USE_DEFAULT_ENABLE_IR_IN
|
|
||||||
|
|
||||||
//+=============================================================================
|
//+=============================================================================
|
||||||
// Enable/disable blinking of pin 13 on IR processing
|
// Enable/disable blinking of pin 13 on IR processing
|
||||||
//
|
//
|
||||||
void IRrecv::blink13 (int blinkflag)
|
void IRrecv::blink13 (int blinkflag)
|
||||||
{
|
{
|
||||||
#ifdef BLINKLED
|
|
||||||
irparams.blinkflag = blinkflag;
|
irparams.blinkflag = blinkflag;
|
||||||
if (blinkflag) pinMode(BLINKLED, OUTPUT) ;
|
if (blinkflag) pinMode(BLINKLED, OUTPUT) ;
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//+=============================================================================
|
//+=============================================================================
|
||||||
|
|||||||
61
irSend.cpp
61
irSend.cpp
@@ -1,7 +1,6 @@
|
|||||||
#include "IRremote.h"
|
#include "IRremote.h"
|
||||||
#include "IRremoteInt.h"
|
#include "IRremoteInt.h"
|
||||||
|
|
||||||
#ifdef SENDING_SUPPORTED
|
|
||||||
//+=============================================================================
|
//+=============================================================================
|
||||||
void IRsend::sendRaw (const unsigned int buf[], unsigned int len, unsigned int hz)
|
void IRsend::sendRaw (const unsigned int buf[], unsigned int len, unsigned int hz)
|
||||||
{
|
{
|
||||||
@@ -16,59 +15,14 @@ void IRsend::sendRaw (const unsigned int buf[], unsigned int len, unsigned in
|
|||||||
space(0); // Always end with the LED off
|
space(0); // Always end with the LED off
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef USE_SOFT_CARRIER
|
|
||||||
void inline IRsend::sleepMicros(unsigned long us)
|
|
||||||
{
|
|
||||||
#ifdef USE_SPIN_WAIT
|
|
||||||
sleepUntilMicros(micros() + us);
|
|
||||||
#else
|
|
||||||
if (us > 0U) // Is this necessary? (Official docu https://www.arduino.cc/en/Reference/DelayMicroseconds does not tell.)
|
|
||||||
delayMicroseconds((unsigned int) us);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
void inline IRsend::sleepUntilMicros(unsigned long targetTime)
|
|
||||||
{
|
|
||||||
#ifdef USE_SPIN_WAIT
|
|
||||||
while (micros() < targetTime)
|
|
||||||
;
|
|
||||||
#else
|
|
||||||
unsigned long now = micros();
|
|
||||||
if (now < targetTime)
|
|
||||||
sleepMicros(targetTime - now);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
#endif // USE_SOFT_CARRIER
|
|
||||||
|
|
||||||
//+=============================================================================
|
//+=============================================================================
|
||||||
// Sends an IR mark for the specified number of microseconds.
|
// Sends an IR mark for the specified number of microseconds.
|
||||||
// The mark output is modulated at the PWM frequency.
|
// The mark output is modulated at the PWM frequency.
|
||||||
//
|
//
|
||||||
|
void IRsend::mark (unsigned int time)
|
||||||
void IRsend::mark(unsigned int time)
|
|
||||||
{
|
{
|
||||||
#ifdef USE_SOFT_CARRIER
|
|
||||||
unsigned long start = micros();
|
|
||||||
unsigned long stop = start + time;
|
|
||||||
if (stop + periodTime < start)
|
|
||||||
// Counter wrap-around, happens very seldomly, but CAN happen.
|
|
||||||
// Just give up instead of possibly damaging the hardware.
|
|
||||||
return;
|
|
||||||
|
|
||||||
unsigned long nextPeriodEnding = start;
|
|
||||||
unsigned long now = micros();
|
|
||||||
while (now < stop) {
|
|
||||||
SENDPIN_ON(sendPin);
|
|
||||||
sleepMicros(periodOnTime);
|
|
||||||
SENDPIN_OFF(sendPin);
|
|
||||||
nextPeriodEnding += periodTime;
|
|
||||||
sleepUntilMicros(nextPeriodEnding);
|
|
||||||
now = micros();
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
TIMER_ENABLE_PWM; // Enable pin 3 PWM output
|
TIMER_ENABLE_PWM; // Enable pin 3 PWM output
|
||||||
if (time > 0) custom_delay_usec(time);
|
if (time > 0) custom_delay_usec(time);
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//+=============================================================================
|
//+=============================================================================
|
||||||
@@ -100,16 +54,13 @@ void IRsend::space (unsigned int time)
|
|||||||
//
|
//
|
||||||
void IRsend::enableIROut (int khz)
|
void IRsend::enableIROut (int khz)
|
||||||
{
|
{
|
||||||
#ifdef USE_SOFT_CARRIER
|
// FIXME: implement ESP32 support, see IR_TIMER_USE_ESP32 in boarddefs.h
|
||||||
periodTime = (1000U + khz/2) / khz; // = 1000/khz + 1/2 = round(1000.0/khz)
|
#ifndef ESP32
|
||||||
periodOnTime = periodTime * DUTY_CYCLE / 100U - PULSE_CORRECTION;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Disable the Timer2 Interrupt (which is used for receiving IR)
|
// Disable the Timer2 Interrupt (which is used for receiving IR)
|
||||||
TIMER_DISABLE_INTR; //Timer2 Overflow Interrupt
|
TIMER_DISABLE_INTR; //Timer2 Overflow Interrupt
|
||||||
|
|
||||||
pinMode(sendPin, OUTPUT);
|
pinMode(TIMER_PWM_PIN, OUTPUT);
|
||||||
SENDPIN_OFF(sendPin); // When not sending, we want it low
|
digitalWrite(TIMER_PWM_PIN, LOW); // When not sending PWM, we want it low
|
||||||
|
|
||||||
// COM2A = 00: disconnect OC2A
|
// COM2A = 00: disconnect OC2A
|
||||||
// COM2B = 00: disconnect OC2B; to send signal set to 10: OC2B non-inverted
|
// COM2B = 00: disconnect OC2B; to send signal set to 10: OC2B non-inverted
|
||||||
@@ -117,6 +68,7 @@ void IRsend::enableIROut (int khz)
|
|||||||
// CS2 = 000: no prescaling
|
// CS2 = 000: no prescaling
|
||||||
// The top value for the timer. The modulation frequency will be SYSCLOCK / 2 / OCR2A.
|
// The top value for the timer. The modulation frequency will be SYSCLOCK / 2 / OCR2A.
|
||||||
TIMER_CONFIG_KHZ(khz);
|
TIMER_CONFIG_KHZ(khz);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
//+=============================================================================
|
//+=============================================================================
|
||||||
@@ -136,4 +88,3 @@ void IRsend::custom_delay_usec(unsigned long uSecs) {
|
|||||||
//}
|
//}
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // SENDING_SUPPORTED
|
|
||||||
102
sam.cpp
102
sam.cpp
@@ -1,102 +0,0 @@
|
|||||||
// Support routines for SAM processor boards
|
|
||||||
|
|
||||||
#include "IRremote.h"
|
|
||||||
#include "IRremoteInt.h"
|
|
||||||
|
|
||||||
#if defined(ARDUINO_ARCH_SAM) || defined(ARDUINO_ARCH_SAMD)
|
|
||||||
|
|
||||||
// "Idiot check"
|
|
||||||
#ifdef USE_DEFAULT_ENABLE_IR_IN
|
|
||||||
#error Must undef USE_DEFAULT_ENABLE_IR_IN
|
|
||||||
#endif
|
|
||||||
|
|
||||||
//+=============================================================================
|
|
||||||
// ATSAMD Timer setup & IRQ functions
|
|
||||||
//
|
|
||||||
|
|
||||||
// following based on setup from GitHub jdneo/timerInterrupt.ino
|
|
||||||
|
|
||||||
static void setTimerFrequency(int frequencyHz)
|
|
||||||
{
|
|
||||||
int compareValue = (SYSCLOCK / (TIMER_PRESCALER_DIV * frequencyHz)) - 1;
|
|
||||||
//Serial.println(compareValue);
|
|
||||||
TcCount16* TC = (TcCount16*) TC3;
|
|
||||||
// Make sure the count is in a proportional position to where it was
|
|
||||||
// to prevent any jitter or disconnect when changing the compare value.
|
|
||||||
TC->COUNT.reg = map(TC->COUNT.reg, 0, TC->CC[0].reg, 0, compareValue);
|
|
||||||
TC->CC[0].reg = compareValue;
|
|
||||||
//Serial.print("COUNT.reg ");
|
|
||||||
//Serial.println(TC->COUNT.reg);
|
|
||||||
//Serial.print("CC[0].reg ");
|
|
||||||
//Serial.println(TC->CC[0].reg);
|
|
||||||
while (TC->STATUS.bit.SYNCBUSY == 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void startTimer()
|
|
||||||
{
|
|
||||||
REG_GCLK_CLKCTRL = (uint16_t) (GCLK_CLKCTRL_CLKEN | GCLK_CLKCTRL_GEN_GCLK0 | GCLK_CLKCTRL_ID_TCC2_TC3);
|
|
||||||
while (GCLK->STATUS.bit.SYNCBUSY == 1); // wait for sync
|
|
||||||
|
|
||||||
TcCount16* TC = (TcCount16*) TC3;
|
|
||||||
|
|
||||||
TC->CTRLA.reg &= ~TC_CTRLA_ENABLE;
|
|
||||||
while (TC->STATUS.bit.SYNCBUSY == 1); // wait for sync
|
|
||||||
|
|
||||||
// Use the 16-bit timer
|
|
||||||
TC->CTRLA.reg |= TC_CTRLA_MODE_COUNT16;
|
|
||||||
while (TC->STATUS.bit.SYNCBUSY == 1); // wait for sync
|
|
||||||
|
|
||||||
// Use match mode so that the timer counter resets when the count matches the compare register
|
|
||||||
TC->CTRLA.reg |= TC_CTRLA_WAVEGEN_MFRQ;
|
|
||||||
while (TC->STATUS.bit.SYNCBUSY == 1); // wait for sync
|
|
||||||
|
|
||||||
// Set prescaler to 1024
|
|
||||||
//TC->CTRLA.reg |= TC_CTRLA_PRESCALER_DIV1024;
|
|
||||||
TC->CTRLA.reg |= TC_CTRLA_PRESCALER_DIV64;
|
|
||||||
while (TC->STATUS.bit.SYNCBUSY == 1); // wait for sync
|
|
||||||
|
|
||||||
setTimerFrequency(1000000 / USECPERTICK);
|
|
||||||
|
|
||||||
// Enable the compare interrupt
|
|
||||||
TC->INTENSET.reg = 0;
|
|
||||||
TC->INTENSET.bit.MC0 = 1;
|
|
||||||
|
|
||||||
NVIC_EnableIRQ(TC3_IRQn);
|
|
||||||
|
|
||||||
TC->CTRLA.reg |= TC_CTRLA_ENABLE;
|
|
||||||
while (TC->STATUS.bit.SYNCBUSY == 1); // wait for sync
|
|
||||||
}
|
|
||||||
|
|
||||||
//+=============================================================================
|
|
||||||
// initialization
|
|
||||||
//
|
|
||||||
|
|
||||||
void IRrecv::enableIRIn()
|
|
||||||
{
|
|
||||||
// Interrupt Service Routine - Fires every 50uS
|
|
||||||
//Serial.println("Starting timer");
|
|
||||||
startTimer();
|
|
||||||
//Serial.println("Started timer");
|
|
||||||
|
|
||||||
// Initialize state machine variables
|
|
||||||
irparams.rcvstate = STATE_IDLE;
|
|
||||||
irparams.rawlen = 0;
|
|
||||||
|
|
||||||
// Set pin modes
|
|
||||||
pinMode(irparams.recvpin, INPUT);
|
|
||||||
}
|
|
||||||
|
|
||||||
void irs(); // Defined in IRRemote as ISR(TIMER_INTR_NAME)
|
|
||||||
|
|
||||||
void TC3_Handler(void)
|
|
||||||
{
|
|
||||||
TcCount16* TC = (TcCount16*) TC3;
|
|
||||||
// If this interrupt is due to the compare register matching the timer count
|
|
||||||
// we toggle the LED.
|
|
||||||
if (TC->INTFLAG.bit.MC0 == 1) {
|
|
||||||
TC->INTFLAG.bit.MC0 = 1;
|
|
||||||
irs();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif // defined(ARDUINO_ARCH_SAM) || defined(ARDUINO_ARCH_SAMD)
|
|
||||||
Reference in New Issue
Block a user