Go to the documentation of this file.
33 #ifndef _IR_REMOTE_INT_H
34 #define _IR_REMOTE_INT_H
42 #define F_CPU 16000000 // definition for a board for which F_CPU is not defined
44 #if defined(F_CPU) // F_CPU is used to generate the receive send timings in some CPU's
45 #define CLOCKS_PER_MICRO (F_CPU / MICROS_IN_ONE_SECOND)
51 #if defined(SYSCLOCK) // allow for processor specific code to define F_CPU
53 #define F_CPU SYSCLOCK // Clock frequency to be used for timing.
62 #define DISABLE_LED_FEEDBACK false
63 #define ENABLE_LED_FEEDBACK true
64 #define USE_DEFAULT_FEEDBACK_LED_PIN 0
75 #if !defined(RAW_BUFFER_LENGTH)
76 # if (defined(RAMEND) && RAMEND <= 0x2FF) || (defined(RAMSIZE) && RAMSIZE < 0x2FF)
78 #define RAW_BUFFER_LENGTH 100
79 # elif (defined(RAMEND) && RAMEND <= 0x8FF) || (defined(RAMSIZE) && RAMSIZE < 0x8FF)
81 #define RAW_BUFFER_LENGTH 200
84 #define RAW_BUFFER_LENGTH 750 // The value for air condition remotes.
87 #if RAW_BUFFER_LENGTH % 2 == 1
88 #error RAW_BUFFER_LENGTH must be even, since the array consists of space / mark pairs.
91 #if RAW_BUFFER_LENGTH <= 254 // saves around 75 bytes program memory and speeds up ISR
105 #if RECORD_GAP_TICKS <= 400 // Corresponds to RECORD_GAP_MICROS of 200000. A value of 255 is foolproof, but we assume, that the frame gap is way greater than the biggest mark or space duration.
111 #if (__INT_WIDTH__ < 32)
113 #define BITS_IN_RAW_DATA_TYPE 32
116 #define BITS_IN_RAW_DATA_TYPE 64
123 #define IR_REC_STATE_IDLE 0 // Counting the gap time and waiting for the start bit to arrive
124 #define IR_REC_STATE_MARK 1 // A mark was received and we are counting the duration of it.
125 #define IR_REC_STATE_SPACE 2 // A space was received and we are counting the duration of it. If space is too long, we assume end of frame.
126 #define IR_REC_STATE_STOP 3 // Stopped until set to IR_REC_STATE_IDLE which can only be done by resume()
137 volatile uint8_t *IRReceivePinPortInputRegister;
138 uint8_t IRReceivePinMask;
141 #if !defined(IR_REMOTE_DISABLE_RECEIVE_COMPLETE_CALLBACK)
159 #if defined(DEBUG) || defined(TRACE)
160 # define IR_DEBUG_PRINT(...) Serial.print(__VA_ARGS__)
161 # define IR_DEBUG_PRINTLN(...) Serial.println(__VA_ARGS__)
166 # define IR_DEBUG_PRINT(...) void()
170 # define IR_DEBUG_PRINTLN(...) void()
174 # define IR_TRACE_PRINT(...) Serial.print(__VA_ARGS__)
175 # define IR_TRACE_PRINTLN(...) Serial.println(__VA_ARGS__)
177 # define IR_TRACE_PRINT(...) void()
178 # define IR_TRACE_PRINTLN(...) void()
210 uint_fast8_t aReceivePin)
212 IRrecv(uint_fast8_t aReceivePin,
213 uint_fast8_t aFeedbackLEDPin)
216 #if !defined(IR_REMOTE_DISABLE_RECEIVE_COMPLETE_CALLBACK)
223 void begin(uint_fast8_t aReceivePin,
bool aEnableLEDFeedback =
false, uint_fast8_t aFeedbackLEDPin =
228 void restartTimer(uint32_t aMicrosecondsToAddToGapCounter);
253 void printIRDuration(Print *aSerial,
bool aOutputMicrosecondsInsteadOfTicks);
290 uint_fast8_t aNumberOfBits,
IRRawlenType aStartOffset = 3);
293 uint16_t aOneSpaceMicros, uint16_t aZeroMarkMicros,
bool aMSBfirst);
296 uint16_t aZeroMarkMicros, uint16_t aOneSpaceMicros, uint16_t aZeroSpaceMicros,
bool aMSBfirst)
297 __attribute__ ((deprecated (
"Please use decodePulseDistanceWidthData() with 6 parameters.")));
300 uint16_t aZeroMarkMicros, uint16_t aOneSpaceMicros, uint16_t aZeroSpaceMicros,
bool aMSBfirst);
303 uint_fast8_t aValueOfSpaceToMarkTransition, uint16_t aBiphaseTimeUnit);
305 void initBiphaselevel(uint_fast8_t aRCDecodeRawbuffOffset, uint16_t aBiphaseTimeUnit);
351 __attribute__ ((deprecated (
"Please use IrReceiver.decode() without a parameter and IrReceiver.decodedIRData.<fieldname> .")));
354 void blink13(uint8_t aEnableLEDFeedback)
355 __attribute__ ((deprecated (
"Please use setLEDFeedback() or enableLEDFeedback() / disableLEDFeedback().")));
361 uint_fast8_t
compare(uint16_t oldval, uint16_t newval);
373 #if defined(DECODE_DISTANCE_WIDTH)
385 bool matchTicks(uint16_t aMeasuredTicks, uint16_t aMatchValueMicros);
386 bool matchMark(uint16_t aMeasuredTicks, uint16_t aMatchValueMicros);
387 bool matchSpace(uint16_t aMeasuredTicks, uint16_t aMatchValueMicros);
392 bool MATCH(uint16_t measured, uint16_t desired);
393 bool MATCH_MARK(uint16_t measured_ticks, uint16_t desired_us);
394 bool MATCH_SPACE(uint16_t measured_ticks, uint16_t desired_us);
403 #define DO_NOT_ENABLE_LED_FEEDBACK 0x00
404 #define LED_FEEDBACK_DISABLED_COMPLETELY 0x00
405 #define LED_FEEDBACK_ENABLED_FOR_RECEIVE 0x01
406 #define LED_FEEDBACK_ENABLED_FOR_SEND 0x02
408 void setLEDFeedback(uint8_t aFeedbackLEDPin, uint8_t aEnableLEDFeedback);
417 void setBlinkPin(uint8_t aFeedbackLEDPin) __attribute__ ((deprecated (
"Please use setLEDFeedback().")));
424 #if !defined(TOLERANCE_FOR_DECODERS_MARK_OR_SPACE_MATCHING_PERCENT)
425 #define TOLERANCE_FOR_DECODERS_MARK_OR_SPACE_MATCHING_PERCENT 25 // Relative tolerance (in percent) for matchTicks(), matchMark() and matchSpace() functions used for protocol decoding.
428 #define TICKS(us) ((us)/MICROS_PER_TICK) // (us)/50
429 #if MICROS_PER_TICK == 50 && TOLERANCE_FOR_DECODERS_MARK_OR_SPACE_MATCHING_PERCENT == 25 // Defaults
430 #define TICKS_LOW(us) ((us)/67 ) // 67 = MICROS_PER_TICK / ((100-25)/100) = (MICROS_PER_TICK * 100) / (100-25)
431 #define TICKS_HIGH(us) (((us)/40) + 1) // 40 = MICROS_PER_TICK / ((100+25)/100) = (MICROS_PER_TICK * 100) / (100+25)
435 #define LTOL (100 - TOLERANCE_FOR_DECODERS_MARK_OR_SPACE_MATCHING_PERCENT)
438 #define UTOL (100 + TOLERANCE_FOR_DECODERS_MARK_OR_SPACE_MATCHING_PERCENT)
439 #define TICKS_LOW(us) ((uint16_t ) ((long) (us) * LTOL / (MICROS_PER_TICK * 100) ))
440 #define TICKS_HIGH(us) ((uint16_t ) ((long) (us) * UTOL / (MICROS_PER_TICK * 100) + 1))
461 #define SEND_REPEAT_COMMAND true
473 #if defined(IR_SEND_PIN)
476 void begin(
bool aEnableLEDFeedback, uint_fast8_t aFeedbackLEDPin);
478 void begin(uint8_t aSendPin)
479 # if !defined (DOXYGEN)
480 __attribute__ ((deprecated (
"ERROR: IR_SEND_PIN is still defined, therefore the function begin(aSendPin) is NOT available. You must disable '#define IR_SEND_PIN' to enable this function.")));
484 void begin(uint_fast8_t aSendPin,
bool aEnableLEDFeedback)
485 # if !defined (DOXYGEN)
486 __attribute__ ((deprecated (
"You must use begin() and enableLEDFeedback() or disableLEDFeedback() since version 4.3.")));
489 IRsend(uint_fast8_t aSendPin);
490 void begin(uint_fast8_t aSendPin);
493 void begin(uint_fast8_t aSendPin,
bool aEnableLEDFeedback, uint_fast8_t aFeedbackLEDPin);
500 #if defined(SEND_PWM_BY_TIMER)
501 void enableHighFrequencyIROut(uint_fast16_t aFrequencyKHz);
508 uint16_t aOneMarkMicros, uint16_t aOneSpaceMicros, uint16_t aZeroMarkMicros, uint16_t aZeroSpaceMicros,
509 IRRawDataType *aDecodedRawDataArray, uint16_t aNumberOfBits, uint8_t aFlags, uint16_t aRepeatPeriodMillis,
512 uint16_t aOneMarkMicros, uint16_t aOneSpaceMicros, uint16_t aZeroMarkMicros, uint16_t aZeroSpaceMicros,
513 IRRawDataType const *aDecodedRawDataPGMArray, uint16_t aNumberOfBits, uint8_t aFlags, uint16_t aRepeatPeriodMillis,
525 IRRawDataType *aDecodedRawDataArray, uint16_t aNumberOfBits, uint8_t aFlags, uint16_t aRepeatPeriodMillis,
529 uint16_t aNumberOfBits, uint8_t aFlags, uint16_t aRepeatPeriodMillis, int_fast8_t
aNumberOfRepeats);
536 uint_fast8_t aNumberOfBits);
538 uint_fast8_t aNumberOfBits);
539 void sendPulseDistanceWidth(uint_fast8_t aFrequencyKHz, uint16_t aHeaderMarkMicros, uint16_t aHeaderSpaceMicros,
540 uint16_t aOneMarkMicros, uint16_t aOneSpaceMicros, uint16_t aZeroMarkMicros, uint16_t aZeroSpaceMicros,
541 IRRawDataType aData, uint_fast8_t aNumberOfBits, uint8_t aFlags, uint16_t aRepeatPeriodMillis,
542 int_fast8_t
aNumberOfRepeats,
void (*aSpecialSendRepeatFunction)() =
nullptr);
544 uint16_t aOneMarkMicros, uint16_t aOneSpaceMicros, uint16_t aZeroMarkMicros, uint16_t aZeroSpaceMicros,
545 IRRawDataType aData, uint_fast8_t aNumberOfBits,
bool aMSBFirst,
bool aSendStopBit, uint16_t aRepeatPeriodMillis,
546 int_fast8_t
aNumberOfRepeats,
void (*aSpecialSendRepeatFunction)() =
nullptr)
547 __attribute__ ((deprecated ("Since version 4.1.0 parameter aSendStopBit is not longer required.")));
549 uint16_t aZeroSpaceMicros,
IRRawDataType aData, uint_fast8_t aNumberOfBits, uint8_t aFlags);
550 void sendBiphaseData(uint16_t aBiphaseTimeUnit, uint32_t aData, uint_fast8_t aNumberOfBits);
552 void mark(uint16_t aMarkMicros);
553 static
void space(uint16_t aSpaceMicros);
557 void sendRaw(const uint8_t aBufferWithTicks[], uint_fast16_t aLengthOfBuffer, uint_fast8_t aIRFrequencyKilohertz);
558 void sendRaw_P(const uint8_t aBufferWithTicks[], uint_fast16_t aLengthOfBuffer, uint_fast8_t aIRFrequencyKilohertz);
561 void sendRaw(const uint16_t aBufferWithMicroseconds[], uint_fast16_t aLengthOfBuffer, uint_fast8_t aIRFrequencyKilohertz);
562 void sendRaw_P(const uint16_t aBufferWithMicroseconds[], uint_fast16_t aLengthOfBuffer, uint_fast8_t aIRFrequencyKilohertz);
568 int8_t aNumberOfHeaderBits = 8);
570 int8_t aNumberOfHeaderBits = 8);
571 void sendBangOlufsenRaw(uint32_t aRawData, int_fast8_t aBits,
bool aBackToBack = false);
573 bool aUseDatalinkTiming = false);
577 #if !defined (DOXYGEN)
578 __attribute__ ((deprecated (
"Please use sendDenon(aAddress, aCommand, aNumberOfRepeats).")));
608 bool aEnableAutomaticToggle =
true);
619 void sendLegoPowerFunctions(uint8_t aChannel, uint8_t tCommand, uint8_t aMode,
bool aDoSend5Times =
true);
649 void sendJVCMSB(
unsigned long data,
int nbits,
bool repeat =
false);
651 void sendLG(
unsigned long data,
660 void sendNECMSB(uint32_t data, uint8_t nbits,
bool repeat =
false);
661 void sendRC5(uint32_t data, uint8_t nbits);
662 void sendRC5ext(uint8_t addr, uint8_t cmd,
bool toggle);
663 void sendRC6Raw(uint32_t data, uint8_t nbits);
664 void sendRC6(uint32_t data, uint8_t nbits)
__attribute__ ((deprecated (
"Please use sendRC6Raw().")));
665 void sendRC6Raw(uint64_t data, uint8_t nbits);
666 void sendRC6(uint64_t data, uint8_t nbits)
__attribute__ ((deprecated (
"Please use sendRC6Raw().")));
669 void sendSharp(uint16_t address, uint16_t command);
671 __attribute__ ((deprecated (
"This old function sends MSB first! Please use sendSamsung().")));
676 __attribute__ ((deprecated (
"This old function sends MSB first! Please use sendSony(aAddress, aCommand, aNumberOfRepeats).")));
678 void sendWhynter(uint32_t aData, uint8_t aNumberOfBitsToSend);
680 #if !defined(IR_SEND_PIN)
699 #endif // _IR_REMOTE_INT_H
bool decodeHash()
Decodes an arbitrary IR code to a 32-bit value.
void sendShuzu(uint16_t aAddress, uint8_t aCommand, int_fast8_t aNumberOfRepeats)
void sendLGRaw(uint32_t aRawData, int_fast8_t aNumberOfRepeats=NO_REPEATS)
Here you can put your raw data, even one with "wrong" checksum.
Results returned from old decoders !!!deprecated!!!
void sendApple(uint8_t aAddress, uint8_t aCommand, int_fast8_t aNumberOfRepeats)
Apple: Send NEC with fixed 16 bit Apple address 0x87EE.
void sendMagiQuest(uint32_t aWandId, uint16_t aMagnitude)
void sendSamsungMSB(unsigned long data, int nbits)
void setFeedbackLED(bool aSwitchLedOn)
Flash LED while receiving or sending IR data.
void sendDish(uint16_t aData)
void sendNECRaw(uint32_t aRawData, int_fast8_t aNumberOfRepeats=NO_REPEATS)
Sends NEC protocol.
void stop()
Disables the timer for IR reception.
decode_type_t lastDecodedProtocol
void int_fast8_t aNumberOfRepeats
bool decodeBiPhaseData(uint_fast8_t aNumberOfBits, IRRawlenType aStartOffset, uint_fast8_t aStartClockCount, uint_fast8_t aValueOfSpaceToMarkTransition, uint16_t aBiphaseTimeUnit)
void sendJVC(uint8_t aAddress, uint8_t aCommand, int_fast8_t aNumberOfRepeats)
The JVC protocol repeats by skipping the header mark and space -> this leads to a poor repeat detecti...
void disableIRIn()
Alias for stop().
void sendKaseikyo_Sharp(uint16_t aAddress, uint8_t aData, int_fast8_t aNumberOfRepeats)
Stub using Kaseikyo with SHARP_VENDOR_ID_CODE.
void setBlinkPin(uint8_t aFeedbackLEDPin) __attribute__((deprecated("Please use setLEDFeedback().")))
Old deprecated function name for setLEDFeedback()
unsigned int IRRawlenType
bool checkHeader_P(PulseDistanceWidthProtocolConstants const *aProtocolConstantsPGM)
void enableIRIn()
Alias for start().
void sendBangOlufsenRaw(uint32_t aRawData, int_fast8_t aBits, bool aBackToBack=false)
void setSendPin(uint_fast8_t aSendPin)
bool checkForRecordGapsMicros(Print *aSerial)
Checks if protocol is not detected and detected space between two transmissions is smaller than known...
void sendBoseWave(uint8_t aCommand, int_fast8_t aNumberOfRepeats=NO_REPEATS)
void sendSony(uint16_t aAddress, uint8_t aCommand, int_fast8_t aNumberOfRepeats, uint8_t numberOfBits=12)
void disableLEDFeedbackForSend()
size_t compensateAndStorePronto(String *aString, uint16_t frequency=38000U)
void registerReceiveCompleteCallback(void(*aReceiveCompleteCallbackFunction)(void))
Sets the function to call if a complete protocol frame has arrived.
void sendSharp2(uint8_t aAddress, uint8_t aCommand, int_fast8_t aNumberOfRepeats)
Main class for receiving IR signals.
#define NO_REPEATS
Just for better readability of code.
void sendPulseDistanceWidth_P(PulseDistanceWidthProtocolConstants const *aProtocolConstantsPGM, IRRawDataType aData, uint_fast8_t aNumberOfBits, int_fast8_t aNumberOfRepeats)
void sendRC6Raw(uint32_t data, uint8_t nbits)
void mark(uint16_t aMarkMicros)
Sends an IR mark for the specified number of microseconds.
bool decodeDistanceWidth()
void sendSamsungLGRepeat()
Send repeat Repeat commands should be sent in a 110 ms raster.
constexpr auto disableLEDFeedbackForReceive
void sendSamsung48(uint16_t aAddress, uint32_t aCommand, int_fast8_t aNumberOfRepeats)
Here we send Samsung48 We send 2 x (8 bit command and then ~command)
void sendRC6(uint8_t aAddress, uint8_t aCommand, int_fast8_t aNumberOfRepeats, bool aEnableAutomaticToggle=true)
Assemble raw data for RC6 from parameters and toggle state and send We do not wait for the minimal tr...
decode_type_t
An enum consisting of all supported formats.
void sendPulseDistanceWidthFromPGMArray(uint_fast8_t aFrequencyKHz, uint16_t aHeaderMarkMicros, uint16_t aHeaderSpaceMicros, uint16_t aOneMarkMicros, uint16_t aOneSpaceMicros, uint16_t aZeroMarkMicros, uint16_t aZeroSpaceMicros, IRRawDataType const *aDecodedRawDataPGMArray, uint16_t aNumberOfBits, uint8_t aFlags, uint16_t aRepeatPeriodMillis, int_fast8_t aNumberOfRepeats)
void restartAfterSend()
Restarts receiver after send.
static void customDelayMicroseconds(unsigned long aMicroseconds)
Custom delay function that circumvents Arduino's delayMicroseconds 16 bit limit and is (mostly) not e...
void sendPulseDistanceWidth(PulseDistanceWidthProtocolConstants *aProtocolConstants, IRRawDataType aData, uint_fast8_t aNumberOfBits, int_fast8_t aNumberOfRepeats)
Sends PulseDistance frames and repeats.
IRrecv()
Instantiate the IRrecv class.
uint_fast8_t sBiphaseDecodeRawbuffOffset
void blink13(uint8_t aEnableLEDFeedback) __attribute__((deprecated("Please use setLEDFeedback() or enableLEDFeedback() / disableLEDFeedback().")))
Old deprecated function name for setLEDFeedback() or enableLEDFeedback() / disableLEDFeedback()
void printIRResultAsCVariables(Print *aSerial)
Print results as C variables to be used for sendXXX()
unsigned long sMicrosAtLastStopTimer
void sendWhynter(uint32_t aData, uint8_t aNumberOfBitsToSend)
void sendDenonRaw(uint16_t aRawData, int_fast8_t aNumberOfRepeats=NO_REPEATS) void sendFAST(uint8_t aCommand
__attribute__((deprecated("This old function sends MSB first! Please use sendSamsung().")))
decode_type_t decode_type
bool matchTicks(uint16_t aMeasuredTicks, uint16_t aMatchValueMicros)
Match function without compensating for marks exceeded or spaces shortened by demodulator hardware.
void(* ReceiveCompleteCallbackFunction)(void)
The function to call if a protocol message has arrived, i.e. StateForISR changed to IR_REC_STATE_STOP...
void begin(uint_fast8_t aReceivePin, bool aEnableLEDFeedback=false, uint_fast8_t aFeedbackLEDPin=USE_DEFAULT_FEEDBACK_LED_PIN)
Initializes the receive and feedback pin.
void sendRaw_P(const uint8_t aBufferWithTicks[], uint_fast16_t aLengthOfBuffer, uint_fast8_t aIRFrequencyKilohertz)
New function using an 8 byte tick (50 us) timing array in FLASH to save program memory Raw data start...
void checkForRepeatSpaceTicksAndSetFlag(uint16_t aMaximumRepeatSpaceTicks)
bool decodeSonyMSB(decode_results *aResults)
bool decodePulseDistanceWidthDataStrict(uint_fast8_t aNumberOfBits, IRRawlenType aStartOffset, uint16_t aOneMarkMicros, uint16_t aZeroMarkMicros, uint16_t aOneSpaceMicros, uint16_t aZeroSpaceMicros, bool aMSBfirst)
Main class for sending IR signals.
This struct contains the data and control used for receiver static functions and the ISR (interrupt s...
bool matchSpace(uint16_t aMeasuredTicks, uint16_t aMatchValueMicros)
Compensate for spaces shortened by demodulator hardware.
void compensateAndPrintIRResultAsPronto(Print *aSerial, uint16_t frequency=38000U)
Print the result (second argument) as Pronto Hex on the Print supplied as argument.
void sendLG2SpecialRepeat()
Static function for sending special repeat frame.
IRData * read()
Returns pointer to IrReceiver.decodedIRData if IR receiver data is available, else nullptr.
uint_fast8_t getBiphaselevel()
Gets the level of one time interval (aBiphaseTimeUnit) at a time from the raw buffer.
bool decodeLGMSB(decode_results *aResults)
void sendDenon(uint8_t aAddress, uint8_t aCommand, int_fast8_t aNumberOfRepeats, uint8_t aSendSharpFrameMarker=0)
void sendSamsung(uint16_t aAddress, uint16_t aCommand, int_fast8_t aNumberOfRepeats)
Here we send Samsung32 If we get a command < 0x100, we send command and then ~command If we get an ad...
bool MATCH_SPACE(uint16_t measured_ticks, uint16_t desired_us)
bool decodeSAMSUNG(decode_results *aResults)
bool decodeLegoPowerFunctions()
bool OverflowFlag
Raw buffer OverflowFlag occurred.
void sendRaw(const uint8_t aBufferWithTicks[], uint_fast16_t aLengthOfBuffer, uint_fast8_t aIRFrequencyKilohertz)
Sends an 8 byte tick timing array to save program memory.
void sendPulseDistanceWidthData_P(PulseDistanceWidthProtocolConstants const *aProtocolConstantsPGM, IRRawDataType aData, uint_fast8_t aNumberOfBits)
bool decodePanasonicMSB(decode_results *aResults)
IRRawlenType rawlen
counter of entries in rawbuf
Data structure for the user application, available as decodedIRData.
void sendSamsung16BitAddressAndCommand(uint16_t aAddress, uint16_t aCommand, int_fast8_t aNumberOfRepeats)
Maybe no one needs it in the wild...
void sendSamsungLG(uint16_t aAddress, uint16_t aCommand, int_fast8_t aNumberOfRepeats)
void sendRC5ext(uint8_t addr, uint8_t cmd, bool toggle)
void sendSamsungLGSpecialRepeat()
Like above, but implemented as a static function Used for sending special repeat frame.
void disableLEDFeedback()
and not your own IRrecv instance
void sendBangOlufsenDataLink(uint32_t aHeader, uint8_t aData, int_fast8_t aNumberOfRepeats=NO_REPEATS, int8_t aNumberOfHeaderBits=8)
bool MATCH(uint16_t measured, uint16_t desired)
void sendSharp(uint8_t aAddress, uint8_t aCommand, int_fast8_t aNumberOfRepeats)
bool checkHeader(PulseDistanceWidthProtocolConstants *aProtocolConstants)
void sendPulseDistanceWidthFromPGMArray_P(PulseDistanceWidthProtocolConstants const *aProtocolConstantsPGM, IRRawDataType const *aDecodedRawDataPGMArray, uint16_t aNumberOfBits, int_fast8_t aNumberOfRepeats)
bool decodePulseDistanceWidthData(PulseDistanceWidthProtocolConstants *aProtocolConstants, uint_fast8_t aNumberOfBits, IRRawlenType aStartOffset=3)
Decode pulse distance protocols for PulseDistanceWidthProtocolConstants.
void sendKaseikyo(uint16_t aAddress, uint8_t aData, int_fast8_t aNumberOfRepeats, uint16_t aVendorCode)
Address can be interpreted as sub-device << 4 + 4 bit device.
uint_fast8_t compare(uint16_t oldval, uint16_t newval)
Compare two (tick) values for Hash decoder Use a tolerance of 20% to enable e.g.
void begin(uint_fast8_t aSendPin)
Initializes the send pin and enable LED feedback with board specific FEEDBACK_LED_ON() and FEEDBACK_L...
void sendNECMSB(uint32_t data, uint8_t nbits, bool repeat=false)
With Send sendNECMSB() you can send your old 32 bit codes.
void sendKaseikyo_JVC(uint16_t aAddress, uint8_t aData, int_fast8_t aNumberOfRepeats)
Stub using Kaseikyo with JVC_VENDOR_ID_CODE.
static void printActiveIRProtocols(Print *aSerial)
void printActiveIRProtocols(Print *aSerial)
void sendNEC(uint16_t aAddress, uint16_t aCommand, int_fast8_t aNumberOfRepeats)
NEC Send frame and special repeats There is NO delay after the last sent repeat!
void nbits is deprecated and may not work as expected ! Use NumberOfRepeats
uint32_t computeLGRawDataAndChecksum(uint8_t aAddress, uint16_t aCommand)
uint16_t periodOnTimeMicros
void IRReceiveTimerInterruptHandler()
uint8_t getMaximumTicksFromRawData(bool aSearchSpaceInsteadOfMark)
bool printIRResultShort(Print *aSerial, bool aCheckForRecordGapsMicros=true)
Function to print values and flags of IrReceiver.decodedIRData in one line.
void restartTimerWithTicksToAdd(uint16_t aTicksToAddToGapCounter)
Configures the timer and the state machine for IR reception.
bool isIdle()
Returns status of reception.
void sendPanasonic(uint16_t aAddress, uint8_t aData, int_fast8_t aNumberOfRepeats)
Stub using Kaseikyo with PANASONIC_VENDOR_ID_CODE.
void printDistanceWidthTimingInfo(Print *aSerial, DistanceWidthTimingInfoStruct *aDistanceWidthTimingInfo)
int getMarkExcessMicros()
Getter function for MARK_EXCESS_MICROS.
bool matchMark(uint16_t aMeasuredTicks, uint16_t aMatchValueMicros)
Compensate for marks exceeded by demodulator hardware.
void compensateAndPrintIRResultAsCArray(Print *aSerial, bool aOutputMicrosecondsInsteadOfTicks=true)
Dump out the IrReceiver.decodedIRData.rawDataPtr->rawbuf[] to be used as C definition for sendRaw().
bool MATCH_MARK(uint16_t measured_ticks, uint16_t desired_us)
uint16_t getPulseCorrectionNanos()
size_t write(IRData *aIRSendData, int_fast8_t aNumberOfRepeats=NO_REPEATS)
Interprets and sends a IRData structure.
volatile uint_fast16_t TickCounterForISR
Counts 50uS ticks. The value is copied into the rawbuf array on every transition. Counting is indepen...
volatile uint8_t StateForISR
State Machine state.
void setReceivePin(uint_fast8_t aReceivePinNumber)
Sets / changes the receiver pin number.
IRRawbufType rawbuf[RAW_BUFFER_LENGTH]
raw data / tick counts per mark/space. With 8 bit we can only store up to 12.7 ms....
bool decodeDenonOld(decode_results *aResults)
void start()
Start the receiving process.
void compensateAndStoreIRResultInArray(uint8_t *aArrayPtr)
Store the decodedIRData to be used for sendRaw().
void enableLEDFeedbackForSend()
uint32_t computeNECRawDataAndChecksum(uint16_t aAddress, uint16_t aCommand)
Convert 16 bit address and 16 bit command to 32 bit NECRaw data If we get a command < 0x100,...
void printIRResultMinimal(Print *aSerial)
Function to print protocol number, address, command, raw data and repeat flag of IrReceiver....
void initDecodedIRData()
Is internally called by decode before calling decoders.
void sendPronto(const __FlashStringHelper *str, int_fast8_t aNumberOfRepeats=NO_REPEATS)
void sendPulseDistanceWidthFromArray_P(PulseDistanceWidthProtocolConstants const *aProtocolConstantsPGM, IRRawDataType *aDecodedRawDataArray, uint16_t aNumberOfBits, int_fast8_t aNumberOfRepeats)
uint16_t lastDecodedCommand
uint8_t getMaximumMarkTicksFromRawData()
Common declarations for receiving and sending.
void sendSamsung16BitAddressAnd8BitCommand(uint16_t aAddress, uint8_t aCommand, int_fast8_t aNumberOfRepeats)
Maybe no one needs it in the wild...
void sendJVCMSB(unsigned long data, int nbits, bool repeat=false)
With Send sendJVCMSB() you can send your old 32 bit codes.
bool decodePulseDistanceWidthData_P(PulseDistanceWidthProtocolConstants const *aProtocolConstantsPGM, uint_fast8_t aNumberOfBits, IRRawlenType aStartOffset=3)
bool decodeRC5()
Try to decode data as RC5 protocol.
void sendSonyMSB(unsigned long data, int nbits)
Old version with MSB first data.
bool available()
Returns true if IR receiver data is available.
uint16_t periodTimeMicros
static void space(uint16_t aSpaceMicros)
Sends an IR space for the specified number of microseconds.
uint8_t getMaximumSpaceTicksFromRawData()
void printIRDuration(Print *aSerial, bool aOutputMicrosecondsInsteadOfTicks)
void sendRC5(uint8_t aAddress, uint8_t aCommand, int_fast8_t aNumberOfRepeats, bool aEnableAutomaticToggle=true)
constexpr auto enableLEDFeedbackForReceive
void initBiphaselevel(uint_fast8_t aRCDecodeRawbuffOffset, uint16_t aBiphaseTimeUnit)
void sendNEC2(uint16_t aAddress, uint16_t aCommand, int_fast8_t aNumberOfRepeats)
NEC2 Send frame !!! and repeat the frame for each requested repeat !!! There is NO delay after the la...
void end()
Alias for stop().
void sendKaseikyo_Mitsubishi(uint16_t aAddress, uint8_t aData, int_fast8_t aNumberOfRepeats)
Stub using Kaseikyo with MITSUBISHI_VENDOR_ID_CODE.
bool decodeNECMSB(decode_results *aResults)
void sendBangOlufsenRawDataLink(uint64_t aRawData, int_fast8_t aBits, bool aBackToBack=false, bool aUseDatalinkTiming=false)
bool decodeNEC()
Decodes also Onkyo and Apple.
void sendPulseDistanceWidth(uint_fast8_t aFrequencyKHz, uint16_t aHeaderMarkMicros, uint16_t aHeaderSpaceMicros, uint16_t aOneMarkMicros, uint16_t aOneSpaceMicros, uint16_t aZeroMarkMicros, uint16_t aZeroSpaceMicros, IRRawDataType aData, uint_fast8_t aNumberOfBits, bool aMSBFirst, bool aSendStopBit, uint16_t aRepeatPeriodMillis, int_fast8_t aNumberOfRepeats, void(*aSpecialSendRepeatFunction)()=nullptr) __attribute__((deprecated("Since version 4.1.0 parameter aSendStopBit is not longer required.")))
bool decodeHashOld(decode_results *aResults)
void sendNECRepeat()
Send special NEC repeat frame Repeat commands should be sent in a 110 ms raster.
void printIRSendUsage(Print *aSerial)
Function to print values and flags of IrReceiver.decodedIRData in one line.
void sendSAMSUNG(unsigned long data, int nbits)
void IRLedOff()
Just switch the IR sending LED off to send an IR space A space is "no output", so the PWM output is d...
void sendPulseDistanceWidthFromArray(uint_fast8_t aFrequencyKHz, uint16_t aHeaderMarkMicros, uint16_t aHeaderSpaceMicros, uint16_t aOneMarkMicros, uint16_t aOneSpaceMicros, uint16_t aZeroMarkMicros, uint16_t aZeroSpaceMicros, IRRawDataType *aDecodedRawDataArray, uint16_t aNumberOfBits, uint8_t aFlags, uint16_t aRepeatPeriodMillis, int_fast8_t aNumberOfRepeats)
void sendFAST(uint8_t aSendPin, uint16_t aCommand, uint_fast8_t aNumberOfRepeats=0)
void sendPulseDistanceWidthData(PulseDistanceWidthProtocolConstants *aProtocolConstants, IRRawDataType aData, uint_fast8_t aNumberOfBits)
Sends PulseDistance from data contained in parameter using ProtocolConstants structure for timing etc...
bool decode()
The main decode function, attempts to decode the recently receive IR signal.
void sendSharpRaw(unsigned long data, int nbits)
void sendRC6A(uint8_t aAddress, uint8_t aCommand, int_fast8_t aNumberOfRepeats, uint16_t aCustomer, bool aEnableAutomaticToggle=true)
Assemble raw data for RC6 from parameters and toggle state and send We do not wait for the minimal tr...
#define RAW_BUFFER_LENGTH
The RAW_BUFFER_LENGTH determines the length of the byte buffer where the received IR timing data is s...
void sendOnkyo(uint16_t aAddress, uint16_t aCommand, int_fast8_t aNumberOfRepeats)
There is NO delay after the last sent repeat!
void nbits is deprecated and may not work as expected ! Use Command
uint32_t getTotalDurationOfRawData()
void sendLegoPowerFunctions(uint8_t aChannel, uint8_t tCommand, uint8_t aMode, bool aDoSend5Times=true)
#define USE_DEFAULT_FEEDBACK_LED_PIN
bool decodeRC6()
Try to decode data as RC6 protocol.
void sendBiphaseData(uint16_t aBiphaseTimeUnit, uint32_t aData, uint_fast8_t aNumberOfBits)
Sends Biphase data MSB first Always send start bit, do not send the trailing space of the start bit 0...
const char * getProtocolString()
void sendLG(uint8_t aAddress, uint16_t aCommand, int_fast8_t aNumberOfRepeats)
LG uses the NEC repeat.
void sendBangOlufsen(uint16_t aHeader, uint8_t aData, int_fast8_t aNumberOfRepeats=NO_REPEATS, int8_t aNumberOfHeaderBits=8)
void resume()
Restart the ISR (Interrupt Service Routine) state machine, to enable receiving of the next IR frame.
bool decode_old(decode_results *aResults)
uint16_t lastDecodedAddress
IRrecv IrReceiver
The receiver instance.
void enableIROut(uint_fast8_t aFrequencyKHz)
Enables IR output.
void sendKaseikyo_Denon(uint16_t aAddress, uint8_t aData, int_fast8_t aNumberOfRepeats)
Stub using Kaseikyo with DENON_VENDOR_ID_CODE.
void printIRResultRawFormatted(Print *aSerial, bool aOutputMicrosecondsInsteadOfTicks=true)
Dump out the timings in IrReceiver.decodedIRData.rawDataPtr->rawbuf[] array 8 values per line.
void sendLG2(uint8_t aAddress, uint16_t aCommand, int_fast8_t aNumberOfRepeats)
LG2 uses a special repeat.
bool decodeJVCMSB(decode_results *aResults)
void sendNECSpecialRepeat()
Static function variant of IRsend::sendNECRepeat For use in ProtocolConstants.
void setLEDFeedback(uint8_t aFeedbackLEDPin, uint8_t aEnableLEDFeedback)
Enables blinking of feedback LED (LED_BUILTIN is taken as default) on IR sending and receiving Cannot...
uint_fast8_t IRReceivePin
Pin connected to IR data from detector.
uint16_t initialGapTicks
Tick counts of the length of the gap between previous and current IR frame. Pre 4....