From 977fe740e6b2e661fb9588c30a8fb9e405b95f6b Mon Sep 17 00:00:00 2001 From: Ajith Vasudevan Date: Tue, 9 Feb 2021 13:16:16 +0530 Subject: [PATCH 01/99] Added support for TM1637 Seven-Segment Display --- lib/lib_display/TM1637TinyDisplay/LICENSE | 165 +++++ lib/lib_display/TM1637TinyDisplay/README.md | 136 ++++ lib/lib_display/TM1637TinyDisplay/RELEASE.md | 20 + .../TM1637TinyDisplay/TM1637TinyDisplay.cpp | 603 +++++++++++++++++ .../TM1637TinyDisplay/TM1637TinyDisplay.h | 316 +++++++++ lib/lib_display/TM1637TinyDisplay/_config.yml | 1 + .../examples/7-segment-animator.html | 638 ++++++++++++++++++ .../examples/ATtiny85/ATtiny85.ino | 402 +++++++++++ .../examples/AnimatorToolThumb.png | Bin 0 -> 96115 bytes .../TM1637TinyDisplay/examples/README.md | 65 ++ .../examples/TM1637Demo/TM1637Demo.ino | 400 +++++++++++ .../examples/TM1637Test/TM1637Test.ino | 313 +++++++++ .../TM1637TinyDisplay/examples/tm1637.png | Bin 0 -> 214608 bytes .../TM1637TinyDisplay/examples/tm1637back.png | Bin 0 -> 215488 bytes .../TM1637TinyDisplay/keywords.txt | 65 ++ .../TM1637TinyDisplay/library.json | 15 + .../TM1637TinyDisplay/library.properties | 10 + tasmota/language/af_AF.h | 2 + tasmota/language/bg_BG.h | 2 + tasmota/language/cs_CZ.h | 2 + tasmota/language/de_DE.h | 2 + tasmota/language/el_GR.h | 2 + tasmota/language/en_GB.h | 2 + tasmota/language/es_ES.h | 2 + tasmota/language/fr_FR.h | 2 + tasmota/language/fy_NL.h | 2 + tasmota/language/he_HE.h | 2 + tasmota/language/hu_HU.h | 2 + tasmota/language/ko_KO.h | 2 + tasmota/language/nl_NL.h | 2 + tasmota/language/pl_PL.h | 2 + tasmota/language/pt_BR.h | 2 + tasmota/language/pt_PT.h | 2 + tasmota/language/ro_RO.h | 2 + tasmota/language/ru_RU.h | 2 + tasmota/language/sk_SK.h | 2 + tasmota/language/sv_SE.h | 2 + tasmota/language/tr_TR.h | 2 + tasmota/language/uk_UA.h | 2 + tasmota/language/vi_VN.h | 2 + tasmota/language/zh_CN.h | 2 + tasmota/language/zh_TW.h | 2 + tasmota/my_user_config.h | 1 + tasmota/support_features.ino | 3 + tasmota/support_tasmota.ino | 2 + tasmota/tasmota_configurations.h | 5 + tasmota/tasmota_template.h | 10 + tasmota/xsns_85_tm1637.ino | 355 ++++++++++ tools/decode-status.py | 2 +- 49 files changed, 3576 insertions(+), 1 deletion(-) create mode 100644 lib/lib_display/TM1637TinyDisplay/LICENSE create mode 100644 lib/lib_display/TM1637TinyDisplay/README.md create mode 100644 lib/lib_display/TM1637TinyDisplay/RELEASE.md create mode 100644 lib/lib_display/TM1637TinyDisplay/TM1637TinyDisplay.cpp create mode 100644 lib/lib_display/TM1637TinyDisplay/TM1637TinyDisplay.h create mode 100644 lib/lib_display/TM1637TinyDisplay/_config.yml create mode 100644 lib/lib_display/TM1637TinyDisplay/examples/7-segment-animator.html create mode 100644 lib/lib_display/TM1637TinyDisplay/examples/ATtiny85/ATtiny85.ino create mode 100644 lib/lib_display/TM1637TinyDisplay/examples/AnimatorToolThumb.png create mode 100644 lib/lib_display/TM1637TinyDisplay/examples/README.md create mode 100644 lib/lib_display/TM1637TinyDisplay/examples/TM1637Demo/TM1637Demo.ino create mode 100644 lib/lib_display/TM1637TinyDisplay/examples/TM1637Test/TM1637Test.ino create mode 100644 lib/lib_display/TM1637TinyDisplay/examples/tm1637.png create mode 100644 lib/lib_display/TM1637TinyDisplay/examples/tm1637back.png create mode 100644 lib/lib_display/TM1637TinyDisplay/keywords.txt create mode 100644 lib/lib_display/TM1637TinyDisplay/library.json create mode 100644 lib/lib_display/TM1637TinyDisplay/library.properties create mode 100644 tasmota/xsns_85_tm1637.ino diff --git a/lib/lib_display/TM1637TinyDisplay/LICENSE b/lib/lib_display/TM1637TinyDisplay/LICENSE new file mode 100644 index 000000000..6600f1c98 --- /dev/null +++ b/lib/lib_display/TM1637TinyDisplay/LICENSE @@ -0,0 +1,165 @@ +GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. diff --git a/lib/lib_display/TM1637TinyDisplay/README.md b/lib/lib_display/TM1637TinyDisplay/README.md new file mode 100644 index 000000000..f146f7f05 --- /dev/null +++ b/lib/lib_display/TM1637TinyDisplay/README.md @@ -0,0 +1,136 @@ +# TM1637 Tiny Display # +[![arduino-library-badge](https://www.ardu-badge.com/badge/TM1637TinyDisplay.svg?)](https://www.ardu-badge.com/TM1637TinyDisplay) +[![Build Status](https://travis-ci.org/jasonacox/TM1637TinyDisplay.svg?branch=master)](https://travis-ci.org/github/jasonacox/TM1637TinyDisplay) + +Arduino Library for the TM1637 Based LED Display Module + +## Description +This is an Arduino library for 4-digit 7-segment display modules based on the TM1637 chip. +Connect the TM1637 display CLK and DIO pins to your Arduino GPIO pins, include this library, initialize TM1637TinyDisplay and call easy to use functions like showNumber(), showString(), showLevel() and showAnimation(). Display will scroll text for larger strings. Functions support screen splitting for easy number + text formatting. Library also runs well on tiny controllers including the ATtiny85. + +## Hardware +![TM1637](examples/tm1637.png) + +Display modules based on the TM1637 chip are available from [HiLetgo](https://www.amazon.com/gp/product/B01DKISMXK/ref=ppx_yo_dt_b_search_asin_title?ie=UTF8&psc=1), [DX](https://dx.com/p/0-36-led-4-digit-display-module-for-arduino-black-blue-works-with-official-arduino-boards-254978) and [SeeedStudio](https://www.digikey.com/products/en?keywords=tm1637). + +![TM1637](examples/tm1637back.png) + +The display has four connectors: +* CLK - Clock - attach to any GPIO output +* DIO - Data - attach to any GPIO output +* VCC - Power 5v +* GND - Ground + +Power Note: Steady clean power is important for circuit stability. If you are seeing display artifacts during high frequency updates or animation sequences, you may be experiencing power fluctuations that are impacting signal timing and communication with the TM1637. This is especially true with standalone microprocessor applications that lack any power conditioning (e.g. ATtiny85). A polarized 100uF electrolytic capacitor inserted across VCC and GND can help smooth out the spikes. + +Decimals and Colons: Some TM1637 displays come equipped with a middle colon LED (as shown above) as used in digital clocks but with no decimal points. Some displays come with decimal point LEDS for each digit. Some come with both but often the decimal point LEDs are not connected. These extra LEDs are activated by setting the upper bit (0x80) for the digit next to the dot. This library will handle setting that for you via the showNumber() function when you specify floating point numbers or via the showNumberDec() function where you can set the decimal point manually. + +## Installation +This library is available via the Arduino IDE. Install this library via `Tools`, `Manage Libraries`, search for "TM1637TinyDisplay" and click `Install`. + +Alternatively, you can install this manually by cloning this repo into your Arduino library folder (e.g. `~/Documents/Arduino/libraries`). + +## Usage +The library provides a single class named TM1637TinyDisplay with the following functions: + +* `showNumber` - Display an integer and floating point numbers (positive or negative) +* `showNumberDec` - Display a number with ability to manually set decimal points or colon +* `showNumberHex` - Display a number in hexadecimal format and set decimal point or colon +* `showString` - Display a ASCII string of text with optional scrolling for long strings +* `showLevel` - Use display LEDs to simulate a level indicator (vertical or horizontal) +* `showAnimation` - Display a sequence of frames to render an animation +* `setSegments` - Directly set the value of the LED segments in each digit +* `setBrightness` - Sets the brightness of the display +* `setScrolldelay` - Sets the speed for text scrolling + +PROGMEM functions: Large string or animation data can be left in Flash instead of being loaded in to SRAM to save memory. + +* `showAnimation_P` - Display a sequence of frames to render an animation (in PROGMEM) +* `showString_P` - Display a ASCII string of text with optional scrolling for long strings (in PROGMEM) + +## Example Code +```cpp +#include +#include + +// Define Digital Pins +#define CLK 1 +#define DIO 2 + +// Initialize TM1637TinyDisplay +TM1637TinyDisplay display(CLK, DIO); + +void setup() { + display.setBrightness(0x0f); +} + +void loop() { + // Say Hello + display.showString("HELLO"); + delay(500); + + // Clear Screen + display.clear(); + + // We can count! + for (int x = -100; x <= 100; x++) { + display.showNumber(x); + } + + // Level indicator + for (int x = 0; x <= 100; x = x + 10) { + display.showLevel(x, false); + delay(20); + } + for (int x = 100; x >= 0; x = x - 10) { + display.showLevel(x, false); + delay(20); + } + + // Split screen for temperature + display.showString("\xB0", 1, 3); // Degree Mark, length=1, position=3 (right) + for (int x = -90; x < 200; x++) { + display.showNumber(x, false, 3, 0); // Number, length=3, position=0 (left) + delay(10); + } + + // The end + display.showString("End"); + delay(1000); +} +``` + +Refer to [TM1637TinyDisplay.h](TM1637TinyDisplay.h) for information on available functions. See also [Examples](examples) for more demonstration. + +## Animation and Animator Tool +The showAnimation() function projects a sequence of frames (patterns) onto the display. This works by defining the animation sequence through a multi-dimensional array of patterns. + +You can use the included javascript based interactive [7-Segment LED Animator Tool](https://jasonacox.github.io/TM1637TinyDisplay/examples/7-segment-animator.html) to help build your animation. The source code is in the [Examples](examples) folder. This tool will let you set up the LED sequences you want, save each frame and copy the final code (a static array) directly into your sketch to use for the `showAnimation(data, frames, timing)` function. Here is an example: + +```cpp +// Data from Animator Tool +const uint8_t ANIMATION[12][4] = { + { 0x08, 0x00, 0x00, 0x00 }, // Frame 0 + { 0x00, 0x08, 0x00, 0x00 }, // Frame 1 + { 0x00, 0x00, 0x08, 0x00 }, // Frame 2 + { 0x00, 0x00, 0x00, 0x08 }, // Frame 3 + { 0x00, 0x00, 0x00, 0x04 }, // Frame 4 + { 0x00, 0x00, 0x00, 0x02 }, // Frame 5 + { 0x00, 0x00, 0x00, 0x01 }, // Frame 6 + { 0x00, 0x00, 0x01, 0x00 }, // Frame 7 + { 0x00, 0x01, 0x00, 0x00 }, // Frame 8 + { 0x01, 0x00, 0x00, 0x00 }, // Frame 9 + { 0x20, 0x00, 0x00, 0x00 }, // Frame 10 + { 0x10, 0x00, 0x00, 0x00 } // Frame 11 +}; + + // Display Animation sequence + display.showAnimation(ANIMATION, FRAMES(ANIMATION), TIME_MS(50)); + +``` + +## References and Credit +* This library is based on the great work by Avishay Orpaz - https://github.com/avishorp/TM1637 +* SevenSegmentTM1637 Arduino Library by Bram Harmsen - https://github.com/bremme/arduino-tm1637 +* Arduino - https://playground.arduino.cc/Main/TM1637/ + diff --git a/lib/lib_display/TM1637TinyDisplay/RELEASE.md b/lib/lib_display/TM1637TinyDisplay/RELEASE.md new file mode 100644 index 000000000..e7702fb8a --- /dev/null +++ b/lib/lib_display/TM1637TinyDisplay/RELEASE.md @@ -0,0 +1,20 @@ +# Release Notes for TM1637TinyDisplay + +## v1.0.0 +- Initial Release. + +## v1.1.0 +- Added interactive [Animator Tool](https://jasonacox.github.io/TM1637TinyDisplay/examples/7-segment-animator.html) to create frame data for the showAnimation() function. +- Added demo sketch to showcase functions and animation features. + +## v1.1.1 +- Added yield() call to example Demo sketch for esp8266 watchdog timer. + +## v1.2.0 +- Added floating number support to showNumber() for TM1637 displays with decimal points. + +## v1.3.0 +- Converted global digitToSegment[] and asciiToSegment[] lookup tables to PROGMEM space to save RAM. +- Fixed comparison between signed and unsigned integer expressions warning #5 +- Saves ~1.5kB in the ATtiny85 example by using showNumber() instead of sprintf() #6 +- Fixed implicit case fallthrough and signed/unsigned comparison warnings #7 \ No newline at end of file diff --git a/lib/lib_display/TM1637TinyDisplay/TM1637TinyDisplay.cpp b/lib/lib_display/TM1637TinyDisplay/TM1637TinyDisplay.cpp new file mode 100644 index 000000000..f9810cd22 --- /dev/null +++ b/lib/lib_display/TM1637TinyDisplay/TM1637TinyDisplay.cpp @@ -0,0 +1,603 @@ +// TM1637 Tiny Display +// Arduino tiny library for TM1637 LED Display +// +// Author: Jason A. Cox - @jasonacox - https://github.com/jasonacox +// Date: 27 June 2020 +// +// Based on TM1637Display library at https://github.com/avishorp/TM1637 +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +extern "C" { + #include + #include + #include +} + +#include +#include + +#define TM1637_I2C_COMM1 0x40 +#define TM1637_I2C_COMM2 0xC0 +#define TM1637_I2C_COMM3 0x80 + +// +// A +// --- +// F | | B +// -G- +// E | | C +// --- +// D +const uint8_t digitToSegment[] PROGMEM = { + // XGFEDCBA + 0b00111111, // 0 + 0b00000110, // 1 + 0b01011011, // 2 + 0b01001111, // 3 + 0b01100110, // 4 + 0b01101101, // 5 + 0b01111101, // 6 + 0b00000111, // 7 + 0b01111111, // 8 + 0b01101111, // 9 + 0b01110111, // A + 0b01111100, // b + 0b00111001, // C + 0b01011110, // d + 0b01111001, // E + 0b01110001 // F + }; + +// ASCII Map - Index 0 starts at ASCII 32 +const uint8_t asciiToSegment[] PROGMEM = { + 0b00000000, // 032 (Space) + 0b00110000, // 033 ! + 0b00100010, // 034 " + 0b01000001, // 035 # + 0b01101101, // 036 $ + 0b01010010, // 037 % + 0b01111100, // 038 & + 0b00100000, // 039 ' + 0b00111001, // 040 ( + 0b00001111, // 041 ) + 0b00100001, // 042 * + 0b01110000, // 043 + + 0b00001000, // 044 , + 0b01000000, // 045 - + 0b00001000, // 046 . + 0b01010010, // 047 / + 0b00111111, // 048 0 + 0b00000110, // 049 1 + 0b01011011, // 050 2 + 0b01001111, // 051 3 + 0b01100110, // 052 4 + 0b01101101, // 053 5 + 0b01111101, // 054 6 + 0b00000111, // 055 7 + 0b01111111, // 056 8 + 0b01101111, // 057 9 + 0b01001000, // 058 : + 0b01001000, // 059 ; + 0b00111001, // 060 < + 0b01001000, // 061 = + 0b00001111, // 062 > + 0b01010011, // 063 ? + 0b01011111, // 064 @ + 0b01110111, // 065 A + 0b01111100, // 066 B + 0b00111001, // 067 C + 0b01011110, // 068 D + 0b01111001, // 069 E + 0b01110001, // 070 F + 0b00111101, // 071 G + 0b01110110, // 072 H + 0b00000110, // 073 I + 0b00011110, // 074 J + 0b01110110, // 075 K + 0b00111000, // 076 L + 0b00010101, // 077 M + 0b00110111, // 078 N + 0b00111111, // 079 O + 0b01110011, // 080 P + 0b01100111, // 081 Q + 0b00110001, // 082 R + 0b01101101, // 083 S + 0b01111000, // 084 T + 0b00111110, // 085 U + 0b00011100, // 086 V + 0b00101010, // 087 W + 0b01110110, // 088 X + 0b01101110, // 089 Y + 0b01011011, // 090 Z + 0b00111001, // 091 [ + 0b01100100, // 092 (backslash) + 0b00001111, // 093 ] + 0b00100011, // 094 ^ + 0b00001000, // 095 _ + 0b00100000, // 096 ` + 0b01110111, // 097 a + 0b01111100, // 098 b + 0b01011000, // 099 c + 0b01011110, // 100 d + 0b01111001, // 101 e + 0b01110001, // 102 f + 0b01101111, // 103 g + 0b01110100, // 104 h + 0b00000100, // 105 i + 0b00011110, // 106 j + 0b01110110, // 107 k + 0b00011000, // 108 l + 0b00010101, // 109 m + 0b01010100, // 110 n + 0b01011100, // 111 o + 0b01110011, // 112 p + 0b01100111, // 113 q + 0b01010000, // 114 r + 0b01101101, // 115 s + 0b01111000, // 116 t + 0b00011100, // 117 u + 0b00011100, // 118 v + 0b00101010, // 119 w + 0b01110110, // 120 x + 0b01101110, // 121 y + 0b01011011, // 122 z + 0b00111001, // 123 { + 0b00110000, // 124 | + 0b00001111, // 125 } + 0b01000000, // 126 ~ + 0b00000000 // 127  +}; + +static const uint8_t minusSegments = 0b01000000; +static const uint8_t degreeSegments = 0b01100011; + +TM1637TinyDisplay::TM1637TinyDisplay(uint8_t pinClk, uint8_t pinDIO, unsigned int bitDelay, unsigned int scrollDelay) +{ + // Copy the pin numbers + m_pinClk = pinClk; + m_pinDIO = pinDIO; + m_bitDelay = bitDelay; + m_scrollDelay = scrollDelay; + + // Set the pin direction and default value. + // Both pins are set as inputs, allowing the pull-up resistors to pull them up + pinMode(m_pinClk, INPUT); + pinMode(m_pinDIO,INPUT); + digitalWrite(m_pinClk, LOW); + digitalWrite(m_pinDIO, LOW); +} + +void TM1637TinyDisplay::setBrightness(uint8_t brightness, bool on) +{ + m_brightness = (brightness & 0x07) | (on? 0x08 : 0x00); +} + +void TM1637TinyDisplay::setScrolldelay(unsigned int scrollDelay) +{ + m_scrollDelay = scrollDelay; +} + +void TM1637TinyDisplay::setSegments(const uint8_t segments[], uint8_t length, uint8_t pos) +{ + // Write COMM1 + start(); + writeByte(TM1637_I2C_COMM1); + stop(); + + // Write COMM2 + first digit address + start(); + writeByte(TM1637_I2C_COMM2 + (pos & 0x03)); + + // Write the data bytes + for (uint8_t k=0; k < length; k++) + writeByte(segments[k]); + + stop(); + + // Write COMM3 + brightness + start(); + writeByte(TM1637_I2C_COMM3 + (m_brightness & 0x0f)); + stop(); +} + +void TM1637TinyDisplay::clear() +{ + uint8_t data[] = { 0, 0, 0, 0 }; + setSegments(data); +} + +void TM1637TinyDisplay::showNumber(int num, bool leading_zero, uint8_t length, uint8_t pos) +{ + showNumberDec(num, 0, leading_zero, length, pos); +} + +void TM1637TinyDisplay::showNumber(double num, uint8_t decimal_length, uint8_t length, uint8_t pos) +{ + int num_len = 0; + int inum = abs((int)num); + int decimal_places = 0; + double value = 0.0; + bool negative = false; + bool leading_zero = false; + uint8_t digits[4] = {0,0,0,0}; // output array to render + + // determine length of whole number part of num + while(inum != 0) { + inum = inum / 10; + num_len++; + } + if(num < 0) { + num_len++; // make space for negative + negative = true; + } + if(abs(num)<1) { + num_len++; // make space for 0. prefix + leading_zero = true; + } + // make sure we can display number otherwise show overflow + if(num_len > length) { + showString("----", length, pos); // overflow symbol + return; + } + // how many decimal places can we show? + decimal_places = length - num_len; + if(decimal_places > decimal_length) { + decimal_places = decimal_length; + } + // construct whole number representation of num + value = num; + for(int x=0; x < decimal_places; x++) { + value = value * 10.00; + } + if(num>0) value = value + 0.5; // round up + if(num<0) value = value - 0.5; // round down + inum = abs((int)value); + + // render display array + if (inum == 0 && !leading_zero) { + digits[length-1] = encodeDigit(0); + } + else { + int decimal_pos = length - 1 - decimal_places + pos; + for(int i = length-1; i >= 0; --i) { + uint8_t digit = inum % 10; + + if (digit == 0 && inum == 0 && + (leading_zero == false || (i < decimal_pos)) + ) + // Blank out any leading zeros except for 0.x case + digits[i] = 0; + else + digits[i] = encodeDigit(digit); + if(i == decimal_pos && decimal_length > 0) { + digits[i] += 0b10000000; // add decimal point + } + inum /= 10; + } + } + // add negative sign for negative number + if(negative) { + digits[pos] = minusSegments; + } + setSegments(digits, length, pos); +} + +void TM1637TinyDisplay::showNumberDec(int num, uint8_t dots, bool leading_zero, + uint8_t length, uint8_t pos) +{ + showNumberBaseEx(num < 0? -10 : 10, num < 0? -num : num, dots, leading_zero, length, pos); +} + +void TM1637TinyDisplay::showNumberHex(uint16_t num, uint8_t dots, bool leading_zero, + uint8_t length, uint8_t pos) +{ + showNumberBaseEx(16, num, dots, leading_zero, length, pos); +} + +void TM1637TinyDisplay::showNumberBaseEx(int8_t base, uint16_t num, uint8_t dots, bool leading_zero, + uint8_t length, uint8_t pos) +{ + bool negative = false; + if (base < 0) { + base = -base; + negative = true; + } + + uint8_t digits[4]; + + if (num == 0 && !leading_zero) { + // Singular case - take care separately + for(uint8_t i = 0; i < (length-1); i++) { + digits[i] = 0; + } + digits[length-1] = encodeDigit(0); + } + else { + for(int i = length-1; i >= 0; --i) { + uint8_t digit = num % base; + + if (digit == 0 && num == 0 && leading_zero == false) + // Leading zero is blank + digits[i] = 0; + else + digits[i] = encodeDigit(digit); + + if (digit == 0 && num == 0 && negative) { + digits[i] = minusSegments; + negative = false; + } + + num /= base; + } + } + if(dots != 0) { + showDots(dots, digits); + } + setSegments(digits, length, pos); +} + +void TM1637TinyDisplay::showString(const char s[], uint8_t length, uint8_t pos) +{ + uint8_t digits[4] = {0,0,0,0}; + + if (strlen(s) <= 4) { + switch (strlen(s)) { + case 4: + digits[3] = encodeASCII(s[3]); + // fall through + case 3: + digits[2] = encodeASCII(s[2]); + // fall through + case 2: + digits[1] = encodeASCII(s[1]); + // fall through + case 1: + digits[0] = encodeASCII(s[0]); + // fall through + case 0: + setSegments(digits, length, pos); + } + } + if (strlen(s) > 4) { + // Scroll text on display if too long + for (int x = 0; x < 3; x++) { // Scroll message on + digits[0] = digits[1]; + digits[1] = digits[2]; + digits[2] = digits[3]; + digits[3] = encodeASCII(s[x]); + setSegments(digits, length, pos); + delay(m_scrollDelay); + } + for (size_t x = 3; x < strlen(s); x++) { // Scroll through string + digits[0] = encodeASCII(s[x - 3]); + digits[1] = encodeASCII(s[x - 2]); + digits[2] = encodeASCII(s[x - 1]); + digits[3] = encodeASCII(s[x]); + setSegments(digits, length, pos); + delay(m_scrollDelay); + } + for (int x = 0; x < 4; x++) { // Scroll message off + digits[0] = digits[1]; + digits[1] = digits[2]; + digits[2] = digits[3]; + digits[3] = 0; + setSegments(digits, length, pos); + delay(m_scrollDelay); + } + } +} + +void TM1637TinyDisplay::showString_P(const char s[], uint8_t length, uint8_t pos) +{ + uint8_t digits[4] = {0,0,0,0}; + + if (strlen_P(s) <= 4) { + switch (strlen_P(s)) { + case 4: + digits[3] = encodeASCII(pgm_read_byte(&s[3])); + // fall through + case 3: + digits[2] = encodeASCII(pgm_read_byte(&s[2])); + // fall through + case 2: + digits[1] = encodeASCII(pgm_read_byte(&s[1])); + // fall through + case 1: + digits[0] = encodeASCII(pgm_read_byte(&s[0])); + // fall through + case 0: + setSegments(digits, length, pos); + } + } + else { + // Scroll text on display if too long + for (int x = 0; x < 3; x++) { // Scroll message on + digits[0] = digits[1]; + digits[1] = digits[2]; + digits[2] = digits[3]; + digits[3] = encodeASCII(pgm_read_byte(&s[x])); + setSegments(digits, length, pos); + delay(m_scrollDelay); + } + for (size_t x = 3; x < strlen_P(s); x++) { // Scroll through string + digits[0] = encodeASCII(pgm_read_byte(&s[x - 3])); + digits[1] = encodeASCII(pgm_read_byte(&s[x - 2])); + digits[2] = encodeASCII(pgm_read_byte(&s[x - 1])); + digits[3] = encodeASCII(pgm_read_byte(&s[x])); + setSegments(digits, length, pos); + delay(m_scrollDelay); + } + for (int x = 0; x < 4; x++) { // Scroll message off + digits[0] = digits[1]; + digits[1] = digits[2]; + digits[2] = digits[3]; + digits[3] = 0; + setSegments(digits, length, pos); + delay(m_scrollDelay); + } + } +} + +void TM1637TinyDisplay::showLevel(unsigned int level, bool horizontal) +{ + uint8_t digits[4] = {0,0,0,0}; + uint8_t digit = 0b00000000; + + if(level>100) level=100; + + if(horizontal) { + // Must fit within 3 bars + int bars = (int)((level*3)/100.0); + if(bars == 0 && level > 0) bars = 1; // Only level=0 turns off display + switch(bars) { + case 1: + digit = 0b00001000; + break; + case 2: + digit = 0b01001000; + break; + case 3: + digit = 0b01001001; + break; + default: // Keep at zero + break; + } + for(int x = 0; x < 4; x++) { + digits[x] = digit; + } + } + else { + // Must fit within 8 bars + int bars = (int)((level*8)/100.0); + if(bars == 0 && level > 0) bars = 1; + for(int x = 0; x<4; x++) { // for each digit + int left = bars-(x*2); + if(left > 1) digits[x] = 0b00110110; + if(left == 1) digits[x] = 0b00110000; + } + } + setSegments(digits); +} + +void TM1637TinyDisplay::showAnimation(const uint8_t data[][4], unsigned int frames, unsigned int ms) +{ + // Animation sequence + for (unsigned int x = 0; x < frames; x++) { + setSegments(data[x]); + delay(ms); + } +} + +void TM1637TinyDisplay::showAnimation_P(const uint8_t data[][4], unsigned int frames, unsigned int ms) +{ + // Animation sequence for data stored in PROGMEM flash memory + uint8_t digits[4] = {0,0,0,0}; + for (unsigned int x = 0; x < frames; x++) { + for(unsigned int a = 0; a < 4; a++) { + digits[a] = pgm_read_byte(&(data[x][a])); + } + setSegments(digits); + delay(ms); + } +} + +void TM1637TinyDisplay::bitDelay() +{ + delayMicroseconds(m_bitDelay); +} + +void TM1637TinyDisplay::start() +{ + pinMode(m_pinDIO, OUTPUT); + bitDelay(); +} + +void TM1637TinyDisplay::stop() +{ + pinMode(m_pinDIO, OUTPUT); + bitDelay(); + pinMode(m_pinClk, INPUT); + bitDelay(); + pinMode(m_pinDIO, INPUT); + bitDelay(); +} + +bool TM1637TinyDisplay::writeByte(uint8_t b) +{ + uint8_t data = b; + + // 8 Data Bits + for(uint8_t i = 0; i < 8; i++) { + // CLK low + pinMode(m_pinClk, OUTPUT); + bitDelay(); + + // Set data bit + if (data & 0x01) + pinMode(m_pinDIO, INPUT); + else + pinMode(m_pinDIO, OUTPUT); + + bitDelay(); + + // CLK high + pinMode(m_pinClk, INPUT); + bitDelay(); + data = data >> 1; + } + + // Wait for acknowledge + // CLK to zero + pinMode(m_pinClk, OUTPUT); + pinMode(m_pinDIO, INPUT); + bitDelay(); + + // CLK to high + pinMode(m_pinClk, INPUT); + bitDelay(); + uint8_t ack = digitalRead(m_pinDIO); + if (ack == 0) + pinMode(m_pinDIO, OUTPUT); + + bitDelay(); + pinMode(m_pinClk, OUTPUT); + bitDelay(); + + return ack; +} + +void TM1637TinyDisplay::showDots(uint8_t dots, uint8_t* digits) +{ + for(int i = 0; i < 4; ++i) + { + digits[i] |= (dots & 0x80); + dots <<= 1; + } +} + +uint8_t TM1637TinyDisplay::encodeDigit(uint8_t digit) +{ + // return digitToSegment[digit & 0x0f] using PROGMEM + return pgm_read_byte(digitToSegment + (digit & 0x0f)); +} + +uint8_t TM1637TinyDisplay::encodeASCII(uint8_t chr) +{ + if(chr == 176) return degreeSegments; // Degree mark + if(chr > 127 || chr < 32) return 0; // Blank + // return asciiToSegment[chr - 32] using PROGMEM + return pgm_read_byte(asciiToSegment + (chr - 32)); +} diff --git a/lib/lib_display/TM1637TinyDisplay/TM1637TinyDisplay.h b/lib/lib_display/TM1637TinyDisplay/TM1637TinyDisplay.h new file mode 100644 index 000000000..211f1f269 --- /dev/null +++ b/lib/lib_display/TM1637TinyDisplay/TM1637TinyDisplay.h @@ -0,0 +1,316 @@ +// TM1637 Tiny Display +// Arduino tiny library for TM1637 LED Display +// +// Author: Jason A. Cox - @jasonacox - https://github.com/jasonacox +// Date: 27 June 2020 +// +// Based on TM1637Display library at https://github.com/avishorp/TM1637 +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +#ifndef __TM1637TINYDISPLAY__ +#define __TM1637TINYDISPLAY__ + +// Include PROGMEM Support +#include +#ifdef __AVR__ +#include +#elif defined(ESP8266) || defined(ESP32) +#include +#else +#define pgm_read_byte(addr) \ + (*(const unsigned char *)(addr)) // workaround for non-AVR +#endif + +#define SEG_A 0b00000001 +#define SEG_B 0b00000010 +#define SEG_C 0b00000100 +#define SEG_D 0b00001000 +#define SEG_E 0b00010000 +#define SEG_F 0b00100000 +#define SEG_G 0b01000000 +#define SEG_DP 0b10000000 + +#define BRIGHT_LOW 0x00 +#define BRIGHT_0 0x00 +#define BRIGHT_1 0x01 +#define BRIGHT_2 0x02 +#define BRIGHT_3 0x03 +#define BRIGHT_4 0x04 +#define BRIGHT_5 0x05 +#define BRIGHT_6 0x06 +#define BRIGHT_7 0x07 +#define BRIGHT_HIGH 0x0f + +#define ON 1 +#define OFF 0 + +#define DEFAULT_BIT_DELAY 100 +#define DEFAULT_SCROLL_DELAY 100 + +#define FRAMES(a) sizeof(a)/4 +#define TIME_MS(t) t +#define TIME_S(t) t*1000 + +class TM1637TinyDisplay { + +public: + //! Initialize a TM1637TinyDisplay object, setting the clock and + //! data pins. + //! + //! @param pinClk - The number of the digital pin connected to the clock pin of the module + //! @param pinDIO - The number of the digital pin connected to the DIO pin of the module + //! @param bitDelay - The delay, in microseconds, between bit transition on the serial + //! bus connected to the display + TM1637TinyDisplay(uint8_t pinClk, uint8_t pinDIO, unsigned int bitDelay = DEFAULT_BIT_DELAY, unsigned int scrollDelay = DEFAULT_SCROLL_DELAY); + + //! Sets the brightness of the display. + //! + //! The setting takes effect when a command is given to change the data being + //! displayed. + //! + //! @param brightness A number from 0 (lowest brightness) to 7 (highest brightness) + //! @param on Turn display on or off + void setBrightness(uint8_t brightness, bool on = true); + + //! Sets the delay used to scroll string text (in ms). + //! + //! The setting takes effect when a showString() command send an argument with over + //! four characters. + //! + //! @param scrollDelay A number in milliseconds (default is 200) + void setScrolldelay(unsigned int scrollDelay = 200); + + //! Display arbitrary data on the module + //! + //! This function receives raw segment values as input and displays them. The segment data + //! is given as a byte array, each byte corresponding to a single digit. Within each byte, + //! bit 0 is segment A, bit 1 is segment B etc. + //! The function may either set the entire display or any desirable part on its own. The first + //! digit is given by the @ref pos argument with 0 being the leftmost digit. The @ref length + //! argument is the number of digits to be set. Other digits are not affected. + //! + //! @param segments An array of size @ref length containing the raw segment values + //! @param length The number of digits to be modified + //! @param pos The position from which to start the modification (0 - leftmost, 3 - rightmost) + void setSegments(const uint8_t segments[], uint8_t length = 4, uint8_t pos = 0); + + //! Clear the display + void clear(); + + //! Display a decimal number + //! + //! Display the given argument as a decimal number. + //! + //! @param num The number to be shown + //! @param leading_zero When true, leading zeros are displayed. Otherwise unnecessary digits are + //! blank. NOTE: leading zero is not supported with negative numbers. + //! @param length The number of digits to set. The user must ensure that the number to be shown + //! fits to the number of digits requested (for example, if two digits are to be displayed, + //! the number must be between 0 to 99) + //! @param pos The position of the most significant digit (0 - leftmost, 3 - rightmost) + void showNumber(int num, bool leading_zero = false, uint8_t length = 4, uint8_t pos = 0); + + //! Display a decimal number with floating point + //! + //! Display the given argument as a decimal number. Decimal point will only show up on displays + //! that support decimal point. + //! + //! @param num The number to be shown + //! @param decimal_length Format to show only this number of digits after the decimal point. + //! NOTE: Anything over 4 will do best fit. + //! @param length The number of digits to set. The user must ensure that the number to be shown + //! fits to the number of digits requested (for example, if two digits are to be displayed, + //! the number must be between 0 to 99) + //! @param pos The position of the most significant digit (0 - leftmost, 3 - rightmost) + void showNumber(double num, uint8_t decimal_length = 4, uint8_t length = 4, uint8_t pos = 0); + + //! Display a decimal number, with dot control + //! + //! Display the given argument as a decimal number. The dots between the digits (or colon) + //! can be individually controlled. + //! + //! @param num The number to be shown + //! @param dots Dot/Colon enable. The argument is a bitmask, with each bit corresponding to a dot + //! between the digits (or colon mark, as implemented by each module). i.e. + //! For displays with dots between each digit: + //! * 0.000 (0b10000000) + //! * 00.00 (0b01000000) + //! * 000.0 (0b00100000) + //! * 0000. (0b00010000) + //! * 0.0.0.0 (0b11100000) + //! For displays with just a colon: + //! * 00:00 (0b01000000) + //! For displays with dots and colons colon: + //! * 0.0:0.0 (0b11100000) + //! @param leading_zero When true, leading zeros are displayed. Otherwise unnecessary digits are + //! blank. NOTE: leading zero is not supported with negative numbers. + //! @param length The number of digits to set. The user must ensure that the number to be shown + //! fits to the number of digits requested (for example, if two digits are to be displayed, + //! the number must be between 0 to 99) + //! @param pos The position of the most significant digit (0 - leftmost, 3 - rightmost) + void showNumberDec(int num, uint8_t dots = 0, bool leading_zero = false, uint8_t length = 4, uint8_t pos = 0); + + //! Display a hexadecimal number, with dot control + //! + //! Display the given argument as a hexadecimal number. The dots between the digits (or colon) + //! can be individually controlled. + //! + //! @param num The number to be shown + //! @param dots Dot/Colon enable. The argument is a bitmask, with each bit corresponding to a dot + //! between the digits (or colon mark, as implemented by each module). i.e. + //! For displays with dots between each digit: + //! * 0.000 (0b10000000) + //! * 00.00 (0b01000000) + //! * 000.0 (0b00100000) + //! * 0000. (0b00010000) + //! * 0.0.0.0 (0b11100000) + //! For displays with just a colon: + //! * 00:00 (0b01000000) + //! For displays with dots and colons colon: + //! * 0.0:0.0 (0b11100000) + //! @param leading_zero When true, leading zeros are displayed. Otherwise unnecessary digits are + //! blank + //! @param length The number of digits to set. The user must ensure that the number to be shown + //! fits to the number of digits requested (for example, if two digits are to be displayed, + //! the number must be between 0 to 99) + //! @param pos The position of the most significant digit (0 - leftmost, 3 - rightmost) + void showNumberHex(uint16_t num, uint8_t dots = 0, bool leading_zero = false, uint8_t length = 4, uint8_t pos = 0); + + //! Translate a single digit into 7 segment code + //! + //! The method accepts a number between 0 - 15 and converts it to the + //! code required to display the number on a 7 segment display. + //! Numbers between 10-15 are converted to hexadecimal digits (A-F) + //! + //! @param digit A number between 0 to 15 + //! @return A code representing the 7 segment image of the digit (LSB - segment A; + //! bit 6 - segment G; bit 7 - always zero) + uint8_t encodeDigit(uint8_t digit); + + //! Display a string + //! + //! Display the given string and if more than 4 characters, will scroll message on display + //! + //! @param s The string to be shown + //! @param scrollDelay The delay, in microseconds to wait before scrolling to next frame + //! @param length The number of digits to set. + //! @param pos The position of the most significant digit (0 - leftmost, 3 - rightmost) + //! The _P function is for reading PROGMEM read-only flash memory space instead of RAM + void showString(const char s[], uint8_t length = 4, uint8_t pos = 0); + + //! Display a string (PROGMEM space) + //! + //! Display the given string and if more than 4 characters, will scroll message on display + //! This function is for reading PROGMEM read-only flash memory space instead of RAM + //! + //! @param s The string to be shown + //! @param scrollDelay The delay, in microseconds to wait before scrolling to next frame + //! @param length The number of digits to set. + //! @param pos The position of the most significant digit (0 - leftmost, 3 - rightmost) + //! The _P function is for reading PROGMEM read-only flash memory space instead of RAM + void showString_P(const char s[], uint8_t length = 4, uint8_t pos = 0); + + //! Display a Level Indicator (both orientations) + //! + //! Illumiate LEDs to provide a visual indicator of level (horizontal or vertical orientation) + //! + //! @param level A value between 0 and 100 (representing percentage) + //! @param horizontal Boolean (true/false) where true = horizontal, false = vertical + void showLevel(unsigned int level = 100, bool horizontal = true); + + //! Display a sequence of raw LED segment data to create an animation + //! + //! Play thorugh an array of raw LED segment data to create a moving pattern. + //! + //! const uint8_t Example[2][4] = + //! { + //! { // frame 1 + //! 0b00001000, // digit 1 + //! 0b00000000, // digit 2 + //! 0b00000000, // digit 3 + //! 0b00000000 // digit 4 + //! }, + //! { // frame 2 + //! 0b00000000, // digit 1 + //! 0b00001000, // digit 2 + //! 0b00000000, // digit 3 + //! 0b00000000 // digit 4 + //! } + //! } + //! @param data A multi-dimensional array containing the LED segment - data[frames][4] + //! @param frames Number of frames in the sequence to animate + //! @param ms Time to delay between each frame + //! The _P function is for reading PROGMEM read-only flash memory space instead of RAM + void showAnimation(const uint8_t data[][4], unsigned int frames = 0, unsigned int ms = 10); + + //! Display a sequence of raw LED segment data to create an animation (PROGMEM) + //! + //! Play thorugh an array of raw LED segment data to create a moving pattern. + //! This function is for reading PROGMEM read-only flash memory space instead of RAM + //! + //! const uint8_t Example[2][4] = + //! { + //! { // frame 1 + //! 0b00001000, // digit 1 + //! 0b00000000, // digit 2 + //! 0b00000000, // digit 3 + //! 0b00000000 // digit 4 + //! }, + //! { // frame 2 + //! 0b00000000, // digit 1 + //! 0b00001000, // digit 2 + //! 0b00000000, // digit 3 + //! 0b00000000 // digit 4 + //! } + //! } + //! @param data A multi-dimensional array containing the LED segment - data[frames][4] + //! @param frames Number of frames in the sequence to animate + //! @param ms Time to delay between each frame + void showAnimation_P(const uint8_t data[][4], unsigned int frames = 0, unsigned int ms = 10); + + //! Translate a single ASCII character into 7 segment code + //! + //! The method accepts a number between 0 - 255 and converts it to the + //! code required to display the number on a 7 segment display. + //! ASCII Characters between 0-32 and 128-255 are blank. + //! + //! @param chr A character ASCII value + //! @return A code representing the 7 segment image of the digit (LSB - segment A; + //! bit 6 - segment G; bit 7 - always zero) + uint8_t encodeASCII(uint8_t chr); + +protected: + void bitDelay(); + + void start(); + + void stop(); + + bool writeByte(uint8_t b); + + void showDots(uint8_t dots, uint8_t* digits); + + void showNumberBaseEx(int8_t base, uint16_t num, uint8_t dots = 0, bool leading_zero = false, uint8_t length = 4, uint8_t pos = 0); + +private: + uint8_t m_pinClk; + uint8_t m_pinDIO; + uint8_t m_brightness; + unsigned int m_bitDelay; + unsigned int m_scrollDelay; +}; + +#endif // __TM1637TINYDISPLAY__ diff --git a/lib/lib_display/TM1637TinyDisplay/_config.yml b/lib/lib_display/TM1637TinyDisplay/_config.yml new file mode 100644 index 000000000..c4192631f --- /dev/null +++ b/lib/lib_display/TM1637TinyDisplay/_config.yml @@ -0,0 +1 @@ +theme: jekyll-theme-cayman \ No newline at end of file diff --git a/lib/lib_display/TM1637TinyDisplay/examples/7-segment-animator.html b/lib/lib_display/TM1637TinyDisplay/examples/7-segment-animator.html new file mode 100644 index 000000000..7f7858901 --- /dev/null +++ b/lib/lib_display/TM1637TinyDisplay/examples/7-segment-animator.html @@ -0,0 +1,638 @@ + + + + + + + + +

7-Segment LED Display Animator

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
Digit 1
+
HEX
+
BIN
+
+
+
Digit 2
+
HEX
+
BIN
+
+
+
Digit 3
+
HEX
+
BIN
+
+
+
Digit 4
+
HEX
+
BIN
+
+
+ + + | + + + +
+
+ +
+
Instructions: Click segments above to toggle LED state and + click "Save" to record frame. Data for the + animation will be generated below. Click the "Copy Code" button and paste + the data definition into your sketch. See Arduino library + TM1637TinyDisplay. +
+
+
+ +
+
+
Animation Data
+
+ + + + +
+
+
+{ 0x00, 0x00, 0x00, 0x00 },  // Frame 0
+
+ + + + diff --git a/lib/lib_display/TM1637TinyDisplay/examples/ATtiny85/ATtiny85.ino b/lib/lib_display/TM1637TinyDisplay/examples/ATtiny85/ATtiny85.ino new file mode 100644 index 000000000..62f54590b --- /dev/null +++ b/lib/lib_display/TM1637TinyDisplay/examples/ATtiny85/ATtiny85.ino @@ -0,0 +1,402 @@ +// TM1637TinyDisplay DEMO Sketch for ATtiny85 +// This is a demo sketch for the Arduino TM1637TinyDisplay LED Display library +// Designed for small memory processors like the ATtiny85 +// +// Author: Jason A. Cox - @jasonacox +// Date: 2 July 2020 +// +// Based on TM1637Display library at https://github.com/avishorp/TM1637 +// + +// Includes +#include +#include +#include + +// Define Digital Pins +#define CLK 4 +#define DIO 5 + +// Initialize TM1637TinyDisplay +TM1637TinyDisplay display(CLK, DIO); + +// Animation data below was created with the Animator Tool located here: +// https://jasonacox.github.io/TM1637TinyDisplay/examples/7-segment-animator.html +// To save RAM space, we store the animation sequences in PROGMEM read-only flash memory. +// This requires using the showAnimation_P() function to read from PROGMEM memory space. + +const uint8_t ANIMATION1[40][4] PROGMEM = { + { 0x00, 0x00, 0x00, 0x00 }, // Frame 0 + { 0x01, 0x00, 0x00, 0x00 }, // Frame 1 + { 0x40, 0x01, 0x00, 0x00 }, // Frame 2 + { 0x08, 0x40, 0x00, 0x01 }, // Frame 3 + { 0x00, 0x08, 0x01, 0x40 }, // Frame 4 + { 0x01, 0x00, 0x40, 0x08 }, // Frame 5 + { 0x40, 0x01, 0x08, 0x00 }, // Frame 6 + { 0x08, 0x40, 0x00, 0x01 }, // Frame 7 + { 0x00, 0x08, 0x01, 0x40 }, // Frame 8 + { 0x01, 0x01, 0x40, 0x08 }, // Frame 9 + { 0x40, 0x40, 0x09, 0x00 }, // Frame 10 + { 0x08, 0x08, 0x40, 0x01 }, // Frame 11 + { 0x01, 0x00, 0x08, 0x40 }, // Frame 12 + { 0x40, 0x01, 0x00, 0x08 }, // Frame 13 + { 0x08, 0x40, 0x01, 0x00 }, // Frame 14 + { 0x01, 0x09, 0x41, 0x01 }, // Frame 15 + { 0x40, 0x40, 0x48, 0x40 }, // Frame 16 + { 0x08, 0x08, 0x08, 0x08 }, // Frame 17 + { 0x1c, 0x1c, 0x1c, 0x1c }, // Frame 18 + { 0x3e, 0x3e, 0x3e, 0x3e }, // Frame 19 + { 0x3f, 0x3f, 0x3f, 0x3f }, // Frame 20 + { 0x3f, 0x3f, 0x3f, 0x3f }, // Frame 21 + { 0x3f, 0x3f, 0x3f, 0x3f }, // Frame 22 + { 0x00, 0x00, 0x00, 0x00 }, // Frame 23 + { 0x00, 0x00, 0x00, 0x00 }, // Frame 24 + { 0x3f, 0x3f, 0x3f, 0x3f }, // Frame 25 + { 0x3f, 0x3f, 0x3f, 0x3f }, // Frame 26 + { 0x3f, 0x3f, 0x3f, 0x3f }, // Frame 27 + { 0x00, 0x00, 0x00, 0x00 }, // Frame 28 + { 0x00, 0x00, 0x00, 0x00 }, // Frame 29 + { 0x00, 0x00, 0x00, 0x00 }, // Frame 30 + { 0x3f, 0x3f, 0x3f, 0x3f }, // Frame 31 + { 0x3f, 0x3f, 0x3f, 0x3f }, // Frame 32 + { 0x3f, 0x3f, 0x3f, 0x3f }, // Frame 33 + { 0x00, 0x00, 0x00, 0x00 }, // Frame 34 + { 0x00, 0x00, 0x00, 0x00 }, // Frame 35 + { 0x00, 0x00, 0x00, 0x00 }, // Frame 36 + { 0x3f, 0x3f, 0x3f, 0x3f }, // Frame 37 + { 0x3f, 0x3f, 0x3f, 0x3f }, // Frame 38 + { 0x3f, 0x3f, 0x3f, 0x3f } // Frame 39 +}; + +const uint8_t ANIMATION2[33][4] PROGMEM = { + { 0x08, 0x00, 0x00, 0x00 }, // Frame 0 + { 0x00, 0x08, 0x00, 0x00 }, // Frame 1 + { 0x00, 0x00, 0x08, 0x00 }, // Frame 2 + { 0x00, 0x00, 0x00, 0x08 }, // Frame 3 + { 0x00, 0x00, 0x00, 0x04 }, // Frame 4 + { 0x00, 0x00, 0x00, 0x02 }, // Frame 5 + { 0x00, 0x00, 0x00, 0x01 }, // Frame 6 + { 0x00, 0x00, 0x01, 0x00 }, // Frame 7 + { 0x00, 0x01, 0x00, 0x00 }, // Frame 8 + { 0x01, 0x00, 0x00, 0x00 }, // Frame 9 + { 0x20, 0x00, 0x00, 0x00 }, // Frame 10 + { 0x10, 0x00, 0x00, 0x00 }, // Frame 11 + { 0x08, 0x00, 0x00, 0x00 }, // Frame 12 + { 0x00, 0x08, 0x00, 0x00 }, // Frame 13 + { 0x00, 0x00, 0x08, 0x00 }, // Frame 14 + { 0x00, 0x00, 0x04, 0x00 }, // Frame 15 + { 0x00, 0x00, 0x02, 0x00 }, // Frame 16 + { 0x00, 0x00, 0x01, 0x00 }, // Frame 17 + { 0x00, 0x01, 0x00, 0x00 }, // Frame 18 + { 0x00, 0x20, 0x00, 0x00 }, // Frame 19 + { 0x00, 0x10, 0x00, 0x00 }, // Frame 20 + { 0x00, 0x08, 0x00, 0x00 }, // Frame 21 + { 0x00, 0x00, 0x08, 0x00 }, // Frame 22 + { 0x00, 0x00, 0x00, 0x08 }, // Frame 23 + { 0x00, 0x00, 0x00, 0x04 }, // Frame 24 + { 0x00, 0x00, 0x00, 0x02 }, // Frame 25 + { 0x00, 0x00, 0x00, 0x01 }, // Frame 26 + { 0x00, 0x00, 0x01, 0x00 }, // Frame 27 + { 0x00, 0x01, 0x00, 0x00 }, // Frame 28 + { 0x01, 0x00, 0x00, 0x00 }, // Frame 29 + { 0x20, 0x00, 0x00, 0x00 }, // Frame 30 + { 0x10, 0x00, 0x00, 0x00 }, // Frame 31 + { 0x00, 0x00, 0x00, 0x00 } // Frame 32 +}; + +const uint8_t ANIMATION3[218][4] PROGMEM = { + { 0x08, 0x00, 0x00, 0x00 }, // Frame 0 + { 0x40, 0x08, 0x00, 0x00 }, // Frame 1 + { 0x01, 0x40, 0x08, 0x00 }, // Frame 2 + { 0x00, 0x01, 0x40, 0x08 }, // Frame 3 + { 0x00, 0x00, 0x01, 0x40 }, // Frame 4 + { 0x00, 0x00, 0x00, 0x01 }, // Frame 5 + { 0x00, 0x00, 0x00, 0x00 }, // Frame 6 + { 0x63, 0x00, 0x00, 0x00 }, // Frame 7 + { 0x00, 0x5c, 0x00, 0x00 }, // Frame 8 + { 0x00, 0x00, 0x63, 0x00 }, // Frame 9 + { 0x00, 0x00, 0x00, 0x5c }, // Frame 10 + { 0x00, 0x00, 0x00, 0x00 }, // Frame 11 + { 0x01, 0x01, 0x01, 0x01 }, // Frame 12 + { 0x41, 0x41, 0x41, 0x41 }, // Frame 13 + { 0x49, 0x49, 0x49, 0x49 }, // Frame 14 + { 0x79, 0x49, 0x49, 0x49 }, // Frame 15 + { 0x7f, 0x49, 0x49, 0x49 }, // Frame 16 + { 0x7f, 0x79, 0x49, 0x49 }, // Frame 17 + { 0x7f, 0x7f, 0x49, 0x49 }, // Frame 18 + { 0x7f, 0x7f, 0x79, 0x49 }, // Frame 19 + { 0x7f, 0x7f, 0x7f, 0x49 }, // Frame 20 + { 0x7f, 0x7f, 0x7f, 0x79 }, // Frame 21 + { 0x7f, 0x7f, 0x7f, 0x7f }, // Frame 22 + { 0x3f, 0x7f, 0x7f, 0x7f }, // Frame 23 + { 0x3f, 0x3f, 0x7f, 0x7f }, // Frame 24 + { 0x3f, 0x3f, 0x3f, 0x7f }, // Frame 25 + { 0x3f, 0x3f, 0x3f, 0x3f }, // Frame 26 + { 0x1e, 0x3f, 0x3f, 0x3f }, // Frame 27 + { 0x0c, 0x3f, 0x3f, 0x3f }, // Frame 28 + { 0x00, 0x1e, 0x3f, 0x3f }, // Frame 29 + { 0x00, 0x0c, 0x3f, 0x3f }, // Frame 30 + { 0x00, 0x00, 0x1e, 0x3f }, // Frame 31 + { 0x00, 0x00, 0x0c, 0x3f }, // Frame 32 + { 0x00, 0x00, 0x00, 0x1e }, // Frame 33 + { 0x00, 0x00, 0x00, 0x0c }, // Frame 34 + { 0x00, 0x00, 0x00, 0x00 }, // Frame 35 + { 0x00, 0x00, 0x00, 0x08 }, // Frame 36 + { 0x00, 0x00, 0x00, 0x10 }, // Frame 37 + { 0x00, 0x00, 0x00, 0x20 }, // Frame 38 + { 0x00, 0x00, 0x00, 0x01 }, // Frame 39 + { 0x00, 0x00, 0x00, 0x02 }, // Frame 40 + { 0x00, 0x00, 0x00, 0x04 }, // Frame 41 + { 0x00, 0x00, 0x00, 0x08 }, // Frame 42 + { 0x00, 0x00, 0x08, 0x00 }, // Frame 43 + { 0x00, 0x00, 0x10, 0x00 }, // Frame 44 + { 0x00, 0x00, 0x20, 0x00 }, // Frame 45 + { 0x00, 0x00, 0x01, 0x00 }, // Frame 46 + { 0x00, 0x00, 0x02, 0x00 }, // Frame 47 + { 0x00, 0x00, 0x04, 0x00 }, // Frame 48 + { 0x00, 0x00, 0x08, 0x00 }, // Frame 49 + { 0x00, 0x08, 0x00, 0x00 }, // Frame 50 + { 0x00, 0x10, 0x00, 0x00 }, // Frame 51 + { 0x00, 0x20, 0x00, 0x00 }, // Frame 52 + { 0x00, 0x01, 0x00, 0x00 }, // Frame 53 + { 0x00, 0x02, 0x00, 0x00 }, // Frame 54 + { 0x00, 0x04, 0x00, 0x00 }, // Frame 55 + { 0x00, 0x08, 0x00, 0x00 }, // Frame 56 + { 0x08, 0x00, 0x00, 0x00 }, // Frame 57 + { 0x10, 0x00, 0x00, 0x00 }, // Frame 58 + { 0x20, 0x00, 0x00, 0x00 }, // Frame 59 + { 0x01, 0x00, 0x00, 0x00 }, // Frame 60 + { 0x02, 0x00, 0x00, 0x00 }, // Frame 61 + { 0x04, 0x00, 0x00, 0x00 }, // Frame 62 + { 0x08, 0x00, 0x00, 0x00 }, // Frame 63 + { 0x18, 0x00, 0x00, 0x00 }, // Frame 64 + { 0x38, 0x00, 0x00, 0x00 }, // Frame 65 + { 0x39, 0x00, 0x00, 0x00 }, // Frame 66 + { 0x39, 0x01, 0x00, 0x00 }, // Frame 67 + { 0x39, 0x01, 0x01, 0x00 }, // Frame 68 + { 0x39, 0x01, 0x01, 0x01 }, // Frame 69 + { 0x39, 0x01, 0x01, 0x03 }, // Frame 70 + { 0x39, 0x01, 0x01, 0x07 }, // Frame 71 + { 0x39, 0x01, 0x01, 0x0f }, // Frame 72 + { 0x39, 0x01, 0x09, 0x0f }, // Frame 73 + { 0x39, 0x09, 0x09, 0x0f }, // Frame 74 + { 0x06, 0x09, 0x09, 0x30 }, // Frame 75 + { 0x00, 0x39, 0x0f, 0x00 }, // Frame 76 + { 0x00, 0x06, 0x30, 0x00 }, // Frame 77 + { 0x00, 0x46, 0x70, 0x00 }, // Frame 78 + { 0x40, 0x06, 0x30, 0x40 }, // Frame 79 + { 0x30, 0x06, 0x30, 0x06 }, // Frame 80 + { 0x30, 0x30, 0x06, 0x06 }, // Frame 81 + { 0x36, 0x00, 0x00, 0x36 }, // Frame 82 + { 0x30, 0x00, 0x00, 0x06 }, // Frame 83 + { 0x00, 0x00, 0x00, 0x00 }, // Frame 84 + { 0x4c, 0x00, 0x00, 0x00 }, // Frame 85 + { 0x00, 0x4c, 0x00, 0x00 }, // Frame 86 + { 0x00, 0x00, 0x4c, 0x00 }, // Frame 87 + { 0x00, 0x00, 0x00, 0x4c }, // Frame 88 + { 0x00, 0x00, 0x00, 0x00 }, // Frame 89 + { 0x00, 0x00, 0x00, 0x61 }, // Frame 90 + { 0x00, 0x00, 0x61, 0x00 }, // Frame 91 + { 0x00, 0x61, 0x00, 0x00 }, // Frame 92 + { 0x61, 0x00, 0x00, 0x00 }, // Frame 93 + { 0x00, 0x00, 0x00, 0x00 }, // Frame 94 + { 0x00, 0x00, 0x08, 0x00 }, // Frame 95 + { 0x00, 0x00, 0x5c, 0x00 }, // Frame 96 + { 0x00, 0x08, 0x7f, 0x08 }, // Frame 97 + { 0x00, 0x0c, 0x7f, 0x18 }, // Frame 98 + { 0x00, 0x5e, 0x7f, 0x7c }, // Frame 99 + { 0x08, 0x7f, 0x7f, 0x7f }, // Frame 100 + { 0x0c, 0x7f, 0x7f, 0x7f }, // Frame 101 + { 0x5e, 0x7f, 0x7f, 0x7f }, // Frame 102 + { 0x7f, 0x7f, 0x7f, 0x7f }, // Frame 103 + { 0x7e, 0x7e, 0x7e, 0x7e }, // Frame 104 + { 0x3f, 0x3f, 0x3f, 0x3f }, // Frame 105 + { 0x77, 0x77, 0x77, 0x77 }, // Frame 106 + { 0x7f, 0x7f, 0x7f, 0x7f }, // Frame 107 + { 0x00, 0x00, 0x00, 0x00 }, // Frame 108 + { 0x00, 0x00, 0x00, 0x00 }, // Frame 109 + { 0x7f, 0x7f, 0x7f, 0x7f }, // Frame 110 + { 0x7f, 0x7f, 0x7f, 0x7f }, // Frame 111 + { 0x3f, 0x3f, 0x3f, 0x3f }, // Frame 112 + { 0x3f, 0x3f, 0x3f, 0x3f }, // Frame 113 + { 0x3f, 0x3f, 0x3f, 0x39 }, // Frame 114 + { 0x3f, 0x3f, 0x3f, 0x30 }, // Frame 115 + { 0x3f, 0x3f, 0x3f, 0x00 }, // Frame 116 + { 0x3f, 0x3f, 0x39, 0x00 }, // Frame 117 + { 0x3f, 0x3f, 0x30, 0x00 }, // Frame 118 + { 0x3f, 0x3f, 0x00, 0x00 }, // Frame 119 + { 0x3f, 0x39, 0x00, 0x00 }, // Frame 120 + { 0x3f, 0x30, 0x00, 0x00 }, // Frame 121 + { 0x3f, 0x00, 0x00, 0x00 }, // Frame 122 + { 0x39, 0x00, 0x00, 0x00 }, // Frame 123 + { 0x30, 0x00, 0x00, 0x00 }, // Frame 124 + { 0x00, 0x00, 0x00, 0x00 }, // Frame 125 + { 0x38, 0x00, 0x00, 0x00 }, // Frame 126 + { 0x3f, 0x38, 0x00, 0x00 }, // Frame 127 + { 0x38, 0x3f, 0x38, 0x00 }, // Frame 128 + { 0x00, 0x38, 0x3f, 0x38 }, // Frame 129 + { 0x00, 0x00, 0x38, 0x3f }, // Frame 130 + { 0x00, 0x00, 0x00, 0x38 }, // Frame 131 + { 0x00, 0x00, 0x00, 0x00 }, // Frame 132 + { 0x40, 0x00, 0x00, 0x00 }, // Frame 133 + { 0x00, 0x40, 0x00, 0x00 }, // Frame 134 + { 0x00, 0x00, 0x40, 0x00 }, // Frame 135 + { 0x00, 0x00, 0x00, 0x46 }, // Frame 136 + { 0x00, 0x00, 0x00, 0x39 }, // Frame 137 + { 0x40, 0x00, 0x06, 0x09 }, // Frame 138 + { 0x00, 0x40, 0x39, 0x09 }, // Frame 139 + { 0x40, 0x06, 0x09, 0x09 }, // Frame 140 + { 0x00, 0x39, 0x09, 0x09 }, // Frame 141 + { 0x46, 0x09, 0x09, 0x09 }, // Frame 142 + { 0x39, 0x09, 0x09, 0x09 }, // Frame 143 + { 0x09, 0x09, 0x09, 0x0f }, // Frame 144 + { 0x09, 0x09, 0x09, 0x79 }, // Frame 145 + { 0x09, 0x09, 0x0f, 0x00 }, // Frame 146 + { 0x09, 0x09, 0x79, 0x00 }, // Frame 147 + { 0x09, 0x0f, 0x09, 0x00 }, // Frame 148 + { 0x09, 0x79, 0x00, 0x00 }, // Frame 149 + { 0x0f, 0x09, 0x00, 0x00 }, // Frame 150 + { 0x79, 0x00, 0x00, 0x00 }, // Frame 151 + { 0x30, 0x00, 0x00, 0x00 }, // Frame 152 + { 0x00, 0x00, 0x00, 0x00 }, // Frame 153 + { 0x01, 0x00, 0x00, 0x00 }, // Frame 154 + { 0x08, 0x00, 0x00, 0x00 }, // Frame 155 + { 0x00, 0x01, 0x00, 0x00 }, // Frame 156 + { 0x00, 0x08, 0x00, 0x00 }, // Frame 157 + { 0x00, 0x00, 0x01, 0x00 }, // Frame 158 + { 0x00, 0x00, 0x08, 0x00 }, // Frame 159 + { 0x00, 0x00, 0x00, 0x01 }, // Frame 160 + { 0x00, 0x00, 0x00, 0x08 }, // Frame 161 + { 0x00, 0x00, 0x00, 0x00 }, // Frame 162 + { 0x00, 0x00, 0x00, 0x6d }, // Frame 163 + { 0x00, 0x00, 0x6d, 0x73 }, // Frame 164 + { 0x00, 0x6d, 0x73, 0x77 }, // Frame 165 + { 0x6d, 0x73, 0x77, 0x39 }, // Frame 166 + { 0x73, 0x77, 0x39, 0x79 }, // Frame 167 + { 0x77, 0x39, 0x79, 0x00 }, // Frame 168 + { 0x39, 0x79, 0x00, 0x00 }, // Frame 169 + { 0x79, 0x00, 0x00, 0x00 }, // Frame 170 + { 0x00, 0x00, 0x00, 0x00 }, // Frame 171 + { 0x79, 0x00, 0x00, 0x00 }, // Frame 172 + { 0x00, 0x79, 0x00, 0x00 }, // Frame 173 + { 0x00, 0x00, 0x79, 0x00 }, // Frame 174 + { 0x00, 0x00, 0x00, 0x79 }, // Frame 175 + { 0x10, 0x00, 0x00, 0x79 }, // Frame 176 + { 0x74, 0x00, 0x00, 0x79 }, // Frame 177 + { 0x00, 0x74, 0x00, 0x79 }, // Frame 178 + { 0x00, 0x00, 0x74, 0x79 }, // Frame 179 + { 0x78, 0x00, 0x74, 0x79 }, // Frame 180 + { 0x00, 0x78, 0x74, 0x79 }, // Frame 181 + { 0x00, 0x78, 0x74, 0x79 }, // Frame 182 + { 0x00, 0x78, 0x74, 0x79 }, // Frame 183 + { 0x78, 0x74, 0x79, 0x00 }, // Frame 184 + { 0x74, 0x79, 0x00, 0x00 }, // Frame 185 + { 0x79, 0x00, 0x00, 0x00 }, // Frame 186 + { 0x79, 0x00, 0x00, 0x00 }, // Frame 187 + { 0x79, 0x00, 0x00, 0x04 }, // Frame 188 + { 0x79, 0x00, 0x00, 0x54 }, // Frame 189 + { 0x79, 0x00, 0x54, 0x00 }, // Frame 190 + { 0x79, 0x54, 0x00, 0x00 }, // Frame 191 + { 0x79, 0x54, 0x00, 0x04 }, // Frame 192 + { 0x79, 0x54, 0x00, 0x5e }, // Frame 193 + { 0x79, 0x54, 0x04, 0x30 }, // Frame 194 + { 0x79, 0x54, 0x5e, 0x00 }, // Frame 195 + { 0x79, 0x54, 0x5e, 0x00 }, // Frame 196 + { 0x79, 0x55, 0x5e, 0x02 }, // Frame 197 + { 0x79, 0x54, 0x5e, 0x10 }, // Frame 198 + { 0xf9, 0x54, 0x5e, 0x20 }, // Frame 199 + { 0x79, 0xd4, 0x5e, 0x08 }, // Frame 200 + { 0x79, 0x54, 0x5e, 0x00 }, // Frame 201 + { 0x69, 0x54, 0x5e, 0x00 }, // Frame 202 + { 0x79, 0x54, 0x5e, 0x00 }, // Frame 203 + { 0x79, 0x54, 0x1e, 0x00 }, // Frame 204 + { 0x79, 0x54, 0x5e, 0x00 }, // Frame 205 + { 0x79, 0x14, 0x5e, 0x00 }, // Frame 206 + { 0x68, 0x14, 0x5e, 0x00 }, // Frame 207 + { 0x68, 0x14, 0x1e, 0x00 }, // Frame 208 + { 0x68, 0x14, 0x16, 0x00 }, // Frame 209 + { 0x68, 0x04, 0x16, 0x00 }, // Frame 210 + { 0x28, 0x04, 0x16, 0x00 }, // Frame 211 + { 0x28, 0x04, 0x14, 0x00 }, // Frame 212 + { 0x08, 0x04, 0x14, 0x00 }, // Frame 213 + { 0x08, 0x04, 0x04, 0x00 }, // Frame 214 + { 0x00, 0x04, 0x04, 0x00 }, // Frame 215 + { 0x00, 0x00, 0x04, 0x00 }, // Frame 216 + { 0x00, 0x00, 0x00, 0x00 } // Frame 217 +}; + +const PROGMEM char FlashString[] = "Flash Test - 1234567890"; // Must be globally defined for PROGMEM space +const PROGMEM char FlashString2[] = "good"; + +void setup() { + display.setBrightness(BRIGHT_7); +} + +void loop() { + + // Say Hello + display.showString("HELLO"); + delay(500); + + // Clear Screen + display.clear(); + + // We can count! + for (int x = -100; x <= 100; x++) { + display.showNumber(x); + } + + // Demo Brightness Levels + for (int x = 0; x < 8; x++) { + display.setBrightness(x); + display.showString("On "); + display.showNumber(x, false, 1, 3); + delay(1000); + } + + // Demo Horizontal Level Meter + for (int count = 0; count < 3; count++) { + for (int x = 0; x <= 100; x = x + 10) { + display.showLevel(x, true); + delay(20); + } + for (int x = 100; x >= 0; x = x - 10) { + display.showLevel(x, true); + delay(20); + } + } + // Demo Vertical Level Meter + for (int count = 0; count < 3; count++) { + for (int x = 0; x <= 100; x = x + 10) { + display.showLevel(x, false); + delay(20); + } + for (int x = 100; x >= 0; x = x - 10) { + display.showLevel(x, false); + delay(20); + } + } + delay(1000); + + // Demo split screen for temperature + display.showString("\xB0", 1, 3); // Degree Mark, length=1, position=3 (right) + for (int x = -50; x < 150; x++) { + display.showNumber(x, false, 3, 0); // Number, length=3, position=0 (left) + delay(10); + } + delay(1000); + + // Test PROGMEM flash memory + display.showString_P(FlashString); + delay(1000); + display.showString_P(FlashString2); + delay(1000); + + // Animation sequences - All in PROGMEM flash memory + display.clear(); + display.showAnimation_P(ANIMATION1, FRAMES(ANIMATION1), TIME_MS(50)); + display.showAnimation_P(ANIMATION2, FRAMES(ANIMATION2), TIME_MS(50)); + display.showAnimation_P(ANIMATION3, FRAMES(ANIMATION3), TIME_MS(50)); + + delay(1000); +} diff --git a/lib/lib_display/TM1637TinyDisplay/examples/AnimatorToolThumb.png b/lib/lib_display/TM1637TinyDisplay/examples/AnimatorToolThumb.png new file mode 100644 index 0000000000000000000000000000000000000000..4e5e5d8b06f8fd07f6ac078868954a8445922652 GIT binary patch literal 96115 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 +#include + +// Define Digital Pins +#define CLK 4 +#define DIO 5 + +// Initialize TM1637TinyDisplay +TM1637TinyDisplay display(CLK, DIO); + +// Data from Animator Tool +const uint8_t ANIMATION[12][4] = { + { 0x08, 0x00, 0x00, 0x00 }, // Frame 0 + { 0x00, 0x08, 0x00, 0x00 }, // Frame 1 + { 0x00, 0x00, 0x08, 0x00 }, // Frame 2 + { 0x00, 0x00, 0x00, 0x08 }, // Frame 3 + { 0x00, 0x00, 0x00, 0x04 }, // Frame 4 + { 0x00, 0x00, 0x00, 0x02 }, // Frame 5 + { 0x00, 0x00, 0x00, 0x01 }, // Frame 6 + { 0x00, 0x00, 0x01, 0x00 }, // Frame 7 + { 0x00, 0x01, 0x00, 0x00 }, // Frame 8 + { 0x01, 0x00, 0x00, 0x00 }, // Frame 9 + { 0x20, 0x00, 0x00, 0x00 }, // Frame 10 + { 0x10, 0x00, 0x00, 0x00 } // Frame 11 +}; + +void setup() { + display.setBrightness(0x0f); +} + +void loop() { + // Display Animation sequence + display.showAnimation(ANIMATION, FRAMES(ANIMATION), TIME_MS(50)); +} +``` diff --git a/lib/lib_display/TM1637TinyDisplay/examples/TM1637Demo/TM1637Demo.ino b/lib/lib_display/TM1637TinyDisplay/examples/TM1637Demo/TM1637Demo.ino new file mode 100644 index 000000000..160698e0f --- /dev/null +++ b/lib/lib_display/TM1637TinyDisplay/examples/TM1637Demo/TM1637Demo.ino @@ -0,0 +1,400 @@ +// TM1637TinyDisplay DEMO Sketch +// This is a demo sketch for the Arduino TM1637TinyDisplay LED Display library +// +// Author: Jason A. Cox - @jasonacox +// Date: 2 July 2020 +// + +// Includes +#include +#include + +// Define Digital Pins +#define CLK 4 +#define DIO 5 + +// Initialize TM1637TinyDisplay +TM1637TinyDisplay display(CLK, DIO); + +// Animations created with Tool https://jasonacox.github.io/TM1637TinyDisplay/examples/7-segment-animator.html + +const uint8_t ANIMATION1[40][4] PROGMEM = { + { 0x00, 0x00, 0x00, 0x00 }, // Frame 0 + { 0x01, 0x00, 0x00, 0x00 }, // Frame 1 + { 0x40, 0x01, 0x00, 0x00 }, // Frame 2 + { 0x08, 0x40, 0x00, 0x01 }, // Frame 3 + { 0x00, 0x08, 0x01, 0x40 }, // Frame 4 + { 0x01, 0x00, 0x40, 0x08 }, // Frame 5 + { 0x40, 0x01, 0x08, 0x00 }, // Frame 6 + { 0x08, 0x40, 0x00, 0x01 }, // Frame 7 + { 0x00, 0x08, 0x01, 0x40 }, // Frame 8 + { 0x01, 0x01, 0x40, 0x08 }, // Frame 9 + { 0x40, 0x40, 0x09, 0x00 }, // Frame 10 + { 0x08, 0x08, 0x40, 0x01 }, // Frame 11 + { 0x01, 0x00, 0x08, 0x40 }, // Frame 12 + { 0x40, 0x01, 0x00, 0x08 }, // Frame 13 + { 0x08, 0x40, 0x01, 0x00 }, // Frame 14 + { 0x01, 0x09, 0x41, 0x01 }, // Frame 15 + { 0x40, 0x40, 0x48, 0x40 }, // Frame 16 + { 0x08, 0x08, 0x08, 0x08 }, // Frame 17 + { 0x1c, 0x1c, 0x1c, 0x1c }, // Frame 18 + { 0x3e, 0x3e, 0x3e, 0x3e }, // Frame 19 + { 0x3f, 0x3f, 0x3f, 0x3f }, // Frame 20 + { 0x3f, 0x3f, 0x3f, 0x3f }, // Frame 21 + { 0x3f, 0x3f, 0x3f, 0x3f }, // Frame 22 + { 0x00, 0x00, 0x00, 0x00 }, // Frame 23 + { 0x00, 0x00, 0x00, 0x00 }, // Frame 24 + { 0x3f, 0x3f, 0x3f, 0x3f }, // Frame 25 + { 0x3f, 0x3f, 0x3f, 0x3f }, // Frame 26 + { 0x3f, 0x3f, 0x3f, 0x3f }, // Frame 27 + { 0x00, 0x00, 0x00, 0x00 }, // Frame 28 + { 0x00, 0x00, 0x00, 0x00 }, // Frame 29 + { 0x00, 0x00, 0x00, 0x00 }, // Frame 30 + { 0x3f, 0x3f, 0x3f, 0x3f }, // Frame 31 + { 0x3f, 0x3f, 0x3f, 0x3f }, // Frame 32 + { 0x3f, 0x3f, 0x3f, 0x3f }, // Frame 33 + { 0x00, 0x00, 0x00, 0x00 }, // Frame 34 + { 0x00, 0x00, 0x00, 0x00 }, // Frame 35 + { 0x00, 0x00, 0x00, 0x00 }, // Frame 36 + { 0x3f, 0x3f, 0x3f, 0x3f }, // Frame 37 + { 0x3f, 0x3f, 0x3f, 0x3f }, // Frame 38 + { 0x3f, 0x3f, 0x3f, 0x3f } // Frame 39 +}; + +const uint8_t ANIMATION2[33][4] PROGMEM = { + { 0x08, 0x00, 0x00, 0x00 }, // Frame 0 + { 0x00, 0x08, 0x00, 0x00 }, // Frame 1 + { 0x00, 0x00, 0x08, 0x00 }, // Frame 2 + { 0x00, 0x00, 0x00, 0x08 }, // Frame 3 + { 0x00, 0x00, 0x00, 0x04 }, // Frame 4 + { 0x00, 0x00, 0x00, 0x02 }, // Frame 5 + { 0x00, 0x00, 0x00, 0x01 }, // Frame 6 + { 0x00, 0x00, 0x01, 0x00 }, // Frame 7 + { 0x00, 0x01, 0x00, 0x00 }, // Frame 8 + { 0x01, 0x00, 0x00, 0x00 }, // Frame 9 + { 0x20, 0x00, 0x00, 0x00 }, // Frame 10 + { 0x10, 0x00, 0x00, 0x00 }, // Frame 11 + { 0x08, 0x00, 0x00, 0x00 }, // Frame 12 + { 0x00, 0x08, 0x00, 0x00 }, // Frame 13 + { 0x00, 0x00, 0x08, 0x00 }, // Frame 14 + { 0x00, 0x00, 0x04, 0x00 }, // Frame 15 + { 0x00, 0x00, 0x02, 0x00 }, // Frame 16 + { 0x00, 0x00, 0x01, 0x00 }, // Frame 17 + { 0x00, 0x01, 0x00, 0x00 }, // Frame 18 + { 0x00, 0x20, 0x00, 0x00 }, // Frame 19 + { 0x00, 0x10, 0x00, 0x00 }, // Frame 20 + { 0x00, 0x08, 0x00, 0x00 }, // Frame 21 + { 0x00, 0x00, 0x08, 0x00 }, // Frame 22 + { 0x00, 0x00, 0x00, 0x08 }, // Frame 23 + { 0x00, 0x00, 0x00, 0x04 }, // Frame 24 + { 0x00, 0x00, 0x00, 0x02 }, // Frame 25 + { 0x00, 0x00, 0x00, 0x01 }, // Frame 26 + { 0x00, 0x00, 0x01, 0x00 }, // Frame 27 + { 0x00, 0x01, 0x00, 0x00 }, // Frame 28 + { 0x01, 0x00, 0x00, 0x00 }, // Frame 29 + { 0x20, 0x00, 0x00, 0x00 }, // Frame 30 + { 0x10, 0x00, 0x00, 0x00 }, // Frame 31 + { 0x00, 0x00, 0x00, 0x00 } // Frame 32 +}; + +const uint8_t ANIMATION3[218][4] PROGMEM = { + { 0x08, 0x00, 0x00, 0x00 }, // Frame 0 + { 0x40, 0x08, 0x00, 0x00 }, // Frame 1 + { 0x01, 0x40, 0x08, 0x00 }, // Frame 2 + { 0x00, 0x01, 0x40, 0x08 }, // Frame 3 + { 0x00, 0x00, 0x01, 0x40 }, // Frame 4 + { 0x00, 0x00, 0x00, 0x01 }, // Frame 5 + { 0x00, 0x00, 0x00, 0x00 }, // Frame 6 + { 0x63, 0x00, 0x00, 0x00 }, // Frame 7 + { 0x00, 0x5c, 0x00, 0x00 }, // Frame 8 + { 0x00, 0x00, 0x63, 0x00 }, // Frame 9 + { 0x00, 0x00, 0x00, 0x5c }, // Frame 10 + { 0x00, 0x00, 0x00, 0x00 }, // Frame 11 + { 0x01, 0x01, 0x01, 0x01 }, // Frame 12 + { 0x41, 0x41, 0x41, 0x41 }, // Frame 13 + { 0x49, 0x49, 0x49, 0x49 }, // Frame 14 + { 0x79, 0x49, 0x49, 0x49 }, // Frame 15 + { 0x7f, 0x49, 0x49, 0x49 }, // Frame 16 + { 0x7f, 0x79, 0x49, 0x49 }, // Frame 17 + { 0x7f, 0x7f, 0x49, 0x49 }, // Frame 18 + { 0x7f, 0x7f, 0x79, 0x49 }, // Frame 19 + { 0x7f, 0x7f, 0x7f, 0x49 }, // Frame 20 + { 0x7f, 0x7f, 0x7f, 0x79 }, // Frame 21 + { 0x7f, 0x7f, 0x7f, 0x7f }, // Frame 22 + { 0x3f, 0x7f, 0x7f, 0x7f }, // Frame 23 + { 0x3f, 0x3f, 0x7f, 0x7f }, // Frame 24 + { 0x3f, 0x3f, 0x3f, 0x7f }, // Frame 25 + { 0x3f, 0x3f, 0x3f, 0x3f }, // Frame 26 + { 0x1e, 0x3f, 0x3f, 0x3f }, // Frame 27 + { 0x0c, 0x3f, 0x3f, 0x3f }, // Frame 28 + { 0x00, 0x1e, 0x3f, 0x3f }, // Frame 29 + { 0x00, 0x0c, 0x3f, 0x3f }, // Frame 30 + { 0x00, 0x00, 0x1e, 0x3f }, // Frame 31 + { 0x00, 0x00, 0x0c, 0x3f }, // Frame 32 + { 0x00, 0x00, 0x00, 0x1e }, // Frame 33 + { 0x00, 0x00, 0x00, 0x0c }, // Frame 34 + { 0x00, 0x00, 0x00, 0x00 }, // Frame 35 + { 0x00, 0x00, 0x00, 0x08 }, // Frame 36 + { 0x00, 0x00, 0x00, 0x10 }, // Frame 37 + { 0x00, 0x00, 0x00, 0x20 }, // Frame 38 + { 0x00, 0x00, 0x00, 0x01 }, // Frame 39 + { 0x00, 0x00, 0x00, 0x02 }, // Frame 40 + { 0x00, 0x00, 0x00, 0x04 }, // Frame 41 + { 0x00, 0x00, 0x00, 0x08 }, // Frame 42 + { 0x00, 0x00, 0x08, 0x00 }, // Frame 43 + { 0x00, 0x00, 0x10, 0x00 }, // Frame 44 + { 0x00, 0x00, 0x20, 0x00 }, // Frame 45 + { 0x00, 0x00, 0x01, 0x00 }, // Frame 46 + { 0x00, 0x00, 0x02, 0x00 }, // Frame 47 + { 0x00, 0x00, 0x04, 0x00 }, // Frame 48 + { 0x00, 0x00, 0x08, 0x00 }, // Frame 49 + { 0x00, 0x08, 0x00, 0x00 }, // Frame 50 + { 0x00, 0x10, 0x00, 0x00 }, // Frame 51 + { 0x00, 0x20, 0x00, 0x00 }, // Frame 52 + { 0x00, 0x01, 0x00, 0x00 }, // Frame 53 + { 0x00, 0x02, 0x00, 0x00 }, // Frame 54 + { 0x00, 0x04, 0x00, 0x00 }, // Frame 55 + { 0x00, 0x08, 0x00, 0x00 }, // Frame 56 + { 0x08, 0x00, 0x00, 0x00 }, // Frame 57 + { 0x10, 0x00, 0x00, 0x00 }, // Frame 58 + { 0x20, 0x00, 0x00, 0x00 }, // Frame 59 + { 0x01, 0x00, 0x00, 0x00 }, // Frame 60 + { 0x02, 0x00, 0x00, 0x00 }, // Frame 61 + { 0x04, 0x00, 0x00, 0x00 }, // Frame 62 + { 0x08, 0x00, 0x00, 0x00 }, // Frame 63 + { 0x18, 0x00, 0x00, 0x00 }, // Frame 64 + { 0x38, 0x00, 0x00, 0x00 }, // Frame 65 + { 0x39, 0x00, 0x00, 0x00 }, // Frame 66 + { 0x39, 0x01, 0x00, 0x00 }, // Frame 67 + { 0x39, 0x01, 0x01, 0x00 }, // Frame 68 + { 0x39, 0x01, 0x01, 0x01 }, // Frame 69 + { 0x39, 0x01, 0x01, 0x03 }, // Frame 70 + { 0x39, 0x01, 0x01, 0x07 }, // Frame 71 + { 0x39, 0x01, 0x01, 0x0f }, // Frame 72 + { 0x39, 0x01, 0x09, 0x0f }, // Frame 73 + { 0x39, 0x09, 0x09, 0x0f }, // Frame 74 + { 0x06, 0x09, 0x09, 0x30 }, // Frame 75 + { 0x00, 0x39, 0x0f, 0x00 }, // Frame 76 + { 0x00, 0x06, 0x30, 0x00 }, // Frame 77 + { 0x00, 0x46, 0x70, 0x00 }, // Frame 78 + { 0x40, 0x06, 0x30, 0x40 }, // Frame 79 + { 0x30, 0x06, 0x30, 0x06 }, // Frame 80 + { 0x30, 0x30, 0x06, 0x06 }, // Frame 81 + { 0x36, 0x00, 0x00, 0x36 }, // Frame 82 + { 0x30, 0x00, 0x00, 0x06 }, // Frame 83 + { 0x00, 0x00, 0x00, 0x00 }, // Frame 84 + { 0x4c, 0x00, 0x00, 0x00 }, // Frame 85 + { 0x00, 0x4c, 0x00, 0x00 }, // Frame 86 + { 0x00, 0x00, 0x4c, 0x00 }, // Frame 87 + { 0x00, 0x00, 0x00, 0x4c }, // Frame 88 + { 0x00, 0x00, 0x00, 0x00 }, // Frame 89 + { 0x00, 0x00, 0x00, 0x61 }, // Frame 90 + { 0x00, 0x00, 0x61, 0x00 }, // Frame 91 + { 0x00, 0x61, 0x00, 0x00 }, // Frame 92 + { 0x61, 0x00, 0x00, 0x00 }, // Frame 93 + { 0x00, 0x00, 0x00, 0x00 }, // Frame 94 + { 0x00, 0x00, 0x08, 0x00 }, // Frame 95 + { 0x00, 0x00, 0x5c, 0x00 }, // Frame 96 + { 0x00, 0x08, 0x7f, 0x08 }, // Frame 97 + { 0x00, 0x0c, 0x7f, 0x18 }, // Frame 98 + { 0x00, 0x5e, 0x7f, 0x7c }, // Frame 99 + { 0x08, 0x7f, 0x7f, 0x7f }, // Frame 100 + { 0x0c, 0x7f, 0x7f, 0x7f }, // Frame 101 + { 0x5e, 0x7f, 0x7f, 0x7f }, // Frame 102 + { 0x7f, 0x7f, 0x7f, 0x7f }, // Frame 103 + { 0x7e, 0x7e, 0x7e, 0x7e }, // Frame 104 + { 0x3f, 0x3f, 0x3f, 0x3f }, // Frame 105 + { 0x77, 0x77, 0x77, 0x77 }, // Frame 106 + { 0x7f, 0x7f, 0x7f, 0x7f }, // Frame 107 + { 0x00, 0x00, 0x00, 0x00 }, // Frame 108 + { 0x00, 0x00, 0x00, 0x00 }, // Frame 109 + { 0x7f, 0x7f, 0x7f, 0x7f }, // Frame 110 + { 0x7f, 0x7f, 0x7f, 0x7f }, // Frame 111 + { 0x3f, 0x3f, 0x3f, 0x3f }, // Frame 112 + { 0x3f, 0x3f, 0x3f, 0x3f }, // Frame 113 + { 0x3f, 0x3f, 0x3f, 0x39 }, // Frame 114 + { 0x3f, 0x3f, 0x3f, 0x30 }, // Frame 115 + { 0x3f, 0x3f, 0x3f, 0x00 }, // Frame 116 + { 0x3f, 0x3f, 0x39, 0x00 }, // Frame 117 + { 0x3f, 0x3f, 0x30, 0x00 }, // Frame 118 + { 0x3f, 0x3f, 0x00, 0x00 }, // Frame 119 + { 0x3f, 0x39, 0x00, 0x00 }, // Frame 120 + { 0x3f, 0x30, 0x00, 0x00 }, // Frame 121 + { 0x3f, 0x00, 0x00, 0x00 }, // Frame 122 + { 0x39, 0x00, 0x00, 0x00 }, // Frame 123 + { 0x30, 0x00, 0x00, 0x00 }, // Frame 124 + { 0x00, 0x00, 0x00, 0x00 }, // Frame 125 + { 0x38, 0x00, 0x00, 0x00 }, // Frame 126 + { 0x3f, 0x38, 0x00, 0x00 }, // Frame 127 + { 0x38, 0x3f, 0x38, 0x00 }, // Frame 128 + { 0x00, 0x38, 0x3f, 0x38 }, // Frame 129 + { 0x00, 0x00, 0x38, 0x3f }, // Frame 130 + { 0x00, 0x00, 0x00, 0x38 }, // Frame 131 + { 0x00, 0x00, 0x00, 0x00 }, // Frame 132 + { 0x40, 0x00, 0x00, 0x00 }, // Frame 133 + { 0x00, 0x40, 0x00, 0x00 }, // Frame 134 + { 0x00, 0x00, 0x40, 0x00 }, // Frame 135 + { 0x00, 0x00, 0x00, 0x46 }, // Frame 136 + { 0x00, 0x00, 0x00, 0x39 }, // Frame 137 + { 0x40, 0x00, 0x06, 0x09 }, // Frame 138 + { 0x00, 0x40, 0x39, 0x09 }, // Frame 139 + { 0x40, 0x06, 0x09, 0x09 }, // Frame 140 + { 0x00, 0x39, 0x09, 0x09 }, // Frame 141 + { 0x46, 0x09, 0x09, 0x09 }, // Frame 142 + { 0x39, 0x09, 0x09, 0x09 }, // Frame 143 + { 0x09, 0x09, 0x09, 0x0f }, // Frame 144 + { 0x09, 0x09, 0x09, 0x79 }, // Frame 145 + { 0x09, 0x09, 0x0f, 0x00 }, // Frame 146 + { 0x09, 0x09, 0x79, 0x00 }, // Frame 147 + { 0x09, 0x0f, 0x09, 0x00 }, // Frame 148 + { 0x09, 0x79, 0x00, 0x00 }, // Frame 149 + { 0x0f, 0x09, 0x00, 0x00 }, // Frame 150 + { 0x79, 0x00, 0x00, 0x00 }, // Frame 151 + { 0x30, 0x00, 0x00, 0x00 }, // Frame 152 + { 0x00, 0x00, 0x00, 0x00 }, // Frame 153 + { 0x01, 0x00, 0x00, 0x00 }, // Frame 154 + { 0x08, 0x00, 0x00, 0x00 }, // Frame 155 + { 0x00, 0x01, 0x00, 0x00 }, // Frame 156 + { 0x00, 0x08, 0x00, 0x00 }, // Frame 157 + { 0x00, 0x00, 0x01, 0x00 }, // Frame 158 + { 0x00, 0x00, 0x08, 0x00 }, // Frame 159 + { 0x00, 0x00, 0x00, 0x01 }, // Frame 160 + { 0x00, 0x00, 0x00, 0x08 }, // Frame 161 + { 0x00, 0x00, 0x00, 0x00 }, // Frame 162 + { 0x00, 0x00, 0x00, 0x6d }, // Frame 163 + { 0x00, 0x00, 0x6d, 0x73 }, // Frame 164 + { 0x00, 0x6d, 0x73, 0x77 }, // Frame 165 + { 0x6d, 0x73, 0x77, 0x39 }, // Frame 166 + { 0x73, 0x77, 0x39, 0x79 }, // Frame 167 + { 0x77, 0x39, 0x79, 0x00 }, // Frame 168 + { 0x39, 0x79, 0x00, 0x00 }, // Frame 169 + { 0x79, 0x00, 0x00, 0x00 }, // Frame 170 + { 0x00, 0x00, 0x00, 0x00 }, // Frame 171 + { 0x79, 0x00, 0x00, 0x00 }, // Frame 172 + { 0x00, 0x79, 0x00, 0x00 }, // Frame 173 + { 0x00, 0x00, 0x79, 0x00 }, // Frame 174 + { 0x00, 0x00, 0x00, 0x79 }, // Frame 175 + { 0x10, 0x00, 0x00, 0x79 }, // Frame 176 + { 0x74, 0x00, 0x00, 0x79 }, // Frame 177 + { 0x00, 0x74, 0x00, 0x79 }, // Frame 178 + { 0x00, 0x00, 0x74, 0x79 }, // Frame 179 + { 0x78, 0x00, 0x74, 0x79 }, // Frame 180 + { 0x00, 0x78, 0x74, 0x79 }, // Frame 181 + { 0x00, 0x78, 0x74, 0x79 }, // Frame 182 + { 0x00, 0x78, 0x74, 0x79 }, // Frame 183 + { 0x78, 0x74, 0x79, 0x00 }, // Frame 184 + { 0x74, 0x79, 0x00, 0x00 }, // Frame 185 + { 0x79, 0x00, 0x00, 0x00 }, // Frame 186 + { 0x79, 0x00, 0x00, 0x00 }, // Frame 187 + { 0x79, 0x00, 0x00, 0x04 }, // Frame 188 + { 0x79, 0x00, 0x00, 0x54 }, // Frame 189 + { 0x79, 0x00, 0x54, 0x00 }, // Frame 190 + { 0x79, 0x54, 0x00, 0x00 }, // Frame 191 + { 0x79, 0x54, 0x00, 0x04 }, // Frame 192 + { 0x79, 0x54, 0x00, 0x5e }, // Frame 193 + { 0x79, 0x54, 0x04, 0x30 }, // Frame 194 + { 0x79, 0x54, 0x5e, 0x00 }, // Frame 195 + { 0x79, 0x54, 0x5e, 0x00 }, // Frame 196 + { 0x79, 0x55, 0x5e, 0x02 }, // Frame 197 + { 0x79, 0x54, 0x5e, 0x10 }, // Frame 198 + { 0xf9, 0x54, 0x5e, 0x20 }, // Frame 199 + { 0x79, 0xd4, 0x5e, 0x08 }, // Frame 200 + { 0x79, 0x54, 0x5e, 0x00 }, // Frame 201 + { 0x69, 0x54, 0x5e, 0x00 }, // Frame 202 + { 0x79, 0x54, 0x5e, 0x00 }, // Frame 203 + { 0x79, 0x54, 0x1e, 0x00 }, // Frame 204 + { 0x79, 0x54, 0x5e, 0x00 }, // Frame 205 + { 0x79, 0x14, 0x5e, 0x00 }, // Frame 206 + { 0x68, 0x14, 0x5e, 0x00 }, // Frame 207 + { 0x68, 0x14, 0x1e, 0x00 }, // Frame 208 + { 0x68, 0x14, 0x16, 0x00 }, // Frame 209 + { 0x68, 0x04, 0x16, 0x00 }, // Frame 210 + { 0x28, 0x04, 0x16, 0x00 }, // Frame 211 + { 0x28, 0x04, 0x14, 0x00 }, // Frame 212 + { 0x08, 0x04, 0x14, 0x00 }, // Frame 213 + { 0x08, 0x04, 0x04, 0x00 }, // Frame 214 + { 0x00, 0x04, 0x04, 0x00 }, // Frame 215 + { 0x00, 0x00, 0x04, 0x00 }, // Frame 216 + { 0x00, 0x00, 0x00, 0x00 } // Frame 217 +}; + +void setup() { + display.setBrightness(BRIGHT_7); + display.showNumber(1234); + delay(1000); + +} +void loop() { + + // Say Hello + display.showString("HELLO"); + delay(500); + + // Clear Screen + display.clear(); + + // We can count! + for (int x = -110; x <= 100; x++) { + display.showNumber(x); + yield(); // Keep watchdog timer happy + } + delay(500); + + for (int x = -100; x < 100; x = x + 1) { + display.showNumber((float)x / 10.0); + yield(); // Keep watchdog timer happy + } + delay(500); + + // Demo Brightness Levels + char string[10]; + for (int x = 0; x < 8; x++) { + display.setBrightness(x); + sprintf(string, "On %d", x); + display.showString(string); + delay(1000); + } + + // Demo Horizontal Level Meter + for (int count = 0; count < 3; count++) { + for (int x = 0; x <= 100; x = x + 10) { + display.showLevel(x, true); + delay(20); + } + for (int x = 100; x >= 0; x = x - 10) { + display.showLevel(x, true); + delay(20); + } + } + // Demo Vertical Level Meter + for (int count = 0; count < 3; count++) { + for (int x = 0; x <= 100; x = x + 10) { + display.showLevel(x, false); + delay(20); + } + for (int x = 100; x >= 0; x = x - 10) { + display.showLevel(x, false); + delay(20); + } + } + delay(1000); + + // Demo split screen for temperature + display.showString("\xB0", 1, 3); // Degree Mark, length=1, position=3 (right) + for (int x = -90; x < 200; x++) { + display.showNumber(x, false, 3, 0); // Number, length=3, position=0 (left) + delay(10); + } + delay(1000); + + // Animation sequences - All in PROGMEM flash memory + display.clear(); + display.showString("For Fun"); + delay(1000); + display.showAnimation_P(ANIMATION1, FRAMES(ANIMATION1), TIME_MS(50)); + display.showAnimation_P(ANIMATION2, FRAMES(ANIMATION2), TIME_MS(50)); + display.showAnimation_P(ANIMATION3, FRAMES(ANIMATION3), TIME_MS(50)); + + delay(5000); + +} diff --git a/lib/lib_display/TM1637TinyDisplay/examples/TM1637Test/TM1637Test.ino b/lib/lib_display/TM1637TinyDisplay/examples/TM1637Test/TM1637Test.ino new file mode 100644 index 000000000..ad3936424 --- /dev/null +++ b/lib/lib_display/TM1637TinyDisplay/examples/TM1637Test/TM1637Test.ino @@ -0,0 +1,313 @@ +// TM1637TinyDisplay TEST Sketch +// This is a test sketch for the Arduino TM1637TinyDisplay LED Display library +// +// Author: Jason A. Cox - @jasonacox - https://github.com/jasonacox +// Date: 2 July 2020 +// +// Based on TM1637Display library at https://github.com/avishorp/TM1637 +// + +// Includes +#include +#include + +// Module connection pins (Digital Pins) +#define CLK 4 +#define DIO 5 + +// The amount of time (in milliseconds) between tests +#define TEST_DELAY 1000 + +// Example of manually defining a display pattern +const uint8_t SEG_DONE[] = { + SEG_B | SEG_C | SEG_D | SEG_E | SEG_G, // d + SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F, // O + SEG_C | SEG_E | SEG_G, // n + SEG_A | SEG_D | SEG_E | SEG_F | SEG_G // E +}; + +// Example animation sequence for showAnimation() Test +// Built with 7-Segment Animator Tool +// https://jasonacox.github.io/TM1637TinyDisplay/examples/7-segment-animator.html + +const uint8_t ANIMATION[12][4] = { + { 0x08, 0x00, 0x00, 0x00 }, // Frame 0 + { 0x00, 0x08, 0x00, 0x00 }, // Frame 1 + { 0x00, 0x00, 0x08, 0x00 }, // Frame 2 + { 0x00, 0x00, 0x00, 0x08 }, // Frame 3 + { 0x00, 0x00, 0x00, 0x04 }, // Frame 4 + { 0x00, 0x00, 0x00, 0x02 }, // Frame 5 + { 0x00, 0x00, 0x00, 0x01 }, // Frame 6 + { 0x00, 0x00, 0x01, 0x00 }, // Frame 7 + { 0x00, 0x01, 0x00, 0x00 }, // Frame 8 + { 0x01, 0x00, 0x00, 0x00 }, // Frame 9 + { 0x20, 0x00, 0x00, 0x00 }, // Frame 10 + { 0x10, 0x00, 0x00, 0x00 } // Frame 11 +}; + +// To save RAM space, we can store the animation sequences in PROGMEM read-only flash memory. +// This requires using the showAnimation_P() function to read from PROGMEM memory space. + +const uint8_t ANIMATION2[40][4] PROGMEM = { + { 0x00, 0x00, 0x00, 0x00 }, // Frame 0 + { 0x01, 0x00, 0x00, 0x00 }, // Frame 1 + { 0x40, 0x01, 0x00, 0x00 }, // Frame 2 + { 0x08, 0x40, 0x00, 0x01 }, // Frame 3 + { 0x00, 0x08, 0x01, 0x40 }, // Frame 4 + { 0x01, 0x00, 0x40, 0x08 }, // Frame 5 + { 0x40, 0x01, 0x08, 0x00 }, // Frame 6 + { 0x08, 0x40, 0x00, 0x01 }, // Frame 7 + { 0x00, 0x08, 0x01, 0x40 }, // Frame 8 + { 0x01, 0x01, 0x40, 0x08 }, // Frame 9 + { 0x40, 0x40, 0x09, 0x00 }, // Frame 10 + { 0x08, 0x08, 0x40, 0x01 }, // Frame 11 + { 0x01, 0x00, 0x08, 0x40 }, // Frame 12 + { 0x40, 0x01, 0x00, 0x08 }, // Frame 13 + { 0x08, 0x40, 0x01, 0x00 }, // Frame 14 + { 0x01, 0x09, 0x41, 0x01 }, // Frame 15 + { 0x40, 0x40, 0x48, 0x40 }, // Frame 16 + { 0x08, 0x08, 0x08, 0x08 }, // Frame 17 + { 0x1c, 0x1c, 0x1c, 0x1c }, // Frame 18 + { 0x3e, 0x3e, 0x3e, 0x3e }, // Frame 19 + { 0x3f, 0x3f, 0x3f, 0x3f }, // Frame 20 + { 0x3f, 0x3f, 0x3f, 0x3f }, // Frame 21 + { 0x3f, 0x3f, 0x3f, 0x3f }, // Frame 22 + { 0x00, 0x00, 0x00, 0x00 }, // Frame 23 + { 0x00, 0x00, 0x00, 0x00 }, // Frame 24 + { 0x3f, 0x3f, 0x3f, 0x3f }, // Frame 25 + { 0x3f, 0x3f, 0x3f, 0x3f }, // Frame 26 + { 0x3f, 0x3f, 0x3f, 0x3f }, // Frame 27 + { 0x00, 0x00, 0x00, 0x00 }, // Frame 28 + { 0x00, 0x00, 0x00, 0x00 }, // Frame 29 + { 0x00, 0x00, 0x00, 0x00 }, // Frame 30 + { 0x3f, 0x3f, 0x3f, 0x3f }, // Frame 31 + { 0x3f, 0x3f, 0x3f, 0x3f }, // Frame 32 + { 0x3f, 0x3f, 0x3f, 0x3f }, // Frame 33 + { 0x00, 0x00, 0x00, 0x00 }, // Frame 34 + { 0x00, 0x00, 0x00, 0x00 }, // Frame 35 + { 0x00, 0x00, 0x00, 0x00 }, // Frame 36 + { 0x3f, 0x3f, 0x3f, 0x3f }, // Frame 37 + { 0x3f, 0x3f, 0x3f, 0x3f }, // Frame 38 + { 0x3f, 0x3f, 0x3f, 0x3f } // Frame 39 +}; + +// Text string constants can be stored in PROGMEM read-only flash memory. +// This requires using the showString_P() function to read from PROGMEM memory space. +// PROGMEM space strings are globally defined. + +const PROGMEM char FlashString[] = "Flash Test - 1234567890"; +const PROGMEM char FlashString2[] = "good"; + +TM1637TinyDisplay display(CLK, DIO); + +void setup() +{ +} + +void loop() +{ + int k; + uint8_t data[] = { 0xff, 0xff, 0xff, 0xff }; // Test Pattern - All + uint8_t blank[] = { 0x00, 0x00, 0x00, 0x00 }; // Test Pattern - Blank + display.setBrightness(BRIGHT_HIGH); + + // Announce Testing + display.showString("Test"); + delay(TEST_DELAY); + + // All segments on + display.setSegments(data); + delay(TEST_DELAY); + + // Test setting different digits + data[0] = display.encodeDigit(0); + data[1] = display.encodeDigit(1); + data[2] = display.encodeDigit(2); + data[3] = display.encodeDigit(3); + display.setSegments(data); + delay(TEST_DELAY); + + // Test display splitting with position + display.clear(); + display.setSegments(data + 2, 2, 2); // Length 2, Position 2 + delay(TEST_DELAY); + display.clear(); + display.setSegments(data + 2, 2, 1); // Length 2, Position 1 + delay(TEST_DELAY); + display.clear(); + display.setSegments(data + 1, 3, 1); // Length 3, Position 1 + delay(TEST_DELAY); + + // Test decimal numbers with/without leading zeros in different positions + display.showNumber(0, false); // Expect: ___0 + delay(TEST_DELAY); + display.showNumber(0, true); // Expect: 0000 + delay(TEST_DELAY); + display.showNumber(1, false); // Expect: ___1 + delay(TEST_DELAY); + display.showNumber(1, true); // Expect: 0001 + delay(TEST_DELAY); + display.showNumber(301, false); // Expect: _301 + delay(TEST_DELAY); + display.showNumber(301, true); // Expect: 0301 + delay(TEST_DELAY); + display.clear(); + display.showNumber(14, false, 2, 1); // Expect: _14_ + delay(TEST_DELAY); + display.clear(); + display.showNumber(4, true, 2, 2); // Expect: __04 + delay(TEST_DELAY); + display.showNumber(-1, false); // Expect: __-1 + delay(TEST_DELAY); + display.showNumber(-12); // Expect: _-12 + delay(TEST_DELAY); + display.showNumber(-999); // Expect: -999 + delay(TEST_DELAY); + display.clear(); + display.showNumber(-5, false, 3, 0); // Expect: _-5_ + delay(TEST_DELAY); + display.showNumberHex(0xf1af); // Expect: f1Af + delay(TEST_DELAY); + display.showNumberHex(0x2c); // Expect: __2C + delay(TEST_DELAY); + display.showNumberHex(0xd1, 0, true); // Expect: 00d1 + delay(TEST_DELAY); + display.clear(); + display.showNumberHex(0xd1, 0, true, 2); // Expect: d1__ + delay(TEST_DELAY); + + // Floating point tests + display.showNumber(1.234); // Floating point number + delay(TEST_DELAY); + + display.showNumber(1.234, 2); // Format to 2 decimal places + delay(TEST_DELAY); + + display.showNumber(-1.234); // Negative floating point number + delay(TEST_DELAY); + + display.showNumber(-0.5); // Zero prefix floating point number + delay(TEST_DELAY); + + display.showNumber(0.4); + delay(TEST_DELAY); + + display.showNumber(1005.3); + delay(TEST_DELAY); + + display.showNumber(10005.3); // Overflow test + delay(TEST_DELAY); + + display.showNumber(0.52345, 1); + delay(TEST_DELAY); + + display.showNumber(0.255, 2); // Test rounding up + delay(TEST_DELAY); + + display.showString("\xB0", 1, 3); // Test with suffix + display.showNumber(12.3, 4, 3, 0); + delay(TEST_DELAY); + + for (int x = -100; x < 100; x = x + 1) { // Count + display.showNumber((float)x / 10.0); + } + + // Test all the dots + for (k = 0; k <= 4; k++) { + display.showNumberDec(0, (0x80 >> k), true); + delay(TEST_DELAY); + } + + // Test Brightness Levels + for (k = 0; k < 4; k++) + data[k] = 0xff; + for (k = 0; k < 7; k++) { + display.setBrightness(k); + display.setSegments(data); + delay(TEST_DELAY); + } + + // Test Display On/Off + for (k = 0; k < 4; k++) { + display.setBrightness(7, false); // Turn off + display.setSegments(data); + delay(TEST_DELAY); + display.setBrightness(7, true); // Turn on + display.setSegments(data); + delay(TEST_DELAY); + } + + // Test Horizontal Level Meter + for (int count = 0; count < 3; count++) { + for (int x = 0; x <= 100; x = x + 10) { + display.showLevel(x, true); + delay(20); + } + for (int x = 100; x > 0; x = x - 10) { + display.showLevel(x, true); + delay(20); + } + } + // Test Vertical Level Meter + for (int count = 0; count < 3; count++) { + for (int x = 0; x <= 100; x = x + 10) { + display.showLevel(x, false); + delay(20); + } + for (int x = 100; x > 0; x = x - 10) { + display.showLevel(x, false); + delay(20); + } + } + + // Test Numbers and Strings Using Positions + display.clear(); + char degree[] = "\xB0"; + display.showString(degree, 1, 3); // Position 3 (right) and 1 char length + for (int x = -50; x < 150; x++) { + display.showNumber(x, false, 3, 0); // Postion 0 (left) and 3 char length + delay(10); + } + delay(TEST_DELAY); + + // Test String Display + display.clear(); + display.showString("String Test 1234"); // Test literal string + delay(TEST_DELAY); + display.clear(); + char stringb[10]; // Test dynamic string + sprintf(stringb, "25%cC", '\xB0'); // Display 25 + degree symbol + C + display.showString(stringb); + delay(TEST_DELAY); + display.clear(); // Long string test + display.showString("abcdefghijklmnopqrstuvwxyz.-=ABCDEFGHIJKLMNOPQRSTUVWXYZ"); + delay(TEST_DELAY); + + // Test Strings in PROGMEM flash memory + display.showString_P(FlashString); + delay(1000); + display.showString_P(FlashString2); + delay(1000); + + // Animation Sequence Test in SRAM - Run 3 times + display.clear(); + for (int count = 0; count < 3; count++) { + display.showAnimation(ANIMATION, FRAMES(ANIMATION), TIME_MS(10)); + } + display.clear(); + delay(TEST_DELAY); + + // Animation Sequence Test in PROGMEM flash memory + display.clear(); + display.showAnimation_P(ANIMATION2, FRAMES(ANIMATION2), TIME_MS(50)); + + // Done! + display.clear(); + display.showString("The"); + delay(TEST_DELAY); + display.showString("End"); + delay(TEST_DELAY); + display.setSegments(SEG_DONE); + delay(TEST_DELAY * 5); + +} diff --git a/lib/lib_display/TM1637TinyDisplay/examples/tm1637.png b/lib/lib_display/TM1637TinyDisplay/examples/tm1637.png new file mode 100644 index 0000000000000000000000000000000000000000..a22aceebaa2657fdbedb28d1141f17bc654151e8 GIT binary patch literal 214608 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%0A40_f$VV3*xyqsmu6(0iHwNWzd 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

|k(ia~KbUVk^}~ZAyBnq&AFq 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%0DGh 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 z!or261|+rΠ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%0A#{V?jl8=o?K;CKUP&+(!u z1TfGyg`*$kzzi223qxpCI4eDnpTd1YeBcM>1pP)K2**>fXicsKT*1@0zzN*QRc#Kh z*Ef$x(ZrfxU8^+7Te3;cg*=5{3L0!?486hwe7MNZl?L*_^Q6!$`HP>09O3qI+c8n< z4qe0Rd*>|=eaXqt{5Ti&a5#_l6X8$A1gcwXrs0ZR4 zYK5uR%Bo^!4RT`80o&vdC}tAhr)eeH00BTL8c1^)sIZB)21yN!<-GwSTa(pb!U*WX z<<2cn2r7k}-D68gs?wo730Wnn5W^xjLHkJ|5=hejnY;)m+94hz;DOB6?R_>bmN)=W z94r`?6u}@AG;S&S=+DC}ONPA!uY_+(eD>Zl&LP-tVnML3Su$@WGy~7TSN%SP$ts2D zvuDapDZ3o^omaT#K_DDFDZWdTMq53&U#>--V6~#1JCKE4DJ%>3si&W8?ZMIV6zxCt zx&wo42DPY@q2fG`O!Me& z-OGv)81Ew?>2kk*(7o?5I>CZjF{gQGhmbc{R;ENS9(XWMUf9>z(1j2k+Qtur`?^*~ zXphyq@}BuR8UcLaYJ_sQMRwx}HXigr0a&;Pmd3_tf=hdyDRTu=WzZ7#c!-b!N0uml z4wXau#>_LPIMA6=YxB|GI=|XXV6v|5=SCj*OwsZv@f!=(9MK`3;T=$vUU_xGs_4)W z73S|5f_OIfY~GtZ10_!|n-3hKyP<{Vt8GRG*aNh=z8C-C*MUdh@yc9qGcqe$*a%X1 zY>?6TS`}#C_zQm%_ziP#h6c$6I1*lEdBYE(DbGk)gTdJh8-^vk=@0LCr3CadG?b+e zj^+$za0_o_6MV=sl8^E@A~1&zl@zZpw8D63NHZ>qhw=j#{D-gfhsNZr348Fw*B;WR zH;kjfWzYB>{?UcGc?R6IVPQ05?b4<5L+^~eHQKP^O0+`=3+-#49H0mp0gQz$f921# zMM~};1e&ZxW0=eUOpu2`m?J0`Mv#nNfn$TXN@f#?CTR@^W;D_HKH{P^r;?;+3B(s( zcySod!b2`ud>#?5As`48hqFf)WE-&9D&QHPF|mwy4^gWBU$+nt3ZaqTyNhUuIB?)l zM0~4#rcRFK3t(!&?OfXz;}Rnx#4QxXI%X{sbR&e~T5Aj-;rfkoD^)T<0^x?CwDWou zU$ow%c{Qrsz)4vri)vsMv4F*W30R?|Nw6pI5Rw{x(sfUBq2ZNf-p(@wS2-d{V3r1J zmv@3#&*nnE7b77egy?tDg>~vVp%2!c755fAT2ZWE!u)tQaKwsa-N^qSRsxjE8#hKs zE1cDZW9CLPZ8=gPu|FXj9+3XghMd>6Yn^CWycXkCu$Is&gffE79!|C2Jb7O%ax1ne z-*e~I$`fN{Wj@lj7-Q`OD`6-~5^;_fl|nyqMDA+u@=A+V&lENzTvy?|dX*r#rAoA0 z&DVeE#&^#9pdz1n?wK(@-fh165sF~tT0DyJUn{8%pW|&buc-_Ro)o=y2(Ix+8XG}I zdBSzFVyw({t;1Tzin-wq)4{#)gHXp5SrBC5p1}f+ta(C^B68`6wW?i}M;LoT!&$c0 zi!`kf2FA)FWIVx>{1735Pgu{4mqV@lLEF4Q#U%RM6tGYht8k2_3l&*ÿw-`<}p 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 literal 0 HcmV?d00001 diff --git a/lib/lib_display/TM1637TinyDisplay/examples/tm1637back.png b/lib/lib_display/TM1637TinyDisplay/examples/tm1637back.png new file mode 100644 index 0000000000000000000000000000000000000000..f50c36ead0d8c25c60519c4bd42a49be416fd290 GIT binary patch literal 215488 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

o2*Cc0t>z{#J-|18wjmAVJr;>$UCR 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 z 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

T0_wE!G~r=LQFK$-c&hVsh41 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 z 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 literal 0 HcmV?d00001 diff --git a/lib/lib_display/TM1637TinyDisplay/keywords.txt b/lib/lib_display/TM1637TinyDisplay/keywords.txt new file mode 100644 index 000000000..2a3d0a45b --- /dev/null +++ b/lib/lib_display/TM1637TinyDisplay/keywords.txt @@ -0,0 +1,65 @@ +####################################### +# Datatypes (KEYWORD1) +####################################### + +TM1637TinyDisplay KEYWORD1 + +####################################### +# Methods and Functions (KEYWORD2) +####################################### + +setBrightness KEYWORD2 +setSegments KEYWORD2 +setScrolldelay KEYWORD2 +clear KEYWORD2 +showNumber KEYWORD2 +showLevel KEYWORD2 +showString KEYWORD2 +showString_P KEYWORD2 +showAnimation KEYWORD2 +showAnimation_P KEYWORD2 +showNumberDec KEYWORD2 +showNumberHex KEYWORD2 +encodeDigit KEYWORD2 +encodeASCII KEYWORD2 + +####################################### +# Constants (LITERAL1) +####################################### + +SEG_A LITERAL1 +SEG_B LITERAL1 +SEG_C LITERAL1 +SEG_D LITERAL1 +SEG_E LITERAL1 +SEG_F LITERAL1 +SEG_G LITERAL1 +SEG_DP LITERAL1 + +digitToSegment LITERAL1 +asciiToSegment LITERAL1 +minusSegments LITERAL1 +degreeSegments LITERAL1 + +BRIGHT_LOW LITERAL1 +BRIGHT_0 LITERAL1 +BRIGHT_1 LITERAL1 +BRIGHT_2 LITERAL1 +BRIGHT_3 LITERAL1 +BRIGHT_4 LITERAL1 +BRIGHT_5 LITERAL1 +BRIGHT_6 LITERAL1 +BRIGHT_7 LITERAL1 +BRIGHT_8 LITERAL1 +BRIGHT_HIGH LITERAL1 + +ON LITERAL1 +OFF LITERAL1 + +####################################### +# Macros (LITERAL1) +####################################### + +FRAMES LITERAL1 +TIME_MS LITERAL1 +TIME_S LITERAL1 diff --git a/lib/lib_display/TM1637TinyDisplay/library.json b/lib/lib_display/TM1637TinyDisplay/library.json new file mode 100644 index 000000000..f583deb48 --- /dev/null +++ b/lib/lib_display/TM1637TinyDisplay/library.json @@ -0,0 +1,15 @@ +{ + "name": "TM1637TinyDisplay", + "keywords": "TM1637, tiny, LED, display", + "description": "A simple library to display numbers, text and animation on a 4-digit 7-segment TM1637 based display module.", + "repository": { + "type": "git", + "url": "https://github.com/jasonacox/TM1637TinyDisplay.git" + }, + "authors": { + "name": "Jason Cox", + "url": "https://jasonacox.com" + }, + "frameworks": "arduino", + "platforms": "*" +} \ No newline at end of file diff --git a/lib/lib_display/TM1637TinyDisplay/library.properties b/lib/lib_display/TM1637TinyDisplay/library.properties new file mode 100644 index 000000000..a706d5c2f --- /dev/null +++ b/lib/lib_display/TM1637TinyDisplay/library.properties @@ -0,0 +1,10 @@ +name=TM1637TinyDisplay +version=1.3.0 +author=Jason Cox +maintainer=Jason Cox +sentence=A simple library to display numbers, text and animation on a 4-digit 7-segment TM1637 based display module. +paragraph=Connect the TM1637 display CLK and DIO pins to your Arduino GPIO pins, include this library, initialize TM1637TinyDisplay and call easy to use functions like showNumber(), showString(), showLevel() and showAnimation(). Display will scroll text for larger strings. Functions support screen splitting for easy number + text formatting. Runs well on tiny controllers including the ATtiny85. +category=Display +url=https://github.com/jasonacox/TM1637TinyDisplay +architectures=* +includes=TM1637TinyDisplay.h diff --git a/tasmota/language/af_AF.h b/tasmota/language/af_AF.h index 2a6acd73d..bdc584897 100644 --- a/tasmota/language/af_AF.h +++ b/tasmota/language/af_AF.h @@ -639,6 +639,8 @@ #define D_SENSOR_TM1638_CLK "TM16 CLK" #define D_SENSOR_TM1638_DIO "TM16 DIO" #define D_SENSOR_TM1638_STB "TM16 STB" +#define D_SENSOR_TM1637_CLK "TM1637 CLK" +#define D_SENSOR_TM1637_DIO "TM1637 DIO" #define D_SENSOR_HX711_SCK "HX711 SCK" #define D_SENSOR_HX711_DAT "HX711 DAT" #define D_SENSOR_FTC532 "FTC532" diff --git a/tasmota/language/bg_BG.h b/tasmota/language/bg_BG.h index b5a450bd7..ed4be8d8e 100644 --- a/tasmota/language/bg_BG.h +++ b/tasmota/language/bg_BG.h @@ -638,6 +638,8 @@ #define D_SENSOR_TM1638_CLK "TM16 CLK" #define D_SENSOR_TM1638_DIO "TM16 DIO" #define D_SENSOR_TM1638_STB "TM16 STB" +#define D_SENSOR_TM1637_CLK "TM1637 CLK" +#define D_SENSOR_TM1637_DIO "TM1637 DIO" #define D_SENSOR_HX711_SCK "HX711 SCK" #define D_SENSOR_HX711_DAT "HX711 DAT" #define D_SENSOR_FTC532 "FTC532" diff --git a/tasmota/language/cs_CZ.h b/tasmota/language/cs_CZ.h index 6449196c5..747c16efd 100644 --- a/tasmota/language/cs_CZ.h +++ b/tasmota/language/cs_CZ.h @@ -639,6 +639,8 @@ #define D_SENSOR_TM1638_CLK "TM16 CLK" #define D_SENSOR_TM1638_DIO "TM16 DIO" #define D_SENSOR_TM1638_STB "TM16 STB" +#define D_SENSOR_TM1637_CLK "TM1637 CLK" +#define D_SENSOR_TM1637_DIO "TM1637 DIO" #define D_SENSOR_HX711_SCK "HX711 SCK" #define D_SENSOR_HX711_DAT "HX711 DAT" #define D_SENSOR_FTC532 "FTC532" diff --git a/tasmota/language/de_DE.h b/tasmota/language/de_DE.h index 1af8a09ac..38a422391 100644 --- a/tasmota/language/de_DE.h +++ b/tasmota/language/de_DE.h @@ -639,6 +639,8 @@ #define D_SENSOR_TM1638_CLK "TM16 CLK" #define D_SENSOR_TM1638_DIO "TM16 DIO" #define D_SENSOR_TM1638_STB "TM16 STB" +#define D_SENSOR_TM1637_CLK "TM1637 CLK" +#define D_SENSOR_TM1637_DIO "TM1637 DIO" #define D_SENSOR_HX711_SCK "HX711 SCK" #define D_SENSOR_HX711_DAT "HX711 DAT" #define D_SENSOR_FTC532 "FTC532" diff --git a/tasmota/language/el_GR.h b/tasmota/language/el_GR.h index 0409a9696..66e5b16c6 100644 --- a/tasmota/language/el_GR.h +++ b/tasmota/language/el_GR.h @@ -639,6 +639,8 @@ #define D_SENSOR_TM1638_CLK "TM16 CLK" #define D_SENSOR_TM1638_DIO "TM16 DIO" #define D_SENSOR_TM1638_STB "TM16 STB" +#define D_SENSOR_TM1637_CLK "TM1637 CLK" +#define D_SENSOR_TM1637_DIO "TM1637 DIO" #define D_SENSOR_HX711_SCK "HX711 SCK" #define D_SENSOR_HX711_DAT "HX711 DAT" #define D_SENSOR_FTC532 "FTC532" diff --git a/tasmota/language/en_GB.h b/tasmota/language/en_GB.h index 2cde1ccdf..bf822d919 100644 --- a/tasmota/language/en_GB.h +++ b/tasmota/language/en_GB.h @@ -639,6 +639,8 @@ #define D_SENSOR_TM1638_CLK "TM16 CLK" #define D_SENSOR_TM1638_DIO "TM16 DIO" #define D_SENSOR_TM1638_STB "TM16 STB" +#define D_SENSOR_TM1637_CLK "TM1637 CLK" +#define D_SENSOR_TM1637_DIO "TM1637 DIO" #define D_SENSOR_HX711_SCK "HX711 SCK" #define D_SENSOR_HX711_DAT "HX711 DAT" #define D_SENSOR_FTC532 "FTC532" diff --git a/tasmota/language/es_ES.h b/tasmota/language/es_ES.h index 0147a88f5..342872e63 100644 --- a/tasmota/language/es_ES.h +++ b/tasmota/language/es_ES.h @@ -639,6 +639,8 @@ #define D_SENSOR_TM1638_CLK "TM16 CLK" #define D_SENSOR_TM1638_DIO "TM16 DIO" #define D_SENSOR_TM1638_STB "TM16 STB" +#define D_SENSOR_TM1637_CLK "TM1637 CLK" +#define D_SENSOR_TM1637_DIO "TM1637 DIO" #define D_SENSOR_HX711_SCK "HX711 SCK" #define D_SENSOR_HX711_DAT "HX711 DAT" #define D_SENSOR_FTC532 "FTC532" diff --git a/tasmota/language/fr_FR.h b/tasmota/language/fr_FR.h index 2d2a8aaba..ad3b3d638 100644 --- a/tasmota/language/fr_FR.h +++ b/tasmota/language/fr_FR.h @@ -635,6 +635,8 @@ #define D_SENSOR_TM1638_CLK "TM16 CLK" #define D_SENSOR_TM1638_DIO "TM16 DIO" #define D_SENSOR_TM1638_STB "TM16 STB" +#define D_SENSOR_TM1637_CLK "TM1637 CLK" +#define D_SENSOR_TM1637_DIO "TM1637 DIO" #define D_SENSOR_HX711_SCK "HX711 SCK" #define D_SENSOR_HX711_DAT "HX711 DAT" #define D_SENSOR_FTC532 "FTC532" diff --git a/tasmota/language/fy_NL.h b/tasmota/language/fy_NL.h index 29167a6c6..8b047dfee 100644 --- a/tasmota/language/fy_NL.h +++ b/tasmota/language/fy_NL.h @@ -639,6 +639,8 @@ #define D_SENSOR_TM1638_CLK "TM16 CLK" #define D_SENSOR_TM1638_DIO "TM16 DIO" #define D_SENSOR_TM1638_STB "TM16 STB" +#define D_SENSOR_TM1637_CLK "TM1637 CLK" +#define D_SENSOR_TM1637_DIO "TM1637 DIO" #define D_SENSOR_HX711_SCK "HX711 SCK" #define D_SENSOR_HX711_DAT "HX711 DAT" #define D_SENSOR_FTC532 "FTC532" diff --git a/tasmota/language/he_HE.h b/tasmota/language/he_HE.h index 11b2e385e..61ed51948 100644 --- a/tasmota/language/he_HE.h +++ b/tasmota/language/he_HE.h @@ -639,6 +639,8 @@ #define D_SENSOR_TM1638_CLK "TM16 CLK" #define D_SENSOR_TM1638_DIO "TM16 DIO" #define D_SENSOR_TM1638_STB "TM16 STB" +#define D_SENSOR_TM1637_CLK "TM1637 CLK" +#define D_SENSOR_TM1637_DIO "TM1637 DIO" #define D_SENSOR_HX711_SCK "HX711 SCK" #define D_SENSOR_HX711_DAT "HX711 DAT" #define D_SENSOR_FTC532 "FTC532" diff --git a/tasmota/language/hu_HU.h b/tasmota/language/hu_HU.h index f7b862d96..0b5a2d074 100644 --- a/tasmota/language/hu_HU.h +++ b/tasmota/language/hu_HU.h @@ -639,6 +639,8 @@ #define D_SENSOR_TM1638_CLK "TM16 CLK" #define D_SENSOR_TM1638_DIO "TM16 DIO" #define D_SENSOR_TM1638_STB "TM16 STB" +#define D_SENSOR_TM1637_CLK "TM1637 CLK" +#define D_SENSOR_TM1637_DIO "TM1637 DIO" #define D_SENSOR_HX711_SCK "HX711 SCK" #define D_SENSOR_HX711_DAT "HX711 DAT" #define D_SENSOR_FTC532 "FTC532" diff --git a/tasmota/language/ko_KO.h b/tasmota/language/ko_KO.h index 22d0b17e1..c02051a81 100644 --- a/tasmota/language/ko_KO.h +++ b/tasmota/language/ko_KO.h @@ -639,6 +639,8 @@ #define D_SENSOR_TM1638_CLK "TM16 CLK" #define D_SENSOR_TM1638_DIO "TM16 DIO" #define D_SENSOR_TM1638_STB "TM16 STB" +#define D_SENSOR_TM1637_CLK "TM1637 CLK" +#define D_SENSOR_TM1637_DIO "TM1637 DIO" #define D_SENSOR_HX711_SCK "HX711 SCK" #define D_SENSOR_HX711_DAT "HX711 DAT" #define D_SENSOR_FTC532 "FTC532" diff --git a/tasmota/language/nl_NL.h b/tasmota/language/nl_NL.h index 908e8c576..c6a4d68a5 100644 --- a/tasmota/language/nl_NL.h +++ b/tasmota/language/nl_NL.h @@ -639,6 +639,8 @@ #define D_SENSOR_TM1638_CLK "TM16 CLK" #define D_SENSOR_TM1638_DIO "TM16 DIO" #define D_SENSOR_TM1638_STB "TM16 STB" +#define D_SENSOR_TM1637_CLK "TM1637 CLK" +#define D_SENSOR_TM1637_DIO "TM1637 DIO" #define D_SENSOR_HX711_SCK "HX711 SCK" #define D_SENSOR_HX711_DAT "HX711 DAT" #define D_SENSOR_FTC532 "FTC532" diff --git a/tasmota/language/pl_PL.h b/tasmota/language/pl_PL.h index 9a7c2cd03..d558741b6 100644 --- a/tasmota/language/pl_PL.h +++ b/tasmota/language/pl_PL.h @@ -639,6 +639,8 @@ #define D_SENSOR_TM1638_CLK "TM16 CLK" #define D_SENSOR_TM1638_DIO "TM16 DIO" #define D_SENSOR_TM1638_STB "TM16 STB" +#define D_SENSOR_TM1637_CLK "TM1637 CLK" +#define D_SENSOR_TM1637_DIO "TM1637 DIO" #define D_SENSOR_HX711_SCK "HX711 SCK" #define D_SENSOR_HX711_DAT "HX711 DAT" #define D_SENSOR_FTC532 "FTC532" diff --git a/tasmota/language/pt_BR.h b/tasmota/language/pt_BR.h index 84aef8ede..ed949015d 100644 --- a/tasmota/language/pt_BR.h +++ b/tasmota/language/pt_BR.h @@ -639,6 +639,8 @@ #define D_SENSOR_TM1638_CLK "TM16 CLK" #define D_SENSOR_TM1638_DIO "TM16 DIO" #define D_SENSOR_TM1638_STB "TM16 STB" +#define D_SENSOR_TM1637_CLK "TM1637 CLK" +#define D_SENSOR_TM1637_DIO "TM1637 DIO" #define D_SENSOR_HX711_SCK "HX711 SCK" #define D_SENSOR_HX711_DAT "HX711 DAT" #define D_SENSOR_FTC532 "FTC532" diff --git a/tasmota/language/pt_PT.h b/tasmota/language/pt_PT.h index a02bb9a67..3af1c0745 100644 --- a/tasmota/language/pt_PT.h +++ b/tasmota/language/pt_PT.h @@ -639,6 +639,8 @@ #define D_SENSOR_TM1638_CLK "TM16 CLK" #define D_SENSOR_TM1638_DIO "TM16 DIO" #define D_SENSOR_TM1638_STB "TM16 STB" +#define D_SENSOR_TM1637_CLK "TM1637 CLK" +#define D_SENSOR_TM1637_DIO "TM1637 DIO" #define D_SENSOR_HX711_SCK "HX711 SCK" #define D_SENSOR_HX711_DAT "HX711 DAT" #define D_SENSOR_FTC532 "FTC532" diff --git a/tasmota/language/ro_RO.h b/tasmota/language/ro_RO.h index 9a1ed142a..608f95d39 100644 --- a/tasmota/language/ro_RO.h +++ b/tasmota/language/ro_RO.h @@ -639,6 +639,8 @@ #define D_SENSOR_TM1638_CLK "TM16 CLK" #define D_SENSOR_TM1638_DIO "TM16 DIO" #define D_SENSOR_TM1638_STB "TM16 STB" +#define D_SENSOR_TM1637_CLK "TM1637 CLK" +#define D_SENSOR_TM1637_DIO "TM1637 DIO" #define D_SENSOR_HX711_SCK "HX711 SCK" #define D_SENSOR_HX711_DAT "HX711 DAT" #define D_SENSOR_FTC532 "FTC532" diff --git a/tasmota/language/ru_RU.h b/tasmota/language/ru_RU.h index a2029c118..268258e57 100644 --- a/tasmota/language/ru_RU.h +++ b/tasmota/language/ru_RU.h @@ -639,6 +639,8 @@ #define D_SENSOR_TM1638_CLK "TM16 CLK" #define D_SENSOR_TM1638_DIO "TM16 DIO" #define D_SENSOR_TM1638_STB "TM16 STB" +#define D_SENSOR_TM1637_CLK "TM1637 CLK" +#define D_SENSOR_TM1637_DIO "TM1637 DIO" #define D_SENSOR_HX711_SCK "HX711 SCK" #define D_SENSOR_HX711_DAT "HX711 DAT" #define D_SENSOR_FTC532 "FTC532" diff --git a/tasmota/language/sk_SK.h b/tasmota/language/sk_SK.h index a7e2f2f9a..e8504bd19 100644 --- a/tasmota/language/sk_SK.h +++ b/tasmota/language/sk_SK.h @@ -639,6 +639,8 @@ #define D_SENSOR_TM1638_CLK "TM16 CLK" #define D_SENSOR_TM1638_DIO "TM16 DIO" #define D_SENSOR_TM1638_STB "TM16 STB" +#define D_SENSOR_TM1637_CLK "TM1637 CLK" +#define D_SENSOR_TM1637_DIO "TM1637 DIO" #define D_SENSOR_HX711_SCK "HX711 SCK" #define D_SENSOR_HX711_DAT "HX711 DAT" #define D_SENSOR_FTC532 "FTC532" diff --git a/tasmota/language/sv_SE.h b/tasmota/language/sv_SE.h index 32708fe6a..def70b05e 100644 --- a/tasmota/language/sv_SE.h +++ b/tasmota/language/sv_SE.h @@ -639,6 +639,8 @@ #define D_SENSOR_TM1638_CLK "TM16 CLK" #define D_SENSOR_TM1638_DIO "TM16 DIO" #define D_SENSOR_TM1638_STB "TM16 STB" +#define D_SENSOR_TM1637_CLK "TM1637 CLK" +#define D_SENSOR_TM1637_DIO "TM1637 DIO" #define D_SENSOR_HX711_SCK "HX711 SCK" #define D_SENSOR_HX711_DAT "HX711 DAT" #define D_SENSOR_FTC532 "FTC532" diff --git a/tasmota/language/tr_TR.h b/tasmota/language/tr_TR.h index b45a886e3..762a3c6c0 100644 --- a/tasmota/language/tr_TR.h +++ b/tasmota/language/tr_TR.h @@ -639,6 +639,8 @@ #define D_SENSOR_TM1638_CLK "TM16 CLK" #define D_SENSOR_TM1638_DIO "TM16 DIO" #define D_SENSOR_TM1638_STB "TM16 STB" +#define D_SENSOR_TM1637_CLK "TM1637 CLK" +#define D_SENSOR_TM1637_DIO "TM1637 DIO" #define D_SENSOR_HX711_SCK "HX711 SCK" #define D_SENSOR_HX711_DAT "HX711 DAT" #define D_SENSOR_FTC532 "FTC532" diff --git a/tasmota/language/uk_UA.h b/tasmota/language/uk_UA.h index 8fb58deed..d093295d6 100644 --- a/tasmota/language/uk_UA.h +++ b/tasmota/language/uk_UA.h @@ -639,6 +639,8 @@ #define D_SENSOR_TM1638_CLK "TM16 CLK" #define D_SENSOR_TM1638_DIO "TM16 DIO" #define D_SENSOR_TM1638_STB "TM16 STB" +#define D_SENSOR_TM1637_CLK "TM1637 CLK" +#define D_SENSOR_TM1637_DIO "TM1637 DIO" #define D_SENSOR_HX711_SCK "HX711 SCK" #define D_SENSOR_HX711_DAT "HX711 DAT" #define D_SENSOR_FTC532 "FTC532" diff --git a/tasmota/language/vi_VN.h b/tasmota/language/vi_VN.h index 1bc4ffe71..704f96b47 100644 --- a/tasmota/language/vi_VN.h +++ b/tasmota/language/vi_VN.h @@ -639,6 +639,8 @@ #define D_SENSOR_TM1638_CLK "TM16 CLK" #define D_SENSOR_TM1638_DIO "TM16 DIO" #define D_SENSOR_TM1638_STB "TM16 STB" +#define D_SENSOR_TM1637_CLK "TM1637 CLK" +#define D_SENSOR_TM1637_DIO "TM1637 DIO" #define D_SENSOR_HX711_SCK "HX711 SCK" #define D_SENSOR_HX711_DAT "HX711 DAT" #define D_SENSOR_FTC532 "FTC532" diff --git a/tasmota/language/zh_CN.h b/tasmota/language/zh_CN.h index bc929c300..41bdb51ed 100644 --- a/tasmota/language/zh_CN.h +++ b/tasmota/language/zh_CN.h @@ -639,6 +639,8 @@ #define D_SENSOR_TM1638_CLK "TM16 CLK" #define D_SENSOR_TM1638_DIO "TM16 DIO" #define D_SENSOR_TM1638_STB "TM16 STB" +#define D_SENSOR_TM1637_CLK "TM1637 CLK" +#define D_SENSOR_TM1637_DIO "TM1637 DIO" #define D_SENSOR_HX711_SCK "HX711 SCK" #define D_SENSOR_HX711_DAT "HX711 DAT" #define D_SENSOR_FTC532 "FTC532" diff --git a/tasmota/language/zh_TW.h b/tasmota/language/zh_TW.h index 51c8d50f8..39044c77c 100644 --- a/tasmota/language/zh_TW.h +++ b/tasmota/language/zh_TW.h @@ -639,6 +639,8 @@ #define D_SENSOR_TM1638_CLK "TM16 CLK" #define D_SENSOR_TM1638_DIO "TM16 DIO" #define D_SENSOR_TM1638_STB "TM16 STB" +#define D_SENSOR_TM1637_CLK "TM1637 CLK" +#define D_SENSOR_TM1637_DIO "TM1637 DIO" #define D_SENSOR_HX711_SCK "HX711 SCK" #define D_SENSOR_HX711_DAT "HX711 DAT" #define D_SENSOR_FTC532 "FTC532" diff --git a/tasmota/my_user_config.h b/tasmota/my_user_config.h index 25a629c05..8c3546d31 100644 --- a/tasmota/my_user_config.h +++ b/tasmota/my_user_config.h @@ -776,6 +776,7 @@ // -- Other sensors/drivers ----------------------- //#define USE_TM1638 // Add support for TM1638 switches copying Switch1 .. Switch8 (+1k code) +//#define USE_TM1637 // Add support for TM1637 seven-segment display (+1k code) //#define USE_HX711 // Add support for HX711 load cell (+1k5 code) // #define USE_HX711_GUI // Add optional web GUI to HX711 as scale (+1k8 code) diff --git a/tasmota/support_features.ino b/tasmota/support_features.ino index 1d17193e5..a41dda14c 100644 --- a/tasmota/support_features.ino +++ b/tasmota/support_features.ino @@ -320,6 +320,9 @@ void ResponseAppendFeatures(void) #endif #ifdef USE_TM1638 feature3 |= 0x80000000; // xsns_28_tm1638.ino +#endif +#ifdef USE_TM1637 + feature3 |= 0x100000000; // xsns_85_tm1637.ino #endif } diff --git a/tasmota/support_tasmota.ino b/tasmota/support_tasmota.ino index 23de8a3d9..e3a25f36e 100644 --- a/tasmota/support_tasmota.ino +++ b/tasmota/support_tasmota.ino @@ -761,6 +761,8 @@ bool MqttShowSensor(void) for (uint32_t i = 0; i < MAX_SWITCHES; i++) { #ifdef USE_TM1638 if (PinUsed(GPIO_SWT1, i) || (PinUsed(GPIO_TM16CLK) && PinUsed(GPIO_TM16DIO) && PinUsed(GPIO_TM16STB))) { +#elif defined(USE_TM1637) + if (PinUsed(GPIO_TM1637_CLK) && PinUsed(GPIO_TM1637_DIO)) { #else if (PinUsed(GPIO_SWT1, i)) { #endif // USE_TM1638 diff --git a/tasmota/tasmota_configurations.h b/tasmota/tasmota_configurations.h index de60b84e1..0dd97bb58 100644 --- a/tasmota/tasmota_configurations.h +++ b/tasmota/tasmota_configurations.h @@ -202,6 +202,7 @@ #define USE_LMT01 // Add support for TI LMT01 temperature sensor, count pulses on single GPIO (+0k5 code) //#define USE_WIEGAND // Add support for 24/26/32/34 bit RFID Wiegand interface (D0/D1) (+1k7 code) #define USE_TM1638 // Add support for TM1638 switches copying Switch1 .. Switch8 (+1k code) +#define USE_TM1637 // Add support for TM1637 seven-segment display #define USE_HX711 // Add support for HX711 load cell (+1k5 code) //#define USE_HX711_GUI // Add optional web GUI to HX711 as scale (+1k8 code) //#define USE_TX20_WIND_SENSOR // Add support for La Crosse TX20 anemometer (+2k6/0k8 code) @@ -432,6 +433,7 @@ #undef USE_MAX31855 // Disable MAX31855 K-Type thermocouple sensor using softSPI #undef USE_MAX31865 // Disable support for MAX31865 RTD sensors using softSPI #undef USE_TM1638 // Disable support for TM1638 switches copying Switch1 .. Switch8 +#undef USE_TM1637 // Disable support for TM1637 seven-segment display #undef USE_HX711 // Disable support for HX711 load cell #undef USE_TX20_WIND_SENSOR // Disable support for La Crosse TX20 anemometer #undef USE_TX23_WIND_SENSOR // Disable support for La Crosse TX23 anemometer @@ -579,6 +581,7 @@ #undef USE_IR_REMOTE // Disable IR driver #undef USE_TM1638 // Disable support for TM1638 switches copying Switch1 .. Switch8 +#undef USE_TM1637 // Disable support for TM1637 seven-segment display #undef USE_HX711 // Disable support for HX711 load cell #undef USE_TX20_WIND_SENSOR // Disable support for La Crosse TX20 anemometer #undef USE_TX23_WIND_SENSOR // Disable support for La Crosse TX23 anemometer @@ -716,6 +719,7 @@ #undef USE_IR_REMOTE // Disable IR driver #undef USE_TM1638 // Disable support for TM1638 switches copying Switch1 .. Switch8 +#undef USE_TM1637 // Disable support for TM1637 seven-segment display #undef USE_HX711 // Disable support for HX711 load cell #undef USE_TX20_WIND_SENSOR // Disable support for La Crosse TX20 anemometer #undef USE_TX23_WIND_SENSOR // Disable support for La Crosse TX23 anemometer @@ -858,6 +862,7 @@ #undef USE_LMT01 // Disable support for TI LMT01 temperature sensor, count pulses on single GPIO (+0k5 code) #undef USE_IR_REMOTE // Disable IR driver #undef USE_TM1638 // Disable support for TM1638 switches copying Switch1 .. Switch8 +#undef USE_TM1637 // Disable support for TM1637 seven-segment display #undef USE_HX711 // Disable support for HX711 load cell #undef USE_TX20_WIND_SENSOR // Disable support for La Crosse TX20 anemometer #undef USE_TX23_WIND_SENSOR // Disable support for La Crosse TX23 anemometer diff --git a/tasmota/tasmota_template.h b/tasmota/tasmota_template.h index dbdc41cce..aa561c9f9 100644 --- a/tasmota/tasmota_template.h +++ b/tasmota/tasmota_template.h @@ -53,6 +53,7 @@ enum UserSelectablePins { GPIO_SDM120_TX, GPIO_SDM120_RX, // SDM120 Serial interface GPIO_SDM630_TX, GPIO_SDM630_RX, // SDM630 Serial interface GPIO_TM16CLK, GPIO_TM16DIO, GPIO_TM16STB, // TM1638 interface + GPIO_TM1637_CLK, GPIO_TM1637_DIO, // TM1637 interface GPIO_MP3_DFR562, // RB-DFR-562, DFPlayer Mini MP3 Player GPIO_HX711_SCK, GPIO_HX711_DAT, // HX711 Load Cell interface GPIO_TX2X_TXD_BLACK, // TX20/TX23 Transmission Pin @@ -225,6 +226,7 @@ const char kSensorNames[] PROGMEM = D_SENSOR_SDM120_TX "|" D_SENSOR_SDM120_RX "|" D_SENSOR_SDM630_TX "|" D_SENSOR_SDM630_RX "|" D_SENSOR_TM1638_CLK "|" D_SENSOR_TM1638_DIO "|" D_SENSOR_TM1638_STB "|" + D_SENSOR_TM1637_CLK "|" D_SENSOR_TM1637_DIO "|" D_SENSOR_DFR562 "|" D_SENSOR_HX711_SCK "|" D_SENSOR_HX711_DAT "|" D_SENSOR_TX2X_TX "|" @@ -529,6 +531,14 @@ const uint16_t kGpioNiceList[] PROGMEM = { AGPIO(GPIO_TM16DIO), // TM1638 Data I/O AGPIO(GPIO_TM16STB), // TM1638 Strobe #endif +#ifdef USE_TM1637 + AGPIO(GPIO_TM1637_CLK), // TM1637 Clock + AGPIO(GPIO_TM1637_DIO), // TM1637 Data I/O +#endif +#ifdef USE_TM1637 + GPIO_TM1637_CLK, // TM1637 Clock + GPIO_TM1637_DIO, // TM1637 Data I/O +#endif #ifdef USE_HX711 AGPIO(GPIO_HX711_SCK), // HX711 Load Cell clock AGPIO(GPIO_HX711_DAT), // HX711 Load Cell data diff --git a/tasmota/xsns_85_tm1637.ino b/tasmota/xsns_85_tm1637.ino new file mode 100644 index 000000000..75590e927 --- /dev/null +++ b/tasmota/xsns_85_tm1637.ino @@ -0,0 +1,355 @@ +/* + xsns_85_tm1637.ino - Support for TM1637 seven-segment display for Tasmota + + Copyright (C) 2020 Ajith Vasudevan + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + + +/* + + This driver enables the display of numbers (both integers and floats) and basic text + on the inexpensive TM1637-based seven-segment module. Raw segments can also be displayed. + In addition, it is also possible to clear the display, set brightness (7 levels) and display + a rudimentary bar graph. + + To use, compile Tasmota with USE_DISPLAY_SEVENSEG and USE_TM1637 + This adds the following + Pins: + * TM 1637 DIO + * TM 1637 CLK + + Connect the TM1637 display module's DIO and CLK pins to any free GPIOs of the ESP8266 module + and assign the above pins accordingly, from Tasmota's GUI. + Once the device restarts the following commands become available: + * TM1637Clear + * TM1637Number + * TM1637Float + * TM1637Brightness + * TM1637Raw + * TM1637Level + * TM1637Text + + The usage of these commands are explained in code comments below. + +*/ + + + +#ifdef USE_DISPLAY_SEVENSEG +#ifdef USE_TM1637 +/*********************************************************************************************\ + * TM1637 support +\*********************************************************************************************/ + +#define XSNS_85 85 +#include + +TM1637TinyDisplay *display; +bool defaultResponse = true; +bool isString = false; +char command[CMDSZ]; + + +#define BRIGHTNESS_MIN 0 +#define BRIGHTNESS_MAX 7 +#define NUMBER_MIN -999 +#define NUMBER_MAX 9999 +#define FLOAT_MIN -999.0 +#define FLOAT_MAX 9999.0 +#define CMD_MAX_LEN 55 +#define LEVEL_MIN 0 +#define LEVEL_MAX 100 + + +#define D_CMND_TM1637 "TM1637" + +const char S_TM1637_COMMAND_NVALUE[] PROGMEM = "{\"" D_CMND_TM1637 "%s\":%s}"; +const char S_TM1637_COMMAND_SVALUE[] PROGMEM = "{\"" D_CMND_TM1637 "%s\":\"%s\"}"; +const char S_TM1637_RAWCOMMAND_NVALUE[] PROGMEM = "{\"" D_CMND_TM1637 "%s\":\"%d,%d,%d,%d\"}"; +const char S_TM1637_MESSAGE_SVALUE[] PROGMEM = "{\"" "\"%s\":\"%s\"}"; +const char kTM1637_Commands[] PROGMEM = "Clear|Number|NumberC|Float|Brightness|Raw|Level|Text|TextC|ScrollDelay"; +uint32_t len = strlen(D_CMND_TM1637); + + +enum TM1637_Commands { // commands useable in console/MQTT or rules + + CMND_TM1637_CLEAR, // Blanks the display, command: "TM1637Clear" + + CMND_TM1637_NUMBER, // Display integer number (-999 to 9999). command e.g., "TM1637Number 1234" + // Control 'leading zeros', 'length' and 'position' with "TM1637Number 1234, , , " + // 'leading zeros' can be 1 or 0 (default), 'length' can be 1 to 4 (default), 'position' can be 0 (left-most) to 3 (right-most) + + CMND_TM1637_NUMBERC, // Clear first, then display integer number (-999 to 9999). Usage is same as above. + + CMND_TM1637_FLOAT, // Display float (with decimal point) (0.001 to 9999.) command e.g., "TM1637Float 12.34" + + CMND_TM1637_BRIGHTNESS, // Set brightness (1 to 7) command e.g., "TM1637Brightness 2" Note: Brightness takes effect only after a new display command is sent. + + CMND_TM1637_RAW, // Takes 4 comma-separated integers (0-255) and displays raw segments + // Each 7-segment display unit is represented by an 8-bit(8th bit for decimap point) number. + // For example, the command "TM1637Raw 255, 255, 255, 255" would display "[8.8.8.8.]" + + CMND_TM1637_LEVEL, // Display a horizontal bar graph (0-100) command e.g., "TM1637Level 50" will display [|||| ] + + CMND_TM1637_TEXT, // Display basic text (scrolls if > 4 characters) command e.g., "TM1637Text ajith vasudevan" + // Control 'length' and 'position' with "TM1637Text abcd, , " + // 'length' can be 1 to 4 (default), 'position' can be 0 (left-most) to 3 (right-most) + // Note: A caret sign '^' in the input text would be replaced by a "degrees" symbol. This is handy for displaying temperature! + // Other Characters whose ASCII > 127 or ASCII < 32 would simply be blank. + + CMND_TM1637_TEXTC, // Clear first, then display text. Usage is same as above. + + CMND_TM1637_SCROLLDELAY // Sets the speed of text scroll. Takes effect only after a new TEXT command is sent with 4 chars or more. +}; + +bool TM1637Init(void) { + display = new TM1637TinyDisplay(Pin(GPIO_TM1637_CLK), Pin(GPIO_TM1637_DIO)); + display->setBrightness(BRIGHT_5); + display->clear(); + AddLog(LOG_LEVEL_DEBUG, PSTR("LOG: TM1637: initialized")); + return true; +} + + +bool CmndTM1637Number(bool clear) { + + char sNum[5]; char sLeadingZero[5]; char sLength[5]; char sPos[5]; + subStr(sNum, XdrvMailbox.data, ",", 1); + subStr(sLeadingZero, XdrvMailbox.data, ",", 2); + subStr(sLength, XdrvMailbox.data, ",", 3); + subStr(sPos, XdrvMailbox.data, ",", 4); + + uint32_t num = atoi(sNum); + bool leadingZero = atoi(sLeadingZero); + uint32_t length = atoi(sLength); + uint32_t pos = atoi(sPos); + + if((length <= 0) || (length > 4)) length = 4; + if(pos > 4) pos = 4; + if(pos < 0) pos = 0; + + AddLog(LOG_LEVEL_DEBUG, PSTR("LOG: TM1637: num=%d"), num); + AddLog(LOG_LEVEL_DEBUG, PSTR("LOG: TM1637: leadingZero=%d"), leadingZero); + AddLog(LOG_LEVEL_DEBUG, PSTR("LOG: TM1637: length=%d"), length); + AddLog(LOG_LEVEL_DEBUG, PSTR("LOG: TM1637: pos=%d"), pos); + + if(clear) display->clear(); + display->showNumber(num, leadingZero, length, pos); + return true; +} + +bool CmndTM1637Float(void) { + float val = atof(XdrvMailbox.data); + char msg[50]; + if((val < FLOAT_MIN) || (val > FLOAT_MAX)) { + defaultResponse = false; + float fmin = FLOAT_MIN; + float fmax = FLOAT_MAX; + char msg[50]; + ext_snprintf_P(msg, sizeof(msg), PSTR("Float should be in the range [%1_f, %1_f]"), &fmin, &fmax); + Response_P(S_TM1637_MESSAGE_SVALUE, "Error", msg); + return true; + } + display->showNumber(val); + return true; +} + +bool CmndTM1637Clear(void) { + display->clear(); + return true; +} + +bool CmndTM1637Level(void) { + uint16_t val = XdrvMailbox.payload; + if((val < LEVEL_MIN) || (val > LEVEL_MAX)) { + defaultResponse = false; + char msg[45]; + sprintf(msg, PSTR("Level should be a number in the range [%d, %d]"), LEVEL_MIN, LEVEL_MAX); + Response_P(S_TM1637_MESSAGE_SVALUE, "Error", msg); + return true; + } + display->showLevel(val, false); + return true; +} + +bool CmndTM1637Raw(void) { + uint8_t DATA[1][4] = { + { 0x00, 0x00, 0x00, 0x00 } + }; + + char a[5]; char b[5]; char c[5]; char d[5]; + subStr(a, XdrvMailbox.data, ",", 1); + subStr(b, XdrvMailbox.data, ",", 2); + subStr(c, XdrvMailbox.data, ",", 3); + subStr(d, XdrvMailbox.data, ",", 4); + + uint16_t a1 = atoi(a); + uint16_t b1 = atoi(b); + uint16_t c1 = atoi(c); + uint16_t d1 = atoi(d); + + AddLog(LOG_LEVEL_DEBUG, PSTR("LOG: TM1637: a1=%d"), a1); + AddLog(LOG_LEVEL_DEBUG, PSTR("LOG: TM1637: b1=%d"), b1); + AddLog(LOG_LEVEL_DEBUG, PSTR("LOG: TM1637: c1=%d"), c1); + AddLog(LOG_LEVEL_DEBUG, PSTR("LOG: TM1637: d1=%d"), d1); + + DATA[0][0] = a1; + DATA[0][1] = b1; + DATA[0][2] = c1; + DATA[0][3] = d1; + defaultResponse = false; + Response_P(S_TM1637_RAWCOMMAND_NVALUE, command, a1, b1, c1, d1); + display->showAnimation_P(DATA, FRAMES(DATA), TIME_MS(150)); + return true; +} + + +bool CmndTM1637Text(bool clear) { + char sString[CMD_MAX_LEN + 1]; char sLength[5]; char sPos[5]; + subStr(sString, XdrvMailbox.data, ",", 1); + subStr(sLength, XdrvMailbox.data, ",", 2); + subStr(sPos, XdrvMailbox.data, ",", 3); + + uint32_t length = atoi(sLength); + uint32_t pos = atoi(sPos); + + if((length <= 0) || (length > 4)) length = 4; + if(pos > 4) pos = 4; + if(pos < 0) pos = 0; + + AddLog(LOG_LEVEL_DEBUG, PSTR("LOG: TM1637: string=%s"), sString); + AddLog(LOG_LEVEL_DEBUG, PSTR("LOG: TM1637: length=%d"), length); + AddLog(LOG_LEVEL_DEBUG, PSTR("LOG: TM1637: pos=%d"), pos); + + for(uint32_t i; iclear(); + display->showString_P(sString, length, pos); + return true; +} + + +bool CmndTM1637Brightness(void) { + uint16_t val = XdrvMailbox.payload; + if((val < BRIGHTNESS_MIN) || (val > BRIGHTNESS_MAX)) { + defaultResponse = false; + char msg[45]; + sprintf(msg, PSTR("Brightness is a number in the range [%d, %d]"), BRIGHTNESS_MIN, BRIGHTNESS_MAX); + Response_P(S_TM1637_MESSAGE_SVALUE, "Error", msg); + return true; + } + display->setBrightness(val); + return true; +} + +bool CmndTM1637ScrollDelay(void) { + uint16_t val = XdrvMailbox.payload; + if(val == 0) val = 200; + display->setScrolldelay(val); + return true; +} + + +bool TM1637Cmd(void) { + bool result = false; + uint32_t command_code = -1; + if (!strncasecmp_P(XdrvMailbox.topic, PSTR(D_CMND_TM1637), len)) { + command_code = GetCommandCode(command, sizeof(command), XdrvMailbox.topic + len, kTM1637_Commands); + AddLog(LOG_LEVEL_DEBUG, PSTR("LOG: TM1637: command_code: %d params: %s"), command_code, XdrvMailbox.data); + } + if(command_code < 0) { + return result; + } + if(XdrvMailbox.data_len > CMD_MAX_LEN) { + char msg[45]; + sprintf(msg, PSTR("Command too long. Should be less than %d characters long"), CMD_MAX_LEN); + Response_P(S_TM1637_MESSAGE_SVALUE, "Error", msg); + return result; + } + + switch (command_code) { + case CMND_TM1637_CLEAR: + defaultResponse = false; + result = CmndTM1637Clear(); + Response_P(S_TM1637_MESSAGE_SVALUE, "Message", "Cleared"); + break; + case CMND_TM1637_NUMBER : + result = CmndTM1637Number(false); + break; + case CMND_TM1637_NUMBERC : + result = CmndTM1637Number(true); + break; + case CMND_TM1637_FLOAT : + result = CmndTM1637Float(); + break; + case CMND_TM1637_BRIGHTNESS: + result = CmndTM1637Brightness(); + break; + case CMND_TM1637_RAW: + isString = true; + result = CmndTM1637Raw(); + break; + case CMND_TM1637_LEVEL: + result = CmndTM1637Level(); + break; + case CMND_TM1637_TEXT: + isString = true; + result = CmndTM1637Text(false); + break; + case CMND_TM1637_TEXTC: + isString = true; + result = CmndTM1637Text(true); + break; + case CMND_TM1637_SCROLLDELAY: + isString = true; + result = CmndTM1637ScrollDelay(); + break; + } + + if(defaultResponse) { + if(isString) Response_P(S_TM1637_COMMAND_SVALUE, command, XdrvMailbox.data); + else Response_P(S_TM1637_COMMAND_NVALUE, command, XdrvMailbox.data); + } + return result; +} + + +/*********************************************************************************************\ + * Interface +\*********************************************************************************************/ + +bool Xsns85(uint8_t function) +{ + bool result = false; + if (PinUsed(GPIO_TM1637_CLK) && PinUsed(GPIO_TM1637_DIO)) { + switch (function) { + case FUNC_PRE_INIT: + TM1637Init(); // init + break; + case FUNC_COMMAND: + defaultResponse = true; // resetting value for new cmnd + isString = false; // resetting value for new cmmd + result = TM1637Cmd(); + break; + } + } + return result; +} + +#endif // USE_1637 +#endif // USE_DISPLAY_SEVENSEG diff --git a/tools/decode-status.py b/tools/decode-status.py index 040ae94d4..3e6b0f5e0 100755 --- a/tools/decode-status.py +++ b/tools/decode-status.py @@ -209,7 +209,7 @@ a_features = [[ "USE_INA219","USE_SHT3X","USE_MHZ19","USE_TSL2561", "USE_SENSEAIR","USE_PMS5003","USE_MGS","USE_NOVA_SDS", "USE_SGP30","USE_SR04","USE_SDM120","USE_SI1145", - "USE_SDM630","USE_LM75AD","USE_APDS9960","USE_TM1638" + "USE_SDM630","USE_LM75AD","USE_APDS9960","USE_TM1638","USE_TM1637" ],[ "USE_MCP230xx","USE_MPR121","USE_CCS811","USE_MPU6050", "USE_MCP230xx_OUTPUT","USE_MCP230xx_DISPLAYOUTPUT","USE_HLW8012","USE_CSE7766", From 6e14e10ad06ff7a09a4fa7842007aa66669b45c5 Mon Sep 17 00:00:00 2001 From: Ajith Vasudevan Date: Tue, 9 Feb 2021 14:19:50 +0530 Subject: [PATCH 02/99] Fixed missing #defines in it_IT.h --- tasmota/language/it_IT.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tasmota/language/it_IT.h b/tasmota/language/it_IT.h index b4f8a0bb4..c00e0bc74 100644 --- a/tasmota/language/it_IT.h +++ b/tasmota/language/it_IT.h @@ -639,6 +639,8 @@ #define D_SENSOR_TM1638_CLK "TM16 - CLK" #define D_SENSOR_TM1638_DIO "TM16 - DIO" #define D_SENSOR_TM1638_STB "TM16 - STB" +#define D_SENSOR_TM1637_CLK "TM1637 CLK" +#define D_SENSOR_TM1637_DIO "TM1637 DIO" #define D_SENSOR_HX711_SCK "HX711 - SCK" #define D_SENSOR_HX711_DAT "HX711 - DAT" #define D_SENSOR_FTC532 "FTC532" From fad5ae755ee3f8b87f27899a258b9ba291805ecc Mon Sep 17 00:00:00 2001 From: Ajith Vasudevan Date: Tue, 9 Feb 2021 15:36:23 +0530 Subject: [PATCH 03/99] Moved lib/lib_display/TM1637TinyDisplay to lib/lib_div/ --- .../TM1637TinyDisplay/LICENSE | 0 .../TM1637TinyDisplay/README.md | 0 .../TM1637TinyDisplay/RELEASE.md | 0 .../TM1637TinyDisplay/TM1637TinyDisplay.cpp | 0 .../TM1637TinyDisplay/TM1637TinyDisplay.h | 0 .../TM1637TinyDisplay/_config.yml | 0 .../examples/7-segment-animator.html | 0 .../examples/ATtiny85/ATtiny85.ino | 0 .../examples/AnimatorToolThumb.png | Bin .../TM1637TinyDisplay/examples/README.md | 0 .../examples/TM1637Demo/TM1637Demo.ino | 0 .../examples/TM1637Test/TM1637Test.ino | 0 .../TM1637TinyDisplay/examples/tm1637.png | Bin .../TM1637TinyDisplay/examples/tm1637back.png | Bin .../TM1637TinyDisplay/keywords.txt | 0 .../TM1637TinyDisplay/library.json | 0 .../TM1637TinyDisplay/library.properties | 0 platformio.ini | 6 +++--- 18 files changed, 3 insertions(+), 3 deletions(-) rename lib/{lib_display => lib_div}/TM1637TinyDisplay/LICENSE (100%) rename lib/{lib_display => lib_div}/TM1637TinyDisplay/README.md (100%) rename lib/{lib_display => lib_div}/TM1637TinyDisplay/RELEASE.md (100%) rename lib/{lib_display => lib_div}/TM1637TinyDisplay/TM1637TinyDisplay.cpp (100%) rename lib/{lib_display => lib_div}/TM1637TinyDisplay/TM1637TinyDisplay.h (100%) rename lib/{lib_display => lib_div}/TM1637TinyDisplay/_config.yml (100%) rename lib/{lib_display => lib_div}/TM1637TinyDisplay/examples/7-segment-animator.html (100%) rename lib/{lib_display => lib_div}/TM1637TinyDisplay/examples/ATtiny85/ATtiny85.ino (100%) rename lib/{lib_display => lib_div}/TM1637TinyDisplay/examples/AnimatorToolThumb.png (100%) rename lib/{lib_display => lib_div}/TM1637TinyDisplay/examples/README.md (100%) rename lib/{lib_display => lib_div}/TM1637TinyDisplay/examples/TM1637Demo/TM1637Demo.ino (100%) rename lib/{lib_display => lib_div}/TM1637TinyDisplay/examples/TM1637Test/TM1637Test.ino (100%) rename lib/{lib_display => lib_div}/TM1637TinyDisplay/examples/tm1637.png (100%) rename lib/{lib_display => lib_div}/TM1637TinyDisplay/examples/tm1637back.png (100%) rename lib/{lib_display => lib_div}/TM1637TinyDisplay/keywords.txt (100%) rename lib/{lib_display => lib_div}/TM1637TinyDisplay/library.json (100%) rename lib/{lib_display => lib_div}/TM1637TinyDisplay/library.properties (100%) diff --git a/lib/lib_display/TM1637TinyDisplay/LICENSE b/lib/lib_div/TM1637TinyDisplay/LICENSE similarity index 100% rename from lib/lib_display/TM1637TinyDisplay/LICENSE rename to lib/lib_div/TM1637TinyDisplay/LICENSE diff --git a/lib/lib_display/TM1637TinyDisplay/README.md b/lib/lib_div/TM1637TinyDisplay/README.md similarity index 100% rename from lib/lib_display/TM1637TinyDisplay/README.md rename to lib/lib_div/TM1637TinyDisplay/README.md diff --git a/lib/lib_display/TM1637TinyDisplay/RELEASE.md b/lib/lib_div/TM1637TinyDisplay/RELEASE.md similarity index 100% rename from lib/lib_display/TM1637TinyDisplay/RELEASE.md rename to lib/lib_div/TM1637TinyDisplay/RELEASE.md diff --git a/lib/lib_display/TM1637TinyDisplay/TM1637TinyDisplay.cpp b/lib/lib_div/TM1637TinyDisplay/TM1637TinyDisplay.cpp similarity index 100% rename from lib/lib_display/TM1637TinyDisplay/TM1637TinyDisplay.cpp rename to lib/lib_div/TM1637TinyDisplay/TM1637TinyDisplay.cpp diff --git a/lib/lib_display/TM1637TinyDisplay/TM1637TinyDisplay.h b/lib/lib_div/TM1637TinyDisplay/TM1637TinyDisplay.h similarity index 100% rename from lib/lib_display/TM1637TinyDisplay/TM1637TinyDisplay.h rename to lib/lib_div/TM1637TinyDisplay/TM1637TinyDisplay.h diff --git a/lib/lib_display/TM1637TinyDisplay/_config.yml b/lib/lib_div/TM1637TinyDisplay/_config.yml similarity index 100% rename from lib/lib_display/TM1637TinyDisplay/_config.yml rename to lib/lib_div/TM1637TinyDisplay/_config.yml diff --git a/lib/lib_display/TM1637TinyDisplay/examples/7-segment-animator.html b/lib/lib_div/TM1637TinyDisplay/examples/7-segment-animator.html similarity index 100% rename from lib/lib_display/TM1637TinyDisplay/examples/7-segment-animator.html rename to lib/lib_div/TM1637TinyDisplay/examples/7-segment-animator.html diff --git a/lib/lib_display/TM1637TinyDisplay/examples/ATtiny85/ATtiny85.ino b/lib/lib_div/TM1637TinyDisplay/examples/ATtiny85/ATtiny85.ino similarity index 100% rename from lib/lib_display/TM1637TinyDisplay/examples/ATtiny85/ATtiny85.ino rename to lib/lib_div/TM1637TinyDisplay/examples/ATtiny85/ATtiny85.ino diff --git a/lib/lib_display/TM1637TinyDisplay/examples/AnimatorToolThumb.png b/lib/lib_div/TM1637TinyDisplay/examples/AnimatorToolThumb.png similarity index 100% rename from lib/lib_display/TM1637TinyDisplay/examples/AnimatorToolThumb.png rename to lib/lib_div/TM1637TinyDisplay/examples/AnimatorToolThumb.png diff --git a/lib/lib_display/TM1637TinyDisplay/examples/README.md b/lib/lib_div/TM1637TinyDisplay/examples/README.md similarity index 100% rename from lib/lib_display/TM1637TinyDisplay/examples/README.md rename to lib/lib_div/TM1637TinyDisplay/examples/README.md diff --git a/lib/lib_display/TM1637TinyDisplay/examples/TM1637Demo/TM1637Demo.ino b/lib/lib_div/TM1637TinyDisplay/examples/TM1637Demo/TM1637Demo.ino similarity index 100% rename from lib/lib_display/TM1637TinyDisplay/examples/TM1637Demo/TM1637Demo.ino rename to lib/lib_div/TM1637TinyDisplay/examples/TM1637Demo/TM1637Demo.ino diff --git a/lib/lib_display/TM1637TinyDisplay/examples/TM1637Test/TM1637Test.ino b/lib/lib_div/TM1637TinyDisplay/examples/TM1637Test/TM1637Test.ino similarity index 100% rename from lib/lib_display/TM1637TinyDisplay/examples/TM1637Test/TM1637Test.ino rename to lib/lib_div/TM1637TinyDisplay/examples/TM1637Test/TM1637Test.ino diff --git a/lib/lib_display/TM1637TinyDisplay/examples/tm1637.png b/lib/lib_div/TM1637TinyDisplay/examples/tm1637.png similarity index 100% rename from lib/lib_display/TM1637TinyDisplay/examples/tm1637.png rename to lib/lib_div/TM1637TinyDisplay/examples/tm1637.png diff --git a/lib/lib_display/TM1637TinyDisplay/examples/tm1637back.png b/lib/lib_div/TM1637TinyDisplay/examples/tm1637back.png similarity index 100% rename from lib/lib_display/TM1637TinyDisplay/examples/tm1637back.png rename to lib/lib_div/TM1637TinyDisplay/examples/tm1637back.png diff --git a/lib/lib_display/TM1637TinyDisplay/keywords.txt b/lib/lib_div/TM1637TinyDisplay/keywords.txt similarity index 100% rename from lib/lib_display/TM1637TinyDisplay/keywords.txt rename to lib/lib_div/TM1637TinyDisplay/keywords.txt diff --git a/lib/lib_display/TM1637TinyDisplay/library.json b/lib/lib_div/TM1637TinyDisplay/library.json similarity index 100% rename from lib/lib_display/TM1637TinyDisplay/library.json rename to lib/lib_div/TM1637TinyDisplay/library.json diff --git a/lib/lib_display/TM1637TinyDisplay/library.properties b/lib/lib_div/TM1637TinyDisplay/library.properties similarity index 100% rename from lib/lib_display/TM1637TinyDisplay/library.properties rename to lib/lib_div/TM1637TinyDisplay/library.properties diff --git a/platformio.ini b/platformio.ini index 68ebd40a7..0dfd9a9cb 100644 --- a/platformio.ini +++ b/platformio.ini @@ -80,12 +80,12 @@ build_flags = ${core.build_flags} board_build.f_cpu = 80000000L board_build.f_flash = 40000000L -monitor_speed = 74880 -monitor_port = COM5 +monitor_speed = 115200 +monitor_port = /dev/ttyUSB0 upload_speed = 115200 ; *** Upload Serial reset method for Wemos and NodeMCU upload_resetmethod = nodemcu -upload_port = COM5 +upload_port = /dev/ttyUSB0 extra_scripts = ${scripts_defaults.extra_scripts} lib_ldf_mode = chain+ shared_libdeps_dir = lib From 9ed3b906db2ab1bddc7720eb98ae7acc11983fca Mon Sep 17 00:00:00 2001 From: Ajith Vasudevan Date: Tue, 9 Feb 2021 15:42:19 +0530 Subject: [PATCH 04/99] Moved lib/lib_display/TM1637TinyDisplay to lib/lib_div/ --- .../TM1637TinyDisplay/LICENSE | 0 .../TM1637TinyDisplay/README.md | 0 .../TM1637TinyDisplay/RELEASE.md | 0 .../TM1637TinyDisplay/TM1637TinyDisplay.cpp | 0 .../TM1637TinyDisplay/TM1637TinyDisplay.h | 0 .../TM1637TinyDisplay/_config.yml | 0 .../examples/7-segment-animator.html | 0 .../examples/ATtiny85/ATtiny85.ino | 0 .../examples/AnimatorToolThumb.png | Bin .../TM1637TinyDisplay/examples/README.md | 0 .../examples/TM1637Demo/TM1637Demo.ino | 0 .../examples/TM1637Test/TM1637Test.ino | 0 .../TM1637TinyDisplay/examples/tm1637.png | Bin .../TM1637TinyDisplay/examples/tm1637back.png | Bin .../TM1637TinyDisplay/keywords.txt | 0 .../TM1637TinyDisplay/library.json | 0 .../TM1637TinyDisplay/library.properties | 0 17 files changed, 0 insertions(+), 0 deletions(-) rename lib/{lib_display => lib_div}/TM1637TinyDisplay/LICENSE (100%) rename lib/{lib_display => lib_div}/TM1637TinyDisplay/README.md (100%) rename lib/{lib_display => lib_div}/TM1637TinyDisplay/RELEASE.md (100%) rename lib/{lib_display => lib_div}/TM1637TinyDisplay/TM1637TinyDisplay.cpp (100%) rename lib/{lib_display => lib_div}/TM1637TinyDisplay/TM1637TinyDisplay.h (100%) rename lib/{lib_display => lib_div}/TM1637TinyDisplay/_config.yml (100%) rename lib/{lib_display => lib_div}/TM1637TinyDisplay/examples/7-segment-animator.html (100%) rename lib/{lib_display => lib_div}/TM1637TinyDisplay/examples/ATtiny85/ATtiny85.ino (100%) rename lib/{lib_display => lib_div}/TM1637TinyDisplay/examples/AnimatorToolThumb.png (100%) rename lib/{lib_display => lib_div}/TM1637TinyDisplay/examples/README.md (100%) rename lib/{lib_display => lib_div}/TM1637TinyDisplay/examples/TM1637Demo/TM1637Demo.ino (100%) rename lib/{lib_display => lib_div}/TM1637TinyDisplay/examples/TM1637Test/TM1637Test.ino (100%) rename lib/{lib_display => lib_div}/TM1637TinyDisplay/examples/tm1637.png (100%) rename lib/{lib_display => lib_div}/TM1637TinyDisplay/examples/tm1637back.png (100%) rename lib/{lib_display => lib_div}/TM1637TinyDisplay/keywords.txt (100%) rename lib/{lib_display => lib_div}/TM1637TinyDisplay/library.json (100%) rename lib/{lib_display => lib_div}/TM1637TinyDisplay/library.properties (100%) diff --git a/lib/lib_display/TM1637TinyDisplay/LICENSE b/lib/lib_div/TM1637TinyDisplay/LICENSE similarity index 100% rename from lib/lib_display/TM1637TinyDisplay/LICENSE rename to lib/lib_div/TM1637TinyDisplay/LICENSE diff --git a/lib/lib_display/TM1637TinyDisplay/README.md b/lib/lib_div/TM1637TinyDisplay/README.md similarity index 100% rename from lib/lib_display/TM1637TinyDisplay/README.md rename to lib/lib_div/TM1637TinyDisplay/README.md diff --git a/lib/lib_display/TM1637TinyDisplay/RELEASE.md b/lib/lib_div/TM1637TinyDisplay/RELEASE.md similarity index 100% rename from lib/lib_display/TM1637TinyDisplay/RELEASE.md rename to lib/lib_div/TM1637TinyDisplay/RELEASE.md diff --git a/lib/lib_display/TM1637TinyDisplay/TM1637TinyDisplay.cpp b/lib/lib_div/TM1637TinyDisplay/TM1637TinyDisplay.cpp similarity index 100% rename from lib/lib_display/TM1637TinyDisplay/TM1637TinyDisplay.cpp rename to lib/lib_div/TM1637TinyDisplay/TM1637TinyDisplay.cpp diff --git a/lib/lib_display/TM1637TinyDisplay/TM1637TinyDisplay.h b/lib/lib_div/TM1637TinyDisplay/TM1637TinyDisplay.h similarity index 100% rename from lib/lib_display/TM1637TinyDisplay/TM1637TinyDisplay.h rename to lib/lib_div/TM1637TinyDisplay/TM1637TinyDisplay.h diff --git a/lib/lib_display/TM1637TinyDisplay/_config.yml b/lib/lib_div/TM1637TinyDisplay/_config.yml similarity index 100% rename from lib/lib_display/TM1637TinyDisplay/_config.yml rename to lib/lib_div/TM1637TinyDisplay/_config.yml diff --git a/lib/lib_display/TM1637TinyDisplay/examples/7-segment-animator.html b/lib/lib_div/TM1637TinyDisplay/examples/7-segment-animator.html similarity index 100% rename from lib/lib_display/TM1637TinyDisplay/examples/7-segment-animator.html rename to lib/lib_div/TM1637TinyDisplay/examples/7-segment-animator.html diff --git a/lib/lib_display/TM1637TinyDisplay/examples/ATtiny85/ATtiny85.ino b/lib/lib_div/TM1637TinyDisplay/examples/ATtiny85/ATtiny85.ino similarity index 100% rename from lib/lib_display/TM1637TinyDisplay/examples/ATtiny85/ATtiny85.ino rename to lib/lib_div/TM1637TinyDisplay/examples/ATtiny85/ATtiny85.ino diff --git a/lib/lib_display/TM1637TinyDisplay/examples/AnimatorToolThumb.png b/lib/lib_div/TM1637TinyDisplay/examples/AnimatorToolThumb.png similarity index 100% rename from lib/lib_display/TM1637TinyDisplay/examples/AnimatorToolThumb.png rename to lib/lib_div/TM1637TinyDisplay/examples/AnimatorToolThumb.png diff --git a/lib/lib_display/TM1637TinyDisplay/examples/README.md b/lib/lib_div/TM1637TinyDisplay/examples/README.md similarity index 100% rename from lib/lib_display/TM1637TinyDisplay/examples/README.md rename to lib/lib_div/TM1637TinyDisplay/examples/README.md diff --git a/lib/lib_display/TM1637TinyDisplay/examples/TM1637Demo/TM1637Demo.ino b/lib/lib_div/TM1637TinyDisplay/examples/TM1637Demo/TM1637Demo.ino similarity index 100% rename from lib/lib_display/TM1637TinyDisplay/examples/TM1637Demo/TM1637Demo.ino rename to lib/lib_div/TM1637TinyDisplay/examples/TM1637Demo/TM1637Demo.ino diff --git a/lib/lib_display/TM1637TinyDisplay/examples/TM1637Test/TM1637Test.ino b/lib/lib_div/TM1637TinyDisplay/examples/TM1637Test/TM1637Test.ino similarity index 100% rename from lib/lib_display/TM1637TinyDisplay/examples/TM1637Test/TM1637Test.ino rename to lib/lib_div/TM1637TinyDisplay/examples/TM1637Test/TM1637Test.ino diff --git a/lib/lib_display/TM1637TinyDisplay/examples/tm1637.png b/lib/lib_div/TM1637TinyDisplay/examples/tm1637.png similarity index 100% rename from lib/lib_display/TM1637TinyDisplay/examples/tm1637.png rename to lib/lib_div/TM1637TinyDisplay/examples/tm1637.png diff --git a/lib/lib_display/TM1637TinyDisplay/examples/tm1637back.png b/lib/lib_div/TM1637TinyDisplay/examples/tm1637back.png similarity index 100% rename from lib/lib_display/TM1637TinyDisplay/examples/tm1637back.png rename to lib/lib_div/TM1637TinyDisplay/examples/tm1637back.png diff --git a/lib/lib_display/TM1637TinyDisplay/keywords.txt b/lib/lib_div/TM1637TinyDisplay/keywords.txt similarity index 100% rename from lib/lib_display/TM1637TinyDisplay/keywords.txt rename to lib/lib_div/TM1637TinyDisplay/keywords.txt diff --git a/lib/lib_display/TM1637TinyDisplay/library.json b/lib/lib_div/TM1637TinyDisplay/library.json similarity index 100% rename from lib/lib_display/TM1637TinyDisplay/library.json rename to lib/lib_div/TM1637TinyDisplay/library.json diff --git a/lib/lib_display/TM1637TinyDisplay/library.properties b/lib/lib_div/TM1637TinyDisplay/library.properties similarity index 100% rename from lib/lib_display/TM1637TinyDisplay/library.properties rename to lib/lib_div/TM1637TinyDisplay/library.properties From d2d7a408c878ffaab1e4e99ed5b6b51d1b09d217 Mon Sep 17 00:00:00 2001 From: Ajith Vasudevan Date: Wed, 10 Feb 2021 21:53:47 +0530 Subject: [PATCH 05/99] Rewrote TM1637 driver as a Display Driver --- .../TM1637TinyDisplay/LICENSE | 0 .../TM1637TinyDisplay/README.md | 0 .../TM1637TinyDisplay/RELEASE.md | 0 .../TM1637TinyDisplay/TM1637TinyDisplay.cpp | 0 .../TM1637TinyDisplay/TM1637TinyDisplay.h | 0 .../TM1637TinyDisplay/_config.yml | 0 .../examples/7-segment-animator.html | 0 .../examples/ATtiny85/ATtiny85.ino | 0 .../examples/AnimatorToolThumb.png | Bin .../TM1637TinyDisplay/examples/README.md | 0 .../examples/TM1637Demo/TM1637Demo.ino | 0 .../examples/TM1637Test/TM1637Test.ino | 0 .../TM1637TinyDisplay/examples/tm1637.png | Bin .../TM1637TinyDisplay/examples/tm1637back.png | Bin .../TM1637TinyDisplay/keywords.txt | 0 .../TM1637TinyDisplay/library.json | 0 .../TM1637TinyDisplay/library.properties | 0 tasmota/language/af_AF.h | 4 +- tasmota/language/bg_BG.h | 4 +- tasmota/language/cs_CZ.h | 4 +- tasmota/language/de_DE.h | 4 +- tasmota/language/el_GR.h | 4 +- tasmota/language/en_GB.h | 4 +- tasmota/language/es_ES.h | 4 +- tasmota/language/fr_FR.h | 4 +- tasmota/language/fy_NL.h | 4 +- tasmota/language/he_HE.h | 4 +- tasmota/language/hu_HU.h | 4 +- tasmota/language/it_IT.h | 4 +- tasmota/language/ko_KO.h | 4 +- tasmota/language/nl_NL.h | 4 +- tasmota/language/pl_PL.h | 4 +- tasmota/language/pt_BR.h | 4 +- tasmota/language/pt_PT.h | 4 +- tasmota/language/ro_RO.h | 4 +- tasmota/language/ru_RU.h | 4 +- tasmota/language/sk_SK.h | 4 +- tasmota/language/sv_SE.h | 4 +- tasmota/language/tr_TR.h | 4 +- tasmota/language/uk_UA.h | 4 +- tasmota/language/vi_VN.h | 4 +- tasmota/language/zh_CN.h | 4 +- tasmota/language/zh_TW.h | 4 +- tasmota/my_user_config.h | 2 +- tasmota/support_features.ino | 6 +- tasmota/support_tasmota.ino | 8 +- tasmota/tasmota_configurations.h | 6 +- tasmota/tasmota_template.h | 16 +- tasmota/xdrv_13_display.ino | 125 ++++- tasmota/xdsp_15_tm1637.ino | 509 ++++++++++++++++++ tasmota/xsns_85_tm1637.ino | 355 ------------ tools/decode-status.py | 4 +- 52 files changed, 701 insertions(+), 434 deletions(-) rename lib/{lib_div => lib_display}/TM1637TinyDisplay/LICENSE (100%) rename lib/{lib_div => lib_display}/TM1637TinyDisplay/README.md (100%) rename lib/{lib_div => lib_display}/TM1637TinyDisplay/RELEASE.md (100%) rename lib/{lib_div => lib_display}/TM1637TinyDisplay/TM1637TinyDisplay.cpp (100%) rename lib/{lib_div => lib_display}/TM1637TinyDisplay/TM1637TinyDisplay.h (100%) rename lib/{lib_div => lib_display}/TM1637TinyDisplay/_config.yml (100%) rename lib/{lib_div => lib_display}/TM1637TinyDisplay/examples/7-segment-animator.html (100%) rename lib/{lib_div => lib_display}/TM1637TinyDisplay/examples/ATtiny85/ATtiny85.ino (100%) rename lib/{lib_div => lib_display}/TM1637TinyDisplay/examples/AnimatorToolThumb.png (100%) rename lib/{lib_div => lib_display}/TM1637TinyDisplay/examples/README.md (100%) rename lib/{lib_div => lib_display}/TM1637TinyDisplay/examples/TM1637Demo/TM1637Demo.ino (100%) rename lib/{lib_div => lib_display}/TM1637TinyDisplay/examples/TM1637Test/TM1637Test.ino (100%) rename lib/{lib_div => lib_display}/TM1637TinyDisplay/examples/tm1637.png (100%) rename lib/{lib_div => lib_display}/TM1637TinyDisplay/examples/tm1637back.png (100%) rename lib/{lib_div => lib_display}/TM1637TinyDisplay/keywords.txt (100%) rename lib/{lib_div => lib_display}/TM1637TinyDisplay/library.json (100%) rename lib/{lib_div => lib_display}/TM1637TinyDisplay/library.properties (100%) create mode 100644 tasmota/xdsp_15_tm1637.ino delete mode 100644 tasmota/xsns_85_tm1637.ino diff --git a/lib/lib_div/TM1637TinyDisplay/LICENSE b/lib/lib_display/TM1637TinyDisplay/LICENSE similarity index 100% rename from lib/lib_div/TM1637TinyDisplay/LICENSE rename to lib/lib_display/TM1637TinyDisplay/LICENSE diff --git a/lib/lib_div/TM1637TinyDisplay/README.md b/lib/lib_display/TM1637TinyDisplay/README.md similarity index 100% rename from lib/lib_div/TM1637TinyDisplay/README.md rename to lib/lib_display/TM1637TinyDisplay/README.md diff --git a/lib/lib_div/TM1637TinyDisplay/RELEASE.md b/lib/lib_display/TM1637TinyDisplay/RELEASE.md similarity index 100% rename from lib/lib_div/TM1637TinyDisplay/RELEASE.md rename to lib/lib_display/TM1637TinyDisplay/RELEASE.md diff --git a/lib/lib_div/TM1637TinyDisplay/TM1637TinyDisplay.cpp b/lib/lib_display/TM1637TinyDisplay/TM1637TinyDisplay.cpp similarity index 100% rename from lib/lib_div/TM1637TinyDisplay/TM1637TinyDisplay.cpp rename to lib/lib_display/TM1637TinyDisplay/TM1637TinyDisplay.cpp diff --git a/lib/lib_div/TM1637TinyDisplay/TM1637TinyDisplay.h b/lib/lib_display/TM1637TinyDisplay/TM1637TinyDisplay.h similarity index 100% rename from lib/lib_div/TM1637TinyDisplay/TM1637TinyDisplay.h rename to lib/lib_display/TM1637TinyDisplay/TM1637TinyDisplay.h diff --git a/lib/lib_div/TM1637TinyDisplay/_config.yml b/lib/lib_display/TM1637TinyDisplay/_config.yml similarity index 100% rename from lib/lib_div/TM1637TinyDisplay/_config.yml rename to lib/lib_display/TM1637TinyDisplay/_config.yml diff --git a/lib/lib_div/TM1637TinyDisplay/examples/7-segment-animator.html b/lib/lib_display/TM1637TinyDisplay/examples/7-segment-animator.html similarity index 100% rename from lib/lib_div/TM1637TinyDisplay/examples/7-segment-animator.html rename to lib/lib_display/TM1637TinyDisplay/examples/7-segment-animator.html diff --git a/lib/lib_div/TM1637TinyDisplay/examples/ATtiny85/ATtiny85.ino b/lib/lib_display/TM1637TinyDisplay/examples/ATtiny85/ATtiny85.ino similarity index 100% rename from lib/lib_div/TM1637TinyDisplay/examples/ATtiny85/ATtiny85.ino rename to lib/lib_display/TM1637TinyDisplay/examples/ATtiny85/ATtiny85.ino diff --git a/lib/lib_div/TM1637TinyDisplay/examples/AnimatorToolThumb.png b/lib/lib_display/TM1637TinyDisplay/examples/AnimatorToolThumb.png similarity index 100% rename from lib/lib_div/TM1637TinyDisplay/examples/AnimatorToolThumb.png rename to lib/lib_display/TM1637TinyDisplay/examples/AnimatorToolThumb.png diff --git a/lib/lib_div/TM1637TinyDisplay/examples/README.md b/lib/lib_display/TM1637TinyDisplay/examples/README.md similarity index 100% rename from lib/lib_div/TM1637TinyDisplay/examples/README.md rename to lib/lib_display/TM1637TinyDisplay/examples/README.md diff --git a/lib/lib_div/TM1637TinyDisplay/examples/TM1637Demo/TM1637Demo.ino b/lib/lib_display/TM1637TinyDisplay/examples/TM1637Demo/TM1637Demo.ino similarity index 100% rename from lib/lib_div/TM1637TinyDisplay/examples/TM1637Demo/TM1637Demo.ino rename to lib/lib_display/TM1637TinyDisplay/examples/TM1637Demo/TM1637Demo.ino diff --git a/lib/lib_div/TM1637TinyDisplay/examples/TM1637Test/TM1637Test.ino b/lib/lib_display/TM1637TinyDisplay/examples/TM1637Test/TM1637Test.ino similarity index 100% rename from lib/lib_div/TM1637TinyDisplay/examples/TM1637Test/TM1637Test.ino rename to lib/lib_display/TM1637TinyDisplay/examples/TM1637Test/TM1637Test.ino diff --git a/lib/lib_div/TM1637TinyDisplay/examples/tm1637.png b/lib/lib_display/TM1637TinyDisplay/examples/tm1637.png similarity index 100% rename from lib/lib_div/TM1637TinyDisplay/examples/tm1637.png rename to lib/lib_display/TM1637TinyDisplay/examples/tm1637.png diff --git a/lib/lib_div/TM1637TinyDisplay/examples/tm1637back.png b/lib/lib_display/TM1637TinyDisplay/examples/tm1637back.png similarity index 100% rename from lib/lib_div/TM1637TinyDisplay/examples/tm1637back.png rename to lib/lib_display/TM1637TinyDisplay/examples/tm1637back.png diff --git a/lib/lib_div/TM1637TinyDisplay/keywords.txt b/lib/lib_display/TM1637TinyDisplay/keywords.txt similarity index 100% rename from lib/lib_div/TM1637TinyDisplay/keywords.txt rename to lib/lib_display/TM1637TinyDisplay/keywords.txt diff --git a/lib/lib_div/TM1637TinyDisplay/library.json b/lib/lib_display/TM1637TinyDisplay/library.json similarity index 100% rename from lib/lib_div/TM1637TinyDisplay/library.json rename to lib/lib_display/TM1637TinyDisplay/library.json diff --git a/lib/lib_div/TM1637TinyDisplay/library.properties b/lib/lib_display/TM1637TinyDisplay/library.properties similarity index 100% rename from lib/lib_div/TM1637TinyDisplay/library.properties rename to lib/lib_display/TM1637TinyDisplay/library.properties diff --git a/tasmota/language/af_AF.h b/tasmota/language/af_AF.h index bdc584897..9ad9e19f3 100644 --- a/tasmota/language/af_AF.h +++ b/tasmota/language/af_AF.h @@ -639,8 +639,6 @@ #define D_SENSOR_TM1638_CLK "TM16 CLK" #define D_SENSOR_TM1638_DIO "TM16 DIO" #define D_SENSOR_TM1638_STB "TM16 STB" -#define D_SENSOR_TM1637_CLK "TM1637 CLK" -#define D_SENSOR_TM1637_DIO "TM1637 DIO" #define D_SENSOR_HX711_SCK "HX711 SCK" #define D_SENSOR_HX711_DAT "HX711 DAT" #define D_SENSOR_FTC532 "FTC532" @@ -784,6 +782,8 @@ #define D_SENSOR_ST7789_DC "ST7789 DC" #define D_SENSOR_SSD1331_CS "SSD1331 CS" #define D_SENSOR_SSD1331_DC "SSD1331 DC" +#define D_SENSOR_TM1637_CLK "TM1637 CLK" +#define D_SENSOR_TM1637_DIO "TM1637 DIO" #define D_SENSOR_SDCARD_CS "SDCard CS" #define D_SENSOR_WIEGAND_D0 "Wiegand D0" #define D_SENSOR_WIEGAND_D1 "Wiegand D1" diff --git a/tasmota/language/bg_BG.h b/tasmota/language/bg_BG.h index ed4be8d8e..4fa37852a 100644 --- a/tasmota/language/bg_BG.h +++ b/tasmota/language/bg_BG.h @@ -638,8 +638,6 @@ #define D_SENSOR_TM1638_CLK "TM16 CLK" #define D_SENSOR_TM1638_DIO "TM16 DIO" #define D_SENSOR_TM1638_STB "TM16 STB" -#define D_SENSOR_TM1637_CLK "TM1637 CLK" -#define D_SENSOR_TM1637_DIO "TM1637 DIO" #define D_SENSOR_HX711_SCK "HX711 SCK" #define D_SENSOR_HX711_DAT "HX711 DAT" #define D_SENSOR_FTC532 "FTC532" @@ -783,6 +781,8 @@ #define D_SENSOR_ST7789_DC "ST7789 DC" #define D_SENSOR_SSD1331_CS "SSD1331 CS" #define D_SENSOR_SSD1331_DC "SSD1331 DC" +#define D_SENSOR_TM1637_CLK "TM1637 CLK" +#define D_SENSOR_TM1637_DIO "TM1637 DIO" #define D_SENSOR_SDCARD_CS "SDCard CS" #define D_SENSOR_WIEGAND_D0 "Wiegand D0" #define D_SENSOR_WIEGAND_D1 "Wiegand D1" diff --git a/tasmota/language/cs_CZ.h b/tasmota/language/cs_CZ.h index 747c16efd..0e8c87472 100644 --- a/tasmota/language/cs_CZ.h +++ b/tasmota/language/cs_CZ.h @@ -639,8 +639,6 @@ #define D_SENSOR_TM1638_CLK "TM16 CLK" #define D_SENSOR_TM1638_DIO "TM16 DIO" #define D_SENSOR_TM1638_STB "TM16 STB" -#define D_SENSOR_TM1637_CLK "TM1637 CLK" -#define D_SENSOR_TM1637_DIO "TM1637 DIO" #define D_SENSOR_HX711_SCK "HX711 SCK" #define D_SENSOR_HX711_DAT "HX711 DAT" #define D_SENSOR_FTC532 "FTC532" @@ -784,6 +782,8 @@ #define D_SENSOR_ST7789_DC "ST7789 DC" #define D_SENSOR_SSD1331_CS "SSD1331 CS" #define D_SENSOR_SSD1331_DC "SSD1331 DC" +#define D_SENSOR_TM1637_CLK "TM1637 CLK" +#define D_SENSOR_TM1637_DIO "TM1637 DIO" #define D_SENSOR_SDCARD_CS "SDCard CS" #define D_SENSOR_WIEGAND_D0 "Wiegand D0" #define D_SENSOR_WIEGAND_D1 "Wiegand D1" diff --git a/tasmota/language/de_DE.h b/tasmota/language/de_DE.h index 38a422391..cbc2bd6d0 100644 --- a/tasmota/language/de_DE.h +++ b/tasmota/language/de_DE.h @@ -639,8 +639,6 @@ #define D_SENSOR_TM1638_CLK "TM16 CLK" #define D_SENSOR_TM1638_DIO "TM16 DIO" #define D_SENSOR_TM1638_STB "TM16 STB" -#define D_SENSOR_TM1637_CLK "TM1637 CLK" -#define D_SENSOR_TM1637_DIO "TM1637 DIO" #define D_SENSOR_HX711_SCK "HX711 SCK" #define D_SENSOR_HX711_DAT "HX711 DAT" #define D_SENSOR_FTC532 "FTC532" @@ -784,6 +782,8 @@ #define D_SENSOR_ST7789_DC "ST7789 DC" #define D_SENSOR_SSD1331_CS "SSD1331 CS" #define D_SENSOR_SSD1331_DC "SSD1331 DC" +#define D_SENSOR_TM1637_CLK "TM1637 CLK" +#define D_SENSOR_TM1637_DIO "TM1637 DIO" #define D_SENSOR_SDCARD_CS "SDCard CS" #define D_SENSOR_WIEGAND_D0 "Wiegand D0" #define D_SENSOR_WIEGAND_D1 "Wiegand D1" diff --git a/tasmota/language/el_GR.h b/tasmota/language/el_GR.h index 66e5b16c6..b63c4eb65 100644 --- a/tasmota/language/el_GR.h +++ b/tasmota/language/el_GR.h @@ -639,8 +639,6 @@ #define D_SENSOR_TM1638_CLK "TM16 CLK" #define D_SENSOR_TM1638_DIO "TM16 DIO" #define D_SENSOR_TM1638_STB "TM16 STB" -#define D_SENSOR_TM1637_CLK "TM1637 CLK" -#define D_SENSOR_TM1637_DIO "TM1637 DIO" #define D_SENSOR_HX711_SCK "HX711 SCK" #define D_SENSOR_HX711_DAT "HX711 DAT" #define D_SENSOR_FTC532 "FTC532" @@ -784,6 +782,8 @@ #define D_SENSOR_ST7789_DC "ST7789 DC" #define D_SENSOR_SSD1331_CS "SSD1331 CS" #define D_SENSOR_SSD1331_DC "SSD1331 DC" +#define D_SENSOR_TM1637_CLK "TM1637 CLK" +#define D_SENSOR_TM1637_DIO "TM1637 DIO" #define D_SENSOR_SDCARD_CS "SDCard CS" #define D_SENSOR_WIEGAND_D0 "Wiegand D0" #define D_SENSOR_WIEGAND_D1 "Wiegand D1" diff --git a/tasmota/language/en_GB.h b/tasmota/language/en_GB.h index bf822d919..650fba1f8 100644 --- a/tasmota/language/en_GB.h +++ b/tasmota/language/en_GB.h @@ -639,8 +639,6 @@ #define D_SENSOR_TM1638_CLK "TM16 CLK" #define D_SENSOR_TM1638_DIO "TM16 DIO" #define D_SENSOR_TM1638_STB "TM16 STB" -#define D_SENSOR_TM1637_CLK "TM1637 CLK" -#define D_SENSOR_TM1637_DIO "TM1637 DIO" #define D_SENSOR_HX711_SCK "HX711 SCK" #define D_SENSOR_HX711_DAT "HX711 DAT" #define D_SENSOR_FTC532 "FTC532" @@ -784,6 +782,8 @@ #define D_SENSOR_ST7789_DC "ST7789 DC" #define D_SENSOR_SSD1331_CS "SSD1331 CS" #define D_SENSOR_SSD1331_DC "SSD1331 DC" +#define D_SENSOR_TM1637_CLK "TM1637 CLK" +#define D_SENSOR_TM1637_DIO "TM1637 DIO" #define D_SENSOR_SDCARD_CS "SDCard CS" #define D_SENSOR_WIEGAND_D0 "Wiegand D0" #define D_SENSOR_WIEGAND_D1 "Wiegand D1" diff --git a/tasmota/language/es_ES.h b/tasmota/language/es_ES.h index 342872e63..682b0b383 100644 --- a/tasmota/language/es_ES.h +++ b/tasmota/language/es_ES.h @@ -639,8 +639,6 @@ #define D_SENSOR_TM1638_CLK "TM16 CLK" #define D_SENSOR_TM1638_DIO "TM16 DIO" #define D_SENSOR_TM1638_STB "TM16 STB" -#define D_SENSOR_TM1637_CLK "TM1637 CLK" -#define D_SENSOR_TM1637_DIO "TM1637 DIO" #define D_SENSOR_HX711_SCK "HX711 SCK" #define D_SENSOR_HX711_DAT "HX711 DAT" #define D_SENSOR_FTC532 "FTC532" @@ -784,6 +782,8 @@ #define D_SENSOR_ST7789_DC "ST7789 DC" #define D_SENSOR_SSD1331_CS "SSD1331 CS" #define D_SENSOR_SSD1331_DC "SSD1331 DC" +#define D_SENSOR_TM1637_CLK "TM1637 CLK" +#define D_SENSOR_TM1637_DIO "TM1637 DIO" #define D_SENSOR_SDCARD_CS "SDCard CS" #define D_SENSOR_WIEGAND_D0 "Wiegand D0" #define D_SENSOR_WIEGAND_D1 "Wiegand D1" diff --git a/tasmota/language/fr_FR.h b/tasmota/language/fr_FR.h index ad3b3d638..9931aa065 100644 --- a/tasmota/language/fr_FR.h +++ b/tasmota/language/fr_FR.h @@ -635,8 +635,6 @@ #define D_SENSOR_TM1638_CLK "TM16 CLK" #define D_SENSOR_TM1638_DIO "TM16 DIO" #define D_SENSOR_TM1638_STB "TM16 STB" -#define D_SENSOR_TM1637_CLK "TM1637 CLK" -#define D_SENSOR_TM1637_DIO "TM1637 DIO" #define D_SENSOR_HX711_SCK "HX711 SCK" #define D_SENSOR_HX711_DAT "HX711 DAT" #define D_SENSOR_FTC532 "FTC532" @@ -780,6 +778,8 @@ #define D_SENSOR_ST7789_DC "ST7789 DC" #define D_SENSOR_SSD1331_CS "SSD1331 CS" #define D_SENSOR_SSD1331_DC "SSD1331 DC" +#define D_SENSOR_TM1637_CLK "TM1637 CLK" +#define D_SENSOR_TM1637_DIO "TM1637 DIO" #define D_SENSOR_SDCARD_CS "CarteSD CS" #define D_SENSOR_WIEGAND_D0 "Wiegand D0" #define D_SENSOR_WIEGAND_D1 "Wiegand D1" diff --git a/tasmota/language/fy_NL.h b/tasmota/language/fy_NL.h index 8b047dfee..5a2dd214f 100644 --- a/tasmota/language/fy_NL.h +++ b/tasmota/language/fy_NL.h @@ -639,8 +639,6 @@ #define D_SENSOR_TM1638_CLK "TM16 CLK" #define D_SENSOR_TM1638_DIO "TM16 DIO" #define D_SENSOR_TM1638_STB "TM16 STB" -#define D_SENSOR_TM1637_CLK "TM1637 CLK" -#define D_SENSOR_TM1637_DIO "TM1637 DIO" #define D_SENSOR_HX711_SCK "HX711 SCK" #define D_SENSOR_HX711_DAT "HX711 DAT" #define D_SENSOR_FTC532 "FTC532" @@ -784,6 +782,8 @@ #define D_SENSOR_ST7789_DC "ST7789 DC" #define D_SENSOR_SSD1331_CS "SSD1331 CS" #define D_SENSOR_SSD1331_DC "SSD1331 DC" +#define D_SENSOR_TM1637_CLK "TM1637 CLK" +#define D_SENSOR_TM1637_DIO "TM1637 DIO" #define D_SENSOR_SDCARD_CS "SDCard CS" #define D_SENSOR_WIEGAND_D0 "Wiegand D0" #define D_SENSOR_WIEGAND_D1 "Wiegand D1" diff --git a/tasmota/language/he_HE.h b/tasmota/language/he_HE.h index 61ed51948..a77bc99a3 100644 --- a/tasmota/language/he_HE.h +++ b/tasmota/language/he_HE.h @@ -639,8 +639,6 @@ #define D_SENSOR_TM1638_CLK "TM16 CLK" #define D_SENSOR_TM1638_DIO "TM16 DIO" #define D_SENSOR_TM1638_STB "TM16 STB" -#define D_SENSOR_TM1637_CLK "TM1637 CLK" -#define D_SENSOR_TM1637_DIO "TM1637 DIO" #define D_SENSOR_HX711_SCK "HX711 SCK" #define D_SENSOR_HX711_DAT "HX711 DAT" #define D_SENSOR_FTC532 "FTC532" @@ -784,6 +782,8 @@ #define D_SENSOR_ST7789_DC "ST7789 DC" #define D_SENSOR_SSD1331_CS "SSD1331 CS" #define D_SENSOR_SSD1331_DC "SSD1331 DC" +#define D_SENSOR_TM1637_CLK "TM1637 CLK" +#define D_SENSOR_TM1637_DIO "TM1637 DIO" #define D_SENSOR_SDCARD_CS "SDCard CS" #define D_SENSOR_WIEGAND_D0 "Wiegand D0" #define D_SENSOR_WIEGAND_D1 "Wiegand D1" diff --git a/tasmota/language/hu_HU.h b/tasmota/language/hu_HU.h index 0b5a2d074..264dbba2f 100644 --- a/tasmota/language/hu_HU.h +++ b/tasmota/language/hu_HU.h @@ -639,8 +639,6 @@ #define D_SENSOR_TM1638_CLK "TM16 CLK" #define D_SENSOR_TM1638_DIO "TM16 DIO" #define D_SENSOR_TM1638_STB "TM16 STB" -#define D_SENSOR_TM1637_CLK "TM1637 CLK" -#define D_SENSOR_TM1637_DIO "TM1637 DIO" #define D_SENSOR_HX711_SCK "HX711 SCK" #define D_SENSOR_HX711_DAT "HX711 DAT" #define D_SENSOR_FTC532 "FTC532" @@ -784,6 +782,8 @@ #define D_SENSOR_ST7789_DC "ST7789 DC" #define D_SENSOR_SSD1331_CS "SSD1331 CS" #define D_SENSOR_SSD1331_DC "SSD1331 DC" +#define D_SENSOR_TM1637_CLK "TM1637 CLK" +#define D_SENSOR_TM1637_DIO "TM1637 DIO" #define D_SENSOR_SDCARD_CS "SDCard CS" #define D_SENSOR_WIEGAND_D0 "Wiegand D0" #define D_SENSOR_WIEGAND_D1 "Wiegand D1" diff --git a/tasmota/language/it_IT.h b/tasmota/language/it_IT.h index c00e0bc74..533375655 100644 --- a/tasmota/language/it_IT.h +++ b/tasmota/language/it_IT.h @@ -639,8 +639,6 @@ #define D_SENSOR_TM1638_CLK "TM16 - CLK" #define D_SENSOR_TM1638_DIO "TM16 - DIO" #define D_SENSOR_TM1638_STB "TM16 - STB" -#define D_SENSOR_TM1637_CLK "TM1637 CLK" -#define D_SENSOR_TM1637_DIO "TM1637 DIO" #define D_SENSOR_HX711_SCK "HX711 - SCK" #define D_SENSOR_HX711_DAT "HX711 - DAT" #define D_SENSOR_FTC532 "FTC532" @@ -784,6 +782,8 @@ #define D_SENSOR_ST7789_DC "ST7789 - DC" #define D_SENSOR_SSD1331_CS "SSD1331 - CS" #define D_SENSOR_SSD1331_DC "SSD1331 - DC" +#define D_SENSOR_TM1637_CLK "TM1637 - CLK" +#define D_SENSOR_TM1637_DIO "TM1637 - DIO" #define D_SENSOR_SDCARD_CS "Scheda SD - CS" #define D_SENSOR_WIEGAND_D0 "Wiegand - D0" #define D_SENSOR_WIEGAND_D1 "Wiegand - D1" diff --git a/tasmota/language/ko_KO.h b/tasmota/language/ko_KO.h index c02051a81..92ab84963 100644 --- a/tasmota/language/ko_KO.h +++ b/tasmota/language/ko_KO.h @@ -639,8 +639,6 @@ #define D_SENSOR_TM1638_CLK "TM16 CLK" #define D_SENSOR_TM1638_DIO "TM16 DIO" #define D_SENSOR_TM1638_STB "TM16 STB" -#define D_SENSOR_TM1637_CLK "TM1637 CLK" -#define D_SENSOR_TM1637_DIO "TM1637 DIO" #define D_SENSOR_HX711_SCK "HX711 SCK" #define D_SENSOR_HX711_DAT "HX711 DAT" #define D_SENSOR_FTC532 "FTC532" @@ -784,6 +782,8 @@ #define D_SENSOR_ST7789_DC "ST7789 DC" #define D_SENSOR_SSD1331_CS "SSD1331 CS" #define D_SENSOR_SSD1331_DC "SSD1331 DC" +#define D_SENSOR_TM1637_CLK "TM1637 CLK" +#define D_SENSOR_TM1637_DIO "TM1637 DIO" #define D_SENSOR_SDCARD_CS "SDCard CS" #define D_SENSOR_WIEGAND_D0 "Wiegand D0" #define D_SENSOR_WIEGAND_D1 "Wiegand D1" diff --git a/tasmota/language/nl_NL.h b/tasmota/language/nl_NL.h index c6a4d68a5..564ff9f3a 100644 --- a/tasmota/language/nl_NL.h +++ b/tasmota/language/nl_NL.h @@ -639,8 +639,6 @@ #define D_SENSOR_TM1638_CLK "TM16 CLK" #define D_SENSOR_TM1638_DIO "TM16 DIO" #define D_SENSOR_TM1638_STB "TM16 STB" -#define D_SENSOR_TM1637_CLK "TM1637 CLK" -#define D_SENSOR_TM1637_DIO "TM1637 DIO" #define D_SENSOR_HX711_SCK "HX711 SCK" #define D_SENSOR_HX711_DAT "HX711 DAT" #define D_SENSOR_FTC532 "FTC532" @@ -784,6 +782,8 @@ #define D_SENSOR_ST7789_DC "ST7789 DC" #define D_SENSOR_SSD1331_CS "SSD1331 CS" #define D_SENSOR_SSD1331_DC "SSD1331 DC" +#define D_SENSOR_TM1637_CLK "TM1637 CLK" +#define D_SENSOR_TM1637_DIO "TM1637 DIO" #define D_SENSOR_SDCARD_CS "SDCard CS" #define D_SENSOR_WIEGAND_D0 "Wiegand D0" #define D_SENSOR_WIEGAND_D1 "Wiegand D1" diff --git a/tasmota/language/pl_PL.h b/tasmota/language/pl_PL.h index d558741b6..f2c40aebd 100644 --- a/tasmota/language/pl_PL.h +++ b/tasmota/language/pl_PL.h @@ -639,8 +639,6 @@ #define D_SENSOR_TM1638_CLK "TM16 CLK" #define D_SENSOR_TM1638_DIO "TM16 DIO" #define D_SENSOR_TM1638_STB "TM16 STB" -#define D_SENSOR_TM1637_CLK "TM1637 CLK" -#define D_SENSOR_TM1637_DIO "TM1637 DIO" #define D_SENSOR_HX711_SCK "HX711 SCK" #define D_SENSOR_HX711_DAT "HX711 DAT" #define D_SENSOR_FTC532 "FTC532" @@ -784,6 +782,8 @@ #define D_SENSOR_ST7789_DC "ST7789 DC" #define D_SENSOR_SSD1331_CS "SSD1331 CS" #define D_SENSOR_SSD1331_DC "SSD1331 DC" +#define D_SENSOR_TM1637_CLK "TM1637 CLK" +#define D_SENSOR_TM1637_DIO "TM1637 DIO" #define D_SENSOR_SDCARD_CS "SDCard CS" #define D_SENSOR_WIEGAND_D0 "Wiegand D0" #define D_SENSOR_WIEGAND_D1 "Wiegand D1" diff --git a/tasmota/language/pt_BR.h b/tasmota/language/pt_BR.h index ed949015d..6c2c2a438 100644 --- a/tasmota/language/pt_BR.h +++ b/tasmota/language/pt_BR.h @@ -639,8 +639,6 @@ #define D_SENSOR_TM1638_CLK "TM16 CLK" #define D_SENSOR_TM1638_DIO "TM16 DIO" #define D_SENSOR_TM1638_STB "TM16 STB" -#define D_SENSOR_TM1637_CLK "TM1637 CLK" -#define D_SENSOR_TM1637_DIO "TM1637 DIO" #define D_SENSOR_HX711_SCK "HX711 SCK" #define D_SENSOR_HX711_DAT "HX711 DAT" #define D_SENSOR_FTC532 "FTC532" @@ -784,6 +782,8 @@ #define D_SENSOR_ST7789_DC "ST7789 DC" #define D_SENSOR_SSD1331_CS "SSD1331 CS" #define D_SENSOR_SSD1331_DC "SSD1331 DC" +#define D_SENSOR_TM1637_CLK "TM1637 CLK" +#define D_SENSOR_TM1637_DIO "TM1637 DIO" #define D_SENSOR_SDCARD_CS "SDCard CS" #define D_SENSOR_WIEGAND_D0 "Wiegand D0" #define D_SENSOR_WIEGAND_D1 "Wiegand D1" diff --git a/tasmota/language/pt_PT.h b/tasmota/language/pt_PT.h index 3af1c0745..cdc540d11 100644 --- a/tasmota/language/pt_PT.h +++ b/tasmota/language/pt_PT.h @@ -639,8 +639,6 @@ #define D_SENSOR_TM1638_CLK "TM16 CLK" #define D_SENSOR_TM1638_DIO "TM16 DIO" #define D_SENSOR_TM1638_STB "TM16 STB" -#define D_SENSOR_TM1637_CLK "TM1637 CLK" -#define D_SENSOR_TM1637_DIO "TM1637 DIO" #define D_SENSOR_HX711_SCK "HX711 SCK" #define D_SENSOR_HX711_DAT "HX711 DAT" #define D_SENSOR_FTC532 "FTC532" @@ -784,6 +782,8 @@ #define D_SENSOR_ST7789_DC "ST7789 DC" #define D_SENSOR_SSD1331_CS "SSD1331 CS" #define D_SENSOR_SSD1331_DC "SSD1331 DC" +#define D_SENSOR_TM1637_CLK "TM1637 CLK" +#define D_SENSOR_TM1637_DIO "TM1637 DIO" #define D_SENSOR_SDCARD_CS "SDCard CS" #define D_SENSOR_WIEGAND_D0 "Wiegand D0" #define D_SENSOR_WIEGAND_D1 "Wiegand D1" diff --git a/tasmota/language/ro_RO.h b/tasmota/language/ro_RO.h index 608f95d39..b803b87b7 100644 --- a/tasmota/language/ro_RO.h +++ b/tasmota/language/ro_RO.h @@ -639,8 +639,6 @@ #define D_SENSOR_TM1638_CLK "TM16 CLK" #define D_SENSOR_TM1638_DIO "TM16 DIO" #define D_SENSOR_TM1638_STB "TM16 STB" -#define D_SENSOR_TM1637_CLK "TM1637 CLK" -#define D_SENSOR_TM1637_DIO "TM1637 DIO" #define D_SENSOR_HX711_SCK "HX711 SCK" #define D_SENSOR_HX711_DAT "HX711 DAT" #define D_SENSOR_FTC532 "FTC532" @@ -784,6 +782,8 @@ #define D_SENSOR_ST7789_DC "ST7789 DC" #define D_SENSOR_SSD1331_CS "SSD1331 CS" #define D_SENSOR_SSD1331_DC "SSD1331 DC" +#define D_SENSOR_TM1637_CLK "TM1637 CLK" +#define D_SENSOR_TM1637_DIO "TM1637 DIO" #define D_SENSOR_SDCARD_CS "SDCard CS" #define D_SENSOR_WIEGAND_D0 "Wiegand D0" #define D_SENSOR_WIEGAND_D1 "Wiegand D1" diff --git a/tasmota/language/ru_RU.h b/tasmota/language/ru_RU.h index 268258e57..c7d4f0a89 100644 --- a/tasmota/language/ru_RU.h +++ b/tasmota/language/ru_RU.h @@ -639,8 +639,6 @@ #define D_SENSOR_TM1638_CLK "TM16 CLK" #define D_SENSOR_TM1638_DIO "TM16 DIO" #define D_SENSOR_TM1638_STB "TM16 STB" -#define D_SENSOR_TM1637_CLK "TM1637 CLK" -#define D_SENSOR_TM1637_DIO "TM1637 DIO" #define D_SENSOR_HX711_SCK "HX711 SCK" #define D_SENSOR_HX711_DAT "HX711 DAT" #define D_SENSOR_FTC532 "FTC532" @@ -784,6 +782,8 @@ #define D_SENSOR_ST7789_DC "ST7789 DC" #define D_SENSOR_SSD1331_CS "SSD1331 CS" #define D_SENSOR_SSD1331_DC "SSD1331 DC" +#define D_SENSOR_TM1637_CLK "TM1637 CLK" +#define D_SENSOR_TM1637_DIO "TM1637 DIO" #define D_SENSOR_SDCARD_CS "SDCard CS" #define D_SENSOR_WIEGAND_D0 "Wiegand D0" #define D_SENSOR_WIEGAND_D1 "Wiegand D1" diff --git a/tasmota/language/sk_SK.h b/tasmota/language/sk_SK.h index e8504bd19..4b91eb101 100644 --- a/tasmota/language/sk_SK.h +++ b/tasmota/language/sk_SK.h @@ -639,8 +639,6 @@ #define D_SENSOR_TM1638_CLK "TM16 CLK" #define D_SENSOR_TM1638_DIO "TM16 DIO" #define D_SENSOR_TM1638_STB "TM16 STB" -#define D_SENSOR_TM1637_CLK "TM1637 CLK" -#define D_SENSOR_TM1637_DIO "TM1637 DIO" #define D_SENSOR_HX711_SCK "HX711 SCK" #define D_SENSOR_HX711_DAT "HX711 DAT" #define D_SENSOR_FTC532 "FTC532" @@ -784,6 +782,8 @@ #define D_SENSOR_ST7789_DC "ST7789 DC" #define D_SENSOR_SSD1331_CS "SSD1331 CS" #define D_SENSOR_SSD1331_DC "SSD1331 DC" +#define D_SENSOR_TM1637_CLK "TM1637 CLK" +#define D_SENSOR_TM1637_DIO "TM1637 DIO" #define D_SENSOR_SDCARD_CS "SDCard CS" #define D_SENSOR_WIEGAND_D0 "Wiegand D0" #define D_SENSOR_WIEGAND_D1 "Wiegand D1" diff --git a/tasmota/language/sv_SE.h b/tasmota/language/sv_SE.h index def70b05e..26ad07cc4 100644 --- a/tasmota/language/sv_SE.h +++ b/tasmota/language/sv_SE.h @@ -639,8 +639,6 @@ #define D_SENSOR_TM1638_CLK "TM16 CLK" #define D_SENSOR_TM1638_DIO "TM16 DIO" #define D_SENSOR_TM1638_STB "TM16 STB" -#define D_SENSOR_TM1637_CLK "TM1637 CLK" -#define D_SENSOR_TM1637_DIO "TM1637 DIO" #define D_SENSOR_HX711_SCK "HX711 SCK" #define D_SENSOR_HX711_DAT "HX711 DAT" #define D_SENSOR_FTC532 "FTC532" @@ -784,6 +782,8 @@ #define D_SENSOR_ST7789_DC "ST7789 DC" #define D_SENSOR_SSD1331_CS "SSD1331 CS" #define D_SENSOR_SSD1331_DC "SSD1331 DC" +#define D_SENSOR_TM1637_CLK "TM1637 CLK" +#define D_SENSOR_TM1637_DIO "TM1637 DIO" #define D_SENSOR_SDCARD_CS "SDCard CS" #define D_SENSOR_WIEGAND_D0 "Wiegand D0" #define D_SENSOR_WIEGAND_D1 "Wiegand D1" diff --git a/tasmota/language/tr_TR.h b/tasmota/language/tr_TR.h index 762a3c6c0..165cc5e05 100644 --- a/tasmota/language/tr_TR.h +++ b/tasmota/language/tr_TR.h @@ -639,8 +639,6 @@ #define D_SENSOR_TM1638_CLK "TM16 CLK" #define D_SENSOR_TM1638_DIO "TM16 DIO" #define D_SENSOR_TM1638_STB "TM16 STB" -#define D_SENSOR_TM1637_CLK "TM1637 CLK" -#define D_SENSOR_TM1637_DIO "TM1637 DIO" #define D_SENSOR_HX711_SCK "HX711 SCK" #define D_SENSOR_HX711_DAT "HX711 DAT" #define D_SENSOR_FTC532 "FTC532" @@ -784,6 +782,8 @@ #define D_SENSOR_ST7789_DC "ST7789 DC" #define D_SENSOR_SSD1331_CS "SSD1331 CS" #define D_SENSOR_SSD1331_DC "SSD1331 DC" +#define D_SENSOR_TM1637_CLK "TM1637 CLK" +#define D_SENSOR_TM1637_DIO "TM1637 DIO" #define D_SENSOR_SDCARD_CS "SDCard CS" #define D_SENSOR_WIEGAND_D0 "Wiegand D0" #define D_SENSOR_WIEGAND_D1 "Wiegand D1" diff --git a/tasmota/language/uk_UA.h b/tasmota/language/uk_UA.h index d093295d6..c2c6a5484 100644 --- a/tasmota/language/uk_UA.h +++ b/tasmota/language/uk_UA.h @@ -639,8 +639,6 @@ #define D_SENSOR_TM1638_CLK "TM16 CLK" #define D_SENSOR_TM1638_DIO "TM16 DIO" #define D_SENSOR_TM1638_STB "TM16 STB" -#define D_SENSOR_TM1637_CLK "TM1637 CLK" -#define D_SENSOR_TM1637_DIO "TM1637 DIO" #define D_SENSOR_HX711_SCK "HX711 SCK" #define D_SENSOR_HX711_DAT "HX711 DAT" #define D_SENSOR_FTC532 "FTC532" @@ -784,6 +782,8 @@ #define D_SENSOR_ST7789_DC "ST7789 DC" #define D_SENSOR_SSD1331_CS "SSD1331 CS" #define D_SENSOR_SSD1331_DC "SSD1331 DC" +#define D_SENSOR_TM1637_CLK "TM1637 CLK" +#define D_SENSOR_TM1637_DIO "TM1637 DIO" #define D_SENSOR_SDCARD_CS "SDCard CS" #define D_SENSOR_WIEGAND_D0 "Wiegand D0" #define D_SENSOR_WIEGAND_D1 "Wiegand D1" diff --git a/tasmota/language/vi_VN.h b/tasmota/language/vi_VN.h index 704f96b47..372bd9926 100644 --- a/tasmota/language/vi_VN.h +++ b/tasmota/language/vi_VN.h @@ -639,8 +639,6 @@ #define D_SENSOR_TM1638_CLK "TM16 CLK" #define D_SENSOR_TM1638_DIO "TM16 DIO" #define D_SENSOR_TM1638_STB "TM16 STB" -#define D_SENSOR_TM1637_CLK "TM1637 CLK" -#define D_SENSOR_TM1637_DIO "TM1637 DIO" #define D_SENSOR_HX711_SCK "HX711 SCK" #define D_SENSOR_HX711_DAT "HX711 DAT" #define D_SENSOR_FTC532 "FTC532" @@ -784,6 +782,8 @@ #define D_SENSOR_ST7789_DC "ST7789 DC" #define D_SENSOR_SSD1331_CS "SSD1331 CS" #define D_SENSOR_SSD1331_DC "SSD1331 DC" +#define D_SENSOR_TM1637_CLK "TM1637 CLK" +#define D_SENSOR_TM1637_DIO "TM1637 DIO" #define D_SENSOR_SDCARD_CS "SDCard CS" #define D_SENSOR_WIEGAND_D0 "Wiegand D0" #define D_SENSOR_WIEGAND_D1 "Wiegand D1" diff --git a/tasmota/language/zh_CN.h b/tasmota/language/zh_CN.h index 41bdb51ed..7874b5fe0 100644 --- a/tasmota/language/zh_CN.h +++ b/tasmota/language/zh_CN.h @@ -639,8 +639,6 @@ #define D_SENSOR_TM1638_CLK "TM16 CLK" #define D_SENSOR_TM1638_DIO "TM16 DIO" #define D_SENSOR_TM1638_STB "TM16 STB" -#define D_SENSOR_TM1637_CLK "TM1637 CLK" -#define D_SENSOR_TM1637_DIO "TM1637 DIO" #define D_SENSOR_HX711_SCK "HX711 SCK" #define D_SENSOR_HX711_DAT "HX711 DAT" #define D_SENSOR_FTC532 "FTC532" @@ -784,6 +782,8 @@ #define D_SENSOR_ST7789_DC "ST7789 DC" #define D_SENSOR_SSD1331_CS "SSD1331 CS" #define D_SENSOR_SSD1331_DC "SSD1331 DC" +#define D_SENSOR_TM1637_CLK "TM1637 CLK" +#define D_SENSOR_TM1637_DIO "TM1637 DIO" #define D_SENSOR_SDCARD_CS "SDCard CS" #define D_SENSOR_WIEGAND_D0 "Wiegand D0" #define D_SENSOR_WIEGAND_D1 "Wiegand D1" diff --git a/tasmota/language/zh_TW.h b/tasmota/language/zh_TW.h index 39044c77c..232a9d250 100644 --- a/tasmota/language/zh_TW.h +++ b/tasmota/language/zh_TW.h @@ -639,8 +639,6 @@ #define D_SENSOR_TM1638_CLK "TM16 CLK" #define D_SENSOR_TM1638_DIO "TM16 DIO" #define D_SENSOR_TM1638_STB "TM16 STB" -#define D_SENSOR_TM1637_CLK "TM1637 CLK" -#define D_SENSOR_TM1637_DIO "TM1637 DIO" #define D_SENSOR_HX711_SCK "HX711 SCK" #define D_SENSOR_HX711_DAT "HX711 DAT" #define D_SENSOR_FTC532 "FTC532" @@ -784,6 +782,8 @@ #define D_SENSOR_ST7789_DC "ST7789 DC" #define D_SENSOR_SSD1331_CS "SSD1331 CS" #define D_SENSOR_SSD1331_DC "SSD1331 DC" +#define D_SENSOR_TM1637_CLK "TM1637 CLK" +#define D_SENSOR_TM1637_DIO "TM1637 DIO" #define D_SENSOR_SDCARD_CS "SDCard CS" #define D_SENSOR_WIEGAND_D0 "Wiegand D0" #define D_SENSOR_WIEGAND_D1 "Wiegand D1" diff --git a/tasmota/my_user_config.h b/tasmota/my_user_config.h index 8c3546d31..1a3a5fa72 100644 --- a/tasmota/my_user_config.h +++ b/tasmota/my_user_config.h @@ -635,6 +635,7 @@ // #define USE_DISPLAY_RA8876 // [DisplayModel 10] [I2cDriver39] (Touch) // #define USE_DISPLAY_ST7789 // [DisplayModel 12] Enable ST7789 module // #define USE_DISPLAY_SSD1331 // [DisplayModel 14] Enable SSD1331 module +// #define USE_DISPLAY_TM1637 // [DisplayModel 15] Enable TM1637 module // #define USE_RC522 // Add support for MFRC522 13.56Mhz Rfid reader (+6k code) // #define USE_RC522_DATA_FUNCTION // Add support for reading data block content (+0k4 code) // #define USE_RC522_TYPE_INFORMATION // Add support for showing card type (+0k4 code) @@ -776,7 +777,6 @@ // -- Other sensors/drivers ----------------------- //#define USE_TM1638 // Add support for TM1638 switches copying Switch1 .. Switch8 (+1k code) -//#define USE_TM1637 // Add support for TM1637 seven-segment display (+1k code) //#define USE_HX711 // Add support for HX711 load cell (+1k5 code) // #define USE_HX711_GUI // Add optional web GUI to HX711 as scale (+1k8 code) diff --git a/tasmota/support_features.ino b/tasmota/support_features.ino index a41dda14c..c02465a27 100644 --- a/tasmota/support_features.ino +++ b/tasmota/support_features.ino @@ -320,9 +320,6 @@ void ResponseAppendFeatures(void) #endif #ifdef USE_TM1638 feature3 |= 0x80000000; // xsns_28_tm1638.ino -#endif -#ifdef USE_TM1637 - feature3 |= 0x100000000; // xsns_85_tm1637.ino #endif } @@ -715,6 +712,9 @@ void ResponseAppendFeatures(void) #if defined(USE_I2C) && defined(USE_TOF10120) feature7 |= 0x10000000; // xsns_84_tof10120 #endif +#if defined(USE_DISPLAY) && defined(USE_DISPLAY_SEVENSEG) && defined(USE_TM1637) + feature7 |= 0x20000000; // xdsp_15_tm1637.ino +#endif // feature7 |= 0x20000000; // feature7 |= 0x40000000; // feature7 |= 0x80000000; diff --git a/tasmota/support_tasmota.ino b/tasmota/support_tasmota.ino index e3a25f36e..4e2521860 100644 --- a/tasmota/support_tasmota.ino +++ b/tasmota/support_tasmota.ino @@ -571,6 +571,9 @@ void ExecuteCommandPower(uint32_t device, uint32_t state, uint32_t source) interlock_mutex = false; } +#ifdef USE_DEVICE_GROUPS + power_t old_power = TasmotaGlobal.power; +#endif // USE_DEVICE_GROUPS switch (state) { case POWER_OFF: { TasmotaGlobal.power &= (POWER_MASK ^ mask); @@ -582,7 +585,7 @@ void ExecuteCommandPower(uint32_t device, uint32_t state, uint32_t source) TasmotaGlobal.power ^= mask; } #ifdef USE_DEVICE_GROUPS - if (SRC_REMOTE != source && SRC_RETRY != source) { + if (TasmotaGlobal.power != old_power && SRC_REMOTE != source && SRC_RETRY != source) { if (Settings.flag4.multiple_device_groups) // SetOption88 - Enable relays in separate device groups SendDeviceGroupMessage(device - 1, DGR_MSGTYP_UPDATE, DGR_ITEM_POWER, (TasmotaGlobal.power >> (device - 1)) & 1 | 0x01000000); // Explicitly set number of relays to one else @@ -761,8 +764,6 @@ bool MqttShowSensor(void) for (uint32_t i = 0; i < MAX_SWITCHES; i++) { #ifdef USE_TM1638 if (PinUsed(GPIO_SWT1, i) || (PinUsed(GPIO_TM16CLK) && PinUsed(GPIO_TM16DIO) && PinUsed(GPIO_TM16STB))) { -#elif defined(USE_TM1637) - if (PinUsed(GPIO_TM1637_CLK) && PinUsed(GPIO_TM1637_DIO)) { #else if (PinUsed(GPIO_SWT1, i)) { #endif // USE_TM1638 @@ -1651,6 +1652,7 @@ void GpioInit(void) ValidSpiPinUsed(GPIO_ST7789_DC) || // ST7789 CS may be omitted so chk DC too ValidSpiPinUsed(GPIO_ST7789_CS) || (ValidSpiPinUsed(GPIO_SSD1331_CS) && ValidSpiPinUsed(GPIO_SSD1331_DC)) || + (ValidSpiPinUsed(GPIO_TM1637_CLK) && ValidSpiPinUsed(GPIO_TM1637_DIO)) || ValidSpiPinUsed(GPIO_SDCARD_CS) ); // If SPI_CS and/or SPI_DC is used they must be valid diff --git a/tasmota/tasmota_configurations.h b/tasmota/tasmota_configurations.h index 0dd97bb58..23c42350d 100644 --- a/tasmota/tasmota_configurations.h +++ b/tasmota/tasmota_configurations.h @@ -202,7 +202,6 @@ #define USE_LMT01 // Add support for TI LMT01 temperature sensor, count pulses on single GPIO (+0k5 code) //#define USE_WIEGAND // Add support for 24/26/32/34 bit RFID Wiegand interface (D0/D1) (+1k7 code) #define USE_TM1638 // Add support for TM1638 switches copying Switch1 .. Switch8 (+1k code) -#define USE_TM1637 // Add support for TM1637 seven-segment display #define USE_HX711 // Add support for HX711 load cell (+1k5 code) //#define USE_HX711_GUI // Add optional web GUI to HX711 as scale (+1k8 code) //#define USE_TX20_WIND_SENSOR // Add support for La Crosse TX20 anemometer (+2k6/0k8 code) @@ -319,6 +318,7 @@ #define USE_DISPLAY_RA8876 // [DisplayModel 10] #define USE_DISPLAY_ST7789 // [DisplayModel 12] Enable ST7789 module #define USE_DISPLAY_SSD1331 // [DisplayModel 14] Enable SSD1331 module + #define USE_DISPLAY_TM1637 // [DisplayModel 15] Enable TM1637 module #undef DEBUG_THEO // Disable debug code #undef USE_DEBUG_DRIVER // Disable debug code @@ -433,7 +433,6 @@ #undef USE_MAX31855 // Disable MAX31855 K-Type thermocouple sensor using softSPI #undef USE_MAX31865 // Disable support for MAX31865 RTD sensors using softSPI #undef USE_TM1638 // Disable support for TM1638 switches copying Switch1 .. Switch8 -#undef USE_TM1637 // Disable support for TM1637 seven-segment display #undef USE_HX711 // Disable support for HX711 load cell #undef USE_TX20_WIND_SENSOR // Disable support for La Crosse TX20 anemometer #undef USE_TX23_WIND_SENSOR // Disable support for La Crosse TX23 anemometer @@ -581,7 +580,6 @@ #undef USE_IR_REMOTE // Disable IR driver #undef USE_TM1638 // Disable support for TM1638 switches copying Switch1 .. Switch8 -#undef USE_TM1637 // Disable support for TM1637 seven-segment display #undef USE_HX711 // Disable support for HX711 load cell #undef USE_TX20_WIND_SENSOR // Disable support for La Crosse TX20 anemometer #undef USE_TX23_WIND_SENSOR // Disable support for La Crosse TX23 anemometer @@ -719,7 +717,6 @@ #undef USE_IR_REMOTE // Disable IR driver #undef USE_TM1638 // Disable support for TM1638 switches copying Switch1 .. Switch8 -#undef USE_TM1637 // Disable support for TM1637 seven-segment display #undef USE_HX711 // Disable support for HX711 load cell #undef USE_TX20_WIND_SENSOR // Disable support for La Crosse TX20 anemometer #undef USE_TX23_WIND_SENSOR // Disable support for La Crosse TX23 anemometer @@ -862,7 +859,6 @@ #undef USE_LMT01 // Disable support for TI LMT01 temperature sensor, count pulses on single GPIO (+0k5 code) #undef USE_IR_REMOTE // Disable IR driver #undef USE_TM1638 // Disable support for TM1638 switches copying Switch1 .. Switch8 -#undef USE_TM1637 // Disable support for TM1637 seven-segment display #undef USE_HX711 // Disable support for HX711 load cell #undef USE_TX20_WIND_SENSOR // Disable support for La Crosse TX20 anemometer #undef USE_TX23_WIND_SENSOR // Disable support for La Crosse TX23 anemometer diff --git a/tasmota/tasmota_template.h b/tasmota/tasmota_template.h index aa561c9f9..d9ad52799 100644 --- a/tasmota/tasmota_template.h +++ b/tasmota/tasmota_template.h @@ -53,7 +53,6 @@ enum UserSelectablePins { GPIO_SDM120_TX, GPIO_SDM120_RX, // SDM120 Serial interface GPIO_SDM630_TX, GPIO_SDM630_RX, // SDM630 Serial interface GPIO_TM16CLK, GPIO_TM16DIO, GPIO_TM16STB, // TM1638 interface - GPIO_TM1637_CLK, GPIO_TM1637_DIO, // TM1637 interface GPIO_MP3_DFR562, // RB-DFR-562, DFPlayer Mini MP3 Player GPIO_HX711_SCK, GPIO_HX711_DAT, // HX711 Load Cell interface GPIO_TX2X_TXD_BLACK, // TX20/TX23 Transmission Pin @@ -143,6 +142,7 @@ enum UserSelectablePins { GPIO_RA8876_CS, GPIO_ST7789_CS, GPIO_ST7789_DC, GPIO_SSD1331_CS, GPIO_SSD1331_DC, + GPIO_TM1637_CLK, GPIO_TM1637_DIO, GPIO_SDCARD_CS, GPIO_ROT1A_NP, GPIO_ROT1B_NP, // Rotary switch GPIO_ADC_PH, // Analog PH Sensor @@ -226,7 +226,6 @@ const char kSensorNames[] PROGMEM = D_SENSOR_SDM120_TX "|" D_SENSOR_SDM120_RX "|" D_SENSOR_SDM630_TX "|" D_SENSOR_SDM630_RX "|" D_SENSOR_TM1638_CLK "|" D_SENSOR_TM1638_DIO "|" D_SENSOR_TM1638_STB "|" - D_SENSOR_TM1637_CLK "|" D_SENSOR_TM1637_DIO "|" D_SENSOR_DFR562 "|" D_SENSOR_HX711_SCK "|" D_SENSOR_HX711_DAT "|" D_SENSOR_TX2X_TX "|" @@ -312,6 +311,7 @@ const char kSensorNames[] PROGMEM = D_SENSOR_RA8876_CS "|" D_SENSOR_ST7789_CS "|" D_SENSOR_ST7789_DC "|" D_SENSOR_SSD1331_CS "|" D_SENSOR_SSD1331_DC "|" + D_SENSOR_TM1637_CLK "|" D_SENSOR_TM1637_DIO "|" D_SENSOR_SDCARD_CS "|" D_SENSOR_ROTARY " A_n|" D_SENSOR_ROTARY " B_n|" D_SENSOR_ADC_PH "|" @@ -431,6 +431,10 @@ const uint16_t kGpioNiceList[] PROGMEM = { AGPIO(GPIO_SSD1331_CS), AGPIO(GPIO_SSD1331_DC), #endif // USE_DISPLAY_SSD1331 +#ifdef USE_DISPLAY_TM1637 + AGPIO(GPIO_TM1637_CLK), + AGPIO(GPIO_TM1637_DIO), +#endif // USE_DISPLAY_TM1637 AGPIO(GPIO_BACKLIGHT), // Display backlight control AGPIO(GPIO_OLED_RESET), // OLED Display Reset #endif @@ -531,14 +535,6 @@ const uint16_t kGpioNiceList[] PROGMEM = { AGPIO(GPIO_TM16DIO), // TM1638 Data I/O AGPIO(GPIO_TM16STB), // TM1638 Strobe #endif -#ifdef USE_TM1637 - AGPIO(GPIO_TM1637_CLK), // TM1637 Clock - AGPIO(GPIO_TM1637_DIO), // TM1637 Data I/O -#endif -#ifdef USE_TM1637 - GPIO_TM1637_CLK, // TM1637 Clock - GPIO_TM1637_DIO, // TM1637 Data I/O -#endif #ifdef USE_HX711 AGPIO(GPIO_HX711_SCK), // HX711 Load Cell clock AGPIO(GPIO_HX711_DAT), // HX711 Load Cell data diff --git a/tasmota/xdrv_13_display.ino b/tasmota/xdrv_13_display.ino index a9b9f7d33..103a0a8a0 100755 --- a/tasmota/xdrv_13_display.ino +++ b/tasmota/xdrv_13_display.ino @@ -64,6 +64,18 @@ const uint8_t DISPLAY_LOG_ROWS = 32; // Number of lines in display log #define D_CMND_DISP_WIDTH "Width" #define D_CMND_DISP_HEIGHT "Height" #define D_CMND_DISP_BLINKRATE "Blinkrate" +#define D_CMND_DISP_CLEAR "Clear" +#define D_CMND_DISP_NUMBER "Number" +#define D_CMND_DISP_FLOAT "Float" +#define D_CMND_DISP_NUMBERNC "NumberNC" // NC - "No Clear" +#define D_CMND_DISP_FLOATNC "FloatNC" // NC - "No Clear" +#define D_CMND_DISP_BRIGHTNESS "Brightness" +#define D_CMND_DISP_RAW "Raw" +#define D_CMND_DISP_LEVEL "Level" +#define D_CMND_DISP_SEVENSEG_TEXT "SevensegText" +#define D_CMND_DISP_SEVENSEG_TEXTNC "SevensegTextNC" // NC - "No Clear" +#define D_CMND_DISP_SCROLLDELAY "ScrollDelay" +#define D_CMND_DISP_CLOCK "Clock" enum XdspFunctions { FUNC_DISPLAY_INIT_DRIVER, FUNC_DISPLAY_INIT, FUNC_DISPLAY_EVERY_50_MSECOND, FUNC_DISPLAY_EVERY_SECOND, FUNC_DISPLAY_MODEL, FUNC_DISPLAY_MODE, FUNC_DISPLAY_POWER, @@ -72,19 +84,27 @@ enum XdspFunctions { FUNC_DISPLAY_INIT_DRIVER, FUNC_DISPLAY_INIT, FUNC_DISPLAY_E FUNC_DISPLAY_DRAW_CIRCLE, FUNC_DISPLAY_FILL_CIRCLE, FUNC_DISPLAY_DRAW_RECTANGLE, FUNC_DISPLAY_FILL_RECTANGLE, FUNC_DISPLAY_TEXT_SIZE, FUNC_DISPLAY_FONT_SIZE, FUNC_DISPLAY_ROTATION, FUNC_DISPLAY_DRAW_STRING, - FUNC_DISPLAY_DIM, FUNC_DISPLAY_BLINKRATE }; + FUNC_DISPLAY_DIM, FUNC_DISPLAY_BLINKRATE, FUNC_DISPLAY_NUMBER, FUNC_DISPLAY_FLOAT, + FUNC_DISPLAY_NUMBERNC, FUNC_DISPLAY_FLOATNC, FUNC_DISPLAY_BRIGHTNESS, FUNC_DISPLAY_RAW, + FUNC_DISPLAY_LEVEL, FUNC_DISPLAY_SEVENSEG_TEXT, FUNC_DISPLAY_SEVENSEG_TEXTNC, + FUNC_DISPLAY_SCROLLDELAY, FUNC_DISPLAY_CLOCK }; enum DisplayInitModes { DISPLAY_INIT_MODE, DISPLAY_INIT_PARTIAL, DISPLAY_INIT_FULL }; const char kDisplayCommands[] PROGMEM = D_PRFX_DISPLAY "|" // Prefix "|" D_CMND_DISP_MODEL "|" D_CMND_DISP_WIDTH "|" D_CMND_DISP_HEIGHT "|" D_CMND_DISP_MODE "|" D_CMND_DISP_REFRESH "|" D_CMND_DISP_DIMMER "|" D_CMND_DISP_COLS "|" D_CMND_DISP_ROWS "|" D_CMND_DISP_SIZE "|" D_CMND_DISP_FONT "|" - D_CMND_DISP_ROTATE "|" D_CMND_DISP_TEXT "|" D_CMND_DISP_ADDRESS "|" D_CMND_DISP_BLINKRATE ; + D_CMND_DISP_ROTATE "|" D_CMND_DISP_TEXT "|" D_CMND_DISP_ADDRESS "|" D_CMND_DISP_BLINKRATE "|" D_CMND_DISP_CLEAR "|" + D_CMND_DISP_NUMBER "|" D_CMND_DISP_FLOAT "|" D_CMND_DISP_NUMBERNC "|" D_CMND_DISP_FLOATNC "|" D_CMND_DISP_BRIGHTNESS "|" + D_CMND_DISP_RAW "|" D_CMND_DISP_LEVEL "|" D_CMND_DISP_SEVENSEG_TEXT "|" D_CMND_DISP_SEVENSEG_TEXTNC "|" + D_CMND_DISP_SCROLLDELAY "|" D_CMND_DISP_CLOCK; void (* const DisplayCommand[])(void) PROGMEM = { &CmndDisplay, &CmndDisplayModel, &CmndDisplayWidth, &CmndDisplayHeight, &CmndDisplayMode, &CmndDisplayRefresh, &CmndDisplayDimmer, &CmndDisplayColumns, &CmndDisplayRows, &CmndDisplaySize, &CmndDisplayFont, - &CmndDisplayRotate, &CmndDisplayText, &CmndDisplayAddress, &CmndDisplayBlinkrate }; + &CmndDisplayRotate, &CmndDisplayText, &CmndDisplayAddress, &CmndDisplayBlinkrate, &CmndDisplayClear, &CmndDisplayNumber, + &CmndDisplayFloat, &CmndDisplayNumberNC, &CmndDisplayFloatNC, &CmndDisplayBrightness, &CmndDisplayRaw, + &CmndDisplayLevel, &CmndDisplaySevensegText, &CmndDisplaySevensegTextNC, &CmndDisplayScrollDelay, &CmndDisplayClock }; char *dsp_str; @@ -1432,6 +1452,105 @@ void CmndDisplayBlinkrate(void) ResponseCmndNumber(XdrvMailbox.payload); } +void CmndDisplayClear(void) +{ + if (!renderer) + XdspCall(FUNC_DISPLAY_CLEAR); + ResponseCmndChar(XdrvMailbox.data); +} + +void CmndDisplayNumber(void) +{ + if (!renderer) { + XdspCall(FUNC_DISPLAY_NUMBER); + } + ResponseCmndChar(XdrvMailbox.data); +} + +void CmndDisplayFloat(void) +{ + if (!renderer) { + XdspCall(FUNC_DISPLAY_FLOAT); + } + ResponseCmndChar(XdrvMailbox.data); +} + +void CmndDisplayNumberNC(void) +{ + if (!renderer) { + XdspCall(FUNC_DISPLAY_NUMBERNC); + } + ResponseCmndChar(XdrvMailbox.data); +} + +void CmndDisplayFloatNC(void) +{ + if (!renderer) { + XdspCall(FUNC_DISPLAY_FLOATNC); + } + ResponseCmndChar(XdrvMailbox.data); +} + +void CmndDisplayBrightness(void) +{ + bool result = false; + if (!renderer) { + result = XdspCall(FUNC_DISPLAY_BRIGHTNESS); + } + if(result) ResponseCmndNumber(XdrvMailbox.payload); + ResponseCmndNumber(XdrvMailbox.payload); +} + +void CmndDisplayRaw(void) +{ + if (!renderer) { + XdspCall(FUNC_DISPLAY_RAW); + } + ResponseCmndChar(XdrvMailbox.data); +} + +void CmndDisplayLevel(void) +{ + bool result = false; + if (!renderer) { + result = XdspCall(FUNC_DISPLAY_LEVEL); + } + if(result) ResponseCmndNumber(XdrvMailbox.payload); + ResponseCmndNumber(XdrvMailbox.payload); +} + +void CmndDisplaySevensegText(void) +{ + if (!renderer) { + XdspCall(FUNC_DISPLAY_SEVENSEG_TEXT); + } + ResponseCmndChar(XdrvMailbox.data); +} + +void CmndDisplaySevensegTextNC(void) +{ + if (!renderer) { + XdspCall(FUNC_DISPLAY_SEVENSEG_TEXTNC); + } + ResponseCmndChar(XdrvMailbox.data); +} + +void CmndDisplayScrollDelay(void) +{ + if (!renderer) { + XdspCall(FUNC_DISPLAY_SCROLLDELAY); + } + ResponseCmndNumber(XdrvMailbox.payload); +} + +void CmndDisplayClock(void) +{ + if (!renderer) { + XdspCall(FUNC_DISPLAY_CLOCK); + } + ResponseCmndNumber(XdrvMailbox.payload); +} + void CmndDisplaySize(void) { if ((XdrvMailbox.payload > 0) && (XdrvMailbox.payload <= 4)) { diff --git a/tasmota/xdsp_15_tm1637.ino b/tasmota/xdsp_15_tm1637.ino new file mode 100644 index 000000000..4c1c8687a --- /dev/null +++ b/tasmota/xdsp_15_tm1637.ino @@ -0,0 +1,509 @@ +/* + xdsp_15_tm1637.ino - Support for TM1637 seven-segment display for Tasmota + + Copyright (C) 2020 Ajith Vasudevan + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + + +/* + + This driver enables the display of numbers (both integers and floats) and basic text + on the inexpensive TM1637-based seven-segment module. Raw segments can also be displayed. + In addition, it is also possible to clear the display, set brightness (7 levels) and display + a rudimentary bar graph. + + To use, compile Tasmota with USE_SPI, USE_DISPLAY and USE_DISPLAY_TM1637 + This adds the following + Pins: + * TM 1637 DIO + * TM 1637 CLK + + Connect the TM1637 display module's DIO and CLK pins to any free GPIOs of the ESP8266 module + and assign the above pins accordingly, from Tasmota's GUI. + Once the device restarts the following commands become available: + * TM1637Clear + * TM1637Number + * TM1637Float + * TM1637Brightness + * TM1637Raw + * TM1637Level + * TM1637Text + + The usage of these commands are explained in code comments below. + +*/ + + + +#ifdef USE_DISPLAY +#ifdef USE_DISPLAY_TM1637 +/*********************************************************************************************\ + * TM1637 support +\*********************************************************************************************/ + +#define XDSP_15 15 +#include + +TM1637TinyDisplay *display; +bool showClock = false; +bool clock24 = false; +uint8_t length = 4; +uint8_t position = 0; +bool leadingzeros = false; +uint8_t length2 = 4; +uint8_t precision = 4; + +char msg[60]; + + +#define BRIGHTNESS_MIN 0 +#define BRIGHTNESS_MAX 7 +#define CMD_MAX_LEN 55 +#define LEVEL_MIN 0 +#define LEVEL_MAX 100 + + +#define D_CMND_TM1637 "TM1637" + +const char S_TM1637_COMMAND_NVALUE[] PROGMEM = "{\"" D_CMND_TM1637 "%s\":%s}"; +const char S_TM1637_COMMAND_SVALUE[] PROGMEM = "{\"" D_CMND_TM1637 "%s\":\"%s\"}"; +const char S_TM1637_RAWCOMMAND_NVALUE[] PROGMEM = "{\"" D_CMND_TM1637 "%s\":\"%d,%d,%d,%d\"}"; +const char S_TM1637_MESSAGE_SVALUE[] PROGMEM = "{\"" "\"%s\":\"%s\"}"; +const char kTM1637_Commands[] PROGMEM = "Clear|Number|NumberC|Float|FloatC|Brightness|Raw|Level|Text|TextC|ScrollDelay|Clock"; + +enum TM1637_Commands { // commands useable in console/MQTT or rules + + CMND_TM1637_CLEAR, // Blanks the display, command: "TM1637Clear" + + CMND_TM1637_NUMBER, // Display integer number (-999 to 9999). command e.g., "TM1637Number 1234" + // Control 'leading zeros', 'length' and 'position' with "TM1637Number 1234, , , " + // 'leading zeros' can be 1 or 0 (default), 'length' can be 1 to 4 (default), 'position' can be 0 (left-most) to 3 (right-most) + + CMND_TM1637_NUMBERC, // Clear first, then display integer number (-999 to 9999). e.g., "TM1637NumberC 1234". Usage is same as above. + + CMND_TM1637_FLOAT, // Display float (with decimal point) (0.001 to 9999.) command e.g., "TM1637Float 12.34" + + CMND_TM1637_FLOATC, // Clear first, then display float (with decimal point) (0.001 to 9999.) command e.g., "TM1637FloatC 12.34" + + CMND_TM1637_BRIGHTNESS, // Set brightness (1 to 7) command e.g., "TM1637Brightness 2" Note: Brightness takes effect only after a new display command is sent. + + CMND_TM1637_RAW, // Takes 4 comma-separated integers (0-255) and displays raw segments + // Each 7-segment display unit is represented by an 8-bit(8th bit for decimap point) number. + // For example, the command "TM1637Raw 255, 255, 255, 255" would display "[8.8.8.8.]" + + CMND_TM1637_LEVEL, // Display a horizontal bar graph (0-100) command e.g., "TM1637Level 50" will display [|||| ] + + CMND_TM1637_TEXT, // Display basic text (scrolls if > 4 characters) command e.g., "TM1637Text ajith vasudevan" + // Control 'length' and 'position' with "TM1637Text abcd, , " + // 'length' can be 1 to 4 (default), 'position' can be 0 (left-most) to 3 (right-most) + // Note: A caret sign '^' in the input text would be replaced by a "degrees" symbol. This is handy for displaying temperature! + // Other Characters whose ASCII > 127 or ASCII < 32 would simply be blank. + + CMND_TM1637_TEXTC, // Clear first, then display text. Usage is same as above. + + CMND_TM1637_SCROLLDELAY, // Sets the speed of text scroll. Takes effect only after a new TEXT command is sent with 4 chars or more. + + CMND_TM1637_CLOCK // Displays a clock. To start clock, command "TM1637Clock 1". To turn offclock, "TM1637Clock 0" +}; + +/*********************************************************************************************\ +* Init function +\*********************************************************************************************/ +bool TM1637Init(void) { + display = new TM1637TinyDisplay(Pin(GPIO_TM1637_CLK), Pin(GPIO_TM1637_DIO)); + display->setBrightness(BRIGHT_5); + display->clear(); + if (!Settings.display_model) { + Settings.display_model = XDSP_15; + } + AddLog(LOG_LEVEL_INFO, PSTR("DSP: TM1637 display driver initialized")); + return true; +} + + +/*********************************************************************************************\ +* Displays number without decimal, with/without leading zeros, specifying length +* and position, optionally skipping clearing display before displaying the number. +* commands: DisplayNumber num [,leading_zeros {0|1} [,length {1-4} [,position {0-3} ]]] +* DisplayNumberNC num [,leading_zeros {0|1} [,length {1-4} [,position {0-3} ]]] // "NC" --> "No Clear" +\*********************************************************************************************/ +bool CmndTM1637Number(bool clear) { + char sNum[15]; char sLeadingZero[5]; char sLength[5]; char sPos[5]; + uint32_t num; + + switch (ArgC()) + { + case 4 : + subStr(sPos, XdrvMailbox.data, ",", 4); + position = atoi(sPos); + case 3 : + subStr(sLength, XdrvMailbox.data, ",", 3); + length = atoi(sLength); + case 2 : + subStr(sLeadingZero, XdrvMailbox.data, ",", 2); + leadingzeros = atoi(sLeadingZero); + case 1 : + subStr(sNum, XdrvMailbox.data, ",", 1); + num = atoi(Trim(sNum)); + } + + if(position > 3) position = 3; + if(position < 0) position = 0; + if((length <= 0) || (length > 4)) length = 4; + + AddLog(LOG_LEVEL_DEBUG, PSTR("LOG: TM1637: num=%d"), num); + AddLog(LOG_LEVEL_DEBUG, PSTR("LOG: TM1637: leadingzeros=%d"), leadingzeros); + AddLog(LOG_LEVEL_DEBUG, PSTR("LOG: TM1637: length=%d"), length); + AddLog(LOG_LEVEL_DEBUG, PSTR("LOG: TM1637: position=%d"), position); + + if(clear) display->clear(); + display->showNumber(num, leadingzeros, length, position); + return true; +} + + + +/*********************************************************************************************\ +* Displays number with decimal, specifying precision and length, +* optionally skipping clearing display before displaying the number. +* commands: DisplayFloat num [,precision {0-4} [,length {1-4} [,position {0-3} ]]] +* DisplayFloatNC num [,precision {0-4} [,length {1-4} [,position {0-3} ]]] // "NC" --> "No Clear" +\*********************************************************************************************/ +bool CmndTM1637Float(bool clear) { + + char sNum[15]; char sPrecision[5]; char sLength[5]; + float fnum = 0.0f; + + switch (ArgC()) + { + case 3 : + subStr(sLength, XdrvMailbox.data, ",", 3); + length2 = atoi(sLength); + case 2 : + subStr(sPrecision, XdrvMailbox.data, ",", 2); + precision = atoi(sPrecision); + case 1 : + subStr(sNum, XdrvMailbox.data, ",", 1); + fnum = atof(sNum); + } + + if((precision < 0) || (precision > 4)) precision = 4; + if((length2 <= 0) || (length2 > 4)) length2 = 4; + + char s[30]; + ext_snprintf_P(s, sizeof(s), PSTR("LOG: TM1637: num=%*_f"), 4, &fnum); + AddLog(LOG_LEVEL_DEBUG, PSTR("%s"), s); + AddLog(LOG_LEVEL_DEBUG, PSTR("LOG: TM1637: precision=%d"), precision); + AddLog(LOG_LEVEL_DEBUG, PSTR("LOG: TM1637: length2=%d"), length2); + + if(clear) display->clear(); + display->showNumber(fnum, precision, length2, 0); + return true; +} + +/*********************************************************************************************\ +* Clears the display +* Command: DisplayClear +\*********************************************************************************************/ +bool CmndTM1637Clear(void) { + display->clear(); + sprintf(msg, PSTR("Cleared")); + XdrvMailbox.data = msg; + return true; +} + + +/*********************************************************************************************\ +* Displays a horizontal bar graph. Takes a percentage number (0-100) as input +* Command: DisplayLevel level {0-100} +\*********************************************************************************************/ +bool CmndTM1637Level(void) { + uint16_t val = XdrvMailbox.payload; + if((val < LEVEL_MIN) || (val > LEVEL_MAX)) { + sprintf(msg, PSTR("Level should be a number in the range [%d, %d]"), LEVEL_MIN, LEVEL_MAX); + XdrvMailbox.data = msg; + return false; + } + display->showLevel(val, false); + return true; +} + + +/*********************************************************************************************\ +* Display arbitrary data on the display module +* Command: DisplayRaw a, b, c, d [, length {1-4} [, position {0-3}] ] +* where a,b,c,d are 4 numbers in the range 0-255, representing a byte array, +* each byte corresponding to a single digit. Within each byte, bit 0 is segment A, +* bit 1 is segment B etc. The function may either set the entire display +* or any desirable part using the length and position parameters. +\*********************************************************************************************/ +bool CmndTM1637Raw(void) { + uint8_t DATA[4] = { 0, 0, 0, 0 }; + + char as[5]; char bs[5]; char cs[5]; char ds[5]; char sLength[5]; char sPos[5]; + uint8_t a = 0; + uint8_t b = 0; + uint8_t c = 0; + uint8_t d = 0; + uint32_t position = 0; + uint32_t length = 4; + + + switch (ArgC()) + { + case 6 : + subStr(sPos, XdrvMailbox.data, ",", 6); + position = atoi(sPos); + case 5 : + subStr(sLength, XdrvMailbox.data, ",", 5); + length = atoi(sLength); + case 4 : + subStr(ds, XdrvMailbox.data, ",", 4); + d = atoi(ds); + case 3 : + subStr(cs, XdrvMailbox.data, ",", 3); + c = atoi(cs); + case 2 : + subStr(bs, XdrvMailbox.data, ",", 2); + b = atoi(bs); + case 1 : + subStr(as, XdrvMailbox.data, ",", 1); + a = atoi(as); + } + + AddLog(LOG_LEVEL_DEBUG, PSTR("LOG: TM1637: a=%d"), a); + AddLog(LOG_LEVEL_DEBUG, PSTR("LOG: TM1637: b=%d"), b); + AddLog(LOG_LEVEL_DEBUG, PSTR("LOG: TM1637: c=%d"), c); + AddLog(LOG_LEVEL_DEBUG, PSTR("LOG: TM1637: d=%d"), d); + AddLog(LOG_LEVEL_DEBUG, PSTR("LOG: TM1637: length=%d"), length); + AddLog(LOG_LEVEL_DEBUG, PSTR("LOG: TM1637: position=%d"), position); + + DATA[0] = a; + DATA[1] = b; + DATA[2] = c; + DATA[3] = d; + display->setSegments(DATA, length, position); + return true; +} + + +/*********************************************************************************************\ +* Display a given string. If more than 4 characters, will scroll message on display +* Text can be placed at arbitrary location on the display using the length and +* position parameters without affecting the rest of the display. +* Command: DisplaySevensegText text [, length {1-4} [, position {0-3}]] +\*********************************************************************************************/ +bool CmndTM1637Text(bool clear) { + if(XdrvMailbox.data_len > CMD_MAX_LEN) { + sprintf(msg, PSTR("Text too long. Please limit text command length to %d"), CMD_MAX_LEN); + XdrvMailbox.data = msg; + return true; + } + char sString[CMD_MAX_LEN + 1]; char sLength[5]; char sPos[5]; + uint32_t position = 0; + uint32_t length = 4; + switch (ArgC()) + { + case 3 : + subStr(sPos, XdrvMailbox.data, ",", 3); + position = atoi(sPos); + case 2 : + subStr(sLength, XdrvMailbox.data, ",", 2); + length = atoi(sLength); + case 1 : + subStr(sString, XdrvMailbox.data, ",", 1); + } + + + if((length <= 0) || (length > 4)) length = 4; + if(position > 3) position = 3; + if(position < 0) position = 0; + + AddLog(LOG_LEVEL_DEBUG, PSTR("LOG: TM1637: string=%s"), sString); + AddLog(LOG_LEVEL_DEBUG, PSTR("LOG: TM1637: length=%d"), length); + AddLog(LOG_LEVEL_DEBUG, PSTR("LOG: TM1637: pos=%d"), position); + + for(uint32_t i; iclear(); + display->showString_P(sString, length, position); + return true; +} + + +/*********************************************************************************************\ +* Sets brightness of the display. The setting takes effect when a command is given +* to change the data being displayed. +* Command: DisplayBrightness {0-7} +\*********************************************************************************************/ +bool CmndTM1637Brightness(void) { + uint16_t val = XdrvMailbox.payload; + if((val < BRIGHTNESS_MIN) || (val > BRIGHTNESS_MAX)) { + sprintf(msg, PSTR("Brightness is a number in the range [%d, %d]"), BRIGHTNESS_MIN, BRIGHTNESS_MAX); + XdrvMailbox.data = msg; + return false; + } + display->setBrightness(val); + return true; +} + +bool CmndTM1637ScrollDelay(void) { + uint16_t val = XdrvMailbox.payload; + if(val == 0) val = 200; + display->setScrolldelay(val); + return true; +} + + +/*********************************************************************************************\ +* Displays a clock. +* Command: DisplayClock 1 // for 12-hour format +* DisplayClock 2 // for 24-hour format +* DisplayClock 0 // turn off clock +\*********************************************************************************************/ +bool CmndTM1637Clock(void) { + AddLog(LOG_LEVEL_DEBUG, PSTR("LOG: TM1637: CmndTM1637Clock %d"), XdrvMailbox.payload); + + showClock = XdrvMailbox.payload; + if(XdrvMailbox.payload > 1) clock24 = true; + else if(XdrvMailbox.payload == 1) clock24 = false; + if(!showClock) { + display->clear(); + } + return true; +} + + +/*********************************************************************************************\ +* refreshes the time on if clock is displayed +\*********************************************************************************************/ +void showTime() { + uint8_t hr = RtcTime.hour; + uint8_t mn = RtcTime.minute; + + if(!clock24) { + if(hr > 12) hr -= 12; + } + if((millis() % 1000) > 500) display->showNumber(1.0f * hr + ((float)RtcTime.minute)/100.0f, 2, 4, 0); + else display->showNumber(100 * hr + RtcTime.minute); +} + +/*********************************************************************************************\ +* This function is called for all TM1637 Display functions. +\*********************************************************************************************/ +bool TM1637Cmd(uint8_t fn) { + bool result = false; + switch (fn) { + case FUNC_DISPLAY_CLEAR: + result = CmndTM1637Clear(); + break; + case FUNC_DISPLAY_NUMBER : + result = CmndTM1637Number(true); + break; + case FUNC_DISPLAY_NUMBERNC : + result = CmndTM1637Number(false); + break; + case FUNC_DISPLAY_FLOAT : + result = CmndTM1637Float(true); + break; + case FUNC_DISPLAY_FLOATNC : + result = CmndTM1637Float(false); + break; + case FUNC_DISPLAY_BRIGHTNESS: + result = CmndTM1637Brightness(); + break; + case FUNC_DISPLAY_RAW: + result = CmndTM1637Raw(); + break; + case FUNC_DISPLAY_LEVEL: + result = CmndTM1637Level(); + break; + case FUNC_DISPLAY_SEVENSEG_TEXT: + result = CmndTM1637Text(true); + break; + case FUNC_DISPLAY_SEVENSEG_TEXTNC: + result = CmndTM1637Text(false); + break; + case FUNC_DISPLAY_SCROLLDELAY: + result = CmndTM1637ScrollDelay(); + break; + case FUNC_DISPLAY_CLOCK: + result = CmndTM1637Clock(); + break; + } + + return result; +} + + +/*********************************************************************************************\ + * Interface +\*********************************************************************************************/ + +bool Xdsp15(uint8_t function) +{ + bool result = false; + + if (FUNC_DISPLAY_INIT_DRIVER == function) { + AddLog(LOG_LEVEL_DEBUG, PSTR("LOG: TM1637: FUNC_DISPLAY_INIT_DRIVER")); + result = TM1637Init(); // init + } + else if (XDSP_15 == Settings.display_model) { + switch (function) { + case FUNC_DISPLAY_MODEL: + AddLog(LOG_LEVEL_DEBUG, PSTR("LOG: TM1637: FUNC_DISPLAY_MODEL")); + result = true; + break; + case FUNC_DISPLAY_INIT: + CmndTM1637Clear(); + AddLog(LOG_LEVEL_DEBUG, PSTR("LOG: TM1637: FUNC_DISPLAY_INIT")); + break; + case FUNC_DISPLAY_DRAW_STRING: + sprintf(msg, PSTR("For TM1637, please use DisplaySevenSegText instead of DisplayText")); + XdrvMailbox.data = msg; + result = true; + break; + case FUNC_DISPLAY_SEVENSEG_TEXT: + case FUNC_DISPLAY_CLEAR: + case FUNC_DISPLAY_NUMBER: + case FUNC_DISPLAY_FLOAT: + case FUNC_DISPLAY_NUMBERNC: + case FUNC_DISPLAY_FLOATNC: + case FUNC_DISPLAY_BRIGHTNESS: + case FUNC_DISPLAY_RAW: + case FUNC_DISPLAY_LEVEL: + case FUNC_DISPLAY_SEVENSEG_TEXTNC: + case FUNC_DISPLAY_SCROLLDELAY: + case FUNC_DISPLAY_CLOCK: + result = TM1637Cmd(function); + break; + case FUNC_DISPLAY_EVERY_50_MSECOND: + if(showClock) { + showTime(); + } + break; + } + } + return result; +} + +#endif // USE_DISPLAY_TM1637 +#endif // USE_DISPLAY diff --git a/tasmota/xsns_85_tm1637.ino b/tasmota/xsns_85_tm1637.ino deleted file mode 100644 index 75590e927..000000000 --- a/tasmota/xsns_85_tm1637.ino +++ /dev/null @@ -1,355 +0,0 @@ -/* - xsns_85_tm1637.ino - Support for TM1637 seven-segment display for Tasmota - - Copyright (C) 2020 Ajith Vasudevan - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - - -/* - - This driver enables the display of numbers (both integers and floats) and basic text - on the inexpensive TM1637-based seven-segment module. Raw segments can also be displayed. - In addition, it is also possible to clear the display, set brightness (7 levels) and display - a rudimentary bar graph. - - To use, compile Tasmota with USE_DISPLAY_SEVENSEG and USE_TM1637 - This adds the following - Pins: - * TM 1637 DIO - * TM 1637 CLK - - Connect the TM1637 display module's DIO and CLK pins to any free GPIOs of the ESP8266 module - and assign the above pins accordingly, from Tasmota's GUI. - Once the device restarts the following commands become available: - * TM1637Clear - * TM1637Number - * TM1637Float - * TM1637Brightness - * TM1637Raw - * TM1637Level - * TM1637Text - - The usage of these commands are explained in code comments below. - -*/ - - - -#ifdef USE_DISPLAY_SEVENSEG -#ifdef USE_TM1637 -/*********************************************************************************************\ - * TM1637 support -\*********************************************************************************************/ - -#define XSNS_85 85 -#include - -TM1637TinyDisplay *display; -bool defaultResponse = true; -bool isString = false; -char command[CMDSZ]; - - -#define BRIGHTNESS_MIN 0 -#define BRIGHTNESS_MAX 7 -#define NUMBER_MIN -999 -#define NUMBER_MAX 9999 -#define FLOAT_MIN -999.0 -#define FLOAT_MAX 9999.0 -#define CMD_MAX_LEN 55 -#define LEVEL_MIN 0 -#define LEVEL_MAX 100 - - -#define D_CMND_TM1637 "TM1637" - -const char S_TM1637_COMMAND_NVALUE[] PROGMEM = "{\"" D_CMND_TM1637 "%s\":%s}"; -const char S_TM1637_COMMAND_SVALUE[] PROGMEM = "{\"" D_CMND_TM1637 "%s\":\"%s\"}"; -const char S_TM1637_RAWCOMMAND_NVALUE[] PROGMEM = "{\"" D_CMND_TM1637 "%s\":\"%d,%d,%d,%d\"}"; -const char S_TM1637_MESSAGE_SVALUE[] PROGMEM = "{\"" "\"%s\":\"%s\"}"; -const char kTM1637_Commands[] PROGMEM = "Clear|Number|NumberC|Float|Brightness|Raw|Level|Text|TextC|ScrollDelay"; -uint32_t len = strlen(D_CMND_TM1637); - - -enum TM1637_Commands { // commands useable in console/MQTT or rules - - CMND_TM1637_CLEAR, // Blanks the display, command: "TM1637Clear" - - CMND_TM1637_NUMBER, // Display integer number (-999 to 9999). command e.g., "TM1637Number 1234" - // Control 'leading zeros', 'length' and 'position' with "TM1637Number 1234, , , " - // 'leading zeros' can be 1 or 0 (default), 'length' can be 1 to 4 (default), 'position' can be 0 (left-most) to 3 (right-most) - - CMND_TM1637_NUMBERC, // Clear first, then display integer number (-999 to 9999). Usage is same as above. - - CMND_TM1637_FLOAT, // Display float (with decimal point) (0.001 to 9999.) command e.g., "TM1637Float 12.34" - - CMND_TM1637_BRIGHTNESS, // Set brightness (1 to 7) command e.g., "TM1637Brightness 2" Note: Brightness takes effect only after a new display command is sent. - - CMND_TM1637_RAW, // Takes 4 comma-separated integers (0-255) and displays raw segments - // Each 7-segment display unit is represented by an 8-bit(8th bit for decimap point) number. - // For example, the command "TM1637Raw 255, 255, 255, 255" would display "[8.8.8.8.]" - - CMND_TM1637_LEVEL, // Display a horizontal bar graph (0-100) command e.g., "TM1637Level 50" will display [|||| ] - - CMND_TM1637_TEXT, // Display basic text (scrolls if > 4 characters) command e.g., "TM1637Text ajith vasudevan" - // Control 'length' and 'position' with "TM1637Text abcd, , " - // 'length' can be 1 to 4 (default), 'position' can be 0 (left-most) to 3 (right-most) - // Note: A caret sign '^' in the input text would be replaced by a "degrees" symbol. This is handy for displaying temperature! - // Other Characters whose ASCII > 127 or ASCII < 32 would simply be blank. - - CMND_TM1637_TEXTC, // Clear first, then display text. Usage is same as above. - - CMND_TM1637_SCROLLDELAY // Sets the speed of text scroll. Takes effect only after a new TEXT command is sent with 4 chars or more. -}; - -bool TM1637Init(void) { - display = new TM1637TinyDisplay(Pin(GPIO_TM1637_CLK), Pin(GPIO_TM1637_DIO)); - display->setBrightness(BRIGHT_5); - display->clear(); - AddLog(LOG_LEVEL_DEBUG, PSTR("LOG: TM1637: initialized")); - return true; -} - - -bool CmndTM1637Number(bool clear) { - - char sNum[5]; char sLeadingZero[5]; char sLength[5]; char sPos[5]; - subStr(sNum, XdrvMailbox.data, ",", 1); - subStr(sLeadingZero, XdrvMailbox.data, ",", 2); - subStr(sLength, XdrvMailbox.data, ",", 3); - subStr(sPos, XdrvMailbox.data, ",", 4); - - uint32_t num = atoi(sNum); - bool leadingZero = atoi(sLeadingZero); - uint32_t length = atoi(sLength); - uint32_t pos = atoi(sPos); - - if((length <= 0) || (length > 4)) length = 4; - if(pos > 4) pos = 4; - if(pos < 0) pos = 0; - - AddLog(LOG_LEVEL_DEBUG, PSTR("LOG: TM1637: num=%d"), num); - AddLog(LOG_LEVEL_DEBUG, PSTR("LOG: TM1637: leadingZero=%d"), leadingZero); - AddLog(LOG_LEVEL_DEBUG, PSTR("LOG: TM1637: length=%d"), length); - AddLog(LOG_LEVEL_DEBUG, PSTR("LOG: TM1637: pos=%d"), pos); - - if(clear) display->clear(); - display->showNumber(num, leadingZero, length, pos); - return true; -} - -bool CmndTM1637Float(void) { - float val = atof(XdrvMailbox.data); - char msg[50]; - if((val < FLOAT_MIN) || (val > FLOAT_MAX)) { - defaultResponse = false; - float fmin = FLOAT_MIN; - float fmax = FLOAT_MAX; - char msg[50]; - ext_snprintf_P(msg, sizeof(msg), PSTR("Float should be in the range [%1_f, %1_f]"), &fmin, &fmax); - Response_P(S_TM1637_MESSAGE_SVALUE, "Error", msg); - return true; - } - display->showNumber(val); - return true; -} - -bool CmndTM1637Clear(void) { - display->clear(); - return true; -} - -bool CmndTM1637Level(void) { - uint16_t val = XdrvMailbox.payload; - if((val < LEVEL_MIN) || (val > LEVEL_MAX)) { - defaultResponse = false; - char msg[45]; - sprintf(msg, PSTR("Level should be a number in the range [%d, %d]"), LEVEL_MIN, LEVEL_MAX); - Response_P(S_TM1637_MESSAGE_SVALUE, "Error", msg); - return true; - } - display->showLevel(val, false); - return true; -} - -bool CmndTM1637Raw(void) { - uint8_t DATA[1][4] = { - { 0x00, 0x00, 0x00, 0x00 } - }; - - char a[5]; char b[5]; char c[5]; char d[5]; - subStr(a, XdrvMailbox.data, ",", 1); - subStr(b, XdrvMailbox.data, ",", 2); - subStr(c, XdrvMailbox.data, ",", 3); - subStr(d, XdrvMailbox.data, ",", 4); - - uint16_t a1 = atoi(a); - uint16_t b1 = atoi(b); - uint16_t c1 = atoi(c); - uint16_t d1 = atoi(d); - - AddLog(LOG_LEVEL_DEBUG, PSTR("LOG: TM1637: a1=%d"), a1); - AddLog(LOG_LEVEL_DEBUG, PSTR("LOG: TM1637: b1=%d"), b1); - AddLog(LOG_LEVEL_DEBUG, PSTR("LOG: TM1637: c1=%d"), c1); - AddLog(LOG_LEVEL_DEBUG, PSTR("LOG: TM1637: d1=%d"), d1); - - DATA[0][0] = a1; - DATA[0][1] = b1; - DATA[0][2] = c1; - DATA[0][3] = d1; - defaultResponse = false; - Response_P(S_TM1637_RAWCOMMAND_NVALUE, command, a1, b1, c1, d1); - display->showAnimation_P(DATA, FRAMES(DATA), TIME_MS(150)); - return true; -} - - -bool CmndTM1637Text(bool clear) { - char sString[CMD_MAX_LEN + 1]; char sLength[5]; char sPos[5]; - subStr(sString, XdrvMailbox.data, ",", 1); - subStr(sLength, XdrvMailbox.data, ",", 2); - subStr(sPos, XdrvMailbox.data, ",", 3); - - uint32_t length = atoi(sLength); - uint32_t pos = atoi(sPos); - - if((length <= 0) || (length > 4)) length = 4; - if(pos > 4) pos = 4; - if(pos < 0) pos = 0; - - AddLog(LOG_LEVEL_DEBUG, PSTR("LOG: TM1637: string=%s"), sString); - AddLog(LOG_LEVEL_DEBUG, PSTR("LOG: TM1637: length=%d"), length); - AddLog(LOG_LEVEL_DEBUG, PSTR("LOG: TM1637: pos=%d"), pos); - - for(uint32_t i; iclear(); - display->showString_P(sString, length, pos); - return true; -} - - -bool CmndTM1637Brightness(void) { - uint16_t val = XdrvMailbox.payload; - if((val < BRIGHTNESS_MIN) || (val > BRIGHTNESS_MAX)) { - defaultResponse = false; - char msg[45]; - sprintf(msg, PSTR("Brightness is a number in the range [%d, %d]"), BRIGHTNESS_MIN, BRIGHTNESS_MAX); - Response_P(S_TM1637_MESSAGE_SVALUE, "Error", msg); - return true; - } - display->setBrightness(val); - return true; -} - -bool CmndTM1637ScrollDelay(void) { - uint16_t val = XdrvMailbox.payload; - if(val == 0) val = 200; - display->setScrolldelay(val); - return true; -} - - -bool TM1637Cmd(void) { - bool result = false; - uint32_t command_code = -1; - if (!strncasecmp_P(XdrvMailbox.topic, PSTR(D_CMND_TM1637), len)) { - command_code = GetCommandCode(command, sizeof(command), XdrvMailbox.topic + len, kTM1637_Commands); - AddLog(LOG_LEVEL_DEBUG, PSTR("LOG: TM1637: command_code: %d params: %s"), command_code, XdrvMailbox.data); - } - if(command_code < 0) { - return result; - } - if(XdrvMailbox.data_len > CMD_MAX_LEN) { - char msg[45]; - sprintf(msg, PSTR("Command too long. Should be less than %d characters long"), CMD_MAX_LEN); - Response_P(S_TM1637_MESSAGE_SVALUE, "Error", msg); - return result; - } - - switch (command_code) { - case CMND_TM1637_CLEAR: - defaultResponse = false; - result = CmndTM1637Clear(); - Response_P(S_TM1637_MESSAGE_SVALUE, "Message", "Cleared"); - break; - case CMND_TM1637_NUMBER : - result = CmndTM1637Number(false); - break; - case CMND_TM1637_NUMBERC : - result = CmndTM1637Number(true); - break; - case CMND_TM1637_FLOAT : - result = CmndTM1637Float(); - break; - case CMND_TM1637_BRIGHTNESS: - result = CmndTM1637Brightness(); - break; - case CMND_TM1637_RAW: - isString = true; - result = CmndTM1637Raw(); - break; - case CMND_TM1637_LEVEL: - result = CmndTM1637Level(); - break; - case CMND_TM1637_TEXT: - isString = true; - result = CmndTM1637Text(false); - break; - case CMND_TM1637_TEXTC: - isString = true; - result = CmndTM1637Text(true); - break; - case CMND_TM1637_SCROLLDELAY: - isString = true; - result = CmndTM1637ScrollDelay(); - break; - } - - if(defaultResponse) { - if(isString) Response_P(S_TM1637_COMMAND_SVALUE, command, XdrvMailbox.data); - else Response_P(S_TM1637_COMMAND_NVALUE, command, XdrvMailbox.data); - } - return result; -} - - -/*********************************************************************************************\ - * Interface -\*********************************************************************************************/ - -bool Xsns85(uint8_t function) -{ - bool result = false; - if (PinUsed(GPIO_TM1637_CLK) && PinUsed(GPIO_TM1637_DIO)) { - switch (function) { - case FUNC_PRE_INIT: - TM1637Init(); // init - break; - case FUNC_COMMAND: - defaultResponse = true; // resetting value for new cmnd - isString = false; // resetting value for new cmmd - result = TM1637Cmd(); - break; - } - } - return result; -} - -#endif // USE_1637 -#endif // USE_DISPLAY_SEVENSEG diff --git a/tools/decode-status.py b/tools/decode-status.py index 3e6b0f5e0..248d1c82e 100755 --- a/tools/decode-status.py +++ b/tools/decode-status.py @@ -209,7 +209,7 @@ a_features = [[ "USE_INA219","USE_SHT3X","USE_MHZ19","USE_TSL2561", "USE_SENSEAIR","USE_PMS5003","USE_MGS","USE_NOVA_SDS", "USE_SGP30","USE_SR04","USE_SDM120","USE_SI1145", - "USE_SDM630","USE_LM75AD","USE_APDS9960","USE_TM1638","USE_TM1637" + "USE_SDM630","USE_LM75AD","USE_APDS9960","USE_TM1638" ],[ "USE_MCP230xx","USE_MPR121","USE_CCS811","USE_MPU6050", "USE_MCP230xx_OUTPUT","USE_MCP230xx_DISPLAYOUTPUT","USE_HLW8012","USE_CSE7766", @@ -243,7 +243,7 @@ a_features = [[ "USE_EZODO","USE_EZORGB","USE_EZOPMP","USE_AS608", "USE_SHELLY_DIMMER","USE_RC522","USE_FTC532","USE_DISPLAY_EPAPER_42", "USE_DISPLAY_ILI9488","USE_DISPLAY_SSD1351","USE_DISPLAY_RA8876","USE_DISPLAY_ST7789", - "USE_DISPLAY_SSD1331","USE_UFILESYS","USE_TIMEPROP","USE_PID", + "USE_DISPLAY_SSD1331","USE_DISPLAY_TM1637","USE_UFILESYS","USE_TIMEPROP","USE_PID", "USE_BS814A2","USE_SEESAW_SOIL","USE_WIEGAND","USE_NEOPOOL", "USE_TOF10120","","","" ],[ From 5da636a870034c4cf8379e55ad835dd7fe7cb8ab Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Thu, 11 Feb 2021 18:51:29 +0100 Subject: [PATCH 06/99] bluetooth in repo firmware --- .github/workflows/Tasmota_build.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/Tasmota_build.yml b/.github/workflows/Tasmota_build.yml index b707b68a3..716c5c274 100644 --- a/.github/workflows/Tasmota_build.yml +++ b/.github/workflows/Tasmota_build.yml @@ -1462,6 +1462,7 @@ jobs: [ ! -f ./mv_firmware/firmware/tasmota32-web*.* ] || mv ./mv_firmware/firmware/tasmota32-web*.* ./firmware/tasmota32/ [ ! -f ./mv_firmware/firmware/tasmota32-odroidgo.* ] || mv ./mv_firmware/firmware/tasmota32-odroidgo.* ./firmware/tasmota32/ [ ! -f ./mv_firmware/firmware/tasmota32-core2.* ] || mv ./mv_firmware/firmware/tasmota32-core2.* ./firmware/tasmota32/ + [ ! -f ./mv_firmware/firmware/tasmota32-bluetooth.* ] || mv ./mv_firmware/firmware/tasmota32-bluetooth.* ./firmware/tasmota32/ [ ! -f ./mv_firmware/firmware/tasmota32-knx.* ] || mv ./mv_firmware/firmware/tasmota32-knx.* ./firmware/tasmota32/ [ ! -f ./mv_firmware/firmware/tasmota32* ] || mv ./mv_firmware/firmware/tasmota32* ./firmware/tasmota32/languages/ [ ! -f ./mv_firmware/firmware/* ] || mv ./mv_firmware/firmware/* ./firmware/tasmota/languages/ From 9487ff605d6e214704fa12418c3a3b9fb6adaefd Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Thu, 11 Feb 2021 18:52:48 +0100 Subject: [PATCH 07/99] bluettoth in branch release-firmware --- .github/workflows/Tasmota_build_master.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/Tasmota_build_master.yml b/.github/workflows/Tasmota_build_master.yml index a6a1b668c..5cf20b573 100644 --- a/.github/workflows/Tasmota_build_master.yml +++ b/.github/workflows/Tasmota_build_master.yml @@ -1462,6 +1462,7 @@ jobs: [ ! -f ./mv_firmware/firmware/tasmota32-web*.* ] || mv ./mv_firmware/firmware/tasmota32-web*.* ./firmware/tasmota32/ [ ! -f ./mv_firmware/firmware/tasmota32-odroidgo.* ] || mv ./mv_firmware/firmware/tasmota32-odroidgo.* ./firmware/tasmota32/ [ ! -f ./mv_firmware/firmware/tasmota32-core2.* ] || mv ./mv_firmware/firmware/tasmota32-core2.* ./firmware/tasmota32/ + [ ! -f ./mv_firmware/firmware/tasmota32-bluetooth.* ] || mv ./mv_firmware/firmware/tasmota32-bluetooth.* ./firmware/tasmota32/ [ ! -f ./mv_firmware/firmware/tasmota32-knx.* ] || mv ./mv_firmware/firmware/tasmota32-knx.* ./firmware/tasmota32/ [ ! -f ./mv_firmware/firmware/tasmota32* ] || mv ./mv_firmware/firmware/tasmota32* ./firmware/tasmota32/languages/ [ ! -f ./mv_firmware/firmware/* ] || mv ./mv_firmware/firmware/* ./firmware/tasmota/languages/ From caecc5cb3347f2976225f780e14f1fd92e504b30 Mon Sep 17 00:00:00 2001 From: jaymemaurice <38895319+jaymemaurice@users.noreply.github.com> Date: Thu, 11 Feb 2021 12:57:57 -0500 Subject: [PATCH 08/99] TuyaMCU Precise Temperature Sensor packetValue now interpreted as float based on configuration of TempRes command. Beware TempRes default may be 1 thus a TuyaMCU device may need TempRes set to 0 after this change if it's currently working. See https://github.com/arendst/Tasmota/issues/10917 --- tasmota/xdrv_16_tuyamcu.ino | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tasmota/xdrv_16_tuyamcu.ino b/tasmota/xdrv_16_tuyamcu.ino index 5f94e576d..a66f6e170 100644 --- a/tasmota/xdrv_16_tuyamcu.ino +++ b/tasmota/xdrv_16_tuyamcu.ino @@ -1295,7 +1295,7 @@ void TuyaSensorsShow(bool json) GetTextIndexed(sname, sizeof(sname), (sensor-71), kTuyaSensors); ResponseAppend_P(PSTR("\"%s\":%s"), sname, - (Tuya.SensorsValid[sensor-71] ? dtostrfd(Tuya.Sensors[sensor-71], res, tempval) : PSTR("null"))); + (Tuya.SensorsValid[sensor-71] ? dtostrfd((float)Tuya.Sensors[sensor-71] / pow(10, res), res, tempval) : PSTR("null"))); added = true; } #ifdef USE_WEBSERVER @@ -1303,11 +1303,11 @@ void TuyaSensorsShow(bool json) if (TuyaGetDpId(sensor) != 0) { switch (sensor) { case 71: - WSContentSend_Temp("", Tuya.Sensors[0]); + WSContentSend_Temp("", (float)Tuya.Sensors[0] / pow(10, Settings.flag2.temperature_resolution)); break; case 72: WSContentSend_PD(PSTR("{s}" D_TEMPERATURE " Set{m}%s " D_UNIT_DEGREE "%c{e}"), - dtostrfd(Tuya.Sensors[1], Settings.flag2.temperature_resolution, tempval), TempUnit()); + dtostrfd((float)Tuya.Sensors[1] / pow(10, Settings.flag2.temperature_resolution), Settings.flag2.temperature_resolution, tempval), TempUnit()); break; case 73: WSContentSend_PD(HTTP_SNS_HUM, "", dtostrfd(Tuya.Sensors[2], Settings.flag2.temperature_resolution, tempval)); From df1653ac992e1e10f059737cb1e6cb1e265e8d68 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Ara=C3=BAjo?= Date: Thu, 11 Feb 2021 18:46:06 +0000 Subject: [PATCH 09/99] Fix EZO sensors on esp32 --- tasmota/xsns_78_ezo.ino | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tasmota/xsns_78_ezo.ino b/tasmota/xsns_78_ezo.ino index a33ad9cdc..d1e27fc01 100644 --- a/tasmota/xsns_78_ezo.ino +++ b/tasmota/xsns_78_ezo.ino @@ -53,7 +53,7 @@ struct EZOStruct { { // Transmit our command verbatim Wire.beginTransmission(addr); - Wire.write(cmd, len); + Wire.write((uint8_t*)cmd, len); if (Wire.endTransmission() != 0) { return; } From 5e1c7815fb7f9a2199a0062b745de15a38b22e00 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Ara=C3=BAjo?= Date: Thu, 11 Feb 2021 18:46:06 +0000 Subject: [PATCH 10/99] Fix EZO sensors on esp32 --- tasmota/xsns_78_ezo.ino | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tasmota/xsns_78_ezo.ino b/tasmota/xsns_78_ezo.ino index a33ad9cdc..d1e27fc01 100644 --- a/tasmota/xsns_78_ezo.ino +++ b/tasmota/xsns_78_ezo.ino @@ -53,7 +53,7 @@ struct EZOStruct { { // Transmit our command verbatim Wire.beginTransmission(addr); - Wire.write(cmd, len); + Wire.write((uint8_t*)cmd, len); if (Wire.endTransmission() != 0) { return; } From 5e9fe677f387bcde7ad226cbb8ff5c03b9566aae Mon Sep 17 00:00:00 2001 From: jaymemaurice <38895319+jaymemaurice@users.noreply.github.com> Date: Thu, 11 Feb 2021 14:48:55 -0500 Subject: [PATCH 11/99] Precise temperature without pow Implement TuyaAdjustedTemperature which takes precision to offset the integer value. Using TempRes parameter as these should align --- tasmota/xdrv_16_tuyamcu.ino | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/tasmota/xdrv_16_tuyamcu.ino b/tasmota/xdrv_16_tuyamcu.ino index a66f6e170..9c9221b07 100644 --- a/tasmota/xdrv_16_tuyamcu.ino +++ b/tasmota/xdrv_16_tuyamcu.ino @@ -318,6 +318,23 @@ int StrCmpNoCase(char const *Str1, char const *Str2) // Compare case sensistive } } +float TuyaAdjustedTemperature(uint8_t packetValue, uint8_t res) +{ + switch (res) + { + case 1: + return packetValue/10; + break; + case 2: + return packetValue/100; + break; + case 3: + return packetValue/1000; + break; + default: + return (float)packetValue; + } +} /*********************************************************************************************\ * Internal Functions \*********************************************************************************************/ @@ -1295,7 +1312,7 @@ void TuyaSensorsShow(bool json) GetTextIndexed(sname, sizeof(sname), (sensor-71), kTuyaSensors); ResponseAppend_P(PSTR("\"%s\":%s"), sname, - (Tuya.SensorsValid[sensor-71] ? dtostrfd((float)Tuya.Sensors[sensor-71] / pow(10, res), res, tempval) : PSTR("null"))); + (Tuya.SensorsValid[sensor-71] ? dtostrfd(TuyaAdjustedTemperature(Tuya.Sensors[sensor-71], res), res, tempval) : PSTR("null"))); added = true; } #ifdef USE_WEBSERVER @@ -1303,11 +1320,11 @@ void TuyaSensorsShow(bool json) if (TuyaGetDpId(sensor) != 0) { switch (sensor) { case 71: - WSContentSend_Temp("", (float)Tuya.Sensors[0] / pow(10, Settings.flag2.temperature_resolution)); + WSContentSend_Temp("", TuyaAdjustedTemperature(Tuya.Sensors[0], Settings.flag2.temperature_resolution)); break; case 72: WSContentSend_PD(PSTR("{s}" D_TEMPERATURE " Set{m}%s " D_UNIT_DEGREE "%c{e}"), - dtostrfd((float)Tuya.Sensors[1] / pow(10, Settings.flag2.temperature_resolution), Settings.flag2.temperature_resolution, tempval), TempUnit()); + dtostrfd(TuyaAdjustedTemperature(Tuya.Sensors[1], Settings.flag2.temperature_resolution), Settings.flag2.temperature_resolution, tempval), TempUnit()); break; case 73: WSContentSend_PD(HTTP_SNS_HUM, "", dtostrfd(Tuya.Sensors[2], Settings.flag2.temperature_resolution, tempval)); From 5af6c1baeca03bfdb512ab145407b3f48c43c722 Mon Sep 17 00:00:00 2001 From: jaymemaurice <38895319+jaymemaurice@users.noreply.github.com> Date: Thu, 11 Feb 2021 14:55:33 -0500 Subject: [PATCH 12/99] Fix missing divisor Fix missing divisior --- tasmota/xdrv_16_tuyamcu.ino | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tasmota/xdrv_16_tuyamcu.ino b/tasmota/xdrv_16_tuyamcu.ino index 9c9221b07..2f4c17c1c 100644 --- a/tasmota/xdrv_16_tuyamcu.ino +++ b/tasmota/xdrv_16_tuyamcu.ino @@ -749,7 +749,7 @@ void TuyaProcessStatePacket(void) { } else { res = Settings.flag2.temperature_resolution; } GetTextIndexed(sname, sizeof(sname), (fnId-71), kTuyaSensors); ResponseClear(); // Clear retained message - Response_P(PSTR("{\"TuyaSNS\":{\"%s\":%s}}"), sname, dtostrfd(packetValue, res, tempval)); // sensor update is just on change + Response_P(PSTR("{\"TuyaSNS\":{\"%s\":%s}}"), sname, dtostrfd(TuyaAdjustedTemperature(packetValue, res), res, tempval)); // sensor update is just on change MqttPublishPrefixTopicRulesProcess_P(TELE, PSTR(D_CMND_SENSOR)); } } From acb2f6e1d93ce3e9b35e5ce407ad40b3b103ce0c Mon Sep 17 00:00:00 2001 From: jaymemaurice <38895319+jaymemaurice@users.noreply.github.com> Date: Thu, 11 Feb 2021 16:20:26 -0500 Subject: [PATCH 13/99] Fix loss of precision Fix loss of precision regression --- tasmota/xdrv_16_tuyamcu.ino | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/tasmota/xdrv_16_tuyamcu.ino b/tasmota/xdrv_16_tuyamcu.ino index 2f4c17c1c..579a85234 100644 --- a/tasmota/xdrv_16_tuyamcu.ino +++ b/tasmota/xdrv_16_tuyamcu.ino @@ -323,16 +323,17 @@ float TuyaAdjustedTemperature(uint8_t packetValue, uint8_t res) switch (res) { case 1: - return packetValue/10; + return (float)packetValue / 10; break; case 2: - return packetValue/100; + return (float)packetValue / 100; break; case 3: - return packetValue/1000; + return (float)packetValue / 1000; break; default: return (float)packetValue; + break; } } /*********************************************************************************************\ From e6757fed3d69e9d1f6803dc34b619452d230036d Mon Sep 17 00:00:00 2001 From: jaymemaurice <38895319+jaymemaurice@users.noreply.github.com> Date: Thu, 11 Feb 2021 16:49:59 -0500 Subject: [PATCH 14/99] Update xdrv_16_tuyamcu.ino Change type uint8_t to uint16_t on TuyaAdjustedTemperature to support temperatures over 25.5 or 255 degrees. --- tasmota/xdrv_16_tuyamcu.ino | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tasmota/xdrv_16_tuyamcu.ino b/tasmota/xdrv_16_tuyamcu.ino index 579a85234..8f4d8e8d8 100644 --- a/tasmota/xdrv_16_tuyamcu.ino +++ b/tasmota/xdrv_16_tuyamcu.ino @@ -318,18 +318,18 @@ int StrCmpNoCase(char const *Str1, char const *Str2) // Compare case sensistive } } -float TuyaAdjustedTemperature(uint8_t packetValue, uint8_t res) +float TuyaAdjustedTemperature(uint16_t packetValue, uint8_t res) { switch (res) { case 1: - return (float)packetValue / 10; + return (float)packetValue / 10.0; break; case 2: - return (float)packetValue / 100; + return (float)packetValue / 100.0; break; case 3: - return (float)packetValue / 1000; + return (float)packetValue / 1000.0; break; default: return (float)packetValue; From ce064906fda27fc9d63b566d0479217a423e40ca Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Fri, 12 Feb 2021 09:43:23 +0100 Subject: [PATCH 15/99] add lib info files --- .../library.properties | 2 +- lib/default/UdpListener/library.properties | 2 +- .../Unishox-1.0-shadinger/library.properties | 2 +- .../jsmn-shadinger-1.0/library.properties | 2 +- lib/lib_audio/ESP8266Audio/library.json | 1 + lib/lib_audio/ESP8266SAM/library.json | 1 + lib/lib_basic/NeoPixelBus-2.6.0/library.json | 2 +- .../library.json | 1 + .../LiquidCrystal_I2C-1.1.3/library.json | 5 +--- lib/lib_div/LibTeleinfo/library.json | 2 +- lib/lib_div/NewPing-1.9.1/library.properties | 2 +- ...rary.properties.off => library.properties} | 2 +- lib/lib_i2c/I2Cdevlib-Core/.library.json | 26 +++++++++---------- lib/lib_rf/KeeloqLib/library.properties | 2 +- lib/lib_rf/cc1101/library.json | 8 ++++++ lib/lib_rf/cc1101/library.properties | 2 +- lib/libesp32/CORE2_Library/library.json | 8 ++++++ lib/libesp32/CORE2_Library/library.properties | 2 +- lib/libesp32/ESP32-Ethernet/library.json | 8 ++++++ .../ESP32-Ethernet/library.properties | 10 +------ lib/libesp32/ESP32-Mail-Client/library.json | 8 ++++++ .../ESP32-Mail-Client/library.properties | 8 ------ .../ESP32-to-ESP8266-compat/library.json | 8 ++++++ .../library.properties | 2 +- lib/libesp32/LITTLEFS/library.json | 5 +--- lib/libesp32/NimBLE-Arduino/library.json | 8 ++++++ lib/libesp32/rtsp/library.json | 8 ++++++ lib/libesp32/rtsp/library.properties | 2 +- 28 files changed, 88 insertions(+), 51 deletions(-) rename lib/lib_div/esp-knx-ip-0.5.2/{library.properties.off => library.properties} (93%) create mode 100644 lib/lib_rf/cc1101/library.json create mode 100644 lib/libesp32/CORE2_Library/library.json create mode 100644 lib/libesp32/ESP32-Ethernet/library.json create mode 100644 lib/libesp32/ESP32-Mail-Client/library.json create mode 100644 lib/libesp32/ESP32-to-ESP8266-compat/library.json create mode 100644 lib/libesp32/NimBLE-Arduino/library.json create mode 100644 lib/libesp32/rtsp/library.json diff --git a/lib/default/PubSubClient-EspEasy-2.7.12/library.properties b/lib/default/PubSubClient-EspEasy-2.7.12/library.properties index 1ae97882e..7df4daf80 100644 --- a/lib/default/PubSubClient-EspEasy-2.7.12/library.properties +++ b/lib/default/PubSubClient-EspEasy-2.7.12/library.properties @@ -6,4 +6,4 @@ sentence=A client library for MQTT messaging. paragraph=MQTT is a lightweight messaging protocol ideal for small devices. This library allows you to send and receive MQTT messages. It supports the latest MQTT 3.1.1 protocol and can be configured to use the older MQTT 3.1 if needed. It supports all Arduino Ethernet Client compatible hardware, including the Intel Galileo/Edison, ESP8266 and TI CC3000. category=Communication url=http://pubsubclient.knolleary.net -architectures=* +architectures=esp8266,esp32 diff --git a/lib/default/UdpListener/library.properties b/lib/default/UdpListener/library.properties index 1d453bc6c..5baf0fff9 100644 --- a/lib/default/UdpListener/library.properties +++ b/lib/default/UdpListener/library.properties @@ -4,4 +4,4 @@ author=Ivan Grokhotkov, Stephan Hadinger maintainer=Stephan sentence=UdpListener optimized for static and limite memory allocation, to reduce memory footprint of receiving SSDP request, as a replacement for WifiUdp. paragraph=This class only handles receiving UDP Multicast packets. For sending packets, use WifiUdp. -architectures=esp8266 +architectures=esp8266,esp32 diff --git a/lib/default/Unishox-1.0-shadinger/library.properties b/lib/default/Unishox-1.0-shadinger/library.properties index 138b2027c..e53e2f8f3 100644 --- a/lib/default/Unishox-1.0-shadinger/library.properties +++ b/lib/default/Unishox-1.0-shadinger/library.properties @@ -5,4 +5,4 @@ maintainer=Arun , Stephan sentence=Unishox compression for Tasmota Rules paragraph=It is based on Unishox hybrid encoding technique. This version has specific Unicode code removed for size. url=https://github.com/siara-cc/Unishox -architectures=esp8266 +architectures=esp8266,esp32 diff --git a/lib/default/jsmn-shadinger-1.0/library.properties b/lib/default/jsmn-shadinger-1.0/library.properties index 674aa76e7..f2cb8f3ab 100644 --- a/lib/default/jsmn-shadinger-1.0/library.properties +++ b/lib/default/jsmn-shadinger-1.0/library.properties @@ -5,4 +5,4 @@ maintainer=Stephan sentence=Lightweight in-place JSON parser paragraph= url=https://github.com/zserge/jsmn -architectures=esp8266 +architectures=esp8266,esp32 diff --git a/lib/lib_audio/ESP8266Audio/library.json b/lib/lib_audio/ESP8266Audio/library.json index 3cdf7a46a..5986c2a41 100644 --- a/lib/lib_audio/ESP8266Audio/library.json +++ b/lib/lib_audio/ESP8266Audio/library.json @@ -20,6 +20,7 @@ "SPI": "1.0" }, "frameworks": "Arduino", + "platforms": ["espressif8266", "espressif32"], "examples": [ "examples/*/*.ino" ] diff --git a/lib/lib_audio/ESP8266SAM/library.json b/lib/lib_audio/ESP8266SAM/library.json index af61daa8b..af66aee97 100644 --- a/lib/lib_audio/ESP8266SAM/library.json +++ b/lib/lib_audio/ESP8266SAM/library.json @@ -17,6 +17,7 @@ "version": "1.0", "homepage": "https://github.com/earlephilhower/ESP8266SAM", "frameworks": "Arduino", + "platforms": ["espressif8266", "espressif32"], "examples": [ "examples/*/*.ino" ] diff --git a/lib/lib_basic/NeoPixelBus-2.6.0/library.json b/lib/lib_basic/NeoPixelBus-2.6.0/library.json index e50ebd242..bd56c759c 100644 --- a/lib/lib_basic/NeoPixelBus-2.6.0/library.json +++ b/lib/lib_basic/NeoPixelBus-2.6.0/library.json @@ -9,6 +9,6 @@ }, "version": "2.6.0", "frameworks": "arduino", - "platforms": "*" + "platforms": ["espressif8266", "espressif32"] } diff --git a/lib/lib_basic/OneWire-Stickbreaker-20190506-1.1/library.json b/lib/lib_basic/OneWire-Stickbreaker-20190506-1.1/library.json index 1e95e2e9f..07570dd8e 100644 --- a/lib/lib_basic/OneWire-Stickbreaker-20190506-1.1/library.json +++ b/lib/lib_basic/OneWire-Stickbreaker-20190506-1.1/library.json @@ -55,6 +55,7 @@ "version": "2.3.2", "homepage": "https://www.pjrc.com/teensy/td_libs_OneWire.html", "frameworks": "Arduino", + "platforms": ["espressif8266", "espressif32"], "examples": [ "examples/*/*.pde" ] diff --git a/lib/lib_display/LiquidCrystal_I2C-1.1.3/library.json b/lib/lib_display/LiquidCrystal_I2C-1.1.3/library.json index 1553b6e44..8ef6d5fa0 100644 --- a/lib/lib_display/LiquidCrystal_I2C-1.1.3/library.json +++ b/lib/lib_display/LiquidCrystal_I2C-1.1.3/library.json @@ -8,8 +8,5 @@ "url": "https://github.com/marcoschwartz/LiquidCrystal_I2C.git" }, "frameworks": "arduino", - "platforms": - [ - "*" - ] + "platforms": ["espressif8266", "espressif32"] } diff --git a/lib/lib_div/LibTeleinfo/library.json b/lib/lib_div/LibTeleinfo/library.json index b2e0684b8..ea6932a9b 100644 --- a/lib/lib_div/LibTeleinfo/library.json +++ b/lib/lib_div/LibTeleinfo/library.json @@ -14,6 +14,6 @@ "url": "http://hallard.me" }, "frameworks": "arduino", - "platforms": "*" + "platforms": ["espressif8266", "espressif32"] } diff --git a/lib/lib_div/NewPing-1.9.1/library.properties b/lib/lib_div/NewPing-1.9.1/library.properties index c825146d9..e87661faf 100644 --- a/lib/lib_div/NewPing-1.9.1/library.properties +++ b/lib/lib_div/NewPing-1.9.1/library.properties @@ -6,5 +6,5 @@ sentence=A library that makes working with ultrasonic sensors easy. paragraph=When I first received an ultrasonic sensor I was not happy with how poorly it performed. I soon realized the problem was not the sensor, it was the available ping and ultrasonic libraries causing the problem. The NewPing library totally fixes these problems, adds many new features, and breathes new life into these very affordable distance sensors. category=Sensors url=https://bitbucket.org/teckel12/arduino-new-ping/wiki/Home -architectures=avr,arm,esp8266 +architectures=* includes=NewPing.h diff --git a/lib/lib_div/esp-knx-ip-0.5.2/library.properties.off b/lib/lib_div/esp-knx-ip-0.5.2/library.properties similarity index 93% rename from lib/lib_div/esp-knx-ip-0.5.2/library.properties.off rename to lib/lib_div/esp-knx-ip-0.5.2/library.properties index f3b86de9c..ba539db0b 100644 --- a/lib/lib_div/esp-knx-ip-0.5.2/library.properties.off +++ b/lib/lib_div/esp-knx-ip-0.5.2/library.properties @@ -6,5 +6,5 @@ sentence=ESP8266 library for KNX/IP communication. paragraph=Build your own IoT devices with KNX/IP connectivity! category=Communication url=https://github.com/envy/esp-knx-ip -architectures=esp8266 +architectures=* includes=esp-knx-ip.h diff --git a/lib/lib_i2c/I2Cdevlib-Core/.library.json b/lib/lib_i2c/I2Cdevlib-Core/.library.json index 14886c889..8dd4def7c 100644 --- a/lib/lib_i2c/I2Cdevlib-Core/.library.json +++ b/lib/lib_i2c/I2Cdevlib-Core/.library.json @@ -1,31 +1,31 @@ { - "name": "I2Cdevlib-Core", + "name": "I2Cdevlib-Core", "repository": { - "url": "https://github.com/jrowberg/i2cdevlib.git", + "url": "https://github.com/jrowberg/i2cdevlib.git", "type": "git" - }, + }, "platforms": [ "*" ], "frameworks": [ "arduino" - ], - "version": "6744ce0ac4", + ], + "version": "6744ce0ac4", "export": { "include": "Arduino/I2Cdev" - }, + }, "authors": [ { - "maintainer": false, - "name": "Jeff Rowberg", - "url": "https://github.com/jrowberg", + "maintainer": false, + "name": "Jeff Rowberg", + "url": "https://github.com/jrowberg", "email": "jeff@rowberg.net" } - ], + ], "keywords": [ - "i2cdevlib", + "i2cdevlib", "i2c" - ], - "id": 11, + ], + "id": 11, "description": "The I2C Device Library (I2Cdevlib) is a collection of uniform and well-documented classes to provide simple and intuitive interfaces to I2C devices." } diff --git a/lib/lib_rf/KeeloqLib/library.properties b/lib/lib_rf/KeeloqLib/library.properties index fa974d9bf..0210f63ea 100644 --- a/lib/lib_rf/KeeloqLib/library.properties +++ b/lib/lib_rf/KeeloqLib/library.properties @@ -6,4 +6,4 @@ sentence=C++ Class Implementing Keeloq cipher by Microchip.com. paragraph=Developed/Tested on Arduino/ESP8266 with Arduino IDE Environment. category=Uncategorized url=http://none.net -architectures=* +architectures=esp8266,esp32 diff --git a/lib/lib_rf/cc1101/library.json b/lib/lib_rf/cc1101/library.json new file mode 100644 index 000000000..54a3b9de5 --- /dev/null +++ b/lib/lib_rf/cc1101/library.json @@ -0,0 +1,8 @@ +{ + "name": "cc1101", + "keywords": "rf, esp8266", + "description": "cc1101 library", + "version": "1.0", + "frameworks": "arduino", + "platforms": "espressif8266" +} diff --git a/lib/lib_rf/cc1101/library.properties b/lib/lib_rf/cc1101/library.properties index 73e393575..bfb8a65bc 100644 --- a/lib/lib_rf/cc1101/library.properties +++ b/lib/lib_rf/cc1101/library.properties @@ -6,4 +6,4 @@ sentence=. paragraph= category= url= -architectures=esp8266,esp32 +architectures=esp8266 diff --git a/lib/libesp32/CORE2_Library/library.json b/lib/libesp32/CORE2_Library/library.json new file mode 100644 index 000000000..e3ac982c5 --- /dev/null +++ b/lib/libesp32/CORE2_Library/library.json @@ -0,0 +1,8 @@ +{ + "name": "M5 Stack Core2 library", + "keywords": "esp32, sensor, mqtt, m2m, iot", + "description": "M5 Stack Core2 library", + "version": "1.0", + "frameworks": "arduino", + "platforms": "espressif32" +} diff --git a/lib/libesp32/CORE2_Library/library.properties b/lib/libesp32/CORE2_Library/library.properties index 09baffd9a..e3b36fc67 100644 --- a/lib/libesp32/CORE2_Library/library.properties +++ b/lib/libesp32/CORE2_Library/library.properties @@ -6,4 +6,4 @@ sentence=Allows Tasmota to use Core2 paragraph=Allows Tasmota to Core2 for esp32 category=ESP32 url= -architectures=* +architectures=esp32 diff --git a/lib/libesp32/ESP32-Ethernet/library.json b/lib/libesp32/ESP32-Ethernet/library.json new file mode 100644 index 000000000..96ba3e110 --- /dev/null +++ b/lib/libesp32/ESP32-Ethernet/library.json @@ -0,0 +1,8 @@ +{ + "name": "ESP32 Ethernet", + "keywords": "esp32, ethernet, communication", + "description": "Ethernet Library for ESP32", + "version": "1.1.0", + "frameworks": "arduino", + "platforms": "espressif32" +} diff --git a/lib/libesp32/ESP32-Ethernet/library.properties b/lib/libesp32/ESP32-Ethernet/library.properties index 50c7b8ea1..f7f4fd845 100644 --- a/lib/libesp32/ESP32-Ethernet/library.properties +++ b/lib/libesp32/ESP32-Ethernet/library.properties @@ -1,17 +1,9 @@ name=ESP32 Ethernet - version=1.1.0 - author=Espressif - maintainer=Espressif - sentence=Ethernet Library for ESP32 - -paragraph=This library allows ESP32 to use ethernet hardware - +paragraph=This library allows ESP32 to use ethernet hardware category=Communication - url= - architectures=esp32 diff --git a/lib/libesp32/ESP32-Mail-Client/library.json b/lib/libesp32/ESP32-Mail-Client/library.json new file mode 100644 index 000000000..7ad58f5ee --- /dev/null +++ b/lib/libesp32/ESP32-Mail-Client/library.json @@ -0,0 +1,8 @@ +{ + "name": "ESP32 Mail Client", + "keywords": "esp32, mail, communication", + "description": "Mail Client Arduino Library for ESP32", + "version": "2.1.4", + "frameworks": "arduino", + "platforms": "espressif32" +} diff --git a/lib/libesp32/ESP32-Mail-Client/library.properties b/lib/libesp32/ESP32-Mail-Client/library.properties index 6ff993e8b..03eab43ef 100755 --- a/lib/libesp32/ESP32-Mail-Client/library.properties +++ b/lib/libesp32/ESP32-Mail-Client/library.properties @@ -1,17 +1,9 @@ name=ESP32 Mail Client - version=2.1.4 - author=Mobizt - maintainer=Mobizt - sentence=Mail Client Arduino Library for ESP32 - paragraph=This library allows ESP32 to send Email with/without attachment and receive Email with/without attachment download through SMTP and IMAP servers. - category=Communication - url=https://github.com/mobizt/ESP32-Mail-Client - architectures=esp32 diff --git a/lib/libesp32/ESP32-to-ESP8266-compat/library.json b/lib/libesp32/ESP32-to-ESP8266-compat/library.json new file mode 100644 index 000000000..7c5dc4ccd --- /dev/null +++ b/lib/libesp32/ESP32-to-ESP8266-compat/library.json @@ -0,0 +1,8 @@ +{ + "name": "ESP32-to-ESP8266-compat", + "keywords": "esp32, esp8266", + "description": "Allows Tasmota to compile for esp32", + "version": "0.0.2", + "frameworks": "arduino", + "platforms": "espressif32" +} diff --git a/lib/libesp32/ESP32-to-ESP8266-compat/library.properties b/lib/libesp32/ESP32-to-ESP8266-compat/library.properties index 5d5e39166..46e1bfba0 100644 --- a/lib/libesp32/ESP32-to-ESP8266-compat/library.properties +++ b/lib/libesp32/ESP32-to-ESP8266-compat/library.properties @@ -6,4 +6,4 @@ sentence=Allows Tasmota to compile for esp32 paragraph=Allows Tasmota to compile for esp32 category=ESP32 url= -architectures=* +architectures=esp32 diff --git a/lib/libesp32/LITTLEFS/library.json b/lib/libesp32/LITTLEFS/library.json index 8c5f76fc2..d87eba610 100755 --- a/lib/libesp32/LITTLEFS/library.json +++ b/lib/libesp32/LITTLEFS/library.json @@ -15,8 +15,5 @@ "version": "1.0.5", "license": "LGPL-2.0", "frameworks": "arduino", - "platforms": "espressif32", - "build": { - "libCompatMode": 2 - } + "platforms": "espressif32" } \ No newline at end of file diff --git a/lib/libesp32/NimBLE-Arduino/library.json b/lib/libesp32/NimBLE-Arduino/library.json new file mode 100644 index 000000000..5eb6ec5b4 --- /dev/null +++ b/lib/libesp32/NimBLE-Arduino/library.json @@ -0,0 +1,8 @@ +{ + "name": "NimBLE-Arduino", + "keywords": "esp32, bluetooth", + "description": "Bluetooth low energy (BLE) library for arduino-esp32 based on NimBLE", + "version": "1.0.2", + "frameworks": "arduino", + "platforms": "espressif32" +} diff --git a/lib/libesp32/rtsp/library.json b/lib/libesp32/rtsp/library.json new file mode 100644 index 000000000..7726b3e9e --- /dev/null +++ b/lib/libesp32/rtsp/library.json @@ -0,0 +1,8 @@ +{ + "name": "Micro-RTSP", + "keywords": "esp32, rtsp", + "description": "Mikro RTSP server", + "version": "0.1.6", + "frameworks": "arduino", + "platforms": "espressif32" +} diff --git a/lib/libesp32/rtsp/library.properties b/lib/libesp32/rtsp/library.properties index 03b5dc224..4ec1d1f88 100755 --- a/lib/libesp32/rtsp/library.properties +++ b/lib/libesp32/rtsp/library.properties @@ -6,4 +6,4 @@ sentence=Mikro RTSP server for mikros paragraph=A small/efficient RTSP server for ESP32 and other micros category=Data Storage url=https://github.com/geeksville/Micro-RTSP.git -architectures=* +architectures=esp32 From fcc5e7df576ed40fdedea1f662cb86e1658e9317 Mon Sep 17 00:00:00 2001 From: bovirus <1262554+bovirus@users.noreply.github.com> Date: Fri, 12 Feb 2021 12:25:42 +0100 Subject: [PATCH 16/99] Update Italian language --- tasmota/language/it_IT.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tasmota/language/it_IT.h b/tasmota/language/it_IT.h index 0543032f3..d15849bad 100644 --- a/tasmota/language/it_IT.h +++ b/tasmota/language/it_IT.h @@ -1,7 +1,7 @@ /* it-IT.h - localization for Italian - Italy for Tasmota - Copyright (C) 2021 Gennaro Tortone - some mods by Antonio Fragola - Updated by bovirus - rev. 04.02.2021 + Copyright (C) 2021 Gennaro Tortone - some mods by Antonio Fragola - Updated by bovirus - rev. 12.02.2021 This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -630,8 +630,8 @@ #define D_SENSOR_SBR_TX "SerBr - TX" #define D_SENSOR_SR04_TRIG "SR04 Tri - TX" #define D_SENSOR_SR04_ECHO "SR04 Ech - RX" -#define D_SENSOR_SDM72_TX "SDM72 Tx" -#define D_SENSOR_SDM72_RX "SDM72 Rx" +#define D_SENSOR_SDM72_TX "SDM72 - TX" +#define D_SENSOR_SDM72_RX "SDM72 - RX" #define D_SENSOR_SDM120_TX "SDMx20 - TX" #define D_SENSOR_SDM120_RX "SDMx20 - RX" #define D_SENSOR_SDM630_TX "SDM630 - TX" @@ -838,7 +838,7 @@ //SDM220, SDM120, SDM72, LE01MR #define D_EXPORT_POWER "Potenza esportata" #define D_IMPORT_POWER "Potenza importata" -#define D_PHASE_ANGLE "Angolo Fase" +#define D_PHASE_ANGLE "Angolo fase" #define D_IMPORT_ACTIVE "Potenza attiva importata" #define D_EXPORT_ACTIVE "Potenza attiva esportata" #define D_IMPORT_REACTIVE "Potenza reattiva importata" From 4fd4d73602cbadaa62d8c36373d6f4bb5dde0137 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Fri, 12 Feb 2021 13:19:50 +0100 Subject: [PATCH 17/99] Add ESP8266 OTA upload fallback to .gz --- tasmota/support_tasmota.ino | 9 +++++++++ tasmota/tasmota.h | 4 ++++ 2 files changed, 13 insertions(+) diff --git a/tasmota/support_tasmota.ino b/tasmota/support_tasmota.ino index 07f776f5c..be533ede8 100644 --- a/tasmota/support_tasmota.ino +++ b/tasmota/support_tasmota.ino @@ -1077,6 +1077,15 @@ void Every250mSeconds(void) snprintf_P(TasmotaGlobal.mqtt_data, sizeof(TasmotaGlobal.mqtt_data), PSTR("%s-" D_JSON_MINIMAL "%s"), TasmotaGlobal.mqtt_data, ota_url_type); // Minimal filename must be filename-minimal } #endif // FIRMWARE_MINIMAL +#ifdef ESP8266 + if (ota_retry_counter < OTA_ATTEMPTS / 2) { + if (!strcasecmp_P(TasmotaGlobal.mqtt_data, PSTR(".gz"))) { + ota_retry_counter = 1; + } else { + strcat_P(TasmotaGlobal.mqtt_data, PSTR(".gz")); + } + } +#endif // ESP8266 AddLog(LOG_LEVEL_DEBUG, PSTR(D_LOG_UPLOAD "%s"), TasmotaGlobal.mqtt_data); WiFiClient OTAclient; ota_result = (HTTP_UPDATE_FAILED != ESPhttpUpdate.update(OTAclient, TasmotaGlobal.mqtt_data)); diff --git a/tasmota/tasmota.h b/tasmota/tasmota.h index bc27a7df7..c4daf839b 100644 --- a/tasmota/tasmota.h +++ b/tasmota/tasmota.h @@ -147,7 +147,11 @@ const uint32_t BOOT_LOOP_TIME = 10; // Number of seconds to stop detecti const uint32_t POWER_CYCLE_TIME = 8; // Number of seconds to reset power cycle boot loops const uint16_t SYSLOG_TIMER = 600; // Seconds to restore syslog_level const uint16_t SERIALLOG_TIMER = 600; // Seconds to disable SerialLog +#ifdef ESP8266 +const uint8_t OTA_ATTEMPTS = 10; // Number of times to try fetching the new firmware +#else const uint8_t OTA_ATTEMPTS = 5; // Number of times to try fetching the new firmware +#endif // ESP8266 const uint16_t INPUT_BUFFER_SIZE = 520; // Max number of characters in serial command buffer const uint16_t FLOATSZ = 16; // Max number of characters in float result from dtostrfd (max 32) From 99b832cb7b96a6fe4c4e5afd38f31cceeda57a65 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Fri, 12 Feb 2021 15:02:55 +0100 Subject: [PATCH 18/99] Update release notes --- CHANGELOG.md | 3 +- RELEASENOTES.md | 31 ++++- TEMPLATES.md | 304 +++++++++++++++++++++++++++++++++++++----------- 3 files changed, 262 insertions(+), 76 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 384d3f23f..671dbbc94 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,10 +8,11 @@ All notable changes to this project will be documented in this file. - Support for Device Groups Device Map (#10898) - Support for Eastron SDM72D-M three phase 100A Modbus energy meter (#10862) - Support for Frysk language translations by Christiaan Heerze +- ESP8266 Fallback to ``*.bin.gz`` binary when OTA upload of ``*.bin`` binary fails ## [9.2.0.6] 20210210 ### Changed -- Removed migration support for versions before v8.1.0 (Doris) +- Remove support for direct migration from versions before v8.1.0 (Doris) - ESP32 Increase number of switch GPIOs from 8 to 28 - ESP32 Increase number of interlock groups from 4 to 14 - Increase number of button GPIOs from 4 to 8 diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 0c81c26f4..4645593b6 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -4,7 +4,7 @@ ## Migration Information -This version removes migration support for versions before v8.1.0 (Doris) +**This version removes support for direct migration from versions before v8.1.0 (Doris)** See [migration path](https://tasmota.github.io/docs/Upgrading#migration-path) for instructions how to migrate to a major version. Pay attention to the following version breaks due to dynamic settings updates: @@ -40,6 +40,7 @@ For initial configuration this release supports Webserver based **WifiManager** ## Provided Binary Downloads +### ESP8266 or ESP8285 based The following binary downloads have been compiled with ESP8266/Arduino library core version **2.7.4.9**. - **tasmota.bin** = The Tasmota version with most drivers. **RECOMMENDED RELEASE BINARY** @@ -47,12 +48,31 @@ The following binary downloads have been compiled with ESP8266/Arduino library c - **tasmota-lite.bin** = The Lite version without most drivers and sensors. - **tasmota-knx.bin** = The Knx version without some features but adds KNX support. - **tasmota-sensors.bin** = The Sensors version adds more useful sensors. -- **tasmota-ir** = The InfraRed Receiver and transmitter version allowing all available protocols provided by library IRremoteESP8266 but without most other features. +- **tasmota-ir.bin** = The InfraRed Receiver and transmitter version allowing all available protocols provided by library IRremoteESP8266 but without most other features. - **tasmota-display.bin** = The Display version without Energy Monitoring but adds display support. - **tasmota-zbbridge.bin** = The dedicated Sonoff Zigbee Bridge version. - **tasmota-minimal.bin** = The Minimal version allows intermediate OTA uploads to support larger versions and does NOT change any persistent parameter. This version **should NOT be used for initial installation**. -The attached binaries can also be downloaded from http://ota.tasmota.com/tasmota/release for ESP8266 or http://ota.tasmota.com/tasmota32/release for ESP32. The links can be used for OTA upgrades too like ``OtaUrl http://ota.tasmota.com/tasmota/release/tasmota.bin.gz`` +Above binaries are also available as gzipped version allowing faster uploads. + +The attached binaries can also be downloaded from http://ota.tasmota.com/tasmota/release. The links can be used for OTA upgrades too like ``OtaUrl http://ota.tasmota.com/tasmota/release/tasmota.bin.gz`` + +### ESP32 based +The following binary downloads have been compiled with ESP32/Arduino library core version **1.0.5-rc6**. + +- **tasmota32.bin** = The Tasmota version with most drivers. **RECOMMENDED RELEASE BINARY** +- **tasmota32-BG.bin** to **tasmota32-TW.bin** = The Tasmota version in different languages. +- **tasmota32-lite.bin** = The Lite version without most drivers and sensors. +- **tasmota32-knx.bin** = The Knx version without some features but adds KNX support. +- **tasmota32-sensors.bin** = The Sensors version adds more useful sensors. +- **tasmota32-ir.bin** = The InfraRed Receiver and transmitter version allowing all available protocols provided by library IRremoteESP8266 but without most other features. +- **tasmota32-display.bin** = The Display version without Energy Monitoring but adds display support. +- **tasmota32-webcam.bin** = The Webcam version adds webcam support. +- **tasmota32-bluetooth.bin** = The Bluetooth version adds BLE support. +- **tasmota32-odroidgo.bin** = The Odroid-Go version is specifically tailored to Odroid_go hardware. +- **tasmota32-core2.bin** = The Core2 version is specifically tailored to M5Stack Core2 hardware. + +The attached binaries can also be downloaded from http://ota.tasmota.com/tasmota32/release. The links can be used for OTA upgrades too like ``OtaUrl http://ota.tasmota.com/tasmota32/release/tasmota32.bin`` [List](MODULES.md) of embedded modules. @@ -66,7 +86,7 @@ The attached binaries can also be downloaded from http://ota.tasmota.com/tasmota - Command ``Speed2`` to control a once off fade [#10741](https://github.com/arendst/Tasmota/issues/10741) - Command ``VirtualCT`` to simulate or fine tune CT bulbs with 3,4,5 channels [#10311](https://github.com/arendst/Tasmota/issues/10311) - Command ``SetOption40 0..250`` to disable button functionality if activated for over 0.1 second re-introduced -- Command ``SetOption43 1..255`` to control Rotary step (#10407) +- Command ``SetOption43 1..255`` to control Rotary step [#10407](https://github.com/arendst/Tasmota/issues/10407) - Command ``SetOption118 1`` to move ZbReceived from JSON message and into the subtopic replacing "SENSOR" default [#10353](https://github.com/arendst/Tasmota/issues/10353) - Command ``SetOption119 1`` to remove the device addr from json payload, can be used with zb_topic_fname where the addr is already known from the topic [#10355](https://github.com/arendst/Tasmota/issues/10355) - Zigbee command ``SetOption120 1`` or ``ZbEndpointTopic 1`` to add the zigbee endpoint as suffix in topic when using ``SetOption89 1`` @@ -105,6 +125,7 @@ The attached binaries can also be downloaded from http://ota.tasmota.com/tasmota - Rule trigger string comparisons for EndsWith ``$>``, StartsWith ``$<`` and Contains ``$|`` [#10538](https://github.com/arendst/Tasmota/issues/10538) - SPI display driver SSD1331 Color oled by Jeroen Vermeulen [#10376](https://github.com/arendst/Tasmota/issues/10376) - Compile time option ``USE_MQTT_TLS_DROP_OLD_FINGERPRINT`` to drop old (less secure) TLS fingerprint +- ESP8266 Fallback to ``*.bin.gz`` binary when OTA upload of ``*.bin`` binary fails ### Breaking Changed - ESP32 switch from default SPIFFS to default LittleFS file system loosing current (zigbee) files @@ -119,7 +140,7 @@ The attached binaries can also be downloaded from http://ota.tasmota.com/tasmota - Replaced RA8876 GPIO selection from ``SPI CS`` by ``RA8876 CS`` ### Changed -- Removed migration support for versions before v8.1.0 (Doris) +- Remove support for direct migration from versions before v8.1.0 (Doris) - Command ``Sleep 0`` removes any sleep from wifi modem except when ESP32 BLE is active - Logging from heap to stack freeing 700 bytes RAM - Disabled ``USE_LIGHT`` light support for ZBBridge saving 17.6kB [#10374](https://github.com/arendst/Tasmota/issues/10374) diff --git a/TEMPLATES.md b/TEMPLATES.md index 265b3ffa8..ff274a103 100644 --- a/TEMPLATES.md +++ b/TEMPLATES.md @@ -2,7 +2,15 @@ # Templates -Find below the available templates as of December 2020. More template information can be found in the [Tasmota Device Templates Repository](http://blakadder.github.io/templates) +Find below the available templates as of February 2021. More template information can be found in the [Tasmota Device Templates Repository](http://blakadder.github.io/templates) + +## Addressable LED Controller +``` +Athom 2812b {"NAME":"LS2812B-TAS","GPIO":[32,0,1376,0,0,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":18} +cod.m WLAN Pixel Controller v0.6 {"NAME":"cod.m Pixel Controller","GPIO":[32,0,1376,0,0,0,0,0,544,0,0,0,0,0],"FLAG":0,"BASE":18} +ESP01 NeoPixel Ring {"NAME":"ESP-01S-RGB-LED-v1.0","GPIO":[1,1,1376,1,0,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":18} +SP501E WS2812B Addressable {"NAME":"SP501E","GPIO":[0,32,0,1376,0,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":18} +``` ## Aromatherapy Diffuser ``` @@ -70,16 +78,19 @@ Hykker SL-0392 650lm {"NAME":"Hykker 7W","GPIO":[0,0,0,0,0,416,0,0,417,0 Iotton 9W 700lm {"NAME":"Iotton Light","GPIO":[0,0,0,0,416,417,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":18} iView 10W 1050lm {"NAME":"iView ISB1000-D","GPIO":[0,0,0,0,0,416,0,0,0,417,0,0,0,0],"FLAG":0,"BASE":18} Kogan 10W Cool & Warm White 1050lm {"NAME":"Kogan 10W CCT","GPIO":[0,0,0,0,0,416,0,0,0,417,0,0,0,0],"FLAG":0,"BASE":48} -Kogan 4.5W 330lm 110° {"NAME":"Kogan White/Wa","GPIO":[0,0,0,0,0,416,0,0,417,0,0,0,0,0],"FLAG":0,"BASE":18} +Kogan 4.5W 330lm 110 {"NAME":"Kogan White/Wa","GPIO":[0,0,0,0,0,416,0,0,417,0,0,0,0,0],"FLAG":0,"BASE":18} Kogan 5W {"NAME":"Kogan Co/Wa","GPIO":[0,0,0,0,0,416,0,0,0,417,0,0,0,0],"FLAG":0,"BASE":18} +Kruidvat A60 9W 806lm {"NAME":"Kruidvat E27 806 Lumens","GPIO":[0,0,0,0,416,449,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":48} Laser 10W 1000lm {"NAME":"Laser 10W CCT","GPIO":[0,0,0,0,0,416,0,0,0,417,0,0,0,0],"FLAG":0,"BASE":48} Laser 10W 1000lm {"NAME":"Laster 10W CCT","GPIO":[0,0,0,0,0,416,0,0,0,417,0,0,0,0],"FLAG":0,"BASE":18} LE LampUX 380lm Candle {"NAME":"LE Bulb","GPIO":[0,0,0,0,0,0,0,0,417,0,416,0,0,0],"FLAG":0,"BASE":18} LE LampUX 4.5W 410lm {"NAME":"LE LampUX","GPIO":[0,0,0,0,0,416,0,0,417,0,0,0,0,0],"FLAG":0,"BASE":48} ledscom.de 4.5W 430lm {"NAME":"GX53","GPIO":[0,0,0,0,0,0,0,0,417,0,416,0,0,0],"FLAG":0,"BASE":0} Lenovo 800lm {"NAME":"LenovoLB","GPIO":[0,0,0,0,0,416,0,0,0,417,0,0,0,0],"FLAG":0,"BASE":18} +Lenovo SE-141DC {"NAME":"LenovoSE-141DC","GPIO":[0,0,0,0,0,416,0,0,0,417,0,0,0,0],"FLAG":0,"BASE":48} Lohas ZN051 5W 420lm {"NAME":"Lohas ZN051","GPIO":[0,0,0,0,0,0,0,0,417,0,416,0,0,0],"FLAG":0,"BASE":18} Lohas ZN070 720lm {"NAME":"Lohas ZN070","GPIO":[0,0,0,0,0,0,0,0,417,0,416,0,0,0],"FLAG":0,"BASE":18} +LSC 10W 806lm {"NAME":"LSC E27 806lumens","GPIO":[0,0,0,0,416,449,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":48} LSC A55 14W 1400lm {"NAME":"LSC CT E27","GPIO":[0,0,0,0,416,449,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":48} Lumiman A19 7.5W 800lm {"NAME":"Lumiman LM520","GPIO":[0,0,0,0,0,416,0,0,417,0,0,0,0,0],"FLAG":0,"BASE":18} Luminea ZX-2831 {"NAME":"Luminea CCT","GPIO":[0,0,0,0,2912,416,0,0,417,2976,2944,0,0,0],"FLAG":0,"BASE":18} @@ -97,23 +108,29 @@ Nedis A60 800lm {"NAME":"WIFILW10WTE27","GPIO":[0,0,0,0,0,416,0,0,4 Nedis C10 350lm {"NAME":"WIFILW10WTE14","GPIO":[0,0,0,0,0,416,0,0,0,417,0,0,0,0],"FLAG":0,"BASE":18} Nedis G125 5.5W 350lm Twisted Filament {"NAME":"WIFILF10GDG125","GPIO":[0,0,0,0,0,0,0,0,417,0,416,0,0,0],"FLAG":0,"BASE":18} Nedis PAR16 330lm {"NAME":"Nedis WIFILW30","GPIO":[0,0,0,0,0,416,0,0,417,0,0,0,0,0],"FLAG":0,"BASE":18} -Nedis PAR16 4.5W 330lm 110° {"NAME":"WIFILW30","GPIO":[0,0,0,0,0,416,0,0,417,0,0,0,0,0],"FLAG":0,"BASE":18} +Nedis PAR16 4.5W 330lm 110 {"NAME":"WIFILW30","GPIO":[0,0,0,0,0,416,0,0,417,0,0,0,0,0],"FLAG":0,"BASE":18} Philips Zhirui Candle 250lm {"NAME":"Xiaomi Philips","GPIO":[0,0,0,0,0,0,0,0,417,0,0,416,0,0],"FLAG":0,"BASE":48} Phillips Zhirui 450lm {"NAME":"Xiaomi Philips","GPIO":[0,0,0,0,0,0,0,0,417,0,0,416,0,0],"FLAG":0,"BASE":48} Polux ST64 5.5W 470lm {"NAME":"basic","GPIO":[0,0,0,0,0,0,0,0,417,0,416,0,0,0],"FLAG":0,"BASE":18} Prokord 10W 1050lm {"NAME":"PSH-E2745-CCT","GPIO":[0,0,0,0,0,416,0,0,417,0,0,0,0,4704],"FLAG":0,"BASE":18} Prokord 5W 1050lm {"NAME":"Prokord-PSH-GU1045-CCT","GPIO":[0,0,0,0,0,0,0,0,417,0,416,0,0,0],"FLAG":0,"BASE":18} -Shelly DUO 800lm {"NAME":"Shelly DUO","GPIO":[0,0,0,0,417,416,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":18} +Shelly DUO 800lm {"NAME":"Shelly Duo","GPIO":[0,0,0,0,0,419,0,0,417,416,418,0,0,0],"FLAG":0,"BASE":18} SmartDGM L-WT9W1 9W 800lm {"NAME":"L-WT9W1","GPIO":[0,0,0,0,0,416,0,0,160,417,0,0,0,0],"FLAG":0,"BASE":18} Solimo 12W 1080lm {"NAME":"Solimo WCCT 12","GPIO":[0,0,0,0,160,416,0,0,161,417,162,0,0,0],"FLAG":0,"BASE":18} Spectrum Smart 5W 410lm Candle {"NAME":"lightbulb","GPIO":[0,0,0,0,0,0,0,0,417,0,416,0,0,0],"FLAG":0,"BASE":18} Status 9W 806lm {"NAME":"Status Smart","GPIO":[0,0,0,0,0,0,0,0,417,0,416,0,0,0],"FLAG":0,"BASE":18} -Swisstone SH 330 806lm {"NAME":"SwisstoneSH330","GPIO":[0,0,0,0,2912,416,0,0,417,2976,2944,0,0,0],"FLAG":0,"BASE":18} +Swisstone 806lm {"NAME":"SwisstoneSH330","GPIO":[0,0,0,0,2912,416,0,0,417,2976,2944,0,0,0],"FLAG":0,"BASE":18} Treatlife A19 9W 800lm {"NAME":"Treatlife SL20","GPIO":[0,0,0,0,0,416,0,0,0,417,0,0,0,0],"FLAG":0,"BASE":18} -V-Tac PAR16 4.5W 300lm 110° {"NAME":"V-TAC VT-5174","GPIO":[0,0,0,0,0,0,0,0,417,0,416,0,0,0],"FLAG":0,"BASE":18} +V-Tac PAR16 4.5W 300lm 110 {"NAME":"V-TAC VT-5174","GPIO":[0,0,0,0,0,0,0,0,417,0,416,0,0,0],"FLAG":0,"BASE":18} Vestaiot BR30 800lm {"NAME":"Vesta BR30 CCT","GPIO":[0,0,0,0,0,416,0,0,0,417,0,0,0,0],"FLAG":0,"BASE":18} Wipro Garnet NS9100 810lm {"NAME":"WiproSmartBulb","GPIO":[0,0,0,0,417,0,0,0,416,0,0,0,0,0],"FLAG":0,"BASE":18} -Wyze WLPA19 A19 800lm {"NAME":"Wyze Bulb","GPIO":[0,0,0,0,0,0,0,0,0,416,417,0,0,0],"FLAG":0,"BASE":48} +Wyze A19 800lm {"NAME":"Wyze Bulb","GPIO":[5728,0,0,0,0,0,0,0,0,416,417,0,0,0],"FLAG":0,"BASE":48} +``` + +## Camera +``` +Ai-Thinker DIY Kit "Not available" +Wireles Tag DIY Kit "Not available" ``` ## Ceiling Light @@ -127,15 +144,18 @@ Calex 429250 {"NAME":"Calex_LED","GPIO":[0,0,0,0,0,0,0,0,0,449,4 Fcmila 48W RGBCCT {"NAME":"XDD-48W","GPIO":[0,0,0,0,416,419,0,0,417,420,418,0,0,0],"FLAG":0,"BASE":18} LE lampUX 15W RGBCCT {"NAME":"LE lampUX 15W","GPIO":[0,0,0,0,416,419,0,0,417,420,418,0,0,0],"FLAG":0,"BASE":18} Lohas ZN026CL10 RGBCCT {"NAME":"Lohas LED Lamp","GPIO":[0,0,0,0,417,416,0,0,419,418,420,0,0,0],"FLAG":0,"BASE":18} +LOLAsmart Uranus White 70 cm {"NAME":"lola smart","GPIO":[0,0,0,1088,416,419,0,0,417,420,418,0,0,0],"FLAG":0,"BASE":18} LSC 20W 1400lm White Ambiance {"NAME":"LSC RGBCW LED","GPIO":[0,0,0,0,0,0,0,0,4064,0,4032,0,0,0],"FLAG":0,"BASE":18} Luminea 24W CCT {"NAME":"Luminea NX6205-944","GPIO":[0,0,0,0,0,0,0,0,449,0,416,0,0,0],"FLAG":0,"BASE":48} LVL 300mm Round {"NAME":"LVL 300m Round 24W Ceiling LED","GPIO":[0,0,0,0,0,416,0,0,0,449,0,0,0,0],"FLAG":0,"BASE":48} SMRTLite LED Panel {"NAME":"SMRTLite","GPIO":[0,0,0,0,417,416,0,0,420,418,419,0,0,0],"FLAG":0,"BASE":18} +Taloya 12" 24W CCT Main and RGB Ambient {"NAME":"Taloya GA300-24W-AI-WEMG","GPIO":[0,0,0,0,416,419,0,0,417,420,418,0,0,0],"FLAG":0,"BASE":18} Utorch 24W 2000lm CCT {"NAME":"Utorch PZE-911","GPIO":[0,0,0,0,0,0,0,0,417,0,416,0,0,0],"FLAG":0,"BASE":1} Utorch 24W 2000lm CCT {"NAME":"Utorch UT40","GPIO":[0,0,0,0,0,0,0,0,417,0,416,0,0,0],"FLAG":0,"BASE":1} Verve Design Angie 18W RGB Ring {"NAME":"ACL12HA Light","GPIO":[0,0,0,0,417,416,0,0,420,418,419,0,0,0],"FLAG":0,"BASE":18} Verve Design Charlie 22W CCT {"NAME":"Verve ACL01HA","GPIO":[0,0,0,0,0,416,0,0,0,449,0,0,0,0],"FLAG":0,"BASE":48} Verve Design Hana 24W CCT {"NAME":"Verve ACL03HA","GPIO":[0,0,0,0,0,0,0,0,417,0,416,0,0,0],"FLAG":0,"BASE":48} +Yeelight Meteorite "Not available" ``` ## Contact Sensor @@ -147,21 +167,27 @@ TY01 Door Window {"NAME":"TY01","GPIO":[0,2272,0,2304,0,0,0,0,0,0,0, Zemismart Door Window {"NAME":"Zemismart","GPIO":[1,2272,1,2304,1,1,0,0,1,1,1,1,1,0],"FLAG":0,"BASE":54} ``` +## Curtain Module +``` +LoraTap SC500W Roller Shutter {"NAME":"SC500W","GPIO":[0,0,0,576,160,161,0,0,224,32,225,0,0,0],"FLAG":0,"BASE":18} +LoraTap SC511WSC Roller Shutter {"NAME":"SC511WSC","GPIO":[0,1,0,320,32,34,0,0,224,33,226,225,0,0],"FLAG":0,"BASE":18} +MS-108 {"NAME":"MS-108","GPIO":[0,0,0,0,161,160,0,0,224,0,225,0,0,0],"FLAG":0,"BASE":18} +``` + ## Curtain Switch ``` Anccy {"NAME":"Anccy Shutter","GPIO":[544,0,289,34,226,33,0,0,32,224,290,225,288,0],"FLAG":0,"BASE":18} Anccy Relax {"NAME":"Tuya Shutter","GPIO":[544,0,290,161,225,34,0,0,32,224,289,226,288,0],"FLAG":0,"BASE":18} Avatto SYS-CS01 {"NAME":"Avatto","GPIO":[320,576,0,33,225,0,0,0,0,224,321,0,32,0],"FLAG":0,"BASE":18} +Currydouble {"NAME":"Currydouble","GPIO":[260,258,576,0,0,224,0,0,0,1,5760,225,259,0],"FLAG":0,"BASE":18} Etersky WF-CS01 {"NAME":"Etersky","GPIO":[544,0,289,34,226,33,0,0,32,224,290,225,288,0],"FLAG":0,"BASE":18} Homecube {"NAME":"Jinvoo Curtain","GPIO":[288,0,0,33,225,34,0,0,32,224,0,226,0,4704],"FLAG":0,"BASE":18} Jinvoo SM-SW101-C {"NAME":"Jinvoo Curtain","GPIO":[288,0,0,33,225,34,0,0,32,224,0,226,0,4704],"FLAG":0,"BASE":18} Konesky {"NAME":"KingArt","GPIO":[544,0,289,162,226,32,0,0,33,225,290,224,288,0],"FLAG":0,"BASE":18} LoraTap SC400W-EU {"NAME":"Loratap SC400W","GPIO":[0,0,0,34,0,32,0,0,33,225,0,224,0,0],"FLAG":0,"BASE":18} LoraTap SC411WSC-EU RF Remote {"NAME":"Loratap","GPIO":[0,0,0,34,226,32,0,0,33,225,0,224,0,0],"FLAG":0,"BASE":18} -LoraTap SC500W Roller Shutter {"NAME":"SC500W","GPIO":[0,0,0,576,160,161,0,0,224,32,225,0,0,0],"FLAG":0,"BASE":18} -LoraTap SC511WSC Roller Shutter {"NAME":"SC511WSC","GPIO":[0,1,0,320,32,34,0,0,224,33,226,225,0,0],"FLAG":0,"BASE":18} Maxcio WF-CS01 {"NAME":"Maxcio","GPIO":[544,0,289,162,226,33,0,0,32,224,290,225,288,0],"FLAG":0,"BASE":18} -SCS86-03AJAI {"NAME":"ESE86-03AJAI","GPIO":[544,0,322,33,225,34,0,0,32,224,321,226,320,0],"FLAG":0,"BASE":18} +QS-WIFI-C01-RF {"NAME":"Shutter-QS-WIFI-C01","GPIO":[0,0,1,0,288,0,0,0,32,33,224,225,0,0],"FLAG":0,"BASE":18} Teekar SYS-CS 01 {"NAME":"Teekar-Tag","GPIO":[320,0,544,33,225,162,0,0,0,224,321,258,32,0],"FLAG":0,"BASE":18} Teepao {"NAME":"Teepao","GPIO":[576,322,226,33,225,34,0,0,320,224,321,0,32,0],"FLAG":0,"BASE":18} WF-CS01 {"NAME":"Tuya Shutter","GPIO":[544,0,290,161,225,34,0,0,32,224,289,226,288,0],"FLAG":0,"BASE":18} @@ -177,23 +203,35 @@ ESP-M3 Module {"NAME":"ESP-M3","GPIO":[1,1,1,1,1,0,0,0,0,1,1,0,1, Heltec WiFi Kit 8 {"NAME":"HTIT-W8266","GPIO":[1,1,1,1,640,608,0,0,1,1,1,1,1024,1],"FLAG":0,"BASE":18} LC Tech relay and PZEM-004T {"NAME":"HW-655 PZEM","GPIO":[0,1504,0,1472,0,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":18} LC Technology PSF-B04 Ewelink 4 Channel Switch Module {"NAME":"LC-EWL-B04-MB","GPIO":[1,1,1,1,1,1,0,0,1,288,1,1,0,0],"FLAG":0,"BASE":18} +LilyGO TTGO T-Internet-POE "Not available" LilyGO TTGO TO ESP8266 OLED SH1106 Weather Station {"NAME":"TTGO T12","GPIO":[1,1,1,1,608,640,0,0,32,34,33,1,1,1],"FLAG":0,"BASE":18} -OLED Display Module 0.66" for Wemos D1 Mini {"NAME":"OLED 64x48","GPIO":[1,1,1,1,640,608,0,0,1,1,1,1,1024,1],"FLAG":0,"BASE":18} +Olimex ESP32-POE "Not available" QuinLED 2 Channel {"NAME":"QuinLED 2 channel","GPIO":[416,0,417,0,0,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":18} -Shelly UNI {"NAME":"Shelly Uni","GPIO":[320,0,0,0,225,0,0,0,192,193,0,224,0,4864],"FLAG":0,"BASE":18} +Shelly UNI {"NAME":"Shelly Uni","GPIO":[320,0,0,0,225,1216,0,0,192,193,0,224,0,4864],"FLAG":0,"BASE":18} +Silicognition wESP32 "Not available" +TZT ESP8266 Weather Station Kit {"NAME":"TZT Weather Station","GPIO":[32,0,640,0,1,1184,0,0,1,1,608,1,1,1],"FLAG":0,"BASE":18} WifInfo - Teleinfo Server {"NAME":"WifInfo","GPIO":[1376,1,1,5152,640,608,1,1,1,1,1,1,1,1],"FLAG":0,"BASE":18} +Wireless Tag ESP32 Ethernet Board "Not available" Witty Cloud {"NAME":"Witty Cloud","GPIO":[1,1,320,1,32,1,0,0,417,418,1,416,1,4704],"FLAG":0,"BASE":32} Yison ESP-01/ESP-202 Development Board {"NAME":"Yison Dev Board","GPIO":[259,544,258,1,260,261,1,1,416,418,257,417,256,1],"FLAG":0,"BASE":18} ``` +## Dehumidifier +``` +electriQ 12L Portable {"NAME":"electriQ CD12PW","GPIO":[0,2272,0,2304,0,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":54} +``` + ## Dimmable ``` Aisirer 9W 806lm {"NAME":"Aisirer 9W","GPIO":[0,0,0,0,0,416,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":18} Aisirer 9W 806lm {"NAME":"AISIRER E26","GPIO":[0,0,0,0,0,416,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":18} Aisirer 9W 806lm {"NAME":"Aisirer 9W","GPIO":[0,0,0,0,0,416,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":18} +Arlec 4W 380lm Warm White Fancy Round Globe {"NAME":"Arlec E14 Smart Bulb","GPIO":[0,0,0,0,0,0,0,0,0,0,416,0,0,0],"FLAG":0,"BASE":18} Arlec Smart 4W 380lm Candle {"NAME":"Arlec Bulb 4W","GPIO":[0,0,0,0,0,0,0,0,0,0,416,0,0,0],"FLAG":0,"BASE":18} Arlec Smart 9W 950lm 4000K {"NAME":"Arlec-GLD124HA","GPIO":[0,0,0,0,0,416,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":18} -Avatar ALS15L Candle {"NAME":"AVATAR","GPIO":[0,0,0,0,0,0,0,0,0,3008,0,3040,0,0],"FLAG":0,"BASE":27} +Avatar 5W Candle {"NAME":"AVATAR","GPIO":[0,0,0,0,0,0,0,0,0,3008,0,3040,0,0],"FLAG":0,"BASE":27} +AZzardo ES111 Black 3000K 15W {"NAME":"Azzardo WiFi ES111 DIMM","GPIO":[0,0,0,0,0,0,0,0,0,0,416,0,0,0],"FLAG":0,"BASE":18} +BrilliantSmart 8.5W 900lm 3000k {"NAME":"Brilliant20889","GPIO":[0,0,0,0,0,0,0,0,416,0,0,0,0,0],"FLAG":0,"BASE":18} Cleverio 51396 800lm {"NAME":"Cleverio E27","GPIO":[0,0,0,0,0,0,0,0,0,0,448,0,0,0],"FLAG":0,"BASE":18} Digma DiLight E27 W1 {"NAME":"DiLight E27 W1","GPIO":[0,0,0,0,416,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":18} DORESshop B11 600lm Filament {"NAME":"Doresshop-cand","GPIO":[0,0,0,0,0,0,0,0,0,0,416,0,0,0],"FLAG":0,"BASE":18} @@ -215,6 +253,7 @@ Krisbow Bohlam 14W {"NAME":"Krisbow SmartL","GPIO":[0,0,0,0,0,416,0,0, LeDesign 8W ST21 Filament {"NAME":"Edison Bulb","GPIO":[0,0,0,0,0,0,0,0,0,416,0,0,0,0],"FLAG":0,"BASE":18} Lohas LZN127 G25 800lm {"NAME":"Lohas Globe","GPIO":[0,0,0,0,0,0,0,0,0,0,416,0,0,0],"FLAG":0,"BASE":18} Lohas ZN014 550lm {"NAME":"Lohas MR16","GPIO":[0,0,0,0,419,0,0,0,417,418,416,0,0,0],"FLAG":0,"BASE":18} +Lohas ZN121 8W 720lm 2700k {"NAME":"Lohas LED A60","GPIO":[0,0,0,0,0,0,0,0,0,0,416,0,0,0],"FLAG":0,"BASE":18} Lohas ZN124 980lm {"NAME":"Lohas LH-ZN124","GPIO":[0,0,0,0,0,0,0,0,0,0,416,0,0,0],"FLAG":0,"BASE":18} LSC Filament A60 {"NAME":"LSC Filam E27","GPIO":[0,0,0,0,0,0,0,0,417,0,416,0,0,0],"FLAG":0,"BASE":18} LSC Filament C35 {"NAME":"LSC Filam E14","GPIO":[0,1,0,1,0,0,0,0,417,0,416,0,0,1],"FLAG":0,"BASE":18} @@ -225,6 +264,7 @@ Lumary 6W 700lm Edison {"NAME":"Lumary TS3Y","GPIO":[0,0,0,0,0,0,0,0,0,416 Luminea ZX-2880 A60 800lm {"NAME":"LAV-110.w","GPIO":[0,0,0,0,416,419,0,0,417,420,418,0,0,0],"FLAG":0,"BASE":18} Luminea ZX-2982 ST64 Filament {"NAME":"Luminea ZX2982","GPIO":[0,0,0,0,0,0,0,0,0,0,416,0,0,0],"FLAG":0,"BASE":18} MagicHome 7.5W Warm White {"NAME":"ZJ-8C2B-CCT-AV1.1","GPIO":[0,0,0,0,0,0,0,0,416,0,0,0,0,0],"FLAG":0,"BASE":18} +Malmbergs A60 8,5W 810lm {"NAME":"Malmbergs8,5W-W","GPIO":[0,0,0,0,0,416,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":18} Merkury 9W 800lm {"NAME":"MI-BW320-999W","GPIO":[0,0,0,0,0,0,0,0,0,0,224,0,0,0],"FLAG":0,"BASE":18} Merkury BR30 750lm {"NAME":"MI-BW905-999W","GPIO":[0,0,0,0,0,416,0,0,417,0,0,0,0,0],"FLAG":0,"BASE":18} Merkury MI-BW902-999W 800lm {"NAME":"MI-BW902-999W","GPIO":[0,0,0,0,0,416,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":18} @@ -245,8 +285,13 @@ Nedis PAR16 330lm {"NAME":"Nedis WIFILW31","GPIO":[0,0,0,0,0,416,0,0, Nedis ST64 5W 500lm Filament {"NAME":"WIFILF10GDST64","GPIO":[0,0,0,0,0,0,0,0,0,0,416,0,0,0],"FLAG":0,"BASE":18} NiteBird 8W 800lm 2700k {"NAME":"Nitebird-smart28k","GPIO":[0,0,0,0,416,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":18} Sealight Vintage Edison A19 {"NAME":"SealightEdison","GPIO":[0,0,0,0,0,416,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":18} +Shelly Vintage 4W 260lm 2700k {"NAME":"Shelly Vintage","GPIO":[0,0,0,0,416,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":18} +Shelly Vintage 7W 750lm 2700k {"NAME":"Shelly Vintage","GPIO":[0,0,0,0,416,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":18} +Shelly Vintage 7W 750lm 2700k {"NAME":"Shelly Vintage","GPIO":[0,0,0,0,416,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":18} SmartDGM 9W 806lm {"NAME":"L-WB9W1","GPIO":[0,0,0,0,0,416,0,0,160,0,0,0,0,0],"FLAG":0,"BASE":18} Smitch 10W 6500K {"NAME":"Smitch Ambience SB-0110","GPIO":[0,0,0,0,0,416,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":18} +Smitch 10W 6500K {"NAME":"Smitch Ambience SB-0110","GPIO":[0,0,0,0,0,416,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":18} +TCP Smart 806lm Warm White {"NAME":"TCP Smart Clas","GPIO":[0,0,0,0,0,0,0,0,0,416,0,0,0,0],"FLAG":0,"BASE":1} TCP Smart 810lm Filament {"NAME":"TCP Filament","GPIO":[0,0,0,0,0,0,0,0,0,0,448,0,0,0],"FLAG":0,"BASE":18} TCP Smart 810lm Filament {"NAME":"TCP Filament","GPIO":[0,0,0,0,0,0,0,0,0,0,448,0,0,0],"FLAG":0,"BASE":18} Xiaomi Philips MUE4088RT {"NAME":"Xiaomi Philips","GPIO":[0,0,0,0,0,0,0,0,0,0,0,416,0,0],"FLAG":0,"BASE":18} @@ -256,8 +301,8 @@ Xiaomi Philips MUE4088RT {"NAME":"Xiaomi Philips","GPIO":[0,0,0,0,0,0,0,0,0, ``` 3A Smart Home HGZB-04D {"NAME":"HGZB-4D","GPIO":[1,1,1,1,1,1,0,0,1,1,290,1,1,0],"FLAG":0,"BASE":54} Acenx SD03 {"NAME":"SD03","GPIO":[34,33,0,323,576,322,0,0,321,416,320,96,256,0],"FLAG":0,"BASE":73} -Armtronix AC Dimmer One Triac Board {"NAME":"ARMTR Dimmer","GPIO":[0,3200,0,3232,0,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":56} -Armtronix AC Dimmer Two Triac Board {"NAME":"ARMTR Dimmer","GPIO":[0,3200,0,3232,0,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":56} +Armtronix AC Dimmer 1-Triac {"NAME":"ARMTR Dimmer","GPIO":[0,3200,0,3232,0,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":56} +Armtronix AC Dimmer 2-Triac {"NAME":"ARMTR Dimmer","GPIO":[0,3200,0,3232,0,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":56} BrilliantSmart D350W {"NAME":"Generic","GPIO":[1,2272,1,2304,1,1,0,0,1,0,1,0,1,0],"FLAG":0,"BASE":54} BrilliantSmart Jupiter {"NAME":"BrSm Jupiter","GPIO":[0,2272,0,2304,0,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":54} CE Smart Home {"NAME":"CE-WF500D","GPIO":[0,0,0,0,0,0,0,0,0,2304,0,2272,0,0],"FLAG":0,"BASE":54} @@ -269,7 +314,7 @@ EX-Store 2 Kanal RS232 V4 {"NAME":"EXS Dimmer","GPIO":[0,3200,0,3232,0,0,0,0, Feit Electric Smart {"NAME":"Generic","GPIO":[1,2272,1,2304,1,1,0,0,1,0,1,0,1,0],"FLAG":0,"BASE":54} Gosund SW2 {"NAME":"Gosund Dimmer","GPIO":[1,3200,1,3232,32,0,1,1,320,576,416,1,1,0],"FLAG":0,"BASE":18} iSwitch Touch Switch {"NAME":"iSwitchOZ Dimmer","GPIO":[0,0,0,0,0,0,0,0,0,0,290,0,0,0],"FLAG":0,"BASE":54} -Martin Jerry SD01 {"NAME":"MJ-SD02","GPIO":[34,33,0,323,576,322,0,0,321,416,320,96,256,0],"FLAG":0,"BASE":73} +Martin Jerry SD01 {"NAME":"MJ-SD01 Dimmer","GPIO":[34,33,0,323,576,322,0,0,321,416,320,96,256],"FLAG":0,"BASE":73} Martin Jerry Single Pole {"NAME":"MJ-KN01 Dimmer","GPIO":[0,2272,0,2304,0,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":54} Maxcio Rotary {"NAME":"EDM-1WAA-EU","GPIO":[1,1,1,1,1,1,0,0,1,1,1,1,1,0],"FLAG":0,"BASE":54} Minoston 3-Way {"NAME":"MS10W","GPIO":[1,2272,1,2304,1,1,0,0,1,1,1,1,1,0],"FLAG":0,"BASE":54} @@ -292,6 +337,14 @@ WiFi Dimmer Switch {"NAME":"PS-16-DZ","GPIO":[0,3200,0,3232,0,0,0,0,0, Zemismart KS-7011 {"NAME":"KS-7011 Dimmer","GPIO":[1,2272,1,2304,1,1,0,0,1,1,1,1,1,0],"FLAG":0,"BASE":54} ``` +## Display +``` +LilyGO TTGO T-Watcher "Not available" +M5Stack Core2 "Not available" +ODROID-GO Game Kit "Not available" +OLED Display Module 0.66" for Wemos D1 Mini {"NAME":"OLED 64x48","GPIO":[1,1,1,1,640,608,0,0,1,1,1,1,1024,1],"FLAG":0,"BASE":18} +``` + ## Downlight ``` 3A 12W RGBW {"NAME":"RGBWSpot","GPIO":[0,0,0,0,416,419,0,0,417,452,418,0,0,0],"FLAG":0,"BASE":18} @@ -300,15 +353,18 @@ BrilliantSmart Prism 10W RGBCCT {"NAME":"Prism","GPIO":[0,0,0,0,416,419,0,0,417 BrilliantSmart Trilogy 9W CCT {"NAME":"SmartCCTDwnLgt","GPIO":[0,0,0,0,0,416,0,0,0,417,0,0,0,0],"FLAG":0,"BASE":48} Connect SmartHome RGB {"NAME":"CSH-240RGB10W","GPIO":[0,0,0,0,416,419,0,0,417,420,418,0,0,0],"FLAG":0,"BASE":18} Deta 10W RGBCCT {"NAME":"Deta DownLight","GPIO":[0,0,0,0,417,416,0,0,420,418,419,0,0,0],"FLAG":0,"BASE":18} +Deta 7W 660lm LED {"NAME":"Deta DownLight","GPIO":[0,0,0,0,417,416,0,0,420,418,419,0,0,0],"FLAG":0,"BASE":18} Feit Electric 6in. RGBW Recessed {"NAME":"Feit LEDR6/RGB","GPIO":[0,0,0,0,416,419,0,0,417,452,418,0,0,0],"FLAG":0,"BASE":48} Globe 5W 4" Recessed RGBCCT {"NAME":"GlobeRGBWW","GPIO":[0,0,0,0,416,419,0,0,417,420,418,0,0,0],"FLAG":0,"BASE":18} Hyperikon 14W 1000lm 6" {"NAME":"HyperikonDL6","GPIO":[0,0,0,0,417,416,0,0,420,418,419,0,0,0],"FLAG":0,"BASE":18} iHomma 6W RGBCCT {"NAME":"iHomma RGBWW","GPIO":[0,0,0,0,420,419,0,0,416,417,418,0,0,0],"FLAG":0,"BASE":18} iHomma RGB BT+IR 12W {"NAME":"iHommaLEDDownl","GPIO":[0,0,0,0,0,419,0,0,416,417,418,0,0,0],"FLAG":0,"BASE":18} Kogan 9W RGBCCT {"NAME":"Kogan_SMARTLED","GPIO":[0,0,0,0,417,416,0,0,420,418,419,0,0,0],"FLAG":0,"BASE":18} +LEDLite CCT 10W Fire Rated {"NAME":"LEDLite-LTTD10Wifi","GPIO":[0,0,0,0,0,0,0,0,417,0,416,0,0,0],"FLAG":0,"BASE":18} Mirabella Genio 9W CCT {"NAME":"GenioDLightCCT","GPIO":[0,0,0,0,0,0,0,0,449,0,416,0,0,0],"FLAG":0,"BASE":48} Mirabella Genio 9W RGBCCT {"NAME":"GenioDLightRGB","GPIO":[0,0,0,0,417,416,0,0,420,418,419,0,0,0],"FLAG":0,"BASE":18} Moes 7W RGBCCT {"NAME":"Moes Downlight","GPIO":[0,0,0,0,419,420,0,0,416,417,418,0,0,0],"FLAG":0,"BASE":18} +Philips 200lm 3000 - 5700k CCT {"NAME":"xiaomi.philips.downlight","GPIO":[0,0,0,0,0,0,0,0,416,0,0,417,0,0],"FLAG":0,"BASE":18} Philips 5/6 in. RGBCCT {"NAME":"Philips","GPIO":[0,0,0,0,419,0,0,0,416,420,418,417,0,0],"FLAG":0,"BASE":48} Zemismart 4" 10W RGBCCT {"NAME":"ZemiDownLight4","GPIO":[0,0,0,0,416,419,0,0,417,420,418,0,0,0],"FLAG":0,"BASE":18} Zemismart 4" 10W RGBW {"NAME":"ZemiDownLight","GPIO":[0,0,0,0,0,0,0,0,0,3008,0,3040,0,0],"FLAG":0,"BASE":27} @@ -329,13 +385,19 @@ BrilliantSmart 99111 {"NAME":"Brilliant Fan","GPIO":[0,2272,0,2304,0,0,0 Geek Aire AF1s {"NAME":"Geek Aire Fan","GPIO":[0,2272,0,2304,0,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":54} Goldair SleepSmart GCPF315 {"NAME":"Goldair Fan","GPIO":[0,0,0,0,0,0,0,0,0,2304,0,2272,0,0],"FLAG":0,"BASE":54} Lucci Connect Remote Control {"NAME":"Lucci Fan","GPIO":[0,0,0,0,0,0,0,0,0,2304,0,2272,0,0],"FLAG":0,"BASE":54} -Sichler Haushaltsgeräte Column {"NAME":"Sichler Fan","GPIO":[0,2272,0,2304,0,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":54} +Sichler Haushaltsgeraete Column {"NAME":"Sichler Fan","GPIO":[0,2272,0,2304,0,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":54} Sonoff IFan02 {"NAME":"Sonoff iFan02","GPIO":[32,1,0,1,226,225,33,34,224,320,35,227,0,0],"FLAG":0,"BASE":44} Sonoff IFan03 {"NAME":"SonoffiFan03","GPIO":[32,3200,0,3232,0,0,256,512,226,320,225,227,0,0],"FLAG":0,"BASE":71} Technical Pro FXA16 {"NAME":"FXA16 Fan","GPIO":[0,2272,0,2304,0,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":54} Zemismart Bladeless {"NAME":"Bladeless Fan","GPIO":[1,2272,1,2304,1,1,0,0,1,1,1,1,1,0],"FLAG":0,"BASE":54} ``` +## Garage Door Opener +``` +MS-102 {"NAME":"Garage Opener","GPIO":[0,2272,0,2304,0,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":54} +Wofea {"NAME":"Wofea Garage Door","GPIO":[1,1,1,1,1,1,1,1,1,1,1,1,1,1],"FLAG":0,"BASE":54} +``` + ## Gas Sensor ``` Natural Gas (CH4) Alarm {"NAME":"PA-210WYS","GPIO":[1,2272,1,2304,1,1,0,0,1,1,1,1,1,0],"FLAG":0,"BASE":54} @@ -343,6 +405,7 @@ Natural Gas (CH4) Alarm {"NAME":"PA-210WYS","GPIO":[1,2272,1,2304,1,1,0,0,1 ## Heater ``` +Devola Designer Glass Panel {"NAME":"Devola Heater","GPIO":[0,0,0,0,224,1,0,0,0,1824,0,1792,0,0],"FLAG":0,"BASE":18} Klarstein Bornholm Smart 2000W {"NAME":"Klarstein Bornholm","GPIO":[0,2272,0,2304,0,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":54} Kogan 1500W Panel {"NAME":"Kogan Panel Heater","GPIO":[0,0,0,0,0,0,0,0,0,2304,0,2272,0,0],"FLAG":0,"BASE":54} ``` @@ -351,7 +414,8 @@ Kogan 1500W Panel {"NAME":"Kogan Panel Heater","GPIO":[0,0,0,0,0,0,0, ``` A1 Universal Remote Control {"NAME":"A1 IR Bridge","GPIO":[1,1,1,1,320,1088,0,0,0,32,1056,0,0,0],"FLAG":0,"BASE":62} Alfawise KS1 {"NAME":"KS1","GPIO":[1,1792,32,1824,32,1088,0,0,320,0,1056,0,0,4704],"FLAG":0,"BASE":62} -auvisio S06 {"NAME":"NX-4519-675","GPIO":[1,1,1,1,288,1088,0,0,1,1,1056,1,1,4704],"FLAG":0,"BASE":18} +Antsig Universal Remote Controller {"NAME":"Antsig Smart Wi-Fi IR","GPIO":[1,1,1,1,320,1088,0,0,0,32,1056,0,0,0],"FLAG":0,"BASE":62} +auvisio S06 {"NAME":"NX-4519-675","GPIO":[0,0,0,0,288,1088,0,0,0,0,1056,0,0,0],"FLAG":0,"BASE":18} BlitzWolf BW-RC1 Smart IR Controller {"NAME":"BW-RC1","GPIO":[0,0,0,0,320,1088,0,0,0,32,1056,0,0,0],"FLAG":0,"BASE":62} Connect SmartHome Universal Smart IR Remote {"NAME":"CSH IR Bridge","GPIO":[1,1,1,1,320,1088,0,0,0,32,1056,0,0,0],"FLAG":0,"BASE":62} Cusam CS-IRC-1 {"NAME":"YTF IR Bridge","GPIO":[1,1,1,1,288,1088,0,0,0,32,1056,0,0,0],"FLAG":0,"BASE":62} @@ -360,11 +424,11 @@ Frankever Smart Remote {"NAME":"FK-UFO-R4","GPIO":[1,1,1,1,288,1088,0,0,0, Geeklink GK01 {"NAME":"GL IR Blaster","GPIO":[1,1,1,1,320,1088,0,0,0,32,1056,0,0,0],"FLAG":0,"BASE":62} Jinvoo AC/TV Box Controller {"NAME":"Jinvoo IR Bridge","GPIO":[1,1,1,1,320,1088,0,0,0,32,1056,0,0,0],"FLAG":0,"BASE":62} JS-IR1 Universal Remote {"NAME":"JS-IR1","GPIO":[1,1,1,1,288,1088,0,0,0,32,1056,0,0,0],"FLAG":0,"BASE":18} -Lenovo Smart IR Controller {"NAME":"Lenovo IR","GPIO":[1,1,1,1,320,1088,0,0,0,32,1056,0,0,0],"FLAG":0,"BASE":62} +Lenovo SE-741C IR Controller {"NAME":"Lenovo IR","GPIO":[1,1,1,1,320,1088,0,0,0,32,1056,0,0,0],"FLAG":0,"BASE":62} Mirabella Genio I002577 {"NAME":"Genio IR TxRx","GPIO":[1,1,1,1,320,1088,0,0,0,32,1056,0,0,0],"FLAG":0,"BASE":62} Nedis Universal Remote Control {"NAME":"Nedis IR Bridge","GPIO":[1,1,1,1,320,1088,0,0,0,32,1056,0,0,0],"FLAG":0,"BASE":62} NEO Coolcam Remote Controller {"NAME":"Neo Coolcam IR","GPIO":[1,3200,1,3232,576,1088,0,0,320,32,1056,0,0,0],"FLAG":0,"BASE":62} -Orvibo Magic Cube {"NAME":"Orvibo","GPIO":[0,0,0,0,32,1376,0,0,288,0,1088,289,0,0],"FLAG":0,"BASE":18} +Orvibo Magic Cube {"NAME":"Orvibo CT10W","GPIO":[0,0,0,0,32,1088,0,0,288,0,1056,289,0,0],"FLAG":0,"BASE":18} RM mini {"NAME":"RM mini","GPIO":[1,1,1,1,320,1088,0,0,0,32,1056,0,0,0],"FLAG":0,"BASE":62} STITCH by Monoprice {"NAME":"Stitch 35753","GPIO":[0,0,0,0,288,1088,0,0,0,64,1056,0,0,0],"FLAG":0,"BASE":18} SZMDLX IR Remote Controller {"NAME":"SZMDLX WiFi IR","GPIO":[0,0,0,0,320,1088,0,0,0,32,1056,0,0,0],"FLAG":0,"BASE":62} @@ -372,6 +436,11 @@ TY-IR-01 {"NAME":"TY-IR-01 IR Bridge","GPIO":[1,1,1,1,288,10 YTF Universal Remote {"NAME":"YTF IR Bridge","GPIO":[1,1,1,1,320,1088,0,0,0,32,1056,0,0,0],"FLAG":0,"BASE":62} ``` +## Illuminance Sensor +``` +Lightsensor {"NAME":"Lightsensor","GPIO":[0,2272,0,2304,0,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":54} +``` + ## Kettle ``` Anko 1.7L Cordless Water {"NAME":"Anko Kettle","GPIO":[1,1,1,1,1,1,0,0,1,2304,1,2272,1,0],"FLAG":0,"BASE":54} @@ -388,13 +457,14 @@ Arilux AL-LC06 {"NAME":"Arilux LC06","GPIO":[32,0,0,0,0,0,0,0,417, Arilux AL-LC11 {"NAME":"Arilux LC11","GPIO":[32,0,323,0,417,416,0,0,420,419,418,3136,0,0],"FLAG":0,"BASE":38} Arilux SL-LC 03 {"NAME":"Arilux LC03","GPIO":[0,0,0,0,1088,417,0,0,416,418,0,419,0,0],"FLAG":0,"BASE":34} Arilux SL-LC 09 {"NAME":"Arilux LC09","GPIO":[0,0,0,0,1152,416,0,0,418,0,417,0,0,0],"FLAG":0,"BASE":18} +Athom RGB {"NAME":"LS5050C-TAS","GPIO":[32,0,0,0,417,0,0,0,416,0,418,0,0,0],"FLAG":0,"BASE":18} Bakeey RGB {"NAME":"Bakeey Strip Controller","GPIO":[32,0,0,0,416,420,0,0,418,0,417,419,0,0],"FLAG":0,"BASE":18} CIN-03 96W RGB {"NAME":"CIN03-03 Strip","GPIO":[0,0,0,0,417,0,0,0,416,0,418,0,0,0],"FLAG":0,"BASE":18} DD001-MINI(G)-IR-V03 {"NAME":"WIFI-RGB","GPIO":[32,0,0,0,0,0,0,0,417,418,416,0,0,0],"FLAG":0,"BASE":40} DD001-MINI(G)-IR-V08 {"NAME":"WIFI-RGB","GPIO":[0,0,0,0,416,0,0,0,417,0,418,0,0,0],"FLAG":0,"BASE":18} Electrodragon ESP LED Strip Board, Mosfet Drive {"NAME":"LEDBoard RGBW","GPIO":[0,0,0,0,0,0,0,0,418,417,419,416,288,0],"FLAG":0,"BASE":18} -ESP01 NeoPixel Ring {"NAME":"ESP-01S-RGB-LED-v1.0","GPIO":[1,1,1376,1,0,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":18} H801 {"NAME":"H801","GPIO":[0,288,0,0,420,321,0,0,418,417,419,416,0,0],"FLAG":0,"BASE":20} +Holman Garden Light RGB {"NAME":"Holman RGB","GPIO":[0,0,0,0,0,0,0,0,417,416,418,0,0,0],"FLAG":0,"BASE":18} Jinvoo SM-WA104 RGB {"NAME":"Jinvoo LED Controller","GPIO":[0,0,0,0,256,418,0,0,416,32,417,0,257,0],"FLAG":0,"BASE":18} Konesky 12V RGB {"NAME":"RGBwifi","GPIO":[0,0,0,0,416,0,0,0,417,320,418,0,0,0],"FLAG":0,"BASE":18} LEDEnet {"NAME":"LEDEnet","GPIO":[0,1,320,1,3136,420,0,0,417,418,416,419,0,0],"FLAG":0,"BASE":34} @@ -402,6 +472,7 @@ Luminea ZX-2844 {"NAME":"Luminea ZX-284","GPIO":[419,0,0,0,0,418,0, Luminea ZX-2844-675 {"NAME":"ZX-2844-675","GPIO":[32,0,0,0,417,419,0,0,416,0,418,0,0,0],"FLAG":0,"BASE":18} Lustreon {"NAME":"Lustreon WiFi ","GPIO":[32,0,291,0,416,419,0,0,417,420,418,0,0,0],"FLAG":0,"BASE":38} Magic UFO RGBW {"NAME":"Magic UFO","GPIO":[32,0,544,0,0,416,0,0,418,419,417,320,0,0],"FLAG":0,"BASE":18} +MagicHome RGB {"NAME":"MagicHome RGB IR","GPIO":[0,0,0,0,1088,416,0,0,417,418,0,0,0,0],"FLAG":0,"BASE":18} MagicHome RGB {"NAME":"Magic Home RGB","GPIO":[0,0,0,0,3136,416,0,0,418,0,417,0,3168,0],"FLAG":0,"BASE":18} MagicHome RGB ZJ-WFMN-A V1.1 {"NAME":"MagicHome RGB","GPIO":[0,0,0,0,0,416,0,0,417,418,0,0,0,0],"FLAG":0,"BASE":34} MagicHome RGBW {"NAME":"ESP-IR-B-v2.3","GPIO":[0,0,1088,0,0,417,0,0,416,418,0,419,0,0],"FLAG":0,"BASE":18} @@ -413,9 +484,9 @@ MagicHome Single Color 5-28V {"NAME":"MagicHome","GPIO":[0,0,0,0,0,0,0,0,416,0, MagicHome ZJ-ESP-IR-F V1 {"NAME":"ZJ-ESP-IR-F V1","GPIO":[0,0,0,0,1088,417,0,0,416,418,0,419,0,0],"FLAG":0,"BASE":18} Music 12A 288W RGBW Led Controller {"NAME":"*WS04","GPIO":[0,0,0,0,0,0,0,0,417,418,416,419,0,0],"FLAG":0,"BASE":18} Nexlux {"NAME":"MagicHome V1.1","GPIO":[0,0,0,0,1088,416,0,0,417,418,0,0,0,0],"FLAG":0,"BASE":34} +Powertech RGB {"NAME":"Powertech RGB ","GPIO":[0,0,0,0,416,419,0,0,418,420,417,0,0,0],"FLAG":0,"BASE":18} QS-WIFI-RGBCW {"NAME":"QS-WIFI-RGBCW","GPIO":[0,0,32,0,544,417,0,0,418,0,289,416,0,0],"FLAG":0,"BASE":18} Shelly RGBW2 {"NAME":"Shelly RGBW2","GPIO":[0,0,288,0,419,1,0,0,416,32,418,417,0,0],"FLAG":0,"BASE":18} -SP501E WS2812B Addressable {"NAME":"SP501E","GPIO":[1,32,1,1376,1,1,1,1,1,1,1,1,1,1],"FLAG":0,"BASE":18} ZJ-WF-ESP-A v1.1 {"NAME":"RGB2","GPIO":[0,0,0,0,0,0,0,0,417,416,418,0,0,0],"FLAG":0,"BASE":18} ``` @@ -423,6 +494,7 @@ ZJ-WF-ESP-A v1.1 {"NAME":"RGB2","GPIO":[0,0,0,0,0,0,0,0,417,416,418, ``` Arlec Smart 2m LED Colour Changing Strip Light {"NAME":"Arlec ALD233AH","GPIO":[0,0,0,0,416,419,0,0,417,0,418,0,0,0],"FLAG":0,"BASE":18} B.K. Licht 2m RGB {"NAME":"RGBW-Strip","GPIO":[0,0,0,0,416,32,0,0,417,0,418,0,0,0],"FLAG":0,"BASE":18} +BAZZ 10 ft RGBW {"NAME":"BAZZ U183MRGBWWF RGBW LED Strip","GPIO":[32,0,0,0,416,419,0,0,417,0,418,0,0,0],"FLAG":0,"BASE":18} BlitzWolf BW-LT11 {"NAME":"BW-LT11 Strip","GPIO":[32,0,0,0,416,419,0,0,417,0,418,0,0,0],"FLAG":0,"BASE":18} BrilliantSmart 20743 RGB+W {"NAME":"BrilliantStrip","GPIO":[32,0,0,0,416,419,0,0,417,0,418,0,0,0],"FLAG":0,"BASE":18} Briloner 2256-150 RGB {"NAME":"Briloner2256-1","GPIO":[1088,0,0,0,416,0,0,0,417,0,418,0,0,0],"FLAG":0,"BASE":18} @@ -432,8 +504,8 @@ electriQ 3m RGBCCT {"NAME":"ElectricQ wifiRGBWLEDSTR","GPIO":[0,0,0,0, Elfeland 10m RGB {"NAME":"Elfeland RGB","GPIO":[0,0,0,0,0,417,0,0,418,1088,0,416,0,0],"FLAG":0,"BASE":18} Energizer Multi-Color 6.5ft {"NAME":"Energizer","GPIO":[0,0,0,0,0,417,0,0,418,0,0,416,0,0],"FLAG":0,"BASE":18} Geeni Prisma Plus {"NAME":"Geeni Prisma Plus Strip","GPIO":[32,0,0,0,416,419,0,0,417,420,418,0,0,0],"FLAG":0,"BASE":18} -Gosund RGB {"NAME":"Gosund LED Strip","GPIO":[32,0,0,0,0,0,0,0,416,418,417,0,0,4768],"FLAG":0,"BASE":18} -Gosund SL2 5m RGB {"NAME":"Gosund LED Str","GPIO":[0,0,0,0,32,417,0,0,416,418,0,0,0,4768],"FLAG":0,"BASE":18} +Gosund RGB {"NAME":"Gosund LED Strip","GPIO":[0,0,0,0,32,417,0,0,416,418,0,0,0,4768],"FLAG":0,"BASE":18} +Gosund SL2 5m RGB {"NAME":"gosund SL2","GPIO":[1,1,1,1,99,417,1,1,416,418,1,1,1,1],"FLAG":0,"BASE":18} HitLights L1012V-MC1 {"NAME":"HitLights RBG","GPIO":[32,0,0,0,416,419,0,0,417,0,418,0,0,0],"FLAG":0,"BASE":18} HomeMate 10m RGB {"NAME":"Homemate Strip","GPIO":[0,0,0,0,0,416,0,0,418,32,417,0,0,0],"FLAG":0,"BASE":18} Hykker 3m RGB {"NAME":"HYKKER Strip","GPIO":[0,0,0,0,0,416,0,0,418,32,417,0,0,0],"FLAG":0,"BASE":18} @@ -455,12 +527,14 @@ Monster Smart IlluminEssence {"NAME":"MI-EW003-999W ","GPIO":[32,0,0,0,416,419, NiteBird 9.2ft RGB TV Backlight {"NAME":"NiteBird Smart LED Light Strip","GPIO":[32,0,0,0,0,0,0,0,416,418,417,0,0,0],"FLAG":0,"BASE":18} Polux RGB+NW 2m {"NAME":"Polux Wi-Fi SM","GPIO":[32,0,0,0,416,419,0,0,417,420,418,0,0,0],"FLAG":0,"BASE":37} Polux RGBCCT 20W 1700lm 5m {"NAME":"Polux LED 5m","GPIO":[1,2272,1,2304,1,1,0,0,1,1,1,1,1,0],"FLAG":0,"BASE":54} -Powertech 5m RGBW {"NAME":"Jaycar ST3992 LED Strip","GPIO":[96,0,0,0,416,419,0,0,417,0,418,0,0,0],"FLAG":0,"BASE":18} +Powertech 5m RGBW {"NAME":"Jaycar ST3992 LED Strip","GPIO":[0,0,0,0,416,419,0,0,418,420,417,0,0,0],"FLAG":0,"BASE":18} Reafoo RGBW 5m {"NAME":"REAFOO RGBW LS","GPIO":[32,0,0,0,416,419,0,0,417,0,418,0,0,0],"FLAG":0,"BASE":18} Sonoff L1 {"NAME":"SonoffL1","GPIO":[0,3200,0,3232,0,0,0,0,0,320,0,0,0,0],"FLAG":0,"BASE":70} +Sonoff L1 Lite RGB {"NAME":"Sonoff L1 Lite","GPIO":[0,3200,0,3232,0,0,0,0,0,320,0,0,0,0],"FLAG":0,"BASE":70} Techvilla TE001 {"NAME":"TE-TE001","GPIO":[0,2272,0,2304,0,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":54} Teckin SL02 {"NAME":"Teckin SL02","GPIO":[1088,0,0,0,416,0,0,0,417,0,418,0,0,0],"FLAG":0,"BASE":52} Teckin SL07 32.8ft RGB {"NAME":"WIFI RGB","GPIO":[1088,0,0,0,416,0,0,0,417,0,418,0,0,0],"FLAG":0,"BASE":18} +Teopek Spider Z RGB {"NAME":"Sonoff L1","GPIO":[0,3200,0,3232,0,0,0,0,0,320,0,0,0,0],"FLAG":0,"BASE":70} TORCHSTAR CCT 30W Lighting Kit {"NAME":"Torchstar CCT ","GPIO":[0,0,0,0,288,417,0,0,0,32,0,416,289,0],"FLAG":0,"BASE":18} Torchstar Safe Lighting Kit {"NAME":"Torchstar","GPIO":[0,0,0,0,288,0,0,0,0,0,0,416,289,4704],"FLAG":0,"BASE":18} WOOX 5m RGBW {"NAME":"GardenLedstrip1","GPIO":[0,0,0,0,0,417,0,0,418,160,416,0,0,0],"FLAG":0,"BASE":18} @@ -492,17 +566,19 @@ Mirabella Genio 4 Black LED Garden Path {"NAME":"GenioGardenStr","GPIO":[0,0,0, Mirabella Genio CCT 6 LED 30mm Stainless Steel Deck {"NAME":"Mirabella Deck CCT","GPIO":[0,0,0,0,0,416,0,0,0,417,0,0,0,0],"FLAG":0,"BASE":18} MiraBella Genio Colour 6 LED 30mm Stainless Steel Deck {"NAME":"Genio RGB Deck Lights","GPIO":[0,0,0,0,416,0,0,0,417,0,418,0,0,0],"FLAG":0,"BASE":18} Mirabella Genio Rechargable LED Portable Lamp {"NAME":"MirabellaPortableLamp","GPIO":[32,0,0,0,416,419,0,0,417,0,418,0,0,0],"FLAG":0,"BASE":18} -Novostella UT88835 20W Floodlight {"NAME":"Novo 20W Flood","GPIO":[0,0,0,0,416,419,0,0,417,420,418,0,0,0],"FLAG":0,"BASE":18} +Novostella UT88835 20W Flood {"NAME":"Novo 20W Flood","GPIO":[0,0,0,0,416,419,0,0,417,420,418,0,0,0],"FLAG":0,"BASE":18} +Novostella UT88836 20W Flood {"NAME":"Novo 20W Flood","GPIO":[0,0,0,0,416,419,0,0,417,420,418,0,0,0],"FLAG":0,"BASE":18} Sonoff BN-SZ01 {"NAME":"Sonoff BN-SZ","GPIO":[0,0,0,0,0,0,0,0,416,320,0,0,0,0],"FLAG":0,"BASE":22} Spotlight 9cm RGB+W 7W {"NAME":"Spotlight RGBW","GPIO":[0,0,0,0,0,0,0,0,0,3008,0,3040,0,0],"FLAG":0,"BASE":27} Teckin FL41 {"NAME":"Teckin FL41","GPIO":[0,0,0,0,0,32,0,0,0,0,416,0,0,0],"FLAG":0,"BASE":18} -Wipro Next 20W Smart LED Batten (White) {"NAME":"WIPROBatten","GPIO":[0,0,0,0,0,416,0,0,0,449,0,0,0,4704],"FLAG":0,"BASE":18} +Wipro Next Smart Batten 20W CCT {"NAME":"WIPROBatten","GPIO":[0,0,0,0,0,416,0,0,0,449,0,0,0,4704],"FLAG":0,"BASE":18} ``` ## Miscellaneous ``` Alfawise Air Purifier {"NAME":"alfawise P2","GPIO":[1,2272,1,2304,1,1,0,0,1,1,1,1,1,0],"FLAG":0,"BASE":54} BlitzWolf Air Fryer {"NAME":"Bw-AF1","GPIO":[0,2272,0,2304,0,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":54} +Connex Smart Indoor Siren {"NAME":"Connex Siren","GPIO":[0,2272,0,2304,0,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":54} Dealdig Robvaccum 8 Vacuum {"NAME":"WhiteVacuum","GPIO":[0,2272,0,2304,0,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":18} iLONDA Fish Feeder {"NAME":"Feeder","GPIO":[0,0,0,0,32,320,0,0,352,0,224,0,0,0],"FLAG":0,"BASE":18} Kogan 4.1kW Portable Air Conditioner (Reverse Cycle) {"NAME":"Kogan Panel Heater","GPIO":[0,0,0,0,0,0,0,0,0,2304,0,2272,0,0],"FLAG":0,"BASE":54} @@ -523,14 +599,15 @@ Mirabella Genio I002576 {"NAME":"GenioPir","GPIO":[32,2272,0,2304,0,0,0,0,0 ## Motor ``` Zemismart BCM300D-TY {"NAME":"Zemistart_Curt","GPIO":[0,0,0,0,0,0,0,0,0,2304,0,2272,0,0],"FLAG":0,"BASE":54} -Zemismart Blinds Controller "Not available" +Zemismart Blinds Controller {"NAME":"Zemismart Blind","GPIO":[1,1,1,1,1,1,0,0,1,2304,1,2272,1],"FLAG":0,"BASE":54} +Zemismart Rechargeable Roller Shade {"NAME":"Zemismart Remote","GPIO":[544,0,288,33,225,32,0,0,34,226,289,224,290,0],"FLAG":0,"BASE":18} Zemismart Roller Shade {"NAME":"M2805EIGB","GPIO":[1,2272,1,2304,1,1,0,0,1,1,1,1,1,0],"FLAG":0,"BASE":54} Zemismart Updated RF Remote Roller Shade {"NAME":"Zemismart M515EGB","GPIO":[1,2272,1,2304,1,1,0,0,1,1,1,1,1,0],"FLAG":0,"BASE":54} ``` ## Multisensor ``` -AZ-Envy Environmental Development Board {"NAME":"AZ Envy","GPIO":[0,0,288,0,640,608,0,0,0,0,0,0,0,4704],"FLAG":0,"BASE":18} +AZ-Envy Environmental Development Board {"NAME":"AZ Envy","GPIO":[32,0,320,0,640,608,0,0,0,0,0,0,0,4704],"FLAG":0,"BASE":18} NEO Coolcam Siren with Temperature and Humidity {"NAME":"Neo Siren 3in1","GPIO":[1,2272,1,2304,1,1,0,0,1,1,1,1,1,0],"FLAG":0,"BASE":54} Sonoff SC {"NAME":"Sonoff SC","GPIO":[32,3200,1,3232,0,0,0,0,0,320,0,0,0,0],"FLAG":0,"BASE":21} ``` @@ -541,9 +618,10 @@ Acenx SOP04-US Dual {"NAME":"SOP04-US Dual","GPIO":[1,1,1,1,320,321,0,0 Aicliv 3 Outlet {"NAME":"AICLIV SOP03US","GPIO":[0,0,0,226,321,0,0,0,224,33,225,0,0,0],"FLAG":0,"BASE":18} Albohes PC-1606 {"NAME":"Albohes PC1606","GPIO":[32,0,0,0,0,225,33,0,224,0,0,0,0,4704],"FLAG":0,"BASE":39} Albohes PS-1602 {"NAME":"Albohes PC1606","GPIO":[32,0,0,0,0,225,33,0,224,0,0,0,0,4704],"FLAG":0,"BASE":39} +Amzdest Dual {"NAME":"Amzdest c158","GPIO":[0,32,0,225,2720,2656,0,0,224,2624,0,0,0,0],"FLAG":0,"BASE":18} Amzdest IP55 {"NAME":"C168 Outdoor","GPIO":[0,0,0,2592,2720,2656,0,0,224,320,225,226,32,0],"FLAG":0,"BASE":18} Aoycocr X13 {"NAME":"Aoycocr X13","GPIO":[0,0,320,0,0,0,0,0,225,32,0,224,0,0],"FLAG":0,"BASE":18} -Atomi AT1320 {"NAME":"AT1320","GPIO":[0,0,0,0,321,288,0,0,224,32,0,0,0,0],"FLAG":0,"BASE":18} +Atomi {"NAME":"AtomiSmartPlug","GPIO":[0,0,0,0,320,576,0,0,224,32,0,0,0,0],"FLAG":0,"BASE":18} BN-Link {"NAME":"BNC-60/U130T","GPIO":[1,0,1,0,1,320,1,1,224,32,1,0,0,1],"FLAG":0,"BASE":18} Brennenstuhl WA 3000 XS02 {"NAME":"WA 3000 XS02","GPIO":[0,0,0,0,224,32,0,0,576,288,0,0,0,0],"FLAG":0,"BASE":61} C119 {"NAME":"Subosi C119","GPIO":[0,0,0,0,225,320,0,0,224,544,32,0,321,0],"FLAG":0,"BASE":18} @@ -552,12 +630,14 @@ C168 IP64 {"NAME":"C188","GPIO":[320,0,321,0,33,0,0,0,224,32, ECF-SOP03 {"NAME":"Outdoor3Outlet","GPIO":[0,0,0,226,320,0,0,0,224,32,225,0,0,0],"FLAG":0,"BASE":18} Ecoolbuy 4 socket {"NAME":"ECCOLBUY 4","GPIO":[0,0,0,0,225,226,0,0,224,321,32,0,227,0],"FLAG":0,"BASE":18} Edimax 2AC {"NAME":"EDI SP-1122WTO","GPIO":[0,0,0,0,225,576,0,0,224,0,32,0,0,0],"FLAG":0,"BASE":18} -Etekcity {"NAME":"ES015-TB","GPIO":[0,0,0,0,224,225,0,0,2656,2688,32,2592,320,0],"FLAG":0,"BASE":18} +Emax IP44 {"NAME":"Emax Smart Socket","GPIO":[0,0,0,0,320,0,0,0,224,0,32,0,0,0],"FLAG":0,"BASE":18} +Etekcity {"NAME":"ES015-TB","GPIO":[0,0,0,0,224,225,288,0,2656,2688,32,2592,289,0],"FLAG":0,"BASE":18} Feit Electric PLUG/WIFI/WP {"NAME":"Prime Smart ou","GPIO":[0,1,0,1,544,320,0,0,224,32,0,0,0,0],"FLAG":0,"BASE":18} Forrinx SH-18EU-A {"NAME":"SH-18EU-A","GPIO":[0,0,0,0,225,288,224,321,32,0,0,0,0,0],"FLAG":0,"BASE":18} Geeni Outdoor DUO Dual Outlet {"NAME":"Geeni Dual Out","GPIO":[32,0,0,0,0,321,0,0,0,320,224,0,225,0],"FLAG":0,"BASE":18} Globe 2-Outlet {"NAME":"Globe 50029","GPIO":[0,0,0,321,225,544,0,0,32,224,320,0,0,0],"FLAG":0,"BASE":18} HA109US {"NAME":"HA109US","GPIO":[32,0,0,0,288,289,0,0,224,0,225,0,0,0],"FLAG":0,"BASE":18} +Hama 2,300W/10A {"NAME":"Hama Outdoor","GPIO":[0,0,0,0,576,320,0,0,224,32,0,0,0,0],"FLAG":0,"BASE":18} HBN 6 Outlet Yard Stake {"NAME":"BNC-60/U13WT","GPIO":[0,0,0,0,0,320,0,0,224,32,0,0,0,0],"FLAG":0,"BASE":18} HBN Heavy Duty {"NAME":"HBN U151T","GPIO":[0,0,0,0,288,289,0,0,224,32,0,0,0,0],"FLAG":0,"BASE":18} iClever IC-BS06 {"NAME":"iClever Switch","GPIO":[0,0,0,0,544,320,0,0,224,32,225,0,0,0],"FLAG":0,"BASE":18} @@ -578,8 +658,9 @@ Obi Stecker IP44 {"NAME":"OBI Socket 2","GPIO":[0,0,0,0,224,32,0,0,3 Oittm Outdoor {"NAME":"Oittm Outdoor","GPIO":[32,0,0,0,0,0,0,0,0,0,320,224,1,0],"FLAG":0,"BASE":18} Peteme PS-1602 {"NAME":"Peteme Outdoor","GPIO":[32,0,0,0,0,225,33,0,224,320,0,0,0,0],"FLAG":0,"BASE":18} Poweradd {"NAME":"POWERADD","GPIO":[0,0,0,0,320,321,0,0,224,32,225,0,0,0],"FLAG":0,"BASE":18} +Prime {"NAME":"PRIME CCRCWFI02PK","GPIO":[0,0,0,0,320,544,0,0,224,32,0,0,0,0],"FLAG":0,"BASE":18} Prime RCWFIO 2-Outlet {"NAME":"Prime Outdoor","GPIO":[0,0,0,0,320,321,0,0,224,32,0,0,0,0],"FLAG":0,"BASE":18} -Prime Smart Outlet {"NAME":"Prime CCWFIO232PK","GPIO":[0,0,0,321,225,0,0,0,32,224,288,0,0,0],"FLAG":0,"BASE":18} +Prime Smart Outlet {"NAME":"Prime CCWFIO232PK","GPIO":[0,0,0,321,225,576,0,0,32,224,320,0,0,0],"FLAG":0,"BASE":18} Signstek EOP03-EU {"NAME":"Signstek EOP03","GPIO":[0,0,0,0,320,321,0,0,224,32,225,0,0,1],"FLAG":0,"BASE":18} SK03 {"NAME":"SK03 Outdoor","GPIO":[32,0,0,0,2688,2656,0,0,2624,321,320,224,0,0],"FLAG":0,"BASE":57} STITCH by Monoprice {"NAME":"STITCH 35556","GPIO":[1,1,1,1,225,321,0,0,224,320,32,1,1,0],"FLAG":0,"BASE":18} @@ -592,6 +673,7 @@ Treatlife Dimmer {"NAME":"DP10 Dimmer","GPIO":[0,2272,0,2304,0,0,0,0 Ucomen PA-GEBA-01SWP {"NAME":"PA-GEBA-01SWP","GPIO":[0,0,0,0,288,321,0,0,224,32,0,0,0,0],"FLAG":0,"BASE":18} WOOX R4051 {"NAME":"WOOX R4051","GPIO":[32,0,0,0,0,0,0,0,224,320,0,0,0,0],"FLAG":0,"BASE":18} WOOX R4052 {"NAME":"WOOX R4052","GPIO":[32,0,0,0,0,0,0,0,224,320,0,0,0,0],"FLAG":0,"BASE":18} +Wyze Plug "Not available" ``` ## Plug @@ -644,11 +726,15 @@ Athom 16A AU {"NAME":"Athom PG05-IT16A","GPIO":[0,0,0,32,2720,26 Athom 16A Brazil {"NAME":"Athom PG05-BR16A","GPIO":[0,0,0,32,2720,2656,0,0,2624,544,224,0,0,0],"FLAG":0,"BASE":1} Athom 16A Israel {"NAME":"Athom PG05-IL16A","GPIO":[0,0,0,32,2720,2656,0,0,2624,544,224,0,0,0],"FLAG":0,"BASE":1} Athom 16A Italy {"NAME":"Athom PG05-IT16A","GPIO":[0,0,0,32,2720,2656,0,0,2624,544,224,0,0,0],"FLAG":0,"BASE":1} +Athom 16A UK {"NAME":"Athom PG04-UK16A","GPIO":[0,0,0,32,2720,2656,0,0,0,0,2624,320,224,0],"FLAG":0,"BASE":18} +Athom 16A US {"NAME":"Athom PG03-US16A","GPIO":[0,0,0,32,2720,2656,0,0,2624,288,224,0,0,0],"FLAG":0,"BASE":18} +Atlantis {"NAME":"Atlantis Smart Plug","GPIO":[32,0,0,0,2720,2656,0,0,2624,544,224,0,0,0],"FLAG":0,"BASE":18} Atomi AT1217 {"NAME":"AT1217","GPIO":[0,0,0,0,320,321,0,0,224,32,0,0,0,0],"FLAG":0,"BASE":18} +Aukey {"NAME":"Aukey SH-PA2","GPIO":[0,0,0,0,576,320,0,0,32,0,224,0,0,0],"FLAG":0,"BASE":18} +Aukey {"NAME":"AUKEY SH-PA2","GPIO":[0,0,0,0,576,0,0,0,224,0,32,0,0,0],"FLAG":0,"BASE":18} Aukey SH-PA1 {"NAME":"AUKEY SH-PA1","GPIO":[320,0,321,0,0,0,0,0,0,32,0,224,0,0],"FLAG":0,"BASE":18} -Aukey SH-PA2 {"NAME":"AUKEY SH-PA2","GPIO":[0,0,0,0,576,0,0,0,224,0,32,0,0,0],"FLAG":0,"BASE":18} Aukey SH-PA3 {"NAME":"Aukey SH-PA3","GPIO":[0,0,576,0,321,32,0,0,225,0,0,224,0,0],"FLAG":0,"BASE":18} -Aunics Smart EU {"NAME":"AUNICS","GPIO":[0,0,0,32,2720,2656,0,0,2624,544,224,0,0,0],"FLAG":0,"BASE":18} +Aunics Presa Smart {"NAME":"AUNICS","GPIO":[0,32,0,0,0,0,0,0,0,320,224,0,0,0],"FLAG":0,"BASE":18} Aunics Smart IT {"NAME":"AUNICS","GPIO":[0,0,0,32,2720,2656,0,0,2624,544,224,0,0,0],"FLAG":0,"BASE":18} Avatar {"NAME":"Avatar UK 10A","GPIO":[0,0,320,0,0,2720,0,0,2624,32,2656,224,0,0],"FLAG":0,"BASE":45} Avatar AWP01L {"NAME":"AWP01L","GPIO":[0,0,0,0,0,320,0,0,0,32,224,0,0,0],"FLAG":0,"BASE":18} @@ -669,7 +755,7 @@ Bagotte SK-EU-A01 {"NAME":"Bagotte SK-EU-A01","GPIO":[96,0,0,0,0,0,0, Bakibo TP22Y {"NAME":"Bakibo TP22Y","GPIO":[0,0,0,32,2720,2656,0,0,2624,320,224,0,0,0],"FLAG":0,"BASE":52} Bardi 16A {"NAME":"BARDI","GPIO":[320,0,0,0,0,2720,0,0,224,32,2656,321,2624,0],"FLAG":0,"BASE":18} Bauhn ASPU-1019 {"NAME":"Bauhn Smart Pl","GPIO":[0,0,0,0,224,225,0,0,0,320,32,0,0,0],"FLAG":0,"BASE":18} -Be HiTech 16A {"NAME":"BeHiTech","GPIO":[0,0,0,288,0,2720,0,0,2624,32,2656,224,0],"FLAG":0,"BASE":18} +Be HiTech 16A {"NAME":"Be HiTech","GPIO":[0,0,0,288,0,2720,0,0,2624,32,2656,224,0],"FLAG":0,"BASE":18} Bearware 303492 3AC+2USB {"NAME":"Bearware 30349","GPIO":[0,320,0,32,225,226,0,0,227,224,544,0,0,0],"FLAG":0,"BASE":18} Bestek MRJ1011 {"NAME":"BestekMRJ1011","GPIO":[0,0,0,0,320,0,0,0,224,32,0,0,0,0],"FLAG":0,"BASE":1} BlitzWolf 1200W Dual {"NAME":"BlitzWolf SHP3","GPIO":[320,0,321,0,225,2720,0,0,2624,33,2656,224,32,0],"FLAG":0,"BASE":45} @@ -686,8 +772,9 @@ BlitzWolf SHP1 {"NAME":"BlitzWolf-SHP1","GPIO":[320,0,321,0,0,0,0, Blitzwolf SHP11 16A {"NAME":"BlitzWolf-SHP11","GPIO":[320,0,321,0,0,0,0,0,0,32,0,224,0,0],"FLAG":0,"BASE":18} Bluemyth 16A {"NAME":"SWA11","GPIO":[0,0,0,0,288,224,0,0,0,32,0,0,0,0],"FLAG":0,"BASE":18} BN-Link {"NAME":"BNC-60/U133TJ","GPIO":[0,288,0,32,2720,2656,0,0,2624,289,224,0,0,0],"FLAG":0,"BASE":18} -BNETA IO-WIFI-PlugSA {"NAME":"BNETA WifiPlug","GPIO":[32,0,0,0,2688,2656,0,0,2624,320,224,0,0,0],"FLAG":0,"BASE":18} +BNETA IoT {"NAME":"BNETA WifiPlug","GPIO":[32,288,0,0,2688,2656,0,0,2624,544,224,0,0,0],"FLAG":0,"BASE":18} Bontec SPEU {"NAME":"Bontec SPEU","GPIO":[0,0,320,0,0,0,0,0,0,32,0,224,0,0],"FLAG":0,"BASE":18} +Brennenstuhl Ecolor 3AC {"NAME":"WS EC01 DE","GPIO":[0,0,0,0,32,576,0,0,0,288,224,0,0,0],"FLAG":0,"BASE":18} Brennenstuhl WA 3000 {"NAME":"WA 3000 XS01","GPIO":[0,0,0,0,224,32,0,0,576,288,0,0,0,0],"FLAG":0,"BASE":61} Bright {"NAME":"Bright Wi-Fi Smart Plug","GPIO":[0,0,0,0,320,0,0,0,224,0,32,0,0,0],"FLAG":0,"BASE":18} Brilliant {"NAME":"HK17654S05","GPIO":[32,1,1,1,2688,2656,1,1,2624,320,224,1,1,0],"FLAG":0,"BASE":18} @@ -716,6 +803,7 @@ Connex CC-P1000 {"NAME":"Connex Smart T","GPIO":[32,0,0,0,2688,2656 Connex Type F {"NAME":"Connex CC-P1001","GPIO":[0,0,320,0,0,2688,0,0,2624,32,2656,224,0,0],"FLAG":0,"BASE":18} Coosa {"NAME":"COOSA","GPIO":[0,0,0,0,321,288,0,0,224,32,1,0,0,0],"FLAG":0,"BASE":1} Coosa SP1 {"NAME":"COOSA SP1","GPIO":[321,1,320,1,0,2720,0,0,2624,32,2656,224,0,0],"FLAG":0,"BASE":45} +CooWoo {"NAME":"CooWoo AW01","GPIO":[0,0,0,0,288,160,0,0,256,0,0,0,0,0],"FLAG":0,"BASE":18} CrazyLynX WiFi {"NAME":"CrazyLynX","GPIO":[0,0,0,0,321,320,0,0,224,32,0,0,0,4704],"FLAG":0,"BASE":18} CYYLTF BIFANS J23 {"NAME":"CYYLTD BIFANS J23","GPIO":[320,0,0,0,0,0,0,0,224,32,0,0,0,4704],"FLAG":0,"BASE":18} D3D Smart Plug with USB & Power Monitor {"NAME":"D3D FLHS-ZN04","GPIO":[321,1,320,2624,1,2688,1,1,1,32,2656,224,1,1],"FLAG":0,"BASE":18} @@ -746,7 +834,9 @@ EFUN SH331W {"NAME":"Efun-Plug","GPIO":[320,0,576,0,0,2720,0,0, Elehot 16A {"NAME":"ELEHOT AWP16L","GPIO":[0,0,320,0,0,2720,0,0,2624,32,2656,224,0,0],"FLAG":0,"BASE":45} EletecPro 2 {"NAME":"EletecPro-2","GPIO":[1,1,1,1,32,1,0,0,289,288,224,1,1,4704],"FLAG":0,"BASE":18} Ener-J {"NAME":"ENER-J SHA5264","GPIO":[32,0,0,0,2720,2656,0,0,2624,288,224,0,0,0],"FLAG":0,"BASE":18} +Energeeks {"NAME":"EG-EW003MC","GPIO":[0,0,0,32,2720,2656,0,0,2624,576,224,0,0,0],"FLAG":0,"BASE":52} Energeeks 2 USB {"NAME":"EG-EW005MC","GPIO":[544,1,288,1,1,225,1,1,2592,1,224,1,32,0],"FLAG":0,"BASE":18} +Energizer Smart Plug {"NAME":"Energizer Smart Plug","GPIO":[0,0,0,32,0,0,0,0,0,320,224,0,0,0],"FLAG":0,"BASE":18} Epicka {"NAME":"Epicka","GPIO":[1,1,1,1,321,320,0,0,224,32,1,1,1,4704],"FLAG":0,"BASE":18} Esicoo JSM-WF02 {"NAME":"Esicoo Plug","GPIO":[0,32,0,0,0,0,0,0,0,320,224,0,0,0],"FLAG":0,"BASE":18} Estink C178 {"NAME":"Estink C178","GPIO":[0,0,0,0,288,321,0,0,224,32,0,0,0,0],"FLAG":0,"BASE":18} @@ -754,15 +844,20 @@ Etekcity ESW01-USA {"NAME":"ESW01-USA","GPIO":[0,0,0,0,224,544,0,0,265 Etekcity ESW15-USA {"NAME":"ESW15-US","GPIO":[0,0,0,0,0,224,0,0,2656,2688,32,2592,288,0],"FLAG":0,"BASE":18} EU3S {"NAME":"AWOW BSD33","GPIO":[0,0,320,0,0,2720,0,0,2624,32,2656,224,0,0],"FLAG":0,"BASE":18} Eva Logik {"NAME":"EVA LOGIK Plug","GPIO":[1,32,1,1,1,1,0,0,1,288,224,1,1,0],"FLAG":0,"BASE":18} +EZPlug V1 OpenSource {"NAME":"EZPlug V1","GPIO":[0,0,0,32,0,0,0,0,0,320,224,0,0,0],"FLAG":0,"BASE":1} +EZPlug+ V1 {"NAME":"EZPlug+ V1","GPIO":[0,0,0,32,2720,2656,0,0,2624,320,224,0,0,0],"FLAG":0,"BASE":1} +Febite {"NAME":"Febite","GPIO":[320,0,0,0,0,2720,0,0,224,32,2656,0,0,0],"FLAG":0,"BASE":1} Feit Electric PLUG/WIFI {"NAME":"Feit Wifi Plug","GPIO":[0,0,0,320,0,0,0,0,224,0,32,0,0,0],"FLAG":0,"BASE":18} FK-PW901U {"NAME":"FK-PW901U","GPIO":[320,1,1,1,1,226,0,0,224,32,227,225,1,0],"FLAG":0,"BASE":18} FLHS-ZN04 {"NAME":"FLHS-ZN04","GPIO":[321,0,320,0,0,2720,0,0,2624,32,2656,224,0,0],"FLAG":0,"BASE":45} Fontastic SH01 {"NAME":"Fontastic","GPIO":[1,0,1,0,320,0,0,0,224,32,0,0,0,4704],"FLAG":0,"BASE":18} +Foreet {"NAME":"Foreet_120V","GPIO":[0,0,0,0,224,32,0,0,289,288,0,0,0,0],"FLAG":0,"BASE":18} Foval SM-PW701E {"NAME":"SM-PW701E","GPIO":[0,0,0,0,320,0,0,0,224,32,0,0,0,0],"FLAG":0,"BASE":18} FrankEver 15A {"NAME":"Israel plug","GPIO":[321,0,320,2624,0,2720,0,0,0,32,2656,224,0,0],"FLAG":0,"BASE":45} FrankEver 16A {"NAME":"FrankEver FK-PW801ER","GPIO":[0,0,0,0,288,0,0,0,224,32,0,0,0,0],"FLAG":0,"BASE":18} -FrankEver Mini {"NAME":"FK-PW801US","GPIO":[0,0,0,0,224,225,0,0,226,227,228,229,230,0],"FLAG":0,"BASE":18} +FrankEver Mini {"NAME":"FK-PW801US","GPIO":[0,0,320,0,0,0,0,0,0,32,0,224,0,0],"FLAG":0,"BASE":18} Frankever USB {"NAME":"FK-PW301U","GPIO":[0,0,1,0,576,0,0,0,224,32,0,0,0,0],"FLAG":0,"BASE":18} +GDTech {"NAME":"GDTech Model: MPV2RO-US","GPIO":[320,0,0,0,0,0,0,0,0,32,0,224,0,0],"FLAG":0,"BASE":18} GDTech W-US001 {"NAME":"GDTech W-US001","GPIO":[1,32,1,1,1,1,0,0,1,320,224,1,1,4704],"FLAG":0,"BASE":18} GDTech W-US003 {"NAME":"W-US003","GPIO":[0,32,1,1,1,0,0,0,0,320,224,0,0,0],"FLAG":0,"BASE":18} Geekbes YM-WS-1 {"NAME":"Office Test Pl","GPIO":[1,1,1,1,1,1,1,1,576,32,163,224,1,1],"FLAG":0,"BASE":18} @@ -776,6 +871,7 @@ Globe 2 Outlet {"NAME":"Globe 50020","GPIO":[0,576,0,321,33,32,0,0 Globe Smart {"NAME":"GlobeSmartPlug","GPIO":[0,0,0,0,320,0,0,0,224,0,32,0,0,0],"FLAG":0,"BASE":18} GoldenDot Mini {"NAME":"GoldenDot Mini","GPIO":[0,32,0,0,0,0,0,0,0,321,224,0,0,0],"FLAG":0,"BASE":52} GoldenDot with ADC {"NAME":"W-US003-Power","GPIO":[320,0,0,0,0,0,0,0,0,32,0,224,0,4896],"FLAG":0,"BASE":18} +Goliath 16A {"NAME":"GOLIATH AV-SSTE01","GPIO":[0,0,320,0,0,0,0,0,0,32,0,224,0,0],"FLAG":0,"BASE":18} Gosund {"NAME":"Gosund EP2","GPIO":[320,1,576,1,2656,2720,0,0,2624,32,0,224,0,0],"FLAG":0,"BASE":45} Gosund 13A {"NAME":"Gosund UP111","GPIO":[0,320,0,32,2720,2656,0,0,2624,576,224,0,0,0],"FLAG":0,"BASE":18} Gosund 2 in 1 {"NAME":"Gosund WP212","GPIO":[321,288,544,0,224,2720,0,0,2624,32,2656,225,33,0],"FLAG":0,"BASE":18} @@ -784,7 +880,6 @@ Gosund SP111 {"NAME":"Gosund SP111","GPIO":[320,0,321,0,0,2720,0 Gosund SP111 v1.1 {"NAME":"SP111 v1.1","GPIO":[320,0,576,0,2656,2720,0,0,2624,32,0,224,0,0],"FLAG":0,"BASE":45} Gosund SP111 v1.4 {"NAME":"Gosund SP111","GPIO":[321,1,320,1,0,2720,0,0,2624,32,2656,224,0,0],"FLAG":0,"BASE":45} Gosund SP112 {"NAME":"SHP5","GPIO":[321,3072,320,3104,1,225,0,0,1,1,224,1,32,0],"FLAG":0,"BASE":18} -Gosund SP112 {"NAME":"Gosund 112v3.4","GPIO":[320,0,321,0,2656,2720,0,0,2624,257,224,0,0,4800],"FLAG":0,"BASE":18} Gosund SP211 {"NAME":"Gosund SP211","GPIO":[33,576,320,2624,2720,2656,0,0,32,321,224,0,225,0],"FLAG":0,"BASE":18} Gosund WP1 {"NAME":"Gosund WP1-1","GPIO":[0,0,320,0,0,2720,0,0,2624,32,2656,224,0,0],"FLAG":0,"BASE":45} Gosund WP2 {"NAME":"Gosund WP2","GPIO":[32,576,321,0,33,0,0,0,225,320,224,0,0,0],"FLAG":0,"BASE":18} @@ -809,7 +904,7 @@ HiHome WPP-16T {"NAME":"HiHome WPP-16T","GPIO":[32,320,1,1,2720,26 HIPER IoT P01 {"NAME":"HIPER IoT P01","GPIO":[0,0,0,0,0,320,0,0,224,32,0,0,0,0],"FLAG":0,"BASE":18} hiwild W-US002 {"NAME":"W-US002","GPIO":[0,32,0,0,0,0,0,0,0,288,224,0,576,0],"FLAG":0,"BASE":18} Hoin 10A {"NAME":"NIOH XS-SSC01","GPIO":[0,32,0,0,0,0,0,0,0,320,224,0,0,0],"FLAG":0,"BASE":18} -Hombli Socket Duo {"NAME":"HombliSocketDuo","GPIO":[33,0,0,0,0,0,0,0,0,544,224,225,32,0,0],"FLAG":0,"BASE":18} +Hombli Socket Duo {"NAME":"HombliSocketDuo","GPIO":[33,0,0,0,0,0,0,0,0,544,224,225,32,0],"FLAG":0,"BASE":18} HomeMate 16A Heavy Duty {"NAME":"HMLPG16","GPIO":[0,288,0,32,2720,2656,0,0,2624,544,224,0,0,0],"FLAG":0,"BASE":18} Houzetek AWP07L {"NAME":"AWP07L","GPIO":[320,0,0,2592,0,2720,0,0,0,32,2656,224,0,0],"FLAG":0,"BASE":18} HS108 {"NAME":"HS108","GPIO":[0,32,0,0,0,0,0,0,0,320,224,0,0,4704],"FLAG":0,"BASE":18} @@ -828,6 +923,8 @@ Ihommate 16A {"NAME":"ZCH-02","GPIO":[0,0,0,32,2688,2656,0,0,259 Infray 16A {"NAME":"AWP08L","GPIO":[32,0,288,0,0,0,0,0,0,0,0,224,0,4704],"FLAG":0,"BASE":18} Insmart WP5 {"NAME":"INSMART","GPIO":[0,0,448,0,0,0,0,0,0,160,0,224,0,0],"FLAG":0,"BASE":18} iSwitch {"NAME":"Smart Plug XSA","GPIO":[1,32,1,1,1,1,0,0,1,320,224,1,1,0],"FLAG":0,"BASE":18} +ITINFTEK {"NAME":"ZEU-003","GPIO":[0,1,0,2624,2720,2656,0,0,224,32,320,0,0,0],"FLAG":0,"BASE":18} +J15 {"NAME":"J15","GPIO":[0,0,0,0,544,0,0,0,224,32,0,0,0,0],"FLAG":0,"BASE":18} Jeeo TF-SH330 {"NAME":"Jeeo TF-SH330","GPIO":[320,0,0,0,0,0,0,0,0,32,0,224,0,4704],"FLAG":0,"BASE":18} Jeeo TF-SH331W {"NAME":"Jeeo SH331W","GPIO":[320,0,576,0,0,2720,0,0,2624,32,2656,224,0,0],"FLAG":0,"BASE":18} Jetstream MSP150 {"NAME":"JetstreamMSP150","GPIO":[320,0,321,0,224,2720,0,0,2624,32,2656,0,0,0],"FLAG":0,"BASE":45} @@ -843,6 +940,7 @@ Jules V (Upgrade Version) {"NAME":"Jules-V_UV","GPIO":[320,0,0,0,0,2720,0,0,2 JULES.V NX-SM200 V1.3 {"NAME":"NX-SM200","GPIO":[288,0,0,2624,0,2720,0,0,0,32,2656,224,0,4704],"FLAG":0,"BASE":45} Jules.V NX-SM300 {"NAME":"NX-SM300","GPIO":[288,0,0,0,0,2592,0,0,224,2656,2688,288,0,0],"FLAG":0,"BASE":6} Jules.V NX-SP203 {"NAME":"NX-SP203","GPIO":[288,0,0,0,32,2720,1,1,224,33,0,225,0,0],"FLAG":0,"BASE":18} +JuoYou 16A {"NAME":"Juoyou ZY-OYD","GPIO":[0,0,0,32,2720,2656,0,0,2624,288,224,0,0,0],"FLAG":0,"BASE":18} JVMAC-EU01 {"NAME":"JVMAC","GPIO":[0,32,0,0,0,0,0,0,0,320,224,0,0,0],"FLAG":0,"BASE":18} Kaforto KW-US-801 {"NAME":"Kaforto US-801","GPIO":[32,576,0,227,2720,2656,0,0,2624,225,224,226,0,0],"FLAG":0,"BASE":18} Kimire S12 {"NAME":"Kimire S12","GPIO":[1,1,1,32,1,1,0,0,1,320,224,1,1,0],"FLAG":0,"BASE":18} @@ -862,10 +960,12 @@ Koogeek W-DEXI {"NAME":"W-DEXI","GPIO":[0,64,0,0,2720,2656,0,0,259 Koogeek W-UKX {"NAME":"Koogeek W-UKX","GPIO":[0,32,1,1,1,0,0,0,0,320,224,0,0,0],"FLAG":0,"BASE":1} KULED K63 {"NAME":"KULED K63","GPIO":[0,0,0,0,224,32,0,0,320,0,0,0,0,0],"FLAG":0,"BASE":18} Laduo YX-DE01 {"NAME":"YX-DE01","GPIO":[1,32,1,1,1,1,0,0,1,320,224,1,1,0],"FLAG":0,"BASE":18} +LE LampUX Smart Socket {"NAME":"LE LampUX","GPIO":[0,0,0,0,0,320,0,0,224,32,0,0,0,0],"FLAG":0,"BASE":18} Lenovo SE-341A {"NAME":"Lenovo SE-341A","GPIO":[0,0,0,0,32,224,0,0,576,0,320,0,0,0],"FLAG":0,"BASE":18} LESHP KS-501 {"NAME":"LESHP KS-501","GPIO":[32,0,0,0,0,0,0,0,224,320,0,0,0,0],"FLAG":0,"BASE":1} Lighting Arena {"NAME":"Lighting Arena Smart Plug","GPIO":[0,0,320,0,0,0,0,0,0,32,0,224,0,0],"FLAG":0,"BASE":18} Lloyd's {"NAME":"Lloyds LC-1193","GPIO":[0,0,0,0,320,0,0,0,224,0,32,0,0,0],"FLAG":0,"BASE":18} +LogiLink {"NAME":"LogilinkPA0199","GPIO":[0,0,0,64,0,0,0,0,0,320,224,0,0,0],"FLAG":0,"BASE":18} LogiLink PA0200 {"NAME":"LogilinkPA0200","GPIO":[0,0,0,64,0,0,0,0,0,320,224,0,0,4896],"FLAG":0,"BASE":18} Lohas Nightlight + USB {"NAME":"Lohas LED Mini Plug","GPIO":[0,321,0,288,322,226,1,1,224,32,225,0,544,0],"FLAG":0,"BASE":18} Lonsonho 10A Type E {"NAME":"Lonsonho10ALed","GPIO":[0,0,0,0,320,0,0,0,224,32,0,0,0,0],"FLAG":0,"BASE":18} @@ -893,6 +993,7 @@ Merkury MI-WW102-199L {"NAME":"MIC-WW102","GPIO":[32,0,0,0,0,0,0,0,0,320, Merkury MI-WW105-199W {"NAME":"Merkury Switch","GPIO":[1,1,1,1,576,320,0,0,224,32,1,1,1,4704],"FLAG":0,"BASE":18} Mini {"NAME":"MiniSmartSocket_S03","GPIO":[0,0,0,0,320,0,0,0,0,32,0,224,0,0],"FLAG":0,"BASE":18} Minleaf W-DEXI {"NAME":"W-DEXI","GPIO":[0,32,0,0,2720,2656,0,0,2624,288,224,0,0,0],"FLAG":0,"BASE":18} +Mirabella Genio {"NAME":"GenioGpo","GPIO":[0,0,0,32,2720,2656,0,0,2624,320,224,0,0,0],"FLAG":0,"BASE":18} Mirabella Genio 1002341 {"NAME":"Genio 1","GPIO":[0,0,320,0,0,0,0,0,224,32,0,0,0,0],"FLAG":0,"BASE":1} Mirabella Genio USB {"NAME":"Mirabella Genio 1002826","GPIO":[0,0,0,32,0,0,0,0,0,320,224,0,0,0],"FLAG":0,"BASE":1} Mirabella Genio USB Port {"NAME":"Genio I002341","GPIO":[0,0,0,0,320,0,0,0,224,32,0,0,0,0],"FLAG":0,"BASE":1} @@ -914,6 +1015,8 @@ NEO Coolcam NAS-WR01W 16A {"NAME":"Neo Coolcam 16","GPIO":[32,0,0,0,2720,2656 NETVIP XS-SSA01 {"NAME":"XS-SSA01","GPIO":[0,0,0,0,0,0,0,0,320,32,0,224,0,0],"FLAG":0,"BASE":18} Nightlight and AC Outlet {"NAME":"SWN03","GPIO":[32,0,0,0,0,0,1,1,416,0,0,224,0,0],"FLAG":0,"BASE":18} Nishica SM-PW701I {"NAME":"SM-PW701I","GPIO":[1,1,1,1,1,1,1,1,224,288,32,1,1,1],"FLAG":0,"BASE":18} +Nivian {"NAME":"Nivian Smart Socket","GPIO":[0,0,320,0,0,2688,0,0,2624,32,2656,224,0,0],"FLAG":0,"BASE":18} +Nous A1 {"NAME":"Nous A1","GPIO":[320,1,321,1,2656,2720,0,0,2624,32,0,224,0,0],"FLAG":0,"BASE":45} NX-SM112 {"NAME":"NX-SM112v3","GPIO":[0,0,0,0,2720,2656,0,0,576,32,2592,224,0,0],"FLAG":0,"BASE":45} NX-SM200 {"NAME":"NX-SM200","GPIO":[320,0,0,0,0,2720,0,0,224,32,2656,321,2624,0],"FLAG":0,"BASE":18} NX-SM210 {"NAME":"NX-SM210","GPIO":[0,32,0,0,0,0,0,0,0,320,224,0,0,0],"FLAG":0,"BASE":18} @@ -985,7 +1088,7 @@ SP201 Dual {"NAME":"SP-201","GPIO":[258,0,0,2624,32,2720,0,0,2 SPARKE JH-G01E 10A {"NAME":"SPARKE JH-G01E","GPIO":[0,0,0,0,288,0,0,0,224,32,0,0,0,0],"FLAG":0,"BASE":18} SPC Clever 6201B {"NAME":"SPC Clever Plu","GPIO":[32,0,0,0,0,0,0,0,0,320,224,0,0,0],"FLAG":0,"BASE":18} SS01 {"NAME":"Smart Plug SS0","GPIO":[1,1,1,1,1,1,0,0,224,32,1,1,1,4704],"FLAG":0,"BASE":18} -Steren SHOME-100 {"NAME":"SHOME-100 V1.0","GPIO":[0,0,0,0,0,320,0,0,224,32,0,0,0,0],"FLAG":0,"BASE":18} +Steren {"NAME":"SHOME-100 V1.0","GPIO":[0,0,0,0,0,320,0,0,224,32,0,0,0,0],"FLAG":0,"BASE":18} STITCH by Monoprice {"NAME":"Stitch 27937","GPIO":[32,0,320,0,2688,2656,0,0,2624,0,224,0,321,0],"FLAG":0,"BASE":18} STITCH by Monoprice {"NAME":"Stitch 35511","GPIO":[320,0,321,0,0,2688,0,0,0,32,2656,224,2624,0],"FLAG":0,"BASE":18} SuperNight Dual {"NAME":"SuperNight Dua","GPIO":[1,32,1,224,2656,2688,0,0,225,2592,322,1,1,4704],"FLAG":0,"BASE":18} @@ -995,8 +1098,10 @@ SWA1 UK {"NAME":"SWA1","GPIO":[0,0,0,0,288,224,0,0,0,32,0,0 SWA11 {"NAME":"SWA11","GPIO":[0,0,0,0,288,224,0,0,0,32,0,0,0,0],"FLAG":0,"BASE":18} SWA5 {"NAME":"Lingan SWA5","GPIO":[320,0,0,0,0,0,0,0,0,32,0,224,0,0],"FLAG":0,"BASE":18} SWA9 {"NAME":"SWA9","GPIO":[0,0,0,0,288,224,0,0,0,32,0,0,0,0],"FLAG":0,"BASE":18} -SwissTone SH 100 {"NAME":"SwissTone","GPIO":[0,0,0,0,320,321,0,0,224,32,0,0,0,0],"FLAG":0,"BASE":18} +SwissTone {"NAME":"SwissTone","GPIO":[0,0,0,0,320,321,0,0,224,32,0,0,0,0],"FLAG":0,"BASE":18} Sygonix SY-4276902 {"NAME":"SYGONIX","GPIO":[0,0,0,32,2688,2656,0,0,2624,288,224,0,0,0],"FLAG":0,"BASE":18} +Szshining {"NAME":"Szshining ITSP10-2","GPIO":[0,225,0,32,2720,2656,0,0,2624,0,224,0,0,0],"FLAG":0,"BASE":18} +Talo 10A {"NAME":"Talo smart plug","GPIO":[32,0,0,0,2720,2656,0,0,2624,320,224,0,0,0],"FLAG":0,"BASE":49} TanTan WP2 {"NAME":"TanTan WP2","GPIO":[321,320,576,1,224,2720,1,1,2624,32,2656,225,33,1],"FLAG":0,"BASE":18} TanTan WP3 {"NAME":"TanTan WP3","GPIO":[0,0,320,0,32,0,0,0,321,0,224,0,0,0],"FLAG":0,"BASE":18} TCP Smart 13A {"NAME":"TCP_Plug","GPIO":[0,0,0,0,288,224,0,0,0,32,0,0,0,0],"FLAG":0,"BASE":45} @@ -1015,7 +1120,7 @@ Timethinker C338 {"NAME":"C338","GPIO":[32,0,1,0,0,0,0,0,224,288,1,0 Timethinker TK04 {"NAME":"TimethinkerEU","GPIO":[1,1,1,1,32,1,0,0,1,288,224,1,0,0],"FLAG":0,"BASE":18} TimeThinker WS2 {"NAME":"TimeThinkerWS2","GPIO":[0,0,0,0,32,0,0,0,0,288,224,0,0,0],"FLAG":0,"BASE":18} TomaxUSA {"NAME":"HKWL-SO07W","GPIO":[32,1,1,1,1,1,0,0,1,1,224,1,320,0],"FLAG":0,"BASE":18} -Topersun WL-SC01 {"NAME":"Topersun ","GPIO":[0,0,0,0,288,0,0,0,224,0,32,0,0,0],"FLAG":0,"BASE":18} +Topersun {"NAME":"Topersun ","GPIO":[0,0,0,0,288,0,0,0,224,0,32,0,0,0],"FLAG":0,"BASE":18} TopGreener 10A {"NAME":"TGWF115PQM","GPIO":[0,320,0,32,2720,2656,0,0,2624,321,224,0,0,0],"FLAG":0,"BASE":18} TopGreener TGWF115APM {"NAME":"TGWF115APM","GPIO":[0,320,0,32,2720,2656,0,0,2624,321,224,0,0,0],"FLAG":0,"BASE":18} Torchstar LITEdge Smart {"NAME":"LITEdge Plug","GPIO":[0,32,0,0,0,0,0,0,0,288,224,0,0,0],"FLAG":0,"BASE":18} @@ -1024,6 +1129,7 @@ TP20 {"NAME":"TP20","GPIO":[0,0,0,32,0,0,0,0,0,320,224,0 TP24 {"NAME":"TP24","GPIO":[0,0,0,32,0,0,0,0,0,320,224,0,0,0],"FLAG":0,"BASE":18} U10 Series {"NAME":"WIFI-Socket","GPIO":[1,32,1,1,1,1,1,1,1,320,224,1,1,4704],"FLAG":0,"BASE":18} Ultralink UL-P01W {"NAME":"UL-P01W","GPIO":[0,288,0,32,2720,2656,0,0,2624,544,224,0,0,0],"FLAG":0,"BASE":18} +Upstone {"NAME":"UPSTONE","GPIO":[1,1,544,1,320,1,0,0,224,32,1,1,1,1],"FLAG":0,"BASE":18} US212 {"NAME":"US212","GPIO":[320,0,0,2624,0,2720,0,0,224,32,2656,225,0,0],"FLAG":0,"BASE":18} Varna Crafts 16A {"NAME":"VC Plug","GPIO":[544,0,0,0,0,2720,0,0,2624,32,2656,224,0,0],"FLAG":0,"BASE":45} Vaupan X6P {"NAME":"Vaupan 10a X6P","GPIO":[0,0,320,0,0,0,0,0,0,32,0,224,0,0],"FLAG":0,"BASE":18} @@ -1049,7 +1155,7 @@ WOOX R4785 {"NAME":"WOOXR4785","GPIO":[0,0,0,0,288,224,0,0,0,3 WOOX R5024 {"NAME":"WOOX5024","GPIO":[0,0,320,0,0,0,0,0,0,32,0,224,0,0],"FLAG":0,"BASE":18} WP211 {"NAME":"YUNTAB WP211","GPIO":[320,0,576,0,225,0,0,0,0,33,0,224,32,0],"FLAG":0,"BASE":18} WP5 {"NAME":"WP5","GPIO":[321,0,320,0,0,0,0,0,0,32,0,224,0,0],"FLAG":0,"BASE":18} -Wyze WLPP1 {"NAME":"WyzePlugWLPP1","GPIO":[0,0,0,0,0,320,0,0,224,0,32,0,0,0],"FLAG":0,"BASE":18} +Wyze {"NAME":"WyzePlugWLPP1","GPIO":[0,0,0,0,0,320,0,0,224,0,32,0,0,0],"FLAG":0,"BASE":18} Xenon SM-PW702-U {"NAME":"SM-PW702","GPIO":[0,0,0,0,321,320,0,0,224,32,0,0,0,0],"FLAG":0,"BASE":18} Xiaomi IMILAB ZNCZ05CM {"NAME":"Mi Smart Plug","GPIO":[32,0,0,0,320,224,0,0,0,576,0,0,0,0],"FLAG":0,"BASE":18} XS-A11 {"NAME":"THRUMM XS-A11","GPIO":[0,32,0,0,0,0,0,0,0,320,224,0,0,0],"FLAG":0,"BASE":18} @@ -1092,9 +1198,10 @@ AOFO 4AC + 4USB {"NAME":"AOFO C379 4AC+4USB UK ","GPIO":[0,576,0,32 AOFO 4AC+4USB {"NAME":"AOFO4AC4USB","GPIO":[0,320,0,32,225,224,0,0,226,227,228,0,0,0],"FLAG":0,"BASE":18} AOFO 4AC+4USB Tuya {"NAME":"AOFO-4AC-4USB","GPIO":[1,1,1,1,1,1,0,0,1,1,1,1,1,4704],"FLAG":0,"BASE":54} AOFO 4AC+4USB UK {"NAME":"AOFO4AC4USB-UK","GPIO":[0,320,0,32,226,227,0,0,225,224,260,0,0,0],"FLAG":0,"BASE":18} +Arlec 4 Outlet {"NAME":"Arlec PB4KSHA Powerboard","GPIO":[0,32,1,1,1,0,0,0,0,320,224,0,0,0],"FLAG":0,"BASE":12} Arlec Smart {"NAME":"Arlec PB88UHA","GPIO":[0,320,0,32,225,224,0,0,227,226,0,0,0,1],"FLAG":0,"BASE":18} +Arlec Smart {"NAME":"Arlec PB89HA","GPIO":[0,320,0,32,225,224,0,0,227,226,0,0,0,0],"FLAG":0,"BASE":18} Arlec Smart 3 Outlet Power Cube {"NAME":"Arlec Cube","GPIO":[0,32,0,0,0,0,0,0,0,320,224,0,0,0],"FLAG":0,"BASE":18} -Arlec Smart PB89HA {"NAME":"Arlec PB89HA","GPIO":[0,320,0,32,225,224,0,0,227,226,0,0,0,0],"FLAG":0,"BASE":18} Bauhn ASPBU-1019 {"NAME":"Bauhn 3AC+3USB","GPIO":[0,544,0,0,225,224,0,0,0,226,32,0,0,0],"FLAG":0,"BASE":18} BlitzWolf BW-SHP9 {"NAME":"BlitzWolf SHP9","GPIO":[576,1,0,1,0,226,0,0,224,32,225,227,0,0],"FLAG":0,"BASE":45} Brennenstuhl Connect Eco-Line {"NAME":"WS EL01 DE","GPIO":[34,33,0,32,224,225,0,0,288,0,0,289,576,0],"FLAG":0,"BASE":18} @@ -1102,9 +1209,11 @@ BrilliantSmart 20691 Powerboard with USB Chargers {"NAME":"B_WiFi-4","GPIO":[32 CE Smart Home {"NAME":"CE Power Strip","GPIO":[288,0,0,0,225,224,0,0,227,226,228,229,32,0],"FLAG":0,"BASE":18} CE Smart Home Garden Stake {"NAME":"CE Power Stake","GPIO":[0,0,0,0,320,321,0,0,224,32,0,0,0,0],"FLAG":0,"BASE":18} CRST LTS-4G-W {"NAME":"CRST LTS-4G-W","GPIO":[0,0,0,0,227,0,0,0,225,226,224,0,0,0],"FLAG":0,"BASE":18} +Curv 4 Plug {"NAME":"CURV","GPIO":[0,32,0,228,0,0,1,1,227,225,226,224,0,1],"FLAG":0,"BASE":18} Deltaco SH-P03USB {"NAME":"Deltaco SH-P03","GPIO":[320,0,0,0,0,226,0,0,224,32,225,227,0,0],"FLAG":0,"BASE":18} Digoo DG-PS01 {"NAME":"Digoo DG-PS01","GPIO":[0,320,0,32,226,225,0,0,0,227,224,0,0,4704],"FLAG":0,"BASE":18} Ener-J Extension Box with USB {"NAME":"ENER-J SHA5207","GPIO":[544,0,0,321,225,322,1,1,320,224,227,226,32,1],"FLAG":0,"BASE":18} +Forrinx 3AC 4USB {"NAME":"SH-20","GPIO":[0,320,0,321,225,224,0,0,32,226,227,0,0,0],"FLAG":0,"BASE":18} Geekbes 4AC+4USB {"NAME":"Geekbes 4xStri","GPIO":[0,320,0,32,225,224,0,0,226,227,228,0,0,4704],"FLAG":0,"BASE":18} Geeni Surge {"NAME":"Geeni GNCSW003","GPIO":[288,0,0,0,225,224,0,0,227,228,226,229,32,0],"FLAG":0,"BASE":18} Geeni Surge + Charge 2 USB {"NAME":"Geeni GN-SW023","GPIO":[288,0,0,0,225,224,0,0,226,227,228,0,32,0],"FLAG":0,"BASE":18} @@ -1114,8 +1223,9 @@ Globe 4 Outlet 2 USB {"NAME":"PowerBar","GPIO":[320,0,0,0,227,32,0,0,225 Gosund P1 {"NAME":"Gosund_P1","GPIO":[0,3072,544,3104,0,259,0,0,225,226,224,0,32,4704],"FLAG":0,"BASE":18} Gosund P2 {"NAME":"Gosund P2","GPIO":[0,0,544,0,0,259,0,0,224,225,226,0,32,0],"FLAG":0,"BASE":18} Gosund WP9 {"NAME":"Gosund WP9","GPIO":[320,291,290,289,0,224,0,0,226,227,225,0,32,0],"FLAG":0,"BASE":18} +Hama 4AC 4USB {"NAME":"HamaStrip","GPIO":[0,544,0,32,225,224,0,0,226,227,228,0,0,0],"FLAG":0,"BASE":18} Heyvalue 3AC+3USB {"NAME":"HeyvalueHLT-330","GPIO":[288,0,289,0,227,256,0,0,257,35,258,0,0,0],"FLAG":0,"BASE":18} -Heyvalue 4AC+4USB {"NAME":"Heyvalue HLT-331","GPIO":[321,0,576,320,259,32,0,0,257,258,256,0,228,0],"FLAG":0,"BASE":18} +Heyvalue 4AC+4USB {"NAME":"Heyvalue HLT-331","GPIO":[288,1,1,321,256,32,0,0,258,257,259,1,228,0],"FLAG":0,"BASE":18} HIPER IoT PS44 {"NAME":"HIPER IoT PS44","GPIO":[0,320,0,32,225,224,0,0,226,227,228,0,0,0],"FLAG":0,"BASE":18} HLT-333 {"NAME":"BEYAWL","GPIO":[0,0,320,227,0,0,0,0,0,257,256,258,0,0],"FLAG":0,"BASE":18} Home Awesome 4AC 4USB {"NAME":"Home Awesome","GPIO":[288,0,289,0,228,225,0,0,227,32,226,224,0,0],"FLAG":0,"BASE":18} @@ -1124,7 +1234,9 @@ Hyleton 330 {"NAME":"Hyleton-330","GPIO":[321,0,0,320,256,32,0, Hyleton 331 {"NAME":"HLT-331","GPIO":[288,1,1,321,256,32,0,0,258,257,259,1,322,0],"FLAG":0,"BASE":18} Hyleton 333 {"NAME":"HLT-333","GPIO":[288,0,0,321,256,32,0,0,258,257,0,0,227,0],"FLAG":0,"BASE":18} Hyleton 336 {"NAME":"HLT-336","GPIO":[288,0,0,321,256,32,0,0,258,257,0,0,259,0],"FLAG":0,"BASE":18} +Idinio 3AC 4USB {"NAME":"Idinio-140135","GPIO":[0,320,0,32,225,224,0,0,0,226,227,0,0,0],"FLAG":0,"BASE":18} Jinvoo 4AC+2USB {"NAME":"JINVOO Model SM-SO306-2A","GPIO":[320,0,0,0,259,32,0,0,257,258,256,0,228,0],"FLAG":0,"BASE":18} +KaBuM! Filtro de Linha {"NAME":"Kabum Power Strip","GPIO":[0,544,0,32,227,228,0,0,0,225,226,224,320,0],"FLAG":0,"BASE":18} KMC 5AC 3USB QC {"NAME":"KMC 5-Outlet","GPIO":[320,0,0,0,228,160,0,0,225,224,226,0,227,0],"FLAG":0,"BASE":18} Kogan Power Strip USB Ports & Energy Meter {"NAME":"Generic","GPIO":[64,320,0,227,2720,2656,0,0,2624,225,226,224,0,0],"FLAG":0,"BASE":18} Konesky Type 1 {"NAME":"Konesky","GPIO":[0,0,0,0,228,225,0,0,227,32,226,224,0,0],"FLAG":0,"BASE":18} @@ -1133,14 +1245,18 @@ Larkkey 4AC 4USB {"NAME":"LARKKEY Strip","GPIO":[0,544,0,32,225,224, LeFun SK2 {"NAME":"LeFun SK2","GPIO":[0,0,0,32,225,224,0,0,226,227,228,0,0,0],"FLAG":0,"BASE":18} Luminea 3AC+4USB 16A {"NAME":"Luminea-NX4473","GPIO":[0,320,0,32,225,224,0,0,0,226,227,0,0,0],"FLAG":0,"BASE":18} Maxcio ZLD-34EU-W {"NAME":"MAXCIO","GPIO":[0,320,0,32,225,224,0,0,0,226,227,0,0,4704],"FLAG":0,"BASE":18} +Merkury Innovations SmartSurge {"NAME":"Merkury MI-SW001","GPIO":[288,0,289,0,228,32,0,0,225,224,226,0,227,0],"FLAG":0,"BASE":18} +Meross 4AC 4USB {"NAME":"HamaStrip","GPIO":[0,544,0,32,225,224,0,0,226,227,228,0,0,0],"FLAG":0,"BASE":18} Meross MSS425 {"NAME":"Meross MSS425","GPIO":[260,0,0,0,320,0,0,0,224,32,225,226,259,0],"FLAG":0,"BASE":18} Mirabella Genio 4 Outlet Power Board with 2 USB {"NAME":"Genio i002340","GPIO":[320,0,0,0,224,225,0,0,226,32,227,228,0,0],"FLAG":0,"BASE":18} Mirabella Genio Powerboard {"NAME":"Genio Powerboa","GPIO":[224,288,0,0,226,225,0,0,228,32,229,227,0,0],"FLAG":0,"BASE":18} Nedis P310 {"NAME":"Nedis WIFIP310","GPIO":[0,320,0,32,225,224,0,0,0,226,227,0,0,4704],"FLAG":0,"BASE":18} Nozdom 3AC+2USB {"NAME":"NOZDOM SWB3","GPIO":[544,0,289,0,0,226,0,0,224,32,225,227,0,0],"FLAG":0,"BASE":18} +Powertech 4AC 2USB {"NAME":"Ptech MS6107","GPIO":[0,288,0,32,224,225,0,0,227,228,226,0,0,0],"FLAG":0,"BASE":18} Powrui AHR-079 {"NAME":"Powrui Power S","GPIO":[320,0,0,32,34,224,0,0,226,35,225,227,33,0],"FLAG":0,"BASE":18} Powrui AHR-081 {"NAME":"POWRUI AHR-081","GPIO":[0,0,0,0,320,32,0,0,225,226,224,0,0,0],"FLAG":0,"BASE":18} Powrui AW-39 {"NAME":"Powrui AW-39","GPIO":[320,0,0,0,224,1,0,0,226,227,225,0,160,0],"FLAG":0,"BASE":18} +POWSAV 5+5AC 4USB {"NAME":"POWSAV 5+5AC+4USB","GPIO":[320,0,0,32,224,225,0,0,228,0,227,226,0,0],"FLAG":0,"BASE":18} S2199EU {"NAME":"S2199EU","GPIO":[0,32,0,288,226,228,0,0,224,227,225,0,0,4704],"FLAG":0,"BASE":18} SA-P402A {"NAME":"SA-P402A","GPIO":[0,32,0,320,226,228,224,227,225,0,0,0,0,4704],"FLAG":0,"BASE":18} STITCH by Monoprice 4 AC, 2 Always-On USB {"NAME":"MP Stitch 34082","GPIO":[320,0,0,0,227,32,0,0,225,226,224,0,0,0],"FLAG":0,"BASE":18} @@ -1156,6 +1272,7 @@ Vivitar HA-1007 {"NAME":"Vivitar HA-1007 Power Strip","GPIO":[544,0 Vivitar HA-1007-AU {"NAME":"HA-1007-AU","GPIO":[320,32,0,322,256,321,0,0,258,257,259,0,228,0],"FLAG":0,"BASE":18} wesmartify essentials 4AC+4USB {"NAME":"essential_4_po","GPIO":[320,0,0,0,227,228,0,0,225,224,226,0,32,0],"FLAG":0,"BASE":18} Wipro Smart Extension {"NAME":"Generic","GPIO":[321,0,0,0,259,0,0,0,257,258,256,0,228,0],"FLAG":0,"BASE":18} +Wolf Armor 4AC 4USB {"NAME":"Wolf Armor SP26","GPIO":[0,320,0,32,227,226,0,0,224,228,225,0,0,0],"FLAG":0,"BASE":18} WOOX R4028 {"NAME":"WOOX R4028","GPIO":[0,320,0,32,226,225,0,0,0,227,224,0,0,4704],"FLAG":0,"BASE":18} WP40 {"NAME":"WP40","GPIO":[260,0,0,0,320,0,0,0,224,32,225,226,259,0],"FLAG":0,"BASE":18} Xenon SM-S0301 {"NAME":"SM-SO301","GPIO":[288,1,1,321,256,32,0,0,258,257,259,1,228,0],"FLAG":0,"BASE":18} @@ -1168,7 +1285,6 @@ XS-A34 {"NAME":"XS-A24","GPIO":[288,0,289,0,228,225,0,0,22 Yagala {"NAME":"Yagala","GPIO":[288,1,1,321,256,32,0,0,258,257,259,1,228,0],"FLAG":0,"BASE":18} Yagala SWB3 {"NAME":"YAGALA SWB3","GPIO":[544,0,289,0,0,226,0,0,224,32,225,227,0,0],"FLAG":0,"BASE":18} Yagala Z1 {"NAME":"YAGALA Z1","GPIO":[0,544,0,32,225,227,0,0,226,228,224,0,0,0],"FLAG":0,"BASE":18} -Yuanguo 4AC + 2 USB {"NAME":"YUANGUO","GPIO":[0,35,0,227,34,33,0,0,32,225,224,226,0,0],"FLAG":0,"BASE":1} Yuanguo 4AC+2USB {"NAME":"YUANGUO","GPIO":[164,35,0,227,34,33,0,0,32,225,224,226,544,0],"FLAG":0,"BASE":1} Zeoota 4AC 2USB {"NAME":"Zeoota WP30","GPIO":[0,32,0,227,0,0,0,0,0,225,224,226,0,4896],"FLAG":0,"BASE":18} Zeoota PS022 {"NAME":"ZEOOTA 3x plus","GPIO":[0,321,0,320,225,224,0,0,32,226,227,0,0,4704],"FLAG":0,"BASE":18} @@ -1205,8 +1321,10 @@ Aoycocr JL81 5W 400lm {"NAME":"AoycocrJLB1","GPIO":[0,0,0,0,418,0,0,0,417 Aoycocr Q10CWM BR30 9W 720lm {"NAME":"AoycocrBR30","GPIO":[0,0,0,0,0,418,0,0,417,0,416,419,0,0],"FLAG":0,"BASE":18} Arlec Smart 9.5W 806lm {"NAME":"Arlec RGBWW","GPIO":[0,0,0,0,416,419,0,0,417,420,418,0,0,0],"FLAG":0,"BASE":18} Arlec Smart 9.5W 806lm {"NAME":"Arlec RGBWW","GPIO":[0,0,0,0,416,419,0,0,417,420,418,0,0,0],"FLAG":0,"BASE":18} +Athom 15W 1400lm {"NAME":"Athom LB017W","GPIO":[0,0,0,0,416,419,0,0,417,452,418,0,0,0],"FLAG":0,"BASE":1} Athom 7W 600lm {"NAME":"Athom LB017W","GPIO":[0,0,0,0,416,419,0,0,417,420,418,0,0,0],"FLAG":0,"BASE":1} Aunics 7W 600lm {"NAME":"Aunics RGBW","GPIO":[0,0,0,0,416,419,0,0,417,420,418,0,0,0],"FLAG":0,"BASE":18} +Avatar 8W 800lm {"NAME":"Avatar 8W RGBCW","GPIO":[1,1,1,1,416,419,1,1,417,420,418,1,1,1],"FLAG":0,"BASE":18} Avatar ALB201W 720lm {"NAME":"AVATAR ALB201W","GPIO":[0,0,0,0,0,418,0,0,417,0,416,419,0,0],"FLAG":0,"BASE":18} Avatar ALS18L A60 800lm {"NAME":"Avatar E14 7W","GPIO":[0,0,0,0,417,416,0,0,420,418,419,0,0,0],"FLAG":0,"BASE":20} B.K. Licht 5.5W 350lm {"NAME":"BKL1262","GPIO":[0,0,0,0,417,416,0,0,420,418,419,0,0,0],"FLAG":0,"BASE":18} @@ -1217,6 +1335,7 @@ BlitzWolf w/ remote 850lm {"NAME":"BW-LT27","GPIO":[0,0,0,0,420,417,0,0,418,1 BNETA 8.5W 800lm {"NAME":"BNETA IO-WIFI60-E27P","GPIO":[0,0,0,0,416,419,0,0,417,452,418,0,0,0],"FLAG":0,"BASE":18} BNETA 8.5W 800lm {"NAME":"OM60/RGBW","GPIO":[0,0,0,0,2912,416,0,0,417,2976,2944,0,0,0],"FLAG":0,"BASE":18} Bomcosy 600lm {"NAME":"Generic","GPIO":[0,0,0,0,416,419,0,0,417,420,418,0,0,4704],"FLAG":0,"BASE":18} +Boxlood 9W 900lm {"NAME":"Boxlood 9w 900lm RGBCCT","GPIO":[0,0,0,0,416,419,0,0,417,420,418,0,0,0],"FLAG":0,"BASE":18} Calex 429004 A60 806lm {"NAME":"Calex E27 RGB ","GPIO":[0,0,0,0,416,419,0,0,417,420,418,0,0,0],"FLAG":0,"BASE":18} Calex 429008 B35 5W 470lm {"NAME":"Calex E14 RGBW","GPIO":[0,0,0,0,0,0,0,0,4064,0,4032,0,0,0],"FLAG":0,"BASE":18} Calex 5W 350lm Reflector {"NAME":"Calex RGBW","GPIO":[0,0,0,0,0,0,0,0,4064,0,4032,0,0,0],"FLAG":0,"BASE":18} @@ -1225,11 +1344,13 @@ CMARS 4W Reflector {"NAME":"RGBWW GU10","GPIO":[0,0,0,0,419,420,0,0,41 Connect SmartHome 5W GU5.3 {"NAME":"CSH-GU53RGB5W","GPIO":[0,0,0,0,419,420,0,0,417,418,416,0,0,0],"FLAG":0,"BASE":18} Diolamp E27 9W 800lm {"NAME":"Diolamp A609WIFI","GPIO":[0,0,0,0,4032,0,0,0,0,0,4064,0,0,0],"FLAG":0,"BASE":18} Dogain 320lm {"NAME":"DOGAIN","GPIO":[0,0,0,0,419,420,0,0,417,418,416,0,0,0],"FLAG":0,"BASE":18} +EKasa 10W+3W 1050lm {"NAME":"EKASA T710C-E27","GPIO":[0,0,0,0,416,419,0,0,417,452,418,0,0,0],"FLAG":0,"BASE":18} Emuni TB95 9W 850Lm {"NAME":"TB95","GPIO":[0,0,0,0,416,419,0,0,417,420,418,0,0,0],"FLAG":0,"BASE":18} Ener-J 800lm {"NAME":"ENER-J RGBWWW ","GPIO":[0,0,0,0,419,420,0,0,417,418,416,0,0,0],"FLAG":0,"BASE":18} Energizer 10W 800lm {"NAME":"OM100/RGBWW","GPIO":[0,0,0,0,416,419,0,0,417,420,418,0,0,0],"FLAG":0,"BASE":18} Enklen 7W 600lm {"NAME":"Enklen E27 7W RGBCW","GPIO":[0,0,0,0,416,419,0,0,417,420,418,0,0,0],"FLAG":0,"BASE":18} Euri Lighting 10W 800lm {"NAME":"Euri Lighting ","GPIO":[0,0,0,0,416,419,0,0,417,420,418,416,0,0],"FLAG":0,"BASE":18} +Extrastar 10w 1000lm {"NAME":"Extrastar","GPIO":[0,0,0,0,416,419,0,0,417,452,418,0,0,0],"FLAG":0,"BASE":18} EXUP C37 5W {"NAME":"EXUP","GPIO":[0,0,0,0,419,420,0,0,417,418,416,0,0,1],"FLAG":0,"BASE":18} Feit Electric A19 1600lm {"NAME":"OM100/RGBWW","GPIO":[0,0,0,0,416,419,0,0,417,420,418,0,0,0],"FLAG":0,"BASE":18} Feit Electric A19 800lm {"NAME":" BPA800/RGBW/AG/2","GPIO":[0,0,0,0,2912,416,0,0,417,2976,2944,0,0,0],"FLAG":0,"BASE":18} @@ -1267,6 +1388,7 @@ Ledmundo 6W 600lm {"NAME":"LEDMUNDO 6W","GPIO":[0,0,0,0,416,419,0,0,4 Legelite 5W Candle {"NAME":"Legelite E12","GPIO":[0,0,0,0,416,419,0,0,417,420,418,0,0,0],"FLAG":0,"BASE":18} Legelite A60 7W {"NAME":"Legelite A60 7","GPIO":[0,0,0,0,416,419,0,0,417,420,418,0,0,0],"FLAG":0,"BASE":18} Legelite A60 7W 600lm {"NAME":"Legelite E26","GPIO":[0,0,0,0,416,419,0,0,417,420,418,0,0,0],"FLAG":0,"BASE":18} +Lenovo 800lm {"NAME":"Lenovo SE-241EB","GPIO":[0,0,0,0,416,419,0,0,417,452,418,0,0,0],"FLAG":0,"BASE":18} Lohas ZN004 8W 680lm {"NAME":"Lohas B22 R63","GPIO":[0,0,0,0,417,416,0,0,420,418,419,0,0,0],"FLAG":0,"BASE":18} Lohas ZN011 5W 420lm {"NAME":"LohasZN011","GPIO":[0,0,0,0,417,416,0,0,420,418,419,0,0,0],"FLAG":0,"BASE":18} Lohas ZN014-2 5W 380lm {"NAME":"Lohas ZN014-2","GPIO":[0,0,0,0,417,416,0,0,420,418,419,0,0,0],"FLAG":0,"BASE":18} @@ -1278,9 +1400,10 @@ Lohas ZN037 450lm {"NAME":"Lohas LH-ZN037","GPIO":[0,0,0,0,417,416,0, Lohas ZN038 BR20 8W 750lm {"NAME":"Lohas LH-ZN038","GPIO":[0,0,0,0,417,416,0,0,420,418,419,0,0,0],"FLAG":0,"BASE":18} Lohas ZN039 BR40 1450lm {"NAME":"Lohas ZN039","GPIO":[0,0,0,0,418,416,0,0,420,417,419,0,0,0],"FLAG":0,"BASE":18} Lohas ZN041 BR30 12W 1080lm {"NAME":"Lohas ZN041","GPIO":[0,0,0,0,418,416,0,0,420,417,419,0,0,0],"FLAG":0,"BASE":18} -Longlifelamps A60 9W {"NAME":"longlifelamps A60 RGBWW","GPIO":[0,0,0,0,2912,416,0,0,417,2976,2944,0,0,0],"FLAG":0,"BASE":18} +Longlifelamps A60 9W {"NAME":"LongLifeLamp Nimble 10W","GPIO":[0,0,0,0,416,419,0,0,417,452,418,0,0,0],"FLAG":0,"BASE":18} Lumary 9W 800lm {"NAME":"Lumary / iLint","GPIO":[0,0,0,0,417,416,0,0,420,418,419,0,0,0],"FLAG":0,"BASE":18} Luminea 5.5W 470lm {"NAME":"Luminea ZX-2983","GPIO":[0,0,0,0,0,0,0,0,4064,0,4032,0,0,0],"FLAG":0,"BASE":18} +Luminea 9W 800lm {"NAME":"Luminea RGBW","GPIO":[0,0,0,0,416,419,0,0,417,420,418,0,0,0],"FLAG":0,"BASE":18} LVWIT A60 8.5W 806lm {"NAME":"LVWIT A60 8.5W","GPIO":[0,0,0,0,416,419,0,0,417,420,418,0,0,0],"FLAG":0,"BASE":18} LVWIT A70 12W 1521lm {"NAME":"LVWIT A70 12W","GPIO":[0,0,0,0,416,419,0,0,417,452,418,0,0,0],"FLAG":0,"BASE":18} LVWIT BR30 8.5W 650lm {"NAME":"LVWIT BR30 8.5W","GPIO":[0,0,0,0,416,419,0,0,417,420,418,0,0,0],"FLAG":0,"BASE":18} @@ -1290,20 +1413,19 @@ MagicHome 7W {"NAME":"MagicHome E27","GPIO":[0,0,0,0,416,419,0,0 Moes 9W 800lm {"NAME":"Moes 9w","GPIO":[0,0,0,0,416,419,0,0,417,420,418,0,0,0],"FLAG":0,"BASE":18} Nishica JBT 9W 806lm {"NAME":"Nishica","GPIO":[0,0,0,0,417,416,0,0,420,418,419,0,0,0],"FLAG":0,"BASE":18} Novostella 7W 600lm {"NAME":"Novostella E27","GPIO":[0,0,0,0,416,419,0,0,417,420,418,0,0,0],"FLAG":0,"BASE":18} -Novostella 7W 600lm {"NAME":"Novostella B22","GPIO":[0,0,0,0,416,420,0,0,417,419,418,0,0,0],"FLAG":0,"BASE":18} Novostella HM-LB09 13W 1300lm {"NAME":"Novostella 13W","GPIO":[0,0,0,0,416,419,0,0,417,420,418,0,0,0],"FLAG":0,"BASE":18} Novostella NTB10 9W 900lm {"NAME":"NTB10","GPIO":[0,0,0,0,420,417,0,0,418,1088,419,416,0,0],"FLAG":0,"BASE":18} Novostella UT55507 9W 900lm {"NAME":"Novostella UT55507","GPIO":[0,0,0,0,416,419,0,0,417,420,418,0,0,0],"FLAG":0,"BASE":18} -Novostella UT55507 9W 900lm {"NAME":"Novostella UT55507","GPIO":[0,0,0,0,416,419,0,0,417,420,418,0,0,0],"FLAG":0,"BASE":18} Novostella UT55508 12W 1150lm {"NAME":"Novostella","GPIO":[0,0,0,0,416,419,0,0,417,420,418,0,0,0],"FLAG":0,"BASE":18} Novostella UT55509 13W 1300lm {"NAME":"Novostella 13W","GPIO":[0,0,0,0,416,419,0,0,417,420,418,0,0,0],"FLAG":0,"BASE":18} Ohlux 5W 450lm Candle {"NAME":"OHLUX","GPIO":[0,0,0,0,416,419,0,0,417,420,418,0,0,0],"FLAG":0,"BASE":18} -Ohlux A19 7W 600lm {"NAME":"OHLUX","GPIO":[0,0,0,0,416,419,0,0,417,420,418,0,0,0],"FLAG":0,"BASE":18} +Ohlux A19 7W 600lm {"NAME":"OHLUX2021","GPIO":[0,0,0,0,416,419,0,0,417,420,418,0,0,0],"FLAG":0,"BASE":18} Ohlux BR30 10W 900lm {"NAME":"OHLUX","GPIO":[0,0,0,0,416,419,0,0,417,420,418,0,0,0],"FLAG":0,"BASE":18} oobest 7W {"NAME":"E27_RGBCW_Bulb","GPIO":[0,0,0,0,417,416,0,0,419,420,418,0,0,0],"FLAG":0,"BASE":18} PETEME 7.5W 750lm {"NAME":"PETEME","GPIO":[1,1,0,1,416,419,0,0,417,420,418,1,1,4896],"FLAG":0,"BASE":18} Polux 5.5W 400lm {"NAME":"Polux GU10","GPIO":[0,0,0,0,0,0,0,0,4064,0,4032,0,0,0],"FLAG":0,"BASE":18} Polux A65 11W 1055lm {"NAME":"A65 SMDWWCW+RG","GPIO":[0,0,0,0,416,419,0,0,417,420,418,0,0,0],"FLAG":0,"BASE":18} +Polux G45 5,5W 475lm {"NAME":"Polux G45 E14","GPIO":[0,0,0,0,0,0,0,0,4064,0,4032,0,0,0],"FLAG":0,"BASE":18} Positivo 10W 806lm {"NAME":"Positivo Bulb","GPIO":[0,0,0,0,416,419,0,0,417,452,418,0,0,0],"FLAG":0,"BASE":18} Powertech SL225X 800lm {"NAME":"Jaycar SL225X","GPIO":[0,0,0,0,416,419,0,0,417,420,418,0,0,0],"FLAG":0,"BASE":18} Qualitel ALS08L 1100lm {"NAME":"Qualitel ALS08","GPIO":[0,0,0,0,416,419,0,0,417,420,418,0,0,0],"FLAG":0,"BASE":18} @@ -1317,7 +1439,10 @@ Slitinto TB95 9W 1000lm {"NAME":"Slitinto 9W","GPIO":[0,0,0,0,416,419,0,0,4 Smart 9W 800lm {"NAME":"SmartLED ","GPIO":[0,0,0,0,420,417,0,0,418,0,419,416,0,0],"FLAG":0,"BASE":18} SmartLED 9W 400lm {"NAME":"SmartLED","GPIO":[0,0,0,0,416,419,0,0,417,420,418,0,0,0],"FLAG":0,"BASE":18} Sonoff B1 (R2) {"NAME":"Sonoff B1","GPIO":[32,0,0,0,0,0,0,0,3008,0,3040,0,0,0],"FLAG":0,"BASE":26} +Spectrum Smart 13W 1500lm {"NAME":"LED 13W E-27 Spectrum SMART","GPIO":[0,0,0,0,416,419,0,0,417,452,418,0,0,0],"FLAG":0,"BASE":18} Spectrum Smart GLS 9W 850lm {"NAME":"SPECTR. RGBCCT","GPIO":[0,0,0,0,0,0,0,0,4064,0,4032,0,0,0],"FLAG":0,"BASE":18} +Spectrum Smart GU10 5W 480lm {"NAME":"SPECTR. RGBCCT","GPIO":[0,0,0,0,0,0,0,0,4064,0,4032,0,0,0],"FLAG":0,"BASE":18} +Steren 10W 800lm {"NAME":"Steren_SHOME-120_RGBCCT","GPIO":[0,0,0,0,416,419,0,0,417,452,418,0,0,0],"FLAG":0,"BASE":18} Sunco G25 5W 450lm {"NAME":"Sunco G25","GPIO":[0,0,0,0,417,416,0,0,420,418,419,0,0,0],"FLAG":0,"BASE":18} Sunco PAR20 5W 400lm {"NAME":"Sunco PAR20","GPIO":[0,0,0,0,417,416,0,0,420,418,419,0,0,0],"FLAG":0,"BASE":18} Sunco PAR38 13W 1050lm {"NAME":"Sunco PAR38 RGBCCT","GPIO":[0,0,0,0,417,416,0,0,419,418,420,0,0,0],"FLAG":0,"BASE":18} @@ -1326,13 +1451,13 @@ Teckin SB50 v3 A19 800lm {"NAME":"Teckin SB50v3","GPIO":[0,0,0,0,416,419,0,0 Teckin SB53 1300lm {"NAME":"Teckin SB53","GPIO":[0,0,0,0,416,419,0,0,417,420,418,0,0,0],"FLAG":0,"BASE":18} Treatlife A19 8W 650lm {"NAME":"Treatlife RGBW","GPIO":[0,0,0,0,417,416,0,0,420,418,419,0,0,0],"FLAG":0,"BASE":18} V-TAC 10W 806lm {"NAME":"V-TAC VT-5119","GPIO":[0,0,0,0,4032,0,0,0,0,0,4064,0,0,0],"FLAG":0,"BASE":18} -V-Tac PAR16 4.5W 400lm 100° {"NAME":"V-TAC VT5164","GPIO":[0,0,0,0,0,0,0,0,4064,0,4032,0,0,0],"FLAG":0,"BASE":18} +V-Tac PAR16 4.5W 400lm 100 {"NAME":"V-TAC VT5164","GPIO":[0,0,0,0,0,0,0,0,4064,0,4032,0,0,0],"FLAG":0,"BASE":18} Vizia 5W GU10 {"NAME":"Vizia RGBWW","GPIO":[0,0,0,0,419,420,0,0,417,418,416,0,0,1],"FLAG":0,"BASE":18} Wipro Garnet 9W 810lm {"NAME":"Wipro","GPIO":[0,0,0,0,416,419,0,0,417,420,418,0,0,0],"FLAG":0,"BASE":18} WiZ BR30 13.8W 750lm {"NAME":"WiZ RGBCCT PAR30","GPIO":[0,0,0,0,419,0,0,0,417,420,418,416,0,0],"FLAG":0,"BASE":48} +Xtricity A19 10W 800lm {"NAME":"XTRICITY A19 10W 800LM RGBCCT BULB","GPIO":[0,0,0,0,416,419,0,0,417,452,418,2304,2272,0],"FLAG":0,"BASE":48} Zemismart 5W 480lm {"NAME":"Zemismart 5W","GPIO":[0,0,0,0,416,419,0,0,417,420,418,0,0,0],"FLAG":0,"BASE":18} Zemismart 5W 480lm {"NAME":"Zemismart-E27-RGBCW","GPIO":[0,0,0,0,416,419,0,0,417,420,418,0,0,0],"FLAG":0,"BASE":18} -Zemismart 5W 480lm {"NAME":"Zemismart-E27-RGBCW","GPIO":[0,0,0,0,416,419,0,0,417,420,418,0,0,0],"FLAG":0,"BASE":18} ZZHXON 600lm {"NAME":"E27_RGB_Bulb","GPIO":[0,0,0,0,419,420,0,0,417,418,416,0,0,0],"FLAG":0,"BASE":18} ``` @@ -1382,6 +1507,7 @@ EleLight 350lm {"NAME":"EleLight 7wA19","GPIO":[0,0,0,0,2912,416,0 Esicoo 810lm {"NAME":"Esicoo Bulb","GPIO":[0,0,0,0,3008,3040,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":27} Eurolux A70 10W {"NAME":"Eurolux A70 RG","GPIO":[0,0,0,0,2912,416,0,0,417,2976,2944,0,0,4704],"FLAG":0,"BASE":18} Fcmila 10W {"NAME":"FCMILA LED E27","GPIO":[0,0,0,0,419,0,0,0,417,418,416,0,0,0],"FLAG":0,"BASE":18} +Fcmila 15W 1050lm {"NAME":"FCMILA B22 15W","GPIO":[0,0,0,0,419,0,0,0,417,418,416,0,0,0],"FLAG":0,"BASE":18} Fcmila 7W {"NAME":"FCMILA E27 0.1","GPIO":[0,0,0,0,416,419,0,0,417,0,418,0,0,0],"FLAG":0,"BASE":18} Fcmila Spotlight 460lm {"NAME":"Fcmila LED 6W","GPIO":[0,0,0,0,419,0,0,0,417,418,416,0,0,0],"FLAG":0,"BASE":18} Feit Electric BR30 650lm {"NAME":"BR30/RGBW","GPIO":[0,0,0,0,2912,416,0,0,417,2976,2944,0,0,0],"FLAG":0,"BASE":18} @@ -1391,6 +1517,7 @@ Fulighture RGBW 15W {"NAME":"Fulighture RGBW 15W","GPIO":[0,0,0,0,0,0,0 Garsent 10W {"NAME":"Garsent 10W RGBW-Bulb","GPIO":[0,0,0,0,0,418,0,0,417,0,416,419,0,4704],"FLAG":0,"BASE":18} Geeni Prisma Drop BR30 700lm {"NAME":"GN-BW906-999","GPIO":[0,0,0,0,2912,416,0,0,0,2976,2944,0,0,0],"FLAG":0,"BASE":18} Generic GU10 5W 450lm {"NAME":"RGBCW GU10","GPIO":[0,1,0,1,419,0,0,0,417,418,416,0,0,0],"FLAG":0,"BASE":3} +Gosund 800lm {"NAME":"Gosund WB4","GPIO":[0,0,0,0,419,0,0,0,416,417,418,0,420,0],"FLAG":0,"BASE":18} Gosund 8W 800lm {"NAME":"Gosund RGBW 8W","GPIO":[0,0,0,0,420,419,0,0,416,417,418,0,0,0],"FLAG":0,"BASE":18} Gosund WB3 8W 800lm {"NAME":"Gosund WB3","GPIO":[0,0,0,0,419,0,0,0,416,417,418,0,0,0],"FLAG":0,"BASE":18} Hama 10W 1050lm {"NAME":"Hama Bulb RGBW","GPIO":[0,0,0,0,2912,416,0,0,0,2976,2944,0,0,0],"FLAG":0,"BASE":18} @@ -1405,7 +1532,7 @@ Kainsy 600lm {"NAME":"KAINSY","GPIO":[32,0,0,0,3008,3040,0,0,0,0 Kkmoon 9W 800lm {"NAME":"KKMOON V21","GPIO":[0,0,0,0,419,0,0,0,417,418,416,0,0,0],"FLAG":0,"BASE":18} Koaanw 650lm {"NAME":"KOAANW Bulb","GPIO":[0,0,0,0,3008,3040,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":27} Kogan 10W Ambient 1050lm {"NAME":"Kogan RGB","GPIO":[0,0,0,0,2912,416,0,0,0,0,2944,0,0,0],"FLAG":0,"BASE":18} -Kogan 4.5W 330lm 110° {"NAME":"Kogan_GU10","GPIO":[0,0,0,0,418,419,0,0,416,0,417,0,0,0],"FLAG":0,"BASE":18} +Kogan 4.5W 330lm 110 {"NAME":"Kogan_GU10","GPIO":[0,0,0,0,418,419,0,0,416,0,417,0,0,0],"FLAG":0,"BASE":18} Kogan Ambient Candle {"NAME":"Kogan_E14","GPIO":[0,0,0,0,416,419,0,0,417,0,418,0,0,0],"FLAG":0,"BASE":18} Kuled 800lm {"NAME":"KULED 60W RGB","GPIO":[0,0,0,0,418,419,0,0,416,0,417,0,0,4704],"FLAG":0,"BASE":18} Laideyi 7W {"NAME":"7W-E14-RGBW-La","GPIO":[0,0,0,0,417,416,0,0,418,0,419,0,0,0],"FLAG":0,"BASE":18} @@ -1433,6 +1560,7 @@ Luminea ZX-2832 {"NAME":"Luminea RGBW","GPIO":[0,0,0,0,2912,416,0,0 Luminea ZX-2986 1400lm {"NAME":"Luminea RGBW","GPIO":[0,0,0,0,416,420,0,0,0,417,418,419,0,0],"FLAG":0,"BASE":18} LWE3 600lm {"NAME":"Linganzh LWE3 ","GPIO":[0,0,0,0,0,417,0,0,418,0,419,416,0,0],"FLAG":0,"BASE":18} MagicLight 4.5W 350lm {"NAME":"4.5W RGBW Bulb","GPIO":[0,0,0,0,0,416,0,0,418,419,417,0,0,0],"FLAG":0,"BASE":18} +Malmbergs G95 8,5W 810lm {"NAME":"Malmbergs8,5W-RGBW","GPIO":[0,0,0,0,416,419,0,0,417,0,418,0,0,0],"FLAG":0,"BASE":18} Manzoku XS-001 1050lm {"NAME":"Manzoku RGBW","GPIO":[0,0,0,0,419,0,0,0,417,418,416,0,0,0],"FLAG":0,"BASE":18} Maxcio YX-L01P-E27-2P 9W {"NAME":"Maxcio YXL01P","GPIO":[32,0,0,0,3008,3040,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":27} Melery 5W {"NAME":"MeleryMR16","GPIO":[0,0,0,0,0,0,0,0,0,3008,0,3040,0,0],"FLAG":0,"BASE":27} @@ -1447,7 +1575,7 @@ Mimoodz A19 6.5W {"NAME":"Miimoodz RGBCW LED","GPIO":[0,0,0,0,4032,0 Mirabella Genio 9W 800lm {"NAME":"GenioBulbRGB","GPIO":[0,0,0,0,416,419,0,0,417,0,418,0,0,0],"FLAG":0,"BASE":18} Mirabella Genio 9W 800lm {"NAME":"MiraBellaGenio","GPIO":[0,0,0,0,0,0,0,0,4064,0,4032,0,0,0],"FLAG":0,"BASE":18} Mirabella Genio 9W 800lm {"NAME":"MiraBellaGenio","GPIO":[0,0,0,0,0,0,0,0,4064,0,4032,0,0,0],"FLAG":0,"BASE":18} -Mixigoo 950lm {"NAME":"Mixigoo Bulb","GPIO":[0,0,0,0,416,419,0,0,417,0,418,0,0,0],"FLAG":0,"BASE":18} +Mixigoo 950lm {"NAME":"Mixigoo Bulb RGBCCT","GPIO":[0,0,0,0,416,419,0,0,417,420,418,0,0,0],"FLAG":0,"BASE":18} MoKo GU10 {"NAME":"MoKo GU10","GPIO":[1,1,1,1,418,1,1,1,417,420,416,419,1,1],"FLAG":0,"BASE":18} MoKo JL81 5W 400lm {"NAME":"MoKo E14","GPIO":[0,0,0,0,0,0,0,0,3008,0,3040,0,0,0],"FLAG":0,"BASE":27} MOKO YX-L01C-E14 A60 810lm {"NAME":"MOKO","GPIO":[32,0,0,0,3008,3040,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":27} @@ -1472,8 +1600,9 @@ Smartyfi 600lm {"NAME":"SMARTYFI 9W","GPIO":[0,0,0,0,416,419,0,0,4 Smitch 7W {"NAME":"Smitch RGB 7W SB-1602","GPIO":[0,0,0,0,416,419,0,0,417,420,418,0,0,0],"FLAG":0,"BASE":18} Solimo 12W {"NAME":"Solimo RGBCCT 12","GPIO":[0,0,0,0,416,420,0,0,417,419,418,0,0,0],"FLAG":0,"BASE":18} Solimo 810lm {"NAME":"Solimo RGBWW 9","GPIO":[0,0,0,0,416,419,0,0,417,420,418,0,0,0],"FLAG":0,"BASE":18} -Swisstone SH 320 350lm {"NAME":"SH 320","GPIO":[0,0,0,0,416,419,0,0,417,0,418,0,0,0],"FLAG":0,"BASE":18} -Swisstone SH 340 806lm {"NAME":"SH 340","GPIO":[0,0,0,0,2912,416,0,0,0,2976,2944,0,0,1],"FLAG":0,"BASE":18} +Swisstone 350lm {"NAME":"SH 320","GPIO":[0,0,0,0,416,419,0,0,417,0,418,0,0,0],"FLAG":0,"BASE":18} +SwissTone 4.5W 380lm {"NAME":"SH 360","GPIO":[0,0,0,0,2912,416,0,0,0,2976,2944,0,0,1],"FLAG":0,"BASE":18} +Swisstone 806lm {"NAME":"SH 340","GPIO":[0,0,0,0,2912,416,0,0,0,2976,2944,0,0,1],"FLAG":0,"BASE":18} Syska 7W 480lm {"NAME":"Syska","GPIO":[0,0,0,0,416,419,0,0,417,420,418,0,0,0],"FLAG":0,"BASE":18} Syska 9W 720lm {"NAME":"SyskaSmartBulb","GPIO":[0,0,0,0,416,419,0,0,417,0,418,0,0,0],"FLAG":0,"BASE":18} TCP Smart 9W 806lm {"NAME":"TCP Smart RGBW","GPIO":[0,0,0,0,2912,416,0,0,417,2976,2944,0,0,0],"FLAG":0,"BASE":18} @@ -1494,6 +1623,7 @@ WOOX R4553 650lm {"NAME":"WOOX R4553","GPIO":[0,0,0,0,416,419,0,0,41 WOOX R5076 4W 350lm {"NAME":"WOOX R4553","GPIO":[0,0,0,0,416,419,0,0,417,0,418,0,0,0],"FLAG":0,"BASE":18} WOOX R5077 {"NAME":"WOOX R5077","GPIO":[0,0,0,0,2912,416,0,0,417,2976,2944,0,0,0],"FLAG":0,"BASE":18} Zemismart 5W {"NAME":"Zemismart_GU10","GPIO":[0,0,0,0,0,0,0,0,0,3008,0,3040,0,0],"FLAG":0,"BASE":27} +Zemismart 5W 480lm {"NAME":"Zemismart-E14-RGBW","GPIO":[0,0,0,0,0,0,0,0,0,3008,0,3040,0,0],"FLAG":0,"BASE":27} Zemismart A19 10W {"NAME":"Zemism_E27_A19","GPIO":[0,0,0,0,0,0,0,0,0,3008,0,3040,0,0],"FLAG":0,"BASE":27} Zilotek A19 800lm {"NAME":"Zilotek RGBW","GPIO":[0,0,0,0,2912,416,0,0,417,2976,2944,0,0,0],"FLAG":0,"BASE":18} ``` @@ -1503,15 +1633,18 @@ Zilotek A19 800lm {"NAME":"Zilotek RGBW","GPIO":[0,0,0,0,2912,416,0,0 Anmbest 2 Channel Inching Self-locking Switch Module {"NAME":"Generic","GPIO":[32,1,1,1,1,225,33,0,224,320,0,0,0,0],"FLAG":0,"BASE":1} Athom 10A {"NAME":"Athom CB0110A","GPIO":[0,0,0,0,320,0,0,0,224,32,0,0,0,0],"FLAG":0,"BASE":1} BH OnOfre Dual Rev5 Silent Edition {"NAME":"bhonofre","GPIO":[0,0,0,0,225,224,0,0,160,161,0,0,0,0],"FLAG":0,"BASE":18} +Claudy 5V {"NAME":"CLAUDY","GPIO":[0,0,225,0,0,0,0,0,0,0,0,224,0,0],"FLAG":0,"BASE":18} DoHome HomeKit DIY Switch {"NAME":"DoHome DIY","GPIO":[1,1,0,1,1,544,0,0,224,0,0,0,0,0],"FLAG":0,"BASE":1} Eachen ST-DC2 {"NAME":"Garage Control","GPIO":[162,0,0,0,226,225,33,0,224,288,163,227,0,4704],"FLAG":0,"BASE":18} Eachen ST-DC4 {"NAME":"Eachen_ST-DC4","GPIO":[160,1,1,1,226,225,1,1,224,544,1,227,1,0],"FLAG":0,"BASE":54} Eachen ST-UDC1 {"NAME":"ST-UDC1","GPIO":[160,0,0,0,0,0,0,0,224,320,0,0,0,4704],"FLAG":0,"BASE":18} Electrodragon Board SPDT {"NAME":"ED Relay Board","GPIO":[1,1,1,1,1,1,0,0,224,225,1,1,288,4704],"FLAG":0,"BASE":18} Electrodragon ESP8266 {"NAME":"ElectroDragon","GPIO":[33,1,32,1,1,1,0,0,225,224,1,1,288,4704],"FLAG":0,"BASE":15} +eMylo Single Channel Switch {"NAME":"eMylo XL9251WI","GPIO":[0,1,0,0,320,0,0,0,224,0,35,0,0,0],"FLAG":0,"BASE":18} Ener-J Outdoor Switch {"NAME":"Ener-J Smart WiFi Outdoor Relay","GPIO":[32,0,0,0,0,0,0,0,224,544,0,0,0,0],"FLAG":0,"BASE":18} ESP-01 Relay V4.0 {"NAME":"ESP01v4","GPIO":[256,288,0,0,0,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":18} ESP-01S 5V Relay Module V1.0 {"NAME":"ESP-01S Relay","GPIO":[256,288,1,1,0,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":18} +ESP-12F 4 Channel {"NAME":"ESP12F_Relay_X4","GPIO":[1,1,1,1,1,1,1,1,226,227,225,1,224,1],"FLAG":0,"BASE":18} ESP12F 220V 10A 7V-30V DC {"NAME":"Yunshan 10A","GPIO":[32,1,288,1,224,161,0,0,225,0,0,0,0,0],"FLAG":0,"BASE":18} Geekcreit 5V DIY 4 Channel Jog Inching Self-Locking {"NAME":"Geekcreit-4ch","GPIO":[160,0,0,0,226,225,161,162,224,288,163,227,0,0],"FLAG":0,"BASE":18} Geekcreit Module 220V 10A {"NAME":"DIY ESP8266 Re","GPIO":[0,0,544,0,224,32,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":18} @@ -1526,8 +1659,11 @@ LinkNode R4 {"NAME":"LinkNode R4","GPIO":[0,0,0,0,0,0,0,0,224,2 LinkNode R8 {"NAME":"LinkNode R8","GPIO":[0,0,0,0,228,229,0,231,226,227,225,230,224,0],"FLAG":0,"BASE":18} LoveAnna AC85-250V 10A {"NAME":"2xSwitch No RF LoveAnna","GPIO":[32,0,0,0,0,225,33,0,224,320,0,0,0,0],"FLAG":0,"BASE":18} Mhcozy 5V {"NAME":"Portail","GPIO":[160,0,0,0,0,0,0,0,224,320,0,0,0,4704],"FLAG":0,"BASE":18} +Milfra Smart Module {"NAME":"Milfra Smart Module TB41","GPIO":[0,0,0,225,0,0,0,0,0,193,480,224,192,0],"FLAG":0,"BASE":18} Sinilink DC6V-36V Module {"NAME":"Sinilink XY-WF5V","GPIO":[0,0,0,0,224,1,0,0,32,288,0,0,1,0],"FLAG":0,"BASE":18} Sinilink MOS {"NAME":"Sinilink MOS","GPIO":[0,0,0,0,224,1,0,0,32,288,0,0,1,0],"FLAG":0,"BASE":18} +Sinotimer DIN {"NAME":"Sinotimer TM60","GPIO":[0,0,0,0,0,288,0,0,224,160,0,0,0,0],"FLAG":0,"BASE":18} +Sinotimer Single Phase Digital Timer {"NAME":"TM608","GPIO":[32,0,0,0,2720,2656,0,0,2624,320,224,0,0,0],"FLAG":0,"BASE":18} Sonoff 1 Channel Inching/Self-Locking {"NAME":"1 Channel","GPIO":[32,0,0,0,0,0,0,0,224,320,0,0,0,0],"FLAG":0,"BASE":12} Sonoff RE5V1C 5V Inching/Selflock {"NAME":"Sonoff RE5V1C","GPIO":[32,1,1,1,1,1,0,0,224,320,0,0,0,0],"FLAG":0,"BASE":18} Sonoff SV {"NAME":"Sonoff SV","GPIO":[32,1,0,1,1,1,0,0,224,320,1,0,0,4704],"FLAG":0,"BASE":3} @@ -1537,6 +1673,7 @@ Sonoff SV {"NAME":"Sonoff SV","GPIO":[32,1,0,1,1,1,0,0,224,32 ``` Nedis Smoke Detector {"NAME":"Nedis Smoke","GPIO":[0,2272,0,2304,0,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":54} Smoke Alarm {"NAME":"YG400A","GPIO":[1,2272,1,2304,1,1,0,0,1,1,1,1,1,0],"FLAG":0,"BASE":54} +VisorTech {"NAME":"VisorTech RWM-200","GPIO":[0,2272,0,2304,0,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":54} ``` ## Switch @@ -1545,7 +1682,7 @@ Smoke Alarm {"NAME":"YG400A","GPIO":[1,2272,1,2304,1,1,0,0,1,1, 3A Smart Home {"NAME":"3A Smart Home ","GPIO":[288,0,291,33,225,34,0,0,32,224,290,226,289,0],"FLAG":0,"BASE":18} AGL 2 Gang {"NAME":"AGL WiFi 02","GPIO":[0,0,544,0,0,33,0,0,225,224,0,0,32,0],"FLAG":0,"BASE":18} AGL 3 Gang {"NAME":"AGL WiFi 03","GPIO":[0,0,544,0,34,33,0,0,225,224,226,0,32,0],"FLAG":0,"BASE":18} -AGL Módulo Relé 01 Canal {"NAME":"AGL-Basic","GPIO":[0,1,0,0,224,32,0,0,0,0,320,0,0,0],"FLAG":0,"BASE":18} +AGL Modulo Relay 01 Canal {"NAME":"AGL-Basic","GPIO":[0,1,0,0,224,32,0,0,0,0,320,0,0,0],"FLAG":0,"BASE":18} Albohes 2 Channel {"NAME":"Albohes SH-08","GPIO":[0,3200,33,3232,321,320,0,0,224,544,32,0,225,1],"FLAG":0,"BASE":18} Aoycocr SW1 {"NAME":"Aoycocr SW1","GPIO":[576,1,321,1,1,1,1,1,320,32,1,224,1,1],"FLAG":0,"BASE":18} Athom 1 Gang {"NAME":"Athom SW011EU","GPIO":[576,0,0,32,0,0,0,0,0,224,288,0,0,0],"FLAG":0,"BASE":1} @@ -1554,6 +1691,11 @@ Athom 1 Gang No Neutral {"NAME":"Athom SW111EU","GPIO":[576,0,0,32,0,0,0,0, Athom 2 Gang {"NAME":"Athom SW012EU","GPIO":[576,289,0,32,225,33,0,0,0,224,288,0,0,0],"FLAG":0,"BASE":1} Athom 2 Gang {"NAME":"Athom SW032US","GPIO":[576,289,0,32,225,33,0,0,0,224,288,0,0,0],"FLAG":0,"BASE":1} Athom 2 Gang No Neutral {"NAME":"Athom SW112EU","GPIO":[576,289,0,32,225,33,0,0,0,224,288,0,0,0],"FLAG":0,"BASE":1} +Athom 3 Gang Key {"NAME":"Athom SW01-TAS-3EU","GPIO":[576,290,1,33,225,34,0,0,32,224,289,226,288,0],"FLAG":0,"BASE":18} +Athom 3 Gang Touch {"NAME":"Athom SW03-TAS-3US","GPIO":[576,290,0,33,225,34,0,0,32,224,289,226,288,0],"FLAG":0,"BASE":18} +Athom 3 Gang Touch {"NAME":"Athom SW11-TAS-3EU","GPIO":[576,290,1,33,225,34,0,0,32,224,289,226,288,0],"FLAG":0,"BASE":18} +Athom 4 Gang Touch {"NAME":"Athom SW03-TAS-4US","GPIO":[576,0,0,33,225,34,0,0,32,224,227,226,35,0],"FLAG":0,"BASE":18} +Athom 4 Gang Touch {"NAME":"Athom SW11-TAS-4EU","GPIO":[576,0,0,33,225,34,0,0,32,224,227,226,35,0],"FLAG":0,"BASE":18} Athom US Key Switch 1 Gang {"NAME":"Athom SW13","GPIO":[576,0,0,32,0,0,0,0,0,224,288,0,0,0],"FLAG":0,"BASE":1} ATMS1601 230VAC DIN Timer/Switch {"NAME":"ATMS1601","GPIO":[1,1,1,1,544,320,1,1,224,32,1,1,1,1],"FLAG":0,"BASE":18} Avatto 1 Gang {"NAME":"AVATTO 1 Gang","GPIO":[0,320,576,0,0,32,0,0,320,0,0,224,0,0],"FLAG":0,"BASE":18} @@ -1570,13 +1712,14 @@ BlitzWolf BW-SS1 {"NAME":"BW-SS1","GPIO":[1,1,1,1,544,224,0,0,1,32,1 BlitzWolf BW-SS3 1 Gang {"NAME":"BW-SS3-1G-EU","GPIO":[288,0,0,32,0,0,0,0,0,224,0,0,0,0],"FLAG":0,"BASE":18} BlitzWolf BW-SS3 2 Gang {"NAME":"BW-SS3-2G-EU","GPIO":[544,1,1,1,225,33,1,1,32,224,1,1,1,1],"FLAG":0,"BASE":18} BlitzWolf BW-SS3 3 Gang {"NAME":"BlitzWolf SS3","GPIO":[576,0,0,161,225,162,0,0,160,224,0,226,0,0],"FLAG":0,"BASE":18} -BlitzWolf BW-SS5 1 Gang {"NAME":"BlitzWolf SS5 1 Gang","GPIO":[0,0,0,0,0,0,0,0,160,224,0,0,0,0],"FLAG":0,"BASE":18} +BlitzWolf BW-SS5 1 Gang {"NAME":"BlitzWolf SS5 1 Gang","GPIO":[0,0,0,0,288,0,0,0,160,224,0,0,0,0],"FLAG":0,"BASE":18} BlitzWolf BW-SS5 2 Gang {"NAME":"BlitzWolf SS5 2 Gang","GPIO":[0,0,32,0,480,0,0,0,161,160,224,225,0,0],"FLAG":0,"BASE":18} BlitzWolf SS4 {"NAME":"BlitzWolf SS4 Two Gang","GPIO":[0,0,0,0,320,224,0,0,225,32,0,0,0,0],"FLAG":0,"BASE":18} BSEED 2 Gang 1 Way {"NAME":"BSEED Switch 2Ch","GPIO":[0,0,0,33,225,0,0,0,32,224,0,288,289,0],"FLAG":0,"BASE":18} Canwing CW-001 {"NAME":"Canwing CW-001","GPIO":[32,1,0,1,0,0,0,0,224,320,0,0,0,0],"FLAG":0,"BASE":1} CD303 3 Gang Touch {"NAME":"Touch Switch 3","GPIO":[290,321,1,34,226,33,1,1,32,224,1,225,288,1],"FLAG":0,"BASE":18} Century Aoke Smart Switch {"NAME":"CenturyAoke","GPIO":[0,1,0,1,224,0,0,0,32,320,1,0,0,0],"FLAG":0,"BASE":18} +Cinlinele 4 Gang {"NAME":"Cinlinele","GPIO":[0,2272,0,2304,0,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":54} Connect SmartHome 2 Gang Wall {"NAME":"CSH-SWTCH2","GPIO":[0,0,288,0,0,33,0,0,225,224,0,0,32,0],"FLAG":0,"BASE":18} Deta 1 Gang {"NAME":"Deta 1G Switch","GPIO":[0,0,0,0,544,0,0,0,0,224,0,0,64,0],"FLAG":0,"BASE":18} Deta 2 Gang {"NAME":"DETA 2G Switch","GPIO":[0,0,0,0,544,0,0,0,65,224,225,0,64,0],"FLAG":0,"BASE":18} @@ -1585,8 +1728,11 @@ Deta 4 Gang {"NAME":"Deta 4G Switch","GPIO":[576,0,0,34,33,224, Deta 6000HA Smart Inline Switch {"NAME":"DETA-6000HA","GPIO":[0,32,0,0,0,0,0,0,0,320,224,0,0,0],"FLAG":0,"BASE":18} Deta Fan Speed Controller with Light {"NAME":"Deta Fan Speed and Light Controller","GPIO":[33,0,0,544,226,34,0,0,0,225,224,227,32,0],"FLAG":0,"BASE":18} dewenwils Outdoor Timer Box {"NAME":"Dewenwils50054","GPIO":[0,0,290,0,0,0,0,0,0,32,0,224,0,0],"FLAG":0,"BASE":18} +Dierya Touch Panel 2 Gang {"NAME":"CD301","GPIO":[0,0,0,0,544,320,0,0,224,32,0,0,0,0],"FLAG":0,"BASE":18} +Dierya Touch Panel 2 Gang {"NAME":"CD302","GPIO":[544,0,0,33,225,0,0,0,32,224,321,0,320,0],"FLAG":0,"BASE":18} +Dierya Touch Panel 3 Gang {"NAME":"CD303","GPIO":[576,289,0,34,226,33,0,0,32,224,290,225,288,0],"FLAG":0,"BASE":18} Digoo DG-S811 3 Gang {"NAME":"DIGOO Switch","GPIO":[0,0,0,0,34,33,0,0,225,224,226,0,32,0],"FLAG":0,"BASE":18} -DS-101 1 Gang {"NAME":"Smart Life Switch","GPIO":[0,0,0,0,0,32,0,0,0,0,0,224,288,0],"FLAG":0,"BASE":18} +DS-101 1 Gang {"NAME":"Smart Life Switch","GPIO":[0,0,0,32,0,0,0,0,0,224,288,0,0,0],"FLAG":0,"BASE":18} DS-101 2 Gang {"NAME":"Smart Life Switch","GPIO":[576,289,0,32,225,33,0,0,0,224,288,0,0],"FLAG":0,"BASE":18} DS-101 3 Gang {"NAME":"DS-101 3 gang","GPIO":[576,322,0,33,226,34,0,0,32,225,321,224,320,0],"FLAG":0,"BASE":18} DS-101 4 Gang Switch {"NAME":"DS-101 4 Gang","GPIO":[544,0,0,33,225,34,0,0,32,224,227,226,35,0],"FLAG":0,"BASE":18} @@ -1607,11 +1753,11 @@ Etekcity ESWL03 3-way {"NAME":"Etekcity 3Way","GPIO":[0,0,0,0,226,256,0,0 Eva Logik 3-Way {"NAME":"WF30 Switch","GPIO":[0,0,0,0,33,0,0,0,224,32,0,0,0,0],"FLAG":0,"BASE":18} EX Store 2 Kanal V5 {"NAME":"EXS Relay V5","GPIO":[1,1,1,1,1,1,0,0,224,225,258,288,259,0],"FLAG":0,"BASE":16} FrankEver 4 Gang {"NAME":"FrankEver Wifi Smart Switch","GPIO":[0,0,0,32,224,33,1,1,34,226,227,225,35,0],"FLAG":0,"BASE":18} -Freecube AWS01F {"NAME":"Freecube","GPIO":[0,0,0,32,224,0,0,0,0,0,225,0,0,0],"FLAG":0,"BASE":18} -Garage Door Controller {"NAME":"Garage Opener","GPIO":[0,2272,0,2304,0,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":54} +Freecube {"NAME":"Freecube","GPIO":[288,0,289,0,0,0,0,0,290,32,0,224,0,0],"FLAG":0,"BASE":18} Geekcreit 2 Channel AC 85V-250V {"NAME":"Geekcreit 2ch","GPIO":[32,0,0,0,0,225,33,0,224,288,0,0,0,4704],"FLAG":0,"BASE":18} Geeni TAP 3-Way {"NAME":"Geeni 3-Way","GPIO":[544,0,0,0,0,0,0,0,32,224,0,0,0,0],"FLAG":0,"BASE":18} Generic 2 Gang {"NAME":"KING-Tuya-key","GPIO":[0,0,0,0,0,225,0,0,224,32,0,0,33,0],"FLAG":0,"BASE":18} +Girier 3 Gang Touch {"NAME":"Girier JR-DES01","GPIO":[576,290,0,32,225,34,0,0,33,224,288,226,288,0],"FLAG":0,"BASE":18} Girier EK01 RF433Mhz 1 Gang {"NAME":"Girier EK01","GPIO":[544,0,0,0,224,0,0,0,0,0,0,0,32,0],"FLAG":0,"BASE":18} Girier EK02 RF433Mhz 2 Gang {"NAME":"Girier EK02","GPIO":[544,0,0,0,0,32,0,0,33,224,225,0,0,0],"FLAG":0,"BASE":18} Girier EK03 RF433Mhz 3 Gang {"NAME":"EK03","GPIO":[544,0,0,0,225,32,0,0,34,224,226,0,33,0],"FLAG":0,"BASE":18} @@ -1622,7 +1768,10 @@ Girier RF433 2 Gang No Neutral {"NAME":"W602","GPIO":[0,0,0,0,225,0,0,0,32,224, Girier RF433 3 Gang No Neutral {"NAME":"W603","GPIO":[0,0,0,0,226,33,0,0,32,224,34,225,544,1],"FLAG":0,"BASE":18} Gocomma Wi-Fi Smart Switch {"NAME":"GoCommaSmartSw","GPIO":[32,1,1,1,224,0,0,0,1,320,0,0,0,0],"FLAG":0,"BASE":18} GoKlug Glass Touch 1 Gang {"NAME":"GoKlug 1x","GPIO":[320,321,0,0,0,160,0,0,0,0,0,224,0,0],"FLAG":0,"BASE":18} +GoKlug Glass Touch 2 Gang {"NAME":"GoKlug 2x","GPIO":[576,0,0,193,224,0,0,0,320,225,321,0,192,1],"FLAG":0,"BASE":18} +Gosund 2 Gang {"NAME":"GosundSW9","GPIO":[160,0,0,0,0,161,0,0,225,288,224,0,0,0],"FLAG":0,"BASE":18} Gosund KS-602S {"NAME":"Gosund KS-602S-v2","GPIO":[32,0,321,0,0,0,0,0,0,0,224,0,288,0],"FLAG":0,"BASE":18} +Gosund Single Pole {"NAME":"Gosund SW5","GPIO":[32,0,320,0,0,0,0,0,0,0,224,0,576,0],"FLAG":0,"BASE":18} Gosund SW1 {"NAME":"Gosund SW1","GPIO":[32,0,321,0,0,0,0,0,0,0,224,0,320,0],"FLAG":0,"BASE":18} Gosund SW6 3-Way {"NAME":"Gosund SW6","GPIO":[32,0,320,0,160,0,0,0,0,0,225,224,576,0],"FLAG":0,"BASE":18} Hama Flush-mounted 2 Gang {"NAME":"Hama WiFiTouch","GPIO":[544,0,0,0,0,33,0,0,32,225,0,224,0,0],"FLAG":0,"BASE":45} @@ -1635,6 +1784,7 @@ iSwitch Light & Fan {"NAME":"iSwitchOZ Light Fan","GPIO":[0,2272,0,2304 Jinvoo SM-SW101-1 {"NAME":"SM-SW101-1","GPIO":[288,0,0,33,0,0,0,0,32,224,0,0,0,4704],"FLAG":0,"BASE":18} Jinvoo SM-SW101-2 {"NAME":"SM-SW101-2","GPIO":[288,0,0,33,225,0,0,0,32,224,0,0,0,4704],"FLAG":0,"BASE":18} Jinvoo SM-SW101-3 {"NAME":"Jinvoo Wall Sw","GPIO":[288,0,0,33,225,34,0,0,32,224,0,226,0,4704],"FLAG":0,"BASE":18} +KingArt 1 Gang {"NAME":"KING-Tuya-key","GPIO":[0,0,0,0,0,0,0,0,224,32,0,0,0,0],"FLAG":0,"BASE":18} KMC 70008 {"NAME":"KMC 70008","GPIO":[32,1,1,0,0,1,0,0,0,320,224,1,1,0],"FLAG":0,"BASE":18} Koaanw CD302-EU-1 {"NAME":"CD302-EU-1","GPIO":[0,0,0,0,544,320,0,0,224,32,0,0,0,0],"FLAG":0,"BASE":18} Koaanw CD302-EU-2 {"NAME":"CD302-EU-2","GPIO":[544,0,0,0,0,33,0,0,32,224,321,225,320,0],"FLAG":0,"BASE":18} @@ -1649,11 +1799,12 @@ Kuled KS602S {"NAME":"KULED","GPIO":[32,1,1,1,1,1,0,0,224,320,1, Kygne CD-301 {"NAME":"KYGNE Touch","GPIO":[0,0,0,0,288,289,0,0,224,32,0,0,0,0],"FLAG":0,"BASE":10} L-5A01 {"NAME":"L-5A01","GPIO":[32,1,0,1,0,0,0,0,224,320,0,0,0,0],"FLAG":0,"BASE":1} Laghten SS02S {"NAME":"Laghten SS02S","GPIO":[0,0,0,0,288,321,0,0,224,32,0,0,0,0],"FLAG":0,"BASE":18} +Lanbon L8 5 in 1 LCD Touch "Not available" LCARE Modular 2 Gang {"NAME":"2SW1-In","GPIO":[32,1,1,1,0,225,33,0,224,320,0,0,0,0],"FLAG":0,"BASE":29} LerLink 1 Gang No Neutral {"NAME":"LerLink X801-L","GPIO":[0,0,0,0,32,0,0,0,224,320,0,0,0,1],"FLAG":0,"BASE":18} Lerlink 2 Gang {"NAME":"Lerlink X802A","GPIO":[0,0,0,33,32,0,0,0,224,288,225,0,0,0],"FLAG":0,"BASE":18} LerLink 2 Gang No Neutral {"NAME":"Lonsonho 2gang","GPIO":[0,0,0,33,32,0,0,0,224,288,225,0,0,0],"FLAG":0,"BASE":18} -Lerlink 3 Gang {"NAME":"X803A","GPIO":[0,0,0,33,32,34,0,0,224,256,225,226,0,0],"FLAG":0,"BASE":18} +Lerlink 3 Gang {"NAME":"X803A","GPIO":[0,0,320,33,32,34,0,0,224,0,225,226,0,0],"FLAG":0,"BASE":18} Lerlink 3 Gang No Neutral {"NAME":"X803K-L 3 Gang","GPIO":[0,0,320,0,32,34,33,0,224,0,225,226,0,0],"FLAG":0,"BASE":18} Lightstory WT02S {"NAME":"WT02S","GPIO":[0,0,0,0,321,320,0,0,224,32,0,0,0,0],"FLAG":0,"BASE":50} Lonsonho SK3-01 {"NAME":"Tuya 1 Channel","GPIO":[0,0,0,0,0,32,0,0,0,0,0,224,288,0],"FLAG":0,"BASE":18} @@ -1669,16 +1820,17 @@ LX-WIFI-00M 4 Gang {"NAME":"LX-WIFI-00M","GPIO":[32,228,1,1,226,225,33 MakeGood 2 Gang {"NAME":"MakeGood 2 Gang","GPIO":[0,0,0,0,0,0,0,0,0,0,290,0,0,0],"FLAG":0,"BASE":54} MakeGood 4 Gang {"NAME":"MakeGood 4 Gang","GPIO":[0,0,0,0,0,0,0,0,0,0,290,0,0,0],"FLAG":0,"BASE":54} Markevina KS-602S {"NAME":"Markevina KS-6","GPIO":[32,1,0,1,0,0,0,0,224,288,0,0,0,0],"FLAG":0,"BASE":18} -Martin Jerry S01 15A {"NAME":"MJ-S01 Switch","GPIO":[0,0,0,0,320,321,0,0,224,32,0,0,0,0],"FLAG":0,"BASE":18} +Martin Jerry S01 15A {"NAME":"MJ-S01 Switch","GPIO":[0,0,0,0,320,321,0,0,224,32,0,0,0],"FLAG":0,"BASE":18} Martin Jerry ST01 3 Way {"NAME":"MJ 3Way Switch","GPIO":[1,1,1,1,288,289,0,0,224,160,544,1,0,0],"FLAG":0,"BASE":18} Merkury MI-WW107-199W {"NAME":"MI-WW107-199W","GPIO":[288,0,0,0,0,0,0,0,32,224,0,0,0,0],"FLAG":0,"BASE":18} Micmi K38 {"NAME":"KS-605","GPIO":[32,0,0,0,0,0,0,0,224,576,0,0,0,0],"FLAG":0,"BASE":18} +Milfra 3 Gang {"NAME":"Milfra TB23","GPIO":[320,320,289,290,34,33,0,0,225,224,226,0,32,0],"FLAG":0,"BASE":8} Minitiger 1 Gang {"NAME":"minitiger 1 Gang","GPIO":[32,1,1,1,0,0,0,0,224,320,0,0,0,0],"FLAG":0,"BASE":28} Minitiger 1 Gang v2 {"NAME":"MiniTiger1BandNoNeutral","GPIO":[0,320,0,0,0,32,0,0,224,0,0,0,0,0],"FLAG":0,"BASE":18} Minitiger 2 Gang {"NAME":"minitiger 2 Gang","GPIO":[32,1,1,1,0,225,33,0,224,320,0,0,0,0],"FLAG":0,"BASE":28} Minitiger 2 Gang No Neutral {"NAME":"Tuya 2 Gang (Ali.Minitiger))","GPIO":[544,289,0,32,225,33,0,0,0,224,288,0,0,0],"FLAG":0,"BASE":1} Minitiger 2 Gang v2 {"NAME":"Minitiger2Band","GPIO":[0,320,0,32,33,0,0,0,0,224,225,0,0,0],"FLAG":0,"BASE":18} -Minitiger 3 Gang {"NAME":"Minitiger3gang","GPIO":[0,0,0,160,162,161,1,1,225,224,226,0,0,0],"FLAG":0,"BASE":18} +Minitiger 3 Gang {"NAME":"Minitiger3Band","GPIO":[0,288,0,32,34,33,0,0,225,224,226,289,0,0],"FLAG":0,"BASE":18} Minitiger 4 Gang {"NAME":"Minitiger 4 Gang","GPIO":[32,0,0,0,226,225,33,34,224,576,35,227,0,0],"FLAG":0,"BASE":18} Moes 2 Gang {"NAME":"Moes WS-EU2-W","GPIO":[544,0,289,0,0,33,0,0,32,224,0,225,288,1],"FLAG":0,"BASE":18} Moes 2-Way Multi-Control 1 Gang {"NAME":"Moes WS-EU-SK1-W","GPIO":[544,0,0,32,224,0,0,0,0,0,288,0,0,1],"FLAG":0,"BASE":18} @@ -1687,6 +1839,7 @@ Moes 3-Way {"NAME":"Moes 3-Way","GPIO":[1,1,1,1,224,321,0,0,25 Moes BS-US-W Boiler {"NAME":"BS-US-W","GPIO":[290,0,0,32,224,0,0,0,0,0,288,0,291,0],"FLAG":0,"BASE":18} Moes MS-104B-1 {"NAME":"Moes MS-104B","GPIO":[0,0,32,0,480,0,0,0,161,160,224,225,0,0],"FLAG":0,"BASE":18} Moes RF433 2 Gang Switch {"NAME":"WS-EUB2-WR","GPIO":[0,2272,0,2304,0,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":54} +Moes RF433 3 Gang {"NAME":"WS-EUB3-WR","GPIO":[0,2272,0,2304,0,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":54} Moes SS01S-1 {"NAME":"Moes Switch","GPIO":[1,1,1,1,320,0,0,0,224,32,1,1,1,0],"FLAG":0,"BASE":18} Moes WF-FL01 Light and Fan {"NAME":"Moes WF-FL01","GPIO":[0,2272,0,2304,0,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":54} Moes WS-EU1-LB 1 Gang No Neutral {"NAME":"Moes WS-EU1-LB","GPIO":[0,0,0,0,0,32,0,0,0,0,0,224,544,0],"FLAG":0,"BASE":18} @@ -1699,9 +1852,10 @@ Moes WS-US1-W 1 Gang {"NAME":"WS-US1-W","GPIO":[290,0,0,32,224,0,0,0,0,0 Moes WS-US2-W 2 Gang {"NAME":"WS-US2-W ","GPIO":[288,0,289,0,0,33,0,0,32,224,0,225,290,0],"FLAG":0,"BASE":18} Moes WS-US3-W 3 Gang {"NAME":"Tuya Moes 3 Ch","GPIO":[544,0,290,33,225,34,0,0,32,224,289,226,288,0],"FLAG":0,"BASE":18} Moes WT02S {"NAME":"Moes WT02S","GPIO":[0,0,0,0,320,576,0,0,224,160,0,0,0,1],"FLAG":0,"BASE":18} -MoesHouse RF433 3 Gang {"NAME":"WS-EUB3-WR","GPIO":[0,2272,0,2304,0,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":54} MoKo Scene Life {"NAME":"Moko Smart Swi","GPIO":[576,0,0,0,418,417,0,0,320,0,416,224,0,0],"FLAG":0,"BASE":18} MoKo Smart Life {"NAME":"Moko Switch (Single)","GPIO":[544,0,0,32,224,0,0,0,0,0,320,0,0,0],"FLAG":0,"BASE":59} +MoKo Smart Life Double {"NAME":"Moko Switch (Double)","GPIO":[544,0,321,0,0,33,0,0,32,224,0,225,320,0],"FLAG":0,"BASE":59} +MoKo Smart Life Triple {"NAME":"Moko Switch (Triple)","GPIO":[544,0,322,33,225,34,0,0,32,224,321,226,320,0],"FLAG":0,"BASE":59} NaamaSmart KS602 {"NAME":"KS-602","GPIO":[32,0,0,0,0,0,0,0,224,576,0,0,0,0],"FLAG":0,"BASE":18} Nedis Dual {"NAME":"SM-SW102U-2","GPIO":[576,0,0,33,225,0,0,0,32,224,0,0,0,4704],"FLAG":0,"BASE":18} Nexete DS-123 {"NAME":"DS-123","GPIO":[544,321,1,32,224,33,0,0,1,225,320,1,1,0],"FLAG":0,"BASE":18} @@ -1726,6 +1880,8 @@ Semicom LM-HP/GEVD-W {"NAME":"WaterHeater","GPIO":[576,320,0,0,0,32,0,0, Sesoo WIFI-EU-SK3-01 {"NAME":"Sensoo SK3-01","GPIO":[1,1,321,1,1,32,0,0,1,1,1,224,288,0],"FLAG":0,"BASE":18} Sesoo WIFI-EU-SK3-02 {"NAME":"Sesoo SK3-02","GPIO":[0,0,321,0,225,0,0,0,32,224,33,0,288,0],"FLAG":0,"BASE":18} Sesoo WIFI-US-SK3-04 {"NAME":"Tuya 4 Channel","GPIO":[288,1,1,34,226,32,0,0,35,227,225,224,33,0],"FLAG":0,"BASE":18} +Shawader 1Ch Touch Light {"NAME":"ShawaderTuya1C","GPIO":[0,0,0,0,0,32,0,0,0,0,0,224,288,0],"FLAG":0,"BASE":18} +Shawader 2Ch Touch Light {"NAME":"ShawaderTuya2C","GPIO":[0,0,0,0,224,0,0,0,33,225,32,0,288,0],"FLAG":0,"BASE":18} Shelly 1 {"NAME":"Shelly 1","GPIO":[0,0,0,0,224,192,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":46} Shelly 1L No Neutral {"NAME":"Shelly 1L","GPIO":[320,0,0,0,192,224,0,0,0,0,193,0,0,4736],"FLAG":0,"BASE":18} Shelly 1PM {"NAME":"Shelly 1PM","GPIO":[320,0,0,0,192,2720,0,0,0,0,0,224,0,4736],"FLAG":0,"BASE":18} @@ -1749,7 +1905,7 @@ Sonoff Dual {"NAME":"Sonoff Dual","GPIO":[0,3200,0,3232,1,0,0,0 Sonoff Dual R2 {"NAME":"Sonoff Dual R2","GPIO":[1,1,0,1,0,225,1,32,224,320,0,0,0,0],"FLAG":0,"BASE":39} Sonoff IW101 {"NAME":"Sonoff IW101","GPIO":[32,3072,0,3104,0,0,0,0,224,544,0,0,0,0],"FLAG":0,"BASE":41} Sonoff Mini {"NAME":"Sonoff Mini","GPIO":[32,0,0,0,160,0,0,0,224,320,0,0,1,0],"FLAG":0,"BASE":1} -Sonoff MINIR2 {"NAME":"Sonoff MINIR2","GPIO":[32,0,0,0,160,0,0,0,224,320,0,0,1,0],"FLAG":0,"BASE":1} +Sonoff MINIR2 {"NAME":"Sonoff MINIR2","GPIO":[32,0,0,0,160,0,0,0,224,320,0,0,0,0],"FLAG":0,"BASE":1} Sonoff Pow {"NAME":"Sonoff Pow","GPIO":[32,0,0,0,0,2592,0,0,224,2656,2688,288,0,0],"FLAG":0,"BASE":6} Sonoff Pow R2 {"NAME":"Sonoff Pow R2","GPIO":[32,3072,0,3104,0,0,0,0,224,320,0,0,0,0],"FLAG":0,"BASE":43} Sonoff RF {"NAME":"Sonoff RF","GPIO":[32,1,1,1,1,0,0,0,224,320,1,0,0,0],"FLAG":0,"BASE":2} @@ -1766,6 +1922,7 @@ Sonoff Touch EU {"NAME":"Sonoff Touch","GPIO":[32,1,0,1,0,0,0,0,224 Sonoff Touch US {"NAME":"Sonoff Touch","GPIO":[32,1,0,1,0,0,0,0,224,320,0,0,0,0],"FLAG":0,"BASE":10} Sonoff TX T0 EU 1 Gang {"NAME":"Sonoff T0 TX 1CH","GPIO":[32,1,1,1,0,0,0,0,224,320,0,0,0,0],"FLAG":0,"BASE":28} Sonoff TX T0 EU 2 Gang {"NAME":"Sonoff T0 2CH","GPIO":[32,1,1,1,0,225,33,0,224,320,0,0,0,0],"FLAG":0,"BASE":29} +Sonoff TX T0 US 3 Gang {"NAME":"TX T0US3C","GPIO":[32,1,0,1,226,225,33,34,224,576,0,0,0,0],"FLAG":0,"BASE":30} Sonoff TX T1 EU 1 Gang {"NAME":"Sonoff T1 TX 1CH","GPIO":[32,1,1,1,0,0,0,0,224,320,0,0,0,0],"FLAG":0,"BASE":28} Sonoff TX T1 EU 2 Gang {"NAME":"Sonoff T1 TX 2CH","GPIO":[32,1,1,1,0,225,33,0,224,320,0,0,0,0],"FLAG":0,"BASE":29} Sonoff TX T2 EU 1 Gang {"NAME":"Sonoff T2 TX 1CH","GPIO":[32,1,1,1,0,0,0,0,224,320,0,0,0,0],"FLAG":0,"BASE":28} @@ -1784,23 +1941,28 @@ SS118-01K1 {"NAME":"SS118-01K1","GPIO":[1,1,1,32,224,1,0,0,1,1 SS311KWS RF Kinetic Switch and WiFi {"NAME":"SS311KWS","GPIO":[0,0,0,0,288,0,0,0,224,32,0,0,0,0],"FLAG":0,"BASE":18} SS86-AI 3-Gang {"NAME":"SS86-AI 3 Gang","GPIO":[544,0,322,33,225,34,0,0,32,224,321,226,320,0],"FLAG":0,"BASE":18} SSMS118-01A1 Scene Light Smart {"NAME":"RGB Switch","GPIO":[257,0,259,161,418,417,0,0,258,160,416,224,0,0],"FLAG":0,"BASE":18} +Steren Apagador {"NAME":"SHOME-115","GPIO":[32,0,0,0,0,0,0,0,224,320,0,0,0,0],"FLAG":0,"BASE":18} +Steren Apagador Doble {"NAME":"STEREN SHOME-116","GPIO":[0,0,288,0,0,32,0,0,224,225,0,0,33,0],"FLAG":0,"BASE":18} +Steren Apagador Triple {"NAME":"STEREN SHOME-117","GPIO":[0,0,288,0,34,32,0,0,224,225,226,0,33,0],"FLAG":0,"BASE":18} STITCH by Monoprice {"NAME":"Tuya WF15S ","GPIO":[1,1,0,0,1,1,0,0,1,2304,1,2272,0,0],"FLAG":0,"BASE":54} SUPLA inCan by Espablo {"NAME":"Supla Espablo","GPIO":[0,1,1312,1,32,224,0,0,1,225,1,0,288,4704],"FLAG":0,"BASE":31} SW-R03 {"NAME":"SW-R03","GPIO":[0,0,0,0,0,0,0,0,224,32,0,0,0,0],"FLAG":0,"BASE":18} +Switch Module 2x5A {"NAME":"QS-WIFI-S04-2C","GPIO":[1,1,32,1,480,0,0,0,161,160,224,225,0,0],"FLAG":0,"BASE":18} TCP Smart 1 Gang {"NAME":"TCP 1 Gang 1 Way","GPIO":[544,0,0,32,224,0,0,0,0,0,320,0,0,0],"FLAG":0,"BASE":18} Teckin 2 Gang {"NAME":"Teckin SR43","GPIO":[0,0,288,0,0,32,0,0,224,225,0,0,33,0],"FLAG":0,"BASE":18} Teckin SR-41 Single Pole {"NAME":"Teckin SR-41","GPIO":[32,0,0,0,0,0,0,0,224,576,0,0,0,0],"FLAG":0,"BASE":18} Teekar 10 Way 1 Gang {"NAME":"Teekar 10way","GPIO":[160,161,162,35,164,165,0,0,166,167,0,0,0,0],"FLAG":0,"BASE":18} Teekar Wi-Fi Light 1 Gang {"NAME":"TeeKar Touch","GPIO":[0,0,1,0,1,224,0,0,0,1,32,0,1,0],"FLAG":0,"BASE":18} Teepao Smart-Rollladen-Schalter {"NAME":"Teepao","GPIO":[576,322,226,33,225,34,0,0,320,224,321,0,32,0],"FLAG":0,"BASE":18} +Tellur 1 Port 1800W 10A {"NAME":"Tellur 1CH","GPIO":[0,0,0,0,0,32,0,0,0,0,0,224,544,0],"FLAG":0,"BASE":18} +Tellur 2 Ports 1800W 10A {"NAME":"Tellur 2CH","GPIO":[0,0,0,0,225,0,0,0,32,224,33,0,544,0],"FLAG":0,"BASE":18} Tonbux AMZ180648-2 {"NAME":"Tonbux","GPIO":[32,1,1,1,1,0,0,0,224,320,1,0,0,0],"FLAG":0,"BASE":1} TopGreener TGWF15S {"NAME":"TopGreener-Switch","GPIO":[0,0,0,0,0,0,0,0,0,2304,0,2272,0,0],"FLAG":0,"BASE":54} -Touch 2 Gang {"NAME":"tuya_2_gang","GPIO":[288,0,0,0,33,0,0,0,32,224,1,225,256,0],"FLAG":0,"BASE":18} Touch 3 Gang {"NAME":"Switch 3-Gang","GPIO":[0,0,0,0,226,33,0,0,32,224,34,225,544,0],"FLAG":0,"BASE":18} +TreatLife 3-Way {"NAME":"Treatlife 3-Way","GPIO":[0,0,0,0,224,576,0,0,225,33,160,0,0,0],"FLAG":0,"BASE":18} Treatlife SS01 3-Way {"NAME":"Treatlife SS01 3-Way","GPIO":[0,0,0,0,224,576,0,0,225,33,160,0,0,0],"FLAG":0,"BASE":18} TreatLife SS01S {"NAME":"TL SS01S Swtch","GPIO":[0,0,0,0,288,576,0,0,224,32,0,0,0,0],"FLAG":0,"BASE":18} -TreatLife SS02 3-Way {"NAME":"TreatLife 3Way","GPIO":[0,0,0,0,289,256,0,0,257,33,160,0,0,0],"FLAG":0,"BASE":18} -TreatLife SS02S {"NAME":"Treatlife SS02","GPIO":[0,0,0,0,289,0,0,0,224,32,0,0,0,0],"FLAG":0,"BASE":18} +TreatLife SS02S {"NAME":"Treatlife SS02","GPIO":[0,0,0,0,288,576,0,0,224,32,0,0,0,0],"FLAG":0,"BASE":18} Tuya 3 Gang {"NAME":"KING-Tuya-key","GPIO":[0,0,0,0,226,225,0,0,224,32,34,0,33,0],"FLAG":0,"BASE":18} TY-US-L1-W {"NAME":"TY-US-L1-W","GPIO":[0,0,0,0,0,32,0,0,0,224,0,0,576,0],"FLAG":0,"BASE":18} TY-US-L3-W {"NAME":"TY-US-L3-W","GPIO":[0,0,0,0,224,33,0,0,34,226,32,225,576,1],"FLAG":0,"BASE":18} @@ -1849,7 +2011,7 @@ Shelly Add-on {"NAME":"Shelly 1 Temp ","GPIO":[1344,0,0,1312,224, ## Valve ``` Garden Water Timer BQ05 {"NAME":"BQ05","GPIO":[32,0,0,0,0,0,0,0,224,544,0,0,0,4704],"FLAG":0,"BASE":18} -Hoenyzy DN20 3/4 {"NAME":"DN20 Valve","GPIO":[0,0,0,0,0,0,0,0,32,224,0,0,0,0],"FLAG":0,"BASE":18} +Hoenyzy DN20 3/4 {"NAME":"DN20 Valve","GPIO":[288,0,0,0,0,0,0,0,32,224,0,0,0,0],"FLAG":0,"BASE":18} Jinvoo SM-AW713 {"NAME":"Jinvoo Valve","GPIO":[0,0,0,0,0,288,0,0,224,32,0,0,0,0],"FLAG":0,"BASE":18} Jinvoo SM-PW713 {"NAME":"Jinvoo Valve","GPIO":[0,0,0,0,224,288,0,0,32,289,0,0,0,4704],"FLAG":0,"BASE":18} Moes Gas-Water {"NAME":"MoesHouse WV-B","GPIO":[0,0,0,0,0,0,0,0,32,224,0,0,0,0],"FLAG":0,"BASE":18} @@ -1865,6 +2027,7 @@ BlitzWolf SHP8 {"NAME":"SHP8","GPIO":[0,320,0,32,2720,2656,0,0,262 BSEED Smart Socket {"NAME":"BSEED Socket","GPIO":[0,0,0,0,544,288,0,0,224,32,0,0,0,0],"FLAG":0,"BASE":18} CE Smart Home {"NAME":"CE Smart Wall","GPIO":[1,1,1,1,544,32,0,0,224,1,1,1,1,1],"FLAG":0,"BASE":18} CE Smart Home LQ-2-W3 {"NAME":"LITESUN","GPIO":[0,0,0,0,544,32,0,0,224,0,0,0,0,0],"FLAG":0,"BASE":18} +ChilITec Pilota Casa IP44 {"NAME":"Outdoor IP44","GPIO":[0,0,0,0,0,224,0,0,0,288,32,0,0,0],"FLAG":0,"BASE":18} Deta 6922HA {"NAME":"DETA 2G GPO","GPIO":[0,0,0,0,544,0,0,0,65,224,225,0,64,0],"FLAG":0,"BASE":18} Ener-J 13A Twin Wall Sockets with USB {"NAME":"Ener-J 2-Gang ","GPIO":[32,0,0,0,0,224,33,0,225,320,0,0,0,0],"FLAG":0,"BASE":18} Kapok T16 {"NAME":"tiltech-t16","GPIO":[0,320,0,32,192,0,0,0,224,225,0,0,0,0],"FLAG":0,"BASE":18} @@ -1882,6 +2045,7 @@ Smanergy KA10 {"NAME":"KA10","GPIO":[0,320,0,32,2720,2656,0,0,262 Sonoff IW100 {"NAME":"Sonoff IW100","GPIO":[32,3072,0,3104,0,0,0,0,224,544,0,0,0,0],"FLAG":0,"BASE":41} Sonoff S55 {"NAME":"Sonoff S55","GPIO":[32,1,0,1,1,0,0,0,224,320,0,0,0,0],"FLAG":0,"BASE":1} T16E Dual USB 10A {"NAME":"T16E 10A","GPIO":[0,0,0,32,2720,2656,0,0,2624,320,224,0,0,0],"FLAG":0,"BASE":18} +TCP Smart Dual {"NAME":"TCP TAUWIS2GUK","GPIO":[33,0,0,0,0,224,32,0,225,544,0,0,0,0],"FLAG":0,"BASE":18} Teckin SR40 {"NAME":"RF-SR40-US","GPIO":[576,0,0,32,320,33,0,0,225,224,321,226,0,0],"FLAG":0,"BASE":18} TopGreener Dual USB {"NAME":"TGWF215U2A","GPIO":[0,320,0,32,2720,2656,0,0,2624,225,224,321,0,0],"FLAG":0,"BASE":18} TopGreener TGWF15RM {"NAME":"TGWF15RM","GPIO":[0,320,0,32,2720,2656,0,0,2624,321,224,0,0,0],"FLAG":0,"BASE":55} From 85272b7dc736e2095b913301d64a4d72f55d59b3 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Fri, 12 Feb 2021 15:14:56 +0100 Subject: [PATCH 19/99] Update workflows --- .github/workflows/CI_github_ESP32.yml | 20 ----------- .github/workflows/Tasmota_build.yml | 41 +++++++++++----------- .github/workflows/Tasmota_build_master.yml | 41 +++++++++++----------- 3 files changed, 40 insertions(+), 62 deletions(-) diff --git a/.github/workflows/CI_github_ESP32.yml b/.github/workflows/CI_github_ESP32.yml index e3d26ef19..1a51e2306 100644 --- a/.github/workflows/CI_github_ESP32.yml +++ b/.github/workflows/CI_github_ESP32.yml @@ -104,26 +104,6 @@ jobs: name: firmware path: ./build_output - tasmota32-minimal: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v1 - - name: Set up Python - uses: actions/setup-python@v1 - - name: Install dependencies - run: | - python -m pip install --upgrade pip - pip install -U platformio - platformio upgrade --dev - platformio update - - name: Run PlatformIO - run: | - platformio run -e tasmota32-minimal - - uses: actions/upload-artifact@v2 - with: - name: firmware - path: ./build_output - tasmota32-lite: runs-on: ubuntu-latest steps: diff --git a/.github/workflows/Tasmota_build.yml b/.github/workflows/Tasmota_build.yml index 716c5c274..018b355de 100644 --- a/.github/workflows/Tasmota_build.yml +++ b/.github/workflows/Tasmota_build.yml @@ -724,26 +724,6 @@ jobs: path: ./build_output - tasmota32-minimal: - needs: tasmota_pull - runs-on: ubuntu-latest - continue-on-error: true - steps: - - uses: actions/checkout@v1 - - name: Set up Python - uses: actions/setup-python@v1 - - name: Install dependencies - run: | - pip install -U platformio - - name: Run PlatformIO - run: | - platformio run -e tasmota32-minimal - - uses: actions/upload-artifact@v2 - with: - name: firmware - path: ./build_output - - tasmota32-lite: needs: tasmota_pull runs-on: ubuntu-latest @@ -1104,6 +1084,26 @@ jobs: path: ./build_output + tasmota32-FY: + needs: tasmota_pull + runs-on: ubuntu-latest + continue-on-error: true + steps: + - uses: actions/checkout@v1 + - name: Set up Python + uses: actions/setup-python@v1 + - name: Install dependencies + run: | + pip install -U platformio + - name: Run PlatformIO + run: | + platformio run -e tasmota32-FY + - uses: actions/upload-artifact@v2 + with: + name: firmware + path: ./build_output + + tasmota32-GR: needs: tasmota_pull runs-on: ubuntu-latest @@ -1455,7 +1455,6 @@ jobs: [ ! -f ./mv_firmware/firmware/tasmota-zbbridge.* ] || mv ./mv_firmware/firmware/tasmota-zbbridge.* ./firmware/tasmota/ [ ! -f ./mv_firmware/firmware/tasmota32.* ] || mv ./mv_firmware/firmware/tasmota32.* ./firmware/tasmota32/ [ ! -f ./mv_firmware/firmware/tasmota32-sensors.* ] || mv ./mv_firmware/firmware/tasmota32-sensors.* ./firmware/tasmota32/ - [ ! -f ./mv_firmware/firmware/tasmota32-minimal.* ] || mv ./mv_firmware/firmware/tasmota32-minimal.* ./firmware/tasmota32/ [ ! -f ./mv_firmware/firmware/tasmota32-lite.* ] || mv ./mv_firmware/firmware/tasmota32-lite.* ./firmware/tasmota32/ [ ! -f ./mv_firmware/firmware/tasmota32-ir*.* ] || mv ./mv_firmware/firmware/tasmota32-ir*.* ./firmware/tasmota32/ [ ! -f ./mv_firmware/firmware/tasmota32-display.* ] || mv ./mv_firmware/firmware/tasmota32-display.* ./firmware/tasmota32/ diff --git a/.github/workflows/Tasmota_build_master.yml b/.github/workflows/Tasmota_build_master.yml index 5cf20b573..f6b74ce41 100644 --- a/.github/workflows/Tasmota_build_master.yml +++ b/.github/workflows/Tasmota_build_master.yml @@ -724,26 +724,6 @@ jobs: path: ./build_output - tasmota32-minimal: - needs: tasmota_pull - runs-on: ubuntu-latest - continue-on-error: true - steps: - - uses: actions/checkout@v1 - - name: Set up Python - uses: actions/setup-python@v1 - - name: Install dependencies - run: | - pip install -U platformio - - name: Run PlatformIO - run: | - platformio run -e tasmota32-minimal - - uses: actions/upload-artifact@v2 - with: - name: firmware - path: ./build_output - - tasmota32-lite: needs: tasmota_pull runs-on: ubuntu-latest @@ -1104,6 +1084,26 @@ jobs: path: ./build_output + tasmota32-FY: + needs: tasmota_pull + runs-on: ubuntu-latest + continue-on-error: true + steps: + - uses: actions/checkout@v1 + - name: Set up Python + uses: actions/setup-python@v1 + - name: Install dependencies + run: | + pip install -U platformio + - name: Run PlatformIO + run: | + platformio run -e tasmota32-FY + - uses: actions/upload-artifact@v2 + with: + name: firmware + path: ./build_output + + tasmota32-GR: needs: tasmota_pull runs-on: ubuntu-latest @@ -1455,7 +1455,6 @@ jobs: [ ! -f ./mv_firmware/firmware/tasmota-zbbridge.* ] || mv ./mv_firmware/firmware/tasmota-zbbridge.* ./firmware/tasmota/ [ ! -f ./mv_firmware/firmware/tasmota32.* ] || mv ./mv_firmware/firmware/tasmota32.* ./firmware/tasmota32/ [ ! -f ./mv_firmware/firmware/tasmota32-sensors.* ] || mv ./mv_firmware/firmware/tasmota32-sensors.* ./firmware/tasmota32/ - [ ! -f ./mv_firmware/firmware/tasmota32-minimal.* ] || mv ./mv_firmware/firmware/tasmota32-minimal.* ./firmware/tasmota32/ [ ! -f ./mv_firmware/firmware/tasmota32-lite.* ] || mv ./mv_firmware/firmware/tasmota32-lite.* ./firmware/tasmota32/ [ ! -f ./mv_firmware/firmware/tasmota32-ir*.* ] || mv ./mv_firmware/firmware/tasmota32-ir*.* ./firmware/tasmota32/ [ ! -f ./mv_firmware/firmware/tasmota32-display.* ] || mv ./mv_firmware/firmware/tasmota32-display.* ./firmware/tasmota32/ From d4537ea208dd183ddf79f8a7ae2cda8594cefcb9 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Fri, 12 Feb 2021 15:18:29 +0100 Subject: [PATCH 20/99] Update MODULES.md --- MODULES.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MODULES.md b/MODULES.md index 8b81a8652..46499e2f1 100644 --- a/MODULES.md +++ b/MODULES.md @@ -80,4 +80,4 @@ Module | LCode | Description 74 Sonoff D1 | x | Sonoff D1 Wifi and RF Dimmer 75 Sonoff ZbBridge | x | Sonoff Zigbee bridge -Over 1650 additional devices are supported using [templates](TEMPLATES.md). +Over 1850 additional devices are supported using [templates](TEMPLATES.md). From 42c5af1b702aa25b8e59cee5c4ad57724ee9e82c Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Fri, 12 Feb 2021 16:26:51 +0100 Subject: [PATCH 21/99] Remove ESP32 minimal support --- platformio_override_sample.ini | 1 - platformio_tasmota32.ini | 2 +- platformio_tasmota_env32.ini | 5 ----- tasmota/support_tasmota.ino | 26 ++++++++++++++------------ tasmota/tasmota_globals.h | 2 ++ 5 files changed, 17 insertions(+), 19 deletions(-) diff --git a/platformio_override_sample.ini b/platformio_override_sample.ini index 9b7ddfa53..37a9b345d 100644 --- a/platformio_override_sample.ini +++ b/platformio_override_sample.ini @@ -29,7 +29,6 @@ default_envs = ; tasmota32 ; tasmota32-bluetooth ; tasmota32-webcam -; tasmota32-minimal ; tasmota32-lite ; tasmota32-knx ; tasmota32-sensors diff --git a/platformio_tasmota32.ini b/platformio_tasmota32.ini index 4cf662f8e..c857f5ec9 100644 --- a/platformio_tasmota32.ini +++ b/platformio_tasmota32.ini @@ -7,10 +7,10 @@ default_envs = ${build_envs.default_envs} ; *** Uncomment by deleting ";" in the line(s) below to select version(s) ; tasmota32 +; tasmota32-bluetooth ; tasmota32-webcam ; tasmota32-odroidgo ; tasmota32-core2 -; tasmota32-minimal ; tasmota32-lite ; tasmota32-knx ; tasmota32-sensors diff --git a/platformio_tasmota_env32.ini b/platformio_tasmota_env32.ini index d0b4e97c3..5a1b1ec93 100644 --- a/platformio_tasmota_env32.ini +++ b/platformio_tasmota_env32.ini @@ -63,11 +63,6 @@ extends = env:tasmota32 build_flags = ${common32.build_flags} -DFIRMWARE_BLUETOOTH lib_extra_dirs = lib/libesp32, lib/lib_basic, lib/lib_i2c, lib/lib_ssl -[env:tasmota32-minimal] -extends = env:tasmota32 -build_flags = ${common32.build_flags} -DFIRMWARE_MINIMAL -lib_extra_dirs = lib/libesp32 - [env:tasmota32-lite] extends = env:tasmota32 build_flags = ${common32.build_flags} -DFIRMWARE_LITE diff --git a/tasmota/support_tasmota.ino b/tasmota/support_tasmota.ino index be533ede8..033af4bf6 100644 --- a/tasmota/support_tasmota.ino +++ b/tasmota/support_tasmota.ino @@ -1019,23 +1019,23 @@ void Every250mSeconds(void) if (TasmotaGlobal.ota_state_flag && BACKLOG_EMPTY) { TasmotaGlobal.ota_state_flag--; if (2 == TasmotaGlobal.ota_state_flag) { - RtcSettings.ota_loader = 0; // Try requested image first + RtcSettings.ota_loader = 0; // Try requested image first ota_retry_counter = OTA_ATTEMPTS; ESPhttpUpdate.rebootOnUpdate(false); - SettingsSave(1); // Free flash for OTA update + SettingsSave(1); // Free flash for OTA update } if (TasmotaGlobal.ota_state_flag <= 0) { #ifdef USE_BLE_ESP32 ExtStopBLE(); #endif // USE_BLE_ESP32 #ifdef USE_COUNTER - CounterInterruptDisable(true); // Prevent OTA failures on 100Hz counter interrupts + CounterInterruptDisable(true); // Prevent OTA failures on 100Hz counter interrupts #endif // USE_COUNTER #ifdef USE_WEBSERVER if (Settings.webserver) StopWebserver(); #endif // USE_WEBSERVER #ifdef USE_ARILUX_RF - AriluxRfDisable(); // Prevent restart exception on Arilux Interrupt routine + AriluxRfDisable(); // Prevent restart exception on Arilux Interrupt routine #endif // USE_ARILUX_RF TasmotaGlobal.ota_state_flag = 92; ota_result = 0; @@ -1043,6 +1043,7 @@ void Every250mSeconds(void) if (ota_retry_counter) { char ota_url[TOPSZ]; strlcpy(TasmotaGlobal.mqtt_data, GetOtaUrl(ota_url, sizeof(ota_url)), sizeof(TasmotaGlobal.mqtt_data)); +#ifdef ESP8266 #ifndef FIRMWARE_MINIMAL if (RtcSettings.ota_loader) { // OTA File too large so try OTA minimal version @@ -1061,8 +1062,8 @@ void Every250mSeconds(void) // Replace http://192.168.2.17:80/api/arduino/tasmota.bin with http://192.168.2.17:80/api/arduino/tasmota-minimal.bin // Replace http://192.168.2.17/api/arduino/tasmota.bin.gz with http://192.168.2.17/api/arduino/tasmota-minimal.bin.gz - char *bch = strrchr(TasmotaGlobal.mqtt_data, '/'); // Only consider filename after last backslash prevent change of urls having "-" in it - if (bch == nullptr) { bch = TasmotaGlobal.mqtt_data; } // No path found so use filename only + char *bch = strrchr(TasmotaGlobal.mqtt_data, '/'); // Only consider filename after last backslash prevent change of urls having "-" in it + if (bch == nullptr) { bch = TasmotaGlobal.mqtt_data; } // No path found so use filename only char *ech = strchr(bch, '.'); // Find file type in filename (none, .ino.bin, .ino.bin.gz, .bin, .bin.gz or .gz) if (ech == nullptr) { ech = TasmotaGlobal.mqtt_data + strlen(TasmotaGlobal.mqtt_data); } // Point to '/0' at end of mqtt_data becoming an empty string @@ -1077,7 +1078,6 @@ void Every250mSeconds(void) snprintf_P(TasmotaGlobal.mqtt_data, sizeof(TasmotaGlobal.mqtt_data), PSTR("%s-" D_JSON_MINIMAL "%s"), TasmotaGlobal.mqtt_data, ota_url_type); // Minimal filename must be filename-minimal } #endif // FIRMWARE_MINIMAL -#ifdef ESP8266 if (ota_retry_counter < OTA_ATTEMPTS / 2) { if (!strcasecmp_P(TasmotaGlobal.mqtt_data, PSTR(".gz"))) { ota_retry_counter = 1; @@ -1093,26 +1093,28 @@ void Every250mSeconds(void) #ifndef FIRMWARE_MINIMAL int ota_error = ESPhttpUpdate.getLastError(); DEBUG_CORE_LOG(PSTR("OTA: Error %d"), ota_error); +#ifdef ESP8266 if ((HTTP_UE_TOO_LESS_SPACE == ota_error) || (HTTP_UE_BIN_FOR_WRONG_FLASH == ota_error)) { - RtcSettings.ota_loader = 1; // Try minimal image next + RtcSettings.ota_loader = 1; // Try minimal image next } +#endif // ESP8266 #endif // FIRMWARE_MINIMAL - TasmotaGlobal.ota_state_flag = 2; // Upgrade failed - retry + TasmotaGlobal.ota_state_flag = 2; // Upgrade failed - retry } } } - if (90 == TasmotaGlobal.ota_state_flag) { // Allow MQTT to reconnect + if (90 == TasmotaGlobal.ota_state_flag) { // Allow MQTT to reconnect TasmotaGlobal.ota_state_flag = 0; Response_P(PSTR("{\"" D_CMND_UPGRADE "\":\"")); if (ota_result) { -// SetFlashModeDout(); // Force DOUT for both ESP8266 and ESP8285 +// SetFlashModeDout(); // Force DOUT for both ESP8266 and ESP8285 ResponseAppend_P(PSTR(D_JSON_SUCCESSFUL ". " D_JSON_RESTARTING)); TasmotaGlobal.restart_flag = 2; } else { ResponseAppend_P(PSTR(D_JSON_FAILED " %s"), ESPhttpUpdate.getLastErrorString().c_str()); } ResponseAppend_P(PSTR("\"}")); -// TasmotaGlobal.restart_flag = 2; // Restart anyway to keep memory clean webserver +// TasmotaGlobal.restart_flag = 2; // Restart anyway to keep memory clean webserver MqttPublishPrefixTopic_P(STAT, PSTR(D_CMND_UPGRADE)); #ifdef USE_COUNTER CounterInterruptDisable(false); diff --git a/tasmota/tasmota_globals.h b/tasmota/tasmota_globals.h index 71e345b2b..2ac6a2343 100644 --- a/tasmota/tasmota_globals.h +++ b/tasmota/tasmota_globals.h @@ -132,6 +132,8 @@ String EthernetMacAddress(void); #define USE_UFILESYS +#undef FIRMWARE_MINIMAL // Minimal is not supported as not needed + // Hardware has no ESP32 #undef USE_TUYA_DIMMER #undef USE_PWM_DIMMER From 3f4fda44a41bafec1bfffaf600440d4cb1f09b41 Mon Sep 17 00:00:00 2001 From: gemu2015 Date: Sat, 13 Feb 2021 07:43:59 +0100 Subject: [PATCH 22/99] ili9341 update --- tasmota/support_tasmota.ino | 36 +++++++++++++----------------------- tasmota/xdrv_13_display.ino | 13 ++++++++++--- 2 files changed, 23 insertions(+), 26 deletions(-) diff --git a/tasmota/support_tasmota.ino b/tasmota/support_tasmota.ino index 033af4bf6..fe4cf34d8 100644 --- a/tasmota/support_tasmota.ino +++ b/tasmota/support_tasmota.ino @@ -1019,23 +1019,23 @@ void Every250mSeconds(void) if (TasmotaGlobal.ota_state_flag && BACKLOG_EMPTY) { TasmotaGlobal.ota_state_flag--; if (2 == TasmotaGlobal.ota_state_flag) { - RtcSettings.ota_loader = 0; // Try requested image first + RtcSettings.ota_loader = 0; // Try requested image first ota_retry_counter = OTA_ATTEMPTS; ESPhttpUpdate.rebootOnUpdate(false); - SettingsSave(1); // Free flash for OTA update + SettingsSave(1); // Free flash for OTA update } if (TasmotaGlobal.ota_state_flag <= 0) { #ifdef USE_BLE_ESP32 ExtStopBLE(); #endif // USE_BLE_ESP32 #ifdef USE_COUNTER - CounterInterruptDisable(true); // Prevent OTA failures on 100Hz counter interrupts + CounterInterruptDisable(true); // Prevent OTA failures on 100Hz counter interrupts #endif // USE_COUNTER #ifdef USE_WEBSERVER if (Settings.webserver) StopWebserver(); #endif // USE_WEBSERVER #ifdef USE_ARILUX_RF - AriluxRfDisable(); // Prevent restart exception on Arilux Interrupt routine + AriluxRfDisable(); // Prevent restart exception on Arilux Interrupt routine #endif // USE_ARILUX_RF TasmotaGlobal.ota_state_flag = 92; ota_result = 0; @@ -1043,7 +1043,6 @@ void Every250mSeconds(void) if (ota_retry_counter) { char ota_url[TOPSZ]; strlcpy(TasmotaGlobal.mqtt_data, GetOtaUrl(ota_url, sizeof(ota_url)), sizeof(TasmotaGlobal.mqtt_data)); -#ifdef ESP8266 #ifndef FIRMWARE_MINIMAL if (RtcSettings.ota_loader) { // OTA File too large so try OTA minimal version @@ -1062,8 +1061,8 @@ void Every250mSeconds(void) // Replace http://192.168.2.17:80/api/arduino/tasmota.bin with http://192.168.2.17:80/api/arduino/tasmota-minimal.bin // Replace http://192.168.2.17/api/arduino/tasmota.bin.gz with http://192.168.2.17/api/arduino/tasmota-minimal.bin.gz - char *bch = strrchr(TasmotaGlobal.mqtt_data, '/'); // Only consider filename after last backslash prevent change of urls having "-" in it - if (bch == nullptr) { bch = TasmotaGlobal.mqtt_data; } // No path found so use filename only + char *bch = strrchr(TasmotaGlobal.mqtt_data, '/'); // Only consider filename after last backslash prevent change of urls having "-" in it + if (bch == nullptr) { bch = TasmotaGlobal.mqtt_data; } // No path found so use filename only char *ech = strchr(bch, '.'); // Find file type in filename (none, .ino.bin, .ino.bin.gz, .bin, .bin.gz or .gz) if (ech == nullptr) { ech = TasmotaGlobal.mqtt_data + strlen(TasmotaGlobal.mqtt_data); } // Point to '/0' at end of mqtt_data becoming an empty string @@ -1078,14 +1077,6 @@ void Every250mSeconds(void) snprintf_P(TasmotaGlobal.mqtt_data, sizeof(TasmotaGlobal.mqtt_data), PSTR("%s-" D_JSON_MINIMAL "%s"), TasmotaGlobal.mqtt_data, ota_url_type); // Minimal filename must be filename-minimal } #endif // FIRMWARE_MINIMAL - if (ota_retry_counter < OTA_ATTEMPTS / 2) { - if (!strcasecmp_P(TasmotaGlobal.mqtt_data, PSTR(".gz"))) { - ota_retry_counter = 1; - } else { - strcat_P(TasmotaGlobal.mqtt_data, PSTR(".gz")); - } - } -#endif // ESP8266 AddLog(LOG_LEVEL_DEBUG, PSTR(D_LOG_UPLOAD "%s"), TasmotaGlobal.mqtt_data); WiFiClient OTAclient; ota_result = (HTTP_UPDATE_FAILED != ESPhttpUpdate.update(OTAclient, TasmotaGlobal.mqtt_data)); @@ -1093,28 +1084,26 @@ void Every250mSeconds(void) #ifndef FIRMWARE_MINIMAL int ota_error = ESPhttpUpdate.getLastError(); DEBUG_CORE_LOG(PSTR("OTA: Error %d"), ota_error); -#ifdef ESP8266 if ((HTTP_UE_TOO_LESS_SPACE == ota_error) || (HTTP_UE_BIN_FOR_WRONG_FLASH == ota_error)) { - RtcSettings.ota_loader = 1; // Try minimal image next + RtcSettings.ota_loader = 1; // Try minimal image next } -#endif // ESP8266 #endif // FIRMWARE_MINIMAL - TasmotaGlobal.ota_state_flag = 2; // Upgrade failed - retry + TasmotaGlobal.ota_state_flag = 2; // Upgrade failed - retry } } } - if (90 == TasmotaGlobal.ota_state_flag) { // Allow MQTT to reconnect + if (90 == TasmotaGlobal.ota_state_flag) { // Allow MQTT to reconnect TasmotaGlobal.ota_state_flag = 0; Response_P(PSTR("{\"" D_CMND_UPGRADE "\":\"")); if (ota_result) { -// SetFlashModeDout(); // Force DOUT for both ESP8266 and ESP8285 +// SetFlashModeDout(); // Force DOUT for both ESP8266 and ESP8285 ResponseAppend_P(PSTR(D_JSON_SUCCESSFUL ". " D_JSON_RESTARTING)); TasmotaGlobal.restart_flag = 2; } else { ResponseAppend_P(PSTR(D_JSON_FAILED " %s"), ESPhttpUpdate.getLastErrorString().c_str()); } ResponseAppend_P(PSTR("\"}")); -// TasmotaGlobal.restart_flag = 2; // Restart anyway to keep memory clean webserver +// TasmotaGlobal.restart_flag = 2; // Restart anyway to keep memory clean webserver MqttPublishPrefixTopic_P(STAT, PSTR(D_CMND_UPGRADE)); #ifdef USE_COUNTER CounterInterruptDisable(false); @@ -1655,7 +1644,8 @@ void GpioInit(void) bool valid_cs = (ValidSpiPinUsed(GPIO_SPI_CS) || ValidSpiPinUsed(GPIO_RC522_CS) || (ValidSpiPinUsed(GPIO_NRF24_CS) && ValidSpiPinUsed(GPIO_NRF24_DC)) || - (ValidSpiPinUsed(GPIO_ILI9341_CS) && ValidSpiPinUsed(GPIO_ILI9341_DC)) || + ValidSpiPinUsed(GPIO_ILI9341_CS) || + ValidSpiPinUsed(GPIO_ILI9341_DC) || // there are also boards without cs ValidSpiPinUsed(GPIO_EPAPER29_CS) || ValidSpiPinUsed(GPIO_EPAPER42_CS) || ValidSpiPinUsed(GPIO_ILI9488_CS) || diff --git a/tasmota/xdrv_13_display.ino b/tasmota/xdrv_13_display.ino index 817898d56..4838a91fc 100755 --- a/tasmota/xdrv_13_display.ino +++ b/tasmota/xdrv_13_display.ino @@ -658,9 +658,16 @@ void DisplayText(void) break; case 'f': // font sx - if (renderer) renderer->setTextFont(*cp&7); - else DisplaySetFont(*cp&7); - cp += 1; + { uint8_t font = *cp&7; + if (renderer) renderer->setTextFont(font); + else DisplaySetFont(font); + if (font) { + // for backward compatibility set size to 1 on non GFX fonts + if (renderer) renderer->setTextSize(1); + else DisplaySetSize(1); + } + cp += 1; + } break; case 'a': // rotation angle From 74912e7cc28b969ff2f8665796911cb1d68e5f5a Mon Sep 17 00:00:00 2001 From: gemu2015 Date: Sat, 13 Feb 2021 07:48:20 +0100 Subject: [PATCH 23/99] update ili9341 --- .../.github/ISSUE_TEMPLATE.md | 46 - .../.github/PULL_REQUEST_TEMPLATE.md | 26 - .../.gitignore | 4 - .../.travis.yml | 38 - .../Adafruit_ILI9341.cpp | 282 ------ .../Adafruit_ILI9341.h | 144 --- .../README.md | 35 - .../breakouttouchpaint/.esp8266.test.skip | 0 .../breakouttouchpaint/breakouttouchpaint.ino | 145 --- .../fulltest_featherwing/.mega2560.test.skip | 0 .../fulltest_featherwing.ino | 265 ------ .../examples/graphicstest/graphicstest.ino | 365 -------- .../.mega2560.test.skip | 0 .../graphicstest_featherwing.ino | 404 -------- .../examples/onoffbutton/onoffbutton.ino | 125 --- .../onoffbutton_breakout/.esp8266.test.skip | 0 .../onoffbutton_breakout.ino | 133 --- .../examples/pictureEmbed/dragon.h | 861 ------------------ .../examples/pictureEmbed/pictureEmbed.ino | 69 -- .../examples/spitftbitmap/spitftbitmap.ino | 218 ----- .../examples/touchpaint/touchpaint.ino | 146 --- .../.mega2560.test.skip | 0 .../touchpaint_featherwing.ino | 165 ---- .../library.properties | 9 - .../Arduino_ST7789.cpp | 33 +- .../Arduino_ST7789-gemu-1.0/Arduino_ST7789.h | 6 +- .../src/renderer.cpp | 37 +- .../Display_Renderer-gemu-1.0/src/renderer.h | 4 + .../ILI9341-gemu-1.0/ILI9341_2.cpp | 121 ++- lib/lib_display/ILI9341-gemu-1.0/ILI9341_2.h | 47 +- tasmota/xdsp_04_ili9341.ino | 393 ++++---- tasmota/xdsp_13_ILI9341-2.ino | 290 ------ 32 files changed, 368 insertions(+), 4043 deletions(-) delete mode 100644 lib/lib_display/Adafruit_ILI9341-1.2.0-Tasmota-1.0/.github/ISSUE_TEMPLATE.md delete mode 100644 lib/lib_display/Adafruit_ILI9341-1.2.0-Tasmota-1.0/.github/PULL_REQUEST_TEMPLATE.md delete mode 100644 lib/lib_display/Adafruit_ILI9341-1.2.0-Tasmota-1.0/.gitignore delete mode 100644 lib/lib_display/Adafruit_ILI9341-1.2.0-Tasmota-1.0/.travis.yml delete mode 100644 lib/lib_display/Adafruit_ILI9341-1.2.0-Tasmota-1.0/Adafruit_ILI9341.cpp delete mode 100644 lib/lib_display/Adafruit_ILI9341-1.2.0-Tasmota-1.0/Adafruit_ILI9341.h delete mode 100644 lib/lib_display/Adafruit_ILI9341-1.2.0-Tasmota-1.0/README.md delete mode 100644 lib/lib_display/Adafruit_ILI9341-1.2.0-Tasmota-1.0/examples/breakouttouchpaint/.esp8266.test.skip delete mode 100644 lib/lib_display/Adafruit_ILI9341-1.2.0-Tasmota-1.0/examples/breakouttouchpaint/breakouttouchpaint.ino delete mode 100644 lib/lib_display/Adafruit_ILI9341-1.2.0-Tasmota-1.0/examples/fulltest_featherwing/.mega2560.test.skip delete mode 100644 lib/lib_display/Adafruit_ILI9341-1.2.0-Tasmota-1.0/examples/fulltest_featherwing/fulltest_featherwing.ino delete mode 100644 lib/lib_display/Adafruit_ILI9341-1.2.0-Tasmota-1.0/examples/graphicstest/graphicstest.ino delete mode 100644 lib/lib_display/Adafruit_ILI9341-1.2.0-Tasmota-1.0/examples/graphicstest_featherwing/.mega2560.test.skip delete mode 100644 lib/lib_display/Adafruit_ILI9341-1.2.0-Tasmota-1.0/examples/graphicstest_featherwing/graphicstest_featherwing.ino delete mode 100644 lib/lib_display/Adafruit_ILI9341-1.2.0-Tasmota-1.0/examples/onoffbutton/onoffbutton.ino delete mode 100644 lib/lib_display/Adafruit_ILI9341-1.2.0-Tasmota-1.0/examples/onoffbutton_breakout/.esp8266.test.skip delete mode 100644 lib/lib_display/Adafruit_ILI9341-1.2.0-Tasmota-1.0/examples/onoffbutton_breakout/onoffbutton_breakout.ino delete mode 100644 lib/lib_display/Adafruit_ILI9341-1.2.0-Tasmota-1.0/examples/pictureEmbed/dragon.h delete mode 100644 lib/lib_display/Adafruit_ILI9341-1.2.0-Tasmota-1.0/examples/pictureEmbed/pictureEmbed.ino delete mode 100644 lib/lib_display/Adafruit_ILI9341-1.2.0-Tasmota-1.0/examples/spitftbitmap/spitftbitmap.ino delete mode 100644 lib/lib_display/Adafruit_ILI9341-1.2.0-Tasmota-1.0/examples/touchpaint/touchpaint.ino delete mode 100644 lib/lib_display/Adafruit_ILI9341-1.2.0-Tasmota-1.0/examples/touchpaint_featherwing/.mega2560.test.skip delete mode 100644 lib/lib_display/Adafruit_ILI9341-1.2.0-Tasmota-1.0/examples/touchpaint_featherwing/touchpaint_featherwing.ino delete mode 100644 lib/lib_display/Adafruit_ILI9341-1.2.0-Tasmota-1.0/library.properties delete mode 100644 tasmota/xdsp_13_ILI9341-2.ino diff --git a/lib/lib_display/Adafruit_ILI9341-1.2.0-Tasmota-1.0/.github/ISSUE_TEMPLATE.md b/lib/lib_display/Adafruit_ILI9341-1.2.0-Tasmota-1.0/.github/ISSUE_TEMPLATE.md deleted file mode 100644 index f0e26146f..000000000 --- a/lib/lib_display/Adafruit_ILI9341-1.2.0-Tasmota-1.0/.github/ISSUE_TEMPLATE.md +++ /dev/null @@ -1,46 +0,0 @@ -Thank you for opening an issue on an Adafruit Arduino library repository. To -improve the speed of resolution please review the following guidelines and -common troubleshooting steps below before creating the issue: - -- **Do not use GitHub issues for troubleshooting projects and issues.** Instead use - the forums at http://forums.adafruit.com to ask questions and troubleshoot why - something isn't working as expected. In many cases the problem is a common issue - that you will more quickly receive help from the forum community. GitHub issues - are meant for known defects in the code. If you don't know if there is a defect - in the code then start with troubleshooting on the forum first. - -- **If following a tutorial or guide be sure you didn't miss a step.** Carefully - check all of the steps and commands to run have been followed. Consult the - forum if you're unsure or have questions about steps in a guide/tutorial. - -- **For Arduino projects check these very common issues to ensure they don't apply**: - - - For uploading sketches or communicating with the board make sure you're using - a **USB data cable** and **not** a **USB charge-only cable**. It is sometimes - very hard to tell the difference between a data and charge cable! Try using the - cable with other devices or swapping to another cable to confirm it is not - the problem. - - - **Be sure you are supplying adequate power to the board.** Check the specs of - your board and plug in an external power supply. In many cases just - plugging a board into your computer is not enough to power it and other - peripherals. - - - **Double check all soldering joints and connections.** Flakey connections - cause many mysterious problems. See the [guide to excellent soldering](https://learn.adafruit.com/adafruit-guide-excellent-soldering/tools) for examples of good solder joints. - - - **Ensure you are using an official Arduino or Adafruit board.** We can't - guarantee a clone board will have the same functionality and work as expected - with this code and don't support them. - -If you're sure this issue is a defect in the code and checked the steps above -please fill in the following fields to provide enough troubleshooting information. -You may delete the guideline and text above to just leave the following details: - -- Arduino board: **INSERT ARDUINO BOARD NAME/TYPE HERE** - -- Arduino IDE version (found in Arduino -> About Arduino menu): **INSERT ARDUINO - VERSION HERE** - -- List the steps to reproduce the problem below (if possible attach a sketch or - copy the sketch code in too): **LIST REPRO STEPS BELOW** diff --git a/lib/lib_display/Adafruit_ILI9341-1.2.0-Tasmota-1.0/.github/PULL_REQUEST_TEMPLATE.md b/lib/lib_display/Adafruit_ILI9341-1.2.0-Tasmota-1.0/.github/PULL_REQUEST_TEMPLATE.md deleted file mode 100644 index 7b641eb86..000000000 --- a/lib/lib_display/Adafruit_ILI9341-1.2.0-Tasmota-1.0/.github/PULL_REQUEST_TEMPLATE.md +++ /dev/null @@ -1,26 +0,0 @@ -Thank you for creating a pull request to contribute to Adafruit's GitHub code! -Before you open the request please review the following guidelines and tips to -help it be more easily integrated: - -- **Describe the scope of your change--i.e. what the change does and what parts - of the code were modified.** This will help us understand any risks of integrating - the code. - -- **Describe any known limitations with your change.** For example if the change - doesn't apply to a supported platform of the library please mention it. - -- **Please run any tests or examples that can exercise your modified code.** We - strive to not break users of the code and running tests/examples helps with this - process. - -Thank you again for contributing! We will try to test and integrate the change -as soon as we can, but be aware we have many GitHub repositories to manage and -can't immediately respond to every request. There is no need to bump or check in -on a pull request (it will clutter the discussion of the request). - -Also don't be worried if the request is closed or not integrated--sometimes the -priorities of Adafruit's GitHub code (education, ease of use) might not match the -priorities of the pull request. Don't fret, the open source community thrives on -forks and GitHub makes it easy to keep your changes in a forked repo. - -After reviewing the guidelines above you can delete this text from the pull request. diff --git a/lib/lib_display/Adafruit_ILI9341-1.2.0-Tasmota-1.0/.gitignore b/lib/lib_display/Adafruit_ILI9341-1.2.0-Tasmota-1.0/.gitignore deleted file mode 100644 index c2a26c038..000000000 --- a/lib/lib_display/Adafruit_ILI9341-1.2.0-Tasmota-1.0/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -# Our handy .gitignore for automation ease -Doxyfile* -doxygen_sqlite3.db -html diff --git a/lib/lib_display/Adafruit_ILI9341-1.2.0-Tasmota-1.0/.travis.yml b/lib/lib_display/Adafruit_ILI9341-1.2.0-Tasmota-1.0/.travis.yml deleted file mode 100644 index 3e5672cd6..000000000 --- a/lib/lib_display/Adafruit_ILI9341-1.2.0-Tasmota-1.0/.travis.yml +++ /dev/null @@ -1,38 +0,0 @@ -language: c -sudo: false - -cache: - directories: - - ~/arduino_ide - # Caches Arduino IDE + ESP32 platform - - ~/.arduino15/packages/ - # Caches Arduino platforms -git: - depth: false - quiet: true - -# Blacklist -branches: - except: - - gh-pages - -env: - global: - - PRETTYNAME="Adafruit ILI9341 Arduino Library" -# Optional, will default to "$TRAVIS_BUILD_DIR/Doxyfile" -# - DOXYFILE: $TRAVIS_BUILD_DIR/Doxyfile - -before_install: - - source <(curl -SLs https://raw.githubusercontent.com/adafruit/travis-ci-arduino/master/install.sh) - -install: - - arduino --install-library "Adafruit GFX Library","Adafruit STMPE610","Adafruit TouchScreen" - -script: - - build_main_platforms - -# Generate and deploy documentation -after_success: - - source <(curl -SLs https://raw.githubusercontent.com/adafruit/travis-ci-arduino/master/library_check.sh) - - source <(curl -SLs https://raw.githubusercontent.com/adafruit/travis-ci-arduino/master/doxy_gen_and_deploy.sh) - diff --git a/lib/lib_display/Adafruit_ILI9341-1.2.0-Tasmota-1.0/Adafruit_ILI9341.cpp b/lib/lib_display/Adafruit_ILI9341-1.2.0-Tasmota-1.0/Adafruit_ILI9341.cpp deleted file mode 100644 index 442975ada..000000000 --- a/lib/lib_display/Adafruit_ILI9341-1.2.0-Tasmota-1.0/Adafruit_ILI9341.cpp +++ /dev/null @@ -1,282 +0,0 @@ -/*! -* @file Adafruit_ILI9341.cpp -* -* @mainpage Adafruit ILI9341 TFT Displays -* -* @section intro_sec Introduction -* -* This is the documentation for Adafruit's ILI9341 driver for the -* Arduino platform. -* -* This library works with the Adafruit 2.8" Touch Shield V2 (SPI) -* http://www.adafruit.com/products/1651 -* -* Adafruit 2.4" TFT LCD with Touchscreen Breakout w/MicroSD Socket - ILI9341 -* https://www.adafruit.com/product/2478 -* -* 2.8" TFT LCD with Touchscreen Breakout Board w/MicroSD Socket - ILI9341 -* https://www.adafruit.com/product/1770 -* -* 2.2" 18-bit color TFT LCD display with microSD card breakout - ILI9340 -* https://www.adafruit.com/product/1770 -* -* TFT FeatherWing - 2.4" 320x240 Touchscreen For All Feathers -* https://www.adafruit.com/product/3315 -* -* These displays use SPI to communicate, 4 or 5 pins are required -* to interface (RST is optional). -* -* Adafruit invests time and resources providing this open source code, -* please support Adafruit and open-source hardware by purchasing -* products from Adafruit! -* -* @section dependencies Dependencies -* -* This library depends on -* Adafruit_GFX being present on your system. Please make sure you have -* installed the latest version before using this library. -* -* @section author Author -* -* Written by Limor "ladyada" Fried for Adafruit Industries. -* -* @section license License -* -* BSD license, all text here must be included in any redistribution. -* -*/ - -#include "Adafruit_ILI9341.h" -#ifndef ARDUINO_STM32_FEATHER - #include "pins_arduino.h" - #ifndef RASPI - #include "wiring_private.h" - #endif -#endif -#include - -#if defined (ARDUINO_ARCH_ARC32) || defined (ARDUINO_MAXIM) - #define SPI_DEFAULT_FREQ 16000000 -#elif defined (__AVR__) || defined(TEENSYDUINO) - #define SPI_DEFAULT_FREQ 8000000 -#elif defined(ESP8266) || defined(ESP32) - #define SPI_DEFAULT_FREQ 40000000 -#elif defined(RASPI) - #define SPI_DEFAULT_FREQ 80000000 -#elif defined(ARDUINO_ARCH_STM32F1) - #define SPI_DEFAULT_FREQ 36000000 -#else - #define SPI_DEFAULT_FREQ 24000000 ///< Default SPI data clock frequency -#endif - -#define MADCTL_MY 0x80 ///< Bottom to top -#define MADCTL_MX 0x40 ///< Right to left -#define MADCTL_MV 0x20 ///< Reverse Mode -#define MADCTL_ML 0x10 ///< LCD refresh Bottom to top -#define MADCTL_RGB 0x00 ///< Red-Green-Blue pixel order -#define MADCTL_BGR 0x08 ///< Blue-Green-Red pixel order -#define MADCTL_MH 0x04 ///< LCD refresh right to left - -/**************************************************************************/ -/*! - @brief Instantiate Adafruit ILI9341 driver with software SPI - @param cs Chip select pin # - @param dc Data/Command pin # - @param mosi SPI MOSI pin # - @param sclk SPI Clock pin # - @param rst Reset pin # (optional, pass -1 if unused) - @param miso SPI MISO pin # (optional, pass -1 if unused) -*/ -/**************************************************************************/ -Adafruit_ILI9341::Adafruit_ILI9341(int8_t cs, int8_t dc, int8_t mosi, - int8_t sclk, int8_t rst, int8_t miso) : Adafruit_SPITFT(ILI9341_TFTWIDTH, ILI9341_TFTHEIGHT, cs, dc, mosi, sclk, rst, miso) { -} - -/**************************************************************************/ -/*! - @brief Instantiate Adafruit ILI9341 driver with hardware SPI - @param cs Chip select pin # - @param dc Data/Command pin # - @param rst Reset pin # (optional, pass -1 if unused) -*/ -/**************************************************************************/ -Adafruit_ILI9341::Adafruit_ILI9341(int8_t cs, int8_t dc, int8_t rst) : Adafruit_SPITFT(ILI9341_TFTWIDTH, ILI9341_TFTHEIGHT, cs, dc, rst) { -} - -static const uint8_t PROGMEM initcmd[] = { - 0xEF, 3, 0x03, 0x80, 0x02, - 0xCF, 3, 0x00, 0xC1, 0x30, - 0xED, 4, 0x64, 0x03, 0x12, 0x81, - 0xE8, 3, 0x85, 0x00, 0x78, - 0xCB, 5, 0x39, 0x2C, 0x00, 0x34, 0x02, - 0xF7, 1, 0x20, - 0xEA, 2, 0x00, 0x00, - ILI9341_PWCTR1 , 1, 0x23, // Power control VRH[5:0] - ILI9341_PWCTR2 , 1, 0x10, // Power control SAP[2:0];BT[3:0] - ILI9341_VMCTR1 , 2, 0x3e, 0x28, // VCM control - ILI9341_VMCTR2 , 1, 0x86, // VCM control2 - ILI9341_MADCTL , 1, 0x48, // Memory Access Control - ILI9341_VSCRSADD, 1, 0x00, // Vertical scroll zero - ILI9341_PIXFMT , 1, 0x55, - ILI9341_FRMCTR1 , 2, 0x00, 0x18, - ILI9341_DFUNCTR , 3, 0x08, 0x82, 0x27, // Display Function Control - 0xF2, 1, 0x00, // 3Gamma Function Disable - ILI9341_GAMMASET , 1, 0x01, // Gamma curve selected - ILI9341_GMCTRP1 , 15, 0x0F, 0x31, 0x2B, 0x0C, 0x0E, 0x08, // Set Gamma - 0x4E, 0xF1, 0x37, 0x07, 0x10, 0x03, 0x0E, 0x09, 0x00, - ILI9341_GMCTRN1 , 15, 0x00, 0x0E, 0x14, 0x03, 0x11, 0x07, // Set Gamma - 0x31, 0xC1, 0x48, 0x08, 0x0F, 0x0C, 0x31, 0x36, 0x0F, - ILI9341_SLPOUT , 0x80, // Exit Sleep - ILI9341_DISPON , 0x80, // Display on - 0x00 // End of list -}; - -/**************************************************************************/ -/*! - @brief Initialize ILI9341 chip - Connects to the ILI9341 over SPI and sends initialization procedure commands - @param freq Desired SPI clock frequency -*/ -/**************************************************************************/ -void Adafruit_ILI9341::begin(uint32_t freq) { - if(!freq) freq = SPI_DEFAULT_FREQ; - _freq = freq; - - initSPI(freq); - - startWrite(); - - uint8_t cmd, x, numArgs; - const uint8_t *addr = initcmd; - while((cmd = pgm_read_byte(addr++)) > 0) { - writeCommand(cmd); - x = pgm_read_byte(addr++); - numArgs = x & 0x7F; - while(numArgs--) spiWrite(pgm_read_byte(addr++)); - if(x & 0x80) delay(120); - } - - endWrite(); - - _width = ILI9341_TFTWIDTH; - _height = ILI9341_TFTHEIGHT; -} - - -/**************************************************************************/ -/*! - @brief Set origin of (0,0) and orientation of TFT display - @param m The index for rotation, from 0-3 inclusive -*/ -/**************************************************************************/ -void Adafruit_ILI9341::setRotation(uint8_t m) { - rotation = m % 4; // can't be higher than 3 - switch (rotation) { - case 0: - m = (MADCTL_MX | MADCTL_BGR); - _width = ILI9341_TFTWIDTH; - _height = ILI9341_TFTHEIGHT; - break; - case 1: - m = (MADCTL_MV | MADCTL_BGR); - _width = ILI9341_TFTHEIGHT; - _height = ILI9341_TFTWIDTH; - break; - case 2: - m = (MADCTL_MY | MADCTL_BGR); - _width = ILI9341_TFTWIDTH; - _height = ILI9341_TFTHEIGHT; - break; - case 3: - m = (MADCTL_MX | MADCTL_MY | MADCTL_MV | MADCTL_BGR); - _width = ILI9341_TFTHEIGHT; - _height = ILI9341_TFTWIDTH; - break; - } - - startWrite(); - writeCommand(ILI9341_MADCTL); - spiWrite(m); - endWrite(); -} - -/**************************************************************************/ -/*! - @brief Enable/Disable display color inversion - @param invert True to invert, False to have normal color -*/ -/**************************************************************************/ -void Adafruit_ILI9341::invertDisplay(boolean invert) { - startWrite(); - writeCommand(invert ? ILI9341_INVON : ILI9341_INVOFF); - endWrite(); -} - -/**************************************************************************/ -/*! - @brief Scroll display memory - @param y How many pixels to scroll display by -*/ -/**************************************************************************/ -void Adafruit_ILI9341::scrollTo(uint16_t y) { - startWrite(); - writeCommand(ILI9341_VSCRSADD); - SPI_WRITE16(y); - endWrite(); -} - -/**************************************************************************/ - -void Adafruit_ILI9341::setScrollMargins(uint16_t top, uint16_t bottom) -{ - uint16_t height = _height - (top + bottom); - - startWrite(); - writeCommand(0x33); - SPI_WRITE16(top); - SPI_WRITE16(height); - SPI_WRITE16(bottom); - endWrite(); -} - -/**************************************************************************/ -/*! - @brief Set the "address window" - the rectangle we will write to RAM with the next chunk of SPI data writes. The ILI9341 will automatically wrap the data as each row is filled - @param x TFT memory 'x' origin - @param y TFT memory 'y' origin - @param w Width of rectangle - @param h Height of rectangle -*/ -/**************************************************************************/ -void Adafruit_ILI9341::setAddrWindow(uint16_t x, uint16_t y, uint16_t w, uint16_t h) { - uint32_t xa = ((uint32_t)x << 16) | (x+w-1); - uint32_t ya = ((uint32_t)y << 16) | (y+h-1); - writeCommand(ILI9341_CASET); // Column addr set - SPI_WRITE32(xa); - writeCommand(ILI9341_PASET); // Row addr set - SPI_WRITE32(ya); - writeCommand(ILI9341_RAMWR); // write to RAM -} - -/**************************************************************************/ -/*! - @brief Read 8 bits of data from ILI9341 configuration memory. NOT from RAM! - This is highly undocumented/supported, it's really a hack but kinda works? - @param command The command register to read data from - @param index The byte index into the command to read from - @return Unsigned 8-bit data read from ILI9341 register -*/ -/**************************************************************************/ -uint8_t Adafruit_ILI9341::readcommand8(uint8_t command, uint8_t index) { - uint32_t freq = _freq; - if(_freq > 24000000) _freq = 24000000; - startWrite(); - writeCommand(0xD9); // woo sekret command? - spiWrite(0x10 + index); - writeCommand(command); - uint8_t r = spiRead(); - endWrite(); - _freq = freq; - return r; -} - diff --git a/lib/lib_display/Adafruit_ILI9341-1.2.0-Tasmota-1.0/Adafruit_ILI9341.h b/lib/lib_display/Adafruit_ILI9341-1.2.0-Tasmota-1.0/Adafruit_ILI9341.h deleted file mode 100644 index 368e1cc0f..000000000 --- a/lib/lib_display/Adafruit_ILI9341-1.2.0-Tasmota-1.0/Adafruit_ILI9341.h +++ /dev/null @@ -1,144 +0,0 @@ -/*! -* @file Adafruit_ILI9341.h -* -* This is the documentation for Adafruit's ILI9341 driver for the -* Arduino platform. -* -* This library works with the Adafruit 2.8" Touch Shield V2 (SPI) -* http://www.adafruit.com/products/1651 -* Adafruit 2.4" TFT LCD with Touchscreen Breakout w/MicroSD Socket - ILI9341 -* https://www.adafruit.com/product/2478 -* 2.8" TFT LCD with Touchscreen Breakout Board w/MicroSD Socket - ILI9341 -* https://www.adafruit.com/product/1770 -* 2.2" 18-bit color TFT LCD display with microSD card breakout - ILI9340 -* https://www.adafruit.com/product/1770 -* TFT FeatherWing - 2.4" 320x240 Touchscreen For All Feathers -* https://www.adafruit.com/product/3315 -* -* These displays use SPI to communicate, 4 or 5 pins are required -* to interface (RST is optional). -* -* Adafruit invests time and resources providing this open source code, -* please support Adafruit and open-source hardware by purchasing -* products from Adafruit! -* -* -* This library depends on -* Adafruit_GFX being present on your system. Please make sure you have -* installed the latest version before using this library. -* -* Written by Limor "ladyada" Fried for Adafruit Industries. -* -* BSD license, all text here must be included in any redistribution. -* -*/ - -#ifndef _ADAFRUIT_ILI9341H_ -#define _ADAFRUIT_ILI9341H_ - -#include "Arduino.h" -#include "Print.h" -#include -#include "Adafruit_GFX.h" -#include -#include - -#define ILI9341_TFTWIDTH 240 ///< ILI9341 max TFT width -#define ILI9341_TFTHEIGHT 320 ///< ILI9341 max TFT height - -#define ILI9341_NOP 0x00 ///< No-op register -#define ILI9341_SWRESET 0x01 ///< Software reset register -#define ILI9341_RDDID 0x04 ///< Read display identification information -#define ILI9341_RDDST 0x09 ///< Read Display Status - -#define ILI9341_SLPIN 0x10 ///< Enter Sleep Mode -#define ILI9341_SLPOUT 0x11 ///< Sleep Out -#define ILI9341_PTLON 0x12 ///< Partial Mode ON -#define ILI9341_NORON 0x13 ///< Normal Display Mode ON - -#define ILI9341_RDMODE 0x0A ///< Read Display Power Mode -#define ILI9341_RDMADCTL 0x0B ///< Read Display MADCTL -#define ILI9341_RDPIXFMT 0x0C ///< Read Display Pixel Format -#define ILI9341_RDIMGFMT 0x0D ///< Read Display Image Format -#define ILI9341_RDSELFDIAG 0x0F ///< Read Display Self-Diagnostic Result - -#define ILI9341_INVOFF 0x20 ///< Display Inversion OFF -#define ILI9341_INVON 0x21 ///< Display Inversion ON -#define ILI9341_GAMMASET 0x26 ///< Gamma Set -#define ILI9341_DISPOFF 0x28 ///< Display OFF -#define ILI9341_DISPON 0x29 ///< Display ON - -#define ILI9341_CASET 0x2A ///< Column Address Set -#define ILI9341_PASET 0x2B ///< Page Address Set -#define ILI9341_RAMWR 0x2C ///< Memory Write -#define ILI9341_RAMRD 0x2E ///< Memory Read - -#define ILI9341_PTLAR 0x30 ///< Partial Area -#define ILI9341_MADCTL 0x36 ///< Memory Access Control -#define ILI9341_VSCRSADD 0x37 ///< Vertical Scrolling Start Address -#define ILI9341_PIXFMT 0x3A ///< COLMOD: Pixel Format Set - -#define ILI9341_FRMCTR1 0xB1 ///< Frame Rate Control (In Normal Mode/Full Colors) -#define ILI9341_FRMCTR2 0xB2 ///< Frame Rate Control (In Idle Mode/8 colors) -#define ILI9341_FRMCTR3 0xB3 ///< Frame Rate control (In Partial Mode/Full Colors) -#define ILI9341_INVCTR 0xB4 ///< Display Inversion Control -#define ILI9341_DFUNCTR 0xB6 ///< Display Function Control - -#define ILI9341_PWCTR1 0xC0 ///< Power Control 1 -#define ILI9341_PWCTR2 0xC1 ///< Power Control 2 -#define ILI9341_PWCTR3 0xC2 ///< Power Control 3 -#define ILI9341_PWCTR4 0xC3 ///< Power Control 4 -#define ILI9341_PWCTR5 0xC4 ///< Power Control 5 -#define ILI9341_VMCTR1 0xC5 ///< VCOM Control 1 -#define ILI9341_VMCTR2 0xC7 ///< VCOM Control 2 - -#define ILI9341_RDID1 0xDA ///< Read ID 1 -#define ILI9341_RDID2 0xDB ///< Read ID 2 -#define ILI9341_RDID3 0xDC ///< Read ID 3 -#define ILI9341_RDID4 0xDD ///< Read ID 4 - -#define ILI9341_GMCTRP1 0xE0 ///< Positive Gamma Correction -#define ILI9341_GMCTRN1 0xE1 ///< Negative Gamma Correction -//#define ILI9341_PWCTR6 0xFC - -// Color definitions -#define ILI9341_BLACK 0x0000 ///< 0, 0, 0 -#define ILI9341_NAVY 0x000F ///< 0, 0, 123 -#define ILI9341_DARKGREEN 0x03E0 ///< 0, 125, 0 -#define ILI9341_DARKCYAN 0x03EF ///< 0, 125, 123 -#define ILI9341_MAROON 0x7800 ///< 123, 0, 0 -#define ILI9341_PURPLE 0x780F ///< 123, 0, 123 -#define ILI9341_OLIVE 0x7BE0 ///< 123, 125, 0 -#define ILI9341_LIGHTGREY 0xC618 ///< 198, 195, 198 -#define ILI9341_DARKGREY 0x7BEF ///< 123, 125, 123 -#define ILI9341_BLUE 0x001F ///< 0, 0, 255 -#define ILI9341_GREEN 0x07E0 ///< 0, 255, 0 -#define ILI9341_CYAN 0x07FF ///< 0, 255, 255 -#define ILI9341_RED 0xF800 ///< 255, 0, 0 -#define ILI9341_MAGENTA 0xF81F ///< 255, 0, 255 -#define ILI9341_YELLOW 0xFFE0 ///< 255, 255, 0 -#define ILI9341_WHITE 0xFFFF ///< 255, 255, 255 -#define ILI9341_ORANGE 0xFD20 ///< 255, 165, 0 -#define ILI9341_GREENYELLOW 0xAFE5 ///< 173, 255, 41 -#define ILI9341_PINK 0xFC18 ///< 255, 130, 198 - -///< Class to manage hardware interface with ILI9341 chipset (also seems to work with ILI9340) -class Adafruit_ILI9341 : public Adafruit_SPITFT { - public: - Adafruit_ILI9341(int8_t _CS, int8_t _DC, int8_t _MOSI, int8_t _SCLK, int8_t _RST = -1, int8_t _MISO = -1); - Adafruit_ILI9341(int8_t _CS, int8_t _DC, int8_t _RST = -1); - - void begin(uint32_t freq=0); - void setRotation(uint8_t r); - void invertDisplay(boolean i); - void scrollTo(uint16_t y); - - void setScrollMargins(uint16_t top, uint16_t bottom); - - // Transaction API not used by GFX - void setAddrWindow(uint16_t x, uint16_t y, uint16_t w, uint16_t h); - - uint8_t readcommand8(uint8_t reg, uint8_t index=0); -}; - -#endif // _ADAFRUIT_ILI9341H_ diff --git a/lib/lib_display/Adafruit_ILI9341-1.2.0-Tasmota-1.0/README.md b/lib/lib_display/Adafruit_ILI9341-1.2.0-Tasmota-1.0/README.md deleted file mode 100644 index b08f63086..000000000 --- a/lib/lib_display/Adafruit_ILI9341-1.2.0-Tasmota-1.0/README.md +++ /dev/null @@ -1,35 +0,0 @@ -# Adafruit ILI9341 Arduino Library [![Build Status](https://travis-ci.org/adafruit/Adafruit_ILI9341.svg?branch=master)](https://travis-ci.org/adafruit/Adafruit_ILI9341) - -This is a library for the Adafruit ILI9341 display products - -This library works with the Adafruit 2.8" Touch Shield V2 (SPI) - * http://www.adafruit.com/products/1651 - -Adafruit 2.4" TFT LCD with Touchscreen Breakout w/MicroSD Socket - ILI9341 - * https://www.adafruit.com/product/2478 - -2.8" TFT LCD with Touchscreen Breakout Board w/MicroSD Socket - ILI9341 - * https://www.adafruit.com/product/1770 - -2.2" 18-bit color TFT LCD display with microSD card breakout - ILI9340 - * https://www.adafruit.com/product/1480 - -TFT FeatherWing - 2.4" 320x240 Touchscreen For All Feathers - * https://www.adafruit.com/product/3315 - -Check out the links above for our tutorials and wiring diagrams. -These displays use SPI to communicate, 4 or 5 pins are required -to interface (RST is optional). - -Adafruit invests time and resources providing this open source code, -please support Adafruit and open-source hardware by purchasing -products from Adafruit! - -Written by Limor Fried/Ladyada for Adafruit Industries. -MIT license, all text above must be included in any redistribution - -To download. click the DOWNLOADS button in the top right corner, rename the uncompressed folder Adafruit_ILI9341. Check that the Adafruit_ILI9341 folder contains Adafruit_ILI9341.cpp and Adafruit_ILI9341. - -Place the Adafruit_ILI9341 library folder your arduinosketchfolder/libraries/ folder. You may need to create the libraries subfolder if its your first library. Restart the IDE - -Also requires the Adafruit_GFX library for Arduino. diff --git a/lib/lib_display/Adafruit_ILI9341-1.2.0-Tasmota-1.0/examples/breakouttouchpaint/.esp8266.test.skip b/lib/lib_display/Adafruit_ILI9341-1.2.0-Tasmota-1.0/examples/breakouttouchpaint/.esp8266.test.skip deleted file mode 100644 index e69de29bb..000000000 diff --git a/lib/lib_display/Adafruit_ILI9341-1.2.0-Tasmota-1.0/examples/breakouttouchpaint/breakouttouchpaint.ino b/lib/lib_display/Adafruit_ILI9341-1.2.0-Tasmota-1.0/examples/breakouttouchpaint/breakouttouchpaint.ino deleted file mode 100644 index 298bcad6b..000000000 --- a/lib/lib_display/Adafruit_ILI9341-1.2.0-Tasmota-1.0/examples/breakouttouchpaint/breakouttouchpaint.ino +++ /dev/null @@ -1,145 +0,0 @@ -/*************************************************** - This is our touchscreen painting example for the Adafruit ILI9341 Breakout - ----> http://www.adafruit.com/products/1770 - - Check out the links above for our tutorials and wiring diagrams - These displays use SPI to communicate, 4 or 5 pins are required to - interface (RST is optional) - Adafruit invests time and resources providing this open source code, - please support Adafruit and open-source hardware by purchasing - products from Adafruit! - - Written by Limor Fried/Ladyada for Adafruit Industries. - MIT license, all text above must be included in any redistribution - ****************************************************/ - -/** NOT FOR USE WITH THE TOUCH SHIELD, ONLY FOR THE BREAKOUT! **/ - -#include // Core graphics library -#include -#include -#include "TouchScreen.h" - -// These are the four touchscreen analog pins -#define YP A2 // must be an analog pin, use "An" notation! -#define XM A3 // must be an analog pin, use "An" notation! -#define YM 5 // can be a digital pin -#define XP 4 // can be a digital pin - -// This is calibration data for the raw touch data to the screen coordinates -#define TS_MINX 150 -#define TS_MINY 120 -#define TS_MAXX 920 -#define TS_MAXY 940 - -#define MINPRESSURE 10 -#define MAXPRESSURE 1000 - -// The display uses hardware SPI, plus #9 & #10 -#define TFT_CS 10 -#define TFT_DC 9 -Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC); - -// For better pressure precision, we need to know the resistance -// between X+ and X- Use any multimeter to read it -// For the one we're using, its 300 ohms across the X plate -TouchScreen ts = TouchScreen(XP, YP, XM, YM, 300); - -// Size of the color selection boxes and the paintbrush size -#define BOXSIZE 40 -#define PENRADIUS 3 -int oldcolor, currentcolor; - -void setup(void) { - // while (!Serial); // used for leonardo debugging - - Serial.begin(9600); - Serial.println(F("Touch Paint!")); - - tft.begin(); - tft.fillScreen(ILI9341_BLACK); - - // make the color selection boxes - tft.fillRect(0, 0, BOXSIZE, BOXSIZE, ILI9341_RED); - tft.fillRect(BOXSIZE, 0, BOXSIZE, BOXSIZE, ILI9341_YELLOW); - tft.fillRect(BOXSIZE*2, 0, BOXSIZE, BOXSIZE, ILI9341_GREEN); - tft.fillRect(BOXSIZE*3, 0, BOXSIZE, BOXSIZE, ILI9341_CYAN); - tft.fillRect(BOXSIZE*4, 0, BOXSIZE, BOXSIZE, ILI9341_BLUE); - tft.fillRect(BOXSIZE*5, 0, BOXSIZE, BOXSIZE, ILI9341_MAGENTA); - - // select the current color 'red' - tft.drawRect(0, 0, BOXSIZE, BOXSIZE, ILI9341_WHITE); - currentcolor = ILI9341_RED; -} - - -void loop() -{ - // Retrieve a point - TSPoint p = ts.getPoint(); - - /* - Serial.print("X = "); Serial.print(p.x); - Serial.print("\tY = "); Serial.print(p.y); - Serial.print("\tPressure = "); Serial.println(p.z); - */ - - // we have some minimum pressure we consider 'valid' - // pressure of 0 means no pressing! - if (p.z < MINPRESSURE || p.z > MAXPRESSURE) { - return; - } - - // Scale from ~0->1000 to tft.width using the calibration #'s - p.x = map(p.x, TS_MINX, TS_MAXX, 0, tft.width()); - p.y = map(p.y, TS_MINY, TS_MAXY, 0, tft.height()); - - /* - Serial.print("("); Serial.print(p.x); - Serial.print(", "); Serial.print(p.y); - Serial.println(")"); - */ - - - if (p.y < BOXSIZE) { - oldcolor = currentcolor; - - if (p.x < BOXSIZE) { - currentcolor = ILI9341_RED; - tft.drawRect(0, 0, BOXSIZE, BOXSIZE, ILI9341_WHITE); - } else if (p.x < BOXSIZE*2) { - currentcolor = ILI9341_YELLOW; - tft.drawRect(BOXSIZE, 0, BOXSIZE, BOXSIZE, ILI9341_WHITE); - } else if (p.x < BOXSIZE*3) { - currentcolor = ILI9341_GREEN; - tft.drawRect(BOXSIZE*2, 0, BOXSIZE, BOXSIZE, ILI9341_WHITE); - } else if (p.x < BOXSIZE*4) { - currentcolor = ILI9341_CYAN; - tft.drawRect(BOXSIZE*3, 0, BOXSIZE, BOXSIZE, ILI9341_WHITE); - } else if (p.x < BOXSIZE*5) { - currentcolor = ILI9341_BLUE; - tft.drawRect(BOXSIZE*4, 0, BOXSIZE, BOXSIZE, ILI9341_WHITE); - } else if (p.x < BOXSIZE*6) { - currentcolor = ILI9341_MAGENTA; - tft.drawRect(BOXSIZE*5, 0, BOXSIZE, BOXSIZE, ILI9341_WHITE); - } - - if (oldcolor != currentcolor) { - if (oldcolor == ILI9341_RED) - tft.fillRect(0, 0, BOXSIZE, BOXSIZE, ILI9341_RED); - if (oldcolor == ILI9341_YELLOW) - tft.fillRect(BOXSIZE, 0, BOXSIZE, BOXSIZE, ILI9341_YELLOW); - if (oldcolor == ILI9341_GREEN) - tft.fillRect(BOXSIZE*2, 0, BOXSIZE, BOXSIZE, ILI9341_GREEN); - if (oldcolor == ILI9341_CYAN) - tft.fillRect(BOXSIZE*3, 0, BOXSIZE, BOXSIZE, ILI9341_CYAN); - if (oldcolor == ILI9341_BLUE) - tft.fillRect(BOXSIZE*4, 0, BOXSIZE, BOXSIZE, ILI9341_BLUE); - if (oldcolor == ILI9341_MAGENTA) - tft.fillRect(BOXSIZE*5, 0, BOXSIZE, BOXSIZE, ILI9341_MAGENTA); - } - } - if (((p.y-PENRADIUS) > BOXSIZE) && ((p.y+PENRADIUS) < tft.height())) { - tft.fillCircle(p.x, p.y, PENRADIUS, currentcolor); - } -} diff --git a/lib/lib_display/Adafruit_ILI9341-1.2.0-Tasmota-1.0/examples/fulltest_featherwing/.mega2560.test.skip b/lib/lib_display/Adafruit_ILI9341-1.2.0-Tasmota-1.0/examples/fulltest_featherwing/.mega2560.test.skip deleted file mode 100644 index e69de29bb..000000000 diff --git a/lib/lib_display/Adafruit_ILI9341-1.2.0-Tasmota-1.0/examples/fulltest_featherwing/fulltest_featherwing.ino b/lib/lib_display/Adafruit_ILI9341-1.2.0-Tasmota-1.0/examples/fulltest_featherwing/fulltest_featherwing.ino deleted file mode 100644 index 25f32f2e6..000000000 --- a/lib/lib_display/Adafruit_ILI9341-1.2.0-Tasmota-1.0/examples/fulltest_featherwing/fulltest_featherwing.ino +++ /dev/null @@ -1,265 +0,0 @@ -/*************************************************** - This is our touchscreen painting example for the Adafruit TFT FeatherWing - ----> http://www.adafruit.com/products/3315 - - Check out the links above for our tutorials and wiring diagrams - - Adafruit invests time and resources providing this open source code, - please support Adafruit and open-source hardware by purchasing - products from Adafruit! - - Written by Limor Fried/Ladyada for Adafruit Industries. - MIT license, all text above must be included in any redistribution - ****************************************************/ - -#include -#include // this is needed even tho we aren't using it - -#include // Core graphics library -#include // Hardware-specific library -#include -#include - -#ifdef ESP8266 - #define STMPE_CS 16 - #define TFT_CS 0 - #define TFT_DC 15 - #define SD_CS 2 -#endif -#ifdef ESP32 - #define STMPE_CS 32 - #define TFT_CS 15 - #define TFT_DC 33 - #define SD_CS 14 -#endif -#ifdef TEENSYDUINO - #define TFT_DC 10 - #define TFT_CS 4 - #define STMPE_CS 3 - #define SD_CS 8 -#endif -#ifdef ARDUINO_STM32_FEATHER - #define TFT_DC PB4 - #define TFT_CS PA15 - #define STMPE_CS PC7 - #define SD_CS PC5 -#endif -#ifdef ARDUINO_NRF52_FEATHER /* BSP 0.6.5 and higher! */ - #define TFT_DC 11 - #define TFT_CS 31 - #define STMPE_CS 30 - #define SD_CS 27 -#endif -#if defined(ARDUINO_MAX32620FTHR) || defined(ARDUINO_MAX32630FTHR) - #define TFT_DC P5_4 - #define TFT_CS P5_3 - #define STMPE_CS P3_3 - #define SD_CS P3_2 -#endif - -// Anything else! -#if defined (__AVR_ATmega32U4__) || defined(ARDUINO_SAMD_FEATHER_M0) || defined (__AVR_ATmega328P__) || defined(ARDUINO_SAMD_ZERO) || defined(__SAMD51__) || defined(__SAM3X8E__) - #define STMPE_CS 6 - #define TFT_CS 9 - #define TFT_DC 10 - #define SD_CS 5 -#endif - -Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC); -Adafruit_STMPE610 ts = Adafruit_STMPE610(STMPE_CS); - - -// This is calibration data for the raw touch data to the screen coordinates -#define TS_MINX 3800 -#define TS_MAXX 100 -#define TS_MINY 100 -#define TS_MAXY 3750 - -#define PENRADIUS 3 - -void setup(void) { - Serial.begin(115200); - - delay(10); - Serial.println("FeatherWing TFT"); - if (!ts.begin()) { - Serial.println("Couldn't start touchscreen controller"); - while (1); - } - Serial.println("Touchscreen started"); - - tft.begin(); - tft.fillScreen(ILI9341_BLUE); - - yield(); - - Serial.print("Initializing SD card..."); - if (!SD.begin(SD_CS)) { - Serial.println("failed!"); - } - Serial.println("OK!"); - - bmpDraw("purple.bmp", 0, 0); -} - -void loop() { - // Retrieve a point - TS_Point p = ts.getPoint(); - - Serial.print("X = "); Serial.print(p.x); - Serial.print("\tY = "); Serial.print(p.y); - Serial.print("\tPressure = "); Serial.println(p.z); - - // Scale from ~0->4000 to tft.width using the calibration #'s - p.x = map(p.x, TS_MINX, TS_MAXX, 0, tft.width()); - p.y = map(p.y, TS_MINY, TS_MAXY, 0, tft.height()); - - if (((p.y-PENRADIUS) > 0) && ((p.y+PENRADIUS) < tft.height())) { - tft.fillCircle(p.x, p.y, PENRADIUS, ILI9341_RED); - } -} - -// This function opens a Windows Bitmap (BMP) file and -// displays it at the given coordinates. It's sped up -// by reading many pixels worth of data at a time -// (rather than pixel by pixel). Increasing the buffer -// size takes more of the Arduino's precious RAM but -// makes loading a little faster. 20 pixels seems a -// good balance. - -#define BUFFPIXEL 20 - -void bmpDraw(char *filename, int16_t x, int16_t y) { - - File bmpFile; - int bmpWidth, bmpHeight; // W+H in pixels - uint8_t bmpDepth; // Bit depth (currently must be 24) - uint32_t bmpImageoffset; // Start of image data in file - uint32_t rowSize; // Not always = bmpWidth; may have padding - uint8_t sdbuffer[3*BUFFPIXEL]; // pixel buffer (R+G+B per pixel) - uint8_t buffidx = sizeof(sdbuffer); // Current position in sdbuffer - boolean goodBmp = false; // Set to true on valid header parse - boolean flip = true; // BMP is stored bottom-to-top - int w, h, row, col; - uint8_t r, g, b; - uint32_t pos = 0, startTime = millis(); - - if((x >= tft.width()) || (y >= tft.height())) return; - - Serial.println(); - Serial.print(F("Loading image '")); - Serial.print(filename); - Serial.println('\''); - - // Open requested file on SD card - if ((bmpFile = SD.open(filename)) == NULL) { - Serial.print(F("File not found")); - return; - } - - // Parse BMP header - if(read16(bmpFile) == 0x4D42) { // BMP signature - Serial.print(F("File size: ")); Serial.println(read32(bmpFile)); - (void)read32(bmpFile); // Read & ignore creator bytes - bmpImageoffset = read32(bmpFile); // Start of image data - Serial.print(F("Image Offset: ")); Serial.println(bmpImageoffset, DEC); - // Read DIB header - Serial.print(F("Header size: ")); Serial.println(read32(bmpFile)); - bmpWidth = read32(bmpFile); - bmpHeight = read32(bmpFile); - if(read16(bmpFile) == 1) { // # planes -- must be '1' - bmpDepth = read16(bmpFile); // bits per pixel - Serial.print(F("Bit Depth: ")); Serial.println(bmpDepth); - if((bmpDepth == 24) && (read32(bmpFile) == 0)) { // 0 = uncompressed - - goodBmp = true; // Supported BMP format -- proceed! - Serial.print(F("Image size: ")); - Serial.print(bmpWidth); - Serial.print('x'); - Serial.println(bmpHeight); - - // BMP rows are padded (if needed) to 4-byte boundary - rowSize = (bmpWidth * 3 + 3) & ~3; - - // If bmpHeight is negative, image is in top-down order. - // This is not canon but has been observed in the wild. - if(bmpHeight < 0) { - bmpHeight = -bmpHeight; - flip = false; - } - - // Crop area to be loaded - w = bmpWidth; - h = bmpHeight; - if((x+w-1) >= tft.width()) w = tft.width() - x; - if((y+h-1) >= tft.height()) h = tft.height() - y; - - // Set TFT address window to clipped image bounds - tft.startWrite(); - tft.setAddrWindow(x, y, w, h); - - for (row=0; row= sizeof(sdbuffer)) { // Indeed - tft.endWrite(); - bmpFile.read(sdbuffer, sizeof(sdbuffer)); - tft.startWrite(); - buffidx = 0; // Set index to beginning - } - - // Convert pixel from BMP to TFT format, push to display - b = sdbuffer[buffidx++]; - g = sdbuffer[buffidx++]; - r = sdbuffer[buffidx++]; - tft.pushColor(tft.color565(r,g,b)); - } // end pixel - tft.endWrite(); - } // end scanline - Serial.print(F("Loaded in ")); - Serial.print(millis() - startTime); - Serial.println(" ms"); - } // end goodBmp - } - } - - bmpFile.close(); - if(!goodBmp) Serial.println(F("BMP format not recognized.")); -} - -// These read 16- and 32-bit types from the SD card file. -// BMP data is stored little-endian, Arduino is little-endian too. -// May need to reverse subscript order if porting elsewhere. - -uint16_t read16(File &f) { - uint16_t result; - ((uint8_t *)&result)[0] = f.read(); // LSB - ((uint8_t *)&result)[1] = f.read(); // MSB - return result; -} - -uint32_t read32(File &f) { - uint32_t result; - ((uint8_t *)&result)[0] = f.read(); // LSB - ((uint8_t *)&result)[1] = f.read(); - ((uint8_t *)&result)[2] = f.read(); - ((uint8_t *)&result)[3] = f.read(); // MSB - return result; -} diff --git a/lib/lib_display/Adafruit_ILI9341-1.2.0-Tasmota-1.0/examples/graphicstest/graphicstest.ino b/lib/lib_display/Adafruit_ILI9341-1.2.0-Tasmota-1.0/examples/graphicstest/graphicstest.ino deleted file mode 100644 index 3154d4095..000000000 --- a/lib/lib_display/Adafruit_ILI9341-1.2.0-Tasmota-1.0/examples/graphicstest/graphicstest.ino +++ /dev/null @@ -1,365 +0,0 @@ -/*************************************************** - This is our GFX example for the Adafruit ILI9341 Breakout and Shield - ----> http://www.adafruit.com/products/1651 - - Check out the links above for our tutorials and wiring diagrams - These displays use SPI to communicate, 4 or 5 pins are required to - interface (RST is optional) - Adafruit invests time and resources providing this open source code, - please support Adafruit and open-source hardware by purchasing - products from Adafruit! - - Written by Limor Fried/Ladyada for Adafruit Industries. - MIT license, all text above must be included in any redistribution - ****************************************************/ - - -#include "SPI.h" -#include "Adafruit_GFX.h" -#include "Adafruit_ILI9341.h" - -// For the Adafruit shield, these are the default. -#define TFT_DC 9 -#define TFT_CS 10 - -// Use hardware SPI (on Uno, #13, #12, #11) and the above for CS/DC -Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC); -// If using the breakout, change pins as desired -//Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_MOSI, TFT_CLK, TFT_RST, TFT_MISO); - -void setup() { - Serial.begin(9600); - Serial.println("ILI9341 Test!"); - - tft.begin(); - - // read diagnostics (optional but can help debug problems) - uint8_t x = tft.readcommand8(ILI9341_RDMODE); - Serial.print("Display Power Mode: 0x"); Serial.println(x, HEX); - x = tft.readcommand8(ILI9341_RDMADCTL); - Serial.print("MADCTL Mode: 0x"); Serial.println(x, HEX); - x = tft.readcommand8(ILI9341_RDPIXFMT); - Serial.print("Pixel Format: 0x"); Serial.println(x, HEX); - x = tft.readcommand8(ILI9341_RDIMGFMT); - Serial.print("Image Format: 0x"); Serial.println(x, HEX); - x = tft.readcommand8(ILI9341_RDSELFDIAG); - Serial.print("Self Diagnostic: 0x"); Serial.println(x, HEX); - - Serial.println(F("Benchmark Time (microseconds)")); - delay(10); - Serial.print(F("Screen fill ")); - Serial.println(testFillScreen()); - delay(500); - - Serial.print(F("Text ")); - Serial.println(testText()); - delay(3000); - - Serial.print(F("Lines ")); - Serial.println(testLines(ILI9341_CYAN)); - delay(500); - - Serial.print(F("Horiz/Vert Lines ")); - Serial.println(testFastLines(ILI9341_RED, ILI9341_BLUE)); - delay(500); - - Serial.print(F("Rectangles (outline) ")); - Serial.println(testRects(ILI9341_GREEN)); - delay(500); - - Serial.print(F("Rectangles (filled) ")); - Serial.println(testFilledRects(ILI9341_YELLOW, ILI9341_MAGENTA)); - delay(500); - - Serial.print(F("Circles (filled) ")); - Serial.println(testFilledCircles(10, ILI9341_MAGENTA)); - - Serial.print(F("Circles (outline) ")); - Serial.println(testCircles(10, ILI9341_WHITE)); - delay(500); - - Serial.print(F("Triangles (outline) ")); - Serial.println(testTriangles()); - delay(500); - - Serial.print(F("Triangles (filled) ")); - Serial.println(testFilledTriangles()); - delay(500); - - Serial.print(F("Rounded rects (outline) ")); - Serial.println(testRoundRects()); - delay(500); - - Serial.print(F("Rounded rects (filled) ")); - Serial.println(testFilledRoundRects()); - delay(500); - - Serial.println(F("Done!")); - -} - - -void loop(void) { - for(uint8_t rotation=0; rotation<4; rotation++) { - tft.setRotation(rotation); - testText(); - delay(1000); - } -} - -unsigned long testFillScreen() { - unsigned long start = micros(); - tft.fillScreen(ILI9341_BLACK); - yield(); - tft.fillScreen(ILI9341_RED); - yield(); - tft.fillScreen(ILI9341_GREEN); - yield(); - tft.fillScreen(ILI9341_BLUE); - yield(); - tft.fillScreen(ILI9341_BLACK); - yield(); - return micros() - start; -} - -unsigned long testText() { - tft.fillScreen(ILI9341_BLACK); - unsigned long start = micros(); - tft.setCursor(0, 0); - tft.setTextColor(ILI9341_WHITE); tft.setTextSize(1); - tft.println("Hello World!"); - tft.setTextColor(ILI9341_YELLOW); tft.setTextSize(2); - tft.println(1234.56); - tft.setTextColor(ILI9341_RED); tft.setTextSize(3); - tft.println(0xDEADBEEF, HEX); - tft.println(); - tft.setTextColor(ILI9341_GREEN); - tft.setTextSize(5); - tft.println("Groop"); - tft.setTextSize(2); - tft.println("I implore thee,"); - tft.setTextSize(1); - tft.println("my foonting turlingdromes."); - tft.println("And hooptiously drangle me"); - tft.println("with crinkly bindlewurdles,"); - tft.println("Or I will rend thee"); - tft.println("in the gobberwarts"); - tft.println("with my blurglecruncheon,"); - tft.println("see if I don't!"); - return micros() - start; -} - -unsigned long testLines(uint16_t color) { - unsigned long start, t; - int x1, y1, x2, y2, - w = tft.width(), - h = tft.height(); - - tft.fillScreen(ILI9341_BLACK); - yield(); - - x1 = y1 = 0; - y2 = h - 1; - start = micros(); - for(x2=0; x20; i-=6) { - i2 = i / 2; - start = micros(); - tft.fillRect(cx-i2, cy-i2, i, i, color1); - t += micros() - start; - // Outlines are not included in timing results - tft.drawRect(cx-i2, cy-i2, i, i, color2); - yield(); - } - - return t; -} - -unsigned long testFilledCircles(uint8_t radius, uint16_t color) { - unsigned long start; - int x, y, w = tft.width(), h = tft.height(), r2 = radius * 2; - - tft.fillScreen(ILI9341_BLACK); - start = micros(); - for(x=radius; x10; i-=5) { - start = micros(); - tft.fillTriangle(cx, cy - i, cx - i, cy + i, cx + i, cy + i, - tft.color565(0, i*10, i*10)); - t += micros() - start; - tft.drawTriangle(cx, cy - i, cx - i, cy + i, cx + i, cy + i, - tft.color565(i*10, i*10, 0)); - yield(); - } - - return t; -} - -unsigned long testRoundRects() { - unsigned long start; - int w, i, i2, - cx = tft.width() / 2 - 1, - cy = tft.height() / 2 - 1; - - tft.fillScreen(ILI9341_BLACK); - w = min(tft.width(), tft.height()); - start = micros(); - for(i=0; i20; i-=6) { - i2 = i / 2; - tft.fillRoundRect(cx-i2, cy-i2, i, i, i/8, tft.color565(0, i, 0)); - yield(); - } - - return micros() - start; -} \ No newline at end of file diff --git a/lib/lib_display/Adafruit_ILI9341-1.2.0-Tasmota-1.0/examples/graphicstest_featherwing/.mega2560.test.skip b/lib/lib_display/Adafruit_ILI9341-1.2.0-Tasmota-1.0/examples/graphicstest_featherwing/.mega2560.test.skip deleted file mode 100644 index e69de29bb..000000000 diff --git a/lib/lib_display/Adafruit_ILI9341-1.2.0-Tasmota-1.0/examples/graphicstest_featherwing/graphicstest_featherwing.ino b/lib/lib_display/Adafruit_ILI9341-1.2.0-Tasmota-1.0/examples/graphicstest_featherwing/graphicstest_featherwing.ino deleted file mode 100644 index 2a108d29c..000000000 --- a/lib/lib_display/Adafruit_ILI9341-1.2.0-Tasmota-1.0/examples/graphicstest_featherwing/graphicstest_featherwing.ino +++ /dev/null @@ -1,404 +0,0 @@ -/*************************************************** - This is our GFX example for the Adafruit ILI9341 TFT FeatherWing - ----> http://www.adafruit.com/products/3315 - - Check out the links above for our tutorials and wiring diagrams - - Adafruit invests time and resources providing this open source code, - please support Adafruit and open-source hardware by purchasing - products from Adafruit! - - Written by Limor Fried/Ladyada for Adafruit Industries. - MIT license, all text above must be included in any redistribution - ****************************************************/ - -#include -#include -#include - -#ifdef ESP8266 - #define STMPE_CS 16 - #define TFT_CS 0 - #define TFT_DC 15 - #define SD_CS 2 -#endif -#ifdef ESP32 - #define STMPE_CS 32 - #define TFT_CS 15 - #define TFT_DC 33 - #define SD_CS 14 -#endif -#ifdef TEENSYDUINO - #define TFT_DC 10 - #define TFT_CS 4 - #define STMPE_CS 3 - #define SD_CS 8 -#endif -#ifdef ARDUINO_STM32_FEATHER - #define TFT_DC PB4 - #define TFT_CS PA15 - #define STMPE_CS PC7 - #define SD_CS PC5 -#endif -#ifdef ARDUINO_NRF52_FEATHER /* BSP 0.6.5 and higher! */ - #define TFT_DC 11 - #define TFT_CS 31 - #define STMPE_CS 30 - #define SD_CS 27 -#endif -#if defined(ARDUINO_MAX32620FTHR) || defined(ARDUINO_MAX32630FTHR) - #define TFT_DC P5_4 - #define TFT_CS P5_3 - #define STMPE_CS P3_3 - #define SD_CS P3_2 -#endif - -// Anything else! -#if defined (__AVR_ATmega32U4__) || defined(ARDUINO_SAMD_FEATHER_M0) || defined (__AVR_ATmega328P__) || defined(ARDUINO_SAMD_ZERO) || defined(__SAMD51__) || defined(__SAM3X8E__) - #define STMPE_CS 6 - #define TFT_CS 9 - #define TFT_DC 10 - #define SD_CS 5 -#endif - - -Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC); - -void setup() { - Serial.begin(115200); - - delay(10); - Serial.println("FeatherWing TFT Test!"); - - tft.begin(); - - // read diagnostics (optional but can help debug problems) - uint8_t x = tft.readcommand8(ILI9341_RDMODE); - Serial.print("Display Power Mode: 0x"); Serial.println(x, HEX); - x = tft.readcommand8(ILI9341_RDMADCTL); - Serial.print("MADCTL Mode: 0x"); Serial.println(x, HEX); - x = tft.readcommand8(ILI9341_RDPIXFMT); - Serial.print("Pixel Format: 0x"); Serial.println(x, HEX); - x = tft.readcommand8(ILI9341_RDIMGFMT); - Serial.print("Image Format: 0x"); Serial.println(x, HEX); - x = tft.readcommand8(ILI9341_RDSELFDIAG); - Serial.print("Self Diagnostic: 0x"); Serial.println(x, HEX); - - Serial.println(F("Benchmark Time (microseconds)")); - delay(10); - Serial.print(F("Screen fill ")); - Serial.println(testFillScreen()); - delay(500); - - Serial.print(F("Text ")); - Serial.println(testText()); - delay(3000); - - Serial.print(F("Lines ")); - Serial.println(testLines(ILI9341_CYAN)); - delay(500); - - Serial.print(F("Horiz/Vert Lines ")); - Serial.println(testFastLines(ILI9341_RED, ILI9341_BLUE)); - delay(500); - - Serial.print(F("Rectangles (outline) ")); - Serial.println(testRects(ILI9341_GREEN)); - delay(500); - - Serial.print(F("Rectangles (filled) ")); - Serial.println(testFilledRects(ILI9341_YELLOW, ILI9341_MAGENTA)); - delay(500); - - Serial.print(F("Circles (filled) ")); - Serial.println(testFilledCircles(10, ILI9341_MAGENTA)); - - Serial.print(F("Circles (outline) ")); - Serial.println(testCircles(10, ILI9341_WHITE)); - delay(500); - - Serial.print(F("Triangles (outline) ")); - Serial.println(testTriangles()); - delay(500); - - Serial.print(F("Triangles (filled) ")); - Serial.println(testFilledTriangles()); - delay(500); - - Serial.print(F("Rounded rects (outline) ")); - Serial.println(testRoundRects()); - delay(500); - - Serial.print(F("Rounded rects (filled) ")); - Serial.println(testFilledRoundRects()); - delay(500); - - Serial.println(F("Done!")); - -} - - -void loop(void) { - for(uint8_t rotation=0; rotation<4; rotation++) { - tft.setRotation(rotation); - testText(); - delay(1000); - } -} - -unsigned long testFillScreen() { - unsigned long start = micros(); - tft.fillScreen(ILI9341_BLACK); - yield(); - tft.fillScreen(ILI9341_RED); - yield(); - tft.fillScreen(ILI9341_GREEN); - yield(); - tft.fillScreen(ILI9341_BLUE); - yield(); - tft.fillScreen(ILI9341_BLACK); - yield(); - return micros() - start; -} - -unsigned long testText() { - tft.fillScreen(ILI9341_BLACK); - unsigned long start = micros(); - tft.setCursor(0, 0); - tft.setTextColor(ILI9341_WHITE); tft.setTextSize(1); - tft.println("Hello World!"); - tft.setTextColor(ILI9341_YELLOW); tft.setTextSize(2); - tft.println(1234.56); - tft.setTextColor(ILI9341_RED); tft.setTextSize(3); - tft.println(0xDEADBEEF, HEX); - tft.println(); - tft.setTextColor(ILI9341_GREEN); - tft.setTextSize(5); - tft.println("Groop"); - tft.setTextSize(2); - tft.println("I implore thee,"); - tft.setTextSize(1); - tft.println("my foonting turlingdromes."); - tft.println("And hooptiously drangle me"); - tft.println("with crinkly bindlewurdles,"); - tft.println("Or I will rend thee"); - tft.println("in the gobberwarts"); - tft.println("with my blurglecruncheon,"); - tft.println("see if I don't!"); - return micros() - start; -} - -unsigned long testLines(uint16_t color) { - unsigned long start, t; - int x1, y1, x2, y2, - w = tft.width(), - h = tft.height(); - - tft.fillScreen(ILI9341_BLACK); - yield(); - - x1 = y1 = 0; - y2 = h - 1; - start = micros(); - for(x2=0; x20; i-=6) { - i2 = i / 2; - start = micros(); - tft.fillRect(cx-i2, cy-i2, i, i, color1); - t += micros() - start; - // Outlines are not included in timing results - tft.drawRect(cx-i2, cy-i2, i, i, color2); - yield(); - } - - return t; -} - -unsigned long testFilledCircles(uint8_t radius, uint16_t color) { - unsigned long start; - int x, y, w = tft.width(), h = tft.height(), r2 = radius * 2; - - tft.fillScreen(ILI9341_BLACK); - start = micros(); - for(x=radius; x10; i-=5) { - start = micros(); - tft.fillTriangle(cx, cy - i, cx - i, cy + i, cx + i, cy + i, - tft.color565(0, i*10, i*10)); - t += micros() - start; - tft.drawTriangle(cx, cy - i, cx - i, cy + i, cx + i, cy + i, - tft.color565(i*10, i*10, 0)); - yield(); - } - - return t; -} - -unsigned long testRoundRects() { - unsigned long start; - int w, i, i2, - cx = tft.width() / 2 - 1, - cy = tft.height() / 2 - 1; - - tft.fillScreen(ILI9341_BLACK); - w = min(tft.width(), tft.height()); - start = micros(); - for(i=0; i20; i-=6) { - i2 = i / 2; - tft.fillRoundRect(cx-i2, cy-i2, i, i, i/8, tft.color565(0, i, 0)); - yield(); - } - - return micros() - start; -} diff --git a/lib/lib_display/Adafruit_ILI9341-1.2.0-Tasmota-1.0/examples/onoffbutton/onoffbutton.ino b/lib/lib_display/Adafruit_ILI9341-1.2.0-Tasmota-1.0/examples/onoffbutton/onoffbutton.ino deleted file mode 100644 index 3365d3385..000000000 --- a/lib/lib_display/Adafruit_ILI9341-1.2.0-Tasmota-1.0/examples/onoffbutton/onoffbutton.ino +++ /dev/null @@ -1,125 +0,0 @@ -//This example implements a simple sliding On/Off button. The example -// demonstrates drawing and touch operations. -// -//Thanks to Adafruit forums member Asteroid for the original sketch! -// -#include -#include -#include -#include -#include - -// This is calibration data for the raw touch data to the screen coordinates -#define TS_MINX 150 -#define TS_MINY 130 -#define TS_MAXX 3800 -#define TS_MAXY 4000 - -#define STMPE_CS 8 -Adafruit_STMPE610 ts = Adafruit_STMPE610(STMPE_CS); -#define TFT_CS 10 -#define TFT_DC 9 -Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC); - -boolean RecordOn = false; - -#define FRAME_X 210 -#define FRAME_Y 180 -#define FRAME_W 100 -#define FRAME_H 50 - -#define REDBUTTON_X FRAME_X -#define REDBUTTON_Y FRAME_Y -#define REDBUTTON_W (FRAME_W/2) -#define REDBUTTON_H FRAME_H - -#define GREENBUTTON_X (REDBUTTON_X + REDBUTTON_W) -#define GREENBUTTON_Y FRAME_Y -#define GREENBUTTON_W (FRAME_W/2) -#define GREENBUTTON_H FRAME_H - -void drawFrame() -{ - tft.drawRect(FRAME_X, FRAME_Y, FRAME_W, FRAME_H, ILI9341_BLACK); -} - -void redBtn() -{ - tft.fillRect(REDBUTTON_X, REDBUTTON_Y, REDBUTTON_W, REDBUTTON_H, ILI9341_RED); - tft.fillRect(GREENBUTTON_X, GREENBUTTON_Y, GREENBUTTON_W, GREENBUTTON_H, ILI9341_BLUE); - drawFrame(); - tft.setCursor(GREENBUTTON_X + 6 , GREENBUTTON_Y + (GREENBUTTON_H/2)); - tft.setTextColor(ILI9341_WHITE); - tft.setTextSize(2); - tft.println("ON"); - RecordOn = false; -} - -void greenBtn() -{ - tft.fillRect(GREENBUTTON_X, GREENBUTTON_Y, GREENBUTTON_W, GREENBUTTON_H, ILI9341_GREEN); - tft.fillRect(REDBUTTON_X, REDBUTTON_Y, REDBUTTON_W, REDBUTTON_H, ILI9341_BLUE); - drawFrame(); - tft.setCursor(REDBUTTON_X + 6 , REDBUTTON_Y + (REDBUTTON_H/2)); - tft.setTextColor(ILI9341_WHITE); - tft.setTextSize(2); - tft.println("OFF"); - RecordOn = true; -} - -void setup(void) -{ - Serial.begin(9600); - tft.begin(); - if (!ts.begin()) { - Serial.println("Unable to start touchscreen."); - } - else { - Serial.println("Touchscreen started."); - } - - tft.fillScreen(ILI9341_BLUE); - // origin = left,top landscape (USB left upper) - tft.setRotation(1); - redBtn(); -} - -void loop() -{ - // See if there's any touch data for us - if (!ts.bufferEmpty()) - { - // Retrieve a point - TS_Point p = ts.getPoint(); - // Scale using the calibration #'s - // and rotate coordinate system - p.x = map(p.x, TS_MINY, TS_MAXY, 0, tft.height()); - p.y = map(p.y, TS_MINX, TS_MAXX, 0, tft.width()); - int y = tft.height() - p.x; - int x = p.y; - - if (RecordOn) - { - if((x > REDBUTTON_X) && (x < (REDBUTTON_X + REDBUTTON_W))) { - if ((y > REDBUTTON_Y) && (y <= (REDBUTTON_Y + REDBUTTON_H))) { - Serial.println("Red btn hit"); - redBtn(); - } - } - } - else //Record is off (RecordOn == false) - { - if((x > GREENBUTTON_X) && (x < (GREENBUTTON_X + GREENBUTTON_W))) { - if ((y > GREENBUTTON_Y) && (y <= (GREENBUTTON_Y + GREENBUTTON_H))) { - Serial.println("Green btn hit"); - greenBtn(); - } - } - } - - Serial.println(RecordOn); - } -} - - - diff --git a/lib/lib_display/Adafruit_ILI9341-1.2.0-Tasmota-1.0/examples/onoffbutton_breakout/.esp8266.test.skip b/lib/lib_display/Adafruit_ILI9341-1.2.0-Tasmota-1.0/examples/onoffbutton_breakout/.esp8266.test.skip deleted file mode 100644 index e69de29bb..000000000 diff --git a/lib/lib_display/Adafruit_ILI9341-1.2.0-Tasmota-1.0/examples/onoffbutton_breakout/onoffbutton_breakout.ino b/lib/lib_display/Adafruit_ILI9341-1.2.0-Tasmota-1.0/examples/onoffbutton_breakout/onoffbutton_breakout.ino deleted file mode 100644 index aa8cb9992..000000000 --- a/lib/lib_display/Adafruit_ILI9341-1.2.0-Tasmota-1.0/examples/onoffbutton_breakout/onoffbutton_breakout.ino +++ /dev/null @@ -1,133 +0,0 @@ -//This example implements a simple sliding On/Off button. The example -// demonstrates drawing and touch operations. -// -//Thanks to Adafruit forums member Asteroid for the original sketch! -// -#include -#include -#include -#include -#include - -//Touchscreen X+ X- Y+ Y- pins -#define YP A3 // must be an analog pin, use "An" notation! -#define XM A2 // must be an analog pin, use "An" notation! -#define YM 5 // can be a digital pin -#define XP 4 // can be a digital pin - -// This is calibration data for the raw touch data to the screen coordinates -#define TS_MINX 150 -#define TS_MINY 120 -#define TS_MAXX 920 -#define TS_MAXY 940 - -#define MINPRESSURE 10 -#define MAXPRESSURE 1000 - -// For better pressure precision, we need to know the resistance -// between X+ and X- Use any multimeter to read it -// For the one we're using, its 300 ohms across the X plate -TouchScreen ts = TouchScreen(XP, YP, XM, YM, 300); - - -#define TFT_CS 10 -#define TFT_DC 9 -Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC); - -boolean RecordOn = false; - -#define FRAME_X 210 -#define FRAME_Y 180 -#define FRAME_W 100 -#define FRAME_H 50 - -#define REDBUTTON_X FRAME_X -#define REDBUTTON_Y FRAME_Y -#define REDBUTTON_W (FRAME_W/2) -#define REDBUTTON_H FRAME_H - -#define GREENBUTTON_X (REDBUTTON_X + REDBUTTON_W) -#define GREENBUTTON_Y FRAME_Y -#define GREENBUTTON_W (FRAME_W/2) -#define GREENBUTTON_H FRAME_H - -void drawFrame() -{ - tft.drawRect(FRAME_X, FRAME_Y, FRAME_W, FRAME_H, ILI9341_BLACK); -} - -void redBtn() -{ - tft.fillRect(REDBUTTON_X, REDBUTTON_Y, REDBUTTON_W, REDBUTTON_H, ILI9341_RED); - tft.fillRect(GREENBUTTON_X, GREENBUTTON_Y, GREENBUTTON_W, GREENBUTTON_H, ILI9341_BLUE); - drawFrame(); - tft.setCursor(GREENBUTTON_X + 6 , GREENBUTTON_Y + (GREENBUTTON_H/2)); - tft.setTextColor(ILI9341_WHITE); - tft.setTextSize(2); - tft.println("ON"); - RecordOn = false; -} - -void greenBtn() -{ - tft.fillRect(GREENBUTTON_X, GREENBUTTON_Y, GREENBUTTON_W, GREENBUTTON_H, ILI9341_GREEN); - tft.fillRect(REDBUTTON_X, REDBUTTON_Y, REDBUTTON_W, REDBUTTON_H, ILI9341_BLUE); - drawFrame(); - tft.setCursor(REDBUTTON_X + 6 , REDBUTTON_Y + (REDBUTTON_H/2)); - tft.setTextColor(ILI9341_WHITE); - tft.setTextSize(2); - tft.println("OFF"); - RecordOn = true; -} - -void setup(void) -{ - Serial.begin(9600); - tft.begin(); - - tft.fillScreen(ILI9341_BLUE); - // origin = left,top landscape (USB left upper) - tft.setRotation(1); - redBtn(); -} - -void loop() -{ - // Retrieve a point - TSPoint p = ts.getPoint(); - - // See if there's any touch data for us - if (p.z > MINPRESSURE && p.z < MAXPRESSURE) - { - // Scale using the calibration #'s - // and rotate coordinate system - p.x = map(p.x, TS_MINY, TS_MAXY, 0, tft.height()); - p.y = map(p.y, TS_MINX, TS_MAXX, 0, tft.width()); - int y = tft.height() - p.x; - int x = p.y; - - if (RecordOn) - { - if((x > REDBUTTON_X) && (x < (REDBUTTON_X + REDBUTTON_W))) { - if ((y > REDBUTTON_Y) && (y <= (REDBUTTON_Y + REDBUTTON_H))) { - Serial.println("Red btn hit"); - redBtn(); - } - } - } - else //Record is off (RecordOn == false) - { - if((x > GREENBUTTON_X) && (x < (GREENBUTTON_X + GREENBUTTON_W))) { - if ((y > GREENBUTTON_Y) && (y <= (GREENBUTTON_Y + GREENBUTTON_H))) { - Serial.println("Green btn hit"); - greenBtn(); - } - } - } - - Serial.println(RecordOn); - } -} - - - diff --git a/lib/lib_display/Adafruit_ILI9341-1.2.0-Tasmota-1.0/examples/pictureEmbed/dragon.h b/lib/lib_display/Adafruit_ILI9341-1.2.0-Tasmota-1.0/examples/pictureEmbed/dragon.h deleted file mode 100644 index ab61bb77c..000000000 --- a/lib/lib_display/Adafruit_ILI9341-1.2.0-Tasmota-1.0/examples/pictureEmbed/dragon.h +++ /dev/null @@ -1,861 +0,0 @@ -#define DRAGON_WIDTH 110 -#define DRAGON_HEIGHT 70 - -const PROGMEM uint16_t dragonBitmap[DRAGON_WIDTH * DRAGON_HEIGHT] = { - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0X8C10, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XBD14, 0XAC92, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XDEFB, 0XB431, 0XA1C9, 0XAA4B, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XCE18, 0X9A2A, 0X9044, - 0XDEFB, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XEF7D, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XDEFB, 0XB3B0, 0XA148, 0XB865, 0XC066, 0XC066, 0XAA4B, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XEF7D, 0XAB2E, 0X9864, - 0XA865, 0XAAAC, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XEF7D, 0XAC92, - 0X728B, 0XDEFB, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XCE18, 0XAB2E, 0XAA4B, 0XAA4B, 0XAA4B, 0XA3AF, - 0XB431, 0XB431, 0XB431, 0XA411, 0XA8E6, 0XD086, 0XB865, 0X7043, 0XA865, - 0XD086, 0XAA4B, 0XCE79, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XB493, 0XA8E6, - 0X9864, 0XC066, 0XD086, 0XB493, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XCE79, 0X830D, - 0X80C5, 0XAB2E, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XB431, 0XC066, 0XD086, 0XD086, 0XD086, - 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0X9864, 0XD086, 0XB865, 0X9864, - 0XC066, 0XD086, 0XB8E7, 0XB493, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XDE9A, 0XA1C9, - 0XB865, 0X9864, 0XD086, 0XD086, 0XD086, 0XBDF7, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XEF7D, 0XAD14, 0X71A8, - 0X9864, 0XC066, 0XC515, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XDEFB, 0XBDF7, 0XBD14, 0XA411, 0XB431, 0XB148, 0XD086, 0XC066, - 0X9864, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XC066, 0XD086, 0XA865, - 0XB865, 0XD086, 0XD086, 0XB1CA, 0XDEFB, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XEF7D, 0XB3B0, - 0XB865, 0XA865, 0XB865, 0XD086, 0XD086, 0XD086, 0XD086, 0XBD14, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XCE79, 0X932D, 0X78C5, - 0XA865, 0XD086, 0XC066, 0XC515, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XDEFB, 0XAB2E, 0XA0C6, 0XB865, 0XD086, 0XD086, 0XD086, 0X9864, 0XD086, - 0XB865, 0X78C5, 0X4208, 0X2104, 0X8947, 0X9864, 0X9864, 0X9864, 0XD086, - 0XD086, 0XA865, 0X9864, 0XD086, 0XB865, 0XDEFB, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XCE18, - 0XB148, 0XC066, 0XA865, 0XB865, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, - 0XAA4B, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XEF7D, 0XB493, 0X89A8, 0X9044, - 0XB865, 0XD086, 0XD086, 0XC066, 0XC515, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0X7B8E, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XAD14, 0XDEFB, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XB431, 0XB865, 0XD086, 0XD086, 0XD086, 0XD086, 0XC066, 0XA865, - 0X9864, 0XD086, 0XD086, 0XD086, 0XAA4B, 0X9A2A, 0XC066, 0XD086, 0XD086, - 0XD086, 0XD086, 0XC066, 0X9044, 0X9864, 0X9864, 0X9044, 0XCE18, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XEF7D, - 0XB3B0, 0XC066, 0XB865, 0XA865, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, - 0XD086, 0XD086, 0XD086, 0XAAAC, 0XBD96, 0XAD14, 0XAAAC, 0X8044, 0X9864, - 0XB865, 0XD086, 0XD086, 0XD086, 0XD086, 0XB431, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XB3B0, 0XAA4B, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XBD96, 0XB8E7, 0XB431, 0XEF7D, 0XFFFF, - 0XFFFF, 0XFFFF, 0XA32E, 0X9864, 0X9864, 0XAA4B, 0XAA4B, 0X9147, 0XB865, - 0X9044, 0XD086, 0XA865, 0XD086, 0XC066, 0XC066, 0XD086, 0XD086, 0XD086, - 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0X9864, 0XD086, 0XD086, 0XD086, - 0XAA4B, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XDE9A, 0XB148, 0XD086, 0XA865, 0XB865, 0XD086, 0XD086, 0XD086, 0XD086, - 0XD086, 0XD086, 0XD086, 0XD086, 0XA865, 0X9864, 0X9864, 0XA865, 0X9864, - 0XC066, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XA148, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XC515, 0XC066, 0XAA4B, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XAA4B, 0XD086, - 0XA865, 0XAB2E, 0XBD96, 0XEF7D, 0XCE79, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XDEFB, 0XB1CA, 0XD086, 0XD086, 0X9864, 0X822A, 0XBDF7, 0XB493, - 0XB148, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XA865, 0X9864, - 0XD086, 0XD086, 0XD086, 0XAA4B, 0XBD14, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XB431, 0XB865, 0XD086, 0X9864, 0XC066, 0XD086, 0XD086, 0XD086, - 0XD086, 0XD086, 0XD086, 0XC066, 0X9864, 0X9864, 0XC066, 0XA865, 0X9864, - 0XC066, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XB3B0, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XCD96, 0XC066, 0XD086, 0XAA4B, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XDE9A, 0XB865, 0XD086, 0XD086, 0XD086, 0XA865, 0X9147, 0X9C92, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XCE18, 0X80C5, 0X5822, 0X5A08, 0XDEFB, - 0XFFFF, 0XFFFF, 0XCE79, 0XA0C6, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, - 0X9044, 0XB865, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XAB2E, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XEF7D, 0XAA4B, 0XD086, 0XC066, 0X9864, 0XD086, 0XD086, 0XD086, - 0XD086, 0XD086, 0XD086, 0XA865, 0X9864, 0XA865, 0XD086, 0X9864, 0X9864, - 0XC066, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, - 0XD086, 0XAB2E, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XDE9A, 0XB8E7, 0XD086, 0XD086, - 0XAA4B, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XC515, 0XC066, 0XD086, 0XB865, 0X8044, 0X82AB, - 0XBDF7, 0XBDF7, 0XBDF7, 0XBDF7, 0XBDF7, 0XBDF7, 0XAC92, 0XA3AF, 0X92AC, - 0XAB2E, 0XAA4B, 0XA1C9, 0X9864, 0XB865, 0XA865, 0XC066, 0XD086, 0XD086, - 0XD086, 0XD086, 0XD086, 0X9864, 0XD086, 0XD086, 0XD086, 0XB1CA, 0XBD14, - 0X9CF3, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XCE18, 0XA8E6, 0XD086, 0XC066, 0XA865, 0XD086, 0XD086, - 0XD086, 0XD086, 0XC066, 0X9864, 0X9864, 0XC066, 0XD086, 0X9864, 0X9864, - 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, - 0XD086, 0XD086, 0XD086, 0XC066, 0XC515, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XDE9A, 0XB8E7, 0XD086, - 0XD086, 0XD086, 0XAA4B, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XB3B0, 0XD086, 0XA865, - 0XC066, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, - 0XD086, 0XD086, 0XD086, 0XC066, 0XA865, 0X8044, 0X4822, 0X9044, 0X9044, - 0XD086, 0XD086, 0XD086, 0XD086, 0X8044, 0X9864, 0XD086, 0XD086, 0XD086, - 0XAA4B, 0XCE18, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XB493, 0XC066, 0XD086, 0XC066, 0XA865, 0XD086, - 0XD086, 0XD086, 0XA865, 0X9864, 0XA865, 0XD086, 0XC066, 0X9864, 0X9864, - 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, - 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0X9864, 0X9044, 0X3986, 0XCE79, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XDE9A, 0XB8E7, - 0XD086, 0XD086, 0XC066, 0XD086, 0XAA4B, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XB431, 0XC066, 0X90C6, 0XAA4B, 0XAA4B, 0XAA4B, 0XAA4B, 0X99C9, 0X9864, - 0X9864, 0X9864, 0X6843, 0X6843, 0X5822, 0X4822, 0X7043, 0X9044, 0XC066, - 0X9864, 0X7043, 0XC066, 0XB865, 0XD086, 0X7043, 0X8044, 0XC066, 0XD086, - 0XD086, 0XD086, 0XD086, 0XC066, 0XB431, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XEF7D, 0XAB2E, 0XD086, 0XD086, 0XC066, 0XA865, - 0XD086, 0XD086, 0X9864, 0X9044, 0XC066, 0XD086, 0XC066, 0X9864, 0XA865, - 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, - 0XB865, 0X9864, 0X9864, 0X9864, 0X9044, 0X6843, 0X6843, 0X8044, 0X7B0C, - 0XCE79, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XDE9A, - 0XB8E7, 0XD086, 0X9864, 0XC066, 0X9864, 0XD086, 0XAA4B, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XC515, 0XA8E6, 0XCE18, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XA148, 0XD086, 0XD086, 0XD086, 0XD086, - 0XB148, 0XBD14, 0X9A2A, 0XD086, 0X9864, 0X9864, 0X6843, 0XD086, 0XC066, - 0XC066, 0XD086, 0XD086, 0XD086, 0XA865, 0XC066, 0XA865, 0XEF7D, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XEF7D, 0XB1CA, 0XD086, 0XD086, 0XD086, - 0X9864, 0XC066, 0X9864, 0X9864, 0XD086, 0XD086, 0XC066, 0X9864, 0XA865, - 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XC066, 0X9864, 0X9864, 0X9864, - 0X9864, 0X9864, 0X9864, 0X9864, 0X9864, 0X9864, 0XA865, 0XD086, 0XA1C9, - 0XDE9A, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XDE9A, 0XB8E7, 0XD086, 0XD086, 0X9864, 0XD086, 0X9864, 0XD086, 0XAA4B, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XDEFB, 0XCE18, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XAA4B, 0XD086, 0XC066, - 0XD086, 0XAAAC, 0XEF7D, 0XFFFF, 0X932D, 0XB865, 0XB865, 0XC066, 0X7043, - 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XB148, 0XEF7D, 0XBD14, 0XA148, - 0XBDF7, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XAA4B, 0XD086, 0XD086, - 0XD086, 0X8044, 0X9864, 0XA865, 0XD086, 0XD086, 0XC066, 0X9864, 0XA865, - 0XD086, 0XD086, 0XA865, 0X9864, 0X9864, 0X9864, 0X9864, 0XA865, 0XD086, - 0XB865, 0X9864, 0X9864, 0X9864, 0XB865, 0XD086, 0XD086, 0XD086, 0XD086, - 0XAB2E, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XDE9A, 0XB8E7, 0XD086, 0XD086, 0XC066, 0XA865, 0XD086, 0X9864, - 0XD086, 0XA0C6, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0X8C10, 0XB431, 0XEF7D, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XBD14, - 0XD086, 0XA1C9, 0X80C5, 0XEF7D, 0XFFFF, 0XB431, 0XD086, 0XB865, 0X9864, - 0X8044, 0X9864, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XAA4B, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XBD14, 0XD086, - 0XD086, 0XD086, 0XA865, 0XB865, 0XD086, 0XD086, 0XC066, 0X9864, 0X9864, - 0X9864, 0X9044, 0X9864, 0X9864, 0XC066, 0XD086, 0XD086, 0XB865, 0X9864, - 0X9864, 0X9864, 0XB865, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, - 0XD086, 0XAB2E, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XDE9A, 0XB8E7, 0XD086, 0XD086, 0XD086, 0X9864, 0XD086, - 0XD086, 0X9864, 0XD086, 0X9864, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XEF7D, 0XB148, - 0XA1C9, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XBDF7, 0XD086, 0XBD14, 0XEF7D, 0XFFFF, 0XFFFF, 0XA148, 0XD086, - 0XD086, 0XD086, 0X9864, 0X9864, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, - 0XC066, 0XB431, 0XEF7D, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XAA4B, 0XD086, 0XD086, 0XD086, 0X9864, 0XD086, 0XD086, 0XC066, 0X7043, - 0X9864, 0XA865, 0XD086, 0XD086, 0XD086, 0XC066, 0X9864, 0X9864, 0X9864, - 0XB865, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, - 0XD086, 0XD086, 0XAAAC, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XA32E, 0XAA4B, 0XAA4B, 0XAA4B, 0XAB2E, - 0X9044, 0XD086, 0XA865, 0X9864, 0XD086, 0XD086, 0XBDF7, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XEF7D, 0XBDF7, 0XDEFB, 0XFFFF, 0XFFFF, - 0XFFFF, 0XB431, 0XB865, 0XAC92, 0XFFFF, 0XEF7D, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XEF7D, 0X8947, 0XEF7D, 0XFFFF, 0XFFFF, 0XEF7D, - 0X9044, 0XD086, 0XD086, 0XB865, 0XB865, 0X9864, 0XD086, 0XD086, 0XD086, - 0XD086, 0XD086, 0XD086, 0XD086, 0XA0C6, 0XEF7D, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0X9864, 0XD086, 0XD086, 0X9864, 0XD086, 0XD086, 0XD086, - 0XD086, 0XD086, 0XD086, 0XD086, 0X9864, 0X9864, 0X9864, 0XA865, 0XD086, - 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, - 0XD086, 0XD086, 0XD086, 0XA8E6, 0XEF7D, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XCE18, 0XC066, 0XD086, 0XA1C9, 0XB431, 0XD086, 0XD086, 0XB493, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XEF7D, 0XAB2E, 0XB865, - 0XB3B0, 0XFFFF, 0XFFFF, 0X9AAC, 0XB865, 0XA148, 0XFFFF, 0X9AAC, 0XCD96, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XAA4B, 0XB865, 0X9864, 0X9864, 0X8044, 0X9044, 0X8044, 0XD086, - 0XD086, 0XD086, 0XD086, 0XD086, 0XA1C9, 0X90C6, 0XD086, 0XB3B0, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0X9864, 0XD086, 0XD086, 0X9864, 0XD086, - 0XD086, 0XD086, 0XD086, 0X9864, 0X9864, 0X9864, 0XD086, 0XD086, 0XD086, - 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, - 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XAB2E, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XDEFB, 0XB3B0, 0XAA4B, 0X9864, 0X9864, 0XA1C9, - 0XAB2E, 0XBD96, 0XFFFF, 0XAA4B, 0XD086, 0XD086, 0XB493, 0XFFFF, 0XAB2E, - 0XC066, 0XAAAC, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0X8947, 0X9864, 0X9A2A, 0XFFFF, 0X9864, 0XD086, 0XA148, 0XEF7D, - 0XA8E6, 0XB431, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XCE79, 0XC066, 0XD086, 0XD086, 0XD086, 0X9044, 0X7043, - 0X8044, 0XD086, 0XD086, 0XD086, 0XD086, 0X9864, 0XFFFF, 0XFFFF, 0XBD14, - 0X92AC, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0X9864, 0XD086, 0XB865, - 0XB865, 0XD086, 0XD086, 0X8044, 0X6843, 0X9864, 0X9864, 0X9864, 0X9864, - 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, - 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XBD96, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XB431, 0XB865, 0XD086, 0XD086, 0XD086, - 0XD086, 0XD086, 0XD086, 0XD086, 0X9147, 0XA865, 0XD086, 0XC066, 0XCE79, - 0XFFFF, 0XFFFF, 0XCD96, 0X7926, 0XEF7D, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0X9864, 0XD086, 0XC066, 0X9CF3, 0XC066, 0XD086, - 0X8A2A, 0X8947, 0XD086, 0XBD14, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XAD14, 0XC066, 0XD086, 0XD086, 0XD086, - 0X9864, 0X9864, 0X8044, 0XD086, 0XD086, 0XD086, 0XD086, 0XB865, 0XDEFB, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0X9864, - 0XD086, 0X9864, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, - 0XD086, 0XD086, 0X9864, 0X9864, 0X9864, 0X9864, 0X9864, 0X9864, 0X9864, - 0XC066, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, - 0XBDF7, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XB493, 0XD086, 0XD086, 0XD086, - 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XC066, 0XA865, - 0XA148, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XAA4B, 0XD086, 0XD086, 0X71A8, - 0XD086, 0XD086, 0X9044, 0XD086, 0X9864, 0XBDF7, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XDE9A, 0XB865, 0XA865, 0XA865, - 0XD086, 0XD086, 0X7043, 0X9864, 0X9044, 0XA865, 0XD086, 0XD086, 0XD086, - 0XD086, 0XA8E6, 0XB493, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0X9864, 0XB865, 0XB865, 0XD086, 0XD086, 0XD086, 0X9864, 0X9864, - 0X9864, 0X9864, 0X9864, 0X9864, 0X9864, 0X9864, 0XD086, 0XD086, 0XD086, - 0XD086, 0XD086, 0XA865, 0X9864, 0X9864, 0X9864, 0X9864, 0XD086, 0XD086, - 0XD086, 0XD086, 0XBDF7, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XA0C6, 0XD086, - 0XD086, 0XD086, 0XA865, 0X80C5, 0X9864, 0XC066, 0XD086, 0XD086, 0XD086, - 0XD086, 0XC066, 0X8B8E, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XB493, 0XD086, - 0XD086, 0X9864, 0XA865, 0XA865, 0XC066, 0XD086, 0XA8E6, 0XEF7D, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XAAAC, 0XD086, - 0XD086, 0XC066, 0X9864, 0X8044, 0XA865, 0X9044, 0XC066, 0X8044, 0XD086, - 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0X9A2A, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XEF7D, 0XA865, 0X9864, 0XD086, 0XD086, 0XD086, 0XD086, - 0X9864, 0X9864, 0XC066, 0XD086, 0XD086, 0XD086, 0XD086, 0XC066, 0X9864, - 0X9864, 0X9864, 0X9864, 0X9864, 0X9864, 0X9864, 0X9864, 0XD086, 0XD086, - 0X9864, 0X9864, 0X9864, 0XC066, 0XAB2E, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0X9864, 0XD086, 0XD086, 0X90C6, 0XCE79, 0XFFFF, 0XFFFF, 0X9C92, 0X9864, - 0XD086, 0XD086, 0XD086, 0XD086, 0XAB2E, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XEF7D, 0XA0C6, 0XD086, 0XD086, 0XB865, 0X9864, 0XD086, 0XB1CA, 0XDE9A, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XAA4B, 0XD086, 0XD086, 0XD086, 0XD086, 0X9864, 0X7043, 0XA865, 0X9044, - 0X9044, 0XD086, 0XD086, 0XD086, 0XD086, 0XB1CA, 0XB431, 0X82AB, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XBD14, 0XA865, 0XC066, 0XD086, 0XD086, - 0XD086, 0XD086, 0XD086, 0XD086, 0XA865, 0X9864, 0XC066, 0XD086, 0XD086, - 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, - 0X9864, 0X9864, 0X9864, 0X9864, 0X9864, 0X7043, 0X8044, 0XDEFB, 0XFFFF, - 0XFFFF, 0XFFFF, 0X9864, 0XD086, 0XD086, 0XA32E, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0X728B, 0XB865, 0XD086, 0XD086, 0XD086, 0X9864, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XEF7D, 0XAA4B, 0XD086, 0XD086, 0XB865, 0X90C6, - 0XEF7D, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XC515, 0X9044, 0XC066, 0XD086, 0XD086, 0XD086, 0X9864, 0X8044, - 0XC066, 0X8044, 0X9044, 0XC066, 0XD086, 0XD086, 0XD086, 0XBDF7, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XEF7D, 0X6926, 0XC066, 0XD086, - 0XD086, 0XD086, 0X9044, 0XB865, 0XD086, 0XD086, 0XD086, 0XD086, 0XA865, - 0X9864, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, - 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XA8E6, 0XAAAC, 0XB431, 0X8410, - 0X8C71, 0XFFFF, 0XFFFF, 0XFFFF, 0XAAAC, 0XD086, 0XD086, 0XA865, 0XA32E, - 0XB431, 0XB431, 0X8947, 0XC066, 0X9864, 0XD086, 0XD086, 0XD086, 0XC066, - 0XCE79, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XB431, 0XD086, 0XD086, - 0XD086, 0XB8E7, 0XDEFB, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XA0C6, 0XD086, 0XA865, 0X9864, 0X9864, 0X9864, - 0X9044, 0X9044, 0XA865, 0X9864, 0XA865, 0X9864, 0XD086, 0XD086, 0XD086, - 0XB3B0, 0XFFFF, 0XEF7D, 0XBDF7, 0XB431, 0XAAAC, 0XA148, 0XA865, 0XD086, - 0XD086, 0XD086, 0XC066, 0XD086, 0XB865, 0X9044, 0X9864, 0X9864, 0XC066, - 0XD086, 0XD086, 0XD086, 0X9864, 0XB865, 0XD086, 0XD086, 0XD086, 0XD086, - 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XB8E7, 0XB493, 0XEF7D, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XDE9A, 0XB8E7, 0XD086, - 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0X9864, 0XD086, 0XD086, - 0XD086, 0XD086, 0XBDF7, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XAAAC, - 0XD086, 0XD086, 0XD086, 0XD086, 0XB3B0, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XDEFB, 0XB865, 0XD086, 0XD086, 0XD086, - 0XD086, 0XD086, 0X8044, 0X9864, 0XB865, 0X8044, 0XC066, 0X6843, 0XD086, - 0XD086, 0X9864, 0XA0C6, 0X99C9, 0XA865, 0XD086, 0XD086, 0XD086, 0XD086, - 0XD086, 0XD086, 0XD086, 0XD086, 0X8044, 0XB865, 0XD086, 0XC066, 0XA865, - 0XD086, 0XA865, 0X9864, 0X9864, 0XD086, 0XD086, 0XB865, 0X9864, 0XC066, - 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XB1CA, 0XDEFB, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XDEFB, 0XAB2E, 0X9864, 0XC066, 0XD086, 0XC066, 0X9864, 0X89A8, 0XA865, - 0XD086, 0XD086, 0XD086, 0XA865, 0XEF7D, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XAA4B, 0XD086, 0XD086, 0XD086, 0XD086, 0XA148, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XBDF7, 0XD086, 0XD086, - 0XD086, 0XD086, 0XD086, 0XD086, 0X7043, 0XC066, 0X6843, 0XD086, 0X7043, - 0XC066, 0X9044, 0X9864, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, - 0XD086, 0XD086, 0XD086, 0XD086, 0XA865, 0XD086, 0X9864, 0XB865, 0XB865, - 0XD086, 0XC066, 0XA865, 0XD086, 0XD086, 0XD086, 0X9864, 0X9864, 0XC066, - 0XD086, 0XA865, 0XA865, 0XD086, 0XD086, 0XD086, 0XD086, 0XA865, 0X9C92, - 0XBDF7, 0XBDF7, 0XBDF7, 0XBDF7, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XCE79, 0XBDF7, 0XCE79, 0XEF7D, - 0XAAAC, 0XD086, 0XD086, 0XD086, 0XD086, 0XA1C9, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XA148, 0XD086, 0XD086, 0XD086, 0XD086, 0XB865, - 0XDEFB, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XCD96, - 0X8044, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0X6843, 0X9044, 0X9864, - 0XA865, 0XA865, 0X9044, 0XB865, 0XD086, 0XD086, 0XB865, 0X9864, 0X8044, - 0XC066, 0XD086, 0XD086, 0XB865, 0XD086, 0XA865, 0X9044, 0XD086, 0XB865, - 0XB865, 0XB865, 0XA865, 0XD086, 0XB865, 0XB865, 0XD086, 0XD086, 0XD086, - 0XD086, 0XA865, 0X9864, 0XB865, 0XC066, 0X9864, 0XD086, 0XD086, 0XD086, - 0X9864, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0X9864, 0X9864, 0XA1C9, - 0XAB2E, 0XBD14, 0XCE79, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XCE79, - 0XB493, 0XB148, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XBD14, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0X9864, 0XD086, 0XD086, 0XD086, - 0XD086, 0XD086, 0XBDF7, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XA148, 0XD086, 0X9864, 0X9864, 0X9864, 0X9864, 0X9864, 0X9864, - 0X9864, 0X9864, 0X7043, 0X9864, 0XD086, 0XD086, 0XA865, 0X9864, 0XB865, - 0XD086, 0X9864, 0XD086, 0XC066, 0X7043, 0XD086, 0XD086, 0X9864, 0XC066, - 0XA865, 0XD086, 0X9864, 0XD086, 0XC066, 0XA865, 0XD086, 0XA865, 0XC066, - 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XC066, 0X9864, 0X9044, 0X9864, - 0XC066, 0X9864, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, - 0XD086, 0XD086, 0XD086, 0XD086, 0XC066, 0X9864, 0X9864, 0X9864, 0X9864, - 0X9864, 0XB865, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XA1C9, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XC515, 0XC066, 0XA865, - 0XD086, 0XD086, 0XD086, 0XD086, 0XAD14, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0X9864, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, - 0XD086, 0X9044, 0X8044, 0X9864, 0XA865, 0XD086, 0XA865, 0X9864, 0XC066, - 0XD086, 0XD086, 0XA865, 0XC066, 0XC066, 0XA865, 0X9864, 0XD086, 0XA865, - 0XC066, 0XD086, 0X9864, 0XD086, 0X9864, 0XD086, 0XD086, 0XB865, 0XB865, - 0XD086, 0X9864, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, - 0XD086, 0X9864, 0X8044, 0X8044, 0XD086, 0XD086, 0XD086, 0XD086, 0X9864, - 0XA865, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, - 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, - 0XB8E7, 0XDEFB, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, - 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0XFFFF, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X04A6, 0XB865, - 0XD086, 0X31C3, 0XC066, 0XD086, 0XD086, 0X9864, 0XB865, 0X2305, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X9864, 0XD086, 0XD086, 0XD086, - 0XD086, 0XD086, 0XD086, 0X6843, 0X9864, 0XA865, 0XB865, 0X9864, 0XC066, - 0XD086, 0XD086, 0XD086, 0XD086, 0X9864, 0XC066, 0XA865, 0XD086, 0X9864, - 0XD086, 0X9864, 0XD086, 0XD086, 0XA865, 0XC066, 0X9864, 0XD086, 0XD086, - 0XD086, 0XC066, 0XA865, 0XB865, 0XB865, 0XD086, 0XD086, 0XD086, 0XD086, - 0XD086, 0XD086, 0XD086, 0XD086, 0XC066, 0X8044, 0X8044, 0XD086, 0XD086, - 0XD086, 0XD086, 0XD086, 0X9864, 0XC066, 0XD086, 0XD086, 0XD086, 0XD086, - 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, - 0XD086, 0X8145, 0X0C66, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0506, - 0X8145, 0XD086, 0X9105, 0X0506, 0X80E5, 0XD086, 0XD086, 0X9864, 0XD086, - 0X9864, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X80E5, 0XD086, - 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0X8044, 0XB865, 0X9864, 0XB865, - 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XA865, 0XC066, 0X9864, 0XD086, - 0XD086, 0X9864, 0XC066, 0XA865, 0XD086, 0XD086, 0XD086, 0X9864, 0X9864, - 0XD086, 0XD086, 0XD086, 0XD086, 0XC066, 0XA865, 0X9864, 0XD086, 0XD086, - 0XD086, 0XD086, 0XD086, 0XA865, 0X9864, 0X9864, 0X7043, 0X9864, 0XA865, - 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XA865, 0XC066, 0XD086, - 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, - 0XD086, 0XC066, 0X59E5, 0X0506, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X2305, 0XB865, 0XD086, 0X2305, 0X0547, 0X1B65, 0XD086, 0XD086, - 0XB865, 0XB865, 0X9864, 0X6985, 0X1B65, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0C05, 0X9864, 0XD086, 0XD086, 0XD086, 0XD086, 0X9044, 0X8044, 0X9864, - 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0X9864, 0X9864, - 0XD086, 0XD086, 0XD086, 0X9864, 0X9864, 0XD086, 0XD086, 0XD086, 0XD086, - 0X9864, 0X9864, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XB865, 0XA865, - 0XA865, 0XD086, 0XD086, 0XA865, 0X9864, 0XC066, 0XD086, 0XD086, 0X9864, - 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, - 0XA865, 0XC066, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, - 0XD086, 0XD086, 0X80E5, 0X0C05, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X1B65, 0XC066, 0X8044, 0X04A6, 0X0547, 0X0547, - 0X80E5, 0XD086, 0XD086, 0X9864, 0XA865, 0XD086, 0XD086, 0X1AC4, 0X0405, - 0X0547, 0X0547, 0X4285, 0XC066, 0X9864, 0X9864, 0X9864, 0X9864, 0X8044, - 0XA865, 0XD086, 0XD086, 0XC066, 0XA865, 0XD086, 0XD086, 0XD086, 0XD086, - 0X7043, 0XC066, 0XD086, 0XD086, 0XD086, 0X9864, 0X9864, 0XD086, 0XD086, - 0XD086, 0XD086, 0XA865, 0XA865, 0XB865, 0XD086, 0XD086, 0XD086, 0XD086, - 0XD086, 0XB865, 0X8044, 0XD086, 0XA865, 0XC066, 0XD086, 0XD086, 0XD086, - 0XD086, 0XC066, 0XA865, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, - 0XD086, 0XD086, 0XD086, 0X9864, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, - 0XD086, 0XA865, 0X59E5, 0X0BA5, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0506, 0X3264, 0X98A5, 0X7145, 0X04A6, 0X0547, - 0X0547, 0X0547, 0X1BC5, 0XC066, 0XD086, 0XD086, 0X9864, 0XD086, 0XD086, - 0X9864, 0XD086, 0X7145, 0X4984, 0X80A4, 0XD086, 0XD086, 0XD086, 0XD086, - 0XD086, 0X9864, 0X7043, 0X9864, 0X9864, 0XB865, 0X9864, 0XD086, 0XD086, - 0XD086, 0X8044, 0XA865, 0XD086, 0XD086, 0XD086, 0XD086, 0X9044, 0XA865, - 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0X9864, 0X9864, 0XD086, 0XD086, - 0XD086, 0XD086, 0XD086, 0XD086, 0X9864, 0X8044, 0XC066, 0XD086, 0XD086, - 0XD086, 0XD086, 0XD086, 0XD086, 0XA865, 0XC066, 0XD086, 0XD086, 0XD086, - 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0X9044, 0XA865, 0X9864, - 0X6985, 0X4285, 0X1B65, 0X0506, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0445, 0X0445, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X4A25, 0XD086, 0XD086, 0XD086, - 0X9864, 0X9864, 0XC066, 0XD086, 0XD086, 0X9864, 0X9864, 0XD086, 0XD086, - 0XD086, 0XD086, 0XD086, 0XD086, 0X9864, 0XD086, 0XD086, 0XD086, 0X9864, - 0XD086, 0XB865, 0X9864, 0X4822, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, - 0X6843, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0X9864, 0X9864, - 0XD086, 0XC066, 0X9864, 0X8044, 0X9864, 0X9864, 0X9864, 0X8044, 0XD086, - 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XA865, 0X9864, - 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, - 0XA8C5, 0X32C5, 0X0506, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X4A25, - 0XD086, 0XD086, 0XD086, 0XA865, 0X9864, 0XB865, 0XD086, 0X9864, 0X9864, - 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0X9864, 0XD086, 0XD086, 0XD086, - 0XD086, 0X9864, 0XA865, 0XB865, 0XD086, 0X8044, 0XD086, 0XD086, 0XD086, - 0XD086, 0XD086, 0X6843, 0XD086, 0X9044, 0X9864, 0X9044, 0X9864, 0XB865, - 0X9864, 0X9864, 0XB865, 0XA865, 0XD086, 0X9864, 0XD086, 0XD086, 0XD086, - 0XA865, 0XB865, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, - 0XC066, 0X9864, 0XA865, 0X9864, 0X9044, 0XA865, 0XD086, 0XD086, 0XD086, - 0XD086, 0XD086, 0XD086, 0XD086, 0X98A5, 0X32C5, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X32C5, 0XC066, 0XD086, 0XD086, 0XD086, 0XB865, 0X9864, - 0X8044, 0X9864, 0X8044, 0XD086, 0XD086, 0XD086, 0XD086, 0X9864, 0XD086, - 0XD086, 0XD086, 0XD086, 0X9864, 0XC066, 0XA865, 0X9864, 0X9864, 0XA865, - 0X9864, 0X9044, 0X9864, 0XD086, 0X6843, 0X9864, 0XC066, 0XA865, 0XD086, - 0XD086, 0XB865, 0X8044, 0X7043, 0XB865, 0XD086, 0X9864, 0X9864, 0X9864, - 0X9864, 0X9864, 0XA865, 0XB865, 0X9864, 0X9864, 0X9864, 0XA865, 0XD086, - 0XD086, 0XD086, 0X9044, 0XD086, 0XD086, 0XC066, 0XA865, 0XC066, 0X9864, - 0X9864, 0X9044, 0X9864, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0X80E5, - 0X1BC5, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X4285, 0XD086, 0XD086, 0XD086, - 0XD086, 0XD086, 0XD086, 0XD086, 0X9864, 0XD086, 0XD086, 0XD086, 0XD086, - 0XB865, 0XB865, 0XD086, 0XD086, 0XD086, 0XD086, 0X9044, 0X7043, 0XD086, - 0X8044, 0X9044, 0XD086, 0XD086, 0X9044, 0X9864, 0X6843, 0XD086, 0XD086, - 0X9864, 0XD086, 0XD086, 0XD086, 0X9864, 0XD086, 0XD086, 0XB865, 0XA865, - 0X9864, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0X6985, - 0X04A6, 0X4A25, 0X80A4, 0XA865, 0XD086, 0XD086, 0XD086, 0X9864, 0XD086, - 0XD086, 0XD086, 0X9864, 0XD086, 0XD086, 0X9864, 0X8044, 0X9864, 0XC066, - 0XD086, 0XD086, 0XC066, 0X6985, 0X0C66, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X4A25, - 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0X9864, 0XD086, 0XD086, - 0XD086, 0XD086, 0XA865, 0X9044, 0XB865, 0XA865, 0X9864, 0X9044, 0X9864, - 0XB865, 0X9044, 0XC066, 0X9864, 0XD086, 0XD086, 0X9864, 0XD086, 0XA865, - 0XD086, 0XD086, 0X9864, 0XD086, 0XD086, 0XD086, 0X9864, 0XC066, 0X9864, - 0XB865, 0XD086, 0X9864, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, - 0X4A25, 0X0506, 0X0547, 0X0547, 0X1BC5, 0XA8C5, 0XD086, 0XD086, 0XB865, - 0XB865, 0XD086, 0XD086, 0XD086, 0X9864, 0XD086, 0XD086, 0XD086, 0X9864, - 0XD086, 0X9864, 0XB865, 0XD086, 0XD086, 0XD086, 0XB865, 0X32C5, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0506, 0X8145, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XC066, - 0XA865, 0XD086, 0XD086, 0XB865, 0XB865, 0XD086, 0XB865, 0X8044, 0XB865, - 0XA865, 0X8044, 0XA865, 0XD086, 0XD086, 0X9864, 0XD086, 0XD086, 0X9864, - 0XD086, 0XD086, 0XD086, 0XD086, 0X9864, 0XD086, 0XD086, 0X8044, 0X7043, - 0X7043, 0XC066, 0XD086, 0XC066, 0XA865, 0XD086, 0XD086, 0XD086, 0XD086, - 0XD086, 0X6985, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X04A6, 0X2305, - 0X32C5, 0X6944, 0XD086, 0XD086, 0XD086, 0X9864, 0XC066, 0XD086, 0XD086, - 0X9864, 0XD086, 0XD086, 0X9864, 0XB865, 0XB865, 0XD086, 0XC066, 0XB865, - 0XD086, 0X7145, 0X0C66, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0C66, 0XB865, 0XD086, 0XD086, 0XD086, - 0XD086, 0XD086, 0XA865, 0XC066, 0XD086, 0X9864, 0XD086, 0XD086, 0XD086, - 0X9044, 0XB865, 0X9044, 0XD086, 0XD086, 0XD086, 0XC066, 0XA865, 0XD086, - 0XD086, 0X9864, 0XD086, 0XD086, 0XD086, 0XB865, 0XA865, 0XD086, 0XB865, - 0XB865, 0XD086, 0XD086, 0XB865, 0X9864, 0X7043, 0XD086, 0XD086, 0XD086, - 0XD086, 0XD086, 0XD086, 0X32C5, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0405, 0X2305, 0X0BA5, 0X0BA5, 0X7145, - 0X9864, 0X90A4, 0X58E3, 0XD086, 0XB865, 0XB865, 0XD086, 0X9864, 0XD086, - 0XD086, 0X1A63, 0XA8C5, 0XD086, 0XA8C5, 0X0C66, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X32C5, 0XD086, - 0XD086, 0XD086, 0XD086, 0XA865, 0X90A4, 0X4183, 0X6985, 0X5924, 0X9044, - 0XD086, 0XB865, 0XB865, 0X9044, 0X9864, 0XD086, 0XD086, 0XD086, 0X9864, - 0XD086, 0XD086, 0X9864, 0XD086, 0XD086, 0XD086, 0XA8C5, 0X1B65, 0X0405, - 0X0405, 0X9044, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0X9864, 0XD086, - 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0X4A25, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0405, 0X1AC4, 0XD086, 0XD086, - 0X9864, 0XD086, 0XD086, 0X4285, 0X04A6, 0X59E5, 0X9864, 0X4224, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0506, 0X98A5, 0XD086, 0XD086, 0X22C4, 0X0506, 0X0547, 0X0547, 0X0547, - 0X2305, 0XD086, 0XA865, 0X8044, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, - 0XD086, 0X9864, 0XD086, 0XD086, 0X9044, 0XD086, 0XB865, 0X6985, 0X04A6, - 0X0547, 0X0547, 0X0547, 0X90A4, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, - 0XA865, 0XC066, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XB865, 0X0BA5, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X22C4, 0XA865, 0X9044, 0X9864, 0XD086, 0X6985, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X4A25, 0XD086, 0X98A5, 0X0506, 0X0547, 0X0547, - 0X0547, 0X0506, 0X4183, 0X9864, 0X9044, 0XB865, 0XD086, 0XD086, 0XD086, - 0X9864, 0XD086, 0XD086, 0X9864, 0XD086, 0X7145, 0X0BA5, 0X0405, 0X04A6, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X32C5, 0XD086, 0XD086, 0XD086, - 0XD086, 0XD086, 0XD086, 0X9044, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, - 0XD086, 0XD086, 0X90A4, 0X4285, 0X04A6, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0405, 0XD086, 0XD086, 0X9864, 0XD086, 0X6985, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X1B65, 0XD086, 0X4A25, 0X0547, - 0X0547, 0X0547, 0X0547, 0X4A25, 0XD086, 0XD086, 0X9864, 0XD086, 0XD086, - 0XD086, 0X8145, 0X0B64, 0XD086, 0XD086, 0XA865, 0X32C5, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X2305, - 0X98A5, 0XC066, 0X9864, 0X9864, 0X9864, 0XC066, 0X9864, 0XA865, 0XD086, - 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XA865, 0X80E5, 0X59E5, - 0X0C05, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0445, 0XC066, 0XD086, 0X9044, 0XD086, - 0X6985, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0405, 0X98A5, - 0X0506, 0X0547, 0X0547, 0X0547, 0X0547, 0X59E5, 0XD086, 0XB865, 0XB865, - 0XD086, 0XD086, 0XA8C5, 0X0C66, 0X0506, 0X98A5, 0XD086, 0X90A4, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0506, 0X70E4, 0XD086, 0XD086, 0XD086, 0XD086, 0XC066, - 0X9864, 0X9864, 0X9864, 0X9044, 0X9864, 0XC066, 0XD086, 0XD086, 0XD086, - 0XD086, 0XD086, 0XC066, 0X1BC5, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X68E4, 0X9044, - 0X9864, 0XD086, 0X6985, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0445, 0X1BC5, 0X0547, 0X0547, 0X0547, 0X0547, 0X0C66, 0X90A4, 0XA865, - 0X9044, 0XD086, 0XD086, 0XA8C5, 0X0C66, 0X0547, 0X0547, 0X32C5, 0XD086, - 0X4A25, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0C66, 0X7145, 0X9864, 0X9864, - 0XA865, 0XA865, 0XD086, 0XD086, 0X9864, 0XD086, 0XD086, 0X9864, 0XD086, - 0XD086, 0X90A4, 0X80E5, 0XC066, 0XD086, 0X7145, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X9864, 0XD086, 0X9864, 0XD086, 0X6985, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X80E5, - 0XD086, 0XB865, 0XB865, 0XD086, 0XA8C5, 0X0C66, 0X0547, 0X0547, 0X0547, - 0X0506, 0X9044, 0X04A6, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X4285, 0XB865, 0XA865, 0X9864, 0XC066, 0XD086, 0XA865, - 0XC066, 0XD086, 0XC066, 0X0C05, 0X0547, 0X0445, 0X4285, 0X58E3, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X9864, 0XD086, 0X9864, 0XD086, 0X4285, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X9864, 0XD086, 0X9864, 0XD086, 0XA8C5, 0X0C66, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0405, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0405, 0X04A6, 0X2305, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0C66, 0X80E5, 0X9864, 0X9864, 0X9864, - 0X8044, 0XB865, 0XD086, 0XD086, 0X32C5, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X4285, 0XA865, 0X7043, 0XB865, 0XD086, 0X2305, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X2365, 0X9864, 0XB865, 0XB865, 0XA8C5, 0X0C66, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0506, 0X70A4, 0XA865, 0X8044, 0XD086, 0X7145, 0X0506, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X04A6, 0X3224, 0XD086, 0XD086, - 0XC066, 0X9864, 0XC066, 0XD086, 0XD086, 0X4A25, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X1B65, 0X32C5, 0X68E4, 0X2365, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X9864, 0XD086, 0X9864, 0XD086, - 0XC066, 0X0445, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X2305, 0X6985, 0X59E5, 0X22C4, 0X0445, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0C66, 0XA8C5, 0XA865, 0XA865, 0XD086, 0X2305, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0BA5, 0X0C05, 0X0C66, 0X9044, 0XD086, 0XD086, 0X8145, - 0X04A6, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0C05, 0XB865, 0XC066, - 0X9864, 0X9044, 0XA865, 0XD086, 0XD086, 0XD086, 0X4A25, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X22C4, 0X70E4, 0XB865, 0X9864, 0XC066, - 0X2365, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X5924, 0X9864, - 0XA865, 0XD086, 0X9864, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X3224, 0X22C4, 0X9864, 0XA865, 0XC066, 0X6985, - 0X0BA5, 0X0506, 0X0547, 0X0506, 0X32C5, 0XB865, 0XD086, 0XD086, 0XD086, - 0X80E5, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0C05, 0X4A25, - 0X80E5, 0XD086, 0XB865, 0X4A25, 0X0BA5, 0X22C4, 0X6985, 0X90A4, 0X9864, - 0X9864, 0X9864, 0X9044, 0XD086, 0XD086, 0XD086, 0XB865, 0X2305, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X04A6, 0X0547, 0X1B04, - 0XC066, 0XD086, 0XC066, 0X4285, 0X0506, 0X0547, 0X0547, 0X0547, 0X4A25, - 0XD086, 0XD086, 0XD086, 0XD086, 0X59E5, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X7043, 0XA865, - 0XD086, 0XD086, 0XB865, 0X7043, 0X6843, 0X9864, 0XD086, 0XD086, 0XD086, - 0XD086, 0XD086, 0X1B65, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0506, 0X32C5, 0X3264, 0X6985, - 0X59E5, 0X04A6, 0X0547, 0X4A25, 0XC066, 0X9864, 0XA865, 0XD086, 0XD086, - 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XC066, 0X6985, 0X04A6, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0C66, 0X59E5, 0X6883, 0X9864, 0X9864, 0XD086, 0X98A5, 0X4285, 0X32C5, - 0X6944, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0X2305, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0506, 0X32C5, 0X6985, 0X6944, - 0XC066, 0XC066, 0X9864, 0X9864, 0XB865, 0XD086, 0XD086, 0XD086, 0XD086, - 0XD086, 0XD086, 0XD086, 0XA865, 0X0506, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0506, 0X80E5, 0X9864, - 0X9864, 0XD086, 0XD086, 0XB865, 0X6985, 0X6985, 0X9044, 0XD086, 0XD086, - 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XA865, 0X59E5, 0X0C05, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0506, 0X6985, 0XA865, 0XA865, 0XD086, 0XD086, 0XD086, 0X9864, 0XB865, - 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0X6985, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X3264, 0X7145, - 0X6985, 0X9864, 0X9044, 0X9864, 0X9864, 0X9864, 0XA865, 0XD086, 0XD086, - 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0X90A4, 0X6985, 0X4285, - 0X1BC5, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0445, - 0X2305, 0X04A6, 0X90A4, 0XC066, 0X9864, 0X9044, 0X9864, 0X9864, 0X9864, - 0X9864, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0X58E3, 0X3264, - 0X1B65, 0X0506, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X4224, 0X4224, 0X3264, 0X7043, 0X4A25, 0X32C5, 0X49C4, - 0X9864, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, 0XD086, - 0XD086, 0XD086, 0X7145, 0X1B65, 0X0506, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X04A6, 0X0547, 0X0547, 0X04A6, 0X80E5, 0XD086, 0XD086, 0XD086, 0XD086, - 0XD086, 0XD086, 0XD086, 0XD086, 0XC066, 0X7145, 0X49C4, 0XB865, 0XD086, - 0XD086, 0XD086, 0X9044, 0X9864, 0X32C5, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0445, 0X5883, 0XA865, 0XD086, 0XD086, - 0XC066, 0X9864, 0X7145, 0X6985, 0X3264, 0X80E5, 0X7145, 0X32C5, 0X70E4, - 0XD086, 0XD086, 0XD086, 0X68E4, 0X4285, 0X04A6, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0405, 0X0547, 0X0547, 0X0547, 0X0506, - 0X6985, 0X9864, 0XD086, 0XD086, 0XA865, 0X9864, 0XD086, 0XD086, 0XD086, - 0XB865, 0X80E5, 0X80A4, 0XC066, 0XD086, 0XD086, 0X58E3, 0X32C5, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0C66, 0X90A4, 0XA865, 0XA865, 0XD086, - 0XD086, 0XD086, 0X6985, 0X0BA5, 0X0405, 0X22C4, 0X0C05, 0X0547, 0X0547, - 0X0C66, 0X7145, 0XC066, 0XD086, 0X70A4, 0X4285, 0X58E3, 0X0506, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X59E5, 0XA865, 0X9044, - 0X9864, 0X4A25, 0X0445, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X1B65, 0X98A5, 0XD086, 0X9044, 0X7145, 0X8044, 0X04A6, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X1BC5, 0X7145, 0X9864, 0XD086, 0X98A5, 0X2305, 0X0506, 0X0506, 0X32C5, - 0X6985, 0X32C5, 0X04A6, 0X0547, 0X0547, 0X0C05, 0X5984, 0XA865, 0X9864, - 0X9864, 0X32C5, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X49C4, 0X59E5, 0X22C4, - 0X70E4, 0X9864, 0X7145, 0X1B65, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0445, 0X0405, 0X0506, 0X0547, 0X0506, - 0X0506, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X2264, - 0X0506, 0X0506, 0X0445, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0506, 0X0405, 0X0445, 0X0547, - 0X0C66, 0X0445, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0506, 0X90A4, 0X80E5, 0X4224, 0X3224, 0X0506, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0405, 0X0547, 0X0506, 0X1A03, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0B64, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X04A6, 0X1BC5, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, 0X0547, - 0X0547, 0X0547, 0X0547, 0X0547, 0X0547 }; - diff --git a/lib/lib_display/Adafruit_ILI9341-1.2.0-Tasmota-1.0/examples/pictureEmbed/pictureEmbed.ino b/lib/lib_display/Adafruit_ILI9341-1.2.0-Tasmota-1.0/examples/pictureEmbed/pictureEmbed.ino deleted file mode 100644 index 5c5475756..000000000 --- a/lib/lib_display/Adafruit_ILI9341-1.2.0-Tasmota-1.0/examples/pictureEmbed/pictureEmbed.ino +++ /dev/null @@ -1,69 +0,0 @@ -// ILI9341 example with embedded color bitmaps in sketch. -// WILL NOT FIT ON ARDUINO UNO OR OTHER AVR BOARDS; -// uses large bitmap image stored in array! - -// Options for converting images to the format used here include: -// http://www.rinkydinkelectronics.com/t_imageconverter565.php -// or -// GIMP (https://www.gimp.org/) as follows: -// 1. File -> Export As -// 2. In Export Image dialog, use 'C source code (*.c)' as filetype. -// 3. Press export to get the export options dialog. -// 4. Type the desired variable name into the 'prefixed name' box. -// 5. Uncheck 'GLIB types (guint8*)' -// 6. Check 'Save as RGB565 (16-bit)' -// 7. Press export to save your image. -// Assuming 'image_name' was typed in the 'prefixed name' box of step 4, -// you can have to include the c file, then using the image can be done with: -// tft.drawRGBBitmap(0, 0, image_name.pixel_data, image_name.width, image_name.height); -// See also https://forum.pjrc.com/threads/35575-Export-for-ILI9341_t3-with-GIMP - -#include "SPI.h" -#include -#include "dragon.h" - -// For the Adafruit shield, these are the default. -//#define TFT_DC 9 -//#define TFT_CS 10 - -// Feather 32u4 or M0 with TFT FeatherWing: -#define TFT_DC 10 -#define TFT_CS 9 -// ESP8266: -//#define TFT_DC 15 -//#define TFT_CS 0 -// Other boards (including Feather boards) may have other pinouts; -// see learn.adafruit.com/adafruit-2-4-tft-touch-screen-featherwing/pinouts - -Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC); -// If using the breakout, change pins as desired -//Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_MOSI, TFT_CLK, TFT_RST, TFT_MISO); - -void setup() { - tft.begin(); -} - -void loop(void) { - for(uint8_t r=0; r<4; r++) { - tft.setRotation(r); - tft.fillScreen(ILI9341_BLACK); - for(uint8_t j=0; j<20; j++) { - tft.drawRGBBitmap( - random(-DRAGON_WIDTH , tft.width()), - random(-DRAGON_HEIGHT, tft.height()), -#if defined(__AVR__) || defined(ESP8266) - dragonBitmap, -#else - // Some non-AVR MCU's have a "flat" memory model and don't - // distinguish between flash and RAM addresses. In this case, - // the RAM-resident-optimized drawRGBBitmap in the ILI9341 - // library can be invoked by forcibly type-converting the - // PROGMEM bitmap pointer to a non-const uint16_t *. - (uint16_t *)dragonBitmap, -#endif - DRAGON_WIDTH, DRAGON_HEIGHT); - delay(1); // Allow ESP8266 to handle watchdog & WiFi stuff - } - delay(3000); - } -} diff --git a/lib/lib_display/Adafruit_ILI9341-1.2.0-Tasmota-1.0/examples/spitftbitmap/spitftbitmap.ino b/lib/lib_display/Adafruit_ILI9341-1.2.0-Tasmota-1.0/examples/spitftbitmap/spitftbitmap.ino deleted file mode 100644 index 7e2fedc5e..000000000 --- a/lib/lib_display/Adafruit_ILI9341-1.2.0-Tasmota-1.0/examples/spitftbitmap/spitftbitmap.ino +++ /dev/null @@ -1,218 +0,0 @@ -/*************************************************** - This is our Bitmap drawing example for the Adafruit ILI9341 Breakout and Shield - ----> http://www.adafruit.com/products/1651 - - Check out the links above for our tutorials and wiring diagrams - These displays use SPI to communicate, 4 or 5 pins are required to - interface (RST is optional) - Adafruit invests time and resources providing this open source code, - please support Adafruit and open-source hardware by purchasing - products from Adafruit! - - Written by Limor Fried/Ladyada for Adafruit Industries. - MIT license, all text above must be included in any redistribution - ****************************************************/ - - -#include // Core graphics library -#include "Adafruit_ILI9341.h" // Hardware-specific library -#include -#include - -// TFT display and SD card will share the hardware SPI interface. -// Hardware SPI pins are specific to the Arduino board type and -// cannot be remapped to alternate pins. For Arduino Uno, -// Duemilanove, etc., pin 11 = MOSI, pin 12 = MISO, pin 13 = SCK. - -#define TFT_DC 9 -#define TFT_CS 10 -Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC); - -#define SD_CS 4 - -void setup(void) { - Serial.begin(9600); - - tft.begin(); - - yield(); - - Serial.print("Initializing SD card..."); - if (!SD.begin(SD_CS)) { - Serial.println("failed!"); - } - Serial.println("OK!"); - -} - -void loop() { - for(uint8_t r=0; r<4; r++) { - tft.setRotation(r); - tft.fillScreen(ILI9341_BLUE); - for(int8_t i=-2; i<1; i++) { - bmpDraw("purple.bmp", - (tft.width() / 2) + (i * 120), - (tft.height() / 2) + (i * 160)); - } - } -} - -// This function opens a Windows Bitmap (BMP) file and -// displays it at the given coordinates. It's sped up -// by reading many pixels worth of data at a time -// (rather than pixel by pixel). Increasing the buffer -// size takes more of the Arduino's precious RAM but -// makes loading a little faster. 20 pixels seems a -// good balance. - -#define BUFFPIXEL 20 - -void bmpDraw(char *filename, int16_t x, int16_t y) { - - File bmpFile; - int bmpWidth, bmpHeight; // W+H in pixels - uint8_t bmpDepth; // Bit depth (currently must be 24) - uint32_t bmpImageoffset; // Start of image data in file - uint32_t rowSize; // Not always = bmpWidth; may have padding - uint8_t sdbuffer[3*BUFFPIXEL]; // pixel buffer (R+G+B per pixel) - uint8_t buffidx = sizeof(sdbuffer); // Current position in sdbuffer - boolean goodBmp = false; // Set to true on valid header parse - boolean flip = true; // BMP is stored bottom-to-top - int w, h, row, col, x2, y2, bx1, by1; - uint8_t r, g, b; - uint32_t pos = 0, startTime = millis(); - - if((x >= tft.width()) || (y >= tft.height())) return; - - Serial.println(); - Serial.print(F("Loading image '")); - Serial.print(filename); - Serial.println('\''); - - // Open requested file on SD card - if ((bmpFile = SD.open(filename)) == NULL) { - Serial.print(F("File not found")); - return; - } - - // Parse BMP header - if(read16(bmpFile) == 0x4D42) { // BMP signature - Serial.print(F("File size: ")); Serial.println(read32(bmpFile)); - (void)read32(bmpFile); // Read & ignore creator bytes - bmpImageoffset = read32(bmpFile); // Start of image data - Serial.print(F("Image Offset: ")); Serial.println(bmpImageoffset, DEC); - // Read DIB header - Serial.print(F("Header size: ")); Serial.println(read32(bmpFile)); - bmpWidth = read32(bmpFile); - bmpHeight = read32(bmpFile); - if(read16(bmpFile) == 1) { // # planes -- must be '1' - bmpDepth = read16(bmpFile); // bits per pixel - Serial.print(F("Bit Depth: ")); Serial.println(bmpDepth); - if((bmpDepth == 24) && (read32(bmpFile) == 0)) { // 0 = uncompressed - - goodBmp = true; // Supported BMP format -- proceed! - Serial.print(F("Image size: ")); - Serial.print(bmpWidth); - Serial.print('x'); - Serial.println(bmpHeight); - - // BMP rows are padded (if needed) to 4-byte boundary - rowSize = (bmpWidth * 3 + 3) & ~3; - - // If bmpHeight is negative, image is in top-down order. - // This is not canon but has been observed in the wild. - if(bmpHeight < 0) { - bmpHeight = -bmpHeight; - flip = false; - } - - // Crop area to be loaded - x2 = x + bmpWidth - 1; // Lower-right corner - y2 = y + bmpHeight - 1; - if((x2 >= 0) && (y2 >= 0)) { // On screen? - w = bmpWidth; // Width/height of section to load/display - h = bmpHeight; - bx1 = by1 = 0; // UL coordinate in BMP file - if(x < 0) { // Clip left - bx1 = -x; - x = 0; - w = x2 + 1; - } - if(y < 0) { // Clip top - by1 = -y; - y = 0; - h = y2 + 1; - } - if(x2 >= tft.width()) w = tft.width() - x; // Clip right - if(y2 >= tft.height()) h = tft.height() - y; // Clip bottom - - // Set TFT address window to clipped image bounds - tft.startWrite(); // Requires start/end transaction now - tft.setAddrWindow(x, y, w, h); - - for (row=0; row= sizeof(sdbuffer)) { // Indeed - tft.endWrite(); // End TFT transaction - bmpFile.read(sdbuffer, sizeof(sdbuffer)); - buffidx = 0; // Set index to beginning - tft.startWrite(); // Start new TFT transaction - } - // Convert pixel from BMP to TFT format, push to display - b = sdbuffer[buffidx++]; - g = sdbuffer[buffidx++]; - r = sdbuffer[buffidx++]; - tft.writePixel(tft.color565(r,g,b)); - } // end pixel - } // end scanline - tft.endWrite(); // End last TFT transaction - } // end onscreen - Serial.print(F("Loaded in ")); - Serial.print(millis() - startTime); - Serial.println(" ms"); - } // end goodBmp - } - } - - bmpFile.close(); - if(!goodBmp) Serial.println(F("BMP format not recognized.")); -} - -// These read 16- and 32-bit types from the SD card file. -// BMP data is stored little-endian, Arduino is little-endian too. -// May need to reverse subscript order if porting elsewhere. - -uint16_t read16(File &f) { - uint16_t result; - ((uint8_t *)&result)[0] = f.read(); // LSB - ((uint8_t *)&result)[1] = f.read(); // MSB - return result; -} - -uint32_t read32(File &f) { - uint32_t result; - ((uint8_t *)&result)[0] = f.read(); // LSB - ((uint8_t *)&result)[1] = f.read(); - ((uint8_t *)&result)[2] = f.read(); - ((uint8_t *)&result)[3] = f.read(); // MSB - return result; -} diff --git a/lib/lib_display/Adafruit_ILI9341-1.2.0-Tasmota-1.0/examples/touchpaint/touchpaint.ino b/lib/lib_display/Adafruit_ILI9341-1.2.0-Tasmota-1.0/examples/touchpaint/touchpaint.ino deleted file mode 100644 index 227abdc84..000000000 --- a/lib/lib_display/Adafruit_ILI9341-1.2.0-Tasmota-1.0/examples/touchpaint/touchpaint.ino +++ /dev/null @@ -1,146 +0,0 @@ -/*************************************************** - This is our touchscreen painting example for the Adafruit ILI9341 Shield - ----> http://www.adafruit.com/products/1651 - - Check out the links above for our tutorials and wiring diagrams - These displays use SPI to communicate, 4 or 5 pins are required to - interface (RST is optional) - Adafruit invests time and resources providing this open source code, - please support Adafruit and open-source hardware by purchasing - products from Adafruit! - - Written by Limor Fried/Ladyada for Adafruit Industries. - MIT license, all text above must be included in any redistribution - ****************************************************/ - - -#include // Core graphics library -#include -#include // this is needed even tho we aren't using it -#include -#include - -// This is calibration data for the raw touch data to the screen coordinates -#define TS_MINX 150 -#define TS_MINY 130 -#define TS_MAXX 3800 -#define TS_MAXY 4000 - -// The STMPE610 uses hardware SPI on the shield, and #8 -#define STMPE_CS 8 -Adafruit_STMPE610 ts = Adafruit_STMPE610(STMPE_CS); - -// The display also uses hardware SPI, plus #9 & #10 -#define TFT_CS 10 -#define TFT_DC 9 -Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC); - -// Size of the color selection boxes and the paintbrush size -#define BOXSIZE 40 -#define PENRADIUS 3 -int oldcolor, currentcolor; - -void setup(void) { - // while (!Serial); // used for leonardo debugging - - Serial.begin(9600); - Serial.println(F("Touch Paint!")); - - tft.begin(); - - if (!ts.begin()) { - Serial.println("Couldn't start touchscreen controller"); - while (1); - } - Serial.println("Touchscreen started"); - - tft.fillScreen(ILI9341_BLACK); - - // make the color selection boxes - tft.fillRect(0, 0, BOXSIZE, BOXSIZE, ILI9341_RED); - tft.fillRect(BOXSIZE, 0, BOXSIZE, BOXSIZE, ILI9341_YELLOW); - tft.fillRect(BOXSIZE*2, 0, BOXSIZE, BOXSIZE, ILI9341_GREEN); - tft.fillRect(BOXSIZE*3, 0, BOXSIZE, BOXSIZE, ILI9341_CYAN); - tft.fillRect(BOXSIZE*4, 0, BOXSIZE, BOXSIZE, ILI9341_BLUE); - tft.fillRect(BOXSIZE*5, 0, BOXSIZE, BOXSIZE, ILI9341_MAGENTA); - - // select the current color 'red' - tft.drawRect(0, 0, BOXSIZE, BOXSIZE, ILI9341_WHITE); - currentcolor = ILI9341_RED; -} - - -void loop() -{ - // See if there's any touch data for us - if (ts.bufferEmpty()) { - return; - } - /* - // You can also wait for a touch - if (! ts.touched()) { - return; - } - */ - - // Retrieve a point - TS_Point p = ts.getPoint(); - - /* - Serial.print("X = "); Serial.print(p.x); - Serial.print("\tY = "); Serial.print(p.y); - Serial.print("\tPressure = "); Serial.println(p.z); - */ - - // Scale from ~0->4000 to tft.width using the calibration #'s - p.x = map(p.x, TS_MINX, TS_MAXX, 0, tft.width()); - p.y = map(p.y, TS_MINY, TS_MAXY, 0, tft.height()); - - /* - Serial.print("("); Serial.print(p.x); - Serial.print(", "); Serial.print(p.y); - Serial.println(")"); - */ - - if (p.y < BOXSIZE) { - oldcolor = currentcolor; - - if (p.x < BOXSIZE) { - currentcolor = ILI9341_RED; - tft.drawRect(0, 0, BOXSIZE, BOXSIZE, ILI9341_WHITE); - } else if (p.x < BOXSIZE*2) { - currentcolor = ILI9341_YELLOW; - tft.drawRect(BOXSIZE, 0, BOXSIZE, BOXSIZE, ILI9341_WHITE); - } else if (p.x < BOXSIZE*3) { - currentcolor = ILI9341_GREEN; - tft.drawRect(BOXSIZE*2, 0, BOXSIZE, BOXSIZE, ILI9341_WHITE); - } else if (p.x < BOXSIZE*4) { - currentcolor = ILI9341_CYAN; - tft.drawRect(BOXSIZE*3, 0, BOXSIZE, BOXSIZE, ILI9341_WHITE); - } else if (p.x < BOXSIZE*5) { - currentcolor = ILI9341_BLUE; - tft.drawRect(BOXSIZE*4, 0, BOXSIZE, BOXSIZE, ILI9341_WHITE); - } else if (p.x < BOXSIZE*6) { - currentcolor = ILI9341_MAGENTA; - tft.drawRect(BOXSIZE*5, 0, BOXSIZE, BOXSIZE, ILI9341_WHITE); - } - - if (oldcolor != currentcolor) { - if (oldcolor == ILI9341_RED) - tft.fillRect(0, 0, BOXSIZE, BOXSIZE, ILI9341_RED); - if (oldcolor == ILI9341_YELLOW) - tft.fillRect(BOXSIZE, 0, BOXSIZE, BOXSIZE, ILI9341_YELLOW); - if (oldcolor == ILI9341_GREEN) - tft.fillRect(BOXSIZE*2, 0, BOXSIZE, BOXSIZE, ILI9341_GREEN); - if (oldcolor == ILI9341_CYAN) - tft.fillRect(BOXSIZE*3, 0, BOXSIZE, BOXSIZE, ILI9341_CYAN); - if (oldcolor == ILI9341_BLUE) - tft.fillRect(BOXSIZE*4, 0, BOXSIZE, BOXSIZE, ILI9341_BLUE); - if (oldcolor == ILI9341_MAGENTA) - tft.fillRect(BOXSIZE*5, 0, BOXSIZE, BOXSIZE, ILI9341_MAGENTA); - } - } - if (((p.y-PENRADIUS) > BOXSIZE) && ((p.y+PENRADIUS) < tft.height())) { - tft.fillCircle(p.x, p.y, PENRADIUS, currentcolor); - } -} diff --git a/lib/lib_display/Adafruit_ILI9341-1.2.0-Tasmota-1.0/examples/touchpaint_featherwing/.mega2560.test.skip b/lib/lib_display/Adafruit_ILI9341-1.2.0-Tasmota-1.0/examples/touchpaint_featherwing/.mega2560.test.skip deleted file mode 100644 index e69de29bb..000000000 diff --git a/lib/lib_display/Adafruit_ILI9341-1.2.0-Tasmota-1.0/examples/touchpaint_featherwing/touchpaint_featherwing.ino b/lib/lib_display/Adafruit_ILI9341-1.2.0-Tasmota-1.0/examples/touchpaint_featherwing/touchpaint_featherwing.ino deleted file mode 100644 index 5d317abcd..000000000 --- a/lib/lib_display/Adafruit_ILI9341-1.2.0-Tasmota-1.0/examples/touchpaint_featherwing/touchpaint_featherwing.ino +++ /dev/null @@ -1,165 +0,0 @@ -/*************************************************** - This is our touchscreen painting example for the Adafruit TFT FeatherWing - ----> http://www.adafruit.com/products/3315 - - Check out the links above for our tutorials and wiring diagrams - - Adafruit invests time and resources providing this open source code, - please support Adafruit and open-source hardware by purchasing - products from Adafruit! - - Written by Limor Fried/Ladyada for Adafruit Industries. - MIT license, all text above must be included in any redistribution - ****************************************************/ - -#include -#include // this is needed even tho we aren't using it - -#include // Core graphics library -#include // Hardware-specific library -#include - -#ifdef ESP8266 - #define STMPE_CS 16 - #define TFT_CS 0 - #define TFT_DC 15 - #define SD_CS 2 -#endif -#ifdef ESP32 - #define STMPE_CS 32 - #define TFT_CS 15 - #define TFT_DC 33 - #define SD_CS 14 -#endif -#ifdef TEENSYDUINO - #define TFT_DC 10 - #define TFT_CS 4 - #define STMPE_CS 3 - #define SD_CS 8 -#endif -#ifdef ARDUINO_STM32_FEATHER - #define TFT_DC PB4 - #define TFT_CS PA15 - #define STMPE_CS PC7 - #define SD_CS PC5 -#endif -#ifdef ARDUINO_NRF52_FEATHER /* BSP 0.6.5 and higher! */ - #define TFT_DC 11 - #define TFT_CS 31 - #define STMPE_CS 30 - #define SD_CS 27 -#endif -#if defined(ARDUINO_MAX32620FTHR) || defined(ARDUINO_MAX32630FTHR) - #define TFT_DC P5_4 - #define TFT_CS P5_3 - #define STMPE_CS P3_3 - #define SD_CS P3_2 -#endif - -// Anything else! -#if defined (__AVR_ATmega32U4__) || defined(ARDUINO_SAMD_FEATHER_M0) || defined (__AVR_ATmega328P__) || defined(ARDUINO_SAMD_ZERO) || defined(__SAMD51__) || defined(__SAM3X8E__) - #define STMPE_CS 6 - #define TFT_CS 9 - #define TFT_DC 10 - #define SD_CS 5 -#endif - - -Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC); -Adafruit_STMPE610 ts = Adafruit_STMPE610(STMPE_CS); - - -// This is calibration data for the raw touch data to the screen coordinates -#define TS_MINX 3800 -#define TS_MAXX 100 -#define TS_MINY 100 -#define TS_MAXY 3750 - -// Size of the color selection boxes and the paintbrush size -#define BOXSIZE 40 -#define PENRADIUS 3 -int oldcolor, currentcolor; - -void setup(void) { - Serial.begin(115200); - - delay(10); - Serial.println("FeatherWing TFT"); - if (!ts.begin()) { - Serial.println("Couldn't start touchscreen controller"); - while (1); - } - Serial.println("Touchscreen started"); - - tft.begin(); - tft.fillScreen(ILI9341_BLACK); - - // make the color selection boxes - tft.fillRect(0, 0, BOXSIZE, BOXSIZE, ILI9341_RED); - tft.fillRect(BOXSIZE, 0, BOXSIZE, BOXSIZE, ILI9341_YELLOW); - tft.fillRect(BOXSIZE*2, 0, BOXSIZE, BOXSIZE, ILI9341_GREEN); - tft.fillRect(BOXSIZE*3, 0, BOXSIZE, BOXSIZE, ILI9341_CYAN); - tft.fillRect(BOXSIZE*4, 0, BOXSIZE, BOXSIZE, ILI9341_BLUE); - tft.fillRect(BOXSIZE*5, 0, BOXSIZE, BOXSIZE, ILI9341_MAGENTA); - - // select the current color 'red' - tft.drawRect(0, 0, BOXSIZE, BOXSIZE, ILI9341_WHITE); - currentcolor = ILI9341_RED; -} - -void loop() { - // Retrieve a point - TS_Point p = ts.getPoint(); - - Serial.print("X = "); Serial.print(p.x); - Serial.print("\tY = "); Serial.print(p.y); - Serial.print("\tPressure = "); Serial.println(p.z); - - - // Scale from ~0->4000 to tft.width using the calibration #'s - p.x = map(p.x, TS_MINX, TS_MAXX, 0, tft.width()); - p.y = map(p.y, TS_MINY, TS_MAXY, 0, tft.height()); - - if (p.y < BOXSIZE) { - oldcolor = currentcolor; - - if (p.x < BOXSIZE) { - currentcolor = ILI9341_RED; - tft.drawRect(0, 0, BOXSIZE, BOXSIZE, ILI9341_WHITE); - } else if (p.x < BOXSIZE*2) { - currentcolor = ILI9341_YELLOW; - tft.drawRect(BOXSIZE, 0, BOXSIZE, BOXSIZE, ILI9341_WHITE); - } else if (p.x < BOXSIZE*3) { - currentcolor = ILI9341_GREEN; - tft.drawRect(BOXSIZE*2, 0, BOXSIZE, BOXSIZE, ILI9341_WHITE); - } else if (p.x < BOXSIZE*4) { - currentcolor = ILI9341_CYAN; - tft.drawRect(BOXSIZE*3, 0, BOXSIZE, BOXSIZE, ILI9341_WHITE); - } else if (p.x < BOXSIZE*5) { - currentcolor = ILI9341_BLUE; - tft.drawRect(BOXSIZE*4, 0, BOXSIZE, BOXSIZE, ILI9341_WHITE); - } else if (p.x < BOXSIZE*6) { - currentcolor = ILI9341_MAGENTA; - tft.drawRect(BOXSIZE*5, 0, BOXSIZE, BOXSIZE, ILI9341_WHITE); - } - - if (oldcolor != currentcolor) { - if (oldcolor == ILI9341_RED) - tft.fillRect(0, 0, BOXSIZE, BOXSIZE, ILI9341_RED); - if (oldcolor == ILI9341_YELLOW) - tft.fillRect(BOXSIZE, 0, BOXSIZE, BOXSIZE, ILI9341_YELLOW); - if (oldcolor == ILI9341_GREEN) - tft.fillRect(BOXSIZE*2, 0, BOXSIZE, BOXSIZE, ILI9341_GREEN); - if (oldcolor == ILI9341_CYAN) - tft.fillRect(BOXSIZE*3, 0, BOXSIZE, BOXSIZE, ILI9341_CYAN); - if (oldcolor == ILI9341_BLUE) - tft.fillRect(BOXSIZE*4, 0, BOXSIZE, BOXSIZE, ILI9341_BLUE); - if (oldcolor == ILI9341_MAGENTA) - tft.fillRect(BOXSIZE*5, 0, BOXSIZE, BOXSIZE, ILI9341_MAGENTA); - } - } - - if (((p.y-PENRADIUS) > 0) && ((p.y+PENRADIUS) < tft.height())) { - tft.fillCircle(p.x, p.y, PENRADIUS, currentcolor); - } -} diff --git a/lib/lib_display/Adafruit_ILI9341-1.2.0-Tasmota-1.0/library.properties b/lib/lib_display/Adafruit_ILI9341-1.2.0-Tasmota-1.0/library.properties deleted file mode 100644 index 8c93d49ee..000000000 --- a/lib/lib_display/Adafruit_ILI9341-1.2.0-Tasmota-1.0/library.properties +++ /dev/null @@ -1,9 +0,0 @@ -name=Adafruit ILI9341 -version=1.2.0 -author=Adafruit -maintainer=Adafruit -sentence=Library for Adafruit ILI9341 displays -paragraph=Library for Adafruit ILI9341 displays -category=Display -url=https://github.com/adafruit/Adafruit_ILI9341 -architectures=* diff --git a/lib/lib_display/Arduino_ST7789-gemu-1.0/Arduino_ST7789.cpp b/lib/lib_display/Arduino_ST7789-gemu-1.0/Arduino_ST7789.cpp index 9946286b2..7347fa74f 100644 --- a/lib/lib_display/Arduino_ST7789-gemu-1.0/Arduino_ST7789.cpp +++ b/lib/lib_display/Arduino_ST7789-gemu-1.0/Arduino_ST7789.cpp @@ -21,6 +21,8 @@ ST7789_LIGHTGREY,ST7789_DARKGREY,ST7789_ORANGE,ST7789_GREENYELLOW,ST7789_PINK}; #define ST7789_DIMMER #endif + + uint16_t Arduino_ST7789::GetColorFromIndex(uint8_t index) { if (index>=sizeof(ST7789_colors)/2) index=0; return ST7789_colors[index]; @@ -50,7 +52,7 @@ inline uint16_t swapcolor(uint16_t x) { } #if defined (SPI_HAS_TRANSACTION) - static SPISettings mySPISettings; + static SPISettings ST7789_SPISettings; #elif defined (__AVR__) || defined(CORE_TEENSY) static uint8_t SPCRbackup; static uint8_t mySPCR; @@ -58,7 +60,7 @@ inline uint16_t swapcolor(uint16_t x) { #if defined (SPI_HAS_TRANSACTION) -#define SPI_BEGIN_TRANSACTION() if (_hwSPI) SPI.beginTransaction(mySPISettings) +#define SPI_BEGIN_TRANSACTION() if (_hwSPI) SPI.beginTransaction(ST7789_SPISettings) #define SPI_END_TRANSACTION() if (_hwSPI) SPI.endTransaction() #else #define SPI_BEGIN_TRANSACTION() (void) @@ -217,26 +219,28 @@ void Arduino_ST7789::displayInit(const uint8_t *addr) { uint16_t ms; //<----------------------------------------------------------------------------------------- DC_HIGH(); - #if defined(USE_FAST_IO) + if (!_hwSPI) { +#if defined(USE_FAST_IO) *clkport |= clkpinmask; - #else +#else digitalWrite(_sclk, HIGH); - #endif +#endif + } //<----------------------------------------------------------------------------------------- numCommands = pgm_read_byte(addr++); // Number of commands to follow - while(numCommands--) { // For each command... + while (numCommands--) { // For each command... writecommand(pgm_read_byte(addr++)); // Read, issue command numArgs = pgm_read_byte(addr++); // Number of args to follow ms = numArgs & ST_CMD_DELAY; // If hibit set, delay follows args numArgs &= ~ST_CMD_DELAY; // Mask out delay bit - while(numArgs--) { // For each argument... + while (numArgs--) { // For each argument... writedata(pgm_read_byte(addr++)); // Read, issue argument } - if(ms) { + if (ms) { ms = pgm_read_byte(addr++); // Read post-command delay time (ms) - if(ms == 255) ms = 500; // If 255, delay for 500 ms + if (ms == 255) ms = 500; // If 255, delay for 500 ms delay(ms); } } @@ -270,16 +274,16 @@ void Arduino_ST7789::commonInit(const uint8_t *cmdList) { dcport = portOutputRegister(digitalPinToPort(_dc)); dcpinmask = digitalPinToBitMask(_dc); if (_cs>=0) { - csport = portOutputRegister(digitalPinToPort(_cs)); - cspinmask = digitalPinToBitMask(_cs); + csport = portOutputRegister(digitalPinToPort(_cs)); + cspinmask = digitalPinToBitMask(_cs); } - #endif if(_hwSPI) { // Using hardware SPI #if defined (SPI_HAS_TRANSACTION) SPI.begin(); - mySPISettings = SPISettings(24000000, MSBFIRST, SPI_MODE2); + // ST7789_SPISettings = SPISettings(24000000, MSBFIRST, SPI_MODE2); + ST7789_SPISettings = SPISettings(1000000, MSBFIRST, SPI_MODE2); #elif defined (__AVR__) || defined(CORE_TEENSY) SPCRbackup = SPCR; SPI.begin(); @@ -318,7 +322,7 @@ void Arduino_ST7789::commonInit(const uint8_t *cmdList) { delay(50); } - if(cmdList) + if (cmdList) displayInit(cmdList); } @@ -391,7 +395,6 @@ void Arduino_ST7789::setAddrWindow(uint16_t x0, uint16_t y0, uint16_t x1, uint16 setAddrWindow_int(x0,y0,x1-1,y1-1); } - void Arduino_ST7789::setAddrWindow_int(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1) { uint16_t x_start = x0 + _xstart, x_end = x1 + _xstart; uint16_t y_start = y0 + _ystart, y_end = y1 + _ystart; diff --git a/lib/lib_display/Arduino_ST7789-gemu-1.0/Arduino_ST7789.h b/lib/lib_display/Arduino_ST7789-gemu-1.0/Arduino_ST7789.h index b8cbabeb8..ebd39dc25 100644 --- a/lib/lib_display/Arduino_ST7789-gemu-1.0/Arduino_ST7789.h +++ b/lib/lib_display/Arduino_ST7789-gemu-1.0/Arduino_ST7789.h @@ -15,6 +15,10 @@ #include #include +#ifdef ESP8266 +#define USE_FAST_IO +#endif + #if defined(__AVR__) || defined(CORE_TEENSY) #include #define USE_FAST_IO @@ -177,7 +181,7 @@ class Arduino_ST7789 : public Renderer { int8_t _cs, _dc, _rst, _sid, _sclk, _bp; #if defined(USE_FAST_IO) - volatile RwReg *dataport, *clkport, *csport, *dcport; + volatile uint32_t *dataport, *clkport, *csport, *dcport; #if defined(__AVR__) || defined(CORE_TEENSY) // 8 bit! uint8_t datapinmask, clkpinmask, cspinmask, dcpinmask; diff --git a/lib/lib_display/Display_Renderer-gemu-1.0/src/renderer.cpp b/lib/lib_display/Display_Renderer-gemu-1.0/src/renderer.cpp index c05faee13..911d4809f 100644 --- a/lib/lib_display/Display_Renderer-gemu-1.0/src/renderer.cpp +++ b/lib/lib_display/Display_Renderer-gemu-1.0/src/renderer.cpp @@ -87,6 +87,14 @@ void Renderer::Updateframe() { } + +void Renderer::setTextSize(uint8_t sf) { + if (sf < 1) sf = 1; + if (sf > 4) sf = 4; + tsize = sf; + Adafruit_GFX::setTextSize(sf); +} + /** * @brief: this draws a charactor on the frame buffer but not refresh */ @@ -96,14 +104,25 @@ void Renderer::DrawCharAt(int16_t x, int16_t y, char ascii_char,int16_t colored) int i, j; unsigned int char_offset = (ascii_char - ' ') * xfont->Height * (xfont->Width / 8 + (xfont->Width % 8 ? 1 : 0)); const unsigned char* ptr = &xfont->table[char_offset]; + uint8_t sf = tsize; for (j = 0; j < xfont->Height; j++) { for (i = 0; i < xfont->Width; i++) { if (pgm_read_byte(ptr) & (0x80 >> (i % 8))) { - writePixel(x + i, y + j, colored); + if (sf == 1) { + writePixel(x + i, y + j, colored); + } else { + writeFillRect(x + i * sf, y + j * sf, sf, sf, colored); + } } else { // fill background - if (!drawmode) writePixel(x + i, y + j, textbgcolor); + if (!drawmode) { + if (sf == 1) { + writePixel(x + i, y + j, textbgcolor); + } else { + writeFillRect(x + i * sf, y + j * sf, sf, sf, textbgcolor); + } + } } if (i % 8 == 7) { ptr++; @@ -146,8 +165,8 @@ void Renderer::DrawStringAt(int16_t x, int16_t y, const char* text, uint16_t col if (flag) { - x=(x-1)*xfont->Width; - y=(y-1)*xfont->Height; + x=(x-1)*xfont->Width*tsize; + y=(y-1)*xfont->Height*tsize; refcolumn = x; } @@ -159,7 +178,7 @@ void Renderer::DrawStringAt(int16_t x, int16_t y, const char* text, uint16_t col /* Display one character on EPD */ DrawCharAt(refcolumn, y, *p_text, colored); /* increment the column position */ - refcolumn += xfont->Width; + refcolumn += xfont->Width*tsize; /* Point on the next character */ p_text++; counter++; @@ -527,6 +546,13 @@ void Renderer::setDrawMode(uint8_t mode) { void Renderer::invertDisplay(boolean i) { } +void Renderer::setScrollMargins(uint16_t top, uint16_t bottom) { + +} +void Renderer::scrollTo(uint16_t y) { + +} + void VButton::xdrawButton(bool inverted) { wr_redir=1; drawButton(inverted); @@ -626,4 +652,5 @@ uint16_t VButton::UpdateSlider(int16_t x, int16_t y) { + /* END OF FILE */ diff --git a/lib/lib_display/Display_Renderer-gemu-1.0/src/renderer.h b/lib/lib_display/Display_Renderer-gemu-1.0/src/renderer.h index b50745686..cae4b420b 100644 --- a/lib/lib_display/Display_Renderer-gemu-1.0/src/renderer.h +++ b/lib/lib_display/Display_Renderer-gemu-1.0/src/renderer.h @@ -36,15 +36,19 @@ public: virtual void pushColors(uint16_t *data, uint16_t len, boolean first); virtual void setAddrWindow(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1); virtual void invertDisplay(boolean i); + virtual void setScrollMargins(uint16_t top, uint16_t bottom); + virtual void scrollTo(uint16_t y); void setDrawMode(uint8_t mode); uint8_t drawmode; virtual void FastString(uint16_t x,uint16_t y,uint16_t tcolor, const char* str); + void setTextSize(uint8_t s); private: void DrawCharAt(int16_t x, int16_t y, char ascii_char,int16_t colored); inline void drawFastVLineInternal(int16_t x, int16_t y, int16_t h, uint16_t color) __attribute__((always_inline)); inline void drawFastHLineInternal(int16_t x, int16_t y, int16_t w, uint16_t color) __attribute__((always_inline)); sFONT *selected_font; uint8_t font; + uint8_t tsize = 1; }; typedef union { diff --git a/lib/lib_display/ILI9341-gemu-1.0/ILI9341_2.cpp b/lib/lib_display/ILI9341-gemu-1.0/ILI9341_2.cpp index 428f7cb80..f8a365f8e 100644 --- a/lib/lib_display/ILI9341-gemu-1.0/ILI9341_2.cpp +++ b/lib/lib_display/ILI9341-gemu-1.0/ILI9341_2.cpp @@ -46,7 +46,7 @@ * */ -#ifdef ESP32 +//#ifdef ESP32 #include "ILI9341_2.h" #include @@ -57,25 +57,26 @@ #define ILI9341_2_DIMMER #undef ESP32_PWM_CHANNEL #define ESP32_PWM_CHANNEL 1 -#define ILI9341_2_HWSPI #endif +#define ILI9341_2_HWSPI + #if defined (ILI9341_2_HWSPI) #define SPI_BEGIN_TRANSACTION() if (_hwspi) spi2->beginTransaction(sspi2) #define SPI_END_TRANSACTION() if (_hwspi) spi2->endTransaction() #else -#define SPI_BEGIN_TRANSACTION() (void) -#define SPI_END_TRANSACTION() (void) +#define SPI_BEGIN_TRANSACTION() +#define SPI_END_TRANSACTION() #endif -const uint16_t ili9341_2_colors[]={ILI9341_2_BLACK,ILI9341_2_WHITE,ILI9341_2_RED,ILI9341_2_GREEN,ILI9341_2_BLUE,ILI9341_2_CYAN,ILI9341_2_MAGENTA,\ - ILI9341_2_YELLOW,ILI9341_2_NAVY,ILI9341_2_DARKGREEN,ILI9341_2_DARKCYAN,ILI9341_2_MAROON,ILI9341_2_PURPLE,ILI9341_2_OLIVE,\ -ILI9341_2_LIGHTGREY,ILI9341_2_DARKGREY,ILI9341_2_ORANGE,ILI9341_2_GREENYELLOW,ILI9341_2_PINK}; +const uint16_t ili9341_2_colors[]={ILI9341_BLACK,ILI9341_WHITE,ILI9341_RED,ILI9341_GREEN,ILI9341_BLUE,ILI9341_CYAN,ILI9341_MAGENTA,\ + ILI9341_YELLOW,ILI9341_NAVY,ILI9341_DARKGREEN,ILI9341_DARKCYAN,ILI9341_MAROON,ILI9341_PURPLE,ILI9341_OLIVE,\ +ILI9341_LIGHTGREY,ILI9341_DARKGREY,ILI9341_ORANGE,ILI9341_GREENYELLOW,ILI9341_PINK}; uint16_t ILI9341_2::GetColorFromIndex(uint8_t index) { - if (index>=sizeof(ili9341_2_colors)/2) index=0; + if (index >= sizeof(ili9341_2_colors) / 2) index = 0; return ili9341_2_colors[index]; } @@ -135,7 +136,7 @@ static const uint8_t PROGMEM ili9342_initcmd[] = { 0x00 // End of list }; -ILI9341_2::ILI9341_2(int8_t cs, int8_t mosi, int8_t miso, int8_t sclk, int8_t res, int8_t dc, int8_t bp) : Renderer(ILI9341_2_TFTWIDTH, ILI9341_2_TFTHEIGHT) { +ILI9341_2::ILI9341_2(int8_t cs, int8_t mosi, int8_t miso, int8_t sclk, int8_t res, int8_t dc, int8_t bp, int8_t spibus) : Renderer(ILI9341_TFTWIDTH, ILI9341_TFTHEIGHT) { _cs = cs; _mosi = mosi; _miso = miso; @@ -143,20 +144,22 @@ ILI9341_2::ILI9341_2(int8_t cs, int8_t mosi, int8_t miso, int8_t sclk, int8_t re _res = res; _dc = dc; _bp = bp; - _hwspi = 1; + _hwspi = 1; // sign ili9341 + _spibus = spibus; } -// special init for ILI9342 -ILI9341_2::ILI9341_2(int8_t cs, int8_t res, int8_t dc, int8_t bp) : Renderer(ILI9341_2_TFTWIDTH, ILI9341_2_TFTHEIGHT) { +// special init for ILI9342 uses SPI1 previously defined with SDCard +ILI9341_2::ILI9341_2(int8_t cs, int8_t res, int8_t dc, int8_t bp) : Renderer(ILI9341_TFTWIDTH, ILI9341_TFTHEIGHT) { _cs = cs; _res = res; _dc = dc; _bp = bp; - _hwspi = 2; + _hwspi = 2; // sign ili9342 + _spibus = 1; } -#define ILI9341_2_CS_LOW digitalWrite( _cs, LOW); -#define ILI9341_2_CS_HIGH digitalWrite( _cs, HIGH); +#define ILI9341_2_CS_LOW if (_cs>=0) digitalWrite( _cs, LOW); +#define ILI9341_2_CS_HIGH if (_cs>=0) digitalWrite( _cs, HIGH); void ILI9341_2::writecmd(uint8_t d) { @@ -172,12 +175,12 @@ void ILI9341_2::writecmd(uint8_t d) { void ILI9341_2::init(uint16_t width, uint16_t height) { //sspi2 = SPISettings(2500000, MSBFIRST, SPI_MODE3); - if (_hwspi==2) { - iwidth=ILI9341_2_TFTWIDTH; - iheight=ILI9341_2_TFTHEIGHT; + if (_hwspi == 2) { + iwidth = ILI9341_TFTWIDTH; + iheight = ILI9341_TFTHEIGHT; } else { - iwidth=ILI9341_2_TFTHEIGHT; - iheight=ILI9341_2_TFTWIDTH; + iwidth = ILI9341_TFTHEIGHT; + iheight = ILI9341_TFTWIDTH; } #ifdef ILI9341_2_HWSPI @@ -187,8 +190,17 @@ void ILI9341_2::init(uint16_t width, uint16_t height) { if (_hwspi==2) { spi2=&SPI; } else { - spi2 = new SPIClass(HSPI); +#ifdef ESP32 + if (_spibus == 2) { + spi2 = new SPIClass(HSPI); + } else { + spi2 = &SPI; + } spi2->begin(_sclk, _miso, _mosi, -1); +#else + SPI.begin(); + spi2 = &SPI; +#endif } #else @@ -205,12 +217,12 @@ void ILI9341_2::init(uint16_t width, uint16_t height) { pinMode(_dc, OUTPUT); digitalWrite(_dc,HIGH); - if (_bp>=0) { + if (_bp >= 0) { pinMode(_bp, OUTPUT); digitalWrite(_bp,HIGH); } - if (_res>=0) { + if (_res >= 0) { pinMode(_res, OUTPUT); digitalWrite(_res, HIGH); delay(100); @@ -227,11 +239,11 @@ void ILI9341_2::init(uint16_t width, uint16_t height) { delay(150); } - if (_bp>=0) { + if (_bp >= 0) { #ifdef ILI9341_2_DIMMER - ledcSetup(ESP32_PWM_CHANNEL,4000,8); - ledcAttachPin(_bp,ESP32_PWM_CHANNEL); - ledcWrite(ESP32_PWM_CHANNEL,128); + ledcSetup(ESP32_PWM_CHANNEL, 4000, 8); + ledcAttachPin(_bp, ESP32_PWM_CHANNEL); + ledcWrite(ESP32_PWM_CHANNEL, 128); #else pinMode(_bp, OUTPUT); #endif @@ -261,11 +273,9 @@ void ILI9341_2::init(uint16_t width, uint16_t height) { #endif ILI9341_2_CS_HIGH - if(x & 0x80) delay(120); + if (x & 0x80) delay(120); } SPI_END_TRANSACTION(); - -// endWrite(); } void ILI9341_2::DisplayInit(int8_t p,int8_t size,int8_t rot,int8_t font) { @@ -275,9 +285,9 @@ void ILI9341_2::DisplayInit(int8_t p,int8_t size,int8_t rot,int8_t font) { setRotation(rot); setTextFont(font&3); setTextSize(size&7); - setTextColor(ILI9341_2_WHITE,ILI9341_2_BLACK); + setTextColor(ILI9341_WHITE,ILI9341_BLACK); setCursor(0,0); - fillScreen(ILI9341_2_BLACK); + fillScreen(ILI9341_BLACK); } void ILI9341_2::setAddrWindow(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1) { @@ -331,21 +341,20 @@ void ILI9341_2::setAddrWindow_int(uint16_t x, uint16_t y, uint16_t w, uint16_t h void ILI9341_2::drawPixel(int16_t x, int16_t y, uint16_t color) { - if((x < 0) ||(x >= _width) || (y < 0) || (y >= _height)) return; - ILI9341_2_CS_LOW - SPI_BEGIN_TRANSACTION(); - setAddrWindow_int(x,y,1,1); + ILI9341_2_CS_LOW + setAddrWindow_int(x,y,1,1); #ifdef ILI9341_2_HWSPI spi2->write16(color); #else spiwrite16(color); #endif + ILI9341_2_CS_HIGH SPI_END_TRANSACTION(); @@ -354,7 +363,7 @@ void ILI9341_2::drawPixel(int16_t x, int16_t y, uint16_t color) { void ILI9341_2::setRotation(uint8_t m) { - if (_hwspi<2) { + if (_hwspi < 2) { rotation = m % 4; // can't be higher than 3 switch (rotation) { case 0: @@ -425,15 +434,14 @@ void ILI9341_2::setRotation(uint8_t m) { void ILI9341_2::drawFastVLine(int16_t x, int16_t y, int16_t h, uint16_t color) { // Rudimentary clipping - if((x >= _width) || (y >= _height)) return; - if((y+h-1) >= _height) h = _height-y; - - ILI9341_2_CS_LOW + if ((x >= _width) || (y >= _height)) return; + if ((y + h - 1) >= _height) h = _height - y; SPI_BEGIN_TRANSACTION(); - setAddrWindow_int(x, y, 1, h); + ILI9341_2_CS_LOW + setAddrWindow_int(x, y, 1, h); while (h--) { #ifdef ILI9341_2_HWSPI @@ -454,10 +462,11 @@ void ILI9341_2::drawFastHLine(int16_t x, int16_t y, int16_t w, uint16_t color) { if((x >= _width) || (y >= _height)) return; if((x+w-1) >= _width) w = _width-x; - ILI9341_2_CS_LOW SPI_BEGIN_TRANSACTION(); + ILI9341_2_CS_LOW + setAddrWindow_int(x, y, w, 1); @@ -486,10 +495,11 @@ void ILI9341_2::fillRect(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t co if((x + w - 1) >= _width) w = _width - x; if((y + h - 1) >= _height) h = _height - y; - ILI9341_2_CS_LOW SPI_BEGIN_TRANSACTION(); + ILI9341_2_CS_LOW + setAddrWindow_int(x, y, w, h); for (y=h; y>0; y--) { @@ -605,4 +615,25 @@ void ILI9341_2::spiwrite32(uint32_t c) { #endif } -#endif +void ILI9341_2::setScrollMargins(uint16_t top, uint16_t bottom) { + uint16_t height = _height - (top + bottom); + SPI_BEGIN_TRANSACTION(); + ILI9341_2_CS_LOW + writecmd(0x33); + + spiwrite16(top); + spiwrite16(height); + spiwrite16(bottom); + ILI9341_2_CS_HIGH + SPI_END_TRANSACTION(); +} + + +void ILI9341_2::scrollTo(uint16_t y) { + SPI_BEGIN_TRANSACTION(); + ILI9341_2_CS_LOW + writecmd(ILI9341_2_VSCRSADD); + spiwrite16(y); + ILI9341_2_CS_HIGH + SPI_END_TRANSACTION(); +} diff --git a/lib/lib_display/ILI9341-gemu-1.0/ILI9341_2.h b/lib/lib_display/ILI9341-gemu-1.0/ILI9341_2.h index 482df9472..4b39ebf38 100644 --- a/lib/lib_display/ILI9341-gemu-1.0/ILI9341_2.h +++ b/lib/lib_display/ILI9341-gemu-1.0/ILI9341_2.h @@ -22,8 +22,8 @@ #include #include -#define ILI9341_2_TFTWIDTH 320 -#define ILI9341_2_TFTHEIGHT 240 +#define ILI9341_TFTWIDTH 320 +#define ILI9341_TFTHEIGHT 240 #define ILI9341_2_NOP 0x00 ///< No-op register #define ILI9341_2_SWRESET 0x01 ///< Software reset register @@ -81,25 +81,25 @@ // Color definitions -#define ILI9341_2_BLACK 0x0000 /* 0, 0, 0 */ -#define ILI9341_2_NAVY 0x000F /* 0, 0, 128 */ -#define ILI9341_2_DARKGREEN 0x03E0 /* 0, 128, 0 */ -#define ILI9341_2_DARKCYAN 0x03EF /* 0, 128, 128 */ -#define ILI9341_2_MAROON 0x7800 /* 128, 0, 0 */ -#define ILI9341_2_PURPLE 0x780F /* 128, 0, 128 */ -#define ILI9341_2_OLIVE 0x7BE0 /* 128, 128, 0 */ -#define ILI9341_2_LIGHTGREY 0xC618 /* 192, 192, 192 */ -#define ILI9341_2_DARKGREY 0x7BEF /* 128, 128, 128 */ -#define ILI9341_2_BLUE 0x001F /* 0, 0, 255 */ -#define ILI9341_2_GREEN 0x07E0 /* 0, 255, 0 */ -#define ILI9341_2_CYAN 0x07FF /* 0, 255, 255 */ -#define ILI9341_2_RED 0xF800 /* 255, 0, 0 */ -#define ILI9341_2_MAGENTA 0xF81F /* 255, 0, 255 */ -#define ILI9341_2_YELLOW 0xFFE0 /* 255, 255, 0 */ -#define ILI9341_2_WHITE 0xFFFF /* 255, 255, 255 */ -#define ILI9341_2_ORANGE 0xFD20 /* 255, 165, 0 */ -#define ILI9341_2_GREENYELLOW 0xAFE5 /* 173, 255, 47 */ -#define ILI9341_2_PINK 0xF81F +#define ILI9341_BLACK 0x0000 /* 0, 0, 0 */ +#define ILI9341_NAVY 0x000F /* 0, 0, 128 */ +#define ILI9341_DARKGREEN 0x03E0 /* 0, 128, 0 */ +#define ILI9341_DARKCYAN 0x03EF /* 0, 128, 128 */ +#define ILI9341_MAROON 0x7800 /* 128, 0, 0 */ +#define ILI9341_PURPLE 0x780F /* 128, 0, 128 */ +#define ILI9341_OLIVE 0x7BE0 /* 128, 128, 0 */ +#define ILI9341_LIGHTGREY 0xC618 /* 192, 192, 192 */ +#define ILI9341_DARKGREY 0x7BEF /* 128, 128, 128 */ +#define ILI9341_BLUE 0x001F /* 0, 0, 255 */ +#define ILI9341_GREEN 0x07E0 /* 0, 255, 0 */ +#define ILI9341_CYAN 0x07FF /* 0, 255, 255 */ +#define ILI9341_RED 0xF800 /* 255, 0, 0 */ +#define ILI9341_MAGENTA 0xF81F /* 255, 0, 255 */ +#define ILI9341_YELLOW 0xFFE0 /* 255, 255, 0 */ +#define ILI9341_WHITE 0xFFFF /* 255, 255, 255 */ +#define ILI9341_ORANGE 0xFD20 /* 255, 165, 0 */ +#define ILI9341_GREENYELLOW 0xAFE5 /* 173, 255, 47 */ +#define ILI9341_PINK 0xF81F #define MADCTL_2_MY 0x80 ///< Bottom to top @@ -115,7 +115,7 @@ class ILI9341_2 : public Renderer { public: - ILI9341_2(int8_t cs, int8_t mosi, int8_t miso, int8_t sclk, int8_t res, int8_t dc, int8_t bp); + ILI9341_2(int8_t cs, int8_t mosi, int8_t miso, int8_t sclk, int8_t res, int8_t dc, int8_t bp, int8_t spibus); ILI9341_2(int8_t cs, int8_t res, int8_t dc, int8_t bp); void init(uint16_t width, uint16_t height); @@ -141,6 +141,8 @@ class ILI9341_2 : public Renderer { void spiwrite(uint8_t c); void spiwrite16(uint16_t c); void spiwrite32(uint32_t c); + void setScrollMargins(uint16_t top, uint16_t bottom); + void scrollTo(uint16_t y); uint8_t tabcolor; uint8_t dimmer; @@ -151,6 +153,7 @@ class ILI9341_2 : public Renderer { int8_t _res; int8_t _dc; int8_t _bp; + int8_t _spibus; int8_t _hwspi; uint16_t iwidth; uint16_t iheight; diff --git a/tasmota/xdsp_04_ili9341.ino b/tasmota/xdsp_04_ili9341.ino index e6b38ca7d..56e904ba4 100644 --- a/tasmota/xdsp_04_ili9341.ino +++ b/tasmota/xdsp_04_ili9341.ino @@ -1,7 +1,7 @@ /* - xdsp_04_ili9341.ino - Display Tft Ili9341 support for Tasmota + xdsp_04_ILI9341.ino - Display ILI9341/2 support for Tasmota - Copyright (C) 2021 Theo Arends and Adafruit + Copyright (C) 2021 Gerhard Mutz and Theo Arends This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -19,29 +19,181 @@ #ifdef USE_SPI #ifdef USE_DISPLAY -#ifdef USE_DISPLAY_ILI9341 +#if (defined(USE_DISPLAY_ILI9341) || defined(USE_DISPLAY_ILI9342)) #define XDSP_04 4 +#include + +extern uint8_t *buffer; +extern uint8_t color_type; +ILI9341_2 *ili9341_2; + +#ifdef USE_FT5206 +#include +uint8_t ili9342_ctouch_counter = 0; +#endif // USE_FT5206 + + +/*********************************************************************************************/ + +void ILI9341_InitDriver() +{ + if (!Settings.display_model) { + Settings.display_model = XDSP_04; + } + + if (XDSP_04 == Settings.display_model) { + + if (Settings.display_width != ILI9341_TFTWIDTH) { + Settings.display_width = ILI9341_TFTWIDTH; + } + if (Settings.display_height != ILI9341_TFTHEIGHT) { + Settings.display_height = ILI9341_TFTHEIGHT; + } + + // disable screen buffer + buffer=NULL; + + // default colors + fg_color = ILI9341_WHITE; + bg_color = ILI9341_BLACK; + +#ifdef USE_M5STACK_CORE2 + // fixed pins on m5stack core2 + ili9341_2 = new ILI9341_2(5, -2, 15, -2); +#else + // check for special case with 2 SPI busses (ESP32 bitcoin) + if (TasmotaGlobal.soft_spi_enabled) { + // init renderer, may use hardware spi, however we use SSPI defintion because SD card uses SPI definition (2 spi busses) + if (PinUsed(GPIO_SSPI_CS) && PinUsed(GPIO_OLED_RESET) && PinUsed(GPIO_BACKLIGHT) && PinUsed(GPIO_SSPI_MOSI) && PinUsed(GPIO_SSPI_MISO) && PinUsed(GPIO_SSPI_SCLK) && PinUsed(GPIO_SSPI_DC)) { + ili9341_2 = new ILI9341_2(Pin(GPIO_SSPI_CS), Pin(GPIO_SSPI_MOSI), Pin(GPIO_SSPI_MISO), Pin(GPIO_SSPI_SCLK), Pin(GPIO_OLED_RESET), Pin(GPIO_SSPI_DC), Pin(GPIO_BACKLIGHT), 2); + } else { + return; + } + } else if (TasmotaGlobal.spi_enabled) { + // there are displays without CS + int8_t cs = -1; + if (PinUsed(GPIO_ILI9341_CS)) { + cs = Pin(GPIO_ILI9341_CS); + } + if (PinUsed(GPIO_OLED_RESET) && PinUsed(GPIO_BACKLIGHT) && PinUsed(GPIO_ILI9341_DC)) { + ili9341_2 = new ILI9341_2(Pin(GPIO_ILI9341_CS), Pin(GPIO_SPI_MOSI), Pin(GPIO_SPI_MISO), Pin(GPIO_SPI_CLK), Pin(GPIO_OLED_RESET), Pin(GPIO_ILI9341_DC), Pin(GPIO_BACKLIGHT), 1); + } else { + return; + } + } else { + return; + } +#endif // USE_M5STACK_CORE2 + + ili9341_2->init(Settings.display_width,Settings.display_height); + renderer = ili9341_2; + renderer->DisplayInit(DISPLAY_INIT_MODE,Settings.display_size,Settings.display_rotate,Settings.display_font); + renderer->dim(Settings.display_dimmer); + +#ifdef SHOW_SPLASH + // Welcome text + renderer->setTextFont(2); + renderer->setTextColor(ILI9341_WHITE, ILI9341_BLACK); + renderer->DrawStringAt(30, (Settings.display_height/2)-12, "ILI9341 TFT!", ILI9341_WHITE, 0); + delay(1000); +#endif // SHOW_SPLASH + + color_type = COLOR_COLOR; + +#ifdef ESP32 +#ifdef USE_FT5206 + // start digitizer with fixed adress and pins for esp32 + #undef SDA_2 + #define SDA_2 21 + #undef SCL_2 + #define SCL_2 22 + Wire1.begin(SDA_2, SCL_2, 400000); + Touch_Init(Wire1); +#endif // USE_FT5206 +#endif // ESP32 + +#ifdef USE_DISPLAY_ILI9341 + AddLog(LOG_LEVEL_INFO, PSTR("DSP: ILI9341")); +#else + AddLog(LOG_LEVEL_INFO, PSTR("DSP: ILI9342")); +#endif + } +} + +void core2_disp_pwr(uint8_t on); +void core2_disp_dim(uint8_t dim); + +void ili9342_bpwr(uint8_t on) { +#ifdef USE_M5STACK_CORE2 + core2_disp_pwr(on); +#endif +} + +void ili9342_dimm(uint8_t dim) { +#ifdef USE_M5STACK_CORE2 + core2_disp_dim(dim); +#endif +} + +#ifdef ESP32 +#ifdef USE_FT5206 +#ifdef USE_TOUCH_BUTTONS + +void ili9342_RotConvert(int16_t *x, int16_t *y) { + +int16_t temp; + if (renderer) { + uint8_t rot = renderer->getRotation(); + switch (rot) { + case 0: + break; + case 1: + temp = *y; + *y = renderer->height() - *x; + *x = temp; + break; + case 2: + *x = renderer->width() - *x; + *y = renderer->height() - *y; + break; + case 3: + temp = *y; + *y = *x; + *x = renderer->width() - temp; + break; + } + } +} + +// check digitizer hit +void ili9342_CheckTouch() { +ili9342_ctouch_counter++; + if (2 == ili9342_ctouch_counter) { + // every 100 ms should be enough + ili9342_ctouch_counter = 0; + Touch_Check(ili9342_RotConvert); + } +} +#endif // USE_TOUCH_BUTTONS +#endif // USE_FT5206 +#endif // ESP32 + + +#ifdef USE_DISPLAY_MODES1TO5 + #define TFT_TOP 16 #define TFT_BOTTOM 16 #define TFT_FONT_WIDTH 6 #define TFT_FONT_HEIGTH 8 // Adafruit minimal font heigth pixels -#include -#include -#include // TFT 320x240 and 480x320 - -Adafruit_ILI9341 *tft; - uint16_t tft_top = TFT_TOP; uint16_t tft_bottom = TFT_BOTTOM; uint16_t tft_scroll = TFT_TOP; uint16_t tft_cols = 0; bool tft_init_done = false; -/*********************************************************************************************/ - bool Ili9341Header(void) { if (Settings.display_cols[0] != tft_cols) { tft_cols = Settings.display_cols[0]; @@ -53,107 +205,11 @@ bool Ili9341Header(void) { tft_bottom = 0; } tft_scroll = tft_top; - tft->setScrollMargins(tft_top, tft_bottom); + renderer->setScrollMargins(tft_top, tft_bottom); } return (tft_cols > 17); } -void Ili9341InitMode(void) { - tft->setRotation(Settings.display_rotate); // 0 - tft->invertDisplay(0); - tft->fillScreen(ILI9341_BLACK); - tft->setTextWrap(false); // Allow text to run off edges - tft->cp437(true); - if (!Settings.display_mode) { - tft->setCursor(0, 0); - tft->setTextColor(ILI9341_WHITE, ILI9341_BLACK); - tft->setTextSize(1); - } else { - Ili9341Header(); - tft->setCursor(0, 0); - tft->setTextColor(ILI9341_YELLOW, ILI9341_BLACK); - tft->setTextSize(2); -// tft->println("HEADER"); - - } -} - -void Ili9341Init(uint8_t mode) { - switch(mode) { - case DISPLAY_INIT_MODE: - Ili9341InitMode(); -#ifdef USE_DISPLAY_MODES1TO5 - if (Settings.display_rotate) { - DisplayClearScreenBuffer(); - } -#endif // USE_DISPLAY_MODES1TO5 - break; - case DISPLAY_INIT_PARTIAL: - case DISPLAY_INIT_FULL: - break; - } -} - -void Ili9341InitDriver(void) { - if (PinUsed(GPIO_ILI9341_CS) && PinUsed(GPIO_ILI9341_DC) && TasmotaGlobal.spi_enabled) { - - Settings.display_model = XDSP_04; - - if (Settings.display_width != ILI9341_TFTWIDTH) { - Settings.display_width = ILI9341_TFTWIDTH; - } - if (Settings.display_height != ILI9341_TFTHEIGHT) { - Settings.display_height = ILI9341_TFTHEIGHT; - } - - tft = new Adafruit_ILI9341(Pin(GPIO_ILI9341_CS), Pin(GPIO_ILI9341_DC)); - tft->begin(); - -#ifdef USE_DISPLAY_MODES1TO5 - if (Settings.display_rotate) { - DisplayAllocScreenBuffer(); - } -#endif // USE_DISPLAY_MODES1TO5 - - Ili9341InitMode(); - - tft_init_done = true; - AddLog(LOG_LEVEL_INFO, PSTR("DSP: ILI9341")); - } -} - -void Ili9341Clear(void) { - tft->fillScreen(ILI9341_BLACK); - tft->setCursor(0, 0); -} - -void Ili9341DrawStringAt(uint16_t x, uint16_t y, char *str, uint16_t color, uint8_t flag) { - uint16_t active_color = ILI9341_WHITE; - - tft->setTextSize(Settings.display_size); - if (!flag) { - tft->setCursor(x, y); - } else { - tft->setCursor((x-1) * TFT_FONT_WIDTH * Settings.display_size, (y-1) * TFT_FONT_HEIGTH * Settings.display_size); - } - if (color) { active_color = color; } - tft->setTextColor(active_color, ILI9341_BLACK); - tft->println(str); -} - -void Ili9341DisplayOnOff() { -// tft->showDisplay(disp_power); -// tft->invertDisplay(disp_power); - if (PinUsed(GPIO_BACKLIGHT)) { - pinMode(Pin(GPIO_BACKLIGHT), OUTPUT); - digitalWrite(Pin(GPIO_BACKLIGHT), disp_power); - } -} - -/*********************************************************************************************/ - -#ifdef USE_DISPLAY_MODES1TO5 - void Ili9341PrintLog(void) { disp_refresh--; if (!disp_refresh) { @@ -167,40 +223,40 @@ void Ili9341PrintLog(void) { uint8_t size = Settings.display_size; uint16_t theight = size * TFT_FONT_HEIGTH; - tft->setTextSize(size); - tft->setTextColor(ILI9341_CYAN, ILI9341_BLACK); // Add background color to solve flicker + renderer->setTextSize(size); + renderer->setTextColor(ILI9341_CYAN, ILI9341_BLACK); // Add background color to solve flicker if (!Settings.display_rotate) { // Use hardware scroll - tft->setCursor(0, tft_scroll); - tft->fillRect(0, tft_scroll, tft->width(), theight, ILI9341_BLACK); // Erase line - tft->print(txt); + renderer->setCursor(0, tft_scroll); + renderer->fillRect(0, tft_scroll, renderer->width(), theight, ILI9341_BLACK); // Erase line + renderer->print(txt); tft_scroll += theight; - if (tft_scroll >= (tft->height() - tft_bottom)) { + if (tft_scroll >= (renderer->height() - tft_bottom)) { tft_scroll = tft_top; } - tft->scrollTo(tft_scroll); + renderer->scrollTo(tft_scroll); } else { uint8_t last_row = Settings.display_rows -1; tft_scroll = (tft_top) ? theight : 0; // Start below header - tft->setCursor(0, tft_scroll); + renderer->setCursor(0, tft_scroll); for (uint32_t i = 0; i < last_row; i++) { strlcpy(disp_screen_buffer[i], disp_screen_buffer[i +1], disp_screen_buffer_cols); // tft->fillRect(0, tft_scroll, tft->width(), theight, ILI9341_BLACK); // Erase line - tft->print(disp_screen_buffer[i]); + renderer->print(disp_screen_buffer[i]); tft_scroll += theight; - tft->setCursor(0, tft_scroll); + renderer->setCursor(0, tft_scroll); delay(1); // Fix background runs heap usage due to long runtime of this loop (up to 1 second) } strlcpy(disp_screen_buffer[last_row], txt, disp_screen_buffer_cols); DisplayFillScreen(last_row); - tft->print(disp_screen_buffer[last_row]); + renderer->print(disp_screen_buffer[last_row]); } AddLog(LOG_LEVEL_DEBUG, PSTR(D_LOG_APPLICATION "[%s]"), txt); } } } -void Ili9341Refresh(void) { // Every second +void ILI9341_Refresh(void) { // Every second if (Settings.display_mode) { // Mode 0 is User text // 24-04-2017 13:45:43 = 19 + 1 ('\0') = 20 // 24-04-2017 13:45 = 16 + 1 ('\0') = 17 @@ -212,9 +268,9 @@ void Ili9341Refresh(void) { // Every second char spaces[Settings.display_cols[0] - (8 + time_size)]; char time[time_size]; // 13:45:43 - tft->setTextSize(Settings.display_size); - tft->setTextColor(ILI9341_YELLOW, ILI9341_RED); // Add background color to solve flicker - tft->setCursor(0, 0); + renderer->setTextSize(Settings.display_size); + renderer->setTextColor(ILI9341_YELLOW, ILI9341_RED); // Add background color to solve flicker + renderer->setCursor(0, 0); snprintf_P(date4, sizeof(date4), PSTR("%02d" D_MONTH_DAY_SEPARATOR "%02d" D_YEAR_MONTH_SEPARATOR "%04d"), RtcTime.day_of_month, RtcTime.month, RtcTime.year); memset(spaces, 0x20, sizeof(spaces)); @@ -222,9 +278,9 @@ void Ili9341Refresh(void) { // Every second snprintf_P(time, sizeof(time), PSTR("%02d" D_HOUR_MINUTE_SEPARATOR "%02d" D_MINUTE_SECOND_SEPARATOR "%02d"), RtcTime.hour, RtcTime.minute, RtcTime.second); snprintf_P(tftdt, sizeof(tftdt), PSTR("%s%s%s"), date4, spaces, time); - tft->print(tftdt); + renderer->print(tftdt); } else { - tft->setCursor(0, 0); + renderer->setCursor(0, 0); } switch (Settings.display_mode) { @@ -238,77 +294,44 @@ void Ili9341Refresh(void) { // Every second } } } - #endif // USE_DISPLAY_MODES1TO5 +/*********************************************************************************************/ /*********************************************************************************************\ * Interface \*********************************************************************************************/ - -bool Xdsp04(uint8_t function) { +bool Xdsp04(uint8_t function) +{ bool result = false; if (FUNC_DISPLAY_INIT_DRIVER == function) { - Ili9341InitDriver(); + ILI9341_InitDriver(); } - else if (tft_init_done && (XDSP_04 == Settings.display_model)) { - - if (!dsp_color) { dsp_color = ILI9341_WHITE; } - - switch (function) { - case FUNC_DISPLAY_MODEL: - result = true; - break; - case FUNC_DISPLAY_INIT: - Ili9341Init(dsp_init); - break; - case FUNC_DISPLAY_POWER: - Ili9341DisplayOnOff(); - break; - case FUNC_DISPLAY_CLEAR: - Ili9341Clear(); - break; - case FUNC_DISPLAY_DRAW_HLINE: - tft->writeFastHLine(dsp_x, dsp_y, dsp_len, dsp_color); - break; - case FUNC_DISPLAY_DRAW_VLINE: - tft->writeFastVLine(dsp_x, dsp_y, dsp_len, dsp_color); - break; - case FUNC_DISPLAY_DRAW_LINE: - tft->writeLine(dsp_x, dsp_y, dsp_x2, dsp_y2, dsp_color); - break; - case FUNC_DISPLAY_DRAW_CIRCLE: - tft->drawCircle(dsp_x, dsp_y, dsp_rad, dsp_color); - break; - case FUNC_DISPLAY_FILL_CIRCLE: - tft->fillCircle(dsp_x, dsp_y, dsp_rad, dsp_color); - break; - case FUNC_DISPLAY_DRAW_RECTANGLE: - tft->drawRect(dsp_x, dsp_y, dsp_x2, dsp_y2, dsp_color); - break; - case FUNC_DISPLAY_FILL_RECTANGLE: - tft->fillRect(dsp_x, dsp_y, dsp_x2, dsp_y2, dsp_color); - break; -// case FUNC_DISPLAY_DRAW_FRAME: -// oled->display(); -// break; - case FUNC_DISPLAY_TEXT_SIZE: - tft->setTextSize(Settings.display_size); - break; - case FUNC_DISPLAY_FONT_SIZE: -// tft->setTextSize(Settings.display_font); - break; - case FUNC_DISPLAY_DRAW_STRING: - Ili9341DrawStringAt(dsp_x, dsp_y, dsp_str, dsp_color, dsp_flag); - break; - case FUNC_DISPLAY_ROTATION: - tft->setRotation(Settings.display_rotate); - break; + else if (XDSP_04 == Settings.display_model) { + switch (function) { + case FUNC_DISPLAY_MODEL: + result = true; + break; + case FUNC_DISPLAY_TEXT_SIZE: + case FUNC_DISPLAY_FONT_SIZE: + case DISPLAY_INIT_MODE: + renderer->clearDisplay(); + break; +#ifdef USE_FT5206 +#ifdef USE_TOUCH_BUTTONS + case FUNC_DISPLAY_EVERY_50_MSECOND: + if (FT5206_found) { + ili9342_CheckTouch(); + } + break; +#endif // USE_TOUCH_BUTTONS +#endif // USE_FT5206 #ifdef USE_DISPLAY_MODES1TO5 - case FUNC_DISPLAY_EVERY_SECOND: - Ili9341Refresh(); - break; + case FUNC_DISPLAY_EVERY_SECOND: + ILI9341_Refresh(); + break; #endif // USE_DISPLAY_MODES1TO5 + } } return result; diff --git a/tasmota/xdsp_13_ILI9341-2.ino b/tasmota/xdsp_13_ILI9341-2.ino deleted file mode 100644 index 785dfc51f..000000000 --- a/tasmota/xdsp_13_ILI9341-2.ino +++ /dev/null @@ -1,290 +0,0 @@ -/* - xdsp_13_ILI9341-TTGO-TS.ino - Display ILI9341 support for Tasmota - - Copyright (C) 2021 Gerhard Mutz and Theo Arends - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -//#ifdef USE_SPI -#ifdef USE_SPI -#ifdef USE_DISPLAY -#if (defined(USE_DISPLAY_ILI9341_2) || defined(USE_DISPLAY_ILI9342)) - -#define XDSP_13 13 - -#undef COLORED -#define COLORED 1 -#undef UNCOLORED -#define UNCOLORED 0 - - -// using font 8 is opional (num=3) -// very badly readable, but may be useful for graphs -#undef USE_TINY_FONT -#define USE_TINY_FONT - - -#include - -extern uint8_t *buffer; -extern uint8_t color_type; -ILI9341_2 *ili9341_2; - -#ifdef USE_FT5206 -#include -#undef FT6336_address -#define FT6336_address 0x38 -uint8_t ili9342_ctouch_counter = 0; -#endif // USE_FT5206 - - -/*********************************************************************************************/ - -void ILI9341_2_InitDriver() -{ - if (!Settings.display_model) { - Settings.display_model = XDSP_13; - } - - - if (XDSP_13 == Settings.display_model) { - - if (Settings.display_width != ILI9341_2_TFTWIDTH) { - Settings.display_width = ILI9341_2_TFTWIDTH; - } - if (Settings.display_height != ILI9341_2_TFTHEIGHT) { - Settings.display_height = ILI9341_2_TFTHEIGHT; - } - - // disable screen buffer - buffer=NULL; - - // default colors - fg_color = ILI9341_2_WHITE; - bg_color = ILI9341_2_BLACK; - -#ifdef USE_M5STACK_CORE2 - ili9341_2 = new ILI9341_2(5, -2, 15, -2); -#else - // init renderer, may use hardware spi, however we use SSPI defintion because SD card uses SPI definition (2 spi busses) - if (PinUsed(GPIO_SSPI_CS) && PinUsed(GPIO_OLED_RESET) && PinUsed(GPIO_BACKLIGHT) && PinUsed(GPIO_SSPI_MOSI) && PinUsed(GPIO_SSPI_MISO) && PinUsed(GPIO_SSPI_SCLK) && PinUsed(GPIO_SSPI_DC)) { - ili9341_2 = new ILI9341_2(Pin(GPIO_SSPI_CS), Pin(GPIO_SSPI_MOSI), Pin(GPIO_SSPI_MISO), Pin(GPIO_SSPI_SCLK), Pin(GPIO_OLED_RESET), Pin(GPIO_SSPI_DC), Pin(GPIO_BACKLIGHT)); - } else { - return; - } -#endif - - ili9341_2->init(Settings.display_width,Settings.display_height); - renderer = ili9341_2; - renderer->DisplayInit(DISPLAY_INIT_MODE,Settings.display_size,Settings.display_rotate,Settings.display_font); - renderer->dim(Settings.display_dimmer); - -#ifdef SHOW_SPLASH - // Welcome text - renderer->setTextFont(2); - renderer->setTextColor(ILI9341_2_WHITE, ILI9341_2_BLACK); - renderer->DrawStringAt(30, (Settings.display_height/2)-12, "ILI9341 TFT!", ILI9341_2_WHITE, 0); - delay(1000); -#endif - - color_type = COLOR_COLOR; - -#ifdef ESP32 -#ifdef USE_FT5206 - // start digitizer with fixed adress and pins for esp32 - #define SDA_2 21 - #define SCL_2 22 - Wire1.begin(SDA_2, SCL_2, 400000); - Touch_Init(Wire1); -#endif // USE_FT5206 -#endif // ESP32 - - - } -} - -void core2_disp_pwr(uint8_t on); -void core2_disp_dim(uint8_t dim); - -void ili9342_bpwr(uint8_t on) { -#ifdef USE_M5STACK_CORE2 - core2_disp_pwr(on); -#endif -} - -void ili9342_dimm(uint8_t dim) { -#ifdef USE_M5STACK_CORE2 - core2_disp_dim(dim); -#endif -} - -#ifdef ESP32 -#ifdef USE_FT5206 -#ifdef USE_TOUCH_BUTTONS - -void ili9342_RotConvert(int16_t *x, int16_t *y) { - -int16_t temp; - if (renderer) { - uint8_t rot=renderer->getRotation(); - switch (rot) { - case 0: - break; - case 1: - temp=*y; - *y=renderer->height()-*x; - *x=temp; - break; - case 2: - *x=renderer->width()-*x; - *y=renderer->height()-*y; - break; - case 3: - temp=*y; - *y=*x; - *x=renderer->width()-temp; - break; - } - } -} - -// check digitizer hit -void ili9342_CheckTouch() { -ili9342_ctouch_counter++; - if (2 == ili9342_ctouch_counter) { - // every 100 ms should be enough - ili9342_ctouch_counter = 0; - Touch_Check(ili9342_RotConvert); - } -} -#endif // USE_TOUCH_BUTTONS -#endif // USE_FT5206 -#endif // ESP32 - - -#ifdef USE_DISPLAY_MODES1TO5 - -void ILI9341_2_PrintLog(bool withDateTime) { - disp_refresh--; - if (!disp_refresh) { - disp_refresh = Settings.display_refresh; - if (!disp_screen_buffer_cols) { DisplayAllocScreenBuffer(); } - - char* txt = DisplayLogBuffer('\370'); - if (txt != NULL) { - uint8_t last_row = Settings.display_rows -1; - - renderer->clearDisplay(); /** TODO: Would be smoother without clear, like ILI9341_2_Time() does. **/ - renderer->setCursor(0,0); - - if (withDateTime) { - char line[21]; - snprintf_P(line, sizeof(line), PSTR("%02d" D_HOUR_MINUTE_SEPARATOR "%02d" D_MINUTE_SECOND_SEPARATOR "%02d %02d" D_MONTH_DAY_SEPARATOR "%02d" D_YEAR_MONTH_SEPARATOR "%04d"), RtcTime.hour, RtcTime.minute, RtcTime.second, RtcTime.day_of_month, RtcTime.month, RtcTime.year); // [12:34:56 31-12-2021] - renderer->setTextColor(ILI9341_2_BLUE); - renderer->println(line); - renderer->setTextColor(fg_color); - last_row--; - } - - for (byte i = 0; i < last_row; i++) { - strlcpy(disp_screen_buffer[i], disp_screen_buffer[i +1], disp_screen_buffer_cols); - renderer->println(disp_screen_buffer[i]); - } - strlcpy(disp_screen_buffer[last_row], txt, disp_screen_buffer_cols); - DisplayFillScreen(last_row); - - AddLog(LOG_LEVEL_DEBUG, PSTR(D_LOG_DEBUG "[%s]"), disp_screen_buffer[last_row]); - - renderer->println(disp_screen_buffer[last_row]); - renderer->Updateframe(); - } - } -} - -void ILI9341_2_Time(void) { - char line[12]; - /** TODO: DisplaySize is working, but renderer->println() does not respect DisplayFont **/ - snprintf_P(line, sizeof(line), PSTR(" %02d" D_HOUR_MINUTE_SEPARATOR "%02d" D_MINUTE_SECOND_SEPARATOR "%02d"), RtcTime.hour, RtcTime.minute, RtcTime.second); // [ 12:34:56 ] - renderer->setCursor(60, 140); - renderer->println(line); - snprintf_P(line, sizeof(line), PSTR("%02d" D_MONTH_DAY_SEPARATOR "%02d" D_YEAR_MONTH_SEPARATOR "%04d"), RtcTime.day_of_month, RtcTime.month, RtcTime.year); // [01-02-2018] - renderer->setCursor(60, 160); - renderer->println(line); - renderer->Updateframe(); -} - -void ILI9341_2_Refresh(void) { // Every second - if (Settings.display_mode) { // Mode 0 is User text - switch (Settings.display_mode) { - case 1: // Time - ILI9341_2_Time(); - break; - case 2: // Local - case 4: // Mqtt - ILI9341_2_PrintLog(false); - break; - case 3: // Local + Time - case 5: // Mqtt + Time - ILI9341_2_PrintLog(true); - break; - } - } -} - -#endif // USE_DISPLAY_MODES1TO5 - -/*********************************************************************************************/ -/*********************************************************************************************\ - * Interface -\*********************************************************************************************/ -bool Xdsp13(uint8_t function) -{ - bool result = false; - - if (FUNC_DISPLAY_INIT_DRIVER == function) { - ILI9341_2_InitDriver(); - } - else if (XDSP_13 == Settings.display_model) { - switch (function) { - case FUNC_DISPLAY_MODEL: - result = true; - break; - case FUNC_DISPLAY_TEXT_SIZE: - case FUNC_DISPLAY_FONT_SIZE: - case DISPLAY_INIT_MODE: - renderer->clearDisplay(); - break; -#ifdef USE_FT5206 -#ifdef USE_TOUCH_BUTTONS - case FUNC_DISPLAY_EVERY_50_MSECOND: - if (FT5206_found) { - ili9342_CheckTouch(); - } - break; -#endif // USE_TOUCH_BUTTONS -#endif // USE_FT5206 -#ifdef USE_DISPLAY_MODES1TO5 - case FUNC_DISPLAY_EVERY_SECOND: - ILI9341_2_Refresh(); - break; -#endif // USE_DISPLAY_MODES1TO5 - } - } - return result; -} - -#endif // USE_DISPLAY_ILI9341_2 -#endif // USE_DISPLAY -#endif // USE_SPI From c5df7ed1ae8905ebed49231f8da4ee05a8fc978a Mon Sep 17 00:00:00 2001 From: gemu2015 Date: Sat, 13 Feb 2021 07:52:21 +0100 Subject: [PATCH 24/99] Update support_tasmota.ino --- tasmota/support_tasmota.ino | 33 ++++++++++++++++++++++----------- 1 file changed, 22 insertions(+), 11 deletions(-) diff --git a/tasmota/support_tasmota.ino b/tasmota/support_tasmota.ino index fe4cf34d8..7318b9076 100644 --- a/tasmota/support_tasmota.ino +++ b/tasmota/support_tasmota.ino @@ -1019,23 +1019,23 @@ void Every250mSeconds(void) if (TasmotaGlobal.ota_state_flag && BACKLOG_EMPTY) { TasmotaGlobal.ota_state_flag--; if (2 == TasmotaGlobal.ota_state_flag) { - RtcSettings.ota_loader = 0; // Try requested image first + RtcSettings.ota_loader = 0; // Try requested image first ota_retry_counter = OTA_ATTEMPTS; ESPhttpUpdate.rebootOnUpdate(false); - SettingsSave(1); // Free flash for OTA update + SettingsSave(1); // Free flash for OTA update } if (TasmotaGlobal.ota_state_flag <= 0) { #ifdef USE_BLE_ESP32 ExtStopBLE(); #endif // USE_BLE_ESP32 #ifdef USE_COUNTER - CounterInterruptDisable(true); // Prevent OTA failures on 100Hz counter interrupts + CounterInterruptDisable(true); // Prevent OTA failures on 100Hz counter interrupts #endif // USE_COUNTER #ifdef USE_WEBSERVER if (Settings.webserver) StopWebserver(); #endif // USE_WEBSERVER #ifdef USE_ARILUX_RF - AriluxRfDisable(); // Prevent restart exception on Arilux Interrupt routine + AriluxRfDisable(); // Prevent restart exception on Arilux Interrupt routine #endif // USE_ARILUX_RF TasmotaGlobal.ota_state_flag = 92; ota_result = 0; @@ -1043,6 +1043,7 @@ void Every250mSeconds(void) if (ota_retry_counter) { char ota_url[TOPSZ]; strlcpy(TasmotaGlobal.mqtt_data, GetOtaUrl(ota_url, sizeof(ota_url)), sizeof(TasmotaGlobal.mqtt_data)); +#ifdef ESP8266 #ifndef FIRMWARE_MINIMAL if (RtcSettings.ota_loader) { // OTA File too large so try OTA minimal version @@ -1061,8 +1062,8 @@ void Every250mSeconds(void) // Replace http://192.168.2.17:80/api/arduino/tasmota.bin with http://192.168.2.17:80/api/arduino/tasmota-minimal.bin // Replace http://192.168.2.17/api/arduino/tasmota.bin.gz with http://192.168.2.17/api/arduino/tasmota-minimal.bin.gz - char *bch = strrchr(TasmotaGlobal.mqtt_data, '/'); // Only consider filename after last backslash prevent change of urls having "-" in it - if (bch == nullptr) { bch = TasmotaGlobal.mqtt_data; } // No path found so use filename only + char *bch = strrchr(TasmotaGlobal.mqtt_data, '/'); // Only consider filename after last backslash prevent change of urls having "-" in it + if (bch == nullptr) { bch = TasmotaGlobal.mqtt_data; } // No path found so use filename only char *ech = strchr(bch, '.'); // Find file type in filename (none, .ino.bin, .ino.bin.gz, .bin, .bin.gz or .gz) if (ech == nullptr) { ech = TasmotaGlobal.mqtt_data + strlen(TasmotaGlobal.mqtt_data); } // Point to '/0' at end of mqtt_data becoming an empty string @@ -1077,6 +1078,14 @@ void Every250mSeconds(void) snprintf_P(TasmotaGlobal.mqtt_data, sizeof(TasmotaGlobal.mqtt_data), PSTR("%s-" D_JSON_MINIMAL "%s"), TasmotaGlobal.mqtt_data, ota_url_type); // Minimal filename must be filename-minimal } #endif // FIRMWARE_MINIMAL + if (ota_retry_counter < OTA_ATTEMPTS / 2) { + if (!strcasecmp_P(TasmotaGlobal.mqtt_data, PSTR(".gz"))) { + ota_retry_counter = 1; + } else { + strcat_P(TasmotaGlobal.mqtt_data, PSTR(".gz")); + } + } +#endif // ESP8266 AddLog(LOG_LEVEL_DEBUG, PSTR(D_LOG_UPLOAD "%s"), TasmotaGlobal.mqtt_data); WiFiClient OTAclient; ota_result = (HTTP_UPDATE_FAILED != ESPhttpUpdate.update(OTAclient, TasmotaGlobal.mqtt_data)); @@ -1084,26 +1093,28 @@ void Every250mSeconds(void) #ifndef FIRMWARE_MINIMAL int ota_error = ESPhttpUpdate.getLastError(); DEBUG_CORE_LOG(PSTR("OTA: Error %d"), ota_error); +#ifdef ESP8266 if ((HTTP_UE_TOO_LESS_SPACE == ota_error) || (HTTP_UE_BIN_FOR_WRONG_FLASH == ota_error)) { - RtcSettings.ota_loader = 1; // Try minimal image next + RtcSettings.ota_loader = 1; // Try minimal image next } +#endif // ESP8266 #endif // FIRMWARE_MINIMAL - TasmotaGlobal.ota_state_flag = 2; // Upgrade failed - retry + TasmotaGlobal.ota_state_flag = 2; // Upgrade failed - retry } } } - if (90 == TasmotaGlobal.ota_state_flag) { // Allow MQTT to reconnect + if (90 == TasmotaGlobal.ota_state_flag) { // Allow MQTT to reconnect TasmotaGlobal.ota_state_flag = 0; Response_P(PSTR("{\"" D_CMND_UPGRADE "\":\"")); if (ota_result) { -// SetFlashModeDout(); // Force DOUT for both ESP8266 and ESP8285 +// SetFlashModeDout(); // Force DOUT for both ESP8266 and ESP8285 ResponseAppend_P(PSTR(D_JSON_SUCCESSFUL ". " D_JSON_RESTARTING)); TasmotaGlobal.restart_flag = 2; } else { ResponseAppend_P(PSTR(D_JSON_FAILED " %s"), ESPhttpUpdate.getLastErrorString().c_str()); } ResponseAppend_P(PSTR("\"}")); -// TasmotaGlobal.restart_flag = 2; // Restart anyway to keep memory clean webserver +// TasmotaGlobal.restart_flag = 2; // Restart anyway to keep memory clean webserver MqttPublishPrefixTopic_P(STAT, PSTR(D_CMND_UPGRADE)); #ifdef USE_COUNTER CounterInterruptDisable(false); From 2220b2d3e339e6784abd205f50936e2d59926ad2 Mon Sep 17 00:00:00 2001 From: Stephan Hadinger Date: Sat, 13 Feb 2021 12:01:45 +0100 Subject: [PATCH 25/99] Berry language improved Tasmota integration --- CHANGELOG.md | 1 + .../Berry-0.1.10/generate/be_const_strtab.h | 239 +++++----- .../generate/be_const_strtab_def.h | 340 +++++++------- .../generate/be_fixed_be_class_map.h | 21 +- .../Berry-0.1.10/generate/be_fixed_string.h | 16 +- lib/lib_div/Berry-0.1.10/src/be_gc.h | 8 +- lib/lib_div/Berry-0.1.10/src/be_lexer.c | 3 +- lib/lib_div/Berry-0.1.10/src/be_maplib.c | 33 ++ lib/lib_div/Berry-0.1.10/src/be_object.h | 31 ++ lib/lib_div/Berry-0.1.10/src/be_parser.c | 2 +- lib/lib_div/Berry-0.1.10/src/be_string.c | 19 +- lib/lib_div/Berry-0.1.10/src/be_string.h | 2 +- lib/lib_div/Berry-0.1.10/src/be_strlib.c | 41 +- lib/lib_div/Berry-0.1.10/src/be_vector.c | 8 +- lib/lib_div/Berry-0.1.10/src/port/be_modtab.c | 5 + lib/lib_div/Berry-0.1.10/src/port/be_port.cpp | 63 ++- .../Berry-0.1.10/src/port/be_tasmotalib.c | 34 ++ .../Berry-0.1.10/src/port/berry_conf.h | 14 +- tasmota/berry/tasmota.be | 157 +++++++ tasmota/support_command.ino | 78 +++- tasmota/tasmota.h | 4 +- tasmota/xdrv_52_berry.ino | 416 +++++++++++++++--- tasmota/xdrv_interface.ino | 7 + 23 files changed, 1081 insertions(+), 461 deletions(-) create mode 100644 lib/lib_div/Berry-0.1.10/src/port/be_tasmotalib.c create mode 100644 tasmota/berry/tasmota.be diff --git a/CHANGELOG.md b/CHANGELOG.md index 671dbbc94..196566592 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ All notable changes to this project will be documented in this file. - Support for Eastron SDM72D-M three phase 100A Modbus energy meter (#10862) - Support for Frysk language translations by Christiaan Heerze - ESP8266 Fallback to ``*.bin.gz`` binary when OTA upload of ``*.bin`` binary fails +- Berry language improved Tasmota integration ## [9.2.0.6] 20210210 ### Changed diff --git a/lib/lib_div/Berry-0.1.10/generate/be_const_strtab.h b/lib/lib_div/Berry-0.1.10/generate/be_const_strtab.h index df695ac4a..9234199bb 100644 --- a/lib/lib_div/Berry-0.1.10/generate/be_const_strtab.h +++ b/lib/lib_div/Berry-0.1.10/generate/be_const_strtab.h @@ -1,125 +1,128 @@ -extern const bcstring be_const_str_count; -extern const bcstring be_const_str_rad; -extern const bcstring be_const_str_str; -extern const bcstring be_const_str_import; -extern const bcstring be_const_str_opt_connect; -extern const bcstring be_const_str_open; -extern const bcstring be_const_str_codedump; -extern const bcstring be_const_str_imax; -extern const bcstring be_const_str_item; -extern const bcstring be_const_str_splitext; -extern const bcstring be_const_str___upper__; -extern const bcstring be_const_str_byte; -extern const bcstring be_const_str_isfile; -extern const bcstring be_const_str_issubclass; -extern const bcstring be_const_str_iter; -extern const bcstring be_const_str_classname; -extern const bcstring be_const_str_cos; -extern const bcstring be_const_str_number; -extern const bcstring be_const_str_true; -extern const bcstring be_const_str_hex; -extern const bcstring be_const_str_range; -extern const bcstring be_const_str_cosh; -extern const bcstring be_const_str_exp; -extern const bcstring be_const_str_exit; -extern const bcstring be_const_str_list; -extern const bcstring be_const_str_path; -extern const bcstring be_const_str_dot_p; -extern const bcstring be_const_str___iterator__; -extern const bcstring be_const_str_dump; -extern const bcstring be_const_str_deinit; -extern const bcstring be_const_str_size; -extern const bcstring be_const_str_false; -extern const bcstring be_const_str_clock; -extern const bcstring be_const_str_floor; -extern const bcstring be_const_str_module; -extern const bcstring be_const_str_tostring; -extern const bcstring be_const_str_type; -extern const bcstring be_const_str_upvname; -extern const bcstring be_const_str_opt_add; -extern const bcstring be_const_str___lower__; -extern const bcstring be_const_str_pi; -extern const bcstring be_const_str_assert; -extern const bcstring be_const_str_ceil; -extern const bcstring be_const_str_setitem; -extern const bcstring be_const_str_except; -extern const bcstring be_const_str_pow; -extern const bcstring be_const_str_sin; -extern const bcstring be_const_str_traceback; extern const bcstring be_const_str_calldepth; -extern const bcstring be_const_str_classof; -extern const bcstring be_const_str_init; -extern const bcstring be_const_str_sinh; -extern const bcstring be_const_str_split; -extern const bcstring be_const_str_raise; -extern const bcstring be_const_str_map; -extern const bcstring be_const_str_srand; -extern const bcstring be_const_str_allocated; -extern const bcstring be_const_str_asin; -extern const bcstring be_const_str_int; -extern const bcstring be_const_str_lower; -extern const bcstring be_const_str_var; -extern const bcstring be_const_str_abs; -extern const bcstring be_const_str_deg; -extern const bcstring be_const_str_setrange; -extern const bcstring be_const_str_time; -extern const bcstring be_const_str_real; -extern const bcstring be_const_str_end; -extern const bcstring be_const_str_isdir; -extern const bcstring be_const_str_; -extern const bcstring be_const_str_getcwd; -extern const bcstring be_const_str_attrdump; -extern const bcstring be_const_str_copy; -extern const bcstring be_const_str_imin; +extern const bcstring be_const_str_clock; +extern const bcstring be_const_str_size; extern const bcstring be_const_str_system; -extern const bcstring be_const_str_top; -extern const bcstring be_const_str_nil; -extern const bcstring be_const_str_push; -extern const bcstring be_const_str_remove; -extern const bcstring be_const_str_compile; -extern const bcstring be_const_str_atan; -extern const bcstring be_const_str_class; -extern const bcstring be_const_str_insert; -extern const bcstring be_const_str_pop; -extern const bcstring be_const_str_tanh; -extern const bcstring be_const_str_chdir; -extern const bcstring be_const_str_load; -extern const bcstring be_const_str_log; -extern const bcstring be_const_str_varname; -extern const bcstring be_const_str_find; -extern const bcstring be_const_str_isinstance; +extern const bcstring be_const_str_type; extern const bcstring be_const_str_if; -extern const bcstring be_const_str_super; -extern const bcstring be_const_str_break; -extern const bcstring be_const_str_do; -extern const bcstring be_const_str_else; -extern const bcstring be_const_str_for; +extern const bcstring be_const_str_int; +extern const bcstring be_const_str_isfile; +extern const bcstring be_const_str_log; +extern const bcstring be_const_str_raise; extern const bcstring be_const_str_concat; -extern const bcstring be_const_str_resize; -extern const bcstring be_const_str_reverse; -extern const bcstring be_const_str_while; -extern const bcstring be_const_str_input; -extern const bcstring be_const_str_sqrt; -extern const bcstring be_const_str_elif; -extern const bcstring be_const_str_log10; -extern const bcstring be_const_str_print; -extern const bcstring be_const_str_continue; -extern const bcstring be_const_str_collect; -extern const bcstring be_const_str_clear; -extern const bcstring be_const_str_rand; -extern const bcstring be_const_str_opt_neq; -extern const bcstring be_const_str_opt_eq; -extern const bcstring be_const_str_acos; -extern const bcstring be_const_str_listdir; +extern const bcstring be_const_str_list; +extern const bcstring be_const_str_map; +extern const bcstring be_const_str_for; +extern const bcstring be_const_str_dot_p; +extern const bcstring be_const_str_isdir; extern const bcstring be_const_str_mkdir; -extern const bcstring be_const_str_sethook; -extern const bcstring be_const_str_tan; -extern const bcstring be_const_str_def; -extern const bcstring be_const_str_char; -extern const bcstring be_const_str_exists; -extern const bcstring be_const_str_join; -extern const bcstring be_const_str_as; +extern const bcstring be_const_str_remove; +extern const bcstring be_const_str_cosh; +extern const bcstring be_const_str_abs; +extern const bcstring be_const_str_reverse; +extern const bcstring be_const_str_sinh; +extern const bcstring be_const_str_hex; +extern const bcstring be_const_str_tostring; +extern const bcstring be_const_str_opt_add; +extern const bcstring be_const_str_atan; +extern const bcstring be_const_str_real; +extern const bcstring be_const_str_iter; +extern const bcstring be_const_str_top; +extern const bcstring be_const_str_except; +extern const bcstring be_const_str_getcwd; +extern const bcstring be_const_str_listdir; +extern const bcstring be_const_str_log10; +extern const bcstring be_const_str_allocated; +extern const bcstring be_const_str_init; +extern const bcstring be_const_str_module; +extern const bcstring be_const_str_ceil; +extern const bcstring be_const_str_clear; +extern const bcstring be_const_str_collect; +extern const bcstring be_const_str_find; +extern const bcstring be_const_str_item; extern const bcstring be_const_str_format; -extern const bcstring be_const_str_try; -extern const bcstring be_const_str_upper; +extern const bcstring be_const_str_sqrt; +extern const bcstring be_const_str_classname; +extern const bcstring be_const_str_byte; +extern const bcstring be_const_str_else; +extern const bcstring be_const_str_deinit; +extern const bcstring be_const_str_end; +extern const bcstring be_const_str_true; +extern const bcstring be_const_str___upper__; +extern const bcstring be_const_str_char; +extern const bcstring be_const_str_load; +extern const bcstring be_const_str_resize; +extern const bcstring be_const_str_sethook; +extern const bcstring be_const_str_varname; +extern const bcstring be_const_str_deg; +extern const bcstring be_const_str_srand; +extern const bcstring be_const_str_str; +extern const bcstring be_const_str_range; +extern const bcstring be_const_str_toupper; +extern const bcstring be_const_str_; +extern const bcstring be_const_str_copy; +extern const bcstring be_const_str_exp; +extern const bcstring be_const_str_time; +extern const bcstring be_const_str_break; +extern const bcstring be_const_str_opt_neq; +extern const bcstring be_const_str_assert; +extern const bcstring be_const_str_attrdump; +extern const bcstring be_const_str_chdir; +extern const bcstring be_const_str_isinstance; +extern const bcstring be_const_str_continue; +extern const bcstring be_const_str_do; +extern const bcstring be_const_str_lower; +extern const bcstring be_const_str_pow; +extern const bcstring be_const_str_false; +extern const bcstring be_const_str_count; +extern const bcstring be_const_str_exit; +extern const bcstring be_const_str_print; +extern const bcstring be_const_str_def; +extern const bcstring be_const_str_pop; +extern const bcstring be_const_str_tolower; +extern const bcstring be_const_str_classof; +extern const bcstring be_const_str_cos; +extern const bcstring be_const_str_dump; +extern const bcstring be_const_str_join; +extern const bcstring be_const_str_push; +extern const bcstring be_const_str_sin; extern const bcstring be_const_str_return; +extern const bcstring be_const_str_path; +extern const bcstring be_const_str_rand; +extern const bcstring be_const_str_class; +extern const bcstring be_const_str_nil; +extern const bcstring be_const_str_input; +extern const bcstring be_const_str_floor; +extern const bcstring be_const_str_keys; +extern const bcstring be_const_str_number; +extern const bcstring be_const_str_rad; +extern const bcstring be_const_str_imin; +extern const bcstring be_const_str_pi; +extern const bcstring be_const_str_splitext; +extern const bcstring be_const_str_compile; +extern const bcstring be_const_str_setrange; +extern const bcstring be_const_str_traceback; +extern const bcstring be_const_str_upper; +extern const bcstring be_const_str_var; +extern const bcstring be_const_str_opt_eq; +extern const bcstring be_const_str_codedump; +extern const bcstring be_const_str_tan; +extern const bcstring be_const_str_setitem; +extern const bcstring be_const_str_tanh; +extern const bcstring be_const_str_as; +extern const bcstring be_const_str_issubclass; +extern const bcstring be_const_str_upvname; +extern const bcstring be_const_str_opt_connect; +extern const bcstring be_const_str_try; +extern const bcstring be_const_str_while; +extern const bcstring be_const_str_import; +extern const bcstring be_const_str___lower__; +extern const bcstring be_const_str_open; +extern const bcstring be_const_str_acos; +extern const bcstring be_const_str_asin; +extern const bcstring be_const_str_imax; +extern const bcstring be_const_str_insert; +extern const bcstring be_const_str_split; +extern const bcstring be_const_str___iterator__; +extern const bcstring be_const_str_exists; +extern const bcstring be_const_str_super; +extern const bcstring be_const_str_elif; diff --git a/lib/lib_div/Berry-0.1.10/generate/be_const_strtab_def.h b/lib/lib_div/Berry-0.1.10/generate/be_const_strtab_def.h index f3503a6f5..25b5b9221 100644 --- a/lib/lib_div/Berry-0.1.10/generate/be_const_strtab_def.h +++ b/lib/lib_div/Berry-0.1.10/generate/be_const_strtab_def.h @@ -1,186 +1,190 @@ -be_define_const_str(count, "count", 967958004u, 0, 5, &be_const_str_rad); -be_define_const_str(rad, "rad", 1358899048u, 0, 3, &be_const_str_str); -be_define_const_str(str, "str", 3259748752u, 0, 3, &be_const_str_import); -be_define_const_str(import, "import", 288002260u, 66, 6, NULL); -be_define_const_str(opt_connect, "..", 2748622605u, 0, 2, &be_const_str_open); -be_define_const_str(open, "open", 3546203337u, 0, 4, NULL); -be_define_const_str(codedump, "codedump", 1786337906u, 0, 8, &be_const_str_imax); -be_define_const_str(imax, "imax", 3084515410u, 0, 4, &be_const_str_item); -be_define_const_str(item, "item", 2671260646u, 0, 4, &be_const_str_splitext); -be_define_const_str(splitext, "splitext", 2150391934u, 0, 8, NULL); -be_define_const_str(__upper__, "__upper__", 3612202883u, 0, 9, &be_const_str_byte); -be_define_const_str(byte, "byte", 1683620383u, 0, 4, &be_const_str_isfile); -be_define_const_str(isfile, "isfile", 3131505107u, 0, 6, &be_const_str_issubclass); -be_define_const_str(issubclass, "issubclass", 4078395519u, 0, 10, &be_const_str_iter); -be_define_const_str(iter, "iter", 3124256359u, 0, 4, NULL); -be_define_const_str(classname, "classname", 1998589948u, 0, 9, &be_const_str_cos); -be_define_const_str(cos, "cos", 4220379804u, 0, 3, &be_const_str_number); -be_define_const_str(number, "number", 467038368u, 0, 6, NULL); -be_define_const_str(true, "true", 1303515621u, 61, 4, NULL); -be_define_const_str(hex, "hex", 4273249610u, 0, 3, &be_const_str_range); -be_define_const_str(range, "range", 4208725202u, 0, 5, NULL); -be_define_const_str(cosh, "cosh", 4099687964u, 0, 4, &be_const_str_exp); -be_define_const_str(exp, "exp", 1923516200u, 0, 3, NULL); -be_define_const_str(exit, "exit", 3454868101u, 0, 4, &be_const_str_list); -be_define_const_str(list, "list", 217798785u, 0, 4, NULL); -be_define_const_str(path, "path", 2223459638u, 0, 4, NULL); -be_define_const_str(dot_p, ".p", 1171526419u, 0, 2, &be_const_str___iterator__); -be_define_const_str(__iterator__, "__iterator__", 3884039703u, 0, 12, &be_const_str_dump); -be_define_const_str(dump, "dump", 3663001223u, 0, 4, NULL); -be_define_const_str(deinit, "deinit", 2345559592u, 0, 6, &be_const_str_size); -be_define_const_str(size, "size", 597743964u, 0, 4, &be_const_str_false); -be_define_const_str(false, "false", 184981848u, 62, 5, NULL); -be_define_const_str(clock, "clock", 363073373u, 0, 5, &be_const_str_floor); -be_define_const_str(floor, "floor", 3102149661u, 0, 5, &be_const_str_module); -be_define_const_str(module, "module", 3617558685u, 0, 6, &be_const_str_tostring); -be_define_const_str(tostring, "tostring", 2299708645u, 0, 8, &be_const_str_type); -be_define_const_str(type, "type", 1361572173u, 0, 4, &be_const_str_upvname); -be_define_const_str(upvname, "upvname", 3848760617u, 0, 7, NULL); -be_define_const_str(opt_add, "+", 772578730u, 0, 1, &be_const_str___lower__); -be_define_const_str(__lower__, "__lower__", 123855590u, 0, 9, &be_const_str_pi); -be_define_const_str(pi, "pi", 1213090802u, 0, 2, NULL); -be_define_const_str(assert, "assert", 2774883451u, 0, 6, NULL); -be_define_const_str(ceil, "ceil", 1659167240u, 0, 4, &be_const_str_setitem); -be_define_const_str(setitem, "setitem", 1554834596u, 0, 7, &be_const_str_except); -be_define_const_str(except, "except", 950914032u, 69, 6, NULL); -be_define_const_str(pow, "pow", 1479764693u, 0, 3, &be_const_str_sin); -be_define_const_str(sin, "sin", 3761252941u, 0, 3, &be_const_str_traceback); -be_define_const_str(traceback, "traceback", 3385188109u, 0, 9, NULL); -be_define_const_str(calldepth, "calldepth", 3122364302u, 0, 9, &be_const_str_classof); -be_define_const_str(classof, "classof", 1796577762u, 0, 7, NULL); -be_define_const_str(init, "init", 380752755u, 0, 4, &be_const_str_sinh); -be_define_const_str(sinh, "sinh", 282220607u, 0, 4, &be_const_str_split); -be_define_const_str(split, "split", 2276994531u, 0, 5, &be_const_str_raise); -be_define_const_str(raise, "raise", 1593437475u, 70, 5, NULL); -be_define_const_str(map, "map", 3751997361u, 0, 3, &be_const_str_srand); -be_define_const_str(srand, "srand", 465518633u, 0, 5, NULL); -be_define_const_str(allocated, "allocated", 429986098u, 0, 9, &be_const_str_asin); -be_define_const_str(asin, "asin", 4272848550u, 0, 4, &be_const_str_int); -be_define_const_str(int, "int", 2515107422u, 0, 3, &be_const_str_lower); -be_define_const_str(lower, "lower", 3038577850u, 0, 5, &be_const_str_var); -be_define_const_str(var, "var", 2317739966u, 64, 3, NULL); -be_define_const_str(abs, "abs", 709362235u, 0, 3, &be_const_str_deg); -be_define_const_str(deg, "deg", 3327754271u, 0, 3, NULL); -be_define_const_str(setrange, "setrange", 3794019032u, 0, 8, &be_const_str_time); -be_define_const_str(time, "time", 1564253156u, 0, 4, NULL); -be_define_const_str(real, "real", 3604983901u, 0, 4, NULL); -be_define_const_str(end, "end", 1787721130u, 56, 3, NULL); -be_define_const_str(isdir, "isdir", 2340917412u, 0, 5, NULL); -be_define_const_str(, "", 2166136261u, 0, 0, NULL); -be_define_const_str(getcwd, "getcwd", 652026575u, 0, 6, NULL); -be_define_const_str(attrdump, "attrdump", 1521571304u, 0, 8, &be_const_str_copy); -be_define_const_str(copy, "copy", 3848464964u, 0, 4, &be_const_str_imin); -be_define_const_str(imin, "imin", 2714127864u, 0, 4, &be_const_str_system); -be_define_const_str(system, "system", 1226705564u, 0, 6, &be_const_str_top); -be_define_const_str(top, "top", 2802900028u, 0, 3, &be_const_str_nil); -be_define_const_str(nil, "nil", 228849900u, 63, 3, NULL); -be_define_const_str(push, "push", 2272264157u, 0, 4, &be_const_str_remove); -be_define_const_str(remove, "remove", 3683784189u, 0, 6, NULL); -be_define_const_str(compile, "compile", 1000265118u, 0, 7, NULL); -be_define_const_str(atan, "atan", 108579519u, 0, 4, &be_const_str_class); -be_define_const_str(class, "class", 2872970239u, 57, 5, NULL); -be_define_const_str(insert, "insert", 3332609576u, 0, 6, &be_const_str_pop); -be_define_const_str(pop, "pop", 1362321360u, 0, 3, &be_const_str_tanh); -be_define_const_str(tanh, "tanh", 153638352u, 0, 4, NULL); -be_define_const_str(chdir, "chdir", 806634853u, 0, 5, &be_const_str_load); -be_define_const_str(load, "load", 3859241449u, 0, 4, &be_const_str_log); -be_define_const_str(log, "log", 1062293841u, 0, 3, &be_const_str_varname); -be_define_const_str(varname, "varname", 2273276445u, 0, 7, NULL); -be_define_const_str(find, "find", 3186656602u, 0, 4, &be_const_str_isinstance); -be_define_const_str(isinstance, "isinstance", 3669352738u, 0, 10, &be_const_str_if); +be_define_const_str(calldepth, "calldepth", 3122364302u, 0, 9, &be_const_str_clock); +be_define_const_str(clock, "clock", 363073373u, 0, 5, &be_const_str_size); +be_define_const_str(size, "size", 597743964u, 0, 4, &be_const_str_system); +be_define_const_str(system, "system", 1226705564u, 0, 6, &be_const_str_type); +be_define_const_str(type, "type", 1361572173u, 0, 4, &be_const_str_if); be_define_const_str(if, "if", 959999494u, 50, 2, NULL); -be_define_const_str(super, "super", 4152230356u, 0, 5, &be_const_str_break); -be_define_const_str(break, "break", 3378807160u, 58, 5, &be_const_str_do); -be_define_const_str(do, "do", 1646057492u, 65, 2, &be_const_str_else); -be_define_const_str(else, "else", 3183434736u, 52, 4, &be_const_str_for); +be_define_const_str(int, "int", 2515107422u, 0, 3, &be_const_str_isfile); +be_define_const_str(isfile, "isfile", 3131505107u, 0, 6, &be_const_str_log); +be_define_const_str(log, "log", 1062293841u, 0, 3, &be_const_str_raise); +be_define_const_str(raise, "raise", 1593437475u, 70, 5, NULL); +be_define_const_str(concat, "concat", 4124019837u, 0, 6, &be_const_str_list); +be_define_const_str(list, "list", 217798785u, 0, 4, &be_const_str_map); +be_define_const_str(map, "map", 3751997361u, 0, 3, &be_const_str_for); be_define_const_str(for, "for", 2901640080u, 54, 3, NULL); -be_define_const_str(concat, "concat", 4124019837u, 0, 6, &be_const_str_resize); -be_define_const_str(resize, "resize", 3514612129u, 0, 6, &be_const_str_reverse); -be_define_const_str(reverse, "reverse", 558918661u, 0, 7, NULL); -be_define_const_str(while, "while", 231090382u, 53, 5, NULL); -be_define_const_str(input, "input", 4191711099u, 0, 5, &be_const_str_sqrt); -be_define_const_str(sqrt, "sqrt", 2112764879u, 0, 4, &be_const_str_elif); -be_define_const_str(elif, "elif", 3232090307u, 51, 4, NULL); -be_define_const_str(log10, "log10", 2346846000u, 0, 5, &be_const_str_print); -be_define_const_str(print, "print", 372738696u, 0, 5, &be_const_str_continue); -be_define_const_str(continue, "continue", 2977070660u, 59, 8, NULL); -be_define_const_str(collect, "collect", 2399039025u, 0, 7, NULL); -be_define_const_str(clear, "clear", 1550717474u, 0, 5, &be_const_str_rand); -be_define_const_str(rand, "rand", 2711325910u, 0, 4, NULL); -be_define_const_str(opt_neq, "!=", 2428715011u, 0, 2, &be_const_str_opt_eq); -be_define_const_str(opt_eq, "==", 2431966415u, 0, 2, &be_const_str_acos); -be_define_const_str(acos, "acos", 1006755615u, 0, 4, NULL); -be_define_const_str(listdir, "listdir", 2005220720u, 0, 7, &be_const_str_mkdir); -be_define_const_str(mkdir, "mkdir", 2883839448u, 0, 5, &be_const_str_sethook); -be_define_const_str(sethook, "sethook", 3963967276u, 0, 7, &be_const_str_tan); -be_define_const_str(tan, "tan", 2633446552u, 0, 3, &be_const_str_def); +be_define_const_str(dot_p, ".p", 1171526419u, 0, 2, &be_const_str_isdir); +be_define_const_str(isdir, "isdir", 2340917412u, 0, 5, &be_const_str_mkdir); +be_define_const_str(mkdir, "mkdir", 2883839448u, 0, 5, &be_const_str_remove); +be_define_const_str(remove, "remove", 3683784189u, 0, 6, NULL); +be_define_const_str(cosh, "cosh", 4099687964u, 0, 4, NULL); +be_define_const_str(abs, "abs", 709362235u, 0, 3, &be_const_str_reverse); +be_define_const_str(reverse, "reverse", 558918661u, 0, 7, &be_const_str_sinh); +be_define_const_str(sinh, "sinh", 282220607u, 0, 4, NULL); +be_define_const_str(hex, "hex", 4273249610u, 0, 3, NULL); +be_define_const_str(tostring, "tostring", 2299708645u, 0, 8, NULL); +be_define_const_str(opt_add, "+", 772578730u, 0, 1, &be_const_str_atan); +be_define_const_str(atan, "atan", 108579519u, 0, 4, &be_const_str_real); +be_define_const_str(real, "real", 3604983901u, 0, 4, NULL); +be_define_const_str(iter, "iter", 3124256359u, 0, 4, &be_const_str_top); +be_define_const_str(top, "top", 2802900028u, 0, 3, &be_const_str_except); +be_define_const_str(except, "except", 950914032u, 69, 6, NULL); +be_define_const_str(getcwd, "getcwd", 652026575u, 0, 6, &be_const_str_listdir); +be_define_const_str(listdir, "listdir", 2005220720u, 0, 7, &be_const_str_log10); +be_define_const_str(log10, "log10", 2346846000u, 0, 5, NULL); +be_define_const_str(allocated, "allocated", 429986098u, 0, 9, &be_const_str_init); +be_define_const_str(init, "init", 380752755u, 0, 4, &be_const_str_module); +be_define_const_str(module, "module", 3617558685u, 0, 6, NULL); +be_define_const_str(ceil, "ceil", 1659167240u, 0, 4, &be_const_str_clear); +be_define_const_str(clear, "clear", 1550717474u, 0, 5, &be_const_str_collect); +be_define_const_str(collect, "collect", 2399039025u, 0, 7, &be_const_str_find); +be_define_const_str(find, "find", 3186656602u, 0, 4, &be_const_str_item); +be_define_const_str(item, "item", 2671260646u, 0, 4, NULL); +be_define_const_str(format, "format", 3114108242u, 0, 6, &be_const_str_sqrt); +be_define_const_str(sqrt, "sqrt", 2112764879u, 0, 4, NULL); +be_define_const_str(classname, "classname", 1998589948u, 0, 9, NULL); +be_define_const_str(byte, "byte", 1683620383u, 0, 4, NULL); +be_define_const_str(else, "else", 3183434736u, 52, 4, NULL); +be_define_const_str(deinit, "deinit", 2345559592u, 0, 6, &be_const_str_end); +be_define_const_str(end, "end", 1787721130u, 56, 3, &be_const_str_true); +be_define_const_str(true, "true", 1303515621u, 61, 4, NULL); +be_define_const_str(__upper__, "__upper__", 3612202883u, 0, 9, NULL); +be_define_const_str(char, "char", 2823553821u, 0, 4, &be_const_str_load); +be_define_const_str(load, "load", 3859241449u, 0, 4, &be_const_str_resize); +be_define_const_str(resize, "resize", 3514612129u, 0, 6, &be_const_str_sethook); +be_define_const_str(sethook, "sethook", 3963967276u, 0, 7, &be_const_str_varname); +be_define_const_str(varname, "varname", 2273276445u, 0, 7, NULL); +be_define_const_str(deg, "deg", 3327754271u, 0, 3, &be_const_str_srand); +be_define_const_str(srand, "srand", 465518633u, 0, 5, &be_const_str_str); +be_define_const_str(str, "str", 3259748752u, 0, 3, NULL); +be_define_const_str(range, "range", 4208725202u, 0, 5, &be_const_str_toupper); +be_define_const_str(toupper, "toupper", 3691983576u, 0, 7, NULL); +be_define_const_str(, "", 2166136261u, 0, 0, &be_const_str_copy); +be_define_const_str(copy, "copy", 3848464964u, 0, 4, &be_const_str_exp); +be_define_const_str(exp, "exp", 1923516200u, 0, 3, &be_const_str_time); +be_define_const_str(time, "time", 1564253156u, 0, 4, &be_const_str_break); +be_define_const_str(break, "break", 3378807160u, 58, 5, NULL); +be_define_const_str(opt_neq, "!=", 2428715011u, 0, 2, &be_const_str_assert); +be_define_const_str(assert, "assert", 2774883451u, 0, 6, &be_const_str_attrdump); +be_define_const_str(attrdump, "attrdump", 1521571304u, 0, 8, &be_const_str_chdir); +be_define_const_str(chdir, "chdir", 806634853u, 0, 5, &be_const_str_isinstance); +be_define_const_str(isinstance, "isinstance", 3669352738u, 0, 10, &be_const_str_continue); +be_define_const_str(continue, "continue", 2977070660u, 59, 8, &be_const_str_do); +be_define_const_str(do, "do", 1646057492u, 65, 2, NULL); +be_define_const_str(lower, "lower", 3038577850u, 0, 5, &be_const_str_pow); +be_define_const_str(pow, "pow", 1479764693u, 0, 3, &be_const_str_false); +be_define_const_str(false, "false", 184981848u, 62, 5, NULL); +be_define_const_str(count, "count", 967958004u, 0, 5, NULL); +be_define_const_str(exit, "exit", 3454868101u, 0, 4, &be_const_str_print); +be_define_const_str(print, "print", 372738696u, 0, 5, &be_const_str_def); be_define_const_str(def, "def", 3310976652u, 55, 3, NULL); -be_define_const_str(char, "char", 2823553821u, 0, 4, &be_const_str_exists); -be_define_const_str(exists, "exists", 1002329533u, 0, 6, &be_const_str_join); -be_define_const_str(join, "join", 3374496889u, 0, 4, &be_const_str_as); -be_define_const_str(as, "as", 1579491469u, 67, 2, NULL); -be_define_const_str(format, "format", 3114108242u, 0, 6, &be_const_str_try); -be_define_const_str(try, "try", 2887626766u, 68, 3, NULL); -be_define_const_str(upper, "upper", 176974407u, 0, 5, &be_const_str_return); +be_define_const_str(pop, "pop", 1362321360u, 0, 3, &be_const_str_tolower); +be_define_const_str(tolower, "tolower", 1042520049u, 0, 7, NULL); +be_define_const_str(classof, "classof", 1796577762u, 0, 7, &be_const_str_cos); +be_define_const_str(cos, "cos", 4220379804u, 0, 3, &be_const_str_dump); +be_define_const_str(dump, "dump", 3663001223u, 0, 4, &be_const_str_join); +be_define_const_str(join, "join", 3374496889u, 0, 4, &be_const_str_push); +be_define_const_str(push, "push", 2272264157u, 0, 4, &be_const_str_sin); +be_define_const_str(sin, "sin", 3761252941u, 0, 3, &be_const_str_return); be_define_const_str(return, "return", 2246981567u, 60, 6, NULL); +be_define_const_str(path, "path", 2223459638u, 0, 4, &be_const_str_rand); +be_define_const_str(rand, "rand", 2711325910u, 0, 4, &be_const_str_class); +be_define_const_str(class, "class", 2872970239u, 57, 5, &be_const_str_nil); +be_define_const_str(nil, "nil", 228849900u, 63, 3, NULL); +be_define_const_str(input, "input", 4191711099u, 0, 5, NULL); +be_define_const_str(floor, "floor", 3102149661u, 0, 5, &be_const_str_keys); +be_define_const_str(keys, "keys", 4182378701u, 0, 4, &be_const_str_number); +be_define_const_str(number, "number", 467038368u, 0, 6, &be_const_str_rad); +be_define_const_str(rad, "rad", 1358899048u, 0, 3, NULL); +be_define_const_str(imin, "imin", 2714127864u, 0, 4, &be_const_str_pi); +be_define_const_str(pi, "pi", 1213090802u, 0, 2, NULL); +be_define_const_str(splitext, "splitext", 2150391934u, 0, 8, NULL); +be_define_const_str(compile, "compile", 1000265118u, 0, 7, &be_const_str_setrange); +be_define_const_str(setrange, "setrange", 3794019032u, 0, 8, &be_const_str_traceback); +be_define_const_str(traceback, "traceback", 3385188109u, 0, 9, &be_const_str_upper); +be_define_const_str(upper, "upper", 176974407u, 0, 5, &be_const_str_var); +be_define_const_str(var, "var", 2317739966u, 64, 3, NULL); +be_define_const_str(opt_eq, "==", 2431966415u, 0, 2, NULL); +be_define_const_str(codedump, "codedump", 1786337906u, 0, 8, &be_const_str_tan); +be_define_const_str(tan, "tan", 2633446552u, 0, 3, NULL); +be_define_const_str(setitem, "setitem", 1554834596u, 0, 7, NULL); +be_define_const_str(tanh, "tanh", 153638352u, 0, 4, &be_const_str_as); +be_define_const_str(as, "as", 1579491469u, 67, 2, NULL); +be_define_const_str(issubclass, "issubclass", 4078395519u, 0, 10, &be_const_str_upvname); +be_define_const_str(upvname, "upvname", 3848760617u, 0, 7, NULL); +be_define_const_str(opt_connect, "..", 2748622605u, 0, 2, NULL); +be_define_const_str(try, "try", 2887626766u, 68, 3, &be_const_str_while); +be_define_const_str(while, "while", 231090382u, 53, 5, NULL); +be_define_const_str(import, "import", 288002260u, 66, 6, NULL); +be_define_const_str(__lower__, "__lower__", 123855590u, 0, 9, &be_const_str_open); +be_define_const_str(open, "open", 3546203337u, 0, 4, NULL); +be_define_const_str(acos, "acos", 1006755615u, 0, 4, &be_const_str_asin); +be_define_const_str(asin, "asin", 4272848550u, 0, 4, &be_const_str_imax); +be_define_const_str(imax, "imax", 3084515410u, 0, 4, &be_const_str_insert); +be_define_const_str(insert, "insert", 3332609576u, 0, 6, &be_const_str_split); +be_define_const_str(split, "split", 2276994531u, 0, 5, NULL); +be_define_const_str(__iterator__, "__iterator__", 3884039703u, 0, 12, &be_const_str_exists); +be_define_const_str(exists, "exists", 1002329533u, 0, 6, &be_const_str_super); +be_define_const_str(super, "super", 4152230356u, 0, 5, &be_const_str_elif); +be_define_const_str(elif, "elif", 3232090307u, 51, 4, NULL); static const bstring* const m_string_table[] = { - (const bstring *)&be_const_str_count, - (const bstring *)&be_const_str_opt_connect, - (const bstring *)&be_const_str_codedump, - (const bstring *)&be_const_str___upper__, - (const bstring *)&be_const_str_classname, - (const bstring *)&be_const_str_true, - (const bstring *)&be_const_str_hex, + (const bstring *)&be_const_str_calldepth, + (const bstring *)&be_const_str_int, + (const bstring *)&be_const_str_concat, + (const bstring *)&be_const_str_dot_p, NULL, (const bstring *)&be_const_str_cosh, - (const bstring *)&be_const_str_exit, - (const bstring *)&be_const_str_path, - (const bstring *)&be_const_str_dot_p, - (const bstring *)&be_const_str_deinit, - (const bstring *)&be_const_str_clock, - (const bstring *)&be_const_str_opt_add, - (const bstring *)&be_const_str_assert, - (const bstring *)&be_const_str_ceil, - (const bstring *)&be_const_str_pow, - (const bstring *)&be_const_str_calldepth, - (const bstring *)&be_const_str_init, - NULL, - (const bstring *)&be_const_str_map, - (const bstring *)&be_const_str_allocated, (const bstring *)&be_const_str_abs, - (const bstring *)&be_const_str_setrange, - (const bstring *)&be_const_str_real, - (const bstring *)&be_const_str_end, + (const bstring *)&be_const_str_hex, + (const bstring *)&be_const_str_tostring, + (const bstring *)&be_const_str_opt_add, + (const bstring *)&be_const_str_iter, + (const bstring *)&be_const_str_getcwd, NULL, - (const bstring *)&be_const_str_isdir, + (const bstring *)&be_const_str_allocated, + (const bstring *)&be_const_str_ceil, + (const bstring *)&be_const_str_format, + (const bstring *)&be_const_str_classname, + (const bstring *)&be_const_str_byte, + (const bstring *)&be_const_str_else, + (const bstring *)&be_const_str_deinit, + (const bstring *)&be_const_str___upper__, + (const bstring *)&be_const_str_char, + NULL, + (const bstring *)&be_const_str_deg, + NULL, + (const bstring *)&be_const_str_range, (const bstring *)&be_const_str_, NULL, - (const bstring *)&be_const_str_getcwd, - (const bstring *)&be_const_str_attrdump, - (const bstring *)&be_const_str_push, - (const bstring *)&be_const_str_compile, - (const bstring *)&be_const_str_atan, - (const bstring *)&be_const_str_insert, - (const bstring *)&be_const_str_chdir, - (const bstring *)&be_const_str_find, - NULL, - (const bstring *)&be_const_str_super, - (const bstring *)&be_const_str_concat, - (const bstring *)&be_const_str_while, - (const bstring *)&be_const_str_input, - (const bstring *)&be_const_str_log10, - (const bstring *)&be_const_str_collect, - (const bstring *)&be_const_str_clear, (const bstring *)&be_const_str_opt_neq, - (const bstring *)&be_const_str_listdir, - (const bstring *)&be_const_str_char, - (const bstring *)&be_const_str_format, - (const bstring *)&be_const_str_upper + (const bstring *)&be_const_str_lower, + (const bstring *)&be_const_str_count, + (const bstring *)&be_const_str_exit, + (const bstring *)&be_const_str_pop, + (const bstring *)&be_const_str_classof, + (const bstring *)&be_const_str_path, + (const bstring *)&be_const_str_input, + (const bstring *)&be_const_str_floor, + (const bstring *)&be_const_str_imin, + (const bstring *)&be_const_str_splitext, + NULL, + (const bstring *)&be_const_str_compile, + (const bstring *)&be_const_str_opt_eq, + (const bstring *)&be_const_str_codedump, + (const bstring *)&be_const_str_setitem, + (const bstring *)&be_const_str_tanh, + (const bstring *)&be_const_str_issubclass, + (const bstring *)&be_const_str_opt_connect, + (const bstring *)&be_const_str_try, + (const bstring *)&be_const_str_import, + (const bstring *)&be_const_str___lower__, + NULL, + (const bstring *)&be_const_str_acos, + (const bstring *)&be_const_str___iterator__ }; static const struct bconststrtab m_const_string_table = { - .size = 52, - .count = 104, + .size = 53, + .count = 107, .table = m_string_table }; diff --git a/lib/lib_div/Berry-0.1.10/generate/be_fixed_be_class_map.h b/lib/lib_div/Berry-0.1.10/generate/be_fixed_be_class_map.h index eebf1b658..06c75a050 100644 --- a/lib/lib_div/Berry-0.1.10/generate/be_fixed_be_class_map.h +++ b/lib/lib_div/Berry-0.1.10/generate/be_fixed_be_class_map.h @@ -1,21 +1,22 @@ #include "be_constobj.h" static be_define_const_map_slots(be_class_map_map) { - { be_const_key(init, -1), be_const_func(m_init) }, - { be_const_key(remove, 7), be_const_func(m_remove) }, - { be_const_key(find, -1), be_const_func(m_find) }, - { be_const_key(insert, 8), be_const_func(m_insert) }, + { be_const_key(dot_p, 2), be_const_int(0) }, + { be_const_key(insert, -1), be_const_func(m_insert) }, + { be_const_key(remove, -1), be_const_func(m_remove) }, + { be_const_key(tostring, -1), be_const_func(m_tostring) }, + { be_const_key(iter, 5), be_const_func(m_iter) }, { be_const_key(size, -1), be_const_func(m_size) }, - { be_const_key(tostring, 0), be_const_func(m_tostring) }, - { be_const_key(setitem, 3), be_const_func(m_setitem) }, - { be_const_key(iter, -1), be_const_func(m_iter) }, - { be_const_key(item, -1), be_const_func(m_item) }, - { be_const_key(dot_p, 1), be_const_int(0) }, + { be_const_key(keys, -1), be_const_func(m_keys) }, + { be_const_key(setitem, -1), be_const_func(m_setitem) }, + { be_const_key(find, 0), be_const_func(m_find) }, + { be_const_key(init, -1), be_const_func(m_init) }, + { be_const_key(item, 1), be_const_func(m_item) }, }; static be_define_const_map( be_class_map_map, - 10 + 11 ); BE_EXPORT_VARIABLE be_define_const_class( diff --git a/lib/lib_div/Berry-0.1.10/generate/be_fixed_string.h b/lib/lib_div/Berry-0.1.10/generate/be_fixed_string.h index c2da8b838..906c11f55 100644 --- a/lib/lib_div/Berry-0.1.10/generate/be_fixed_string.h +++ b/lib/lib_div/Berry-0.1.10/generate/be_fixed_string.h @@ -1,18 +1,20 @@ #include "be_constobj.h" static be_define_const_map_slots(m_libstring_map) { - { be_const_key(hex, 2), be_const_func(str_i2hex) }, - { be_const_key(byte, -1), be_const_func(str_byte) }, - { be_const_key(format, 5), be_const_func(str_format) }, - { be_const_key(find, -1), be_const_func(str_find) }, - { be_const_key(char, 1), be_const_func(str_char) }, - { be_const_key(split, -1), be_const_func(str_split) }, + { be_const_key(tolower, -1), be_const_func(str_tolower) }, { be_const_key(count, -1), be_const_func(str_count) }, + { be_const_key(hex, -1), be_const_func(str_i2hex) }, + { be_const_key(split, 5), be_const_func(str_split) }, + { be_const_key(byte, -1), be_const_func(str_byte) }, + { be_const_key(char, 6), be_const_func(str_char) }, + { be_const_key(toupper, 1), be_const_func(str_toupper) }, + { be_const_key(find, -1), be_const_func(str_find) }, + { be_const_key(format, -1), be_const_func(str_format) }, }; static be_define_const_map( m_libstring_map, - 7 + 9 ); static be_define_const_module( diff --git a/lib/lib_div/Berry-0.1.10/src/be_gc.h b/lib/lib_div/Berry-0.1.10/src/be_gc.h index 16ca7e766..5943a7392 100644 --- a/lib/lib_div/Berry-0.1.10/src/be_gc.h +++ b/lib/lib_div/Berry-0.1.10/src/be_gc.h @@ -13,7 +13,7 @@ #define BE_GCOBJECT BE_STRING #define gc_object(o) cast(bgcobject*, o) -#define gc_cast(o, t, T) ((o) && (o)->type == (t) ? (T*)(o) : NULL) +#define gc_cast(o, t, T) ((o) && pgm_read_byte(&(o)->type) == (t) ? (T*)(o) : NULL) #define cast_proto(o) gc_cast(o, BE_PROTO, bproto) #define cast_closure(o) gc_cast(o, BE_CLOSURE, bclosure) #define cast_ntvclos(o) gc_cast(o, BE_NTVCLOS, bntvclos) @@ -38,11 +38,11 @@ if (!gc_isconst(o)) { \ #define gc_setwhite(o) gc_setmark((o), GC_WHITE) #define gc_setgray(o) gc_setmark((o), GC_GRAY) #define gc_setdark(o) gc_setmark((o), GC_DARK) -#define gc_isfixed(o) (((o)->marked & GC_FIXED) != 0) +#define gc_isfixed(o) ((pgm_read_byte(&(o)->marked) & GC_FIXED) != 0) #define gc_setfixed(o) ((o)->marked |= GC_FIXED) #define gc_clearfixed(o) ((o)->marked &= ~GC_FIXED) -#define gc_isconst(o) (((o)->marked & GC_CONST) != 0) -#define gc_exmark(o) (((o)->marked >> 4) & 0x0F) +#define gc_isconst(o) ((pgm_read_byte(&(o)->marked) & GC_CONST) != 0) +#define gc_exmark(o) ((pgm_read_byte(&(o)->marked) >> 4) & 0x0F) #define gc_setexmark(o, k) ((o)->marked |= (k) << 4) #define be_isgctype(t) ((t) >= BE_GCOBJECT) diff --git a/lib/lib_div/Berry-0.1.10/src/be_lexer.c b/lib/lib_div/Berry-0.1.10/src/be_lexer.c index eea82109d..b201e8df2 100644 --- a/lib/lib_div/Berry-0.1.10/src/be_lexer.c +++ b/lib/lib_div/Berry-0.1.10/src/be_lexer.c @@ -105,7 +105,8 @@ static int next(blexer *lexer) lr->s = s ? s : &eos; --lr->len; } - lexer->cursor = *lr->s++; + // lexer->cursor = *lr->s++; // SH + lexer->cursor = pgm_read_byte(lr->s++); return lexer->cursor; } diff --git a/lib/lib_div/Berry-0.1.10/src/be_maplib.c b/lib/lib_div/Berry-0.1.10/src/be_maplib.c index 2d8446edd..936e3164d 100644 --- a/lib/lib_div/Berry-0.1.10/src/be_maplib.c +++ b/lib/lib_div/Berry-0.1.10/src/be_maplib.c @@ -172,6 +172,37 @@ static int m_iter(bvm *vm) be_return(vm); } +static int keys_iter_closure(bvm *vm) +{ + /* for better performance, we operate the upvalues + * directly without using by the stack. */ + bntvclos *func = var_toobj(vm->cf->func); + bvalue *uv0 = be_ntvclos_upval(func, 0)->value; /* list value */ + bvalue *uv1 = be_ntvclos_upval(func, 1)->value; /* iter value */ + bmapiter iter = var_toobj(uv1); + bmapnode *next = be_map_next(var_toobj(uv0), &iter); + if (next == NULL) { + be_stop_iteration(vm); + be_return_nil(vm); /* will not be executed */ + } + var_setobj(uv1, BE_COMPTR, iter); /* set upvale[1] (iter value) */ + /* push next value to top */ + var_setobj(vm->top, next->key.type, next->key.v.p); + be_incrtop(vm); + be_return(vm); +} + +static int m_keys(bvm *vm) +{ + be_pushntvclosure(vm, keys_iter_closure, 2); + be_getmember(vm, 1, ".p"); + be_setupval(vm, -2, 0); + be_pushiter(vm, -1); + be_setupval(vm, -3, 1); + be_pop(vm, 2); + be_return(vm); +} + #if !BE_USE_PRECOMPILED_OBJECT void be_load_maplib(bvm *vm) { @@ -186,6 +217,7 @@ void be_load_maplib(bvm *vm) { "size", m_size }, { "insert", m_insert }, { "iter", m_iter }, + { "keys", m_keys }, { NULL, NULL } }; be_regclass(vm, "map", members); @@ -203,6 +235,7 @@ class be_class_map (scope: global, name: map) { size, func(m_size) insert, func(m_insert) iter, func(m_iter) + keys, func(m_keys) } @const_object_info_end */ #include "../generate/be_fixed_be_class_map.h" diff --git a/lib/lib_div/Berry-0.1.10/src/be_object.h b/lib/lib_div/Berry-0.1.10/src/be_object.h index d465138ec..dd73a8a87 100644 --- a/lib/lib_div/Berry-0.1.10/src/be_object.h +++ b/lib/lib_div/Berry-0.1.10/src/be_object.h @@ -10,6 +10,37 @@ #include "berry.h" +/* support for PROGMEM on ESP8266 and AVR */ +#ifdef _PGMSPACE_H_ + #define strncmp strncmp_PP + #define strcmp(str1P, str2P) strncmp_PP((str1P), (str2P), SIZE_IRRELEVANT) + #define strncasecmp strncasecmp_P + #define strcasecmp_P(str1, str2P) strncasecmp_P((str1), (str2P), SIZE_IRRELEVANT) + #define strlen strlen_P + #define strchr strchr_P + #define strcat strcat_P + #define strncat strncat_P + #define strcpy strcpy_P + #define strncpy strncpy_P + #define memcpy memcpy_P + #define memccpy memccpy_P + #define memmove memmove_P + #define memcmp memcmp_P + #define memmem memmem_P + #define memchr memchr_P + #define sprintf sprintf_P + #define snprintf snprintf_P +#endif + +#ifndef pgm_read_byte +#define pgm_read_byte(addr) (*(const uint8_t*)(addr)) +#endif + +#ifndef pgm_read_word +#define pgm_read_word(addr) (*(const uint16_t*)(addr)) +#endif + + /* basic types, do not change value */ #define BE_NONE (-1) /* unknow type */ #define BE_COMPTR (-2) /* common pointer */ diff --git a/lib/lib_div/Berry-0.1.10/src/be_parser.c b/lib/lib_div/Berry-0.1.10/src/be_parser.c index 1839e9392..bdfdcaf3d 100644 --- a/lib/lib_div/Berry-0.1.10/src/be_parser.c +++ b/lib/lib_div/Berry-0.1.10/src/be_parser.c @@ -31,7 +31,7 @@ #define FUNC_ANONYMOUS 2 /* get binary operator priority */ -#define binary_op_prio(op) (binary_op_prio_tab[cast_int(op) - OptAdd]) +#define binary_op_prio(op) (pgm_read_byte(&binary_op_prio_tab[cast_int(op) - OptAdd])) #define scan_next_token(parser) (be_lexer_scan_next(&(parser)->lexer)) #define next_token(parser) ((parser)->lexer.token) diff --git a/lib/lib_div/Berry-0.1.10/src/be_string.c b/lib/lib_div/Berry-0.1.10/src/be_string.c index db7dcaebf..0590fb396 100644 --- a/lib/lib_div/Berry-0.1.10/src/be_string.c +++ b/lib/lib_div/Berry-0.1.10/src/be_string.c @@ -44,9 +44,9 @@ int be_eqstr(bstring *s1, bstring *s2) if (s1 == s2) { /* short string or the same string */ return 1; } - slen = s1->slen; + slen = pgm_read_byte(&s1->slen); /* long string */ - if (slen == 255 && slen == s2->slen) { + if (slen == 255 && slen == pgm_read_byte(&s2->slen)) { blstring *ls1 = cast(blstring*, s1); blstring *ls2 = cast(blstring*, s2); return ls1->llen == ls2->llen && !strcmp(lstr(ls1), lstr(ls2)); @@ -88,7 +88,7 @@ static void resize(bvm *vm, int size) static void free_sstring(bvm *vm, bstring *str) { - be_free(vm, str, sizeof(bsstring) + str->slen + 1); + be_free(vm, str, sizeof(bsstring) + pgm_read_byte(&str->slen) + 1); } /* FNV-1a Hash */ @@ -97,7 +97,8 @@ static uint32_t str_hash(const char *str, size_t len) uint32_t hash = 2166136261u; be_assert(str || len); while (len--) { - hash = (hash ^ (unsigned char)*str++) * 16777619u; + hash = (hash ^ (unsigned char)pgm_read_byte(str)) * 16777619u; + str++; } return hash; } @@ -149,7 +150,7 @@ static bstring* find_conststr(const char *str, size_t len) uint32_t hash = str_hash(str, len); bcstring *s = (bcstring*)tab->table[hash % tab->size]; for (; s != NULL; s = next(s)) { - if (len == s->slen && !strncmp(str, s->s, len)) { + if (len == pgm_read_byte(&s->slen) && !strncmp(str, s->s, len)) { return (bstring*)s; } } @@ -165,7 +166,7 @@ static bstring* newshortstr(bvm *vm, const char *str, size_t len) bstring **list = vm->strtab.table + (hash & (size - 1)); for (s = *list; s != NULL; s = next(s)) { - if (len == s->slen && !strncmp(str, sstr(s), len)) { + if (len == pgm_read_byte(&s->slen) && !strncmp(str, sstr(s), len)) { return s; } } @@ -252,7 +253,7 @@ uint32_t be_strhash(const bstring *s) return cast(bcstring*, s)->hash; } #if BE_USE_STR_HASH_CACHE - if (s->slen != 255) { + if (pgm_read_byte(&s->slen) != 255) { return cast(bsstring*, s)->hash; } #endif @@ -265,7 +266,7 @@ const char* be_str2cstr(const bstring *s) if (gc_isconst(s)) { return cstr(s); } - if (s->slen == 255) { + if (pgm_read_byte(&s->slen) == 255) { return lstr(s); } return sstr(s); @@ -276,4 +277,4 @@ void be_str_setextra(bstring *s, int extra) if (!gc_isconst(s)) { s->extra = cast(bbyte, extra); } -} +} \ No newline at end of file diff --git a/lib/lib_div/Berry-0.1.10/src/be_string.h b/lib/lib_div/Berry-0.1.10/src/be_string.h index 51b3fd016..8d3fba49e 100644 --- a/lib/lib_div/Berry-0.1.10/src/be_string.h +++ b/lib/lib_div/Berry-0.1.10/src/be_string.h @@ -33,7 +33,7 @@ typedef struct { } bcstring; #define str_len(_s) \ - ((_s)->slen == 255 ? cast(blstring*, _s)->llen : (_s)->slen) + (pgm_read_byte(&(_s)->slen) == 255 ? cast(blstring*, _s)->llen : pgm_read_byte(&(_s)->slen)) #define str(_s) be_str2cstr(_s) #define str_extra(_s) ((_s)->extra) diff --git a/lib/lib_div/Berry-0.1.10/src/be_strlib.c b/lib/lib_div/Berry-0.1.10/src/be_strlib.c index f4bda16c4..37fe8e12b 100644 --- a/lib/lib_div/Berry-0.1.10/src/be_strlib.c +++ b/lib/lib_div/Berry-0.1.10/src/be_strlib.c @@ -14,6 +14,7 @@ #include "be_mem.h" #include #include +#include #define is_space(c) ((c) == ' ' || (c) == '\t' || (c) == '\r' || (c) == '\n') #define is_digit(c) ((c) >= '0' && (c) <= '9') @@ -175,7 +176,7 @@ const char* be_pushvfstr(bvm *vm, const char *format, va_list arg) } pushstr(vm, format, p - format); concat2(vm); - switch (p[1]) { + switch (pgm_read_byte(&p[1])) { case 's': { const char *s = va_arg(arg, char*); if (s == NULL) { @@ -338,8 +339,8 @@ bstring* be_strindex(bvm *vm, bstring *str, bvalue *idx) const char* be_splitpath(const char *path) { const char *p; - for (p = path - 1; *path != '\0'; ++path) { - if (*path == '/') { + for (p = path - 1; pgm_read_byte(path) != '\0'; ++path) { + if (pgm_read_byte(path) == '/') { p = path; } } @@ -708,6 +709,34 @@ static int str_char(bvm *vm) be_return_nil(vm); } +// boolean to select whether we call toupper() or tolower() +static int str_touplower(bvm *vm, bbool up) +{ + if (be_top(vm) && be_isstring(vm, 1)) { + const char *p, *s = be_tostring(vm, 1); + size_t len = (size_t)be_strlen(vm, 1); + char *buf, *q; + buf = q = be_pushbuffer(vm, len); + /* convert to lower case */ + for (p = s; *p != '\0'; ++p, ++q) { + *q = up ? toupper(*p) : tolower(*p); + } + be_pushnstring(vm, buf, len); /* make escape string from buffer */ + be_remove(vm, 2); /* remove buffer */ + be_return(vm); + } + be_return_nil(vm); +} + +static int str_tolower(bvm *vm) { + return str_touplower(vm, bfalse); +} + +static int str_toupper(bvm *vm) { + return str_touplower(vm, btrue); +} + + #if !BE_USE_PRECOMPILED_OBJECT be_native_module_attr_table(string) { be_native_module_function("format", str_format), @@ -716,7 +745,9 @@ be_native_module_attr_table(string) { be_native_module_function("find", str_find), be_native_module_function("hex", str_i2hex), be_native_module_function("byte", str_byte), - be_native_module_function("char", str_char) + be_native_module_function("char", str_char), + be_native_module_function("tolower", str_tolower), + be_native_module_function("toupper", str_toupper), }; be_define_native_module(string, NULL); @@ -730,6 +761,8 @@ module string (scope: global, depend: BE_USE_STRING_MODULE) { hex, func(str_i2hex) byte, func(str_byte) char, func(str_char) + tolower, func(str_tolower) + toupper, func(str_toupper) } @const_object_info_end */ #include "../generate/be_fixed_string.h" diff --git a/lib/lib_div/Berry-0.1.10/src/be_vector.c b/lib/lib_div/Berry-0.1.10/src/be_vector.c index b73479601..2cd3f1e2e 100644 --- a/lib/lib_div/Berry-0.1.10/src/be_vector.c +++ b/lib/lib_div/Berry-0.1.10/src/be_vector.c @@ -122,16 +122,16 @@ static int binary_search(int value) const uint16_t *high = tab + array_count(tab) - 1; while (low <= high) { const uint16_t *mid = low + ((high - low) >> 1); - if (*mid == value) { - return mid[1]; + if (pgm_read_word(mid) == value) { + return pgm_read_word(&mid[1]); } - if (*mid < value) { + if (pgm_read_word(mid) < value) { low = mid + 1; } else { high = mid - 1; } } - return *low; + return pgm_read_word(low); } static int nextpow(int value) diff --git a/lib/lib_div/Berry-0.1.10/src/port/be_modtab.c b/lib/lib_div/Berry-0.1.10/src/port/be_modtab.c index 9250e83e2..eb83cf5a2 100644 --- a/lib/lib_div/Berry-0.1.10/src/port/be_modtab.c +++ b/lib/lib_div/Berry-0.1.10/src/port/be_modtab.c @@ -19,6 +19,9 @@ be_extern_native_module(sys); be_extern_native_module(debug); be_extern_native_module(gc); +/* Tasmota specific */ +be_extern_native_module(tasmota); + /* user-defined modules declare start */ /* user-defined modules declare end */ @@ -52,6 +55,8 @@ BERRY_LOCAL const bntvmodule* const be_module_table[] = { #endif /* user-defined modules register start */ + &be_native_module(tasmota), + /* user-defined modules register end */ NULL /* do not remove */ }; diff --git a/lib/lib_div/Berry-0.1.10/src/port/be_port.cpp b/lib/lib_div/Berry-0.1.10/src/port/be_port.cpp index 7233f57dc..fd9ac48d6 100644 --- a/lib/lib_div/Berry-0.1.10/src/port/be_port.cpp +++ b/lib/lib_div/Berry-0.1.10/src/port/be_port.cpp @@ -16,44 +16,35 @@ /* standard input and output */ extern "C" { - void serial(const char *sp) { - char s[200]; - snprintf_P(s, sizeof(s), "%s", sp); - Serial.printf(s); - Serial.flush(); - } - void serial3(const char *sp, uint32_t a, uint32_t b, uint32_t c) { - char s[200]; - snprintf_P(s, sizeof(s), "%s 0x%08X 0x%08X 0x%08X\n", sp, a, b, c); - Serial.printf(s); - Serial.flush(); - } - void serial2s1(const char *sp, const char * a, const char * b, uint32_t c) { - char s[200]; - snprintf_P(s, sizeof(s), "%s '%s' '%s' 0x%08X\n", sp, a, b, c); - Serial.printf(s); - Serial.flush(); + int strncmp_PP(const char * str1P, const char * str2P, size_t size) + { + int result = 0; + + while (size > 0) + { + char ch1 = pgm_read_byte(str1P++); + char ch2 = pgm_read_byte(str2P++); + result = ch1 - ch2; + if (result != 0 || ch2 == '\0') + { + break; + } + + size--; + } + + return result; } -// int strncmp_PP(const char * str1P, const char * str2P, size_t size) -// { -// int result = 0; - -// while (size > 0) -// { -// char ch1 = pgm_read_byte(str1P++); -// char ch2 = pgm_read_byte(str2P++); -// result = ch1 - ch2; -// if (result != 0 || ch2 == '\0') -// { -// break; -// } - -// size--; -// } - -// return result; -// } + // + char * strchr_P(const char *s, int c) { + do { + if (pgm_read_byte(s) == c) { + return (char*)s; + } + } while (pgm_read_byte(s++)); + return (0); + } } BERRY_API void be_writebuffer(const char *buffer, size_t length) diff --git a/lib/lib_div/Berry-0.1.10/src/port/be_tasmotalib.c b/lib/lib_div/Berry-0.1.10/src/port/be_tasmotalib.c new file mode 100644 index 000000000..7f17998cb --- /dev/null +++ b/lib/lib_div/Berry-0.1.10/src/port/be_tasmotalib.c @@ -0,0 +1,34 @@ +/******************************************************************** + * Tasmota lib + * + * To use: `import tasmota` + *******************************************************************/ +#include "be_object.h" + +extern int l_getFreeHeap(bvm *vm); +extern int l_publish(bvm *vm); +extern int l_cmd(bvm *vm); +extern int l_getoption(bvm *vm); +extern int l_millis(bvm *vm); +extern int l_timereached(bvm *vm); + +// #if !BE_USE_PRECOMPILED_OBJECT +#if 1 // TODO we will do pre-compiled later +be_native_module_attr_table(tasmota) { + be_native_module_function("getfreeheap", l_getFreeHeap), + be_native_module_function("publish", l_publish), + be_native_module_function("cmd", l_cmd), + be_native_module_function("getoption", l_getoption), + be_native_module_function("millis", l_millis), + be_native_module_function("timereached", l_timereached), +}; + +be_define_native_module(tasmota, NULL); +#else +/* @const_object_info_begin +module tasmota (scope: global, depend: 1) { + getfreeheap, func(l_getFreeHeap) +} +@const_object_info_end */ +#include "../generate/be_fixed_tasmota.h" +#endif diff --git a/lib/lib_div/Berry-0.1.10/src/port/berry_conf.h b/lib/lib_div/Berry-0.1.10/src/port/berry_conf.h index aee1214aa..5228f567f 100644 --- a/lib/lib_div/Berry-0.1.10/src/port/berry_conf.h +++ b/lib/lib_div/Berry-0.1.10/src/port/berry_conf.h @@ -8,14 +8,14 @@ #ifndef BERRY_CONF_H #define BERRY_CONF_H +#include + #ifdef __cplusplus extern "C" { #endif - extern void serial(const char *sp); - extern void serial3(const char *sp, uint32_t a, uint32_t b, uint32_t c); - extern void serial2s1(const char *sp, const char *a, const char *b, uint32_t c); extern int strncmp_PP(const char * str1P, const char * str2P, size_t size); + extern char * strchr_P(const char *s, int c); #ifdef __cplusplus } @@ -54,7 +54,11 @@ extern "C" { * runtime. Enable this macro can greatly optimize RAM usage. * Default: 1 **/ -#define BE_USE_PRECOMPILED_OBJECT 1 +#ifdef ESP8266 +#define BE_USE_PRECOMPILED_OBJECT 0 +#else +#define BE_USE_PRECOMPILED_OBJECT 0 // will enable later when stabilized +#endif /* Macro: BE_DEBUG_RUNTIME_INFO * Set runtime error debugging information. @@ -157,7 +161,7 @@ extern "C" { #define BE_USE_OS_MODULE 0 #define BE_USE_SYS_MODULE 0 #define BE_USE_DEBUG_MODULE 0 -#define BE_USE_GC_MODULE 0 +#define BE_USE_GC_MODULE 1 /* Macro: BE_EXPLICIT_XXX * If these macros are defined, the corresponding function will diff --git a/tasmota/berry/tasmota.be b/tasmota/berry/tasmota.be new file mode 100644 index 000000000..3393ea1bd --- /dev/null +++ b/tasmota/berry/tasmota.be @@ -0,0 +1,157 @@ +import json import string +tasmota = module("tasmota") +def charsinstring(s,c) + for i:0..size(s)-1 + for j:0..size(c)-1 + if s[i] == c[j] return i end + end + end + return -1 +end + +tasmota._eqstr=/s1,s2-> str(s1) == str(s2) +tasmota._neqstr=/s1,s2-> str(s1) != str(s2) +tasmota._eq=/f1,f2-> real(f1) == real(f2) +tasmota._neq=/f1,f2-> real(f1) != real(f2) +tasmota._gt=/f1,f2-> real(f1) > real(f2) +tasmota._lt=/f1,f2-> real(f1) < real(f2) +tasmota._ge=/f1,f2-> real(f1) >= real(f2) +tasmota._le=/f1,f2-> real(f1) <= real(f2) +tasmota._op=[ + ['==',tasmota._eqstr], + ['!==',tasmota._neqstr], + ['=',tasmota._eq], + ['!=',tasmota._neq], + ['>=',tasmota._ge], + ['<=',tasmota._le], + ['>',tasmota._gt], + ['<',tasmota._lt], +] +tasmota._operators="=<>!|" + +# split the item when there is an operator, returns a list of (left,op,right) +# ex: "Dimmer>50" -> ["Dimmer",tasmota_gt,"50"] +tasmota.find_op = def (item) + pos = charsinstring(item, tasmota._operators) + if pos>=0 + op_split = string.split(item,pos) + #print(op_split) + op_left = op_split[0] + op_rest = op_split[1] + # iterate through operators + for op:tasmota._op + if string.find(op_rest,op[0]) == 0 + op_func = op[1] + op_right = string.split(op_rest,size(op[0]))[1] + return [op_left,op_func,op_right] + end + end + end + return [item, nil, nil] +end + + +def findkeyi(m,keyi) + keyu=string.toupper(keyi) + if classof(m) == map + for k:m.keys() + if string.toupper(k)==keyu || keyi=='?' + return k + end + end + end +end + + +tasmota.try_rule = def (ev, rule, f) + rl_list = tasmota.find_op(rule) + e=ev + rl=string.split(rl_list[0],'#') + for it:rl + found=findkeyi(e,it) + if found == nil + return false + end + e=e[found] + end + # check if condition is true + if rl_list[1] + # did we find a function + if !rl_list[1](e,rl_list[2]) + # condition is not met + return false + end + end + f(e,ev) + return true +end +tasmota_rules={} +tasmota.rule = def(pat,f) tasmota_rules[pat] = f end + +tasmota.exec_rules = def (ev_json) + ev = json.load(ev_json) + if ev == nil + log("ERROR, bad json: "+ev_json, 3) + end + ret = false + for r:tasmota_rules.keys() + ret = tasmota.try_rule(ev,r,tasmota_rules[r]) || ret + end + return ret +end + +#- Test +################################################################# + +def log(m) print(m) end +def my_rule(e,ev) log("e1="+str(e)+" e2="+str(ev)) end + +tasmota.rule("ZBRECEIVED#?#LINKQUALITY", my_rule) +tasmota.rule("ZBRECEIVED#0x1234", my_rule) + +tasmota.rule("ZBRECEIVED#?#LINKQUALITY<10", my_rule) + +tasmota.rule("Dimmer>50", my_rule) +tasmota.rule("Dimmer=01", my_rule) + + +tasmota.rule("Color==022600", my_rule) + +tasmota.exec_rules('{"Color":"022600"}') + +tasmota.exec_rules('{"ZbReceived":{"0x1234":{"Device":"0x1234","LinkQuality":50}}}') + +tasmota.exec_rules('{"Dimmer":10}') + + + +# tasmota.rule("DIMMER", my_rule) +# tasmota.rule("DIMMER#DATA#DATA", my_rule) +# tasmota.exec_rules('{"Dimmer":{"Data":50}}') + + +-# + +#- +tasmota.find_op("aaa") +tasmota.find_op("aaa>50") +-# + +#- +# Example of backlog equivalent + +def backlog(cmd_list) + delay_backlog = tasmota.getoption(34) # in milliseconds + delay = 0 + for cmd:cmd_list + tasmota.timer(delay, /-> tasmota.cmd(cmd)) + delay = delay + delay_backlog + end +end + + +br def backlog(cmd_list) delay_backlog = tasmota.getoption(34) delay = 0 for cmd:cmd_list tasmota.timer(delay, /-> tasmota.cmd(cmd)) delay = delay + delay_backlog end end + +br backlog( [ "Power 0", "Status 4", "Power 1" ] ) + +-# \ No newline at end of file diff --git a/tasmota/support_command.ino b/tasmota/support_command.ino index 139631e74..065fabbcc 100644 --- a/tasmota/support_command.ino +++ b/tasmota/support_command.ino @@ -844,35 +844,67 @@ void CmndSetoption(void) { CmndSetoptionBase(1); } +// Code called by SetOption and by Berrt +bool SetoptionDecode(uint32_t index, uint32_t *ptype, uint32_t *pindex) { + if (index < 146) { + if (index <= 31) { // SetOption0 .. 31 = Settings.flag + *ptype = 2; + *pindex = index; // 0 .. 31 + } + else if (index <= 49) { // SetOption32 .. 49 = Settings.param + *ptype = 1; + *pindex = index -32; // 0 .. 17 (= PARAM8_SIZE -1) + } + else if (index <= 81) { // SetOption50 .. 81 = Settings.flag3 + *ptype = 3; + *pindex = index -50; // 0 .. 31 + } + else if (index <= 113) { // SetOption82 .. 113 = Settings.flag4 + *ptype = 4; + *pindex = index -82; // 0 .. 31 + } + else { // SetOption114 .. 145 = Settings.flag5 + *ptype = 5; + *pindex = index -114; // 0 .. 31 + } + return true; + } + return false; +} + +uint32_t GetOption(uint32_t index) { + uint32_t ptype; + uint32_t pindex; + if (SetoptionDecode(index, &ptype, &pindex)) { + if (1 == ptype) { + return Settings.param[pindex]; + } else { + uint32_t flag = Settings.flag.data; + if (3 == ptype) { + flag = Settings.flag3.data; + } + else if (4 == ptype) { + flag = Settings.flag4.data; + } + else if (5 == ptype) { + flag = Settings.flag5.data; + } + return bitRead(flag, pindex); + } + } else { + return 0; // fallback + } +} + void CmndSetoptionBase(bool indexed) { // Allow a command to access a single SetOption by it's command name // indexed = 0 : No index will be returned attached to the command // {"ClockDirection":"OFF"} // indexed = 1 : The SetOption index will be returned with the command // {"SetOption16":"OFF"} - if (XdrvMailbox.index < 146) { - uint32_t ptype; - uint32_t pindex; - if (XdrvMailbox.index <= 31) { // SetOption0 .. 31 = Settings.flag - ptype = 2; - pindex = XdrvMailbox.index; // 0 .. 31 - } - else if (XdrvMailbox.index <= 49) { // SetOption32 .. 49 = Settings.param - ptype = 1; - pindex = XdrvMailbox.index -32; // 0 .. 17 (= PARAM8_SIZE -1) - } - else if (XdrvMailbox.index <= 81) { // SetOption50 .. 81 = Settings.flag3 - ptype = 3; - pindex = XdrvMailbox.index -50; // 0 .. 31 - } - else if (XdrvMailbox.index <= 113) { // SetOption82 .. 113 = Settings.flag4 - ptype = 4; - pindex = XdrvMailbox.index -82; // 0 .. 31 - } - else { // SetOption114 .. 145 = Settings.flag5 - ptype = 5; - pindex = XdrvMailbox.index -114; // 0 .. 31 - } + uint32_t ptype; + uint32_t pindex; + if (SetoptionDecode(XdrvMailbox.index, &ptype, &pindex)) { if (XdrvMailbox.payload >= 0) { if (1 == ptype) { // SetOption32 .. 49 diff --git a/tasmota/tasmota.h b/tasmota/tasmota.h index c4daf839b..34e2a562a 100644 --- a/tasmota/tasmota.h +++ b/tasmota/tasmota.h @@ -370,10 +370,10 @@ enum DevGroupShareItem { DGR_SHARE_POWER = 1, DGR_SHARE_LIGHT_BRI = 2, DGR_SHARE enum CommandSource { SRC_IGNORE, SRC_MQTT, SRC_RESTART, SRC_BUTTON, SRC_SWITCH, SRC_BACKLOG, SRC_SERIAL, SRC_WEBGUI, SRC_WEBCOMMAND, SRC_WEBCONSOLE, SRC_PULSETIMER, SRC_TIMER, SRC_RULE, SRC_MAXPOWER, SRC_MAXENERGY, SRC_OVERTEMP, SRC_LIGHT, SRC_KNX, SRC_DISPLAY, SRC_WEMO, SRC_HUE, SRC_RETRY, SRC_REMOTE, SRC_SHUTTER, - SRC_THERMOSTAT, SRC_CHAT, SRC_TCL, SRC_MAX }; + SRC_THERMOSTAT, SRC_CHAT, SRC_TCL, SRC_BERRY, SRC_MAX }; const char kCommandSource[] PROGMEM = "I|MQTT|Restart|Button|Switch|Backlog|Serial|WebGui|WebCommand|WebConsole|PulseTimer|" "Timer|Rule|MaxPower|MaxEnergy|Overtemp|Light|Knx|Display|Wemo|Hue|Retry|Remote|Shutter|" - "Thermostat|Chat|TCL"; + "Thermostat|Chat|TCL|Berry"; const uint8_t kDefaultRfCode[9] PROGMEM = { 0x21, 0x16, 0x01, 0x0E, 0x03, 0x48, 0x2E, 0x1A, 0x00 }; diff --git a/tasmota/xdrv_52_berry.ino b/tasmota/xdrv_52_berry.ino index 04d73bf29..ce0f0b2b6 100644 --- a/tasmota/xdrv_52_berry.ino +++ b/tasmota/xdrv_52_berry.ino @@ -19,7 +19,6 @@ #ifdef USE_BERRY -// #ifdef ESP32 #define XDRV_52 52 @@ -67,6 +66,7 @@ void (* const BerryCommand[])(void) PROGMEM = { class BerrySupport { public: bvm *vm = nullptr; // berry vm + bool rules_busy = false; // are we already processing rules, avoid infinite loop #ifdef USE_BERRY_ASYNC // Alternate stack for the Berry VM uint8_t *stack_alloc = nullptr; // stack malloc address @@ -99,25 +99,126 @@ void checkBeTop(void) { /*********************************************************************************************\ * Native functions mapped to Berry functions * + * log(msg:string [,log_level:int]) ->nil + * + * import tasmota + * + * tasmota.getfreeheap() -> int + * tasmota.publish(topic:string, payload:string[, retain:bool]) -> nil + * tasmota.cmd(command:string) -> string + * tasmota.getoption(index:int) -> int + * tasmota.millis([delay:int]) -> int + * tasmota.timereached(timer:int) -> bool + * \*********************************************************************************************/ -// Berry: `log(string) -> nil` -// Logs the string at LOG_LEVEL_INFO (loglevel=2) -int32_t l_logInfo(struct bvm *vm) { - int32_t top = be_top(vm); // Get the number of arguments - if (top == 1 && be_isstring(vm, 1)) { // only 1 argument of type string accepted - const char * msg = be_tostring(vm, 1); - AddLog(LOG_LEVEL_INFO, D_LOG_BERRY "LOG: %s", msg); - be_return(vm); // Return +extern "C" { + // Berry: `log(msg:string [,log_level:int]) ->nil` + // Logs the string at LOG_LEVEL_INFO (loglevel=2) + int32_t l_logInfo(struct bvm *vm); + int32_t l_logInfo(struct bvm *vm) { + int32_t top = be_top(vm); // Get the number of arguments + if (top >= 1 && be_isstring(vm, 1)) { // only 1 argument of type string accepted + const char * msg = be_tostring(vm, 1); + uint32_t log_level = LOG_LEVEL_INFO; + if (top >= 2 && be_isint(vm, 2)) { + log_level = be_toint(vm, 2); + if (log_level > LOG_LEVEL_DEBUG_MORE) { log_level = LOG_LEVEL_DEBUG_MORE; } + } + AddLog(log_level, PSTR("%s"), msg); + be_return(vm); // Return + } + be_return_nil(vm); // Return nil when something goes wrong + } + + // Berry: `getFreeHeap() -> int` + // ESP object + int32_t l_getFreeHeap(bvm *vm); + int32_t l_getFreeHeap(bvm *vm) { + be_pushint(vm, ESP.getFreeHeap()); + be_return(vm); + } + + // Berry: `tasmota.publish(topic, payload [,retain]) -> nil`` + // + int32_t l_publish(struct bvm *vm); + int32_t l_publish(struct bvm *vm) { + int32_t top = be_top(vm); // Get the number of arguments + if (top >= 2 && be_isstring(vm, 1) && be_isstring(vm, 2)) { // 2 mandatory string arguments + if (top == 2 || (top == 3 && be_isbool(vm, 3))) { // 3rd optional argument must be bool + const char * topic = be_tostring(vm, 1); + const char * payload = be_tostring(vm, 2); + bool retain = false; + if (top == 3) { + retain = be_tobool(vm, 3); + } + strlcpy(TasmotaGlobal.mqtt_data, payload, sizeof(TasmotaGlobal.mqtt_data)); + MqttPublish(topic, retain); + be_return(vm); // Return + } + } + be_return_nil(vm); // Return nil when something goes wrong + } + + // Berry: `tasmota.cmd(command:string) -> string` + // + int32_t l_cmd(struct bvm *vm); + int32_t l_cmd(struct bvm *vm) { + int32_t top = be_top(vm); // Get the number of arguments + if (top == 1 && be_isstring(vm, 1)) { // only 1 argument of type string accepted + const char * command = be_tostring(vm, 1); + ExecuteCommand(command, SRC_BERRY); + be_pushstring(vm, TasmotaGlobal.mqtt_data); + be_return(vm); // Return + } + be_return_nil(vm); // Return nil when something goes wrong + } + + // Berry: tasmota.millis([delay:int]) -> int + // + int32_t l_millis(struct bvm *vm); + int32_t l_millis(struct bvm *vm) { + int32_t top = be_top(vm); // Get the number of arguments + if (top == 0 || (top == 1 && be_isint(vm, 1))) { // only 1 argument of type string accepted + uint32_t delay = 0; + if (top == 1) { + delay = be_toint(vm, 1); + } + uint32_t ret_millis = millis() + delay; + be_pushint(vm, ret_millis); + be_return(vm); // Return + } + be_return_nil(vm); // Return nil when something goes wrong + } + + // Berry: tasmota.getoption(index:int) -> int + // + int32_t l_getoption(struct bvm *vm); + int32_t l_getoption(struct bvm *vm) { + int32_t top = be_top(vm); // Get the number of arguments + if (top == 1 && be_isint(vm, 1)) { + uint32_t opt = GetOption(be_toint(vm, 1)); + be_pushint(vm, opt); + be_return(vm); // Return + } + be_return_nil(vm); // Return nil when something goes wrong + } + + // Berry: tasmota.timereached(timer:int) -> bool + // + int32_t l_timereached(struct bvm *vm); + int32_t l_timereached(struct bvm *vm) { + int32_t top = be_top(vm); // Get the number of arguments + if (top == 1 && be_isint(vm, 1)) { // only 1 argument of type string accepted + uint32_t timer = be_toint(vm, 1); + bool reached = TimeReached(timer); + be_pushbool(vm, reached); + be_return(vm); // Return + } + be_return_nil(vm); // Return nil when something goes wrong } - be_return_nil(vm); // Return nil when something goes wrong } -// Berry: `getFreeHeap() -> int` -// ESP object -int32_t l_getFreeHeap(bvm *vm) { - be_pushint(vm, ESP.getFreeHeap()); - be_return(vm); -} + // Berry: `printStack() -> nul` // print stack pointer @@ -128,7 +229,7 @@ int32_t l_getFreeHeap(bvm *vm) { // } // Yield -int32_t l_yield(bvm *vm) { +int32_t l_yield(struct bvm *vm) { #ifdef USE_BERRY_ASYNC if (berry.ta_cont_ok) { // if no ta_cont address, then ignore if (setjmp(berry.vm_cont) == 0) { // record the current state @@ -157,25 +258,80 @@ int32_t l_yield(bvm *vm) { // callBerryFunctionVoid(berry.fname); // } +bool callBerryRule(void) { + if (berry.rules_busy) { return false; } + berry.rules_busy = true; + char * json_event = TasmotaGlobal.mqtt_data; + bool serviced = false; + + checkBeTop(); + be_getglobal(berry.vm, "_exec_rules"); + if (!be_isnil(berry.vm, -1)) { + + // { + // String event_saved = TasmotaGlobal.mqtt_data; + // // json_event = {"INA219":{"Voltage":4.494,"Current":0.020,"Power":0.089}} + // // json_event = {"System":{"Boot":1}} + // // json_event = {"SerialReceived":"on"} - invalid but will be expanded to {"SerialReceived":{"Data":"on"}} + // char *p = strchr(json_event, ':'); + // if ((p != NULL) && !(strchr(++p, ':'))) { // Find second colon + // event_saved.replace(F(":"), F(":{\"Data\":")); + // event_saved += F("}"); + // // event_saved = {"SerialReceived":{"Data":"on"}} + // } + // be_pushstring(berry.vm, event_saved.c_str()); + // } + be_pushstring(berry.vm, TasmotaGlobal.mqtt_data); + int ret = be_pcall(berry.vm, 1); + serviced = be_tobool(berry.vm, 1); + AddLog(LOG_LEVEL_DEBUG, PSTR(D_LOG_BERRY "Event (%s) serviced=%d"), TasmotaGlobal.mqtt_data, serviced); + be_pop(berry.vm, 2); // remove function object + } else { + be_pop(berry.vm, 1); // remove nil object + } + checkBeTop(); + berry.rules_busy = false; + + return serviced; // TODO event not handled +} + +// void callBerryMqttData(void) { +// AddLog(LOG_LEVEL_INFO, D_LOG_BERRY "callBerryMqttData"); +// if (nullptr == berry.vm) { return; } +// if (XdrvMailbox.data_len < 1) { +// return; +// } +// const char * topic = XdrvMailbox.topic; +// const char * payload = XdrvMailbox.data; + +// checkBeTop(); +// be_getglobal(berry.vm, "mqtt_data_dispatch"); +// if (!be_isnil(berry.vm, -1)) { +// be_pushstring(berry.vm, topic); +// be_pushstring(berry.vm, payload); +// be_pcall(berry.vm, 0); +// be_pop(berry.vm, 3); // remove function object +// } else { +// be_pop(berry.vm, 1); // remove nil object +// } +// checkBeTop(); +// } + // call a function (if exists) of type void -> void void callBerryFunctionVoid(const char * fname) { if (nullptr == berry.vm) { return; } checkBeTop(); be_getglobal(berry.vm, fname); if (!be_isnil(berry.vm, -1)) { - // AddLog(LOG_LEVEL_DEBUG, D_LOG_BERRY "Calling '%s'", fname); be_pcall(berry.vm, 0); - be_pop(berry.vm, 1); // remove function object - } else { - // AddLog(LOG_LEVEL_DEBUG, D_LOG_BERRY "Function '%s' not found", fname); - be_pop(berry.vm, 1); // remove nil object } + be_pop(berry.vm, 1); // remove function or nil object checkBeTop(); } void test_input(void) { int i = 0; - AddLog(LOG_LEVEL_INFO, "test_input stack = 0x%08X", &i); + AddLog(LOG_LEVEL_INFO, PSTR("test_input stack = 0x%08X"), &i); callBerryFunctionVoid("noop"); } @@ -217,7 +373,7 @@ int32_t callTrampoline(void *func) { // ---------------------------------- // the call has completed normally, and `yield` was not called berry.ta_cont_ok = false; - AddLog(LOG_LEVEL_INFO, "Trampo: old stack restored"); + AddLog(LOG_LEVEL_INFO, PSTR("Trampo: old stack restored")); // printStack(); } else { // WARNING @@ -229,7 +385,7 @@ int32_t callTrampoline(void *func) { // printStack(); berry.ta_cont_ok = true; // Berry can call back Tasmota thread callBerryFunctionVoid("noop"); - AddLog(LOG_LEVEL_INFO, "Trampo: after callBerryFunctionVoid"); + AddLog(LOG_LEVEL_INFO, PSTR("Trampo: after callBerryFunctionVoid")); // printStack(); longjmp(berry.ta_cont, -1); // this part is unreachable (longjmp does not return) @@ -254,23 +410,153 @@ int32_t callTrampoline(void *func) { * \*********************************************************************************************/ -const char berry_prog[] = +const char berry_prog[] PROGMEM = + "" //"def func(x) for i:1..x print('a') end end " //"def testreal() return str(1.2+1) end " //"def noop() log('noop before'); yield(); log('middle after'); yield(); log('noop after'); end " //"log(\"foobar\") " - // - def l_getFreeHeap() return 1234 end - // - def l_log(m) print(m) end - // Simulate Tasmota module - "class Tasmota " - "def getFreeHeap() return l_getFreeHeap() end " - // "def log(m) return l_log(m) end " - "end " - "tasmota = Tasmota() " + // auto-import modules + "import string " + "import json " + "import gc " + "import tasmota " + // import alias + "import tasmota as t " - "n = 1;" - "def every_second() n = n + 1; if (n % 100 == 10) log('foobar '+str(n)+' free_heap = '+str(tasmota.getFreeHeap())) end end; " + // add `charsinstring(s:string,c:string) -> int`` + // looks for any char in c, and return the position of the first chat + // or -1 if not found + "def charsinstring(s,c) " + "for i:0..size(s)-1 " + "for j:0..size(c)-1 " + "if s[i] == c[j] return i end " + "end " + "end " + "return -1 " + "end " + + // find a key in map, case insensitive, return actual key or nil if not found + "def findkeyi(m,keyi) " + "keyu=string.toupper(keyi) " + "if classof(m) == map " + "for k:m.keys() " + "if string.toupper(k)==keyu || keyi=='?' " + "return k " + "end " + "end " + "end " + "end " + + // Rules + + "tasmota._operators='=<>!' " // operators used in rules + // Rules comparisong functions + "tasmota._eqstr=/s1,s2-> str(s1) == str(s2) " + "tasmota._neqstr=/s1,s2-> str(s1) != str(s2) " + "tasmota._eq=/f1,f2-> real(f1) == real(f2) " + "tasmota._neq=/f1,f2-> real(f1) != real(f2) " + "tasmota._gt=/f1,f2-> real(f1) > real(f2) " + "tasmota._lt=/f1,f2-> real(f1) < real(f2) " + "tasmota._ge=/f1,f2-> real(f1) >= real(f2) " + "tasmota._le=/f1,f2-> real(f1) <= real(f2) " + + "tasmota._op=[" + "['==',tasmota._eqstr]," + "['!==',tasmota._neqstr]," + "['=',tasmota._eq]," + "['!=',tasmota._neq]," + "['>=',tasmota._ge]," + "['<=',tasmota._le]," + "['>',tasmota._gt]," + "['<',tasmota._lt]," + "] " + "tasmota_rules={} " + "tasmota.rule = def(pat,f) tasmota_rules[pat] = f end " + + // # split the item when there is an operator, returns a list of (left,op,right) + // # ex: "Dimmer>50" -> ["Dimmer",tasmota_gt,"50"] + "tasmota.find_op = def (item) " + "pos = charsinstring(item, tasmota._operators) " + "if pos>=0 " + "op_split = string.split(item,pos) " + // #print(op_split) + "op_left = op_split[0] " + "op_rest = op_split[1] " + // # iterate through operators + "for op:tasmota._op " + "if string.find(op_rest,op[0]) == 0 " + "op_func = op[1] " + "op_right = string.split(op_rest,size(op[0]))[1] " + "return [op_left,op_func,op_right] " + "end " + "end " + "end " + "return [item, nil, nil] " + "end " + + // Rules trigger if match. return true if match, false if not + // Note: condition is not yet managed + "tasmota.try_rule = def (ev, rule, f) " + "rl_list = tasmota.find_op(rule) " + "e=ev " + "rl=string.split(rl_list[0],'#') " + "for it:rl " + "found=findkeyi(e,it) " + "if found == nil " + "return false " + "end " + "e=e[found] " + "end " + // # check if condition is true + "if rl_list[1] " + // # did we find a function + "if !rl_list[1](e,rl_list[2]) " + // # condition is not met + "return false " + "end " + "end " + "f(e,ev) " + "return true " + "end " + // Run rules, i.e. check each individual rule + // Returns true if at least one rule matched, false if none + "tasmota.exec_rules = def (ev_json) " + "ev = json.load(ev_json) " + "ret = false " + "if ev == nil " + "log('BRY: ERROR, bad json: '+ev_json, 3) " + "end " + "for r:tasmota_rules.keys() " + "ret = tasmota.try_rule(ev,r,tasmota_rules[r]) || ret " + "end " + "return ret " + "end " + // Not sure how to run `tasmota.exec_rules` from C code, so alias with `_exec_rules()`` + "def _exec_rules(e) return tasmota.exec_rules(e) end " + + // Timers + "tasmota_timers=[] " + "tasmota.timer = def (delay,f) tasmota_timers.push([tasmota.millis(delay),f]) end " + + "def _run_deferred() " + "i=0 " + "while ion("/" WEB_HANDLE_SCRIPT, HandleScriptConfiguration); - // Webserver->on("/ta",HTTP_POST, HandleScriptTextareaConfiguration); - // Webserver->on("/exs", HTTP_POST,[]() { Webserver->sendHeader("Location","/exs");Webserver->send(303);}, script_upload_start); - // Webserver->on("/exs", HTTP_GET, ScriptExecuteUploadSuccess); break; #endif // USE_WEBSERVER case FUNC_SAVE_BEFORE_RESTART: - // if (bitRead(Settings.rule_enabled, 0)) { - // Run_Scripter(">R", 2, 0); - // Scripter_save_pvars(); - // } break; case FUNC_MQTT_DATA: + // callBerryMqttData(); break; case FUNC_WEB_SENSOR: break; @@ -542,5 +823,4 @@ bool Xdrv52(uint8_t function) return result; } -// #endif // ESP32 #endif // USE_BERRY diff --git a/tasmota/xdrv_interface.ino b/tasmota/xdrv_interface.ino index 77c93c6da..f95c0652f 100644 --- a/tasmota/xdrv_interface.ino +++ b/tasmota/xdrv_interface.ino @@ -1081,7 +1081,14 @@ void XsnsDriverState(void) bool XdrvRulesProcess(void) { +#ifdef USE_BERRY + // events are passed to both Rules engine AND Berry engine + bool rule_handled = XdrvCallDriver(10, FUNC_RULES_PROCESS); + bool berry_handled = XdrvCallDriver(52, FUNC_RULES_PROCESS); + return rule_handled || berry_handled; +#else return XdrvCallDriver(10, FUNC_RULES_PROCESS); +#endif } #ifdef USE_DEBUG_DRIVER From 9e0df6ce7551fe436992eeb9a394a1ed7ef8b35b Mon Sep 17 00:00:00 2001 From: Stephan Hadinger Date: Sat, 13 Feb 2021 14:51:52 +0100 Subject: [PATCH 26/99] IRremoteESP8266 library from v2.7.14 to v2.7.15 --- CHANGELOG.md | 1 + .../docs/doxygen/html/annotated.html | 178 - .../html/classIRTcl112Ac__coll__graph.map | 4 - .../html/classIRTcl112Ac__coll__graph.md5 | 1 - .../html/classIRTcl112Ac__coll__graph.png | Bin 2945 -> 0 bytes .../html/classIRTechnibelAc__coll__graph.map | 4 - .../html/classIRTechnibelAc__coll__graph.md5 | 1 - .../html/classIRTechnibelAc__coll__graph.png | Bin 3199 -> 0 bytes .../html/classIRTecoAc__coll__graph.map | 4 - .../html/classIRTecoAc__coll__graph.md5 | 1 - .../html/classIRTecoAc__coll__graph.png | Bin 3054 -> 0 bytes .../html/classIRToshibaAC__coll__graph.map | 4 - .../html/classIRToshibaAC__coll__graph.md5 | 1 - .../html/classIRToshibaAC__coll__graph.png | Bin 3399 -> 0 bytes .../html/classIRTranscoldAc-members.html | 118 - .../html/classIRTranscoldAc__coll__graph.map | 4 - .../html/classIRTranscoldAc__coll__graph.md5 | 1 - .../html/classIRTranscoldAc__coll__graph.png | Bin 3498 -> 0 bytes .../docs/doxygen/html/ir__Technibel_8h.html | 704 --- .../doxygen/html/ir__Technibel_8h_source.html | 328 -- .../docs/doxygen/html/search/all_1.js | 30 - .../docs/doxygen/html/search/all_11.js | 6 - .../docs/doxygen/html/search/all_17.js | 12 - .../docs/doxygen/html/search/all_1a.js | 7 - .../docs/doxygen/html/search/all_1b.js | 4 - .../docs/doxygen/html/search/all_4.js | 136 - .../docs/doxygen/html/search/all_5.js | 39 - .../docs/doxygen/html/search/all_8.js | 36 - .../docs/doxygen/html/search/all_9.js | 198 - .../docs/doxygen/html/search/all_c.js | 19 - .../docs/doxygen/html/search/classes_0.js | 6 - .../docs/doxygen/html/search/classes_1.js | 7 - .../docs/doxygen/html/search/classes_2.js | 13 - .../docs/doxygen/html/search/classes_3.js | 4 - .../docs/doxygen/html/search/classes_4.js | 5 - .../docs/doxygen/html/search/classes_5.js | 8 - .../docs/doxygen/html/search/classes_6.js | 57 - .../docs/doxygen/html/search/classes_7.js | 4 - .../docs/doxygen/html/search/classes_8.js | 4 - .../docs/doxygen/html/search/classes_9.js | 11 - .../docs/doxygen/html/search/classes_a.js | 4 - .../docs/doxygen/html/search/classes_b.js | 4 - .../docs/doxygen/html/search/classes_c.js | 7 - .../docs/doxygen/html/search/classes_d.js | 4 - .../docs/doxygen/html/search/classes_e.js | 4 - .../docs/doxygen/html/search/enums_5.js | 4 - .../docs/doxygen/html/search/enums_7.js | 6 - .../docs/doxygen/html/search/enumvalues_3.js | 6 - .../docs/doxygen/html/search/files_0.js | 7 - .../docs/doxygen/html/search/files_1.js | 8 - .../docs/doxygen/html/search/files_2.js | 4 - .../docs/doxygen/html/search/files_3.js | 115 - .../docs/doxygen/html/search/files_4.js | 4 - .../docs/doxygen/html/search/files_5.js | 4 - .../docs/doxygen/html/search/files_6.js | 4 - .../docs/doxygen/html/search/functions_1.js | 15 - .../docs/doxygen/html/search/functions_15.js | 4 - .../docs/doxygen/html/search/functions_17.js | 4 - .../docs/doxygen/html/search/functions_4.js | 103 - .../docs/doxygen/html/search/functions_a.js | 4 - .../docs/doxygen/html/search/functions_b.js | 7 - .../docs/doxygen/html/search/functions_d.js | 4 - .../docs/doxygen/html/search/functions_f.js | 5 - .../docs/doxygen/html/search/namespaces_0.js | 4 - .../docs/doxygen/html/search/namespaces_1.js | 5 - .../docs/doxygen/html/search/namespaces_2.js | 4 - .../docs/doxygen/html/search/pages_0.js | 4 - .../docs/doxygen/html/search/pages_1.js | 5 - .../docs/doxygen/html/search/pages_2.js | 4 - .../docs/doxygen/html/search/variables_1.js | 7 - .../docs/doxygen/html/search/variables_13.js | 10 - .../docs/doxygen/html/search/variables_14.js | 8 - .../docs/doxygen/html/search/variables_15.js | 8 - .../docs/doxygen/html/search/variables_16.js | 4 - .../docs/doxygen/html/search/variables_2.js | 13 - .../docs/doxygen/html/search/variables_4.js | 14 - .../docs/doxygen/html/search/variables_7.js | 9 - .../docs/doxygen/html/search/variables_a.js | 9 - .../docs/doxygen/html/search/variables_f.js | 6 - .../examples/Web-AC-control/data/favicon.ico | Bin 16446 -> 0 bytes .../Web-AC-control/data/level_1_off.svg | 49 - .../Web-AC-control/data/level_1_on.svg | 49 - .../Web-AC-control/data/level_2_off.svg | 49 - .../Web-AC-control/data/level_2_on.svg | 49 - .../Web-AC-control/data/level_3_off.svg | 49 - .../Web-AC-control/data/level_3_on.svg | 49 - .../Web-AC-control/data/level_4_off.svg | 49 - .../Web-AC-control/data/level_4_on.svg | 49 - .../examples/Web-AC-control/data/ui.html | 109 - .../examples/Web-AC-control/data/ui.js | 132 - .../IRremoteESP8266-2.7.14/src/ir_Technibel.h | 166 - .../IRremoteESP8266-2.7.14/src/ir_Teco.h | 176 - .../.github/CONTRIBUTING.md | 0 .../.github/Contributors.md | 0 .../.github/issue_template.md | 0 .../.gitignore | 0 .../.gitmodules | 0 .../.style.yapf | 0 .../.travis.yml | 0 .../CPPLINT.cfg | 0 .../Doxyfile | 0 .../LICENSE.txt | 0 .../README.md | 6 +- .../README_de.md | 6 +- .../README_fr.md | 6 +- .../ReleaseNotes.md | 27 + .../SupportedProtocols.md | 12 +- .../assets/images/banner.svg | 142 + .../assets/images/logo.svg | 50 + .../docs/README.md | 0 .../docs/README_de.md | 0 .../docs/README_fr.md | 0 .../docs/_config.yml | 0 .../docs/doxygen/html/IRac_8cpp.html | 0 .../docs/doxygen/html/IRac_8h.html | 0 .../docs/doxygen/html/IRac_8h_source.html | 132 +- .../docs/doxygen/html/IRrecv_8cpp.html | 0 .../docs/doxygen/html/IRrecv_8h.html | 0 .../docs/doxygen/html/IRrecv_8h_source.html | 1304 ++--- .../docs/doxygen/html/IRremoteESP8266_8h.html | 91 +- .../html/IRremoteESP8266_8h_source.html | 1580 +++--- .../docs/doxygen/html/IRsend_8cpp.html | 0 .../docs/doxygen/html/IRsend_8h.html | 19 +- .../docs/doxygen/html/IRsend_8h_source.html | 1578 +++--- .../docs/doxygen/html/IRtext_8cpp.html | 0 .../docs/doxygen/html/IRtext_8h.html | 0 .../docs/doxygen/html/IRtext_8h_source.html | 0 .../docs/doxygen/html/IRtimer_8cpp.html | 0 .../docs/doxygen/html/IRtimer_8h.html | 0 .../docs/doxygen/html/IRtimer_8h_source.html | 0 .../docs/doxygen/html/IRutils_8cpp.html | 9 + .../docs/doxygen/html/IRutils_8h.html | 9 + .../docs/doxygen/html/IRutils_8h_source.html | 172 +- .../docs/doxygen/html/README_8md.html | 0 .../docs/doxygen/html/annotated.html | 183 + .../docs/doxygen/html/bc_s.png | Bin .../docs/doxygen/html/bdwn.png | Bin .../html/classIRAirwellAc-members.html | 0 .../docs/doxygen/html/classIRAirwellAc.html | 0 .../html/classIRAirwellAc__coll__graph.map | 0 .../html/classIRAirwellAc__coll__graph.md5 | 0 .../html/classIRAirwellAc__coll__graph.png | Bin .../doxygen/html/classIRAmcorAc-members.html | 0 .../docs/doxygen/html/classIRAmcorAc.html | 0 .../html/classIRAmcorAc__coll__graph.map | 0 .../html/classIRAmcorAc__coll__graph.md5 | 0 .../html/classIRAmcorAc__coll__graph.png | Bin .../doxygen/html/classIRArgoAC-members.html | 0 .../docs/doxygen/html/classIRArgoAC.html | 0 .../html/classIRArgoAC__coll__graph.map | 0 .../html/classIRArgoAC__coll__graph.md5 | 0 .../html/classIRArgoAC__coll__graph.png | Bin .../html/classIRCarrierAc64-members.html | 0 .../docs/doxygen/html/classIRCarrierAc64.html | 0 .../html/classIRCarrierAc64__coll__graph.map | 0 .../html/classIRCarrierAc64__coll__graph.md5 | 0 .../html/classIRCarrierAc64__coll__graph.png | Bin .../doxygen/html/classIRCoolixAC-members.html | 0 .../docs/doxygen/html/classIRCoolixAC.html | 0 .../html/classIRCoolixAC__coll__graph.map | 0 .../html/classIRCoolixAC__coll__graph.md5 | 0 .../html/classIRCoolixAC__coll__graph.png | Bin .../doxygen/html/classIRCoronaAc-members.html | 0 .../docs/doxygen/html/classIRCoronaAc.html | 0 .../html/classIRCoronaAc__coll__graph.map | 0 .../html/classIRCoronaAc__coll__graph.md5 | 0 .../html/classIRCoronaAc__coll__graph.png | Bin .../html/classIRDaikin128-members.html | 0 .../docs/doxygen/html/classIRDaikin128.html | 0 .../html/classIRDaikin128__coll__graph.map | 0 .../html/classIRDaikin128__coll__graph.md5 | 0 .../html/classIRDaikin128__coll__graph.png | Bin .../html/classIRDaikin152-members.html | 0 .../docs/doxygen/html/classIRDaikin152.html | 0 .../html/classIRDaikin152__coll__graph.map | 0 .../html/classIRDaikin152__coll__graph.md5 | 0 .../html/classIRDaikin152__coll__graph.png | Bin .../html/classIRDaikin160-members.html | 0 .../docs/doxygen/html/classIRDaikin160.html | 0 .../html/classIRDaikin160__coll__graph.map | 0 .../html/classIRDaikin160__coll__graph.md5 | 0 .../html/classIRDaikin160__coll__graph.png | Bin .../html/classIRDaikin176-members.html | 0 .../docs/doxygen/html/classIRDaikin176.html | 0 .../html/classIRDaikin176__coll__graph.map | 0 .../html/classIRDaikin176__coll__graph.md5 | 0 .../html/classIRDaikin176__coll__graph.png | Bin .../doxygen/html/classIRDaikin2-members.html | 0 .../docs/doxygen/html/classIRDaikin2.html | 0 .../html/classIRDaikin216-members.html | 0 .../docs/doxygen/html/classIRDaikin216.html | 0 .../html/classIRDaikin216__coll__graph.map | 0 .../html/classIRDaikin216__coll__graph.md5 | 0 .../html/classIRDaikin216__coll__graph.png | Bin .../html/classIRDaikin2__coll__graph.map | 0 .../html/classIRDaikin2__coll__graph.md5 | 0 .../html/classIRDaikin2__coll__graph.png | Bin .../doxygen/html/classIRDaikin64-members.html | 0 .../docs/doxygen/html/classIRDaikin64.html | 0 .../html/classIRDaikin64__coll__graph.map | 0 .../html/classIRDaikin64__coll__graph.md5 | 0 .../html/classIRDaikin64__coll__graph.png | Bin .../html/classIRDaikinESP-members.html | 0 .../docs/doxygen/html/classIRDaikinESP.html | 0 .../html/classIRDaikinESP__coll__graph.map | 0 .../html/classIRDaikinESP__coll__graph.md5 | 0 .../html/classIRDaikinESP__coll__graph.png | Bin .../html/classIRDelonghiAc-members.html | 0 .../docs/doxygen/html/classIRDelonghiAc.html | 0 .../html/classIRDelonghiAc__coll__graph.map | 0 .../html/classIRDelonghiAc__coll__graph.md5 | 0 .../html/classIRDelonghiAc__coll__graph.png | Bin .../html/classIRElectraAc-members.html | 0 .../docs/doxygen/html/classIRElectraAc.html | 0 .../html/classIRElectraAc__coll__graph.map | 0 .../html/classIRElectraAc__coll__graph.md5 | 0 .../html/classIRElectraAc__coll__graph.png | Bin .../html/classIRFujitsuAC-members.html | 0 .../docs/doxygen/html/classIRFujitsuAC.html | 0 .../html/classIRFujitsuAC__coll__graph.map | 0 .../html/classIRFujitsuAC__coll__graph.md5 | 0 .../html/classIRFujitsuAC__coll__graph.png | Bin .../html/classIRGoodweatherAc-members.html | 0 .../doxygen/html/classIRGoodweatherAc.html | 0 .../classIRGoodweatherAc__coll__graph.map | 0 .../classIRGoodweatherAc__coll__graph.md5 | 0 .../classIRGoodweatherAc__coll__graph.png | Bin .../doxygen/html/classIRGreeAC-members.html | 0 .../docs/doxygen/html/classIRGreeAC.html | 0 .../html/classIRGreeAC__coll__graph.map | 0 .../html/classIRGreeAC__coll__graph.md5 | 0 .../html/classIRGreeAC__coll__graph.png | Bin .../doxygen/html/classIRHaierAC-members.html | 0 .../docs/doxygen/html/classIRHaierAC.html | 0 .../html/classIRHaierACYRW02-members.html | 0 .../doxygen/html/classIRHaierACYRW02.html | 0 .../html/classIRHaierACYRW02__coll__graph.map | 0 .../html/classIRHaierACYRW02__coll__graph.md5 | 0 .../html/classIRHaierACYRW02__coll__graph.png | Bin .../html/classIRHaierAC__coll__graph.map | 0 .../html/classIRHaierAC__coll__graph.md5 | 0 .../html/classIRHaierAC__coll__graph.png | Bin .../html/classIRHitachiAc-members.html | 0 .../docs/doxygen/html/classIRHitachiAc.html | 0 .../html/classIRHitachiAc1-members.html | 0 .../docs/doxygen/html/classIRHitachiAc1.html | 0 .../html/classIRHitachiAc1__coll__graph.map | 0 .../html/classIRHitachiAc1__coll__graph.md5 | 0 .../html/classIRHitachiAc1__coll__graph.png | Bin .../html/classIRHitachiAc3-members.html | 0 .../docs/doxygen/html/classIRHitachiAc3.html | 0 .../html/classIRHitachiAc344-members.html | 0 .../doxygen/html/classIRHitachiAc344.html | 0 .../html/classIRHitachiAc344__coll__graph.map | 0 .../html/classIRHitachiAc344__coll__graph.md5 | 0 .../html/classIRHitachiAc344__coll__graph.png | Bin .../classIRHitachiAc344__inherit__graph.map | 0 .../classIRHitachiAc344__inherit__graph.md5 | 0 .../classIRHitachiAc344__inherit__graph.png | Bin .../html/classIRHitachiAc3__coll__graph.map | 0 .../html/classIRHitachiAc3__coll__graph.md5 | 0 .../html/classIRHitachiAc3__coll__graph.png | Bin .../html/classIRHitachiAc424-members.html | 0 .../doxygen/html/classIRHitachiAc424.html | 0 .../html/classIRHitachiAc424__coll__graph.map | 0 .../html/classIRHitachiAc424__coll__graph.md5 | 0 .../html/classIRHitachiAc424__coll__graph.png | Bin .../classIRHitachiAc424__inherit__graph.map | 0 .../classIRHitachiAc424__inherit__graph.md5 | 0 .../classIRHitachiAc424__inherit__graph.png | Bin .../html/classIRHitachiAc__coll__graph.map | 0 .../html/classIRHitachiAc__coll__graph.md5 | 0 .../html/classIRHitachiAc__coll__graph.png | Bin .../html/classIRKelvinatorAC-members.html | 0 .../doxygen/html/classIRKelvinatorAC.html | 0 .../html/classIRKelvinatorAC__coll__graph.map | 0 .../html/classIRKelvinatorAC__coll__graph.md5 | 0 .../html/classIRKelvinatorAC__coll__graph.png | Bin .../doxygen/html/classIRLgAc-members.html | 0 .../docs/doxygen/html/classIRLgAc.html | 0 .../doxygen/html/classIRLgAc__coll__graph.map | 0 .../doxygen/html/classIRLgAc__coll__graph.md5 | 0 .../doxygen/html/classIRLgAc__coll__graph.png | Bin .../doxygen/html/classIRMideaAC-members.html | 0 .../docs/doxygen/html/classIRMideaAC.html | 0 .../html/classIRMideaAC__coll__graph.map | 0 .../html/classIRMideaAC__coll__graph.md5 | 0 .../html/classIRMideaAC__coll__graph.png | Bin .../html/classIRMitsubishi112-members.html | 0 .../doxygen/html/classIRMitsubishi112.html | 0 .../classIRMitsubishi112__coll__graph.map | 0 .../classIRMitsubishi112__coll__graph.md5 | 0 .../classIRMitsubishi112__coll__graph.png | Bin .../html/classIRMitsubishi136-members.html | 0 .../doxygen/html/classIRMitsubishi136.html | 0 .../classIRMitsubishi136__coll__graph.map | 0 .../classIRMitsubishi136__coll__graph.md5 | 0 .../classIRMitsubishi136__coll__graph.png | Bin .../html/classIRMitsubishiAC-members.html | 34 +- .../doxygen/html/classIRMitsubishiAC.html | 85 +- .../html/classIRMitsubishiAC__coll__graph.map | 0 .../html/classIRMitsubishiAC__coll__graph.md5 | 0 .../html/classIRMitsubishiAC__coll__graph.png | Bin .../classIRMitsubishiHeavy152Ac-members.html | 0 .../html/classIRMitsubishiHeavy152Ac.html | 0 ...assIRMitsubishiHeavy152Ac__coll__graph.map | 0 ...assIRMitsubishiHeavy152Ac__coll__graph.md5 | 0 ...assIRMitsubishiHeavy152Ac__coll__graph.png | Bin .../classIRMitsubishiHeavy88Ac-members.html | 0 .../html/classIRMitsubishiHeavy88Ac.html | 0 ...lassIRMitsubishiHeavy88Ac__coll__graph.map | 0 ...lassIRMitsubishiHeavy88Ac__coll__graph.md5 | 0 ...lassIRMitsubishiHeavy88Ac__coll__graph.png | Bin .../html/classIRNeoclimaAc-members.html | 0 .../docs/doxygen/html/classIRNeoclimaAc.html | 0 .../html/classIRNeoclimaAc__coll__graph.map | 0 .../html/classIRNeoclimaAc__coll__graph.md5 | 0 .../html/classIRNeoclimaAc__coll__graph.png | Bin .../html/classIRPanasonicAc-members.html | 0 .../docs/doxygen/html/classIRPanasonicAc.html | 0 .../html/classIRPanasonicAc32-members.html | 0 .../doxygen/html/classIRPanasonicAc32.html | 0 .../classIRPanasonicAc32__coll__graph.map | 0 .../classIRPanasonicAc32__coll__graph.md5 | 0 .../classIRPanasonicAc32__coll__graph.png | Bin .../html/classIRPanasonicAc__coll__graph.map | 0 .../html/classIRPanasonicAc__coll__graph.md5 | 0 .../html/classIRPanasonicAc__coll__graph.png | Bin .../html/classIRSamsungAc-members.html | 0 .../docs/doxygen/html/classIRSamsungAc.html | 0 .../html/classIRSamsungAc__coll__graph.map | 0 .../html/classIRSamsungAc__coll__graph.md5 | 0 .../html/classIRSamsungAc__coll__graph.png | Bin .../doxygen/html/classIRSanyoAc-members.html | 0 .../docs/doxygen/html/classIRSanyoAc.html | 0 .../html/classIRSanyoAc__coll__graph.map | 0 .../html/classIRSanyoAc__coll__graph.md5 | 0 .../html/classIRSanyoAc__coll__graph.png | Bin .../doxygen/html/classIRSharpAc-members.html | 2 +- .../docs/doxygen/html/classIRSharpAc.html | 27 +- .../html/classIRSharpAc__coll__graph.map | 0 .../html/classIRSharpAc__coll__graph.md5 | 0 .../html/classIRSharpAc__coll__graph.png | Bin .../doxygen/html/classIRTcl112Ac-members.html | 48 +- .../docs/doxygen/html/classIRTcl112Ac.html | 228 +- .../html/classIRTcl112Ac__coll__graph.map | 5 + .../html/classIRTcl112Ac__coll__graph.md5 | 1 + .../html/classIRTcl112Ac__coll__graph.png | Bin 0 -> 5627 bytes .../html/classIRTechnibelAc-members.html | 58 +- .../docs/doxygen/html/classIRTechnibelAc.html | 311 +- .../html/classIRTechnibelAc__coll__graph.map | 5 + .../html/classIRTechnibelAc__coll__graph.md5 | 1 + .../html/classIRTechnibelAc__coll__graph.png | Bin 0 -> 6013 bytes .../doxygen/html/classIRTecoAc-members.html | 46 +- .../docs/doxygen/html/classIRTecoAc.html | 254 +- .../html/classIRTecoAc__coll__graph.map | 5 + .../html/classIRTecoAc__coll__graph.md5 | 1 + .../html/classIRTecoAc__coll__graph.png | Bin 0 -> 5539 bytes .../html/classIRToshibaAC-members.html | 32 +- .../docs/doxygen/html/classIRToshibaAC.html | 258 +- .../html/classIRToshibaAC__coll__graph.map | 5 + .../html/classIRToshibaAC__coll__graph.md5 | 1 + .../html/classIRToshibaAC__coll__graph.png | Bin 0 -> 6229 bytes .../html/classIRTranscoldAc-members.html | 112 + .../docs/doxygen/html/classIRTranscoldAc.html | 416 +- .../html/classIRTranscoldAc__coll__graph.map | 5 + .../html/classIRTranscoldAc__coll__graph.md5 | 1 + .../html/classIRTranscoldAc__coll__graph.png | Bin 0 -> 6296 bytes .../html/classIRTrotecESP-members.html | 0 .../docs/doxygen/html/classIRTrotecESP.html | 0 .../html/classIRTrotecESP__coll__graph.map | 0 .../html/classIRTrotecESP__coll__graph.md5 | 0 .../html/classIRTrotecESP__coll__graph.png | Bin .../doxygen/html/classIRVestelAc-members.html | 0 .../docs/doxygen/html/classIRVestelAc.html | 0 .../html/classIRVestelAc__coll__graph.map | 0 .../html/classIRVestelAc__coll__graph.md5 | 0 .../html/classIRVestelAc__coll__graph.png | Bin .../doxygen/html/classIRVoltas-members.html | 0 .../docs/doxygen/html/classIRVoltas.html | 0 .../html/classIRVoltas__coll__graph.map | 0 .../html/classIRVoltas__coll__graph.md5 | 0 .../html/classIRVoltas__coll__graph.png | Bin .../html/classIRWhirlpoolAc-members.html | 0 .../docs/doxygen/html/classIRWhirlpoolAc.html | 0 .../html/classIRWhirlpoolAc__coll__graph.map | 0 .../html/classIRWhirlpoolAc__coll__graph.md5 | 0 .../html/classIRWhirlpoolAc__coll__graph.png | Bin .../docs/doxygen/html/classIRac-members.html | 0 .../docs/doxygen/html/classIRac.html | 7 + .../doxygen/html/classIRac__coll__graph.map | 0 .../doxygen/html/classIRac__coll__graph.md5 | 0 .../doxygen/html/classIRac__coll__graph.png | Bin .../doxygen/html/classIRrecv-members.html | 56 +- .../docs/doxygen/html/classIRrecv.html | 175 +- .../doxygen/html/classIRrecv__coll__graph.map | 0 .../doxygen/html/classIRrecv__coll__graph.md5 | 0 .../doxygen/html/classIRrecv__coll__graph.png | Bin .../doxygen/html/classIRsend-members.html | 70 +- .../docs/doxygen/html/classIRsend.html | 110 +- .../doxygen/html/classIRtimer-members.html | 0 .../docs/doxygen/html/classIRtimer.html | 0 .../doxygen/html/classTimerMs-members.html | 0 .../docs/doxygen/html/classTimerMs.html | 0 .../html/classdecode__results-members.html | 0 .../doxygen/html/classdecode__results.html | 32 +- .../docs/doxygen/html/classes.html | 226 +- .../docs/doxygen/html/closed.png | Bin .../docs/doxygen/html/de-CH_8h.html | 0 .../docs/doxygen/html/de-CH_8h_source.html | 0 .../docs/doxygen/html/de-DE_8h.html | 0 .../docs/doxygen/html/de-DE_8h_source.html | 0 .../docs/doxygen/html/defaults_8h.html | 0 .../docs/doxygen/html/defaults_8h_source.html | 520 +- .../docs/doxygen/html/deprecated.html | 0 .../dir_49e56c817e5e54854c35e136979f97ca.html | 0 .../dir_68267d1309a1af8e8297ef4c3efbcdba.html | 6 + .../dir_84fe998d1eb06414cc389ad334e77e63.html | 0 .../docs/doxygen/html/doc.png | Bin .../docs/doxygen/html/doxygen.css | 0 .../docs/doxygen/html/doxygen.png | Bin .../docs/doxygen/html/doxygen__index_8md.html | 0 .../docs/doxygen/html/dynsections.js | 0 .../docs/doxygen/html/en-AU_8h.html | 0 .../docs/doxygen/html/en-AU_8h_source.html | 0 .../docs/doxygen/html/en-IE_8h.html | 0 .../docs/doxygen/html/en-IE_8h_source.html | 0 .../docs/doxygen/html/en-UK_8h.html | 0 .../docs/doxygen/html/en-UK_8h_source.html | 0 .../docs/doxygen/html/en-US_8h.html | 0 .../docs/doxygen/html/en-US_8h_source.html | 0 .../docs/doxygen/html/es-ES_8h.html | 0 .../docs/doxygen/html/es-ES_8h_source.html | 0 .../docs/doxygen/html/files.html | 182 +- .../docs/doxygen/html/folderclosed.png | Bin .../docs/doxygen/html/folderopen.png | Bin .../docs/doxygen/html/fr-FR_8h.html | 0 .../docs/doxygen/html/fr-FR_8h_source.html | 0 .../docs/doxygen/html/functions.html | 37 +- .../docs/doxygen/html/functions_a.html | 3 - .../docs/doxygen/html/functions_b.html | 4 +- .../docs/doxygen/html/functions_c.html | 2 +- .../docs/doxygen/html/functions_d.html | 6 + .../docs/doxygen/html/functions_e.html | 6 +- .../docs/doxygen/html/functions_f.html | 11 + .../docs/doxygen/html/functions_func.html | 0 .../docs/doxygen/html/functions_func_a.html | 0 .../docs/doxygen/html/functions_func_b.html | 4 +- .../docs/doxygen/html/functions_func_c.html | 2 +- .../docs/doxygen/html/functions_func_d.html | 6 + .../docs/doxygen/html/functions_func_e.html | 0 .../docs/doxygen/html/functions_func_f.html | 0 .../docs/doxygen/html/functions_func_g.html | 99 +- .../docs/doxygen/html/functions_func_h.html | 0 .../docs/doxygen/html/functions_func_i.html | 2 +- .../docs/doxygen/html/functions_func_k.html | 0 .../docs/doxygen/html/functions_func_l.html | 0 .../docs/doxygen/html/functions_func_m.html | 4 +- .../docs/doxygen/html/functions_func_n.html | 0 .../docs/doxygen/html/functions_func_o.html | 8 +- .../docs/doxygen/html/functions_func_p.html | 0 .../docs/doxygen/html/functions_func_r.html | 1 - .../docs/doxygen/html/functions_func_s.html | 20 +- .../docs/doxygen/html/functions_func_t.html | 20 +- .../docs/doxygen/html/functions_func_u.html | 3 - .../docs/doxygen/html/functions_func_v.html | 0 .../docs/doxygen/html/functions_func_w.html | 0 .../docs/doxygen/html/functions_func_~.html | 0 .../docs/doxygen/html/functions_g.html | 99 +- .../docs/doxygen/html/functions_h.html | 12 + .../docs/doxygen/html/functions_i.html | 2 +- .../docs/doxygen/html/functions_k.html | 0 .../docs/doxygen/html/functions_l.html | 10 +- .../docs/doxygen/html/functions_m.html | 14 +- .../docs/doxygen/html/functions_n.html | 0 .../docs/doxygen/html/functions_o.html | 8 +- .../docs/doxygen/html/functions_p.html | 11 +- .../docs/doxygen/html/functions_q.html | 0 .../docs/doxygen/html/functions_r.html | 11 +- .../docs/doxygen/html/functions_rela.html | 0 .../docs/doxygen/html/functions_s.html | 45 +- .../docs/doxygen/html/functions_t.html | 44 +- .../docs/doxygen/html/functions_u.html | 7 +- .../docs/doxygen/html/functions_v.html | 0 .../docs/doxygen/html/functions_vars.html | 35 + .../docs/doxygen/html/functions_vars_a.html | 3 - .../docs/doxygen/html/functions_vars_b.html | 0 .../docs/doxygen/html/functions_vars_c.html | 0 .../docs/doxygen/html/functions_vars_d.html | 0 .../docs/doxygen/html/functions_vars_e.html | 6 +- .../docs/doxygen/html/functions_vars_f.html | 11 + .../docs/doxygen/html/functions_vars_h.html | 12 + .../docs/doxygen/html/functions_vars_i.html | 0 .../docs/doxygen/html/functions_vars_l.html | 10 +- .../docs/doxygen/html/functions_vars_m.html | 10 +- .../docs/doxygen/html/functions_vars_n.html | 0 .../docs/doxygen/html/functions_vars_o.html | 0 .../docs/doxygen/html/functions_vars_p.html | 11 +- .../docs/doxygen/html/functions_vars_q.html | 0 .../docs/doxygen/html/functions_vars_r.html | 10 +- .../docs/doxygen/html/functions_vars_s.html | 25 +- .../docs/doxygen/html/functions_vars_t.html | 24 +- .../docs/doxygen/html/functions_vars_u.html | 4 + .../docs/doxygen/html/functions_vars_v.html | 0 .../docs/doxygen/html/functions_vars_w.html | 1 + .../docs/doxygen/html/functions_vars_x.html | 0 .../docs/doxygen/html/functions_vars_z.html | 0 .../docs/doxygen/html/functions_w.html | 1 + .../docs/doxygen/html/functions_x.html | 0 .../docs/doxygen/html/functions_z.html | 0 .../docs/doxygen/html/functions_~.html | 0 .../docs/doxygen/html/globals.html | 0 .../docs/doxygen/html/globals_a.html | 3 + .../docs/doxygen/html/globals_c.html | 0 .../docs/doxygen/html/globals_d.html | 0 .../docs/doxygen/html/globals_e.html | 3 + .../docs/doxygen/html/globals_enum.html | 0 .../docs/doxygen/html/globals_eval.html | 9 + .../docs/doxygen/html/globals_f.html | 0 .../docs/doxygen/html/globals_func.html | 0 .../docs/doxygen/html/globals_g.html | 0 .../docs/doxygen/html/globals_h.html | 0 .../docs/doxygen/html/globals_i.html | 0 .../docs/doxygen/html/globals_j.html | 0 .../docs/doxygen/html/globals_k.html | 470 +- .../docs/doxygen/html/globals_l.html | 0 .../docs/doxygen/html/globals_m.html | 3 + .../docs/doxygen/html/globals_n.html | 0 .../docs/doxygen/html/globals_p.html | 0 .../docs/doxygen/html/globals_r.html | 0 .../docs/doxygen/html/globals_s.html | 0 .../docs/doxygen/html/globals_t.html | 0 .../docs/doxygen/html/globals_type.html | 0 .../docs/doxygen/html/globals_u.html | 0 .../docs/doxygen/html/globals_v.html | 0 .../docs/doxygen/html/globals_vars.html | 0 .../docs/doxygen/html/globals_vars_i.html | 0 .../docs/doxygen/html/globals_vars_k.html | 462 +- .../docs/doxygen/html/globals_w.html | 0 .../docs/doxygen/html/globals_x.html | 0 .../docs/doxygen/html/globals_y.html | 0 .../docs/doxygen/html/globals_z.html | 0 .../docs/doxygen/html/graph_legend.html | 0 .../docs/doxygen/html/graph_legend.md5 | 0 .../docs/doxygen/html/graph_legend.png | Bin .../docs/doxygen/html/hierarchy.html | 99 +- .../docs/doxygen/html/i18n_8h.html | 0 .../docs/doxygen/html/i18n_8h_source.html | 0 .../docs/doxygen/html/index.html | 0 .../docs/doxygen/html/inherit_graph_0.map | 0 .../docs/doxygen/html/inherit_graph_0.md5 | 0 .../docs/doxygen/html/inherit_graph_0.png | Bin .../docs/doxygen/html/inherit_graph_1.map | 0 .../docs/doxygen/html/inherit_graph_1.md5 | 0 .../docs/doxygen/html/inherit_graph_1.png | Bin .../docs/doxygen/html/inherit_graph_10.map | 0 .../docs/doxygen/html/inherit_graph_10.md5 | 0 .../docs/doxygen/html/inherit_graph_10.png | Bin .../docs/doxygen/html/inherit_graph_100.map} | 0 .../docs/doxygen/html/inherit_graph_100.md5} | 0 .../docs/doxygen/html/inherit_graph_100.png} | Bin .../docs/doxygen/html/inherit_graph_11.map | 0 .../docs/doxygen/html/inherit_graph_11.md5 | 0 .../docs/doxygen/html/inherit_graph_11.png | Bin .../docs/doxygen/html/inherit_graph_12.map | 0 .../docs/doxygen/html/inherit_graph_12.md5 | 0 .../docs/doxygen/html/inherit_graph_12.png | Bin .../docs/doxygen/html/inherit_graph_13.map | 0 .../docs/doxygen/html/inherit_graph_13.md5 | 0 .../docs/doxygen/html/inherit_graph_13.png | Bin .../docs/doxygen/html/inherit_graph_14.map | 0 .../docs/doxygen/html/inherit_graph_14.md5 | 0 .../docs/doxygen/html/inherit_graph_14.png | Bin .../docs/doxygen/html/inherit_graph_15.map | 0 .../docs/doxygen/html/inherit_graph_15.md5 | 0 .../docs/doxygen/html/inherit_graph_15.png | Bin .../docs/doxygen/html/inherit_graph_16.map | 0 .../docs/doxygen/html/inherit_graph_16.md5 | 0 .../docs/doxygen/html/inherit_graph_16.png | Bin .../docs/doxygen/html/inherit_graph_17.map | 0 .../docs/doxygen/html/inherit_graph_17.md5 | 0 .../docs/doxygen/html/inherit_graph_17.png | Bin .../docs/doxygen/html/inherit_graph_18.map | 0 .../docs/doxygen/html/inherit_graph_18.md5 | 0 .../docs/doxygen/html/inherit_graph_18.png | Bin .../docs/doxygen/html/inherit_graph_19.map | 0 .../docs/doxygen/html/inherit_graph_19.md5 | 0 .../docs/doxygen/html/inherit_graph_19.png | Bin .../docs/doxygen/html/inherit_graph_2.map | 0 .../docs/doxygen/html/inherit_graph_2.md5 | 0 .../docs/doxygen/html/inherit_graph_2.png | Bin .../docs/doxygen/html/inherit_graph_20.map | 0 .../docs/doxygen/html/inherit_graph_20.md5 | 0 .../docs/doxygen/html/inherit_graph_20.png | Bin .../docs/doxygen/html/inherit_graph_21.map | 0 .../docs/doxygen/html/inherit_graph_21.md5 | 0 .../docs/doxygen/html/inherit_graph_21.png | Bin .../docs/doxygen/html/inherit_graph_22.map | 0 .../docs/doxygen/html/inherit_graph_22.md5 | 0 .../docs/doxygen/html/inherit_graph_22.png | Bin .../docs/doxygen/html/inherit_graph_23.map | 0 .../docs/doxygen/html/inherit_graph_23.md5 | 0 .../docs/doxygen/html/inherit_graph_23.png | Bin .../docs/doxygen/html/inherit_graph_24.map | 0 .../docs/doxygen/html/inherit_graph_24.md5 | 0 .../docs/doxygen/html/inherit_graph_24.png | Bin .../docs/doxygen/html/inherit_graph_25.map | 0 .../docs/doxygen/html/inherit_graph_25.md5 | 0 .../docs/doxygen/html/inherit_graph_25.png | Bin .../docs/doxygen/html/inherit_graph_26.map | 0 .../docs/doxygen/html/inherit_graph_26.md5 | 0 .../docs/doxygen/html/inherit_graph_26.png | Bin .../docs/doxygen/html/inherit_graph_27.map | 0 .../docs/doxygen/html/inherit_graph_27.md5 | 0 .../docs/doxygen/html/inherit_graph_27.png | Bin .../docs/doxygen/html/inherit_graph_28.map | 0 .../docs/doxygen/html/inherit_graph_28.md5 | 0 .../docs/doxygen/html/inherit_graph_28.png | Bin .../docs/doxygen/html/inherit_graph_29.map | 0 .../docs/doxygen/html/inherit_graph_29.md5 | 0 .../docs/doxygen/html/inherit_graph_29.png | Bin .../docs/doxygen/html/inherit_graph_3.map | 0 .../docs/doxygen/html/inherit_graph_3.md5 | 0 .../docs/doxygen/html/inherit_graph_3.png | Bin .../docs/doxygen/html/inherit_graph_30.map | 0 .../docs/doxygen/html/inherit_graph_30.md5 | 0 .../docs/doxygen/html/inherit_graph_30.png | Bin .../docs/doxygen/html/inherit_graph_31.map | 0 .../docs/doxygen/html/inherit_graph_31.md5 | 0 .../docs/doxygen/html/inherit_graph_31.png | Bin .../docs/doxygen/html/inherit_graph_32.map | 0 .../docs/doxygen/html/inherit_graph_32.md5 | 0 .../docs/doxygen/html/inherit_graph_32.png | Bin .../docs/doxygen/html/inherit_graph_33.map | 0 .../docs/doxygen/html/inherit_graph_33.md5 | 0 .../docs/doxygen/html/inherit_graph_33.png | Bin .../docs/doxygen/html/inherit_graph_34.map | 0 .../docs/doxygen/html/inherit_graph_34.md5 | 0 .../docs/doxygen/html/inherit_graph_34.png | Bin .../docs/doxygen/html/inherit_graph_35.map | 0 .../docs/doxygen/html/inherit_graph_35.md5 | 0 .../docs/doxygen/html/inherit_graph_35.png | Bin .../docs/doxygen/html/inherit_graph_36.map | 0 .../docs/doxygen/html/inherit_graph_36.md5 | 0 .../docs/doxygen/html/inherit_graph_36.png | Bin .../docs/doxygen/html/inherit_graph_37.map | 0 .../docs/doxygen/html/inherit_graph_37.md5 | 0 .../docs/doxygen/html/inherit_graph_37.png | Bin .../docs/doxygen/html/inherit_graph_38.map | 0 .../docs/doxygen/html/inherit_graph_38.md5 | 0 .../docs/doxygen/html/inherit_graph_38.png | Bin .../docs/doxygen/html/inherit_graph_39.map | 0 .../docs/doxygen/html/inherit_graph_39.md5 | 0 .../docs/doxygen/html/inherit_graph_39.png | Bin .../docs/doxygen/html/inherit_graph_4.map | 0 .../docs/doxygen/html/inherit_graph_4.md5 | 0 .../docs/doxygen/html/inherit_graph_4.png | Bin .../docs/doxygen/html/inherit_graph_40.map | 0 .../docs/doxygen/html/inherit_graph_40.md5 | 0 .../docs/doxygen/html/inherit_graph_40.png | Bin .../docs/doxygen/html/inherit_graph_41.map | 0 .../docs/doxygen/html/inherit_graph_41.md5 | 0 .../docs/doxygen/html/inherit_graph_41.png | Bin .../docs/doxygen/html/inherit_graph_42.map | 0 .../docs/doxygen/html/inherit_graph_42.md5 | 0 .../docs/doxygen/html/inherit_graph_42.png | Bin .../docs/doxygen/html/inherit_graph_43.map | 0 .../docs/doxygen/html/inherit_graph_43.md5 | 0 .../docs/doxygen/html/inherit_graph_43.png | Bin .../docs/doxygen/html/inherit_graph_44.map | 0 .../docs/doxygen/html/inherit_graph_44.md5 | 0 .../docs/doxygen/html/inherit_graph_44.png | Bin .../docs/doxygen/html/inherit_graph_45.map | 0 .../docs/doxygen/html/inherit_graph_45.md5 | 0 .../docs/doxygen/html/inherit_graph_45.png | Bin .../docs/doxygen/html/inherit_graph_46.map | 0 .../docs/doxygen/html/inherit_graph_46.md5 | 0 .../docs/doxygen/html/inherit_graph_46.png | Bin .../docs/doxygen/html/inherit_graph_47.map | 0 .../docs/doxygen/html/inherit_graph_47.md5 | 0 .../docs/doxygen/html/inherit_graph_47.png | Bin .../docs/doxygen/html/inherit_graph_48.map | 0 .../docs/doxygen/html/inherit_graph_48.md5 | 0 .../docs/doxygen/html/inherit_graph_48.png | Bin .../docs/doxygen/html/inherit_graph_49.map | 0 .../docs/doxygen/html/inherit_graph_49.md5 | 0 .../docs/doxygen/html/inherit_graph_49.png | Bin .../docs/doxygen/html/inherit_graph_5.map | 0 .../docs/doxygen/html/inherit_graph_5.md5 | 0 .../docs/doxygen/html/inherit_graph_5.png | Bin .../docs/doxygen/html/inherit_graph_50.map | 0 .../docs/doxygen/html/inherit_graph_50.md5 | 0 .../docs/doxygen/html/inherit_graph_50.png | Bin .../docs/doxygen/html/inherit_graph_51.map | 0 .../docs/doxygen/html/inherit_graph_51.md5 | 0 .../docs/doxygen/html/inherit_graph_51.png | Bin .../docs/doxygen/html/inherit_graph_52.map | 0 .../docs/doxygen/html/inherit_graph_52.md5 | 0 .../docs/doxygen/html/inherit_graph_52.png | Bin .../docs/doxygen/html/inherit_graph_53.map | 0 .../docs/doxygen/html/inherit_graph_53.md5 | 0 .../docs/doxygen/html/inherit_graph_53.png | Bin .../docs/doxygen/html/inherit_graph_54.map | 0 .../docs/doxygen/html/inherit_graph_54.md5 | 0 .../docs/doxygen/html/inherit_graph_54.png | Bin .../docs/doxygen/html/inherit_graph_55.map | 0 .../docs/doxygen/html/inherit_graph_55.md5 | 0 .../docs/doxygen/html/inherit_graph_55.png | Bin .../docs/doxygen/html/inherit_graph_56.map | 0 .../docs/doxygen/html/inherit_graph_56.md5 | 0 .../docs/doxygen/html/inherit_graph_56.png | Bin .../docs/doxygen/html/inherit_graph_57.map | 0 .../docs/doxygen/html/inherit_graph_57.md5 | 0 .../docs/doxygen/html/inherit_graph_57.png | Bin .../docs/doxygen/html/inherit_graph_58.map | 0 .../docs/doxygen/html/inherit_graph_58.md5 | 0 .../docs/doxygen/html/inherit_graph_58.png | Bin .../docs/doxygen/html/inherit_graph_59.map | 0 .../docs/doxygen/html/inherit_graph_59.md5 | 0 .../docs/doxygen/html/inherit_graph_59.png | Bin .../docs/doxygen/html/inherit_graph_6.map | 0 .../docs/doxygen/html/inherit_graph_6.md5 | 0 .../docs/doxygen/html/inherit_graph_6.png | Bin .../docs/doxygen/html/inherit_graph_60.map | 0 .../docs/doxygen/html/inherit_graph_60.md5 | 0 .../docs/doxygen/html/inherit_graph_60.png | Bin .../docs/doxygen/html/inherit_graph_61.map | 0 .../docs/doxygen/html/inherit_graph_61.md5 | 0 .../docs/doxygen/html/inherit_graph_61.png | Bin .../docs/doxygen/html/inherit_graph_62.map | 0 .../docs/doxygen/html/inherit_graph_62.md5 | 0 .../docs/doxygen/html/inherit_graph_62.png | Bin .../docs/doxygen/html/inherit_graph_63.map | 0 .../docs/doxygen/html/inherit_graph_63.md5 | 0 .../docs/doxygen/html/inherit_graph_63.png | Bin .../docs/doxygen/html/inherit_graph_64.map | 0 .../docs/doxygen/html/inherit_graph_64.md5 | 0 .../docs/doxygen/html/inherit_graph_64.png | Bin .../docs/doxygen/html/inherit_graph_65.map | 0 .../docs/doxygen/html/inherit_graph_65.md5 | 0 .../docs/doxygen/html/inherit_graph_65.png | Bin .../docs/doxygen/html/inherit_graph_66.map | 0 .../docs/doxygen/html/inherit_graph_66.md5 | 0 .../docs/doxygen/html/inherit_graph_66.png | Bin .../docs/doxygen/html/inherit_graph_67.map | 0 .../docs/doxygen/html/inherit_graph_67.md5 | 0 .../docs/doxygen/html/inherit_graph_67.png | Bin .../docs/doxygen/html/inherit_graph_68.map | 0 .../docs/doxygen/html/inherit_graph_68.md5 | 0 .../docs/doxygen/html/inherit_graph_68.png | Bin .../docs/doxygen/html/inherit_graph_69.map | 0 .../docs/doxygen/html/inherit_graph_69.md5 | 0 .../docs/doxygen/html/inherit_graph_69.png | Bin .../docs/doxygen/html/inherit_graph_7.map | 0 .../docs/doxygen/html/inherit_graph_7.md5 | 0 .../docs/doxygen/html/inherit_graph_7.png | Bin .../docs/doxygen/html/inherit_graph_70.map | 0 .../docs/doxygen/html/inherit_graph_70.md5 | 0 .../docs/doxygen/html/inherit_graph_70.png | Bin .../docs/doxygen/html/inherit_graph_71.map | 0 .../docs/doxygen/html/inherit_graph_71.md5 | 0 .../docs/doxygen/html/inherit_graph_71.png | Bin .../docs/doxygen/html/inherit_graph_72.map | 0 .../docs/doxygen/html/inherit_graph_72.md5 | 0 .../docs/doxygen/html/inherit_graph_72.png | Bin .../docs/doxygen/html/inherit_graph_73.map | 0 .../docs/doxygen/html/inherit_graph_73.md5 | 0 .../docs/doxygen/html/inherit_graph_73.png | Bin .../docs/doxygen/html/inherit_graph_74.map | 0 .../docs/doxygen/html/inherit_graph_74.md5 | 0 .../docs/doxygen/html/inherit_graph_74.png | Bin .../docs/doxygen/html/inherit_graph_75.map | 0 .../docs/doxygen/html/inherit_graph_75.md5 | 0 .../docs/doxygen/html/inherit_graph_75.png | Bin .../docs/doxygen/html/inherit_graph_76.map | 0 .../docs/doxygen/html/inherit_graph_76.md5 | 0 .../docs/doxygen/html/inherit_graph_76.png | Bin .../docs/doxygen/html/inherit_graph_77.map | 0 .../docs/doxygen/html/inherit_graph_77.md5 | 0 .../docs/doxygen/html/inherit_graph_77.png | Bin .../docs/doxygen/html/inherit_graph_78.map | 0 .../docs/doxygen/html/inherit_graph_78.md5 | 0 .../docs/doxygen/html/inherit_graph_78.png | Bin .../docs/doxygen/html/inherit_graph_79.map | 0 .../docs/doxygen/html/inherit_graph_79.md5 | 0 .../docs/doxygen/html/inherit_graph_79.png | Bin .../docs/doxygen/html/inherit_graph_8.map | 0 .../docs/doxygen/html/inherit_graph_8.md5 | 0 .../docs/doxygen/html/inherit_graph_8.png | Bin .../docs/doxygen/html/inherit_graph_80.map | 0 .../docs/doxygen/html/inherit_graph_80.md5 | 0 .../docs/doxygen/html/inherit_graph_80.png | Bin .../docs/doxygen/html/inherit_graph_81.map | 0 .../docs/doxygen/html/inherit_graph_81.md5 | 0 .../docs/doxygen/html/inherit_graph_81.png | Bin .../docs/doxygen/html/inherit_graph_82.map | 0 .../docs/doxygen/html/inherit_graph_82.md5 | 0 .../docs/doxygen/html/inherit_graph_82.png | Bin .../docs/doxygen/html/inherit_graph_83.map | 0 .../docs/doxygen/html/inherit_graph_83.md5 | 0 .../docs/doxygen/html/inherit_graph_83.png | Bin .../docs/doxygen/html/inherit_graph_84.map | 0 .../docs/doxygen/html/inherit_graph_84.md5 | 0 .../docs/doxygen/html/inherit_graph_84.png | Bin .../docs/doxygen/html/inherit_graph_85.map | 0 .../docs/doxygen/html/inherit_graph_85.md5 | 0 .../docs/doxygen/html/inherit_graph_85.png | Bin .../docs/doxygen/html/inherit_graph_86.map | 0 .../docs/doxygen/html/inherit_graph_86.md5 | 0 .../docs/doxygen/html/inherit_graph_86.png | Bin .../docs/doxygen/html/inherit_graph_87.map | 0 .../docs/doxygen/html/inherit_graph_87.md5 | 0 .../docs/doxygen/html/inherit_graph_87.png | Bin .../docs/doxygen/html/inherit_graph_88.map | 0 .../docs/doxygen/html/inherit_graph_88.md5 | 0 .../docs/doxygen/html/inherit_graph_88.png | Bin .../docs/doxygen/html/inherit_graph_89.map | 0 .../docs/doxygen/html/inherit_graph_89.md5 | 0 .../docs/doxygen/html/inherit_graph_89.png | Bin .../docs/doxygen/html/inherit_graph_9.map | 0 .../docs/doxygen/html/inherit_graph_9.md5 | 0 .../docs/doxygen/html/inherit_graph_9.png | Bin .../docs/doxygen/html/inherit_graph_90.map | 0 .../docs/doxygen/html/inherit_graph_90.md5 | 0 .../docs/doxygen/html/inherit_graph_90.png | Bin .../docs/doxygen/html/inherit_graph_91.map | 0 .../docs/doxygen/html/inherit_graph_91.md5 | 0 .../docs/doxygen/html/inherit_graph_91.png | Bin .../docs/doxygen/html/inherit_graph_92.map | 0 .../docs/doxygen/html/inherit_graph_92.md5 | 0 .../docs/doxygen/html/inherit_graph_92.png | Bin .../docs/doxygen/html/inherit_graph_93.map | 0 .../docs/doxygen/html/inherit_graph_93.md5 | 0 .../docs/doxygen/html/inherit_graph_93.png | Bin .../docs/doxygen/html/inherit_graph_94.map | 3 + .../docs/doxygen/html/inherit_graph_94.md5 | 1 + .../docs/doxygen/html/inherit_graph_94.png | Bin 0 -> 1185 bytes .../docs/doxygen/html/inherit_graph_95.map | 3 + .../docs/doxygen/html/inherit_graph_95.md5 | 1 + .../docs/doxygen/html/inherit_graph_95.png | Bin 0 -> 1443 bytes .../docs/doxygen/html/inherit_graph_96.map | 3 + .../docs/doxygen/html/inherit_graph_96.md5 | 1 + .../docs/doxygen/html/inherit_graph_96.png | Bin 0 -> 1141 bytes .../docs/doxygen/html/inherit_graph_97.map} | 0 .../docs/doxygen/html/inherit_graph_97.md5} | 0 .../docs/doxygen/html/inherit_graph_97.png} | Bin .../docs/doxygen/html/inherit_graph_98.map | 3 + .../docs/doxygen/html/inherit_graph_98.md5 | 1 + .../docs/doxygen/html/inherit_graph_98.png | Bin 0 -> 1518 bytes .../docs/doxygen/html/inherit_graph_99.map | 3 + .../docs/doxygen/html/inherit_graph_99.md5 | 1 + .../docs/doxygen/html/inherit_graph_99.png | Bin 0 -> 1527 bytes .../docs/doxygen/html/inherits.html | 29 +- .../docs/doxygen/html/ir__Airwell_8cpp.html | 0 .../docs/doxygen/html/ir__Airwell_8h.html | 0 .../doxygen/html/ir__Airwell_8h_source.html | 6 +- .../docs/doxygen/html/ir__Aiwa_8cpp.html | 0 .../docs/doxygen/html/ir__Amcor_8cpp.html | 0 .../docs/doxygen/html/ir__Amcor_8h.html | 0 .../doxygen/html/ir__Amcor_8h_source.html | 8 +- .../docs/doxygen/html/ir__Argo_8cpp.html | 0 .../docs/doxygen/html/ir__Argo_8h.html | 0 .../docs/doxygen/html/ir__Argo_8h_source.html | 8 +- .../docs/doxygen/html/ir__Carrier_8cpp.html | 0 .../docs/doxygen/html/ir__Carrier_8h.html | 0 .../doxygen/html/ir__Carrier_8h_source.html | 6 +- .../docs/doxygen/html/ir__Coolix_8cpp.html | 0 .../docs/doxygen/html/ir__Coolix_8h.html | 0 .../doxygen/html/ir__Coolix_8h_source.html | 6 +- .../docs/doxygen/html/ir__Corona_8cpp.html | 0 .../docs/doxygen/html/ir__Corona_8h.html | 0 .../doxygen/html/ir__Corona_8h_source.html | 8 +- .../docs/doxygen/html/ir__Daikin_8cpp.html | 0 .../docs/doxygen/html/ir__Daikin_8h.html | 134 +- .../doxygen/html/ir__Daikin_8h_source.html | 2905 +++++------ .../docs/doxygen/html/ir__Delonghi_8cpp.html | 0 .../docs/doxygen/html/ir__Delonghi_8h.html | 0 .../doxygen/html/ir__Delonghi_8h_source.html | 6 +- .../docs/doxygen/html/ir__Denon_8cpp.html | 2 +- .../docs/doxygen/html/ir__Dish_8cpp.html | 0 .../docs/doxygen/html/ir__Doshisha_8cpp.html | 0 .../docs/doxygen/html/ir__EcoClim_8cpp.html | 258 + .../docs/doxygen/html/ir__Electra_8cpp.html | 0 .../docs/doxygen/html/ir__Electra_8h.html | 0 .../doxygen/html/ir__Electra_8h_source.html | 8 +- .../doxygen/html/ir__EliteScreens_8cpp.html | 0 .../docs/doxygen/html/ir__Epson_8cpp.html | 0 .../docs/doxygen/html/ir__Fujitsu_8cpp.html | 2 + .../docs/doxygen/html/ir__Fujitsu_8h.html | 2 + .../doxygen/html/ir__Fujitsu_8h_source.html | 596 +-- .../docs/doxygen/html/ir__GICable_8cpp.html | 2 +- .../doxygen/html/ir__GlobalCache_8cpp.html | 0 .../doxygen/html/ir__Goodweather_8cpp.html | 0 .../docs/doxygen/html/ir__Goodweather_8h.html | 0 .../html/ir__Goodweather_8h_source.html | 6 +- .../docs/doxygen/html/ir__Gree_8cpp.html | 0 .../docs/doxygen/html/ir__Gree_8h.html | 0 .../docs/doxygen/html/ir__Gree_8h_source.html | 12 +- .../docs/doxygen/html/ir__Haier_8cpp.html | 0 .../docs/doxygen/html/ir__Haier_8h.html | 0 .../doxygen/html/ir__Haier_8h_source.html | 12 +- .../docs/doxygen/html/ir__Hitachi_8cpp.html | 0 .../docs/doxygen/html/ir__Hitachi_8h.html | 0 .../doxygen/html/ir__Hitachi_8h_source.html | 18 +- .../docs/doxygen/html/ir__Inax_8cpp.html | 0 .../docs/doxygen/html/ir__JVC_8cpp.html | 4 +- .../doxygen/html/ir__Kelvinator_8cpp.html | 0 .../docs/doxygen/html/ir__Kelvinator_8h.html | 0 .../html/ir__Kelvinator_8h_source.html | 8 +- .../docs/doxygen/html/ir__LG_8cpp.html | 0 .../docs/doxygen/html/ir__LG_8h.html | 0 .../docs/doxygen/html/ir__LG_8h_source.html | 10 +- .../docs/doxygen/html/ir__Lasertag_8cpp.html | 0 .../docs/doxygen/html/ir__Lego_8cpp.html | 0 .../docs/doxygen/html/ir__Lutron_8cpp.html | 0 .../docs/doxygen/html/ir__MWM_8cpp.html | 0 .../docs/doxygen/html/ir__Magiquest_8cpp.html | 0 .../docs/doxygen/html/ir__Magiquest_8h.html | 0 .../doxygen/html/ir__Magiquest_8h_source.html | 0 .../docs/doxygen/html/ir__Metz_8cpp.html | 0 .../docs/doxygen/html/ir__Midea_8cpp.html | 0 .../docs/doxygen/html/ir__Midea_8h.html | 0 .../doxygen/html/ir__Midea_8h_source.html | 6 +- .../docs/doxygen/html/ir__MilesTag2_8cpp.html | 273 + .../docs/doxygen/html/ir__Mirage_8cpp.html | 0 .../html/ir__MitsubishiHeavy_8cpp.html | 0 .../doxygen/html/ir__MitsubishiHeavy_8h.html | 0 .../html/ir__MitsubishiHeavy_8h_source.html | 186 +- .../doxygen/html/ir__Mitsubishi_8cpp.html | 10 +- .../docs/doxygen/html/ir__Mitsubishi_8h.html | 230 +- .../html/ir__Mitsubishi_8h_source.html | 1183 ++--- .../doxygen/html/ir__Multibrackets_8cpp.html | 0 .../docs/doxygen/html/ir__NEC_8cpp.html | 2 +- .../docs/doxygen/html/ir__NEC_8h.html | 4 +- .../docs/doxygen/html/ir__NEC_8h_source.html | 2 +- .../docs/doxygen/html/ir__Neoclima_8cpp.html | 0 .../docs/doxygen/html/ir__Neoclima_8h.html | 0 .../doxygen/html/ir__Neoclima_8h_source.html | 8 +- .../docs/doxygen/html/ir__Nikai_8cpp.html | 0 .../docs/doxygen/html/ir__Panasonic_8cpp.html | 0 .../docs/doxygen/html/ir__Panasonic_8h.html | 0 .../doxygen/html/ir__Panasonic_8h_source.html | 170 +- .../docs/doxygen/html/ir__Pioneer_8cpp.html | 0 .../docs/doxygen/html/ir__Pronto_8cpp.html | 0 .../docs/doxygen/html/ir__RC5__RC6_8cpp.html | 2 +- .../docs/doxygen/html/ir__RCMM_8cpp.html | 2 +- .../docs/doxygen/html/ir__Samsung_8cpp.html | 2 +- .../docs/doxygen/html/ir__Samsung_8h.html | 0 .../doxygen/html/ir__Samsung_8h_source.html | 10 +- .../docs/doxygen/html/ir__Sanyo_8cpp.html | 14 +- .../docs/doxygen/html/ir__Sanyo_8h.html | 0 .../doxygen/html/ir__Sanyo_8h_source.html | 86 +- .../docs/doxygen/html/ir__Sharp_8cpp.html | 6 +- .../docs/doxygen/html/ir__Sharp_8h.html | 8 +- .../doxygen/html/ir__Sharp_8h_source.html | 613 +-- .../docs/doxygen/html/ir__Sherwood_8cpp.html | 0 .../docs/doxygen/html/ir__Sony_8cpp.html | 2 +- .../docs/doxygen/html/ir__Symphony_8cpp.html | 0 .../docs/doxygen/html/ir__Tcl_8cpp.html | 0 .../docs/doxygen/html/ir__Tcl_8h.html | 179 +- .../docs/doxygen/html/ir__Tcl_8h_source.html | 378 +- .../docs/doxygen/html/ir__Technibel_8cpp.html | 0 .../docs/doxygen/html/ir__Technibel_8h.html | 379 ++ .../doxygen/html/ir__Technibel_8h_source.html | 294 ++ .../docs/doxygen/html/ir__Teco_8cpp.html | 0 .../docs/doxygen/html/ir__Teco_8h.html | 275 +- .../docs/doxygen/html/ir__Teco_8h_source.html | 390 +- .../docs/doxygen/html/ir__Toshiba_8cpp.html | 0 .../docs/doxygen/html/ir__Toshiba_8h.html | 217 +- .../doxygen/html/ir__Toshiba_8h_source.html | 409 +- .../docs/doxygen/html/ir__Transcold_8cpp.html | 0 .../docs/doxygen/html/ir__Transcold_8h.html | 83 +- .../doxygen/html/ir__Transcold_8h_source.html | 456 +- .../docs/doxygen/html/ir__Trotec_8cpp.html | 0 .../docs/doxygen/html/ir__Trotec_8h.html | 0 .../doxygen/html/ir__Trotec_8h_source.html | 8 +- .../docs/doxygen/html/ir__Vestel_8cpp.html | 0 .../docs/doxygen/html/ir__Vestel_8h.html | 0 .../doxygen/html/ir__Vestel_8h_source.html | 6 +- .../docs/doxygen/html/ir__Voltas_8cpp.html | 0 .../docs/doxygen/html/ir__Voltas_8h.html | 0 .../doxygen/html/ir__Voltas_8h_source.html | 10 +- .../docs/doxygen/html/ir__Whirlpool_8cpp.html | 0 .../docs/doxygen/html/ir__Whirlpool_8h.html | 0 .../doxygen/html/ir__Whirlpool_8h_source.html | 10 +- .../docs/doxygen/html/ir__Whynter_8cpp.html | 2 +- .../docs/doxygen/html/ir__Zepeal_8cpp.html | 0 .../docs/doxygen/html/it-IT_8h.html | 0 .../docs/doxygen/html/it-IT_8h_source.html | 0 .../docs/doxygen/html/jquery.js | 0 .../doxygen/html/md_src_locale_README.html | 0 .../docs/doxygen/html/menu.js | 0 .../docs/doxygen/html/menudata.js | 0 .../docs/doxygen/html/namespaceIRAcUtils.html | 0 .../docs/doxygen/html/namespace__IRrecv.html | 0 .../docs/doxygen/html/namespaceirutils.html | 277 + .../docs/doxygen/html/namespacemembers.html | 9 + .../doxygen/html/namespacemembers_enum.html | 0 .../doxygen/html/namespacemembers_func.html | 9 + .../doxygen/html/namespacemembers_vars.html | 0 .../docs/doxygen/html/namespaces.html | 0 .../docs/doxygen/html/namespacestdAc.html | 0 .../docs/doxygen/html/nav_f.png | Bin .../docs/doxygen/html/nav_g.png | Bin .../docs/doxygen/html/nav_h.png | Bin .../docs/doxygen/html/open.png | Bin .../docs/doxygen/html/pages.html | 0 .../docs/doxygen/html/pt-BR_8h.html | 0 .../docs/doxygen/html/pt-BR_8h_source.html | 0 .../docs/doxygen/html/search/all_0.html | 0 .../docs/doxygen/html/search/all_0.js | 79 +- .../docs/doxygen/html/search/all_1.html | 0 .../docs/doxygen/html/search/all_1.js | 34 + .../docs/doxygen/html/search/all_10.html | 0 .../docs/doxygen/html/search/all_10.js | 65 +- .../docs/doxygen/html/search/all_11.html | 0 .../docs/doxygen/html/search/all_11.js | 6 + .../docs/doxygen/html/search/all_12.html | 0 .../docs/doxygen/html/search/all_12.js | 52 +- .../docs/doxygen/html/search/all_13.html | 0 .../docs/doxygen/html/search/all_13.js | 273 +- .../docs/doxygen/html/search/all_14.html | 0 .../docs/doxygen/html/search/all_14.js | 88 +- .../docs/doxygen/html/search/all_15.html | 0 .../docs/doxygen/html/search/all_15.js | 24 +- .../docs/doxygen/html/search/all_16.html | 0 .../docs/doxygen/html/search/all_16.js | 24 +- .../docs/doxygen/html/search/all_17.html | 0 .../docs/doxygen/html/search/all_17.js | 12 + .../docs/doxygen/html/search/all_18.html | 0 .../docs/doxygen/html/search/all_18.js | 4 +- .../docs/doxygen/html/search/all_19.html | 0 .../docs/doxygen/html/search/all_19.js | 4 +- .../docs/doxygen/html/search/all_1a.html | 0 .../docs/doxygen/html/search/all_1a.js | 7 + .../docs/doxygen/html/search/all_1b.html | 0 .../docs/doxygen/html/search/all_1b.js | 4 + .../docs/doxygen/html/search/all_2.html | 0 .../docs/doxygen/html/search/all_2.js | 30 +- .../docs/doxygen/html/search/all_3.html | 0 .../docs/doxygen/html/search/all_3.js | 118 +- .../docs/doxygen/html/search/all_4.html | 0 .../docs/doxygen/html/search/all_4.js | 138 + .../docs/doxygen/html/search/all_5.html | 0 .../docs/doxygen/html/search/all_5.js | 41 + .../docs/doxygen/html/search/all_6.html | 0 .../docs/doxygen/html/search/all_6.js | 42 +- .../docs/doxygen/html/search/all_7.html | 0 .../docs/doxygen/html/search/all_7.js | 251 +- .../docs/doxygen/html/search/all_8.html | 0 .../docs/doxygen/html/search/all_8.js | 39 + .../docs/doxygen/html/search/all_9.html | 0 .../docs/doxygen/html/search/all_9.js | 200 + .../docs/doxygen/html/search/all_a.html | 0 .../docs/doxygen/html/search/all_a.js | 2 +- .../docs/doxygen/html/search/all_b.html | 0 .../docs/doxygen/html/search/all_b.js | 4474 ++++++++--------- .../docs/doxygen/html/search/all_c.html | 0 .../docs/doxygen/html/search/all_c.js | 21 + .../docs/doxygen/html/search/all_d.html | 0 .../docs/doxygen/html/search/all_d.js | 98 +- .../docs/doxygen/html/search/all_e.html | 0 .../docs/doxygen/html/search/all_e.js | 14 +- .../docs/doxygen/html/search/all_f.html | 0 .../docs/doxygen/html/search/all_f.js | 64 +- .../docs/doxygen/html/search/classes_0.html | 0 .../docs/doxygen/html/search/classes_0.js | 6 + .../docs/doxygen/html/search/classes_1.html | 0 .../docs/doxygen/html/search/classes_1.js | 7 + .../docs/doxygen/html/search/classes_2.html | 0 .../docs/doxygen/html/search/classes_2.js | 13 + .../docs/doxygen/html/search/classes_3.html | 0 .../docs/doxygen/html/search/classes_3.js | 4 + .../docs/doxygen/html/search/classes_4.html | 0 .../docs/doxygen/html/search/classes_4.js | 5 + .../docs/doxygen/html/search/classes_5.html | 0 .../docs/doxygen/html/search/classes_5.js | 8 + .../docs/doxygen/html/search/classes_6.html | 0 .../docs/doxygen/html/search/classes_6.js | 57 + .../docs/doxygen/html/search/classes_7.html | 0 .../docs/doxygen/html/search/classes_7.js | 4 + .../docs/doxygen/html/search/classes_8.html | 0 .../docs/doxygen/html/search/classes_8.js | 4 + .../docs/doxygen/html/search/classes_9.html | 0 .../docs/doxygen/html/search/classes_9.js | 11 + .../docs/doxygen/html/search/classes_a.html | 0 .../docs/doxygen/html/search/classes_a.js | 4 + .../docs/doxygen/html/search/classes_b.html | 0 .../docs/doxygen/html/search/classes_b.js | 4 + .../docs/doxygen/html/search/classes_c.html | 0 .../docs/doxygen/html/search/classes_c.js | 7 + .../docs/doxygen/html/search/classes_d.html | 0 .../docs/doxygen/html/search/classes_d.js | 9 + .../docs/doxygen/html/search/classes_e.html | 0 .../docs/doxygen/html/search/classes_e.js | 4 + .../docs/doxygen/html/search/close.png | Bin .../docs/doxygen/html/search/enums_0.html | 0 .../docs/doxygen/html/search/enums_0.js | 2 +- .../docs/doxygen/html/search/enums_1.html | 0 .../docs/doxygen/html/search/enums_1.js | 4 +- .../docs/doxygen/html/search/enums_2.html | 0 .../docs/doxygen/html/search/enums_2.js | 2 +- .../docs/doxygen/html/search/enums_3.html | 0 .../docs/doxygen/html/search/enums_3.js | 2 +- .../docs/doxygen/html/search/enums_4.html | 0 .../docs/doxygen/html/search/enums_4.js | 2 +- .../docs/doxygen/html/search/enums_5.html | 0 .../docs/doxygen/html/search/enums_5.js | 4 + .../docs/doxygen/html/search/enums_6.html | 0 .../docs/doxygen/html/search/enums_6.js | 2 +- .../docs/doxygen/html/search/enums_7.html | 0 .../docs/doxygen/html/search/enums_7.js | 6 + .../docs/doxygen/html/search/enums_8.html | 0 .../docs/doxygen/html/search/enums_8.js | 2 +- .../docs/doxygen/html/search/enums_9.html | 0 .../docs/doxygen/html/search/enums_9.js | 2 +- .../doxygen/html/search/enumvalues_0.html | 0 .../docs/doxygen/html/search/enumvalues_0.js | 25 +- .../doxygen/html/search/enumvalues_1.html | 0 .../docs/doxygen/html/search/enumvalues_1.js | 10 +- .../doxygen/html/search/enumvalues_10.html | 0 .../docs/doxygen/html/search/enumvalues_10.js | 12 +- .../doxygen/html/search/enumvalues_11.html | 0 .../docs/doxygen/html/search/enumvalues_11.js | 4 +- .../doxygen/html/search/enumvalues_12.html | 0 .../docs/doxygen/html/search/enumvalues_12.js | 4 +- .../doxygen/html/search/enumvalues_13.html | 0 .../docs/doxygen/html/search/enumvalues_13.js | 4 +- .../doxygen/html/search/enumvalues_14.html | 0 .../docs/doxygen/html/search/enumvalues_14.js | 4 +- .../doxygen/html/search/enumvalues_15.html | 0 .../docs/doxygen/html/search/enumvalues_15.js | 2 +- .../doxygen/html/search/enumvalues_2.html | 0 .../docs/doxygen/html/search/enumvalues_2.js | 28 +- .../doxygen/html/search/enumvalues_3.html | 0 .../docs/doxygen/html/search/enumvalues_3.js | 7 + .../doxygen/html/search/enumvalues_4.html | 0 .../docs/doxygen/html/search/enumvalues_4.js | 2 +- .../doxygen/html/search/enumvalues_5.html | 0 .../docs/doxygen/html/search/enumvalues_5.js | 10 +- .../doxygen/html/search/enumvalues_6.html | 0 .../docs/doxygen/html/search/enumvalues_6.js | 16 +- .../doxygen/html/search/enumvalues_7.html | 0 .../docs/doxygen/html/search/enumvalues_7.js | 2 +- .../doxygen/html/search/enumvalues_8.html | 0 .../docs/doxygen/html/search/enumvalues_8.js | 2 +- .../doxygen/html/search/enumvalues_9.html | 0 .../docs/doxygen/html/search/enumvalues_9.js | 68 +- .../doxygen/html/search/enumvalues_a.html | 0 .../docs/doxygen/html/search/enumvalues_a.js | 10 +- .../doxygen/html/search/enumvalues_b.html | 0 .../docs/doxygen/html/search/enumvalues_b.js | 29 +- .../doxygen/html/search/enumvalues_c.html | 0 .../docs/doxygen/html/search/enumvalues_c.js | 8 +- .../doxygen/html/search/enumvalues_d.html | 0 .../docs/doxygen/html/search/enumvalues_d.js | 10 +- .../doxygen/html/search/enumvalues_e.html | 0 .../docs/doxygen/html/search/enumvalues_e.js | 14 +- .../doxygen/html/search/enumvalues_f.html | 0 .../docs/doxygen/html/search/enumvalues_f.js | 24 +- .../docs/doxygen/html/search/files_0.html | 0 .../docs/doxygen/html/search/files_0.js | 7 + .../docs/doxygen/html/search/files_1.html | 0 .../docs/doxygen/html/search/files_1.js | 8 + .../docs/doxygen/html/search/files_2.html | 0 .../docs/doxygen/html/search/files_2.js | 4 + .../docs/doxygen/html/search/files_3.html | 0 .../docs/doxygen/html/search/files_3.js | 117 + .../docs/doxygen/html/search/files_4.html | 0 .../docs/doxygen/html/search/files_4.js | 4 + .../docs/doxygen/html/search/files_5.html | 0 .../docs/doxygen/html/search/files_5.js | 4 + .../docs/doxygen/html/search/files_6.html | 0 .../docs/doxygen/html/search/files_6.js | 4 + .../docs/doxygen/html/search/functions_0.html | 0 .../docs/doxygen/html/search/functions_0.js | 34 +- .../docs/doxygen/html/search/functions_1.html | 0 .../docs/doxygen/html/search/functions_1.js | 18 + .../doxygen/html/search/functions_10.html | 0 .../docs/doxygen/html/search/functions_10.js | 20 +- .../doxygen/html/search/functions_11.html | 0 .../docs/doxygen/html/search/functions_11.js | 469 +- .../doxygen/html/search/functions_12.html | 0 .../docs/doxygen/html/search/functions_12.js | 42 +- .../doxygen/html/search/functions_13.html | 0 .../docs/doxygen/html/search/functions_13.js | 7 +- .../doxygen/html/search/functions_14.html | 0 .../docs/doxygen/html/search/functions_14.js | 8 +- .../doxygen/html/search/functions_15.html | 0 .../docs/doxygen/html/search/functions_15.js | 4 + .../doxygen/html/search/functions_16.html | 0 .../docs/doxygen/html/search/functions_16.js | 2 +- .../doxygen/html/search/functions_17.html | 0 .../docs/doxygen/html/search/functions_17.js | 4 + .../docs/doxygen/html/search/functions_2.html | 0 .../docs/doxygen/html/search/functions_2.js | 10 +- .../docs/doxygen/html/search/functions_3.html | 0 .../docs/doxygen/html/search/functions_3.js | 66 +- .../docs/doxygen/html/search/functions_4.html | 0 .../docs/doxygen/html/search/functions_4.js | 105 + .../docs/doxygen/html/search/functions_5.html | 0 .../docs/doxygen/html/search/functions_5.js | 48 +- .../docs/doxygen/html/search/functions_6.html | 0 .../docs/doxygen/html/search/functions_6.js | 10 +- .../docs/doxygen/html/search/functions_7.html | 0 .../docs/doxygen/html/search/functions_7.js | 239 +- .../docs/doxygen/html/search/functions_8.html | 0 .../docs/doxygen/html/search/functions_8.js | 24 +- .../docs/doxygen/html/search/functions_9.html | 0 .../docs/doxygen/html/search/functions_9.js | 144 +- .../docs/doxygen/html/search/functions_a.html | 0 .../docs/doxygen/html/search/functions_a.js | 4 + .../docs/doxygen/html/search/functions_b.html | 0 .../docs/doxygen/html/search/functions_b.js | 7 + .../docs/doxygen/html/search/functions_c.html | 0 .../docs/doxygen/html/search/functions_c.js | 44 +- .../docs/doxygen/html/search/functions_d.html | 0 .../docs/doxygen/html/search/functions_d.js | 4 + .../docs/doxygen/html/search/functions_e.html | 0 .../docs/doxygen/html/search/functions_e.js | 6 +- .../docs/doxygen/html/search/functions_f.html | 0 .../docs/doxygen/html/search/functions_f.js | 5 + .../docs/doxygen/html/search/mag_sel.png | Bin .../doxygen/html/search/namespaces_0.html | 0 .../docs/doxygen/html/search/namespaces_0.js | 4 + .../doxygen/html/search/namespaces_1.html | 0 .../docs/doxygen/html/search/namespaces_1.js | 5 + .../doxygen/html/search/namespaces_2.html | 0 .../docs/doxygen/html/search/namespaces_2.js | 4 + .../docs/doxygen/html/search/nomatches.html | 0 .../docs/doxygen/html/search/pages_0.html | 0 .../docs/doxygen/html/search/pages_0.js | 4 + .../docs/doxygen/html/search/pages_1.html | 0 .../docs/doxygen/html/search/pages_1.js | 5 + .../docs/doxygen/html/search/pages_2.html | 0 .../docs/doxygen/html/search/pages_2.js | 4 + .../docs/doxygen/html/search/related_0.html | 0 .../docs/doxygen/html/search/related_0.js | 2 +- .../docs/doxygen/html/search/search.css | 0 .../docs/doxygen/html/search/search.js | 0 .../docs/doxygen/html/search/search_l.png | Bin .../docs/doxygen/html/search/search_m.png | Bin .../docs/doxygen/html/search/search_r.png | Bin .../docs/doxygen/html/search/searchdata.js | 0 .../docs/doxygen/html/search/typedefs_0.html | 0 .../docs/doxygen/html/search/typedefs_0.js | 2 +- .../docs/doxygen/html/search/typedefs_1.html | 0 .../docs/doxygen/html/search/typedefs_1.js | 2 +- .../docs/doxygen/html/search/variables_0.html | 0 .../docs/doxygen/html/search/variables_0.js | 139 +- .../docs/doxygen/html/search/variables_1.html | 0 .../docs/doxygen/html/search/variables_1.js | 6 + .../doxygen/html/search/variables_10.html | 0 .../docs/doxygen/html/search/variables_10.js | 18 +- .../doxygen/html/search/variables_11.html | 0 .../docs/doxygen/html/search/variables_11.js | 74 +- .../doxygen/html/search/variables_12.html | 0 .../docs/doxygen/html/search/variables_12.js | 33 +- .../doxygen/html/search/variables_13.html | 0 .../docs/doxygen/html/search/variables_13.js | 11 + .../doxygen/html/search/variables_14.html | 0 .../docs/doxygen/html/search/variables_14.js | 8 + .../doxygen/html/search/variables_15.html | 0 .../docs/doxygen/html/search/variables_15.js | 8 + .../doxygen/html/search/variables_16.html | 0 .../docs/doxygen/html/search/variables_16.js | 4 + .../doxygen/html/search/variables_17.html | 0 .../docs/doxygen/html/search/variables_17.js | 4 +- .../docs/doxygen/html/search/variables_2.html | 0 .../docs/doxygen/html/search/variables_2.js | 13 + .../docs/doxygen/html/search/variables_3.html | 0 .../docs/doxygen/html/search/variables_3.js | 38 +- .../docs/doxygen/html/search/variables_4.html | 0 .../docs/doxygen/html/search/variables_4.js | 14 + .../docs/doxygen/html/search/variables_5.html | 0 .../docs/doxygen/html/search/variables_5.js | 7 +- .../docs/doxygen/html/search/variables_6.html | 0 .../docs/doxygen/html/search/variables_6.js | 24 +- .../docs/doxygen/html/search/variables_7.html | 0 .../docs/doxygen/html/search/variables_7.js | 12 + .../docs/doxygen/html/search/variables_8.html | 0 .../docs/doxygen/html/search/variables_8.js | 10 +- .../docs/doxygen/html/search/variables_9.html | 0 .../docs/doxygen/html/search/variables_9.js | 4436 ++++++++-------- .../docs/doxygen/html/search/variables_a.html | 0 .../docs/doxygen/html/search/variables_a.js | 11 + .../docs/doxygen/html/search/variables_b.html | 0 .../docs/doxygen/html/search/variables_b.js | 19 +- .../docs/doxygen/html/search/variables_c.html | 0 .../docs/doxygen/html/search/variables_c.js | 4 +- .../docs/doxygen/html/search/variables_d.html | 0 .../docs/doxygen/html/search/variables_d.js | 56 +- .../docs/doxygen/html/search/variables_e.html | 0 .../docs/doxygen/html/search/variables_e.js | 47 +- .../docs/doxygen/html/search/variables_f.html | 0 .../docs/doxygen/html/search/variables_f.js | 6 + .../docs/doxygen/html/splitbar.png | Bin .../html/structCoronaSection-members.html | 0 .../doxygen/html/structCoronaSection.html | 0 .../html/structirparams__t-members.html | 0 .../docs/doxygen/html/structirparams__t.html | 0 .../html/structmatch__result__t-members.html | 0 .../doxygen/html/structmatch__result__t.html | 0 .../html/structstdAc_1_1state__t-members.html | 0 .../doxygen/html/structstdAc_1_1state__t.html | 0 .../docs/doxygen/html/sync_off.png | Bin .../docs/doxygen/html/sync_on.png | Bin .../docs/doxygen/html/tab_a.png | Bin .../docs/doxygen/html/tab_b.png | Bin .../docs/doxygen/html/tab_h.png | Bin .../docs/doxygen/html/tab_s.png | Bin .../docs/doxygen/html/tabs.css | 0 .../docs/doxygen/html/todo.html | 0 .../html/unionAirwellProtocol-members.html | 0 .../doxygen/html/unionAirwellProtocol.html | 0 .../html/unionAmcorProtocol-members.html | 0 .../docs/doxygen/html/unionAmcorProtocol.html | 0 .../html/unionArgoProtocol-members.html | 0 .../docs/doxygen/html/unionArgoProtocol.html | 0 .../html/unionCarrierProtocol-members.html | 0 .../doxygen/html/unionCarrierProtocol.html | 0 .../html/unionCoolixProtocol-members.html | 0 .../doxygen/html/unionCoolixProtocol.html | 0 .../html/unionCoronaProtocol-members.html | 0 .../doxygen/html/unionCoronaProtocol.html | 0 .../html/unionCoronaProtocol__coll__graph.map | 0 .../html/unionCoronaProtocol__coll__graph.md5 | 0 .../html/unionCoronaProtocol__coll__graph.png | Bin .../html/unionDaikin128Protocol-members.html | 0 .../doxygen/html/unionDaikin128Protocol.html | 0 .../html/unionDaikin152Protocol-members.html | 0 .../doxygen/html/unionDaikin152Protocol.html | 0 .../html/unionDaikin160Protocol-members.html | 0 .../doxygen/html/unionDaikin160Protocol.html | 0 .../html/unionDaikin176Protocol-members.html | 0 .../doxygen/html/unionDaikin176Protocol.html | 0 .../html/unionDaikin216Protocol-members.html | 0 .../doxygen/html/unionDaikin216Protocol.html | 0 .../html/unionDaikin2Protocol-members.html | 0 .../doxygen/html/unionDaikin2Protocol.html | 0 .../html/unionDaikin64Protocol-members.html | 0 .../doxygen/html/unionDaikin64Protocol.html | 0 .../html/unionDaikinESPProtocol-members.html | 0 .../doxygen/html/unionDaikinESPProtocol.html | 0 .../html/unionDelonghiProtocol-members.html | 0 .../doxygen/html/unionDelonghiProtocol.html | 0 .../html/unionElectraProtocol-members.html | 0 .../doxygen/html/unionElectraProtocol.html | 0 .../unionGoodweatherProtocol-members.html | 0 .../html/unionGoodweatherProtocol.html | 0 .../html/unionGreeProtocol-members.html | 0 .../docs/doxygen/html/unionGreeProtocol.html | 0 .../html/unionHaierProtocol-members.html | 0 .../docs/doxygen/html/unionHaierProtocol.html | 0 .../html/unionHaierYRW02Protocol-members.html | 0 .../doxygen/html/unionHaierYRW02Protocol.html | 0 .../html/unionHitachi1Protocol-members.html | 0 .../doxygen/html/unionHitachi1Protocol.html | 0 .../html/unionHitachi424Protocol-members.html | 0 .../doxygen/html/unionHitachi424Protocol.html | 0 .../html/unionHitachiProtocol-members.html | 0 .../doxygen/html/unionHitachiProtocol.html | 0 .../html/unionKelvinatorProtocol-members.html | 0 .../doxygen/html/unionKelvinatorProtocol.html | 0 .../doxygen/html/unionLGProtocol-members.html | 0 .../docs/doxygen/html/unionLGProtocol.html | 0 .../html/unionMideaProtocol-members.html | 0 .../docs/doxygen/html/unionMideaProtocol.html | 0 .../unionMitsubishi112Protocol-members.html | 0 .../html/unionMitsubishi112Protocol.html | 0 .../unionMitsubishi136Protocol-members.html | 0 .../html/unionMitsubishi136Protocol.html | 0 .../unionMitsubishi144Protocol-members.html | 11 +- .../html/unionMitsubishi144Protocol.html | 56 +- .../unionMitsubishi152Protocol-members.html | 0 .../html/unionMitsubishi152Protocol.html | 0 .../unionMitsubishi88Protocol-members.html | 0 .../html/unionMitsubishi88Protocol.html | 0 .../html/unionNeoclimaProtocol-members.html | 0 .../doxygen/html/unionNeoclimaProtocol.html | 0 .../unionPanasonicAc32Protocol-members.html | 0 .../html/unionPanasonicAc32Protocol.html | 0 .../html/unionSamsungProtocol-members.html | 0 .../doxygen/html/unionSamsungProtocol.html | 0 .../html/unionSanyoProtocol-members.html | 0 .../docs/doxygen/html/unionSanyoProtocol.html | 0 .../html/unionSharpProtocol-members.html | 12 +- .../docs/doxygen/html/unionSharpProtocol.html | 32 +- .../html/unionTcl112Protocol-members.html | 102 + .../doxygen/html/unionTcl112Protocol.html | 482 ++ .../html/unionTechnibelProtocol-members.html | 98 + .../doxygen/html/unionTechnibelProtocol.html | 415 ++ .../html/unionTecoProtocol-members.html | 96 + .../docs/doxygen/html/unionTecoProtocol.html | 386 ++ .../html/unionToshibaProtocol-members.html | 97 + .../doxygen/html/unionToshibaProtocol.html | 405 ++ .../html/unionTranscoldProtocol-members.html | 86 + .../doxygen/html/unionTranscoldProtocol.html | 226 + .../html/unionVoltasProtocol-members.html | 0 .../doxygen/html/unionVoltasProtocol.html | 126 +- .../doxygen/html/unionmagiquest-members.html | 0 .../docs/doxygen/html/unionmagiquest.html | 0 .../docs/doxygen/html/zh-CN_8h.html | 0 .../docs/doxygen/html/zh-CN_8h_source.html | 0 .../docs/doxygen_index.md | 0 .../examples/BlynkIrRemote/BlynkIrRemote.ino | 0 .../examples/BlynkIrRemote/platformio.ini | 2 +- .../CommonAcControl/CommonAcControl.ino | 0 .../examples/CommonAcControl/platformio.ini | 0 .../ControlSamsungAC/ControlSamsungAC.ino | 0 .../examples/ControlSamsungAC/platformio.ini | 0 .../DumbIRRepeater/DumbIRRepeater.ino | 0 .../examples/DumbIRRepeater/platformio.ini | 0 .../examples/IRGCSendDemo/IRGCSendDemo.ino | 0 .../examples/IRGCSendDemo/platformio.ini | 0 .../examples/IRGCTCPServer/IRGCTCPServer.ino | 0 .../examples/IRGCTCPServer/platformio.ini | 0 .../examples/IRMQTTServer/IRMQTTServer.h | 0 .../examples/IRMQTTServer/IRMQTTServer.ino | 2 +- .../examples/IRMQTTServer/platformio.ini | 2 +- .../examples/IRServer/IRServer.ino | 0 .../examples/IRServer/platformio.ini | 0 .../examples/IRrecvDemo/IRrecvDemo.ino | 0 .../examples/IRrecvDemo/platformio.ini | 0 .../examples/IRrecvDump/IRrecvDump.ino | 0 .../examples/IRrecvDump/platformio.ini | 0 .../examples/IRrecvDumpV2/IRrecvDumpV2.ino | 0 .../examples/IRrecvDumpV2/platformio.ini | 0 .../examples/IRrecvDumpV3/BaseOTA.h | 0 .../examples/IRrecvDumpV3/IRrecvDumpV3.ino | 0 .../examples/IRrecvDumpV3/platformio.ini | 0 .../examples/IRsendDemo/IRsendDemo.ino | 0 .../examples/IRsendDemo/platformio.ini | 0 .../IRsendProntoDemo/IRsendProntoDemo.ino | 0 .../examples/IRsendProntoDemo/platformio.ini | 0 .../JVCPanasonicSendDemo.ino | 0 .../JVCPanasonicSendDemo/platformio.ini | 0 .../examples/LGACSend/LGACSend.ino | 0 .../examples/LGACSend/platformio.ini | 0 .../SmartIRRepeater/SmartIRRepeater.ino | 0 .../examples/SmartIRRepeater/platformio.ini | 0 .../examples/TurnOnArgoAC/TurnOnArgoAC.ino | 0 .../examples/TurnOnArgoAC/platformio.ini | 0 .../TurnOnDaikinAC/TurnOnDaikinAC.ino | 0 .../examples/TurnOnDaikinAC/platformio.ini | 0 .../TurnOnFujitsuAC/TurnOnFujitsuAC.ino | 0 .../examples/TurnOnFujitsuAC/platformio.ini | 0 .../examples/TurnOnGreeAC/TurnOnGreeAC.ino | 0 .../examples/TurnOnGreeAC/platformio.ini | 0 .../TurnOnKelvinatorAC/TurnOnKelvinatorAC.ino | 0 .../TurnOnKelvinatorAC/platformio.ini | 0 .../TurnOnMitsubishiAC/TurnOnMitsubishiAC.ino | 0 .../TurnOnMitsubishiAC/platformio.ini | 0 .../TurnOnMitsubishiHeavyAc.ino | 0 .../TurnOnMitsubishiHeavyAc/platformio.ini | 0 .../TurnOnPanasonicAC/TurnOnPanasonicAC.ino | 0 .../examples/TurnOnPanasonicAC/platformio.ini | 0 .../TurnOnToshibaAC/TurnOnToshibaAC.ino | 0 .../examples/TurnOnToshibaAC/platformio.ini | 0 .../TurnOnTrotecAC/TurnOnTrotecAC.ino | 0 .../examples/TurnOnTrotecAC/platformio.ini | 0 .../examples/Web-AC-control/README.md | 0 .../examples/Web-AC-control/Web-AC-control.h | 0 .../Web-AC-control/Web-AC-control.ino | 0 .../examples/Web-AC-control/platformio.ini | 2 +- .../examples/Web-AC-control/printscreen.png | Bin .../keywords.txt | 123 +- .../library.json | 2 +- .../library.properties | 2 +- .../platformio.ini | 0 .../pylintrc | 0 .../src/CPPLINT.cfg | 0 .../src/IRac.cpp | 10 +- .../src/IRac.h | 0 .../src/IRrecv.cpp | 77 +- .../src/IRrecv.h | 16 +- .../src/IRremoteESP8266.h | 25 +- .../src/IRsend.cpp | 13 + .../src/IRsend.h | 28 +- .../src/IRtext.cpp | 2 + .../src/IRtext.h | 0 .../src/IRtimer.cpp | 0 .../src/IRtimer.h | 0 .../src/IRutils.cpp | 133 + .../src/IRutils.h | 17 + .../src/i18n.h | 0 .../src/ir_Airwell.cpp | 0 .../src/ir_Airwell.h | 0 .../src/ir_Aiwa.cpp | 2 +- .../src/ir_Amcor.cpp | 0 .../src/ir_Amcor.h | 0 .../src/ir_Argo.cpp | 0 .../src/ir_Argo.h | 0 .../src/ir_Carrier.cpp | 0 .../src/ir_Carrier.h | 0 .../src/ir_Coolix.cpp | 0 .../src/ir_Coolix.h | 0 .../src/ir_Corona.cpp | 0 .../src/ir_Corona.h | 0 .../src/ir_Daikin.cpp | 160 +- .../src/ir_Daikin.h | 23 +- .../src/ir_Delonghi.cpp | 0 .../src/ir_Delonghi.h | 0 .../src/ir_Denon.cpp | 0 .../src/ir_Dish.cpp | 0 .../src/ir_Doshisha.cpp | 0 .../IRremoteESP8266-2.7.15/src/ir_EcoClim.cpp | 114 + .../src/ir_Electra.cpp | 0 .../src/ir_Electra.h | 0 .../src/ir_EliteScreens.cpp | 0 .../src/ir_Epson.cpp | 0 .../src/ir_Fujitsu.cpp | 5 + .../src/ir_Fujitsu.h | 7 + .../src/ir_GICable.cpp | 0 .../src/ir_GlobalCache.cpp | 0 .../src/ir_Goodweather.cpp | 0 .../src/ir_Goodweather.h | 0 .../src/ir_Gree.cpp | 0 .../src/ir_Gree.h | 0 .../src/ir_Haier.cpp | 0 .../src/ir_Haier.h | 0 .../src/ir_Hitachi.cpp | 0 .../src/ir_Hitachi.h | 0 .../src/ir_Inax.cpp | 0 .../src/ir_JVC.cpp | 8 +- .../src/ir_Kelvinator.cpp | 0 .../src/ir_Kelvinator.h | 0 .../src/ir_LG.cpp | 0 .../src/ir_LG.h | 0 .../src/ir_Lasertag.cpp | 2 +- .../src/ir_Lego.cpp | 0 .../src/ir_Lutron.cpp | 0 .../src/ir_MWM.cpp | 0 .../src/ir_Magiquest.cpp | 0 .../src/ir_Magiquest.h | 0 .../src/ir_Metz.cpp | 0 .../src/ir_Midea.cpp | 0 .../src/ir_Midea.h | 0 .../src/ir_MilesTag2.cpp | 113 + .../src/ir_Mirage.cpp | 0 .../src/ir_Mitsubishi.cpp | 225 +- .../src/ir_Mitsubishi.h | 45 +- .../src/ir_MitsubishiHeavy.cpp | 188 +- .../src/ir_MitsubishiHeavy.h | 0 .../src/ir_Multibrackets.cpp | 0 .../src/ir_NEC.cpp | 8 +- .../src/ir_NEC.h | 2 +- .../src/ir_Neoclima.cpp | 0 .../src/ir_Neoclima.h | 0 .../src/ir_Nikai.cpp | 0 .../src/ir_Panasonic.cpp | 90 +- .../src/ir_Panasonic.h | 0 .../src/ir_Pioneer.cpp | 0 .../src/ir_Pronto.cpp | 0 .../src/ir_RC5_RC6.cpp | 2 +- .../src/ir_RCMM.cpp | 2 +- .../src/ir_Samsung.cpp | 0 .../src/ir_Samsung.h | 0 .../src/ir_Sanyo.cpp | 33 +- .../src/ir_Sanyo.h | 0 .../src/ir_Sharp.cpp | 78 +- .../src/ir_Sharp.h | 30 +- .../src/ir_Sherwood.cpp | 0 .../src/ir_Sony.cpp | 2 +- .../src/ir_Symphony.cpp | 0 .../src/ir_Tcl.cpp | 144 +- .../src/ir_Tcl.h | 78 +- .../src/ir_Technibel.cpp | 128 +- .../IRremoteESP8266-2.7.15/src/ir_Technibel.h | 135 + .../src/ir_Teco.cpp | 128 +- .../IRremoteESP8266-2.7.15/src/ir_Teco.h | 131 + .../src/ir_Toshiba.cpp | 105 +- .../src/ir_Toshiba.h | 96 +- .../src/ir_Transcold.cpp | 177 +- .../src/ir_Transcold.h | 61 +- .../src/ir_Trotec.cpp | 0 .../src/ir_Trotec.h | 0 .../src/ir_Vestel.cpp | 0 .../src/ir_Vestel.h | 0 .../src/ir_Voltas.cpp | 0 .../src/ir_Voltas.h | 0 .../src/ir_Whirlpool.cpp | 0 .../src/ir_Whirlpool.h | 0 .../src/ir_Whynter.cpp | 0 .../src/ir_Zepeal.cpp | 0 .../src/locale/README.md | 0 .../src/locale/de-CH.h | 0 .../src/locale/de-DE.h | 0 .../src/locale/defaults.h | 6 + .../src/locale/en-AU.h | 0 .../src/locale/en-IE.h | 0 .../src/locale/en-UK.h | 0 .../src/locale/en-US.h | 0 .../src/locale/es-ES.h | 0 .../src/locale/fr-FR.h | 0 .../src/locale/it-IT.h | 0 .../src/locale/pt-BR.h | 0 .../src/locale/zh-CN.h | 0 .../test/IRac_test.cpp | 9 +- .../test/IRrecv_test.cpp | 68 + .../test/IRrecv_test.h | 0 .../test/IRsend_test.cpp | 0 .../test/IRsend_test.h | 0 .../test/IRutils_test.cpp | 0 .../test/Makefile | 0 .../test/ir_Airwell_test.cpp | 0 .../test/ir_Aiwa_test.cpp | 0 .../test/ir_Amcor_test.cpp | 0 .../test/ir_Argo_test.cpp | 0 .../test/ir_Carrier_test.cpp | 0 .../test/ir_Coolix_test.cpp | 0 .../test/ir_Corona_test.cpp | 0 .../test/ir_Daikin_test.cpp | 38 +- .../test/ir_Delonghi_test.cpp | 0 .../test/ir_Denon_test.cpp | 0 .../test/ir_Dish_test.cpp | 0 .../test/ir_Doshisha_test.cpp | 0 .../test/ir_Ecoclim_test.cpp | 204 + .../test/ir_Electra_test.cpp | 0 .../test/ir_EliteScreens_test.cpp | 0 .../test/ir_Epson_test.cpp | 0 .../test/ir_Fujitsu_test.cpp | 0 .../test/ir_GICable_test.cpp | 0 .../test/ir_GlobalCache_test.cpp | 0 .../test/ir_Goodweather_test.cpp | 0 .../test/ir_Gree_test.cpp | 0 .../test/ir_Haier_test.cpp | 0 .../test/ir_Hitachi_test.cpp | 0 .../test/ir_Inax_test.cpp | 0 .../test/ir_JVC_test.cpp | 0 .../test/ir_Kelvinator_test.cpp | 0 .../test/ir_LG_test.cpp | 0 .../test/ir_Lasertag_test.cpp | 0 .../test/ir_Lego_test.cpp | 0 .../test/ir_Lutron_test.cpp | 0 .../test/ir_MWM_test.cpp | 0 .../test/ir_Magiquest_test.cpp | 0 .../test/ir_Metz_test.cpp | 0 .../test/ir_Midea_test.cpp | 0 .../test/ir_Milestag2_test.cpp | 129 + .../test/ir_Mirage_test.cpp | 0 .../test/ir_MitsubishiHeavy_test.cpp | 0 .../test/ir_Mitsubishi_test.cpp | 382 +- .../test/ir_Multibrackets_test.cpp | 0 .../test/ir_NEC_test.cpp | 0 .../test/ir_Neoclima_test.cpp | 0 .../test/ir_Nikai_test.cpp | 0 .../test/ir_Panasonic_test.cpp | 0 .../test/ir_Pioneer_test.cpp | 0 .../test/ir_Pronto_test.cpp | 0 .../test/ir_RC5_RC6_test.cpp | 0 .../test/ir_RCMM_test.cpp | 0 .../test/ir_Samsung_test.cpp | 0 .../test/ir_Sanyo_test.cpp | 0 .../test/ir_Sharp_test.cpp | 65 +- .../test/ir_Sherwood_test.cpp | 0 .../test/ir_Sony_test.cpp | 0 .../test/ir_Symphony_test.cpp | 0 .../test/ir_Tcl_test.cpp | 0 .../test/ir_Technibel_test.cpp | 0 .../test/ir_Teco_test.cpp | 0 .../test/ir_Toshiba_test.cpp | 0 .../test/ir_Transcold_test.cpp | 0 .../test/ir_Trotec_test.cpp | 0 .../test/ir_Vestel_test.cpp | 0 .../test/ir_Voltas_test.cpp | 0 .../test/ir_Whirlpool_test.cpp | 0 .../test/ir_Whynter_test.cpp | 0 .../test/ir_Zepeal_test.cpp | 0 .../tools/Makefile | 0 .../tools/RawToGlobalCache.sh | 0 .../tools/auto_analyse_raw_data.py | 0 .../tools/auto_analyse_raw_data_test.py | 0 .../tools/gc_decode.cpp | 0 .../tools/generate_irtext_h.sh | 0 .../tools/mkkeywords | 0 .../tools/mode2_decode.cpp | 0 .../tools/raw_to_pronto_code.py | 0 .../tools/raw_to_pronto_code_test.py | 0 .../tools/scrape_supported_devices.py | 0 1680 files changed, 23618 insertions(+), 19905 deletions(-) delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/annotated.html delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRTcl112Ac__coll__graph.map delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRTcl112Ac__coll__graph.md5 delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRTcl112Ac__coll__graph.png delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRTechnibelAc__coll__graph.map delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRTechnibelAc__coll__graph.md5 delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRTechnibelAc__coll__graph.png delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRTecoAc__coll__graph.map delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRTecoAc__coll__graph.md5 delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRTecoAc__coll__graph.png delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRToshibaAC__coll__graph.map delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRToshibaAC__coll__graph.md5 delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRToshibaAC__coll__graph.png delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRTranscoldAc-members.html delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRTranscoldAc__coll__graph.map delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRTranscoldAc__coll__graph.md5 delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRTranscoldAc__coll__graph.png delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Technibel_8h.html delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Technibel_8h_source.html delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/all_1.js delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/all_11.js delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/all_17.js delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/all_1a.js delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/all_1b.js delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/all_4.js delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/all_5.js delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/all_8.js delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/all_9.js delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/all_c.js delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/classes_0.js delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/classes_1.js delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/classes_2.js delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/classes_3.js delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/classes_4.js delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/classes_5.js delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/classes_6.js delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/classes_7.js delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/classes_8.js delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/classes_9.js delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/classes_a.js delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/classes_b.js delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/classes_c.js delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/classes_d.js delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/classes_e.js delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/enums_5.js delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/enums_7.js delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/enumvalues_3.js delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/files_0.js delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/files_1.js delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/files_2.js delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/files_3.js delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/files_4.js delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/files_5.js delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/files_6.js delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/functions_1.js delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/functions_15.js delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/functions_17.js delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/functions_4.js delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/functions_a.js delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/functions_b.js delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/functions_d.js delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/functions_f.js delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/namespaces_0.js delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/namespaces_1.js delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/namespaces_2.js delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/pages_0.js delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/pages_1.js delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/pages_2.js delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/variables_1.js delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/variables_13.js delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/variables_14.js delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/variables_15.js delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/variables_16.js delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/variables_2.js delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/variables_4.js delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/variables_7.js delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/variables_a.js delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/variables_f.js delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/examples/Web-AC-control/data/favicon.ico delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/examples/Web-AC-control/data/level_1_off.svg delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/examples/Web-AC-control/data/level_1_on.svg delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/examples/Web-AC-control/data/level_2_off.svg delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/examples/Web-AC-control/data/level_2_on.svg delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/examples/Web-AC-control/data/level_3_off.svg delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/examples/Web-AC-control/data/level_3_on.svg delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/examples/Web-AC-control/data/level_4_off.svg delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/examples/Web-AC-control/data/level_4_on.svg delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/examples/Web-AC-control/data/ui.html delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/examples/Web-AC-control/data/ui.js delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/src/ir_Technibel.h delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/src/ir_Teco.h rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/.github/CONTRIBUTING.md (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/.github/Contributors.md (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/.github/issue_template.md (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/.gitignore (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/.gitmodules (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/.style.yapf (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/.travis.yml (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/CPPLINT.cfg (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/Doxyfile (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/LICENSE.txt (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/README.md (97%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/README_de.md (97%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/README_fr.md (97%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/ReleaseNotes.md (97%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/SupportedProtocols.md (94%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.15/assets/images/banner.svg create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.15/assets/images/logo.svg rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/README.md (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/README_de.md (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/README_fr.md (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/_config.yml (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/IRac_8cpp.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/IRac_8h.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/IRac_8h_source.html (98%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/IRrecv_8cpp.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/IRrecv_8h.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/IRrecv_8h_source.html (87%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/IRremoteESP8266_8h.html (98%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/IRremoteESP8266_8h_source.html (85%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/IRsend_8cpp.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/IRsend_8h.html (97%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/IRsend_8h_source.html (87%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/IRtext_8cpp.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/IRtext_8h.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/IRtext_8h_source.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/IRtimer_8cpp.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/IRtimer_8h.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/IRtimer_8h_source.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/IRutils_8cpp.html (95%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/IRutils_8h.html (96%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/IRutils_8h_source.html (83%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/README_8md.html (100%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.15/docs/doxygen/html/annotated.html rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/bc_s.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/bdwn.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRAirwellAc-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRAirwellAc.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRAirwellAc__coll__graph.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRAirwellAc__coll__graph.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRAirwellAc__coll__graph.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRAmcorAc-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRAmcorAc.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRAmcorAc__coll__graph.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRAmcorAc__coll__graph.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRAmcorAc__coll__graph.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRArgoAC-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRArgoAC.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRArgoAC__coll__graph.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRArgoAC__coll__graph.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRArgoAC__coll__graph.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRCarrierAc64-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRCarrierAc64.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRCarrierAc64__coll__graph.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRCarrierAc64__coll__graph.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRCarrierAc64__coll__graph.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRCoolixAC-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRCoolixAC.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRCoolixAC__coll__graph.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRCoolixAC__coll__graph.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRCoolixAC__coll__graph.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRCoronaAc-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRCoronaAc.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRCoronaAc__coll__graph.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRCoronaAc__coll__graph.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRCoronaAc__coll__graph.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRDaikin128-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRDaikin128.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRDaikin128__coll__graph.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRDaikin128__coll__graph.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRDaikin128__coll__graph.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRDaikin152-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRDaikin152.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRDaikin152__coll__graph.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRDaikin152__coll__graph.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRDaikin152__coll__graph.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRDaikin160-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRDaikin160.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRDaikin160__coll__graph.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRDaikin160__coll__graph.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRDaikin160__coll__graph.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRDaikin176-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRDaikin176.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRDaikin176__coll__graph.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRDaikin176__coll__graph.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRDaikin176__coll__graph.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRDaikin2-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRDaikin2.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRDaikin216-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRDaikin216.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRDaikin216__coll__graph.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRDaikin216__coll__graph.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRDaikin216__coll__graph.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRDaikin2__coll__graph.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRDaikin2__coll__graph.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRDaikin2__coll__graph.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRDaikin64-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRDaikin64.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRDaikin64__coll__graph.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRDaikin64__coll__graph.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRDaikin64__coll__graph.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRDaikinESP-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRDaikinESP.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRDaikinESP__coll__graph.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRDaikinESP__coll__graph.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRDaikinESP__coll__graph.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRDelonghiAc-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRDelonghiAc.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRDelonghiAc__coll__graph.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRDelonghiAc__coll__graph.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRDelonghiAc__coll__graph.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRElectraAc-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRElectraAc.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRElectraAc__coll__graph.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRElectraAc__coll__graph.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRElectraAc__coll__graph.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRFujitsuAC-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRFujitsuAC.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRFujitsuAC__coll__graph.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRFujitsuAC__coll__graph.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRFujitsuAC__coll__graph.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRGoodweatherAc-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRGoodweatherAc.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRGoodweatherAc__coll__graph.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRGoodweatherAc__coll__graph.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRGoodweatherAc__coll__graph.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRGreeAC-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRGreeAC.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRGreeAC__coll__graph.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRGreeAC__coll__graph.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRGreeAC__coll__graph.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRHaierAC-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRHaierAC.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRHaierACYRW02-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRHaierACYRW02.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRHaierACYRW02__coll__graph.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRHaierACYRW02__coll__graph.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRHaierACYRW02__coll__graph.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRHaierAC__coll__graph.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRHaierAC__coll__graph.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRHaierAC__coll__graph.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRHitachiAc-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRHitachiAc.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRHitachiAc1-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRHitachiAc1.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRHitachiAc1__coll__graph.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRHitachiAc1__coll__graph.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRHitachiAc1__coll__graph.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRHitachiAc3-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRHitachiAc3.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRHitachiAc344-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRHitachiAc344.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRHitachiAc344__coll__graph.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRHitachiAc344__coll__graph.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRHitachiAc344__coll__graph.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRHitachiAc344__inherit__graph.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRHitachiAc344__inherit__graph.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRHitachiAc344__inherit__graph.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRHitachiAc3__coll__graph.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRHitachiAc3__coll__graph.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRHitachiAc3__coll__graph.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRHitachiAc424-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRHitachiAc424.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRHitachiAc424__coll__graph.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRHitachiAc424__coll__graph.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRHitachiAc424__coll__graph.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRHitachiAc424__inherit__graph.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRHitachiAc424__inherit__graph.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRHitachiAc424__inherit__graph.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRHitachiAc__coll__graph.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRHitachiAc__coll__graph.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRHitachiAc__coll__graph.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRKelvinatorAC-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRKelvinatorAC.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRKelvinatorAC__coll__graph.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRKelvinatorAC__coll__graph.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRKelvinatorAC__coll__graph.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRLgAc-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRLgAc.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRLgAc__coll__graph.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRLgAc__coll__graph.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRLgAc__coll__graph.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRMideaAC-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRMideaAC.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRMideaAC__coll__graph.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRMideaAC__coll__graph.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRMideaAC__coll__graph.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRMitsubishi112-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRMitsubishi112.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRMitsubishi112__coll__graph.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRMitsubishi112__coll__graph.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRMitsubishi112__coll__graph.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRMitsubishi136-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRMitsubishi136.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRMitsubishi136__coll__graph.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRMitsubishi136__coll__graph.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRMitsubishi136__coll__graph.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRMitsubishiAC-members.html (77%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRMitsubishiAC.html (93%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRMitsubishiAC__coll__graph.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRMitsubishiAC__coll__graph.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRMitsubishiAC__coll__graph.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRMitsubishiHeavy152Ac-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRMitsubishiHeavy152Ac.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRMitsubishiHeavy152Ac__coll__graph.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRMitsubishiHeavy152Ac__coll__graph.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRMitsubishiHeavy152Ac__coll__graph.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRMitsubishiHeavy88Ac-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRMitsubishiHeavy88Ac.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRMitsubishiHeavy88Ac__coll__graph.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRMitsubishiHeavy88Ac__coll__graph.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRMitsubishiHeavy88Ac__coll__graph.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRNeoclimaAc-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRNeoclimaAc.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRNeoclimaAc__coll__graph.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRNeoclimaAc__coll__graph.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRNeoclimaAc__coll__graph.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRPanasonicAc-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRPanasonicAc.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRPanasonicAc32-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRPanasonicAc32.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRPanasonicAc32__coll__graph.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRPanasonicAc32__coll__graph.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRPanasonicAc32__coll__graph.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRPanasonicAc__coll__graph.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRPanasonicAc__coll__graph.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRPanasonicAc__coll__graph.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRSamsungAc-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRSamsungAc.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRSamsungAc__coll__graph.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRSamsungAc__coll__graph.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRSamsungAc__coll__graph.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRSanyoAc-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRSanyoAc.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRSanyoAc__coll__graph.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRSanyoAc__coll__graph.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRSanyoAc__coll__graph.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRSharpAc-members.html (98%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRSharpAc.html (98%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRSharpAc__coll__graph.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRSharpAc__coll__graph.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRSharpAc__coll__graph.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRTcl112Ac-members.html (69%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRTcl112Ac.html (87%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.15/docs/doxygen/html/classIRTcl112Ac__coll__graph.map create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.15/docs/doxygen/html/classIRTcl112Ac__coll__graph.md5 create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.15/docs/doxygen/html/classIRTcl112Ac__coll__graph.png rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRTechnibelAc-members.html (66%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRTechnibelAc.html (81%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.15/docs/doxygen/html/classIRTechnibelAc__coll__graph.map create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.15/docs/doxygen/html/classIRTechnibelAc__coll__graph.md5 create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.15/docs/doxygen/html/classIRTechnibelAc__coll__graph.png rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRTecoAc-members.html (66%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRTecoAc.html (84%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.15/docs/doxygen/html/classIRTecoAc__coll__graph.map create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.15/docs/doxygen/html/classIRTecoAc__coll__graph.md5 create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.15/docs/doxygen/html/classIRTecoAc__coll__graph.png rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRToshibaAC-members.html (81%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRToshibaAC.html (88%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.15/docs/doxygen/html/classIRToshibaAC__coll__graph.map create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.15/docs/doxygen/html/classIRToshibaAC__coll__graph.md5 create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.15/docs/doxygen/html/classIRToshibaAC__coll__graph.png create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.15/docs/doxygen/html/classIRTranscoldAc-members.html rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRTranscoldAc.html (71%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.15/docs/doxygen/html/classIRTranscoldAc__coll__graph.map create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.15/docs/doxygen/html/classIRTranscoldAc__coll__graph.md5 create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.15/docs/doxygen/html/classIRTranscoldAc__coll__graph.png rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRTrotecESP-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRTrotecESP.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRTrotecESP__coll__graph.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRTrotecESP__coll__graph.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRTrotecESP__coll__graph.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRVestelAc-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRVestelAc.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRVestelAc__coll__graph.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRVestelAc__coll__graph.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRVestelAc__coll__graph.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRVoltas-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRVoltas.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRVoltas__coll__graph.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRVoltas__coll__graph.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRVoltas__coll__graph.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRWhirlpoolAc-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRWhirlpoolAc.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRWhirlpoolAc__coll__graph.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRWhirlpoolAc__coll__graph.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRWhirlpoolAc__coll__graph.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRac-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRac.html (99%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRac__coll__graph.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRac__coll__graph.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRac__coll__graph.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRrecv-members.html (84%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRrecv.html (97%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRrecv__coll__graph.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRrecv__coll__graph.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRrecv__coll__graph.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRsend-members.html (81%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRsend.html (98%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRtimer-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classIRtimer.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classTimerMs-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classTimerMs.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classdecode__results-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classdecode__results.html (91%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/classes.html (90%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/closed.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/de-CH_8h.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/de-CH_8h_source.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/de-DE_8h.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/de-DE_8h_source.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/defaults_8h.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/defaults_8h_source.html (87%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/deprecated.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/dir_49e56c817e5e54854c35e136979f97ca.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/dir_68267d1309a1af8e8297ef4c3efbcdba.html (98%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/dir_84fe998d1eb06414cc389ad334e77e63.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/doc.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/doxygen.css (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/doxygen.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/doxygen__index_8md.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/dynsections.js (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/en-AU_8h.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/en-AU_8h_source.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/en-IE_8h.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/en-IE_8h_source.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/en-UK_8h.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/en-UK_8h_source.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/en-US_8h.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/en-US_8h_source.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/es-ES_8h.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/es-ES_8h_source.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/files.html (97%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/folderclosed.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/folderopen.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/fr-FR_8h.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/fr-FR_8h_source.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/functions.html (93%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/functions_a.html (97%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/functions_b.html (97%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/functions_c.html (99%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/functions_d.html (98%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/functions_e.html (96%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/functions_f.html (91%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/functions_func.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/functions_func_a.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/functions_func_b.html (97%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/functions_func_c.html (99%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/functions_func_d.html (98%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/functions_func_e.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/functions_func_f.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/functions_func_g.html (92%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/functions_func_h.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/functions_func_i.html (99%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/functions_func_k.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/functions_func_l.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/functions_func_m.html (96%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/functions_func_n.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/functions_func_o.html (96%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/functions_func_p.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/functions_func_r.html (97%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/functions_func_s.html (98%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/functions_func_t.html (96%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/functions_func_u.html (95%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/functions_func_v.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/functions_func_w.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/functions_func_~.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/functions_g.html (92%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/functions_h.html (87%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/functions_i.html (99%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/functions_k.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/functions_l.html (89%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/functions_m.html (92%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/functions_n.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/functions_o.html (97%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/functions_p.html (95%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/functions_q.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/functions_r.html (93%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/functions_rela.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/functions_s.html (97%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/functions_t.html (92%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/functions_u.html (94%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/functions_v.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/functions_vars.html (93%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/functions_vars_a.html (96%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/functions_vars_b.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/functions_vars_c.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/functions_vars_d.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/functions_vars_e.html (93%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/functions_vars_f.html (91%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/functions_vars_h.html (84%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/functions_vars_i.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/functions_vars_l.html (88%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/functions_vars_m.html (92%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/functions_vars_n.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/functions_vars_o.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/functions_vars_p.html (95%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/functions_vars_q.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/functions_vars_r.html (94%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/functions_vars_s.html (91%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/functions_vars_t.html (86%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/functions_vars_u.html (94%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/functions_vars_v.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/functions_vars_w.html (96%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/functions_vars_x.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/functions_vars_z.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/functions_w.html (96%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/functions_x.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/functions_z.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/functions_~.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/globals.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/globals_a.html (97%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/globals_c.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/globals_d.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/globals_e.html (95%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/globals_enum.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/globals_eval.html (98%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/globals_f.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/globals_func.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/globals_g.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/globals_h.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/globals_i.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/globals_j.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/globals_k.html (95%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/globals_l.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/globals_m.html (97%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/globals_n.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/globals_p.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/globals_r.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/globals_s.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/globals_t.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/globals_type.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/globals_u.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/globals_v.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/globals_vars.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/globals_vars_i.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/globals_vars_k.html (95%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/globals_w.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/globals_x.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/globals_y.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/globals_z.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/graph_legend.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/graph_legend.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/graph_legend.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/hierarchy.html (64%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/i18n_8h.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/i18n_8h_source.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/index.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_0.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_0.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_0.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_1.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_1.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_1.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_10.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_10.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_10.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_95.map => IRremoteESP8266-2.7.15/docs/doxygen/html/inherit_graph_100.map} (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_95.md5 => IRremoteESP8266-2.7.15/docs/doxygen/html/inherit_graph_100.md5} (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_95.png => IRremoteESP8266-2.7.15/docs/doxygen/html/inherit_graph_100.png} (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_11.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_11.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_11.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_12.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_12.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_12.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_13.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_13.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_13.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_14.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_14.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_14.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_15.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_15.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_15.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_16.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_16.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_16.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_17.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_17.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_17.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_18.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_18.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_18.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_19.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_19.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_19.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_2.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_2.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_2.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_20.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_20.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_20.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_21.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_21.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_21.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_22.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_22.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_22.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_23.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_23.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_23.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_24.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_24.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_24.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_25.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_25.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_25.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_26.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_26.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_26.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_27.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_27.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_27.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_28.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_28.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_28.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_29.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_29.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_29.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_3.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_3.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_3.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_30.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_30.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_30.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_31.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_31.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_31.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_32.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_32.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_32.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_33.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_33.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_33.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_34.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_34.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_34.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_35.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_35.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_35.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_36.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_36.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_36.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_37.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_37.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_37.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_38.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_38.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_38.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_39.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_39.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_39.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_4.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_4.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_4.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_40.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_40.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_40.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_41.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_41.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_41.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_42.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_42.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_42.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_43.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_43.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_43.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_44.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_44.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_44.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_45.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_45.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_45.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_46.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_46.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_46.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_47.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_47.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_47.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_48.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_48.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_48.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_49.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_49.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_49.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_5.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_5.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_5.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_50.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_50.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_50.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_51.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_51.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_51.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_52.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_52.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_52.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_53.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_53.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_53.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_54.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_54.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_54.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_55.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_55.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_55.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_56.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_56.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_56.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_57.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_57.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_57.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_58.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_58.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_58.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_59.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_59.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_59.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_6.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_6.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_6.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_60.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_60.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_60.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_61.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_61.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_61.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_62.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_62.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_62.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_63.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_63.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_63.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_64.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_64.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_64.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_65.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_65.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_65.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_66.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_66.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_66.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_67.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_67.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_67.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_68.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_68.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_68.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_69.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_69.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_69.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_7.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_7.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_7.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_70.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_70.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_70.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_71.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_71.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_71.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_72.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_72.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_72.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_73.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_73.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_73.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_74.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_74.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_74.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_75.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_75.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_75.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_76.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_76.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_76.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_77.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_77.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_77.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_78.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_78.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_78.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_79.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_79.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_79.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_8.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_8.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_8.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_80.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_80.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_80.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_81.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_81.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_81.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_82.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_82.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_82.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_83.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_83.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_83.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_84.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_84.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_84.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_85.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_85.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_85.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_86.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_86.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_86.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_87.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_87.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_87.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_88.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_88.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_88.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_89.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_89.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_89.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_9.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_9.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_9.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_90.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_90.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_90.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_91.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_91.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_91.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_92.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_92.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_92.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_93.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_93.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherit_graph_93.png (100%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.15/docs/doxygen/html/inherit_graph_94.map create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.15/docs/doxygen/html/inherit_graph_94.md5 create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.15/docs/doxygen/html/inherit_graph_94.png create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.15/docs/doxygen/html/inherit_graph_95.map create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.15/docs/doxygen/html/inherit_graph_95.md5 create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.15/docs/doxygen/html/inherit_graph_95.png create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.15/docs/doxygen/html/inherit_graph_96.map create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.15/docs/doxygen/html/inherit_graph_96.md5 create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.15/docs/doxygen/html/inherit_graph_96.png rename lib/lib_basic/{IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_94.map => IRremoteESP8266-2.7.15/docs/doxygen/html/inherit_graph_97.map} (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_94.md5 => IRremoteESP8266-2.7.15/docs/doxygen/html/inherit_graph_97.md5} (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_94.png => IRremoteESP8266-2.7.15/docs/doxygen/html/inherit_graph_97.png} (100%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.15/docs/doxygen/html/inherit_graph_98.map create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.15/docs/doxygen/html/inherit_graph_98.md5 create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.15/docs/doxygen/html/inherit_graph_98.png create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.15/docs/doxygen/html/inherit_graph_99.map create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.15/docs/doxygen/html/inherit_graph_99.md5 create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.15/docs/doxygen/html/inherit_graph_99.png rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/inherits.html (95%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/ir__Airwell_8cpp.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/ir__Airwell_8h.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/ir__Airwell_8h_source.html (99%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/ir__Aiwa_8cpp.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/ir__Amcor_8cpp.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/ir__Amcor_8h.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/ir__Amcor_8h_source.html (99%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/ir__Argo_8cpp.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/ir__Argo_8h.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/ir__Argo_8h_source.html (99%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/ir__Carrier_8cpp.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/ir__Carrier_8h.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/ir__Carrier_8h_source.html (99%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/ir__Coolix_8cpp.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/ir__Coolix_8h.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/ir__Coolix_8h_source.html (99%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/ir__Corona_8cpp.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/ir__Corona_8h.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/ir__Corona_8h_source.html (99%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/ir__Daikin_8cpp.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/ir__Daikin_8h.html (96%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/ir__Daikin_8h_source.html (84%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/ir__Delonghi_8cpp.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/ir__Delonghi_8h.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/ir__Delonghi_8h_source.html (99%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/ir__Denon_8cpp.html (99%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/ir__Dish_8cpp.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/ir__Doshisha_8cpp.html (100%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.15/docs/doxygen/html/ir__EcoClim_8cpp.html rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/ir__Electra_8cpp.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/ir__Electra_8h.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/ir__Electra_8h_source.html (99%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/ir__EliteScreens_8cpp.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/ir__Epson_8cpp.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/ir__Fujitsu_8cpp.html (94%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/ir__Fujitsu_8h.html (98%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/ir__Fujitsu_8h_source.html (80%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/ir__GICable_8cpp.html (99%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/ir__GlobalCache_8cpp.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/ir__Goodweather_8cpp.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/ir__Goodweather_8h.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/ir__Goodweather_8h_source.html (99%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/ir__Gree_8cpp.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/ir__Gree_8h.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/ir__Gree_8h_source.html (99%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/ir__Haier_8cpp.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/ir__Haier_8h.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/ir__Haier_8h_source.html (99%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/ir__Hitachi_8cpp.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/ir__Hitachi_8h.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/ir__Hitachi_8h_source.html (99%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/ir__Inax_8cpp.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/ir__JVC_8cpp.html (99%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/ir__Kelvinator_8cpp.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/ir__Kelvinator_8h.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/ir__Kelvinator_8h_source.html (99%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/ir__LG_8cpp.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/ir__LG_8h.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/ir__LG_8h_source.html (99%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/ir__Lasertag_8cpp.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/ir__Lego_8cpp.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/ir__Lutron_8cpp.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/ir__MWM_8cpp.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/ir__Magiquest_8cpp.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/ir__Magiquest_8h.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/ir__Magiquest_8h_source.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/ir__Metz_8cpp.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/ir__Midea_8cpp.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/ir__Midea_8h.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/ir__Midea_8h_source.html (99%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.15/docs/doxygen/html/ir__MilesTag2_8cpp.html rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/ir__Mirage_8cpp.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/ir__MitsubishiHeavy_8cpp.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/ir__MitsubishiHeavy_8h.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/ir__MitsubishiHeavy_8h_source.html (97%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/ir__Mitsubishi_8cpp.html (98%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/ir__Mitsubishi_8h.html (83%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/ir__Mitsubishi_8h_source.html (73%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/ir__Multibrackets_8cpp.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/ir__NEC_8cpp.html (98%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/ir__NEC_8h.html (99%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/ir__NEC_8h_source.html (99%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/ir__Neoclima_8cpp.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/ir__Neoclima_8h.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/ir__Neoclima_8h_source.html (99%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/ir__Nikai_8cpp.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/ir__Panasonic_8cpp.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/ir__Panasonic_8h.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/ir__Panasonic_8h_source.html (97%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/ir__Pioneer_8cpp.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/ir__Pronto_8cpp.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/ir__RC5__RC6_8cpp.html (99%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/ir__RCMM_8cpp.html (99%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/ir__Samsung_8cpp.html (99%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/ir__Samsung_8h.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/ir__Samsung_8h_source.html (99%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/ir__Sanyo_8cpp.html (98%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/ir__Sanyo_8h.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/ir__Sanyo_8h_source.html (96%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/ir__Sharp_8cpp.html (98%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/ir__Sharp_8h.html (98%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/ir__Sharp_8h_source.html (78%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/ir__Sherwood_8cpp.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/ir__Sony_8cpp.html (99%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/ir__Symphony_8cpp.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/ir__Tcl_8cpp.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/ir__Tcl_8h.html (70%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/ir__Tcl_8h_source.html (58%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/ir__Technibel_8cpp.html (100%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.15/docs/doxygen/html/ir__Technibel_8h.html create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.15/docs/doxygen/html/ir__Technibel_8h_source.html rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/ir__Teco_8cpp.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/ir__Teco_8h.html (50%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/ir__Teco_8h_source.html (51%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/ir__Toshiba_8cpp.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/ir__Toshiba_8h.html (66%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/ir__Toshiba_8h_source.html (62%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/ir__Transcold_8cpp.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/ir__Transcold_8h.html (85%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/ir__Transcold_8h_source.html (58%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/ir__Trotec_8cpp.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/ir__Trotec_8h.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/ir__Trotec_8h_source.html (99%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/ir__Vestel_8cpp.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/ir__Vestel_8h.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/ir__Vestel_8h_source.html (99%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/ir__Voltas_8cpp.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/ir__Voltas_8h.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/ir__Voltas_8h_source.html (99%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/ir__Whirlpool_8cpp.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/ir__Whirlpool_8h.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/ir__Whirlpool_8h_source.html (99%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/ir__Whynter_8cpp.html (99%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/ir__Zepeal_8cpp.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/it-IT_8h.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/it-IT_8h_source.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/jquery.js (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/md_src_locale_README.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/menu.js (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/menudata.js (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/namespaceIRAcUtils.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/namespace__IRrecv.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/namespaceirutils.html (83%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/namespacemembers.html (95%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/namespacemembers_enum.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/namespacemembers_func.html (94%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/namespacemembers_vars.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/namespaces.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/namespacestdAc.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/nav_f.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/nav_g.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/nav_h.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/open.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/pages.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/pt-BR_8h.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/pt-BR_8h_source.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/all_0.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/all_0.js (86%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/all_1.html (100%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.15/docs/doxygen/html/search/all_1.js rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/all_10.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/all_10.js (74%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/all_11.html (100%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.15/docs/doxygen/html/search/all_11.js rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/all_12.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/all_12.js (69%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/all_13.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/all_13.js (87%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/all_14.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/all_14.js (81%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/all_15.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/all_15.js (51%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/all_16.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/all_16.js (85%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/all_17.html (100%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.15/docs/doxygen/html/search/all_17.js rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/all_18.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/all_18.js (52%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/all_19.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/all_19.js (54%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/all_1a.html (100%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.15/docs/doxygen/html/search/all_1a.js rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/all_1b.html (100%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.15/docs/doxygen/html/search/all_1b.js rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/all_2.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/all_2.js (76%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/all_3.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/all_3.js (85%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/all_4.html (100%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.15/docs/doxygen/html/search/all_4.js rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/all_5.html (100%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.15/docs/doxygen/html/search/all_5.js rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/all_6.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/all_6.js (70%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/all_7.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/all_7.js (77%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/all_8.html (100%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.15/docs/doxygen/html/search/all_8.js rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/all_9.html (100%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.15/docs/doxygen/html/search/all_9.js rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/all_a.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/all_a.js (60%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/all_b.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/all_b.js (53%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/all_c.html (100%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.15/docs/doxygen/html/search/all_c.js rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/all_d.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/all_d.js (64%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/all_e.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/all_e.js (60%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/all_f.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/all_f.js (82%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/classes_0.html (100%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.15/docs/doxygen/html/search/classes_0.js rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/classes_1.html (100%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.15/docs/doxygen/html/search/classes_1.js rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/classes_2.html (100%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.15/docs/doxygen/html/search/classes_2.js rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/classes_3.html (100%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.15/docs/doxygen/html/search/classes_3.js rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/classes_4.html (100%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.15/docs/doxygen/html/search/classes_4.js rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/classes_5.html (100%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.15/docs/doxygen/html/search/classes_5.js rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/classes_6.html (100%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.15/docs/doxygen/html/search/classes_6.js rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/classes_7.html (100%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.15/docs/doxygen/html/search/classes_7.js rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/classes_8.html (100%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.15/docs/doxygen/html/search/classes_8.js rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/classes_9.html (100%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.15/docs/doxygen/html/search/classes_9.js rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/classes_a.html (100%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.15/docs/doxygen/html/search/classes_a.js rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/classes_b.html (100%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.15/docs/doxygen/html/search/classes_b.js rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/classes_c.html (100%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.15/docs/doxygen/html/search/classes_c.js rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/classes_d.html (100%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.15/docs/doxygen/html/search/classes_d.js rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/classes_e.html (100%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.15/docs/doxygen/html/search/classes_e.js rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/close.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/enums_0.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/enums_0.js (58%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/enums_1.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/enums_1.js (53%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/enums_2.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/enums_2.js (59%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/enums_3.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/enums_3.js (61%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/enums_4.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/enums_4.js (58%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/enums_5.html (100%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.15/docs/doxygen/html/search/enums_5.js rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/enums_6.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/enums_6.js (62%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/enums_7.html (100%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.15/docs/doxygen/html/search/enums_7.js rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/enums_8.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/enums_8.js (60%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/enums_9.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/enums_9.js (62%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/enumvalues_0.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/enumvalues_0.js (50%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/enumvalues_1.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/enumvalues_1.js (60%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/enumvalues_10.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/enumvalues_10.js (59%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/enumvalues_11.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/enumvalues_11.js (60%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/enumvalues_12.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/enumvalues_12.js (60%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/enumvalues_13.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/enumvalues_13.js (61%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/enumvalues_14.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/enumvalues_14.js (54%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/enumvalues_15.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/enumvalues_15.js (62%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/enumvalues_2.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/enumvalues_2.js (58%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/enumvalues_3.html (100%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.15/docs/doxygen/html/search/enumvalues_3.js rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/enumvalues_4.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/enumvalues_4.js (64%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/enumvalues_5.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/enumvalues_5.js (59%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/enumvalues_6.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/enumvalues_6.js (61%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/enumvalues_7.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/enumvalues_7.js (61%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/enumvalues_8.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/enumvalues_8.js (60%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/enumvalues_9.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/enumvalues_9.js (62%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/enumvalues_a.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/enumvalues_a.js (57%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/enumvalues_b.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/enumvalues_b.js (56%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/enumvalues_c.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/enumvalues_c.js (58%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/enumvalues_d.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/enumvalues_d.js (60%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/enumvalues_e.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/enumvalues_e.js (57%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/enumvalues_f.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/enumvalues_f.js (58%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/files_0.html (100%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.15/docs/doxygen/html/search/files_0.js rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/files_1.html (100%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.15/docs/doxygen/html/search/files_1.js rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/files_2.html (100%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.15/docs/doxygen/html/search/files_2.js rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/files_3.html (100%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.15/docs/doxygen/html/search/files_3.js rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/files_4.html (100%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.15/docs/doxygen/html/search/files_4.js rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/files_5.html (100%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.15/docs/doxygen/html/search/files_5.js rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/files_6.html (100%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.15/docs/doxygen/html/search/files_6.js rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/functions_0.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/functions_0.js (54%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/functions_1.html (100%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.15/docs/doxygen/html/search/functions_1.js rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/functions_10.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/functions_10.js (68%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/functions_11.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/functions_11.js (80%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/functions_12.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/functions_12.js (89%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/functions_13.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/functions_13.js (53%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/functions_14.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/functions_14.js (93%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/functions_15.html (100%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.15/docs/doxygen/html/search/functions_15.js rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/functions_16.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/functions_16.js (82%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/functions_17.html (100%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.15/docs/doxygen/html/search/functions_17.js rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/functions_2.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/functions_2.js (88%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/functions_3.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/functions_3.js (91%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/functions_4.html (100%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.15/docs/doxygen/html/search/functions_4.js rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/functions_5.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/functions_5.js (52%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/functions_6.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/functions_6.js (62%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/functions_7.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/functions_7.js (78%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/functions_8.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/functions_8.js (52%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/functions_9.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/functions_9.js (54%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/functions_a.html (100%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.15/docs/doxygen/html/search/functions_a.js rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/functions_b.html (100%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.15/docs/doxygen/html/search/functions_b.js rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/functions_c.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/functions_c.js (55%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/functions_d.html (100%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.15/docs/doxygen/html/search/functions_d.js rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/functions_e.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/functions_e.js (92%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/functions_f.html (100%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.15/docs/doxygen/html/search/functions_f.js rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/mag_sel.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/namespaces_0.html (100%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.15/docs/doxygen/html/search/namespaces_0.js rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/namespaces_1.html (100%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.15/docs/doxygen/html/search/namespaces_1.js rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/namespaces_2.html (100%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.15/docs/doxygen/html/search/namespaces_2.js rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/nomatches.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/pages_0.html (100%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.15/docs/doxygen/html/search/pages_0.js rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/pages_1.html (100%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.15/docs/doxygen/html/search/pages_1.js rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/pages_2.html (100%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.15/docs/doxygen/html/search/pages_2.js rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/related_0.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/related_0.js (57%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/search.css (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/search.js (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/search_l.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/search_m.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/search_r.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/searchdata.js (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/typedefs_0.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/typedefs_0.js (52%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/typedefs_1.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/typedefs_1.js (53%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/variables_0.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/variables_0.js (81%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/variables_1.html (100%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.15/docs/doxygen/html/search/variables_1.js rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/variables_10.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/variables_10.js (74%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/variables_11.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/variables_11.js (63%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/variables_12.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/variables_12.js (65%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/variables_13.html (100%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.15/docs/doxygen/html/search/variables_13.js rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/variables_14.html (100%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.15/docs/doxygen/html/search/variables_14.js rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/variables_15.html (100%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.15/docs/doxygen/html/search/variables_15.js rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/variables_16.html (100%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.15/docs/doxygen/html/search/variables_16.js rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/variables_17.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/variables_17.js (52%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/variables_2.html (100%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.15/docs/doxygen/html/search/variables_2.js rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/variables_3.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/variables_3.js (50%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/variables_4.html (100%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.15/docs/doxygen/html/search/variables_4.js rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/variables_5.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/variables_5.js (53%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/variables_6.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/variables_6.js (74%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/variables_7.html (100%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.15/docs/doxygen/html/search/variables_7.js rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/variables_8.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/variables_8.js (63%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/variables_9.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/variables_9.js (53%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/variables_a.html (100%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.15/docs/doxygen/html/search/variables_a.js rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/variables_b.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/variables_b.js (71%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/variables_c.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/variables_c.js (62%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/variables_d.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/variables_d.js (72%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/variables_e.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/variables_e.js (76%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/search/variables_f.html (100%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.15/docs/doxygen/html/search/variables_f.js rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/splitbar.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/structCoronaSection-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/structCoronaSection.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/structirparams__t-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/structirparams__t.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/structmatch__result__t-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/structmatch__result__t.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/structstdAc_1_1state__t-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/structstdAc_1_1state__t.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/sync_off.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/sync_on.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/tab_a.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/tab_b.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/tab_h.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/tab_s.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/tabs.css (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/todo.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/unionAirwellProtocol-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/unionAirwellProtocol.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/unionAmcorProtocol-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/unionAmcorProtocol.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/unionArgoProtocol-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/unionArgoProtocol.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/unionCarrierProtocol-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/unionCarrierProtocol.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/unionCoolixProtocol-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/unionCoolixProtocol.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/unionCoronaProtocol-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/unionCoronaProtocol.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/unionCoronaProtocol__coll__graph.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/unionCoronaProtocol__coll__graph.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/unionCoronaProtocol__coll__graph.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/unionDaikin128Protocol-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/unionDaikin128Protocol.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/unionDaikin152Protocol-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/unionDaikin152Protocol.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/unionDaikin160Protocol-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/unionDaikin160Protocol.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/unionDaikin176Protocol-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/unionDaikin176Protocol.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/unionDaikin216Protocol-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/unionDaikin216Protocol.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/unionDaikin2Protocol-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/unionDaikin2Protocol.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/unionDaikin64Protocol-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/unionDaikin64Protocol.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/unionDaikinESPProtocol-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/unionDaikinESPProtocol.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/unionDelonghiProtocol-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/unionDelonghiProtocol.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/unionElectraProtocol-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/unionElectraProtocol.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/unionGoodweatherProtocol-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/unionGoodweatherProtocol.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/unionGreeProtocol-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/unionGreeProtocol.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/unionHaierProtocol-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/unionHaierProtocol.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/unionHaierYRW02Protocol-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/unionHaierYRW02Protocol.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/unionHitachi1Protocol-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/unionHitachi1Protocol.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/unionHitachi424Protocol-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/unionHitachi424Protocol.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/unionHitachiProtocol-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/unionHitachiProtocol.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/unionKelvinatorProtocol-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/unionKelvinatorProtocol.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/unionLGProtocol-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/unionLGProtocol.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/unionMideaProtocol-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/unionMideaProtocol.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/unionMitsubishi112Protocol-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/unionMitsubishi112Protocol.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/unionMitsubishi136Protocol-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/unionMitsubishi136Protocol.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/unionMitsubishi144Protocol-members.html (83%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/unionMitsubishi144Protocol.html (89%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/unionMitsubishi152Protocol-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/unionMitsubishi152Protocol.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/unionMitsubishi88Protocol-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/unionMitsubishi88Protocol.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/unionNeoclimaProtocol-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/unionNeoclimaProtocol.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/unionPanasonicAc32Protocol-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/unionPanasonicAc32Protocol.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/unionSamsungProtocol-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/unionSamsungProtocol.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/unionSanyoProtocol-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/unionSanyoProtocol.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/unionSharpProtocol-members.html (91%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/unionSharpProtocol.html (98%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.15/docs/doxygen/html/unionTcl112Protocol-members.html create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.15/docs/doxygen/html/unionTcl112Protocol.html create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.15/docs/doxygen/html/unionTechnibelProtocol-members.html create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.15/docs/doxygen/html/unionTechnibelProtocol.html create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.15/docs/doxygen/html/unionTecoProtocol-members.html create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.15/docs/doxygen/html/unionTecoProtocol.html create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.15/docs/doxygen/html/unionToshibaProtocol-members.html create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.15/docs/doxygen/html/unionToshibaProtocol.html create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.15/docs/doxygen/html/unionTranscoldProtocol-members.html create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.15/docs/doxygen/html/unionTranscoldProtocol.html rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/unionVoltasProtocol-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/unionVoltasProtocol.html (85%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/unionmagiquest-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/unionmagiquest.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/zh-CN_8h.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen/html/zh-CN_8h_source.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/docs/doxygen_index.md (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/examples/BlynkIrRemote/BlynkIrRemote.ino (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/examples/BlynkIrRemote/platformio.ini (97%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/examples/CommonAcControl/CommonAcControl.ino (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/examples/CommonAcControl/platformio.ini (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/examples/ControlSamsungAC/ControlSamsungAC.ino (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/examples/ControlSamsungAC/platformio.ini (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/examples/DumbIRRepeater/DumbIRRepeater.ino (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/examples/DumbIRRepeater/platformio.ini (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/examples/IRGCSendDemo/IRGCSendDemo.ino (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/examples/IRGCSendDemo/platformio.ini (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/examples/IRGCTCPServer/IRGCTCPServer.ino (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/examples/IRGCTCPServer/platformio.ini (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/examples/IRMQTTServer/IRMQTTServer.h (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/examples/IRMQTTServer/IRMQTTServer.ino (99%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/examples/IRMQTTServer/platformio.ini (95%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/examples/IRServer/IRServer.ino (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/examples/IRServer/platformio.ini (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/examples/IRrecvDemo/IRrecvDemo.ino (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/examples/IRrecvDemo/platformio.ini (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/examples/IRrecvDump/IRrecvDump.ino (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/examples/IRrecvDump/platformio.ini (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/examples/IRrecvDumpV2/IRrecvDumpV2.ino (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/examples/IRrecvDumpV2/platformio.ini (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/examples/IRrecvDumpV3/BaseOTA.h (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/examples/IRrecvDumpV3/IRrecvDumpV3.ino (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/examples/IRrecvDumpV3/platformio.ini (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/examples/IRsendDemo/IRsendDemo.ino (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/examples/IRsendDemo/platformio.ini (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/examples/IRsendProntoDemo/IRsendProntoDemo.ino (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/examples/IRsendProntoDemo/platformio.ini (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/examples/JVCPanasonicSendDemo/JVCPanasonicSendDemo.ino (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/examples/JVCPanasonicSendDemo/platformio.ini (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/examples/LGACSend/LGACSend.ino (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/examples/LGACSend/platformio.ini (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/examples/SmartIRRepeater/SmartIRRepeater.ino (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/examples/SmartIRRepeater/platformio.ini (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/examples/TurnOnArgoAC/TurnOnArgoAC.ino (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/examples/TurnOnArgoAC/platformio.ini (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/examples/TurnOnDaikinAC/TurnOnDaikinAC.ino (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/examples/TurnOnDaikinAC/platformio.ini (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/examples/TurnOnFujitsuAC/TurnOnFujitsuAC.ino (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/examples/TurnOnFujitsuAC/platformio.ini (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/examples/TurnOnGreeAC/TurnOnGreeAC.ino (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/examples/TurnOnGreeAC/platformio.ini (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/examples/TurnOnKelvinatorAC/TurnOnKelvinatorAC.ino (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/examples/TurnOnKelvinatorAC/platformio.ini (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/examples/TurnOnMitsubishiAC/TurnOnMitsubishiAC.ino (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/examples/TurnOnMitsubishiAC/platformio.ini (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/examples/TurnOnMitsubishiHeavyAc/TurnOnMitsubishiHeavyAc.ino (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/examples/TurnOnMitsubishiHeavyAc/platformio.ini (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/examples/TurnOnPanasonicAC/TurnOnPanasonicAC.ino (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/examples/TurnOnPanasonicAC/platformio.ini (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/examples/TurnOnToshibaAC/TurnOnToshibaAC.ino (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/examples/TurnOnToshibaAC/platformio.ini (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/examples/TurnOnTrotecAC/TurnOnTrotecAC.ino (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/examples/TurnOnTrotecAC/platformio.ini (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/examples/Web-AC-control/README.md (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/examples/Web-AC-control/Web-AC-control.h (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/examples/Web-AC-control/Web-AC-control.ino (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/examples/Web-AC-control/platformio.ini (93%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/examples/Web-AC-control/printscreen.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/keywords.txt (97%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/library.json (98%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/library.properties (96%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/platformio.ini (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/pylintrc (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/src/CPPLINT.cfg (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/src/IRac.cpp (99%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/src/IRac.h (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/src/IRrecv.cpp (96%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/src/IRrecv.h (97%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/src/IRremoteESP8266.h (98%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/src/IRsend.cpp (99%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/src/IRsend.h (96%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/src/IRtext.cpp (99%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/src/IRtext.h (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/src/IRtimer.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/src/IRtimer.h (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/src/IRutils.cpp (87%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/src/IRutils.h (83%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/src/i18n.h (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/src/ir_Airwell.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/src/ir_Airwell.h (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/src/ir_Aiwa.cpp (98%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/src/ir_Amcor.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/src/ir_Amcor.h (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/src/ir_Argo.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/src/ir_Argo.h (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/src/ir_Carrier.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/src/ir_Carrier.h (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/src/ir_Coolix.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/src/ir_Coolix.h (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/src/ir_Corona.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/src/ir_Corona.h (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/src/ir_Daikin.cpp (97%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/src/ir_Daikin.h (98%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/src/ir_Delonghi.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/src/ir_Delonghi.h (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/src/ir_Denon.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/src/ir_Dish.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/src/ir_Doshisha.cpp (100%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.15/src/ir_EcoClim.cpp rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/src/ir_Electra.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/src/ir_Electra.h (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/src/ir_EliteScreens.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/src/ir_Epson.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/src/ir_Fujitsu.cpp (99%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/src/ir_Fujitsu.h (94%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/src/ir_GICable.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/src/ir_GlobalCache.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/src/ir_Goodweather.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/src/ir_Goodweather.h (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/src/ir_Gree.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/src/ir_Gree.h (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/src/ir_Haier.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/src/ir_Haier.h (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/src/ir_Hitachi.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/src/ir_Hitachi.h (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/src/ir_Inax.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/src/ir_JVC.cpp (95%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/src/ir_Kelvinator.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/src/ir_Kelvinator.h (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/src/ir_LG.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/src/ir_LG.h (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/src/ir_Lasertag.cpp (98%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/src/ir_Lego.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/src/ir_Lutron.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/src/ir_MWM.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/src/ir_Magiquest.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/src/ir_Magiquest.h (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/src/ir_Metz.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/src/ir_Midea.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/src/ir_Midea.h (100%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.15/src/ir_MilesTag2.cpp rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/src/ir_Mirage.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/src/ir_Mitsubishi.cpp (88%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/src/ir_Mitsubishi.h (88%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/src/ir_MitsubishiHeavy.cpp (91%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/src/ir_MitsubishiHeavy.h (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/src/ir_Multibrackets.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/src/ir_NEC.cpp (96%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/src/ir_NEC.h (98%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/src/ir_Neoclima.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/src/ir_Neoclima.h (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/src/ir_Nikai.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/src/ir_Panasonic.cpp (95%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/src/ir_Panasonic.h (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/src/ir_Pioneer.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/src/ir_Pronto.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/src/ir_RC5_RC6.cpp (99%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/src/ir_RCMM.cpp (99%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/src/ir_Samsung.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/src/ir_Samsung.h (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/src/ir_Sanyo.cpp (97%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/src/ir_Sanyo.h (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/src/ir_Sharp.cpp (93%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/src/ir_Sharp.h (90%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/src/ir_Sherwood.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/src/ir_Sony.cpp (99%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/src/ir_Symphony.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/src/ir_Tcl.cpp (73%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/src/ir_Tcl.h (70%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/src/ir_Technibel.cpp (77%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.15/src/ir_Technibel.h rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/src/ir_Teco.cpp (75%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.15/src/ir_Teco.h rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/src/ir_Toshiba.cpp (85%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/src/ir_Toshiba.h (75%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/src/ir_Transcold.cpp (78%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/src/ir_Transcold.h (86%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/src/ir_Trotec.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/src/ir_Trotec.h (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/src/ir_Vestel.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/src/ir_Vestel.h (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/src/ir_Voltas.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/src/ir_Voltas.h (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/src/ir_Whirlpool.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/src/ir_Whirlpool.h (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/src/ir_Whynter.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/src/ir_Zepeal.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/src/locale/README.md (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/src/locale/de-CH.h (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/src/locale/de-DE.h (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/src/locale/defaults.h (99%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/src/locale/en-AU.h (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/src/locale/en-IE.h (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/src/locale/en-UK.h (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/src/locale/en-US.h (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/src/locale/es-ES.h (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/src/locale/fr-FR.h (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/src/locale/it-IT.h (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/src/locale/pt-BR.h (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/src/locale/zh-CN.h (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/test/IRac_test.cpp (99%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/test/IRrecv_test.cpp (96%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/test/IRrecv_test.h (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/test/IRsend_test.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/test/IRsend_test.h (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/test/IRutils_test.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/test/Makefile (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/test/ir_Airwell_test.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/test/ir_Aiwa_test.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/test/ir_Amcor_test.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/test/ir_Argo_test.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/test/ir_Carrier_test.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/test/ir_Coolix_test.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/test/ir_Corona_test.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/test/ir_Daikin_test.cpp (99%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/test/ir_Delonghi_test.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/test/ir_Denon_test.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/test/ir_Dish_test.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/test/ir_Doshisha_test.cpp (100%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.15/test/ir_Ecoclim_test.cpp rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/test/ir_Electra_test.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/test/ir_EliteScreens_test.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/test/ir_Epson_test.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/test/ir_Fujitsu_test.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/test/ir_GICable_test.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/test/ir_GlobalCache_test.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/test/ir_Goodweather_test.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/test/ir_Gree_test.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/test/ir_Haier_test.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/test/ir_Hitachi_test.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/test/ir_Inax_test.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/test/ir_JVC_test.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/test/ir_Kelvinator_test.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/test/ir_LG_test.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/test/ir_Lasertag_test.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/test/ir_Lego_test.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/test/ir_Lutron_test.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/test/ir_MWM_test.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/test/ir_Magiquest_test.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/test/ir_Metz_test.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/test/ir_Midea_test.cpp (100%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.15/test/ir_Milestag2_test.cpp rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/test/ir_Mirage_test.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/test/ir_MitsubishiHeavy_test.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/test/ir_Mitsubishi_test.cpp (89%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/test/ir_Multibrackets_test.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/test/ir_NEC_test.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/test/ir_Neoclima_test.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/test/ir_Nikai_test.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/test/ir_Panasonic_test.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/test/ir_Pioneer_test.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/test/ir_Pronto_test.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/test/ir_RC5_RC6_test.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/test/ir_RCMM_test.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/test/ir_Samsung_test.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/test/ir_Sanyo_test.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/test/ir_Sharp_test.cpp (95%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/test/ir_Sherwood_test.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/test/ir_Sony_test.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/test/ir_Symphony_test.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/test/ir_Tcl_test.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/test/ir_Technibel_test.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/test/ir_Teco_test.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/test/ir_Toshiba_test.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/test/ir_Transcold_test.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/test/ir_Trotec_test.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/test/ir_Vestel_test.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/test/ir_Voltas_test.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/test/ir_Whirlpool_test.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/test/ir_Whynter_test.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/test/ir_Zepeal_test.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/tools/Makefile (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/tools/RawToGlobalCache.sh (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/tools/auto_analyse_raw_data.py (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/tools/auto_analyse_raw_data_test.py (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/tools/gc_decode.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/tools/generate_irtext_h.sh (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/tools/mkkeywords (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/tools/mode2_decode.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/tools/raw_to_pronto_code.py (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/tools/raw_to_pronto_code_test.py (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.14 => IRremoteESP8266-2.7.15}/tools/scrape_supported_devices.py (100%) diff --git a/CHANGELOG.md b/CHANGELOG.md index 196566592..f02a8257f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ All notable changes to this project will be documented in this file. - Support for Frysk language translations by Christiaan Heerze - ESP8266 Fallback to ``*.bin.gz`` binary when OTA upload of ``*.bin`` binary fails - Berry language improved Tasmota integration +- IRremoteESP8266 library from v2.7.14 to v2.7.15 ## [9.2.0.6] 20210210 ### Changed diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/annotated.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/annotated.html deleted file mode 100644 index a92687ec7..000000000 --- a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/annotated.html +++ /dev/null @@ -1,178 +0,0 @@ - - - - - - - -IRremoteESP8266: Class List - - - - - - - - - -

-
- - - - - - -
-
IRremoteESP8266 -
-
-
- - - - - - - -
- -
-
- - -
- -
- -
-
-
Class List
-
-
-
Here are the classes, structs, unions and interfaces with brief descriptions:
-
[detail level 12]
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 NstdAcEnumerators and Structures for the Common A/C API
 Cstate_tStructure to hold a common A/C state
 CAirwellProtocolNative representation of a Airwell A/C message
 CAmcorProtocolNative representation of a Amcor A/C message
 CArgoProtocolNative representation of a Argo A/C message
 CCarrierProtocolNative representation of a Carrier A/C message
 CCoolixProtocolNative representation of a Coolix A/C message
 CCoronaProtocolNative representation of a Corona A/C message
 CCoronaSectionNative representation of a section of a Corona A/C message
 CDaikin128ProtocolNative representation of a Daikin128 A/C message
 CDaikin152ProtocolNative representation of a Daikin152 A/C message
 CDaikin160ProtocolNative representation of a Daikin160 A/C message
 CDaikin176ProtocolNative representation of a Daikin176 A/C message
 CDaikin216ProtocolNative representation of a Daikin216 A/C message
 CDaikin2ProtocolNative representation of a Daikin2 A/C message
 CDaikin64ProtocolNative representation of a Daikin64 A/C message
 CDaikinESPProtocolNative representation of a Daikin A/C message
 Cdecode_resultsResults returned from the decoder
 CDelonghiProtocolNative representation of a Delonghi A/C message
 CElectraProtocolNative representation of a Electra A/C message
 CGoodweatherProtocolNative representation of a Goodweather A/C message
 CGreeProtocolNative representation of a Gree A/C message
 CHaierProtocolNative representation of a Haier HSU07-HEA03 A/C message
 CHaierYRW02ProtocolNative representation of a Haier YRW02 A/C message
 CHitachi1ProtocolNative representation of a Hitachi 104-bit A/C message
 CHitachi424ProtocolNative representation of a Hitachi 53-byte/424-bit A/C message
 CHitachiProtocolNative representation of a Hitachi 224-bit A/C message
 CIRacA universal/common/generic interface for controling supported A/Cs
 CIRAirwellAcClass for handling detailed Airwell A/C messages
 CIRAmcorAcClass for handling detailed Amcor A/C messages
 CIRArgoACClass for handling detailed Argo A/C messages
 CIRCarrierAc64Class for handling detailed Carrier 64 bit A/C messages
 CIRCoolixACClass for handling detailed Coolix A/C messages
 CIRCoronaAcClass for handling detailed Corona A/C messages
 CIRDaikin128Class for handling detailed Daikin 128-bit A/C messages
 CIRDaikin152Class for handling detailed Daikin 152-bit A/C messages
 CIRDaikin160Class for handling detailed Daikin 160-bit A/C messages
 CIRDaikin176Class for handling detailed Daikin 176-bit A/C messages
 CIRDaikin2Class for handling detailed Daikin 312-bit A/C messages
 CIRDaikin216Class for handling detailed Daikin 216-bit A/C messages
 CIRDaikin64Class for handling detailed Daikin 64-bit A/C messages
 CIRDaikinESPClass for handling detailed Daikin 280-bit A/C messages
 CIRDelonghiAcClass for handling detailed Delonghi A/C messages
 CIRElectraAcClass for handling detailed Electra A/C messages
 CIRFujitsuACClass for handling detailed Fujitsu A/C messages
 CIRGoodweatherAcClass for handling detailed Goodweather A/C messages
 CIRGreeACClass for handling detailed Gree A/C messages
 CIRHaierACClass for handling detailed Haier A/C messages
 CIRHaierACYRW02Class for handling detailed Haier ACYRW02 A/C messages
 CIRHitachiAcClass for handling detailed Hitachi 224-bit A/C messages
 CIRHitachiAc1Class for handling detailed Hitachi 104-bit A/C messages
 CIRHitachiAc3Class for handling detailed Hitachi 15to27-byte/120to216-bit A/C messages
 CIRHitachiAc344Class for handling detailed Hitachi 344-bit A/C messages
 CIRHitachiAc424Class for handling detailed Hitachi 53-byte/424-bit A/C messages
 CIRKelvinatorACClass for handling detailed Kelvinator A/C messages
 CIRLgAcClass for handling detailed LG A/C messages
 CIRMideaACClass for handling detailed Midea A/C messages
 CIRMitsubishi112Class for handling detailed Mitsubishi 122-bit A/C messages
 CIRMitsubishi136Class for handling detailed Mitsubishi 136-bit A/C messages
 CIRMitsubishiACClass for handling detailed Mitsubishi 144-bit A/C messages
 CIRMitsubishiHeavy152AcClass for handling detailed Mitsubishi Heavy 152-bit A/C messages
 CIRMitsubishiHeavy88AcClass for handling detailed Mitsubishi Heavy 88-bit A/C messages
 CIRNeoclimaAcClass for handling detailed Neoclima A/C messages
 CIRPanasonicAcClass for handling detailed Panasonic A/C messages
 CIRPanasonicAc32Class for handling detailed Panasonic 32bit A/C messages
 Cirparams_tInformation for the interrupt handler
 CIRrecvClass for receiving IR messages
 CIRSamsungAcClass for handling detailed Samsung A/C messages
 CIRSanyoAcClass for handling detailed Sanyo A/C messages
 CIRsendClass for sending all basic IR protocols
 CIRSharpAcClass for handling detailed Sharp A/C messages
 CIRTcl112AcClass for handling detailed TCL A/C messages
 CIRTechnibelAcClass for handling detailed Technibel A/C messages
 CIRTecoAcClass for handling detailed Teco A/C messages
 CIRtimerThis class offers a simple counter in micro-seconds since instantiated
 CIRToshibaACClass for handling detailed Toshiba A/C messages
 CIRTranscoldAcClass for handling detailed Transcold A/C messages
 CIRTrotecESPClass for handling detailed Trotec A/C messages
 CIRVestelAcClass for handling detailed Vestel A/C messages
 CIRVoltasClass for handling detailed Voltas A/C messages
 CIRWhirlpoolAcClass for handling detailed Whirlpool A/C messages
 CKelvinatorProtocolNative representation of a Kelvinator A/C message
 CLGProtocolNative representation of a LG A/C message
 CmagiquestMagiQuest packet is both Wand ID and magnitude of swish and flick
 Cmatch_result_tResults from a data match
 CMideaProtocolNative representation of a Midea A/C message
 CMitsubishi112ProtocolNative representation of a Mitsubishi 112-bit A/C message
 CMitsubishi136ProtocolNative representation of a Mitsubishi 136-bit A/C message
 CMitsubishi144ProtocolNative representation of a Mitsubishi 144-bit A/C message
 CMitsubishi152ProtocolNative representation of a Mitsubishi Heavy 152-bit A/C message
 CMitsubishi88ProtocolNative representation of a Mitsubishi Heavy 88-bit A/C message
 CNeoclimaProtocolNative representation of a Neoclima A/C message
 CPanasonicAc32ProtocolNative representation of a Panasonic 32-bit A/C message
 CSamsungProtocolNative representation of a Samsung A/C message
 CSanyoProtocolNative representation of a Sanyo A/C message
 CSharpProtocolNative representation of a Sharp A/C message
 CTimerMsThis class offers a simple counter in milli-seconds since instantiated
 CVoltasProtocolNative representation of a Voltas A/C message
-
-
- - - - diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRTcl112Ac__coll__graph.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRTcl112Ac__coll__graph.map deleted file mode 100644 index 206ef60dc..000000000 --- a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRTcl112Ac__coll__graph.map +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRTcl112Ac__coll__graph.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRTcl112Ac__coll__graph.md5 deleted file mode 100644 index b7845c7a0..000000000 --- a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRTcl112Ac__coll__graph.md5 +++ /dev/null @@ -1 +0,0 @@ -b01bf74458107df4a91e8d68cd7bd7c2 \ No newline at end of file diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRTcl112Ac__coll__graph.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRTcl112Ac__coll__graph.png deleted file mode 100644 index 713bce3fb12da126a2761dc964636db9878bc7fc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2945 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 Ba$*1g diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRTechnibelAc__coll__graph.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRTechnibelAc__coll__graph.map deleted file mode 100644 index d66eb5d21..000000000 --- a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRTechnibelAc__coll__graph.map +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRTechnibelAc__coll__graph.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRTechnibelAc__coll__graph.md5 deleted file mode 100644 index 26ba223dc..000000000 --- a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRTechnibelAc__coll__graph.md5 +++ /dev/null @@ -1 +0,0 @@ -765ed53b484f35c6ead23d4d08827992 \ No newline at end of file diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRTechnibelAc__coll__graph.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRTechnibelAc__coll__graph.png deleted file mode 100644 index 27d8bbdb97ec017c32fa1bbb270f1d62bfe1380c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3199 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 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRTecoAc__coll__graph.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRTecoAc__coll__graph.map deleted file mode 100644 index f3e5d1502..000000000 --- a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRTecoAc__coll__graph.map +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRTecoAc__coll__graph.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRTecoAc__coll__graph.md5 deleted file mode 100644 index b08a20fd3..000000000 --- a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRTecoAc__coll__graph.md5 +++ /dev/null @@ -1 +0,0 @@ -70b332a49408f4e1d8c532bf7d103f45 \ No newline at end of file diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRTecoAc__coll__graph.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRTecoAc__coll__graph.png deleted file mode 100644 index 60d06d0839e714fc567f6101fea03934da83da8d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3054 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 Z1ei}+-M;H!h64+Dz(Chjr&ilB{9m7R$PNGi diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRToshibaAC__coll__graph.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRToshibaAC__coll__graph.map deleted file mode 100644 index 483543b42..000000000 --- a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRToshibaAC__coll__graph.map +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRToshibaAC__coll__graph.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRToshibaAC__coll__graph.md5 deleted file mode 100644 index b4f1e5ba5..000000000 --- a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRToshibaAC__coll__graph.md5 +++ /dev/null @@ -1 +0,0 @@ -c09eeaf5909d6c222783788bba05faaf \ No newline at end of file diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRToshibaAC__coll__graph.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRToshibaAC__coll__graph.png deleted file mode 100644 index c1bfa564da481a1b5716bfc5f461d10dffa40f2d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3399 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 - - - - - - -IRremoteESP8266: Member List - - - - - - - - - -
-
- - - - - - -
-
IRremoteESP8266 -
-
-
- - - - - - - - -
-
- - -
- -
- -
-
-
-
IRTranscoldAc Member List
-
-
- -

This is the complete list of members for IRTranscoldAc, including all inherited members.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
_irsendIRTranscoldAcprivate
begin()IRTranscoldAc
calibrate(void)IRTranscoldAcinline
convertFan(const stdAc::fanspeed_t speed)IRTranscoldAc
convertMode(const stdAc::opmode_t mode)IRTranscoldAc
getFan()IRTranscoldAc
getMode()IRTranscoldAc
getNormalState(void)IRTranscoldAcprivate
getPower()IRTranscoldAc
getRaw()IRTranscoldAc
getSwing()IRTranscoldAc
getTemp()IRTranscoldAc
getTempRaw()IRTranscoldAcprivate
handleSpecialState(const uint32_t data)IRTranscoldAcprivate
IRTranscoldAc(const uint16_t pin, const bool inverted=false, const bool use_modulation=true)IRTranscoldAcexplicit
isSpecialState(void)IRTranscoldAcprivate
off()IRTranscoldAc
on()IRTranscoldAc
powerFlagIRTranscoldAcprivate
recoverSavedState(void)IRTranscoldAcprivate
remote_stateIRTranscoldAcprivate
saved_stateIRTranscoldAcprivate
send(const uint16_t repeat=kTranscoldDefaultRepeat)IRTranscoldAc
setFan(const uint8_t speed, const bool modecheck=true)IRTranscoldAc
setMode(const uint8_t mode)IRTranscoldAc
setPower(const bool state)IRTranscoldAc
setRaw(const uint32_t new_code)IRTranscoldAc
setSwing()IRTranscoldAc
setTemp(const uint8_t temp)IRTranscoldAc
setTempRaw(const uint8_t code)IRTranscoldAcprivate
stateReset()IRTranscoldAc
swingFlagIRTranscoldAcprivate
swingHFlagIRTranscoldAcprivate
swingVFlagIRTranscoldAcprivate
toCommon(const stdAc::state_t *prev=NULL)IRTranscoldAc
toCommonFanSpeed(const uint8_t speed)IRTranscoldAcstatic
toCommonMode(const uint8_t mode)IRTranscoldAcstatic
toString()IRTranscoldAc
updateSavedState(void)IRTranscoldAcprivate
- - - - diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRTranscoldAc__coll__graph.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRTranscoldAc__coll__graph.map deleted file mode 100644 index e70c9c95d..000000000 --- a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRTranscoldAc__coll__graph.map +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRTranscoldAc__coll__graph.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRTranscoldAc__coll__graph.md5 deleted file mode 100644 index 517bf816e..000000000 --- a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRTranscoldAc__coll__graph.md5 +++ /dev/null @@ -1 +0,0 @@ -6fe69bbccc1b788ab10dea841be7cbf1 \ No newline at end of file diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRTranscoldAc__coll__graph.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRTranscoldAc__coll__graph.png deleted file mode 100644 index d19e26b4eeed7ea5ef76fd48215ca901e71e5750..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3498 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 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Technibel_8h.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Technibel_8h.html deleted file mode 100644 index a744c9920..000000000 --- a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Technibel_8h.html +++ /dev/null @@ -1,704 +0,0 @@ - - - - - - - -IRremoteESP8266: src/ir_Technibel.h File Reference - - - - - - - - - -
-
- - - - - - -
-
IRremoteESP8266 -
-
-
- - - - - - - - -
-
- - -
- -
- - -
-
- -
-
ir_Technibel.h File Reference
-
-
- -

Support for Technibel protocol. -More...

- -

Go to the source code of this file.

- - - - - -

-Classes

class  IRTechnibelAc
 Class for handling detailed Technibel A/C messages. More...
 
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

-Variables

const uint8_t kTechnibelAcChecksumOffset = 0
 
const uint8_t kTechnibelAcChecksumSize = 8
 
const uint8_t kTechnibelAcFooterOffset
 
const uint8_t kTechnibelAcFooterSize = 8
 
const uint8_t kTechnibelAcTimerHoursOffset
 
const uint8_t kTechnibelAcHoursSize = 8
 
const uint8_t kTechnibelAcTimerMax = 24
 
const uint8_t kTechnibelAcTempOffset
 
const uint8_t kTechnibelAcTempSize = 8
 
const uint8_t kTechnibelAcTempMinC = 16
 
const uint8_t kTechnibelAcTempMaxC = 31
 
const uint8_t kTechnibelAcTempMinF = 61
 
const uint8_t kTechnibelAcTempMaxF = 88
 
const uint8_t kTechnibelAcFanOffset
 
const uint8_t kTechnibelAcFanSize = 4
 
const uint8_t kTechnibelAcFanLow = 0b0001
 
const uint8_t kTechnibelAcFanMedium = 0b0010
 
const uint8_t kTechnibelAcFanHigh = 0b0100
 
const uint8_t kTechnibelAcSleepBit
 
const uint8_t kTechnibelAcSwingBit = kTechnibelAcSleepBit + 1
 
const uint8_t kTechnibelAcTempUnitBit = kTechnibelAcSwingBit + 1
 
const uint8_t kTechnibelAcTimerEnableBit = kTechnibelAcTempUnitBit + 1
 
const uint8_t kTechnibelAcModeOffset = kTechnibelAcTimerEnableBit + 1
 
const uint8_t kTechnibelAcModeSize = 4
 
const uint8_t kTechnibelAcCool = 0b0001
 
const uint8_t kTechnibelAcDry = 0b0010
 
const uint8_t kTechnibelAcFan = 0b0100
 
const uint8_t kTechnibelAcHeat = 0b1000
 
const uint8_t kTechnibelAcFanChangeBit
 
const uint8_t kTechnibelAcTempChangeBit = kTechnibelAcFanChangeBit + 1
 
const uint8_t kTechnibelAcTimerChangeBit = kTechnibelAcTempChangeBit + 1
 
const uint8_t kTechnibelAcPowerBit = kTechnibelAcTimerChangeBit + 1
 
const uint8_t kTechnibelAcHeaderOffset = kTechnibelAcPowerBit + 1
 
const uint8_t kTechnibelAcHeaderSize = 8
 
const uint8_t kTechnibelAcHeader = 0b00011000
 
const uint64_t kTechnibelAcResetState = 0x180101140000EA
 Mode:Cool, Power:Off, fan:Low, temp:20, swing:Off, sleep:Off. More...
 
-

Detailed Description

-

Support for Technibel protocol.

-

Variable Documentation

- -

◆ kTechnibelAcChecksumOffset

- -
-
- - - - -
const uint8_t kTechnibelAcChecksumOffset = 0
-
- -
-
- -

◆ kTechnibelAcChecksumSize

- -
-
- - - - -
const uint8_t kTechnibelAcChecksumSize = 8
-
- -
-
- -

◆ kTechnibelAcCool

- -
-
- - - - -
const uint8_t kTechnibelAcCool = 0b0001
-
- -
-
- -

◆ kTechnibelAcDry

- -
-
- - - - -
const uint8_t kTechnibelAcDry = 0b0010
-
- -
-
- -

◆ kTechnibelAcFan

- -
-
- - - - -
const uint8_t kTechnibelAcFan = 0b0100
-
- -
-
- -

◆ kTechnibelAcFanChangeBit

- -
-
- - - - -
const uint8_t kTechnibelAcFanChangeBit
-
-
- -

◆ kTechnibelAcFanHigh

- -
-
- - - - -
const uint8_t kTechnibelAcFanHigh = 0b0100
-
- -
-
- -

◆ kTechnibelAcFanLow

- -
-
- - - - -
const uint8_t kTechnibelAcFanLow = 0b0001
-
- -
-
- -

◆ kTechnibelAcFanMedium

- -
-
- - - - -
const uint8_t kTechnibelAcFanMedium = 0b0010
-
- -
-
- -

◆ kTechnibelAcFanOffset

- -
-
- - - - -
const uint8_t kTechnibelAcFanOffset
-
-
- -

◆ kTechnibelAcFanSize

- -
-
- - - - -
const uint8_t kTechnibelAcFanSize = 4
-
- -
-
- -

◆ kTechnibelAcFooterOffset

- -
-
- - - - -
const uint8_t kTechnibelAcFooterOffset
-
-
- -

◆ kTechnibelAcFooterSize

- -
-
- - - - -
const uint8_t kTechnibelAcFooterSize = 8
-
- -
-
- -

◆ kTechnibelAcHeader

- -
-
- - - - -
const uint8_t kTechnibelAcHeader = 0b00011000
-
- -
-
- -

◆ kTechnibelAcHeaderOffset

- -
-
- - - - -
const uint8_t kTechnibelAcHeaderOffset = kTechnibelAcPowerBit + 1
-
- -
-
- -

◆ kTechnibelAcHeaderSize

- -
-
- - - - -
const uint8_t kTechnibelAcHeaderSize = 8
-
- -
-
- -

◆ kTechnibelAcHeat

- -
-
- - - - -
const uint8_t kTechnibelAcHeat = 0b1000
-
- -
-
- -

◆ kTechnibelAcHoursSize

- -
-
- - - - -
const uint8_t kTechnibelAcHoursSize = 8
-
- -
-
- -

◆ kTechnibelAcModeOffset

- -
-
- - - - -
const uint8_t kTechnibelAcModeOffset = kTechnibelAcTimerEnableBit + 1
-
- -
-
- -

◆ kTechnibelAcModeSize

- -
-
- - - - -
const uint8_t kTechnibelAcModeSize = 4
-
- -
-
- -

◆ kTechnibelAcPowerBit

- -
-
- - - - -
const uint8_t kTechnibelAcPowerBit = kTechnibelAcTimerChangeBit + 1
-
- -
-
- -

◆ kTechnibelAcResetState

- -
-
- - - - -
const uint64_t kTechnibelAcResetState = 0x180101140000EA
-
- -

Mode:Cool, Power:Off, fan:Low, temp:20, swing:Off, sleep:Off.

- -
-
- -

◆ kTechnibelAcSleepBit

- -
-
- - - - -
const uint8_t kTechnibelAcSleepBit
-
-Initial value: -
-
- -

◆ kTechnibelAcSwingBit

- -
-
- - - - -
const uint8_t kTechnibelAcSwingBit = kTechnibelAcSleepBit + 1
-
- -
-
- -

◆ kTechnibelAcTempChangeBit

- -
-
- - - - -
const uint8_t kTechnibelAcTempChangeBit = kTechnibelAcFanChangeBit + 1
-
- -
-
- -

◆ kTechnibelAcTempMaxC

- -
-
- - - - -
const uint8_t kTechnibelAcTempMaxC = 31
-
- -
-
- -

◆ kTechnibelAcTempMaxF

- -
-
- - - - -
const uint8_t kTechnibelAcTempMaxF = 88
-
- -
-
- -

◆ kTechnibelAcTempMinC

- -
-
- - - - -
const uint8_t kTechnibelAcTempMinC = 16
-
- -
-
- -

◆ kTechnibelAcTempMinF

- -
-
- - - - -
const uint8_t kTechnibelAcTempMinF = 61
-
- -
-
- -

◆ kTechnibelAcTempOffset

- -
-
- - - - -
const uint8_t kTechnibelAcTempOffset
-
-
- -

◆ kTechnibelAcTempSize

- -
-
- - - - -
const uint8_t kTechnibelAcTempSize = 8
-
- -
-
- -

◆ kTechnibelAcTempUnitBit

- -
-
- - - - -
const uint8_t kTechnibelAcTempUnitBit = kTechnibelAcSwingBit + 1
-
- -
-
- -

◆ kTechnibelAcTimerChangeBit

- -
-
- - - - -
const uint8_t kTechnibelAcTimerChangeBit = kTechnibelAcTempChangeBit + 1
-
- -
-
- -

◆ kTechnibelAcTimerEnableBit

- -
-
- - - - -
const uint8_t kTechnibelAcTimerEnableBit = kTechnibelAcTempUnitBit + 1
-
- -
-
- -

◆ kTechnibelAcTimerHoursOffset

- -
-
- - - - -
const uint8_t kTechnibelAcTimerHoursOffset
-
-
- -

◆ kTechnibelAcTimerMax

- -
-
- - - - -
const uint8_t kTechnibelAcTimerMax = 24
-
- -
-
-
-
const uint8_t kTechnibelAcFooterSize
Definition: ir_Technibel.h:50
-
const uint8_t kTechnibelAcFanSize
Definition: ir_Technibel.h:67
-
const uint8_t kTechnibelAcChecksumOffset
Definition: ir_Technibel.h:45
-
const uint8_t kTechnibelAcTempOffset
Definition: ir_Technibel.h:57
-
const uint8_t kTechnibelAcFanOffset
Definition: ir_Technibel.h:65
-
const uint8_t kTechnibelAcModeOffset
Definition: ir_Technibel.h:82
-
const uint8_t kTechnibelAcHoursSize
Definition: ir_Technibel.h:54
-
const uint8_t kTechnibelAcTempSize
Definition: ir_Technibel.h:59
-
const uint8_t kTechnibelAcTimerHoursOffset
Definition: ir_Technibel.h:52
-
const uint8_t kTechnibelAcFooterOffset
Definition: ir_Technibel.h:48
-
const uint8_t kTechnibelAcModeSize
Definition: ir_Technibel.h:83
-
const uint8_t kTechnibelAcChecksumSize
Definition: ir_Technibel.h:46
- - - - diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Technibel_8h_source.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Technibel_8h_source.html deleted file mode 100644 index 6c9cc9ecd..000000000 --- a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Technibel_8h_source.html +++ /dev/null @@ -1,328 +0,0 @@ - - - - - - - -IRremoteESP8266: src/ir_Technibel.h Source File - - - - - - - - - -
-
- - - - - - -
-
IRremoteESP8266 -
-
-
- - - - - - - - -
-
- - -
- -
- - -
-
-
-
ir_Technibel.h
-
-
-Go to the documentation of this file.
1 // Copyright 2020 Quentin Briollant
-
2 
-
5 
-
6 #ifndef IR_TECHNIBEL_H_
-
7 #define IR_TECHNIBEL_H_
-
8 
-
9 #define __STDC_LIMIT_MACROS
-
10 #include <stdint.h>
-
11 #ifndef UNIT_TEST
-
12 #include <Arduino.h>
-
13 #endif
-
14 #include "IRremoteESP8266.h"
-
15 #include "IRsend.h"
-
16 #ifdef UNIT_TEST
-
17 #include "IRsend_test.h"
-
18 #endif
-
19 
-
20 // Supports:
-
21 // Brand: Technibel, Model: IRO PLUS
-
22 
-
23 
-
24 /* State bit map:
-
25 
-
26 +--+--+--+--+--+--+--+--+--+------------+-----------+----------+--+--+--+--+
-
27 | FIXED HEADER |ON|TIMER CHANGE|TEMP CHANGE|FAN CHANGE| MODE |
-
28 +--+--+--+--+--+--+--+--+--+------------+-----------+----------+--+--+--+--+
-
29  55 54 53 52 51 50 49 48 47 46 45 44 43 42 41 40
-
30 
-
31 +-----+------+-----+-----+---+--+--+--+---+--+--+--+--+--+--+--+
-
32 |TIMER|C OR F|SWING|SLEEP| 0 | FAN | 0 | TEMPERATURE |
-
33 +-----+------+-----+-----+---+--+--+--+---+--+--+--+--+--+--+--+
-
34  39 38 37 36 35 34 33 32 31 30 29 28 27 26 25 24
-
35 
-
36 +---+---+---+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
-
37 | 0 | 0 | 0 | ON TIME HOUR | FOOTER | CHECKSUM |
-
38 +---+---+---+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
-
39  23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
-
40 
-
41 
-
42 */
-
43 
-
44 // Constants
-
45 const uint8_t kTechnibelAcChecksumOffset = 0;
-
46 const uint8_t kTechnibelAcChecksumSize = 8;
-
47 
- - -
50 const uint8_t kTechnibelAcFooterSize = 8;
-
51 
- - -
54 const uint8_t kTechnibelAcHoursSize = 8; // Max 24 hrs
-
55 const uint8_t kTechnibelAcTimerMax = 24;
-
56 
- - -
59 const uint8_t kTechnibelAcTempSize = 8;
-
60 const uint8_t kTechnibelAcTempMinC = 16; // Deg C
-
61 const uint8_t kTechnibelAcTempMaxC = 31; // Deg C
-
62 const uint8_t kTechnibelAcTempMinF = 61; // Deg F
-
63 const uint8_t kTechnibelAcTempMaxF = 88; // Deg F
-
64 
- - -
67 const uint8_t kTechnibelAcFanSize = 4;
-
68 const uint8_t kTechnibelAcFanLow = 0b0001;
-
69 const uint8_t kTechnibelAcFanMedium = 0b0010;
-
70 const uint8_t kTechnibelAcFanHigh = 0b0100;
-
71 
- - -
74 
- -
76 
-
77 // (0 = Celsius, 1 = Fahrenheit)
- -
79 
- -
81 
- -
83 const uint8_t kTechnibelAcModeSize = 4;
-
84 const uint8_t kTechnibelAcCool = 0b0001;
-
85 const uint8_t kTechnibelAcDry = 0b0010;
-
86 const uint8_t kTechnibelAcFan = 0b0100;
-
87 const uint8_t kTechnibelAcHeat = 0b1000;
-
88 
- - -
91 
- -
93 
- -
95 
- -
97 
- -
99 const uint8_t kTechnibelAcHeaderSize = 8;
-
100 const uint8_t kTechnibelAcHeader = 0b00011000;
-
101 
-
102 const uint64_t kTechnibelAcResetState = 0x180101140000EA;
-
103 
-
105 
-
106 // Classes
- -
109  public:
-
110  explicit IRTechnibelAc(const uint16_t pin, const bool inverted = false,
-
111  const bool use_modulation = true);
-
112  void stateReset();
-
113 #if SEND_TECHNIBEL_AC
-
114  void send(const uint16_t repeat = kTechnibelAcDefaultRepeat);
-
119  int8_t calibrate(void) { return _irsend.calibrate(); }
-
120 #endif // SEND_TECHNIBEL_AC
-
121  void begin();
-
122  static uint8_t calcChecksum(const uint64_t state);
-
123  static bool validChecksum(const uint64_t state);
-
124  void setPower(const bool on);
-
125  bool getPower();
-
126  void on();
-
127  void off();
-
128  void setTempUnit(const bool celsius);
-
129  bool getTempUnit(void);
-
130  void setTemp(const uint8_t temp, const bool fahrenheit = false);
-
131  uint8_t getTemp();
-
132  void setFan(const uint8_t speed);
-
133  uint8_t getFan();
-
134  void setMode(const uint8_t mode);
-
135  uint8_t getMode();
-
136  void setSwing(const bool on);
-
137  bool getSwing();
-
138  bool convertSwing(const stdAc::swingv_t swing);
-
139  stdAc::swingv_t toCommonSwing(const bool swing);
-
140  void setSleep(const bool on);
-
141  bool getSleep();
-
142  void setTimerEnabled(const bool on);
-
143  bool getTimerEnabled(void);
-
144  void setTimer(const uint16_t nr_of_mins);
-
145  uint16_t getTimer(void);
-
146  uint64_t getRaw();
-
147  void setRaw(const uint64_t state);
-
148  uint8_t convertMode(const stdAc::opmode_t mode);
-
149  uint8_t convertFan(const stdAc::fanspeed_t speed);
-
150  static stdAc::opmode_t toCommonMode(const uint8_t mode);
-
151  static stdAc::fanspeed_t toCommonFanSpeed(const uint8_t speed);
-
152  stdAc::state_t toCommon(void);
-
153  String toString();
-
154 #ifndef UNIT_TEST
-
155 
-
156  private:
- -
158 #else
-
159  IRsendTest _irsend;
-
160 #endif
-
161  uint64_t remote_state; // The state of the IR remote.
-
162  uint8_t _saved_temp; // The previously user requested temp value.
-
163  uint8_t _saved_temp_units; // The previously user requested temp units.
-
164  void checksum(void);
-
165 };
-
166 #endif // IR_TECHNIBEL_H_
-
-
IRsendTest _irsend
Definition: ir_Technibel.h:159
-
String toString()
Convert the current internal state into a human readable string.
Definition: ir_Technibel.cpp:399
-
static uint8_t calcChecksum(const uint64_t state)
Compute the checksum of the supplied state.
Definition: ir_Technibel.cpp:109
-
bool getTempUnit(void)
Get the temperature unit setting.
Definition: ir_Technibel.cpp:180
-
void setMode(const uint8_t mode)
Set the operating mode of the A/C.
Definition: ir_Technibel.cpp:260
-
uint8_t getTemp()
Get the current temperature setting.
Definition: ir_Technibel.cpp:198
-
uint16_t getTimer(void)
Get the timer time for when the A/C unit will switch power state.
Definition: ir_Technibel.cpp:365
-
void stateReset()
Reset the internal state of the emulation.
Definition: ir_Technibel.cpp:134
-
const uint8_t kTechnibelAcFooterSize
Definition: ir_Technibel.h:50
-
const uint8_t kTechnibelAcTempMinF
Definition: ir_Technibel.h:62
-
void begin()
Set up hardware to be able to send a message.
Definition: ir_Technibel.cpp:96
-
swingv_t
Common A/C settings for Vertical Swing.
Definition: IRsend.h:70
-
const uint8_t kTechnibelAcFanLow
Definition: ir_Technibel.h:68
-
fanspeed_t
Common A/C settings for Fan Speeds.
Definition: IRsend.h:58
-
const uint8_t kTechnibelAcFanSize
Definition: ir_Technibel.h:67
-
static stdAc::opmode_t toCommonMode(const uint8_t mode)
Convert a native mode into its stdAc equivalent.
Definition: ir_Technibel.cpp:292
-
void setRaw(const uint64_t state)
Set the internal state from a valid code for this protocol.
Definition: ir_Technibel.cpp:149
-
IRTechnibelAc(const uint16_t pin, const bool inverted=false, const bool use_modulation=true)
Class constructor.
Definition: ir_Technibel.cpp:91
-
void setTempUnit(const bool celsius)
Set the temperature unit setting.
Definition: ir_Technibel.cpp:173
- -
void setTimer(const uint16_t nr_of_mins)
Set the timer for when the A/C unit will switch off.
Definition: ir_Technibel.cpp:355
-
void checksum(void)
Set the checksum of the internal state.
Definition: ir_Technibel.cpp:127
-
static bool validChecksum(const uint64_t state)
Confirm the checksum of the supplied state is valid.
Definition: ir_Technibel.cpp:121
-
Class for sending all basic IR protocols.
Definition: IRsend.h:182
-
const uint8_t kTechnibelAcChecksumOffset
Definition: ir_Technibel.h:45
-
const uint8_t kTechnibelAcTimerEnableBit
Definition: ir_Technibel.h:80
-
int8_t calibrate(uint16_t hz=38000U)
Calculate & set any offsets to account for execution times during sending.
Definition: IRsend.cpp:207
-
bool getPower()
Get the value of the current power setting.
Definition: ir_Technibel.cpp:167
-
void setTemp(const uint8_t temp, const bool fahrenheit=false)
Set the temperature.
Definition: ir_Technibel.cpp:187
-
uint64_t remote_state
Definition: ir_Technibel.h:161
-
uint64_t getRaw()
Get a copy of the internal state/code for this protocol.
Definition: ir_Technibel.cpp:142
-
std::string String
Definition: IRremoteESP8266.h:1178
-
const uint8_t kTechnibelAcTempMaxC
Definition: ir_Technibel.h:61
-
const uint8_t kTechnibelAcTempOffset
Definition: ir_Technibel.h:57
-
const uint8_t kTechnibelAcSleepBit
Definition: ir_Technibel.h:72
- -
stdAc::swingv_t toCommonSwing(const bool swing)
Convert a native swing into its stdAc equivalent.
Definition: ir_Technibel.cpp:323
-
const uint8_t kTechnibelAcFanOffset
Definition: ir_Technibel.h:65
-
const uint8_t kTechnibelAcFanHigh
Definition: ir_Technibel.h:70
-
const uint8_t kTechnibelAcTimerMax
Definition: ir_Technibel.h:55
-
void send(const uint16_t repeat=kTechnibelAcDefaultRepeat)
Send the current internal state as an IR message.
Definition: ir_Technibel.cpp:101
-
void off()
Set the requested power state of the A/C to off.
Definition: ir_Technibel.cpp:157
-
const uint8_t kTechnibelAcCool
Definition: ir_Technibel.h:84
-
const uint8_t kTechnibelAcTimerChangeBit
Definition: ir_Technibel.h:94
-
const uint8_t kTechnibelAcFan
Definition: ir_Technibel.h:86
-
const uint8_t kTechnibelAcHeader
Definition: ir_Technibel.h:100
-
bool getTimerEnabled(void)
Is the timer function enabled?
Definition: ir_Technibel.cpp:347
-
bool getSleep()
Get the Sleep setting of the A/C.
Definition: ir_Technibel.cpp:335
-
const uint8_t kTechnibelAcHeat
Definition: ir_Technibel.h:87
-
const uint8_t kTechnibelAcFanChangeBit
Definition: ir_Technibel.h:89
-
const uint8_t kTechnibelAcHeaderSize
Definition: ir_Technibel.h:99
-
Class for handling detailed Technibel A/C messages.
Definition: ir_Technibel.h:108
-
stdAc::state_t toCommon(void)
Convert the current internal state into its stdAc::state_t equivalent.
Definition: ir_Technibel.cpp:373
-
const uint8_t kTechnibelAcPowerBit
Definition: ir_Technibel.h:96
-
uint8_t convertFan(const stdAc::fanspeed_t speed)
Convert a stdAc::fanspeed_t enum into it's native speed.
Definition: ir_Technibel.cpp:230
-
const uint8_t kTechnibelAcSwingBit
Definition: ir_Technibel.h:75
-
uint8_t _saved_temp
Definition: ir_Technibel.h:162
-
const uint8_t kTechnibelAcTempUnitBit
Definition: ir_Technibel.h:78
-
const uint8_t kTechnibelAcModeOffset
Definition: ir_Technibel.h:82
-
const uint8_t kTechnibelAcHeaderOffset
Definition: ir_Technibel.h:98
-
const uint8_t kTechnibelAcHoursSize
Definition: ir_Technibel.h:54
-
bool getSwing()
Get the (vertical) swing setting of the A/C.
Definition: ir_Technibel.cpp:309
-
const uint8_t kTechnibelAcTempMinC
Definition: ir_Technibel.h:60
-
const uint8_t kTechnibelAcTempSize
Definition: ir_Technibel.h:59
-
const uint8_t kTechnibelAcTimerHoursOffset
Definition: ir_Technibel.h:52
-
uint8_t _saved_temp_units
Definition: ir_Technibel.h:163
-
uint8_t getFan()
Get the current fan speed setting.
Definition: ir_Technibel.cpp:223
-
const uint64_t kTechnibelAcResetState
Mode:Cool, Power:Off, fan:Low, temp:20, swing:Off, sleep:Off.
Definition: ir_Technibel.h:102
-
void setTimerEnabled(const bool on)
Set the enable timer setting.
Definition: ir_Technibel.cpp:341
-
const uint16_t kTechnibelAcDefaultRepeat
Definition: IRremoteESP8266.h:929
-
void setSwing(const bool on)
Set the (vertical) swing setting of the A/C.
Definition: ir_Technibel.cpp:303
-
uint8_t getMode()
Get the operating mode setting of the A/C.
Definition: ir_Technibel.cpp:254
-
int8_t calibrate(void)
Run the calibration to calculate uSec timing offsets for this platform.
Definition: ir_Technibel.h:119
-
static stdAc::fanspeed_t toCommonFanSpeed(const uint8_t speed)
Convert a native fan speed into its stdAc equivalent.
Definition: ir_Technibel.cpp:244
-
const uint8_t kTechnibelAcFanMedium
Definition: ir_Technibel.h:69
-
const uint8_t kTechnibelAcFooterOffset
Definition: ir_Technibel.h:48
-
void on()
Set the requested power state of the A/C to on.
Definition: ir_Technibel.cpp:154
-
Structure to hold a common A/C state.
Definition: IRsend.h:97
-
bool convertSwing(const stdAc::swingv_t swing)
Convert a stdAc::swingv_t enum into it's native swing.
Definition: ir_Technibel.cpp:316
-
uint8_t convertMode(const stdAc::opmode_t mode)
Convert a stdAc::opmode_t enum into its native mode.
Definition: ir_Technibel.cpp:280
-
const uint8_t kTechnibelAcDry
Definition: ir_Technibel.h:85
-
const uint8_t kTechnibelAcModeSize
Definition: ir_Technibel.h:83
-
const uint8_t kTechnibelAcChecksumSize
Definition: ir_Technibel.h:46
-
const uint8_t kTechnibelAcTempMaxF
Definition: ir_Technibel.h:63
-
IRsend _irsend
Definition: ir_Technibel.h:157
-
void setPower(const bool on)
Change the power setting.
Definition: ir_Technibel.cpp:161
-
void setSleep(const bool on)
Set the Sleep setting of the A/C.
Definition: ir_Technibel.cpp:329
-
void setFan(const uint8_t speed)
Set the speed of the fan.
Definition: ir_Technibel.cpp:204
-
const uint8_t kTechnibelAcTempChangeBit
Definition: ir_Technibel.h:92
-
opmode_t
Common A/C settings for A/C operating modes.
Definition: IRsend.h:46
- - - - diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/all_1.js b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/all_1.js deleted file mode 100644 index 85b1dada7..000000000 --- a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/all_1.js +++ /dev/null @@ -1,30 +0,0 @@ -var searchData= -[ - ['a705_87',['A705',['../unionSharpProtocol.html#a17a7db01f34cacdc975e64e738233d72',1,'SharpProtocol::A705()'],['../IRsend_8h.html#a258e4af12642d613587149fa734e45e7a7478bee154c89b576fd478d9623d9281',1,'A705(): IRsend.h']]], - ['a907_88',['A907',['../IRsend_8h.html#a258e4af12642d613587149fa734e45e7a11c3296670bdeab9ddd87e4edb875e64',1,'IRsend.h']]], - ['add_89',['add',['../classIRtimer.html#aa8e3ff975ae5468b4727790c828fa032',1,'IRtimer::add()'],['../classTimerMs.html#a77bfc23a029a9172c3dbac03f746b0cb',1,'TimerMs::add()']]], - ['addbooltostring_90',['addBoolToString',['../namespaceirutils.html#a12ba9cf1830a886649a80c3cc5fdce2b',1,'irutils']]], - ['adddaytostring_91',['addDayToString',['../namespaceirutils.html#a6ead1d10578c64627f8a24b5d8a7444f',1,'irutils']]], - ['addfantostring_92',['addFanToString',['../namespaceirutils.html#af222d5a977e2cd2c979184c449d3c2f8',1,'irutils']]], - ['addinttostring_93',['addIntToString',['../namespaceirutils.html#a772e623c4b60208200e02afbaec66651',1,'irutils']]], - ['addlabeledstring_94',['addLabeledString',['../namespaceirutils.html#ac98793392d1e65c1b8d6895eb9d9b75b',1,'irutils']]], - ['addmodeltostring_95',['addModelToString',['../namespaceirutils.html#a06e5a5c2b6f6649035dfa5eb19801367',1,'irutils']]], - ['addmodetostring_96',['addModeToString',['../namespaceirutils.html#a8b74ae0258e98aa0eaebc6f3efe1481e',1,'irutils']]], - ['address_97',['address',['../classdecode__results.html#a2858c3a5e28eccca95d44aaa87b70e9e',1,'decode_results']]], - ['addtemptostring_98',['addTempToString',['../namespaceirutils.html#a0cef0634f4db979a93b7dc19cc2b4a85',1,'irutils']]], - ['airflow_99',['AirFlow',['../unionGoodweatherProtocol.html#a7b876552a27a7a9bf84b1009f7b12f7a',1,'GoodweatherProtocol']]], - ['airwell_100',['airwell',['../classIRac.html#a26cd62e09250d87b652d35406ebfb159',1,'IRac::airwell()'],['../IRremoteESP8266_8h.html#ad5b287a488a8c1b7b8661f029ab56fada0cd75c2edaa4c674d679dbb39635990a',1,'AIRWELL(): IRremoteESP8266.h']]], - ['airwellprotocol_101',['AirwellProtocol',['../unionAirwellProtocol.html',1,'']]], - ['aiwa_5frc_5ft501_102',['AIWA_RC_T501',['../IRremoteESP8266_8h.html#ad5b287a488a8c1b7b8661f029ab56fada7dc14b2c4769ef9de663c2e2165d8f75',1,'IRremoteESP8266.h']]], - ['akb75215403_103',['AKB75215403',['../IRsend_8h.html#a50c54713e16502d280723334879dc83ba37d3851f43307f1e1eac46c5fbf3f08a',1,'IRsend.h']]], - ['altmode_104',['AltMode',['../unionDaikin176Protocol.html#a05511938e152951723792dc08b33d0dd',1,'Daikin176Protocol']]], - ['amcor_105',['amcor',['../classIRac.html#a4bad16621b232572e14fe4a53f678131',1,'IRac::amcor()'],['../IRremoteESP8266_8h.html#ad5b287a488a8c1b7b8661f029ab56fada1325ba25674d7a99562f15a1b392086b',1,'AMCOR(): IRremoteESP8266.h']]], - ['amcorprotocol_106',['AmcorProtocol',['../unionAmcorProtocol.html',1,'']]], - ['ardb1_107',['ARDB1',['../IRsend_8h.html#a7204e78a1fe37a819c0b66f87a685dc0a6f6fcd0be917d91b71c1b80b5446ee5b',1,'IRsend.h']]], - ['argo_108',['argo',['../classIRac.html#aa06ee1314529dbf96f4e6f3c28ea6821',1,'IRac::argo()'],['../IRremoteESP8266_8h.html#ad5b287a488a8c1b7b8661f029ab56fadac9ff1fa84905b54238b16d31197efb72',1,'ARGO(): IRremoteESP8266.h']]], - ['argoprotocol_109',['ArgoProtocol',['../unionArgoProtocol.html',1,'']]], - ['arjw2_110',['ARJW2',['../IRsend_8h.html#a7204e78a1fe37a819c0b66f87a685dc0acbca1f3d199103d8cb9d856b9089cdc4',1,'IRsend.h']]], - ['arrah2e_111',['ARRAH2E',['../IRsend_8h.html#a7204e78a1fe37a819c0b66f87a685dc0a6ccf47af1067e794e02e21f03389297b',1,'IRsend.h']]], - ['arreb1e_112',['ARREB1E',['../IRsend_8h.html#a7204e78a1fe37a819c0b66f87a685dc0a2443ff6f0181dbc1af275c709d67147a',1,'IRsend.h']]], - ['arry4_113',['ARRY4',['../IRsend_8h.html#a7204e78a1fe37a819c0b66f87a685dc0aee3994c5a4a8447463d67df2cdf5a946',1,'IRsend.h']]] -]; diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/all_11.js b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/all_11.js deleted file mode 100644 index bff3b3ac0..000000000 --- a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/all_11.js +++ /dev/null @@ -1,6 +0,0 @@ -var searchData= -[ - ['quiet_3131',['quiet',['../structstdAc_1_1state__t.html#a251ad14e187a9905137e9e4e010c3e34',1,'stdAc::state_t::quiet()'],['../unionDaikinESPProtocol.html#af93324815f6be6cfc5d0d50af9e73aad',1,'DaikinESPProtocol::Quiet()'],['../unionDaikin2Protocol.html#afa111c9afbc94bcf52e9ba15b59c1bee',1,'Daikin2Protocol::Quiet()'],['../unionDaikin152Protocol.html#ac5bfe8541e53cb2732bfcbc71500ed32',1,'Daikin152Protocol::Quiet()'],['../unionKelvinatorProtocol.html#ac803fe14d6d21155418d2fe0543c9d9f',1,'KelvinatorProtocol::Quiet()']]], - ['quiet1_3132',['Quiet1',['../unionSamsungProtocol.html#ac38e3f34f98ac3dae9738a1582dfeca6',1,'SamsungProtocol']]], - ['quiet5_3133',['Quiet5',['../unionSamsungProtocol.html#a94a9d2b42e1ab7a308d079322350c3f9',1,'SamsungProtocol']]] -]; diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/all_17.js b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/all_17.js deleted file mode 100644 index 0b45cbddf..000000000 --- a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/all_17.js +++ /dev/null @@ -1,12 +0,0 @@ -var searchData= -[ - ['wall_3510',['Wall',['../unionDaikin128Protocol.html#aed2c5bc365820f2c0a5f27dd68fa8a05',1,'Daikin128Protocol']]], - ['wand_5fid_3511',['wand_id',['../unionmagiquest.html#a1b159cd47635d548e1d4198cd6d41e93',1,'magiquest']]], - ['weeklytimer_3512',['WeeklyTimer',['../unionDaikinESPProtocol.html#a25e632da82856caebd233699fda8d796',1,'DaikinESPProtocol']]], - ['whirlpool_3513',['whirlpool',['../classIRac.html#ae5f7a03589f614c03c5ad8629100b05a',1,'IRac']]], - ['whirlpool_5fac_3514',['WHIRLPOOL_AC',['../IRremoteESP8266_8h.html#ad5b287a488a8c1b7b8661f029ab56fada9faf927323d110269541b356f079b85a',1,'IRremoteESP8266.h']]], - ['whirlpool_5fac_5fremote_5fmodel_5ft_3515',['whirlpool_ac_remote_model_t',['../IRsend_8h.html#ab4e3ebf2fdf3c6a46da89a3e6ebcd2e2',1,'IRsend.h']]], - ['whynter_3516',['WHYNTER',['../IRremoteESP8266_8h.html#ad5b287a488a8c1b7b8661f029ab56fada458cdd7fa2b29dc8617c694696580c0c',1,'IRremoteESP8266.h']]], - ['widevane_3517',['WideVane',['../unionMitsubishi144Protocol.html#ad0c48e95ca7e0658edf7c2ac2b541c3c',1,'Mitsubishi144Protocol']]], - ['wifi_3518',['WiFi',['../unionGreeProtocol.html#a6cf8e0a6c54a5d2b6f14074c6f3dcc92',1,'GreeProtocol::WiFi()'],['../unionVoltasProtocol.html#aae1406825a156f159c5ad4b28d20364c',1,'VoltasProtocol::Wifi()']]] -]; diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/all_1a.js b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/all_1a.js deleted file mode 100644 index b73a1ecc8..000000000 --- a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/all_1a.js +++ /dev/null @@ -1,7 +0,0 @@ -var searchData= -[ - ['zepeal_3523',['ZEPEAL',['../IRremoteESP8266_8h.html#ad5b287a488a8c1b7b8661f029ab56fada1622e3d0835b4d47add716811c7bf797',1,'IRremoteESP8266.h']]], - ['zh_2dcn_2eh_3524',['zh-CN.h',['../zh-CN_8h.html',1,'']]], - ['zonefollow1_3525',['ZoneFollow1',['../unionCoolixProtocol.html#a5f19a21823bbdb6d5deceb03db0d3d5b',1,'CoolixProtocol']]], - ['zonefollow2_3526',['ZoneFollow2',['../unionCoolixProtocol.html#ade33ba99bcfcf9d7dac334e56e9bb167',1,'CoolixProtocol']]] -]; diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/all_1b.js b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/all_1b.js deleted file mode 100644 index 502c01110..000000000 --- a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/all_1b.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['_7eirrecv_3527',['~IRrecv',['../classIRrecv.html#a87d4cca5e350177cb0922842dda1eb5b',1,'IRrecv']]] -]; diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/all_4.js b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/all_4.js deleted file mode 100644 index d2fa6aac2..000000000 --- a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/all_4.js +++ /dev/null @@ -1,136 +0,0 @@ -var searchData= -[ - ['d_188',['D',['../unionMitsubishi152Protocol.html#ac493830f3bf09e178aa09b24368746c9',1,'Mitsubishi152Protocol']]], - ['daikin_189',['daikin',['../classIRac.html#afb6d77bbeb5b2465437cef4f58b83e0e',1,'IRac::daikin()'],['../IRremoteESP8266_8h.html#ad5b287a488a8c1b7b8661f029ab56fadad8dc0597fd237d7098246334f3b5f37e',1,'DAIKIN(): IRremoteESP8266.h']]], - ['daikin128_190',['daikin128',['../classIRac.html#a8fe7c254e1bcb32b6b6fdc1f91693a50',1,'IRac::daikin128()'],['../IRremoteESP8266_8h.html#ad5b287a488a8c1b7b8661f029ab56fada4b26fb376f6375dd6d1d4be186438f88',1,'DAIKIN128(): IRremoteESP8266.h']]], - ['daikin128protocol_191',['Daikin128Protocol',['../unionDaikin128Protocol.html',1,'']]], - ['daikin152_192',['daikin152',['../classIRac.html#a6dff8e608e3e9fecffe71c3fd1ebe74e',1,'IRac::daikin152()'],['../IRremoteESP8266_8h.html#ad5b287a488a8c1b7b8661f029ab56fadad3f5f7ca39aee5fdab671a1b0d647ae4',1,'DAIKIN152(): IRremoteESP8266.h']]], - ['daikin152protocol_193',['Daikin152Protocol',['../unionDaikin152Protocol.html',1,'']]], - ['daikin160_194',['daikin160',['../classIRac.html#a3b34f44d713efa52f30d43405cde831c',1,'IRac::daikin160()'],['../IRremoteESP8266_8h.html#ad5b287a488a8c1b7b8661f029ab56fada4db6a848df3aed4289801e1b2bbbf6aa',1,'DAIKIN160(): IRremoteESP8266.h']]], - ['daikin160protocol_195',['Daikin160Protocol',['../unionDaikin160Protocol.html',1,'']]], - ['daikin176_196',['daikin176',['../classIRac.html#aaae173fd58a7b53c3f4d2edbf7c4afe7',1,'IRac::daikin176()'],['../IRremoteESP8266_8h.html#ad5b287a488a8c1b7b8661f029ab56fada57f78a3b04d904f19d10bac13483deab',1,'DAIKIN176(): IRremoteESP8266.h']]], - ['daikin176protocol_197',['Daikin176Protocol',['../unionDaikin176Protocol.html',1,'']]], - ['daikin2_198',['daikin2',['../classIRac.html#a89eddc0e1b3c41c608208d2752dc954c',1,'IRac::daikin2()'],['../IRremoteESP8266_8h.html#ad5b287a488a8c1b7b8661f029ab56fadab37b344f84d575ec78a92ca55e153586',1,'DAIKIN2(): IRremoteESP8266.h']]], - ['daikin216_199',['daikin216',['../classIRac.html#a101ac8b9e9564e557ef1a1f61ff111d9',1,'IRac::daikin216()'],['../IRremoteESP8266_8h.html#ad5b287a488a8c1b7b8661f029ab56fadaa833fa3a20c3cbb7e6206dac4da30ffb',1,'DAIKIN216(): IRremoteESP8266.h']]], - ['daikin216protocol_200',['Daikin216Protocol',['../unionDaikin216Protocol.html',1,'']]], - ['daikin2protocol_201',['Daikin2Protocol',['../unionDaikin2Protocol.html',1,'']]], - ['daikin64_202',['daikin64',['../classIRac.html#a074db6fc0cff2878d80a397020e1b249',1,'IRac::daikin64()'],['../IRremoteESP8266_8h.html#ad5b287a488a8c1b7b8661f029ab56fada70581853ce4883b747d22fdfd74409c4',1,'DAIKIN64(): IRremoteESP8266.h']]], - ['daikin64protocol_203',['Daikin64Protocol',['../unionDaikin64Protocol.html',1,'']]], - ['daikinespprotocol_204',['DaikinESPProtocol',['../unionDaikinESPProtocol.html',1,'']]], - ['data_205',['data',['../structmatch__result__t.html#ae88be61a6d1ffa7c3525aa958f4c0d25',1,'match_result_t']]], - ['data0_206',['Data0',['../structCoronaSection.html#a975b14d8bc30807013714158ef7474ea',1,'CoronaSection']]], - ['data0inv_207',['Data0Inv',['../structCoronaSection.html#ab05024b8314929dcd8ccdda9b497be8c',1,'CoronaSection']]], - ['data1_208',['Data1',['../structCoronaSection.html#a59d97a1bc0a1be50b6f96c4d70673425',1,'CoronaSection']]], - ['data1inv_209',['Data1Inv',['../structCoronaSection.html#ada247bbfb60f24cd9e9a612c9621cbb4',1,'CoronaSection']]], - ['de_2dch_2eh_210',['de-CH.h',['../de-CH_8h.html',1,'']]], - ['de_2dde_2eh_211',['de-DE.h',['../de-DE_8h.html',1,'']]], - ['decode_212',['decode',['../classIRrecv.html#aeaa5c07a8b46f8fbb982f996cc1f9f4b',1,'IRrecv']]], - ['decode_5fresults_213',['decode_results',['../classdecode__results.html',1,'']]], - ['decode_5ftype_214',['decode_type',['../classdecode__results.html#a9c0e9f161b9c90dc10b7561d4c0b50fa',1,'decode_results']]], - ['decode_5ftype_5ft_215',['decode_type_t',['../IRremoteESP8266_8h.html#ad5b287a488a8c1b7b8661f029ab56fad',1,'IRremoteESP8266.h']]], - ['decodeairwell_216',['decodeAirwell',['../classIRrecv.html#acf4635d5ee146a82498cb0c269b6af41',1,'IRrecv']]], - ['decodeaiwarct501_217',['decodeAiwaRCT501',['../classIRrecv.html#aa4d678376a4c0f8ea953474a6f5ef9d2',1,'IRrecv']]], - ['decodeamcor_218',['decodeAmcor',['../classIRrecv.html#a8d81fcfb47e36925975d313027689a44',1,'IRrecv']]], - ['decodeargo_219',['decodeArgo',['../classIRrecv.html#a94f12dc000a6e7b75ea8680fd48fc487',1,'IRrecv']]], - ['decodecarrierac_220',['decodeCarrierAC',['../classIRrecv.html#acf3d1c37038120a5c0996d92577ce74a',1,'IRrecv']]], - ['decodecarrierac40_221',['decodeCarrierAC40',['../classIRrecv.html#a4bdb35ec34f49401a6b9becd15b8a3b5',1,'IRrecv']]], - ['decodecarrierac64_222',['decodeCarrierAC64',['../classIRrecv.html#a79d03c31da48a385ab47cc8f342ef9b3',1,'IRrecv']]], - ['decodecoolix_223',['decodeCOOLIX',['../classIRrecv.html#a964af7e72e2133688f0596c718cb98ca',1,'IRrecv']]], - ['decodecoronaac_224',['decodeCoronaAc',['../classIRrecv.html#a981cba14551c93af57f9c1c0e1775d12',1,'IRrecv']]], - ['decodedaikin_225',['decodeDaikin',['../classIRrecv.html#a141f0de9f4cae8daeb025aff3904ecaa',1,'IRrecv']]], - ['decodedaikin128_226',['decodeDaikin128',['../classIRrecv.html#ac7188577c874d9f8f19304a3ec775415',1,'IRrecv']]], - ['decodedaikin152_227',['decodeDaikin152',['../classIRrecv.html#ab20a6586b4e56cc428012ec96f5ccc2c',1,'IRrecv']]], - ['decodedaikin160_228',['decodeDaikin160',['../classIRrecv.html#af0b9822defe6b29099079d664d9dc413',1,'IRrecv']]], - ['decodedaikin176_229',['decodeDaikin176',['../classIRrecv.html#aa142d1340201b6fdc5b462f46fe21ee0',1,'IRrecv']]], - ['decodedaikin2_230',['decodeDaikin2',['../classIRrecv.html#a4c4799a0d45ea5562159c46939617d80',1,'IRrecv']]], - ['decodedaikin216_231',['decodeDaikin216',['../classIRrecv.html#a7f860686a5c58aa8f4d1842cfb15b2f9',1,'IRrecv']]], - ['decodedaikin64_232',['decodeDaikin64',['../classIRrecv.html#a030701f081a9c6eab0c07b75433b524c',1,'IRrecv']]], - ['decodedelonghiac_233',['decodeDelonghiAc',['../classIRrecv.html#a8c91cc83770d243e942387cc16e9ca6f',1,'IRrecv']]], - ['decodedenon_234',['decodeDenon',['../classIRrecv.html#a0b1bd1c817cb43bc3755126191b7f4a2',1,'IRrecv']]], - ['decodedish_235',['decodeDISH',['../classIRrecv.html#a851776d9178aeb706d9a1abd3f254e31',1,'IRrecv']]], - ['decodedoshisha_236',['decodeDoshisha',['../classIRrecv.html#a675c45e6b32aaeca3de734ccf2f0c819',1,'IRrecv']]], - ['decodeelectraac_237',['decodeElectraAC',['../classIRrecv.html#ad3a7be8afc36451c8e28e27f3c3e9aaa',1,'IRrecv']]], - ['decodeelitescreens_238',['decodeElitescreens',['../classIRrecv.html#ac830ece2c2c200b8c13fcd66828e2846',1,'IRrecv']]], - ['decodeepson_239',['decodeEpson',['../classIRrecv.html#aaadef8415f273ba25f4086fecd681d2e',1,'IRrecv']]], - ['decodefujitsuac_240',['decodeFujitsuAC',['../classIRrecv.html#aa3778bdf994bf9c99ac48ef95434a826',1,'IRrecv']]], - ['decodegicable_241',['decodeGICable',['../classIRrecv.html#afade8dac9b1d023e5e0946e6b2c08aea',1,'IRrecv']]], - ['decodegoodweather_242',['decodeGoodweather',['../classIRrecv.html#a64650ce7dbaf5fc860a6a253d906e9de',1,'IRrecv']]], - ['decodegree_243',['decodeGree',['../classIRrecv.html#a2e756342d7524a13d53d6c656700638c',1,'IRrecv']]], - ['decodehaierac_244',['decodeHaierAC',['../classIRrecv.html#ad97403174f05197a7fa9a4a0107e3111',1,'IRrecv']]], - ['decodehaieracyrw02_245',['decodeHaierACYRW02',['../classIRrecv.html#a281fb9d972fee75db49209c42f649822',1,'IRrecv']]], - ['decodehash_246',['decodeHash',['../classIRrecv.html#a7c15fbfa7936ca474712a1953911fd06',1,'IRrecv']]], - ['decodehitachiac_247',['decodeHitachiAC',['../classIRrecv.html#aa42facfffc0e304005272b6ddd4583c8',1,'IRrecv']]], - ['decodehitachiac1_248',['decodeHitachiAC1',['../classIRrecv.html#a122e0dcbf14c90ec2d77399acce21459',1,'IRrecv']]], - ['decodehitachiac3_249',['decodeHitachiAc3',['../classIRrecv.html#a113bc834eff00f55d5545ce3fa1ab203',1,'IRrecv']]], - ['decodehitachiac424_250',['decodeHitachiAc424',['../classIRrecv.html#a01c3dda56d6d916076fa1affa2213129',1,'IRrecv']]], - ['decodeinax_251',['decodeInax',['../classIRrecv.html#a94545c6a8da027b9cb0e23ecba4c29d8',1,'IRrecv']]], - ['decodejvc_252',['decodeJVC',['../classIRrecv.html#a25ab71efc223a418e9630d8421f44bc9',1,'IRrecv']]], - ['decodekelvinator_253',['decodeKelvinator',['../classIRrecv.html#a0ac82f20b48b2d71ee07eb392578b226',1,'IRrecv']]], - ['decodelasertag_254',['decodeLasertag',['../classIRrecv.html#ae4af614a45ea65cb3304ef5bd7965122',1,'IRrecv']]], - ['decodelegopf_255',['decodeLegoPf',['../classIRrecv.html#aea75ad0ba1d8fec33de16501940f2553',1,'IRrecv']]], - ['decodelg_256',['decodeLG',['../classIRrecv.html#afe70015c36b1477a5de0c193163e13a7',1,'IRrecv']]], - ['decodelutron_257',['decodeLutron',['../classIRrecv.html#a6093c4404a9a9d415c5bfeab5ec53be5',1,'IRrecv']]], - ['decodemagiquest_258',['decodeMagiQuest',['../classIRrecv.html#a6f3bfcc6767484151dee758bcf94fb0b',1,'IRrecv']]], - ['decodemetz_259',['decodeMetz',['../classIRrecv.html#ac39aa52eec10d1c92b6e9713a22252b6',1,'IRrecv']]], - ['decodemidea_260',['decodeMidea',['../classIRrecv.html#a255b15601f7439a09ab5e77ad78816fb',1,'IRrecv']]], - ['decodemidea24_261',['decodeMidea24',['../classIRrecv.html#a62a04019308b29ae2aea4b3a83ba9155',1,'IRrecv']]], - ['decodemirage_262',['decodeMirage',['../classIRrecv.html#aa88813f830a6ff6bfd6e7bde6728a3d5',1,'IRrecv']]], - ['decodemitsubishi_263',['decodeMitsubishi',['../classIRrecv.html#a6efe3be80f0ebef3ff94ed0e56c5c52a',1,'IRrecv']]], - ['decodemitsubishi112_264',['decodeMitsubishi112',['../classIRrecv.html#ae0690ff3cb5a5cdcdb6a514bb7bf0cdd',1,'IRrecv']]], - ['decodemitsubishi136_265',['decodeMitsubishi136',['../classIRrecv.html#a87b3ee57dbdf762a0e305ddd43eec629',1,'IRrecv']]], - ['decodemitsubishi2_266',['decodeMitsubishi2',['../classIRrecv.html#a9514197850491a5b8c30ae9ffc89d895',1,'IRrecv']]], - ['decodemitsubishiac_267',['decodeMitsubishiAC',['../classIRrecv.html#a942c5f41df5cbff32a8b7703673cb621',1,'IRrecv']]], - ['decodemitsubishiheavy_268',['decodeMitsubishiHeavy',['../classIRrecv.html#aef9cedf79793806df4cc5376710781bc',1,'IRrecv']]], - ['decodemultibrackets_269',['decodeMultibrackets',['../classIRrecv.html#af61afacc9865232643164ba824e665ab',1,'IRrecv']]], - ['decodemwm_270',['decodeMWM',['../classIRrecv.html#a27518b5d792cdf3ab333b324f409f328',1,'IRrecv']]], - ['decodenec_271',['decodeNEC',['../classIRrecv.html#a52b844f80df7f64edf9ce9cc189ac5b9',1,'IRrecv']]], - ['decodeneoclima_272',['decodeNeoclima',['../classIRrecv.html#a4729ee949e533448b481ae33bbbf1adf',1,'IRrecv']]], - ['decodenikai_273',['decodeNikai',['../classIRrecv.html#abbcbf5fc07d7e37d7724acc37bb5f592',1,'IRrecv']]], - ['decodepanasonic_274',['decodePanasonic',['../classIRrecv.html#aa8dd5f24d28576c6db03cc463bd0a865',1,'IRrecv']]], - ['decodepanasonicac_275',['decodePanasonicAC',['../classIRrecv.html#a0f78e180ed731e8fb16d1c85aa721c95',1,'IRrecv']]], - ['decodepanasonicac32_276',['decodePanasonicAC32',['../classIRrecv.html#a89ce20e483b1297cae05ab1ae96d24ec',1,'IRrecv']]], - ['decodepioneer_277',['decodePioneer',['../classIRrecv.html#a78a9487cbe8a562392a07a4090b3091e',1,'IRrecv']]], - ['decoderc5_278',['decodeRC5',['../classIRrecv.html#adab9dffbeceee514520fababd0e721bd',1,'IRrecv']]], - ['decoderc6_279',['decodeRC6',['../classIRrecv.html#a67316499ef37db82e3b3ecaac25c5980',1,'IRrecv']]], - ['decodercmm_280',['decodeRCMM',['../classIRrecv.html#a0e7bf769cb5bebf174e852e4b0b08cf3',1,'IRrecv']]], - ['decodesamsung_281',['decodeSAMSUNG',['../classIRrecv.html#a18b6cf177364faf11b9a076dd2025eec',1,'IRrecv']]], - ['decodesamsung36_282',['decodeSamsung36',['../classIRrecv.html#a290a9e6a0b12ef1fe02a92a456c8ad57',1,'IRrecv']]], - ['decodesamsungac_283',['decodeSamsungAC',['../classIRrecv.html#ae779c76ebd0f3cd1fc13abaa55f80d67',1,'IRrecv']]], - ['decodesanyoac_284',['decodeSanyoAc',['../classIRrecv.html#ab6c02d8b8079d7f344e141e6a4e7e225',1,'IRrecv']]], - ['decodesanyolc7461_285',['decodeSanyoLC7461',['../classIRrecv.html#a01a165bf2e7d16dbbb916d1eae740bc5',1,'IRrecv']]], - ['decodesharp_286',['decodeSharp',['../classIRrecv.html#a3390d63ba21a835d7c74c261532a22a7',1,'IRrecv']]], - ['decodesharpac_287',['decodeSharpAc',['../classIRrecv.html#a8a9b920079f783e236f8a938e20b9743',1,'IRrecv']]], - ['decodesony_288',['decodeSony',['../classIRrecv.html#ab03227955cf7d1d00c1620c55d7f9f18',1,'IRrecv']]], - ['decodesymphony_289',['decodeSymphony',['../classIRrecv.html#a61cdf4d891654521afbc6ca9fb415745',1,'IRrecv']]], - ['decodetechnibelac_290',['decodeTechnibelAc',['../classIRrecv.html#a2f022741309ad814bf11aec440a838d0',1,'IRrecv']]], - ['decodeteco_291',['decodeTeco',['../classIRrecv.html#a950711d7df8dfe4cda86f53650cd9f56',1,'IRrecv']]], - ['decodetoshibaac_292',['decodeToshibaAC',['../classIRrecv.html#aae6ab687ae319ae50a52238916bcfb1a',1,'IRrecv']]], - ['decodetostate_293',['decodeToState',['../namespaceIRAcUtils.html#ac5eb498bf12cb6cba023c9c1e9726949',1,'IRAcUtils']]], - ['decodetranscold_294',['decodeTranscold',['../classIRrecv.html#a16c44538d7e01d9b118d983de39d18e3',1,'IRrecv']]], - ['decodetrotec_295',['decodeTrotec',['../classIRrecv.html#ae2920c488173f3fa37f5325438157ced',1,'IRrecv']]], - ['decodevestelac_296',['decodeVestelAc',['../classIRrecv.html#a5d48b3c91434c18c7726cca504d75b73',1,'IRrecv']]], - ['decodevoltas_297',['decodeVoltas',['../classIRrecv.html#a43539320036ba1c17e9875e4dc9fd055',1,'IRrecv']]], - ['decodewhirlpoolac_298',['decodeWhirlpoolAC',['../classIRrecv.html#a0d1eec83cf092f5621cb34b3e94777c4',1,'IRrecv']]], - ['decodewhynter_299',['decodeWhynter',['../classIRrecv.html#a66289f6a462557ad26e6c0a64f36cf02',1,'IRrecv']]], - ['decodezepeal_300',['decodeZepeal',['../classIRrecv.html#a72afd857c8b2e0192021a40afc96c2d8',1,'IRrecv']]], - ['defaultbits_301',['defaultBits',['../classIRsend.html#a70a2256bee8ad9b8ea8571dd4f26596f',1,'IRsend']]], - ['defaults_2eh_302',['defaults.h',['../defaults_8h.html',1,'']]], - ['degrees_303',['degrees',['../structstdAc_1_1state__t.html#a3d1ff0ff2e0035db4ee8ead5c53b2dbd',1,'stdAc::state_t']]], - ['delonghi_5fac_304',['DELONGHI_AC',['../IRremoteESP8266_8h.html#ad5b287a488a8c1b7b8661f029ab56fada149190c9dec98e9c3f4a2bd530b154a3',1,'IRremoteESP8266.h']]], - ['delonghiac_305',['delonghiac',['../classIRac.html#af290b0b08cff5121bb88c62051ed1074',1,'IRac']]], - ['delonghiprotocol_306',['DelonghiProtocol',['../unionDelonghiProtocol.html',1,'']]], - ['denon_307',['DENON',['../IRremoteESP8266_8h.html#ad5b287a488a8c1b7b8661f029ab56fada2bda37b76abb290d1675c3e027e3c2e1',1,'IRremoteESP8266.h']]], - ['deprecated_20list_308',['Deprecated List',['../deprecated.html',1,'']]], - ['dg11j13a_309',['DG11J13A',['../IRsend_8h.html#ab4e3ebf2fdf3c6a46da89a3e6ebcd2e2a868d69f0605cf9151b0163a3481e2fb9',1,'IRsend.h']]], - ['dg11j191_310',['DG11J191',['../IRsend_8h.html#ab4e3ebf2fdf3c6a46da89a3e6ebcd2e2adaecfc16f36975f231db2507a8a36c0c',1,'IRsend.h']]], - ['disableirin_311',['disableIRIn',['../classIRrecv.html#a9f4a719e756ad78c7dd47186f8bef087',1,'IRrecv']]], - ['disableofftimer_312',['disableOffTimer',['../classIRDaikinESP.html#a1e4e05ad0799002d0ab25db92dcaac06',1,'IRDaikinESP::disableOffTimer()'],['../classIRDaikin2.html#a8cbdbc0de31b14f974cd8cd87f3ca54a',1,'IRDaikin2::disableOffTimer()']]], - ['disableontimer_313',['disableOnTimer',['../classIRDaikinESP.html#a0733e4a15d76baac23493926ef1765b1',1,'IRDaikinESP::disableOnTimer()'],['../classIRDaikin2.html#a170a1e9ddb7873dc1392184a85387cc3',1,'IRDaikin2::disableOnTimer()']]], - ['disablesensor_314',['disableSensor',['../unionMideaProtocol.html#a20cc2079eae404c980cc75101b4a3116',1,'MideaProtocol']]], - ['disablesleeptimer_315',['disableSleepTimer',['../classIRDaikin2.html#a152532ef9d905e26930ae145a9623877',1,'IRDaikin2']]], - ['dish_316',['DISH',['../IRremoteESP8266_8h.html#ad5b287a488a8c1b7b8661f029ab56fadac27c6ac38ba872593af8e46ac2fdc85a',1,'IRremoteESP8266.h']]], - ['display_317',['Display',['../unionSamsungProtocol.html#aac97ebabee022e772aa00d4357079eb4',1,'SamsungProtocol']]], - ['displaytemp_318',['DisplayTemp',['../unionGreeProtocol.html#ad0756a64f9c90c9dd12ca6cd71c78bb2',1,'GreeProtocol']]], - ['doshisha_319',['DOSHISHA',['../IRremoteESP8266_8h.html#ad5b287a488a8c1b7b8661f029ab56fadab4566b260773b60c85450f40fa5b4341',1,'IRremoteESP8266.h']]], - ['doxygen_5findex_2emd_320',['doxygen_index.md',['../doxygen__index_8md.html',1,'']]] -]; diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/all_5.js b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/all_5.js deleted file mode 100644 index 269dcf306..000000000 --- a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/all_5.js +++ /dev/null @@ -1,39 +0,0 @@ -var searchData= -[ - ['econo_321',['Econo',['../unionCoronaProtocol.html#a1076afecc4292c370fed27ce380a1ed5',1,'CoronaProtocol::Econo()'],['../unionDaikinESPProtocol.html#a29138c4ff722520ca23863568a96bf53',1,'DaikinESPProtocol::Econo()'],['../unionDaikin2Protocol.html#aa715d01b8972f98a41829ed976932ef7',1,'Daikin2Protocol::Econo()'],['../unionDaikin128Protocol.html#a8920f30a9d4bb0132762d80c8297d5f2',1,'Daikin128Protocol::Econo()'],['../unionDaikin152Protocol.html#ad9c7903f82a89b94e0c9dfe8b7298658',1,'Daikin152Protocol::Econo()'],['../unionNeoclimaProtocol.html#ae6e84df0fe5279729c8980c68db35c50',1,'NeoclimaProtocol::Econo()'],['../unionVoltasProtocol.html#a4f44e3e3a68988d25173b2aab1c32e53',1,'VoltasProtocol::Econo()'],['../structstdAc_1_1state__t.html#a580c826c6d9671715adfe8445531b957',1,'stdAc::state_t::econo()']]], - ['elapsed_322',['elapsed',['../classIRtimer.html#ad655e585f053580d49d8de7d52cd62a1',1,'IRtimer::elapsed()'],['../classTimerMs.html#ad4aa759c58727393f69863b3461dfc09',1,'TimerMs::elapsed()']]], - ['electra_323',['electra',['../classIRac.html#abb847bd5e09feb293432b8a8cf0dd9de',1,'IRac']]], - ['electra_5fac_324',['ELECTRA_AC',['../IRremoteESP8266_8h.html#ad5b287a488a8c1b7b8661f029ab56fada05f193ef4ead3e54624bd92dc3203fac',1,'IRremoteESP8266.h']]], - ['electraprotocol_325',['ElectraProtocol',['../unionElectraProtocol.html',1,'']]], - ['elitescreens_326',['ELITESCREENS',['../IRremoteESP8266_8h.html#ad5b287a488a8c1b7b8661f029ab56fadafebe19d5453be4c99de8c031508b7cb1',1,'IRremoteESP8266.h']]], - ['en_2dau_2eh_327',['en-AU.h',['../en-AU_8h.html',1,'']]], - ['en_2die_2eh_328',['en-IE.h',['../en-IE_8h.html',1,'']]], - ['en_2duk_2eh_329',['en-UK.h',['../en-UK_8h.html',1,'']]], - ['en_2dus_2eh_330',['en-US.h',['../en-US_8h.html',1,'']]], - ['enableirin_331',['enableIRIn',['../classIRrecv.html#a52c05ec6d8f3dbfb75f21f3b4fe7be3d',1,'IRrecv']]], - ['enableirout_332',['enableIROut',['../classIRsend.html#ab3b6d36c9b5d26c400526717d433ed2d',1,'IRsend']]], - ['enableofftimer_333',['enableOffTimer',['../classIRDaikinESP.html#a8a5686066bfc86f1d7cc454e793d3357',1,'IRDaikinESP::enableOffTimer()'],['../classIRDaikin2.html#afc7ba7d7de2976e010a72778091d633a',1,'IRDaikin2::enableOffTimer()'],['../classIRWhirlpoolAc.html#abb1c3685d90d81b44e72050cd0e042f6',1,'IRWhirlpoolAc::enableOffTimer()']]], - ['enableontimer_334',['enableOnTimer',['../classIRDaikinESP.html#aac4d0f5f60c9f4c41d3bb1e0f24bc4bc',1,'IRDaikinESP::enableOnTimer()'],['../classIRDaikin2.html#a91ec5f7c67cb87102a5eb030e0763b50',1,'IRDaikin2::enableOnTimer()'],['../classIRWhirlpoolAc.html#aa3edd58882cf4fc65172e490c9e0bb2e',1,'IRWhirlpoolAc::enableOnTimer()']]], - ['enablesleeptimer_335',['enableSleepTimer',['../classIRDaikin2.html#a9c86782a98a54818ae92419eec5a060b',1,'IRDaikin2']]], - ['enabletimer_336',['enableTimer',['../classIRWhirlpoolAc.html#ad07804318721bc5dd60f7322e02c9696',1,'IRWhirlpoolAc']]], - ['encodedoshisha_337',['encodeDoshisha',['../classIRsend.html#a0522a2256e8358df715065530be6317d',1,'IRsend']]], - ['encodejvc_338',['encodeJVC',['../classIRsend.html#a6303b991c0545443e7ccf63ba89dbf18',1,'IRsend']]], - ['encodelg_339',['encodeLG',['../classIRsend.html#a109b67a68e7a33900cb5c5017ed4578b',1,'IRsend']]], - ['encodemagiquest_340',['encodeMagiQuest',['../classIRsend.html#a4ee40126279dbde8bb02888115577563',1,'IRsend']]], - ['encodemetz_341',['encodeMetz',['../classIRsend.html#a99c88ec9f8426003738a9a1682595b9a',1,'IRsend']]], - ['encodenec_342',['encodeNEC',['../classIRsend.html#ab2e1ce918e4e06b955c3d2a089ce189c',1,'IRsend']]], - ['encodepanasonic_343',['encodePanasonic',['../classIRsend.html#a8340497ae75f00c844e53dfc73700d9c',1,'IRsend']]], - ['encodepioneer_344',['encodePioneer',['../classIRsend.html#ae0686829eba31587b71034a1c0495971',1,'IRsend']]], - ['encoderc5_345',['encodeRC5',['../classIRsend.html#a88457fd4cc01d6e8097e04c022ede74a',1,'IRsend']]], - ['encoderc5x_346',['encodeRC5X',['../classIRsend.html#ae760ef1be11f25f7a61237f96a8871d9',1,'IRsend']]], - ['encoderc6_347',['encodeRC6',['../classIRsend.html#ac0e341462426ea146b944502a6d3fde0',1,'IRsend']]], - ['encodesamsung_348',['encodeSAMSUNG',['../classIRsend.html#a4ab0579bd854306b2667de19207e4ffb',1,'IRsend']]], - ['encodesanyolc7461_349',['encodeSanyoLC7461',['../classIRsend.html#a864bef0dc48f6af4b59057362906cf5d',1,'IRsend']]], - ['encodesharp_350',['encodeSharp',['../classIRsend.html#a8f4c7a36380ba31155eba5ff8f5f631e',1,'IRsend']]], - ['encodesony_351',['encodeSony',['../classIRsend.html#aa0aea2cb04f0a7ee9056f15fecfc08c3',1,'IRsend']]], - ['encodetime_352',['encodeTime',['../classIRPanasonicAc.html#a0eee4ad6105d35ee6c34c4666174b04b',1,'IRPanasonicAc']]], - ['epson_353',['EPSON',['../IRremoteESP8266_8h.html#ad5b287a488a8c1b7b8661f029ab56fadaaf677fd380c38297264a10732631927c',1,'IRremoteESP8266.h']]], - ['es_2des_2eh_354',['es-ES.h',['../es-ES_8h.html',1,'']]], - ['eye_355',['Eye',['../unionDaikin2Protocol.html#aa8351138b8db3b8be5f40d1515802381',1,'Daikin2Protocol::Eye()'],['../unionNeoclimaProtocol.html#a61b0055d4d939dc85ee204e4f3b6ab46',1,'NeoclimaProtocol::Eye()']]], - ['eyeauto_356',['EyeAuto',['../unionDaikin2Protocol.html#a22f2288452065069018bef94d2505ab7',1,'Daikin2Protocol']]] -]; diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/all_8.js b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/all_8.js deleted file mode 100644 index 311a9d250..000000000 --- a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/all_8.js +++ /dev/null @@ -1,36 +0,0 @@ -var searchData= -[ - ['haier_502',['haier',['../classIRac.html#ae0a29a4cb8c7a4707a7725c576822a58',1,'IRac']]], - ['haier_5fac_503',['HAIER_AC',['../IRremoteESP8266_8h.html#ad5b287a488a8c1b7b8661f029ab56fada1f232bcdf330ec2e353196941b9f1628',1,'IRremoteESP8266.h']]], - ['haier_5fac_5fyrw02_504',['HAIER_AC_YRW02',['../IRremoteESP8266_8h.html#ad5b287a488a8c1b7b8661f029ab56fadaacda5821835865551f6df46c76282fa4',1,'IRremoteESP8266.h']]], - ['haierprotocol_505',['HaierProtocol',['../unionHaierProtocol.html',1,'']]], - ['haieryrw02protocol_506',['HaierYRW02Protocol',['../unionHaierYRW02Protocol.html',1,'']]], - ['haieryrwo2_507',['haierYrwo2',['../classIRac.html#a7bc779a162dd9a1b4c925febec443353',1,'IRac']]], - ['handlespecialstate_508',['handleSpecialState',['../classIRCoolixAC.html#af78090c6d8b45b4202a80f1223640390',1,'IRCoolixAC::handleSpecialState()'],['../classIRTranscoldAc.html#a01a3e3f8f92b8fb3b6d023e595f3ce17',1,'IRTranscoldAc::handleSpecialState()']]], - ['handletoggles_509',['handleToggles',['../classIRac.html#a36833999dce4ad608a5a0f084988cfd1',1,'IRac']]], - ['hasacstate_510',['hasACState',['../IRutils_8cpp.html#a6efd4986db60709d3501606ec7ab5382',1,'hasACState(const decode_type_t protocol): IRutils.cpp'],['../IRutils_8h.html#a6efd4986db60709d3501606ec7ab5382',1,'hasACState(const decode_type_t protocol): IRutils.cpp']]], - ['hasinvertedstates_511',['hasInvertedStates',['../classIRHitachiAc3.html#ac06b36245c85480d97c1a9f49cfaa005',1,'IRHitachiAc3']]], - ['hasstatechanged_512',['hasStateChanged',['../classIRac.html#a35258c35a2d2b19886292b22b2aa053a',1,'IRac']]], - ['header_513',['Header',['../unionMideaProtocol.html#a892508b7b4cade91dd2e315b678f5f1b',1,'MideaProtocol']]], - ['header0_514',['Header0',['../structCoronaSection.html#a3b3c0a1a42da65bb4b481e59b42f26a6',1,'CoronaSection']]], - ['header1_515',['Header1',['../structCoronaSection.html#a3d6d6c1e31f82a76cd88f81bcdb83a3a',1,'CoronaSection']]], - ['health_516',['Health',['../unionHaierProtocol.html#a4cf70c633e33066e3fc0f98bb2ad3820',1,'HaierProtocol::Health()'],['../unionHaierYRW02Protocol.html#a7fa39803fd72a788736bb8f00acfa76f',1,'HaierYRW02Protocol::Health()']]], - ['heat_5fmode_517',['heat_mode',['../classIRArgoAC.html#a255762f71502b9ffeb0686759991ec53',1,'IRArgoAC']]], - ['hitachi_518',['hitachi',['../classIRac.html#acd0f2fcf03aabf947a19a195000add3c',1,'IRac']]], - ['hitachi1_519',['hitachi1',['../classIRac.html#ac8807d62f6ae87af72d44b50bed3f17b',1,'IRac']]], - ['hitachi1protocol_520',['Hitachi1Protocol',['../unionHitachi1Protocol.html',1,'']]], - ['hitachi344_521',['hitachi344',['../classIRac.html#a0bc34635a1a349816344916a82585460',1,'IRac']]], - ['hitachi424_522',['hitachi424',['../classIRac.html#aec6de0752ddd3a3e7c6824cb1b692508',1,'IRac']]], - ['hitachi424protocol_523',['Hitachi424Protocol',['../unionHitachi424Protocol.html',1,'']]], - ['hitachi_5fac_524',['HITACHI_AC',['../IRremoteESP8266_8h.html#ad5b287a488a8c1b7b8661f029ab56fada9020fb54ac69d8aec0185f7e80c962ca',1,'IRremoteESP8266.h']]], - ['hitachi_5fac1_525',['HITACHI_AC1',['../IRremoteESP8266_8h.html#ad5b287a488a8c1b7b8661f029ab56fada7d9a74161d95e62bece3c0e48900cb35',1,'IRremoteESP8266.h']]], - ['hitachi_5fac1_5fremote_5fmodel_5ft_526',['hitachi_ac1_remote_model_t',['../IRsend_8h.html#acd0c6107b5a6cab2080b18a8de14ea49',1,'IRsend.h']]], - ['hitachi_5fac2_527',['HITACHI_AC2',['../IRremoteESP8266_8h.html#ad5b287a488a8c1b7b8661f029ab56fadab5a44068d519506efa8a3113aa44c9c0',1,'IRremoteESP8266.h']]], - ['hitachi_5fac3_528',['HITACHI_AC3',['../IRremoteESP8266_8h.html#ad5b287a488a8c1b7b8661f029ab56fadac3487c47b14da6af922f5b27992b30f3',1,'IRremoteESP8266.h']]], - ['hitachi_5fac344_529',['HITACHI_AC344',['../IRremoteESP8266_8h.html#ad5b287a488a8c1b7b8661f029ab56fada1e147eb39adc40e4181940cc2357f070',1,'IRremoteESP8266.h']]], - ['hitachi_5fac424_530',['HITACHI_AC424',['../IRremoteESP8266_8h.html#ad5b287a488a8c1b7b8661f029ab56fada85af068f8964d4359512265d8cc27a31',1,'IRremoteESP8266.h']]], - ['hitachiprotocol_531',['HitachiProtocol',['../unionHitachiProtocol.html',1,'']]], - ['hold_532',['Hold',['../unionNeoclimaProtocol.html#aaf3af5b5ab99978fb669e75949bfe136',1,'NeoclimaProtocol']]], - ['htmlescape_533',['htmlEscape',['../namespaceirutils.html#a6e55c6fdcc82e1ef8bd5f73df83609a7',1,'irutils']]], - ['hw_5ftimer_5ft_534',['hw_timer_t',['../IRrecv_8cpp.html#a6d06e662914b9ad7eeaea3cb650292c0',1,'IRrecv.cpp']]] -]; diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/all_9.js b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/all_9.js deleted file mode 100644 index 1fb29748a..000000000 --- a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/all_9.js +++ /dev/null @@ -1,198 +0,0 @@ -var searchData= -[ - ['i18n_2eh_535',['i18n.h',['../i18n_8h.html',1,'']]], - ['ifeel_536',['iFeel',['../unionArgoProtocol.html#a9d51b32b8e2b2ff08339be238a775097',1,'ArgoProtocol::iFeel()'],['../unionGreeProtocol.html#a592364307a4b11064888bda76c403142',1,'GreeProtocol::IFeel()']]], - ['inax_537',['INAX',['../IRremoteESP8266_8h.html#ad5b287a488a8c1b7b8661f029ab56fadafc566aab3afb8face6d8965ca4d0eab7',1,'IRremoteESP8266.h']]], - ['irremoteesp8266_20library_20api_20documentation_538',['IRremoteESP8266 Library API Documentation',['../index.html',1,'']]], - ['initstate_539',['initState',['../classIRac.html#af1c4ae70e61298c0be8d350d67e7c342',1,'IRac::initState(stdAc::state_t *state, const decode_type_t vendor, const int16_t model, const bool power, const stdAc::opmode_t mode, const float degrees, const bool celsius, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const stdAc::swingh_t swingh, const bool quiet, const bool turbo, const bool econo, const bool light, const bool filter, const bool clean, const bool beep, const int16_t sleep, const int16_t clock)'],['../classIRac.html#a165b7fdb9b3a02b1fb5ff2c2c3747958',1,'IRac::initState(stdAc::state_t *state)']]], - ['invertbits_540',['invertBits',['../IRutils_8cpp.html#a1a85904f25c8ec77fb554d238c59cfdb',1,'invertBits(const uint64_t data, const uint16_t nbits): IRutils.cpp'],['../IRutils_8h.html#a1a85904f25c8ec77fb554d238c59cfdb',1,'invertBits(const uint64_t data, const uint16_t nbits): IRutils.cpp']]], - ['invertbytepairs_541',['invertBytePairs',['../namespaceirutils.html#ad818a474349546c84824451a5468f4fe',1,'irutils']]], - ['ion_542',['Ion',['../unionNeoclimaProtocol.html#aeee2a3f53f997ad7ffdbef2b5b6ee31a',1,'NeoclimaProtocol::Ion()'],['../unionSamsungProtocol.html#a977ae7e0e4cea918e4b4a714b25bb4ca',1,'SamsungProtocol::Ion()'],['../unionSharpProtocol.html#ae744f63f03d1c13fbd5bbcf8f40aea0e',1,'SharpProtocol::Ion()']]], - ['ionfilter_543',['IonFilter',['../unionKelvinatorProtocol.html#ad7c762e410c8cba234614563cdc9d384',1,'KelvinatorProtocol']]], - ['ir_5fairwell_2ecpp_544',['ir_Airwell.cpp',['../ir__Airwell_8cpp.html',1,'']]], - ['ir_5fairwell_2eh_545',['ir_Airwell.h',['../ir__Airwell_8h.html',1,'']]], - ['ir_5faiwa_2ecpp_546',['ir_Aiwa.cpp',['../ir__Aiwa_8cpp.html',1,'']]], - ['ir_5famcor_2ecpp_547',['ir_Amcor.cpp',['../ir__Amcor_8cpp.html',1,'']]], - ['ir_5famcor_2eh_548',['ir_Amcor.h',['../ir__Amcor_8h.html',1,'']]], - ['ir_5fargo_2ecpp_549',['ir_Argo.cpp',['../ir__Argo_8cpp.html',1,'']]], - ['ir_5fargo_2eh_550',['ir_Argo.h',['../ir__Argo_8h.html',1,'']]], - ['ir_5fcarrier_2ecpp_551',['ir_Carrier.cpp',['../ir__Carrier_8cpp.html',1,'']]], - ['ir_5fcarrier_2eh_552',['ir_Carrier.h',['../ir__Carrier_8h.html',1,'']]], - ['ir_5fcoolix_2ecpp_553',['ir_Coolix.cpp',['../ir__Coolix_8cpp.html',1,'']]], - ['ir_5fcoolix_2eh_554',['ir_Coolix.h',['../ir__Coolix_8h.html',1,'']]], - ['ir_5fcorona_2ecpp_555',['ir_Corona.cpp',['../ir__Corona_8cpp.html',1,'']]], - ['ir_5fcorona_2eh_556',['ir_Corona.h',['../ir__Corona_8h.html',1,'']]], - ['ir_5fdaikin_2ecpp_557',['ir_Daikin.cpp',['../ir__Daikin_8cpp.html',1,'']]], - ['ir_5fdaikin_2eh_558',['ir_Daikin.h',['../ir__Daikin_8h.html',1,'']]], - ['ir_5fdelonghi_2ecpp_559',['ir_Delonghi.cpp',['../ir__Delonghi_8cpp.html',1,'']]], - ['ir_5fdelonghi_2eh_560',['ir_Delonghi.h',['../ir__Delonghi_8h.html',1,'']]], - ['ir_5fdenon_2ecpp_561',['ir_Denon.cpp',['../ir__Denon_8cpp.html',1,'']]], - ['ir_5fdish_2ecpp_562',['ir_Dish.cpp',['../ir__Dish_8cpp.html',1,'']]], - ['ir_5fdoshisha_2ecpp_563',['ir_Doshisha.cpp',['../ir__Doshisha_8cpp.html',1,'']]], - ['ir_5felectra_2ecpp_564',['ir_Electra.cpp',['../ir__Electra_8cpp.html',1,'']]], - ['ir_5felectra_2eh_565',['ir_Electra.h',['../ir__Electra_8h.html',1,'']]], - ['ir_5felitescreens_2ecpp_566',['ir_EliteScreens.cpp',['../ir__EliteScreens_8cpp.html',1,'']]], - ['ir_5fepson_2ecpp_567',['ir_Epson.cpp',['../ir__Epson_8cpp.html',1,'']]], - ['ir_5ffujitsu_2ecpp_568',['ir_Fujitsu.cpp',['../ir__Fujitsu_8cpp.html',1,'']]], - ['ir_5ffujitsu_2eh_569',['ir_Fujitsu.h',['../ir__Fujitsu_8h.html',1,'']]], - ['ir_5fgicable_2ecpp_570',['ir_GICable.cpp',['../ir__GICable_8cpp.html',1,'']]], - ['ir_5fglobalcache_2ecpp_571',['ir_GlobalCache.cpp',['../ir__GlobalCache_8cpp.html',1,'']]], - ['ir_5fgoodweather_2ecpp_572',['ir_Goodweather.cpp',['../ir__Goodweather_8cpp.html',1,'']]], - ['ir_5fgoodweather_2eh_573',['ir_Goodweather.h',['../ir__Goodweather_8h.html',1,'']]], - ['ir_5fgree_2ecpp_574',['ir_Gree.cpp',['../ir__Gree_8cpp.html',1,'']]], - ['ir_5fgree_2eh_575',['ir_Gree.h',['../ir__Gree_8h.html',1,'']]], - ['ir_5fhaier_2ecpp_576',['ir_Haier.cpp',['../ir__Haier_8cpp.html',1,'']]], - ['ir_5fhaier_2eh_577',['ir_Haier.h',['../ir__Haier_8h.html',1,'']]], - ['ir_5fhitachi_2ecpp_578',['ir_Hitachi.cpp',['../ir__Hitachi_8cpp.html',1,'']]], - ['ir_5fhitachi_2eh_579',['ir_Hitachi.h',['../ir__Hitachi_8h.html',1,'']]], - ['ir_5finax_2ecpp_580',['ir_Inax.cpp',['../ir__Inax_8cpp.html',1,'']]], - ['ir_5fjvc_2ecpp_581',['ir_JVC.cpp',['../ir__JVC_8cpp.html',1,'']]], - ['ir_5fkelvinator_2ecpp_582',['ir_Kelvinator.cpp',['../ir__Kelvinator_8cpp.html',1,'']]], - ['ir_5fkelvinator_2eh_583',['ir_Kelvinator.h',['../ir__Kelvinator_8h.html',1,'']]], - ['ir_5flasertag_2ecpp_584',['ir_Lasertag.cpp',['../ir__Lasertag_8cpp.html',1,'']]], - ['ir_5flego_2ecpp_585',['ir_Lego.cpp',['../ir__Lego_8cpp.html',1,'']]], - ['ir_5flg_2ecpp_586',['ir_LG.cpp',['../ir__LG_8cpp.html',1,'']]], - ['ir_5flg_2eh_587',['ir_LG.h',['../ir__LG_8h.html',1,'']]], - ['ir_5flutron_2ecpp_588',['ir_Lutron.cpp',['../ir__Lutron_8cpp.html',1,'']]], - ['ir_5fmagiquest_2ecpp_589',['ir_Magiquest.cpp',['../ir__Magiquest_8cpp.html',1,'']]], - ['ir_5fmagiquest_2eh_590',['ir_Magiquest.h',['../ir__Magiquest_8h.html',1,'']]], - ['ir_5fmetz_2ecpp_591',['ir_Metz.cpp',['../ir__Metz_8cpp.html',1,'']]], - ['ir_5fmidea_2ecpp_592',['ir_Midea.cpp',['../ir__Midea_8cpp.html',1,'']]], - ['ir_5fmidea_2eh_593',['ir_Midea.h',['../ir__Midea_8h.html',1,'']]], - ['ir_5fmirage_2ecpp_594',['ir_Mirage.cpp',['../ir__Mirage_8cpp.html',1,'']]], - ['ir_5fmitsubishi_2ecpp_595',['ir_Mitsubishi.cpp',['../ir__Mitsubishi_8cpp.html',1,'']]], - ['ir_5fmitsubishi_2eh_596',['ir_Mitsubishi.h',['../ir__Mitsubishi_8h.html',1,'']]], - ['ir_5fmitsubishiheavy_2ecpp_597',['ir_MitsubishiHeavy.cpp',['../ir__MitsubishiHeavy_8cpp.html',1,'']]], - ['ir_5fmitsubishiheavy_2eh_598',['ir_MitsubishiHeavy.h',['../ir__MitsubishiHeavy_8h.html',1,'']]], - ['ir_5fmultibrackets_2ecpp_599',['ir_Multibrackets.cpp',['../ir__Multibrackets_8cpp.html',1,'']]], - ['ir_5fmwm_2ecpp_600',['ir_MWM.cpp',['../ir__MWM_8cpp.html',1,'']]], - ['ir_5fnec_2ecpp_601',['ir_NEC.cpp',['../ir__NEC_8cpp.html',1,'']]], - ['ir_5fnec_2eh_602',['ir_NEC.h',['../ir__NEC_8h.html',1,'']]], - ['ir_5fneoclima_2ecpp_603',['ir_Neoclima.cpp',['../ir__Neoclima_8cpp.html',1,'']]], - ['ir_5fneoclima_2eh_604',['ir_Neoclima.h',['../ir__Neoclima_8h.html',1,'']]], - ['ir_5fnikai_2ecpp_605',['ir_Nikai.cpp',['../ir__Nikai_8cpp.html',1,'']]], - ['ir_5fpanasonic_2ecpp_606',['ir_Panasonic.cpp',['../ir__Panasonic_8cpp.html',1,'']]], - ['ir_5fpanasonic_2eh_607',['ir_Panasonic.h',['../ir__Panasonic_8h.html',1,'']]], - ['ir_5fpioneer_2ecpp_608',['ir_Pioneer.cpp',['../ir__Pioneer_8cpp.html',1,'']]], - ['ir_5fpronto_2ecpp_609',['ir_Pronto.cpp',['../ir__Pronto_8cpp.html',1,'']]], - ['ir_5frc5_5frc6_2ecpp_610',['ir_RC5_RC6.cpp',['../ir__RC5__RC6_8cpp.html',1,'']]], - ['ir_5frcmm_2ecpp_611',['ir_RCMM.cpp',['../ir__RCMM_8cpp.html',1,'']]], - ['ir_5fsamsung_2ecpp_612',['ir_Samsung.cpp',['../ir__Samsung_8cpp.html',1,'']]], - ['ir_5fsamsung_2eh_613',['ir_Samsung.h',['../ir__Samsung_8h.html',1,'']]], - ['ir_5fsanyo_2ecpp_614',['ir_Sanyo.cpp',['../ir__Sanyo_8cpp.html',1,'']]], - ['ir_5fsanyo_2eh_615',['ir_Sanyo.h',['../ir__Sanyo_8h.html',1,'']]], - ['ir_5fsharp_2ecpp_616',['ir_Sharp.cpp',['../ir__Sharp_8cpp.html',1,'']]], - ['ir_5fsharp_2eh_617',['ir_Sharp.h',['../ir__Sharp_8h.html',1,'']]], - ['ir_5fsherwood_2ecpp_618',['ir_Sherwood.cpp',['../ir__Sherwood_8cpp.html',1,'']]], - ['ir_5fsony_2ecpp_619',['ir_Sony.cpp',['../ir__Sony_8cpp.html',1,'']]], - ['ir_5fsymphony_2ecpp_620',['ir_Symphony.cpp',['../ir__Symphony_8cpp.html',1,'']]], - ['ir_5ftcl_2ecpp_621',['ir_Tcl.cpp',['../ir__Tcl_8cpp.html',1,'']]], - ['ir_5ftcl_2eh_622',['ir_Tcl.h',['../ir__Tcl_8h.html',1,'']]], - ['ir_5ftechnibel_2ecpp_623',['ir_Technibel.cpp',['../ir__Technibel_8cpp.html',1,'']]], - ['ir_5ftechnibel_2eh_624',['ir_Technibel.h',['../ir__Technibel_8h.html',1,'']]], - ['ir_5fteco_2ecpp_625',['ir_Teco.cpp',['../ir__Teco_8cpp.html',1,'']]], - ['ir_5fteco_2eh_626',['ir_Teco.h',['../ir__Teco_8h.html',1,'']]], - ['ir_5ftoshiba_2ecpp_627',['ir_Toshiba.cpp',['../ir__Toshiba_8cpp.html',1,'']]], - ['ir_5ftoshiba_2eh_628',['ir_Toshiba.h',['../ir__Toshiba_8h.html',1,'']]], - ['ir_5ftranscold_2ecpp_629',['ir_Transcold.cpp',['../ir__Transcold_8cpp.html',1,'']]], - ['ir_5ftranscold_2eh_630',['ir_Transcold.h',['../ir__Transcold_8h.html',1,'']]], - ['ir_5ftrotec_2ecpp_631',['ir_Trotec.cpp',['../ir__Trotec_8cpp.html',1,'']]], - ['ir_5ftrotec_2eh_632',['ir_Trotec.h',['../ir__Trotec_8h.html',1,'']]], - ['ir_5fvestel_2ecpp_633',['ir_Vestel.cpp',['../ir__Vestel_8cpp.html',1,'']]], - ['ir_5fvestel_2eh_634',['ir_Vestel.h',['../ir__Vestel_8h.html',1,'']]], - ['ir_5fvoltas_2ecpp_635',['ir_Voltas.cpp',['../ir__Voltas_8cpp.html',1,'']]], - ['ir_5fvoltas_2eh_636',['ir_Voltas.h',['../ir__Voltas_8h.html',1,'']]], - ['ir_5fwhirlpool_2ecpp_637',['ir_Whirlpool.cpp',['../ir__Whirlpool_8cpp.html',1,'']]], - ['ir_5fwhirlpool_2eh_638',['ir_Whirlpool.h',['../ir__Whirlpool_8h.html',1,'']]], - ['ir_5fwhynter_2ecpp_639',['ir_Whynter.cpp',['../ir__Whynter_8cpp.html',1,'']]], - ['ir_5fzepeal_2ecpp_640',['ir_Zepeal.cpp',['../ir__Zepeal_8cpp.html',1,'']]], - ['irac_641',['IRac',['../classIRac.html',1,'IRac'],['../classIRac.html#abb0864e277d4f6c68a92c2729112a40d',1,'IRac::IRac()']]], - ['irac_2ecpp_642',['IRac.cpp',['../IRac_8cpp.html',1,'']]], - ['irac_2eh_643',['IRac.h',['../IRac_8h.html',1,'']]], - ['iracutils_644',['IRAcUtils',['../namespaceIRAcUtils.html',1,'']]], - ['irairwellac_645',['IRAirwellAc',['../classIRAirwellAc.html',1,'IRAirwellAc'],['../classIRAirwellAc.html#a38cfe20bff4522034b16d64df64750e8',1,'IRAirwellAc::IRAirwellAc()']]], - ['iramcorac_646',['IRAmcorAc',['../classIRAmcorAc.html',1,'IRAmcorAc'],['../classIRAmcorAc.html#a92db59a33c861dcd3b2960e9711f97c4',1,'IRAmcorAc::IRAmcorAc()']]], - ['irargoac_647',['IRArgoAC',['../classIRArgoAC.html',1,'IRArgoAC'],['../classIRArgoAC.html#ad6c2250738397441b8f956d1477b7d70',1,'IRArgoAC::IRArgoAC()']]], - ['ircarrierac64_648',['IRCarrierAc64',['../classIRCarrierAc64.html',1,'IRCarrierAc64'],['../classIRCarrierAc64.html#ac225c0f24a0e385a145375ff447ab79b',1,'IRCarrierAc64::IRCarrierAc64()']]], - ['ircoolixac_649',['IRCoolixAC',['../classIRCoolixAC.html',1,'IRCoolixAC'],['../classIRCoolixAC.html#a043ad3b74e964e39b111e1fcf9e55f42',1,'IRCoolixAC::IRCoolixAC()']]], - ['ircoronaac_650',['IRCoronaAc',['../classIRCoronaAc.html',1,'IRCoronaAc'],['../classIRCoronaAc.html#aa96f1ffce21cdec5b3901ebbb1c63fbb',1,'IRCoronaAc::IRCoronaAc()']]], - ['irdaikin128_651',['IRDaikin128',['../classIRDaikin128.html',1,'IRDaikin128'],['../classIRDaikin128.html#aa669739541daf1a2b39ce1cd0424c43b',1,'IRDaikin128::IRDaikin128()']]], - ['irdaikin152_652',['IRDaikin152',['../classIRDaikin152.html',1,'IRDaikin152'],['../classIRDaikin152.html#a68dce79bab5890d9aea325a45ef8e4a3',1,'IRDaikin152::IRDaikin152()']]], - ['irdaikin160_653',['IRDaikin160',['../classIRDaikin160.html',1,'IRDaikin160'],['../classIRDaikin160.html#a76fb744b041c38abb730bce0538a497a',1,'IRDaikin160::IRDaikin160()']]], - ['irdaikin176_654',['IRDaikin176',['../classIRDaikin176.html',1,'IRDaikin176'],['../classIRDaikin176.html#accfe7c3f34351844d12059455f65f312',1,'IRDaikin176::IRDaikin176()']]], - ['irdaikin2_655',['IRDaikin2',['../classIRDaikin2.html',1,'IRDaikin2'],['../classIRDaikin2.html#a3ffe908313f162b92e92307578592fca',1,'IRDaikin2::IRDaikin2()']]], - ['irdaikin216_656',['IRDaikin216',['../classIRDaikin216.html',1,'IRDaikin216'],['../classIRDaikin216.html#ad802bde79e5ee2d16e3b09fbc8bbe8df',1,'IRDaikin216::IRDaikin216()']]], - ['irdaikin64_657',['IRDaikin64',['../classIRDaikin64.html',1,'IRDaikin64'],['../classIRDaikin64.html#a88855df33ce903884b21d2ef4771e94f',1,'IRDaikin64::IRDaikin64()']]], - ['irdaikinesp_658',['IRDaikinESP',['../classIRDaikinESP.html',1,'IRDaikinESP'],['../classIRDaikinESP.html#a2652cb45e07e8a4329c16cded9f6ad9a',1,'IRDaikinESP::IRDaikinESP()']]], - ['irdelonghiac_659',['IRDelonghiAc',['../classIRDelonghiAc.html',1,'IRDelonghiAc'],['../classIRDelonghiAc.html#aa6f8661cf6baa369a0a5b9d775c392e0',1,'IRDelonghiAc::IRDelonghiAc()']]], - ['irelectraac_660',['IRElectraAc',['../classIRElectraAc.html',1,'IRElectraAc'],['../classIRElectraAc.html#a2f56ad22943c3d261b1d2ef88d86e300',1,'IRElectraAc::IRElectraAc()']]], - ['irfujitsuac_661',['IRFujitsuAC',['../classIRFujitsuAC.html',1,'IRFujitsuAC'],['../classIRFujitsuAC.html#acdb70f239884507f540b872ba25747ce',1,'IRFujitsuAC::IRFujitsuAC()']]], - ['irgoodweatherac_662',['IRGoodweatherAc',['../classIRGoodweatherAc.html',1,'IRGoodweatherAc'],['../classIRGoodweatherAc.html#a681feff1a58125cde97b2d7ed0ba775e',1,'IRGoodweatherAc::IRGoodweatherAc()']]], - ['irgreeac_663',['IRGreeAC',['../classIRGreeAC.html',1,'IRGreeAC'],['../classIRGreeAC.html#abf7ead6ebee4bc776f83fb55f6fe6b63',1,'IRGreeAC::IRGreeAC()']]], - ['irhaierac_664',['IRHaierAC',['../classIRHaierAC.html',1,'IRHaierAC'],['../classIRHaierAC.html#a0b78060cbd150cd886a409adc2dea49c',1,'IRHaierAC::IRHaierAC()']]], - ['irhaieracyrw02_665',['IRHaierACYRW02',['../classIRHaierACYRW02.html',1,'IRHaierACYRW02'],['../classIRHaierACYRW02.html#afd9354c36df33434840bbc5f38d4e7ed',1,'IRHaierACYRW02::IRHaierACYRW02()']]], - ['irhitachiac_666',['IRHitachiAc',['../classIRHitachiAc.html',1,'IRHitachiAc'],['../classIRHitachiAc.html#a4c43e95e0cc28339e7162d7090ae16bf',1,'IRHitachiAc::IRHitachiAc()']]], - ['irhitachiac1_667',['IRHitachiAc1',['../classIRHitachiAc1.html',1,'IRHitachiAc1'],['../classIRHitachiAc1.html#ac00cfd9a60e08d34f292878de47f622f',1,'IRHitachiAc1::IRHitachiAc1()']]], - ['irhitachiac3_668',['IRHitachiAc3',['../classIRHitachiAc3.html',1,'IRHitachiAc3'],['../classIRHitachiAc3.html#adef0e7ad217f078ce418e3aa82b9cb86',1,'IRHitachiAc3::IRHitachiAc3()']]], - ['irhitachiac344_669',['IRHitachiAc344',['../classIRHitachiAc344.html',1,'IRHitachiAc344'],['../classIRHitachiAc424.html#a3c885313a79bf8c02bc5eb9f7d80088b',1,'IRHitachiAc424::IRHitachiAc344()'],['../classIRHitachiAc344.html#afbff8a1dd2777880d2d1713d07e1d419',1,'IRHitachiAc344::IRHitachiAc344()']]], - ['irhitachiac424_670',['IRHitachiAc424',['../classIRHitachiAc424.html',1,'IRHitachiAc424'],['../classIRHitachiAc424.html#add708c10a56d20621ef65a0ddcc2aac1',1,'IRHitachiAc424::IRHitachiAc424()']]], - ['irkelvinatorac_671',['IRKelvinatorAC',['../classIRKelvinatorAC.html',1,'IRKelvinatorAC'],['../classIRKelvinatorAC.html#a111dd384b1898a4fb880a19b6d1b1635',1,'IRKelvinatorAC::IRKelvinatorAC()']]], - ['irlgac_672',['IRLgAc',['../classIRLgAc.html',1,'IRLgAc'],['../classIRLgAc.html#a290636496526a9ed2057532649709375',1,'IRLgAc::IRLgAc()']]], - ['irmideaac_673',['IRMideaAC',['../classIRMideaAC.html',1,'IRMideaAC'],['../classIRMideaAC.html#a1ef2f532a1e6c6bfe89617d3fd0d9082',1,'IRMideaAC::IRMideaAC()']]], - ['irmitsubishi112_674',['IRMitsubishi112',['../classIRMitsubishi112.html',1,'IRMitsubishi112'],['../classIRMitsubishi112.html#adea6f3b7b7619b0bf6da4a94cec9d712',1,'IRMitsubishi112::IRMitsubishi112()']]], - ['irmitsubishi136_675',['IRMitsubishi136',['../classIRMitsubishi136.html',1,'IRMitsubishi136'],['../classIRMitsubishi136.html#ad92926b993869d0695f11ddb999b2090',1,'IRMitsubishi136::IRMitsubishi136()']]], - ['irmitsubishiac_676',['IRMitsubishiAC',['../classIRMitsubishiAC.html',1,'IRMitsubishiAC'],['../classIRMitsubishiAC.html#a83fabfd9ebed5cef8dd2a18a85fdf4e6',1,'IRMitsubishiAC::IRMitsubishiAC()']]], - ['irmitsubishiheavy152ac_677',['IRMitsubishiHeavy152Ac',['../classIRMitsubishiHeavy152Ac.html',1,'IRMitsubishiHeavy152Ac'],['../classIRMitsubishiHeavy152Ac.html#a704e9f96c2d0a07f9ba16a400d9c97aa',1,'IRMitsubishiHeavy152Ac::IRMitsubishiHeavy152Ac()']]], - ['irmitsubishiheavy88ac_678',['IRMitsubishiHeavy88Ac',['../classIRMitsubishiHeavy88Ac.html',1,'IRMitsubishiHeavy88Ac'],['../classIRMitsubishiHeavy88Ac.html#aceabecf4a615e807a4636ff5990d77d7',1,'IRMitsubishiHeavy88Ac::IRMitsubishiHeavy88Ac()']]], - ['irneoclimaac_679',['IRNeoclimaAc',['../classIRNeoclimaAc.html',1,'IRNeoclimaAc'],['../classIRNeoclimaAc.html#a99ed2962176e5f12f8387fab977c6395',1,'IRNeoclimaAc::IRNeoclimaAc()']]], - ['irpanasonicac_680',['IRPanasonicAc',['../classIRPanasonicAc.html',1,'IRPanasonicAc'],['../classIRPanasonicAc.html#ae8b0f4518ee1a913d47a7101b0a11185',1,'IRPanasonicAc::IRPanasonicAc()']]], - ['irpanasonicac32_681',['IRPanasonicAc32',['../classIRPanasonicAc32.html',1,'IRPanasonicAc32'],['../classIRPanasonicAc32.html#ade8637984d8c1d5d881dc636d501676d',1,'IRPanasonicAc32::IRPanasonicAc32()']]], - ['irparams_5fsave_682',['irparams_save',['../classIRrecv.html#a6fdac84ce51ce119972bf121ccc95aab',1,'IRrecv']]], - ['irparams_5ft_683',['irparams_t',['../structirparams__t.html',1,'']]], - ['irpin_684',['IRpin',['../classIRsend.html#ae4a6ea1e72f4861167002d6e7bf17b7c',1,'IRsend']]], - ['irrecv_685',['IRrecv',['../classIRrecv.html',1,'IRrecv'],['../classIRrecv.html#a8fe4d26ef1f863db1db9994fed5fc209',1,'IRrecv::IRrecv(const uint16_t recvpin, const uint16_t bufsize=kRawBuf, const uint8_t timeout=kTimeoutMs, const bool save_buffer=false, const uint8_t timer_num=kDefaultESP32Timer)'],['../classIRrecv.html#a3bb1bcc1c1a3184294dd35c8f6f758b1',1,'IRrecv::IRrecv(const uint16_t recvpin, const uint16_t bufsize=kRawBuf, const uint8_t timeout=kTimeoutMs, const bool save_buffer=false)']]], - ['irrecv_2ecpp_686',['IRrecv.cpp',['../IRrecv_8cpp.html',1,'']]], - ['irrecv_2eh_687',['IRrecv.h',['../IRrecv_8h.html',1,'']]], - ['irremoteesp8266_2eh_688',['IRremoteESP8266.h',['../IRremoteESP8266_8h.html',1,'']]], - ['irsamsungac_689',['IRSamsungAc',['../classIRSamsungAc.html',1,'IRSamsungAc'],['../classIRSamsungAc.html#a0db771b80d7d7a63b5ecb4b25efee609',1,'IRSamsungAc::IRSamsungAc()']]], - ['irsanyoac_690',['IRSanyoAc',['../classIRSanyoAc.html',1,'IRSanyoAc'],['../classIRSanyoAc.html#ab7b9a1f1685993b95807f7e48624e4e2',1,'IRSanyoAc::IRSanyoAc()']]], - ['irsend_691',['IRsend',['../classIRsend.html',1,'IRsend'],['../classIRsend.html#a792780b7de996c90c86dd7b700eaf271',1,'IRsend::IRsend()']]], - ['irsend_2ecpp_692',['IRsend.cpp',['../IRsend_8cpp.html',1,'']]], - ['irsend_2eh_693',['IRsend.h',['../IRsend_8h.html',1,'']]], - ['irsharpac_694',['IRSharpAc',['../classIRSharpAc.html',1,'IRSharpAc'],['../classIRSharpAc.html#a30b5f8f634a41c943b4e1453d12bc980',1,'IRSharpAc::IRSharpAc()']]], - ['irtcl112ac_695',['IRTcl112Ac',['../classIRTcl112Ac.html',1,'IRTcl112Ac'],['../classIRTcl112Ac.html#a061bdfdf4444cb5e06fa90824985c1ec',1,'IRTcl112Ac::IRTcl112Ac()']]], - ['irtechnibelac_696',['IRTechnibelAc',['../classIRTechnibelAc.html',1,'IRTechnibelAc'],['../classIRTechnibelAc.html#a799407de348870d5765acf163ab92a75',1,'IRTechnibelAc::IRTechnibelAc()']]], - ['irtecoac_697',['IRTecoAc',['../classIRTecoAc.html',1,'IRTecoAc'],['../classIRTecoAc.html#a56e3f31a080bfd565570bf3b165e71d4',1,'IRTecoAc::IRTecoAc()']]], - ['irtext_2ecpp_698',['IRtext.cpp',['../IRtext_8cpp.html',1,'']]], - ['irtext_2eh_699',['IRtext.h',['../IRtext_8h.html',1,'']]], - ['irtimer_700',['IRtimer',['../classIRtimer.html',1,'IRtimer'],['../classIRtimer.html#a09d64d689137ef8ca68973bb9e550e76',1,'IRtimer::IRtimer()']]], - ['irtimer_2ecpp_701',['IRtimer.cpp',['../IRtimer_8cpp.html',1,'']]], - ['irtimer_2eh_702',['IRtimer.h',['../IRtimer_8h.html',1,'']]], - ['irtoshibaac_703',['IRToshibaAC',['../classIRToshibaAC.html',1,'IRToshibaAC'],['../classIRToshibaAC.html#abf2b3db316f7d6acb20c4f7ea2476ec2',1,'IRToshibaAC::IRToshibaAC()']]], - ['irtranscoldac_704',['IRTranscoldAc',['../classIRTranscoldAc.html',1,'IRTranscoldAc'],['../classIRTranscoldAc.html#a155278b9e5803aacf69a1ae20ed5b652',1,'IRTranscoldAc::IRTranscoldAc()']]], - ['irtrotecesp_705',['IRTrotecESP',['../classIRTrotecESP.html',1,'IRTrotecESP'],['../classIRTrotecESP.html#a1b56b6e55bf133ccab6a482090408ee5',1,'IRTrotecESP::IRTrotecESP()']]], - ['irutils_706',['irutils',['../namespaceirutils.html',1,'']]], - ['irutils_2ecpp_707',['IRutils.cpp',['../IRutils_8cpp.html',1,'']]], - ['irutils_2eh_708',['IRutils.h',['../IRutils_8h.html',1,'']]], - ['irvestelac_709',['IRVestelAc',['../classIRVestelAc.html',1,'IRVestelAc'],['../classIRVestelAc.html#af1583ef81331edf112a0d04771c2cbec',1,'IRVestelAc::IRVestelAc()']]], - ['irvoltas_710',['IRVoltas',['../classIRVoltas.html',1,'IRVoltas'],['../classIRVoltas.html#a4bfb0c5b16507d330abea2a9147f8332',1,'IRVoltas::IRVoltas()']]], - ['irwhirlpoolac_711',['IRWhirlpoolAc',['../classIRWhirlpoolAc.html',1,'IRWhirlpoolAc'],['../classIRWhirlpoolAc.html#a89bc9d440a5f7d04a602d7bc73904bc2',1,'IRWhirlpoolAc::IRWhirlpoolAc()']]], - ['iseconotoggle_712',['isEconoToggle',['../classIRMideaAC.html#a227aeed678af6da49b510cb67b02991e',1,'IRMideaAC']]], - ['islighttoggle_713',['isLightToggle',['../classIRMideaAC.html#ac0f321a8a38bd2cecf453c6aff9020e6',1,'IRMideaAC']]], - ['isofftimeractive_714',['isOffTimerActive',['../classIRVestelAc.html#aa756171e82ed1b43593b81aa3a63b812',1,'IRVestelAc']]], - ['isofftimerenabled_715',['isOffTimerEnabled',['../classIRMideaAC.html#a10aa3386a15b46c62083baaca3bcf699',1,'IRMideaAC::isOffTimerEnabled()'],['../classIRPanasonicAc.html#ac8e218b4886d66889734b01232767c8a',1,'IRPanasonicAc::isOffTimerEnabled()'],['../classIRWhirlpoolAc.html#a1bc1366524cf3c7fb426e908a166801f',1,'IRWhirlpoolAc::isOffTimerEnabled()']]], - ['isontimeractive_716',['isOnTimerActive',['../classIRVestelAc.html#a67f0e970af50fcf6e01e4cac85c5862a',1,'IRVestelAc']]], - ['isontimerenabled_717',['isOnTimerEnabled',['../classIRMideaAC.html#a61f53e462caa1bc8329a6ebadbe47f93',1,'IRMideaAC::isOnTimerEnabled()'],['../classIRPanasonicAc.html#a04cbf8f5063a3892020d383c77abc57c',1,'IRPanasonicAc::isOnTimerEnabled()'],['../classIRWhirlpoolAc.html#aff1b8c2d063b376725a5a77745f6be3a',1,'IRWhirlpoolAc::isOnTimerEnabled()']]], - ['ispowerspecial_718',['isPowerSpecial',['../classIRSharpAc.html#ae18f76e03fd9ee8cb5bb8e9b41718e9d',1,'IRSharpAc']]], - ['isprotocolsupported_719',['isProtocolSupported',['../classIRac.html#ad9c2fc9d07db70704f78a2d5f7be5b1c',1,'IRac']]], - ['isspecialstate_720',['isSpecialState',['../classIRCoolixAC.html#aa9bfc6c78fca87962c9335d60f625322',1,'IRCoolixAC::isSpecialState()'],['../classIRTranscoldAc.html#aed8c20db75d4070e66445fb2b092e2de',1,'IRTranscoldAc::isSpecialState()']]], - ['isswingvstep_721',['isSwingVStep',['../classIRMideaAC.html#a360aa29e0f6817709644f6b36abce754',1,'IRMideaAC']]], - ['isswingvtoggle_722',['isSwingVToggle',['../classIRMideaAC.html#a5277fa1d077650be0edcf284db50d38b',1,'IRMideaAC']]], - ['istimecommand_723',['isTimeCommand',['../classIRVestelAc.html#ae811a07c1a8d82e7068c39b9ca73aaf1',1,'IRVestelAc']]], - ['istimeractive_724',['isTimerActive',['../classIRVestelAc.html#a160b73df8e1eda984f9bfbff3df7fa63',1,'IRVestelAc']]], - ['istimerenabled_725',['isTimerEnabled',['../classIRWhirlpoolAc.html#a5a713ffed99ab3450257d83e2d6e15ee',1,'IRWhirlpoolAc']]], - ['isturbotoggle_726',['isTurboToggle',['../classIRMideaAC.html#ae40e95fbee35ecc00ebff23c0b64e56d',1,'IRMideaAC']]], - ['isvalidlgac_727',['isValidLgAc',['../classIRLgAc.html#ad35d47f590ee4bd51bfdf9d911bce242',1,'IRLgAc']]], - ['it_2dit_2eh_728',['it-IT.h',['../it-IT_8h.html',1,'']]], - ['internationalisation_20_28i18n_29_20_26_20locale_20files_729',['Internationalisation (I18N) & Locale Files',['../md_src_locale_README.html',1,'']]] -]; diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/all_c.js b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/all_c.js deleted file mode 100644 index c01c4e915..000000000 --- a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/all_c.js +++ /dev/null @@ -1,19 +0,0 @@ -var searchData= -[ - ['label_2995',['Label',['../structCoronaSection.html#abc6d0caa713c73244c4bf2f602074d48',1,'CoronaSection']]], - ['lasertag_2996',['LASERTAG',['../IRremoteESP8266_8h.html#ad5b287a488a8c1b7b8661f029ab56fada92eadf4fa6dd16da5b79a2fcbf729894',1,'IRremoteESP8266.h']]], - ['ledflag_2997',['ledFlag',['../classIRCoolixAC.html#a03ba5e0a6cb47a7bb054155c2111a69c',1,'IRCoolixAC']]], - ['ledoff_2998',['ledOff',['../classIRsend.html#ae71cc5aa99f894785fb4f7abc05841b2',1,'IRsend']]], - ['ledon_2999',['ledOn',['../classIRsend.html#a13d804171fa7c14aff4def38c6ffb6c8',1,'IRsend']]], - ['legopf_3000',['LEGOPF',['../IRremoteESP8266_8h.html#ad5b287a488a8c1b7b8661f029ab56fada9a31bf5555b17ea7b115a5c2550fc1de',1,'IRremoteESP8266.h']]], - ['lg_3001',['lg',['../classIRac.html#afad31ecf9eae573882d53dd6629485fb',1,'IRac::lg()'],['../IRremoteESP8266_8h.html#ad5b287a488a8c1b7b8661f029ab56fadadf6c249ac7d923229f9e623eff9a61f4',1,'LG(): IRremoteESP8266.h']]], - ['lg2_3002',['LG2',['../IRremoteESP8266_8h.html#ad5b287a488a8c1b7b8661f029ab56fada8402547ec0b99b9b0efe97dec65badf9',1,'IRremoteESP8266.h']]], - ['lg_5fac_5fremote_5fmodel_5ft_3003',['lg_ac_remote_model_t',['../IRsend_8h.html#a50c54713e16502d280723334879dc83b',1,'IRsend.h']]], - ['lgprotocol_3004',['LGProtocol',['../unionLGProtocol.html',1,'']]], - ['light_3005',['Light',['../unionDaikin2Protocol.html#adaf55ec9e1b9ba278c7391d9d797f3ba',1,'Daikin2Protocol::Light()'],['../unionGoodweatherProtocol.html#a845565af7661af0c05290a7ce039f8e2',1,'GoodweatherProtocol::Light()'],['../unionGreeProtocol.html#a72092768725667d3bce381a6e2900c66',1,'GreeProtocol::Light()'],['../unionKelvinatorProtocol.html#a38f5b978fd63fda659f0e0b5f682440e',1,'KelvinatorProtocol::Light()'],['../unionNeoclimaProtocol.html#a598346f565ad6d57df03f5256a878dd6',1,'NeoclimaProtocol::Light()'],['../unionVoltasProtocol.html#a811a0de66771c693831740440aac460c',1,'VoltasProtocol::Light()'],['../structstdAc_1_1state__t.html#a51c3a5c4703ea49b420d70aeb18b6b9b',1,'stdAc::state_t::light()']]], - ['lighttoggle_3006',['LightToggle',['../unionElectraProtocol.html#aa2a5998cafd139e5ce7626edc4782c56',1,'ElectraProtocol']]], - ['llword_3007',['llword',['../unionmagiquest.html#ad57fbc75ab289c3e93b94be0b2187d65',1,'magiquest']]], - ['lowlevelsanitycheck_3008',['lowLevelSanityCheck',['../namespaceirutils.html#af67b75834051c4aced358b274c1c55a8',1,'irutils']]], - ['lutron_3009',['LUTRON',['../IRremoteESP8266_8h.html#ad5b287a488a8c1b7b8661f029ab56fada76cc459b9e26d82ed82cf120272fd8cb',1,'IRremoteESP8266.h']]], - ['lword_3010',['lword',['../unionmagiquest.html#ac87102145311831a232002b52fe2d02c',1,'magiquest']]] -]; diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/classes_0.js b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/classes_0.js deleted file mode 100644 index b8fcf1ddc..000000000 --- a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/classes_0.js +++ /dev/null @@ -1,6 +0,0 @@ -var searchData= -[ - ['airwellprotocol_3528',['AirwellProtocol',['../unionAirwellProtocol.html',1,'']]], - ['amcorprotocol_3529',['AmcorProtocol',['../unionAmcorProtocol.html',1,'']]], - ['argoprotocol_3530',['ArgoProtocol',['../unionArgoProtocol.html',1,'']]] -]; diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/classes_1.js b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/classes_1.js deleted file mode 100644 index 750ecdc55..000000000 --- a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/classes_1.js +++ /dev/null @@ -1,7 +0,0 @@ -var searchData= -[ - ['carrierprotocol_3531',['CarrierProtocol',['../unionCarrierProtocol.html',1,'']]], - ['coolixprotocol_3532',['CoolixProtocol',['../unionCoolixProtocol.html',1,'']]], - ['coronaprotocol_3533',['CoronaProtocol',['../unionCoronaProtocol.html',1,'']]], - ['coronasection_3534',['CoronaSection',['../structCoronaSection.html',1,'']]] -]; diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/classes_2.js b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/classes_2.js deleted file mode 100644 index 6bbf6694f..000000000 --- a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/classes_2.js +++ /dev/null @@ -1,13 +0,0 @@ -var searchData= -[ - ['daikin128protocol_3535',['Daikin128Protocol',['../unionDaikin128Protocol.html',1,'']]], - ['daikin152protocol_3536',['Daikin152Protocol',['../unionDaikin152Protocol.html',1,'']]], - ['daikin160protocol_3537',['Daikin160Protocol',['../unionDaikin160Protocol.html',1,'']]], - ['daikin176protocol_3538',['Daikin176Protocol',['../unionDaikin176Protocol.html',1,'']]], - ['daikin216protocol_3539',['Daikin216Protocol',['../unionDaikin216Protocol.html',1,'']]], - ['daikin2protocol_3540',['Daikin2Protocol',['../unionDaikin2Protocol.html',1,'']]], - ['daikin64protocol_3541',['Daikin64Protocol',['../unionDaikin64Protocol.html',1,'']]], - ['daikinespprotocol_3542',['DaikinESPProtocol',['../unionDaikinESPProtocol.html',1,'']]], - ['decode_5fresults_3543',['decode_results',['../classdecode__results.html',1,'']]], - ['delonghiprotocol_3544',['DelonghiProtocol',['../unionDelonghiProtocol.html',1,'']]] -]; diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/classes_3.js b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/classes_3.js deleted file mode 100644 index ec47b54fc..000000000 --- a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/classes_3.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['electraprotocol_3545',['ElectraProtocol',['../unionElectraProtocol.html',1,'']]] -]; diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/classes_4.js b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/classes_4.js deleted file mode 100644 index 0f5d656af..000000000 --- a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/classes_4.js +++ /dev/null @@ -1,5 +0,0 @@ -var searchData= -[ - ['goodweatherprotocol_3546',['GoodweatherProtocol',['../unionGoodweatherProtocol.html',1,'']]], - ['greeprotocol_3547',['GreeProtocol',['../unionGreeProtocol.html',1,'']]] -]; diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/classes_5.js b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/classes_5.js deleted file mode 100644 index 59c1e6417..000000000 --- a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/classes_5.js +++ /dev/null @@ -1,8 +0,0 @@ -var searchData= -[ - ['haierprotocol_3548',['HaierProtocol',['../unionHaierProtocol.html',1,'']]], - ['haieryrw02protocol_3549',['HaierYRW02Protocol',['../unionHaierYRW02Protocol.html',1,'']]], - ['hitachi1protocol_3550',['Hitachi1Protocol',['../unionHitachi1Protocol.html',1,'']]], - ['hitachi424protocol_3551',['Hitachi424Protocol',['../unionHitachi424Protocol.html',1,'']]], - ['hitachiprotocol_3552',['HitachiProtocol',['../unionHitachiProtocol.html',1,'']]] -]; diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/classes_6.js b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/classes_6.js deleted file mode 100644 index a13cb82e3..000000000 --- a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/classes_6.js +++ /dev/null @@ -1,57 +0,0 @@ -var searchData= -[ - ['irac_3553',['IRac',['../classIRac.html',1,'']]], - ['irairwellac_3554',['IRAirwellAc',['../classIRAirwellAc.html',1,'']]], - ['iramcorac_3555',['IRAmcorAc',['../classIRAmcorAc.html',1,'']]], - ['irargoac_3556',['IRArgoAC',['../classIRArgoAC.html',1,'']]], - ['ircarrierac64_3557',['IRCarrierAc64',['../classIRCarrierAc64.html',1,'']]], - ['ircoolixac_3558',['IRCoolixAC',['../classIRCoolixAC.html',1,'']]], - ['ircoronaac_3559',['IRCoronaAc',['../classIRCoronaAc.html',1,'']]], - ['irdaikin128_3560',['IRDaikin128',['../classIRDaikin128.html',1,'']]], - ['irdaikin152_3561',['IRDaikin152',['../classIRDaikin152.html',1,'']]], - ['irdaikin160_3562',['IRDaikin160',['../classIRDaikin160.html',1,'']]], - ['irdaikin176_3563',['IRDaikin176',['../classIRDaikin176.html',1,'']]], - ['irdaikin2_3564',['IRDaikin2',['../classIRDaikin2.html',1,'']]], - ['irdaikin216_3565',['IRDaikin216',['../classIRDaikin216.html',1,'']]], - ['irdaikin64_3566',['IRDaikin64',['../classIRDaikin64.html',1,'']]], - ['irdaikinesp_3567',['IRDaikinESP',['../classIRDaikinESP.html',1,'']]], - ['irdelonghiac_3568',['IRDelonghiAc',['../classIRDelonghiAc.html',1,'']]], - ['irelectraac_3569',['IRElectraAc',['../classIRElectraAc.html',1,'']]], - ['irfujitsuac_3570',['IRFujitsuAC',['../classIRFujitsuAC.html',1,'']]], - ['irgoodweatherac_3571',['IRGoodweatherAc',['../classIRGoodweatherAc.html',1,'']]], - ['irgreeac_3572',['IRGreeAC',['../classIRGreeAC.html',1,'']]], - ['irhaierac_3573',['IRHaierAC',['../classIRHaierAC.html',1,'']]], - ['irhaieracyrw02_3574',['IRHaierACYRW02',['../classIRHaierACYRW02.html',1,'']]], - ['irhitachiac_3575',['IRHitachiAc',['../classIRHitachiAc.html',1,'']]], - ['irhitachiac1_3576',['IRHitachiAc1',['../classIRHitachiAc1.html',1,'']]], - ['irhitachiac3_3577',['IRHitachiAc3',['../classIRHitachiAc3.html',1,'']]], - ['irhitachiac344_3578',['IRHitachiAc344',['../classIRHitachiAc344.html',1,'']]], - ['irhitachiac424_3579',['IRHitachiAc424',['../classIRHitachiAc424.html',1,'']]], - ['irkelvinatorac_3580',['IRKelvinatorAC',['../classIRKelvinatorAC.html',1,'']]], - ['irlgac_3581',['IRLgAc',['../classIRLgAc.html',1,'']]], - ['irmideaac_3582',['IRMideaAC',['../classIRMideaAC.html',1,'']]], - ['irmitsubishi112_3583',['IRMitsubishi112',['../classIRMitsubishi112.html',1,'']]], - ['irmitsubishi136_3584',['IRMitsubishi136',['../classIRMitsubishi136.html',1,'']]], - ['irmitsubishiac_3585',['IRMitsubishiAC',['../classIRMitsubishiAC.html',1,'']]], - ['irmitsubishiheavy152ac_3586',['IRMitsubishiHeavy152Ac',['../classIRMitsubishiHeavy152Ac.html',1,'']]], - ['irmitsubishiheavy88ac_3587',['IRMitsubishiHeavy88Ac',['../classIRMitsubishiHeavy88Ac.html',1,'']]], - ['irneoclimaac_3588',['IRNeoclimaAc',['../classIRNeoclimaAc.html',1,'']]], - ['irpanasonicac_3589',['IRPanasonicAc',['../classIRPanasonicAc.html',1,'']]], - ['irpanasonicac32_3590',['IRPanasonicAc32',['../classIRPanasonicAc32.html',1,'']]], - ['irparams_5ft_3591',['irparams_t',['../structirparams__t.html',1,'']]], - ['irrecv_3592',['IRrecv',['../classIRrecv.html',1,'']]], - ['irsamsungac_3593',['IRSamsungAc',['../classIRSamsungAc.html',1,'']]], - ['irsanyoac_3594',['IRSanyoAc',['../classIRSanyoAc.html',1,'']]], - ['irsend_3595',['IRsend',['../classIRsend.html',1,'']]], - ['irsharpac_3596',['IRSharpAc',['../classIRSharpAc.html',1,'']]], - ['irtcl112ac_3597',['IRTcl112Ac',['../classIRTcl112Ac.html',1,'']]], - ['irtechnibelac_3598',['IRTechnibelAc',['../classIRTechnibelAc.html',1,'']]], - ['irtecoac_3599',['IRTecoAc',['../classIRTecoAc.html',1,'']]], - ['irtimer_3600',['IRtimer',['../classIRtimer.html',1,'']]], - ['irtoshibaac_3601',['IRToshibaAC',['../classIRToshibaAC.html',1,'']]], - ['irtranscoldac_3602',['IRTranscoldAc',['../classIRTranscoldAc.html',1,'']]], - ['irtrotecesp_3603',['IRTrotecESP',['../classIRTrotecESP.html',1,'']]], - ['irvestelac_3604',['IRVestelAc',['../classIRVestelAc.html',1,'']]], - ['irvoltas_3605',['IRVoltas',['../classIRVoltas.html',1,'']]], - ['irwhirlpoolac_3606',['IRWhirlpoolAc',['../classIRWhirlpoolAc.html',1,'']]] -]; diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/classes_7.js b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/classes_7.js deleted file mode 100644 index d64666355..000000000 --- a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/classes_7.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['kelvinatorprotocol_3607',['KelvinatorProtocol',['../unionKelvinatorProtocol.html',1,'']]] -]; diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/classes_8.js b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/classes_8.js deleted file mode 100644 index fd517523e..000000000 --- a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/classes_8.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['lgprotocol_3608',['LGProtocol',['../unionLGProtocol.html',1,'']]] -]; diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/classes_9.js b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/classes_9.js deleted file mode 100644 index efcfa7b5d..000000000 --- a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/classes_9.js +++ /dev/null @@ -1,11 +0,0 @@ -var searchData= -[ - ['magiquest_3609',['magiquest',['../unionmagiquest.html',1,'']]], - ['match_5fresult_5ft_3610',['match_result_t',['../structmatch__result__t.html',1,'']]], - ['mideaprotocol_3611',['MideaProtocol',['../unionMideaProtocol.html',1,'']]], - ['mitsubishi112protocol_3612',['Mitsubishi112Protocol',['../unionMitsubishi112Protocol.html',1,'']]], - ['mitsubishi136protocol_3613',['Mitsubishi136Protocol',['../unionMitsubishi136Protocol.html',1,'']]], - ['mitsubishi144protocol_3614',['Mitsubishi144Protocol',['../unionMitsubishi144Protocol.html',1,'']]], - ['mitsubishi152protocol_3615',['Mitsubishi152Protocol',['../unionMitsubishi152Protocol.html',1,'']]], - ['mitsubishi88protocol_3616',['Mitsubishi88Protocol',['../unionMitsubishi88Protocol.html',1,'']]] -]; diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/classes_a.js b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/classes_a.js deleted file mode 100644 index 6401b09bc..000000000 --- a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/classes_a.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['neoclimaprotocol_3617',['NeoclimaProtocol',['../unionNeoclimaProtocol.html',1,'']]] -]; diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/classes_b.js b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/classes_b.js deleted file mode 100644 index 2f6d41608..000000000 --- a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/classes_b.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['panasonicac32protocol_3618',['PanasonicAc32Protocol',['../unionPanasonicAc32Protocol.html',1,'']]] -]; diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/classes_c.js b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/classes_c.js deleted file mode 100644 index b6355be8b..000000000 --- a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/classes_c.js +++ /dev/null @@ -1,7 +0,0 @@ -var searchData= -[ - ['samsungprotocol_3619',['SamsungProtocol',['../unionSamsungProtocol.html',1,'']]], - ['sanyoprotocol_3620',['SanyoProtocol',['../unionSanyoProtocol.html',1,'']]], - ['sharpprotocol_3621',['SharpProtocol',['../unionSharpProtocol.html',1,'']]], - ['state_5ft_3622',['state_t',['../structstdAc_1_1state__t.html',1,'stdAc']]] -]; diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/classes_d.js b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/classes_d.js deleted file mode 100644 index 57ae8c033..000000000 --- a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/classes_d.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['timerms_3623',['TimerMs',['../classTimerMs.html',1,'']]] -]; diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/classes_e.js b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/classes_e.js deleted file mode 100644 index faadfb5f1..000000000 --- a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/classes_e.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['voltasprotocol_3624',['VoltasProtocol',['../unionVoltasProtocol.html',1,'']]] -]; diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/enums_5.js b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/enums_5.js deleted file mode 100644 index 402bf7136..000000000 --- a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/enums_5.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['opmode_5ft_6987',['opmode_t',['../namespacestdAc.html#a99ad268c783486f9b3207cb78f48444f',1,'stdAc']]] -]; diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/enums_7.js b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/enums_7.js deleted file mode 100644 index c82f51ed6..000000000 --- a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/enums_7.js +++ /dev/null @@ -1,6 +0,0 @@ -var searchData= -[ - ['sharp_5fac_5fremote_5fmodel_5ft_6989',['sharp_ac_remote_model_t',['../IRsend_8h.html#a258e4af12642d613587149fa734e45e7',1,'IRsend.h']]], - ['swingh_5ft_6990',['swingh_t',['../namespacestdAc.html#aae50ee315fa9c9ec1a4078da40d6b147',1,'stdAc']]], - ['swingv_5ft_6991',['swingv_t',['../namespacestdAc.html#ac07f224c7bb47cac55dd01f24770ef43',1,'stdAc']]] -]; diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/enumvalues_3.js b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/enumvalues_3.js deleted file mode 100644 index d1d7d023a..000000000 --- a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/enumvalues_3.js +++ /dev/null @@ -1,6 +0,0 @@ -var searchData= -[ - ['electra_5fac_7025',['ELECTRA_AC',['../IRremoteESP8266_8h.html#ad5b287a488a8c1b7b8661f029ab56fada05f193ef4ead3e54624bd92dc3203fac',1,'IRremoteESP8266.h']]], - ['elitescreens_7026',['ELITESCREENS',['../IRremoteESP8266_8h.html#ad5b287a488a8c1b7b8661f029ab56fadafebe19d5453be4c99de8c031508b7cb1',1,'IRremoteESP8266.h']]], - ['epson_7027',['EPSON',['../IRremoteESP8266_8h.html#ad5b287a488a8c1b7b8661f029ab56fadaaf677fd380c38297264a10732631927c',1,'IRremoteESP8266.h']]] -]; diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/files_0.js b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/files_0.js deleted file mode 100644 index 106a1db5f..000000000 --- a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/files_0.js +++ /dev/null @@ -1,7 +0,0 @@ -var searchData= -[ - ['de_2dch_2eh_3629',['de-CH.h',['../de-CH_8h.html',1,'']]], - ['de_2dde_2eh_3630',['de-DE.h',['../de-DE_8h.html',1,'']]], - ['defaults_2eh_3631',['defaults.h',['../defaults_8h.html',1,'']]], - ['doxygen_5findex_2emd_3632',['doxygen_index.md',['../doxygen__index_8md.html',1,'']]] -]; diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/files_1.js b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/files_1.js deleted file mode 100644 index ecfc159e2..000000000 --- a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/files_1.js +++ /dev/null @@ -1,8 +0,0 @@ -var searchData= -[ - ['en_2dau_2eh_3633',['en-AU.h',['../en-AU_8h.html',1,'']]], - ['en_2die_2eh_3634',['en-IE.h',['../en-IE_8h.html',1,'']]], - ['en_2duk_2eh_3635',['en-UK.h',['../en-UK_8h.html',1,'']]], - ['en_2dus_2eh_3636',['en-US.h',['../en-US_8h.html',1,'']]], - ['es_2des_2eh_3637',['es-ES.h',['../es-ES_8h.html',1,'']]] -]; diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/files_2.js b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/files_2.js deleted file mode 100644 index a941fb1ad..000000000 --- a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/files_2.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['fr_2dfr_2eh_3638',['fr-FR.h',['../fr-FR_8h.html',1,'']]] -]; diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/files_3.js b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/files_3.js deleted file mode 100644 index f8fb7de2b..000000000 --- a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/files_3.js +++ /dev/null @@ -1,115 +0,0 @@ -var searchData= -[ - ['i18n_2eh_3639',['i18n.h',['../i18n_8h.html',1,'']]], - ['ir_5fairwell_2ecpp_3640',['ir_Airwell.cpp',['../ir__Airwell_8cpp.html',1,'']]], - ['ir_5fairwell_2eh_3641',['ir_Airwell.h',['../ir__Airwell_8h.html',1,'']]], - ['ir_5faiwa_2ecpp_3642',['ir_Aiwa.cpp',['../ir__Aiwa_8cpp.html',1,'']]], - ['ir_5famcor_2ecpp_3643',['ir_Amcor.cpp',['../ir__Amcor_8cpp.html',1,'']]], - ['ir_5famcor_2eh_3644',['ir_Amcor.h',['../ir__Amcor_8h.html',1,'']]], - ['ir_5fargo_2ecpp_3645',['ir_Argo.cpp',['../ir__Argo_8cpp.html',1,'']]], - ['ir_5fargo_2eh_3646',['ir_Argo.h',['../ir__Argo_8h.html',1,'']]], - ['ir_5fcarrier_2ecpp_3647',['ir_Carrier.cpp',['../ir__Carrier_8cpp.html',1,'']]], - ['ir_5fcarrier_2eh_3648',['ir_Carrier.h',['../ir__Carrier_8h.html',1,'']]], - ['ir_5fcoolix_2ecpp_3649',['ir_Coolix.cpp',['../ir__Coolix_8cpp.html',1,'']]], - ['ir_5fcoolix_2eh_3650',['ir_Coolix.h',['../ir__Coolix_8h.html',1,'']]], - ['ir_5fcorona_2ecpp_3651',['ir_Corona.cpp',['../ir__Corona_8cpp.html',1,'']]], - ['ir_5fcorona_2eh_3652',['ir_Corona.h',['../ir__Corona_8h.html',1,'']]], - ['ir_5fdaikin_2ecpp_3653',['ir_Daikin.cpp',['../ir__Daikin_8cpp.html',1,'']]], - ['ir_5fdaikin_2eh_3654',['ir_Daikin.h',['../ir__Daikin_8h.html',1,'']]], - ['ir_5fdelonghi_2ecpp_3655',['ir_Delonghi.cpp',['../ir__Delonghi_8cpp.html',1,'']]], - ['ir_5fdelonghi_2eh_3656',['ir_Delonghi.h',['../ir__Delonghi_8h.html',1,'']]], - ['ir_5fdenon_2ecpp_3657',['ir_Denon.cpp',['../ir__Denon_8cpp.html',1,'']]], - ['ir_5fdish_2ecpp_3658',['ir_Dish.cpp',['../ir__Dish_8cpp.html',1,'']]], - ['ir_5fdoshisha_2ecpp_3659',['ir_Doshisha.cpp',['../ir__Doshisha_8cpp.html',1,'']]], - ['ir_5felectra_2ecpp_3660',['ir_Electra.cpp',['../ir__Electra_8cpp.html',1,'']]], - ['ir_5felectra_2eh_3661',['ir_Electra.h',['../ir__Electra_8h.html',1,'']]], - ['ir_5felitescreens_2ecpp_3662',['ir_EliteScreens.cpp',['../ir__EliteScreens_8cpp.html',1,'']]], - ['ir_5fepson_2ecpp_3663',['ir_Epson.cpp',['../ir__Epson_8cpp.html',1,'']]], - ['ir_5ffujitsu_2ecpp_3664',['ir_Fujitsu.cpp',['../ir__Fujitsu_8cpp.html',1,'']]], - ['ir_5ffujitsu_2eh_3665',['ir_Fujitsu.h',['../ir__Fujitsu_8h.html',1,'']]], - ['ir_5fgicable_2ecpp_3666',['ir_GICable.cpp',['../ir__GICable_8cpp.html',1,'']]], - ['ir_5fglobalcache_2ecpp_3667',['ir_GlobalCache.cpp',['../ir__GlobalCache_8cpp.html',1,'']]], - ['ir_5fgoodweather_2ecpp_3668',['ir_Goodweather.cpp',['../ir__Goodweather_8cpp.html',1,'']]], - ['ir_5fgoodweather_2eh_3669',['ir_Goodweather.h',['../ir__Goodweather_8h.html',1,'']]], - ['ir_5fgree_2ecpp_3670',['ir_Gree.cpp',['../ir__Gree_8cpp.html',1,'']]], - ['ir_5fgree_2eh_3671',['ir_Gree.h',['../ir__Gree_8h.html',1,'']]], - ['ir_5fhaier_2ecpp_3672',['ir_Haier.cpp',['../ir__Haier_8cpp.html',1,'']]], - ['ir_5fhaier_2eh_3673',['ir_Haier.h',['../ir__Haier_8h.html',1,'']]], - ['ir_5fhitachi_2ecpp_3674',['ir_Hitachi.cpp',['../ir__Hitachi_8cpp.html',1,'']]], - ['ir_5fhitachi_2eh_3675',['ir_Hitachi.h',['../ir__Hitachi_8h.html',1,'']]], - ['ir_5finax_2ecpp_3676',['ir_Inax.cpp',['../ir__Inax_8cpp.html',1,'']]], - ['ir_5fjvc_2ecpp_3677',['ir_JVC.cpp',['../ir__JVC_8cpp.html',1,'']]], - ['ir_5fkelvinator_2ecpp_3678',['ir_Kelvinator.cpp',['../ir__Kelvinator_8cpp.html',1,'']]], - ['ir_5fkelvinator_2eh_3679',['ir_Kelvinator.h',['../ir__Kelvinator_8h.html',1,'']]], - ['ir_5flasertag_2ecpp_3680',['ir_Lasertag.cpp',['../ir__Lasertag_8cpp.html',1,'']]], - ['ir_5flego_2ecpp_3681',['ir_Lego.cpp',['../ir__Lego_8cpp.html',1,'']]], - ['ir_5flg_2ecpp_3682',['ir_LG.cpp',['../ir__LG_8cpp.html',1,'']]], - ['ir_5flg_2eh_3683',['ir_LG.h',['../ir__LG_8h.html',1,'']]], - ['ir_5flutron_2ecpp_3684',['ir_Lutron.cpp',['../ir__Lutron_8cpp.html',1,'']]], - ['ir_5fmagiquest_2ecpp_3685',['ir_Magiquest.cpp',['../ir__Magiquest_8cpp.html',1,'']]], - ['ir_5fmagiquest_2eh_3686',['ir_Magiquest.h',['../ir__Magiquest_8h.html',1,'']]], - ['ir_5fmetz_2ecpp_3687',['ir_Metz.cpp',['../ir__Metz_8cpp.html',1,'']]], - ['ir_5fmidea_2ecpp_3688',['ir_Midea.cpp',['../ir__Midea_8cpp.html',1,'']]], - ['ir_5fmidea_2eh_3689',['ir_Midea.h',['../ir__Midea_8h.html',1,'']]], - ['ir_5fmirage_2ecpp_3690',['ir_Mirage.cpp',['../ir__Mirage_8cpp.html',1,'']]], - ['ir_5fmitsubishi_2ecpp_3691',['ir_Mitsubishi.cpp',['../ir__Mitsubishi_8cpp.html',1,'']]], - ['ir_5fmitsubishi_2eh_3692',['ir_Mitsubishi.h',['../ir__Mitsubishi_8h.html',1,'']]], - ['ir_5fmitsubishiheavy_2ecpp_3693',['ir_MitsubishiHeavy.cpp',['../ir__MitsubishiHeavy_8cpp.html',1,'']]], - ['ir_5fmitsubishiheavy_2eh_3694',['ir_MitsubishiHeavy.h',['../ir__MitsubishiHeavy_8h.html',1,'']]], - ['ir_5fmultibrackets_2ecpp_3695',['ir_Multibrackets.cpp',['../ir__Multibrackets_8cpp.html',1,'']]], - ['ir_5fmwm_2ecpp_3696',['ir_MWM.cpp',['../ir__MWM_8cpp.html',1,'']]], - ['ir_5fnec_2ecpp_3697',['ir_NEC.cpp',['../ir__NEC_8cpp.html',1,'']]], - ['ir_5fnec_2eh_3698',['ir_NEC.h',['../ir__NEC_8h.html',1,'']]], - ['ir_5fneoclima_2ecpp_3699',['ir_Neoclima.cpp',['../ir__Neoclima_8cpp.html',1,'']]], - ['ir_5fneoclima_2eh_3700',['ir_Neoclima.h',['../ir__Neoclima_8h.html',1,'']]], - ['ir_5fnikai_2ecpp_3701',['ir_Nikai.cpp',['../ir__Nikai_8cpp.html',1,'']]], - ['ir_5fpanasonic_2ecpp_3702',['ir_Panasonic.cpp',['../ir__Panasonic_8cpp.html',1,'']]], - ['ir_5fpanasonic_2eh_3703',['ir_Panasonic.h',['../ir__Panasonic_8h.html',1,'']]], - ['ir_5fpioneer_2ecpp_3704',['ir_Pioneer.cpp',['../ir__Pioneer_8cpp.html',1,'']]], - ['ir_5fpronto_2ecpp_3705',['ir_Pronto.cpp',['../ir__Pronto_8cpp.html',1,'']]], - ['ir_5frc5_5frc6_2ecpp_3706',['ir_RC5_RC6.cpp',['../ir__RC5__RC6_8cpp.html',1,'']]], - ['ir_5frcmm_2ecpp_3707',['ir_RCMM.cpp',['../ir__RCMM_8cpp.html',1,'']]], - ['ir_5fsamsung_2ecpp_3708',['ir_Samsung.cpp',['../ir__Samsung_8cpp.html',1,'']]], - ['ir_5fsamsung_2eh_3709',['ir_Samsung.h',['../ir__Samsung_8h.html',1,'']]], - ['ir_5fsanyo_2ecpp_3710',['ir_Sanyo.cpp',['../ir__Sanyo_8cpp.html',1,'']]], - ['ir_5fsanyo_2eh_3711',['ir_Sanyo.h',['../ir__Sanyo_8h.html',1,'']]], - ['ir_5fsharp_2ecpp_3712',['ir_Sharp.cpp',['../ir__Sharp_8cpp.html',1,'']]], - ['ir_5fsharp_2eh_3713',['ir_Sharp.h',['../ir__Sharp_8h.html',1,'']]], - ['ir_5fsherwood_2ecpp_3714',['ir_Sherwood.cpp',['../ir__Sherwood_8cpp.html',1,'']]], - ['ir_5fsony_2ecpp_3715',['ir_Sony.cpp',['../ir__Sony_8cpp.html',1,'']]], - ['ir_5fsymphony_2ecpp_3716',['ir_Symphony.cpp',['../ir__Symphony_8cpp.html',1,'']]], - ['ir_5ftcl_2ecpp_3717',['ir_Tcl.cpp',['../ir__Tcl_8cpp.html',1,'']]], - ['ir_5ftcl_2eh_3718',['ir_Tcl.h',['../ir__Tcl_8h.html',1,'']]], - ['ir_5ftechnibel_2ecpp_3719',['ir_Technibel.cpp',['../ir__Technibel_8cpp.html',1,'']]], - ['ir_5ftechnibel_2eh_3720',['ir_Technibel.h',['../ir__Technibel_8h.html',1,'']]], - ['ir_5fteco_2ecpp_3721',['ir_Teco.cpp',['../ir__Teco_8cpp.html',1,'']]], - ['ir_5fteco_2eh_3722',['ir_Teco.h',['../ir__Teco_8h.html',1,'']]], - ['ir_5ftoshiba_2ecpp_3723',['ir_Toshiba.cpp',['../ir__Toshiba_8cpp.html',1,'']]], - ['ir_5ftoshiba_2eh_3724',['ir_Toshiba.h',['../ir__Toshiba_8h.html',1,'']]], - ['ir_5ftranscold_2ecpp_3725',['ir_Transcold.cpp',['../ir__Transcold_8cpp.html',1,'']]], - ['ir_5ftranscold_2eh_3726',['ir_Transcold.h',['../ir__Transcold_8h.html',1,'']]], - ['ir_5ftrotec_2ecpp_3727',['ir_Trotec.cpp',['../ir__Trotec_8cpp.html',1,'']]], - ['ir_5ftrotec_2eh_3728',['ir_Trotec.h',['../ir__Trotec_8h.html',1,'']]], - ['ir_5fvestel_2ecpp_3729',['ir_Vestel.cpp',['../ir__Vestel_8cpp.html',1,'']]], - ['ir_5fvestel_2eh_3730',['ir_Vestel.h',['../ir__Vestel_8h.html',1,'']]], - ['ir_5fvoltas_2ecpp_3731',['ir_Voltas.cpp',['../ir__Voltas_8cpp.html',1,'']]], - ['ir_5fvoltas_2eh_3732',['ir_Voltas.h',['../ir__Voltas_8h.html',1,'']]], - ['ir_5fwhirlpool_2ecpp_3733',['ir_Whirlpool.cpp',['../ir__Whirlpool_8cpp.html',1,'']]], - ['ir_5fwhirlpool_2eh_3734',['ir_Whirlpool.h',['../ir__Whirlpool_8h.html',1,'']]], - ['ir_5fwhynter_2ecpp_3735',['ir_Whynter.cpp',['../ir__Whynter_8cpp.html',1,'']]], - ['ir_5fzepeal_2ecpp_3736',['ir_Zepeal.cpp',['../ir__Zepeal_8cpp.html',1,'']]], - ['irac_2ecpp_3737',['IRac.cpp',['../IRac_8cpp.html',1,'']]], - ['irac_2eh_3738',['IRac.h',['../IRac_8h.html',1,'']]], - ['irrecv_2ecpp_3739',['IRrecv.cpp',['../IRrecv_8cpp.html',1,'']]], - ['irrecv_2eh_3740',['IRrecv.h',['../IRrecv_8h.html',1,'']]], - ['irremoteesp8266_2eh_3741',['IRremoteESP8266.h',['../IRremoteESP8266_8h.html',1,'']]], - ['irsend_2ecpp_3742',['IRsend.cpp',['../IRsend_8cpp.html',1,'']]], - ['irsend_2eh_3743',['IRsend.h',['../IRsend_8h.html',1,'']]], - ['irtext_2ecpp_3744',['IRtext.cpp',['../IRtext_8cpp.html',1,'']]], - ['irtext_2eh_3745',['IRtext.h',['../IRtext_8h.html',1,'']]], - ['irtimer_2ecpp_3746',['IRtimer.cpp',['../IRtimer_8cpp.html',1,'']]], - ['irtimer_2eh_3747',['IRtimer.h',['../IRtimer_8h.html',1,'']]], - ['irutils_2ecpp_3748',['IRutils.cpp',['../IRutils_8cpp.html',1,'']]], - ['irutils_2eh_3749',['IRutils.h',['../IRutils_8h.html',1,'']]], - ['it_2dit_2eh_3750',['it-IT.h',['../it-IT_8h.html',1,'']]] -]; diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/files_4.js b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/files_4.js deleted file mode 100644 index 95f5f3b5c..000000000 --- a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/files_4.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['pt_2dbr_2eh_3751',['pt-BR.h',['../pt-BR_8h.html',1,'']]] -]; diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/files_5.js b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/files_5.js deleted file mode 100644 index 090182563..000000000 --- a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/files_5.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['readme_2emd_3752',['README.md',['../README_8md.html',1,'']]] -]; diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/files_6.js b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/files_6.js deleted file mode 100644 index 970f2b5e4..000000000 --- a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/files_6.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['zh_2dcn_2eh_3753',['zh-CN.h',['../zh-CN_8h.html',1,'']]] -]; diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/functions_1.js b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/functions_1.js deleted file mode 100644 index 29929c826..000000000 --- a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/functions_1.js +++ /dev/null @@ -1,15 +0,0 @@ -var searchData= -[ - ['add_3771',['add',['../classIRtimer.html#aa8e3ff975ae5468b4727790c828fa032',1,'IRtimer::add()'],['../classTimerMs.html#a77bfc23a029a9172c3dbac03f746b0cb',1,'TimerMs::add()']]], - ['addbooltostring_3772',['addBoolToString',['../namespaceirutils.html#a12ba9cf1830a886649a80c3cc5fdce2b',1,'irutils']]], - ['adddaytostring_3773',['addDayToString',['../namespaceirutils.html#a6ead1d10578c64627f8a24b5d8a7444f',1,'irutils']]], - ['addfantostring_3774',['addFanToString',['../namespaceirutils.html#af222d5a977e2cd2c979184c449d3c2f8',1,'irutils']]], - ['addinttostring_3775',['addIntToString',['../namespaceirutils.html#a772e623c4b60208200e02afbaec66651',1,'irutils']]], - ['addlabeledstring_3776',['addLabeledString',['../namespaceirutils.html#ac98793392d1e65c1b8d6895eb9d9b75b',1,'irutils']]], - ['addmodeltostring_3777',['addModelToString',['../namespaceirutils.html#a06e5a5c2b6f6649035dfa5eb19801367',1,'irutils']]], - ['addmodetostring_3778',['addModeToString',['../namespaceirutils.html#a8b74ae0258e98aa0eaebc6f3efe1481e',1,'irutils']]], - ['addtemptostring_3779',['addTempToString',['../namespaceirutils.html#a0cef0634f4db979a93b7dc19cc2b4a85',1,'irutils']]], - ['airwell_3780',['airwell',['../classIRac.html#a26cd62e09250d87b652d35406ebfb159',1,'IRac']]], - ['amcor_3781',['amcor',['../classIRac.html#a4bad16621b232572e14fe4a53f678131',1,'IRac']]], - ['argo_3782',['argo',['../classIRac.html#aa06ee1314529dbf96f4e6f3c28ea6821',1,'IRac']]] -]; diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/functions_15.js b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/functions_15.js deleted file mode 100644 index d85fa603e..000000000 --- a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/functions_15.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['whirlpool_4458',['whirlpool',['../classIRac.html#ae5f7a03589f614c03c5ad8629100b05a',1,'IRac']]] -]; diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/functions_17.js b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/functions_17.js deleted file mode 100644 index 8112c05fd..000000000 --- a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/functions_17.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['_7eirrecv_4460',['~IRrecv',['../classIRrecv.html#a87d4cca5e350177cb0922842dda1eb5b',1,'IRrecv']]] -]; diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/functions_4.js b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/functions_4.js deleted file mode 100644 index d577b5eae..000000000 --- a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/functions_4.js +++ /dev/null @@ -1,103 +0,0 @@ -var searchData= -[ - ['daikin_3821',['daikin',['../classIRac.html#afb6d77bbeb5b2465437cef4f58b83e0e',1,'IRac']]], - ['daikin128_3822',['daikin128',['../classIRac.html#a8fe7c254e1bcb32b6b6fdc1f91693a50',1,'IRac']]], - ['daikin152_3823',['daikin152',['../classIRac.html#a6dff8e608e3e9fecffe71c3fd1ebe74e',1,'IRac']]], - ['daikin160_3824',['daikin160',['../classIRac.html#a3b34f44d713efa52f30d43405cde831c',1,'IRac']]], - ['daikin176_3825',['daikin176',['../classIRac.html#aaae173fd58a7b53c3f4d2edbf7c4afe7',1,'IRac']]], - ['daikin2_3826',['daikin2',['../classIRac.html#a89eddc0e1b3c41c608208d2752dc954c',1,'IRac']]], - ['daikin216_3827',['daikin216',['../classIRac.html#a101ac8b9e9564e557ef1a1f61ff111d9',1,'IRac']]], - ['daikin64_3828',['daikin64',['../classIRac.html#a074db6fc0cff2878d80a397020e1b249',1,'IRac']]], - ['decode_3829',['decode',['../classIRrecv.html#aeaa5c07a8b46f8fbb982f996cc1f9f4b',1,'IRrecv']]], - ['decodeairwell_3830',['decodeAirwell',['../classIRrecv.html#acf4635d5ee146a82498cb0c269b6af41',1,'IRrecv']]], - ['decodeaiwarct501_3831',['decodeAiwaRCT501',['../classIRrecv.html#aa4d678376a4c0f8ea953474a6f5ef9d2',1,'IRrecv']]], - ['decodeamcor_3832',['decodeAmcor',['../classIRrecv.html#a8d81fcfb47e36925975d313027689a44',1,'IRrecv']]], - ['decodeargo_3833',['decodeArgo',['../classIRrecv.html#a94f12dc000a6e7b75ea8680fd48fc487',1,'IRrecv']]], - ['decodecarrierac_3834',['decodeCarrierAC',['../classIRrecv.html#acf3d1c37038120a5c0996d92577ce74a',1,'IRrecv']]], - ['decodecarrierac40_3835',['decodeCarrierAC40',['../classIRrecv.html#a4bdb35ec34f49401a6b9becd15b8a3b5',1,'IRrecv']]], - ['decodecarrierac64_3836',['decodeCarrierAC64',['../classIRrecv.html#a79d03c31da48a385ab47cc8f342ef9b3',1,'IRrecv']]], - ['decodecoolix_3837',['decodeCOOLIX',['../classIRrecv.html#a964af7e72e2133688f0596c718cb98ca',1,'IRrecv']]], - ['decodecoronaac_3838',['decodeCoronaAc',['../classIRrecv.html#a981cba14551c93af57f9c1c0e1775d12',1,'IRrecv']]], - ['decodedaikin_3839',['decodeDaikin',['../classIRrecv.html#a141f0de9f4cae8daeb025aff3904ecaa',1,'IRrecv']]], - ['decodedaikin128_3840',['decodeDaikin128',['../classIRrecv.html#ac7188577c874d9f8f19304a3ec775415',1,'IRrecv']]], - ['decodedaikin152_3841',['decodeDaikin152',['../classIRrecv.html#ab20a6586b4e56cc428012ec96f5ccc2c',1,'IRrecv']]], - ['decodedaikin160_3842',['decodeDaikin160',['../classIRrecv.html#af0b9822defe6b29099079d664d9dc413',1,'IRrecv']]], - ['decodedaikin176_3843',['decodeDaikin176',['../classIRrecv.html#aa142d1340201b6fdc5b462f46fe21ee0',1,'IRrecv']]], - ['decodedaikin2_3844',['decodeDaikin2',['../classIRrecv.html#a4c4799a0d45ea5562159c46939617d80',1,'IRrecv']]], - ['decodedaikin216_3845',['decodeDaikin216',['../classIRrecv.html#a7f860686a5c58aa8f4d1842cfb15b2f9',1,'IRrecv']]], - ['decodedaikin64_3846',['decodeDaikin64',['../classIRrecv.html#a030701f081a9c6eab0c07b75433b524c',1,'IRrecv']]], - ['decodedelonghiac_3847',['decodeDelonghiAc',['../classIRrecv.html#a8c91cc83770d243e942387cc16e9ca6f',1,'IRrecv']]], - ['decodedenon_3848',['decodeDenon',['../classIRrecv.html#a0b1bd1c817cb43bc3755126191b7f4a2',1,'IRrecv']]], - ['decodedish_3849',['decodeDISH',['../classIRrecv.html#a851776d9178aeb706d9a1abd3f254e31',1,'IRrecv']]], - ['decodedoshisha_3850',['decodeDoshisha',['../classIRrecv.html#a675c45e6b32aaeca3de734ccf2f0c819',1,'IRrecv']]], - ['decodeelectraac_3851',['decodeElectraAC',['../classIRrecv.html#ad3a7be8afc36451c8e28e27f3c3e9aaa',1,'IRrecv']]], - ['decodeelitescreens_3852',['decodeElitescreens',['../classIRrecv.html#ac830ece2c2c200b8c13fcd66828e2846',1,'IRrecv']]], - ['decodeepson_3853',['decodeEpson',['../classIRrecv.html#aaadef8415f273ba25f4086fecd681d2e',1,'IRrecv']]], - ['decodefujitsuac_3854',['decodeFujitsuAC',['../classIRrecv.html#aa3778bdf994bf9c99ac48ef95434a826',1,'IRrecv']]], - ['decodegicable_3855',['decodeGICable',['../classIRrecv.html#afade8dac9b1d023e5e0946e6b2c08aea',1,'IRrecv']]], - ['decodegoodweather_3856',['decodeGoodweather',['../classIRrecv.html#a64650ce7dbaf5fc860a6a253d906e9de',1,'IRrecv']]], - ['decodegree_3857',['decodeGree',['../classIRrecv.html#a2e756342d7524a13d53d6c656700638c',1,'IRrecv']]], - ['decodehaierac_3858',['decodeHaierAC',['../classIRrecv.html#ad97403174f05197a7fa9a4a0107e3111',1,'IRrecv']]], - ['decodehaieracyrw02_3859',['decodeHaierACYRW02',['../classIRrecv.html#a281fb9d972fee75db49209c42f649822',1,'IRrecv']]], - ['decodehash_3860',['decodeHash',['../classIRrecv.html#a7c15fbfa7936ca474712a1953911fd06',1,'IRrecv']]], - ['decodehitachiac_3861',['decodeHitachiAC',['../classIRrecv.html#aa42facfffc0e304005272b6ddd4583c8',1,'IRrecv']]], - ['decodehitachiac1_3862',['decodeHitachiAC1',['../classIRrecv.html#a122e0dcbf14c90ec2d77399acce21459',1,'IRrecv']]], - ['decodehitachiac3_3863',['decodeHitachiAc3',['../classIRrecv.html#a113bc834eff00f55d5545ce3fa1ab203',1,'IRrecv']]], - ['decodehitachiac424_3864',['decodeHitachiAc424',['../classIRrecv.html#a01c3dda56d6d916076fa1affa2213129',1,'IRrecv']]], - ['decodeinax_3865',['decodeInax',['../classIRrecv.html#a94545c6a8da027b9cb0e23ecba4c29d8',1,'IRrecv']]], - ['decodejvc_3866',['decodeJVC',['../classIRrecv.html#a25ab71efc223a418e9630d8421f44bc9',1,'IRrecv']]], - ['decodekelvinator_3867',['decodeKelvinator',['../classIRrecv.html#a0ac82f20b48b2d71ee07eb392578b226',1,'IRrecv']]], - ['decodelasertag_3868',['decodeLasertag',['../classIRrecv.html#ae4af614a45ea65cb3304ef5bd7965122',1,'IRrecv']]], - ['decodelegopf_3869',['decodeLegoPf',['../classIRrecv.html#aea75ad0ba1d8fec33de16501940f2553',1,'IRrecv']]], - ['decodelg_3870',['decodeLG',['../classIRrecv.html#afe70015c36b1477a5de0c193163e13a7',1,'IRrecv']]], - ['decodelutron_3871',['decodeLutron',['../classIRrecv.html#a6093c4404a9a9d415c5bfeab5ec53be5',1,'IRrecv']]], - ['decodemagiquest_3872',['decodeMagiQuest',['../classIRrecv.html#a6f3bfcc6767484151dee758bcf94fb0b',1,'IRrecv']]], - ['decodemetz_3873',['decodeMetz',['../classIRrecv.html#ac39aa52eec10d1c92b6e9713a22252b6',1,'IRrecv']]], - ['decodemidea_3874',['decodeMidea',['../classIRrecv.html#a255b15601f7439a09ab5e77ad78816fb',1,'IRrecv']]], - ['decodemidea24_3875',['decodeMidea24',['../classIRrecv.html#a62a04019308b29ae2aea4b3a83ba9155',1,'IRrecv']]], - ['decodemirage_3876',['decodeMirage',['../classIRrecv.html#aa88813f830a6ff6bfd6e7bde6728a3d5',1,'IRrecv']]], - ['decodemitsubishi_3877',['decodeMitsubishi',['../classIRrecv.html#a6efe3be80f0ebef3ff94ed0e56c5c52a',1,'IRrecv']]], - ['decodemitsubishi112_3878',['decodeMitsubishi112',['../classIRrecv.html#ae0690ff3cb5a5cdcdb6a514bb7bf0cdd',1,'IRrecv']]], - ['decodemitsubishi136_3879',['decodeMitsubishi136',['../classIRrecv.html#a87b3ee57dbdf762a0e305ddd43eec629',1,'IRrecv']]], - ['decodemitsubishi2_3880',['decodeMitsubishi2',['../classIRrecv.html#a9514197850491a5b8c30ae9ffc89d895',1,'IRrecv']]], - ['decodemitsubishiac_3881',['decodeMitsubishiAC',['../classIRrecv.html#a942c5f41df5cbff32a8b7703673cb621',1,'IRrecv']]], - ['decodemitsubishiheavy_3882',['decodeMitsubishiHeavy',['../classIRrecv.html#aef9cedf79793806df4cc5376710781bc',1,'IRrecv']]], - ['decodemultibrackets_3883',['decodeMultibrackets',['../classIRrecv.html#af61afacc9865232643164ba824e665ab',1,'IRrecv']]], - ['decodemwm_3884',['decodeMWM',['../classIRrecv.html#a27518b5d792cdf3ab333b324f409f328',1,'IRrecv']]], - ['decodenec_3885',['decodeNEC',['../classIRrecv.html#a52b844f80df7f64edf9ce9cc189ac5b9',1,'IRrecv']]], - ['decodeneoclima_3886',['decodeNeoclima',['../classIRrecv.html#a4729ee949e533448b481ae33bbbf1adf',1,'IRrecv']]], - ['decodenikai_3887',['decodeNikai',['../classIRrecv.html#abbcbf5fc07d7e37d7724acc37bb5f592',1,'IRrecv']]], - ['decodepanasonic_3888',['decodePanasonic',['../classIRrecv.html#aa8dd5f24d28576c6db03cc463bd0a865',1,'IRrecv']]], - ['decodepanasonicac_3889',['decodePanasonicAC',['../classIRrecv.html#a0f78e180ed731e8fb16d1c85aa721c95',1,'IRrecv']]], - ['decodepanasonicac32_3890',['decodePanasonicAC32',['../classIRrecv.html#a89ce20e483b1297cae05ab1ae96d24ec',1,'IRrecv']]], - ['decodepioneer_3891',['decodePioneer',['../classIRrecv.html#a78a9487cbe8a562392a07a4090b3091e',1,'IRrecv']]], - ['decoderc5_3892',['decodeRC5',['../classIRrecv.html#adab9dffbeceee514520fababd0e721bd',1,'IRrecv']]], - ['decoderc6_3893',['decodeRC6',['../classIRrecv.html#a67316499ef37db82e3b3ecaac25c5980',1,'IRrecv']]], - ['decodercmm_3894',['decodeRCMM',['../classIRrecv.html#a0e7bf769cb5bebf174e852e4b0b08cf3',1,'IRrecv']]], - ['decodesamsung_3895',['decodeSAMSUNG',['../classIRrecv.html#a18b6cf177364faf11b9a076dd2025eec',1,'IRrecv']]], - ['decodesamsung36_3896',['decodeSamsung36',['../classIRrecv.html#a290a9e6a0b12ef1fe02a92a456c8ad57',1,'IRrecv']]], - ['decodesamsungac_3897',['decodeSamsungAC',['../classIRrecv.html#ae779c76ebd0f3cd1fc13abaa55f80d67',1,'IRrecv']]], - ['decodesanyoac_3898',['decodeSanyoAc',['../classIRrecv.html#ab6c02d8b8079d7f344e141e6a4e7e225',1,'IRrecv']]], - ['decodesanyolc7461_3899',['decodeSanyoLC7461',['../classIRrecv.html#a01a165bf2e7d16dbbb916d1eae740bc5',1,'IRrecv']]], - ['decodesharp_3900',['decodeSharp',['../classIRrecv.html#a3390d63ba21a835d7c74c261532a22a7',1,'IRrecv']]], - ['decodesharpac_3901',['decodeSharpAc',['../classIRrecv.html#a8a9b920079f783e236f8a938e20b9743',1,'IRrecv']]], - ['decodesony_3902',['decodeSony',['../classIRrecv.html#ab03227955cf7d1d00c1620c55d7f9f18',1,'IRrecv']]], - ['decodesymphony_3903',['decodeSymphony',['../classIRrecv.html#a61cdf4d891654521afbc6ca9fb415745',1,'IRrecv']]], - ['decodetechnibelac_3904',['decodeTechnibelAc',['../classIRrecv.html#a2f022741309ad814bf11aec440a838d0',1,'IRrecv']]], - ['decodeteco_3905',['decodeTeco',['../classIRrecv.html#a950711d7df8dfe4cda86f53650cd9f56',1,'IRrecv']]], - ['decodetoshibaac_3906',['decodeToshibaAC',['../classIRrecv.html#aae6ab687ae319ae50a52238916bcfb1a',1,'IRrecv']]], - ['decodetostate_3907',['decodeToState',['../namespaceIRAcUtils.html#ac5eb498bf12cb6cba023c9c1e9726949',1,'IRAcUtils']]], - ['decodetranscold_3908',['decodeTranscold',['../classIRrecv.html#a16c44538d7e01d9b118d983de39d18e3',1,'IRrecv']]], - ['decodetrotec_3909',['decodeTrotec',['../classIRrecv.html#ae2920c488173f3fa37f5325438157ced',1,'IRrecv']]], - ['decodevestelac_3910',['decodeVestelAc',['../classIRrecv.html#a5d48b3c91434c18c7726cca504d75b73',1,'IRrecv']]], - ['decodevoltas_3911',['decodeVoltas',['../classIRrecv.html#a43539320036ba1c17e9875e4dc9fd055',1,'IRrecv']]], - ['decodewhirlpoolac_3912',['decodeWhirlpoolAC',['../classIRrecv.html#a0d1eec83cf092f5621cb34b3e94777c4',1,'IRrecv']]], - ['decodewhynter_3913',['decodeWhynter',['../classIRrecv.html#a66289f6a462557ad26e6c0a64f36cf02',1,'IRrecv']]], - ['decodezepeal_3914',['decodeZepeal',['../classIRrecv.html#a72afd857c8b2e0192021a40afc96c2d8',1,'IRrecv']]], - ['defaultbits_3915',['defaultBits',['../classIRsend.html#a70a2256bee8ad9b8ea8571dd4f26596f',1,'IRsend']]], - ['delonghiac_3916',['delonghiac',['../classIRac.html#af290b0b08cff5121bb88c62051ed1074',1,'IRac']]], - ['disableirin_3917',['disableIRIn',['../classIRrecv.html#a9f4a719e756ad78c7dd47186f8bef087',1,'IRrecv']]], - ['disableofftimer_3918',['disableOffTimer',['../classIRDaikinESP.html#a1e4e05ad0799002d0ab25db92dcaac06',1,'IRDaikinESP::disableOffTimer()'],['../classIRDaikin2.html#a8cbdbc0de31b14f974cd8cd87f3ca54a',1,'IRDaikin2::disableOffTimer()']]], - ['disableontimer_3919',['disableOnTimer',['../classIRDaikinESP.html#a0733e4a15d76baac23493926ef1765b1',1,'IRDaikinESP::disableOnTimer()'],['../classIRDaikin2.html#a170a1e9ddb7873dc1392184a85387cc3',1,'IRDaikin2::disableOnTimer()']]], - ['disablesleeptimer_3920',['disableSleepTimer',['../classIRDaikin2.html#a152532ef9d905e26930ae145a9623877',1,'IRDaikin2']]] -]; diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/functions_a.js b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/functions_a.js deleted file mode 100644 index 3e2144d46..000000000 --- a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/functions_a.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['kelvinator_4153',['kelvinator',['../classIRac.html#a6e4d8061841a7271205f81bd8e7d6171',1,'IRac']]] -]; diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/functions_b.js b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/functions_b.js deleted file mode 100644 index 35253a70f..000000000 --- a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/functions_b.js +++ /dev/null @@ -1,7 +0,0 @@ -var searchData= -[ - ['ledoff_4154',['ledOff',['../classIRsend.html#ae71cc5aa99f894785fb4f7abc05841b2',1,'IRsend']]], - ['ledon_4155',['ledOn',['../classIRsend.html#a13d804171fa7c14aff4def38c6ffb6c8',1,'IRsend']]], - ['lg_4156',['lg',['../classIRac.html#afad31ecf9eae573882d53dd6629485fb',1,'IRac']]], - ['lowlevelsanitycheck_4157',['lowLevelSanityCheck',['../namespaceirutils.html#af67b75834051c4aced358b274c1c55a8',1,'irutils']]] -]; diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/functions_d.js b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/functions_d.js deleted file mode 100644 index 531b2c211..000000000 --- a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/functions_d.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['neoclima_4180',['neoclima',['../classIRac.html#a777da4b0552ee3b64d656c4592687f47',1,'IRac']]] -]; diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/functions_f.js b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/functions_f.js deleted file mode 100644 index 5e5bbe8bd..000000000 --- a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/functions_f.js +++ /dev/null @@ -1,5 +0,0 @@ -var searchData= -[ - ['panasonic_4184',['panasonic',['../classIRac.html#af873db2b9735127eb6f079861daed67a',1,'IRac']]], - ['panasonic32_4185',['panasonic32',['../classIRac.html#a66ed34d5686ad25a1659862f3b683f68',1,'IRac']]] -]; diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/namespaces_0.js b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/namespaces_0.js deleted file mode 100644 index 472443f82..000000000 --- a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/namespaces_0.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['_5firrecv_3625',['_IRrecv',['../namespace__IRrecv.html',1,'']]] -]; diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/namespaces_1.js b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/namespaces_1.js deleted file mode 100644 index 33ee5e9fe..000000000 --- a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/namespaces_1.js +++ /dev/null @@ -1,5 +0,0 @@ -var searchData= -[ - ['iracutils_3626',['IRAcUtils',['../namespaceIRAcUtils.html',1,'']]], - ['irutils_3627',['irutils',['../namespaceirutils.html',1,'']]] -]; diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/namespaces_2.js b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/namespaces_2.js deleted file mode 100644 index d475ae536..000000000 --- a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/namespaces_2.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['stdac_3628',['stdAc',['../namespacestdAc.html',1,'']]] -]; diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/pages_0.js b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/pages_0.js deleted file mode 100644 index 8302553ba..000000000 --- a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/pages_0.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['deprecated_20list_7141',['Deprecated List',['../deprecated.html',1,'']]] -]; diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/pages_1.js b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/pages_1.js deleted file mode 100644 index 15e2a9d93..000000000 --- a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/pages_1.js +++ /dev/null @@ -1,5 +0,0 @@ -var searchData= -[ - ['irremoteesp8266_20library_20api_20documentation_7142',['IRremoteESP8266 Library API Documentation',['../index.html',1,'']]], - ['internationalisation_20_28i18n_29_20_26_20locale_20files_7143',['Internationalisation (I18N) & Locale Files',['../md_src_locale_README.html',1,'']]] -]; diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/pages_2.js b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/pages_2.js deleted file mode 100644 index bdb25f053..000000000 --- a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/pages_2.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['todo_20list_7144',['Todo List',['../todo.html',1,'']]] -]; diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/variables_1.js b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/variables_1.js deleted file mode 100644 index 4974d20c7..000000000 --- a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/variables_1.js +++ /dev/null @@ -1,7 +0,0 @@ -var searchData= -[ - ['a705_4530',['A705',['../unionSharpProtocol.html#a17a7db01f34cacdc975e64e738233d72',1,'SharpProtocol']]], - ['address_4531',['address',['../classdecode__results.html#a2858c3a5e28eccca95d44aaa87b70e9e',1,'decode_results']]], - ['airflow_4532',['AirFlow',['../unionGoodweatherProtocol.html#a7b876552a27a7a9bf84b1009f7b12f7a',1,'GoodweatherProtocol']]], - ['altmode_4533',['AltMode',['../unionDaikin176Protocol.html#a05511938e152951723792dc08b33d0dd',1,'Daikin176Protocol']]] -]; diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/variables_13.js b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/variables_13.js deleted file mode 100644 index 6aed82ea0..000000000 --- a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/variables_13.js +++ /dev/null @@ -1,10 +0,0 @@ -var searchData= -[ - ['unknown_6959',['unknown',['../unionHaierProtocol.html#aabc2a684c5936858544c02ec8a68afb9',1,'HaierProtocol']]], - ['unknown1_6960',['unknown1',['../unionGreeProtocol.html#ae973c1c723b7162959374e1fd8ecab61',1,'GreeProtocol']]], - ['unknown2_6961',['unknown2',['../unionGreeProtocol.html#aa102f7d68c26f5b8644b13113a5b05f4',1,'GreeProtocol']]], - ['use_5ftime_5fstate_6962',['use_time_state',['../classIRVestelAc.html#af1b622c50a4952fb3edaf483e1bf9328',1,'IRVestelAc']]], - ['used_6963',['used',['../structmatch__result__t.html#a26cea305aa83ed65b88ac0b6ed6de54a',1,'match_result_t']]], - ['usefah_6964',['UseFah',['../unionNeoclimaProtocol.html#ae60408715008e78ab8058ab024669955',1,'NeoclimaProtocol']]], - ['usefahrenheit_6965',['useFahrenheit',['../unionMideaProtocol.html#a1b1258107620bb83fd6356815242e19b',1,'MideaProtocol::useFahrenheit()'],['../unionGreeProtocol.html#a47c79761efe40c00e6bb01b7712b272c',1,'GreeProtocol::UseFahrenheit()']]] -]; diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/variables_14.js b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/variables_14.js deleted file mode 100644 index f14120f7c..000000000 --- a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/variables_14.js +++ /dev/null @@ -1,8 +0,0 @@ -var searchData= -[ - ['value_6966',['value',['../classdecode__results.html#a033502b7a6b4b0412e5a2062e33c5f47',1,'decode_results']]], - ['vane_6967',['Vane',['../unionMitsubishi144Protocol.html#af4cb685d4c5f87f6ff61d1305ccd6967',1,'Mitsubishi144Protocol']]], - ['vanebit_6968',['VaneBit',['../unionMitsubishi144Protocol.html#aaefd53cd1441b57b90dc3d21488bbdd3',1,'Mitsubishi144Protocol']]], - ['vent_6969',['Vent',['../unionAmcorProtocol.html#a289bcba64f01cd2c847845f41978d400',1,'AmcorProtocol']]], - ['ventswing_6970',['VentSwing',['../unionKelvinatorProtocol.html#af7cd4e8ebfaa36812d09105c54f868f2',1,'KelvinatorProtocol']]] -]; diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/variables_15.js b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/variables_15.js deleted file mode 100644 index 576ef6305..000000000 --- a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/variables_15.js +++ /dev/null @@ -1,8 +0,0 @@ -var searchData= -[ - ['wall_6971',['Wall',['../unionDaikin128Protocol.html#aed2c5bc365820f2c0a5f27dd68fa8a05',1,'Daikin128Protocol']]], - ['wand_5fid_6972',['wand_id',['../unionmagiquest.html#a1b159cd47635d548e1d4198cd6d41e93',1,'magiquest']]], - ['weeklytimer_6973',['WeeklyTimer',['../unionDaikinESPProtocol.html#a25e632da82856caebd233699fda8d796',1,'DaikinESPProtocol']]], - ['widevane_6974',['WideVane',['../unionMitsubishi144Protocol.html#ad0c48e95ca7e0658edf7c2ac2b541c3c',1,'Mitsubishi144Protocol']]], - ['wifi_6975',['WiFi',['../unionGreeProtocol.html#a6cf8e0a6c54a5d2b6f14074c6f3dcc92',1,'GreeProtocol::WiFi()'],['../unionVoltasProtocol.html#aae1406825a156f159c5ad4b28d20364c',1,'VoltasProtocol::Wifi()']]] -]; diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/variables_16.js b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/variables_16.js deleted file mode 100644 index 58d432f48..000000000 --- a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/variables_16.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['xfan_6976',['Xfan',['../unionGreeProtocol.html#a3fbf66dfc2043710c5e00f8230eddb48',1,'GreeProtocol::Xfan()'],['../unionKelvinatorProtocol.html#a44a0ba82ee5dc39f64215d26edb9636c',1,'KelvinatorProtocol::XFan()']]] -]; diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/variables_2.js b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/variables_2.js deleted file mode 100644 index 010612382..000000000 --- a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/variables_2.js +++ /dev/null @@ -1,13 +0,0 @@ -var searchData= -[ - ['backup_4534',['backup',['../classIRToshibaAC.html#adc8d8c6918cd110f524f6bedf6f2bb6e',1,'IRToshibaAC']]], - ['basicfan_4535',['BasicFan',['../unionKelvinatorProtocol.html#a9237eb894fd7d6807169d18655bb3261',1,'KelvinatorProtocol']]], - ['beep_4536',['beep',['../structstdAc_1_1state__t.html#a468ce4cf8b68467964b1f1840257663d',1,'stdAc::state_t::beep()'],['../unionDaikin2Protocol.html#ae464d693bde12c9a0085cf268010d158',1,'Daikin2Protocol::Beep()'],['../unionSamsungProtocol.html#a80645f900ef2b45b44b0b9522f4265cc',1,'SamsungProtocol::Beep()'],['../unionSanyoProtocol.html#a56e41c218b229561ee48e9e0184981bd',1,'SanyoProtocol::Beep()']]], - ['beepdisable_4537',['BeepDisable',['../unionMideaProtocol.html#a2a1d3b51765737427adb5dddcda84d60',1,'MideaProtocol']]], - ['bits_4538',['bits',['../classdecode__results.html#aa5ba2fd53bdb36bdc120d8eabd9f36d7',1,'decode_results']]], - ['boost_4539',['Boost',['../unionDelonghiProtocol.html#ad3347e0739d5c00f3fb5cba7c9f53bcd',1,'DelonghiProtocol']]], - ['breeze_4540',['Breeze',['../unionSamsungProtocol.html#a5b60f239d70e2005e14e0f4c3c9f8986',1,'SamsungProtocol']]], - ['bufsize_4541',['bufsize',['../structirparams__t.html#a2b34d697b85ee6a0ce08344c941e50ec',1,'irparams_t']]], - ['button_4542',['Button',['../unionHaierYRW02Protocol.html#ab5b13626ecf6214cc1be52d47909915d',1,'HaierYRW02Protocol::Button()'],['../unionHitachi424Protocol.html#aaadfa5a2e789fb1159ce795f833b83e5',1,'Hitachi424Protocol::Button()'],['../unionNeoclimaProtocol.html#aedacead75ecd658f9e2c8c3a23d2bc58',1,'NeoclimaProtocol::Button()']]], - ['byte_4543',['byte',['../unionmagiquest.html#af1a9c9a147a1610fe5f0e77ca3e09e44',1,'magiquest']]] -]; diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/variables_4.js b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/variables_4.js deleted file mode 100644 index a1149ff0c..000000000 --- a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/variables_4.js +++ /dev/null @@ -1,14 +0,0 @@ -var searchData= -[ - ['d_4563',['D',['../unionMitsubishi152Protocol.html#ac493830f3bf09e178aa09b24368746c9',1,'Mitsubishi152Protocol']]], - ['data_4564',['data',['../structmatch__result__t.html#ae88be61a6d1ffa7c3525aa958f4c0d25',1,'match_result_t']]], - ['data0_4565',['Data0',['../structCoronaSection.html#a975b14d8bc30807013714158ef7474ea',1,'CoronaSection']]], - ['data0inv_4566',['Data0Inv',['../structCoronaSection.html#ab05024b8314929dcd8ccdda9b497be8c',1,'CoronaSection']]], - ['data1_4567',['Data1',['../structCoronaSection.html#a59d97a1bc0a1be50b6f96c4d70673425',1,'CoronaSection']]], - ['data1inv_4568',['Data1Inv',['../structCoronaSection.html#ada247bbfb60f24cd9e9a612c9621cbb4',1,'CoronaSection']]], - ['decode_5ftype_4569',['decode_type',['../classdecode__results.html#a9c0e9f161b9c90dc10b7561d4c0b50fa',1,'decode_results']]], - ['degrees_4570',['degrees',['../structstdAc_1_1state__t.html#a3d1ff0ff2e0035db4ee8ead5c53b2dbd',1,'stdAc::state_t']]], - ['disablesensor_4571',['disableSensor',['../unionMideaProtocol.html#a20cc2079eae404c980cc75101b4a3116',1,'MideaProtocol']]], - ['display_4572',['Display',['../unionSamsungProtocol.html#aac97ebabee022e772aa00d4357079eb4',1,'SamsungProtocol']]], - ['displaytemp_4573',['DisplayTemp',['../unionGreeProtocol.html#ad0756a64f9c90c9dd12ca6cd71c78bb2',1,'GreeProtocol']]] -]; diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/variables_7.js b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/variables_7.js deleted file mode 100644 index d10dd77c7..000000000 --- a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/variables_7.js +++ /dev/null @@ -1,9 +0,0 @@ -var searchData= -[ - ['header_4588',['Header',['../unionMideaProtocol.html#a892508b7b4cade91dd2e315b678f5f1b',1,'MideaProtocol']]], - ['header0_4589',['Header0',['../structCoronaSection.html#a3b3c0a1a42da65bb4b481e59b42f26a6',1,'CoronaSection']]], - ['header1_4590',['Header1',['../structCoronaSection.html#a3d6d6c1e31f82a76cd88f81bcdb83a3a',1,'CoronaSection']]], - ['health_4591',['Health',['../unionHaierProtocol.html#a4cf70c633e33066e3fc0f98bb2ad3820',1,'HaierProtocol::Health()'],['../unionHaierYRW02Protocol.html#a7fa39803fd72a788736bb8f00acfa76f',1,'HaierYRW02Protocol::Health()']]], - ['heat_5fmode_4592',['heat_mode',['../classIRArgoAC.html#a255762f71502b9ffeb0686759991ec53',1,'IRArgoAC']]], - ['hold_4593',['Hold',['../unionNeoclimaProtocol.html#aaf3af5b5ab99978fb669e75949bfe136',1,'NeoclimaProtocol']]] -]; diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/variables_a.js b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/variables_a.js deleted file mode 100644 index 8f6cb2681..000000000 --- a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/variables_a.js +++ /dev/null @@ -1,9 +0,0 @@ -var searchData= -[ - ['label_6828',['Label',['../structCoronaSection.html#abc6d0caa713c73244c4bf2f602074d48',1,'CoronaSection']]], - ['ledflag_6829',['ledFlag',['../classIRCoolixAC.html#a03ba5e0a6cb47a7bb054155c2111a69c',1,'IRCoolixAC']]], - ['light_6830',['Light',['../unionDaikin2Protocol.html#adaf55ec9e1b9ba278c7391d9d797f3ba',1,'Daikin2Protocol::Light()'],['../unionGoodweatherProtocol.html#a845565af7661af0c05290a7ce039f8e2',1,'GoodweatherProtocol::Light()'],['../unionGreeProtocol.html#a72092768725667d3bce381a6e2900c66',1,'GreeProtocol::Light()'],['../unionKelvinatorProtocol.html#a38f5b978fd63fda659f0e0b5f682440e',1,'KelvinatorProtocol::Light()'],['../unionNeoclimaProtocol.html#a598346f565ad6d57df03f5256a878dd6',1,'NeoclimaProtocol::Light()'],['../unionVoltasProtocol.html#a811a0de66771c693831740440aac460c',1,'VoltasProtocol::Light()'],['../structstdAc_1_1state__t.html#a51c3a5c4703ea49b420d70aeb18b6b9b',1,'stdAc::state_t::light()']]], - ['lighttoggle_6831',['LightToggle',['../unionElectraProtocol.html#aa2a5998cafd139e5ce7626edc4782c56',1,'ElectraProtocol']]], - ['llword_6832',['llword',['../unionmagiquest.html#ad57fbc75ab289c3e93b94be0b2187d65',1,'magiquest']]], - ['lword_6833',['lword',['../unionmagiquest.html#ac87102145311831a232002b52fe2d02c',1,'magiquest']]] -]; diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/variables_f.js b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/variables_f.js deleted file mode 100644 index 48427bbed..000000000 --- a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/variables_f.js +++ /dev/null @@ -1,6 +0,0 @@ -var searchData= -[ - ['quiet_6897',['quiet',['../structstdAc_1_1state__t.html#a251ad14e187a9905137e9e4e010c3e34',1,'stdAc::state_t::quiet()'],['../unionDaikinESPProtocol.html#af93324815f6be6cfc5d0d50af9e73aad',1,'DaikinESPProtocol::Quiet()'],['../unionDaikin2Protocol.html#afa111c9afbc94bcf52e9ba15b59c1bee',1,'Daikin2Protocol::Quiet()'],['../unionDaikin152Protocol.html#ac5bfe8541e53cb2732bfcbc71500ed32',1,'Daikin152Protocol::Quiet()'],['../unionKelvinatorProtocol.html#ac803fe14d6d21155418d2fe0543c9d9f',1,'KelvinatorProtocol::Quiet()']]], - ['quiet1_6898',['Quiet1',['../unionSamsungProtocol.html#ac38e3f34f98ac3dae9738a1582dfeca6',1,'SamsungProtocol']]], - ['quiet5_6899',['Quiet5',['../unionSamsungProtocol.html#a94a9d2b42e1ab7a308d079322350c3f9',1,'SamsungProtocol']]] -]; diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/examples/Web-AC-control/data/favicon.ico b/lib/lib_basic/IRremoteESP8266-2.7.14/examples/Web-AC-control/data/favicon.ico deleted file mode 100644 index f206c7cc7241d6969ccd7c9ab8d12a56bbf09430..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16446 zcmeHOJ&4pm6wcwlC>+SC+-Bz|ncOa0_``w!;v&dd*eNP1*w}~`R)U3MsaV*Z3WAE- zh^Sy^V<(EBAP8cig^HjeihswUoZq|M+)ZM#o6SYd?#>=_Nhb5nyzkAMmp7A%W%b~% zTD9wvg&F2DHl)3K%lZ)GzcLWtR-sP5`mI!~$t=xuq?R-be{$>K0)U9+~cxG$w#g0?^E z?fd5>my`o5;@YWN)#;G`wqHJcY^DP#OC@l97sk;w>45AauI;Sy(Z;i=_9ye)H*syj zZVpYBtJ!||x{)mdeFc(aRziO z#?A=k!?qU1VJW}TSD9CD`-qOmc)CjYzD-&`WbM_l#6KyP%1Q1X z)bWx#=Uc&NQP%J`{jb{~`L?8XW$fRKf8BPB|1NQpNvqXDAQRA7wS3QE8XhEggMK-AlHcg7wSZ(x!QZL>3?JY9qItg_&5H~`2TeNA7f`P=gwux)s;M_aT%G~6Xn9vj(^%)60jRR zUd-uv)IOB7{3Z0+Zv4S@XV?bP^2eT?-R;I7eYQO-{z8;Rc)wSk^+9{lR6*HU@uzxd ztsVQbwnDGl@|;Mp!i|6{GR5ARur#>Wt?qvSTJ zA=+CW<*(9?fAXiWo5(%C0ei|xEQn|I`>6NIY5C)svMY}~8_ASq{DZo>I{u~o6^(SA z$9wobV@=oxq_uz4(}Ov{0r0$;_xA!MW87Y(Dew=gvMsL-e-r-&e3gm+BH};qTw4zA z1VUr{?`Ycp+S(awL-H+5K3zu%5Y*zys$1bF-0 z@DAg;&%gFfsT}q1b@~x~KZ^GQOMU)yB;QEip>zTFk*K*L>A6=CR_LR8#zu%k9v - - - - - - - - - - - - image/svg+xml - - - - - - - - - diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/examples/Web-AC-control/data/level_1_on.svg b/lib/lib_basic/IRremoteESP8266-2.7.14/examples/Web-AC-control/data/level_1_on.svg deleted file mode 100644 index 32505f2a4..000000000 --- a/lib/lib_basic/IRremoteESP8266-2.7.14/examples/Web-AC-control/data/level_1_on.svg +++ /dev/null @@ -1,49 +0,0 @@ - - - - - - - - - - - - - image/svg+xml - - - - - - - - - diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/examples/Web-AC-control/data/level_2_off.svg b/lib/lib_basic/IRremoteESP8266-2.7.14/examples/Web-AC-control/data/level_2_off.svg deleted file mode 100644 index 20d54679c..000000000 --- a/lib/lib_basic/IRremoteESP8266-2.7.14/examples/Web-AC-control/data/level_2_off.svg +++ /dev/null @@ -1,49 +0,0 @@ - - - - - - - - - - - - - image/svg+xml - - - - - - - - - diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/examples/Web-AC-control/data/level_2_on.svg b/lib/lib_basic/IRremoteESP8266-2.7.14/examples/Web-AC-control/data/level_2_on.svg deleted file mode 100644 index 307370607..000000000 --- a/lib/lib_basic/IRremoteESP8266-2.7.14/examples/Web-AC-control/data/level_2_on.svg +++ /dev/null @@ -1,49 +0,0 @@ - - - - - - - - - - - - - image/svg+xml - - - - - - - - - diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/examples/Web-AC-control/data/level_3_off.svg b/lib/lib_basic/IRremoteESP8266-2.7.14/examples/Web-AC-control/data/level_3_off.svg deleted file mode 100644 index 2bbf5848e..000000000 --- a/lib/lib_basic/IRremoteESP8266-2.7.14/examples/Web-AC-control/data/level_3_off.svg +++ /dev/null @@ -1,49 +0,0 @@ - - - - - - - - - - - - - image/svg+xml - - - - - - - - - diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/examples/Web-AC-control/data/level_3_on.svg b/lib/lib_basic/IRremoteESP8266-2.7.14/examples/Web-AC-control/data/level_3_on.svg deleted file mode 100644 index ca29839e2..000000000 --- a/lib/lib_basic/IRremoteESP8266-2.7.14/examples/Web-AC-control/data/level_3_on.svg +++ /dev/null @@ -1,49 +0,0 @@ - - - - - - - - - - - - - image/svg+xml - - - - - - - - - diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/examples/Web-AC-control/data/level_4_off.svg b/lib/lib_basic/IRremoteESP8266-2.7.14/examples/Web-AC-control/data/level_4_off.svg deleted file mode 100644 index 3ee1beced..000000000 --- a/lib/lib_basic/IRremoteESP8266-2.7.14/examples/Web-AC-control/data/level_4_off.svg +++ /dev/null @@ -1,49 +0,0 @@ - - - - - - - - - - - - - image/svg+xml - - - - - - - - - diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/examples/Web-AC-control/data/level_4_on.svg b/lib/lib_basic/IRremoteESP8266-2.7.14/examples/Web-AC-control/data/level_4_on.svg deleted file mode 100644 index 720d70148..000000000 --- a/lib/lib_basic/IRremoteESP8266-2.7.14/examples/Web-AC-control/data/level_4_on.svg +++ /dev/null @@ -1,49 +0,0 @@ - - - - - - - - - - - - - image/svg+xml - - - - - - - - - diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/examples/Web-AC-control/data/ui.html b/lib/lib_basic/IRremoteESP8266-2.7.14/examples/Web-AC-control/data/ui.html deleted file mode 100644 index cfefc20d5..000000000 --- a/lib/lib_basic/IRremoteESP8266-2.7.14/examples/Web-AC-control/data/ui.html +++ /dev/null @@ -1,109 +0,0 @@ - - - - - - - Home Temperature - - - - - - - - - - - - - - - - -
- - - -
- -

-
- -
-
- - -
- OFF -
- -
-
-
-
- - -

Mode

-
- - - - - -
- -
-
- - -

Fan

-
- - - - -
- -
-
-
-
-
-
- - -

Target temperature

-
- ~ C -
- -
- - -
- - - -
-
-
- -
-
- - - - diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/examples/Web-AC-control/data/ui.js b/lib/lib_basic/IRremoteESP8266-2.7.14/examples/Web-AC-control/data/ui.js deleted file mode 100644 index 9bdb8c795..000000000 --- a/lib/lib_basic/IRremoteESP8266-2.7.14/examples/Web-AC-control/data/ui.js +++ /dev/null @@ -1,132 +0,0 @@ -var state = {} - -function updateStatus() { - $.ajax({ - type: 'GET', - url: "state", - dataType: "json", - data: [{ - name: "light", - value: "1" - }, ], - success: function(data) { - if (!data) { - return; - } - state = data; - if (state["power"] === true) { - $("#power").text(" ON"); - $("#power-btn").addClass("btn-info"); - $("#power-btn").removeClass("btn-default"); - } else { - $("#power").text(" OFF"); - $("#power-btn").addClass("btn-default"); - $("#power-btn").removeClass("btn-info"); - } - $("#target_temp").text(state["temp"] + " C"); - setModeColor(state["mode"]); - setFanColor(state["fan"]); - }, - error: function() { - console.log('error getting state'); - }, - timeout: 1000 - }); -} - -updateStatus(); - - - - -function postData(t) { - var e = new XMLHttpRequest; - e.timeout = 2000; - e.open("PUT", "state", !0); - e.setRequestHeader("Content-Type", "application/json"); - console.log(JSON.stringify(t)), e.send(JSON.stringify(t)); -} - -function mode_onclick(mode) { - state["mode"] = mode; - setModeColor(mode); - postData(state); -} - - -function setModeColor(mode) { - $(".mode-btn").addClass("btn-default"); - $(".mode-btn").removeClass("btn-info"); - - if (mode === 0) { - $("#mode_auto").removeClass("btn-default"); - $("#mode_auto").addClass("btn-info"); - setFanColor(0); - state["fan"] = 0; - } else if (mode === 1) { - $("#mode_cooling").removeClass("btn-default"); - $("#mode_cooling").addClass("btn-info"); - } else if (mode === 2) { - $("#mode_dehum").removeClass("btn-default"); - $("#mode_dehum").addClass("btn-info"); - } else if (mode === 3) { - $("#mode_heating").removeClass("btn-default"); - $("#mode_heating").addClass("btn-info"); - } else if (mode === 4) { - $("#mode_fan").removeClass("btn-default"); - $("#mode_fan").addClass("btn-info"); - } -} - -function setFanColor(fan) { - if (fan == 0) { - $("#fan_auto").removeClass("btn-default"); - $("#fan_auto").addClass("btn-info"); - } else { - $("#fan_auto").removeClass("btn-info"); - $("#fan_auto").addClass("btn-default"); - } - for (var i = 1; i <= 3; ++i) { - if (i <= fan) { - $("#fan_lvl_" + i).attr("src", "level_" + i + "_on.svg"); - } else { - $("#fan_lvl_" + i).attr("src", "level_" + i + "_off.svg"); - } - } -} - -function fan_onclick(fan) { - if (state["mode"] !== 0) { - state["fan"] = fan; - setFanColor(fan); - postData(state); - } -} - -function power_onclick(power) { - if (state["power"]) { - state["power"] = false; - $("#power").text(" OFF"); - $("#power-btn").removeClass("btn-info"); - $("#power-btn").addClass("btn-default"); - } else { - state["power"] = true; - $("#power").text(" ON"); - $("#power-btn").addClass("btn-info"); - $("#power-btn").removeClass("btn-default"); - } - postData(state); -} - - -function temp_onclick(temp) { - state["temp"] += temp; - if (state["temp"] < 17) { - state["temp"] = 17; - } - if (state["temp"] > 30) { - state["temp"] = 30; - } - $("#target_temp").text(state["temp"] + " C"); - postData(state); -} diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/src/ir_Technibel.h b/lib/lib_basic/IRremoteESP8266-2.7.14/src/ir_Technibel.h deleted file mode 100644 index 3539a4fd9..000000000 --- a/lib/lib_basic/IRremoteESP8266-2.7.14/src/ir_Technibel.h +++ /dev/null @@ -1,166 +0,0 @@ -// Copyright 2020 Quentin Briollant - -/// @file -/// @brief Support for Technibel protocol. - -#ifndef IR_TECHNIBEL_H_ -#define IR_TECHNIBEL_H_ - -#define __STDC_LIMIT_MACROS -#include -#ifndef UNIT_TEST -#include -#endif -#include "IRremoteESP8266.h" -#include "IRsend.h" -#ifdef UNIT_TEST -#include "IRsend_test.h" -#endif - -// Supports: -// Brand: Technibel, Model: IRO PLUS - - -/* State bit map: - -+--+--+--+--+--+--+--+--+--+------------+-----------+----------+--+--+--+--+ -| FIXED HEADER |ON|TIMER CHANGE|TEMP CHANGE|FAN CHANGE| MODE | -+--+--+--+--+--+--+--+--+--+------------+-----------+----------+--+--+--+--+ - 55 54 53 52 51 50 49 48 47 46 45 44 43 42 41 40 - -+-----+------+-----+-----+---+--+--+--+---+--+--+--+--+--+--+--+ -|TIMER|C OR F|SWING|SLEEP| 0 | FAN | 0 | TEMPERATURE | -+-----+------+-----+-----+---+--+--+--+---+--+--+--+--+--+--+--+ - 39 38 37 36 35 34 33 32 31 30 29 28 27 26 25 24 - -+---+---+---+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ -| 0 | 0 | 0 | ON TIME HOUR | FOOTER | CHECKSUM | -+---+---+---+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ - 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 - - -*/ - -// Constants -const uint8_t kTechnibelAcChecksumOffset = 0; -const uint8_t kTechnibelAcChecksumSize = 8; - -const uint8_t kTechnibelAcFooterOffset = kTechnibelAcChecksumOffset + - kTechnibelAcChecksumSize; -const uint8_t kTechnibelAcFooterSize = 8; - -const uint8_t kTechnibelAcTimerHoursOffset = kTechnibelAcFooterOffset + - kTechnibelAcFooterSize; -const uint8_t kTechnibelAcHoursSize = 8; // Max 24 hrs -const uint8_t kTechnibelAcTimerMax = 24; - -const uint8_t kTechnibelAcTempOffset = kTechnibelAcTimerHoursOffset + - kTechnibelAcHoursSize; -const uint8_t kTechnibelAcTempSize = 8; -const uint8_t kTechnibelAcTempMinC = 16; // Deg C -const uint8_t kTechnibelAcTempMaxC = 31; // Deg C -const uint8_t kTechnibelAcTempMinF = 61; // Deg F -const uint8_t kTechnibelAcTempMaxF = 88; // Deg F - -const uint8_t kTechnibelAcFanOffset = kTechnibelAcTempOffset - + kTechnibelAcTempSize; -const uint8_t kTechnibelAcFanSize = 4; -const uint8_t kTechnibelAcFanLow = 0b0001; -const uint8_t kTechnibelAcFanMedium = 0b0010; -const uint8_t kTechnibelAcFanHigh = 0b0100; - -const uint8_t kTechnibelAcSleepBit = kTechnibelAcFanOffset + - kTechnibelAcFanSize; - -const uint8_t kTechnibelAcSwingBit = kTechnibelAcSleepBit + 1; - -// (0 = Celsius, 1 = Fahrenheit) -const uint8_t kTechnibelAcTempUnitBit = kTechnibelAcSwingBit + 1; - -const uint8_t kTechnibelAcTimerEnableBit = kTechnibelAcTempUnitBit + 1; - -const uint8_t kTechnibelAcModeOffset = kTechnibelAcTimerEnableBit + 1; -const uint8_t kTechnibelAcModeSize = 4; -const uint8_t kTechnibelAcCool = 0b0001; -const uint8_t kTechnibelAcDry = 0b0010; -const uint8_t kTechnibelAcFan = 0b0100; -const uint8_t kTechnibelAcHeat = 0b1000; - -const uint8_t kTechnibelAcFanChangeBit = kTechnibelAcModeOffset + - kTechnibelAcModeSize; - -const uint8_t kTechnibelAcTempChangeBit = kTechnibelAcFanChangeBit + 1; - -const uint8_t kTechnibelAcTimerChangeBit = kTechnibelAcTempChangeBit + 1; - -const uint8_t kTechnibelAcPowerBit = kTechnibelAcTimerChangeBit + 1; - -const uint8_t kTechnibelAcHeaderOffset = kTechnibelAcPowerBit + 1; -const uint8_t kTechnibelAcHeaderSize = 8; -const uint8_t kTechnibelAcHeader = 0b00011000; - -const uint64_t kTechnibelAcResetState = 0x180101140000EA; ///< -///< Mode:Cool, Power:Off, fan:Low, temp:20, swing:Off, sleep:Off - - -// Classes -/// Class for handling detailed Technibel A/C messages. -class IRTechnibelAc { - public: - explicit IRTechnibelAc(const uint16_t pin, const bool inverted = false, - const bool use_modulation = true); - void stateReset(); -#if SEND_TECHNIBEL_AC - void send(const uint16_t repeat = kTechnibelAcDefaultRepeat); - /// Run the calibration to calculate uSec timing offsets for this platform. - /// @return The uSec timing offset needed per modulation of the IR Led. - /// @note This will produce a 65ms IR signal pulse at 38kHz. - /// Only ever needs to be run once per object instantiation, if at all. - int8_t calibrate(void) { return _irsend.calibrate(); } -#endif // SEND_TECHNIBEL_AC - void begin(); - static uint8_t calcChecksum(const uint64_t state); - static bool validChecksum(const uint64_t state); - void setPower(const bool on); - bool getPower(); - void on(); - void off(); - void setTempUnit(const bool celsius); - bool getTempUnit(void); - void setTemp(const uint8_t temp, const bool fahrenheit = false); - uint8_t getTemp(); - void setFan(const uint8_t speed); - uint8_t getFan(); - void setMode(const uint8_t mode); - uint8_t getMode(); - void setSwing(const bool on); - bool getSwing(); - bool convertSwing(const stdAc::swingv_t swing); - stdAc::swingv_t toCommonSwing(const bool swing); - void setSleep(const bool on); - bool getSleep(); - void setTimerEnabled(const bool on); - bool getTimerEnabled(void); - void setTimer(const uint16_t nr_of_mins); - uint16_t getTimer(void); - uint64_t getRaw(); - void setRaw(const uint64_t state); - uint8_t convertMode(const stdAc::opmode_t mode); - uint8_t convertFan(const stdAc::fanspeed_t speed); - static stdAc::opmode_t toCommonMode(const uint8_t mode); - static stdAc::fanspeed_t toCommonFanSpeed(const uint8_t speed); - stdAc::state_t toCommon(void); - String toString(); -#ifndef UNIT_TEST - - private: - IRsend _irsend; -#else - IRsendTest _irsend; -#endif - uint64_t remote_state; // The state of the IR remote. - uint8_t _saved_temp; // The previously user requested temp value. - uint8_t _saved_temp_units; // The previously user requested temp units. - void checksum(void); -}; -#endif // IR_TECHNIBEL_H_ diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/src/ir_Teco.h b/lib/lib_basic/IRremoteESP8266-2.7.14/src/ir_Teco.h deleted file mode 100644 index 770890caa..000000000 --- a/lib/lib_basic/IRremoteESP8266-2.7.14/src/ir_Teco.h +++ /dev/null @@ -1,176 +0,0 @@ -// Copyright 2019 Fabien Valthier - -/// @file -/// @brief Support for Teco protocols. - -// Supports: -// Brand: Alaska, Model: SAC9010QC A/C -// Brand: Alaska, Model: SAC9010QC remote - -#ifndef IR_TECO_H_ -#define IR_TECO_H_ - -#ifndef UNIT_TEST -#include -#endif -#include "IRremoteESP8266.h" -#include "IRsend.h" -#ifdef UNIT_TEST -#include "IRsend_test.h" -#endif - -// Constants. -const uint8_t kTecoAuto = 0; -const uint8_t kTecoCool = 1; -const uint8_t kTecoDry = 2; -const uint8_t kTecoFan = 3; -const uint8_t kTecoHeat = 4; -const uint8_t kTecoFanAuto = 0; // 0b00 -const uint8_t kTecoFanLow = 1; // 0b01 -const uint8_t kTecoFanMed = 2; // 0b10 -const uint8_t kTecoFanHigh = 3; // 0b11 -const uint8_t kTecoMinTemp = 16; // 16C -const uint8_t kTecoMaxTemp = 30; // 30C - -const uint8_t kTecoModeOffset = 0; -const uint8_t kTecoPowerOffset = 3; -const uint8_t kTecoFanOffset = 4; -const uint8_t kTecoFanSize = 2; // Nr. of bits -const uint8_t kTecoSwingOffset = 6; -const uint8_t kTecoSleepOffset = 7; -const uint8_t kTecoTempOffset = 8; -const uint8_t kTecoTempSize = 4; // Nr. of bits -const uint8_t kTecoTimerHalfHourOffset = 12; -const uint8_t kTecoTimerTensHoursOffset = 13; -const uint8_t kTecoTimerTensHoursSize = 2; // Nr. of bits -const uint8_t kTecoTimerOnOffset = 15; -const uint8_t kTecoTimerUnitHoursOffset = 16; -const uint8_t kTecoTimerUnitHoursSize = 4; // Nr. of bits -const uint8_t kTecoHumidOffset = 20; -const uint8_t kTecoLightOffset = 21; -const uint8_t kTecoSaveOffset = 23; -const uint64_t kTecoReset = 0b01001010000000000000010000000000000; -/* - (header mark and space) - Teco AC map read and to be sent in LSB with number of bits - - byte 0 = Cst 0x02 - byte 1 = Cst 0x50 - b6-7 = "AIR" 0, 1, 2 (Not Implemented) - byte 2: - b0 = Save - b1 = "Tree with bubbles" / Filter?? (Not Implemented) - b2 = Light/LED. - b3 = Humid - b4-7 = Timer hours (unit, not thenth) - hours: - 0000 (0) = +0 hour - 0001 (1) = +1 hour - ... - 1001 (9) = +9 hours - byte 3: = timer and Temperature - b0 = Timer (1 = On, 0 = Off) - b1-2 = Timer - number of 10hours - 10Hours: - 00 = 0 * 10hours of timer - 01 = 1 * 10 hours of timer - 10 = 2 * 10hours of timer - b3 = Timer - half hour (1=half hour on, 0 = round hour) - b4-7: Degrees C. - 0000 (0) = 16C - 0001 (1) = 17C - 0010 (2) = 18C - ... - 1101 (13) = 29C - 1110 (14) = 30C - byte 4: Basics - b0 = Sleep Mode (1 = On, 0 = Off) - b1 = Vent swing (1 = On, 0 = Off) - b2-3 = Fan - Fan: - 00 = Auto - 01 = Fan 1 - 10 = Fan 2 - 11 = Fan 3 or higher - b4 = Power Status (1 = On, 0 = Off) - b5-7 = Modes LSB first - Modes: - 000 = Auto (temp = 25C) - 001 = Cool - 010 = Dry (temp = 25C, but not shown) - 011 = Fan - 100 = Heat -*/ - -// Classes -/// Class for handling detailed Teco A/C messages. -class IRTecoAc { - public: - explicit IRTecoAc(const uint16_t pin, const bool inverted = false, - const bool use_modulation = true); - void stateReset(void); -#if SEND_TECO - void send(const uint16_t repeat = kTecoDefaultRepeat); - /// Run the calibration to calculate uSec timing offsets for this platform. - /// @return The uSec timing offset needed per modulation of the IR Led. - /// @note This will produce a 65ms IR signal pulse at 38kHz. - /// Only ever needs to be run once per object instantiation, if at all. - int8_t calibrate(void) { return _irsend.calibrate(); } -#endif // SEND_TECO - void begin(void); - void on(void); - void off(void); - - void setPower(const bool on); - bool getPower(void); - - void setTemp(const uint8_t temp); - uint8_t getTemp(void); - - void setFan(const uint8_t fan); - uint8_t getFan(void); - - void setMode(const uint8_t mode); - uint8_t getMode(void); - - void setSwing(const bool on); - bool getSwing(void); - - void setSleep(const bool on); - bool getSleep(void); - - void setLight(const bool on); - bool getLight(void); - - void setHumid(const bool on); - bool getHumid(void); - - void setSave(const bool on); - bool getSave(void); - - uint16_t getTimer(void); - void setTimer(const uint16_t mins); - - uint64_t getRaw(void); - void setRaw(const uint64_t new_code); - - uint8_t convertMode(const stdAc::opmode_t mode); - uint8_t convertFan(const stdAc::fanspeed_t speed); - static stdAc::opmode_t toCommonMode(const uint8_t mode); - static stdAc::fanspeed_t toCommonFanSpeed(const uint8_t speed); - stdAc::state_t toCommon(void); - String toString(void); -#ifndef UNIT_TEST - - private: - IRsend _irsend; ///< Instance of the IR send class -#else // UNIT_TEST - /// @cond IGNORE - IRsendTest _irsend; ///< Instance of the testing IR send class - /// @endcond -#endif // UNIT_TEST - uint64_t remote_state; ///< The state of the IR remote in IR code form. - bool getTimerEnabled(void); -}; - -#endif // IR_TECO_H_ diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/.github/CONTRIBUTING.md b/lib/lib_basic/IRremoteESP8266-2.7.15/.github/CONTRIBUTING.md similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.14/.github/CONTRIBUTING.md rename to lib/lib_basic/IRremoteESP8266-2.7.15/.github/CONTRIBUTING.md diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/.github/Contributors.md b/lib/lib_basic/IRremoteESP8266-2.7.15/.github/Contributors.md similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.14/.github/Contributors.md rename to lib/lib_basic/IRremoteESP8266-2.7.15/.github/Contributors.md diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/.github/issue_template.md b/lib/lib_basic/IRremoteESP8266-2.7.15/.github/issue_template.md similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.14/.github/issue_template.md rename to lib/lib_basic/IRremoteESP8266-2.7.15/.github/issue_template.md diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/.gitignore b/lib/lib_basic/IRremoteESP8266-2.7.15/.gitignore similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.14/.gitignore rename to lib/lib_basic/IRremoteESP8266-2.7.15/.gitignore diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/.gitmodules b/lib/lib_basic/IRremoteESP8266-2.7.15/.gitmodules similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.14/.gitmodules rename to lib/lib_basic/IRremoteESP8266-2.7.15/.gitmodules diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/.style.yapf b/lib/lib_basic/IRremoteESP8266-2.7.15/.style.yapf similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.14/.style.yapf rename to lib/lib_basic/IRremoteESP8266-2.7.15/.style.yapf diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/.travis.yml b/lib/lib_basic/IRremoteESP8266-2.7.15/.travis.yml similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.14/.travis.yml rename to lib/lib_basic/IRremoteESP8266-2.7.15/.travis.yml diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/CPPLINT.cfg b/lib/lib_basic/IRremoteESP8266-2.7.15/CPPLINT.cfg similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.14/CPPLINT.cfg rename to lib/lib_basic/IRremoteESP8266-2.7.15/CPPLINT.cfg diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/Doxyfile b/lib/lib_basic/IRremoteESP8266-2.7.15/Doxyfile similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.14/Doxyfile rename to lib/lib_basic/IRremoteESP8266-2.7.15/Doxyfile diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/LICENSE.txt b/lib/lib_basic/IRremoteESP8266-2.7.15/LICENSE.txt similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.14/LICENSE.txt rename to lib/lib_basic/IRremoteESP8266-2.7.15/LICENSE.txt diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/README.md b/lib/lib_basic/IRremoteESP8266-2.7.15/README.md similarity index 97% rename from lib/lib_basic/IRremoteESP8266-2.7.14/README.md rename to lib/lib_basic/IRremoteESP8266-2.7.15/README.md index ab7f2b338..cf67962a4 100644 --- a/lib/lib_basic/IRremoteESP8266-2.7.14/README.md +++ b/lib/lib_basic/IRremoteESP8266-2.7.15/README.md @@ -1,4 +1,4 @@ -# IRremoteESP8266 Library +![IRremoteESP8266 Library](./assets/images/banner.svg) [![Build Status](https://travis-ci.org/crankyoldgit/IRremoteESP8266.svg?branch=master)](https://travis-ci.org/crankyoldgit/IRremoteESP8266) [![arduino-library-badge](https://www.ardu-badge.com/badge/IRremoteESP8266.svg?)](https://www.ardu-badge.com/IRremoteESP8266) @@ -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 [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.14 Now Available -Version 2.7.14 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. +## v2.7.15 Now Available +Version 2.7.15 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 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. diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/README_de.md b/lib/lib_basic/IRremoteESP8266-2.7.15/README_de.md similarity index 97% rename from lib/lib_basic/IRremoteESP8266-2.7.14/README_de.md rename to lib/lib_basic/IRremoteESP8266-2.7.15/README_de.md index 39c4ef489..770e061cf 100644 --- a/lib/lib_basic/IRremoteESP8266-2.7.14/README_de.md +++ b/lib/lib_basic/IRremoteESP8266-2.7.15/README_de.md @@ -1,4 +1,4 @@ -# IRremoteESP8266 Library +![IRremoteESP8266 Library](./assets/images/banner.svg) [![Build-Status](https://travis-ci.org/crankyoldgit/IRremoteESP8266.svg?branch=master)](https://travis-ci.org/crankyoldgit/IRremoteESP8266) [![Arduino-Bibliothek-Abzeichen](https://www.ardu-badge.com/badge/IRremoteESP8266.svg?)](https://www.ardu-badge.com/IRremoteESP8266) @@ -9,8 +9,8 @@ Diese Programmbibliothek ermöglicht das **Senden _und_ Empfangen** von Infrarotsignalen mit [ESP8266](https://github.com/esp8266/Arduino)- und [ESP32](https://github.com/espressif/arduino-esp32)-Mikrocontrollern mithilfe des [Arduino-Frameworks](https://www.arduino.cc/) und handelsüblichen 940nm Infrarot-LEDs undIR-Empfängermodulen, wie zum Beispiel TSOP{17,22,24,36,38,44,48}*-Demodulatoren. -## v2.7.14 jetzt verfügbar -Version 2.7.14 der Bibliothek ist nun [verfügbar](https://github.com/crankyoldgit/IRremoteESP8266/releases/latest). Die [Versionshinweise](ReleaseNotes.md) enthalten alle wichtigen Neuerungen. +## v2.7.15 jetzt verfügbar +Version 2.7.15 der Bibliothek ist nun [verfügbar](https://github.com/crankyoldgit/IRremoteESP8266/releases/latest). Die [Versionshinweise](ReleaseNotes.md) enthalten alle wichtigen Neuerungen. #### Hinweis für Nutzer von Versionen vor v2.0 Die Benutzung der Bibliothek hat sich mit Version 2.0 leicht geändert. Einige Anpassungen im aufrufenden Code werden nötig sein, um mit Version ab 2.0 korrekt zu funktionieren. Mehr zu den Anpassungen finden sich auf unserer [Upgrade to v2.0](https://github.com/crankyoldgit/IRremoteESP8266/wiki/Upgrading-to-v2.0)-Seite. diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/README_fr.md b/lib/lib_basic/IRremoteESP8266-2.7.15/README_fr.md similarity index 97% rename from lib/lib_basic/IRremoteESP8266-2.7.14/README_fr.md rename to lib/lib_basic/IRremoteESP8266-2.7.15/README_fr.md index 91e2a76f0..820731366 100644 --- a/lib/lib_basic/IRremoteESP8266-2.7.14/README_fr.md +++ b/lib/lib_basic/IRremoteESP8266-2.7.15/README_fr.md @@ -1,4 +1,4 @@ -# IRremoteESP8266 Library +![IRremoteESP8266 Library](./assets/images/banner.svg) [![Build Status](https://travis-ci.org/crankyoldgit/IRremoteESP8266.svg?branch=master)](https://travis-ci.org/crankyoldgit/IRremoteESP8266) [![arduino-library-badge](https://www.ardu-badge.com/badge/IRremoteESP8266.svg?)](https://www.ardu-badge.com/IRremoteESP8266) @@ -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 [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.14 disponible -Version 2.7.14 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. +## v2.7.15 disponible +Version 2.7.15 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 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. diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/ReleaseNotes.md b/lib/lib_basic/IRremoteESP8266-2.7.15/ReleaseNotes.md similarity index 97% rename from lib/lib_basic/IRremoteESP8266-2.7.14/ReleaseNotes.md rename to lib/lib_basic/IRremoteESP8266-2.7.15/ReleaseNotes.md index 5478be920..7feab2ca3 100644 --- a/lib/lib_basic/IRremoteESP8266-2.7.14/ReleaseNotes.md +++ b/lib/lib_basic/IRremoteESP8266-2.7.15/ReleaseNotes.md @@ -1,5 +1,32 @@ # Release Notes +## _v2.7.15 (20210213)_ + +**[BREAKING CHANGES]** +- Some Daikin2 constants have been changed. (#1393) + +**[Features]** +- Experimental basic support for EcoClim 56 & 15 bit protocols. (#1397 #1410) +- MITSUBISHI_AC: Add support for enabling Weekly Timer. (#1403 #1404) +- Mitsubishi ACs: Improve handling swing/vane settings. (#1399 #1401) +- MITSUBISHI_AC: Add support for half degrees. (#1398 #1400) +- Add `irutils::addSwing[V|H]ToString()` and adjust some constants (#1365 #1393) +- SharpAc: Add support for model A903, and improve `IRac` fan & power control. (#1387 #1390) +- Experimental support for Milestag2 (#1360 #1380) + +**[Misc]** +- Improve `IRac::sendAc()` documentation. (#1408 #1409) +- refactor ir_Transcold (#1407) +- refactor ir_Toshiba (#1395) +- Fix Travis-CI build issues. (#1396) +- refactor ir_Teco (#1392) +- Fujitsu A/C: Add warning/suggestions for AR-RAH1U devices (#1376 #1386) +- refactor ir_Technibel (#1385) +- Add the new logo and banner :tada: (#1371 #1372) +- Update references to sbprojects website. (#1381 #1383) +- refactor ir_Tcl (#1379) + + ## _v2.7.14 (20210103)_ **[Bug Fixes]** diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/SupportedProtocols.md b/lib/lib_basic/IRremoteESP8266-2.7.15/SupportedProtocols.md similarity index 94% rename from lib/lib_basic/IRremoteESP8266-2.7.14/SupportedProtocols.md rename to lib/lib_basic/IRremoteESP8266-2.7.15/SupportedProtocols.md index 7fe0409ff..07a4506b2 100644 --- a/lib/lib_basic/IRremoteESP8266-2.7.14/SupportedProtocols.md +++ b/lib/lib_basic/IRremoteESP8266-2.7.15/SupportedProtocols.md @@ -1,6 +1,6 @@ + Last generated: Fri 12 Feb 2021 23:30:54 +0000 ---> # IR Protocols supported by this library | Protocol | Brand | Model | A/C Model | Detailed A/C Support | @@ -22,12 +22,13 @@ | [Denon](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Denon.cpp) | **Denon** | AVR-3801 A/V Receiver (probably) | | - | | [Dish](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Dish.cpp) | **DISH NETWORK** | echostar 301 | | - | | [Doshisha](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Doshisha.cpp) | **Doshisha** | CZ-S32D LED Light
CZ-S38D LED Light
CZ-S50D LED Light
RCZ01 remote | | - | +| [EcoClim](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_EcoClim.cpp) | **EcoClim** | HYSFR-P348 remote
ZC200DPO A/C | | - | | [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
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
YKR-M/003E remote | | Yes | | [EliteScreens](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_EliteScreens.cpp) | **Elite Screens** | CineTension2 / CineTension3 series
Home2 / Home3 series
Spectrum series
VMAX Plus4 series
VMAX2 / VMAX2 Plus series
ZSP-IR-B / ZSP-IR-W remote | | - | | [EliteScreens](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_EliteScreens.cpp) | **Lumene Screens** | Embassy | | - | | [Epson](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Epson.cpp) | **Epson** | EN-TW9100W Projector | | - | -| [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 (ARRAH2E)
AR-DB1 remote (ARDB1)
AR-DL10 remote (ARDB1)
AR-RAC1E remote (ARRAH2E)
AR-RAE1E remote (ARRAH2E)
AR-RAH2E remote (ARRAH2E)
AR-REB1E remote (ARREB1E)
AR-RY4 remote (ARRY4)
AST9RSGCW A/C (ARDB1)
ASTB09LBC A/C (ARRY4)
ASU30C1 A/C (ARDB1)
ASYG30LFCA A/C (ARRAH2E)
ASYG7LMCA A/C (ARREB1E) | ARDB1
ARJW2
ARRAH2E
ARREB1E
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 (ARRAH2E)
AR-DB1 remote (ARDB1)
AR-DL10 remote (ARDB1)
AR-RAC1E remote (ARRAH2E)
AR-RAE1E remote (ARRAH2E)
AR-RAH1U remote (ARREB1E)
AR-RAH2E remote (ARRAH2E)
AR-REB1E remote (ARREB1E)
AR-RY4 remote (ARRY4)
AST9RSGCW A/C (ARDB1)
ASTB09LBC A/C (ARRY4)
ASU12RLF A/C (ARREB1E)
ASU30C1 A/C (ARDB1)
ASYG30LFCA A/C (ARRAH2E)
ASYG7LMCA A/C (ARREB1E) | ARDB1
ARJW2
ARRAH2E
ARREB1E
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)** | AOHG09LLC A/C (ARRAH2E)
AR-JW2 remote (ARJW2)
AR-RCE1E remote (ARRAH2E)
ASHG09LLCA A/C (ARRAH2E) | ARDB1
ARJW2
ARRAH2E
ARREB1E
ARRY4 | Yes | | [GICable](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_GICable.cpp) | **G.I. Cable** | XRC-200 remote | | - | | [GlobalCache](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_GlobalCache.cpp) | **Global Cache** | Control Tower IR DB | | - | @@ -60,9 +61,10 @@ | [Midea](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Midea.cpp) | **[Midea](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Midea.h)** | FS40-7AR Stand Fan (MIDEA24) | | Yes | | [Midea](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Midea.cpp) | **[MrCool](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Midea.h)** | RG57A6/BGEFU1 remote (MIDEA) | | Yes | | [Midea](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Midea.cpp) | **[Pioneer System](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Midea.h)** | RG66B6(B)/BGEFU1 remote (MIDEA)
RUBO18GMFILCAD A/C (18K BTU) (MIDEA)
RYBO12GMFILCAD A/C (12K BTU) (MIDEA)
UB018GMFILCFHD A/C (12K BTU) (MIDEA)
WS012GMFI22HLD A/C (12K BTU) (MIDEA)
WS018GMFI22HLD A/C (12K BTU) (MIDEA) | | Yes | +| [MilesTag2](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_MilesTag2.cpp) | **Milestag2** | Various | | - | | [Mirage](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Mirage.cpp) | **Mirage** | VLU series A/C | | - | | [Mitsubishi](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Mitsubishi.cpp) | **[Mitsubishi](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Mitsubishi.h)** | HC3000 Projector (MITSUBISHI2)
KM14A 0179213 remote
MS-GK24VA A/C
TV (MITSUBISHI) | | Yes | -| [Mitsubishi](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Mitsubishi.cpp) | **[Mitsubishi Electric](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Mitsubishi.h)** | 001CP T7WE10714 remote (MITSUBISHI136)
KPOA remote (MITSUBISHI112)
MSH-A24WV A/C (MITSUBISHI112)
MUH-A24WV A/C (MITSUBISHI112)
PEAD-RP71JAA Ducted A/C (MITSUBISHI136) | | Yes | +| [Mitsubishi](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Mitsubishi.cpp) | **[Mitsubishi Electric](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Mitsubishi.h)** | 001CP T7WE10714 remote (MITSUBISHI136)
KPOA remote (MITSUBISHI112)
MLZ-RX5017AS A/C (MITSUBISHI_AC)
MSH-A24WV A/C (MITSUBISHI112)
MSZ-GV2519 A/C (MITSUBISHI_AC)
MUH-A24WV A/C (MITSUBISHI112)
PEAD-RP71JAA Ducted A/C (MITSUBISHI136)
RH151/M21ED6426 remote (MITSUBISHI_AC)
SG153/M21EDF426 remote (MITSUBISHI_AC) | | Yes | | [MitsubishiHeavy](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_MitsubishiHeavy.cpp) | **[Mitsubishi Heavy Industries](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_MitsubishiHeavy.h)** | RKX502A001C remote (88 bit)
RLA502A700B remote (152 bit)
SRKxxZJ-S A/C (88 bit)
SRKxxZM-S A/C (152 bit)
SRKxxZMXA-S A/C (152 bit) | | Yes | | [Multibrackets](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Multibrackets.cpp) | **Multibrackets** | Motorized Swing mount large - 4500 | | - | | [NEC](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_NEC.cpp) | **[Aloka](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_NEC.h)** | SleepyLights LED Lamp | | - | @@ -80,7 +82,7 @@ | [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)** | AH59-02692E Soundbar remote (SAMSUNG36)
AK59-00167A Bluray remote (SAMSUNG36)
AR09FSSDAWKNFA A/C (SAMSUNG_AC)
AR12HSSDBWKNEU A/C (SAMSUNG_AC)
AR12KSFPEWQNET A/C (SAMSUNG_AC)
AR12NXCXAWKXEU A/C (SAMSUNG_AC)
BN59-01178B TV remote (SAMSUNG)
DB63-03556X003 remote
DB93-16761C remote
HW-J551 Soundbar (SAMSUNG36)
IEC-R03 remote
UA55H6300 TV (SAMSUNG) | | Yes | | [Sanyo](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Sanyo.cpp) | **[Sanyo](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Sanyo.h)** | LC7461 transmitter IC (SANYO_LC7461)
RCS-2HS4E remote (SANYO_AC)
RCS-2S4E remote (SANYO_AC)
SA 8650B - disabled
SAP-K121AHA A/C (SANYO_AC)
SAP-K242AH A/C (SANYO_AC) | | 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)** | AH-AxSAY A/C (A907)
AH-XP10NRY A/C (A907)
AY-ZP40KR A/C (A907)
CRMC-820 JBEZ remote (A907)
CRMC-A705 JBEZ remote (A705)
CRMC-A907 JBEZ remote (A907)
LC-52D62U TV | A705
A907 | 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)** | AH-A12REVP-1 A/C (A903)
AH-AxSAY A/C (A907)
AH-PR13-GL A/C (A903)
AH-XP10NRY A/C (A903)
AY-ZP40KR A/C (A907)
CRMC-820 JBEZ remote (A903)
CRMC-A705 JBEZ remote (A705)
CRMC-A863 JBEZ remote (A903)
CRMC-A903JBEZ remote (A903)
CRMC-A907 JBEZ remote (A907)
LC-52D62U TV | A705
A903
A907 | Yes | | [Sherwood](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Sherwood.cpp) | **Sherwood** | RC-138 remote
RD6505(B) Receiver | | - | | [Sony](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Sony.cpp) | **Sony** | HT-CT380 Soundbar (Uses 38kHz & 3 repeats) | | - | | [Symphony](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Symphony.cpp) | **Blyss** | Owen-SW-5 3 Fan
WP-YK8 090218 remote | | - | @@ -135,6 +137,7 @@ - DENON - DISH - DOSHISHA +- ECOCLIM - ELECTRA_AC - ELITESCREENS - EPSON @@ -162,6 +165,7 @@ - METZ - MIDEA - MIDEA24 +- MILESTAG2 - MIRAGE - MITSUBISHI - MITSUBISHI112 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.15/assets/images/banner.svg b/lib/lib_basic/IRremoteESP8266-2.7.15/assets/images/banner.svg new file mode 100644 index 000000000..d1e2c3592 --- /dev/null +++ b/lib/lib_basic/IRremoteESP8266-2.7.15/assets/images/banner.svg @@ -0,0 +1,142 @@ +
Custom logo

IRremoteESP8266

Infrared remote library for ESP8266/ESP32: send and receive infrared signals with multiple protocols

+
\ No newline at end of file diff --git a/lib/lib_basic/IRremoteESP8266-2.7.15/assets/images/logo.svg b/lib/lib_basic/IRremoteESP8266-2.7.15/assets/images/logo.svg new file mode 100644 index 000000000..a42691f96 --- /dev/null +++ b/lib/lib_basic/IRremoteESP8266-2.7.15/assets/images/logo.svg @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/README.md b/lib/lib_basic/IRremoteESP8266-2.7.15/docs/README.md similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.14/docs/README.md rename to lib/lib_basic/IRremoteESP8266-2.7.15/docs/README.md diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/README_de.md b/lib/lib_basic/IRremoteESP8266-2.7.15/docs/README_de.md similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.14/docs/README_de.md rename to lib/lib_basic/IRremoteESP8266-2.7.15/docs/README_de.md diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/README_fr.md b/lib/lib_basic/IRremoteESP8266-2.7.15/docs/README_fr.md similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.14/docs/README_fr.md rename to lib/lib_basic/IRremoteESP8266-2.7.15/docs/README_fr.md diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/_config.yml b/lib/lib_basic/IRremoteESP8266-2.7.15/docs/_config.yml similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.14/docs/_config.yml rename to lib/lib_basic/IRremoteESP8266-2.7.15/docs/_config.yml diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/IRac_8cpp.html b/lib/lib_basic/IRremoteESP8266-2.7.15/docs/doxygen/html/IRac_8cpp.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/IRac_8cpp.html rename to lib/lib_basic/IRremoteESP8266-2.7.15/docs/doxygen/html/IRac_8cpp.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/IRac_8h.html b/lib/lib_basic/IRremoteESP8266-2.7.15/docs/doxygen/html/IRac_8h.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/IRac_8h.html rename to lib/lib_basic/IRremoteESP8266-2.7.15/docs/doxygen/html/IRac_8h.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/IRac_8h_source.html b/lib/lib_basic/IRremoteESP8266-2.7.15/docs/doxygen/html/IRac_8h_source.html similarity index 98% rename from lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/IRac_8h_source.html rename to lib/lib_basic/IRremoteESP8266-2.7.15/docs/doxygen/html/IRac_8h_source.html index 051b58a17..eb32f990c 100644 --- a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/IRac_8h_source.html +++ b/lib/lib_basic/IRremoteESP8266-2.7.15/docs/doxygen/html/IRac_8h_source.html @@ -529,93 +529,93 @@ $(function() {
Support for Kelvinator A/C protocols.
Class for handling detailed Samsung A/C messages.
Definition: ir_Samsung.h:130
void hitachi(IRHitachiAc *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const stdAc::swingh_t swingh)
Send a Hitachi A/C message with the supplied settings.
Definition: IRac.cpp:1073
-
Class for handling detailed Toshiba A/C messages.
Definition: ir_Toshiba.h:100
-
decode_type_t
Enumerator for defining and numbering of supported IR protocol.
Definition: IRremoteESP8266.h:771
+
Class for handling detailed Toshiba A/C messages.
Definition: ir_Toshiba.h:118
+
decode_type_t
Enumerator for defining and numbering of supported IR protocol.
Definition: IRremoteESP8266.h:785
stdAc::state_t getStatePrev(void)
Get the previous internal A/C climate state that should have already been sent to the device....
Definition: IRac.cpp:133
stdAc::state_t getState(void)
Get the current internal A/C climate state.
Definition: IRac.cpp:128
Class for handling detailed Mitsubishi Heavy 152-bit A/C messages.
Definition: ir_MitsubishiHeavy.h:184
-
static stdAc::swingh_t strToSwingH(const char *str, const stdAc::swingh_t def=stdAc::swingh_t::kOff)
Convert the supplied str into the appropriate enum.
Definition: IRac.cpp:2842
-
void sharp(IRSharpAc *ac, const sharp_ac_remote_model_t model, const bool on, const bool prev_power, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const bool turbo, const bool light, const bool filter, const bool clean)
Send a Sharp A/C message with the supplied settings.
Definition: IRac.cpp:1725
+
static stdAc::swingh_t strToSwingH(const char *str, const stdAc::swingh_t def=stdAc::swingh_t::kOff)
Convert the supplied str into the appropriate enum.
Definition: IRac.cpp:2848
+
void sharp(IRSharpAc *ac, const sharp_ac_remote_model_t model, const bool on, const bool prev_power, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const bool turbo, const bool light, const bool filter, const bool clean)
Send a Sharp A/C message with the supplied settings.
Definition: IRac.cpp:1727
void hitachi344(IRHitachiAc344 *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const stdAc::swingh_t swingh)
Send a Hitachi 344-bit A/C message with the supplied settings.
Definition: IRac.cpp:1149
Support for Electra A/C protocols.
-
void markAsSent(void)
Update the previous state to the current one.
Definition: IRac.cpp:2705
+
void markAsSent(void)
Update the previous state to the current one.
Definition: IRac.cpp:2711
swingv_t
Common A/C settings for Vertical Swing.
Definition: IRsend.h:70
Airwell "Manchester code" based protocol. Some other Airwell products use the COOLIX protocol.
void daikin2(IRDaikin2 *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const stdAc::swingh_t swingh, const bool quiet, const bool turbo, const bool light, const bool econo, const bool filter, const bool clean, const bool beep, const int16_t sleep=-1, const int16_t clock=-1)
Send a Daikin2 A/C message with the supplied settings.
Definition: IRac.cpp:691
Support for Trotec protocols.
-
void sanyo(IRSanyoAc *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const bool beep, const int16_t sleep=-1)
Send a Toshiba A/C message with the supplied settings.
Definition: IRac.cpp:1681
-
Class for handling detailed Daikin 280-bit A/C messages.
Definition: ir_Daikin.h:651
+
void sanyo(IRSanyoAc *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const bool beep, const int16_t sleep=-1)
Send a Toshiba A/C message with the supplied settings.
Definition: IRac.cpp:1683
+
Class for handling detailed Daikin 280-bit A/C messages.
Definition: ir_Daikin.h:658
void lg(IRLgAc *ac, const lg_ac_remote_model_t model, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan)
Send a LG A/C message with the supplied settings.
Definition: IRac.cpp:1255
Class for handling detailed Delonghi A/C messages.
Definition: ir_Delonghi.h:73
Class for handling detailed Corona A/C messages.
Definition: ir_Corona.h:107
void kelvinator(IRKelvinatorAC *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const stdAc::swingh_t swingh, const bool quiet, const bool turbo, const bool light, const bool filter, const bool clean)
Send a Kelvinator A/C message with the supplied settings.
Definition: IRac.cpp:1221
-
Class for handling detailed Daikin 312-bit A/C messages.
Definition: ir_Daikin.h:733
+
Class for handling detailed Daikin 312-bit A/C messages.
Definition: ir_Daikin.h:740
Support for Neoclima protocols. Analysis by crankyoldgit & AndreyShpilevoy.
-
Class for handling detailed Daikin 128-bit A/C messages.
Definition: ir_Daikin.h:994
+
Class for handling detailed Daikin 128-bit A/C messages.
Definition: ir_Daikin.h:1001
fanspeed_t
Common A/C settings for Fan Speeds.
Definition: IRsend.h:58
Support for Sharp protocols.
-
static String fanspeedToString(const stdAc::fanspeed_t speed)
Convert the supplied fan speed enum into the appropriate String.
Definition: IRac.cpp:2992
-
whirlpool_ac_remote_model_t
Whirlpool A/C model numbers.
Definition: IRsend.h:164
+
static String fanspeedToString(const stdAc::fanspeed_t speed)
Convert the supplied fan speed enum into the appropriate String.
Definition: IRac.cpp:2998
+
whirlpool_ac_remote_model_t
Whirlpool A/C model numbers.
Definition: IRsend.h:169
Carrier A/C.
-
void whirlpool(IRWhirlpoolAc *ac, const whirlpool_ac_remote_model_t model, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const bool turbo, const bool light, const int16_t sleep=-1, const int16_t clock=-1)
Send a Whirlpool A/C message with the supplied settings.
Definition: IRac.cpp:2036
+
void whirlpool(IRWhirlpoolAc *ac, const whirlpool_ac_remote_model_t model, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const bool turbo, const bool light, const int16_t sleep=-1, const int16_t clock=-1)
Send a Whirlpool A/C message with the supplied settings.
Definition: IRac.cpp:2038
Results returned from the decoder.
Definition: IRrecv.h:92
void daikin64(IRDaikin64 *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const bool quiet, const bool turbo, const int16_t sleep=-1, const int16_t clock=-1)
Send a Daikin 64-bit A/C message with the supplied settings.
Definition: IRac.cpp:760
-
void voltas(IRVoltas *ac, const voltas_ac_remote_model_t model, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const stdAc::swingh_t swingh, const bool turbo, const bool econo, const bool light, const int16_t sleep=-1)
Send a Voltas A/C message with the supplied settings.
Definition: IRac.cpp:1995
-
void tcl112(IRTcl112Ac *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const stdAc::swingh_t swingh, const bool turbo, const bool light, const bool econo, const bool filter)
Send a TCL 112-bit A/C message with the supplied settings.
Definition: IRac.cpp:1778
-
void transcold(IRTranscoldAc *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const stdAc::swingh_t swingh)
Send a Transcold A/C message with the supplied settings.
Definition: IRac.cpp:2073
-
bool sendAc(void)
Send an A/C message based soley on our internal state.
Definition: IRac.cpp:2711
-
static bool cmpStates(const stdAc::state_t a, const stdAc::state_t b)
Compare two AirCon states.
Definition: IRac.cpp:2722
+
void voltas(IRVoltas *ac, const voltas_ac_remote_model_t model, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const stdAc::swingh_t swingh, const bool turbo, const bool econo, const bool light, const int16_t sleep=-1)
Send a Voltas A/C message with the supplied settings.
Definition: IRac.cpp:1997
+
void tcl112(IRTcl112Ac *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const stdAc::swingh_t swingh, const bool turbo, const bool light, const bool econo, const bool filter)
Send a TCL 112-bit A/C message with the supplied settings.
Definition: IRac.cpp:1780
+
void transcold(IRTranscoldAc *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const stdAc::swingh_t swingh)
Send a Transcold A/C message with the supplied settings.
Definition: IRac.cpp:2075
+
bool sendAc(void)
Send an A/C message based soley on our internal state.
Definition: IRac.cpp:2717
+
static bool cmpStates(const stdAc::state_t a, const stdAc::state_t b)
Compare two AirCon states.
Definition: IRac.cpp:2728
Support for Midea protocols. Midea added by crankyoldgit & bwze.
Support for Daikin A/C protocols.
-
gree_ac_remote_model_t
Gree A/C model numbers.
Definition: IRsend.h:129
-
Class for handling detailed Daikin 64-bit A/C messages.
Definition: ir_Daikin.h:1124
+
gree_ac_remote_model_t
Gree A/C model numbers.
Definition: IRsend.h:133
+
Class for handling detailed Daikin 64-bit A/C messages.
Definition: ir_Daikin.h:1131
Support for Coolix A/C protocols.
-
void vestel(IRVestelAc *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const bool turbo, const bool filter, const int16_t sleep=-1, const int16_t clock=-1, const bool sendNormal=true)
Send a Vestel A/C message with the supplied settings.
Definition: IRac.cpp:1953
+
void vestel(IRVestelAc *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const bool turbo, const bool filter, const int16_t sleep=-1, const int16_t clock=-1, const bool sendNormal=true)
Send a Vestel A/C message with the supplied settings.
Definition: IRac.cpp:1955
Class for handling detailed Hitachi 53-byte/424-bit A/C messages.
Definition: ir_Hitachi.h:371
void daikin(IRDaikinESP *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const stdAc::swingh_t swingh, const bool quiet, const bool turbo, const bool econo, const bool clean)
Send a Daikin A/C message with the supplied settings.
Definition: IRac.cpp:527
IRac(const uint16_t pin, const bool inverted=false, const bool use_modulation=true)
Class constructor.
Definition: IRac.cpp:54
-
Class for handling detailed Daikin 216-bit A/C messages.
Definition: ir_Daikin.h:829
+
Class for handling detailed Daikin 216-bit A/C messages.
Definition: ir_Daikin.h:836
Class for handling detailed Voltas A/C messages.
Definition: ir_Voltas.h:90
-
hitachi_ac1_remote_model_t
HITACHI_AC1 A/C model numbers.
Definition: IRsend.h:135
-
void samsung(IRSamsungAc *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const bool quiet, const bool turbo, const bool light, const bool filter, const bool clean, const bool beep, const bool prevpower=true, const bool forcepower=true)
Send a Samsung A/C message with the supplied settings.
Definition: IRac.cpp:1640
+
hitachi_ac1_remote_model_t
HITACHI_AC1 A/C model numbers.
Definition: IRsend.h:139
+
void samsung(IRSamsungAc *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const bool quiet, const bool turbo, const bool light, const bool filter, const bool clean, const bool beep, const bool prevpower=true, const bool forcepower=true)
Send a Samsung A/C message with the supplied settings.
Definition: IRac.cpp:1642
void daikin128(IRDaikin128 *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const bool quiet, const bool turbo, const bool light, const bool econo, const int16_t sleep=-1, const int16_t clock=-1)
Send a Daikin 128-bit A/C message with the supplied settings.
Definition: IRac.cpp:567
Class for handling detailed Hitachi 224-bit A/C messages.
Definition: ir_Hitachi.h:246
const int8_t kGpioUnused
A placeholder for not using an actual GPIO.
Definition: IRac.h:45
-
Common functions for use with all A/Cs supported by the IRac class.
Definition: IRac.cpp:3061
+
Common functions for use with all A/Cs supported by the IRac class.
Definition: IRac.cpp:3067
Class for handling detailed Sanyo A/C messages.
Definition: ir_Sanyo.h:106
void haier(IRHaierAC *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const bool filter, const int16_t sleep=-1, const int16_t clock=-1)
Send a Haier A/C message with the supplied settings.
Definition: IRac.cpp:1004
Class for handling detailed Whirlpool A/C messages.
Definition: ir_Whirlpool.h:91
Class for handling detailed Hitachi 344-bit A/C messages.
Definition: ir_Hitachi.h:459
-
static String boolToString(const bool value)
Convert the supplied boolean into the appropriate String.
Definition: IRac.cpp:2963
+
static String boolToString(const bool value)
Convert the supplied boolean into the appropriate String.
Definition: IRac.cpp:2969
stdAc::state_t next
The state we want the device to be in after we send.
Definition: IRac.h:97
-
std::string String
Definition: IRremoteESP8266.h:1178
-
Class for handling detailed Mitsubishi 144-bit A/C messages.
Definition: ir_Mitsubishi.h:221
-
void trotec(IRTrotecESP *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const int16_t sleep=-1)
Send a Trotec A/C message with the supplied settings.
Definition: IRac.cpp:1916
-
static int16_t strToModel(const char *str, const int16_t def=-1)
Convert the supplied str into the appropriate enum.
Definition: IRac.cpp:2882
+
std::string String
Definition: IRremoteESP8266.h:1199
+
Class for handling detailed Mitsubishi 144-bit A/C messages.
Definition: ir_Mitsubishi.h:242
+
void trotec(IRTrotecESP *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const int16_t sleep=-1)
Send a Trotec A/C message with the supplied settings.
Definition: IRac.cpp:1918
+
static int16_t strToModel(const char *str, const int16_t def=-1)
Convert the supplied str into the appropriate enum.
Definition: IRac.cpp:2888
Class for handling detailed Amcor A/C messages.
Definition: ir_Amcor.h:90
-
Class for handling detailed Mitsubishi 122-bit A/C messages.
Definition: ir_Mitsubishi.h:339
-
Class for handling detailed TCL A/C messages.
Definition: ir_Tcl.h:63
+
Class for handling detailed Mitsubishi 122-bit A/C messages.
Definition: ir_Mitsubishi.h:362
+
Class for handling detailed TCL A/C messages.
Definition: ir_Tcl.h:89
void daikin176(IRDaikin176 *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingh_t swingh)
Send a Daikin 176-bit A/C message with the supplied settings.
Definition: IRac.cpp:659
Class for handling detailed Electra A/C messages.
Definition: ir_Electra.h:98
Support for TCL protocols.
-
bool hasStateChanged(void)
Check if the internal state has changed from what was previously sent.
Definition: IRac.cpp:2734
+
bool hasStateChanged(void)
Check if the internal state has changed from what was previously sent.
Definition: IRac.cpp:2740
void haierYrwo2(IRHaierACYRW02 *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const bool turbo, const bool filter, const int16_t sleep=-1)
Send a Haier YRWO2 A/C message with the supplied settings.
Definition: IRac.cpp:1041
void daikin216(IRDaikin216 *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const stdAc::swingh_t swingh, const bool quiet, const bool turbo)
Send a Daikin 216-bit A/C message with the supplied settings.
Definition: IRac.cpp:730
Support for Transcold A/C protocols.
Support for Hitachi A/C protocols.
Support for Panasonic protocols.
-
static stdAc::state_t handleToggles(const stdAc::state_t desired, const stdAc::state_t *prev=NULL)
Create a new state base on desired & previous states but handle any state changes for options that ne...
Definition: IRac.cpp:2122
-
Class for handling detailed Mitsubishi 136-bit A/C messages.
Definition: ir_Mitsubishi.h:285
-
panasonic_ac_remote_model_t
Panasonic A/C model numbers.
Definition: IRsend.h:141
+
static stdAc::state_t handleToggles(const stdAc::state_t desired, const stdAc::state_t *prev=NULL)
Create a new state base on desired & previous states but handle any state changes for options that ne...
Definition: IRac.cpp:2124
+
Class for handling detailed Mitsubishi 136-bit A/C messages.
Definition: ir_Mitsubishi.h:308
+
panasonic_ac_remote_model_t
Panasonic A/C model numbers.
Definition: IRsend.h:145
swingh_t
Common A/C settings for Horizontal Swing.
Definition: IRsend.h:83
-
void mitsubishi112(IRMitsubishi112 *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const stdAc::swingh_t swingh, const bool quiet)
Send a Mitsubishi 112-bit A/C message with the supplied settings.
Definition: IRac.cpp:1365
-
bool decodeToState(const decode_results *decode, stdAc::state_t *result, const stdAc::state_t *prev)
Convert a valid IR A/C remote message that we understand enough into a Common A/C state.
Definition: IRac.cpp:3430
+
void mitsubishi112(IRMitsubishi112 *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const stdAc::swingh_t swingh, const bool quiet)
Send a Mitsubishi 112-bit A/C message with the supplied settings.
Definition: IRac.cpp:1367
+
bool decodeToState(const decode_results *decode, stdAc::state_t *result, const stdAc::state_t *prev)
Convert a valid IR A/C remote message that we understand enough into a Common A/C state.
Definition: IRac.cpp:3436
Class for handling detailed Hitachi 104-bit A/C messages.
Definition: ir_Hitachi.h:303
void hitachi424(IRHitachiAc424 *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv)
Send a Hitachi 424-bit A/C message with the supplied settings.
Definition: IRac.cpp:1183
Support for Samsung protocols. Samsung originally added from https://github.com/shirriff/Arduino-IRre...
-
String resultAcToString(const decode_results *const result)
Display the human readable state of an A/C message if we can.
Definition: IRac.cpp:3067
+
String resultAcToString(const decode_results *const result)
Display the human readable state of an A/C message if we can.
Definition: IRac.cpp:3073
void daikin152(IRDaikin152 *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const bool quiet, const bool turbo, const bool econo)
Send a Daikin 152-bit A/C message with the supplied settings.
Definition: IRac.cpp:604
fujitsu_ac_remote_model_t
Fujitsu A/C model numbers.
Definition: IRsend.h:120
Support for Gree A/C protocols.
@@ -623,56 +623,56 @@ $(function() {
Class for handling detailed Midea A/C messages.
Definition: ir_Midea.h:151
Class for handling detailed Kelvinator A/C messages.
Definition: ir_Kelvinator.h:121
bool _inverted
IR LED is lit when GPIO is LOW (true) or HIGH (false)?
Definition: IRac.h:103
-
Class for handling detailed Fujitsu A/C messages.
Definition: ir_Fujitsu.h:113
+
Class for handling detailed Fujitsu A/C messages.
Definition: ir_Fujitsu.h:120
Support for Mitsubishi Heavy Industry protocols. Code to emulate Mitsubishi Heavy Industries A/C IR r...
Class for handling detailed Coolix A/C messages.
Definition: ir_Coolix.h:112
void midea(IRMideaAC *ac, const bool on, const stdAc::opmode_t mode, const bool celsius, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const bool turbo, const bool econo, const bool light, const int16_t sleep=-1)
Send a Midea A/C message with the supplied settings.
Definition: IRac.cpp:1292
-
void panasonic(IRPanasonicAc *ac, const panasonic_ac_remote_model_t model, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const stdAc::swingh_t swingh, const bool quiet, const bool turbo, const bool filter, const int16_t clock=-1)
Send a Panasonic A/C message with the supplied settings.
Definition: IRac.cpp:1562
-
static String swingvToString(const stdAc::swingv_t swingv)
Convert the supplied enum into the appropriate String.
Definition: IRac.cpp:3014
+
void panasonic(IRPanasonicAc *ac, const panasonic_ac_remote_model_t model, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const stdAc::swingh_t swingh, const bool quiet, const bool turbo, const bool filter, const int16_t clock=-1)
Send a Panasonic A/C message with the supplied settings.
Definition: IRac.cpp:1564
+
static String swingvToString(const stdAc::swingv_t swingv)
Convert the supplied enum into the appropriate String.
Definition: IRac.cpp:3020
Support for Mitsubishi protocols. Mitsubishi (TV) decoding added from https://github....
A universal/common/generic interface for controling supported A/Cs.
Definition: IRac.h:49
Support for Teco protocols.
void gree(IRGreeAC *ac, const gree_ac_remote_model_t model, const bool on, const stdAc::opmode_t mode, const bool celsius, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const bool turbo, const bool light, const bool clean, const int16_t sleep=-1)
Send a Gree A/C message with the supplied settings.
Definition: IRac.cpp:966
Delonghi A/C.
void electra(IRElectraAc *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const stdAc::swingh_t swingh, const bool turbo, const bool lighttoggle, const bool clean)
Send an Electra A/C message with the supplied settings.
Definition: IRac.cpp:817
-
static stdAc::state_t cleanState(const stdAc::state_t state)
Create a new state base on the provided state that has been suitably fixed.
Definition: IRac.cpp:2109
+
static stdAc::state_t cleanState(const stdAc::state_t state)
Create a new state base on the provided state that has been suitably fixed.
Definition: IRac.cpp:2111
Support for Argo Ulisse 13 DCI Mobile Split ACs.
void mitsubishi(IRMitsubishiAC *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const stdAc::swingh_t swingh, const bool quiet, const int16_t clock=-1)
Send a Mitsubishi A/C message with the supplied settings.
Definition: IRac.cpp:1330
void amcor(IRAmcorAc *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan)
Send an Amcor A/C message with the supplied settings.
Definition: IRac.cpp:330
-
Class for handling detailed Technibel A/C messages.
Definition: ir_Technibel.h:108
+
Class for handling detailed Technibel A/C messages.
Definition: ir_Technibel.h:77
Class for handling detailed Airwell A/C messages.
Definition: ir_Airwell.h:60
Support for Voltas A/C protocol.
-
Class for handling detailed Daikin 152-bit A/C messages.
Definition: ir_Daikin.h:1064
+
Class for handling detailed Daikin 152-bit A/C messages.
Definition: ir_Daikin.h:1071
Class for handling detailed LG A/C messages.
Definition: ir_LG.h:67
Support for Fujitsu A/C protocols. Fujitsu A/C support added by Jonny Graham.
Class for handling detailed Haier A/C messages.
Definition: ir_Haier.h:244
-
void neoclima(IRNeoclimaAc *ac, const bool on, const stdAc::opmode_t mode, const bool celsius, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const stdAc::swingh_t swingh, const bool turbo, const bool econo, const bool light, const bool filter, const int16_t sleep=-1)
Send a Neoclima A/C message with the supplied settings.
Definition: IRac.cpp:1521
-
Class for handling detailed Daikin 160-bit A/C messages.
Definition: ir_Daikin.h:885
-
static String opmodeToString(const stdAc::opmode_t mode)
Convert the supplied operation mode into the appropriate String.
Definition: IRac.cpp:2970
-
Class for handling detailed Sharp A/C messages.
Definition: ir_Sharp.h:131
-
void toshiba(IRToshibaAC *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const bool turbo, const bool econo)
Send a Toshiba A/C message with the supplied settings.
Definition: IRac.cpp:1880
+
void neoclima(IRNeoclimaAc *ac, const bool on, const stdAc::opmode_t mode, const bool celsius, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const stdAc::swingh_t swingh, const bool turbo, const bool econo, const bool light, const bool filter, const int16_t sleep=-1)
Send a Neoclima A/C message with the supplied settings.
Definition: IRac.cpp:1523
+
Class for handling detailed Daikin 160-bit A/C messages.
Definition: ir_Daikin.h:892
+
static String opmodeToString(const stdAc::opmode_t mode)
Convert the supplied operation mode into the appropriate String.
Definition: IRac.cpp:2976
+
Class for handling detailed Sharp A/C messages.
Definition: ir_Sharp.h:137
+
void toshiba(IRToshibaAC *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const bool turbo, const bool econo)
Send a Toshiba A/C message with the supplied settings.
Definition: IRac.cpp:1882
Support for Goodweather compatible HVAC protocols.
void argo(IRArgoAC *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const bool turbo, const int16_t sleep=-1)
Send an Argo A/C message with the supplied settings.
Definition: IRac.cpp:362
-
lg_ac_remote_model_t
LG A/C model numbers.
Definition: IRsend.h:170
-
void mitsubishi136(IRMitsubishi136 *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const bool quiet)
Send a Mitsubishi 136-bit A/C message with the supplied settings.
Definition: IRac.cpp:1401
+
lg_ac_remote_model_t
LG A/C model numbers.
Definition: IRsend.h:175
+
void mitsubishi136(IRMitsubishi136 *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const bool quiet)
Send a Mitsubishi 136-bit A/C message with the supplied settings.
Definition: IRac.cpp:1403
bool _modulation
Is frequency modulation to be used?
Definition: IRac.h:104
-
void teco(IRTecoAc *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const bool light, const int16_t sleep=-1)
Send a Teco A/C message with the supplied settings.
Definition: IRac.cpp:1847
-
static stdAc::opmode_t strToOpmode(const char *str, const stdAc::opmode_t def=stdAc::opmode_t::kAuto)
Convert the supplied str into the appropriate enum.
Definition: IRac.cpp:2740
+
void teco(IRTecoAc *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const bool light, const int16_t sleep=-1)
Send a Teco A/C message with the supplied settings.
Definition: IRac.cpp:1849
+
static stdAc::opmode_t strToOpmode(const char *str, const stdAc::opmode_t def=stdAc::opmode_t::kAuto)
Convert the supplied str into the appropriate enum.
Definition: IRac.cpp:2746
Support for Sanyo protocols. Sanyo LC7461 support originally by marcosamarinho Sanyo SA 8650B origina...
void hitachi1(IRHitachiAc1 *ac, const hitachi_ac1_remote_model_t model, const bool on, const bool power_toggle, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const stdAc::swingh_t swingh, const bool swing_toggle, const int16_t sleep=-1)
Send a Hitachi1 A/C message with the supplied settings.
Definition: IRac.cpp:1110
-
Class for handling detailed Transcold A/C messages.
Definition: ir_Transcold.h:111
+
Class for handling detailed Transcold A/C messages.
Definition: ir_Transcold.h:120
-
void panasonic32(IRPanasonicAc32 *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const stdAc::swingh_t swingh)
Send a Panasonic A/C message with the supplied settings.
Definition: IRac.cpp:1598
+
void panasonic32(IRPanasonicAc32 *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const stdAc::swingh_t swingh)
Send a Panasonic A/C message with the supplied settings.
Definition: IRac.cpp:1600
Support for Whirlpool protocols. Decoding help from: @redmusicxd, @josh929800, @raducostea.
-
static bool strToBool(const char *str, const bool def=false)
Convert the supplied str into the appropriate boolean value.
Definition: IRac.cpp:2945
-
void mitsubishiHeavy88(IRMitsubishiHeavy88Ac *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const stdAc::swingh_t swingh, const bool turbo, const bool econo, const bool clean)
Send a Mitsubishi Heavy 88-bit A/C message with the supplied settings.
Definition: IRac.cpp:1436
-
static stdAc::swingv_t strToSwingV(const char *str, const stdAc::swingv_t def=stdAc::swingv_t::kOff)
Convert the supplied str into the appropriate enum.
Definition: IRac.cpp:2801
+
static bool strToBool(const char *str, const bool def=false)
Convert the supplied str into the appropriate boolean value.
Definition: IRac.cpp:2951
+
void mitsubishiHeavy88(IRMitsubishiHeavy88Ac *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const stdAc::swingh_t swingh, const bool turbo, const bool econo, const bool clean)
Send a Mitsubishi Heavy 88-bit A/C message with the supplied settings.
Definition: IRac.cpp:1438
+
static stdAc::swingv_t strToSwingV(const char *str, const stdAc::swingv_t def=stdAc::swingv_t::kOff)
Convert the supplied str into the appropriate enum.
Definition: IRac.cpp:2807
Class for handling detailed Vestel A/C messages.
Definition: ir_Vestel.h:116
Class for handling detailed Panasonic 32bit A/C messages.
Definition: ir_Panasonic.h:219
Class for handling detailed Trotec A/C messages.
Definition: ir_Trotec.h:76
-
Class for handling detailed Teco A/C messages.
Definition: ir_Teco.h:107
-
static String swinghToString(const stdAc::swingh_t swingh)
Convert the supplied enum into the appropriate String.
Definition: IRac.cpp:3038
+
Class for handling detailed Teco A/C messages.
Definition: ir_Teco.h:62
+
static String swinghToString(const stdAc::swingh_t swingh)
Convert the supplied enum into the appropriate String.
Definition: IRac.cpp:3044
void fujitsu(IRFujitsuAC *ac, const fujitsu_ac_remote_model_t model, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const stdAc::swingh_t swingh, const bool quiet, const bool turbo, const bool econo, const bool filter, const bool clean, const int16_t sleep=-1)
Send a Fujitsu A/C message with the supplied settings.
Definition: IRac.cpp:860
Support for Technibel protocol.
void delonghiac(IRDelonghiAc *ac, const bool on, const stdAc::opmode_t mode, const bool celsius, const float degrees, const stdAc::fanspeed_t fan, const bool turbo, const int16_t sleep=-1)
Send a Delonghi A/C message with the supplied settings.
Definition: IRac.cpp:790
@@ -681,13 +681,13 @@ $(function() {
void daikin160(IRDaikin160 *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv)
Send a Daikin 160-bit A/C message with the supplied settings.
Definition: IRac.cpp:637
void corona(IRCoronaAc *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const bool econo)
Send a Corona A/C message with the supplied settings.
Definition: IRac.cpp:492
static void initState(stdAc::state_t *state, const decode_type_t vendor, const int16_t model, const bool power, const stdAc::opmode_t mode, const float degrees, const bool celsius, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const stdAc::swingh_t swingh, const bool quiet, const bool turbo, const bool econo, const bool light, const bool filter, const bool clean, const bool beep, const int16_t sleep, const int16_t clock)
Initialise the given state with the supplied settings.
Definition: IRac.cpp:85
-
void mitsubishiHeavy152(IRMitsubishiHeavy152Ac *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const stdAc::swingh_t swingh, const bool quiet, const bool turbo, const bool econo, const bool filter, const bool clean, const int16_t sleep=-1)
Send a Mitsubishi Heavy 152-bit A/C message with the supplied settings.
Definition: IRac.cpp:1477
+
void mitsubishiHeavy152(IRMitsubishiHeavy152Ac *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const stdAc::swingh_t swingh, const bool quiet, const bool turbo, const bool econo, const bool filter, const bool clean, const int16_t sleep=-1)
Send a Mitsubishi Heavy 152-bit A/C message with the supplied settings.
Definition: IRac.cpp:1479
Support for Haier A/C protocols. The specifics of reverse engineering the protocols details:
Class for handling detailed Mitsubishi Heavy 88-bit A/C messages.
Definition: ir_MitsubishiHeavy.h:271
Class for handling detailed Gree A/C messages.
Definition: ir_Gree.h:133
void coolix(IRCoolixAC *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const stdAc::swingh_t swingh, const bool turbo, const bool light, const bool clean, const int16_t sleep=-1)
Send a Coolix A/C message with the supplied settings.
Definition: IRac.cpp:431
-
static stdAc::fanspeed_t strToFanspeed(const char *str, const stdAc::fanspeed_t def=stdAc::fanspeed_t::kAuto)
Convert the supplied str into the appropriate enum.
Definition: IRac.cpp:2770
+
static stdAc::fanspeed_t strToFanspeed(const char *str, const stdAc::fanspeed_t def=stdAc::fanspeed_t::kAuto)
Convert the supplied str into the appropriate enum.
Definition: IRac.cpp:2776
Support for Toshiba protocols.
void goodweather(IRGoodweatherAc *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const bool turbo, const bool light, const int16_t sleep=-1)
Send a Goodweather A/C message with the supplied settings.
Definition: IRac.cpp:924
Structure to hold a common A/C state.
Definition: IRsend.h:97
@@ -697,12 +697,12 @@ $(function() {
Class for handling detailed Argo A/C messages.
Definition: ir_Argo.h:127
Class for handling detailed Neoclima A/C messages.
Definition: ir_Neoclima.h:120
static bool isProtocolSupported(const decode_type_t protocol)
Is the given protocol supported by the IRac class?
Definition: IRac.cpp:138
-
Class for handling detailed Daikin 176-bit A/C messages.
Definition: ir_Daikin.h:937
+
Class for handling detailed Daikin 176-bit A/C messages.
Definition: ir_Daikin.h:944
Amcor A/C protocol.
uint16_t _pin
The GPIO to use to transmit messages from.
Definition: IRac.h:102
-
void technibel(IRTechnibelAc *ac, const bool on, const stdAc::opmode_t mode, const bool celsius, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const int16_t sleep=-1)
Send a Technibel A/C message with the supplied settings.
Definition: IRac.cpp:1814
-
voltas_ac_remote_model_t
Voltas A/C model numbers.
Definition: IRsend.h:158
-
sharp_ac_remote_model_t
Sharp A/C model numbers.
Definition: IRsend.h:152
+
void technibel(IRTechnibelAc *ac, const bool on, const stdAc::opmode_t mode, const bool celsius, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const int16_t sleep=-1)
Send a Technibel A/C message with the supplied settings.
Definition: IRac.cpp:1816
+
voltas_ac_remote_model_t
Voltas A/C model numbers.
Definition: IRsend.h:163
+
sharp_ac_remote_model_t
Sharp A/C model numbers.
Definition: IRsend.h:156
Support for LG protocols.
void carrier64(IRCarrierAc64 *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const int16_t sleep=-1)
Send a Carrier 64-bit A/C message with the supplied settings.
Definition: IRac.cpp:394
opmode_t
Common A/C settings for A/C operating modes.
Definition: IRsend.h:46
diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/IRrecv_8cpp.html b/lib/lib_basic/IRremoteESP8266-2.7.15/docs/doxygen/html/IRrecv_8cpp.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/IRrecv_8cpp.html rename to lib/lib_basic/IRremoteESP8266-2.7.15/docs/doxygen/html/IRrecv_8cpp.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/IRrecv_8h.html b/lib/lib_basic/IRremoteESP8266-2.7.15/docs/doxygen/html/IRrecv_8h.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/IRrecv_8h.html rename to lib/lib_basic/IRremoteESP8266-2.7.15/docs/doxygen/html/IRrecv_8h.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/IRrecv_8h_source.html b/lib/lib_basic/IRremoteESP8266-2.7.15/docs/doxygen/html/IRrecv_8h_source.html similarity index 87% rename from lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/IRrecv_8h_source.html rename to lib/lib_basic/IRremoteESP8266-2.7.15/docs/doxygen/html/IRrecv_8h_source.html index 8e988309c..1a3c07175 100644 --- a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/IRrecv_8h_source.html +++ b/lib/lib_basic/IRremoteESP8266-2.7.15/docs/doxygen/html/IRrecv_8h_source.html @@ -254,564 +254,577 @@ $(function() {
187  const uint8_t tolerance = kUseDefTol,
188  const int16_t excess = kMarkExcess,
189  const bool MSBfirst = true);
-
190  match_result_t matchData(volatile uint16_t *data_ptr, const uint16_t nbits,
+
190  match_result_t matchData(volatile uint16_t *data_ptr, const uint16_t nbits,
191  const uint16_t onemark, const uint32_t onespace,
192  const uint16_t zeromark, const uint32_t zerospace,
193  const uint8_t tolerance = kUseDefTol,
194  const int16_t excess = kMarkExcess,
-
195  const bool MSBfirst = true);
-
196  uint16_t matchBytes(volatile uint16_t *data_ptr, uint8_t *result_ptr,
-
197  const uint16_t remaining, const uint16_t nbytes,
-
198  const uint16_t onemark, const uint32_t onespace,
-
199  const uint16_t zeromark, const uint32_t zerospace,
-
200  const uint8_t tolerance = kUseDefTol,
-
201  const int16_t excess = kMarkExcess,
-
202  const bool MSBfirst = true);
-
203  uint16_t matchGeneric(volatile uint16_t *data_ptr,
-
204  uint64_t *result_ptr,
-
205  const uint16_t remaining, const uint16_t nbits,
-
206  const uint16_t hdrmark, const uint32_t hdrspace,
-
207  const uint16_t onemark, const uint32_t onespace,
-
208  const uint16_t zeromark, const uint32_t zerospace,
-
209  const uint16_t footermark, const uint32_t footerspace,
-
210  const bool atleast = false,
-
211  const uint8_t tolerance = kUseDefTol,
-
212  const int16_t excess = kMarkExcess,
-
213  const bool MSBfirst = true);
-
214  uint16_t matchGeneric(volatile uint16_t *data_ptr, uint8_t *result_ptr,
-
215  const uint16_t remaining, const uint16_t nbits,
-
216  const uint16_t hdrmark, const uint32_t hdrspace,
-
217  const uint16_t onemark, const uint32_t onespace,
-
218  const uint16_t zeromark, const uint32_t zerospace,
-
219  const uint16_t footermark,
-
220  const uint32_t footerspace,
-
221  const bool atleast = false,
-
222  const uint8_t tolerance = kUseDefTol,
-
223  const int16_t excess = kMarkExcess,
-
224  const bool MSBfirst = true);
-
225  uint16_t matchGenericConstBitTime(volatile uint16_t *data_ptr,
-
226  uint64_t *result_ptr,
-
227  const uint16_t remaining,
-
228  const uint16_t nbits,
-
229  const uint16_t hdrmark,
-
230  const uint32_t hdrspace,
-
231  const uint16_t one,
-
232  const uint32_t zero,
-
233  const uint16_t footermark,
-
234  const uint32_t footerspace,
-
235  const bool atleast = false,
-
236  const uint8_t tolerance = kUseDefTol,
-
237  const int16_t excess = kMarkExcess,
-
238  const bool MSBfirst = true);
-
239  uint16_t matchManchesterData(volatile const uint16_t *data_ptr,
-
240  uint64_t *result_ptr,
-
241  const uint16_t remaining,
-
242  const uint16_t nbits,
-
243  const uint16_t half_period,
-
244  const uint16_t starting_balance = 0,
-
245  const uint8_t tolerance = kUseDefTol,
-
246  const int16_t excess = kMarkExcess,
-
247  const bool MSBfirst = true,
-
248  const bool GEThomas = true);
-
249  uint16_t matchManchester(volatile const uint16_t *data_ptr,
-
250  uint64_t *result_ptr,
-
251  const uint16_t remaining,
-
252  const uint16_t nbits,
-
253  const uint16_t hdrmark,
-
254  const uint32_t hdrspace,
-
255  const uint16_t clock_period,
-
256  const uint16_t footermark,
-
257  const uint32_t footerspace,
-
258  const bool atleast = false,
-
259  const uint8_t tolerance = kUseDefTol,
-
260  const int16_t excess = kMarkExcess,
-
261  const bool MSBfirst = true,
-
262  const bool GEThomas = true);
-
263  void crudeNoiseFilter(decode_results *results, const uint16_t floor = 0);
-
264  bool decodeHash(decode_results *results);
-
265 #if DECODE_VOLTAS
-
266  bool decodeVoltas(decode_results *results,
-
267  uint16_t offset = kStartOffset,
-
268  const uint16_t nbits = kVoltasBits,
-
269  const bool strict = true);
-
270 #endif // DECODE_VOLTAS
-
271 #if (DECODE_NEC || DECODE_SHERWOOD || DECODE_AIWA_RC_T501 || DECODE_SANYO)
-
272  bool decodeNEC(decode_results *results, uint16_t offset = kStartOffset,
-
273  const uint16_t nbits = kNECBits, const bool strict = true);
-
274 #endif
-
275 #if DECODE_ARGO
-
276  bool decodeArgo(decode_results *results, uint16_t offset = kStartOffset,
-
277  const uint16_t nbits = kArgoBits, const bool strict = true);
-
278 #endif // DECODE_ARGO
-
279 #if DECODE_SONY
-
280  bool decodeSony(decode_results *results, uint16_t offset = kStartOffset,
-
281  const uint16_t nbits = kSonyMinBits,
-
282  const bool strict = false);
-
283 #endif
-
284 #if DECODE_SANYO
-
285  // DISABLED due to poor quality.
-
286  // bool decodeSanyo(decode_results *results, uint16_t offset = kStartOffset,
-
287  // uint16_t nbits = kSanyoSA8650BBits,
-
288  // bool strict = false);
-
289  bool decodeSanyoLC7461(decode_results *results,
-
290  uint16_t offset = kStartOffset,
-
291  const uint16_t nbits = kSanyoLC7461Bits,
-
292  const bool strict = true);
-
293 #endif
-
294 #if DECODE_SANYO_AC
-
295  bool decodeSanyoAc(decode_results *results,
-
296  uint16_t offset = kStartOffset,
-
297  const uint16_t nbits = kSanyoAcBits,
-
298  const bool strict = true);
-
299 #endif // DECODE_SANYO_AC
-
300 #if DECODE_MITSUBISHI
-
301  bool decodeMitsubishi(decode_results *results, uint16_t offset = kStartOffset,
-
302  const uint16_t nbits = kMitsubishiBits,
-
303  const bool strict = true);
-
304 #endif
-
305 #if DECODE_MITSUBISHI2
-
306  bool decodeMitsubishi2(decode_results *results,
-
307  uint16_t offset = kStartOffset,
-
308  const uint16_t nbits = kMitsubishiBits,
-
309  const bool strict = true);
-
310 #endif
-
311 #if DECODE_MITSUBISHI_AC
-
312  bool decodeMitsubishiAC(decode_results *results,
-
313  uint16_t offset = kStartOffset,
-
314  const uint16_t nbits = kMitsubishiACBits,
-
315  const bool strict = false);
-
316 #endif
-
317 #if DECODE_MITSUBISHI136
-
318  bool decodeMitsubishi136(decode_results *results,
-
319  uint16_t offset = kStartOffset,
-
320  const uint16_t nbits = kMitsubishi136Bits,
-
321  const bool strict = true);
-
322 #endif
-
323 #if DECODE_MITSUBISHI112
-
324  bool decodeMitsubishi112(decode_results *results,
-
325  uint16_t offset = kStartOffset,
-
326  const uint16_t nbits = kMitsubishi112Bits,
-
327  const bool strict = true);
-
328 #endif
-
329 #if DECODE_MITSUBISHIHEAVY
- -
331  uint16_t offset = kStartOffset,
-
332  const uint16_t nbits = kMitsubishiHeavy152Bits,
-
333  const bool strict = true);
-
334 #endif
-
335 #if (DECODE_RC5 || DECODE_RC6 || DECODE_LASERTAG || DECODE_MWM)
-
336  int16_t getRClevel(decode_results *results, uint16_t *offset, uint16_t *used,
-
337  uint16_t bitTime, const uint8_t tolerance = kUseDefTol,
-
338  const int16_t excess = kMarkExcess,
-
339  const uint16_t delta = 0, const uint8_t maxwidth = 3);
-
340 #endif
-
341 #if DECODE_RC5
-
342  bool decodeRC5(decode_results *results, uint16_t offset = kStartOffset,
-
343  const uint16_t nbits = kRC5XBits,
-
344  const bool strict = true);
-
345 #endif
-
346 #if DECODE_RC6
-
347  bool decodeRC6(decode_results *results, uint16_t offset = kStartOffset,
-
348  const uint16_t nbits = kRC6Mode0Bits,
-
349  const bool strict = false);
-
350 #endif
-
351 #if DECODE_RCMM
-
352  bool decodeRCMM(decode_results *results, uint16_t offset = kStartOffset,
-
353  const uint16_t nbits = kRCMMBits,
-
354  const bool strict = false);
-
355 #endif
-
356 #if (DECODE_PANASONIC || DECODE_DENON)
-
357  bool decodePanasonic(decode_results *results, uint16_t offset = kStartOffset,
-
358  const uint16_t nbits = kPanasonicBits,
-
359  const bool strict = false,
-
360  const uint32_t manufacturer = kPanasonicManufacturer);
-
361 #endif
-
362 #if DECODE_LG
-
363  bool decodeLG(decode_results *results, uint16_t offset = kStartOffset,
-
364  const uint16_t nbits = kLgBits,
-
365  const bool strict = false);
-
366 #endif
-
367 #if DECODE_INAX
-
368  bool decodeInax(decode_results *results, uint16_t offset = kStartOffset,
-
369  const uint16_t nbits = kInaxBits,
-
370  const bool strict = true);
-
371 #endif // DECODE_INAX
-
372 #if DECODE_JVC
-
373  bool decodeJVC(decode_results *results, uint16_t offset = kStartOffset,
-
374  const uint16_t nbits = kJvcBits,
-
375  const bool strict = true);
-
376 #endif
-
377 #if DECODE_SAMSUNG
-
378  bool decodeSAMSUNG(decode_results *results, uint16_t offset = kStartOffset,
-
379  const uint16_t nbits = kSamsungBits,
-
380  const bool strict = true);
-
381 #endif
-
382 #if DECODE_SAMSUNG
-
383  bool decodeSamsung36(decode_results *results, uint16_t offset = kStartOffset,
-
384  const uint16_t nbits = kSamsung36Bits,
-
385  const bool strict = true);
-
386 #endif
-
387 #if DECODE_SAMSUNG_AC
-
388  bool decodeSamsungAC(decode_results *results, uint16_t offset = kStartOffset,
-
389  const uint16_t nbits = kSamsungAcBits,
-
390  const bool strict = true);
-
391 #endif
-
392 #if DECODE_WHYNTER
-
393  bool decodeWhynter(decode_results *results, uint16_t offset = kStartOffset,
-
394  const uint16_t nbits = kWhynterBits,
-
395  const bool strict = true);
-
396 #endif
-
397 #if DECODE_COOLIX
-
398  bool decodeCOOLIX(decode_results *results, uint16_t offset = kStartOffset,
-
399  const uint16_t nbits = kCoolixBits,
-
400  const bool strict = true);
-
401 #endif
-
402 #if DECODE_DENON
-
403  bool decodeDenon(decode_results *results, uint16_t offset = kStartOffset,
-
404  const uint16_t nbits = kDenonBits,
-
405  const bool strict = true);
-
406 #endif
-
407 #if DECODE_DISH
-
408  bool decodeDISH(decode_results *results, uint16_t offset = kStartOffset,
-
409  const uint16_t nbits = kDishBits,
-
410  const bool strict = true);
-
411 #endif
-
412 #if (DECODE_SHARP || DECODE_DENON)
-
413  bool decodeSharp(decode_results *results, uint16_t offset = kStartOffset,
-
414  const uint16_t nbits = kSharpBits,
-
415  const bool strict = true, const bool expansion = true);
-
416 #endif
-
417 #if DECODE_SHARP_AC
-
418  bool decodeSharpAc(decode_results *results, uint16_t offset = kStartOffset,
-
419  const uint16_t nbits = kSharpAcBits,
-
420  const bool strict = true);
-
421 #endif
-
422 #if DECODE_AIWA_RC_T501
-
423  bool decodeAiwaRCT501(decode_results *results, uint16_t offset = kStartOffset,
-
424  const uint16_t nbits = kAiwaRcT501Bits,
-
425  const bool strict = true);
-
426 #endif
-
427 #if DECODE_NIKAI
-
428  bool decodeNikai(decode_results *results, uint16_t offset = kStartOffset,
-
429  const uint16_t nbits = kNikaiBits,
-
430  const bool strict = true);
-
431 #endif
-
432 #if DECODE_MAGIQUEST
-
433  bool decodeMagiQuest(decode_results *results, uint16_t offset = kStartOffset,
-
434  const uint16_t nbits = kMagiquestBits,
-
435  const bool strict = true);
-
436 #endif
-
437 #if DECODE_KELVINATOR
-
438  bool decodeKelvinator(decode_results *results, uint16_t offset = kStartOffset,
-
439  const uint16_t nbits = kKelvinatorBits,
-
440  const bool strict = true);
-
441 #endif
-
442 #if DECODE_DAIKIN
-
443  bool decodeDaikin(decode_results *results, uint16_t offset = kStartOffset,
-
444  const uint16_t nbits = kDaikinBits,
-
445  const bool strict = true);
-
446 #endif
-
447 #if DECODE_DAIKIN64
-
448  bool decodeDaikin64(decode_results *results, uint16_t offset = kStartOffset,
-
449  const uint16_t nbits = kDaikin64Bits,
-
450  const bool strict = true);
-
451 #endif // DECODE_DAIKIN64
-
452 #if DECODE_DAIKIN128
-
453  bool decodeDaikin128(decode_results *results, uint16_t offset = kStartOffset,
-
454  const uint16_t nbits = kDaikin128Bits,
-
455  const bool strict = true);
-
456 #endif // DECODE_DAIKIN128
-
457 #if DECODE_DAIKIN152
-
458  bool decodeDaikin152(decode_results *results, uint16_t offset = kStartOffset,
-
459  const uint16_t nbits = kDaikin152Bits,
-
460  const bool strict = true);
-
461 #endif // DECODE_DAIKIN152
-
462 #if DECODE_DAIKIN160
-
463  bool decodeDaikin160(decode_results *results, uint16_t offset = kStartOffset,
-
464  const uint16_t nbits = kDaikin160Bits,
-
465  const bool strict = true);
-
466 #endif // DECODE_DAIKIN160
-
467 #if DECODE_DAIKIN176
-
468  bool decodeDaikin176(decode_results *results, uint16_t offset = kStartOffset,
-
469  const uint16_t nbits = kDaikin176Bits,
-
470  const bool strict = true);
-
471 #endif // DECODE_DAIKIN176
-
472 #if DECODE_DAIKIN2
-
473  bool decodeDaikin2(decode_results *results, uint16_t offset = kStartOffset,
-
474  const uint16_t nbits = kDaikin2Bits,
-
475  const bool strict = true);
-
476 #endif
-
477 #if DECODE_DAIKIN216
-
478  bool decodeDaikin216(decode_results *results, uint16_t offset = kStartOffset,
-
479  const uint16_t nbits = kDaikin216Bits,
-
480  const bool strict = true);
-
481 #endif
-
482 #if DECODE_TOSHIBA_AC
-
483  bool decodeToshibaAC(decode_results *results, uint16_t offset = kStartOffset,
-
484  const uint16_t nbits = kToshibaACBits,
-
485  const bool strict = true);
-
486 #endif
-
487 #if DECODE_TROTEC
-
488  bool decodeTrotec(decode_results *results, uint16_t offset = kStartOffset,
-
489  const uint16_t nbits = kTrotecBits,
-
490  const bool strict = true);
-
491 #endif // DECODE_TROTEC
-
492 #if DECODE_MIDEA
-
493  bool decodeMidea(decode_results *results, uint16_t offset = kStartOffset,
-
494  const uint16_t nbits = kMideaBits,
-
495  const bool strict = true);
-
496 #endif // DECODE_MIDEA
-
497 #if DECODE_MIDEA24
-
498  bool decodeMidea24(decode_results *results, uint16_t offset = kStartOffset,
-
499  const uint16_t nbits = kMidea24Bits,
-
500  const bool strict = true);
-
501 #endif // DECODE_MIDEA24
-
502 #if DECODE_FUJITSU_AC
-
503  bool decodeFujitsuAC(decode_results *results, uint16_t offset = kStartOffset,
-
504  const uint16_t nbits = kFujitsuAcBits,
-
505  const bool strict = false);
-
506 #endif
-
507 #if DECODE_LASERTAG
-
508  bool decodeLasertag(decode_results *results, uint16_t offset = kStartOffset,
-
509  const uint16_t nbits = kLasertagBits,
-
510  const bool strict = true);
-
511 #endif
-
512 #if DECODE_CARRIER_AC
-
513  bool decodeCarrierAC(decode_results *results, uint16_t offset = kStartOffset,
-
514  const uint16_t nbits = kCarrierAcBits,
-
515  const bool strict = true);
-
516 #endif // DECODE_CARRIER_AC
-
517 #if DECODE_CARRIER_AC40
-
518  bool decodeCarrierAC40(decode_results *results,
-
519  uint16_t offset = kStartOffset,
-
520  const uint16_t nbits = kCarrierAc40Bits,
-
521  const bool strict = true);
-
522 #endif // DECODE_CARRIER_AC40
-
523 #if DECODE_CARRIER_AC64
-
524  bool decodeCarrierAC64(decode_results *results,
-
525  uint16_t offset = kStartOffset,
-
526  const uint16_t nbits = kCarrierAc64Bits,
-
527  const bool strict = true);
-
528 #endif // DECODE_CARRIER_AC64
-
529 #if DECODE_GOODWEATHER
-
530  bool decodeGoodweather(decode_results *results,
-
531  uint16_t offset = kStartOffset,
-
532  const uint16_t nbits = kGoodweatherBits,
-
533  const bool strict = true);
-
534 #endif // DECODE_GOODWEATHER
-
535 #if DECODE_GREE
-
536  bool decodeGree(decode_results *results, uint16_t offset = kStartOffset,
-
537  const uint16_t nbits = kGreeBits,
-
538  const bool strict = true);
-
539 #endif
-
540 #if (DECODE_HAIER_AC | DECODE_HAIER_AC_YRW02)
-
541  bool decodeHaierAC(decode_results *results, uint16_t offset = kStartOffset,
-
542  const uint16_t nbits = kHaierACBits,
-
543  const bool strict = true);
-
544 #endif
-
545 #if DECODE_HAIER_AC_YRW02
-
546  bool decodeHaierACYRW02(decode_results *results,
-
547  uint16_t offset = kStartOffset,
-
548  const uint16_t nbits = kHaierACYRW02Bits,
-
549  const bool strict = true);
-
550 #endif
-
551 #if (DECODE_HITACHI_AC || DECODE_HITACHI_AC2 || DECODE_HITACHI_AC344)
-
552  bool decodeHitachiAC(decode_results *results, uint16_t offset = kStartOffset,
-
553  const uint16_t nbits = kHitachiAcBits,
-
554  const bool strict = true, const bool MSBfirst = true);
-
555 #endif
-
556 #if DECODE_HITACHI_AC1
-
557  bool decodeHitachiAC1(decode_results *results, uint16_t offset = kStartOffset,
-
558  const uint16_t nbits = kHitachiAc1Bits,
-
559  const bool strict = true);
-
560 #endif
-
561 #if DECODE_HITACHI_AC3
-
562  bool decodeHitachiAc3(decode_results *results,
-
563  uint16_t offset = kStartOffset,
-
564  const uint16_t nbits = kHitachiAc3Bits,
-
565  const bool strict = true);
-
566 #endif // DECODE_HITACHI_AC3
-
567 #if DECODE_HITACHI_AC424
-
568  bool decodeHitachiAc424(decode_results *results,
-
569  uint16_t offset = kStartOffset,
-
570  const uint16_t nbits = kHitachiAc424Bits,
-
571  const bool strict = true);
-
572 #endif // DECODE_HITACHI_AC424
-
573 #if DECODE_GICABLE
-
574  bool decodeGICable(decode_results *results, uint16_t offset = kStartOffset,
-
575  const uint16_t nbits = kGicableBits,
-
576  const bool strict = true);
-
577 #endif
-
578 #if DECODE_WHIRLPOOL_AC
-
579  bool decodeWhirlpoolAC(decode_results *results,
-
580  uint16_t offset = kStartOffset,
-
581  const uint16_t nbits = kWhirlpoolAcBits,
-
582  const bool strict = true);
-
583 #endif
-
584 #if DECODE_LUTRON
-
585  bool decodeLutron(decode_results *results, uint16_t offset = kStartOffset,
-
586  const uint16_t nbits = kLutronBits,
-
587  const bool strict = true);
-
588 #endif
-
589 #if DECODE_ELECTRA_AC
-
590  bool decodeElectraAC(decode_results *results, uint16_t offset = kStartOffset,
-
591  const uint16_t nbits = kElectraAcBits,
-
592  const bool strict = true);
-
593 #endif
-
594 #if DECODE_PANASONIC_AC
-
595  bool decodePanasonicAC(decode_results *results,
-
596  uint16_t offset = kStartOffset,
-
597  const uint16_t nbits = kPanasonicAcBits,
-
598  const bool strict = true);
-
599 #endif // DECODE_PANASONIC_AC
-
600 #if DECODE_PANASONIC_AC32
-
601  bool decodePanasonicAC32(decode_results *results,
-
602  uint16_t offset = kStartOffset,
-
603  const uint16_t nbits = kPanasonicAc32Bits,
-
604  const bool strict = true);
-
605 #endif // DECODE_PANASONIC_AC32
-
606 #if DECODE_PIONEER
-
607  bool decodePioneer(decode_results *results, uint16_t offset = kStartOffset,
-
608  const uint16_t nbits = kPioneerBits,
-
609  const bool strict = true);
-
610 #endif
-
611 #if DECODE_MWM
-
612  bool decodeMWM(decode_results *results, uint16_t offset = kStartOffset,
-
613  const uint16_t nbits = 24,
-
614  const bool strict = true);
-
615 #endif
-
616 #if DECODE_VESTEL_AC
-
617  bool decodeVestelAc(decode_results *results, uint16_t offset = kStartOffset,
-
618  const uint16_t nbits = kVestelAcBits,
-
619  const bool strict = true);
-
620 #endif
-
621 #if DECODE_TECO
-
622  bool decodeTeco(decode_results *results, uint16_t offset = kStartOffset,
-
623  const uint16_t nbits = kTecoBits,
-
624  const bool strict = false);
-
625 #endif
-
626 #if DECODE_LEGOPF
-
627  bool decodeLegoPf(decode_results *results, uint16_t offset = kStartOffset,
-
628  const uint16_t nbits = kLegoPfBits,
-
629  const bool strict = true);
-
630 #endif
-
631 #if DECODE_NEOCLIMA
-
632  bool decodeNeoclima(decode_results *results, uint16_t offset = kStartOffset,
-
633  const uint16_t nbits = kNeoclimaBits,
-
634  const bool strict = true);
-
635 #endif // DECODE_NEOCLIMA
-
636 #if DECODE_AMCOR
-
637  bool decodeAmcor(decode_results *results, uint16_t offset = kStartOffset,
-
638  const uint16_t nbits = kAmcorBits,
-
639  const bool strict = true);
-
640 #endif // DECODE_AMCOR
-
641 #if DECODE_EPSON
-
642  bool decodeEpson(decode_results *results, uint16_t offset = kStartOffset,
-
643  const uint16_t nbits = kEpsonBits,
-
644  const bool strict = true);
-
645 #endif // DECODE_EPSON
-
646 #if DECODE_SYMPHONY
-
647  bool decodeSymphony(decode_results *results, uint16_t offset = kStartOffset,
-
648  const uint16_t nbits = kSymphonyBits,
-
649  const bool strict = true);
-
650 #endif // DECODE_SYMPHONY
-
651 #if DECODE_AIRWELL
-
652  bool decodeAirwell(decode_results *results, uint16_t offset = kStartOffset,
-
653  const uint16_t nbits = kAirwellBits,
-
654  const bool strict = true);
-
655 #endif // DECODE_AIRWELL
-
656 #if DECODE_DELONGHI_AC
-
657  bool decodeDelonghiAc(decode_results *results, uint16_t offset = kStartOffset,
-
658  const uint16_t nbits = kDelonghiAcBits,
-
659  const bool strict = true);
-
660 #endif // DECODE_DELONGHI_AC
-
661 #if DECODE_DOSHISHA
-
662  bool decodeDoshisha(decode_results *results, uint16_t offset = kStartOffset,
-
663  const uint16_t nbits = kDoshishaBits,
-
664  const bool strict = true);
-
665 #endif // DECODE_DOSHISHA
-
666 #if DECODE_MULTIBRACKETS
-
667  bool decodeMultibrackets(decode_results *results,
-
668  uint16_t offset = kStartOffset,
-
669  const uint16_t nbits = kMultibracketsBits,
-
670  const bool strict = true);
-
671 #endif // DECODE_MULTIBRACKETS
-
672 #if DECODE_TECHNIBEL_AC
-
673  bool decodeTechnibelAc(decode_results *results,
-
674  uint16_t offset = kStartOffset,
-
675  const uint16_t nbits = kTechnibelAcBits,
-
676  const bool strict = true);
-
677 #endif // DECODE_TECHNIBEL_AC
-
678 #if DECODE_CORONA_AC
-
679  bool decodeCoronaAc(decode_results *results, uint16_t offset = kStartOffset,
-
680  const uint16_t nbits = kCoronaAcBitsShort,
-
681  const bool strict = true);
-
682 #endif // DECODE_CORONA_AC
-
683 #if DECODE_ZEPEAL
-
684  bool decodeZepeal(decode_results *results, uint16_t offset = kStartOffset,
-
685  const uint16_t nbits = kZepealBits,
-
686  const bool strict = true);
-
687 #endif // DECODE_ZEPEAL
-
688 #if DECODE_METZ
-
689  bool decodeMetz(decode_results *results, uint16_t offset = kStartOffset,
-
690  const uint16_t nbits = kMetzBits,
-
691  const bool strict = true);
-
692 #endif // DECODE_METZ
-
693 #if DECODE_TRANSCOLD
-
694  bool decodeTranscold(decode_results *results, uint16_t offset = kStartOffset,
-
695  const uint16_t nbits = kTranscoldBits,
-
696  const bool strict = true);
-
697 #endif // DECODE_TRANSCOLD
-
698 #if DECODE_MIRAGE
-
699  bool decodeMirage(decode_results *results,
-
700  uint16_t offset = kStartOffset,
-
701  const uint16_t nbits = kMirageBits,
-
702  const bool strict = true);
-
703 #endif // DECODE_MIRAGE
-
704 #if DECODE_ELITESCREENS
-
705  bool decodeElitescreens(decode_results *results,
-
706  uint16_t offset = kStartOffset,
-
707  const uint16_t nbits = kEliteScreensBits,
-
708  const bool strict = true);
-
709 #endif // DECODE_ELITESCREENS
-
710 };
-
711 
-
712 #endif // IRRECV_H_
+
195  const bool MSBfirst = true,
+
196  const bool expectlastspace = true);
+
197  uint16_t matchBytes(volatile uint16_t *data_ptr, uint8_t *result_ptr,
+
198  const uint16_t remaining, const uint16_t nbytes,
+
199  const uint16_t onemark, const uint32_t onespace,
+
200  const uint16_t zeromark, const uint32_t zerospace,
+
201  const uint8_t tolerance = kUseDefTol,
+
202  const int16_t excess = kMarkExcess,
+
203  const bool MSBfirst = true,
+
204  const bool expectlastspace = true);
+
205  uint16_t matchGeneric(volatile uint16_t *data_ptr,
+
206  uint64_t *result_ptr,
+
207  const uint16_t remaining, const uint16_t nbits,
+
208  const uint16_t hdrmark, const uint32_t hdrspace,
+
209  const uint16_t onemark, const uint32_t onespace,
+
210  const uint16_t zeromark, const uint32_t zerospace,
+
211  const uint16_t footermark, const uint32_t footerspace,
+
212  const bool atleast = false,
+
213  const uint8_t tolerance = kUseDefTol,
+
214  const int16_t excess = kMarkExcess,
+
215  const bool MSBfirst = true);
+
216  uint16_t matchGeneric(volatile uint16_t *data_ptr, uint8_t *result_ptr,
+
217  const uint16_t remaining, const uint16_t nbits,
+
218  const uint16_t hdrmark, const uint32_t hdrspace,
+
219  const uint16_t onemark, const uint32_t onespace,
+
220  const uint16_t zeromark, const uint32_t zerospace,
+
221  const uint16_t footermark,
+
222  const uint32_t footerspace,
+
223  const bool atleast = false,
+
224  const uint8_t tolerance = kUseDefTol,
+
225  const int16_t excess = kMarkExcess,
+
226  const bool MSBfirst = true);
+
227  uint16_t matchGenericConstBitTime(volatile uint16_t *data_ptr,
+
228  uint64_t *result_ptr,
+
229  const uint16_t remaining,
+
230  const uint16_t nbits,
+
231  const uint16_t hdrmark,
+
232  const uint32_t hdrspace,
+
233  const uint16_t one,
+
234  const uint32_t zero,
+
235  const uint16_t footermark,
+
236  const uint32_t footerspace,
+
237  const bool atleast = false,
+
238  const uint8_t tolerance = kUseDefTol,
+
239  const int16_t excess = kMarkExcess,
+
240  const bool MSBfirst = true);
+
241  uint16_t matchManchesterData(volatile const uint16_t *data_ptr,
+
242  uint64_t *result_ptr,
+
243  const uint16_t remaining,
+
244  const uint16_t nbits,
+
245  const uint16_t half_period,
+
246  const uint16_t starting_balance = 0,
+
247  const uint8_t tolerance = kUseDefTol,
+
248  const int16_t excess = kMarkExcess,
+
249  const bool MSBfirst = true,
+
250  const bool GEThomas = true);
+
251  uint16_t matchManchester(volatile const uint16_t *data_ptr,
+
252  uint64_t *result_ptr,
+
253  const uint16_t remaining,
+
254  const uint16_t nbits,
+
255  const uint16_t hdrmark,
+
256  const uint32_t hdrspace,
+
257  const uint16_t clock_period,
+
258  const uint16_t footermark,
+
259  const uint32_t footerspace,
+
260  const bool atleast = false,
+
261  const uint8_t tolerance = kUseDefTol,
+
262  const int16_t excess = kMarkExcess,
+
263  const bool MSBfirst = true,
+
264  const bool GEThomas = true);
+
265  void crudeNoiseFilter(decode_results *results, const uint16_t floor = 0);
+
266  bool decodeHash(decode_results *results);
+
267 #if DECODE_VOLTAS
+
268  bool decodeVoltas(decode_results *results,
+
269  uint16_t offset = kStartOffset,
+
270  const uint16_t nbits = kVoltasBits,
+
271  const bool strict = true);
+
272 #endif // DECODE_VOLTAS
+
273 #if (DECODE_NEC || DECODE_SHERWOOD || DECODE_AIWA_RC_T501 || DECODE_SANYO)
+
274  bool decodeNEC(decode_results *results, uint16_t offset = kStartOffset,
+
275  const uint16_t nbits = kNECBits, const bool strict = true);
+
276 #endif
+
277 #if DECODE_ARGO
+
278  bool decodeArgo(decode_results *results, uint16_t offset = kStartOffset,
+
279  const uint16_t nbits = kArgoBits, const bool strict = true);
+
280 #endif // DECODE_ARGO
+
281 #if DECODE_SONY
+
282  bool decodeSony(decode_results *results, uint16_t offset = kStartOffset,
+
283  const uint16_t nbits = kSonyMinBits,
+
284  const bool strict = false);
+
285 #endif
+
286 #if DECODE_SANYO
+
287  // DISABLED due to poor quality.
+
288  // bool decodeSanyo(decode_results *results, uint16_t offset = kStartOffset,
+
289  // uint16_t nbits = kSanyoSA8650BBits,
+
290  // bool strict = false);
+
291  bool decodeSanyoLC7461(decode_results *results,
+
292  uint16_t offset = kStartOffset,
+
293  const uint16_t nbits = kSanyoLC7461Bits,
+
294  const bool strict = true);
+
295 #endif
+
296 #if DECODE_SANYO_AC
+
297  bool decodeSanyoAc(decode_results *results,
+
298  uint16_t offset = kStartOffset,
+
299  const uint16_t nbits = kSanyoAcBits,
+
300  const bool strict = true);
+
301 #endif // DECODE_SANYO_AC
+
302 #if DECODE_MITSUBISHI
+
303  bool decodeMitsubishi(decode_results *results, uint16_t offset = kStartOffset,
+
304  const uint16_t nbits = kMitsubishiBits,
+
305  const bool strict = true);
+
306 #endif
+
307 #if DECODE_MITSUBISHI2
+
308  bool decodeMitsubishi2(decode_results *results,
+
309  uint16_t offset = kStartOffset,
+
310  const uint16_t nbits = kMitsubishiBits,
+
311  const bool strict = true);
+
312 #endif
+
313 #if DECODE_MITSUBISHI_AC
+
314  bool decodeMitsubishiAC(decode_results *results,
+
315  uint16_t offset = kStartOffset,
+
316  const uint16_t nbits = kMitsubishiACBits,
+
317  const bool strict = false);
+
318 #endif
+
319 #if DECODE_MITSUBISHI136
+
320  bool decodeMitsubishi136(decode_results *results,
+
321  uint16_t offset = kStartOffset,
+
322  const uint16_t nbits = kMitsubishi136Bits,
+
323  const bool strict = true);
+
324 #endif
+
325 #if DECODE_MITSUBISHI112
+
326  bool decodeMitsubishi112(decode_results *results,
+
327  uint16_t offset = kStartOffset,
+
328  const uint16_t nbits = kMitsubishi112Bits,
+
329  const bool strict = true);
+
330 #endif
+
331 #if DECODE_MITSUBISHIHEAVY
+ +
333  uint16_t offset = kStartOffset,
+
334  const uint16_t nbits = kMitsubishiHeavy152Bits,
+
335  const bool strict = true);
+
336 #endif
+
337 #if (DECODE_RC5 || DECODE_RC6 || DECODE_LASERTAG || DECODE_MWM)
+
338  int16_t getRClevel(decode_results *results, uint16_t *offset, uint16_t *used,
+
339  uint16_t bitTime, const uint8_t tolerance = kUseDefTol,
+
340  const int16_t excess = kMarkExcess,
+
341  const uint16_t delta = 0, const uint8_t maxwidth = 3);
+
342 #endif
+
343 #if DECODE_RC5
+
344  bool decodeRC5(decode_results *results, uint16_t offset = kStartOffset,
+
345  const uint16_t nbits = kRC5XBits,
+
346  const bool strict = true);
+
347 #endif
+
348 #if DECODE_RC6
+
349  bool decodeRC6(decode_results *results, uint16_t offset = kStartOffset,
+
350  const uint16_t nbits = kRC6Mode0Bits,
+
351  const bool strict = false);
+
352 #endif
+
353 #if DECODE_RCMM
+
354  bool decodeRCMM(decode_results *results, uint16_t offset = kStartOffset,
+
355  const uint16_t nbits = kRCMMBits,
+
356  const bool strict = false);
+
357 #endif
+
358 #if (DECODE_PANASONIC || DECODE_DENON)
+
359  bool decodePanasonic(decode_results *results, uint16_t offset = kStartOffset,
+
360  const uint16_t nbits = kPanasonicBits,
+
361  const bool strict = false,
+
362  const uint32_t manufacturer = kPanasonicManufacturer);
+
363 #endif
+
364 #if DECODE_LG
+
365  bool decodeLG(decode_results *results, uint16_t offset = kStartOffset,
+
366  const uint16_t nbits = kLgBits,
+
367  const bool strict = false);
+
368 #endif
+
369 #if DECODE_INAX
+
370  bool decodeInax(decode_results *results, uint16_t offset = kStartOffset,
+
371  const uint16_t nbits = kInaxBits,
+
372  const bool strict = true);
+
373 #endif // DECODE_INAX
+
374 #if DECODE_JVC
+
375  bool decodeJVC(decode_results *results, uint16_t offset = kStartOffset,
+
376  const uint16_t nbits = kJvcBits,
+
377  const bool strict = true);
+
378 #endif
+
379 #if DECODE_SAMSUNG
+
380  bool decodeSAMSUNG(decode_results *results, uint16_t offset = kStartOffset,
+
381  const uint16_t nbits = kSamsungBits,
+
382  const bool strict = true);
+
383 #endif
+
384 #if DECODE_SAMSUNG
+
385  bool decodeSamsung36(decode_results *results, uint16_t offset = kStartOffset,
+
386  const uint16_t nbits = kSamsung36Bits,
+
387  const bool strict = true);
+
388 #endif
+
389 #if DECODE_SAMSUNG_AC
+
390  bool decodeSamsungAC(decode_results *results, uint16_t offset = kStartOffset,
+
391  const uint16_t nbits = kSamsungAcBits,
+
392  const bool strict = true);
+
393 #endif
+
394 #if DECODE_WHYNTER
+
395  bool decodeWhynter(decode_results *results, uint16_t offset = kStartOffset,
+
396  const uint16_t nbits = kWhynterBits,
+
397  const bool strict = true);
+
398 #endif
+
399 #if DECODE_COOLIX
+
400  bool decodeCOOLIX(decode_results *results, uint16_t offset = kStartOffset,
+
401  const uint16_t nbits = kCoolixBits,
+
402  const bool strict = true);
+
403 #endif
+
404 #if DECODE_DENON
+
405  bool decodeDenon(decode_results *results, uint16_t offset = kStartOffset,
+
406  const uint16_t nbits = kDenonBits,
+
407  const bool strict = true);
+
408 #endif
+
409 #if DECODE_DISH
+
410  bool decodeDISH(decode_results *results, uint16_t offset = kStartOffset,
+
411  const uint16_t nbits = kDishBits,
+
412  const bool strict = true);
+
413 #endif
+
414 #if (DECODE_SHARP || DECODE_DENON)
+
415  bool decodeSharp(decode_results *results, uint16_t offset = kStartOffset,
+
416  const uint16_t nbits = kSharpBits,
+
417  const bool strict = true, const bool expansion = true);
+
418 #endif
+
419 #if DECODE_SHARP_AC
+
420  bool decodeSharpAc(decode_results *results, uint16_t offset = kStartOffset,
+
421  const uint16_t nbits = kSharpAcBits,
+
422  const bool strict = true);
+
423 #endif
+
424 #if DECODE_AIWA_RC_T501
+
425  bool decodeAiwaRCT501(decode_results *results, uint16_t offset = kStartOffset,
+
426  const uint16_t nbits = kAiwaRcT501Bits,
+
427  const bool strict = true);
+
428 #endif
+
429 #if DECODE_NIKAI
+
430  bool decodeNikai(decode_results *results, uint16_t offset = kStartOffset,
+
431  const uint16_t nbits = kNikaiBits,
+
432  const bool strict = true);
+
433 #endif
+
434 #if DECODE_MAGIQUEST
+
435  bool decodeMagiQuest(decode_results *results, uint16_t offset = kStartOffset,
+
436  const uint16_t nbits = kMagiquestBits,
+
437  const bool strict = true);
+
438 #endif
+
439 #if DECODE_KELVINATOR
+
440  bool decodeKelvinator(decode_results *results, uint16_t offset = kStartOffset,
+
441  const uint16_t nbits = kKelvinatorBits,
+
442  const bool strict = true);
+
443 #endif
+
444 #if DECODE_DAIKIN
+
445  bool decodeDaikin(decode_results *results, uint16_t offset = kStartOffset,
+
446  const uint16_t nbits = kDaikinBits,
+
447  const bool strict = true);
+
448 #endif
+
449 #if DECODE_DAIKIN64
+
450  bool decodeDaikin64(decode_results *results, uint16_t offset = kStartOffset,
+
451  const uint16_t nbits = kDaikin64Bits,
+
452  const bool strict = true);
+
453 #endif // DECODE_DAIKIN64
+
454 #if DECODE_DAIKIN128
+
455  bool decodeDaikin128(decode_results *results, uint16_t offset = kStartOffset,
+
456  const uint16_t nbits = kDaikin128Bits,
+
457  const bool strict = true);
+
458 #endif // DECODE_DAIKIN128
+
459 #if DECODE_DAIKIN152
+
460  bool decodeDaikin152(decode_results *results, uint16_t offset = kStartOffset,
+
461  const uint16_t nbits = kDaikin152Bits,
+
462  const bool strict = true);
+
463 #endif // DECODE_DAIKIN152
+
464 #if DECODE_DAIKIN160
+
465  bool decodeDaikin160(decode_results *results, uint16_t offset = kStartOffset,
+
466  const uint16_t nbits = kDaikin160Bits,
+
467  const bool strict = true);
+
468 #endif // DECODE_DAIKIN160
+
469 #if DECODE_DAIKIN176
+
470  bool decodeDaikin176(decode_results *results, uint16_t offset = kStartOffset,
+
471  const uint16_t nbits = kDaikin176Bits,
+
472  const bool strict = true);
+
473 #endif // DECODE_DAIKIN176
+
474 #if DECODE_DAIKIN2
+
475  bool decodeDaikin2(decode_results *results, uint16_t offset = kStartOffset,
+
476  const uint16_t nbits = kDaikin2Bits,
+
477  const bool strict = true);
+
478 #endif
+
479 #if DECODE_DAIKIN216
+
480  bool decodeDaikin216(decode_results *results, uint16_t offset = kStartOffset,
+
481  const uint16_t nbits = kDaikin216Bits,
+
482  const bool strict = true);
+
483 #endif
+
484 #if DECODE_TOSHIBA_AC
+
485  bool decodeToshibaAC(decode_results *results, uint16_t offset = kStartOffset,
+
486  const uint16_t nbits = kToshibaACBits,
+
487  const bool strict = true);
+
488 #endif
+
489 #if DECODE_TROTEC
+
490  bool decodeTrotec(decode_results *results, uint16_t offset = kStartOffset,
+
491  const uint16_t nbits = kTrotecBits,
+
492  const bool strict = true);
+
493 #endif // DECODE_TROTEC
+
494 #if DECODE_MIDEA
+
495  bool decodeMidea(decode_results *results, uint16_t offset = kStartOffset,
+
496  const uint16_t nbits = kMideaBits,
+
497  const bool strict = true);
+
498 #endif // DECODE_MIDEA
+
499 #if DECODE_MIDEA24
+
500  bool decodeMidea24(decode_results *results, uint16_t offset = kStartOffset,
+
501  const uint16_t nbits = kMidea24Bits,
+
502  const bool strict = true);
+
503 #endif // DECODE_MIDEA24
+
504 #if DECODE_FUJITSU_AC
+
505  bool decodeFujitsuAC(decode_results *results, uint16_t offset = kStartOffset,
+
506  const uint16_t nbits = kFujitsuAcBits,
+
507  const bool strict = false);
+
508 #endif
+
509 #if DECODE_LASERTAG
+
510  bool decodeLasertag(decode_results *results, uint16_t offset = kStartOffset,
+
511  const uint16_t nbits = kLasertagBits,
+
512  const bool strict = true);
+
513 #endif
+
514 #if DECODE_MILESTAG2
+
515  bool decodeMilestag2(decode_results *results, uint16_t offset = kStartOffset,
+
516  const uint16_t nbits = kMilesTag2ShotBits,
+
517  const bool strict = true);
+
518 #endif
+
519 #if DECODE_CARRIER_AC
+
520  bool decodeCarrierAC(decode_results *results, uint16_t offset = kStartOffset,
+
521  const uint16_t nbits = kCarrierAcBits,
+
522  const bool strict = true);
+
523 #endif // DECODE_CARRIER_AC
+
524 #if DECODE_CARRIER_AC40
+
525  bool decodeCarrierAC40(decode_results *results,
+
526  uint16_t offset = kStartOffset,
+
527  const uint16_t nbits = kCarrierAc40Bits,
+
528  const bool strict = true);
+
529 #endif // DECODE_CARRIER_AC40
+
530 #if DECODE_CARRIER_AC64
+
531  bool decodeCarrierAC64(decode_results *results,
+
532  uint16_t offset = kStartOffset,
+
533  const uint16_t nbits = kCarrierAc64Bits,
+
534  const bool strict = true);
+
535 #endif // DECODE_CARRIER_AC64
+
536 #if DECODE_GOODWEATHER
+
537  bool decodeGoodweather(decode_results *results,
+
538  uint16_t offset = kStartOffset,
+
539  const uint16_t nbits = kGoodweatherBits,
+
540  const bool strict = true);
+
541 #endif // DECODE_GOODWEATHER
+
542 #if DECODE_GREE
+
543  bool decodeGree(decode_results *results, uint16_t offset = kStartOffset,
+
544  const uint16_t nbits = kGreeBits,
+
545  const bool strict = true);
+
546 #endif
+
547 #if (DECODE_HAIER_AC | DECODE_HAIER_AC_YRW02)
+
548  bool decodeHaierAC(decode_results *results, uint16_t offset = kStartOffset,
+
549  const uint16_t nbits = kHaierACBits,
+
550  const bool strict = true);
+
551 #endif
+
552 #if DECODE_HAIER_AC_YRW02
+
553  bool decodeHaierACYRW02(decode_results *results,
+
554  uint16_t offset = kStartOffset,
+
555  const uint16_t nbits = kHaierACYRW02Bits,
+
556  const bool strict = true);
+
557 #endif
+
558 #if (DECODE_HITACHI_AC || DECODE_HITACHI_AC2 || DECODE_HITACHI_AC344)
+
559  bool decodeHitachiAC(decode_results *results, uint16_t offset = kStartOffset,
+
560  const uint16_t nbits = kHitachiAcBits,
+
561  const bool strict = true, const bool MSBfirst = true);
+
562 #endif
+
563 #if DECODE_HITACHI_AC1
+
564  bool decodeHitachiAC1(decode_results *results, uint16_t offset = kStartOffset,
+
565  const uint16_t nbits = kHitachiAc1Bits,
+
566  const bool strict = true);
+
567 #endif
+
568 #if DECODE_HITACHI_AC3
+
569  bool decodeHitachiAc3(decode_results *results,
+
570  uint16_t offset = kStartOffset,
+
571  const uint16_t nbits = kHitachiAc3Bits,
+
572  const bool strict = true);
+
573 #endif // DECODE_HITACHI_AC3
+
574 #if DECODE_HITACHI_AC424
+
575  bool decodeHitachiAc424(decode_results *results,
+
576  uint16_t offset = kStartOffset,
+
577  const uint16_t nbits = kHitachiAc424Bits,
+
578  const bool strict = true);
+
579 #endif // DECODE_HITACHI_AC424
+
580 #if DECODE_GICABLE
+
581  bool decodeGICable(decode_results *results, uint16_t offset = kStartOffset,
+
582  const uint16_t nbits = kGicableBits,
+
583  const bool strict = true);
+
584 #endif
+
585 #if DECODE_WHIRLPOOL_AC
+
586  bool decodeWhirlpoolAC(decode_results *results,
+
587  uint16_t offset = kStartOffset,
+
588  const uint16_t nbits = kWhirlpoolAcBits,
+
589  const bool strict = true);
+
590 #endif
+
591 #if DECODE_LUTRON
+
592  bool decodeLutron(decode_results *results, uint16_t offset = kStartOffset,
+
593  const uint16_t nbits = kLutronBits,
+
594  const bool strict = true);
+
595 #endif
+
596 #if DECODE_ELECTRA_AC
+
597  bool decodeElectraAC(decode_results *results, uint16_t offset = kStartOffset,
+
598  const uint16_t nbits = kElectraAcBits,
+
599  const bool strict = true);
+
600 #endif
+
601 #if DECODE_PANASONIC_AC
+
602  bool decodePanasonicAC(decode_results *results,
+
603  uint16_t offset = kStartOffset,
+
604  const uint16_t nbits = kPanasonicAcBits,
+
605  const bool strict = true);
+
606 #endif // DECODE_PANASONIC_AC
+
607 #if DECODE_PANASONIC_AC32
+
608  bool decodePanasonicAC32(decode_results *results,
+
609  uint16_t offset = kStartOffset,
+
610  const uint16_t nbits = kPanasonicAc32Bits,
+
611  const bool strict = true);
+
612 #endif // DECODE_PANASONIC_AC32
+
613 #if DECODE_PIONEER
+
614  bool decodePioneer(decode_results *results, uint16_t offset = kStartOffset,
+
615  const uint16_t nbits = kPioneerBits,
+
616  const bool strict = true);
+
617 #endif
+
618 #if DECODE_MWM
+
619  bool decodeMWM(decode_results *results, uint16_t offset = kStartOffset,
+
620  const uint16_t nbits = 24,
+
621  const bool strict = true);
+
622 #endif
+
623 #if DECODE_VESTEL_AC
+
624  bool decodeVestelAc(decode_results *results, uint16_t offset = kStartOffset,
+
625  const uint16_t nbits = kVestelAcBits,
+
626  const bool strict = true);
+
627 #endif
+
628 #if DECODE_TECO
+
629  bool decodeTeco(decode_results *results, uint16_t offset = kStartOffset,
+
630  const uint16_t nbits = kTecoBits,
+
631  const bool strict = false);
+
632 #endif
+
633 #if DECODE_LEGOPF
+
634  bool decodeLegoPf(decode_results *results, uint16_t offset = kStartOffset,
+
635  const uint16_t nbits = kLegoPfBits,
+
636  const bool strict = true);
+
637 #endif
+
638 #if DECODE_NEOCLIMA
+
639  bool decodeNeoclima(decode_results *results, uint16_t offset = kStartOffset,
+
640  const uint16_t nbits = kNeoclimaBits,
+
641  const bool strict = true);
+
642 #endif // DECODE_NEOCLIMA
+
643 #if DECODE_AMCOR
+
644  bool decodeAmcor(decode_results *results, uint16_t offset = kStartOffset,
+
645  const uint16_t nbits = kAmcorBits,
+
646  const bool strict = true);
+
647 #endif // DECODE_AMCOR
+
648 #if DECODE_EPSON
+
649  bool decodeEpson(decode_results *results, uint16_t offset = kStartOffset,
+
650  const uint16_t nbits = kEpsonBits,
+
651  const bool strict = true);
+
652 #endif // DECODE_EPSON
+
653 #if DECODE_SYMPHONY
+
654  bool decodeSymphony(decode_results *results, uint16_t offset = kStartOffset,
+
655  const uint16_t nbits = kSymphonyBits,
+
656  const bool strict = true);
+
657 #endif // DECODE_SYMPHONY
+
658 #if DECODE_AIRWELL
+
659  bool decodeAirwell(decode_results *results, uint16_t offset = kStartOffset,
+
660  const uint16_t nbits = kAirwellBits,
+
661  const bool strict = true);
+
662 #endif // DECODE_AIRWELL
+
663 #if DECODE_DELONGHI_AC
+
664  bool decodeDelonghiAc(decode_results *results, uint16_t offset = kStartOffset,
+
665  const uint16_t nbits = kDelonghiAcBits,
+
666  const bool strict = true);
+
667 #endif // DECODE_DELONGHI_AC
+
668 #if DECODE_DOSHISHA
+
669  bool decodeDoshisha(decode_results *results, uint16_t offset = kStartOffset,
+
670  const uint16_t nbits = kDoshishaBits,
+
671  const bool strict = true);
+
672 #endif // DECODE_DOSHISHA
+
673 #if DECODE_MULTIBRACKETS
+
674  bool decodeMultibrackets(decode_results *results,
+
675  uint16_t offset = kStartOffset,
+
676  const uint16_t nbits = kMultibracketsBits,
+
677  const bool strict = true);
+
678 #endif // DECODE_MULTIBRACKETS
+
679 #if DECODE_TECHNIBEL_AC
+
680  bool decodeTechnibelAc(decode_results *results,
+
681  uint16_t offset = kStartOffset,
+
682  const uint16_t nbits = kTechnibelAcBits,
+
683  const bool strict = true);
+
684 #endif // DECODE_TECHNIBEL_AC
+
685 #if DECODE_CORONA_AC
+
686  bool decodeCoronaAc(decode_results *results, uint16_t offset = kStartOffset,
+
687  const uint16_t nbits = kCoronaAcBitsShort,
+
688  const bool strict = true);
+
689 #endif // DECODE_CORONA_AC
+
690 #if DECODE_ZEPEAL
+
691  bool decodeZepeal(decode_results *results, uint16_t offset = kStartOffset,
+
692  const uint16_t nbits = kZepealBits,
+
693  const bool strict = true);
+
694 #endif // DECODE_ZEPEAL
+
695 #if DECODE_METZ
+
696  bool decodeMetz(decode_results *results, uint16_t offset = kStartOffset,
+
697  const uint16_t nbits = kMetzBits,
+
698  const bool strict = true);
+
699 #endif // DECODE_METZ
+
700 #if DECODE_TRANSCOLD
+
701  bool decodeTranscold(decode_results *results, uint16_t offset = kStartOffset,
+
702  const uint16_t nbits = kTranscoldBits,
+
703  const bool strict = true);
+
704 #endif // DECODE_TRANSCOLD
+
705 #if DECODE_MIRAGE
+
706  bool decodeMirage(decode_results *results,
+
707  uint16_t offset = kStartOffset,
+
708  const uint16_t nbits = kMirageBits,
+
709  const bool strict = true);
+
710 #endif // DECODE_MIRAGE
+
711 #if DECODE_ELITESCREENS
+
712  bool decodeElitescreens(decode_results *results,
+
713  uint16_t offset = kStartOffset,
+
714  const uint16_t nbits = kEliteScreensBits,
+
715  const bool strict = true);
+
716 #endif // DECODE_ELITESCREENS
+
717 #if DECODE_ECOCLIM
+
718  bool decodeEcoclim(decode_results *results, uint16_t offset = kStartOffset,
+
719  const uint16_t nbits = kEcoclimBits,
+
720  const bool strict = true);
+
721 #endif // DECODE_ECOCLIM
+
722 };
+
723 
+
724 #endif // IRRECV_H_
bool decodeMultibrackets(decode_results *results, uint16_t offset=kStartOffset, const uint16_t nbits=kMultibracketsBits, const bool strict=true)
Decode the Multibrackets message. Status: BETA / Appears to be working.
Definition: ir_Multibrackets.cpp:59
-
const uint16_t kDelonghiAcBits
Definition: IRremoteESP8266.h:926
-
bool decodeMitsubishi(decode_results *results, uint16_t offset=kStartOffset, const uint16_t nbits=kMitsubishiBits, const bool strict=true)
Decode the supplied Mitsubishi 16-bit message. Status: STABLE / Working.
Definition: ir_Mitsubishi.cpp:121
-
const uint16_t kMirageBits
Definition: IRremoteESP8266.h:998
+
uint16_t matchBytes(volatile uint16_t *data_ptr, uint8_t *result_ptr, const uint16_t remaining, const uint16_t nbytes, const uint16_t onemark, const uint32_t onespace, const uint16_t zeromark, const uint32_t zerospace, const uint8_t tolerance=kUseDefTol, const int16_t excess=kMarkExcess, const bool MSBfirst=true, const bool expectlastspace=true)
Match & decode the typical data section of an IR message. The bytes are stored at result_ptr....
Definition: IRrecv.cpp:1282
+
const uint16_t kDelonghiAcBits
Definition: IRremoteESP8266.h:942
+
bool decodeMitsubishi(decode_results *results, uint16_t offset=kStartOffset, const uint16_t nbits=kMitsubishiBits, const bool strict=true)
Decode the supplied Mitsubishi 16-bit message. Status: STABLE / Working.
Definition: ir_Mitsubishi.cpp:126
+
const uint16_t kMirageBits
Definition: IRremoteESP8266.h:1016
bool decodeHaierAC(decode_results *results, uint16_t offset=kStartOffset, const uint16_t nbits=kHaierACBits, const bool strict=true)
Decode the supplied Haier HSU07-HEA03 remote message. Status: STABLE / Known to be working.
Definition: ir_Haier.cpp:974
bool decodeNEC(decode_results *results, uint16_t offset=kStartOffset, const uint16_t nbits=kNECBits, const bool strict=true)
Decode the supplied NEC (Renesas) message. Status: STABLE / Known good.
Definition: ir_NEC.cpp:81
const uint32_t kFnvPrime32
Definition: IRrecv.h:52
bool overflow
Definition: IRrecv.h:109
-
bool decodeDaikin128(decode_results *results, uint16_t offset=kStartOffset, const uint16_t nbits=kDaikin128Bits, const bool strict=true)
Decode the supplied Daikin 128-bit message. (DAIKIN128) Status: STABLE / Known Working.
Definition: ir_Daikin.cpp:3029
-
const uint16_t kGicableBits
Definition: IRremoteESP8266.h:948
-
uint16_t matchGeneric(volatile uint16_t *data_ptr, uint64_t *result_ptr, const uint16_t remaining, const uint16_t nbits, const uint16_t hdrmark, const uint32_t hdrspace, const uint16_t onemark, const uint32_t onespace, const uint16_t zeromark, const uint32_t zerospace, const uint16_t footermark, const uint32_t footerspace, const bool atleast=false, const uint8_t tolerance=kUseDefTol, const int16_t excess=kMarkExcess, const bool MSBfirst=true)
Match & decode a generic/typical <= 64bit IR message. The data is stored at result_ptr.
Definition: IRrecv.cpp:1399
-
decode_type_t
Enumerator for defining and numbering of supported IR protocol.
Definition: IRremoteESP8266.h:771
-
const uint16_t kCarrierAcBits
Definition: IRremoteESP8266.h:891
-
bool decodeTranscold(decode_results *results, uint16_t offset=kStartOffset, const uint16_t nbits=kTranscoldBits, const bool strict=true)
Decode the supplied Transcold A/C message. Status: STABLE / Known Working.
Definition: ir_Transcold.cpp:482
+
bool decodeDaikin128(decode_results *results, uint16_t offset=kStartOffset, const uint16_t nbits=kDaikin128Bits, const bool strict=true)
Decode the supplied Daikin 128-bit message. (DAIKIN128) Status: STABLE / Known Working.
Definition: ir_Daikin.cpp:3001
+
const uint16_t kGicableBits
Definition: IRremoteESP8266.h:966
+
uint16_t matchGeneric(volatile uint16_t *data_ptr, uint64_t *result_ptr, const uint16_t remaining, const uint16_t nbits, const uint16_t hdrmark, const uint32_t hdrspace, const uint16_t onemark, const uint32_t onespace, const uint16_t zeromark, const uint32_t zerospace, const uint16_t footermark, const uint32_t footerspace, const bool atleast=false, const uint8_t tolerance=kUseDefTol, const int16_t excess=kMarkExcess, const bool MSBfirst=true)
Match & decode a generic/typical <= 64bit IR message. The data is stored at result_ptr.
Definition: IRrecv.cpp:1436
+
decode_type_t
Enumerator for defining and numbering of supported IR protocol.
Definition: IRremoteESP8266.h:785
+
const uint16_t kCarrierAcBits
Definition: IRremoteESP8266.h:907
+
bool decodeTranscold(decode_results *results, uint16_t offset=kStartOffset, const uint16_t nbits=kTranscoldBits, const bool strict=true)
Decode the supplied Transcold A/C message. Status: STABLE / Known Working.
Definition: ir_Transcold.cpp:447
int16_t getRClevel(decode_results *results, uint16_t *offset, uint16_t *used, uint16_t bitTime, const uint8_t tolerance=kUseDefTol, const int16_t excess=kMarkExcess, const uint16_t delta=0, const uint8_t maxwidth=3)
Gets one undecoded level at a time from the raw buffer. The RC5/6 decoding is easier if the data is b...
Definition: ir_RC5_RC6.cpp:243
-
const uint16_t kMultibracketsBits
Definition: IRremoteESP8266.h:1019
-
const uint16_t kSharpAcBits
Definition: IRremoteESP8266.h:1060
-
const uint16_t kWhynterBits
Definition: IRremoteESP8266.h:1091
-
bool decodeSanyoAc(decode_results *results, uint16_t offset=kStartOffset, const uint16_t nbits=kSanyoAcBits, const bool strict=true)
Decode the supplied SanyoAc message. Status: STABLE / Reported as working.
Definition: ir_Sanyo.cpp:272
+
const uint16_t kMultibracketsBits
Definition: IRremoteESP8266.h:1037
+
const uint16_t kSharpAcBits
Definition: IRremoteESP8266.h:1078
+
const uint16_t kWhynterBits
Definition: IRremoteESP8266.h:1109
+
bool decodeSanyoAc(decode_results *results, uint16_t offset=kStartOffset, const uint16_t nbits=kSanyoAcBits, const bool strict=true)
Decode the supplied SanyoAc message. Status: STABLE / Reported as working.
Definition: ir_Sanyo.cpp:273
uint8_t overflow
Definition: IRrecv.h:78
-
bool decodeMitsubishi2(decode_results *results, uint16_t offset=kStartOffset, const uint16_t nbits=kMitsubishiBits, const bool strict=true)
Decode the supplied second variation of a Mitsubishi 16-bit message. Status: STABLE / Working.
Definition: ir_Mitsubishi.cpp:186
+
bool decodeMitsubishi2(decode_results *results, uint16_t offset=kStartOffset, const uint16_t nbits=kMitsubishiBits, const bool strict=true)
Decode the supplied second variation of a Mitsubishi 16-bit message. Status: STABLE / Working.
Definition: ir_Mitsubishi.cpp:191
bool decodeGree(decode_results *results, uint16_t offset=kStartOffset, const uint16_t nbits=kGreeBits, const bool strict=true)
Decode the supplied Gree HVAC message. Status: STABLE / Working.
Definition: ir_Gree.cpp:659
-
const uint16_t kAirwellBits
Definition: IRremoteESP8266.h:878
+
const uint16_t kAirwellBits
Definition: IRremoteESP8266.h:894
irparams_t * irparams_save
Definition: IRrecv.h:151
-
const uint16_t kMitsubishiACBits
Definition: IRremoteESP8266.h:1005
-
bool decodeFujitsuAC(decode_results *results, uint16_t offset=kStartOffset, const uint16_t nbits=kFujitsuAcBits, const bool strict=false)
Decode the supplied Fujitsu AC IR message if possible. Status: STABLE / Working.
Definition: ir_Fujitsu.cpp:892
-
const uint16_t kTechnibelAcBits
Definition: IRremoteESP8266.h:928
+
const uint16_t kMitsubishiACBits
Definition: IRremoteESP8266.h:1023
+
bool decodeFujitsuAC(decode_results *results, uint16_t offset=kStartOffset, const uint16_t nbits=kFujitsuAcBits, const bool strict=false)
Decode the supplied Fujitsu AC IR message if possible. Status: STABLE / Working.
Definition: ir_Fujitsu.cpp:897
+
const uint16_t kTechnibelAcBits
Definition: IRremoteESP8266.h:944
bool decodeTrotec(decode_results *results, uint16_t offset=kStartOffset, const uint16_t nbits=kTrotecBits, const bool strict=true)
Decode the supplied Trotec message. Status: STABLE / Works. Untested on real devices.
Definition: ir_Trotec.cpp:313
bool decodeNeoclima(decode_results *results, uint16_t offset=kStartOffset, const uint16_t nbits=kNeoclimaBits, const bool strict=true)
Decode the supplied Neoclima message. Status: STABLE / Known working.
Definition: ir_Neoclima.cpp:571
-
const uint16_t kVoltasBits
Definition: IRremoteESP8266.h:1095
-
bool decodeMitsubishi112(decode_results *results, uint16_t offset=kStartOffset, const uint16_t nbits=kMitsubishi112Bits, const bool strict=true)
Decode the supplied Mitsubishi/TCL 112-bit A/C message. (MITSUBISHI112, TCL112AC) Status: STABLE / Re...
Definition: ir_Mitsubishi.cpp:1201
+
const uint16_t kVoltasBits
Definition: IRremoteESP8266.h:1113
+
bool decodeMitsubishi112(decode_results *results, uint16_t offset=kStartOffset, const uint16_t nbits=kMitsubishi112Bits, const bool strict=true)
Decode the supplied Mitsubishi/TCL 112-bit A/C message. (MITSUBISHI112, TCL112AC) Status: STABLE / Re...
Definition: ir_Mitsubishi.cpp:1243
bool decodeSamsungAC(decode_results *results, uint16_t offset=kStartOffset, const uint16_t nbits=kSamsungAcBits, const bool strict=true)
Decode the supplied Samsung A/C message. Status: Stable / Known to be working.
Definition: ir_Samsung.cpp:772
bool decodeAirwell(decode_results *results, uint16_t offset=kStartOffset, const uint16_t nbits=kAirwellBits, const bool strict=true)
Decode the supplied Airwell "Manchester code" message.
Definition: ir_Airwell.cpp:53
-
const uint16_t kRC5XBits
Definition: IRremoteESP8266.h:1038
+
const uint16_t kRC5XBits
Definition: IRremoteESP8266.h:1056
bool decodeMagiQuest(decode_results *results, uint16_t offset=kStartOffset, const uint16_t nbits=kMagiquestBits, const bool strict=true)
Decode the supplied MagiQuest message. Status: Beta / Should work.
Definition: ir_Magiquest.cpp:69
uint16_t rawlen
Definition: IRrecv.h:77
const uint8_t kUseDefTol
Definition: IRrecv.h:36
@@ -819,209 +832,212 @@ $(function() {
Class for receiving IR messages.
Definition: IRrecv.h:114
uint16_t bufsize
Definition: IRrecv.h:73
Results returned from the decoder.
Definition: IRrecv.h:92
-
uint16_t matchGenericConstBitTime(volatile uint16_t *data_ptr, uint64_t *result_ptr, const uint16_t remaining, const uint16_t nbits, const uint16_t hdrmark, const uint32_t hdrspace, const uint16_t one, const uint32_t zero, const uint16_t footermark, const uint32_t footerspace, const bool atleast=false, const uint8_t tolerance=kUseDefTol, const int16_t excess=kMarkExcess, const bool MSBfirst=true)
Match & decode a generic/typical constant bit time <= 64bit IR message. The data is stored at result_...
Definition: IRrecv.cpp:1493
+
uint16_t matchGenericConstBitTime(volatile uint16_t *data_ptr, uint64_t *result_ptr, const uint16_t remaining, const uint16_t nbits, const uint16_t hdrmark, const uint32_t hdrspace, const uint16_t one, const uint32_t zero, const uint16_t footermark, const uint32_t footerspace, const bool atleast=false, const uint8_t tolerance=kUseDefTol, const int16_t excess=kMarkExcess, const bool MSBfirst=true)
Match & decode a generic/typical constant bit time <= 64bit IR message. The data is stored at result_...
Definition: IRrecv.cpp:1530
bool decodeCarrierAC64(decode_results *results, uint16_t offset=kStartOffset, const uint16_t nbits=kCarrierAc64Bits, const bool strict=true)
Decode the supplied Carrier 64-bit HVAC message. Status: STABLE / Known to be working.
Definition: ir_Carrier.cpp:195
-
const uint16_t kCoolixBits
Definition: IRremoteESP8266.h:889
+
const uint16_t kCoolixBits
Definition: IRremoteESP8266.h:905
bool decodeArgo(decode_results *results, uint16_t offset=kStartOffset, const uint16_t nbits=kArgoBits, const bool strict=true)
Decode the supplied Argo message. Status: BETA / Probably works.
Definition: ir_Argo.cpp:445
-
const uint16_t kCoronaAcBitsShort
Definition: IRremoteESP8266.h:899
+
const uint16_t kCoronaAcBitsShort
Definition: IRremoteESP8266.h:915
uint64_t data
Definition: IRrecv.h:85
-
const uint16_t kSamsung36Bits
Definition: IRremoteESP8266.h:1043
-
const uint16_t kMagiquestBits
Definition: IRremoteESP8266.h:990
+
const uint16_t kSamsung36Bits
Definition: IRremoteESP8266.h:1061
+
const uint16_t kMagiquestBits
Definition: IRremoteESP8266.h:1008
uint16_t * rawbuf
Definition: IRrecv.h:74
Information for the interrupt handler.
Definition: IRrecv.h:69
uint16_t getBufSize(void)
Obtain the maximum number of entries possible in the capture buffer. i.e. It's size.
Definition: IRrecv.cpp:411
-
const uint16_t kSanyoLC7461Bits
Definition: IRremoteESP8266.h:1054
+
const uint16_t kSanyoLC7461Bits
Definition: IRremoteESP8266.h:1072
bool repeat
Definition: IRrecv.h:110
bool decodeHitachiAC(decode_results *results, uint16_t offset=kStartOffset, const uint16_t nbits=kHitachiAcBits, const bool strict=true, const bool MSBfirst=true)
Decode the supplied Hitachi A/C message. Status: STABLE / Expected to work.
Definition: ir_Hitachi.cpp:846
-
const uint16_t kTrotecBits
Definition: IRremoteESP8266.h:1086
+
const uint16_t kTrotecBits
Definition: IRremoteESP8266.h:1104
bool decodeVestelAc(decode_results *results, uint16_t offset=kStartOffset, const uint16_t nbits=kVestelAcBits, const bool strict=true)
Decode the supplied Vestel message. Status: Alpha / Needs testing against a real device.
Definition: ir_Vestel.cpp:572
const uint8_t kIdleState
Definition: IRrecv.h:31
bool decodeAmcor(decode_results *results, uint16_t offset=kStartOffset, const uint16_t nbits=kAmcorBits, const bool strict=true)
Decode the supplied Amcor HVAC message. Status: STABLE / Reported as working.
Definition: ir_Amcor.cpp:58
-
bool decodeDaikin(decode_results *results, uint16_t offset=kStartOffset, const uint16_t nbits=kDaikinBits, const bool strict=true)
Decode the supplied Daikin 280-bit message. (DAIKIN) Status: STABLE / Reported as working.
Definition: ir_Daikin.cpp:595
-
const uint16_t kEliteScreensBits
Definition: IRremoteESP8266.h:941
+
bool decodeDaikin(decode_results *results, uint16_t offset=kStartOffset, const uint16_t nbits=kDaikinBits, const bool strict=true)
Decode the supplied Daikin 280-bit message. (DAIKIN) Status: STABLE / Reported as working.
Definition: ir_Daikin.cpp:597
+
const uint16_t kEliteScreensBits
Definition: IRremoteESP8266.h:959
uint8_t recvpin
Definition: IRrecv.h:70
uint16_t timer
Definition: IRrecv.h:72
-
bool decodeDaikin64(decode_results *results, uint16_t offset=kStartOffset, const uint16_t nbits=kDaikin64Bits, const bool strict=true)
Decode the supplied Daikin 64-bit message. (DAIKIN64) Status: Beta / Probably Working.
Definition: ir_Daikin.cpp:3501
+
bool decodeDaikin64(decode_results *results, uint16_t offset=kStartOffset, const uint16_t nbits=kDaikin64Bits, const bool strict=true)
Decode the supplied Daikin 64-bit message. (DAIKIN64) Status: Beta / Probably Working.
Definition: ir_Daikin.cpp:3473
bool decodeMetz(decode_results *results, uint16_t offset=kStartOffset, const uint16_t nbits=kMetzBits, const bool strict=true)
Decode the supplied Metz message. Status: BETA / Probably works.
Definition: ir_Metz.cpp:67
bool success
Definition: IRrecv.h:84
-
bool decodeDaikin2(decode_results *results, uint16_t offset=kStartOffset, const uint16_t nbits=kDaikin2Bits, const bool strict=true)
Decode the supplied Daikin 312-bit message. (DAIKIN2) Status: STABLE / Works as expected.
Definition: ir_Daikin.cpp:1379
-
const uint16_t kElectraAcBits
Definition: IRremoteESP8266.h:939
-
bool matchSpace(const uint32_t measured, const uint32_t desired, const uint8_t tolerance=kUseDefTol, const int16_t excess=kMarkExcess)
Check if we match a space signal(measured) with the desired within +/-tolerance percent,...
Definition: IRrecv.cpp:1131
-
const uint16_t kSonyMinBits
Definition: IRremoteESP8266.h:1067
+
bool decodeDaikin2(decode_results *results, uint16_t offset=kStartOffset, const uint16_t nbits=kDaikin2Bits, const bool strict=true)
Decode the supplied Daikin 312-bit message. (DAIKIN2) Status: STABLE / Works as expected.
Definition: ir_Daikin.cpp:1352
+
const uint16_t kElectraAcBits
Definition: IRremoteESP8266.h:957
+
bool matchSpace(const uint32_t measured, const uint32_t desired, const uint8_t tolerance=kUseDefTol, const int16_t excess=kMarkExcess)
Check if we match a space signal(measured) with the desired within +/-tolerance percent,...
Definition: IRrecv.cpp:1144
+
const uint16_t kSonyMinBits
Definition: IRremoteESP8266.h:1085
const uint8_t kStopState
Definition: IRrecv.h:34
uint16_t rawlen
Definition: IRrecv.h:108
const uint16_t kMaxTimeoutMs
Definition: IRrecv.h:49
-
bool decodePanasonicAC32(decode_results *results, uint16_t offset=kStartOffset, const uint16_t nbits=kPanasonicAc32Bits, const bool strict=true)
Decode the supplied Panasonic AC 32/16bit message. Status: STABLE / Confirmed working.
Definition: ir_Panasonic.cpp:990
-
const uint16_t kDaikin2Bits
Definition: IRremoteESP8266.h:907
-
bool decodePanasonic(decode_results *results, uint16_t offset=kStartOffset, const uint16_t nbits=kPanasonicBits, const bool strict=false, const uint32_t manufacturer=kPanasonicManufacturer)
Decode the supplied Panasonic message. Status: STABLE / Should be working.
Definition: ir_Panasonic.cpp:126
-
const uint16_t kHitachiAc1Bits
Definition: IRremoteESP8266.h:965
+
bool decodePanasonicAC32(decode_results *results, uint16_t offset=kStartOffset, const uint16_t nbits=kPanasonicAc32Bits, const bool strict=true)
Decode the supplied Panasonic AC 32/16bit message. Status: STABLE / Confirmed working.
Definition: ir_Panasonic.cpp:980
+
const uint16_t kDaikin2Bits
Definition: IRremoteESP8266.h:923
+
bool decodePanasonic(decode_results *results, uint16_t offset=kStartOffset, const uint16_t nbits=kPanasonicBits, const bool strict=false, const uint32_t manufacturer=kPanasonicManufacturer)
Decode the supplied Panasonic message. Status: STABLE / Should be working.
Definition: ir_Panasonic.cpp:128
+
const uint16_t kHitachiAc1Bits
Definition: IRremoteESP8266.h:983
bool decodeElectraAC(decode_results *results, uint16_t offset=kStartOffset, const uint16_t nbits=kElectraAcBits, const bool strict=true)
Decode the supplied Electra A/C message. Status: STABLE / Known working.
Definition: ir_Electra.cpp:370
-
bool decodeDaikin216(decode_results *results, uint16_t offset=kStartOffset, const uint16_t nbits=kDaikin216Bits, const bool strict=true)
Decode the supplied Daikin 216-bit message. (DAIKIN216) Status: STABLE / Should be working.
Definition: ir_Daikin.cpp:1742
-
bool decodeDaikin152(decode_results *results, uint16_t offset=kStartOffset, const uint16_t nbits=kDaikin152Bits, const bool strict=true)
Decode the supplied Daikin 152-bit message. (DAIKIN152) Status: STABLE / Known Working.
Definition: ir_Daikin.cpp:3118
+
bool decodeDaikin216(decode_results *results, uint16_t offset=kStartOffset, const uint16_t nbits=kDaikin216Bits, const bool strict=true)
Decode the supplied Daikin 216-bit message. (DAIKIN216) Status: STABLE / Should be working.
Definition: ir_Daikin.cpp:1715
+
bool decodeDaikin152(decode_results *results, uint16_t offset=kStartOffset, const uint16_t nbits=kDaikin152Bits, const bool strict=true)
Decode the supplied Daikin 152-bit message. (DAIKIN152) Status: STABLE / Known Working.
Definition: ir_Daikin.cpp:3090
bool decodeElitescreens(decode_results *results, uint16_t offset=kStartOffset, const uint16_t nbits=kEliteScreensBits, const bool strict=true)
Decode the supplied Elite Screens message. Status: STABLE / Confirmed working.
Definition: ir_EliteScreens.cpp:63
bool decodeDenon(decode_results *results, uint16_t offset=kStartOffset, const uint16_t nbits=kDenonBits, const bool strict=true)
Decode the supplied Delonghi A/C message. Status: STABLE / Should work fine.
Definition: ir_Denon.cpp:70
-
const uint16_t kPanasonicBits
Definition: IRremoteESP8266.h:1026
+
const uint16_t kPanasonicBits
Definition: IRremoteESP8266.h:1044
+
const uint16_t kMilesTag2ShotBits
Definition: IRremoteESP8266.h:1115
decode_type_t decode_type
Definition: IRrecv.h:94
-
const uint16_t kPanasonicAcBits
Definition: IRremoteESP8266.h:1030
-
bool decodeTechnibelAc(decode_results *results, uint16_t offset=kStartOffset, const uint16_t nbits=kTechnibelAcBits, const bool strict=true)
Status: STABLE / Reported as working on a real device.
Definition: ir_Technibel.cpp:56
+
const uint16_t kPanasonicAcBits
Definition: IRremoteESP8266.h:1048
+
bool decodeTechnibelAc(decode_results *results, uint16_t offset=kStartOffset, const uint16_t nbits=kTechnibelAcBits, const bool strict=true)
Status: STABLE / Reported as working on a real device.
Definition: ir_Technibel.cpp:54
const uint64_t kRepeat
Definition: IRrecv.h:26
void setTolerance(const uint8_t percent=kTolerance)
Set the base tolerance percentage for matching incoming IR messages.
Definition: IRrecv.cpp:424
bool decodeMidea(decode_results *results, uint16_t offset=kStartOffset, const uint16_t nbits=kMideaBits, const bool strict=true)
Decode the supplied Midea message. Status: Alpha / Needs testing against a real device.
Definition: ir_Midea.cpp:666
bool decodeVoltas(decode_results *results, uint16_t offset=kStartOffset, const uint16_t nbits=kVoltasBits, const bool strict=true)
Decode the supplied Voltas message. Status: STABLE / Working on real device.
Definition: ir_Voltas.cpp:61
-
const uint16_t kDaikin160Bits
Definition: IRremoteESP8266.h:912
+
const uint16_t kDaikin160Bits
Definition: IRremoteESP8266.h:928
void copyIrParams(volatile irparams_t *src, irparams_t *dst)
Make a copy of the interrupt state & buffer data. Needed because irparams is marked as volatile,...
Definition: IRrecv.cpp:387
bool decodeKelvinator(decode_results *results, uint16_t offset=kStartOffset, const uint16_t nbits=kKelvinatorBits, const bool strict=true)
Decode the supplied Kelvinator message. Status: STABLE / Known working.
Definition: ir_Kelvinator.cpp:459
-
const uint16_t kGoodweatherBits
Definition: IRremoteESP8266.h:950
+
const uint16_t kGoodweatherBits
Definition: IRremoteESP8266.h:968
bool decodeMWM(decode_results *results, uint16_t offset=kStartOffset, const uint16_t nbits=24, const bool strict=true)
Decode the supplied MWM message. Status: Implemented.
Definition: ir_MWM.cpp:81
void enableIRIn(const bool pullup=false)
Set up and (re)start the IR capture mechanism.
Definition: IRrecv.cpp:319
-
const uint16_t kDaikin152Bits
Definition: IRremoteESP8266.h:918
-
bool decodePanasonicAC(decode_results *results, uint16_t offset=kStartOffset, const uint16_t nbits=kPanasonicAcBits, const bool strict=true)
Decode the supplied Panasonic AC message. Status: STABLE / Works with real device(s).
Definition: ir_Panasonic.cpp:861
+
const uint16_t kDaikin152Bits
Definition: IRremoteESP8266.h:934
+
bool decodePanasonicAC(decode_results *results, uint16_t offset=kStartOffset, const uint16_t nbits=kPanasonicAcBits, const bool strict=true)
Decode the supplied Panasonic AC message. Status: STABLE / Works with real device(s).
Definition: ir_Panasonic.cpp:851
bool decodeDoshisha(decode_results *results, uint16_t offset=kStartOffset, const uint16_t nbits=kDoshishaBits, const bool strict=true)
Decode the supplied Doshisha message. Status: STABLE / Works on real device.
Definition: ir_Doshisha.cpp:85
bool decodeZepeal(decode_results *results, uint16_t offset=kStartOffset, const uint16_t nbits=kZepealBits, const bool strict=true)
Decode the supplied Zepeal message. Status: STABLE / Works on real device.
Definition: ir_Zepeal.cpp:67
-
bool decodeDaikin160(decode_results *results, uint16_t offset=kStartOffset, const uint16_t nbits=kDaikin160Bits, const bool strict=true)
Decode the supplied Daikin 160-bit message. (DAIKIN160) Status: STABLE / Confirmed working.
Definition: ir_Daikin.cpp:2107
+
bool decodeDaikin160(decode_results *results, uint16_t offset=kStartOffset, const uint16_t nbits=kDaikin160Bits, const bool strict=true)
Decode the supplied Daikin 160-bit message. (DAIKIN160) Status: STABLE / Confirmed working.
Definition: ir_Daikin.cpp:2080
bool decodeLasertag(decode_results *results, uint16_t offset=kStartOffset, const uint16_t nbits=kLasertagBits, const bool strict=true)
Decode the supplied Lasertag message. Status: BETA / Appears to be working 90% of the time.
Definition: ir_Lasertag.cpp:70
const uint8_t kTimeoutMs
Definition: IRrecv.h:47
-
uint16_t _matchGeneric(volatile uint16_t *data_ptr, uint64_t *result_bits_ptr, uint8_t *result_ptr, const bool use_bits, const uint16_t remaining, const uint16_t required, const uint16_t hdrmark, const uint32_t hdrspace, const uint16_t onemark, const uint32_t onespace, const uint16_t zeromark, const uint32_t zerospace, const uint16_t footermark, const uint32_t footerspace, const bool atleast=false, const uint8_t tolerance=kUseDefTol, const int16_t excess=kMarkExcess, const bool MSBfirst=true)
Match & decode a generic/typical IR message. The data is stored in result_bits_ptr or result_bytes_pt...
Definition: IRrecv.cpp:1299
+
uint16_t _matchGeneric(volatile uint16_t *data_ptr, uint64_t *result_bits_ptr, uint8_t *result_ptr, const bool use_bits, const uint16_t remaining, const uint16_t required, const uint16_t hdrmark, const uint32_t hdrspace, const uint16_t onemark, const uint32_t onespace, const uint16_t zeromark, const uint32_t zerospace, const uint16_t footermark, const uint32_t footerspace, const bool atleast=false, const uint8_t tolerance=kUseDefTol, const int16_t excess=kMarkExcess, const bool MSBfirst=true)
Match & decode a generic/typical IR message. The data is stored in result_bits_ptr or result_bytes_pt...
Definition: IRrecv.cpp:1334
const uint8_t kMarkState
Definition: IRrecv.h:32
void setUnknownThreshold(const uint16_t length)
Set the minimum length we will consider for reporting UNKNOWN message types.
Definition: IRrecv.cpp:416
-
const uint16_t kSymphonyBits
Definition: IRremoteESP8266.h:1069
+
const uint16_t kSymphonyBits
Definition: IRremoteESP8266.h:1087
bool decodeMirage(decode_results *results, uint16_t offset=kStartOffset, const uint16_t nbits=kMirageBits, const bool strict=true)
Decode the supplied Mirage message. Status: STABLE / Reported as working.
Definition: ir_Mirage.cpp:50
-
const uint16_t kRC6Mode0Bits
Definition: IRremoteESP8266.h:1039
+
const uint16_t kRC6Mode0Bits
Definition: IRremoteESP8266.h:1057
const uint16_t kStateSizeMax
Definition: IRrecv.h:60
Results from a data match.
Definition: IRrecv.h:83
uint8_t rcvstate
Definition: IRrecv.h:71
-
const uint16_t kMetzBits
Definition: IRremoteESP8266.h:991
+
const uint16_t kMetzBits
Definition: IRremoteESP8266.h:1009
bool decodeRC6(decode_results *results, uint16_t offset=kStartOffset, const uint16_t nbits=kRC6Mode0Bits, const bool strict=false)
Decode the supplied RC6 message. Status: Stable.
Definition: ir_RC5_RC6.cpp:383
bool decodeRC5(decode_results *results, uint16_t offset=kStartOffset, const uint16_t nbits=kRC5XBits, const bool strict=true)
Decode the supplied RC-5/RC5X message. Status: RC-5 (stable), RC-5X (alpha)
Definition: ir_RC5_RC6.cpp:309
~IRrecv(void)
Class destructor Cleans up after the object is no longer needed. e.g. Frees up all memory used by the...
Definition: IRrecv.cpp:304
bool decodeHitachiAc3(decode_results *results, uint16_t offset=kStartOffset, const uint16_t nbits=kHitachiAc3Bits, const bool strict=true)
Decode the supplied Hitachi 15to27-byte/120to216-bit A/C message. Status: STABLE / Works fine.
Definition: ir_Hitachi.cpp:1425
bool decodeWhynter(decode_results *results, uint16_t offset=kStartOffset, const uint16_t nbits=kWhynterBits, const bool strict=true)
Decode the supplied Whynter message. Status: STABLE / Working. Strict mode is ALPHA.
Definition: ir_Whynter.cpp:74
bool decodeCarrierAC(decode_results *results, uint16_t offset=kStartOffset, const uint16_t nbits=kCarrierAcBits, const bool strict=true)
Decode the supplied Carrier HVAC message.
Definition: ir_Carrier.cpp:82
-
match_result_t matchData(volatile uint16_t *data_ptr, const uint16_t nbits, const uint16_t onemark, const uint32_t onespace, const uint16_t zeromark, const uint32_t zerospace, const uint8_t tolerance=kUseDefTol, const int16_t excess=kMarkExcess, const bool MSBfirst=true)
Match & decode the typical data section of an IR message. The data value is stored in the least signi...
Definition: IRrecv.cpp:1207
-
const uint16_t kMitsubishiHeavy152Bits
Definition: IRremoteESP8266.h:1017
-
const uint16_t kDoshishaBits
Definition: IRremoteESP8266.h:935
-
const uint16_t kCarrierAc40Bits
Definition: IRremoteESP8266.h:893
+
const uint16_t kMitsubishiHeavy152Bits
Definition: IRremoteESP8266.h:1035
+
const uint16_t kDoshishaBits
Definition: IRremoteESP8266.h:951
+
const uint16_t kCarrierAc40Bits
Definition: IRremoteESP8266.h:909
const uint16_t kStartOffset
Definition: IRrecv.h:20
-
const uint16_t kAmcorBits
Definition: IRremoteESP8266.h:884
+
const uint16_t kAmcorBits
Definition: IRremoteESP8266.h:900
bool decodeRCMM(decode_results *results, uint16_t offset=kStartOffset, const uint16_t nbits=kRCMMBits, const bool strict=false)
Decode a Philips RC-MM packet (between 12 & 32 bits) if possible. Status: STABLE / Should be working.
Definition: ir_RCMM.cpp:96
IRrecv(const uint16_t recvpin, const uint16_t bufsize=kRawBuf, const uint8_t timeout=kTimeoutMs, const bool save_buffer=false, const uint8_t timer_num=kDefaultESP32Timer)
Class constructor Args:
Definition: IRrecv.cpp:243
-
bool decodeMitsubishi136(decode_results *results, uint16_t offset=kStartOffset, const uint16_t nbits=kMitsubishi136Bits, const bool strict=true)
Decode the supplied Mitsubishi 136-bit A/C message. (MITSUBISHI136) Status: STABLE / Reported as work...
Definition: ir_Mitsubishi.cpp:829
+
bool decodeMitsubishi136(decode_results *results, uint16_t offset=kStartOffset, const uint16_t nbits=kMitsubishi136Bits, const bool strict=true)
Decode the supplied Mitsubishi 136-bit A/C message. (MITSUBISHI136) Status: STABLE / Reported as work...
Definition: ir_Mitsubishi.cpp:869
volatile uint16_t * rawbuf
Definition: IRrecv.h:107
const uint8_t kTolerance
Definition: IRrecv.h:35
bool decodeSharp(decode_results *results, uint16_t offset=kStartOffset, const uint16_t nbits=kSharpBits, const bool strict=true, const bool expansion=true)
Decode the supplied Sharp message. Status: STABLE / Working fine.
Definition: ir_Sharp.cpp:155
uint16_t used
Definition: IRrecv.h:86
-
const uint32_t kPanasonicManufacturer
Definition: IRremoteESP8266.h:1027
+
const uint32_t kPanasonicManufacturer
Definition: IRremoteESP8266.h:1045
uint32_t address
Definition: IRrecv.h:101
bool decodeNikai(decode_results *results, uint16_t offset=kStartOffset, const uint16_t nbits=kNikaiBits, const bool strict=true)
Decode the supplied Nikai message. Status: STABLE / Working.
Definition: ir_Nikai.cpp:52
-
const uint16_t kMitsubishiBits
Definition: IRremoteESP8266.h:1000
-
bool match(const uint32_t measured, const uint32_t desired, const uint8_t tolerance=kUseDefTol, const uint16_t delta=0)
Check if we match a pulse(measured) with the desired within +/-tolerance percent and/or +/- a fixed d...
Definition: IRrecv.cpp:1039
+
const uint16_t kMitsubishiBits
Definition: IRremoteESP8266.h:1018
+
bool match(const uint32_t measured, const uint32_t desired, const uint8_t tolerance=kUseDefTol, const uint16_t delta=0)
Check if we match a pulse(measured) with the desired within +/-tolerance percent and/or +/- a fixed d...
Definition: IRrecv.cpp:1052
bool decodeSymphony(decode_results *results, uint16_t offset=kStartOffset, const uint16_t nbits=kSymphonyBits, const bool strict=true)
Decode the supplied Symphony packet/message. Status: STABLE / Should be working.
Definition: ir_Symphony.cpp:60
-
const uint16_t kSamsungAcBits
Definition: IRremoteESP8266.h:1045
+
const uint16_t kSamsungAcBits
Definition: IRremoteESP8266.h:1063
const uint16_t kUnknownThreshold
Definition: IRrecv.h:28
-
const uint16_t kMideaBits
Definition: IRremoteESP8266.h:993
+
const uint16_t kMideaBits
Definition: IRremoteESP8266.h:1011
bool decodeAiwaRCT501(decode_results *results, uint16_t offset=kStartOffset, const uint16_t nbits=kAiwaRcT501Bits, const bool strict=true)
Decode the supplied Aiwa RC T501 message. Status: BETA / Should work.
Definition: ir_Aiwa.cpp:61
-
const uint16_t kKelvinatorBits
Definition: IRremoteESP8266.h:980
+
const uint16_t kKelvinatorBits
Definition: IRremoteESP8266.h:998
bool decodeGICable(decode_results *results, uint16_t offset=kStartOffset, const uint16_t nbits=kGicableBits, const bool strict=true)
Decode the supplied G.I. Cable message. Status: Alpha / Not tested against a real device.
Definition: ir_GICable.cpp:63
-
bool decodeTeco(decode_results *results, uint16_t offset=kStartOffset, const uint16_t nbits=kTecoBits, const bool strict=false)
Decode the supplied Teco message. Status: STABLE / Tested.
Definition: ir_Teco.cpp:365
-
bool decodeSanyoLC7461(decode_results *results, uint16_t offset=kStartOffset, const uint16_t nbits=kSanyoLC7461Bits, const bool strict=true)
Decode the supplied SANYO LC7461 message. Status: BETA / Probably works.
Definition: ir_Sanyo.cpp:135
+
bool decodeTeco(decode_results *results, uint16_t offset=kStartOffset, const uint16_t nbits=kTecoBits, const bool strict=false)
Decode the supplied Teco message. Status: STABLE / Tested.
Definition: ir_Teco.cpp:353
+
bool decodeSanyoLC7461(decode_results *results, uint16_t offset=kStartOffset, const uint16_t nbits=kSanyoLC7461Bits, const bool strict=true)
Decode the supplied SANYO LC7461 message. Status: BETA / Probably works.
Definition: ir_Sanyo.cpp:136
bool decodeCarrierAC40(decode_results *results, uint16_t offset=kStartOffset, const uint16_t nbits=kCarrierAc40Bits, const bool strict=true)
Decode the supplied Carrier 40-bit HVAC message. Carrier HVAC messages contain only 40 bits,...
Definition: ir_Carrier.cpp:147
-
const uint16_t kNECBits
Definition: IRremoteESP8266.h:1022
-
const uint16_t kDenonBits
Definition: IRremoteESP8266.h:930
-
const uint16_t kHaierACBits
Definition: IRremoteESP8266.h:956
-
bool matchAtLeast(const uint32_t measured, const uint32_t desired, const uint8_t tolerance=kUseDefTol, const uint16_t delta=0)
Check if we match a pulse(measured) of at least desired within tolerance percent and/or a fixed delta...
Definition: IRrecv.cpp:1070
-
const uint16_t kZepealBits
Definition: IRremoteESP8266.h:1093
-
const uint16_t kMidea24Bits
Definition: IRremoteESP8266.h:995
-
bool decodeDaikin176(decode_results *results, uint16_t offset=kStartOffset, const uint16_t nbits=kDaikin176Bits, const bool strict=true)
Decode the supplied Daikin 176-bit message. (DAIKIN176) Status: STABLE / Expected to work.
Definition: ir_Daikin.cpp:2500
-
const uint16_t kNeoclimaBits
Definition: IRremoteESP8266.h:1024
-
const uint16_t kWhirlpoolAcBits
Definition: IRremoteESP8266.h:1089
-
bool decodeSharpAc(decode_results *results, uint16_t offset=kStartOffset, const uint16_t nbits=kSharpAcBits, const bool strict=true)
Decode the supplied Sharp A/C message. Status: STABLE / Known working.
Definition: ir_Sharp.cpp:821
+
const uint16_t kNECBits
Definition: IRremoteESP8266.h:1040
+
const uint16_t kDenonBits
Definition: IRremoteESP8266.h:946
+
const uint16_t kHaierACBits
Definition: IRremoteESP8266.h:974
+
bool matchAtLeast(const uint32_t measured, const uint32_t desired, const uint8_t tolerance=kUseDefTol, const uint16_t delta=0)
Check if we match a pulse(measured) of at least desired within tolerance percent and/or a fixed delta...
Definition: IRrecv.cpp:1083
+
const uint16_t kZepealBits
Definition: IRremoteESP8266.h:1111
+
const uint16_t kMidea24Bits
Definition: IRremoteESP8266.h:1013
+
bool decodeDaikin176(decode_results *results, uint16_t offset=kStartOffset, const uint16_t nbits=kDaikin176Bits, const bool strict=true)
Decode the supplied Daikin 176-bit message. (DAIKIN176) Status: STABLE / Expected to work.
Definition: ir_Daikin.cpp:2472
+
const uint16_t kNeoclimaBits
Definition: IRremoteESP8266.h:1042
+
const uint16_t kWhirlpoolAcBits
Definition: IRremoteESP8266.h:1107
+
bool decodeSharpAc(decode_results *results, uint16_t offset=kStartOffset, const uint16_t nbits=kSharpAcBits, const bool strict=true)
Decode the supplied Sharp A/C message. Status: STABLE / Known working.
Definition: ir_Sharp.cpp:855
bool decodeJVC(decode_results *results, uint16_t offset=kStartOffset, const uint16_t nbits=kJvcBits, const bool strict=true)
Decode the supplied JVC message. Status: Stable / Known working.
Definition: ir_JVC.cpp:94
-
bool decodeMitsubishiAC(decode_results *results, uint16_t offset=kStartOffset, const uint16_t nbits=kMitsubishiACBits, const bool strict=false)
Decode the supplied Mitsubish 144-bit A/C message. Status: BETA / Probably works.
Definition: ir_Mitsubishi.cpp:252
-
const uint16_t kCarrierAc64Bits
Definition: IRremoteESP8266.h:895
-
const uint16_t kPioneerBits
Definition: IRremoteESP8266.h:1034
+
bool decodeEcoclim(decode_results *results, uint16_t offset=kStartOffset, const uint16_t nbits=kEcoclimBits, const bool strict=true)
Decode the supplied EcoClim A/C message. Status: STABLE / Confirmed working on real remote.
Definition: ir_EcoClim.cpp:62
+
bool decodeMitsubishiAC(decode_results *results, uint16_t offset=kStartOffset, const uint16_t nbits=kMitsubishiACBits, const bool strict=false)
Decode the supplied Mitsubish 144-bit A/C message. Status: BETA / Probably works.
Definition: ir_Mitsubishi.cpp:257
+
const uint16_t kCarrierAc64Bits
Definition: IRremoteESP8266.h:911
+
const uint16_t kPioneerBits
Definition: IRremoteESP8266.h:1052
uint16_t bits
Definition: IRrecv.h:106
-
const uint16_t kGreeBits
Definition: IRremoteESP8266.h:953
-
const uint16_t kJvcBits
Definition: IRremoteESP8266.h:978
-
const uint16_t kLasertagBits
Definition: IRremoteESP8266.h:982
-
const uint16_t kDaikin128Bits
Definition: IRremoteESP8266.h:915
-
const uint16_t kAiwaRcT501Bits
Definition: IRremoteESP8266.h:880
-
uint32_t ticksLow(const uint32_t usecs, const uint8_t tolerance=kUseDefTol, const uint16_t delta=0)
Calculate the lower bound of the nr. of ticks.
Definition: IRrecv.cpp:1013
-
const uint16_t kTecoBits
Definition: IRremoteESP8266.h:1074
+
const uint16_t kGreeBits
Definition: IRremoteESP8266.h:971
+
const uint16_t kJvcBits
Definition: IRremoteESP8266.h:996
+
const uint16_t kLasertagBits
Definition: IRremoteESP8266.h:1000
+
const uint16_t kDaikin128Bits
Definition: IRremoteESP8266.h:931
+
const uint16_t kAiwaRcT501Bits
Definition: IRremoteESP8266.h:896
+
uint32_t ticksLow(const uint32_t usecs, const uint8_t tolerance=kUseDefTol, const uint16_t delta=0)
Calculate the lower bound of the nr. of ticks.
Definition: IRrecv.cpp:1026
+
const uint16_t kTecoBits
Definition: IRremoteESP8266.h:1092
bool decodeEpson(decode_results *results, uint16_t offset=kStartOffset, const uint16_t nbits=kEpsonBits, const bool strict=true)
Decode the supplied Epson message. Status: Beta / Probably works.
Definition: ir_Epson.cpp:45
-
const uint16_t kToshibaACBits
Definition: IRremoteESP8266.h:1077
+
const uint16_t kToshibaACBits
Definition: IRremoteESP8266.h:1095
bool decodeSony(decode_results *results, uint16_t offset=kStartOffset, const uint16_t nbits=kSonyMinBits, const bool strict=false)
Decode the supplied Sony/SIRC message. Status: STABLE / Should be working. strict mode is ALPHA / Unt...
Definition: ir_Sony.cpp:121
-
const uint16_t kDaikinBits
Definition: IRremoteESP8266.h:902
-
bool matchMark(const uint32_t measured, const uint32_t desired, const uint8_t tolerance=kUseDefTol, const int16_t excess=kMarkExcess)
Check if we match a mark signal(measured) with the desired within +/-tolerance percent,...
Definition: IRrecv.cpp:1112
-
const uint16_t kHitachiAcBits
Definition: IRremoteESP8266.h:962
-
const uint16_t kHitachiAc3Bits
Definition: IRremoteESP8266.h:969
+
const uint16_t kDaikinBits
Definition: IRremoteESP8266.h:918
+
bool matchMark(const uint32_t measured, const uint32_t desired, const uint8_t tolerance=kUseDefTol, const int16_t excess=kMarkExcess)
Check if we match a mark signal(measured) with the desired within +/-tolerance percent,...
Definition: IRrecv.cpp:1125
+
const uint16_t kHitachiAcBits
Definition: IRremoteESP8266.h:980
+
const uint16_t kHitachiAc3Bits
Definition: IRremoteESP8266.h:987
const uint16_t kRawBuf
Definition: IRrecv.h:25
bool decode(decode_results *results, irparams_t *save=NULL, uint8_t max_skip=0, uint16_t noise_floor=0)
Decodes the received IR message. If the interrupt state is saved, we will immediately resume waiting ...
Definition: IRrecv.cpp:501
bool decodePioneer(decode_results *results, uint16_t offset=kStartOffset, const uint16_t nbits=kPioneerBits, const bool strict=true)
Decode the supplied Pioneer message. Status: STABLE / Should be working. (Self decodes & real example...
Definition: ir_Pioneer.cpp:92
uint8_t getTolerance(void)
Get the base tolerance percentage for matching incoming IR messages.
Definition: IRrecv.cpp:430
-
const uint16_t kDishBits
Definition: IRremoteESP8266.h:933
-
uint16_t compare(const uint16_t oldval, const uint16_t newval)
Compare two tick values.
Definition: IRrecv.cpp:1149
+
const uint16_t kDishBits
Definition: IRremoteESP8266.h:949
+
uint16_t compare(const uint16_t oldval, const uint16_t newval)
Compare two tick values.
Definition: IRrecv.cpp:1162
uint32_t command
Definition: IRrecv.h:102
-
const uint16_t kFujitsuAcBits
Definition: IRremoteESP8266.h:946
+
const uint16_t kFujitsuAcBits
Definition: IRremoteESP8266.h:964
uint64_t value
Definition: IRrecv.h:100
-
const uint16_t kArgoBits
Definition: IRremoteESP8266.h:887
-
const uint16_t kHitachiAc2StateLength
Definition: IRremoteESP8266.h:966
+
const uint16_t kArgoBits
Definition: IRremoteESP8266.h:903
+
const uint16_t kHitachiAc2StateLength
Definition: IRremoteESP8266.h:984
bool decodeSamsung36(decode_results *results, uint16_t offset=kStartOffset, const uint16_t nbits=kSamsung36Bits, const bool strict=true)
Decode the supplied Samsung36 message. Status: STABLE / Expected to work.
Definition: ir_Samsung.cpp:192
const uint16_t kFooter
Definition: IRrecv.h:19
-
const uint16_t kNikaiBits
Definition: IRremoteESP8266.h:1021
-
const uint16_t kLutronBits
Definition: IRremoteESP8266.h:989
+
const uint16_t kNikaiBits
Definition: IRremoteESP8266.h:1039
+
const uint16_t kLutronBits
Definition: IRremoteESP8266.h:1007
uint8_t timeout
Definition: IRrecv.h:79
bool decodeCoronaAc(decode_results *results, uint16_t offset=kStartOffset, const uint16_t nbits=kCoronaAcBitsShort, const bool strict=true)
Decode the supplied CoronaAc message. Status: STABLE / Appears to be working.
Definition: ir_Corona.cpp:88
bool decodeLutron(decode_results *results, uint16_t offset=kStartOffset, const uint16_t nbits=kLutronBits, const bool strict=true)
Decode the supplied Lutron message. Status: STABLE / Working.
Definition: ir_Lutron.cpp:65
bool decodeDISH(decode_results *results, uint16_t offset=kStartOffset, const uint16_t nbits=kDishBits, const bool strict=true)
Decode the supplied DISH NETWORK message. Status: ALPHA (untested and unconfirmed....
Definition: ir_Dish.cpp:77
const uint16_t kRawTick
Definition: IRrecv.h:37
-
uint16_t matchManchesterData(volatile const uint16_t *data_ptr, uint64_t *result_ptr, const uint16_t remaining, const uint16_t nbits, const uint16_t half_period, const uint16_t starting_balance=0, const uint8_t tolerance=kUseDefTol, const int16_t excess=kMarkExcess, const bool MSBfirst=true, const bool GEThomas=true)
Match & decode a Manchester Code data (<= 64bits.
Definition: IRrecv.cpp:1687
+
uint16_t matchManchesterData(volatile const uint16_t *data_ptr, uint64_t *result_ptr, const uint16_t remaining, const uint16_t nbits, const uint16_t half_period, const uint16_t starting_balance=0, const uint8_t tolerance=kUseDefTol, const int16_t excess=kMarkExcess, const bool MSBfirst=true, const bool GEThomas=true)
Match & decode a Manchester Code data (<= 64bits.
Definition: IRrecv.cpp:1724
void resume(void)
Resume collection of received IR data.
Definition: IRrecv.cpp:372
-
const uint16_t kHaierACYRW02Bits
Definition: IRremoteESP8266.h:959
-
const uint16_t kHitachiAc424Bits
Definition: IRremoteESP8266.h:975
+
bool decodeMilestag2(decode_results *results, uint16_t offset=kStartOffset, const uint16_t nbits=kMilesTag2ShotBits, const bool strict=true)
Decode the supplied MilesTag2 message. Status: ALPHA / Probably works but needs testing with a real d...
Definition: ir_MilesTag2.cpp:63
+
const uint16_t kEcoclimBits
Definition: IRremoteESP8266.h:952
+
const uint16_t kHaierACYRW02Bits
Definition: IRremoteESP8266.h:977
+
match_result_t matchData(volatile uint16_t *data_ptr, const uint16_t nbits, const uint16_t onemark, const uint32_t onespace, const uint16_t zeromark, const uint32_t zerospace, const uint8_t tolerance=kUseDefTol, const int16_t excess=kMarkExcess, const bool MSBfirst=true, const bool expectlastspace=true)
Match & decode the typical data section of an IR message. The data value is stored in the least signi...
Definition: IRrecv.cpp:1221
+
const uint16_t kHitachiAc424Bits
Definition: IRremoteESP8266.h:993
bool decodeWhirlpoolAC(decode_results *results, uint16_t offset=kStartOffset, const uint16_t nbits=kWhirlpoolAcBits, const bool strict=true)
Decode the supplied Whirlpool A/C message. Status: STABLE / Working as intended.
Definition: ir_Whirlpool.cpp:652
const uint16_t kMarkExcess
Definition: IRrecv.h:24
bool decodeHaierACYRW02(decode_results *results, uint16_t offset=kStartOffset, const uint16_t nbits=kHaierACYRW02Bits, const bool strict=true)
Decode the supplied Haier YR-W02 remote A/C message. Status: BETA / Appears to be working.
Definition: ir_Haier.cpp:1020
bool decodeLG(decode_results *results, uint16_t offset=kStartOffset, const uint16_t nbits=kLgBits, const bool strict=false)
Decode the supplied LG message. Status: STABLE / Working.
Definition: ir_LG.cpp:139
bool decodeCOOLIX(decode_results *results, uint16_t offset=kStartOffset, const uint16_t nbits=kCoolixBits, const bool strict=true)
Decode the supplied Coolix A/C message. Status: STABLE / Known Working.
Definition: ir_Coolix.cpp:628
-
const uint16_t kLegoPfBits
Definition: IRremoteESP8266.h:984
-
const uint16_t kSharpBits
Definition: IRremoteESP8266.h:1058
+
const uint16_t kLegoPfBits
Definition: IRremoteESP8266.h:1002
+
const uint16_t kSharpBits
Definition: IRremoteESP8266.h:1076
bool decodeGoodweather(decode_results *results, uint16_t offset=kStartOffset, const uint16_t nbits=kGoodweatherBits, const bool strict=true)
Decode the supplied Goodweather message. Status: BETA / Probably works.
Definition: ir_Goodweather.cpp:424
uint8_t _tolerance
Definition: IRrecv.h:152
const uint8_t kDefaultESP32Timer
Definition: IRrecv.h:56
-
uint16_t matchManchester(volatile const uint16_t *data_ptr, uint64_t *result_ptr, const uint16_t remaining, const uint16_t nbits, const uint16_t hdrmark, const uint32_t hdrspace, const uint16_t clock_period, const uint16_t footermark, const uint32_t footerspace, const bool atleast=false, const uint8_t tolerance=kUseDefTol, const int16_t excess=kMarkExcess, const bool MSBfirst=true, const bool GEThomas=true)
Match & decode a Manchester Code <= 64bit IR message. The data is stored at result_ptr.
Definition: IRrecv.cpp:1580
+
uint16_t matchManchester(volatile const uint16_t *data_ptr, uint64_t *result_ptr, const uint16_t remaining, const uint16_t nbits, const uint16_t hdrmark, const uint32_t hdrspace, const uint16_t clock_period, const uint16_t footermark, const uint32_t footerspace, const bool atleast=false, const uint8_t tolerance=kUseDefTol, const int16_t excess=kMarkExcess, const bool MSBfirst=true, const bool GEThomas=true)
Match & decode a Manchester Code <= 64bit IR message. The data is stored at result_ptr.
Definition: IRrecv.cpp:1617
bool decodeInax(decode_results *results, uint16_t offset=kStartOffset, const uint16_t nbits=kInaxBits, const bool strict=true)
Decode the supplied Inax Toilet message. Status: Stable / Known working.
Definition: ir_Inax.cpp:51
void crudeNoiseFilter(decode_results *results, const uint16_t floor=0)
Remove or merge pulses in the capture buffer that are too short.
Definition: IRrecv.cpp:437
bool decodeHitachiAC1(decode_results *results, uint16_t offset=kStartOffset, const uint16_t nbits=kHitachiAc1Bits, const bool strict=true)
bool decodeSAMSUNG(decode_results *results, uint16_t offset=kStartOffset, const uint16_t nbits=kSamsungBits, const bool strict=true)
Decode the supplied Samsung 32-bit message. Status: STABLE.
Definition: ir_Samsung.cpp:118
bool decodeLegoPf(decode_results *results, uint16_t offset=kStartOffset, const uint16_t nbits=kLegoPfBits, const bool strict=true)
Decode the supplied LEGO Power Functions message. Status: STABLE / Appears to work.
Definition: ir_Lego.cpp:71
-
const uint16_t kRCMMBits
Definition: IRremoteESP8266.h:1041
-
const uint8_t kVestelAcBits
Definition: IRremoteESP8266.h:1092
-
const uint16_t kTranscoldBits
Definition: IRremoteESP8266.h:1083
-
const uint16_t kInaxBits
Definition: IRremoteESP8266.h:976
-
bool decodeMitsubishiHeavy(decode_results *results, uint16_t offset=kStartOffset, const uint16_t nbits=kMitsubishiHeavy152Bits, const bool strict=true)
Decode the supplied Mitsubishi Heavy Industries A/C message. Status: BETA / Appears to be working....
Definition: ir_MitsubishiHeavy.cpp:1085
+
const uint16_t kRCMMBits
Definition: IRremoteESP8266.h:1059
+
const uint8_t kVestelAcBits
Definition: IRremoteESP8266.h:1110
+
const uint16_t kTranscoldBits
Definition: IRremoteESP8266.h:1101
+
const uint16_t kInaxBits
Definition: IRremoteESP8266.h:994
+
bool decodeMitsubishiHeavy(decode_results *results, uint16_t offset=kStartOffset, const uint16_t nbits=kMitsubishiHeavy152Bits, const bool strict=true)
Decode the supplied Mitsubishi Heavy Industries A/C message. Status: BETA / Appears to be working....
Definition: ir_MitsubishiHeavy.cpp:1003
uint16_t _unknown_threshold
Definition: IRrecv.h:157
-
const uint16_t kDaikin176Bits
Definition: IRremoteESP8266.h:921
+
const uint16_t kDaikin176Bits
Definition: IRremoteESP8266.h:937
bool decodeMidea24(decode_results *results, uint16_t offset=kStartOffset, const uint16_t nbits=kMidea24Bits, const bool strict=true)
Decode the supplied Midea24 message. Status: STABLE / Confirmed working on a real device.
Definition: ir_Midea.cpp:759
void disableIRIn(void)
Stop collection of any received IR data. Disable any timers and interrupts.
Definition: IRrecv.cpp:356
bool decodeHitachiAc424(decode_results *results, uint16_t offset=kStartOffset, const uint16_t nbits=kHitachiAc424Bits, const bool strict=true)
Decode the supplied Hitachi 53-byte/424-bit A/C message. Status: STABLE / Reported as working.
Definition: ir_Hitachi.cpp:959
-
bool decodeToshibaAC(decode_results *results, uint16_t offset=kStartOffset, const uint16_t nbits=kToshibaACBits, const bool strict=true)
Decode the supplied Toshiba A/C message. Status: STABLE / Working.
Definition: ir_Toshiba.cpp:472
-
uint32_t ticksHigh(const uint32_t usecs, const uint8_t tolerance=kUseDefTol, const uint16_t delta=0)
Calculate the upper bound of the nr. of ticks.
Definition: IRrecv.cpp:1026
-
const uint16_t kSamsungBits
Definition: IRremoteESP8266.h:1042
+
bool decodeToshibaAC(decode_results *results, uint16_t offset=kStartOffset, const uint16_t nbits=kToshibaACBits, const bool strict=true)
Decode the supplied Toshiba A/C message. Status: STABLE / Working.
Definition: ir_Toshiba.cpp:463
+
uint32_t ticksHigh(const uint32_t usecs, const uint8_t tolerance=kUseDefTol, const uint16_t delta=0)
Calculate the upper bound of the nr. of ticks.
Definition: IRrecv.cpp:1039
+
const uint16_t kSamsungBits
Definition: IRremoteESP8266.h:1060
uint8_t _timer_num
Definition: IRrecv.h:154
-
const uint16_t kDaikin64Bits
Definition: IRremoteESP8266.h:909
-
const uint16_t kPanasonicAc32Bits
Definition: IRremoteESP8266.h:1033
-
const uint16_t kDaikin216Bits
Definition: IRremoteESP8266.h:924
-
const uint16_t kMitsubishi136Bits
Definition: IRremoteESP8266.h:1008
-
uint16_t matchBytes(volatile uint16_t *data_ptr, uint8_t *result_ptr, const uint16_t remaining, const uint16_t nbytes, const uint16_t onemark, const uint32_t onespace, const uint16_t zeromark, const uint32_t zerospace, const uint8_t tolerance=kUseDefTol, const int16_t excess=kMarkExcess, const bool MSBfirst=true)
Match & decode the typical data section of an IR message. The bytes are stored at result_ptr....
Definition: IRrecv.cpp:1249
-
const uint16_t kSanyoAcBits
Definition: IRremoteESP8266.h:1050
-
const uint16_t kMitsubishi112Bits
Definition: IRremoteESP8266.h:1011
-
const uint16_t kEpsonBits
Definition: IRremoteESP8266.h:936
+
const uint16_t kDaikin64Bits
Definition: IRremoteESP8266.h:925
+
const uint16_t kPanasonicAc32Bits
Definition: IRremoteESP8266.h:1051
+
const uint16_t kDaikin216Bits
Definition: IRremoteESP8266.h:940
+
const uint16_t kMitsubishi136Bits
Definition: IRremoteESP8266.h:1026
+
const uint16_t kSanyoAcBits
Definition: IRremoteESP8266.h:1068
+
const uint16_t kMitsubishi112Bits
Definition: IRremoteESP8266.h:1029
+
const uint16_t kEpsonBits
Definition: IRremoteESP8266.h:954
uint8_t state[kStateSizeMax]
Definition: IRrecv.h:104
-
bool decodeHash(decode_results *results)
Decode any arbitrary IR message into a 32-bit code value. Instead of decoding using a standard encodi...
Definition: IRrecv.cpp:1170
+
bool decodeHash(decode_results *results)
Decode any arbitrary IR message into a 32-bit code value. Instead of decoding using a standard encodi...
Definition: IRrecv.cpp:1183
const uint8_t kSpaceState
Definition: IRrecv.h:33
-
const uint16_t kLgBits
Definition: IRremoteESP8266.h:986
-
uint8_t _validTolerance(const uint8_t percentage)
Convert the tolerance percentage into something valid.
Definition: IRrecv.cpp:1004
+
const uint16_t kLgBits
Definition: IRremoteESP8266.h:1004
+
uint8_t _validTolerance(const uint8_t percentage)
Convert the tolerance percentage into something valid.
Definition: IRrecv.cpp:1017
const uint16_t kHeader
Definition: IRrecv.h:18
const uint32_t kFnvBasis32
Definition: IRrecv.h:53
diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/IRremoteESP8266_8h.html b/lib/lib_basic/IRremoteESP8266-2.7.15/docs/doxygen/html/IRremoteESP8266_8h.html similarity index 98% rename from lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/IRremoteESP8266_8h.html rename to lib/lib_basic/IRremoteESP8266-2.7.15/docs/doxygen/html/IRremoteESP8266_8h.html index bc9e49713..37e51415c 100644 --- a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/IRremoteESP8266_8h.html +++ b/lib/lib_basic/IRremoteESP8266-2.7.15/docs/doxygen/html/IRremoteESP8266_8h.html @@ -206,7 +206,10 @@ Enumerations
  ELITESCREENS, PANASONIC_AC32, -kLastDecodeType = PANASONIC_AC32 +MILESTAG2, +ECOCLIM, +
+  kLastDecodeType = ECOCLIM
}  Enumerator for defining and numbering of supported IR protocol. More...
@@ -334,6 +337,10 @@ Variables   const uint16_t kDoshishaBits = 40   +const uint16_t kEcoclimBits = 56 +  +const uint16_t kEcoclimShortBits = 15 +  const uint16_t kEpsonBits = 32   const uint16_t kEpsonMinRepeat = 2 @@ -650,6 +657,12 @@ Variables   const uint16_t kVoltasStateLength = 10   +const uint16_t kMilesTag2ShotBits = 14 +  +const uint16_t kMilesTag2MsgBits = 24 +  +const uint16_t kMilesMinRepeat = 0 + 

Typedef Documentation

@@ -780,6 +793,8 @@ Variables MIRAGE  ELITESCREENS  PANASONIC_AC32  +MILESTAG2  +ECOCLIM  kLastDecodeType  @@ -1568,6 +1583,34 @@ Variables
+
+ + +

◆ kEcoclimBits

+ +
+
+ + + + +
const uint16_t kEcoclimBits = 56
+
+ +
+
+ +

◆ kEcoclimShortBits

+ +
+
+ + + + +
const uint16_t kEcoclimShortBits = 15
+
+
@@ -2422,6 +2465,48 @@ Variables
+
+ + +

◆ kMilesMinRepeat

+ +
+
+ + + + +
const uint16_t kMilesMinRepeat = 0
+
+ +
+
+ +

◆ kMilesTag2MsgBits

+ +
+
+ + + + +
const uint16_t kMilesTag2MsgBits = 24
+
+ +
+
+ +

◆ kMilesTag2ShotBits

+ +
+
+ + + + +
const uint16_t kMilesTag2ShotBits = 14
+
+
@@ -3841,8 +3926,8 @@ Variables -
const uint16_t kSanyoLC7461CommandBits
Definition: IRremoteESP8266.h:1053
-
const uint16_t kSanyoLC7461AddressBits
Definition: IRremoteESP8266.h:1052
+
const uint16_t kSanyoLC7461CommandBits
Definition: IRremoteESP8266.h:1071
+
const uint16_t kSanyoLC7461AddressBits
Definition: IRremoteESP8266.h:1070