Change IRremoteESP8266 library updated to v2.7.4

This commit is contained in:
Hadinger 2020-02-29 13:51:16 +01:00
parent be1b0e7c86
commit 4008b9ed3e
242 changed files with 2623 additions and 941 deletions

View File

@ -9,8 +9,8 @@
This library enables you to **send _and_ receive** infra-red signals on an [ESP8266](https://github.com/esp8266/Arduino) or an This library enables you to **send _and_ receive** infra-red signals on an [ESP8266](https://github.com/esp8266/Arduino) or an
[ESP32](https://github.com/espressif/arduino-esp32) using the [Arduino framework](https://www.arduino.cc/) using common 940nm IR LEDs and common IR receiver modules. e.g. TSOP{17,22,24,36,38,44,48}* demodulators etc. [ESP32](https://github.com/espressif/arduino-esp32) using the [Arduino framework](https://www.arduino.cc/) using common 940nm IR LEDs and common IR receiver modules. e.g. TSOP{17,22,24,36,38,44,48}* demodulators etc.
## v2.7.3 Now Available ## v2.7.4 Now Available
Version 2.7.3 of the library is now [available](https://github.com/crankyoldgit/IRremoteESP8266/releases/latest). You can view the [Release Notes](ReleaseNotes.md) for all the significant changes. Version 2.7.4 of the library is now [available](https://github.com/crankyoldgit/IRremoteESP8266/releases/latest). You can view the [Release Notes](ReleaseNotes.md) for all the significant changes.
#### Upgrading from pre-v2.0 #### Upgrading from pre-v2.0
Usage of the library has been slightly changed in v2.0. You will need to change your usage to work with v2.0 and beyond. You can read more about the changes required on our [Upgrade to v2.0](https://github.com/crankyoldgit/IRremoteESP8266/wiki/Upgrading-to-v2.0) page. Usage of the library has been slightly changed in v2.0. You will need to change your usage to work with v2.0 and beyond. You can read more about the changes required on our [Upgrade to v2.0](https://github.com/crankyoldgit/IRremoteESP8266/wiki/Upgrading-to-v2.0) page.

View File

@ -9,8 +9,8 @@
Cette librairie vous permetra de **recevoir et d'envoyer des signaux** infrarouge sur le protocole [ESP8266](https://github.com/esp8266/Arduino) ou sur le protocole Cette librairie vous permetra de **recevoir et d'envoyer des signaux** infrarouge sur le protocole [ESP8266](https://github.com/esp8266/Arduino) ou sur le protocole
[ESP32](https://github.com/espressif/arduino-esp32) en utilisant le [Arduino framework](https://www.arduino.cc/) qui utilise la norme 940nm IR LEDs et le module basique de reception d'onde IR. Exemple : TSOP{17,22,24,36,38,44,48}* modules etc. [ESP32](https://github.com/espressif/arduino-esp32) en utilisant le [Arduino framework](https://www.arduino.cc/) qui utilise la norme 940nm IR LEDs et le module basique de reception d'onde IR. Exemple : TSOP{17,22,24,36,38,44,48}* modules etc.
## v2.7.3 disponible ## v2.7.4 disponible
Version 2.7.3 de la libraire est maintenant [disponible](https://github.com/crankyoldgit/IRremoteESP8266/releases/latest). Vous pouvez voir le [Release Notes](ReleaseNotes.md) pour tous les changements importants. Version 2.7.4 de la libraire est maintenant [disponible](https://github.com/crankyoldgit/IRremoteESP8266/releases/latest). Vous pouvez voir le [Release Notes](ReleaseNotes.md) pour tous les changements importants.
#### mise à jour depuis pre-v2.0 #### mise à jour depuis pre-v2.0
L'utilisation de la librairie à un peu changer depuis la version in v2.0. Si vous voulez l'utiliser vous devrez changer votre utilisation aussi. Vous pouvez vous renseigner sur les précondition d'utilisation ici : [Upgrade to v2.0](https://github.com/crankyoldgit/IRremoteESP8266/wiki/Upgrading-to-v2.0) page. L'utilisation de la librairie à un peu changer depuis la version in v2.0. Si vous voulez l'utiliser vous devrez changer votre utilisation aussi. Vous pouvez vous renseigner sur les précondition d'utilisation ici : [Upgrade to v2.0](https://github.com/crankyoldgit/IRremoteESP8266/wiki/Upgrading-to-v2.0) page.

View File

@ -1,5 +1,25 @@
# Release Notes # Release Notes
## _v2.7.4 (20200226)_
**[Bug Fixes]**
- IRMQTTServer: Fix bug when receiving an IR A/C message and not re-transmitting it. (#1035, #1038)
- Coolix: `setRaw()` doesn't update power state. (#1040, #1041)
**[Features]**
- Electra: Add improved feature support. (#1033, #1051)
- Add support for Epson protocol. (#1034, #1050)
- Add options to `decode()` to aid detection. Improve NEC detection. (#1042, #1046)
- SamsungAc: Add support for Light & Ion (VirusDoctor). (#1045, #1048, #1049)
- Add Italian (it-IT) locale/language support. (#1047) (kudos @egueli)
- gc_decode: Add repeat support for pronto codes. (#1034, #1043)
**[Misc]**
- Update supported SamsungAc devices (#1045)
- Coolix: Subtle protocol timing adjustments (#1036, #1037)
- Add supported Electra device model info (#1033)
## _v2.7.3 (20200130)_ ## _v2.7.3 (20200130)_
**[Features]** **[Features]**

View File

@ -1,6 +1,6 @@
<!--- WARNING: Do NOT edit this file directly. <!--- WARNING: Do NOT edit this file directly.
It is generated by './tools/scrape_supported_devices.py'. It is generated by './tools/scrape_supported_devices.py'.
Last generated: Thu Jan 30 20:05:33 2020 ---> Last generated: Wed Feb 26 16:31:08 2020 --->
# IR Protocols supported by this library # IR Protocols supported by this library
| Protocol | Brand | Model | A/C Model | Detailed A/C Support | | Protocol | Brand | Model | A/C Model | Detailed A/C Support |
@ -16,6 +16,8 @@
| [Denon](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Denon.cpp) | **Unknown** | | | - | | [Denon](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Denon.cpp) | **Unknown** | | | - |
| [Dish](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Dish.cpp) | **DISH NETWORK** | echostar 301 | | - | | [Dish](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Dish.cpp) | **DISH NETWORK** | echostar 301 | | - |
| [Electra](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Electra.cpp) | **[AUX](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Electra.h)** | KFR-35GW/BpNFW=3 A/C<BR>YKR-T/011 remote | | Yes | | [Electra](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Electra.cpp) | **[AUX](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Electra.h)** | KFR-35GW/BpNFW=3 A/C<BR>YKR-T/011 remote | | Yes |
| [Electra](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Electra.cpp) | **[Electra](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Electra.h)** | Classic INV 17 / AXW12DCS A/C<BR>YKR-M/003E remote | | Yes |
| [Epson](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Epson.cpp) | **Unknown** | | | - |
| [Fujitsu](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Fujitsu.cpp) | **[Fujitsu](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Fujitsu.h)** | AGTV14LAC A/C<BR>AR-DB1 remote<BR>AR-DL10 remote<BR>AR-RAC1E remote<BR>AR-RAE1E remote<BR>AR-RAH2E remote<BR>AR-REB1E remote<BR>AR-RY4 remote<BR>AST9RSGCW A/C<BR>ASTB09LBC A/C<BR>ASU30C1 A/C<BR>ASYG30LFCA A/C<BR>ASYG7LMCA A/C | ARDB1<BR>ARJW2<BR>ARRAH2E<BR>ARREB1E<BR>ARRY4 | Yes | | [Fujitsu](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Fujitsu.cpp) | **[Fujitsu](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Fujitsu.h)** | AGTV14LAC A/C<BR>AR-DB1 remote<BR>AR-DL10 remote<BR>AR-RAC1E remote<BR>AR-RAE1E remote<BR>AR-RAH2E remote<BR>AR-REB1E remote<BR>AR-RY4 remote<BR>AST9RSGCW A/C<BR>ASTB09LBC A/C<BR>ASU30C1 A/C<BR>ASYG30LFCA A/C<BR>ASYG7LMCA A/C | ARDB1<BR>ARJW2<BR>ARRAH2E<BR>ARREB1E<BR>ARRY4 | Yes |
| [Fujitsu](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Fujitsu.cpp) | **[Fujitsu General](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Fujitsu.h)** | AR-JW2 remote | ARDB1<BR>ARJW2<BR>ARRAH2E<BR>ARREB1E<BR>ARRY4 | Yes | | [Fujitsu](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Fujitsu.cpp) | **[Fujitsu General](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Fujitsu.h)** | AR-JW2 remote | ARDB1<BR>ARJW2<BR>ARRAH2E<BR>ARREB1E<BR>ARRY4 | Yes |
| [GICable](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_GICable.cpp) | **Unknown** | | | - | | [GICable](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_GICable.cpp) | **Unknown** | | | - |
@ -54,7 +56,7 @@
| [Pronto](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Pronto.cpp) | **Unknown** | | | - | | [Pronto](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Pronto.cpp) | **Unknown** | | | - |
| [RC5_RC6](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_RC5_RC6.cpp) | **Unknown** | | | - | | [RC5_RC6](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_RC5_RC6.cpp) | **Unknown** | | | - |
| [RCMM](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_RCMM.cpp) | **Microsoft** | XBOX 360 | | - | | [RCMM](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_RCMM.cpp) | **Microsoft** | XBOX 360 | | - |
| [Samsung](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Samsung.cpp) | **[Samsung](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Samsung.h)** | AR12HSSDBWKNEU A/C<BR>AR12KSFPEWQNET A/C<BR>IEC-R03 remote<BR>UA55H6300 TV | | Yes | | [Samsung](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Samsung.cpp) | **[Samsung](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Samsung.h)** | AR09FSSDAWKNFA A/C<BR>AR12HSSDBWKNEU A/C<BR>AR12KSFPEWQNET A/C<BR>DB63-03556X003 remote<BR>IEC-R03 remote<BR>UA55H6300 TV | | Yes |
| [Sanyo](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Sanyo.cpp) | **Unknown** | | | - | | [Sanyo](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Sanyo.cpp) | **Unknown** | | | - |
| [Sharp](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Sharp.cpp) | **[Sharp](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Sharp.h)** | AY-ZP40KR A/C<BR>LC-52D62U TV | | Yes | | [Sharp](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Sharp.cpp) | **[Sharp](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Sharp.h)** | AY-ZP40KR A/C<BR>LC-52D62U TV | | Yes |
| [Sherwood](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Sherwood.cpp) | **Sherwood** | RC-138 remote<BR>RD6505(B) Receiver | | - | | [Sherwood](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Sherwood.cpp) | **Sherwood** | RC-138 remote<BR>RD6505(B) Receiver | | - |
@ -94,6 +96,7 @@
- DENON - DENON
- DISH - DISH
- ELECTRA_AC - ELECTRA_AC
- EPSON
- FUJITSU_AC - FUJITSU_AC
- GICABLE - GICABLE
- GOODWEATHER - GOODWEATHER

View File

@ -239,7 +239,7 @@ const uint16_t kJsonAcStateMaxSize = 1024; // Bytes
// ----------------- End of User Configuration Section ------------------------- // ----------------- End of User Configuration Section -------------------------
// Constants // Constants
#define _MY_VERSION_ "v1.4.5" #define _MY_VERSION_ "v1.4.6"
const uint8_t kRebootTime = 15; // Seconds const uint8_t kRebootTime = 15; // Seconds
const uint8_t kQuickDisplayTime = 2; // Seconds const uint8_t kQuickDisplayTime = 2; // Seconds

View File

@ -2679,7 +2679,7 @@ uint64_t getUInt64fromHex(char const *str) {
// code: Numeric payload of the IR message. Most protocols use this. // code: Numeric payload of the IR message. Most protocols use this.
// code_str: The unparsed code to be sent. Used by complex protocol encodings. // code_str: The unparsed code to be sent. Used by complex protocol encodings.
// bits: Nr. of bits in the protocol. 0 means use the protocol's default. // bits: Nr. of bits in the protocol. 0 means use the protocol's default.
// repeat: Nr. of times the message is to be repeated. (Not all protcols.) // repeat: Nr. of times the message is to be repeated. (Not all protocols.)
// Returns: // Returns:
// bool: Successfully sent or not. // bool: Successfully sent or not.
bool sendIRCode(IRsend *irsend, decode_type_t const ir_type, bool sendIRCode(IRsend *irsend, decode_type_t const ir_type,
@ -3071,6 +3071,10 @@ bool sendClimate(const String topic_prefix, const bool retain,
lastClimateIr.reset(); lastClimateIr.reset();
irClimateCounter++; irClimateCounter++;
} }
// Mark the "next" value as old/previous.
if (ac != NULL) {
ac->markAsSent();
}
return success; return success;
} }
@ -3098,20 +3102,20 @@ bool decodeCommonAc(const decode_results *decode) {
} }
#if IGNORE_DECODED_AC_PROTOCOL #if IGNORE_DECODED_AC_PROTOCOL
if (climate[0]->next.protocol != decode_type_t::UNKNOWN) { if (climate[0]->next.protocol != decode_type_t::UNKNOWN) {
// Use the previous protcol/model if set. // Use the previous protocol/model if set.
state.protocol = climate[0]->next.protocol; state.protocol = climate[0]->next.protocol;
state.model = climate[0]->next.model; state.model = climate[0]->next.model;
} }
#endif // IGNORE_DECODED_AC_PROTOCOL #endif // IGNORE_DECODED_AC_PROTOCOL
// Continue to use the previously prefered temperature units. // Continue to use the previously prefered temperature units.
// i.e. Keep using Celsius or Fahrenheit. // i.e. Keep using Celsius or Fahrenheit.
if (climate[0]->next.celsius != state.celsius) { if (climate[0]->next.celsius != state.celsius) {
// We've got a mismatch, so we need to convert. // We've got a mismatch, so we need to convert.
state.degrees = climate[0]->next.celsius ? fahrenheitToCelsius(state.degrees) state.degrees = climate[0]->next.celsius ?
: celsiusToFahrenheit(state.degrees); fahrenheitToCelsius(state.degrees) : celsiusToFahrenheit(state.degrees);
state.celsius = climate[0]->next.celsius; state.celsius = climate[0]->next.celsius;
} }
climate[0]->next = state; // Copy over the new climate state. climate[0]->next = state; // Copy over the new climate state.
#if MQTT_ENABLE #if MQTT_ENABLE
sendClimate(genStatTopic(0), true, false, REPLAY_DECODED_AC_MESSAGE, sendClimate(genStatTopic(0), true, false, REPLAY_DECODED_AC_MESSAGE,
REPLAY_DECODED_AC_MESSAGE, climate[0]); REPLAY_DECODED_AC_MESSAGE, climate[0]);

View File

@ -17,7 +17,7 @@
* Version 0.4 July, 2018 * Version 0.4 July, 2018
* - Minor improvements and more A/C unit support. * - Minor improvements and more A/C unit support.
* Version 0.3 November, 2017 * Version 0.3 November, 2017
* - Support for A/C decoding for some protcols. * - Support for A/C decoding for some protocols.
* Version 0.2 April, 2017 * Version 0.2 April, 2017
* - Decode from a copy of the data so we can start capturing faster thus * - Decode from a copy of the data so we can start capturing faster thus
* reduce the likelihood of miscaptures. * reduce the likelihood of miscaptures.

View File

Before

Width:  |  Height:  |  Size: 25 KiB

After

Width:  |  Height:  |  Size: 25 KiB

View File

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 16 KiB

View File

@ -133,6 +133,7 @@ convertSwingV KEYWORD2
coolix KEYWORD2 coolix KEYWORD2
copyIrParams KEYWORD2 copyIrParams KEYWORD2
countBits KEYWORD2 countBits KEYWORD2
crudeNoiseFilter KEYWORD2
daikin KEYWORD2 daikin KEYWORD2
daikin128 KEYWORD2 daikin128 KEYWORD2
daikin152 KEYWORD2 daikin152 KEYWORD2
@ -156,6 +157,7 @@ decodeDaikin2 KEYWORD2
decodeDaikin216 KEYWORD2 decodeDaikin216 KEYWORD2
decodeDenon KEYWORD2 decodeDenon KEYWORD2
decodeElectraAC KEYWORD2 decodeElectraAC KEYWORD2
decodeEpson KEYWORD2
decodeFujitsuAC KEYWORD2 decodeFujitsuAC KEYWORD2
decodeGICable KEYWORD2 decodeGICable KEYWORD2
decodeGoodweather KEYWORD2 decodeGoodweather KEYWORD2
@ -252,6 +254,7 @@ getCorrectedRawLength KEYWORD2
getCurrTime KEYWORD2 getCurrTime KEYWORD2
getCurrentDay KEYWORD2 getCurrentDay KEYWORD2
getCurrentTime KEYWORD2 getCurrentTime KEYWORD2
getDisplay KEYWORD2
getEcono KEYWORD2 getEcono KEYWORD2
getEye KEYWORD2 getEye KEYWORD2
getEyeAuto KEYWORD2 getEyeAuto KEYWORD2
@ -355,6 +358,7 @@ ledOff KEYWORD2
ledOn KEYWORD2 ledOn KEYWORD2
lg KEYWORD2 lg KEYWORD2
mark KEYWORD2 mark KEYWORD2
markAsSent KEYWORD2
match KEYWORD2 match KEYWORD2
matchAtLeast KEYWORD2 matchAtLeast KEYWORD2
matchBytes KEYWORD2 matchBytes KEYWORD2
@ -406,6 +410,7 @@ sendDaikin216 KEYWORD2
sendData KEYWORD2 sendData KEYWORD2
sendDenon KEYWORD2 sendDenon KEYWORD2
sendElectraAC KEYWORD2 sendElectraAC KEYWORD2
sendEpson KEYWORD2
sendExtended KEYWORD2 sendExtended KEYWORD2
sendFujitsuAC KEYWORD2 sendFujitsuAC KEYWORD2
sendGC KEYWORD2 sendGC KEYWORD2
@ -484,6 +489,7 @@ setCommand KEYWORD2
setCurrTime KEYWORD2 setCurrTime KEYWORD2
setCurrentDay KEYWORD2 setCurrentDay KEYWORD2
setCurrentTime KEYWORD2 setCurrentTime KEYWORD2
setDisplay KEYWORD2
setEcono KEYWORD2 setEcono KEYWORD2
setEye KEYWORD2 setEye KEYWORD2
setEyeAuto KEYWORD2 setEyeAuto KEYWORD2
@ -666,6 +672,7 @@ DECODE_DAIKIN216 LITERAL1
DECODE_DENON LITERAL1 DECODE_DENON LITERAL1
DECODE_DISH LITERAL1 DECODE_DISH LITERAL1
DECODE_ELECTRA_AC LITERAL1 DECODE_ELECTRA_AC LITERAL1
DECODE_EPSON LITERAL1
DECODE_FUJITSU_AC LITERAL1 DECODE_FUJITSU_AC LITERAL1
DECODE_GICABLE LITERAL1 DECODE_GICABLE LITERAL1
DECODE_GLOBALCACHE LITERAL1 DECODE_GLOBALCACHE LITERAL1
@ -728,6 +735,8 @@ DG11J191 LITERAL1
DISH LITERAL1 DISH LITERAL1
DISH_BITS LITERAL1 DISH_BITS LITERAL1
ELECTRA_AC LITERAL1 ELECTRA_AC LITERAL1
ENABLE_NOISE_FILTER_OPTION LITERAL1
EPSON LITERAL1
FUJITSU_AC LITERAL1 FUJITSU_AC LITERAL1
FUJITSU_AC_BITS LITERAL1 FUJITSU_AC_BITS LITERAL1
FUJITSU_AC_CMD_STAY_ON LITERAL1 FUJITSU_AC_CMD_STAY_ON LITERAL1
@ -964,6 +973,7 @@ SEND_DAIKIN216 LITERAL1
SEND_DENON LITERAL1 SEND_DENON LITERAL1
SEND_DISH LITERAL1 SEND_DISH LITERAL1
SEND_ELECTRA_AC LITERAL1 SEND_ELECTRA_AC LITERAL1
SEND_EPSON LITERAL1
SEND_FUJITSU_AC LITERAL1 SEND_FUJITSU_AC LITERAL1
SEND_GICABLE LITERAL1 SEND_GICABLE LITERAL1
SEND_GLOBALCACHE LITERAL1 SEND_GLOBALCACHE LITERAL1
@ -1634,6 +1644,7 @@ kEconoStr LITERAL1
kElectraAcAuto LITERAL1 kElectraAcAuto LITERAL1
kElectraAcBitMark LITERAL1 kElectraAcBitMark LITERAL1
kElectraAcBits LITERAL1 kElectraAcBits LITERAL1
kElectraAcCleanOffset LITERAL1
kElectraAcCool LITERAL1 kElectraAcCool LITERAL1
kElectraAcDry LITERAL1 kElectraAcDry LITERAL1
kElectraAcFan LITERAL1 kElectraAcFan LITERAL1
@ -1646,6 +1657,9 @@ kElectraAcFanSize LITERAL1
kElectraAcHdrMark LITERAL1 kElectraAcHdrMark LITERAL1
kElectraAcHdrSpace LITERAL1 kElectraAcHdrSpace LITERAL1
kElectraAcHeat LITERAL1 kElectraAcHeat LITERAL1
kElectraAcLightToggleMask LITERAL1
kElectraAcLightToggleOff LITERAL1
kElectraAcLightToggleOn LITERAL1
kElectraAcMaxTemp LITERAL1 kElectraAcMaxTemp LITERAL1
kElectraAcMessageGap LITERAL1 kElectraAcMessageGap LITERAL1
kElectraAcMinRepeat LITERAL1 kElectraAcMinRepeat LITERAL1
@ -1662,7 +1676,10 @@ kElectraAcSwingVOffset LITERAL1
kElectraAcTempDelta LITERAL1 kElectraAcTempDelta LITERAL1
kElectraAcTempOffset LITERAL1 kElectraAcTempOffset LITERAL1
kElectraAcTempSize LITERAL1 kElectraAcTempSize LITERAL1
kElectraAcTurboOffset LITERAL1
kElectraAcZeroSpace LITERAL1 kElectraAcZeroSpace LITERAL1
kEpsonBits LITERAL1
kEpsonMinRepeat LITERAL1
kEyeAutoStr LITERAL1 kEyeAutoStr LITERAL1
kEyeStr LITERAL1 kEyeStr LITERAL1
kFalseStr LITERAL1 kFalseStr LITERAL1
@ -2763,6 +2780,7 @@ kSamsungAcClean10Offset LITERAL1
kSamsungAcClean11Offset LITERAL1 kSamsungAcClean11Offset LITERAL1
kSamsungAcCool LITERAL1 kSamsungAcCool LITERAL1
kSamsungAcDefaultRepeat LITERAL1 kSamsungAcDefaultRepeat LITERAL1
kSamsungAcDisplayOffset LITERAL1
kSamsungAcDry LITERAL1 kSamsungAcDry LITERAL1
kSamsungAcExtendedBits LITERAL1 kSamsungAcExtendedBits LITERAL1
kSamsungAcExtendedStateLength LITERAL1 kSamsungAcExtendedStateLength LITERAL1
@ -2778,6 +2796,7 @@ kSamsungAcFanTurbo LITERAL1
kSamsungAcHdrMark LITERAL1 kSamsungAcHdrMark LITERAL1
kSamsungAcHdrSpace LITERAL1 kSamsungAcHdrSpace LITERAL1
kSamsungAcHeat LITERAL1 kSamsungAcHeat LITERAL1
kSamsungAcIonOffset LITERAL1
kSamsungAcMaxTemp LITERAL1 kSamsungAcMaxTemp LITERAL1
kSamsungAcMinTemp LITERAL1 kSamsungAcMinTemp LITERAL1
kSamsungAcModeOffset LITERAL1 kSamsungAcModeOffset LITERAL1

View File

@ -1,6 +1,6 @@
{ {
"name": "IRremoteESP8266", "name": "IRremoteESP8266",
"version": "2.7.3", "version": "2.7.4",
"keywords": "infrared, ir, remote, esp8266, esp32", "keywords": "infrared, ir, remote, esp8266, esp32",
"description": "Send and receive infrared signals with multiple protocols (ESP8266/ESP32)", "description": "Send and receive infrared signals with multiple protocols (ESP8266/ESP32)",
"repository": "repository":

View File

@ -1,7 +1,7 @@
name=IRremoteESP8266 name=IRremoteESP8266
version=2.7.3 version=2.7.4
author=David Conran, Sebastien Warin, Mark Szabo, Ken Shirriff author=David Conran, Sebastien Warin, Mark Szabo, Ken Shirriff
maintainer=Mark Szabo, David Conran, Sebastien Warin, Roi Dayan, Massimiliano Pinto maintainer=David Conran, Mark Szabo, Sebastien Warin, Roi Dayan, Massimiliano Pinto
sentence=Send and receive infrared signals with multiple protocols (ESP8266/ESP32) sentence=Send and receive infrared signals with multiple protocols (ESP8266/ESP32)
paragraph=This library enables you to send and receive infra-red signals on an ESP8266 or an ESP32. paragraph=This library enables you to send and receive infra-red signals on an ESP8266 or an ESP32.
category=Device Control category=Device Control

View File

@ -45,7 +45,7 @@ IRac::IRac(const uint16_t pin, const bool inverted, const bool use_modulation) {
_inverted = inverted; _inverted = inverted;
_modulation = use_modulation; _modulation = use_modulation;
initState(&next); initState(&next);
_prev = next; this->markAsSent();
} }
void IRac::initState(stdAc::state_t *state, void IRac::initState(stdAc::state_t *state,
@ -466,7 +466,8 @@ void IRac::electra(IRElectraAc *ac,
const bool on, const stdAc::opmode_t mode, const bool on, const stdAc::opmode_t mode,
const float degrees, const stdAc::fanspeed_t fan, const float degrees, const stdAc::fanspeed_t fan,
const stdAc::swingv_t swingv, const stdAc::swingv_t swingv,
const stdAc::swingh_t swingh) { const stdAc::swingh_t swingh, const bool turbo,
const bool lighttoggle, const bool clean) {
ac->begin(); ac->begin();
ac->setPower(on); ac->setPower(on);
ac->setMode(ac->convertMode(mode)); ac->setMode(ac->convertMode(mode));
@ -475,11 +476,12 @@ void IRac::electra(IRElectraAc *ac,
ac->setSwingV(swingv != stdAc::swingv_t::kOff); ac->setSwingV(swingv != stdAc::swingv_t::kOff);
ac->setSwingH(swingh != stdAc::swingh_t::kOff); ac->setSwingH(swingh != stdAc::swingh_t::kOff);
// No Quiet setting available. // No Quiet setting available.
// No Turbo setting available. ac->setTurbo(turbo);
ac->setLightToggle(lighttoggle);
// No Light setting available. // No Light setting available.
// No Econo setting available. // No Econo setting available.
// No Filter setting available. // No Filter setting available.
// No Clean setting available. ac->setClean(clean);
// No Beep setting available. // No Beep setting available.
// No Sleep setting available. // No Sleep setting available.
// No Clock setting available. // No Clock setting available.
@ -968,7 +970,8 @@ void IRac::samsung(IRSamsungAc *ac,
const bool on, const stdAc::opmode_t mode, const bool on, const stdAc::opmode_t mode,
const float degrees, const float degrees,
const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv,
const bool quiet, const bool turbo, const bool clean, const bool quiet, const bool turbo, const bool light,
const bool filter, const bool clean,
const bool beep, const bool prevpower, const bool beep, const bool prevpower,
const bool forcepower) { const bool forcepower) {
ac->begin(); ac->begin();
@ -981,9 +984,9 @@ void IRac::samsung(IRSamsungAc *ac,
// No Horizontal swing setting available. // No Horizontal swing setting available.
ac->setQuiet(quiet); ac->setQuiet(quiet);
ac->setPowerful(turbo); ac->setPowerful(turbo);
// No Light setting available. ac->setDisplay(light);
// No Econo setting available. // No Econo setting available.
// No Filter setting available. ac->setIon(filter);
ac->setClean(clean); ac->setClean(clean);
ac->setBeep(beep); ac->setBeep(beep);
// No Sleep setting available. // No Sleep setting available.
@ -1219,6 +1222,9 @@ stdAc::state_t IRac::handleToggles(const stdAc::state_t desired,
result.power = desired.power ^ prev->power; result.power = desired.power ^ prev->power;
result.light = desired.light ^ prev->light; result.light = desired.light ^ prev->light;
break; break;
case decode_type_t::ELECTRA_AC:
result.light = desired.light ^ prev->light;
break;
case decode_type_t::MIDEA: case decode_type_t::MIDEA:
case decode_type_t::HITACHI_AC424: case decode_type_t::HITACHI_AC424:
if ((desired.swingv == stdAc::swingv_t::kOff) ^ if ((desired.swingv == stdAc::swingv_t::kOff) ^
@ -1389,7 +1395,7 @@ bool IRac::sendAc(const stdAc::state_t desired, const stdAc::state_t *prev) {
{ {
IRElectraAc ac(_pin, _inverted, _modulation); IRElectraAc ac(_pin, _inverted, _modulation);
electra(&ac, send.power, send.mode, degC, send.fanspeed, send.swingv, electra(&ac, send.power, send.mode, degC, send.fanspeed, send.swingv,
send.swingh); send.swingh, send.turbo, send.light, send.clean);
break; break;
} }
#endif // SEND_ELECTRA_AC #endif // SEND_ELECTRA_AC
@ -1557,7 +1563,8 @@ bool IRac::sendAc(const stdAc::state_t desired, const stdAc::state_t *prev) {
{ {
IRSamsungAc ac(_pin, _inverted, _modulation); IRSamsungAc ac(_pin, _inverted, _modulation);
samsung(&ac, send.power, send.mode, degC, send.fanspeed, send.swingv, samsung(&ac, send.power, send.mode, degC, send.fanspeed, send.swingv,
send.quiet, send.turbo, send.clean, send.beep, prev->power); send.quiet, send.turbo, send.light, send.filter, send.clean,
send.beep, prev->power);
break; break;
} }
#endif // SEND_SAMSUNG_AC #endif // SEND_SAMSUNG_AC
@ -1628,13 +1635,18 @@ bool IRac::sendAc(const stdAc::state_t desired, const stdAc::state_t *prev) {
return true; // Success. return true; // Success.
} }
// Update the previous state to the current one.
void IRac::markAsSent(void) {
_prev = next;
}
// Send an A/C message based soley on our internal state. // Send an A/C message based soley on our internal state.
// //
// Returns: // Returns:
// boolean: True, if accepted/converted/attempted. False, if unsupported. // boolean: True, if accepted/converted/attempted. False, if unsupported.
bool IRac::sendAc(void) { bool IRac::sendAc(void) {
bool success = this->sendAc(next, &_prev); bool success = this->sendAc(next, &_prev);
_prev = next; if (success) this->markAsSent();
return success; return success;
} }
@ -2232,7 +2244,6 @@ namespace IRAcUtils {
#if DECODE_COOLIX #if DECODE_COOLIX
case decode_type_t::COOLIX: { case decode_type_t::COOLIX: {
IRCoolixAC ac(kGpioUnused); IRCoolixAC ac(kGpioUnused);
ac.on();
ac.setRaw(decode->value); // Uses value instead of state. ac.setRaw(decode->value); // Uses value instead of state.
*result = ac.toCommon(prev); *result = ac.toCommon(prev);
break; break;

View File

@ -54,6 +54,7 @@ class IRac {
const bool beep, const int16_t sleep, const bool beep, const int16_t sleep,
const int16_t clock); const int16_t clock);
static void initState(stdAc::state_t *state); static void initState(stdAc::state_t *state);
void markAsSent(void);
bool sendAc(void); bool sendAc(void);
bool sendAc(const stdAc::state_t desired, const stdAc::state_t *prev = NULL); bool sendAc(const stdAc::state_t desired, const stdAc::state_t *prev = NULL);
bool sendAc(const decode_type_t vendor, const int16_t model, bool sendAc(const decode_type_t vendor, const int16_t model,
@ -170,7 +171,8 @@ void electra(IRElectraAc *ac,
const bool on, const stdAc::opmode_t mode, const bool on, const stdAc::opmode_t mode,
const float degrees, const stdAc::fanspeed_t fan, const float degrees, const stdAc::fanspeed_t fan,
const stdAc::swingv_t swingv, const stdAc::swingv_t swingv,
const stdAc::swingh_t swingh); const stdAc::swingh_t swingh, const bool turbo,
const bool lighttoggle, const bool clean);
#endif // SEND_ELECTRA_AC #endif // SEND_ELECTRA_AC
#if SEND_FUJITSU_AC #if SEND_FUJITSU_AC
void fujitsu(IRFujitsuAC *ac, const fujitsu_ac_remote_model_t model, void fujitsu(IRFujitsuAC *ac, const fujitsu_ac_remote_model_t model,
@ -299,7 +301,8 @@ void electra(IRElectraAc *ac,
void samsung(IRSamsungAc *ac, void samsung(IRSamsungAc *ac,
const bool on, const stdAc::opmode_t mode, const float degrees, const bool on, const stdAc::opmode_t mode, const float degrees,
const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv,
const bool quiet, const bool turbo, const bool clean, const bool quiet, const bool turbo, const bool light,
const bool filter, const bool clean,
const bool beep, const bool prevpower = true, const bool beep, const bool prevpower = true,
const bool forcepower = true); const bool forcepower = true);
#endif // SEND_SAMSUNG_AC #endif // SEND_SAMSUNG_AC

View File

@ -307,6 +307,37 @@ void IRrecv::setTolerance(const uint8_t percent) {
// Get the base tolerance percentage for matching incoming IR messages. // Get the base tolerance percentage for matching incoming IR messages.
uint8_t IRrecv::getTolerance(void) { return _tolerance; } uint8_t IRrecv::getTolerance(void) { return _tolerance; }
#if ENABLE_NOISE_FILTER_OPTION
// Remove or merge pulses in the capture buffer that are too short.
// Args:
// results: Ptr to the decode_results we are going to filter/modify.
// floor: Only allow values in the buffer large than this. (in micro seconds)
void IRrecv::crudeNoiseFilter(decode_results *results, const uint16_t floor) {
if (floor == 0) return; // Nothing to do.
const uint16_t kTickFloor = floor / kRawTick;
const uint16_t kBufSize = getBufSize();
uint16_t offset = kStartOffset;
while (offset < results->rawlen && offset + 2 < kBufSize) {
uint16_t curr = results->rawbuf[offset];
uint16_t next = results->rawbuf[offset + 1];
uint16_t addition = curr + next;
if (curr < kTickFloor) { // Is it too short?
// Shuffle the buffer down. i.e. Remove the mark & space pair.
// Note: `memcpy()` can't be used as rawbuf is `volatile`.
for (uint16_t i = offset + 2; i <= results->rawlen && i < kBufSize; i++)
results->rawbuf[i - 2] = results->rawbuf[i];
if (offset > 1) { // There is a previous pair we can add to.
// Merge this pair into into the previous space.
results->rawbuf[offset - 1] += addition;
}
results->rawlen -= 2; // Adjust the length.
} else {
offset++; // Move along.
}
}
}
#endif // ENABLE_NOISE_FILTER_OPTION
// Decodes the received IR message. // Decodes the received IR message.
// If the interrupt state is saved, we will immediately resume waiting // If the interrupt state is saved, we will immediately resume waiting
// for the next IR message to avoid missing messages. // for the next IR message to avoid missing messages.
@ -317,9 +348,41 @@ uint8_t IRrecv::getTolerance(void) { return _tolerance; }
// results: A pointer to where the decoded IR message will be stored. // results: A pointer to where the decoded IR message will be stored.
// save: A pointer to an irparams_t instance in which to save // save: A pointer to an irparams_t instance in which to save
// the interrupt's memory/state. NULL means don't save it. // the interrupt's memory/state. NULL means don't save it.
// max_skip: Maximum Nr. of pulses at the begining of a capture we can skip
// when attempting to find a protocol we can successfully decode.
// This parameter can dramatically improve detection of protocols
// when there is light IR interference just before an incoming IR
// message, however, it comes at a steep performace price.
// CAUTION: Increasing this value will dramatically (linnearly)
// increase the cpu time & usage to decode protocols.
// e.g. 0 -> 1 will be a 2x increase in cpu usage/time.
// 0 -> 2 will be a 3x increase etc.
// If you are going to do this, consider disabling
// protocol decoding for protocols you are not expecting.
// (Default is 0. No skipping.)
// noise_floor: Pulses below this size (in usecs) will be removed or merged
// prior to any decoding. This is to try to remove noise/poor
// readings & slighly increase the chances of a successful
// decode but at the cost of data fidelity & integrity.
// (Defaults to 0 usecs. i.e. Don't filter; which is safe!)
// DANGER: **Here Be Dragons!**
// If you set the `filter_floor` value too high, it **WILL**
// break decoding of some protocols. You have been warned!
// **Any** non-zero value has the potential to **cook** the
// captured raw data. i.e. The data is going to lie to you.
// It may obscure hardware, circuit, & environment issues thus
// making it impossible to support you accurately or
// confidently.
// Values of <= 50 usecs will probably be safe.
// 51 - 100 usecs **might** be okay.
// 100 - 150 usecs is "Danger, Will Robinson!".
// 150 - 200 usecs expect broken protocols.
// At 200+ usecs, you **have** protocols you can't decode!!
//
// Returns: // Returns:
// A boolean indicating if an IR message is ready or not. // A boolean indicating if an IR message is ready or not.
bool IRrecv::decode(decode_results *results, irparams_t *save) { bool IRrecv::decode(decode_results *results, irparams_t *save,
uint8_t max_skip, uint16_t noise_floor) {
// Proceed only if an IR message been received. // Proceed only if an IR message been received.
#ifndef UNIT_TEST #ifndef UNIT_TEST
if (irparams.rcvstate != kStopState) return false; if (irparams.rcvstate != kStopState) return false;
@ -365,320 +428,342 @@ bool IRrecv::decode(decode_results *results, irparams_t *save) {
results->command = 0; results->command = 0;
results->repeat = false; results->repeat = false;
#if ENABLE_NOISE_FILTER_OPTION
crudeNoiseFilter(results, noise_floor);
#endif // ENABLE_NOISE_FILTER_OPTION
// Keep looking for protocols until we've run out of entries to skip or we
// find a valid protocol message.
for (uint16_t offset = kStartOffset;
offset <= (max_skip * 2) + kStartOffset;
offset += 2) {
#if DECODE_AIWA_RC_T501 #if DECODE_AIWA_RC_T501
DPRINTLN("Attempting Aiwa RC T501 decode"); DPRINTLN("Attempting Aiwa RC T501 decode");
// Try decodeAiwaRCT501() before decodeSanyoLC7461() & decodeNEC() // Try decodeAiwaRCT501() before decodeSanyoLC7461() & decodeNEC()
// because the protocols are similar. This protocol is more specific than // because the protocols are similar. This protocol is more specific than
// those ones, so should got before them. // those ones, so should go before them.
if (decodeAiwaRCT501(results)) return true; if (decodeAiwaRCT501(results, offset)) return true;
#endif #endif
#if DECODE_SANYO #if DECODE_SANYO
DPRINTLN("Attempting Sanyo LC7461 decode"); DPRINTLN("Attempting Sanyo LC7461 decode");
// Try decodeSanyoLC7461() before decodeNEC() because the protocols are // Try decodeSanyoLC7461() before decodeNEC() because the protocols are
// similar in timings & structure, but the Sanyo one is much longer than the // similar in timings & structure, but the Sanyo one is much longer than the
// NEC protocol (42 vs 32 bits) so this one should be tried first to try to // NEC protocol (42 vs 32 bits) so this one should be tried first to try to
// reduce false detection as a NEC packet. // reduce false detection as a NEC packet.
if (decodeSanyoLC7461(results)) return true; if (decodeSanyoLC7461(results, offset)) return true;
#endif #endif
#if DECODE_CARRIER_AC #if DECODE_CARRIER_AC
DPRINTLN("Attempting Carrier AC decode"); DPRINTLN("Attempting Carrier AC decode");
// Try decodeCarrierAC() before decodeNEC() because the protocols are // Try decodeCarrierAC() before decodeNEC() because the protocols are
// similar in timings & structure, but the Carrier one is much longer than the // similar in timings & structure, but the Carrier one is much longer than
// NEC protocol (3x32 bits vs 1x32 bits) so this one should be tried first to // the NEC protocol (3x32 bits vs 1x32 bits) so this one should be tried
// try to reduce false detection as a NEC packet. // first to try to reduce false detection as a NEC packet.
if (decodeCarrierAC(results)) return true; if (decodeCarrierAC(results, offset)) return true;
#endif #endif
#if DECODE_PIONEER #if DECODE_PIONEER
DPRINTLN("Attempting Pioneer decode"); DPRINTLN("Attempting Pioneer decode");
// Try decodePioneer() before decodeNEC() because the protocols are // Try decodePioneer() before decodeNEC() because the protocols are
// similar in timings & structure, but the Pioneer one is much longer than the // similar in timings & structure, but the Pioneer one is much longer than
// NEC protocol (2x32 bits vs 1x32 bits) so this one should be tried first to // the NEC protocol (2x32 bits vs 1x32 bits) so this one should be tried
// try to reduce false detection as a NEC packet. // first to try to reduce false detection as a NEC packet.
if (decodePioneer(results)) return true; if (decodePioneer(results, offset)) return true;
#endif
#if DECODE_EPSON
DPRINTLN("Attempting Epson decode");
// Try decodeEpson() before decodeNEC() because the protocols are
// similar in timings & structure, but the Epson one is much longer than the
// NEC protocol (3x32 identical bits vs 1x32 bits) so this one should be tried
// first to try to reduce false detection as a NEC packet.
if (decodeEpson(results, offset)) return true;
#endif #endif
#if DECODE_NEC #if DECODE_NEC
DPRINTLN("Attempting NEC decode"); DPRINTLN("Attempting NEC decode");
if (decodeNEC(results)) return true; if (decodeNEC(results, offset)) return true;
#endif #endif
#if DECODE_SONY #if DECODE_SONY
DPRINTLN("Attempting Sony decode"); DPRINTLN("Attempting Sony decode");
if (decodeSony(results)) return true; if (decodeSony(results, offset)) return true;
#endif #endif
#if DECODE_MITSUBISHI #if DECODE_MITSUBISHI
DPRINTLN("Attempting Mitsubishi decode"); DPRINTLN("Attempting Mitsubishi decode");
if (decodeMitsubishi(results)) return true; if (decodeMitsubishi(results, offset)) return true;
#endif #endif
#if DECODE_MITSUBISHI_AC #if DECODE_MITSUBISHI_AC
DPRINTLN("Attempting Mitsubishi AC decode"); DPRINTLN("Attempting Mitsubishi AC decode");
if (decodeMitsubishiAC(results)) return true; if (decodeMitsubishiAC(results, offset)) return true;
#endif #endif
#if DECODE_MITSUBISHI2 #if DECODE_MITSUBISHI2
DPRINTLN("Attempting Mitsubishi2 decode"); DPRINTLN("Attempting Mitsubishi2 decode");
if (decodeMitsubishi2(results)) return true; if (decodeMitsubishi2(results, offset)) return true;
#endif #endif
#if DECODE_RC5 #if DECODE_RC5
DPRINTLN("Attempting RC5 decode"); DPRINTLN("Attempting RC5 decode");
if (decodeRC5(results)) return true; if (decodeRC5(results, offset)) return true;
#endif #endif
#if DECODE_RC6 #if DECODE_RC6
DPRINTLN("Attempting RC6 decode"); DPRINTLN("Attempting RC6 decode");
if (decodeRC6(results)) return true; if (decodeRC6(results, offset)) return true;
#endif #endif
#if DECODE_RCMM #if DECODE_RCMM
DPRINTLN("Attempting RC-MM decode"); DPRINTLN("Attempting RC-MM decode");
if (decodeRCMM(results)) return true; if (decodeRCMM(results, offset)) return true;
#endif #endif
#if DECODE_FUJITSU_AC #if DECODE_FUJITSU_AC
// Fujitsu A/C needs to precede Panasonic and Denon as it has a short // Fujitsu A/C needs to precede Panasonic and Denon as it has a short
// message which looks exactly the same as a Panasonic/Denon message. // message which looks exactly the same as a Panasonic/Denon message.
DPRINTLN("Attempting Fujitsu A/C decode"); DPRINTLN("Attempting Fujitsu A/C decode");
if (decodeFujitsuAC(results)) return true; if (decodeFujitsuAC(results, offset)) return true;
#endif #endif
#if DECODE_DENON #if DECODE_DENON
// Denon needs to precede Panasonic as it is a special case of Panasonic. // Denon needs to precede Panasonic as it is a special case of Panasonic.
DPRINTLN("Attempting Denon decode"); DPRINTLN("Attempting Denon decode");
if (decodeDenon(results, kDenon48Bits) || decodeDenon(results, kDenonBits) || if (decodeDenon(results, offset, kDenon48Bits) ||
decodeDenon(results, kDenonLegacyBits)) decodeDenon(results, offset, kDenonBits) ||
return true; decodeDenon(results, offset, kDenonLegacyBits))
return true;
#endif #endif
#if DECODE_PANASONIC #if DECODE_PANASONIC
DPRINTLN("Attempting Panasonic decode"); DPRINTLN("Attempting Panasonic decode");
if (decodePanasonic(results)) return true; if (decodePanasonic(results, offset)) return true;
#endif #endif
#if DECODE_LG #if DECODE_LG
DPRINTLN("Attempting LG (28-bit) decode"); DPRINTLN("Attempting LG (28-bit) decode");
if (decodeLG(results, kLgBits, true)) return true; if (decodeLG(results, offset, kLgBits, true)) return true;
DPRINTLN("Attempting LG (32-bit) decode"); DPRINTLN("Attempting LG (32-bit) decode");
// LG32 should be tried before Samsung // LG32 should be tried before Samsung
if (decodeLG(results, kLg32Bits, true)) return true; if (decodeLG(results, offset, kLg32Bits, true)) return true;
#endif #endif
#if DECODE_GICABLE #if DECODE_GICABLE
// Note: Needs to happen before JVC decode, because it looks similar except // Note: Needs to happen before JVC decode, because it looks similar except
// with a required NEC-like repeat code. // with a required NEC-like repeat code.
DPRINTLN("Attempting GICable decode"); DPRINTLN("Attempting GICable decode");
if (decodeGICable(results)) return true; if (decodeGICable(results, offset)) return true;
#endif #endif
#if DECODE_JVC #if DECODE_JVC
DPRINTLN("Attempting JVC decode"); DPRINTLN("Attempting JVC decode");
if (decodeJVC(results)) return true; if (decodeJVC(results, offset)) return true;
#endif #endif
#if DECODE_SAMSUNG #if DECODE_SAMSUNG
DPRINTLN("Attempting SAMSUNG decode"); DPRINTLN("Attempting SAMSUNG decode");
if (decodeSAMSUNG(results)) return true; if (decodeSAMSUNG(results, offset)) return true;
#endif #endif
#if DECODE_SAMSUNG36 #if DECODE_SAMSUNG36
DPRINTLN("Attempting Samsung36 decode"); DPRINTLN("Attempting Samsung36 decode");
if (decodeSamsung36(results)) return true; if (decodeSamsung36(results, offset)) return true;
#endif #endif
#if DECODE_WHYNTER #if DECODE_WHYNTER
DPRINTLN("Attempting Whynter decode"); DPRINTLN("Attempting Whynter decode");
if (decodeWhynter(results)) return true; if (decodeWhynter(results, offset)) return true;
#endif #endif
#if DECODE_DISH #if DECODE_DISH
DPRINTLN("Attempting DISH decode"); DPRINTLN("Attempting DISH decode");
if (decodeDISH(results)) return true; if (decodeDISH(results, offset)) return true;
#endif #endif
#if DECODE_SHARP #if DECODE_SHARP
DPRINTLN("Attempting Sharp decode"); DPRINTLN("Attempting Sharp decode");
if (decodeSharp(results)) return true; if (decodeSharp(results, offset)) return true;
#endif #endif
#if DECODE_COOLIX #if DECODE_COOLIX
DPRINTLN("Attempting Coolix decode"); DPRINTLN("Attempting Coolix decode");
if (decodeCOOLIX(results)) return true; if (decodeCOOLIX(results, offset)) return true;
#endif #endif
#if DECODE_NIKAI #if DECODE_NIKAI
DPRINTLN("Attempting Nikai decode"); DPRINTLN("Attempting Nikai decode");
if (decodeNikai(results)) return true; if (decodeNikai(results, offset)) return true;
#endif #endif
#if DECODE_KELVINATOR #if DECODE_KELVINATOR
// Kelvinator based-devices use a similar code to Gree ones, to avoid false // Kelvinator based-devices use a similar code to Gree ones, to avoid false
// matches this needs to happen before decodeGree(). // matches this needs to happen before decodeGree().
DPRINTLN("Attempting Kelvinator decode"); DPRINTLN("Attempting Kelvinator decode");
if (decodeKelvinator(results)) return true; if (decodeKelvinator(results, offset)) return true;
#endif #endif
#if DECODE_DAIKIN #if DECODE_DAIKIN
DPRINTLN("Attempting Daikin decode"); DPRINTLN("Attempting Daikin decode");
if (decodeDaikin(results)) return true; if (decodeDaikin(results, offset)) return true;
#endif #endif
#if DECODE_DAIKIN2 #if DECODE_DAIKIN2
DPRINTLN("Attempting Daikin2 decode"); DPRINTLN("Attempting Daikin2 decode");
if (decodeDaikin2(results)) return true; if (decodeDaikin2(results, offset)) return true;
#endif #endif
#if DECODE_DAIKIN216 #if DECODE_DAIKIN216
DPRINTLN("Attempting Daikin216 decode"); DPRINTLN("Attempting Daikin216 decode");
if (decodeDaikin216(results)) return true; if (decodeDaikin216(results, offset)) return true;
#endif #endif
#if DECODE_TOSHIBA_AC #if DECODE_TOSHIBA_AC
DPRINTLN("Attempting Toshiba AC decode"); DPRINTLN("Attempting Toshiba AC decode");
if (decodeToshibaAC(results)) return true; if (decodeToshibaAC(results, offset)) return true;
#endif #endif
#if DECODE_MIDEA #if DECODE_MIDEA
DPRINTLN("Attempting Midea decode"); DPRINTLN("Attempting Midea decode");
if (decodeMidea(results)) return true; if (decodeMidea(results, offset)) return true;
#endif #endif
#if DECODE_MAGIQUEST #if DECODE_MAGIQUEST
DPRINTLN("Attempting Magiquest decode"); DPRINTLN("Attempting Magiquest decode");
if (decodeMagiQuest(results)) return true; if (decodeMagiQuest(results, offset)) return true;
#endif #endif
/* NOTE: Disabled due to poor quality. /* NOTE: Disabled due to poor quality.
#if DECODE_SANYO #if DECODE_SANYO
// The Sanyo S866500B decoder is very poor quality & depricated. // The Sanyo S866500B decoder is very poor quality & depricated.
// *IF* you are going to enable it, do it near last to avoid false positive // *IF* you are going to enable it, do it near last to avoid false positive
// matches. // matches.
DPRINTLN("Attempting Sanyo SA8650B decode"); DPRINTLN("Attempting Sanyo SA8650B decode");
if (decodeSanyo(results)) if (decodeSanyo(results, offset))
return true; return true;
#endif #endif
*/ */
#if DECODE_NEC #if DECODE_NEC
// Some devices send NEC-like codes that don't follow the true NEC spec. // Some devices send NEC-like codes that don't follow the true NEC spec.
// This should detect those. e.g. Apple TV remote etc. // This should detect those. e.g. Apple TV remote etc.
// This needs to be done after all other codes that use strict and some // This needs to be done after all other codes that use strict and some
// other protocols that are NEC-like as well, as turning off strict may // other protocols that are NEC-like as well, as turning off strict may
// cause this to match other valid protocols. // cause this to match other valid protocols.
DPRINTLN("Attempting NEC (non-strict) decode"); DPRINTLN("Attempting NEC (non-strict) decode");
if (decodeNEC(results, kNECBits, false)) { if (decodeNEC(results, offset, kNECBits, false)) {
results->decode_type = NEC_LIKE; results->decode_type = NEC_LIKE;
return true; return true;
} }
#endif #endif
#if DECODE_LASERTAG #if DECODE_LASERTAG
DPRINTLN("Attempting Lasertag decode"); DPRINTLN("Attempting Lasertag decode");
if (decodeLasertag(results)) return true; if (decodeLasertag(results, offset)) return true;
#endif #endif
#if DECODE_GREE #if DECODE_GREE
// Gree based-devices use a similar code to Kelvinator ones, to avoid false // Gree based-devices use a similar code to Kelvinator ones, to avoid false
// matches this needs to happen after decodeKelvinator(). // matches this needs to happen after decodeKelvinator().
DPRINTLN("Attempting Gree decode"); DPRINTLN("Attempting Gree decode");
if (decodeGree(results)) return true; if (decodeGree(results, offset)) return true;
#endif #endif
#if DECODE_HAIER_AC #if DECODE_HAIER_AC
DPRINTLN("Attempting Haier AC decode"); DPRINTLN("Attempting Haier AC decode");
if (decodeHaierAC(results)) return true; if (decodeHaierAC(results, offset)) return true;
#endif #endif
#if DECODE_HAIER_AC_YRW02 #if DECODE_HAIER_AC_YRW02
DPRINTLN("Attempting Haier AC YR-W02 decode"); DPRINTLN("Attempting Haier AC YR-W02 decode");
if (decodeHaierACYRW02(results)) return true; if (decodeHaierACYRW02(results, offset)) return true;
#endif #endif
#if DECODE_HITACHI_AC424 #if DECODE_HITACHI_AC424
// HitachiAc424 should be checked before HitachiAC & HitachiAC2 // HitachiAc424 should be checked before HitachiAC & HitachiAC2
DPRINTLN("Attempting Hitachi AC 424 decode"); DPRINTLN("Attempting Hitachi AC 424 decode");
if (decodeHitachiAc424(results, kHitachiAc424Bits)) return true; if (decodeHitachiAc424(results, offset, kHitachiAc424Bits)) return true;
#endif // DECODE_HITACHI_AC2 #endif // DECODE_HITACHI_AC2
#if DECODE_HITACHI_AC2 #if DECODE_HITACHI_AC2
// HitachiAC2 should be checked before HitachiAC // HitachiAC2 should be checked before HitachiAC
DPRINTLN("Attempting Hitachi AC2 decode"); DPRINTLN("Attempting Hitachi AC2 decode");
if (decodeHitachiAC(results, kHitachiAc2Bits)) return true; if (decodeHitachiAC(results, offset, kHitachiAc2Bits)) return true;
#endif // DECODE_HITACHI_AC2 #endif // DECODE_HITACHI_AC2
#if DECODE_HITACHI_AC #if DECODE_HITACHI_AC
DPRINTLN("Attempting Hitachi AC decode"); DPRINTLN("Attempting Hitachi AC decode");
if (decodeHitachiAC(results, kHitachiAcBits)) return true; if (decodeHitachiAC(results, offset, kHitachiAcBits)) return true;
#endif #endif
#if DECODE_HITACHI_AC1 #if DECODE_HITACHI_AC1
DPRINTLN("Attempting Hitachi AC1 decode"); DPRINTLN("Attempting Hitachi AC1 decode");
if (decodeHitachiAC(results, kHitachiAc1Bits)) return true; if (decodeHitachiAC(results, offset, kHitachiAc1Bits)) return true;
#endif #endif
#if DECODE_WHIRLPOOL_AC #if DECODE_WHIRLPOOL_AC
DPRINTLN("Attempting Whirlpool AC decode"); DPRINTLN("Attempting Whirlpool AC decode");
if (decodeWhirlpoolAC(results)) return true; if (decodeWhirlpoolAC(results, offset)) return true;
#endif #endif
#if DECODE_SAMSUNG_AC #if DECODE_SAMSUNG_AC
DPRINTLN("Attempting Samsung AC (extended) decode"); DPRINTLN("Attempting Samsung AC (extended) decode");
// Check the extended size first, as it should fail fast due to longer length. // Check the extended size first, as it should fail fast due to longer
if (decodeSamsungAC(results, kSamsungAcExtendedBits, false)) return true; // length.
// Now check for the more common length. if (decodeSamsungAC(results, offset, kSamsungAcExtendedBits, false))
DPRINTLN("Attempting Samsung AC decode"); return true;
if (decodeSamsungAC(results, kSamsungAcBits)) return true; // Now check for the more common length.
DPRINTLN("Attempting Samsung AC decode");
if (decodeSamsungAC(results, offset, kSamsungAcBits)) return true;
#endif #endif
#if DECODE_ELECTRA_AC #if DECODE_ELECTRA_AC
DPRINTLN("Attempting Electra AC decode"); DPRINTLN("Attempting Electra AC decode");
if (decodeElectraAC(results)) return true; if (decodeElectraAC(results, offset)) return true;
#endif #endif
#if DECODE_PANASONIC_AC #if DECODE_PANASONIC_AC
DPRINTLN("Attempting Panasonic AC decode"); DPRINTLN("Attempting Panasonic AC decode");
if (decodePanasonicAC(results)) return true; if (decodePanasonicAC(results, offset)) return true;
DPRINTLN("Attempting Panasonic AC short decode"); DPRINTLN("Attempting Panasonic AC short decode");
if (decodePanasonicAC(results, kPanasonicAcShortBits)) return true; if (decodePanasonicAC(results, offset, kPanasonicAcShortBits)) return true;
#endif #endif
#if DECODE_LUTRON #if DECODE_LUTRON
DPRINTLN("Attempting Lutron decode"); DPRINTLN("Attempting Lutron decode");
if (decodeLutron(results)) return true; if (decodeLutron(results, offset)) return true;
#endif #endif
#if DECODE_MWM #if DECODE_MWM
DPRINTLN("Attempting MWM decode"); DPRINTLN("Attempting MWM decode");
if (decodeMWM(results)) return true; if (decodeMWM(results, offset)) return true;
#endif #endif
#if DECODE_VESTEL_AC #if DECODE_VESTEL_AC
DPRINTLN("Attempting Vestel AC decode"); DPRINTLN("Attempting Vestel AC decode");
if (decodeVestelAc(results)) return true; if (decodeVestelAc(results, offset)) return true;
#endif #endif
#if DECODE_MITSUBISHI112 || DECODE_TCL112AC #if DECODE_MITSUBISHI112 || DECODE_TCL112AC
// Mitsubish112 and Tcl112 share the same decoder. // Mitsubish112 and Tcl112 share the same decoder.
DPRINTLN("Attempting Mitsubishi112/TCL112AC decode"); DPRINTLN("Attempting Mitsubishi112/TCL112AC decode");
if (decodeMitsubishi112(results)) return true; if (decodeMitsubishi112(results, offset)) return true;
#endif // DECODE_MITSUBISHI112 || DECODE_TCL112AC #endif // DECODE_MITSUBISHI112 || DECODE_TCL112AC
#if DECODE_TECO #if DECODE_TECO
DPRINTLN("Attempting Teco decode"); DPRINTLN("Attempting Teco decode");
if (decodeTeco(results)) return true; if (decodeTeco(results, offset)) return true;
#endif #endif
#if DECODE_LEGOPF #if DECODE_LEGOPF
DPRINTLN("Attempting LEGOPF decode"); DPRINTLN("Attempting LEGOPF decode");
if (decodeLegoPf(results)) return true; if (decodeLegoPf(results, offset)) return true;
#endif #endif
#if DECODE_MITSUBISHIHEAVY #if DECODE_MITSUBISHIHEAVY
DPRINTLN("Attempting MITSUBISHIHEAVY (152 bit) decode"); DPRINTLN("Attempting MITSUBISHIHEAVY (152 bit) decode");
if (decodeMitsubishiHeavy(results, kMitsubishiHeavy152Bits)) return true; if (decodeMitsubishiHeavy(results, offset, kMitsubishiHeavy152Bits))
DPRINTLN("Attempting MITSUBISHIHEAVY (88 bit) decode"); return true;
if (decodeMitsubishiHeavy(results, kMitsubishiHeavy88Bits)) return true; DPRINTLN("Attempting MITSUBISHIHEAVY (88 bit) decode");
if (decodeMitsubishiHeavy(results, offset, kMitsubishiHeavy88Bits))
return true;
#endif #endif
#if DECODE_ARGO #if DECODE_ARGO
DPRINTLN("Attempting Argo decode"); DPRINTLN("Attempting Argo decode");
if (decodeArgo(results)) return true; if (decodeArgo(results, offset)) return true;
#endif // DECODE_ARGO #endif // DECODE_ARGO
#if DECODE_SHARP_AC #if DECODE_SHARP_AC
DPRINTLN("Attempting SHARP_AC decode"); DPRINTLN("Attempting SHARP_AC decode");
if (decodeSharpAc(results)) return true; if (decodeSharpAc(results, offset)) return true;
#endif #endif
#if DECODE_GOODWEATHER #if DECODE_GOODWEATHER
DPRINTLN("Attempting GOODWEATHER decode"); DPRINTLN("Attempting GOODWEATHER decode");
if (decodeGoodweather(results)) return true; if (decodeGoodweather(results, offset)) return true;
#endif // DECODE_GOODWEATHER #endif // DECODE_GOODWEATHER
#if DECODE_INAX #if DECODE_INAX
DPRINTLN("Attempting Inax decode"); DPRINTLN("Attempting Inax decode");
if (decodeInax(results)) return true; if (decodeInax(results, offset)) return true;
#endif // DECODE_INAX #endif // DECODE_INAX
#if DECODE_TROTEC #if DECODE_TROTEC
DPRINTLN("Attempting Trotec decode"); DPRINTLN("Attempting Trotec decode");
if (decodeTrotec(results)) return true; if (decodeTrotec(results, offset)) return true;
#endif // DECODE_TROTEC #endif // DECODE_TROTEC
#if DECODE_DAIKIN160 #if DECODE_DAIKIN160
DPRINTLN("Attempting Daikin160 decode"); DPRINTLN("Attempting Daikin160 decode");
if (decodeDaikin160(results)) return true; if (decodeDaikin160(results, offset)) return true;
#endif // DECODE_DAIKIN160 #endif // DECODE_DAIKIN160
#if DECODE_NEOCLIMA #if DECODE_NEOCLIMA
DPRINTLN("Attempting Neoclima decode"); DPRINTLN("Attempting Neoclima decode");
if (decodeNeoclima(results)) return true; if (decodeNeoclima(results, offset)) return true;
#endif // DECODE_NEOCLIMA #endif // DECODE_NEOCLIMA
#if DECODE_DAIKIN176 #if DECODE_DAIKIN176
DPRINTLN("Attempting Daikin176 decode"); DPRINTLN("Attempting Daikin176 decode");
if (decodeDaikin176(results)) return true; if (decodeDaikin176(results, offset)) return true;
#endif // DECODE_DAIKIN176 #endif // DECODE_DAIKIN176
#if DECODE_DAIKIN128 #if DECODE_DAIKIN128
DPRINTLN("Attempting Daikin128 decode"); DPRINTLN("Attempting Daikin128 decode");
if (decodeDaikin128(results)) return true; if (decodeDaikin128(results, offset)) return true;
#endif // DECODE_DAIKIN128 #endif // DECODE_DAIKIN128
#if DECODE_AMCOR #if DECODE_AMCOR
DPRINTLN("Attempting Amcor decode"); DPRINTLN("Attempting Amcor decode");
if (decodeAmcor(results)) return true; if (decodeAmcor(results, offset)) return true;
#endif // DECODE_AMCOR #endif // DECODE_AMCOR
#if DECODE_DAIKIN152 #if DECODE_DAIKIN152
DPRINTLN("Attempting Daikin152 decode"); DPRINTLN("Attempting Daikin152 decode");
if (decodeDaikin152(results)) return true; if (decodeDaikin152(results, offset)) return true;
#endif // DECODE_DAIKIN152 #endif // DECODE_DAIKIN152
#if DECODE_MITSUBISHI136 #if DECODE_MITSUBISHI136
DPRINTLN("Attempting Mitsubishi136 decode"); DPRINTLN("Attempting Mitsubishi136 decode");
if (decodeMitsubishi136(results)) return true; if (decodeMitsubishi136(results, offset)) return true;
#endif // DECODE_MITSUBISHI136 #endif // DECODE_MITSUBISHI136
}
// Typically new protocols are added above this line. // Typically new protocols are added above this line.
#if DECODE_HASH #if DECODE_HASH
// decodeHash returns a hash on any input. // decodeHash returns a hash on any input.

View File

@ -125,7 +125,8 @@ class IRrecv {
~IRrecv(void); // Destructor ~IRrecv(void); // Destructor
void setTolerance(const uint8_t percent = kTolerance); void setTolerance(const uint8_t percent = kTolerance);
uint8_t getTolerance(void); uint8_t getTolerance(void);
bool decode(decode_results *results, irparams_t *save = NULL); bool decode(decode_results *results, irparams_t *save = NULL,
uint8_t max_skip = 0, uint16_t noise_floor = 0);
void enableIRIn(const bool pullup = false); void enableIRIn(const bool pullup = false);
void disableIRIn(void); void disableIRIn(void);
void resume(void); void resume(void);
@ -220,52 +221,64 @@ class IRrecv {
const uint8_t tolerance = kUseDefTol, const uint8_t tolerance = kUseDefTol,
const int16_t excess = kMarkExcess, const int16_t excess = kMarkExcess,
const bool MSBfirst = true); const bool MSBfirst = true);
void crudeNoiseFilter(decode_results *results, const uint16_t floor = 0);
bool decodeHash(decode_results *results); bool decodeHash(decode_results *results);
#if (DECODE_NEC || DECODE_SHERWOOD || DECODE_AIWA_RC_T501 || SEND_SANYO) #if (DECODE_NEC || DECODE_SHERWOOD || DECODE_AIWA_RC_T501 || SEND_SANYO)
bool decodeNEC(decode_results *results, uint16_t nbits = kNECBits, bool decodeNEC(decode_results *results, uint16_t offset = kStartOffset,
bool strict = true); const uint16_t nbits = kNECBits, const bool strict = true);
#endif #endif
#if DECODE_ARGO #if DECODE_ARGO
bool decodeArgo(decode_results *results, const uint16_t nbits = kArgoBits, bool decodeArgo(decode_results *results, uint16_t offset = kStartOffset,
const bool strict = true); const uint16_t nbits = kArgoBits, const bool strict = true);
#endif // DECODE_ARGO #endif // DECODE_ARGO
#if DECODE_SONY #if DECODE_SONY
bool decodeSony(decode_results *results, uint16_t nbits = kSonyMinBits, bool decodeSony(decode_results *results, uint16_t offset = kStartOffset,
bool strict = false); const uint16_t nbits = kSonyMinBits,
const bool strict = false);
#endif #endif
#if DECODE_SANYO #if DECODE_SANYO
// DISABLED due to poor quality. // DISABLED due to poor quality.
// bool decodeSanyo(decode_results *results, // bool decodeSanyo(decode_results *results, uint16_t offset = kStartOffset,
// uint16_t nbits = kSanyoSA8650BBits, // uint16_t nbits = kSanyoSA8650BBits,
// bool strict = false); // bool strict = false);
bool decodeSanyoLC7461(decode_results *results, bool decodeSanyoLC7461(decode_results *results,
uint16_t nbits = kSanyoLC7461Bits, bool strict = true); uint16_t offset = kStartOffset,
const uint16_t nbits = kSanyoLC7461Bits,
bool strict = true);
#endif #endif
#if DECODE_MITSUBISHI #if DECODE_MITSUBISHI
bool decodeMitsubishi(decode_results *results, bool decodeMitsubishi(decode_results *results, uint16_t offset = kStartOffset,
uint16_t nbits = kMitsubishiBits, bool strict = true); const uint16_t nbits = kMitsubishiBits,
const bool strict = true);
#endif #endif
#if DECODE_MITSUBISHI2 #if DECODE_MITSUBISHI2
bool decodeMitsubishi2(decode_results *results, bool decodeMitsubishi2(decode_results *results,
uint16_t nbits = kMitsubishiBits, bool strict = true); uint16_t offset = kStartOffset,
const uint16_t nbits = kMitsubishiBits,
const bool strict = true);
#endif #endif
#if DECODE_MITSUBISHI_AC #if DECODE_MITSUBISHI_AC
bool decodeMitsubishiAC(decode_results *results, bool decodeMitsubishiAC(decode_results *results,
uint16_t nbits = kMitsubishiACBits, uint16_t offset = kStartOffset,
bool strict = false); const uint16_t nbits = kMitsubishiACBits,
const bool strict = false);
#endif #endif
#if DECODE_MITSUBISHI136 #if DECODE_MITSUBISHI136
bool decodeMitsubishi136(decode_results *results, bool decodeMitsubishi136(decode_results *results,
uint16_t offset = kStartOffset,
const uint16_t nbits = kMitsubishi136Bits, const uint16_t nbits = kMitsubishi136Bits,
const bool strict = true); const bool strict = true);
#endif #endif
#if DECODE_MITSUBISHI112 #if DECODE_MITSUBISHI112
bool decodeMitsubishi112(decode_results *results, bool decodeMitsubishi112(decode_results *results,
uint16_t offset = kStartOffset,
const uint16_t nbits = kMitsubishi112Bits, const uint16_t nbits = kMitsubishi112Bits,
const bool strict = true); const bool strict = true);
#endif #endif
#if DECODE_MITSUBISHIHEAVY #if DECODE_MITSUBISHIHEAVY
bool decodeMitsubishiHeavy(decode_results *results, const uint16_t nbits, bool decodeMitsubishiHeavy(decode_results *results,
uint16_t offset = kStartOffset,
const uint16_t nbits = kMitsubishiHeavy152Bits,
const bool strict = true); const bool strict = true);
#endif #endif
#if (DECODE_RC5 || DECODE_R6 || DECODE_LASERTAG || DECODE_MWM) #if (DECODE_RC5 || DECODE_R6 || DECODE_LASERTAG || DECODE_MWM)
@ -275,236 +288,276 @@ class IRrecv {
uint8_t maxwidth = 3); uint8_t maxwidth = 3);
#endif #endif
#if DECODE_RC5 #if DECODE_RC5
bool decodeRC5(decode_results *results, uint16_t nbits = kRC5XBits, bool decodeRC5(decode_results *results, uint16_t offset = kStartOffset,
bool strict = true); const uint16_t nbits = kRC5XBits,
const bool strict = true);
#endif #endif
#if DECODE_RC6 #if DECODE_RC6
bool decodeRC6(decode_results *results, uint16_t nbits = kRC6Mode0Bits, bool decodeRC6(decode_results *results, uint16_t offset = kStartOffset,
bool strict = false); const uint16_t nbits = kRC6Mode0Bits,
const bool strict = false);
#endif #endif
#if DECODE_RCMM #if DECODE_RCMM
bool decodeRCMM(decode_results *results, uint16_t nbits = kRCMMBits, bool decodeRCMM(decode_results *results, uint16_t offset = kStartOffset,
bool strict = false); const uint16_t nbits = kRCMMBits,
const bool strict = false);
#endif #endif
#if (DECODE_PANASONIC || DECODE_DENON) #if (DECODE_PANASONIC || DECODE_DENON)
bool decodePanasonic(decode_results *results, bool decodePanasonic(decode_results *results, uint16_t offset = kStartOffset,
const uint16_t nbits = kPanasonicBits, const uint16_t nbits = kPanasonicBits,
const bool strict = false, const bool strict = false,
const uint32_t manufacturer = kPanasonicManufacturer); const uint32_t manufacturer = kPanasonicManufacturer);
#endif #endif
#if DECODE_LG #if DECODE_LG
bool decodeLG(decode_results *results, uint16_t nbits = kLgBits, bool decodeLG(decode_results *results, uint16_t offset = kStartOffset,
bool strict = false); const uint16_t nbits = kLgBits,
const bool strict = false);
#endif #endif
#if DECODE_INAX #if DECODE_INAX
bool decodeInax(decode_results *results, const uint16_t nbits = kInaxBits, bool decodeInax(decode_results *results, uint16_t offset = kStartOffset,
const uint16_t nbits = kInaxBits,
const bool strict = true); const bool strict = true);
#endif // DECODE_INAX #endif // DECODE_INAX
#if DECODE_JVC #if DECODE_JVC
bool decodeJVC(decode_results *results, uint16_t nbits = kJvcBits, bool decodeJVC(decode_results *results, uint16_t offset = kStartOffset,
bool strict = true); const uint16_t nbits = kJvcBits,
const bool strict = true);
#endif #endif
#if DECODE_SAMSUNG #if DECODE_SAMSUNG
bool decodeSAMSUNG(decode_results *results, bool decodeSAMSUNG(decode_results *results, uint16_t offset = kStartOffset,
const uint16_t nbits = kSamsungBits, const uint16_t nbits = kSamsungBits,
const bool strict = true); const bool strict = true);
#endif #endif
#if DECODE_SAMSUNG #if DECODE_SAMSUNG
bool decodeSamsung36(decode_results *results, bool decodeSamsung36(decode_results *results, uint16_t offset = kStartOffset,
const uint16_t nbits = kSamsung36Bits, const uint16_t nbits = kSamsung36Bits,
const bool strict = true); const bool strict = true);
#endif #endif
#if DECODE_SAMSUNG_AC #if DECODE_SAMSUNG_AC
bool decodeSamsungAC(decode_results *results, bool decodeSamsungAC(decode_results *results, uint16_t offset = kStartOffset,
const uint16_t nbits = kSamsungAcBits, const uint16_t nbits = kSamsungAcBits,
const bool strict = true); const bool strict = true);
#endif #endif
#if DECODE_WHYNTER #if DECODE_WHYNTER
bool decodeWhynter(decode_results *results, uint16_t nbits = kWhynterBits, bool decodeWhynter(decode_results *results, uint16_t offset = kStartOffset,
bool strict = true); const uint16_t nbits = kWhynterBits,
const bool strict = true);
#endif #endif
#if DECODE_COOLIX #if DECODE_COOLIX
bool decodeCOOLIX(decode_results *results, uint16_t nbits = kCoolixBits, bool decodeCOOLIX(decode_results *results, uint16_t offset = kStartOffset,
bool strict = true); const uint16_t nbits = kCoolixBits,
const bool strict = true);
#endif #endif
#if DECODE_DENON #if DECODE_DENON
bool decodeDenon(decode_results *results, uint16_t nbits = kDenonBits, bool decodeDenon(decode_results *results, uint16_t offset = kStartOffset,
bool strict = true); const uint16_t nbits = kDenonBits,
const bool strict = true);
#endif #endif
#if DECODE_DISH #if DECODE_DISH
bool decodeDISH(decode_results *results, uint16_t nbits = kDishBits, bool decodeDISH(decode_results *results, uint16_t offset = kStartOffset,
bool strict = true); const uint16_t nbits = kDishBits,
const bool strict = true);
#endif #endif
#if (DECODE_SHARP || DECODE_DENON) #if (DECODE_SHARP || DECODE_DENON)
bool decodeSharp(decode_results *results, const uint16_t nbits = kSharpBits, bool decodeSharp(decode_results *results, uint16_t offset = kStartOffset,
const uint16_t nbits = kSharpBits,
const bool strict = true, const bool expansion = true); const bool strict = true, const bool expansion = true);
#endif #endif
#if DECODE_SHARP_AC #if DECODE_SHARP_AC
bool decodeSharpAc(decode_results *results, bool decodeSharpAc(decode_results *results, uint16_t offset = kStartOffset,
const uint16_t nbits = kSharpAcBits, const uint16_t nbits = kSharpAcBits,
const bool strict = true); const bool strict = true);
#endif #endif
#if DECODE_AIWA_RC_T501 #if DECODE_AIWA_RC_T501
bool decodeAiwaRCT501(decode_results *results, bool decodeAiwaRCT501(decode_results *results, uint16_t offset = kStartOffset,
uint16_t nbits = kAiwaRcT501Bits, bool strict = true); const uint16_t nbits = kAiwaRcT501Bits,
const bool strict = true);
#endif #endif
#if DECODE_NIKAI #if DECODE_NIKAI
bool decodeNikai(decode_results *results, uint16_t nbits = kNikaiBits, bool decodeNikai(decode_results *results, uint16_t offset = kStartOffset,
bool strict = true); const uint16_t nbits = kNikaiBits,
const bool strict = true);
#endif #endif
#if DECODE_MAGIQUEST #if DECODE_MAGIQUEST
bool decodeMagiQuest(decode_results *results, uint16_t nbits = kMagiquestBits, bool decodeMagiQuest(decode_results *results, uint16_t offset = kStartOffset,
bool strict = true); const uint16_t nbits = kMagiquestBits,
const bool strict = true);
#endif #endif
#if DECODE_KELVINATOR #if DECODE_KELVINATOR
bool decodeKelvinator(decode_results *results, bool decodeKelvinator(decode_results *results, uint16_t offset = kStartOffset,
uint16_t nbits = kKelvinatorBits, bool strict = true); const uint16_t nbits = kKelvinatorBits,
const bool strict = true);
#endif #endif
#if DECODE_DAIKIN #if DECODE_DAIKIN
bool decodeDaikin(decode_results *results, const uint16_t nbits = kDaikinBits, bool decodeDaikin(decode_results *results, uint16_t offset = kStartOffset,
const uint16_t nbits = kDaikinBits,
const bool strict = true); const bool strict = true);
#endif #endif
#if DECODE_DAIKIN128 #if DECODE_DAIKIN128
bool decodeDaikin128(decode_results *results, bool decodeDaikin128(decode_results *results, uint16_t offset = kStartOffset,
const uint16_t nbits = kDaikin128Bits, const uint16_t nbits = kDaikin128Bits,
const bool strict = true); const bool strict = true);
#endif // DECODE_DAIKIN128 #endif // DECODE_DAIKIN128
#if DECODE_DAIKIN152 #if DECODE_DAIKIN152
bool decodeDaikin152(decode_results *results, bool decodeDaikin152(decode_results *results, uint16_t offset = kStartOffset,
const uint16_t nbits = kDaikin152Bits, const uint16_t nbits = kDaikin152Bits,
const bool strict = true); const bool strict = true);
#endif // DECODE_DAIKIN152 #endif // DECODE_DAIKIN152
#if DECODE_DAIKIN160 #if DECODE_DAIKIN160
bool decodeDaikin160(decode_results *results, bool decodeDaikin160(decode_results *results, uint16_t offset = kStartOffset,
const uint16_t nbits = kDaikin160Bits, const uint16_t nbits = kDaikin160Bits,
const bool strict = true); const bool strict = true);
#endif // DECODE_DAIKIN160 #endif // DECODE_DAIKIN160
#if DECODE_DAIKIN176 #if DECODE_DAIKIN176
bool decodeDaikin176(decode_results *results, bool decodeDaikin176(decode_results *results, uint16_t offset = kStartOffset,
const uint16_t nbits = kDaikin176Bits, const uint16_t nbits = kDaikin176Bits,
const bool strict = true); const bool strict = true);
#endif // DECODE_DAIKIN176 #endif // DECODE_DAIKIN176
#if DECODE_DAIKIN2 #if DECODE_DAIKIN2
bool decodeDaikin2(decode_results *results, uint16_t nbits = kDaikin2Bits, bool decodeDaikin2(decode_results *results, uint16_t offset = kStartOffset,
bool strict = true); const uint16_t nbits = kDaikin2Bits,
const bool strict = true);
#endif #endif
#if DECODE_DAIKIN216 #if DECODE_DAIKIN216
bool decodeDaikin216(decode_results *results, bool decodeDaikin216(decode_results *results, uint16_t offset = kStartOffset,
const uint16_t nbits = kDaikin216Bits, const uint16_t nbits = kDaikin216Bits,
const bool strict = true); const bool strict = true);
#endif #endif
#if DECODE_TOSHIBA_AC #if DECODE_TOSHIBA_AC
bool decodeToshibaAC(decode_results *results, bool decodeToshibaAC(decode_results *results, uint16_t offset = kStartOffset,
const uint16_t nbytes = kToshibaACBits, const uint16_t nbytes = kToshibaACBits,
const bool strict = true); const bool strict = true);
#endif #endif
#if DECODE_TROTEC #if DECODE_TROTEC
bool decodeTrotec(decode_results *results, const uint16_t nbits = kTrotecBits, bool decodeTrotec(decode_results *results, uint16_t offset = kStartOffset,
const uint16_t nbits = kTrotecBits,
const bool strict = true); const bool strict = true);
#endif // DECODE_TROTEC #endif // DECODE_TROTEC
#if DECODE_MIDEA #if DECODE_MIDEA
bool decodeMidea(decode_results *results, uint16_t nbits = kMideaBits, bool decodeMidea(decode_results *results, uint16_t offset = kStartOffset,
bool strict = true); const uint16_t nbits = kMideaBits,
const bool strict = true);
#endif #endif
#if DECODE_FUJITSU_AC #if DECODE_FUJITSU_AC
bool decodeFujitsuAC(decode_results *results, uint16_t nbits = kFujitsuAcBits, bool decodeFujitsuAC(decode_results *results, uint16_t offset = kStartOffset,
bool strict = false); const uint16_t nbits = kFujitsuAcBits,
const bool strict = false);
#endif #endif
#if DECODE_LASERTAG #if DECODE_LASERTAG
bool decodeLasertag(decode_results *results, uint16_t nbits = kLasertagBits, bool decodeLasertag(decode_results *results, uint16_t offset = kStartOffset,
bool strict = true); const uint16_t nbits = kLasertagBits,
const bool strict = true);
#endif #endif
#if DECODE_CARRIER_AC #if DECODE_CARRIER_AC
bool decodeCarrierAC(decode_results *results, uint16_t nbits = kCarrierAcBits, bool decodeCarrierAC(decode_results *results, uint16_t offset = kStartOffset,
bool strict = true); const uint16_t nbits = kCarrierAcBits,
const bool strict = true);
#endif #endif
#if DECODE_GOODWEATHER #if DECODE_GOODWEATHER
bool decodeGoodweather(decode_results *results, bool decodeGoodweather(decode_results *results,
uint16_t offset = kStartOffset,
const uint16_t nbits = kGoodweatherBits, const uint16_t nbits = kGoodweatherBits,
const bool strict = true); const bool strict = true);
#endif // DECODE_GOODWEATHER #endif // DECODE_GOODWEATHER
#if DECODE_GREE #if DECODE_GREE
bool decodeGree(decode_results *results, uint16_t nbits = kGreeBits, bool decodeGree(decode_results *results, uint16_t offset = kStartOffset,
bool strict = true); const uint16_t nbits = kGreeBits,
const bool strict = true);
#endif #endif
#if (DECODE_HAIER_AC | DECODE_HAIER_AC_YRW02) #if (DECODE_HAIER_AC | DECODE_HAIER_AC_YRW02)
bool decodeHaierAC(decode_results *results, uint16_t nbits = kHaierACBits, bool decodeHaierAC(decode_results *results, uint16_t offset = kStartOffset,
bool strict = true); const uint16_t nbits = kHaierACBits,
const bool strict = true);
#endif #endif
#if DECODE_HAIER_AC_YRW02 #if DECODE_HAIER_AC_YRW02
bool decodeHaierACYRW02(decode_results *results, bool decodeHaierACYRW02(decode_results *results,
uint16_t nbits = kHaierACYRW02Bits, uint16_t offset = kStartOffset,
bool strict = true); const uint16_t nbits = kHaierACYRW02Bits,
const bool strict = true);
#endif #endif
#if (DECODE_HITACHI_AC || DECODE_HITACHI_AC2) #if (DECODE_HITACHI_AC || DECODE_HITACHI_AC2)
bool decodeHitachiAC(decode_results *results, bool decodeHitachiAC(decode_results *results, uint16_t offset = kStartOffset,
const uint16_t nbits = kHitachiAcBits, const uint16_t nbits = kHitachiAcBits,
const bool strict = true); const bool strict = true);
#endif #endif
#if DECODE_HITACHI_AC1 #if DECODE_HITACHI_AC1
bool decodeHitachiAC1(decode_results *results, bool decodeHitachiAC1(decode_results *results, uint16_t offset = kStartOffset,
const uint16_t nbits = kHitachiAc1Bits, const uint16_t nbits = kHitachiAc1Bits,
const bool strict = true); const bool strict = true);
#endif #endif
#if DECODE_HITACHI_AC424 #if DECODE_HITACHI_AC424
bool decodeHitachiAc424(decode_results *results, bool decodeHitachiAc424(decode_results *results,
uint16_t offset = kStartOffset,
const uint16_t nbits = kHitachiAc424Bits, const uint16_t nbits = kHitachiAc424Bits,
const bool strict = true); const bool strict = true);
#endif // DECODE_HITACHI_AC424 #endif // DECODE_HITACHI_AC424
#if DECODE_GICABLE #if DECODE_GICABLE
bool decodeGICable(decode_results *results, uint16_t nbits = kGicableBits, bool decodeGICable(decode_results *results, uint16_t offset = kStartOffset,
bool strict = true); const uint16_t nbits = kGicableBits,
const bool strict = true);
#endif #endif
#if DECODE_WHIRLPOOL_AC #if DECODE_WHIRLPOOL_AC
bool decodeWhirlpoolAC(decode_results *results, bool decodeWhirlpoolAC(decode_results *results,
uint16_t offset = kStartOffset,
const uint16_t nbits = kWhirlpoolAcBits, const uint16_t nbits = kWhirlpoolAcBits,
const bool strict = true); const bool strict = true);
#endif #endif
#if DECODE_LUTRON #if DECODE_LUTRON
bool decodeLutron(decode_results *results, uint16_t nbits = kLutronBits, bool decodeLutron(decode_results *results, uint16_t offset = kStartOffset,
bool strict = true); const uint16_t nbits = kLutronBits,
const bool strict = true);
#endif #endif
#if DECODE_ELECTRA_AC #if DECODE_ELECTRA_AC
bool decodeElectraAC(decode_results *results, uint16_t nbits = kElectraAcBits, bool decodeElectraAC(decode_results *results, uint16_t offset = kStartOffset,
bool strict = true); const uint16_t nbits = kElectraAcBits,
const bool strict = true);
#endif #endif
#if DECODE_PANASONIC_AC #if DECODE_PANASONIC_AC
bool decodePanasonicAC(decode_results *results, bool decodePanasonicAC(decode_results *results,
uint16_t offset = kStartOffset,
const uint16_t nbits = kPanasonicAcBits, const uint16_t nbits = kPanasonicAcBits,
const bool strict = true); const bool strict = true);
#endif #endif
#if DECODE_PIONEER #if DECODE_PIONEER
bool decodePioneer(decode_results *results, bool decodePioneer(decode_results *results, uint16_t offset = kStartOffset,
const uint16_t nbits = kPioneerBits, const uint16_t nbits = kPioneerBits,
const bool strict = true); const bool strict = true);
#endif #endif
#if DECODE_MWM #if DECODE_MWM
bool decodeMWM(decode_results *results, uint16_t nbits = 24, bool decodeMWM(decode_results *results, uint16_t offset = kStartOffset,
bool strict = true); const uint16_t nbits = 24,
const bool strict = true);
#endif #endif
#if DECODE_VESTEL_AC #if DECODE_VESTEL_AC
bool decodeVestelAc(decode_results *results, bool decodeVestelAc(decode_results *results, uint16_t offset = kStartOffset,
const uint16_t nbits = kVestelAcBits, const uint16_t nbits = kVestelAcBits,
const bool strict = true); const bool strict = true);
#endif #endif
#if DECODE_TECO #if DECODE_TECO
bool decodeTeco(decode_results *results, const uint16_t nbits = kTecoBits, bool decodeTeco(decode_results *results, uint16_t offset = kStartOffset,
const uint16_t nbits = kTecoBits,
const bool strict = false); const bool strict = false);
#endif #endif
#if DECODE_LEGOPF #if DECODE_LEGOPF
bool decodeLegoPf(decode_results *results, const uint16_t nbits = kLegoPfBits, bool decodeLegoPf(decode_results *results, uint16_t offset = kStartOffset,
const uint16_t nbits = kLegoPfBits,
const bool strict = true); const bool strict = true);
#endif #endif
#if DECODE_NEOCLIMA #if DECODE_NEOCLIMA
bool decodeNeoclima(decode_results *results, bool decodeNeoclima(decode_results *results, uint16_t offset = kStartOffset,
const uint16_t nbits = kNeoclimaBits, const uint16_t nbits = kNeoclimaBits,
const bool strict = true); const bool strict = true);
#endif // DECODE_NEOCLIMA #endif // DECODE_NEOCLIMA
#if DECODE_AMCOR #if DECODE_AMCOR
bool decodeAmcor(decode_results *results, bool decodeAmcor(decode_results *results, uint16_t offset = kStartOffset,
const uint16_t nbits = kAmcorBits, const uint16_t nbits = kAmcorBits,
const bool strict = true); const bool strict = true);
#endif // DECODE_AMCOR #endif // DECODE_AMCOR
#if DECODE_EPSON
bool decodeEpson(decode_results *results, uint16_t offset = kStartOffset,
const uint16_t nbits = kEpsonBits,
const bool strict = true);
#endif // DECODE_EPSON
}; };
#endif // IRRECV_H_ #endif // IRRECV_H_

View File

@ -52,7 +52,7 @@
#endif // UNIT_TEST #endif // UNIT_TEST
// Library Version // Library Version
#define _IRREMOTEESP8266_VERSION_ "2.7.3" #define _IRREMOTEESP8266_VERSION_ "2.7.4"
// Set the language & locale for the library. See the `locale` dir for options. // Set the language & locale for the library. See the `locale` dir for options.
#ifndef _IR_LOCALE_ #ifndef _IR_LOCALE_
@ -565,6 +565,13 @@
#define SEND_HITACHI_AC424 _IR_ENABLE_DEFAULT_ #define SEND_HITACHI_AC424 _IR_ENABLE_DEFAULT_
#endif // SEND_HITACHI_AC424 #endif // SEND_HITACHI_AC424
#ifndef DECODE_EPSON
#define DECODE_EPSON _IR_ENABLE_DEFAULT_
#endif // DECODE_EPSON
#ifndef SEND_EPSON
#define SEND_EPSON _IR_ENABLE_DEFAULT_
#endif // SEND_EPSON
#if (DECODE_ARGO || DECODE_DAIKIN || DECODE_FUJITSU_AC || DECODE_GREE || \ #if (DECODE_ARGO || DECODE_DAIKIN || DECODE_FUJITSU_AC || DECODE_GREE || \
DECODE_KELVINATOR || DECODE_MITSUBISHI_AC || DECODE_TOSHIBA_AC || \ DECODE_KELVINATOR || DECODE_MITSUBISHI_AC || DECODE_TOSHIBA_AC || \
DECODE_TROTEC || DECODE_HAIER_AC || DECODE_HITACHI_AC || \ DECODE_TROTEC || DECODE_HAIER_AC || DECODE_HITACHI_AC || \
@ -589,6 +596,22 @@
#define ALLOW_DELAY_CALLS true #define ALLOW_DELAY_CALLS true
#endif // ALLOW_DELAY_CALLS #endif // ALLOW_DELAY_CALLS
// Enable a run-time settable high-pass filter on captured data **before**
// trying any protocol decoding.
// i.e. Try to remove/merge any really short pulses detected in the raw data.
// Note: Even when this option is enabled, it is _off_ by default, and requires
// a user who knows what they are doing to enable it.
// The option to disable this feature is here if your project is _really_
// tight on resources. i.e. Saves a small handful of bytes and cpu time.
// WARNING: If you use this feature at runtime, you can no longer trust the
// **raw** data captured. It will now have been slightly **cooked**!
// DANGER: If you set the `noise_floor` value too high, it **WILL** break
// decoding of some protocols. You have been warned. Here Be Dragons!
//
// See: `irrecv::decode()` in IRrecv.cpp for more info.
#ifndef ENABLE_NOISE_FILTER_OPTION
#define ENABLE_NOISE_FILTER_OPTION true
#endif // ENABLE_NOISE_FILTER_OPTION
/* /*
* Always add to the end of the list and should never remove entries * Always add to the end of the list and should never remove entries
* or change order. Projects may save the type number for later usage * or change order. Projects may save the type number for later usage
@ -671,8 +694,9 @@ enum decode_type_t {
MITSUBISHI112, MITSUBISHI112,
HITACHI_AC424, HITACHI_AC424,
SONY_38K, SONY_38K,
EPSON, // 75
// Add new entries before this one, and update it to point to the last entry. // Add new entries before this one, and update it to point to the last entry.
kLastDecodeType = SONY_38K, kLastDecodeType = EPSON,
}; };
// Message lengths & required repeat values // Message lengths & required repeat values
@ -720,6 +744,8 @@ const uint16_t kDenon48Bits = 48;
const uint16_t kDenonLegacyBits = 14; const uint16_t kDenonLegacyBits = 14;
const uint16_t kDishBits = 16; const uint16_t kDishBits = 16;
const uint16_t kDishMinRepeat = 3; const uint16_t kDishMinRepeat = 3;
const uint16_t kEpsonBits = 32;
const uint16_t kEpsonMinRepeat = 2;
const uint16_t kElectraAcStateLength = 13; const uint16_t kElectraAcStateLength = 13;
const uint16_t kElectraAcBits = kElectraAcStateLength * 8; const uint16_t kElectraAcBits = kElectraAcStateLength * 8;
const uint16_t kElectraAcMinRepeat = kNoRepeat; const uint16_t kElectraAcMinRepeat = kNoRepeat;

View File

@ -477,7 +477,8 @@ void IRsend::sendGeneric(const uint16_t headermark, const uint32_t headerspace,
// //
// Ref: // Ref:
// examples/IRrecvDumpV2/IRrecvDumpV2.ino // examples/IRrecvDumpV2/IRrecvDumpV2.ino
void IRsend::sendRaw(uint16_t buf[], uint16_t len, uint16_t hz) { void IRsend::sendRaw(const uint16_t buf[], const uint16_t len,
const uint16_t hz) {
// Set IR carrier frequency // Set IR carrier frequency
enableIROut(hz); enableIROut(hz);
for (uint16_t i = 0; i < len; i++) { for (uint16_t i = 0; i < len; i++) {
@ -517,6 +518,8 @@ uint16_t IRsend::minRepeats(const decode_type_t protocol) {
return kSonyMinRepeat; return kSonyMinRepeat;
case SONY_38K: case SONY_38K:
return kSonyMinRepeat + 1; return kSonyMinRepeat + 1;
case EPSON:
return kEpsonMinRepeat;
default: default:
return kNoRepeat; return kNoRepeat;
} }
@ -558,6 +561,7 @@ uint16_t IRsend::defaultBits(const decode_type_t protocol) {
case LG2: case LG2:
return 28; return 28;
case CARRIER_AC: case CARRIER_AC:
case EPSON:
case NEC: case NEC:
case NEC_LIKE: case NEC_LIKE:
case SAMSUNG: case SAMSUNG:
@ -687,6 +691,11 @@ bool IRsend::send(const decode_type_t type, const uint64_t data,
sendDISH(data, nbits, min_repeat); sendDISH(data, nbits, min_repeat);
break; break;
#endif #endif
#if SEND_EPSON
case EPSON:
sendEpson(data, nbits, min_repeat);
break;
#endif
#if SEND_GICABLE #if SEND_GICABLE
case GICABLE: case GICABLE:
sendGICable(data, nbits, min_repeat); sendGICable(data, nbits, min_repeat);

View File

@ -158,7 +158,7 @@ class IRsend {
VIRTUAL uint16_t mark(uint16_t usec); VIRTUAL uint16_t mark(uint16_t usec);
VIRTUAL void space(uint32_t usec); VIRTUAL void space(uint32_t usec);
int8_t calibrate(uint16_t hz = 38000U); int8_t calibrate(uint16_t hz = 38000U);
void sendRaw(uint16_t buf[], uint16_t len, uint16_t hz); void sendRaw(const uint16_t buf[], const uint16_t len, const uint16_t hz);
void sendData(uint16_t onemark, uint32_t onespace, uint16_t zeromark, void sendData(uint16_t onemark, uint32_t onespace, uint16_t zeromark,
uint32_t zerospace, uint64_t data, uint16_t nbits, uint32_t zerospace, uint64_t data, uint16_t nbits,
bool MSBfirst = true); bool MSBfirst = true);
@ -535,7 +535,10 @@ class IRsend {
const uint16_t nbytes = kAmcorStateLength, const uint16_t nbytes = kAmcorStateLength,
const uint16_t repeat = kAmcorDefaultRepeat); const uint16_t repeat = kAmcorDefaultRepeat);
#endif // SEND_AMCOR #endif // SEND_AMCOR
#if SEND_EPSON
void sendEpson(uint64_t data, uint16_t nbits = kEpsonBits,
uint16_t repeat = kEpsonMinRepeat);
#endif
protected: protected:
#ifdef UNIT_TEST #ifdef UNIT_TEST

View File

@ -125,6 +125,8 @@ decode_type_t strToDecodeType(const char * const str) {
return decode_type_t::DISH; return decode_type_t::DISH;
else if (!strcasecmp(str, "ELECTRA_AC")) else if (!strcasecmp(str, "ELECTRA_AC"))
return decode_type_t::ELECTRA_AC; return decode_type_t::ELECTRA_AC;
else if (!strcasecmp(str, "EPSON"))
return decode_type_t::EPSON;
else if (!strcasecmp(str, "FUJITSU_AC")) else if (!strcasecmp(str, "FUJITSU_AC"))
return decode_type_t::FUJITSU_AC; return decode_type_t::FUJITSU_AC;
else if (!strcasecmp(str, "GICABLE")) else if (!strcasecmp(str, "GICABLE"))
@ -310,6 +312,9 @@ String typeToString(const decode_type_t protocol, const bool isRepeat) {
case ELECTRA_AC: case ELECTRA_AC:
result = F("ELECTRA_AC"); result = F("ELECTRA_AC");
break; break;
case EPSON:
result = F("EPSON");
break;
case FUJITSU_AC: case FUJITSU_AC:
result = F("FUJITSU_AC"); result = F("FUJITSU_AC");
break; break;

View File

@ -53,6 +53,8 @@ void IRsend::sendAiwaRCT501(uint64_t data, uint16_t nbits, uint16_t repeat) {
// //
// Args: // Args:
// results: Ptr to the data to decode and where to store the decode result. // results: Ptr to the data to decode and where to store the decode result.
// offset: The starting index to use when attempting to decode the raw data.
// Typically/Defaults to kStartOffset.
// nbits: The number of data bits to expect. Typically kAiwaRcT501Bits. // nbits: The number of data bits to expect. Typically kAiwaRcT501Bits.
// strict: Flag indicating if we should perform strict matching. // strict: Flag indicating if we should perform strict matching.
// Returns: // Returns:
@ -69,8 +71,8 @@ void IRsend::sendAiwaRCT501(uint64_t data, uint16_t nbits, uint16_t repeat) {
// //
// Ref: // Ref:
// http://www.sbprojects.com/knowledge/ir/nec.php // http://www.sbprojects.com/knowledge/ir/nec.php
bool IRrecv::decodeAiwaRCT501(decode_results *results, uint16_t nbits, bool IRrecv::decodeAiwaRCT501(decode_results *results, uint16_t offset,
bool strict) { const uint16_t nbits, const bool strict) {
// Compliance // Compliance
if (strict && nbits != kAiwaRcT501Bits) if (strict && nbits != kAiwaRcT501Bits)
return false; // Doesn't match our protocol defn. return false; // Doesn't match our protocol defn.
@ -82,7 +84,7 @@ bool IRrecv::decodeAiwaRCT501(decode_results *results, uint16_t nbits,
return false; // We can't possibly match something that big. return false; // We can't possibly match something that big.
// Decode it as a much bigger (non-standard) NEC message, so we have to turn // Decode it as a much bigger (non-standard) NEC message, so we have to turn
// off strict mode checking for NEC. // off strict mode checking for NEC.
if (!decodeNEC(results, expected_nbits, false)) if (!decodeNEC(results, offset, expected_nbits, false))
return false; // The NEC decode had a problem, so we should too. return false; // The NEC decode had a problem, so we should too.
uint16_t actual_bits = results->bits; uint16_t actual_bits = results->bits;
new_data = results->value; new_data = results->value;

View File

@ -56,6 +56,8 @@ void IRsend::sendAmcor(const unsigned char data[], const uint16_t nbytes,
// Decode the supplied Amcor HVAC message. // Decode the supplied Amcor HVAC message.
// Args: // Args:
// results: Ptr to the data to decode and where to store the decode result. // results: Ptr to the data to decode and where to store the decode result.
// offset: The starting index to use when attempting to decode the raw data.
// Typically/Defaults to kStartOffset.
// nbits: Nr. of bits to expect in the data portion. // nbits: Nr. of bits to expect in the data portion.
// Typically kAmcorBits. // Typically kAmcorBits.
// strict: Flag to indicate if we strictly adhere to the specification. // strict: Flag to indicate if we strictly adhere to the specification.
@ -64,15 +66,13 @@ void IRsend::sendAmcor(const unsigned char data[], const uint16_t nbytes,
// //
// Status: STABLE / Reported as working. // Status: STABLE / Reported as working.
// //
bool IRrecv::decodeAmcor(decode_results *results, uint16_t nbits, bool IRrecv::decodeAmcor(decode_results *results, uint16_t offset,
bool strict) { const uint16_t nbits, const bool strict) {
if (results->rawlen < 2 * nbits + kHeader - 1) if (results->rawlen <= 2 * nbits + kHeader - 1 + offset)
return false; // Can't possibly be a valid Amcor message. return false; // Can't possibly be a valid Amcor message.
if (strict && nbits != kAmcorBits) if (strict && nbits != kAmcorBits)
return false; // We expect Amcor to be 64 bits of message. return false; // We expect Amcor to be 64 bits of message.
uint16_t offset = kStartOffset;
uint16_t used; uint16_t used;
// Header + Data Block (64 bits) + Footer // Header + Data Block (64 bits) + Footer
used = matchGeneric(results->rawbuf + offset, results->state, used = matchGeneric(results->rawbuf + offset, results->state,

View File

@ -378,6 +378,8 @@ String IRArgoAC::toString(void) {
// //
// Args: // Args:
// results: Ptr to the data to decode and where to store the decode result. // results: Ptr to the data to decode and where to store the decode result.
// offset: The starting index to use when attempting to decode the raw data.
// Typically/Defaults to kStartOffset.
// nbits: The number of data bits to expect. Typically kArgoBits. // nbits: The number of data bits to expect. Typically kArgoBits.
// strict: Flag indicating if we should perform strict matching. // strict: Flag indicating if we should perform strict matching.
// Returns: // Returns:
@ -388,12 +390,11 @@ String IRArgoAC::toString(void) {
// Note: // Note:
// This decoder is based soley off sendArgo(). We have no actual captures // This decoder is based soley off sendArgo(). We have no actual captures
// to test this against. If you have one of these units, please let us know. // to test this against. If you have one of these units, please let us know.
bool IRrecv::decodeArgo(decode_results *results, const uint16_t nbits, bool IRrecv::decodeArgo(decode_results *results, uint16_t offset,
const uint16_t nbits,
const bool strict) { const bool strict) {
if (strict && nbits != kArgoBits) return false; if (strict && nbits != kArgoBits) return false;
uint16_t offset = kStartOffset;
// Match Header + Data // Match Header + Data
if (!matchGeneric(results->rawbuf + offset, results->state, if (!matchGeneric(results->rawbuf + offset, results->state,
results->rawlen - offset, nbits, results->rawlen - offset, nbits,

View File

@ -53,6 +53,8 @@ void IRsend::sendCarrierAC(uint64_t data, uint16_t nbits, uint16_t repeat) {
// i.e. normal + inverted + normal // i.e. normal + inverted + normal
// Args: // Args:
// results: Ptr to the data to decode and where to store the decode result. // results: Ptr to the data to decode and where to store the decode result.
// offset: The starting index to use when attempting to decode the raw data.
// Typically/Defaults to kStartOffset.
// nbits: Nr. of bits to expect in the data portion. // nbits: Nr. of bits to expect in the data portion.
// Typically kCarrierAcBits. // Typically kCarrierAcBits.
// strict: Flag to indicate if we strictly adhere to the specification. // strict: Flag to indicate if we strictly adhere to the specification.
@ -61,16 +63,15 @@ void IRsend::sendCarrierAC(uint64_t data, uint16_t nbits, uint16_t repeat) {
// //
// Status: ALPHA / Untested. // Status: ALPHA / Untested.
// //
bool IRrecv::decodeCarrierAC(decode_results *results, uint16_t nbits, bool IRrecv::decodeCarrierAC(decode_results *results, uint16_t offset,
bool strict) { const uint16_t nbits, const bool strict) {
if (results->rawlen < ((2 * nbits + kHeader + kFooter) * 3) - 1) if (results->rawlen < ((2 * nbits + kHeader + kFooter) * 3) - 1 + offset)
return false; // Can't possibly be a valid Carrier message. return false; // Can't possibly be a valid Carrier message.
if (strict && nbits != kCarrierAcBits) if (strict && nbits != kCarrierAcBits)
return false; // We expect Carrier to be 32 bits of message. return false; // We expect Carrier to be 32 bits of message.
uint64_t data = 0; uint64_t data = 0;
uint64_t prev_data = 0; uint64_t prev_data = 0;
uint16_t offset = kStartOffset;
for (uint8_t i = 0; i < 3; i++) { for (uint8_t i = 0; i < 3; i++) {
prev_data = data; prev_data = data;

View File

@ -130,6 +130,7 @@ void IRCoolixAC::send(const uint16_t repeat) {
uint32_t IRCoolixAC::getRaw() { return remote_state; } uint32_t IRCoolixAC::getRaw() { return remote_state; }
void IRCoolixAC::setRaw(const uint32_t new_code) { void IRCoolixAC::setRaw(const uint32_t new_code) {
powerFlag = true; // Everything that is not the special power off mesg is On.
if (!handleSpecialState(new_code)) { if (!handleSpecialState(new_code)) {
// it isn`t special so might affect Temp|mode|Fan // it isn`t special so might affect Temp|mode|Fan
if (new_code == kCoolixCmdFan) { if (new_code == kCoolixCmdFan) {
@ -578,17 +579,19 @@ String IRCoolixAC::toString(void) {
// //
// Args: // Args:
// results: Ptr to the data to decode and where to store the decode result. // results: Ptr to the data to decode and where to store the decode result.
// offset: The starting index to use when attempting to decode the raw data.
// Typically/Defaults to kStartOffset.
// nbits: The number of data bits to expect. Typically kCoolixBits. // nbits: The number of data bits to expect. Typically kCoolixBits.
// strict: Flag indicating if we should perform strict matching. // strict: Flag indicating if we should perform strict matching.
// Returns: // Returns:
// boolean: True if it can decode it, false if it can't. // boolean: True if it can decode it, false if it can't.
// //
// Status: BETA / Probably working. // Status: BETA / Probably working.
bool IRrecv::decodeCOOLIX(decode_results *results, uint16_t nbits, bool IRrecv::decodeCOOLIX(decode_results *results, uint16_t offset,
bool strict) { const uint16_t nbits, const bool strict) {
// The protocol sends the data normal + inverted, alternating on // The protocol sends the data normal + inverted, alternating on
// each byte. Hence twice the number of expected data bits. // each byte. Hence twice the number of expected data bits.
if (results->rawlen < 2 * 2 * nbits + kHeader + kFooter - 1) if (results->rawlen <= 2 * 2 * nbits + kHeader + kFooter - 1 + offset)
return false; // Can't possibly be a valid COOLIX message. return false; // Can't possibly be a valid COOLIX message.
if (strict && nbits != kCoolixBits) if (strict && nbits != kCoolixBits)
return false; // Not strictly a COOLIX message. return false; // Not strictly a COOLIX message.
@ -597,7 +600,6 @@ bool IRrecv::decodeCOOLIX(decode_results *results, uint16_t nbits,
uint64_t data = 0; uint64_t data = 0;
uint64_t inverted = 0; uint64_t inverted = 0;
uint16_t offset = kStartOffset;
if (nbits > sizeof(data) * 8) if (nbits > sizeof(data) * 8)
return false; // We can't possibly capture a Coolix packet that big. return false; // We can't possibly capture a Coolix packet that big.

View File

@ -513,6 +513,8 @@ String IRDaikinESP::toString(void) {
// Decode the supplied Daikin A/C message. // Decode the supplied Daikin A/C message.
// Args: // Args:
// results: Ptr to the data to decode and where to store the decode result. // results: Ptr to the data to decode and where to store the decode result.
// offset: The starting index to use when attempting to decode the raw data.
// Typically/Defaults to kStartOffset.
// nbits: Nr. of bits to expect in the data portion. (kDaikinBits) // nbits: Nr. of bits to expect in the data portion. (kDaikinBits)
// strict: Flag to indicate if we strictly adhere to the specification. // strict: Flag to indicate if we strictly adhere to the specification.
// Returns: // Returns:
@ -522,17 +524,17 @@ String IRDaikinESP::toString(void) {
// //
// Ref: // Ref:
// https://github.com/mharizanov/Daikin-AC-remote-control-over-the-Internet/tree/master/IRremote // https://github.com/mharizanov/Daikin-AC-remote-control-over-the-Internet/tree/master/IRremote
bool IRrecv::decodeDaikin(decode_results *results, const uint16_t nbits, bool IRrecv::decodeDaikin(decode_results *results, uint16_t offset,
const bool strict) { const uint16_t nbits, const bool strict) {
// Is there enough data to match successfully? // Is there enough data to match successfully?
if (results->rawlen < (2 * (nbits + kDaikinHeaderLength) + if (results->rawlen < (2 * (nbits + kDaikinHeaderLength) +
kDaikinSections * (kHeader + kFooter) + kFooter - 1)) kDaikinSections * (kHeader + kFooter) + kFooter - 1) +
offset)
return false; return false;
// Compliance // Compliance
if (strict && nbits != kDaikinBits) return false; if (strict && nbits != kDaikinBits) return false;
uint16_t offset = kStartOffset;
match_result_t data_result; match_result_t data_result;
// Header #1 - Doesn't count as data. // Header #1 - Doesn't count as data.
@ -1206,6 +1208,8 @@ String IRDaikin2::toString(void) {
// Decode the supplied Daikin2 A/C message. // Decode the supplied Daikin2 A/C message.
// Args: // Args:
// results: Ptr to the data to decode and where to store the decode result. // results: Ptr to the data to decode and where to store the decode result.
// offset: The starting index to use when attempting to decode the raw data.
// Typically/Defaults to kStartOffset.
// nbits: Nr. of bits to expect in the data portion. (kDaikin2Bits) // nbits: Nr. of bits to expect in the data portion. (kDaikin2Bits)
// strict: Flag to indicate if we strictly adhere to the specification. // strict: Flag to indicate if we strictly adhere to the specification.
// Returns: // Returns:
@ -1219,15 +1223,14 @@ String IRDaikin2::toString(void) {
// //
// Ref: // Ref:
// https://github.com/mharizanov/Daikin-AC-remote-control-over-the-Internet/tree/master/IRremote // https://github.com/mharizanov/Daikin-AC-remote-control-over-the-Internet/tree/master/IRremote
bool IRrecv::decodeDaikin2(decode_results *results, uint16_t nbits, bool IRrecv::decodeDaikin2(decode_results *results, uint16_t offset,
bool strict) { const uint16_t nbits, const bool strict) {
if (results->rawlen < 2 * (nbits + kHeader + kFooter) + kHeader - 1) if (results->rawlen < 2 * (nbits + kHeader + kFooter) + kHeader - 1 + offset)
return false; return false;
// Compliance // Compliance
if (strict && nbits != kDaikin2Bits) return false; if (strict && nbits != kDaikin2Bits) return false;
uint16_t offset = kStartOffset;
const uint8_t ksectionSize[kDaikin2Sections] = {kDaikin2Section1Length, const uint8_t ksectionSize[kDaikin2Sections] = {kDaikin2Section1Length,
kDaikin2Section2Length}; kDaikin2Section2Length};
@ -1552,6 +1555,8 @@ String IRDaikin216::toString(void) {
// Decode the supplied Daikin 216 bit A/C message. // Decode the supplied Daikin 216 bit A/C message.
// Args: // Args:
// results: Ptr to the data to decode and where to store the decode result. // results: Ptr to the data to decode and where to store the decode result.
// offset: The starting index to use when attempting to decode the raw data.
// Typically/Defaults to kStartOffset.
// nbits: Nr. of bits to expect in the data portion. (kDaikin216Bits) // nbits: Nr. of bits to expect in the data portion. (kDaikin216Bits)
// strict: Flag to indicate if we strictly adhere to the specification. // strict: Flag to indicate if we strictly adhere to the specification.
// Returns: // Returns:
@ -1565,15 +1570,14 @@ String IRDaikin216::toString(void) {
// Ref: // Ref:
// https://github.com/crankyoldgit/IRremoteESP8266/issues/689 // https://github.com/crankyoldgit/IRremoteESP8266/issues/689
// https://github.com/danny-source/Arduino_DY_IRDaikin // https://github.com/danny-source/Arduino_DY_IRDaikin
bool IRrecv::decodeDaikin216(decode_results *results, const uint16_t nbits, bool IRrecv::decodeDaikin216(decode_results *results, uint16_t offset,
const bool strict) { const uint16_t nbits, const bool strict) {
if (results->rawlen < 2 * (nbits + kHeader + kFooter) - 1) if (results->rawlen < 2 * (nbits + kHeader + kFooter) - 1 + offset)
return false; return false;
// Compliance // Compliance
if (strict && nbits != kDaikin216Bits) return false; if (strict && nbits != kDaikin216Bits) return false;
uint16_t offset = kStartOffset;
const uint8_t ksectionSize[kDaikin216Sections] = {kDaikin216Section1Length, const uint8_t ksectionSize[kDaikin216Sections] = {kDaikin216Section1Length,
kDaikin216Section2Length}; kDaikin216Section2Length};
// Sections // Sections
@ -1905,6 +1909,8 @@ String IRDaikin160::toString(void) {
// Decode the supplied Daikin 160 bit A/C message. // Decode the supplied Daikin 160 bit A/C message.
// Args: // Args:
// results: Ptr to the data to decode and where to store the decode result. // results: Ptr to the data to decode and where to store the decode result.
// offset: The starting index to use when attempting to decode the raw data.
// Typically/Defaults to kStartOffset.
// nbits: Nr. of bits to expect in the data portion. (kDaikin160Bits) // nbits: Nr. of bits to expect in the data portion. (kDaikin160Bits)
// strict: Flag to indicate if we strictly adhere to the specification. // strict: Flag to indicate if we strictly adhere to the specification.
// Returns: // Returns:
@ -1917,15 +1923,14 @@ String IRDaikin160::toString(void) {
// //
// Ref: // Ref:
// https://github.com/crankyoldgit/IRremoteESP8266/issues/731 // https://github.com/crankyoldgit/IRremoteESP8266/issues/731
bool IRrecv::decodeDaikin160(decode_results *results, const uint16_t nbits, bool IRrecv::decodeDaikin160(decode_results *results, uint16_t offset,
const bool strict) { const uint16_t nbits, const bool strict) {
if (results->rawlen < 2 * (nbits + kHeader + kFooter) - 1) if (results->rawlen < 2 * (nbits + kHeader + kFooter) - 1 + offset)
return false; return false;
// Compliance // Compliance
if (strict && nbits != kDaikin160Bits) return false; if (strict && nbits != kDaikin160Bits) return false;
uint16_t offset = kStartOffset;
const uint8_t ksectionSize[kDaikin160Sections] = {kDaikin160Section1Length, const uint8_t ksectionSize[kDaikin160Sections] = {kDaikin160Section1Length,
kDaikin160Section2Length}; kDaikin160Section2Length};
@ -2268,6 +2273,8 @@ String IRDaikin176::toString(void) {
// Decode the supplied Daikin 176 bit A/C message. // Decode the supplied Daikin 176 bit A/C message.
// Args: // Args:
// results: Ptr to the data to decode and where to store the decode result. // results: Ptr to the data to decode and where to store the decode result.
// offset: The starting index to use when attempting to decode the raw data.
// Typically/Defaults to kStartOffset.
// nbits: Nr. of bits to expect in the data portion. (kDaikin176Bits) // nbits: Nr. of bits to expect in the data portion. (kDaikin176Bits)
// strict: Flag to indicate if we strictly adhere to the specification. // strict: Flag to indicate if we strictly adhere to the specification.
// Returns: // Returns:
@ -2279,15 +2286,15 @@ String IRDaikin176::toString(void) {
// Status: BETA / Probably works. // Status: BETA / Probably works.
// //
bool IRrecv::decodeDaikin176(decode_results *results, const uint16_t nbits, bool IRrecv::decodeDaikin176(decode_results *results, uint16_t offset,
const uint16_t nbits,
const bool strict) { const bool strict) {
if (results->rawlen < 2 * (nbits + kHeader + kFooter) - 1) if (results->rawlen < 2 * (nbits + kHeader + kFooter) - 1 + offset)
return false; return false;
// Compliance // Compliance
if (strict && nbits != kDaikin176Bits) return false; if (strict && nbits != kDaikin176Bits) return false;
uint16_t offset = kStartOffset;
const uint8_t ksectionSize[kDaikin176Sections] = {kDaikin176Section1Length, const uint8_t ksectionSize[kDaikin176Sections] = {kDaikin176Section1Length,
kDaikin176Section2Length}; kDaikin176Section2Length};
@ -2762,6 +2769,8 @@ stdAc::state_t IRDaikin128::toCommon(const stdAc::state_t *prev) {
// Decode the supplied Daikin 128 bit A/C message. // Decode the supplied Daikin 128 bit A/C message.
// Args: // Args:
// results: Ptr to the data to decode and where to store the decode result. // results: Ptr to the data to decode and where to store the decode result.
// offset: The starting index to use when attempting to decode the raw data.
// Typically/Defaults to kStartOffset.
// nbits: Nr. of bits to expect in the data portion. (kDaikin128Bits) // nbits: Nr. of bits to expect in the data portion. (kDaikin128Bits)
// strict: Flag to indicate if we strictly adhere to the specification. // strict: Flag to indicate if we strictly adhere to the specification.
// Returns: // Returns:
@ -2773,17 +2782,15 @@ stdAc::state_t IRDaikin128::toCommon(const stdAc::state_t *prev) {
// Status: STABLE / Known Working. // Status: STABLE / Known Working.
// //
// Ref: https://github.com/crankyoldgit/IRremoteESP8266/issues/827 // Ref: https://github.com/crankyoldgit/IRremoteESP8266/issues/827
bool IRrecv::decodeDaikin128(decode_results *results, const uint16_t nbits, bool IRrecv::decodeDaikin128(decode_results *results, uint16_t offset,
const bool strict) { const uint16_t nbits, const bool strict) {
if (results->rawlen < 2 * (nbits + kHeader) + kFooter - 1) if (results->rawlen < 2 * (nbits + kHeader) + kFooter - 1 + offset)
return false; return false;
if (nbits / 8 <= kDaikin128SectionLength) return false; if (nbits / 8 <= kDaikin128SectionLength) return false;
// Compliance // Compliance
if (strict && nbits != kDaikin128Bits) return false; if (strict && nbits != kDaikin128Bits) return false;
uint16_t offset = kStartOffset;
// Leader // Leader
for (uint8_t i = 0; i < 2; i++) { for (uint8_t i = 0; i < 2; i++) {
if (!matchMark(results->rawbuf[offset++], kDaikin128LeaderMark, if (!matchMark(results->rawbuf[offset++], kDaikin128LeaderMark,
@ -2862,6 +2869,8 @@ void IRsend::sendDaikin152(const unsigned char data[], const uint16_t nbytes,
// Decode the supplied Daikin 152 bit A/C message. // Decode the supplied Daikin 152 bit A/C message.
// Args: // Args:
// results: Ptr to the data to decode and where to store the decode result. // results: Ptr to the data to decode and where to store the decode result.
// offset: The starting index to use when attempting to decode the raw data.
// Typically/Defaults to kStartOffset.
// nbits: Nr. of bits to expect in the data portion. (kDaikin152Bits) // nbits: Nr. of bits to expect in the data portion. (kDaikin152Bits)
// strict: Flag to indicate if we strictly adhere to the specification. // strict: Flag to indicate if we strictly adhere to the specification.
// Returns: // Returns:
@ -2873,16 +2882,15 @@ void IRsend::sendDaikin152(const unsigned char data[], const uint16_t nbytes,
// Status: STABLE / Known working. // Status: STABLE / Known working.
// //
// Ref: https://github.com/crankyoldgit/IRremoteESP8266/issues/873 // Ref: https://github.com/crankyoldgit/IRremoteESP8266/issues/873
bool IRrecv::decodeDaikin152(decode_results *results, const uint16_t nbits, bool IRrecv::decodeDaikin152(decode_results *results, uint16_t offset,
const bool strict) { const uint16_t nbits, const bool strict) {
if (results->rawlen < 2 * (5 + nbits + kFooter) + kHeader - 1) if (results->rawlen < 2 * (5 + nbits + kFooter) + kHeader - 1 + offset)
return false; return false;
if (nbits / 8 < kDaikin152StateLength) return false; if (nbits / 8 < kDaikin152StateLength) return false;
// Compliance // Compliance
if (strict && nbits != kDaikin152Bits) return false; if (strict && nbits != kDaikin152Bits) return false;
uint16_t offset = kStartOffset;
uint16_t used; uint16_t used;
// Leader // Leader

View File

@ -64,7 +64,10 @@ void IRsend::sendDenon(uint64_t data, uint16_t nbits, uint16_t repeat) {
// //
// Args: // Args:
// results: Ptr to the data to decode and where to store the decode result. // results: Ptr to the data to decode and where to store the decode result.
// offset: The starting index to use when attempting to decode the raw data.
// Typically/Defaults to kStartOffset.
// nbits: Expected nr. of data bits. (Typically kDenonBits) // nbits: Expected nr. of data bits. (Typically kDenonBits)
// strict: Flag to indicate if we strictly adhere to the specification.
// Returns: // Returns:
// boolean: True if it can decode it, false if it can't. // boolean: True if it can decode it, false if it can't.
// //
@ -72,7 +75,8 @@ void IRsend::sendDenon(uint64_t data, uint16_t nbits, uint16_t repeat) {
// //
// Ref: // Ref:
// https://github.com/z3t0/Arduino-IRremote/blob/master/ir_Denon.cpp // https://github.com/z3t0/Arduino-IRremote/blob/master/ir_Denon.cpp
bool IRrecv::decodeDenon(decode_results *results, uint16_t nbits, bool strict) { bool IRrecv::decodeDenon(decode_results *results, uint16_t offset,
const uint16_t nbits, const bool strict) {
// Compliance // Compliance
if (strict) { if (strict) {
switch (nbits) { switch (nbits) {
@ -92,15 +96,14 @@ bool IRrecv::decodeDenon(decode_results *results, uint16_t nbits, bool strict) {
// Ditto for Panasonic, it's the same except for a different // Ditto for Panasonic, it's the same except for a different
// manufacturer code. // manufacturer code.
if (!decodeSharp(results, nbits, true, false) && if (!decodeSharp(results, offset, nbits, true, false) &&
!decodePanasonic(results, nbits, true, kDenonManufacturer)) { !decodePanasonic(results, offset, nbits, true, kDenonManufacturer)) {
// We couldn't decode it as expected, so try the old legacy method. // We couldn't decode it as expected, so try the old legacy method.
// NOTE: I don't think this following protocol actually exists. // NOTE: I don't think this following protocol actually exists.
// Looks like a partial version of the Sharp protocol. // Looks like a partial version of the Sharp protocol.
if (strict && nbits != kDenonLegacyBits) return false; if (strict && nbits != kDenonLegacyBits) return false;
uint64_t data = 0; uint64_t data = 0;
uint16_t offset = kStartOffset;
// Match Header + Data + Footer // Match Header + Data + Footer
if (!matchGeneric(results->rawbuf + offset, &data, if (!matchGeneric(results->rawbuf + offset, &data,

Some files were not shown because too many files have changed in this diff Show More