33 #ifndef _IR_RECEIVE_HPP
34 #define _IR_RECEIVE_HPP
36 #if defined(DEBUG) && !defined(LOCAL_DEBUG)
42 #if defined(TRACE) && !defined(LOCAL_TRACE)
78 #if !defined(NO_LED_FEEDBACK_CODE)
86 #if !defined(NO_LED_FEEDBACK_CODE)
99 #if !defined(NO_LED_FEEDBACK_CODE)
102 (void) aFeedbackLEDPin;
124 #if defined(ESP8266) || defined(ESP32)
128 #if defined(_IR_MEASURE_TIMING) && defined(_IR_TIMING_TEST_PIN)
133 #if defined(TIMER_REQUIRES_RESET_INTR_PENDING)
139 uint8_t tIRInputLevel = *
irparams.IRReceivePinPortInputRegister &
irparams.IRReceivePinMask;
164 #if defined(_IR_MEASURE_TIMING) && defined(_IR_TIMING_TEST_PIN)
184 #if defined(_IR_MEASURE_TIMING) && defined(_IR_TIMING_TEST_PIN)
201 #if !IR_REMOTE_DISABLE_RECEIVE_COMPLETE_CALLBACK
210 #if defined(_IR_MEASURE_TIMING) && defined(_IR_TIMING_TEST_PIN)
227 #if !IR_REMOTE_DISABLE_RECEIVE_COMPLETE_CALLBACK
241 #if defined(_IR_MEASURE_TIMING) && defined(_IR_TIMING_TEST_PIN)
250 #if !defined(NO_LED_FEEDBACK_CODE)
256 #ifdef _IR_MEASURE_TIMING
265 #if defined(TIMER_INTR_NAME) || defined(ISR)
266 # if defined(TIMER_INTR_NAME)
267 ISR (TIMER_INTR_NAME)
286 void IRrecv::begin(uint_fast8_t aReceivePin,
bool aEnableLEDFeedback, uint_fast8_t aFeedbackLEDPin) {
289 #if !defined(NO_LED_FEEDBACK_CODE)
291 if (aEnableLEDFeedback) {
296 (void) aEnableLEDFeedback;
297 (void) aFeedbackLEDPin;
300 #if defined(_IR_MEASURE_TIMING) && defined(_IR_TIMING_TEST_PIN)
312 # if defined(__digitalPinToBit)
313 if (__builtin_constant_p(aReceivePinNumber)) {
314 irparams.IRReceivePinMask = 1UL << (__digitalPinToBit(aReceivePinNumber));
316 irparams.IRReceivePinMask = digitalPinToBitMask(aReceivePinNumber);
319 irparams.IRReceivePinMask = digitalPinToBitMask(aReceivePinNumber);
321 # if defined(__digitalPinToPINReg)
325 if (__builtin_constant_p(aReceivePinNumber)) {
326 irparams.IRReceivePinPortInputRegister = __digitalPinToPINReg(aReceivePinNumber);
328 irparams.IRReceivePinPortInputRegister = portInputRegister(digitalPinToPort(aReceivePinNumber));
331 irparams.IRReceivePinPortInputRegister = portInputRegister(digitalPinToPort(aReceivePinNumber));
360 #ifdef _IR_MEASURE_TIMING
373 #ifdef _IR_MEASURE_TIMING
417 #if defined(SEND_PWM_BY_TIMER) && !defined(SEND_PWM_DOES_NOT_USE_RECEIVE_TIMER)
472 #if defined(LOCAL_DEBUG)
473 Serial.print(F(
"Overflow happened, try to increase the \"RAW_BUFFER_LENGTH\" value of "));
475 Serial.println(F(
" with #define RAW_BUFFER_LENGTH=<biggerValue>"));
540 #if defined(DECODE_NEC) || defined(DECODE_ONKYO)
547 #if defined(DECODE_PANASONIC) || defined(DECODE_KASEIKYO)
554 #if defined(DECODE_DENON)
561 #if defined(DECODE_SONY)
568 #if defined(DECODE_RC5)
575 #if defined(DECODE_RC6)
582 #if defined(DECODE_LG)
589 #if defined(DECODE_JVC)
596 #if defined(DECODE_SAMSUNG)
606 #if defined(DECODE_BEO)
613 #if defined(DECODE_FAST)
620 #if defined(DECODE_WHYNTER)
627 #if defined(DECODE_LEGO_PF)
634 #if defined(DECODE_BOSEWAVE)
641 #if defined(DECODE_MAGIQUEST)
651 #if defined(DECODE_DISTANCE_WIDTH)
661 #if defined(DECODE_HASH)
704 uint16_t aZeroMarkMicros, uint16_t aOneSpaceMicros, uint16_t aZeroSpaceMicros,
bool aMSBfirst) {
708 bool isPulseDistanceProtocol = (aOneMarkMicros == aZeroMarkMicros);
713 for (uint_fast8_t i = aNumberOfBits; i > 0; i--) {
715 unsigned int tMarkTicks;
716 unsigned int tSpaceTicks;
719 if (isPulseDistanceProtocol) {
723 #if defined DECODE_STRICT_CHECKS
724 tMarkTicks = *tRawBufPointer++;
726 (void) aZeroSpaceMicros;
729 tSpaceTicks = *tRawBufPointer++;
730 tBitValue =
matchSpace(tSpaceTicks, aOneSpaceMicros);
732 #if defined DECODE_STRICT_CHECKS
734 if (!
matchMark(tMarkTicks, aOneMarkMicros)) {
735 # if defined(LOCAL_DEBUG)
736 Serial.print(F(
"Mark="));
738 Serial.print(F(
" is not "));
739 Serial.print(aOneMarkMicros);
740 Serial.print(F(
". Index="));
741 Serial.print(aNumberOfBits - i);
752 tMarkTicks = *tRawBufPointer++;
753 tBitValue =
matchMark(tMarkTicks, aOneMarkMicros);
755 #if defined DECODE_STRICT_CHECKS
756 tSpaceTicks = *tRawBufPointer++;
758 (void) aZeroMarkMicros;
759 (void) aZeroSpaceMicros;
773 tDecodedData |= tMask;
777 #if defined DECODE_STRICT_CHECKS
781 if (isPulseDistanceProtocol) {
782 if (!
matchSpace(tSpaceTicks, aZeroSpaceMicros)) {
783 # if defined(LOCAL_DEBUG)
784 Serial.print(F(
"Space="));
786 Serial.print(F(
" is not "));
787 Serial.print(aOneSpaceMicros);
788 Serial.print(F(
" or "));
789 Serial.print(aZeroSpaceMicros);
790 Serial.print(F(
". Index="));
791 Serial.print(aNumberOfBits - i);
797 if (!
matchMark(tMarkTicks, aZeroMarkMicros)) {
798 # if defined(LOCAL_DEBUG)
799 Serial.print(F(
"Mark="));
801 Serial.print(F(
" is not "));
802 Serial.print(aOneMarkMicros);
803 Serial.print(F(
" or "));
804 Serial.print(aZeroMarkMicros);
805 Serial.print(F(
". Index="));
806 Serial.print(aNumberOfBits - i);
816 #if defined DECODE_STRICT_CHECKS
818 if (aZeroSpaceMicros == aOneSpaceMicros
821 if (!
matchSpace(tSpaceTicks, aOneSpaceMicros)) {
822 # if defined(LOCAL_DEBUG)
823 Serial.print(F(
"Space="));
825 Serial.print(F(
" is not "));
826 Serial.print(aOneSpaceMicros);
827 Serial.print(F(
". Index="));
828 Serial.print(aNumberOfBits - i);
846 uint_fast8_t aStartOffset) {
884 uint_fast8_t tLevelOfCurrentInterval;
922 return tLevelOfCurrentInterval;
928 #define FNV_PRIME_32 16777619
929 #define FNV_BASIS_32 2166136261
937 if (newval * 10 < oldval * 8) {
940 if (oldval * 10 < newval * 8) {
970 #if RAW_BUFFER_LENGTH <= 254 // saves around 75 bytes program memory and speeds up ISR
993 if (aResults->
rawlen < 6) {
997 for (uint8_t i = 3; i < aResults->
rawlen; i++) {
1003 aResults->
value = hash;
1004 aResults->
bits = 32;
1021 #if defined(LOCAL_TRACE)
1023 Serial.println(F(
": Header mark length is wrong"));
1028 #if defined(LOCAL_TRACE)
1030 Serial.println(F(
": Header space length is wrong"));
1044 #
if defined(ENABLE_FULL_REPEAT_CHECK)
1056 bool matchTicks(uint16_t aMeasuredTicks, uint16_t aMatchValueMicros) {
1057 #if defined(LOCAL_TRACE)
1058 Serial.print(F(
"Testing: "));
1059 Serial.print(
TICKS_LOW(aMatchValueMicros), DEC);
1060 Serial.print(F(
" <= "));
1061 Serial.print(aMeasuredTicks, DEC);
1062 Serial.print(F(
" <= "));
1063 Serial.print(
TICKS_HIGH(aMatchValueMicros), DEC);
1065 bool passed = ((aMeasuredTicks >=
TICKS_LOW(aMatchValueMicros)) && (aMeasuredTicks <=
TICKS_HIGH(aMatchValueMicros)));
1066 #if defined(LOCAL_TRACE)
1068 Serial.println(F(
" => passed"));
1070 Serial.println(F(
" => FAILED"));
1076 bool MATCH(uint16_t measured_ticks, uint16_t desired_us) {
1077 return matchTicks(measured_ticks, desired_us);
1083 bool matchMark(uint16_t aMeasuredTicks, uint16_t aMatchValueMicros) {
1084 #if defined(LOCAL_TRACE)
1085 Serial.print(F(
"Testing mark (actual vs desired): "));
1087 Serial.print(F(
"us vs "));
1088 Serial.print(aMatchValueMicros, DEC);
1089 Serial.print(F(
"us: "));
1091 Serial.print(F(
" <= "));
1093 Serial.print(F(
" <= "));
1099 #if defined(LOCAL_TRACE)
1101 Serial.println(F(
" => passed"));
1103 Serial.println(F(
" => FAILED"));
1110 return matchMark(measured_ticks, desired_us);
1116 bool matchSpace(uint16_t aMeasuredTicks, uint16_t aMatchValueMicros) {
1117 #if defined(LOCAL_TRACE)
1118 Serial.print(F(
"Testing space (actual vs desired): "));
1120 Serial.print(F(
"us vs "));
1121 Serial.print(aMatchValueMicros, DEC);
1122 Serial.print(F(
"us: "));
1124 Serial.print(F(
" <= "));
1126 Serial.print(F(
" <= "));
1132 #if defined(LOCAL_TRACE)
1134 Serial.println(F(
" => passed"));
1136 Serial.println(F(
" => FAILED"));
1143 return matchSpace(measured_ticks, desired_us);
1166 aSerial->print(F(
"Space of "));
1168 aSerial->print(F(
" us between two detected transmission is smaller than the minimal gap of "));
1170 aSerial->println(F(
" us known for implemented protocols like NEC, Sony, RC% etc.."));
1171 aSerial->println(F(
"But it can be OK for some yet unsupported protocols, and especially for repeats."));
1172 aSerial->println(F(
"If you get unexpected results, try to increase the RECORD_GAP_MICROS in IRremote.h."));
1188 #if defined(DECODE_ONKYO)
1189 aSerial->print(F(
"Onkyo, "));
1190 #elif defined(DECODE_NEC)
1191 aSerial->print(F(
"NEC/NEC2/Onkyo/Apple, "));
1193 #if defined(DECODE_PANASONIC) || defined(DECODE_KASEIKYO)
1194 aSerial->print(F(
"Panasonic/Kaseikyo, "));
1196 #if defined(DECODE_DENON)
1197 aSerial->print(F(
"Denon/Sharp, "));
1199 #if defined(DECODE_SONY)
1200 aSerial->print(F(
"Sony, "));
1202 #if defined(DECODE_RC5)
1203 aSerial->print(F(
"RC5, "));
1205 #if defined(DECODE_RC6)
1206 aSerial->print(F(
"RC6, "));
1208 #if defined(DECODE_LG)
1209 aSerial->print(F(
"LG, "));
1211 #if defined(DECODE_JVC)
1212 aSerial->print(F(
"JVC, "));
1214 #if defined(DECODE_SAMSUNG)
1215 aSerial->print(F(
"Samsung, "));
1220 #if defined(DECODE_BEO)
1221 aSerial->print(F(
"Bang & Olufsen, "));
1223 #if defined(DECODE_FAST)
1224 aSerial->print(F(
"FAST, "));
1226 #if defined(DECODE_WHYNTER)
1227 aSerial->print(F(
"Whynter, "));
1229 #if defined(DECODE_LEGO_PF)
1230 aSerial->print(F(
"Lego Power Functions, "));
1232 #if defined(DECODE_BOSEWAVE)
1233 aSerial->print(F(
"Bosewave , "));
1235 #if defined(DECODE_MAGIQUEST)
1236 aSerial->print(F(
"MagiQuest, "));
1238 #if defined(DECODE_DISTANCE_WIDTH)
1239 aSerial->print(F(
"Universal Pulse Distance Width, "));
1241 #if defined(DECODE_HASH)
1242 aSerial->print(F(
"Hash "));
1244 #if defined(NO_DECODER) // for sending raw only
1270 aSerial->print(F(
", "));
1272 aSerial->print(F(
", "));
1274 aSerial->print(F(
", "));
1276 aSerial->print(F(
", "));
1278 aSerial->print(F(
", "));
1283 uint16_t tSumOfDurationTicks = 0;
1302 Serial.print(F(
"!Use the "));
1304 Serial.println(F(
" protocol for sending!"));
1308 #if defined(DECODE_DISTANCE_WIDTH)
1309 uint_fast8_t tNumberOfArrayData = 0;
1311 # if __INT_WIDTH__ < 32
1312 aSerial->print(F(
"Send on a 8 bit platform with: "));
1314 if(tNumberOfArrayData > 1) {
1316 aSerial->print(F(
" uint32_t tRawData[]={0x"));
1318 aSerial->print(F(
"Send on a 32 bit platform with: "));
1320 if(tNumberOfArrayData > 1) {
1322 aSerial->print(F(
" uint64_t tRawData[]={0x"));
1324 for (uint_fast8_t i = 0; i < tNumberOfArrayData; ++i) {
1325 # if (__INT_WIDTH__ < 32)
1328 PrintULL::print(aSerial,
decodedIRData.decodedRawDataArray[i], HEX);
1330 if (i != tNumberOfArrayData - 1) {
1331 aSerial->print(F(
", 0x"));
1334 aSerial->println(F(
"};"));
1335 aSerial->print(F(
" "));
1338 aSerial->print(F(
"Send with: "));
1340 aSerial->print(F(
"IrSender.send"));
1343 aSerial->print(F(
"Send with: IrSender.send"));
1346 #if defined(DECODE_DISTANCE_WIDTH)
1350 aSerial->print(F(
"(0x"));
1351 #if defined(DECODE_MAGIQUEST)
1353 # if (__INT_WIDTH__ < 32)
1368 aSerial->print(F(
", 0x"));
1371 aSerial->print(F(
", 2, "));
1374 aSerial->print(F(
", <numberOfRepeats>"));
1377 #if defined(DECODE_DISTANCE_WIDTH)
1382 aSerial->print(
"PulseDistanceWidth");
1383 if(tNumberOfArrayData > 1) {
1384 aSerial->print(
"FromArray(38, ");
1386 aSerial->print(
"(38, ");
1390 if(tNumberOfArrayData > 1) {
1391 aSerial->print(F(
", &tRawData[0], "));
1393 aSerial->print(F(
", 0x"));
1394 # if (__INT_WIDTH__ < 32)
1399 aSerial->print(F(
", "));
1402 aSerial->print(F(
", PROTOCOL_IS_"));
1405 aSerial->print(
'M');
1407 aSerial->print(
'L');
1409 aSerial->print(F(
"SB_FIRST, <RepeatPeriodMillis>, <numberOfRepeats>"));
1412 #if defined(DECODE_PANASONIC) || defined(DECODE_KASEIKYO)
1414 aSerial->print(F(
", 0x"));
1418 aSerial->print(F(
");"));
1431 aSerial->print(F(
"P="));
1434 #if defined(DECODE_HASH)
1435 aSerial->print(F(
" #=0x"));
1436 # if (__INT_WIDTH__ < 32)
1442 aSerial->print(
' ');
1444 aSerial->println(F(
" bits received"));
1449 aSerial->print(F(
" A=0x"));
1452 aSerial->print(F(
" C=0x"));
1455 aSerial->print(F(
" Raw=0x"));
1456 #if (__INT_WIDTH__ < 32)
1463 aSerial->print(F(
" R"));
1478 aSerial->print(F(
"rawData["));
1479 aSerial->print(tRawlen, DEC);
1480 aSerial->println(F(
"]: "));
1485 aSerial->print(F(
" -"));
1486 if (aOutputMicrosecondsInsteadOfTicks) {
1491 #if RAW_BUFFER_LENGTH <= 254 // saves around 75 bytes program memory and speeds up ISR
1498 uint_fast8_t tCounterForNewline = 6;
1501 #if defined(DECODE_DENON) || defined(DECODE_MAGIQUEST)
1510 tCounterForNewline = 0;
1515 uint16_t tSumOfDurationTicks = 0;
1516 for (i = 1; i < tRawlen; i++) {
1518 if (aOutputMicrosecondsInsteadOfTicks) {
1521 tDuration = tCurrentTicks;
1523 tSumOfDurationTicks += tCurrentTicks;
1526 aSerial->print(
'-');
1528 aSerial->print(F(
" +"));
1532 if (aOutputMicrosecondsInsteadOfTicks && tDuration < 1000) {
1533 aSerial->print(
' ');
1535 if (aOutputMicrosecondsInsteadOfTicks && tDuration < 100) {
1536 aSerial->print(
' ');
1538 if (tDuration < 10) {
1539 aSerial->print(
' ');
1541 aSerial->print(tDuration, DEC);
1543 if ((i & 1) && (i + 1) < tRawlen) {
1544 aSerial->print(
',');
1547 tCounterForNewline++;
1548 if ((tCounterForNewline % 8) == 0) {
1554 aSerial->print(
"Sum: ");
1555 if (aOutputMicrosecondsInsteadOfTicks) {
1556 aSerial->println((uint32_t) tSumOfDurationTicks *
MICROS_PER_TICK, DEC);
1558 aSerial->println(tSumOfDurationTicks, DEC);
1575 if (aOutputMicrosecondsInsteadOfTicks) {
1576 aSerial->print(F(
"uint16_t rawData["));
1578 aSerial->print(F(
"uint8_t rawTicks["));
1582 aSerial->print(F(
"] = {"));
1585 #if RAW_BUFFER_LENGTH <= 254 // saves around 75 bytes program memory and speeds up ISR
1600 if (aOutputMicrosecondsInsteadOfTicks) {
1601 aSerial->print(tDuration);
1607 tTicks = (tTicks > UINT8_MAX) ? UINT8_MAX : tTicks;
1608 aSerial->print(tTicks);
1611 if (!(i & 1)) aSerial->print(
' ');
1615 aSerial->print(F(
"};"));
1618 aSerial->print(F(
" // "));
1622 aSerial->println(
"");
1637 #if RAW_BUFFER_LENGTH <= 254 // saves around 75 bytes program memory and speeds up ISR
1652 *aArrayPtr = (tTicks > UINT8_MAX) ? UINT8_MAX : tTicks;
1668 aSerial->print(F(
"uint16_t"));
1669 aSerial->print(F(
" address = 0x"));
1671 aSerial->println(
';');
1673 aSerial->print(F(
"uint16_t"));
1674 aSerial->print(F(
" command = 0x"));
1676 aSerial->println(
';');
1679 #if __INT_WIDTH__ < 32
1680 aSerial->print(F(
"uint32_t rawData = 0x"));
1682 aSerial->print(F(
"uint64_t rawData = 0x"));
1684 #if (__INT_WIDTH__ < 32)
1689 aSerial->println(
';');
1694 #if defined(__AVR__)
1729 aResults->
value = 0;
1733 #if defined(DECODE_NEC)
1740 #if defined(DECODE_SONY)
1747 #if defined(DECODE_RC5)
1758 #if defined(DECODE_RC6)
1770 #if defined(DECODE_LG)
1775 #if defined(DECODE_JVC)
1782 #if defined(DECODE_SAMSUNG)
1789 #if defined(DECODE_DENON)
1808 #if defined(_IR_MEASURE_TIMING)
1809 #undef _IR_MEASURE_TIMING
1811 #if defined(LOCAL_TRACE)
1814 #if defined(LOCAL_DEBUG)
1817 #endif // _IR_RECEIVE_HPP